Changelog
Ce qui est nouveau.
Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.
· KlusterServices
Exiger la clé API et n'admettez que RAGService
· EmailService
L'envoi de courrier a besoin d'un siège, pour les personnes et les membres de l'IA
Un membre sans siège titulaire d'une licence est refusé avec l'organisme commun 403 ESSAI avant que tout autre chose ne soit envoyé: POST /api/email/send, l'envoi de la boîte aux lettres partagée, et les quatre routes de réunion- invitation (envoi, mise à jour, annulation, réponse). Un événement de calendrier après avoir demandé le ne siège que lorsqu'il invite ses invités par courrier électronique (sendInvites true, notEmail not false): le dialogue de calendrier et KamoMobile envoyer not notificationByEmail true sur chaque sauvegarde, donc un L'entrée du calendrier est ouverte à tous. Les voies internes ne demandent jamais. Le déploiement prend également en charge la connexion NATS du service (nats-utilisateur-email), le Redis ACL login (redis-auth) et secret interne de KamoAI.
· MediaService
Les réunions, les discussions de groupe, les pièces jointes et les appels ont besoin du siège qui les inclut
· kamo-internal
Le sélecteur de chat ne répertorie que les modèles que le membre peut choisir
Le sélecteur a lu la liste des modèles de l'administrateur (403 sans MANAGE-AI-MODELS) et a proposé des fournisseurs, qui n'ont jamais sélectionné de modèle. Il lit maintenant GET /api/ai/modèles/sélectrable via une nouvelle route BFF, abandonne les options du fournisseur, renvoie une conversation à l'aide d'un fournisseur, et maintient la Le fournisseur commande AIService envoie (la priorité de l'organisation) au lieu de le re-remplacer par nom.
· InitializerService
Migration pour org alias domaines, ensemencement des deux org de la plate-forme
Crée **************** et graines la plateforme org (is top level) avec kamouniverse.com (par défaut, reportant l'ancien plate-forme hardcoded.mail.domain) et kontak.kamocrm.com (en supplément, pas par défaut). Appliquée directement à la production avant cet engagement — ce service est exécuté manuellement contre le DB, non déployé — donc la table existe déjà; c'est la source d'enregistrement pour le prochain environnement frais ou de ré-exécution. bibliothèque kamo-partagée a cogné à 1.6.2 pour ****************
· EmailService
Lire la valeur par défaut du domaine d'alias du compositeur à partir des domaines d'org-alias
Utilisé un domaine encodé en dur (platform.mail.domain, kamouniverse.com) en tant qu'envoi synthétique par défaut, et uniquement pour la plate-forme OrgAliasDomainRepository à la place: n'importe quel org peut enregistrer n'importe quel nombre d'alias domaines maintenant, chacun offert en tant qu'identique d'envoi en tant qu'identique sur le principal membre boîte aux lettres, avec la ligne battant pavillon par défaut de l'orge, toujours prédépensée comme la par défaut du compositeur exactement comme kamouniverse.com. kamo-shared-library bumped jusqu'à 1.6.2 pour
· kamo-shared-library
Ajouter org-alias-domains, la forme par or enorg du domaine de courrier de la plate-forme
Généralise la plate-forme unique encodé en carton papier.mail.domain (kamouniverse.com, et uniquement pour la plate-forme org) dans un tableau n'importe quelle oug peut contenir n'importe quel nombre de lignes in. SendableMailboxService d'EmailService le lit pour offrir à chaque domaine en tant que d'émission en tant qu'identité sur la boîte aux lettres primaire de chaque membre, même mécanisme qu'auparavant.
· SecurityService
L'interrupteur de l'AI peut être lu par celui qui détient son droit
· kamo-internal
AI Platform Services et AI Kill Switch droits de la plateforme
· kamo-internal
L'application AI Workforce et ses quatre droits; le garde-appli-miroir lit à nouveau Java
· AIService
Une table d'itinéraires décide qui peut appeler toutes les voies AIService
· kamo-shared-library
Un préfixe de boîte de réception privée pour de nouveaux services, et le travailleur de l'ébranlis Web de LOS opt-in
· kamo-shared-library
Les services se connectent à Redis avec un nom d'utilisateur et un mot de passe lorsqu'on lui en donne un
· kamo-shared-library
Une règle de siège pour la console et chaque service qui l'applique
Le résolveur lit le membre avec son organisation récupéré et ouvre non transaction de sa propre, donc un siège est décidé correctement sur un fil sans contexte de persistance (le WebSocket AI) et une lecture ratée échoue vraiment ouvert au lieu de lancer InattenduRollbackException passé la prise.
· KlusterServices
Connectez-vous à Redis en tant que mail-rspamd
rspamd lit son mot de passe de Secret mail/rspamd-redis-auth, inclus dans local.d/redis.conf. La nacelle gagne fsGroup 11333: l'image passe sous 11333:11333 et un fichier root:root 0440 Secret est une autorisation fatale refusée à la charge de la config.
· kamo-shared-library
Services de la plate-forme d'IA et de droits de commutation, et la colonne du commutateur
· KlusterServices
Utilisateurs de la LCA pour la plate-forme, les spams et les opérateurs (défaut encore ouvert)
· kamo-shared-library
Visualisez, supervisez, approuve et gère la main-d'œuvre d'IA (329-332)
· KlusterServices
Une connexion par charge de travail sur le compte KAMO, à côté de kamosvc
· kamo-shared-library
AI Workforce app, en dehors de la limite PHI et jamais automatique
· kamo-internal
Choisissez comment une demande publiée pose ses questions
"Publier cette application" (Paramètres → Caractéristiques → CRM → Fournisseurs et Produits) maintenant porte trois choix à côté du chat, chacun une paire de cartes qui disent ce qu'ils Moyenne: - Type: Normal (quelques questions par étape) ou Squeeze (une question par étape) écran, chacun expliqué en mots simples). - Contact: Début (nom, email et téléphone d'abord, sauvegardé dès qu'ils sont est entré, donc une demande abandonnée est toujours une avance) ou Last (le prêt d'abord, les coordonnées juste avant l'envoi; rien n'a été enregistré jusqu'alors). - Champs: Complet ou de base (seulement ce dont un premier appel a besoin). Un aperçu en direct à côté d'eux redessine le premier écran, l'ordre de section (contact Si l'on se rend compte qu'il s'agit là d'un problème important, on peut se demander combien de questions l'emprunteur devra répondre. et quand la tête est sauvée. La boîte de dialogue est `md` donc les deux s'adaptent côte à côte. Les choix voyagent sur le PUT .../application existante (service de sécurité d345869), aller-retour dans la liste des fournisseurs, et préremplir lorsque la boîte de dialogue est rouverte. Réouverture d'une page en direct dit maintenant "Enregistrer les modifications" / "Paramètres d'application sauvegardés." plutôt que de le publier à nouveau, et son icône de ligne est un curseur de paramètres plutôt qu'une bulle de chat, puisqu'elle ouvre plus que le chat.
· kamo-apps
Choix de disposition du prêteur - compression, contacter d'abord ou dernier, basique
La demande d'hypothèque se présente désormais comme le produit a été publié. (Réglages et caractéristiques - CRM - Publier cette application): - Type. NORMAL est les cinq étapes groupées comme avant. Squezeze pose une question par écran: un sourcil disant où vous êtes, la question dans l'affichage face, une ligne en langage clair sur ce que cela signifie et pourquoi il est demandé, puis un réponse. Les champs ne partagent un écran que lorsqu'ils font partie d'une seule réponse (un nom, une adresse, un agent et leur entreprise). Exploiter un choix se déplace après un le clavier sélectionne avec les flèches et se déplace avec Entrée. Le rail se remplit question par question. - Contact info. START demande qui est l'emprunteur en premier, et fait l'avance Il y a un nom et un email - derrière une preuve de travail invisible, le Il est le même que les besoins du bouton d'envoi - puis ajoute chaque réponse ultérieure à cette réponse à travers un jeton, et l'envoi final le termine plutôt que de déposer une seconde. La page le dit à côté des questions de contact. DERNIER Contact se déplace vers juste avant consentement, et rien n'est sauvé jusqu'à ce que le formulaire soit envoyé. - Les champs. BASIC conserve le nom, le courrier électronique, le téléphone, l'objectif, la façon dont la maison sera utilisée, l'État et la période d'entrée, le prix ou la valeur, l'acompte ou le solde, et le crédit. Le texte d'aide suppose que le lecteur ne sait rien: acompte, cote de crédit, HOA, les impôts, les assurances, les programmes de prêts et les types de biens sont expliqués chacun où on leur demande. Les questions sans réponse oui/non restent nulles (skippés ou pas encore) atteint) au lieu d'arriver comme "non". Également fixé, les deux vivent aujourd'hui: le paragraphe du consentement n'a jamais nommé le prêteur ("vous donner votre consentement écrit exprès pour vous contacter" - une fonction passée en tant que L'argument de l'UTI n'a rien rendu), et le récépissé est sur le chemin de . a laissé tomber l'adresse de la même façon. Le consentement principal ne commence plus par un « quelqu'un en bas de la liste ». Proxies: (POST) et/ou progrès/jeton (PUT), le partage de la demande de traitement X-Forwarded-Fored-s. Besoin de service de sécurité d345869 pour la mise en page et les critères de progression; un back-end plus ancien est le formulaire groupé, complet, le premier contact et le premier Sauvez rapidement 404 une fois et s'arrête.
· kamo-internal
L'onglet de session s'arrête en portant l'icône du Guacamole
Un onglet de session est le document de Guacamole, donc son propre lien rel'icon' href' "images/logo-64.png" possède l'onglet, et un membre qui ouvre l'ordinateur de son entreprise regarde l'icône se transformer en un tiers. Garder l'onglet sur l'origine de Kamo et encadrer la session auraient conservé l'icône de l'organisation; la passerelle répond à tous les ordinateurs. Cela n'est donc pas disponible. La passerelle répond pour ces deux fichiers à la place. Ceux qui sont cachés de l'hôtel, et que la réponse EST NOUS. Une demande d'icône est une image claire GET émise alors que le navigateur rend la société d'un tiers document. Il ne transporte pas de session et pas de jeton, donc l'hôte est le seul signal qu'il y a. À un Les propres ordinateurs de l'organisation. Sur la plate-forme partagée hôte ce n'est pas le cas: la résolution par l'hôte y désigne la PLATE-FORME, comme le dit déjà layout.tsx - "qui est Personne n'est locataire ». Donc l'hôte de la plate-forme se résout délibérément sans organisation et obtient un glyphe sans marque. Toutes les organisations dont le domaine n'est pas encore vivant partagent cet hôte, et peignant la marque de KamoCRM sur l'onglet d'un locataire est exactement la chose exacte qu'une étiquette blanche existe pour empêcher - en regardant, Ici, indiscernable du travail. Il est également indiscernable de la bonne réponse pour Les membres de KamoCRM, c'est pourquoi il n'y a pas d'exception pour eux. Rien n'a à changement pour une organisation pour obtenir sa propre icône: le moment où son ordinateur hôte est en direct, le l'hôte le nomme et la route le résout. Le glyphe est un contour de moniteur en ardoise, pas de marque du tout, aux deux tailles Guacamole déclare. L'icône d'une organisation est l'autre résolu, l'autre, l'ensemble favicon, le même chaîne DynamicMetaLoader utilise, et chaque échec le long de celui-ci retombe au glyphe: un favicon est Cela ne vaut pas la peine d'échouer d'une page, et une mauvaise marque est pire que pas de marque. LA VOIE VIE EN kamo, PAS ENTRE LE REST DE LA GATEWAY DANS LES Informatiques hébergées. Cours de traefik avec allowCrossNamespace et permettreExternalNameServices à la fois à leur défaut de faux, donc un IngressRoute là-bas ne peut pas atteindre le service kamowebinternal, et l'un ou l'autre drapeau est un changement à l'échelle du groupe pour atteindre un favicon. Le certificat est déjà délivré dans cet espace de noms, Donc l'itinéraire se trouve à côté du service à qui il transmet et CI l'applique avec le code. themePublicBase est extrait de sorte que la mise en page du seau est écrite une fois: Theme.tsx est "client d'utilisation" et le serveur avaient la même forme.
· kamo-internal
Arive dans les marchés CRM, sur la page principale, et sur les profils des membres
- Marchés : "Arive" rejoint le menu déroulant de MLOS, et sa boîte de dialogue Configure tient les quatre crochets Zapier (écriture seulement, masqué), l'Arive → Kamo adresse à coller dans Zaps, la carte d'état de la scène →, le lead-creation et steak-push interrupteurs, un guide de configuration et le journal d'activité de la connexion. Configurer est maintenant une liste d'autorisation : un fournisseur sans rien configurer plus longtemps obtient un bouton activé qui ne fait rien. - Page principale : LosHeaderActions rend les états de chaque fournisseur — MeridianLink inchangé; Arive créer → attendre Arive (revenant après 15 min, avec une confirmation) → ouvert dans Arive avec sa scène, convertir pour une avance Arive, et une puce à problème de synchronisation. Un lien en attente relise la configuration du marché chaque 10 s donc il se transforme en "Ouvrir en Arive" sans recharge. - Profil: la carte d'identité de prêteur enregistre à nouveau (il n'a pas pu profil rebâtir, c20bac57). Chaque ligne de marché édite sur son propre: MeridianLink prend nom d'utilisateur + secret, Arive l'e-mail de connexion Arive du membre. - MarketConfig.mlosProvider est l'union des fournisseurs, pas une chaîne nue. Spécifications: - Oui
· SecurityService
Formuler des choix et enregistrer les coordonnées au fur et à mesure
Le dialogue de publication choisit maintenant comment se pose l'application hypothécaire publique out (kamo-partagé-bibliothèque ac83bea1): NORMAL ou SQUEEZE, coordonnées au Questions START ou LAST, FULL ou BASE. - PUT ********************************************************************************************************************************************************************************************************************************************************************* Mise en page, applicationContactStep et applicationFieldSet; un manquant garde ce qui est stocké, donc retirer une page ne réinitialise jamais sa mise en page. La réponse leur fait écho. - GET /public/loan-application/{p} répond layout {type, contactStep, fieldSet}, toujours résolu. - POST ************* — pour un produit START seulement (404 Sinon): *** faux-fermé, présentation du budget IP, nom + courriel requis. Crée le lead avec la source « Demande de prêt en ligne (inachevée) » et les réponses un jeton 256 bits détenu à Redis pour une journée, écrit à l'intérieur de la transaction L'échec de Redis retourne le plomb plutôt que de garantir un duplicata. - PUT **************** ajoute des réponses à cette piste par mise à jourLead (absent = inchangé). Jeton lié au produit. - POST/public/loan-application/{p} avec progresToken termine ce qui mène (source « Demande de prêt en ligne », reçu comme avant) au lieu de déposer une deuxième; un jeton inconnu ou expiré enregistre une nouvelle piste comme précédemment. - La propriété du plomb est vérifiée AVANT mise à jourLead plutôt que par la capture exception: il s'agit de @Transactional et marquerait la requête en retour seulement. base de Ratchet: démarrerProgress et enregistrerProgress ajouté avec leurs raisons, et parHost (ajouté sur le principal par 81e0756 sans ligne, qui a laissé le cliquet rouge).
· kamo-shared-library
Choix de structure pour une demande de prêt publiée
Trois colonnes sur LEAD VENDOR PRODUCTS, choisies sur le dialogue de publication et lues par kamo-apps pour mettre la forme de l'hypothèque publique: - DEMANDE LAYOUT NORMAL (étapes groupées) - APPLICATION CONTACT STEP START (contact d'abord, sauvegardés au fur et à mesure) - APPLICATION FIELD SET FULL- Chaînes simples, pas @Enuméré, donc aucune contrainte ddl-auto CHECK ne fige la valeur Prêt. Null se lit comme NORMAL / START / FULL, le formulaire tel qu'il était. Le DTO porte le valeurs résolues; setProductApplication gagne une surcharge prenant les options, avec membres nuls signifiant "maintien", et l'ancienne signature y délégués inchangé. DDL s'applique déjà au cluster en tant que propriétaire: ALTER TABLE public.lead vendor products AJOUTER COLONNE SI NON EXISTE application layout varchar(16); TABLEAU ALTER public.lead vendor products AJOUTER LA COLONNE SI N'EXISTE PAS application contact step varchar(16); TABLEAU ALTER public.lead vendor products AJOUTER COLONNE SI N'EXISTE PAS application field set varchar(16);
· InitializerService
Les colonnes et les activités enregistrent les cartes d'intégration Arive
(unique), les champs de liaison Arive sur lead-los-links (genre, GUID, lien profond, stade, en attente depuis, dernière erreur) et les événements. Tous annulables, pas de remblai; Ordonnance(0) parce que les entités les cartographier. Déjà appliqué à Yugabyte à la main (en tant que propriétaire, kamo) avant le la poussée de la bibliothèque partagée, ce qui maintient un nouvel environnement en marche.
· APIService
Le discours public Zapier affiche les événements Arive à
POST **************** **** **** Le contrôleur AriveInbound de SecurityService, qui possède le jeton. Les la chaîne de requête (l'événement) traverse le houblon, un corps de forme le conteneur déjà parsed est reconstruit à partir de ses paramètres, et le statut de SecurityService est passé à travers as-is: Zapier montre une tâche non-2xx comme erreur, qui est l'endroit Les gens qui maintiennent le Zap regarderont. Un jeton mal formé ne quitte jamais le bord.
· SecurityService
Arive through Zapier — connexion, événements entrants et actions par tête
Un marché lié à Arive obtient une connexion (quatre Zapier Catch Crochets pour create-loan, update-loan, update-lead et convert-lead, plus une URL entrante dont le jeton est stocké comme un hasch) à **************** avec un journal d'activité, jeton rotation et "envoyer un échantillon" pour que Zapier puisse apprendre les champs de chaque crochet. Les déclencheurs d'Arive postent à **************** JSON ou corps de forme (par défaut de Zapier), reconnus par notre crmReferenceId, l'Arive GUID, l'identifiant d'affichage, ou — pour une plomb converti à l'intérieur d'Arive — l'emprunteur E-mail. Les enregistrements reconnus s'appliquent aux Arive-wins; une nouvelle étape déplace le Kamo statut à travers la carte d'étape de la connexion; les enregistrements inconnus deviennent leads assigné au membre Arive noms comme officier, et notre Uid est renvoyé. Chaque résultat est enregistré, et rien ne répond à un 200 silencieux. La page d'accueil crée/ouvre les expéditions sur le marché: Arive répond 202 PENDANT (il confirme asynchrone) et ajoute / convertir. Carte des membres à leur e-mail Arive (pas de secret, pas de NMLS, un membre par e-mail par marché). Le LO-XML applique le paramètre refuse désormais non-MeridianLink les fournisseurs au lieu d'appliquer un patch all-null.
· kamo-internal
Démarrer une session de codeur dans le nuage, et le montrer sur la fenêtre
qui répertorie les caisses git sur la machine de développement (la plus récente modèle et effort du membre. La machine construit la commande, avec CCR-FORCE-BUNDLE-1 de sorte que la caisse locale est téléchargée plutôt que clonée d'une télécommande GitHub que nous n'avons pas. Le terminal qu'il ouvre porte "cloud: true" dans ses accessoires, et le titre et l'onglet maximisé dessiner un nuage sur son icône de terminal (fenêtreIcon). Un accessoire plutôt qu'un nœud d'icône, de sorte qu'il survit à un rechargement; rouvrir de la liste des terminaux porte la marque de la machine à la fenêtre.

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