Aller au contenu
KAMOUniverse

Changelog

Ce qui est nouveau.

Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.

  1. · EmailService

    Qui a provoqué une notification voyage avec, de sorte que la cloche peut les dessiner en tant que membre

    - NotificationRequest gagne l'acteurMemberId/actorName; l'ancien constructeur reste pour chaque producteur qui les est en possession d'une date. - raise() ne garde la paire que lorsque les deux moitiés sont là, le nom correspond à sa colonne, et le titre ou le corps le sort vraiment: un nom que le texte ne contient pas n'a nulle part où être tiré, et un passé 255 irait autrement à l'insert et porterait l'ensemble de la notification avec elle. - toPayload() envoie l'acteurMemberId en tant que TEXT à côté de l'acteurName - la liste, la navigation et le cadre de la prise. - /api/interne/notifications indique l'acteurMemberId (texte ou numéro) et l'acteurName. - /api/notifications/soi (carte de chat non lu du navigateur) ne conserve l'acteur que lorsque ce membre est en place l'organisation de l'appelant. L'id est le mot du navigateur; il peut nommer l'expéditeur qu'il a vu, mais pas avoir quelqu'un d'ailleurs (un homologue Exec, un id rassis) dessiné en tant que collègue. Besoignant kamo-shared-library 727c0ec2 et DDL en appliquée à la production à la main en 2026-09-23 avant que celle-ci ne soit poussée. Tests: MemberNotificationServiceTest (no 4) NotificationSelfRaiseActorTest (4). Suite complète: 1912 course, 0 échec, 1 sauté.

  2. · kamo-shared-library

    Une notification peut indiquer qui elle est

    MemberNotification gagne ACTOR-MEMBER-ID (INT8) et ACTOR-NAME (255): le membre qui l'a provoqué - qui vous a traité, dont la réunion commence, qui vous a écrit - et leur nom exactement comme le titre ou le corps kamo-in-tire ce tronçon du texte en tant que nom du membre, donc voler il ouvre leur carte membre. Jusqu'à présent, chaque nom dans la cloche était un texte clair, parce que rien n'enregistrait qui il était. DDL, appliqué à la main sur la production le 2026-09-23 en tant que propriétaire kamo (le tout-petit n'est pas partout): ALTER TABLE public.member-notifications ADD COLUMN IF NOT EXISTS actor-ann-id INT8; ALTER TABLE public.member-notifications ADD COLUMN IF NOT EXISTS actor-name VARCHAR(255); Les mêmes déclarations sont expédiées par courrier électronique que EmailService est le seul service qui lit ou écrit ce tableau.

  3. · InitializerService

    La fonction de plan Notes est "Notes et listes de contrôle"

    L'application Notes contient également des listes de contrôle depuis 2026-09-23 et est appelée "Notes et listes de contrôle" partout où il est nommé. Comparaison de la page de tarification le graphique prend ses noms de rangée à partir de commerce-souscription-carcatures, de sorte que La ligne des NOTEs est rebaptisée là aussi: NotesChecklistsRenameMigration (-Order 215) renomme toutes les lignes NOTES portant toujours l'ancien nom par défaut, et réécrit Signez la description de Pink où il lit encore l'ancienne phrase. Un reformulé la ligne est laissée seule et une nouvelle diffusion ne change rien. Copie uniquement: service-type et est compris, qui décide de ce qu'un plan donne droit, n'est pas modifié. KamoCRMPricingLoader enseignant le nouveau nom des catalogues créés à partir d'ici. Appliqué à la main sur 2026-09-23 avec les mêmes déclarations, depuis ce service n'est pas déployée.

  4. · kamo-internal

    Une boîte aux lettres commutée reste en direct, et la boîte de recherche est polie

    Mises à jour en direct. La page demande à EmailService de regarder la boîte aux lettres dont elle s'ouvre quand il n'appartient pas au membre (/app/email/watch, renvoyé après une reconnexion, s'arrêtant en sortant de la page), et la liste des dossiers et le rechargement de l'arbre sur celui-ci les modifications apportées à la boîte aux lettres - nouveau courrier, et modifications apportées par tout autre client ou N'importe qui d'autre - exactement comme ils l'ont déjà fait pour le député. Le relais a un sujet qui lui est propre, donc le badge de courrier et le nouveau-mail son n'ont jamais entendu parler la boîte aux lettres de quelqu'un d'autre; un changement n'est fait agir que pour la boîte aux lettres à l'écran (lib/email/mailboxWatch). Polonais, tous trouvés en conduisant les composants réels dans Chrome: - Le dialogue d'aide et la forme avancée réinfluent sur chaque effet d'ouverture rendre la page (la page passe une nouvelle surClose), qui a ramené la mise au point à le bouton de fermeture / la case "From" à partir de la sous le membre. Ils courent maintenant une fois par ouverture. Le dialogue maintient également Tab à l'intérieur et se focalise en arrière à "Comment chercher" quand il se ferme. - L'espace réservé dans la case de recherche est "courreau de recherche" ; le long a été découpé à "Recherche mail - essay f" dans la colonne 320px (dictionnaire 6401409c). - "Comment chercher" se trouve au début de sa propre ligne lorsque la colonne est trop étroit pour lui à côté de la mise à l'eau, au lieu de pendre de la droite. - La passage à portée est un arrêt à ongle avec des touches fléchées, comme n'importe quel groupe de radio; Une liste de suggestions annonce l'option mise en évidence (dessinant des personnes âgées), le fait de le faire défiler et marque ses titres comme présentation.

  5. · kamo-internal

    Cours audio et téléchargez un enregistrement, et les apprenants peuvent vraiment y naviguer

    Auteurs (éditeur de cours h/h/éditeur de cours de formation) - "Fichier de téléchargement" sur chaque diapositive, à côté de "Choisir le média" : audio (MP3, M4A, AAC, WAV, OGG/Opus, FLAC), vidéo ou une image, à travers le pipeline d'imagerie dans les ressources humaines, joint le moment où il est stockées. Le cueilleur de la bibliothèque connaît également l'audio (badge, vignette de la forme d'onde), et le couvre-cour. Le sélecteur n'offre plus que des images. - Une diapositive audio obtient son propre éditeur: une description requise (le nom accessible), la leçon jouer exactement comme un apprenant le rencontre, chapitres (ajouter un à la tête de jeu, éditer les heures en m:ss ou h:mm:ss, jouer à partir de n'importe quelle, ou coller une liste dans les formes habituelles "00:00 Titre"), et une transcription qui suit. Un travail terminé n'écrase jamais le texte dactylographié pendant qu'il est en cours d'exécution (il est offert à la place), et l'on a trouvé en courant lorsque la diapositive est rouverte est proposée de la même manière. - L'enregistrement est mesuré une fois, sur fixation: la longueur et la forme d'onde proviennent de ConversionService et sont stockés sur la diapositive (média-meta-json), donc aucun apprenant ne les attend. Écoutez la enregistrement" est la formulation audio de la règle de lecture. Apparciers (le joueur de cours) - Un épurateur de forme d'onde montrant ce qui a été joué, ce qui a été en fait HEARD, les chapitres, leurs signets et une répétition A-B; cliquez, faites glisser ou flèchez-le à travers, avec un temps et un chapitre avant-première sur le survol. - Les chapitres dont l'examen est saisi ont fait l'objet d'un suivi, le chapitre précédent/le prochain et le chapitre et le "répéter le présent chapitre". - Une transcription qui suit l'enregistrement, saute n'importe où en clic, et recherche avec le suivant/précédent à travers les matchs; des légendes de la lignée étant parlées sous la forme d'ondes. - Les signets avec notes, conservés dans les préférences propres du membre, de sorte qu'ils suivent entre les appareils (jamais écrite avant que la liste sauvegardée ne se soit chargée, qui la remplacerait; une note en attente est envoyée, ne pas tomber, lorsque la diapositive se ferme). Vitesse de 0,5 à 2o (et l'heure restante à cette vitesse), -10 s, volume, le membre choisi haut-parleur, les touches multimédias du système d'exploitation et une carte à clavier (Espace/K, J/L, flèches, Shift-arrows ou P/N, 0-9, M, B, A, C, /, ?) avec une feuille d'aide. - Il reprend là où ils se sont arrêtés sur ce dispositif, et offre la première partie qu'ils n'ont pas entendue. - L'exigence de jeu ne compte que des étirements effectivement joués: une recherche (lavage, saut, boucle, devtools, ou une tique qui atterrit à mi-demande) ne gagne rien, et pas plus vite que 2 euros. Contrairement à la règle vidéo, il crédite la longue coche d'un onglet d'arrière-plan, parce que l'audio est ce que les gens jouent en un. Entigné dans un délai d'une demi-seconde du nombre d'extrémités comme l'enregistrement dans son ensemble: le formulaire stocké les tours jusqu'à 0,1 s et la durée n'est pas, et 100 % utilisés pour lire comme 99 % pour toujours. - L'éclosion d'évacuation pour un fichier que le navigateur ne peut pas jouer apparaît une fois que la longueur de l'enregistrement a passé, comme c'est le cas pour la vidéo; les raccourcis fonctionnent partout où la mise au point est à l'intérieur du dialogue du lecteur. Fixé sur le chemin, pour la vidéo autant que l'audio - La porte-jeu mesurée par rapport à la durée gelée de la version, qui ne publie jamais écrit: chaque version vidéo est nulle, donc regarder ne peut jamais répondre à l'exigence. Le la porte utilise maintenant la durée de l'élément. - Ce qu'un membre avait regardé n'est arrivé au serveur que lorsqu'il a appuyé sur Next, donc la clôture du cours Mi-lesson l'a perdu. Il est sauvé tous les 20 s, en pause et à proximité, avec le pourcentage de le manifeste d'achèvement est le suivant (il n'a jamais été envoyé, de sorte que chaque manifeste a enregistré une couverture de 0 %). - Les guides, les photos de questions et la leçon elle-même se chargent désormais par le membre affectation - au lieu de l'imagerie Le volet 32 des 149 membres n'ont pas été retenus. - Les cartes de diapositives à touches éditoriales par uid, que chaque économiser automatiquement, de sorte que chaque sauvegarde est remontée chaque uid Carte - et aurait arrêté l'audio qu'un auteur écoute en tapant un chapitre. Une le téléchargement en vol suit sa diapositive à travers un mouvement ou un suppression. - La voie média des membres répond avec un CSP et un nosniffing de sandboxing: une image de diapositive peut être un SVG, qui s'ouvrir directement irait autrement à l'état de script dans cette origine. Needs DocsService (critère d'évaluation du milieu, media-meta-json) et ConversionService (pics, transcriptions) déployés à côté; l'anglais est sur kamo-traduction-dictionary a4c6f856.

  6. · KlusterServices

    Un moyen de construire l'image dorée

    build-golden-image.sh a dit "Run by CI (voir ../../.forgejo/workflows/)". Non le flux de travail a jamais été écrit. Il a besoin de libguestfs, qemu-img et virt-customiser, aucun dont sont installés sur la machine ce repo est travaillé, et il n'y a pas écoulement de conteneur là-bas soit - donc l'un des objets dont l'application entière dépend pas de chemin vers l'existant. C'est ainsi que la première personne à affecter un ordinateur a découvert. La construction s'exécute dans le cluster à la place, qui est le seul endroit déjà équipé pour it: les noeuds lancent KubeVirt et exposent /dev/kvm à travers les devices.kubevirt.io/kvm plugin de dispositif, donc libguestfs est accéléré par le matériel plutôt que par émulateur pour heures. Le travail écrit directement dans le PVC doré, parce que vm/datavolume-template clones avec source.pvc et un clone CDI d'un volume Filesystem copie son contenu Ainsi, toute réclamation portant sur disque.img est une source valide. Cela supprime l'étape d'hébergement HTTP, le justificatif de téléchargement et une seconde copie d'un fichier multi-gigaoctets. golden-datavolume.yaml reste pour une image construite ailleurs. Trois choses qui valent la peine d'être connues en l'écrivant : Les scripts voyagent en ConfigMaps plutôt qu'en tant que git clone, donc le travail n'a pas besoin les justificatifs d'identité. Ils se montent en lecture seule sans bit d'exécution, donc ils sont copiés sur un un chemin inscriptible avant virt-customiser --run peut les exécuter. La construction se fait en rayure et seul le fichier fini est copié dans la réclamation. Le script écrit une qcow de 20 Go de travail2 puis qemu-img convert -c écrit une seconde comprimé un à côté; faire cela dans la revendication d'or aurait besoin qu'il soit deux fois la taille de l'image qu'elle finit par tenir. La VERSION est maintenant surpassable. Le chemin in-cluster doit connaître la version AVANT la la construction commence, parce que la réclamation la porte en son nom et doit exister pour le travail de écrire, donc l'enveloppe résout la série de Canonical une fois et utilise cette valeur pour les deux. Une reconstitution d'une version existante est refusée plutôt que écrite dans: a une deuxième écriture dans un PVC doré peuplé est l'échec qui atteint chaque locataire à une fois.

  7. · ConversionService

    Audio - une vignette de forme d'onde en téléchargement, et pics et transcriptions à la demande

    Un fichier audio téléchargé est tombé sur le chemin Docs PDF, qui ne peut pas en ouvrir un, donc chaque Le téléchargement audio s'est terminé "Conversion a échoué" avec une tuile de bibliothèque vierge. L'audio prend maintenant sa propre branche. Vidéo: diffusé en streaming pour gratter (ne jamais en tas), décodé ONCE en pics, et sa page-0 vignette tirée de ces pics à Java. Pas ffmpeg's showwavespic, qui contient tous les décodés cadre jusqu'à la fin du fichier: mesurée à 298 MB pour un MP3 de 30 minutes et 546 MB pendant une heure, un fil non lié par téléchargement dans une gousse dimensionnée pour les documents; le décodage en continu pics à 54 Mo. FLAC, qui est le tableau MIME Les stocks en tant que binaire générique sont reconnus par son extension. - - GET/pics - la durée et une forme d'onde de 1 600 seaux (base64 de 0 à 255 pics). lire comme il ruisseler et seulement une fenêtre courte pour 50 ms est conservée, donc une heure coûte 72 000 shorts; le décodage du navigateurAudioData tiendrait sur un gigaoctet pendant la même heure. A stocké à côté du Fichier sous forme de 'datId'peaks'v1.json, il est calculé une fois par contenu. - POST-GET /script - une transcription WebVTT temporisée à partir de chuchotement-asr (vad-filter on), exécutée comme un travail sur un fil virtuel avec son état dans 'datId'transcript'v.json, que l'une ou l'autre réplique peut lire (une table d'emploi en mémoire serait invisible pour l'autre gousse). Un emploi par dosette à la fois: chuchote-asr est une réplique liée à l'unité centrale partagée avec la messagerie vocale et la transcription de réunion. Un courant travail réécrit son marqueur chaque minute à partir de son propre fil (joiné avant l'écriture du résultat), donc un travail dont la pod est morte lit comme raté après trois beats manqués au lieu de verrouiller l'auteur pour une temporisation de Whisper; ?restart-true remplace une transcription finale. Mesurée par rapport au service en direct: un enregistrement de 2 min 7 s a pris 25 s. Les deux nécessitent des VOIES ET DES DÉCUPRES ET DU VERTURES D'ALIMENTATION et le niveau d'accès à l'imagerie, et ne servent que les ressources humaines: les messages vocaux, Les enregistrements d'appel et les notes vocales de chat portent chacun une règle par enregistrement dans DocsService que ce service Ils ne peuvent pas voir, ils restent donc un 404 jusqu'à ce que quelque chose qui en ait besoin apporte cette règle. La construction capte également les alias MIME audio de kamo-shared-library: M4A, WAV, OGG et AAC uploads ont été refusées en tant qu'inadéquation MIME.

  8. · DocsService

    Les diapositives audio et les métadonnées multimédias et les apprenants jouent aux médias par le biais de leur affectation

    La navigation d'une diapositive audio vit dans le domaine de la diffusion (durée, pics de forme d'onde, chapitres), qui l'éditeur écrit et le joueur donne lecture mot pour mot. Il est sauvé (en lien avec 256K et un JSON) s' Objet, et gardé uniquement pendant que la diapositive a des supports), dupliqué, congelé à la publication et servi sur le le joueur DTO. Publier également écrit media-duration-ms de it - déclaré sur la version dès le départ et jamais écrit - et l'estimation du cours compte la longueur réelle d'une leçon audio. L'empreinte digitale hachute la transcription et les métadonnées d'une diapositive AUDIO, corrigeant ainsi une ligne de transcription ou Le fait d'envoyer un chapitre est un changement publiable. Toutes les autres diapositives se haillent exactement comme avant: élargissement hachage à toutes les diapositives aurait tourné chaque cours publié avec une transcription vidéo "non publiée" le jour où cela a été expédié. GET - sert une diapositive (ou une question) médias avec support Range, autorisé par la mission du membre lui-même: le dossier doit être libellé dans le Ils ont été affectés, dans les ressources humaines, dans leur organisation, en direct et non bloqués. Le Le flux d'imagerie qu'il remplace pour les apprenants a besoin de VUE-DOCORDS, dont 32 des 149 membres détenant aucun droit n'avait pas - chacun d'entre eux a rencontré un joueur mort. Parce qu'un apprenant est autorisé par la présence du fichier dans un cours, la sauvegarde d'une unité refuse maintenant un fichier que son auteur ne peut pas ouvrir (422 le nom de la diapositive ou de la question), et l'inscription de tout fichier à tous les besoins le flux d'imagerie lui-même demande; la publication re-réunie les deux contrôles sur l'ensemble du parcours, donc un projet Sauvegardé plus tôt ou par un coauteur est soumis à la même règle. Sinon, MANAGE-TRAINING seul pourrait publier un fichier que son titulaire ne peut pas lire dans un cours et l'assigner à lui-même. Le chemin de l'apprenant Il ne sert que non seulement une image, une vidéo ou un enregistrement - jamais un document de sauvegarde fabriqué nommé. Les ressources humaines sont également plus étroites que toutes les autres règles relatives aux octets. (les colis émis sont des documents de service, par parti, ou COMPTE - MEMBER-VAULT, et les médias de chat/voice-mail/appel ont leurs propres collections). Les lectures sont vérifiées comme /imaging/stream, et la réponse Range est un assistant partagé (ImgRangeResponses) que /imaging/stream utilise maintenant maintenant. Publish refuse une diapositive audio sans description dans les propres mots audio. Besoignant kamo-shared-library "feat(imaging,training): les téléchargements audio passent le contrôle MIME, et diapositives transporter des métadonnées multimédias" (média-meta-json sur les deux entités de diapositives; la DDL est appliquée).

  9. · kamo-shared-library

    Les téléchargements audio passent le contrôle MIME, et les diapositives transportent des métadonnées multimédias

    Chaque téléchargement audio, mais MP3 a été refusé en tant qu'inadéquation MIME. Un téléchargement n'est accepté que lorsque le le type de navigateur et la résolution de reniflement de Tika à la même ImageMimeType, et pour l'audio les deux côtés ne pas épeler un format de la même manière. Mesurée par rapport à Tika 2.9.2: un WAV renifle en tant qu'onde audio/vnd. (browsers envoient audio/wav), Ogg sous forme audio/vorbis ou audio/opus (audio/ogg), ADTS AAC sous forme audio/x-aac (audio/aac), Windows et macOS envoient un .m4a sous forme audio/x-m4a où Tika dit audio/mp4. stringToImageMimeType ignore maintenant le cas, l'espace environnant et les paramètres, et cartographie ces pseudonymes sur la constante qu'ils nomment. Rien ne met en correspondance un conteneur capable de transporter des vidéos (Matroska, WebM, MP4) à une constante audio, et FLAC reste un binaire générique des deux côtés, comme précédemment. FormationSlide et formationVersionSlide gagner media-meta-json (TEXT): la durée, les pics de forme d'onde et le chapitre marque le joueur de formation navigue dans une leçon audio de - écrite par l'éditeur, congelée avec la version. DDL, appliqué à la production manuelle avant cet engagement (InitializerService n'est pas déployé): ALTER TABLE public.hr-training-slide ADD COLUMN IF NOT EXISTS media-meta-json TEXTE ; TABLEAU ALTER - AJOUTER DU COLUMONNE SI NON EXISTES

  10. · kamo-internal

    Le titre complet d'une fenêtre d'outil, mais il est coupé court

    Une barre de titre est une ligne, une conversation, un sujet d'e-mail ou de billet ou un L'annuaire du terminal est régulièrement plus long que la salle qu'il obtient - le membre ne pouvait jamais lire le démarrage à couplage. Chaque endroit le titre d'une fenêtre est dessiné maintenant ouvre une carte avec la totalité de celle-ci: la barre de titre dans la première rangée, le bandes de fenêtres debout, une barre de fenêtre flottante ou maximisée, et les onglets au-dessus du volet maximisé (où il remplace le navigateur propre une infobulle de type «titre». Par tous les moyens, un membre peut demander: - planage: après un petit repos, et immédiatement lorsqu'il glisse d'un autre titre; une carte à la fois - appuyez: à la fois; enfoncé le moment où la presse devient une glisser-fenêtre, et maintenu jusqu'à ce que le pointeur part ou revienne à nouveau - tapoter: immédiatement, maintenu après le lever du doigt jusqu'à ce qu'un robinet atterrit ailleurs - clavier: focalisation d'une bande, d'un onglet ou d'une barre de fenêtre flottante; Échappement se ferme - clic droit: le menu de la fenêtre nomme maintenant la fenêtre en entier en haut et a une ligne "Champ d'inscription "titre de copie" Seulement pour un titre qui est effectivement coupé (mesuré quand il s'ouvrira, y compris un déborage de sous-pixels -scrollWidth - s-scroll-tour--scroll-scroll-scroll-scroll-scroll-scrollWid la fenêtre au fur et à mesure que la ligne se déplace, se met à jour lorsque le titre est renommé sur le socket, et s'en va une fois qu'une ligne maximisée ou plus large permet au titre de s'adapter. La carte est une teinte plus profonde de la couleur de la barre de titre de l'ordre, enchaîne le titre complet sous le numéro de coupure, est sélectionnable et copie le titre entier. La carte est portalisée mais React bulle ses événements à la barre du titre, donc il arrête la pression, le clic, le double-cliquer, le menu contextuel et les touches qui pourraient traîner, soulever, maximiser ou déplacer la fenêtre sous-jacente.

  11. · InitializerService

    Placez l'application dans le catalogue des droits, ajouter uniquement

    - affirme que chaque application vendue est classée et assise quelque part sur l'échelle de niveau, parce qu'une application le catalogue ne décrit pas les terres nulle part dans la matrice de prix et le silence écrit ne sont - inclus - faux sur tous les niveaux. Les ordinateurs hébergés ont été vendus et décrits nulle part, de sorte qu'il a brisé les deux affirmations moment ServiceType 37 existait. L'ajout uniquement, et pour une raison aucun des autres applications s'ajoutant uniquement. MLOS, le le système de prêts personnels et les dossiers des patients sont négociés en raison de ce qu'ils carry ; les ordinateurs hébergés sont négociés à cause de ce qu'il dépense. Un échelon-ag confierait à chaque organisation ce plan le droit d'assignation des VM KubeVirt, et l'ordonnanceur limite la flotte par DEMANDE plutôt que par utilisation, de sorte que les régles qui utiliser le droit d'abord prendrait les noeuds du reste - à un le prix, qui est le rôle qui rend difficile la retour à pied. Qu'est-ce qui le déplace sur un l'arcade est plus de nœuds, pas un changement de prix. L'add-on suit la forme que la boucle s'applique déjà aux applications négociées: non le prix catalogue, donc rien n'en rend un, et compatible uniquement avec les plans CUSTOM. C'est Il n'est pas non plus proposé n'importe où jusqu'à ce que l'application atteigne COMPLETED, ce qu'elle n'a pas. L'entrée de catalogues est en productivité à côté des autres choses dans lesquelles les gens travaillent. A catégorie tenant une application se lit comme une supervision à quiconque ouvre la matrice.

  12. · kamo-internal

    Comptes des membres humains/des personnes, noms phonétiques, titres des emplois et exigences du département

    Ajouter membre / Ajouter membre de l'équipe - Une première section "Personne ou AI" : Intelligence humaine (défaut) ou intelligence artificielle comme deux Cartes de claquage à clavier. L'IA fait venir le membre de l'équipe de supervision (par défaut lorsque vous êtes sont un membre de l'équipe) et le modèle d'IA; le lieu de travail d'un membre de l'équipe pré-remplit en tant que télécommande. - Nom phonétique à côté du nom préféré, avec des embouts de prononciation et deux boutons de lecture Nom tel qu'orthographié et écrit phonétiquement à travers le moteur de parole du navigateur. - Le résumé montre Intelligence et "Sa dit it" ; choisir un titre d'emploi ou un département montre ce qu'il attend (description et exigences); une notification de compte existante indique son nom et sa prononciation sont conservés. - Ajout en vrac : un ensemble d'Intelligence par lots (superviseur), une annulation per-row et une colonne Phonétique; CSV importe des auto-cartes "prononciation", "humains ou ai" et des amis ("AI", "Bot", "Human"...). Après la création - Grilles des membres/membres de l'équipe: une colonne de renseignement, un filtre "Temence" - IA - IA avec des comptes, et une recherche rapide qui trouve "AI" et noms phonétiques. - La carte de membre (vol. de chaque nom) : une pilule d'AI et une ligne "Saoui" avec un bouton de lecture; lignes de la liste Premier amorcez-le avec les deux. - Profil: le héros porte la pilule d'IA et "Dite-le"; le nom phoné est édité à côté de la préférence nom; la carte d'adhésion montre/édite Intelligence, superviseur et modèle (Gérer uniquement les membres, jamais sur votre propre profil); la salle de travail obtient une carte d'attente de rôle en direct et en lecture seule. Titres d'emploi et départements (mises/définitions/essentiels) - Le dialogue ajouter/faire prend une section Attentes: une description (4 000 caractères, compteur) et un éditeur d'exigences - catégorie, texte, Required/Preferred, réordonner, supprimer, Enter ajoute le suivant, collage d'une liste la divise en lignes, par exemple puces, calottes à 50 rangs. - Les tableaux indiquent la première ligne de la description et une colonne des prescriptions avec une liste de survols; les deux pages rafraîchissement en direct (menacé pendant que le dialogue est ouvert) et montrez les mots du serveur eux-mêmes sur un écran refusé. Pièces partagées: app/lib/members/intelligence, app/lib/parole (détectée par l'objet, sécurité SSR), IntelligenceBadge / IntelligenceChoice / PhoneticNameField / SayItButton, app/lib/orgRequirements, Examinateur, DirectionExpectations. Spécifications et plans sous dos/superpuissance. Besoignant kamo-library-library et service de sécurité (même fonctionnalité) et les clés du dictionnaire ont d'abord poussés.

  13. · SecurityService

    Membres humains/AI, noms phonétiques, exigences de rôle; position fixe permet d'économiser la sécurité

    Membres - Créer, créer un membre de l'équipe et accepter la création d'un ténacité, le nom Phonetic (nouveau) les comptes uniquement, comme le nom), et pour les comptes d'IA 'ai-survisorMemberId'. Le le superviseur doit être un membre actif de l'équipe humaine de l'organisation et jamais le compte lui-même; Aucun n'est nommé le créateur se trouve dans le cas de sa qualification (AiSupervisorPolicy). Chaque refus nomme son champ avant que quoi que ce soit est écrit. - PUT /members/-id-: "namePhonetic" est un champ d'identité utilisateur (même autorité que le nom légal). « intelligenceType », « 'aiSupervisorMemberId', 'aiModel' ont besoin de MANAGE-MEMBERS ou d'une fenêtre de dieu ouverte, et sont refusés à votre propre adhésion (CANNOT-RELABEL-SELF) de sorte qu'une IA ne peut pas se rebellir humaine. Passage à l'Organisation des Nations Unies pour l'éducation et la coordination des activités de contrôle. - GET/members/-id-, /members/-id-/card, la liste by-depart et les lignes de liste de compte « intelligenceType » et «namePhonetic» (le profil obtient également superviseur id/name et modèle). - les titres d'emploi de l'organisation et les départements portent des caractéristiques et des exigences pour le formulaire de création. Titres d'emploi et départements - POST/PUT/DELETE nécessite désormais CONFIGURE-SYSTEM (ou une fenêtre de dieu ouvert) et les pages de réglages qui Les écrire l'a déjà fait; le serveur a accepté tout membre affilié de l'organisation. Lire inchangé. - La description et les besoins transitent par les services partagés (voir kamo-library). Fixer: PUT/member-security/'id' remplacé rôles, droits directs et temporisation de session même lorsque le rôle de remplacement de l'identique de session La demande ne les a pas nommées. La carte de position du profil n'envoie que le département / le titre du poste / officiel Titre/gestionnaire, de sorte que chaque poste édiction efface les rôles personnalisés du membre, les droits directs et la temporisation l'annulation. Chacun n'est maintenant remplacé que lorsque sa clé est présente; l'éditeur de sécurité envoie les trois. DDL: (appliqué à la main en tant que propriétaire avant cela) push; zéro erreur de schéma-meuma-metmatch dans la sécurité/courrier/médias sur les 15 minutes suivantes).

  14. · kamo-shared-library

    Type d'intelligence, noms phonétiques, supervision de l'IA, titre du poste/des exigences du département

    Membres: «Membre.intelligenceType» (HUMANE et ARTIFICIEL, STRING, par défaut HUMAN sur chaque construction) et dans la colonne), 'aiSupervisorMemberId' (plain id 'les membres est la table la plus chaude et est dérisés) et 'aiModel'. Utilisateurs: «namePhonetic», à côté du nom plutôt qu'à l'intérieur d'EmbNameFull, qui dirigent, les comptes, les emprunteurs et les sessions sont également ancrés. Titres d'emploi et départements: une description (TEXT, 4 000 caractères) et les exigences ordonnées en deux tables pour enfants (org-job-title-requirements-dept-requirements-, 'dept'requirements': catégorie, requise/précédemment, texte : 500, ids stable, ON DELETE CASCADE). «ExigExigExig Exig Exig» est la règle qui fixe pour les deux. validation avant que quoi que ce soit est écrit, diff-by-id donc une exigence tenue garde son id, et un id de un autre propriétaire est traité comme neuf. Les mises à jour suivent "absent signifie inchangé" pour les deux nouveaux champs, de sorte qu'un l'appelant qui ne les envoie jamais ne peut pas les essuyer; "" / [- clair. Prenez maintenant la demande DTO (seul le service de sécurité les appelle). DDL est appliqué à la main 2026-09-22 03:01, avant cette poussée). Une véritable sessionFactory sur l'ensemble de la bibliothèque épingle la nouvelle tables et colonnes à ce DDL (RaireRequirementsMappingTest).

  15. · kamo-internal

    L'option nav, la section des paramètres et la figure de stockage

    L'ordinateur Linux d'un membre s'est ouvert à partir de la barre supérieure. L'application (type de service 37) et ses trois droits a atterri dans la bibliothèque partagée, c'est la moitié des gens qui voient. L'OPTION DE VANE APPLICUE EXACTEMENT L'ÉTABLISSANT L'ÉTABLISSEMENT Remarqué sur la réponse du serveur à "quel ordinateur peut ouvrir ce membre", pas sur un droit et pas sur Dieu. Le l'option de la machine de développement devait l'apprendre: c'était une fois, qui a mis une icône devant les gens avec aucun compte sur la machine et produit l'erreur générique de Guacamole lorsqu'ils l'ont cliqué. Donc un gestionnaire détenant ACCESS-SUBORDINATE-COMPUTERS et aucun ordinateur de leur propre icône n'a encore l'icône - il y a quelque chose derrière Il - et un administrateur titulaire de laMANDE et rien qui ne l'est pas. La liste est celle du serveur, dans l'ordre du serveur: propre d'abord, puis subordonnés', puis de l'organisation. Rien ici ne filtre ou réordonne, pour la raison /la liste du réseau est décidée par le serveur - un côté client filtre est une liste qui a déjà été envoyée, et l'ordre porte des informations que le client ne voit jamais parce qu'il n'a pas la chaîne de gestion. Chaque ligne s'étend aux tailles de DESKTOP-RESOLUTIONS, réutilisées plutôt que refaites, donc une taille ajoutée y est ajoutée. atterrit du côté correct de la règle sous "Fit mon fenêtre" sans que personne ne bouge. Chaque ligne porte son état, parce que "saparement" est l'état de repos normal de l'un de ces ordinateurs plutôt qu'un la faute, et une querelle qui disait que rien ne laisserait quelqu'un qui attendait une minute en pensant qu'il avait échoué. openHostedComputer est plus qu'une recherche et une redirection pour la même raison: un lancement a trois réponses et Deux d'entre eux ne sont pas un lien. Somnolence signifie qu'un réveil a commencé et prend 30-90 secondes pendant que l'invité lit sa mémoire se replie sur un volume répliqué, de sorte que l'onglet dit qu'une onglet vierge pendant une minute est l'indiscernable d'un casse, qui openKamoDesktop devait également être enseigné. Pas encore de connexion signifie Kamo n'a jamais stocké le mot de passe et le membre le confirme une fois; c'est la conception qui fonctionne, pas un échec, Donc l'onglet se ferme et un dialogue demande au lieu de laisser une page d'explication que personne ne voulait. TROIS ÉTAGES TABS. L'un a été demandé; les deux autres sont pour les raisons pour lesquelles il est utilisable Les ordinateurs sont ceux qui attribuent, rédimensionnent, changent de stockage, sommeil, enlever, vivre à l'utilisationOrgChanges. Capacités répond "pourquoi cela ne commencera-t-il pas?", qui sinon n'a pas de réponse nulle part dans le produit - et la réponse est contre-intuitive, donc les barres disent DEMANDE plutôt que d'utiliser, parce qu'une machine peut avoir l'air à moitié inactive et n'ont pas de place. Les défauts de paiement empêchent une organisation de ré-opter pour une taille et un disque pour chaque personne, et chaque boîte il peut y avoir en blanc, où l'ébauche signifie "suivant la plate-forme" et non nulle. Le dialogue de redimensionnement avertit et le dialogue de stockage dit qu'il ne le sera pas, ce qui est la paire qui vaut la peine d'avoir: une taille changer redémarre l'ordinateur parce qu'une image de sommeil est liée à la taille de la mémoire à laquelle il a été écrit, et a Un changement de stockage élargit le volume en ligne et ne perturbe rien. CONSERVATION SUR LA PAGE DES ÉTATS, EN TANT QUE PANNEAU DE PROPRE HostedComputerUsagePanel se trouve directement après le stockage sur Paramètres, Mon Compte, Statistiques et coûts. Pas une querelle en ce tableau: ses lignes proviennent du balayage d'escargots de navigation de balayage de marche de stockage RECORDS, et le disque d'un ordinateur a Aucun - ce qui est sur lui n'est connu que de l'invité, qui rapporte son propre chiffre de système de fichiers. Numéro de Longhorn serait mauvais d'une manière qui compte, parce qu'il compte tout jamais écrit et ne tombe jamais quand Quelqu'un supprime un fichier. Le fichier de swap est exclu: il est de la taille de la mémoire de l'ordinateur et il existe ainsi la machine peut dormir. Deux choses que mes propres contrôles ont capté et corrigé : la porte de la nav a été retournée «non définie» plutôt que «faux» pour un Organisation sans jeu de drapeaux (non défini, x), et la colonne de stockage a passé le nombre et nul dans une unité de lecture placeholder - le plafond et "il croît" sont le même fait, donc il lit maintenant le plafond une fois et laisse TypeScript suit le rétrécissement. Vérifié: tsc propre de tout sauf quatre erreurs de ReplyQuote préexistantes dans le chat et le support, présents à les mêmes lignes en origine/principale. 320 tests nav et lib passe. eslint clean sur chaque nouveau fichier et pas de nouveau l'avertissement dans les éditions. Les trois gardes de la construction d'images passent et vérifiez-i18 n-t-y nettoient plus de 4268 fichiers contre la tête du dictionnaire, qui a été poussée en premier et vérifiée par l'ascendance.

  16. · kamo-internal

    Listes de contrôle dans l'application Notes - conditions préalables, collages, vitrages domestiques et calendrier

    Une note est la mémoire; une liste de contrôle est en cours de travail. /notes a maintenant deux moitiés - Notes et Listes de contrôle (?view-checklists) - et une liste de contrôle est son propre dossier (/api/cotations, KBService) avec des tâches qui peuvent attendre d'autres tâches. Listes de contrôle - Une carte par liste sur son propre mur: bord de progression et anneau, tâches cochantes sur la carte, la puce de programmation; les filtres de rail en cours/non commencés / à faire / programmés / à domicile / favoris, recherche qui s'étend à l'intérieur de chaque tâche. - L'éditeur : ajouter des tâches rapides (Entrée; Shift-Enter l'ajoute en tant qu'étape suivante; collez une liste), cliquez pour éditer, faire glisser ou Alt-arrows pour réordonner, supprimer avec Défaire, All/Ready/Waiting/Done filter, "do in order", décochez tous, clair fait, Doubler en tant que copie nouvelle, copie en tant que Markdown. - Conditions préalables: le mode liaison choisit ce qu'une tâche attend, grisé quoi que ce soit Cela bouclerait. Une tâche verrouillée montre son cadenas et ce qu'elle attend; le presser agite la rangée, illumine les tâches de la manière et offre Sautez-les. Le fait de ne pas cocher quelque chose dont le travail terminé dépend, ou de donner un une tâche ouverte, demande d'abord et nomme ce qui rouvre. Le Le rail de dépendance desserte tous les maillons et éclaire celle de la tâche stationnaire. Le serveur applique les mêmes règles, donc rien ne les contourne. - Déverrouillage, cocher et finition d'une liste sont animés; la finition obtient confetti et un ton dans la surface où la dernière tique a été faite. Partout où une note va - Flottants: les listes de contrôle flottent comme collants dans la même superposition, ordre de gerbage, La disposition sauvegardée et la dock hexagonale en tant que notes (leur propre groupe de docks). - Domicile : une liste de contrôle épinglée est une vitre du pavé de lancement à côté des notes épinglées, cochée. - Un magasin vivant alimente chaque surface, rafraîchie par les listes de contrôle changent, donc une tique partout où il y a des terres partout. Calendrier - Une liste de contrôle est inscrite au calendrier en tant qu'événement réel (sourceType CHECKLIST), programmé par le biais du dialogue d'événement du calendrier à partir de n'importe quelle surface, ou par le faire glisser de la nouvelle barre de contrôle du calendrier sur une journée ou une heure. - Les événements de la liste de contrôle montrent leurs progrès à tous les points de vue; le dialogue de l'événement montre la liste, cochée en place; travail en retard de l'impulsion rouge. - Le mandataire du calendrier publie maintenant le changement d'org "calendar" sur chaque écriture: Les propres sujets d'EmailService sont par pod, donc un onglet sur l'autre pod n'a jamais été entendu. Conception:

  17. · APIService

    Transférer /api/checklists à KBService

    Les listes de contrôle sont en direct dans l'application Notes et sont desservies par KBService à côté des billets eux-mêmes, sans cette route, la fonctionnalité répond à 404 à la passerelle.

  18. · KBService

    La liste de contrôle API, avec des conditions préalables que le serveur applique

    /api/checklists: liste, obtenir, créer, mettre à jour, supprimer, dupliquer, réinitialiser, clear-done, séquence ("do in order"), liens clairs, et par tâche ajouter, éditer, cocher/décrocher, fixer les conditions préalables, déplacer et supprimer. Chaque mutation répond à une liste de contrôle complète pour que chaque revêtement rechigne à partir d'une réponse. Les règles en vigueur dans les règles de la liste de contrôle, purement et exhaustivement, et tiennent une invariante: une tâche accomplie n'attend jamais une tâche ouverte. Une tique est refusée pendant un condition préalable est ouverte (409 PREREQUISITES-OPEN, nommage de celles-ci); un dact clarté que les tâches effectuées dépendent d'une perte d'une mesure à moins qu'une cascade - vraie; une liaison qui bouclerait est refusé (409 CYCLE, avec la boucle); une liaison qui laisserait les travaux terminés l'attente d'un travail ouvert doit être rouverte - vrai (409 RESPERSONNES). Les mêmes règles exécuter dans le navigateur pour un retour instantané, mais c'est celui qui décide un colleron, le calendrier ou un onglet rassis ne peut pas le contourner. Les droits sont les suivants: VIEW-NOTES to read, CREATE-NOTES, EDIT-NOTES et DÉLÉTÉS À VOIR À L'OCLEVANTILLONEUR Les mutations portent sur le thème "RetryOnDbConflict et bump the La version de la liste de contrôle, donc deux onglets qui tournent à la fois en série. create-checklists.sql est le DDL, idempotent, appliqué en tant que propriétaire.

  19. · kamo-shared-library

    Liste de contrôle et liste de contrôleÉléments, référentiels et DTO

    Les listes de contrôle sont le deuxième type d'enregistrement de l'application Notes: travail à traverser, dont les tâches peuvent attendre d'autres tâches. Trois tableaux - listes de contrôle, liste de contrôle - points et tsain - point - préquis - toutes les clés par UUID donc aucun id n'est jamais un int64 a le navigateur pourrait arrondir. Le texte de la tâche est le texte chiffré sous la clé de note du membre. La ligne de la liste de contrôle porte sa propre liste de candidats (EmbRecordState's DATE-UPALISATION-LÉMENTS est in insert/mise à jour-faux et ne bouge jamais) et une version bosses de service sur chaque mutation, donc édictions concomitantes à une liste en conflit au lieu de s'entrelacer. DDL est appliqué à la main - rien ici ne crée un tableau.

  20. · SecurityService

    La surface faisant face au navigateur, et la deuxième passerelle Guacamole

    SecurityService est la limite de confiance pour les ordinateurs hébergés. Il tient la session, les droits et l'orge ComputeService détient les justificatifs d'identité de Kubernetes et aucune session du tout. Rien en aval ne revérifie les re-contrôles Un droit et rien ici touche un groupement. L'ORG ID ne peut JAMAIS DE LA DEMANDE. Chaque appel estampille l'organisation résolue de l'appelant. A L'ordinateur hébergé est une machine entière sur un réseau qui ne voit que sa propre organisation et Internet, donc un manipulateur qui acceptait un org id d'un corps ne serait pas une liste de fuites - ce serait une porte vers quelqu'un Le bureau de l'autre. Le chemin d'attribution résout en outre l'e-mail du membre cible via le propriétaire de l'appelant l'organisation, qui sert de contrôle de l'adhésion: sans elle, un administrateur pourrait attribuer un ordinateur à un membre id appartenant à un autre locataire et faire construire la machine dans l'espace de noms de cette orgue sous cet opérateur nom de la personne. TROIS GATES DIFFÉRENTS, parce qu'il y a trois questions différentes. Gestion des besoins GESTIONNEMENT-ACTURES. L'ouverture a besoin de l'ordinateur pour être le vôtre, ou l'un des deux droits ACCESS élargir-le - et si l'appelant peut ouvrir Si l'ordinateur répond à cette réponse en reprenant la même visibilité questionner du menu de nav à partir de, plutôt que par une deuxième règle qui pourrait être en désaccord. Un membre qui était Je n'ai jamais montré qu'un ordinateur ne peut pas l'atteindre en devinant un id. Confirmer un mot de passe n'a pas besoin du tout: C'est comme ça qu'un ordinateur d'un membre obtient un identifiant. L'ORG L'ARTONNE EST FILLONNE QU'UNE DROIT D'UNE FOIS L'ARRENT, et dans une requête. Accécliser les résultats d'ACCES-SUBORDINATE-COMPPUTERS l'ensemble du sous-arbre sous un membre, de sorte que les bords reviennent en paires et la traversée en aval les surpasse sur un ensemble visité - managerId est un champ de profil de forme libre, pas un arbre validé, donc un cycle est un réorganisation. Un membre sans droits paie un appel, ce qui importe parce que la nav demande cela sur chaque chargement de page. La FORT DE TOKEN EST MAINTENANT SHARED, PAS COPIED. GuacamoleTokenCodec est extrait de GuacamoleJsonAuth parce que il y a deux passerelles: desktop. différentes clés de signature et différents modèles de connexion. Deux exemplaires de ce format seraient un la mise en œuvre et une responsabilité, et l'erreur que la copie ferait finalement est l'erreur « Expires » il se lit comme un lien TTL et est en fait la fenêtre de reconnectement de la session, et obtenir qu'il se trompe vide a la liste de connexion de l'utilisateur en direct silencieusement. La parole est appliquée par les deux appelants. Hosted ComputerSso est un frère plutôt qu'une branche. Cette passerelle offre trois objectifs fixes et met tout ceux-ci dans chaque jeton; celui-ci a une connexion par ordinateur, nommé d'après l'ordinateur, avec une seule fois Le mot de passe Kamo du membre ne voyage jamais en jeton. La plate-forme le bureau doit conserver une copie déchiffrable d'un mot de passe de compte précisément afin que Guacamole puisse se connecter automatiquement; ceci Ce n'est pas le cas, et c'est l'amélioration. PasswordChangeCtroller pousse maintenant le nouveau mot de passe vers les ordinateurs du membre. C'est le SEUL moment de la Kamo stocke un hachage et ne garde aucune copie réversible n'importe où - et la poussée est la meilleure épreuve par construction: une défaillance ne doit jamais échouer le changement demandé par le membre, et un ordinateur endormi est marqué srup ainsi son prochain lancement demande une confirmation. Rien n'est mis en file d'attente, parce qu'un mot de passe en file d'attente est stocké mot de passe avec un retard. Suite: 2755 tests, 5 échecs, et les cinq sont les mêmes que ceux d'origine vierge/principal produit - UnauthenticatedEndpointRatchet on PromotionCodeInternalController (ajouté par 9578ca0 et jamais ajouté à la valeur initiale) et quatre NPE sur le TJobStamp appliqué. Vérifié par l'exécution de l'un et de l'autre dans un arbre de travail propre à l'origine/principal. Mon propre contrôleur passe le cliquet: chaque gestionnaire résout une session et répond 401 sans un. Avoir le secret hc-guac-sso secret pour frapper des liens; jusqu'à ce qu'il existe, le chemin de lancement dit si clairement plutôt que en retournant un lien qui atterrit sur l'écran d'erreur générique de Guacamole.

  21. · EmailService

    Un membre peut mettre une liste de contrôle sur son calendrier, une fois

    Les listes de contrôle en direct dans KBService et le calendrier ne possède que QUAND, donc a La liste de contrôle est une organisation de pays membre ordinaire portant la sourceType VÉRIVANT, la liste de contrôle UUID et un lien profond vers/notes. Le lien est côté serveur dérivé, jamais lu à partir du corps, et l'événement passe par le membre normal crée un chemin de sorte que le changement de calendrier publie des feux immobiles. Un deuxième calendrier actif de la même liste de contrôle est un 409 nommant le premier. GET - les répertorie pour les puces sur /notes. Un éditeur ne peut toujours pas changer ce qu'est un événement. Retro désignations de liste de contrôle Gardez le type de calendrier et obtenez une icône de la liste de contrôle.

  22. · APIService

    Transférer le chemin de l'agent informatique hébergé, et seulement ce chemin

    /api/computers hébergés/agent/------------------------------------------------------ La politique de réseau d'un ordinateur hébergé ne nie entièrement le cluster - pas de base de données, pas de service, pas même cluster DNS - donc la seule façon pour une machine virtuelle d'un locataire de dire à Kamo n'importe quoi est sur Internet et de retour à travers api. Tout le reste à propos d'un ordinateur y est poussé. Il s'agit du seul chemin d'entrée. La descendance est le point. Ses frères et sœurs sous /api/computers hébergés/ sont l'API de gestion interne: l'attribution d'un ordinateur, le redimensionnement, l'effacement d'un ordinateur, la lecture de la capacité d'un autre locataire. Cette passerelle est SecurityConfig est entièrement commenté, de sorte qu'un chemin transféré est public et le service en amont est propriétaire du Auth - un caractère générique ici publierait une API de création de VM sur Internet. C'est la même erreur /api/bulktext/inbound/- existe à éviter, et la raison pour laquelle la surface de l'agent a été faite enfant de /agent plutôt qu'un frère ou une autre des voies de gestion. forward plutôt que forwardWebhook: à la différence d'un opérateur webhook, il n'y a pas de signature par un tiers sur le octets bruts, et le justificatif d'identité est une Autorisation ordinaire: tête de porte-à-faux - un secret par ordinateur tourné sur chaque sillage, que CalculService vérifie contre ce seul ordinateur. Le critère d'évaluation est la télémétrie en lecture seule en lecture seule. dont la réponse n'a rien à voir avec l'organisation, donc un certificat est levé du bureau d'un locataire achète la possibilité de poster le chiffre de stockage de ce bureau et rien d'autre.

  23. · kamo-shared-library

    Une requête pour l'ensemble du graphique de rapport d'une organisation

    findMemberAndManagerIds retourne chaque bord (memberId, managerId) dans une organisation, pour Hébergement C'est l'ordinateur ACCESS-SUBORDINATE-COMPUTERS droite - qui atteint l'ensemble du sous-arbre en dessous d'un membre plutôt que leurs rapports directs ne sont que ceux-ci. L'alternative est findDirectReportMemberIds marchant niveau par niveau, qui est une requête par niveau sur un chemin le menu nav touche à chaque chargement de page, et la profondeur est une propriété du diagramme d'adresse du client plutôt que tout ce code contrôle. Retourne les EDGES plutôt qu'un sous-arbre résolu, car la traversée doit se prémunir contre un cycle: managerId est une référence de forme libre sur le profil d'un membre, et non sur un arbre validé, donc A rapporte à B tandis que B rapporte à A est un faux-clic ou une réorganisation et qu'une requête récursive ne serait pas revenue. L'appelant marche sur la première fois sur un ensemble visité. Filters mirror findDirectReportMemberIds exactement, y compris la recommandation de gauche explicite sur tm.user La jonction implicite est une connexion INNER dans JPQL et supprimerait silencieusement chaque rapport dont la ligne d'utilisateur est manquantes, lesquelles sont les propres rapports de commentaires de cette méthode. Validé par LibraryQueryParseTest, qui traduit chaque Query de la bibliothèque par rapport à l'entité réelle cartographie. Cela compte ici: Spring Data valide une requête annotée quand elle construit le haricot du référentiel, Ainsi, un mauvais chemin compile, passe CI, les navires, puis arrête le service consommateur de commencer.

  24. · kamo-internal

    Une citation sociale d'un message plus ancien nomme son auteur avec sa carte

    La citation prend maintenant son auteur du serveur (ci-après la citation de zkamo/chat-core.senderMemberId), qui refuse l'identifiant d'un contact social puisque le service média est dit, les mots d'un contact sont stockés sous le le propriétaire de la connexion, et le devis utilisé pour nommer le propriétaire. Donc le nom d'un représentant dans une citation d'un message plus ancien que la page chargée ouvre leur carte, comme une carte chargée l'a déjà fait. Un message de contact chargé est refusé ici aussi, quoi qu'un ancien serveur dise.

  25. · kamo-internal

    La carte indique le membre id à ceux qui gèrent les membres.

    HR et support lire l'identifiant d'un membre sur une infobulle sur les fichiers RH, que la carte membre a remplacée (l'embout s'assit à l'endroit où la carte s'ouvre). Les détails de la carte portent maintenant une ligne d'identification des membres, avec la même Copier le bouton en tant que valeurs de contact, pour les téléspectateurs qui peuvent ouvrir le profil de ce membre - les droits qui gèrent les membres, Dieu, et le membre eux-mêmes. Tout le monde ne voit pas d'id.

  26. · kamo-shared-library

    L'application, les trois droits, les enums de niveau/état et les entités

    ServiceType.HOSTED-COMPUTERS à l'étude id 37, TESTING plutôt que COMPLÉTÉS. L'étage est porteur de poids ici plutôt que de décrire les progrès: AppCatalogService résout «disponible» en tant qu'étape Compléter, et une application indisponible est sclipsée par la boucle de provision automatique de FeatureController. Tous les autres L'application arrive allumée pour toutes les 25 organisations le jour où elle expédie; celle-ci distribue des machines virtuelles la détention de RAM réelle sur un cluster de deux nœuds, il faut donc lui accorder par organisation par organisation par un opérateur qui a examiné la capacité. Rien n'est perdu - l'écran de la plate-forme Apps et Caractéristiques existe précisément à publier une application indépendamment de sa phase, de sorte que la ligne y attend sous "Non disponible". Trois droits à 326-328, et non 320-322: la caisse locale était de 30 engagements derrière et 320 est MANAGE-EMAIL-OPT-OUTS. Lisez l'IDS dans ce fichier, jamais l'ordre de ligne 318-325 assis des centaines de lignes au-dessus de la constante qui semble durer. Tous trois sont des racines et aucune n'est un enfant d'un autre, ce qui est la décision qui mérite d'être enregistrée plutôt que le comptage. La section des paramètres est la section des paramètres; les deux droits d'accès sont les portes un ordinateur apparaît dans le menu nav d'un membre. L'éducation et la parentalité soit dans le cadre de la légalité serait erronée dans le cas d'un coût direction - un responsable informatique qui doit ouvrir n'importe quelle machine arriverait en tenant l'écran d'approvisionnement, et un gestionnaire ayant donné une vue d'ensemble des ordinateurs de son équipe serait en mesure de les redimensionner. Ni les portes a ordinateur PROPRE du membre: ce n'est pas un droit du tout, car le faire permet un ordinateur provisionné pour quelqu'un qui ne peut pas y accéder. Hosted ComputerTier et HostedComputerState persistent par NOM. Ces tables sont nouvelles, donc il n'y a rien pour protéger et sans raison d'hériter du risque de réordonnement AssocType et ServiceType doivent vivre avec. Deux dérivations dans le niveau sont en charge et les deux échecs QUIETLY sans eux: - minimumDiskGb() est la mémoire d'invité 25. Un ordinateur dort en écrivant sa RAM dans son propre fichier d'échange, donc un disque sans place pour l'image produit un ordinateur qui ne dort jamais - ou écrit un partiel image et bottes propres avec la session du membre disparu. Ni l'un ni l'autre rapporte, donc la parole est appliqué plutôt que suggéré. - demandeMib() ajoute le lanceur de KubeVirt au-dessus des frais généraux, mesuré à 324 dollars de MiB sur le bureau-1 et arrondi à 400. La capacité doit être comparée à ce que le POD demande: un contrôle qui omet il dit qu'un ordinateur convient et laisse ensuite sa poule en attente indéfiniment, ce qui est indiscernable d'un ordinateur qui n'a jamais Il est apparu et n'a rien à voir qu'un membre ne peut voir. est ce que la planification de la capacité soustraite, et ASLEEP n'est pas délibérément C'est là l'ensemble de la caractéristique. La pause de KubeVirt elle-même "lâche le processus sans libérer le CPU ressources, mais la mémoire reste allouée", donc endormi ici signifie suspendre-à-disk: le VMI et son Le lanceur pod a disparu et la demande de mémoire est de retour avec l'ordonnanceur. Le stockage est une paire annulable avec une troisième signification et pas de booléen. Un plafond au-dessus du disque courant est "non limité" en tant que membre en fait l'expérience; un plafond absent signifie que le disque ne se développe pas. Il n'y a pas de Drapeau « illimité » parce qu'un drapeau sans plafond est la configuration qui mange tranquillement un amas la règle StorageAutoExpandSweep applique déjà pour les fichiers, pour la raison qu'il enregistre. PhiModule.HOSTED-COMPUTERS est BLOCKÉ-NO-BAA, et la raison en est une propriété de la chose plutôt qu'une la lacune dans la paperasserie. Chaque autre module est une surface connue avec des flux de données connus; il s'agit d'un ordinateur de bureau. Quelqu'un peut installer n'importe quoi et coller n'importe quoi dans, et Kamo ne peut pas l'inventer sans regarder l'écran. L'isolement est vraiment fort et ce n'est pas ce qu'un BAA demande. KAMO-UNIVERSE, CHESS et HOLDEM ont également été cartographiés sans PhiModule et sont partis PhiServiceTypeMappingTest rouge. Pas le mien, mais le test échoue sur le premier vide qu'il trouve, donc sans eux il ne peut pas non plus prouver que les COMPUTERS HOSTED sont cartographiés. Ils prennent des JEUX, que leur propre parent prend. Suite: 3026 tests, et les 4 échecs restants sont les mêmes que l'origine vierge/principal produit ReportVisibilityTest (PlatformRightType ordinal, non touché ici), les deux stockages GROWTH-REQUEST-IMAGE tests de domaine, et NoSuchMethod de SystemBugCountContractTest. Vérifié en les faisant passer dans un nettoyage arbre de travail à l'origine/principale avant de changer quoi que ce soit. Les tableaux sont en ligne et ont été appliqués à la base de données en direct.

  27. · kamo-internal

    Une réponse à un message plus ancien nomme son auteur avec sa carte aussi

    Déplace le noyau de kamo/chat-core à 0,1.19, dont la citation de réponse porte l'expéditeurMemberId: le serveur parentSenderMemberId lorsqu'il en a envoyé un (nulle pour un visiteur web-chat, dont les mots sont stockés sous le membre du système), sinon le membre du parent chargé. Avant, la console pouvait lire l'auteur seulement un parent chargé, donc une réponse à un message plus ancien que la page chargée citait un nom clair. - Les conversations de collègue (MessageList) prennent l'auteur de la citation telle qu'elle est. - Les billets appliquent la règle qu'une bulle y suit - le côté du spectateur, une fois les côtés des côtés sont connus (iswnSide) - qui maintenant pour les parents non chargés également. - Les boîtes de réception sociales conservent leur propre règle (un parent chargé de l'un des représentants de l'organisation) : le serveur ne refuse pas l'identifiant d'un contact social, puisque les contacts sont stockés sous l'organe du système. package-lock.json: la version de l'entrée de discussion, résolue et intégrité (vérification à l'encontre de la le tarball téléchargé); ses dépendances à l'épingle (kamo/net 0,1, 2, kômo/réaltime 0,1.1) sont inchangées.

  28. · KlusterServices

    îlots VM par org, suspension-disque et image dorée en blanc

    L'ordinateur Linux d'un membre, fonctionnant comme une VM KubeVirt dans l'espace de noms de son organisation et ouvert à partir du navigateur. Séparer de l'ordinateur de bureau/par quelque chose qui compte: c'est un partage machine pour les administrateurs de plates-formes, délibérément sur le réseau de la nacelle afin qu'il puisse atteindre la base de données, NATS et MinIO. Il s'agit de machines de locataire dont la propriété définissant est l'inverse. Trois faits ont façonné cela, et chacun contredit la lecture évidente : -Fauser une machine virtuelle ne libère rien. Docs de KubeVirt: la mise à l'épreuve "lévisse le processus sans libérer le CPU les ressources, mais la mémoire reste allouée". Donc dormir est suspendu à la DISK et l'invité écrit son une mémoire dans son propre échange et des pouvoirs éteints, la nacelle de lanceur se termine, et la demande de mémoire va Revenons à l'ordonnanceur. Cela nécessite runStrategy RerunOnFailure, documenté pour laisser un invité fermer lui-même sans être relancé; sous Toujours le sommeil serait défait en quelques secondes. - La salle de bains est délimitée par des ordonnanceurs DEMANDES, et non par la RAM physique. Une gousse de lanceur qui ne convient pas Assieds-toi en attente pour toujours, ce qui ressemble exactement à un ordinateur qui n'apparaît jamais et ne journalise rien. Donc un réveil est refusé avant qu'il ne soit tenté, et le refus nomme le numéro. - Les identités réservées au cilium ne peuvent être assorties d'une règle CIDR. - enregistre cela à partir d'une panne, où toEntities [host, remote-node) a dû être ajouté à ALLOW the noeud. Ici, le même fait est la défense inversée: aucune règle ne les nomme, et default-deny.yaml egressDenies donc pas d'édition ultérieure ne peut les ouvrir - un casse de cilium bat chaque permis, à partir de n'importe quel fichier. L'isolement est affirmé plutôt que révisé. canary/verify-isolation.sh exécute une dose transportant la même kamo.io/hc-org label un lanceur porte, donc il obtient la même identité et la même politique, et sonde les deux directions: les nœuds, kube-apiserver, YugabyteDB, NATS, MinIO, kube-dns, les métadonnées l'adresse et les ordinateurs d'une autre organisation doivent tous être inaccessibles; l'Internet et les ordinateurs de mêmeorg doit travailler. Il rapporte également, sans affirmer, si le routeur en amont est en épingle à cheveux api.kamocrm.com se résolve à 47.181.8.84 tandis que le virus IP de Traefik est le 192 de l'agent de type K1m1 Le rythme cardiaque est le meilleur effort par la construction et rien n'en dépend. Le marquage blanc n'a pas besoin d'une reconstruction de la distribution, qui a d'abord été contrôlée surface par surface. Tous les éléments visibles L'identité Xubuntu est config ou un emballage amovible. strip-distro-identity.sh les enlève et broches elles donc apt ne peuvent pas les restaurer - un fichier ombragé revient sur la prochaine mise à jour et l'échec est un locataire voyant le logo de quelqu'un d'autre quelques semaines plus tard. L'image dorée est livrée sans logo et sans couleurs du tout; l'agent les peint par orgue de Behavior - Labeling, en honorant la règle selon laquelle un locataire Ne voit jamais les images de KamoCRM. L'agent est seul et ne peut pas appeler, parce que la politique du réseau signifie qu'il n'y a personne pour Appel. La configuration est poussée, la décision du sommeil est locale donc elle survit à une panne de Kamo, et l'hibernation la préparation est vérifiée (taille de l'échange, reprise et reprise-offset, disque dans /sys/puissance/état) avant le La minuterie de ralenti est armée - un hiberné mal configuré ne soulève pas, il nettoie et perd la séance. 26 tests couvrent cette arithmétique plus la validation de l'entrée de marque. est appliqué à la main (en basonbo-bobine n'est pas nul et InitializerService n'est pas ont été, contre la base de données en direct en tant que propriétaire. Il a besoin d'une subvention la recette existante ne mentionne pas: un schéma NEW n'a pas de LCA, donc les privilèges par défaut globaux qui couvrent les tables laissées kamo-app avec "permission refusée pour le schéma hébergé - ordinateur" sur le premier encart. Vérifié après. Chaque manifeste validé avec kubectl applique --dry-run-server.

  29. · kamo-shared-library

    Laissez un appelant résoudre un MediaObjImg par l'ID seul

    Les critères d'évaluation de l'imagerie de DocsService (download/stream/list/delete) connaissent un id d'Img mais n'ont aucune raison de tenir le MediaObj auquel il a été attaché - jusqu'à ce qu'ils aient besoin pour honorer le discours d'inscription au chat-attaché raffermi dessus (MediaObjImg.isAccessARevoked) sans posséder eux-mêmes de cache de discussion/médias. MediaObjImgOpos de référence uniquement a pris en charge l'autre direction (par obj id, ordonnée, pour rendre un message les fixations). findByImg-Id comble l'intervalle; pluriel parce que l'unique la contrainte est sur (OBJ-ID, IMG-ID), pas sur IMG-ID seul. Nouveau test: MediaObjImgRepositoryQueryTest, épinglant la requête dérivée signature de la manière dont - le fait déjà pour son dépôt de scietage (cette bibliothèque n'a pas de harnais 'DataJpaTest/H2', donc une méthode dérivée no-Query est affirmée par réflexion plutôt qu'exerçante). Suite complète: 3013 tests, 4 échecs préexistants et 1 erreur préexistante, tous confirmé présent sur une origine propre/passer principal avant ce changement et sans rapport avec elle (PhiServiceTypeMappingTest: ServiceType.KAMO-UNIVERSE n'a pas PhiModule; - Non réclamé par un StorageDomain; SignalVisabilityTest: un nombre de rapports hors-un; SystemBugCountContractTest: SystemBugRepository.findVisible signature drift).

  30. · DaemonService

    Pliez les registres principaux tous les 30 s et les recountiez tous les soirs; le déclencheur d'emploi a besoin du secret du cluster

    Les livres principaux (security service create-lead-ledgers.sql, applied 2026-09-22) remplacent le COUNT(-) par rapport à un Pool de 796 000 k-chefs et crédits- leads avec des totaux maintenus plus un journal appendice qui ramène qui est au nombre déclenche les déclencheurs écrivent. Ce service les maintient pliés et honnêtes : - LeadLedgerFoldJob (tous les 30 s) : une déclaration par lot supprime les lignes de journal et les ajoute au totals, donc un lecteur voit le chiffre avant ou après, jamais la moitié. Les lecteurs ajoutent déjà le journal à le total, donc une coche manquée coûte du temps de lecture, jamais de l'exactitude. Au maximum 40 lots de 5 000 par tique. - LeadLedgerReconcileJob (03:40 par nuit) : recompte le pool de chaque org et les crédits disponibles de chaque membre à partir des lignes et les compare avec le journal total en ONE statement (un instantané). Les différences sont les suivantes: Appelé en delta "RECONCILE", jamais écrit sur un total, de sorte que le recomptage ne peut pas courir les déclencheurs ou a pli. Il nomme également tout déclencheur de journal qui manque ou désactivé. Dans un système sain, il trouve Rien, donc chaque correction est enregistrée à WARN. Les deux sont «DisallowConcurrentExecution et rétrécissez une déclaration YugabyteDB avortée de 40001» (chacun est atomique, donc un réessayer ne peut pas doubler-compte). Le SQL a été rejoué contre YugabyteDB avant que celui-ci ne soit expédié (temp. tables: déclencheurs, lectures, pliage et recomptage, 60 contrôles). JobTriggerController: POST/api/daemon/trigger/job et GET/status répond à n'importe qui. Configuration de la sécurité permet à tous, et le daemon-route IngressRoute met ce service sur le point d'entrée public sécurisé sur le Web (Host daemon.internal.kamocrm.com; sondé 200 anonymement), donc n'importe quel emploi - maintenant l'inclusion du recomptage - pourrait être commencé à partir d'Internet, autant de copies qui se chevauchent que le pool Quartz détient. Les deux maintenant exiger X-Internal-Auth et mlos.internal-auth-secret (à temps constant) et refuser à tout le monde lorsque ce secret est inopée. Rien dans la plate-forme n'appelle ce point d'extrémité; un opérateur peut toujours, de l'intérieur du cluster. Tests: LeadLedgerMaintenanceTest (boucle et pliage, compte rendu de recompte, déclencheurs manquants, essai de ré-essayage la règle, et les formes SQL qui le rendent sûr à côté du trafic en direct), JobTriggerControllerAuthTest.

Votre univers vous attend.

Commencez gratuitement en quelques minutes. Ajoutez des produits quand vous êtes prêt. Pas de migration, pas de nouvelles connexions.

Gratuit pour toujours — aucune carte de crédit requise