Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· SecurityService
Avviare una sessione di coder nel cloud e dire quali terminali sono
repository come cwd) e risponde `cloud: true`; la macchina costruisce una sessione cloud può iniziare da. L'elenco dei terminali porta l'agente `cloud` contrassegnare attraverso, per il cloud sull'icona della finestra.
· KlusterServices
Avviare una sessione di coder nel cloud da un checkout locale
repository. Il fascio è costretto perché i nostri telecomandi sono Forgejo, non GitHub, e il punto è il checkout su questo disco. No --mode-permissione (il CLI scende bypassPermissioni per una sessione cloud) e no --session-id o ricevuta (il cloud nomina la sessione e non tiene traccia qui). La sessione tmux è contrassegnata @kamo cloud in modo che i rapporti di elenco del terminale `cloud: true` e la console può mettere una nuvola sull'icona della finestra dopo ~/Kamo/Projects, più recentemente lavorato in primo luogo, per il menu da scegliere.
· kamo-internal
Gli allegati siedono sopra il corpo, come i file stessi
Un'email il cui unico contenuto era un PDF non aveva modo di aprire o scaricare file: la clip di carta mostrata nella riga dell'elenco, e il pannello di lettura mostrato Niente. EmailService aveva segnato il PDF in linea perché l'app Gmail ha dato esso un Content-ID (fisso lì in 0de0823); il riquadro ha abbandonato ogni inline parte senza chiedere se il corpo effettivamente dipinto. La regola ora vive in un posto, elencatoAttacchi: una parte rimane fuori l'elenco solo quando il corpo HTML fa riferimento al suo cid:. Il pannello di lettura, la linea temporale principale e l'inoltro tutti lo usano, quindi un messaggio inoltrato no più a lungo silenziosamente cade il file. Non si fida del server flag, che i corpi memorizzati nella cache del browser portano ancora prima della correzione. Il risanamento si risolve cid: riferimenti con la stessa normalizzazione, quindi tutto ciò che resta dalla lista è sempre qualcosa che il corpo mostra. La mensola di fissaggio, prima cosa sotto l'intestazione: - ogni file è una scheda che mostra il file stesso: pagina uno di un PDF (con il suo numero di pagina), la foto, o il glifo del tipo su carta bianca - un clic prevede in un visualizzatore a schermo intero: PDF attraverso pdf.js con zoom e contatore pagina, immagini fit-to-screen con click-to-zoom, video e lettori audio, testo e CSV/TSV come tavolo; i tasti freccia e un filmtrip tra i file - i download passano attraverso il fetch, portando la sessione per-tab intestazione un nudo <a download> mai potrebbe, con un anello di progresso e un tick disegnato - "Scarica tutto" mani ogni file sopra come un .zip scritto nel browser - tastiera-prima, movimento ridotto onorato, ascia pulita; due carte per fila in un riquadro stretto
· kamo-shared-library
Arive come secondo LOS esterno, e una cucitura del fornitore che è reale
Arive è raggiungibile solo tramite l'app Zapier, così la connessione è Zapier in entrambe le direzioni: i comandi dei post Kamo (creare prestito, aggiornare prestito stadio, aggiornamento piombo, convertire il piombo) in per-market Catch Hooks, e Arive's attiva il rientro in un token di ingresso per connessione. L'adattatore, campo mapper (tre nomi anagrafici, leggere dall'app live), mappa della fase, crittografato i segreti e il registro delle attività vivono nelle integrazioni. arive / integrazioni.los. LeadService non gestisce più il codice MeridianLink per ogni link. Spinge andare a il proprio LosProviderAdapter; un fornitore senza uno è saltato e ha registrato invece di ricevere una busta SOAP. In entrata si applica prendere provider-neutral LosLeadPatch (contatto, indirizzo di posta, fatti ipotecari, stato) e attribuire la storia al fornitore. Il risolutore cerca un membro credenziali da parte del fornitore della connessione, e un mercato risparmiare con un sconosciuto Il valore MLOS è di 400 invece di un NO MLOS silenzioso. Le colonne che queste mappe esistono già in Yugabyte (LosAriveSchemaMigration's le dichiarazioni sono state applicate prima di questa spinta).
· kamo-internal
Uno schermo di lancio progettato, nel marchio dell'organizzazione
L'apertura di un computer ha mostrato una riga di testo normale su una pagina bianca, scritta direttamente nella scheda con `document.body.textContent`. Per un massimo di novanta secondi — un curriculum legge l'intera immagine di memoria ospite indietro un volume replicato — quella frase era l'intera esperienza, e si legge come un browser errore piuttosto che come il software del membro. Una pagina che sembra rotta è una persona vicina a quaranta secondi, che non cancella nulla. È uno schermo ora, costruito al canone di questa applicazione piuttosto che inventato: il lavaggio primario radiale / secondario su bianco, una carta bianca al raggio 14 con --elev-hover, il gradiente eroe 90deg come sua regola, --ease-house, modalità leggera. Il logo dell'organizzazione e il suo live... l'anello che conta fino alla stima che il SERVER ha dato piuttosto che un'ipotesi, e lava l'ambiente che preferisce-ridotta-mozione si spegne completamente. Un fallimento ora ha una via d'uscita. Mostra la frase del server — "nessun nodo attualmente ha 8 GiB free" vale la pena di leggere — e un Prova di nuovo che ri-corre il lancio nella stessa scheda. I TAB KEEPS ICON dell'ORGANIZZAZIONE, che è l'altra metà di questo. Navigare verso il gateway consegna l'intero documento a Guacamole, il cui "icon" href="images/logo-64.png">` allora possiede la scheda: un membro che ha aperto il computer della loro azienda ha guardato trasformarsi in il logo di Guacamole. The la sessione è incorniciata all'interno di questa pagina, quindi l'icona e il titolo rimangono l'org e la consegna è una dissolvenza piuttosto che un flash bianco. Guacamole non invia né X-Frame-Opzioni né un frame-ancestors politica — controllata, non assunta — e se il telaio non può essere creato la scheda naviga sempre fatto, perché una scheda più bella non vale un membro non raggiungere il loro computer. Le icone non sono ricostruite da un percorso: sono già gli elementi `¿1⁄2link>` DynamicMetaLoader risolto per questa organizzazione, clonato. Re-deriving che dei due favicon directory un org utilizza sarebbe una seconda risposta che può derivare dal primo. Ogni stringa è una chiave, spinta al dizionario prima. La copia viene iniettata piuttosto che esaminata — la pagina è scritta in un'altra finestra da una funzione normale, dove `useTranslations` non può funzionare — e non c'è volutamente alcun default inglese, quindi un caller che dimentica non riesce a compilare invece di spedire l'inglese ad ogni locale. Tredici test, compreso che un messaggio del server è evaso piuttosto che scritto come markup.
· kamo-login
Punta un membro che ha digitato la loro email di lavoro a uno personale
Le reimpostazioni predefinite vanno all'indirizzo dell'account utente, di solito un personale, ma i membri digitano l'indirizzo di lavoro che la loro organizzazione ha dato loro. SecurityService riconosce ora un indirizzo di lavoro e risponde 409 WORK EMAIL con personaleEmailHint, l'indirizzo dell'account mascherato. Non viene mandato niente. Il mago mostra che al posto di "controlla la tua casella di posta": l'indirizzo digitato, il suggerimento mascherato su una linea propria, e il campo sgomberato, rilabelled "Personal email address", focalizzato, con l'accenno come suo segnaposto. The *** rimane risolto, dal momento che il membro è stato aiutato contemporaneamente piuttosto che rifiutato. L'inserimento dell'indirizzo personale avviene nella fase del codice come prima. /recover's email step mostra la stessa risposta di un messaggio info invece di "Inviato a inviare email di recupero".
· SecurityService
Un indirizzo di lavoro sulla password dimenticata chiede il proprio account, mostrato mascherato
I membri aprono il loro account con un indirizzo personale (gmail, yahoo) e sono successivamente dato un indirizzo di lavoro dalla loro organizzazione, che è quello che ricordano e digitare sulla password dimenticata. Che si sia mai risolto solo con l'host di accesso di Org, e poi la lettera andò alla casella di lavoro. Per 20 membri di KamoCRM che è un KamoMail mailbox, che è letto all'interno del prodotto sono appena stati bloccati Fuori. Su qualsiasi altro host l'indirizzo non corrisponde a nessuno, e la pagina ha detto "se questo email è registrato, un link è stato inviato" avendo inviato nulla. /api/recover/email/initiate ora risponde all'e-mail dell'account esattamente come prima. Per qualsiasi altro indirizzo cerca un indirizzo di lavoro membro: prima nell'org la cui pagina di login questa è (Primary mailbox, then member.email), quindi in qualsiasi live Org. Quando questo nomina un account con un proprio indirizzo, nulla viene inviato. The risposta è un 409 con ragione WORK EMAIL e personaleEmailHint, l'indirizzo del conto con ogni personaggio del nome tra il primo e l'ultimo protagonista, e il dominio in pieno. Si tratta di un 409 di proposito: una pagina di login che precede la suggerimento mostra `message` per un non-2xx, e `message` dice la stessa cosa in parole. Un account senza indirizzo del proprio riceve ancora la lettera alla casella di posta del lavoro sul suo org ospite, dal momento che è l'unica casella di posta in arrivo. Il suggerimento dice che un indirizzo appartiene a qualcuno, che la risposta generica mai ha fatto, così ognuno è contato da CodeAttemptLimiter: cinque all'ora per indirizzo digitato, più il limite di indirizzo del chiamante condiviso con i controlli di codice. Passato questo la richiesta ottiene un 429.
· EmailService
Spostare la posta del sistema e la piattaforma org proprio dominio di invio a kamouniverse.com
platform.mail.domain ora predefinito kamouniverse.com (valore di configurazione, no codice di default cambiamento) e cancelli ogni non verificato-dominio org Fallback transazionale da, come prima. La piattaforma org (kamocrm) utilizzata per bypassare quella proprietà e inviare come proprio OrgDomain verificato - ora PlatformOrgResolver lo costringe attraverso lo stesso fallback, così entrambi seguire una proprietà invece di correre due righe diverse. E' il momento giusto. ottiene il pezzo corrispondente per membri: la casella di posta principale della piattaforma org ottiene un sintetico ingresso kamouniverse.com prepended (stesso mailbox, klusterservices mail/ alias torna al vero kamocrm.com maildir) come il nuovo compositore predefinito, mentre l'indirizzo kamocrm.com originale rimane completamente mandibile - additivo, non sostituto. Ogni altro org non è influenzato in alcun modo. Bulk/campaign mail (bulk-email.platform-relay.*, hello.kamocrm.com) è un percorso di codice separato e intatto.
· KlusterServices
Aggiungi kamouniverse.com come secondo dominio di posta ordinaria
Aggiunge kamouniverse.com a virtual alias domains di postfix con un locale-parte-conservare regexp così qualsiasi indirizzo su di esso atterra in identico kamocrm.com mailbox (nessuna configurazione per utente, funziona per mailbox creato anche in seguito), e relay sender domains in modo che i membri/servizi possono inviare come kamouniverse.com attraverso questo relè. rspamd ottiene il proprio DKIM keypair e blocco di firma per il dominio (selector mail, pubblicato come Non e' vero. hello.kamocrm.com / postfix-bulk sono intatto.
· KlusterServices
Avanti kamouniverse.com a kamocrm.com
DNS per l'apice e www punta ora all'IP pubblico di k1m1. Aggiungi un redirectRegex percorso su entrambi i punti d'ingresso (301, percorso/query conservato, Percorso di sfida ACME escluso:80) e seme entrambi gli host in auto-cert's STATIC DOMAINS così ottengono certs nonostante non sia un dominio org registrato, come sign.pink.
· kamo-internal
Select-all/deselect-all per il filtro di piombo degli stati, default a tutti
La dimensione degli stati del pannello pubblico della campagna e del grilletto filtro piombo non ha mostrato nulla controllato per impostazione predefinita, anche se un set elenco significa già "ogni stato" sul filo — lo stesso "nessuna restrizione" mercato convenzione/vendor/vendor-prodotto già uso. Questo ha fatto picker sembra che si stava filtrando a zero conduce piuttosto che a tutti, e non ha dato modo rapido di iniziare da "ogni stato" o "none" prima di prendere qualche mano. leadAudienceFilter.ts ottiene effettiviStati() (cosa mostrare controllato: il elenco memorizzato, o ogni stato quando non è impostato) e withStates() store back: il set completo crolla indefinito piuttosto che un esplicito elenco di cinquanta codici, quindi una pista con uno stato vuoto sul file corrisponde ancora "ogni stato" il modo in cui un'effettiva assenza di un filtro fa — un esplicito IN-list no). Entrambi i pannelli ottengono un "Seleziona tutto" / "Deselect all" coppia accanto al picker stati solo; le altre tre dimensioni sono invariato, dal momento che il loro inquadratura vuota per default era già corretto.
· kamo-internal
DKIM e DMARC passi, quindi e-mail che inviamo per un org è completamente autenticato
Due nuovi passi dopo la SPF esistente, scritta per un proprietario non tecnico lo stesso modo SpfCard è già — la lingua normale, una scatola "perché questo conta" e non chiediamo mai un cambiamento di cui non abbiamo realmente bisogno: - DkimCard: SecurityService genera una chiave di firma per il dominio il primo tempo che questo carica, poi legge se il record TXT è pubblicato. Solo due stati reali (niente ancora pubblicato, o qualcosa pubblicato che non match) dal momento che un record DKIM non può mai collidere con nulla il cliente già ha — a differenza di SPF, non c'è distinzione "add vs. edit" da fare. - DmarcCard: sola lettura. Perché la posta di Kamo usa sempre il dominio dell'org come sia il mittente di busta e visibile Da, il controllo di allineamento di DMARC è già soddisfatta una volta che SPF è fatto, qualunque sia la politica che ha scelto — così questo mostra solo ciò che è pubblicato (o suggerisce un punto di partenza), non chiede mai un cambiamento. Tutti e due. i proxy seguono spf/route.ts esistenti esattamente — nessun catch-all qui, quindi un percorso senza il proprio route file 404s prima di raggiungere SecurityService. DnsSetupStudio ora mostra 6 passi invece di 4; passo numerazione in tutto aggiornato sia per i casi di proprietà-token e no-ownership-token. Dipende da kamo-translation-dictionary 2f143f94 (il setup.dns.studio.dkim.* e setup.dns.studio.dmarc.* copia) e gli endpoint consultivi del servizio di sicurezza.
· EmailService
DKIM-firma la posta transazionale inviata come dominio di un org
Una volta che SecurityService conferma la pubblicazione del record DKIM di un dominio (org domains.dkim verified), reimpostazioni password, inviti e altri lettere transazionali inviate come NoReply@{org domain} ora portano un DKIM firma accanto all'autorizzazione SPF esistente — riutilizzando lo stesso DkimSigner campagna mail è già firmato con, non modificato. EmailSmtpService riceve un nuovo sovraccarico di invio(...) prendendo un MessageSigner, mirroring sendVia percorso firmato: saveChanges() una volta, firmare, quindi un trasporto manuale, dal momento che il Transport.send statico() utilizzato da ogni altro inviare() chiama saveChanges() di nuovo internamente e menta un nuovo Messaggio-ID dopo la firma è stato calcolato sopra il vecchio. The esistente 6-arg inviare(...) ora le delegati con un null signer, così ogni altro chiamante è byte-for-byte invariato. # Gates on dkim # (non solo una chiave esistente) e si applica solo quando siamo già inviare come dominio dell'org — mai sotto il dominio della piattaforma, e mai sulla piattaforma-indirizzo riprovare quando l'org 's proprio inviare fallisce. Dipende da Kamo-shared-library 5de57705 e DKIM del servizio di sicurezza endpoint consultivo, che genera e verifica la chiave che legge.
· SecurityService
DKIM e DMARC punti consultivi per /setup/dns
Aggiunge due endpoint a fianco del SPF esistente, quindi un org transazionale mail (password reset, inviti, notifiche) può portare una firma DKIM e il proprietario può vedere la loro postura DMARC: - GET /api/security/domains/{id}/dkim — genera il tasto DKIM di un dominio la prima volta che viene chiesto (mai rigenerato in seguito, da swapping il chiave sarebbe rompere la verifica di qualcosa già firmato con il vecchio), verifica se il record TXT è pubblicato e memorizza il verdetto La stessa forma a stato controllato. spf verified utilizza già. Solo per leggere. Ogni messaggio che Kamo invia come NoReply@{domain} utilizza quel dominio come mittente di buste e visibile Da, quindi il controllo di allineamento di DMARC è già soddisfatto una volta che SPF è fatto, qualunque sia la politica che il cliente ha scelto. Questo solo riporta ciò che è pubblicato (o suggerisce un record iniziale quando nulla è) — non chiede mai per un cambiamento, dal momento che non c'è mai un Kamo ha bisogno. Non e' vero. specchio SpfAdvisoryLa forma del Servizio (un'ispezione pura(), una cucitura di creazione Lookup() per i test) e DkimAuthorization Servizio mirrors SpfAuthorizationService (persiste il verdetto, lo lascia da solo su un ricerca fallita). DkimDomainRepository è un semplice JpaRepository allo stesso modo SpfDomainRepository è, per lo stesso motivo: spedisce con un redeploy piuttosto che un urto di versione condiviso-library. Dipende da kamo-shared-library 5de57705 (i nuovi campi dkim * di OrgDomain).
· kamo-shared-library
Campi chiave DKIM per posta transazionale di un dominio org
Addirittura... a org domains, specchiando la coppia spf verified/spf checked at già là — così un dominio può contenere un keypair DKIM generato e se il suo record TXT ha è stato confermato, la stessa forma a stato controllato SPF già utilizza.
· EmailService
Limitare il pubblico e i trigger di goccia di una campagna per mercato, fornitore, prodotto e stato
La scatola "All Leads" dell'editor di campagna e il filtro di piombo del grilletto del gocciolante potrebbero solo abbinare ogni piombo che il mittente può vedere, senza alcun modo per bersaglio un mercato, venditore, prodotto del fornitore o stato - la griglia /leads ha avuto tutti e quattro per settimane. - Nuovo LeadAudienceFilter E' il momento giusto. filettato attraverso la campagnaAudienceInput -> AudienceDefinition -> AudienceQueries.shape() Caso LEADS, che rispecchia i predicati di LeadGridSpecifications (il mercato possiede i lead direttamente o tramite un prodotto fornitore; lo stato è proprietà ipoteca-consapevole vs spedizione, cambia campo. /estimate e /browse prendere gli stessi quattro filtri come params query separati da virgole, quindi il conteggio live dell'editor riflette un non visto filtro anche. - TriggerConfig guadagna un campo stati accanto al mercato esistenteIds/vendorIds/ productIds; DripTriggerMatcher.leadFilter() lo controlla. Il percorso evento-payload mai portato venditore o stato, così lo stato viene risolto dal vivo per piombo (DripContatti. stateOfLead), lo stesso modo fornitore già era dal prodotto del fornitore. Ogni sito di chiamata 3/6/8-arg esistente continua a compilare invariato tramite aggiunto sovraccarichi e costruttori secondari; solo AudienceGatherer, che sempre filetta il filtro di una definizione attraverso, ha bisogno dei suoi siti di chiamata aggiornati.
· kamo-internal
# i filtri sulle piste della campagna # # e i trigger #
La fonte di pubblico "All lead" dell'editore della campagna non aveva modo di restringere che ha raggiunto oltre il campo di visibilità. Aggiunge un pannello filtrante (Market -> Vendor -> Cassetto del prodotto, più una dimensione dello Stato indipendente) che restringe il conteggio dal vivo, l'anteprima della navigazione e il pubblico salvato, filettato attraverso la campagnaAudienceApi preventivo / chiamate freccia. Il filtro del grilletto a goccia aveva già il Market/Vendor/Product cascata; aggiunge la stessa dimensione dello Stato là, accanto all'esistente tre, non-cascading.
· KlusterServices
L'host di computer di un org riceve un certificato e un percorso
computer è un alias standard ora — ogni white-label org è detto di puntare uno a Kamo su /setup/dns, il modo in cui indica incontrarsi e firmare — quindi due cose hanno dovuto seguirlo o record si risolverebbe e non fare nulla. Un CERTIFICATO. i computer si uniscono a SUBDOMAINS, che è l'elenco per-org di questo servizio problemi da. Senza di esso un host di org ha DNS e nessun TLS, che è un avviso del browser su il loro marchio piuttosto che una scrivania. Un errore. Il gateway abbinava Host(`computers.kamocrm.com`) e nient'altro, quindi un org potrebbe aggiungere il record, guardare lo studio di installazione girare verde e ancora atterrare da qualche parte che non è questa porta. Le nuove rotte utilizzano HostRegexp(`^computers[.].+$`), la stessa forma E il flusso. percorsi già utilizzati. SEPARATE IngressRoutes piuttosto che ampliare le regole esistenti, e la ragione è TLS. Le rotte della piattaforma portano un nome segreto esplicito, che è l'unico certificato che può essere chiamato prima del tempo; un inquilino arriva quando il loro dominio va in diretta. Ampliamento quelli regole avrebbero fatto una chiamata risposta segreta per ogni dominio inquilino — un certificato avvertimento sul marchio di qualcun altro, che è peggio di nessun percorso affatto perché sembra come Kamo ha sbagliato il loro dominio. Gli inquilini lasciano TLS al negozio di Traefik e SNI, come lo fa l'incontro, e sedersi a priorità inferiore in modo computer. kamocrm.com mantiene il proprio. Servire ogni org da un regex non porta nulla: la connessione è scelta dal token firmato, mai dal nome host, e un token mints un computer per un membro per una sessione.
· kamo-internal
I computer registrano nello studio DNS
Un'altra scheda su /setup/dns, quindi un org che configura il suo dominio viene raccontato sull'host i suoi computer ospitati aperti. Senza di esso un org potrebbe seguire la pagina alla lettera, finire con ogni carta verde, e ancora avere un computer che produce una scheda del browser che si apre e chiude — il collegamento è costruito da computer. host senza registrazione fallisce prima che qualsiasi richiesta lasci la macchina. Richiesto come ogni altra etichetta piuttosto che solo per org che tiene l'app. Il record è ciò che fa funzionare l'applicazione il giorno in cui è acceso, e un org inviato registrar mesi dopo per un record è un org il cui primo computer non si apre. L'etichetta deve corrispondere KnownAlias in securityservice esattamente — DomainAliasContractTest li pins, perché un'etichetta lo studio richiede ma verifica-dns mai emette uno status per non si riferisce come mancante: la ricerca signorina passa a "a pagamento" e la carta siede a "awaiting DNS" per sempre, qualsiasi cosa dica la zona del cliente.
· SecurityService
I computer sono un alias standard, e il collegamento utilizza il proprio org
Ogni white-label org indica un insieme fisso di etichette a Kamo e i computer non erano uno di loro, così un org potrebbe seguire /setup/dns alla lettera e ancora avere un Hosted Computer che nessuno poteva aprire. Il link è costruito da quell'host; un link ad un host senza record è una scheda del browser che si apre e si chiude prima che qualsiasi richiesta lasci la macchina, con nulla collegato ovunque in Kamo e il computer stesso sano e sveglio per tutto. Quattro liste si muovono insieme o non affatto. DomainAliasContractTest afferma esatto uguaglianza tra KnownAliases, SSL PROBE LABELS e il proprio specchio dello studio catalogo, perché il fallimento che sorvegliano è silenzioso: un'etichetta lo studio richiede ma verifica-dns non emette mai uno stato per cadute fino a "a pagamento", quindi la carta siede "aspettare DNS" per sempre, non importa quello che dice la zona del cliente. Questo è ciò è accaduto a `media` per quattro mesi nel 2026. Richiesto come ogni altra etichetta piuttosto che solo per org che tiene l'app. Il record è ciò che fa funzionare i computer ospitati il giorno in cui è acceso, e un org inviato il suo registrar mesi dopo, per un record, è un org il cui primo computer non Apri. IL LINK ORA UTILIZZA LA ORG's OWN HOST buildLink prende l'organizzazione e costruisce https://computers. OrgLinkHosts.liveRootDomain — lo stesso aiutante che il portale del mutuatario utilizza, e per stesso motivo: un dominio configurato ma non ancora verificato invierebbe un membro a un ospite che non si risolve. A differenza del portale del mutuatario, rientrare al gestore della piattaforma è CORRECT qui piuttosto che un collegamento rotto. Un gateway serve ogni inquilino e la macchina è scelta dal token firmato, mai dal nome host, quindi un org senza dominio dal vivo ottiene ancora un lavoro computer — si apre semplicemente sui computer. kamocrm.com fino a quando il suo dominio è vivo.
· SecurityService
Elenca solo i passi Iniziati di Ottenere un'organizzazione è chiesto
Un'organizzazione il cui modello di sicurezza fissa ogni risposta Compliance (no prodotto un membro può cambiare, una fascia di età per ogni tipo di membro) era ancora contato contro nove passi. Doveva "salvare" un nono passo vuoto prima del suo mago inciso come finito (riportato 2026-09-21, Gnosia). OrgSetupStepApplicability decide quali passi applicare, dal modello applicato. Oggi solo Compliance può scendere. I passi del riassunto, i passiCompletati e TotalSteps, the completedAt latch and lastStep run all over that list. A passo registrato prima di interrompere l'applicazione dei soggiorni memorizzati ma non è contato, quindi se il modello offre ancora una scelta. Se il modello non può essere letto, il passo è mostrato: un passo mostrato può essere saltato, un non si può raggiungere. La regola rispecchia il getComplianceStepUi di kamo-internal (che il passo disegna); entrambi sono fissati dalla stessa tabella caso. AppliedModelController ora legge le politiche di prodotto e l'età variano attraverso gli stessi aiutanti, quindi il punto finale e la regola non può allontanarsi.
· kamo-internal
Un passo che l'organizzazione non viene chiesto non è mostrato o contato
Un'organizzazione il cui modello di sicurezza fissa ogni risposta Compliance (no prodotto un membro può cambiare, una fascia di età per ogni tipo di membro) era ancora ha mostrato un nono passo dicendo che non c'era nulla da configurare. Doveva "salvare" quel passo prima del mago contato come finito (riportato 2026-09-21). SecurityService elenca ora solo i passi che un'organizzazione viene chiesto, e pagina segue quella lista: la rotaia, il conteggio "x of y", dove la procedura guidata riprende, che cosa viene dopo l'ultimo passo, e un `?step=` nominare un passo che non è elencato. Un payload senza lista utilizzabile legge ancora come ogni passo, quindi un risposta malformata non lascia mai un mago vuoto. complianceStepApplies.test.ts pins ottenereComplianceStepUi allo stesso caso tavolo come il servizio di sicurezza OrgSetupStepApplicabilityTest. Il server decide se il passo è elencato, e questa funzione decide che cosa disegna, così il due devono essere d'accordo.
· KlusterServices
Emissione e specchio del certificato per computer.kamocrm.com
L'apertura di un computer Hosted ha prodotto una scheda del browser che è apparso e scomparso. The link di lancio è corretto e così è il token: SecurityService costruisce ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** predefinito è quell'host. L'host non ha certificato e nessun record A, quindi la scheda muore prima che qualcosa in Kamo ne senta parlare — nessuna richiesta raggiunge Traefik, nulla è registrato, e il computer siede AWAKE e sano tutto il tempo. L'Hc-https IngressRoute fa riferimento già a nome tls-computers-kamocrm-com; segreto semplicemente non è mai stato coniato, perché questo servizio emette una lista esplicita e computer.kamocrm.com non era su di esso. desktop.kamocrm.com è elencato per esattamente stesso motivo — niente colpisce o host fino a quando qualcuno è consegnato un link, quindi né è mai scoperto dai registri di Traefik come un dominio inquilino è. Sperimentato anche in `hosted-computers`, perché la IngressRoute vive lì e fa riferimento al segreto per nome nel suo namespace. Questo mints NOTHING fino a quando il record A esiste. Il loop salta un host il cui DNS non risolvere, perché una sfida HTTP-01 contro di essa non può essere risposto: ⏭️ Skipping media.b11capital.com (DNS non si risolve; HTTP-01 fallisce) computer.kamocrm.com ha bisogno dello stesso record A di kamocrm.com e desktop.kamocrm.com, 47.181.8.84. Quella parte è al provider DNS, non qui. Una volta. risolve, questo problema all'interno di un loop e rispecchia il segreto senza ulteriori azioni.
· kamo-internal
La lista dei messaggi nomina un lead o un contatto, non il loro indirizzo
Una riga era guidata dal nome del mittente o dalla parte dell'indirizzo prima del @ quando non c'era nessuno, quindi un piombo che ha scritto in lettura come "jlrivera1984" sopra "jlrivera1984@mail.example". Il chip di intestazione già preferito il nome del nostro disco, ma la lista non ha mai chiesto. VirtualMessageList risolve ora i corrispondenti di ogni pagina caricata insieme i suoi avatar (una richiesta in batch, cache per indirizzo per la sessione) e testa la riga con il nome in registrazione: un collega, un contatto salvato, o - nuovo con EmailService d3d6e03 - un vantaggio. Il monogramma scrive lo stesso nome. La carta corrispondente etichetta un piombo "Lead" e offre "View lead".
· kamo-internal
La lista dei messaggi nomina un lead o un contatto, non il loro indirizzo
Una riga era guidata dal nome del mittente o dalla parte dell'indirizzo prima del @ quando non c'era nessuno, quindi un piombo che ha scritto in lettura come "rodarisdolgovanton" sopra "rodarisdolgovanton@gmail.com". Il chip di intestazione già preferito il nome del nostro disco, ma la lista non ha mai chiesto. VirtualMessageList risolve ora i corrispondenti di ogni pagina caricata insieme i suoi avatar (una richiesta in batch, cache per indirizzo per la sessione) e testa la riga con il nome in registrazione: un collega, un contatto salvato, o - nuovo con EmailService d3d6e03 - un vantaggio. Il monogramma scrive lo stesso nome. La carta corrispondente etichetta un piombo "Lead" e offre "View lead".
· EmailService
Un piombo che scrive è chiamato dal corrispondente risolutore
La mailbox list ha diretto un messaggio di piombo con la parte del loro indirizzo prima del @ ("jlrivera1984") quando il loro client di posta non ha inviato alcun display nome, anche se l'org li tiene come un piombo ("Jordan Rivera"). Il risolutore conosceva solo i colleghi e salvava i contatti. CorrespondentResolver ottiene un quarto livello, LEAD (dopo CONTACT), con il nome, azienda e leadId (una stringa: uids pass MAX SAFE INTEGER). LeadCorrespondents risponde solo ciò che la griglia di guida mostra il lettore: VIEW LEADS richiesto, un piombo non firmato ha bisogno di VIEW UNASSIGNED LEADS (Fiori) chiuso su prodotti free-for-all), nessun telefono (informazioni di contatto è pavimentato da diritti che questa carta non controlla), e ogni piombo chiamato è scritto a phi access log come LIST letto in un org PHI, via AudiencePhiAudit. porta non aveva indice sull'indirizzo: la ricerca ha camminato tutto ~790k del La guida del reporter in 9.8 s. ix leads org email lower su (org id HASH, più basso (trim(email)))) è in db/leads-email-lookup-index.sql e era APPLIED BY HAND come il proprietario prima di questa distribuzione; il piano generico ora prende 3.4 ms.
· EmailService
Un piombo che scrive è chiamato dal corrispondente risolutore
La mailbox list ha diretto un messaggio di piombo con la parte del loro indirizzo prima del @ ("rodarisdolgovanton") quando il loro client di posta non ha inviato alcun display nome, anche se l'org li tiene come un piombo ("Anton Dolgov"). Il risolutore conosceva solo i colleghi e salvava i contatti. CorrespondentResolver ottiene un quarto livello, LEAD (dopo CONTACT), con il nome, azienda e leadId (una stringa: uids pass MAX SAFE INTEGER). LeadCorrespondents risponde solo ciò che la griglia di guida mostra il lettore: VIEW LEADS richiesto, un piombo non firmato ha bisogno di VIEW UNASSIGNED LEADS (Fiori) chiuso su prodotti free-for-all), nessun telefono (informazioni di contatto è pavimentato da diritti che questa carta non controlla), e ogni piombo chiamato è scritto a phi access log come LIST letto in un org PHI, via AudiencePhiAudit. porta non aveva indice sull'indirizzo: la ricerca ha camminato tutto ~790k del La guida del reporter in 9.8 s. ix leads org email lower su (org id HASH, più basso (trim(email)))) è in db/leads-email-lookup-index.sql e era APPLIED BY HAND come il proprietario prima di questa distribuzione; il piano generico ora prende 3.4 ms.
· kamo-internal
Il membro che ha causato una notifica apre la loro carta da esso
"Dana Reyes ti ha trattato", "Weekly sync · Dana Reyes", una carta non letta con il corpo mittente: EmailService (29cb21e) ora invia attoreMemberId (come testo) e attoreName, il nome esattamente come il titolo o il corpo lo scrive, e la campana disegna quel tratto di testo come il nome del membro. - NotificazioneTesto taglia il nome dal titolo (l'esempio del corpo) una volta, al suo primo evento; tutto il resto legge esattamente come prima. Usato dal brindisi, la riga di storia (clickToggles={false}: la riga apre la notifica) e la finestra di dialogo dei dettagli. - La carta del brindisi si apre a livello del ponte. MemberHoverCard/MemberName prendere zIndex, e il brindisi passa NOTIFICATION DECK Z (1500, ora una costante con la propria piattaforma). Alla carta 1305 aperto sotto il ponte è venuto da; allo stesso livello si dipinge sopra di esso (è allegato a <body> in seguito) e ancora sotto i propri strumenti (appendice in seguito ancora). - UnreadChatNotifier manda il mittente come attore, mai per Exec2Exec. Il server mantiene anche un attore on /self solo dalla propria organizzazione del chiamante. - Spettacolo "Come costruito": il paragrafo delle notifiche. Verificato: tsc; eslint (niente su linee cambiate); le 19 guardie del repo; vitest (notificazioni, membri, lib, impostazioni, chat; i pochi che si sono allontanati sotto il carico della macchina passano da soli); e un Sonda cromata che il nome rimane in linea nel titolo a due righe del brindisi bloccato e la riga di storia Ellipsis regge ancora.
· kamo-shared-library
L'app Notes è "Notes & Checklists"
L'app Note detiene liste di controllo e dal 2026-09-23 (passi spuntati fuori come hanno fatto, un passo che aspetta fino ai passi prima che siano finito, una lista di controllo in programma sul calendario), e si chiama "Note e liste di controllo" ovunque si chiama. ServiceType.NOTES porta il nuovo nome di visualizzazione e una descrizione che copre entrambi, che è quello Apps & Caratteristiche, Tipi di ramo e la procedura guidata di creazione org mostra una volta SecurityService è ricostruita. Copia solo: il nome costante e id sono invariati, quindi nessuna sovvenzione memorizzata o caratteristica fila si muove. ServiceTypeCustomerCopia Perni di prova il nome e che il descrizione cita liste di controllo.
· MediaService
L'invito di Hold'em e il promemoria di riunione dicono chi sono da
MemberNotificationClient.raise acquisisce un sovraccarico che trasporta l'attoreMemberId/actorName (il id inviato come testo; la vecchia firma è invariata e non invia né). HoldemInviteMessenger passa il concessionario ("Dana Reyes ti ha trattato"); MeetingReminderSweep passa il creatore dell'incontro quando il titolo li nomina ("Weekly sync · Dana Reyes"), leggendo il creatore una volta piuttosto che all'interno del titolo(). EmailService mantiene il coppia e kamo-internal disegna quel nome come carta del membro. Un EmailService più vecchio dei campi li ignora. Test: HoldemInviteMessengerTest (+1; le sue verifiche di aumento prendono il nuovo sovraccarico), ReminderActorTest (2), ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************ Suite completa: 1060 run, 0 guasti.

Il tuo universo ti sta aspettando.
Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.
Gratis per sempre — nessuna carta di credito richiesta