Changelog
Was ist neu?
Jede Verbesserung an der Plattform, wie sie geliefert wird.
· EmailService
Wer verursachte eine Benachrichtigung reist mit ihm, so dass die Glocke kann sie als Mitglied zeichnen
- NotificationRequest gewinnt actorMemberId/actorName; der alte Konstrukteur bleibt für jeden Produzenten, Vor sie datiert. - raise() behält das Paar nur, wenn beide Hälften da sind, der Name passt seine Spalte, und der Titel oder Körper buchstabiert es wirklich: ein Name, den der Text nicht enthält, hat nirgendwo zu ziehen, und ein nach 255 würde sonst die Einlage scheitern und nehmen Sie die gesamte Benachrichtigung mit. - toPayload() sendet actorMemberId als TEXT neben actorName - die Liste, browse und der Sockelrahmen. - /api/interne/Notifikationen liest actorMemberId (Text oder Nummer) und SchauspielerName. - /api/notifications/self (die ungelesene Chat-Karte des Browsers) hält den Schauspieler nur, wenn das Mitglied in die eigene Organisation des Anrufers. Die ID ist das Wort des Browsers; es kann den Absender benennen, den er sah, aber nicht jemanden von anderswo (ein Exec2Exec-Pendant, ein abgestandener Leerstand) als Kollegen gezeichnet haben. Needs kamo-shared-Bibliothek 727c0ec2 und die DDL in ************ 2026-09-23 auf die Produktion von Hand angewendet, bevor dies vorangetrieben wurde. Tests: MemberNotificationServiceTest (+4), NotificationSelfRaiseActorTest (4). Komplette Suite: 1912 Lauf, 0 Ausfälle, 1 übersprungen.
· kamo-shared-library
Eine Benachrichtigung kann sagen, wem es ist
MemberNotification erhält ACTOR_MEMBER_ID (INT8) und ACTOR_NAME (255): das Mitglied, das es verursacht hat - wer behandelt Sie in, dessen Sitzung beginnt, wer schrieb Ihnen - und ihr Name genau wie der Titel oder Körper buchstabiert es. kamo-interne zeichnet diese Strecke des Textes als Name des Mitglieds, so schwebe es öffnet ihre Mitgliedskarte. Bis jetzt war jeder Name in der Glocke Klartext, weil nichts aufgezeichnet, wer es war. DDL, von Hand auf die Produktion am 2026-09-23 als Eigentümer kamo angewendet (ddl-auto ist keine überall): ALTER TABLE public.member_notifications ADD COLUMN IF NOT EXISTS actor_member_id INT8; ALTER TABLE public.member_notifications ADD COLUMN IF NOT EXISTS actor_name VARCHAR(255); Die gleichen Aussagen Schiff in E-Mail-Service als **************** EmailService ist der einzige Dienst, der diese Tabelle liest oder schreibt.
· InitializerService
Die Notes-Plan-Funktion ist "Notes & Checklisten"
Die Notes-App hält auch Checklisten seit 2026-09-23 und wird aufgerufen "Notizen & Checklisten" überall genannt. Der Preisvergleich der Preisseite chart nimmt seine Zeilennamen von commerce_subscription_features, also NOTES-Reihe wird auch dort umbenannt: NotesChecklistenRenameMigration (@Order 215) benennt jede NOTES-Reihe, die noch den alten Standardnamen trägt, und schreibt um Sign Pinks Beschreibung, wo es noch den alten Satz liest. Eine Umformuliert row wird in Ruhe gelassen und eine Neuauflage ändert nichts. Nur kopieren: service_type und is_included, die entscheiden, was ein Plan berechtigt, unberührt bleiben. KamoCRMPricingLoader sät den neuen Namen für Kataloge, die von hier an erstellt wurden. von Hand auf 2026-09-23 mit den gleichen Aussagen angewendet, seit diesem Dienst wird nicht eingesetzt.
· kamo-internal
Ein eingeschalteter Briefkasten bleibt live, und das Suchfeld ist poliert
Live-Updates. Die Seite bittet EmailService, das Mailbox zu sehen, das es geöffnet hat, wenn es ist nicht das eigene Mitglied (/app/email/watch, nach einer erneuten Verbindung wieder gesendet, gestoppt beim Verlassen der Seite), und die Ordnerliste und der Baum laden darauf Änderungen an mailbox - neue Post und Änderungen von jedem anderen Client oder von jeder andere - genau so, wie sie es bereits für das Mitglied selbst getan. Die Staffel hat ein eigenes Thema, also hören das Postabzeichen und der New-Mail-Sound nie die Mailbox eines anderen; eine Änderung wird nur für die Mailbox tatsächlich vorgenommen auf dem Bildschirm (lib/email/mailboxWatch). Polnisch, alle durch das Fahren der realen Komponenten in Chrome gefunden: - Der Hilfedialog und das erweiterte Formular haben ihren Einöffnungseffekt auf jeden Seite Render (die Seite geht eine frische aufClose), die Fokus zog zurück zu die Schließung / das "From"-Box unter dem Mitglied. Sie laufen jetzt einmal pro Öffnung. Der Dialog hält auch Tab darin und gibt die Handsfokus zurück zu "Wie zu suchen", wenn es schließt. - Der Suchfeld Platzhalter ist "Suche mail"; der lange wurde geschnitten "Mail suchen - versuchen f" in der 320px-Spalte (Wörterbuch 6401409c). - "Wie man sucht" sitzt am Anfang der eigenen Zeile, wenn die Spalte zu ist schmal für sie neben dem Umfang Krücken, anstatt hängen von rechts. - Der Umfang Toggle ist ein Tab-Steiger mit den Pfeiltasten, wie jede Radiogruppe; die Vorschlagliste kündigt die hervorgehobene Option (aria-aktiver Abstammungskandidat), hält es in Sicht gescrollt, und markiert seine Überschriften als Präsentation.
· kamo-internal
Audio-Unterricht - eine Aufnahme hochladen, und Lernende können sie wirklich navigieren
Autoren (/h/Kurzlehrgang Redakteur) - "Upload-Datei" auf jeder Folie, neben "Choose media": Audio (MP3, M4A, AAC, WAV, OGG/Opus, FLAC), Video oder ein Bild, durch die Bild-Pipeline in HR Resources, angebracht, sobald es ist gespeichert. Der Bibliotheks-Picker kennt auch Audio (Abzeichen, Wellenform-Thumnail), und die Kurs-Deckung Picker bietet jetzt nur noch Bilder an. - Eine Audio-Dia-Dia bekommt einen eigenen Editor: eine erforderliche Beschreibung (der zugängliche Name), die Lektion genauso spielen, wie ein Lernender es trifft, Kapitel (fügen Sie eins am Playhead hinzu, bearbeiten Sie Zeiten als m:ss oder h:mm:sss, spielen von jedem, oder fügen Sie eine Liste in den üblichen "00:00 Titel" Formen), und ein Transkript, dass folgt mit. Ein fertiger Job überschreibt nie Text getippt, während es lief (er wird stattdessen angeboten), und man findet das Laufen, wenn die Rutsche wieder geöffnet wird, wird auf die gleiche Weise angeboten. - Die Aufnahme wird einmal gemessen, auf Attach: Länge und Wellenform kommen von ConversionService und werden auf dem Dia (media_meta_json) gespeichert, so dass kein Lerner darauf wartet. "Hören Sie auf die Aufnahme" ist die Audioformulierung der Play-Through-Regel. Lernende (der Kursspieler) - Ein Wellenform-Säger, der zeigt, was gespielt wurde, was eigentlich HEARD, die Kapitel, ihre Lesezeichen und eine A-B-Wiederholung; klicken, ziehen oder Pfeil durch sie, mit einem Zeit-und-Kapitel Vorschau auf Schwebe. - Kapitel mit pro-Kapitel gehört Fortschritt, Vorher/nächstes Kapitel, und "Wiederholung dieses Kapitels". - Ein Transkript, das der Aufnahme folgt, auf Klick irgendwo springt und mit dem nächsten/Vorher sucht durch die Spiele; Bildunterschriften der Linie, die unter der Wellenform gesprochen wird. - Lesezeichen mit Notizen, gehalten in den eigenen Präferenzen des Mitglieds, so dass sie ihnen zwischen den Geräten folgen (nie geschrieben, bevor die gespeicherte Liste geladen ist, was sie ersetzen würde; eine anstehende Notiz wird versendet, nicht fallen gelassen, wenn sich die Rutsche schließt). - Geschwindigkeit von 0,5 bis 2" (und die Zeit mit dieser Geschwindigkeit links), 10 s, Volumen, das gewählte Mitglied Lautsprecher, die Medientasten des Betriebssystems und eine Tastaturkarte (Space/K, J/L, Pfeile, Shift+Pfeile oder P/N, < x, 0-9, M, B, A, C, /, ?) mit Hilfeblatt. - Es setzt sich fort, wo sie auf diesem Gerät gestoppt, und bietet den ersten Teil, den sie nicht gehört haben. - Die Play-Through-Anforderung zählt nur Dehnungen tatsächlich gespielt: ein Suchen (Scrubber, überspringen, Schleife, devtools, oder eine Zecke, die Mitte der Suche nachsuchen) verdient nichts, und auch nicht schneller als 2 ". Im Gegensatz zu der Video-Regel schreibt es einen Hintergrund-Tab lange Zecke, weil Audio ist, was die Menschen spielen in einem. Gehört, innerhalb einer halben Sekunde des Endes zählt als die gesamte Aufnahme: die gespeicherte Form Runden auf 0,1 s und die Dauer nicht, und 100% verwendet, um als 99% für immer zu lesen. - Die Escape Luke für eine Datei, die der Browser nicht abspielen kann, erscheint, sobald die Aufnahmelänge übergeben, wie es für Video tut; Verknüpfungen funktionieren überall dort, wo Fokus innerhalb des Playerdialogs ist. Auf dem Weg behoben, für Video so viel wie Audio - Das Play-Through-Gate gemessen an der gefrorenen Dauer der Version, die nie veröffentlicht schrieb: Jede Videoversion trägt null, so dass das Beobachten nie die Anforderung erfüllen konnte. Die Gate verwendet nun die eigene Dauer des Elements. - Was ein Mitglied beobachtet hatte, erreichte den Server nur, wenn sie drückten, so dass der Kurs schließen mid-lesson verlor es. Es wird alle 20 s gespeichert, auf Pause und in der Nähe, mit dem Prozent der Abschluss manifest liest (es wurde nie gesendet, so dass jede Manifest aufgezeichnet 0% Abdeckung). - Folienmedien, Fragebilder und die Lektion selbst jetzt durch die eigene Mitgliedschaft laden Zuweisung ************ statt der Bildgebung stream, was VIEW_DOCUMENTS erfordert - ein Recht, das 32 von 149 Mitgliedern nicht halten. - Der Editor Keyed Diakarten von uid, die jede automatische speichern ersetzt, so dass jeder sparen remounted Karte - und hätte den Ton gestoppt, den ein Autor beim Tippen eines Kapitels hörte. Upload im Flug folgt seiner Folie durch eine Bewegung oder eine Löschung. - Die Mitgliedsmedienroute antwortet mit einem Sandbox-CSP und Nosniff: ein Diabild kann eine SVG sein, die direkt geöffnet würde sonst Skript in diesem Ursprung laufen. Needs DocsService (media endpoint, media_meta_json) und ConversionService (Sprechzettel, Transkripte) Die englische Seite ist auf Kamo-Translation-dictionary a4c6f856 eingesetzt.
· KlusterServices
Eine Möglichkeit, das goldene Bild tatsächlich aufzubauen
build-golden-image.sh sagte "Run by CI (siehe ../...forgejo/workflows/) " Kein solches Workflow wurde jemals geschrieben. Es braucht libguestfs, qemu-img und virt-customize, keine von denen auf der Maschine installiert ist diese Repo gearbeitet, und es gibt keine Container-Laufzeit dort entweder - so dass die eine Artefakt die ganze App hängt hatte kein Weg zur Existenz. So fand die erste Person heraus, die einen Computer zuweisen konnte. Der Build läuft stattdessen im Cluster, der der eine Platz ist, für den bereits ausgestattet ist it: die Knoten führen KubeVirt und setzen /dev/kvm durch die devices.kubevirt.io/kvm Gerät-Plugin, so libguestfs ist Hardware-beschleunigt, anstatt zu empressen für Stunden. Der Job schreibt direkt in das goldene PVC, weil vm/datavolume-template Klone mit source.pvc und einem CDI-Klon eines Filesystem-Bandes kopiert seinen Inhalt so ist jeder Anspruch, der disk.img hält, eine gültige Quelle. Das entfernt den HTTP-Hosting-Schritt, der Upload-Angabe und eine zweite Kopie einer Multi-Gigabyte-Datei. gold-datavolume.yaml bleibt für ein Bild, das woanders gebaut wird. Drei Dinge, die es sich aus dem Schreiben zu wissen lohnt: Die Skripte reisen als ConfigMaps statt als ein git-Klon, so dass der Job braucht keine Beglaubigung. Sie montieren nur lese-only ohne Ausführungsbit, so dass sie auf eine kopiert werden beschriftbarer Pfad vor virt-customize --run kann sie ausführen. Der Build passiert im Scratch und nur die fertige Datei wird in den Anspruch kopiert. Das Skript schreibt ein 20 GB arbeitendes qcow2 und dann qemu-img konvertieren -c schreibt eine Sekunde komprimiert ein neben ihm; tun, dass in der goldenen Anspruch würde es brauchen, um zweimal sein die Größe des Bildes, das es hält. VERSION ist jetzt überschreibbar. Der In-Cluster-Pfad muss die Version VOR der bauen beginnt, weil der Anspruch trägt es in seinem Namen und muss für den Job zu existieren schreiben Sie in, so dass der Wrapper löst Canonicals serielles einmal und verwendet diesen einen Wert für beides. Ein Umbau einer bestehenden Version wird abgelehnt, anstatt in geschrieben: zweites Schreiben in ein bevölkertes goldenes PVC ist der Ausfall, der jeden Mieter erreicht einmal.
· ConversionService
Audio - eine Wellenform Miniaturansicht beim Hochladen, und Spitzen und Transkripte auf Anfrage
Eine hochgeladene Audiodatei fiel durch auf den Docs PDF Pfad, der nicht öffnen kann, so dass jeder Audio-Upload endete "Conversion failed" mit einer leeren Bibliotheksfliese. Audio nimmt jetzt seine eigene Niederlassung, wie Video: gestreamt, um zu kratzen (nie in Haufen), dekodiert ONCE in Peaks, und seine Seite-0 Miniaturansichten von diesen Gipfeln in Java. Nicht 08.09.2018peg's showwavespic, das jede dekodierte enthält Frame bis zum Ende der Datei: gemessen bei 298 MB für eine 30-minütige MP3 und 546 MB für eine Stunde, auf ein grenzenloser Thread pro Upload in einer für Dokumente gemessenen Pod-Decode-Spitzenwerte erreicht mit 54 MB. FLAC, die die MIME-Tabelle speichert als generisches Binärsystem, wird durch seine Erweiterung erkannt. **************** - GET /peaks - die Dauer und eine 1.600-Bucket-Wellenform (Basis64 von 0 bis 255 Peaks). lesen, wie es strömt und nur eine kurze pro 50 ms Fenster gehalten wird, so dass eine Stunde kostet 72.000 Shorts; der Browser decodeAudioData würde über ein Gigabyte für die gleiche Stunde halten. Neben der Datei als <datId'_peaks_v1.json, also wird sie einmal pro Inhalt berechnet. - POST|GET /transcript - eine zeitbewertete WebVTT-Transkripte von whisper-asr (vad_filter on), als Job laufen auf einem virtuellen Thread mit seinem Zustand in <datId?_transcript_v1.json, die entweder Replik lesen kann (ein In-Gedächtnis-Stellentisch wäre für die andere Hülse unsichtbar). Ein Job pro Pod nach dem anderen: whisper-asr ist eine CPU-gebundene Replik, die mit Voicemail und Meeting-Transkription geteilt wird. Ein Laufen Job schreibt seinen Marker jede Minute aus seinem eigenen Thread um (beigelegt, bevor das Ergebnis geschrieben wird), so ein Job, dessen Schote starb liest sich als gescheitert nach drei verpassten Beats statt Sperrung der Autor Aus für ein Whisper Timeout; ?restart=true ersetzt ein fertiges Transkript. Gemessen am Live-Service: eine 2 min 7 s Aufnahme dauerte 25 s. Beide erfordern VIEW_DOCUMENTS und die bildgebende Zugriffsebene und dienen nur HR-Ressourcen: Voicemails, Anrufaufzeichnungen und Chat-Sprachnotizen tragen jeweils eine pro-Record-Regel in DocsService, dass dieser Service kann nicht sehen, also bleiben sie eine 404, bis etwas, das sie braucht, diese Regel mitbringt. Der Build nimmt auch die Audio-MIME-Aliase von kamo-shared-library auf: M4A, WAV, OGG und AAC Uploads wurden als MIME-Munges abgelehnt.
· DocsService
Audio-Dias - Medien-Metadaten, und Lernende spielen Medien durch ihre Zuordnung
Die Navigation einer Audio-Folie lebt in media_meta_json (Dauer, Wellenform-Peakte, Kapitel), welche Der Editor schreibt und der Spieler liest wörtlich zurück. Es wird gespeichert (gereicht an 256K und an einen JSON Objekt, und nur gehalten, während die Folie Medien hat), dupliziert, eingefroren bei der Veröffentlichung und serviert auf der Spieler DTO. Publish schreibt auch media_duration_ms von it . erklärt auf der Version von Anfang an und nie geschrieben - und die Kursschätzung zählt die reale Länge einer Audio-Unterricht. Der Fingerabdruck hat die Transkription und Metadaten eines AUDIO-Dias, so dass er eine Transkriptzeile korrigiert oder Das Verschieben eines Kapitels ist eine veröffentlichbare Änderung. Jede zweite Rutsche hat genau wie zuvor: Verbreiterung der hath zu allen Folien jeden veröffentlichten Kurs mit einem Video-Transkript "unveröffentlicht" gedreht der Tag, an dem dieser ausgeliefert wurde. GET **************** serviert eine Rutsche (oder eine Frage) Medien mit Range Support, autorisiert durch die eigene Zuordnung des Mitglieds: die Datei muss in der Version wurden sie zugewiesen, in HR Resources, in ihrer Organisation, live und unentrangiert. Die Imaging-Stream es ersetzt für Lernende braucht VIEW_DOCUMENTS, die 32 der 149 Mitglieder halten irgendein Recht nicht hatte - jeder von ihnen traf einen toten Spieler. Weil ein Lernender von autorisiert ist die Anwesenheit der Datei in einem Kurs, Speichern einer Einheit verweigert nun eine Datei, die ihr Autor nicht öffnen kann (422 Benennung der Folie oder Frage) und Anhängen einer Datei überhaupt benötigt VIEW_DOCUMENTS, das Recht Bild-Stream selbst Anforderungen; Veröffentlichung Wiederholungen sowohl Kontrollen über den gesamten Kurs, so ein Entwurf früher oder von einem Co-Autor gespeichert wird, um die gleiche Regel gehalten. Sonst könnte MANAGE_TRAINING allein eine Datei veröffentlichen, die ihr Inhaber nicht in einen Kurs lesen kann und sie sich selbst zuweisen. Der Lernweg auch immer nur dient ein Bild, ein Video oder eine Aufnahme - nie ein Dokument ein handwerklich gespeichert genannt. HR Resources ist auch schmaler als jede andere ättige Regel (Ausgebuchte Pakete sind SERVICE_APPLICATION, die Dokumente LOAN oder ACCOUNT_MEMBER_VAULT und chat/voicemail/call media haben ihre eigenen Sammlungen). Lesungen werden wie /imaging/stream geprüft, und die Range-Antwort ist ein gemeinsamer Helfer (ImgRangeResponses), den /imaging/stream jetzt auch verwendet. Veröffentlicht eine Audio-Folie ohne Beschreibung in Audio-eigenen Worten. Needs kamo-shared-Bibliothek "feat(imaging,training): Audio-Uploads bestehen den MIME-Check und Dias Medien-Metadaten tragen" (media_meta_json auf beiden Dia-Entitäten; die DDL wird angewendet).
· kamo-shared-library
Audio-Uploads bestehen den MIME-Check, und Dias tragen Medien-Metadaten
Jeder Audio-Upload außer MP3 wurde als MIME-Missverhältnis abgelehnt. Ein Upload wird nur akzeptiert, wenn der Browser-Typ und Tika schnüffeln lösen, um die gleichen ImageMimeType, und für Audio die beiden Seiten buchstabieren Sie niemals ein Format auf die gleiche Weise. Gemessen an Tika 2.9.2: ein WAV schnuppt als audio/vnd.wave (Browser senden Audio/Wv), Ogg als Audio/Vorbis oder Audio/opus (audio/ogg), ADTS AAC als audio/x-aac (Audio/Aac), und Windows und macOS senden ein .m4a als audio/x-m4a, wo Tika sagt Audio/mp4. stringToImageMimeType ignoriert nun Gehäuse, Umgebung und Parameter und ordnet diese Aliase ab auf die Konstante, die sie benennen. Nichts bildet einen Container, der Video tragen kann (Matroska, WebM, MP4) zu einer Audiokonstante, und FLAC bleibt wie bisher auf beiden Seiten eine generische Binärin. TrainingSlide und TrainingVersionSlide gewinnen media_meta_json (TEXT): die Dauer, Wellenformspitzen und Kapitel markiert den Trainingsspieler navigiert eine Audiostunde von - geschrieben vom Editor, eingefroren mit der Version. DDL, die von Hand vor dieser Übergabe in Produktion angewendet wird (InitializerService wird nicht eingesetzt): ALTER TABLE public.hr_training_slide ADD COLUMN WE NOT EXISTS media_meta_json TEXT; ALTER TABLE ************ ADD COLUMN IF NOT EXISTS media_meta_json TEXT;
· kamo-internal
Der vollständige Titel eines Werkzeugfensters, wird jedoch kurz geschnitten
Eine Titelleiste ist eine Zeile, und ein Gespräch, eine E-Mail oder Ticket-Betreff oder ein Das Verzeichnis des Terminals ist regelmäßig länger als der Raum, den es bekommt. konnte immer nur den Start abrufen. Jeder Ort, an dem der Titel eines Fensters gezeichnet wird öffnet nun eine Karte mit der ganzen: die Titelleiste in der ersten Reihe, die Fensterstreifen, die hinten stehen, eine schwimmende oder maximierte Fensterleiste, und die Registerkarten über dem maximierten Bereich (wo es ersetzt den Browser eigenen unstyled -title" Tooltip). Erreicht jede Art, wie ein Mitglied fragen kann: - Schwebe: nach einer kurzen Pause, und auf einmal beim Rutschen von einem anderen Titel; eine Karte nach der anderen - drücken: sofort; abgenommen, sobald die Presse zum Fensterzug wird, und gedrückt gehalten, bis der Zeiger verlässt oder wieder zurückkommt - Hahn: sofort, nach den Finger hebt, bis ein Wasserhahn woanders landet - Tastatur: Fokussierung eines Streifens, einer Registerkarte oder einer schwebenden Fensterleiste; Escape schließt - Rechtsklick: das Fenstermenü benennt jetzt das Fenster in voller Höhe an der Spitze und hat eine "Kop-Titel"-Reihe Nur für einen Titel, der tatsächlich abgeschnitten ist (gewertet, wenn er geöffnet würde, inklusive eines Subpixel-Überlaufs "scrollWidth", und es folgt dem Fenster, wie sich die Zeile bewegt, Updates, wenn der Titel über den Socket umbenannt wird, und geht einmal eine Maximierung oder eine breitere Zeile lässt den Titel passen. Die Karte ist eine tiefere Farbton der org eigenen Titelleiste, Linien den vollen Titel nach oben unter dem Cut-Off, ist wählbar, und kopiert den gesamten Titel. Die Karte ist portalisiert, aber React Blasen seine Ereignisse zurück in die Titelleiste, so es stoppt die Presse, Klick, Doppelklick, Kontextmenü und Tasten, die Ziehen, heben, maximieren oder verschieben Sie das Fenster darunter.
· InitializerService
Setzen Sie die App in den Anspruchskatalog, Add-on nur
************ behauptet, dass jede verkaufte App kategorisiert ist und sitzt irgendwo auf der Stufenleiter, weil eine App, die der Katalog nicht beschreibt, landet nirgends auf der Preismatrix und der Stille schreibt is_included=false auf jeder Stufe. Hosted Computers wurde verkauft und beschrieben nirgendwo, so dass es beide Behauptungen brach die Moment ServiceType 37 existierte. Add-on nur, und aus einem Grund keiner der anderen Add-on-only-Apps teilen. MLOS, die persönliches Leihsystem und Patientenakten werden verhandelt, weil, was sie Hosted Computers wird wegen dessen, was es ausgibt, verhandelt. Eine Stufe rung würde jede Organisation auf diesem Plan das Recht geben, KubeVirt VMs zuzuweisen, und der Planer begrenzt die Flotte durch REQUESTS anstatt Nutzung, so dass die orgs, dass verwendet der Anspruch zuerst würde die Knoten vom Rest nehmen - an einem veröffentlichten Preis, das ist der Teil, der es schwierig macht, zurück zu gehen. Was es auf ein bewegt rung ist mehr Knoten, nicht eine Preisänderung. Das Add-on folgt der Form, die die Schleife bereits für die ausgehandelten Apps gilt: nein Listenpreis, also nichts macht einen, und nur mit CUSTOM Pläne kompatibel. Es ist auch nicht überall angeboten, bis die App erreicht COMPLETED, die es nicht hat. Katalog-Eintrag sitzt in Produktivität neben den anderen Dingen, die Menschen arbeiten in. A Kategorie hält eine App liest sich als Versehen zu wem öffnet die Matrix.
· kamo-internal
Mensch/AI Mitgliedskonten, phonetische Namen, Berufsbezeichnung und Abteilungsanforderungen
Mitglied hinzufügen / Teammitglied hinzufügen - Eine erste "Person oder KI"-Sektion: Human Intelligence (Standard) oder Künstliche Intelligenz als zwei Tastatur-operable Wahlkarten. AI bringt das beaufsichtigende Teammitglied (Standards zu Ihnen, wenn Sie sind ein Teammitglied) und das KI-Modell; der Arbeitsstandort eines Teammitglieds wird als Remote vorab. - Phonetischer Name neben dem bevorzugten Namen, mit Aussprache-Tipps und zwei Play-Buttons, die die Name als geschrieben und als phonetisch geschrieben durch die Browser-Sprache-Engine. - Die Zusammenfassung zeigt Intelligenz und "Says it"; Kommissionierung einer Berufsbezeichnung oder Abteilung zeigt, was es erwartet (Beschreibung + Anforderungen); eine bestehende Kontomitteilung sagt seinen Namen und die Aussprache sind gehalten. - Bulk hinzufügen: eine Batch Intelligence-Einstellung (+ Supervisor), eine pro-Reihe Override und eine Phonetische Spalte; CSV-importe Auto-Karten "Pronunciation", "Mensch oder ai" und Freunde ("AI", "Bot", "Mensch"...). Nach der Erstellung - Mitglieder / Team Members Grids: eine Intelligenzsäule, ein All · Mensch · KI-Filter mit Zählungen und schnelle Suche, die "AI" und phonetische Namen findet. - Die Mitgliedskarte (jeder Name schwebt): eine KI-Pille und eine "Saes it"-Zeile mit Play-Button; Dienstplanzeilen Mit beidem grundieren. - Profil: der Held trägt die KI-Pille und "Says it"; der phonetische Name ist neben dem bevorzugten Name; die Mitgliedskarte zeigt/edits Intelligenz, Supervisor und Modell (nur Mitglieder verwalten, nie auf Ihrem eigenen Profil); der Arbeitsraum erhält eine Live-, lesbare Rolle Erwartungskarte. Berufsbezeichnungen und Abteilungen (/Einstellungen/essentielle) - Der Add/Bearbeiten-Dialog erhält einen Abschnitt Erwartungen: eine Beschreibung (4.000 Zeichen, Zähler) und ein Anforderungen Editor Kategorie, Text, Benötigt/Vorzugsweise, neubestellen, entfernen, Enter fügt die nächste hinzu, Das Einfügen einer Liste teilt sie in Zeilen, Beispielchips, 50-reihige Kappe auf. - Tabellen zeigen die erste Zeile der Beschreibung und eine Requirements-Spalte mit einer Schwebliste; beide Seiten live aktualisieren (untergebrochen, während der Dialog geöffnet ist) und die eigenen Worte des Servers auf einem abgelehnten Speicher anzeigen. Geteilte Stücke: app/lib/members/intelligence, app/lib/speech (feature-detected, SSR-sicher), IntelligenceBadge / IntelligenceChoice / PhoneticNameField / SayItButton, app/lib/orgRequirements, AnforderungenEditor, Rollenerwartungen. Spec und Planen unter docs/superpowers. Needs kamo-shared-library + securityservice (gleiches Feature) und die Wörterbuch-Tasten zuerst geschoben.
· SecurityService
Mensch/AI-Mitglieder, phonetische Namen, Rollenanforderungen; Fix-Position spart Abwracksicherheit
Mitglieder - Erstellen, erstellen-Team-Mitglied und Bulk-Cre akzeptieren "intelligenceType", "namePhonetic" (neu Konten nur, wie der Name), und für KI-Konten "aiSupervisorMitgliedId" + "aiModel". Die Supervisor muss ein aktives, menschliches Teammitglied der Org und nie das Konto selbst sein; wann keiner wird der Schöpfer steht in, wenn sie sich qualifizieren (AiSupervisorPolicy). Jede Ablehnung nennt seine Feld, bevor etwas geschrieben ist. - PUT /members/{id': "namePhonetic" ist ein User-Identity-Feld (gleiche Autorität wie der gesetzliche Name). "intelligenceType", "aiSupervisorMemberId", "aiModel" brauchen MANAGE_MEMBERS oder ein offenes Götterfenster, und werden auf Ihre eigene Mitgliedschaft (CANNOT_RELABEL_SELF) abgelehnt, so dass eine AI sich nicht als Mensch neu etikettieren kann. Der Wechsel zu HUMAN kläre Supervisor und Model. - GET /members/{id', /members/{id'/card, der Dienstplan für die Nachverwaltung und die Kontolisten führen "intelligenceType" und "namePhonetic" (das Profil wird auch Supervisor-ID/Name und Modell). - org-config's Jobtitel und Abteilungen tragen Beschreibung + Anforderungen für das Formular erstellen. Berufsbezeichnungen und Abteilungen - POST/PUT/DELETE benötigen jetzt CONFIGURE_SYSTEM (oder ein offenes Gottesfenster) - die Einstellungsseiten schreiben Sie sie bereits; der Server akzeptierte jedes angemeldete Mitglied der Org. Liest unverändert. - Beschreibung und Anforderungen fließen durch die gemeinsamen Dienste (siehe Kamo-Shared-Bibliothek). Fix: PUT /member-security/{id] ersetzt Rollen, direkte Rechte und die Session Timeout, auch wenn die Anfrage nannte sie nicht. Die Positionskarte des Profils sendet nur Abteilung / Berufsbezeichnung / offiziell title / Manager, so dass jede Position Bearbeitung wischte die einzelnen Rollen, direkte Rechte und Timeout des Mitglieds override. Jeder wird jetzt nur noch ersetzt, wenn sein Schlüssel vorhanden ist; der Sicherheitsredakteur sendet alle drei. DDL: ************ (vor diesem Fall von Hand als Besitzer angewendet Push; Zero Schema-Missverhältnis-Fehler in der Sicherheit/E-Mail/Medien in den folgenden 15 Minuten).
· kamo-shared-library
Intelligenztyp, phonetische Namen, KI-Überwachung, Berufsbezeichnung/Abteilungsanforderungen
Mitglieder: "Member.intelligenceType" (HUMAN | ARTIFICIAL, STRING, Standards HUMAN auf jeder Konstruktion Pfad und in der Spalte), "aiSupervisorMemberId" (plain id - Mitglieder ist die heißeste Tabelle und ist hart-deleted) und "aiModel". Benutzer: "namePhonetic", neben dem Namen und nicht innerhalb EmbNameNFull, die auch Leads, Konten, Kreditnehmer und Sitzungen auch einbetten. Berufsbezeichnungen und Abteilungen: eine "Beschreibung" (TEXT, 4.000 Zeichen) und geordnete Anforderungen in zwei Kindertabellen (org_job_title_requirements", "dept_requirements": Kategorie, Required/Prefered, Text - 500, stabile IDs, ON DELETE CASCADE). "Org Anforderungen" ist die eine Regel für beide . Validierung, bevor etwas geschrieben ist, diff-by-id so eine Keeped Anforderung behält seine ID, und eine ID von Ein anderer Besitzer wird als neu behandelt. Updates folgen "Abwesende Mittel unverändert" für beide neuen Felder, so ein Anrufer, der sie nie sendet, kann sie nicht abwischen; "" / [] klar. **************** nehmen Sie jetzt die Anfrage DTO (nur SecurityService ruft sie). DDL wird von Hand aufgetragen ************ angewendet 2026-09-22 4.08.2018Z, vor diesem Schub). Eine echte SessionFactory über die ganze Bibliothek pinnt die neue Tabellen und Spalten zu diesem DDL (RoleRequirementsMappingTest).
· kamo-internal
Die nV-Option, die Einstellungs-Sektion und die Speicherfigur
Ein Mitglieds-eigenen Linux-Computer, geöffnet von der oberen Bar. Die App (ServiceType 37) und ihre drei Rechte landete in der gemeinsamen Bibliothek; das ist die Hälfte, die die Menschen sehen. DER NAV OPTION ERWEIWENDUNG WAS ES SOMETHING BEHIND IT Gated auf der Antwort des Servers auf "welche Computer kann dieses Mitglied öffnen", nicht auf einem Recht und nicht auf Gott. Die dev-machine Option musste dies gelehrt werden: es war einmal gottgegärt, die eine Ikone vor Menschen mit kein Konto auf der Maschine und produzierte Guacamole generischen Fehler, wenn sie es angeklickt. Also ein Manager Holding ACCESS_SUBORDINATE_COMPUTERS und kein eigener Computer bekommt noch das Icon - dahinter ist etwas es - und ein Administrator mit MANAGE und nichts zugewiesen nicht. Die Liste ist die des Servers, in der Reihenfolge des Servers: zuerst besitzen, dann Untergebene, dann die Organisation. Nichts hier filtert oder nachbestellt, aus dem Grund /network's listet Server-deklariert - eine Client-Seite filter ist eine Liste, die bereits gesendet wurde, und die Bestellung trägt Informationen, die der Client nie sieht weil es nicht die Manager-Kette hat. Jede Zeile erweitert sich auf die Größen von DESKTOP_RESOLUTIONS, wiederverwendet, anstatt neu zu bearbeiten, so dass eine Größe dort hinzugefügt landet auf der richtigen Seite der Regel unter "Fit my window", ohne dass jemand eine Grenze bewegt. Jede Reihe trägt seinen Zustand, weil "Einschlafen" ist der normale Ruhezustand eines dieser Computer, anstatt ein Schuld, und ein Streit, der nichts sagte, würde jemanden verlassen, der eine Minute zu denken, es sei gescheitert. openHostedComputer ist mehr als ein Holen und eine Umleitung aus dem gleichen Grund: ein Start hat drei Antworten und Zwei von ihnen sind kein Bindeglied. Einschlafen bedeutet, dass eine Wache begonnen hat und 30-90 Sekunden dauert, während der Gast liest sein Speicher zurück aus einem replizierten Volumen, so dass die Registerkarte SAYS, die ein leerer Tab für eine Minute ist ununterscheidbar von einem gebrochenen, das auch OpenKamoDesktop gelehrt werden musste. Noch keine Anmeldung bedeutet Kamo hat das Passwort nie gespeichert und das Mitglied bestätigt es einmal; das ist das Design, das funktioniert, nicht ein Ausfall, so schließt die Registerkarte und ein Dialog fragt, anstatt eine Seite der Erklärung niemand wollte. DREI SETTINGS TABS. Einer wurde gefragt; die anderen beiden sind der Grund, warum es verwendbar ist Computer ist die eine: zuweisen, verkleinern, Speicher ändern, schlafen, entfernen, leben auf useOrgChanges. Kapazität antwortet "Warum wird das nicht starten?", die sonst keine Antwort irgendwo im Produkt hat - und die Antwort ist kontra-intuitiv, so dass die Bars sagen, REQUESTS anstatt Verwendung, weil eine Maschine kann halb im Leerlauf aussehen und haben keinen Platz. Standardwerte stoppen eine Organisation, die eine Größe und eine Festplatte für jede Person und jedes Feld neu auswählt es kann leer sein, wo Leerzeichen bedeutet "der Plattform folgen" und nicht Null. Der Größendialog warnt und der Speicherdialog sagt, dass es nicht sein wird, was das Paar wert ist: eine Größe Änderung startet den Computer neu, weil ein Schlafbild an die Speichergröße gebunden ist, an der es geschrieben wurde, und Speicherwechsel erweitert das Volumen online und stört nichts. GESCHICHTE ZUR STATS PAGE, AS ITS OWN PANEL HostedComputerUsagePanel sitzt direkt nach der Speicherung auf Einstellungen - Mein Konto - Stats & Kosten. Keine Zeile diese Tabelle: seine Reihen kommen aus dem Billing-Schnappschuss Sweep-Werge-Werbung Speicher RECORDS, und eine Computer-Diskette hat none - was darauf ist, ist nur dem Gast bekannt, der seine eigene Dateisystemfigur meldet. Longhorn-Zahl wäre falsch in einer Weise, die zählt, weil es zählt alles jemals geschrieben und nie fällt, wenn Jemand löscht eine Datei. Die Swap-Datei ist ausgeschlossen: sie ist so groß wie der Speicher des Computers. die Maschine kann schlafen. Zwei Dinge, die meine eigenen Kontrollen gefangen und behoben: das nive gate zurückgegeben "ungefiniert" statt "false" für eine Organisation ohne Flag-Set (undefined && x"), und die Speichersäule übergeben "Nummer | null" in eine Intensivstation Platzhalter - die Decke und "es wächst" sind die gleiche Tatsache, so liest es jetzt die Decke einmal und lässt TypeScript folgen der Verengung. Verifiziert: tsc sauber von allem, aber vier bereits bestehende ReplyQuote Fehler in Chat und Support, vorhanden unter die gleichen Linien auf Ursprung/Haupt. 320 nist und lib Tests bestehen. eslint sauber auf jeder neuen Datei und keine neue Warnung in den bearbeiteten. Alle drei image-build Wachen passieren - check-i18n-Tasten über 4268 Dateien gegen den Wörterbuchkopf, der zuerst geschoben und durch Abstammung verifiziert wurde.
· kamo-internal
Checklisten in der Notes-App - Voraussetzungen, Stickies, Home-Paten und im Kalender
Eine Anmerkung ist Speicher; eine Checkliste ist Arbeit. /notes hat jetzt zwei Hälften - Anmerkungen und Checklisten (?view=Checklisten) und eine Checkliste ist eine eigene Aufzeichnung (/api/checklists, KBService) mit Aufgaben, die auf andere Aufgaben warten können. Checklisten - Eine Karte pro Liste an der eigenen Wand: Fortschrittskante und Ring, Aufgaben ankreuzen die Karte, Zeitplan Chip; Schienenfilter für im Gange / nicht gestartet / getan / geplant / auf zu Hause / Favoriten, Suche, die in jeder Aufgabe reicht. - Der Editor: fügen Sie Aufgaben schnell hinzu (Enter; Shift+Enter fügt ihn als nächsten Schritt hinzu; eine Liste einfügen), klicken Sie auf Bearbeiten, ziehen oder Alt+Pfeile neu zu ordnen, löschen mit Undo, All/Ready/Waiting/Done Filter, "do in order", untick all, clear done, Duplikat als frische Kopie, kopieren Sie als Markdown. - Voraussetzungen: Link-Modus wählt aus, was eine Aufgabe wartet, alles ergrauen das würde Schleife. Eine verschlossene Aufgabe zeigt sein Vorhängeschloss und was es wartet; Drücken erschüttert die Reihe, beleuchtet die Aufgaben im Weg und bietet an Springen Sie zu ihnen. Das Enttstellen von etwas Fertigerarbeit hängt davon ab, oder geben Sie eine beendete Aufgabe eine offene Voraussetzung, fragt zuerst und benennt, was wieder öffnet. Die Abhängigkeit Schiene zieht jedes Glied und beleuchtet die schwebenden Aufgaben. Der Server erzwingt die gleichen Regeln, so dass nichts um sie herumkommt. - Entsperrt, Zecken und das Finish einer Liste werden animiert; das Finish bekommt Konfetti und ein Ton in der Oberfläche, wo der letzte Zecken gemacht wurde. Überall geht eine Notiz - Schwimmen: Checklisten schweben als Stickies in der gleichen Overlay, Stapelreihenfolge, gespeichert Layout und Hex-Kopf-Dock als Notizen (ihre eigene Dock-Gruppe). - Home: eine angeheftete Checkliste ist eine Launchpad-Schreib neben gepinnten Notizen, beickbar. - Ein Live-Laden füttert jede Oberfläche, aufgefrischt durch die "Checklisten" org ändern, so dass eine Zecke überall landet überall. Kalender - Eine Checkliste geht als echtes Ereignis auf den Kalender (sourceType CHECKLIST), durch den kalendereigenen Ereignisdialog von jeder Oberfläche aus oder durch Ziehen Sie es vom neuen Checklisten-Tyl des Kalenders auf einen Tag oder eine Stunde. - Checklisten-Ereignisse zeigen ihre Fortschritte in jeder Ansicht; der Ereignisdialog zeigt die Liste, an Ort und Stelle beickbar; überfällige Arbeit pulsiert rot. - Der Kalender-Proxy veröffentlicht jetzt die Änderung von "calendar" org auf jedem Schreiben: Die eigenen Themen von EmailService sind pro Pod, so dass ein Tab auf der anderen pod nie gehört. Entwurf: ****************
· APIService
Forward /api/Checklisten zu KBService
Checklisten live in der Notes-App und werden von KBService neben den Notizen bedient ohne diese Route antwortet das ganze Feature 404 am Gateway.
· KBService
Die Checkliste API, mit Voraussetzungen, die der Server erzwingt
/api/checklists: Liste, get, erstellen, update, delete, duplizieren, zurücksetzen, clear-done, sequence ("do in order"), klare Links, und pro Task hinzufügen, bearbeiten, Ankreuzen/untick, setzen Sie Voraussetzungen, verschieben und löschen. Jede Mutation beantwortet die ganze Checkliste, so dass jede Oberfläche von einer Antwort nachzeichnet. Die Regeln leben in ChecklistRules, rein und erschöpfend getestet, und halten eine invariant: eine fertige Aufgabe wartet nie auf eine offene. Eine Zecke wird verweigert, während ein Voraussetzung ist offen (409 PREREQUISITES_OPEN, Benennung); ein untick, dass erledigte Aufgaben hängen ab, es sei denn cascade=true; eine Verbindung, die Schleife würde wird abgelehnt (409 CYCLE, mit der Schleife); eine Verbindung, die fertige Arbeit verlassen würde Wartezeiten auf offene Arbeit muss wieder geöffnet=true (409 REOPEN_REQUIRED). Die gleichen Regeln ausführen Sie im Browser für sofortiges Feedback, aber dies ist die eine, die entscheidet, ein klebriger, der Kalender oder ein abgestandener Tab kann es nicht umgehen. Rechte sind die Notizen App: VIEW_NOTES zu lesen, CREATE_NOTES, EDIT_NOTES und DELETE_NOTES zu ändern. Mutationen tragen @RetryOnDbConflict und stoßen die Checkliste-Version, so dass zwei Tabs sofort serialisieren. create_checklists.sql ist die DDL, idempotent, als Eigentümer angewendet.
· kamo-shared-library
Checkliste und ChecklistItem Entitäten, Repository und DTOs
Checklisten sind der zweite Datensatztyp der Notiz-App: Arbeiten, um durchzukommen, deren Aufgaben können auf andere Aufgaben warten. Drei Tabellen - Checklisten, checklist_items und checklist_item_prerequisites - alles von UUID schlüsseliert, also ist keine ID jemals ein int64 a Browser könnte runden. Task-Text ist Chiffretext unter dem Anmerkungsschlüssel des Mitglieds. Die Checkliste-Reihe trägt eine eigene created_at/updated_at (EmbRecordState's DATE_UPDATED ist einfügen/update=false und bewegt sich nie) und eine @Version Service Bumps auf jede Mutation, so gleichzeitige Bearbeitungen zu einer Liste kollidieren statt sich ins Verlegen. DDL wird von Hand **************** aufgetragen, was hier entsteht eine Tabelle.
· SecurityService
Die Browser-Flagfläche, und die zweite Guacamole Gateway
SecurityService ist die Vertrauensgrenze für Hosted Computer. Es hält die Sitzung, die Rechte und die Org chart; ComputeService hält die Kubernetes Anmeldeinformationen und überhaupt keine Sitzung. Nichts Downstream Re-Checks ein Recht und nichts hier berührt ein Cluster. DIE ORG ID IST NIE TAKEN AUS DER REQUEST. Jeder Anruf stempelt die eigene gelöste Organisation des Anrufers. A Hosted Computer ist eine ganze Maschine auf einem Netzwerk, das nur seine eigene Organisation und das Internet sieht, so ein Handler, der eine org-ID von einem Körper akzeptiert würde nicht eine undichte Liste sein, es wäre eine Tür in jemanden sonst Desktop. Der Weg weist die E-Mail des Zielmitglieds zusätzlich durch die eigene des Anrufers auf. Organisation, die als Mitgliedscheck dient: ohne sie könnte ein Administrator einen Computer zuweisen eine Mitglieds-ID, die zu einem anderen Mieter gehört und die Maschine in diesem org-Namensraum eingebaut hat, unter dem Name der Person. DREI DIFFERENT GATES, BECAUSE THERE SIND THREE DIFFERENT QUESTIONS. Bedarf regeln MANAGE_HOSTED_COMPUTERS. Die Eröffnung eines braucht den Computer, um Ihnen zu gehören, oder eines der beiden ACCESS-Rechte an erweitern - und ob der Anrufer DAS Öffnen des Computers beantwortet wird, indem er die gleiche Sichtbarkeit erneut anruft Frage, das noviesische Menü wurde von gebaut, anstatt durch eine zweite Regel, die nicht widersprechen könnte. Ein Mitglied, das nie gezeigt, ein Computer kann es nicht erreichen, indem Sie eine ID erraten. Die Bestätigung eines Passworts muss überhaupt nicht in Ordnung sein: es ist, wie der eigene Computer eines Mitglieds ein Login erhält. THE ORG CHART IST NUR WAS EIN RECHTS NEEDS IT, und in einer Abfrage. ACCESS_SUBORDINATE_COMPUTERS erreicht der ganze Teilbaum unter einem Mitglied, so dass die Kanten als Paare zurückkommen und die Traversal stromabwärts geht sie über ein besuchtes Set - managerId ist ein Free-Form-Profilfeld, kein validierter Baum, also ist ein Zyklus ein Reorganisation weg. Ein Mitglied ohne Rechte zahlt einen Anruf, der zählt, weil das novies dies anfordert jede Seite laden. THE TOKEN FORMAT IS NOW SHARED, NOT COPIED. GuacamoleTokenCodec wird von GuacamoleJsonAuth extrahiert, weil gibt es zwei Gateways: Desktop.<domain? für Plattform-Administratoren und Computer.<domain> für Mieter, mit verschiedene Signierschlüssel und verschiedene Verbindungsmodelle. Zwei Kopien dieses Formats wären eine Implementierung und eine Haftung, und der Fehler, den die Kopie schließlich machen würde, ist die "expires" Fehler. es liest sich wie ein Link TTL und ist eigentlich das wiedervernetzte Fenster der Sitzung, und es falsch zu bekommen leert ein Die Verbindungsliste des Live-Benutzers ist lautlos. Der Boden wird von beiden Anrufern erzwungen. HostedComputerSso ist eher ein Geschwister- als eine Zweigstelle. Das Gateway bietet drei feste Ziele und stellt alle sie in jedem Token; dieses hat eine Verbindung pro Computer, benannt nach dem Computer, mit einem einmaligen Anmeldeinformationen pro Start - so dass das eigene Kamo-Passwort des Mitglieds nie in einem Token reist. Die Plattform Desktop muss eine entschlüsselbare Kopie eines Kontopasswortes genau zu halten, damit Guacamole Auto-Login kann; dies tut es nicht, und das ist die Verbesserung. PasswordChangeController schiebt nun das neue Passwort auf die Computer des Mitglieds. Dies ist der EINZIGE Moment der plaintext existiert - Kamo speichert einen hash und hält keine reversible Kopie überall - und der Push ist am besten von Bau: Ein Ausfall darf niemals das von dem Mitglied geforderte Änderung versagen und ein schlafender Computer ist markiert abgestanden, so dass der nächste Start um eine Bestätigung bittet. Nichts steht in der Warteschlange, weil ein in der Warteschlange gespeichertes Passwort ist Passwort mit Verzögerung. Suite: 2755 Tests, 5 Ausfälle, und alle fünf sind die gleichen unberührten Ursprung / Haupt produziert. UnauthenticatedEndpointRatchet auf PromotionCodeInternalController (zusgliedern von 9578ca0 und nie hinzugefügt Basislinie) und vier ************ NPEs auf angewandtemJobStamp. Verifiziert durch den Betrieb in eine saubere Arbeitsanlage am Ursprung/Hauptmain. Mein eigener Controller besteht die Ratsche: Jeder Handler löst eine Sitzung und antwortet 401 ohne. Braucht das Hc-guac-sso-Geheimnis, um Verbindungen zu prägen; bis es existiert, sagt der Startpfad so klar und nicht Übergabe eines Links, der auf Guacamoles generischem Fehlerbildschirm landet.
· EmailService
Ein Mitglied kann eine Checkliste in seinen Kalender setzen, einmal
Checklisten live in KBService und der Kalender besitzt nur WHEN, also geplante Checkliste ist eine gewöhnliche Mitgliedsveranstaltung mit sourceType CHECKLIST, die Checkliste UUID und ein Deep Link in /notes. Die Verbindung ist abgeleitete Server-Seite, nie aus dem Körper zu lesen, und das Ereignis geht durch das normale Mitglied erstellen Pfad, so dass die Kalenderänderung veröffentlicht noch Brände. Ein zweiter aktiver Zeitplan der gleichen Checkliste ist eine 409, die den ersten Namen trägt. GET ************ listet sie für die Chips auf /notes auf. Ein Schnitt kann immer noch nicht ändern, worum es bei einem Ereignis geht. Checklisten-Erinnerungen behalten Sie die Art des Kalenders und erhalten Sie ein Checklisten-Symbol.
· APIService
Forward der Hosted Computer Agent Pfad, und nur dieser Pfad
/api/hosted-computers/agent/** -- ComputeService. Die Netzwerkrichtlinie eines Hosted Computers vernebt den Cluster vollständig - keine Datenbank, kein Service, nicht einmal Cluster DNS - so dass die einzige Möglichkeit für die virtuelle Maschine eines Mieters, Kamo etwas zu sagen, ist im Internet und zurück durch api.<domain? wie jeder andere Kunde. Alles andere über einen Computer wird in sie geschoben; Dies ist der einzige eingebundene Weg. DIE NARROWNESS IST DER POINT. Seine Geschwister unter /api/hosted-computer/ sind die interne Management-API: Einen Computer zuweisen, einen zu verkleinern, einen zu löschen, die Kapazität eines anderen Mieters zu lesen. Dieses Tor ist SecurityConfig ist vollständig kommentiert, so dass ein weitergeleiteter Weg ist öffentlich und die upstream-Service besitzt die auth - eine Wildcard hier würde eine VM-Creation API im Internet veröffentlichen. Das ist der gleiche Fehler /api/bulktext/inbound/** existiert zu vermeiden, und der Grund, warum die Agentenoberfläche zu einem Kind von /agent gemacht wurde anstatt ein Geschwister der Management-Routen. Forward anstatt forwardWebhook: Im Gegensatz zu einem Träger Webhook gibt es keine Signatur von Drittanbietern über die rohe Bytes, und der Anmeldeschein ist eine gewöhnliche Autorisierung: Bearer Header - ein pro Computer Geheimnis gedreht bei jeder Weckrufin, die ComputeService gegen diesen einen Computer prüft. Der Endpunkt ist nur Schreib-Telemetrie deren Antwort trägt nichts über die Organisation, so ein Beglaubigungsschreiben von einem Mieter eigenen Desktop angehoben kauft die Möglichkeit, die Speicherfigur dieses Desktops zu posten und nichts anderes.
· kamo-shared-library
Eine Abfrage für die gesamte Berichtsgrafik einer Organisation
findMemberAndManagerIds gibt jeden (memberId, managerId) Kante in einer Organisation zurück, für Hosted Computers' ACCESS_SUBORDINATE_COMPUTERS rechts, das eher den ganzen Unterbaum unterhalb eines Mitglieds erreicht als nur ihre direkten Berichte. Die Alternative ist findDirectReportMemberIds ging Ebene für Level, das ist eine Abfrage pro Ebene auf einem Pfad das niv-Menü trifft auf jeder Seite laden, und die Tiefe ist eine Eigenschaft des Kunden Org Diagramm statt alles, was dieser Code kontrolliert. Gibt den EDGES anstelle eines aufgelösten Unterbaums zurück, denn die Traversal muss sich vor einem Zyklus hüten: managerId ist eine Freiform-Referenz auf dem eigenen Profil eines Mitglieds, kein validierter Baum, also eine Berichterstattung an B während B-Berichte zu A ist ein Fehlklick oder eine Reorganisation entfernt und eine rekursive Abfrage würde nicht zurückkehren. Der Anrufer geht diese Breite-zuerst über ein besuchtes Set. Filter spiegeln findDirectReportMitglieder genau, einschließlich der expliziten LINKS JOIN auf tm.user implizite Pfad-Beitritte ist ein INNER-Beitritt in JPQL und würde stillschweigend jeden Bericht fallen lassen, dessen Benutzerreihe ist fehlt, welche die eigene Art der eigenen Kommentar aufzeichnet. Validiert von LibraryQueryParseTest, das jeden @Query in der Bibliothek gegen die reale Entität übersetzt Mapping. Das ist hier wichtig: Spring Data bestätigt eine kommentierte Abfrage, wenn sie die Repositorybohne baut, so ein schlechter Pfad kompiliert, passiert CI, Schiffe, und dann stoppt den verbrauchenden Dienst von Starten überhaupt.
· kamo-internal
Ein soziales Posteingangszitat einer älteren Nachricht benennt seinen Autor mit seiner Karte
Das Zitat nimmt nun seinen Autor vom Server (@kamo/chat-core's quote.senderMemberId), die verhält die I-ID eines sozialen Kontakts, da mediaservice ceee73e die Worte eines Kontakts gespeichert sind Anschluss-Besitzer, und das Angebot verwendet, um den Besitzer zu nennen. Also der Name eines Reps in einem Zitat einer Nachricht älter als die geladene Seite öffnet ihre Karte, wie es eine geladene bereits getan hat. Eine geladene Kontaktmeldung wird auch hier abgelehnt, was auch immer ein älterer Server sagt.
· kamo-internal
Die Karte zeigt die Mitglieder-ID für diejenigen, die Mitglieder verwalten
HR und Support lesen die ID eines Mitglieds aus einem Tooltip auf den HR-Rostern, die die Mitgliedskarte ersetzt (der Tooltip saß dort, wo sich die Karte öffnet). Die Daten der Karte tragen nun eine Mitglieder-ID-Reihe, mit der gleichen Kopieren-Button als Kontaktwerte, für die Betrachter, die das Profil dieses Mitglieds öffnen können - die Rechte die Mitglieder, Gott und das Mitglied selbst verwalten. Alle anderen sehen keine ID.
· kamo-shared-library
Die App, drei Rechte, Tier/Staats-Öp enums und die Einrichtungen
ServiceType.HOSTED_COMPUTERS unter id 37, TESTING statt COMPLETED. Die Bühne trägt Gewicht hier, anstatt den Fortschritt zu beschreiben: AppCatalogService löst "verfügbar" als "Stufe == COMPLETED", und eine nicht verfügbare App wird von FeatureControllers Auto-Provision-Schleife übersprungen. Jeder andere GLEIS App kommt eingeschaltet für alle 25 Organisationen am Tag, an dem es versendet; diese gibt virtuelle Maschinen mit realem RAM auf einem Zwei-Kennzeichen-Cluster, so muss es pro Organisation von einem Betreiber gewährt werden, der hat sich die Kapazitäten angeschaut. Nichts ist verloren - die Plattform Apps & Features Bildschirm existiert genau zu veröffentlichen eine App unabhängig von ihrer Bühne, so dass die Zeile dort unter "Nicht verfügbar" wartet. Drei Rechte bei 326-328, nicht 320-322: die lokale Kasse war 30 verpflichtet hinter und 320 ist MANAGE_EMAIL_OPT_OUTS. Lesen Sie die IDS in dieser Datei, nie die Linie bestellen 318-325 sitzen Hunderte von Zeilen über der Konstante, die zuletzt aussieht. Alle drei sind Wurzeln und keiner ist ein Kind von einem anderen, das ist die Entscheidung wert, anstatt die Zählung. MANAGE_HOSTED_COMPUTERS Gates der Einstellungen Abschnitt; die beiden ACCESS Rechte Gate WHOSE Computer erscheint im neigenen Menü eines Mitglieds. Elternschaft entweder unter MANAGE wäre falsch in der teuren Richtung - ein IT-Leiste, der jede Maschine öffnen muss, würde mit dem Bereitstellungsbildschirm ankommen, und ein Manager gewährt eine Ansicht der Computer ihres Teams wäre in der Lage, sie zu verkleinern. Keine der beiden Tore ein OWN-Computer des Mitglieds: Das ist überhaupt kein Recht, denn es zu machen, erlaubt eine Computer-Seignierung für jemanden, der es nicht erreichen kann. HostedComputerTier und HostedComputerState persist von NAME. Diese Tabellen sind neu, also gibt es nichts zu schützen und keinen Grund, um die erneute Gefahr zu erben AssocType und ServiceType haben zu leben. Zwei Ableitungen in der Ebene sind Tragfähigkeit und beide scheitern QUIETLY ohne sie: - minimumDiskGb() ist Gastspeicher + 25. Ein Computer schläft, indem er seinen RAM in seine eigene Swap-Datei schreibt, so eine Festplatte ohne Platz für das Bild produziert einen Computer, der nie schläft - oder schreibt eine Teil Bild und Stiefel sauber mit der Mitglieder-Sitzung gegangen. Keiner berichtet etwas, so ist der Boden Erzwingt statt vorgeschlagen. - angefordertMib() fügt KubeVirt Launcher Overhead, gemessen bei -324 MiB auf Desktop-1 und abgerundet 400. Kapazität muss mit dem vergleichen, was die POD-Anfragen: eine Überprüfung, die es auslässt sagt, ein Computer passt und verlässt dann seine Hülse auf unbestimmte Zeit, die ununterscheidbar von einem Computer, der nie erschien und protokolliert nichts, was ein Mitglied sehen kann. ************ ist das, was Kapazitätsplanung subtrahiert, und ASLEEP ist bewusst nicht in ihm - das ist das ganze Feature. KubeVirt eigene Pause "friert den Prozess ein, ohne CPU freizugeben Ressourcen, aber Speicher bleibt zugeordnet", so schlafen bedeutet hier suspendiert-zu-Disk: der VMI und seine Launcher pod sind weg und die Speicheranfrage ist zurück mit dem Planer. Die Lagerung ist ein nichtigbares Paar mit einer dritten Bedeutung und ohne Boolan. Eine Decke über der aktuellen Scheibe ist "unbegrenzt", wie es ein Mitglied erlebt; eine abwesende Decke bedeutet, dass die Scheibe nicht wächst. Es gibt keine "Unbegrenzte" Flagge, weil eine Flagge ohne Decke ist die Konfiguration, die leise frisst ein Cluster . die Regel, die StorageAutoExpandSweep bereits für Dateien durchsetzt, aus dem Grund, den es aufzeichnet. PhiModule.HOSTED_COMPUTERS ist BLOCKED_NO_BAA, und der Grund ist eine Eigenschaft der Sache und nicht ein Lücke in der Formalität. Jedes andere Modul ist eine bekannte Oberfläche mit bekannten Datenflüssen; dies ist ein Desktop Jemand kann alles installieren und alles einfügen, und Kamo kann es nicht inventarisieren, ohne Beobachtet des Bildschirms. Die Isolation ist wirklich stark, und das ist nicht das, was ein BAA verlangt. Auch kartiert KAMO_UNIVERSE, CHESS und HOLDEM, die ohne PhiModul ausgeliefert und links PhiServiceTypeMappingTest rot. Nicht von mir, aber der Test scheitert an der ersten Lücke, die er findet, so dass ohne sie Es kann auch nicht beweisen, dass HOSTED_COMPUTERS abgebildet ist. Sie nehmen GAMES, die ihre eigenen Eltern nehmen. Suite: 3026 Tests, und die 4 verbleibenden Ausfälle sind die gleichen unberührten Ursprung / Hauptsache produziert . ReportVisibilityTest (PlatformRightType ordinal, unberührt hier), die beiden GROWTH_REQUEST_IMAGE Speicher Domain-Tests und SystemBugCountContractTest's NoSuchMethod. Verifiziert, indem Sie sie in einem sauberen worktree am Ursprung/Hauptstamm, bevor Sie etwas ändern. Die Tabellen sind in **************** und wurden in die Live-Datenbank aufgenommen.
· kamo-internal
Eine Antwort auf eine ältere Nachricht nennt auch ihren Autor mit der Karte
Versetzt @kamo/chat-core auf 0.1.19, dessen Antwort-Anruf senderMemberId trägt: parentSenderMemberId, wenn es eine gesendet (Null für einen Web-Chat-Besucher, dessen Worte unter der gespeichert sind Systemmitglied), sonst das geladene Elternteil. Vorher konnte die Konsole den Autor nur auslesen ein geladenes Elternteil, so dass eine Antwort auf eine Nachricht älter als die geladene Seite einen einfachen Namen zitiert. - Kollegen Chats (MessageList) nehmen den Autor des Zitats, wie es ist. - Tickets gelten die Regel eine Blase Gesicht folgt ihm - die eigene Seite des Betrachters nur, sobald die Seiten sind bekannt (isOwnSide) - das jetzt auch für entladene Eltern gilt. - Soziale Postfächer behalten ihre eigene Regel (ein geladener Elternteil von einem der Vertreter der Organisation): Server hält die ID eines sozialen Kontakts nicht zurück, da Kontakte unter dem Systemmitglied gespeichert werden. package-lock.json: die Version des Chat-Core-Eintrags, aufgelöst und in der Integrität (geprüft gegen die heruntergeladen tarball); seine Pinnedcies (@kamo/net 0.1.2, @kamo/realtime 0.1.1) sind unverändert.
· KlusterServices
Per-org VM-Inseln, Suspende-to-Disk, und ein weiß-beschriftete goldenes Bild
Ein Mitgliedseigenen Linux-Computer, der als KubeVirt VM im Namensraum seiner Organisation läuft und vom Browser geöffnet. Separate vom Desktop/in jeder Art, die zählt: das ist eine gemeinsame Maschine für Plattform-Administratoren, absichtlich auf dem Pod-Netzwerk, so dass es die Datenbank erreichen kann, NATS und MinIO. Das sind Mietermaschinen, deren bestimmende Eigenschaft das Gegenteil ist. Drei Fakten prägen dies, und jede widerspricht der offensichtlichen Lektüre: - Das Verweilen einer VM befreit nichts. KubeVirt's docs: Pause "friert den Prozess ein, ohne CPU loszulassen Ressourcen, aber Speicher bleibt zugeordnet". So schlafen ist suspendiert-zu-DISK - der Gast schreibt seine Speicher in seine eigene Swap und Kräfte aus, die Trägerkapsel beendet, und die Speicheranfrage geht zurück zum Displaner. Das braucht runStrategy RerunOnFailure, dokumentiert, um einen Gast schließen zu lassen sich runter, ohne neu gestartet zu werden; unter Immer würde der Schlaf in Sekunden rückgängig gemacht werden. - Headroom wird durch Planer REQUESTS begrenzt, nicht physikalische RAM. Eine Trägerkapsel, die nicht passt sitzt für immer, das sieht genau wie ein Computer, der nie erscheint und protokolliert nichts. So wird eine Weckweigung abgelehnt, bevor sie versucht wird, und die Absage nennt die Nummer. - Cilium reservierte Identitäten können nicht mit einer CIDR-Regel übereinstimmen. ******************** Aufzeichnungen, dass von einem Ausfall, wo zuEntities [Host, Remote-node] musste hinzugefügt werden, um ALLOW die node. Hier ist die gleiche Tatsache ist die Verteidigung invertiert: keine Regel benennt sie, und default-deny.yaml egressDenies sie so keine spätere Bearbeitung kann sie öffnen. ein Cilium leugnet schlägt jeden erlaubten, aus jeder Datei. Isolation wird behauptet, anstatt überprüft. canary/verify-isolation.sh läuft eine Hülse mit dem gleichen kamo.io/hc-org Etikett eine Trägerrakete pod trägt, so bekommt es die gleiche Identität und die gleiche Politik, und Sonden in beide Richtungen: die Knoten, kube-apiserver, YugabyteDB, NATS, MinIO, kube-dns, die Metadaten Adresse und die Computer einer anderen org müssen alle unerreichbar sein; das Internet und die Computer mit gleicherorg muss funktionieren. Es berichtet auch, ohne zu behaupten, ob die vorgelagerten Router Haarnadeln . api.kamocrm.com löst auf 47.181.8.84, während Traefiks LoadBalancer IP k1m1s eigene 192.168.4.22 ist, also die des Agenten Herzschlag ist beste Arbeit durch Konstruktion und nichts hängt davon ab. White-Latiking erfordert keine Distro-Rekonstruktion, die Oberfläche zuerst überprüft wurde. Jeder sichtbar Xubuntu Identität ist Konfiguration oder ein Wechselpaket. strip-distro-identity.sh entfernt sie und Pins sie so apt kann sie nicht wiederherstellen - eine schattierte Datei kommt wieder auf das nächste Upgrade und der Ausfall ist ein Mieter, der Wochen später das Logo eines anderen sieht. Das goldene Bild Schiffe ohne Logo und ohne Farben überhaupt; der Agent malt sie per Org von Behavior & Labeling, die Einhaltung der Regel, dass ein Mieter sieht nie KamoCRMs Bilder. Der Agent ist stdlib-only und kann nicht rufen, weil die Netzpolitik bedeutet, es gibt niemanden zu rufen. Config wird eingedrängt, die Schlafentscheidung ist lokal, so dass es einen Kamo-Ausfall überlebt, und Winterschlaf Bereitschaft wird geprüft (Wap-Größe, Lebenslauf= UND Lebenslauf_Offset=, Diskette in /sys/power/state) vor der Leerlauf Zeiter ist bewaffnet - eine falsch konfigurierte Winterschlaf nicht zu erhöhen, es Stiefel sauber und verliert die Sitzung. 26 Tests decken diese Arithmetik und die Branding-Input-Validierung ab. ************ wird von Hand aufgetragen (ddl-auto ist keine und InitializerService nicht eingesetzt) und wurde, gegen die Live-Datenbank als Eigentümer. Es brauchte einen Zuschuss das bestehende Rezept erwähnt nicht: ein NEUES Schema hat keine ACL, also die globalen Standard-Privilegien, die Tabellen abdecken kamo_app mit "Überlassung für Schemahosted_Computer verweigert" auf dem ersten Einlog. Nachgeprüft. Jedes Manifest validiert mit kubectl apply --dry-run=server.
· kamo-shared-library
Lassen Sie einen Anrufer eine MediaObjImg durch die Img-ID auflösen
DocsService's Imaging Endpoints (download/stream/list/löschen) kennen die id einer Img aber haben keinen Grund, die MediaObj zu halten war es angehängt, bis sie brauchen zu ehren die Chat-Antwort widerrufen Flagge auf sie (MediaObjImg.isAccessRevoked) ohne eigenes Chat/Medienschema selbst zu besitzen. MediaObjImgRepository nur unterstützt die andere Richtung (von obj id, bestellt, für die Darstellung einer Nachricht fügt ansssig. findByImg_Id schließt die Lücke; Plural, weil das Unikat Einschränkung ist eingeschaltet (OBJ_ID, IMG_ID), nicht nur auf IMG_ID. Neuer Test: MediaObjImgRepositoryQueryTest, Pinning der abgeleiteten Abfrage Signatur, wie ************ bereits für seine Geschwister-Repository (diese Bibliothek hat kein lauffähiges @DataJpaTest/H2 Geschirr, also eine abgeleitete no-@Query-Methode wird durch Reflexion und nicht ausgeübt behauptet). Komplette Suite: 3013 Tests, 4 Vorausfälle + 1 Vorabfehler, alle bestätigte Gegenwart auf einer sauberen Herkunft/Hauptabsicht vor dieser Änderung und unzusammenhängend (PhiServiceTypeMappingTest: ServiceType.KAMO_UNIVERSE hat keine PhiModul; **************** ************ nicht von einer StorageDomain beansprucht; ReportVisibilityTest: eine Off-by-one-Berichtszahl; SystemBugCountContractTest: SystemBugRepository.findVisible Signatur Drift).
· DaemonService
Falten Sie die Lead-edededs alle 30 s und erzählen sie nachts; der Job-Trigger braucht das Cluster-Geheime
Die Lead-Leadder (Securedservice create_lead_ledgers.sql, angewendet 2026-09-22) ersetzen COUNT(*) über einen 796k-Lead Pool und über lead_credits mit gewarteten Summen plus ein Onend-only-Journal, dass Zeile Trigger schreiben. Dieser Service hält sie gefaltet und ehrlich: - LeadLedgerFoldJob (alle 30 s): eine Anweisung pro Stapel löscht Journalzeilen und fügt sie hinzu summa., so dass ein Leser die Zahl vor oder nachher sieht, nie zur Hälfte. Leser fügen die Zeitschrift bereits hinzu die Summe, so dass ein verpasstes Häkchen Zeit lesen, nie Korrektheit. Auf höchstens 40 Chargen von 5.000 pro Tick. - LeadLedgerReconcileJob (03:40 Nacht): erzählt jeden org Pool und die verfügbaren Kredite jedes Mitglieds aus den Zeilen und vergleicht sie mit total + journal in ONE Statement (ein Schnappschuss). Unterschiede sind APPENDED als 'RECONCILE' Deltas, nie über eine Gesamt geschrieben, so dass die Neuauszählung kann nicht Rennen die Auslöser oder eine Falte. Es benennt auch jeden Journal-Trigger, der fehlt oder deaktiviert ist. In einem gesunden System findet es nichts, so dass jede Korrektur bei WARN protokolliert wird. Beide sind @DisallowConcurrentExecution und versuchen Sie eine Aussage YugabyteDB abgebrochen mit 40001 (jeder ist atomar, so ein erneuter Versuch kann nicht doppelt zählen). Das SQL wurde vor dieser ausgelieferten Version gegen YugabyteDB wiedergegeben (tempel -Tabellen, liest, faltet und neu auszählt, 60 Schecks). JobTriggerController: POST /api/daemon/trigger/{job" und GET /status haben alle beantwortet. SecurityConfig Erlaubt alles, und die Daemon-Route IngressRoute setzt diesen Service auf dem öffentlichen Websecure Entrypoint (Host daemon.internal.kamocrm.com; untersucht 200 anonym), so dass jeder Job - jetzt einschließlich der Neuauszählung . könnte aus dem Internet gestartet werden, so viele überlappende Kopien wie der Quarz-Pool hält. Beide jetzt X-Internal-Auth = mlos.internal-auth-secret (konstante-Zeit) und verweigern alle, wenn dieses Geheimnis ist unset. Nichts in der Plattform ruft diesen Endpunkt an; ein Operator kann es immer noch, aus dem Inneren des Clusters heraus. Tests: LeadLedgerMaintenanceTest (Falling-Schleife und Kappe, Recount-Recounting, fehlende Trigger, der Retry die SQL-Formen, die es sicher neben dem Live-Verkehr machen), JobTriggerControllerAuthTest.

Euer Universum wartet.
Fügen Sie Produkte hinzu, wann immer Sie möchten – keine Migration, keine neuen Anmeldungen.
Für immer kostenlos – keine Kreditkarte erforderlich