Saltar al contenido
KAMOUniverse

Changelog

Qué hay de nuevo.

Cada mejora de la plataforma, a medida que se envía.

  1. · kamo-shared-library

    Añadir un cheque global de la unidad de alias

    ************* alcances por proveedor, y eso estaba bien, mientras que un alias sólo se resolvió como (security.provider.id, alias) La pareja detrás de un .UU...parentdomain. anfitrión. Dos orgs bajo diferentes proveedores podrían compartir uno sin ambiguedades. Una organización ahora puede ser nombrada directamente por su alias, con ?org=, y que buscar no tiene proveedor a la medida. Un alias repetido hace que el referencia ambigua de plataforma en todo, por lo que OrgResolutionService la rechaza en lugar de elegir una que deja a las organizaciones BOTH inalcanzable por alias. La finca en vivo ya contiene repeticiones (cuatro orgs share "acme-corp", dos comparten "kia-kaha"), por lo que el solucionador se niega; esto es lo que impide más ser creado. excluirId deja que una organización mantenga su propio alias mientras otros campos son salvo; pase nulo al crear. 1597 pruebas pasan.

  2. · KlusterServices

    Envío un informe de fallo sobre el código VS abierto de sabio

    Manequiador de URI que crea una conversación en una ventana RUNNING y pre-llenos la entrada, que es la única manera de llegar al sabio del editor ya tiene abierto en lugar de empezar un segundo al lado. El URI lleva un aviso y nada más, así que el modelo y el esfuerzo pasan por codificadorProcessWrapper - un envoltorio que mapea un enum validado a banderas fijas y nunca toma argv del archivo, por lo que un archivo falsificado puede elegir un diferente modelo y nada más. El URI pre-llena pero no presenta, por lo que la sumisión es un retorno sintético y el agente espera entonces una transcripción antes de reportar el éxito. El aguja para la que busca es JSON-escapado: transcripciones son JSONL, y la búsqueda para las nuevas líneas crudas marcaría cada mensaje entregado como fallido.

  3. · InitializerService

    Crear las mesas de errores del sistema

    No se limita CHECK a las columnas ordinales: support.ticket.status.check es lo que pasa cuando Hibernatege congela una al tamaño de un enum y el enum entonces crece, y se espera que SystemBugStatusType crezca. Aplicado a yb-tserver:5433 a mano, ya que este servicio no tiene CI.

  4. · kamo-internal

    Administrar un dominio personalizado de la configuración de la empresa

    Un dominio solía ser la puerta en una organización: DNS tenía que ser configurado antes de que alguien pudiera iniciar sesión en absoluto, por lo que /setup/dns era Al que llegó desde el mago de la creación de org y de una pancarta de "necesidades de configuración" más bien que de la configuración. Ahora es opcional, por lo que pertenece al resto de la marcador en blanco. Añade una sección de dominio personalizado a la configuración. entre la información de la compañía y Branding. Muestra el dominio actual de la org, o dice claramente que no hay uno, y abre /setup/dns para añadir o cambiar - Ahí. El botón dice "Acoplar un dominio" o "Gestión de gestión" dependiendo de cuál de esos es. La copia conduce con el espacio de trabajo ya siendo accesible en kamocrm.com, así que un propietario que nunca quiere su propia dirección sabe que esto es algo que puede ignorarlo. Usa orgIdStr en lugar de organización.id: ese campo es un número JS y truncates int64 org ids más allá de MAX-SAFE-INTEGER, que abriría el DNS página para una organización diferente. El botón está desactivado hasta que resuelve en lugar de navegar con un id equivocado. Copiar aterrizado en kamo-translación-diccionario primero (98ee7cb6) . CI clones sinpinned a la hora de la construcción de imágenes, así que app-first es una construcción roja. 2921 pruebas y los 8 guardias pasan, i18n incluido.

  5. · SecurityService

    Envía el árbol en el endpoint de aplicación-catalog también

    Tipos de sucursal - Aplicaciones Permitidas construye su editor de /carataloga /caratel /app-catalog, no de la lista de características del inquilino, por lo que era la única superficie que podía no ver qué aplicaciones son niños de cuál. Un padre decide cuál es su Incluso se puede ofrecer a los niños, por lo que el editor necesita la misma forma. 947 pruebas de verde.

  6. · kamo-internal

    Dender el árbol de la aplicación y confirmar lo que toma un interruptor padre

    Los niños ahora se sientan bajo su padre en la lista de aplicaciones y características, cada uno con su propio interruptor. La expiación se expresa por ORDEN más un secreto en lugar de un contenedor anidado, por lo que la tarjeta existente, el código de entrada y latas es sin tocar y un hijo cuyo padre es filtrado fuera de la pestaña actual todavía se rinde a nivel superior en lugar de desaparecer. Dos comportamientos que la cascada hizo necesario: Toggling ahora aplica toda la lista de características del servidor en lugar de voltear la fila de click. Habilitar que un niño encienda a su progenitor e inhabilite un El padre desconecte a cada niño, por lo que una actualización local de una sola fila se iría. la interfaz de usuario discrepando con el servidor sobre todo lo demás de la cascada tocado. Ambos endpoints ya devolvieron la lista completa; nada nuevo fue necesario servidor-lado. El viejo camino de una sola fila se mantiene como un retroceso para un SecurityService que no envía lista. Desconecte a un padre pregunte primero, nombrando a los niños con los que se llevará - Sí. Esa es una acción más grande que la mirada de conmutación. El árbol proviene del endpoint de características en lugar de un espejo de TypeScript de ServiceType ya se han desplazado desde Java dos veces, y la el servidor es el único lugar que conoce el catálogo del operador. 203 archivos de prueba / 2921 pruebas en verde, construir limpio.

  7. · InitializerService

    Precio el comercio de los niños y la EHR, con una guardia total

    Ninguno de los mapas de precios tenía una comprobación de totalidad, y los dos modos de falla son diferente y ambos silenciosos. Falta de CATALOG, una aplicación aterriza en ninguna parte la matriz de precios. Desaparecidos de TIERS, cada nivel escribe es .incluir=false - un DENIAL explícito que el derecho fall-open hace NO rescate, porque falla sólo se aplica cuando un plan no tiene ninguna fila en absoluto y esto escribe uno. Así que una aplicación olvidada se regala a todo el mundo o candado para todos, y cuál depende de un detalle que nadie Recuerda en ese momento. Las cinco verticales del comercio se sientan exactamente en el cabecera de POS. No lo eran. por separado . . . . . . . . . . . . . . . . . . . . podría hacerlo, podría hacer, así que ponerlos en cualquier otro lugar retroactivamente cargo por capacidad que la gente ya tiene. Una prueba pincha que a POS más bien que a un literal, así que mover POS los mueve. EHR es negociado empresarial como los sistemas de originación: sin precio de lista, CUSTOM planea sólo, ausente de cada nivel. A bordo de un cliente de PHI significa BAA y una revisión de cumplimiento, no una caja de autoservición. 159 pruebas de verde.

  8. · kamo-marketing

    Deja de contar las visitas de un miembro a su propio enlace

    Un miembro que comprueba que su propio enlace de rastreo funciona es el primero más común visitar cualquier código que se ponga, y es peor que inútil: infla el número se miden, es indistinguible de una perspectiva real en el visitante cajón, y los deja sosteniendo una galleta de visita permanente para que cada visita posterior vuelve a contar. Un código que muestra tres visitas, todas ellas la persona que lo acuñaron, es un récord de pago con una mentira en él. Este sitio es el único origen que puede responder a la pregunta - no tiene sesión y no miembro, y la consola interna no puede establecer una cookie en www..apex. interna.-apex. Qué cruces ese huestro es un eslabón: llegar con menta ?mrt-self=1 la exclusión, y a partir de entonces en el navegador se excluye en cada visita, independientemente de si no el parámetro está ahí. La pestaña Códigos de Seguimiento Interna aumenta el control que produce ese vínculo. No acuñar no es suficiente, por lo que una visita excluida DELETES el visitante y la fuente También galletas. Un miembro que previó su enlace antes de este envío, o que optó en un navegador ya contado, todavía lleva una GUID y la baliza se dispara para cualquiera que tenga uno. Sin la eliminación, el opt-out solo habría funcionado para la gente que no lo necesitaba. La exclusión NO está deliberadamente en TRACKING-COOKIES: ese conjunto es lo que la galleta policy's delete control clears, y barriendo un opt-OUT con los identificadores volvería a matricular silenciosamente al único visitante que pidió no ser contado en el control lo más propenso a ser presionado por exactamente esa persona. check-descucucho-cookie crece de 50 cheques a 72, cubriendo la coincidencia de valor, ortidas de parámetros, la exclusión de borrado y las dos fuentes de invariantes (el mediodeleware debe borrar la identidad, la baliza debe pagarse bajo fianza localmente porque middleware se ejecuta en solicitudes de documentos mientras la baliza se ejecuta en cada lado cliente navegación).

  9. · kamo-internal

    El widget de marcador de ventas de afiliados

    Una columna de cuadrícula ancha y dos filas de altura: las diez personas de la organización traer la mayoría a través de sus enlaces de seguimiento, durante hoy, este mes, este año o en todo tiempo, abriendo a los visitantes este mes. El reordenamiento es la característica. Cada otra forma de mostrar cuatro métricas sobre cuatro Las ventanas son dieciséis listas separadas; esta es una lista que se reorganiza. Fiestas son llavedos por miembro y llevan una animación de diseño, por lo que cambiar las diapositivas de la categoría la misma gente más allá de dejar el exterior en el panel y el gancho mantiene cada tabla que ha buscado, así que la prensa que desencadena esa animación tiene datos para animar a en el mismo marco. Los selectores se almacenan contra el PROFILE, no localStorage del miembro, por lo que el La tabla que alguien se prepara en su escritorio es la junta que suben a su portátil. Ambos Los lectores rebajan un valor no reconocido al valor por defecto en lugar de rechazarlo. el servidor aplica la regla idéntica y se hace eco de lo que usó, por lo que a La preferencia escrita por una construcción más antigua nunca puede dejar a un miembro en un panel en blanco. Un miembro fuera del top ten obtiene su propia línea colocada debajo de la lista, y un Miembro sin nada lo consigue en el rango cero. Una junta que sólo puede decir "tú eres no en ella" es la única cosa que un marcador no debe hacer a la gente que existe para Motivar. También aquí, porque es el mismo problema del otro extremo: un control de "previsualización" en la pestaña Códigos de rastreo que abre un enlace sin contar la visita. Comprobar donde tu propio enlace aterriza es la primera visita más común que cualquier código tenga, y Contandolo pone los propios clics del miembro en el registro en el que se miden. buildTrackingPreviewLink es el enlace real más el marcador el sitio de marketing Lee un contrato de ego-repo cruzado, por lo que la prueba pincha el nombre del parámetro.

  10. · MediaService

    El punto final del marcador de ventas de afiliados

    GET ************* responde a esto El top ten de la organización por una métrica sobre una ventana, más la propia del llamante parado cuando no están en él. Los contadores en los certamen de que se han vuelto. roll-ups sin dimensión temporal, y no hay nada en un total corriendo que dice cuando ocurrió algo. La verdad de las ventanas está en las filas. **************** para la adquisición, y la propia de cada conversión *Embetilo en FECHA-VISITORS. Por eso All Time está de acuerdo con el código cuadrícula: mismo dato, contado de la misma manera, no una segunda contabilidad. Cuatro decisiones que vale la pena enunciar: - La adquisición está fechada por el primer contacto, no por actividad. Contando visitantes que estaban meramente activos en la ventanilla volver acreditar a la misma persona cada mes, El trabajo hecho una vez se haría el trabajo fuera de control hecho ahora, para siempre. - Conversiones rango de atribuyado solo. Esa columna congela el momento en que existe una cuenta; últimoTrackingCodeId sigue moviéndose, y ranking fuera de él dejaría que un miembro tomara la conversión cerrada de otro con un clic extra. - La ventana se corta en el calendario del miembro y se compara en UTC. "Este mes" difiere hasta un día dependiendo de de quién se pregunte, y cada columna en este esquema es un localDateTime sin compensación que significa UTC. - Las cuatro métricas se calculan por petición, por lo que la categoría de conmutación es un instante volver a clasificar las filas ya en pantalla en lugar de un spinner. Cád vistos en AFFILIATE-SCOREBOARD-WIDGET y nada más. Javadoc. No compra ningún perforo: no hay identificado código, ni visitante id y ningún miembro parámetro en el punto final, y cada punto de endo de análisis por el que aún pasa MarketingTrackingScopeResolver sin cambios. Las cuatro agregaciones usan la coma-unin en lugar de irseIN.ON porque ninguno de los dos clave extranjera es una asociación JPA y la forma coma analiza en cada Hibernate versión de la flota que se ejecuta . MarketingTrackingHqlP.Ahora analiza los cuatro contra el modelo de entidad real en 6.2.13, y pins la adquisición, atribución y inquilino predicas que fallan en silencio si van a la deriva.

  11. · kamo-shared-library

    Añadir los derechos del widget de marcador de ventas de Afiliados

    Cinco derechos, 234-238, en el grupo de la FECHA y colgados de VIEW-REFERRAL-CODES: una tabla de clasificación de los números de referencia es el seguimiento de los datos, y un miembro que puede no ver que la pestaña Códigos de rastreo no tiene nada que ver. El widget a la derecha "no es VERDAZAR-TRACKING - lo que revela a otros los miembros, y eso es deliberado. 200/201 de la puerta ANALYTICS: los visitantes, cuyas direcciones, cuyos cronogramas, se resolvieron por miembro objetivo por el alcance de la resolución. Un marcador revela un nombre, un rango y un número, a todos de una vez. Exigir a la derecha de análisis de toda la org lo dejaría visible sólo a los administradores que tienen uno, que es un informe y no una junta. Deliberadamente NO sembrado, por la misma razón 200 y 201 no lo son: semilla sería lo haría publicar los totales de remisión de cada titular existente a sus colegas en la bota que lo envió, que es una decisión de divulgación tocada por un despliegue en lugar de un administrador. 229/166/32/31 en forma auditada - Los cinco son niños y VIEW-REFERRAL-CODES es en sí un hijo de VIEW-MARKETING, así que ninguno de los dos se mueve el cubo de raíz.

  12. · kamo-login

    Marca y alcance la pantalla de inicio de sesión con ?org=

    login.kamocrm.com es la pantalla de inicio de sesión para cada organización que no tiene anfitrión de su propia, por lo que el nombre de host no puede decir en cuál se está inscribiendo. ?org= lo hace: nombra a la organización por id o alias, selecciona la marca a pintura, y viaja con las credenciales como la organización que son Froté contra él. Una pista, no una credencial. La membresía es probada lado del servidor de cualquier manera, así que nombrar a una organización a la que no perteneces recibe la misma negativa que nombrar una ficticia. Lo peor que logra una referencia equivocada es el logotipo equivocado en una página pública. La marca proviene de SecurityService's /org/public/-F., relevado más bien que reimplementado para que la regla sobre lo que una referencia adivinable pueda exponer Se queda en un lugar. La base temática sigue a la organización en lugar de el hués, utilizado como se da: soltando su primera etiqueta de la forma en que el camino del huésco hace convertiría acme.kamocrm.com en kamocrm.com y pintaría un inquilino en el la plataforma está marcando. La primera pintura utiliza necesariamente la marca del huésco, porque la referencia Aún no se ha resuelto; los repintados de KAMO-THEME-REAPPLY una vez que lo ha hecho. Una visita que ninguna organización despeja ninguna referencia una visita anterior registrada en esta pestaña, para que la propia pantalla de la plataforma no mantenga la de otra persona Logo.

  13. · SecurityService

    Sirviar la marca de una org a una pantalla sin sesiones

    Login, registro y el vestíbulo de reuniones pintan los colores de una organización antes de que exista cualquier sesión. Ellos sabían cuál de la denominación de huésped, que es exactamente lo que una organización sin un nombre de host propio no puede suministrar. GET /api/security/org/public/-ref- convierte una referencia explícita ?org= -- el id como dígitos, o el alias... en algo para pintar. Bizque SOLO: nombre, logo, colores, lugar, anfitrión de tema. No características, no derechos, no dominios, no miembros. El primer intento de esto reutilizaba la el registro de organización proyectado y el trinquete de endpoint se negaron, correctamente - alias son adivinables, por lo que un registro completo detrás de un adivinable La referencia enumera la configuración de cada organización. Lo que queda es lo que cualquiera que abra la página de inicio de sesión de esa organización ya ve, y a nombres de los campos excluidos individualmente, por lo que dejar uno de vuelta tiene que ser deliberado. Sólo lectura. La aplicación de aplicaciones de auto-provisiones hermanos /org/domain/-host-s. efecto secundario; un endpoint alcanzable por adivinar no debe escribir. Una referencia desconocida 404s, y también un alias ambiguo - porPublicRef ya rechaza que uno nombre varios orgs, y este alfiler que la negativa llega al llamante como "ninguna organización" en lugar de como la de otra persona marca. El llamante vuelve a caer en el propio de la plataforma. temaDomain lleva el mismo valor la shell y el uso del aprovisionamiento temático, así que una pantalla de pre-sesión lee la marca de una org de la carpeta que era En realidad escrito a -- .alias.kamocrm.com para un org sin dominio. Pasan las pruebas 947.

  14. · MediaService

    Rechaza grabación de reunión para un inquilino que maneja PHI

    La capacidad dividida ServiceType.MEET permitió una conferencia en vivo en Meet auto-anfitriado nunca sale del cúmulo mientras se reúne. permanecer bloqueado, porque este oleoducto publica toda la transcripción a la router de IA multi-proveedor y luego envía un correo electrónico al resultado a cada participante incluyendo invitados externos. Esa es una copia inquebrantable de terceros. El guardia se sienta en la ingesta privada () ambos puntos de entrada pública embudo a través, por lo que se niega antes de que cualquier bytes llegue a MinIO, y de nuevo en la parte superior de runSummaryPipeline, que es público y "Async". 200 pruebas verdes.

  15. · VOIPService

    La capacidad bloqueada ahora supera a la derecha, y el modo dios

    PhiPlaybackAuthorizer ha cerrado la reproducción de la llamada PHI en VIEW-CALL-LOGS. Eso fue todo el cheque porque ServiceType.VOIP mapeado a la bloqueada Módulo VOIP-RECORDING, por lo que un inquilino de PHI no podía tener el sistema telefónico en todo y esta clase nunca corrió por una. La capacidad dividida que la propia VOIP permitió el manejo de llamadas es en elcluster - mientras que VOIP-RECORDING se quedó BLOCKED-PENDING-WORK por razones que no han cambiado: la reproducción no realiza verificación de autorización, transcripciones montar en metadatos, y no hay ruta de retención o eliminación. Izquierda sola eso habría sido un debilitamiento recto: un inquilino de PHI podría permitir el sistema telefónico y, con un derecho concedido, jugar todo. Así que PhiCapabilityGuard corre primero y su negativa es final. No se necesita. parámetro de llamada, así que para un inquilino de PHI no le levanta la derecha y tampoco hace una sesión de dios activa, que es la propiedad que más importa. ******************* ahora ********************** Tres pruebas codificaron el viejo contrato y se reescriben en lugar de Borrado, cada registro por qué la expectativa volteó. El mensaje de denegación de correo de voz ya no culpa a la derecha desapareda, que Generalmente ya no es la razón. 152 pruebas de verde.

  16. · SecurityService

    Sirva el árbol de la aplicación, y arregle el auto-capaz sin vigilancia

    CaracterControlor envía ahora padre/hijos/esPadre en cada serializado app para que el cliente pueda hacer que los niños anidados bajo su padre. Servido en lugar de reflejarse en TypeScript a propósito: los retrovisores ServiceType ya dos veces se ha desplazado de Java y una segunda copia del árbol ser una cosa más a la deriva. No se necesitaba nueva forma de respuesta para la cascada y /discapacitado ya re-serializar toda la lista de características, por lo que llegan los cambios de llamada sin que el cliente se reconcile nada. Ambos bucles de auto-aprovisionamiento se saltan ahora un hijo cuyo padre la plataforma hace no ofrecer, ya que habilitarFeature cascadas de la matriz en y de otra manera lo haría Enciende a un padre que nadie publicó. El bucle de OrganizationController no tuvo chequeo PHI mientras FeatureController equivalente, en un punto de endo público no autenticado. Para un inquilino de PHI el Lanzamiento del módulo primero bloqueado, la captura de los alrededores registró una advertencia, y Las carpetas silenciosamente cayeron a filas crudas sin modelo aplicado proyección. Ahora pregunta en lugar de atrapar, exactamente como las características La lista sí. /api/seguridad/ehr registrada. Los prefijos comerciales permanecen mapeados a POS: el padre es la puerta gruesa correcta y **************** ya refina por mercado. 938 pruebas verdes.

  17. · kamo-internal

    Espejo las seis aplicaciones para niños de comercio, y detenga los espejos a la deriva

    Ambos espejos TS están ahora GENERADO de ServiceType.java en lugar de Mantuado a mano. Se habían alejado mal de Java y de los demás: "Integración Ráb) y "Falls back to parent organization SMTP" copiar ese Java eliminado en 2026-08, POS marcó PLANNING en ServiceType.ts mientras que AppType.ts dijo COMPLETED, y diferentes descripciones para el mismo aplicación en cada archivo. Vale la pena saber antes de confiar en ellos: displayName y descripción aquí son Leer por NADA. Cada consumidor utiliza estas constantes para la identidad solamente hasFeature() coincide con las teclas ítidas, appServiceIcons en el nombre. La copia viene de GET /api/security/featuress, que honra las anulaciones de PLATFORM-APP-CATALOG los espejos no pueden ver. Las cuerdas se sincronizan para que un lector no sea engañado, y la cabecera dice que no empiece a dejarlos. El árbol padre/infantil NO se refleja deliberadamente. endpoint envía padre/niños/isPadre por aplicación, y una segunda copia de la La forma sería una cosa más a la deriva. También: un icono por nueva vertical en lugar de tomar prestada la de la matriz escaparates, y los creadores de la Organización incluyendo isEhr.

  18. · kamo-internal

    Una barra de desplazamiento, tres veces más ancha, en cada conversación

    El bar junto a los mensajes era de 8px en el chat de los miembros y SMS, 6px en boletos de apoyo y social, y en el chat de IA no fue nada en absoluto: esa lista declaró en línea la lista de .scrollbar-andth. al lado de sus reglas de scbar de scero, y desde Chrome 121 un anticuado no inicial o hace que el navegador deseche todo el bloque -webkit-, por lo que pidió 12px y consiguió la línea de cabello de plataforma. globals.csss documentos que dictaminan para el scroller de página; nada La conversación de IA había estado en silencio en el lado equivocado. Los cinco ahora leen una constante de CHAT-SCROLLBAR: una canaleta de 24px y tres veces el chat de los miembros anchura antigua con el inset del pulgar 6px a ambos lados por un borde transparente, por lo que una barra que ancha Todavía se lee como una píldora en un abrevadero en lugar de una losa soldada al borde de la ventana. El chat de la IA las propiedades estándar se mueven en soportes no selector(::-webkit-scrollbar) , que es donde globals.css los pone y el único lugar Firefox los lee sin costar Chrome sus reglas. La prueba es de nivel de origen porque el sujeto es una hoja de estilo y jsdom no implementa barras de desplazamiento: alza que ninguna ventana tamaño su barra de un literal, y que ninguno de ellos establece el estándar propiedades de nuevo.

  19. · InitializerService

    Extender el abuelo del mercado en el relleno de árbol de aplicaciones

    El abueloExistingGatedMarkets ya caminaba por los mercados activos de cada org, resolvió getRequiredService() y habilitó la aplicación que faltaba. restringido a verticales de laGated (), es decir. MORTGAGE y PERSONAL-LOANS. Ahora. que cada CommerceType nombra su propia aplicación para niños la restricción se ha ido, así las mismas semillas de bucle RETAIL / RENTAL / SERVICIO / SUBSCRIPTION / Filas de PROCUREMENTO. No se necesita una nueva migración. También semilla RETAIL para orcarros que sostienen POS sin ningún mercado, que tenían trabajar en el comercio antes del árbol porque al por menor no necesitaba una aplicación propia. Los orgs de alto nivel ya no se saltan, y esa es la solución que importa. La exención era correcta cuando esto sólo concedía las dos aplicaciones de préstamo plataforma-operador org no debería adquirir en silencio el MLOS, pero está mal para el árbol de aplicaciones, porque esAppEfectlyEnabled requiere un OrgFeature ROW y no tiene exención de primer nivel. La primera carrera reportó éxito mientras dejar KamoCRM, que opera mercados activos de RETAIL y SUBSCRIPTION, con para ninguno de los dos; habría perdido ambos de / comercio en el siguiente Servicio de Seguridad se despliega. Capturado consultando la base de datos, no leyendo el tronco. habilitar la naturaleza ahora en cascada de un niño a su progenitor, por lo que sembrar a un niño también garantiza la fila POS. RUN contra el delantero 2026-08-24. Verificado: cada comercio activo. Ahora tiene un niño activo OrgFeature fila, cero falta.

  20. · SecurityService

    Derecho-cheque cada vertical, no sólo la dos cerradas

    Cada CommerceType ahora nombra su propia aplicación para niños bajo POS, así que el está agotado() cortocircuito que ondeó al por menor, alquileres, servicio, suscripciones y la contratación se ha ido. Esos mercados están ahora controlados contra su propia aplicación que es el punto: se puede vender una vertical, y Apagado, solo. Depende de la carrera de KamoInitializer haber corrido.

  21. · kamo-internal

    La búsqueda de la barra de herramientas es un glifo que se abre en un campo

    El chat miembro llevaba un cuadro de búsqueda permanente a través de la parte superior de la ventana. toda la barra de herramientas, gastada en un control que está vacío casi todo el tiempo y utilizado en ráfanos. Es es ahora una lupa de 28px que se abre al campo en clic, y la barra de herramientas se lee como cuatro glifos y aire. La idea que se construye: la lupa nunca se mueve y nunca se intercambia. Colapsed, el píldora es de 28px y el icono se encuentra en su centro, 14px desde el borde izquierdo; abierto, la píldora tiene 6px de 6px de rellenar antes de un icono de 16px, que vuelve a poner el centro del icono en 14px. La píldora crece, por lo tanto, por detrás de un glifo que se mantiene quieto, y el control se lee como una apertura de objeto más bien que dos estados que se cruzan. El ancho brota con un poco de repasete en el camino abierto y ninguno en el camino cerrado; el marcador rastro el crecimiento en 60ms para que el texto llegue en una caja que ya tiene espacio para ello; el control claro se mueve sólo una vez que hay algo que despejar. El cierre siempre despeja la consulta, y el campo no se puede dejar mientras se sostiene uno: a Lupa colapsada aún filtrando la conversación sería la ventana que está sobre lo que es Como muestra. Blur lo deja abierto con texto en él, y un clic perdino en el glifo enfoca el campo en lugar de descartar la búsqueda. El movimiento reducido se honra a lo largo de todo, el glifo lleva el anillo de enfoque para una pestaña, así como un clic, y el espaciador de 50px que la vieja caja necesitada se ha ido con ella.

  22. · kamo-shared-library

    Cada vertical nombra su propia aplicación para niños

    requeridoServicio se convierte en total ahora que cada vertical tiene una aplicación para niños bajo ServiceType.POS, que elimina el "nula significa que POS por sí solo es suficiente" caso especial y está cintada con él. Cada vertical ahora se puede encender, licenciada y clasificada de PHI de forma independiente - que es lo que permite un médico la práctica utiliza el comercio en absoluto, ya que RETAIL permanece bloqueado para un inquilino de PHI Mientras que el resto del comercio no. HEALTHCARE(ServiceType.EHR) es lo que hace que el EHR aparezca en ************* cuando la aplicación está encendida, sin nueva jaula código: assertCommerceTypeAllowed, getAllowedCommerceTypes, the Tipos de extremo permitido detrás de ambos recolectores del mercado, **************** y la lista de mercado filtrar todo ya se resuelve a través de getRequiredService(). NO PUSHED hasta que el relleno KamoInitializer ha corrido.firmarCommerceTypeAllowed lee getRequiredService () directamente, por lo que en el momento en que SecurityService ve esto cada org con un mercado minorista o de alquiler necesita un hijo OrgFeature fila que hace Todavía no lo ha hecho.

  23. · MediaService

    Que la configuración pública sea abordada por org id, no sólo por el anfitrión

    El encuentro sidecar busca una config en la reunión de una org para decidir si un invitado necesita una contraseña de reunión. Preguntó por el nombre de host, cuál en el encuentro compartido host se resuelve a la organización de la plataforma, por lo que un inquilino que requiere un la contraseña habría tenido ese requisito en silencio caído para cada huésped unirse por enlace. Un invitado no tiene sesión, así que lo único que nombra a su inquilino es la habitación, que ahora lleva una ficha de org. Ambos endpoints públicos aceptan, por lo tanto, un explícita orgId y volver a la mirada de dominio cuando no se da ninguno, así que Nada que pida hoy albergue cambia. Los dedos llegan como dígitos y se analizan como un largo: son más allá de los 2o53, así que uno Enseñada a través de un doble nombre una organización diferente. 200 pruebas pasan.

  24. · kamo-shared-library

    Función de cascada enable/desactivar a través del árbol de la aplicación

    Habilitar a un niño permite a su padre; deshabilitar a un padre desactivar cada niño; deshabilitar al último niño desactiva al padre. Habilitar a un padre deja a los niños solos, así que un padre se encendió deliberadamente sin Los niños se quedan. La cascada está impulsada por eventos y deliberadamente no hay reconciliación barrido. Se trata de una propiedad de seguridad: un padre con N.o desactivación de los niños no funciona" invariante apagaría el comercio por cada existente en el momento en que se envía esto, porque no existen filas para niños hasta el relleno KamoInitializer corre. Un niño afirma que el guardia de PHI en el módulo de sus padres, así como el suyo propio, antes de cualquier escritura - de lo contrario un niño permitido bajo un padre bloqueado se quedaría varado o en silencio encendiera al padre bloqueado.

  25. · kamo-shared-library

    Añadir PhiCapabilityGuard para controles de capacidad de tiempo de llamada

    PhiTenantGuard se ejecuta a la hora de presentación y en ningún otro lugar de las tres llamadas sitios, todos en FeatureService. Ahora que PhiModule está engranaje de capacidad, un app cuyo núcleo está permitido todavía puede contener una capacidad que no, y la comprobación de horarios no puede ver la diferencia. La misma firma deliberada que PhiTenantGuard: una función pura de (estatus, módulo) sin llamante, correcto o parámetro de modo dios, así que hay nada que elevar. Clase simple en lugar de un estereotipo y una lib compartida El compromiso que necesita un repositorio no escaneado tiene servicios de bucle de choque cuatro veces; cada servicio consumidor declara su propio "Ban". NOTA: REUNION.RECORDING y VOIP-RECORDING ya no están atados de cualquier ServiceType, pero aún no vigilado en sus sitios de llamadas. commit to touching MediaService y VOIPService. Esto es inerte en la producción Mientras tanto, porque cada org actualmente tiene mangosPhi=false, pero la llamada Los sitios deben aterrizar antes de que cualquier inquilino sea marcado.

  26. · kamo-shared-library

    Dividir PhiModule de grano de aplicación a grano de capacidad

    POS mapeado a ECOMMERCE-SYNC (BLOCKED-NO-BAA) y a todo el comercio la superficie cuelga POS, por lo que un org con asasPhi=true no podía cambiar comercio en absoluto, sin mercado, sin comercio, y sin vertical clínica construido sobre ella. Los diez adaptadores de sincronización minorista son lo que deja el límite, no la columna vertebral del comercio. POS ahora mapas a COMMERCE-CORE (permitido) y ECOMMERCE-SYNC visluyentes al niño RETAIL. La misma corrección para MEET (conferencia en vivo vs el tubería de resumen que envía transcripciones a la inferencia externa) y VOIP (telefonía vs grabaciones y transcripciones almacenadas). REUNION.RECORDING y VOIP-RECORDING ahora no tienen servicioType en absoluto: son capacidades alcanzables sólo a través de código, y el javadoc de PhiModule ahora establece la regla que tal constante DEBE ser comprobado por PhiCapabilityGuard en su llamada sitio. Reclasificación de una aplicación permitida sin proteger la capacidad dentro de ella se lee como conforme mientras no hace cumplir nada. AI-ASSISTANT y RAG-SEARCH permanecen deliberadamente bloqueados: KlusterServices tiene incrudacciones, susurros-asr y traducción, pero sin LLM generativa, y RAG comparte una colección Qdrant aislada por un filtro de carga útil. Dividir serían un cambio de papel. Dos pruebas codificaron el modelo de gran parte de la aplicación y se actualizan en lugar de extendida: PhiServiceTypeMappingLa afirmación de la aplicación bloqueada de PhiServiceTest, y FeatureServicePhiGateTest, cuyo ejemplar bloqueado pasa de VOIP a RETAIL VOIP ya no es rechazable en el momento de la posibilidad.

  27. · kamo-internal

    Tierra dentro de un org recién creado en lugar de en la configuración de DNS

    Crear un org encaminó al creador a /setup/dns, y la razón era real: entrar significaba una rediricción OTK a interior..new-domain, y un nuevo org no tiene DNS, así que ese anfitrión era inalcanzable. Por lo tanto, la configuración de DNS fue el precio de abrir lo que acabas de hacer... la pared exacta esto el trabajo elimina. La llamada de creación ya devuelve una llave de una sola vez; el asistente simplemente no tenía dónde para gastarlo. Ahora lo gasta en el origen actual, donde la sesión nombra al org, así que no hay anfitrión a esperar. Un dominio todavía vale la pena tener y Configuración es donde vive ahora: un paso opcional de marca blanca en lugar de una puerta. Las advertencias de marca son llevar a cabo a través de cualquier manera, y si ninguna llave vuelve el org todavía existe, Así que el mago aterriza en la vista de la finca en lugar de fallar. check-client-navigation correctamente marca la ventana.location.href. Es propio nombres de docstring /validato con una única clave como una verdadera sesión-relacional salto, así que esto se permite consultar con esa razón en lugar de trabajar alrededor... el router mantendría la sesión OLD del creador, que es precisamente lo que está siendo reemplazado. 2857 pruebas y los 7 guardias pasan.

  28. · kamo-shared-library

    Dale a ServiceType un árbol de dos niveles de padres/hijo

    Seis niños del comercio en los nuevos ids 26-31, conectados a POS en un bloque estático en el patrón RoleRightType (an enum constante no puede hacer referencia a otro de sus propios argumentos de constructor). MLOS y LOS reparente sin cambiar de identificación, porque ORG-FEATURES persiste el id a través de ServiceTypeConverter y en movimiento Uno reasignaría cada fila existente. La copia de POS se convierte en "Líneos de Negocios" ahora que los padres prestan y registros de pacientes; el nombre constante se mantiene POS porque ************* persevera nombres como cuerdas. Es viejo descripción se traslada a RETAIL, donde es exacto y ya analizado por ServiceTypeCustomerCopyTest. Nuevas constantes envían PLANNING/discapacidad para FeatureController.list's El bucle de auto-provisionamiento no puede encenderlos para cada org. PhiServiceTypeMappingTest falla por diseño hasta que el siguiente commit mapea el nuevas constantes; ambas tierras en un solo empujón.

  29. · kamo-internal

    Hacer una org sin un dominio entable

    Entrar en un org significaba navegar a **************** Sin dominio que URL se renderiza como el literal ************* por lo que Enter fue discapacitado y los propietarios fueron enrutados a /setup/dns en su lugar -- DNS era la puerta, no una Opción de marca blanca. El espacio de trabajo se abre ahora en el origen CURRENT cuando no hay costumbre en vivo anfitrión, y la sesión nombra al org. Un inquilino con un dominio personalizado en funcionamiento Todavía se abre en su propio anfitrión, por lo que nada cambia para nadie blanquial. Un dominio personalizado inacabado se trata como ningún dominio: que HOST no puede Servir aún, lo cual no es lo mismo que el org ser inalcanzable. canEnterOrg, por lo tanto, las llaves de la cosa que siempre fue la real condición previa -- una membresía utilizable -- en lugar de en un dominio. needsDomainSetup y orgStatus deliberadamente siguen reportando un inacabado dominio: ya no es una barrera, pero sigue siendo el sobresaliente de alguien tarea, y la vista de la propiedad es donde eso se nota. El proyectista también tuvo que dejar de preguntarle al huésped en el que se encuentra. La raíz El trazado despojó "interno" y miró al anfitrión, que responde "quién es el dueño este nombre" -- la misma pregunta en la que "en qué espacio de trabajo estoy" sólo mientras Cada inquilino tenía un huésped para sí mismo. En la plataforma aficionada devuelve el propietario de la plataforma, por lo que un miembro entrando en un org sin dominio se habría mostrado La marca, características y derechos de KamoCRM Inc.. Ahora pregunta primero a la sesión vía /api/org/corriente y vuelve al anfitrión cuando no hay sesión, que mantiene la transformación de la cáscara. La galleta *** es lo que hace que sea accesible en todos los casos -- sesiónStorage es invisible a una solicitud de documento. 2857 pruebas y los 7 guiones de guardia pasan.

  30. · SecurityService

    Deja que la cáscara trae su org de la sesión, no el anfitrión

    El diseño raíz de kamo-internal lee la cabecera de Host, desnuda "internal". letches /org/domain/Ethat. En un huéstre que sirve a un inquilino que es el mismo pregunta como "qué org soy yo"; en un anfitrión compartido es una pregunta diferente con una respuesta equivocada... devuelve a quien sea el dueño del anfitrión, así que un miembro que entró en un org sin dominio recibir la marca de KamoCRM Inc., características y banderas. Añade GET /api/security/org/current, devolviendo el registro proyectado para el organización en la que se encuentra la llamada. El trazado puede llegar a él porque ya reenvía la cabecera de galleta y existe una cookie ***, por lo que el servidor puede ver una sesión a pesar de que la sesiónStorage es invisible a un documento petición. No toma ningún parámetro, deliberadamente. El primer borrador aceptaba un id o alias y **************** correctamente lo rechazó: esa forma hace que el registro de cada org sea enumerable adivinando un alias, y los alias son - adivinable. La sesión ya sabe en qué org está, así que un parámetro Sólo podría preguntar sobre uno diferente. Con la sesión resuelta la El trinquete pasa por su cuenta en lugar de necesitar una entrada de referencia. La proyección se extrae en lugar de copiarla. Dos puntos finales devolviendo dos formas del mismo registro es el fracaso que vale la pena prevenir: un cliente no puedo decir qué aguanta, y se desplazan la primera vez que solo uno es actualizado. Pasan 928 pruebas.

Tu universo está esperando.

Comience gratis en minutos y agregue productos cuando esté listo, sin migración ni nuevos inicios de sesión.

Gratis para siempre: no se requiere tarjeta de crédito