Salta al contenuto
KAMOUniverse

Changelog

Cosa c'è di nuovo.

Ogni miglioramento alla piattaforma, come si spedisce.

  1. · kamo-internal

    Gli script dell'autore nelle impostazioni CRM, le leggono su una chiamata

    Due schede delle impostazioni CRM dietro MANAGE SALES SCRIPTS — gli script dal vivo e archivio — più una scheda Script di vendita nel Centro di interazione dietro VIEW SALES SCRIPTS, e un perno che mantiene aperto il Centro Interazione. Il Redentore è un TELEPROMPTER, non un DOCUMENTO. L'unica domanda che conta mentre qualcuno sta parlando con un cliente è "dove sono io", quindi una spina dorsale di progresso corre lungo lo stack del blocco e riempie come parti sono spuntate, la prossima parte non letta è sollevato a pieno contrasto mentre quelli letti recede, e ticcare uno scorrimento il accanto al posto. Uno script autenticamente è una sequenza di lettura superiore a fondo una volta, che è ciò che guadagna il trattamento sequenziale. Tutto il resto sulla superficie è Tenuto in silenzio in modo che una cosa possa portarla. Il compositore rispecchia la stessa spina dorsale, così un autore sta guardando la forma che l'agente vedrà piuttosto che a una forma che lo produce. Read-progress e il pin entrambi vivono in sessioneStorage: sopravvivono a un reload in la scheda in cui il membro sta lavorando, non li seguono in una seconda scheda di gestione una chiamata diversa, e sono andati a sign-out — app/logout già fa un commercio all'ingrosso sessionStorage.clear(), quindi non è necessario rilassarsi. Ogni accesso è avvolto, perché sessionStorage THROWS piuttosto che restituire null in un profilo indurito, e questo codice funziona dentro app-wide cromo. Il cancello di apertura di NavTop si allarga dall'accesso di chat da solo per chattare O script di vendita. Si'. ha dovuto: un agente CRM su un org senza l'applicazione Chat non poteva raggiungere Centro di interazione a tutti, quindi la scheda Script di vendita sarebbe stata invisibile a esattamente le persone per cui è. Ogni scheda all'interno porta ancora il proprio cancello. Il compositore prende il suo "niente cambiato ancora" baseline one macrotask dopo caricamento piuttosto che dai valori che ha seminato. Lexical ri-serializza un documento quando lo carica — equivalente JSON, raramente identico — in modo da confrontare contro La stringa del server riporta ogni script appena aperto come modificato e richiesto "Lasciare senza salvare?" sulla via di uno nessuno aveva toccato. I blocchi con né una voce né un testo vengono eliminati in salvo. Un autore che aggiunto uno e acceso non voleva pubblicare un passo vuoto, e il lettore renderebbe una casella di controllo contro nulla. Le due nuove carte di atterraggio si uniscono haActiveMarkets e canManageSalesScripts a le dipendenze della carta. Entrambi si stabiliscono in modo asincrono, quindi senza di loro il memo fu costruito mentre entrambi erano falsi e mai ricostruiti. Le quattro quote di mercato Le schede CRM sopra si basavano già su un'altra dipendenza che cambiava nel tempo; nominare haActiveMarkets li fissa in passaggio.

  2. · KBService

    Servire gli script un agente legge su una chiamata

    /api/kb/sales-scripts, cancelli sui due nuovi diritti. Leggi VIEW SALES SCRIPTS o MANAGE SALES SCRIPTS, scrive prendere MANAGE. SessionHelper.hasRight non si chiude, che è quello che ogni cancello in questo servizio dipende da. Qui piuttosto che in SecurityService perché APIService già inoltra /api/kb/** a questo servizio all'ingrosso, quindi la funzione non ha bisogno di modifiche gateway, e perché donotmodify.dao.repos è in questa applicazione @EnableJpaRepositories — il lead-market lookup di uno script ha bisogno di una query locale piuttosto che una chiamata cross-service. Il punto finale della lista restituisce i riassunti con un COUNT di blocco e nessun corpo di blocco. A elenco delle impostazioni di una dozzina di script non ha uso per una dozzina di documenti completi Lexical, e i conti provengono da una query raggruppata piuttosto che una per fila — la forma che ha reso /leads abbastanza lento da essere segnalato come un'interruzione. GET /mercati esiste in modo che il Centro Interazione possa disegnare i suoi sottotabs in uno Chiama. L'alternativa era prendere ogni mercato e ogni script e intersecandole nel browser: due viaggi rotondi e un carico di script corpi per rispondere a una domanda su ids.

  3. · kamo-shared-library

    Lo script che un membro legge su una chiamata, come blocchi ordinati

    Due tavoli e due diritti. SALES SCRIPTS blocca un mercato di piombo come un LeadVendor fa; SALES SCRIPT BLOCKS detiene le parti, ognuna delle quali è Lexical documento più il testo appiattito le anteprime e la stima di lettura-tempo letto. I blocchi sono righe piuttosto che un array JSON sullo script perché un blocco è id che cosa un membro di lettura-progresso è messo in chiave. Come array, la posizione sarebbe la solo l'identità disponibile, quindi un autore che inserisce un paragrafo vicino all'alto sarebbe silenziosamente spostare il posto di tutti nella sceneggiatura. Con ids stabili la parola può essere riscritti e i blocchi riordinati mentre ogni agente midcall mantiene il Le zecche che hanno già fatto, per questo motivo, sono state fatte. conserva l'ID di qualsiasi blocco il payload ancora nomi, e perché il test per esso è il primo nel file. Il risparmio è un REPLACE FULL: blocchi che trasportano un aggiornamento id sul posto, blocchi senza uno sono creati, e blocchi gli omit payload sono DELETED. Dichiarato sul DTO e coperto da un test, perché un chiamante presumendo altrimenti perde i dati con nulla da mostrare per esso — lo stesso contratto, e la stessa trappola, come sfondi / impegno. Omettendo `blocchi` interamente è il caso separato e sicuro che lascia che un rinominato li lasci soli. VIEW SALES SCRIPTS (300) è una radice: la lettura del campo non è implicita da nessuna altro diritto, meno di tutti i VIEW LEADS, dal tirocinante che impara lo script prima di essere consegnato un piombo è esattamente a chi è la sovvenzione. GESTIONE (301) appende l'autore non può essere concesso senza la capacità di leggere ciò che sta essendo autore, e richiamare la lettura prende la scrittura con esso. Entrambi ServiceType.CRM, che è ciò che li mette nel gruppo di sicurezza CRM — permessoGroupTree deriva gruppi da serviceType, quindi nessuna modifica di gruppo è necessaria e un diritto in nessun gruppo non poteva affatto essere concesso.

  4. · DocsService

    Riempire un rettangolo, onorare l'opacità di un punto culminante e redatta

    Tre cose sul modo in cui un documento preparato rende i segni del designer. Un rettangolo è stato disegnato come un contorno, quindi il riempimento un membro ora sceglie per coprire qualcosa su non è arrivato. Si riempie prima e colpi dopo, e solo se là è un confine a sinistra per disegnare — l'opacità appartiene al riempimento, non al confine intorno a esso. Un highlight ignorato l'opacità che il designer ha sempre salvato e dipinto ogni uno al 30%. E un rettangolo contrassegnato "rimuovere il testo sotto" ora ha il suo testo estratto da PdfRedactor piuttosto che semplicemente coperto. Questo funziona prima di tutto è disegnato, perché riscrive il flusso di contenuti della pagina. Le annotazioni anche andare avanti alle operazioni di pagina, che è una correzione nella propria a destra: un annotazione nomina la sua pagina per indice nel DESIGN, e applicaPageOperations cancella le pagine, così ogni indice passato un cancellato uno spostato. Un segno tratto dopo atterrato su qualsiasi pagina si era spostato in quella fessura — che per una scatola di reazione significa cancellare il testo nella pagina sbagliata e lasciare solo quello giusto.

  5. · ESigService

    Mettere le annotazioni del progettista nel documento firmato

    flatten() pagine vuote applicate, rotazioni, modificatori, valori di campo, ordine pagina e certificati. Non ha mai attirato le annotazioni. Un rettangolo, un punto forte o una freccia disegnato sopra un modello mostrato nel designer e nel browser del firmatario e allora non era semplicemente nel PDF che è stato consegnato. Per un punto culminante che è un fiore mancante. Per il rettangolo un membro disegna sopra un numero di conto bancario è l'opposto di quello che hanno chiesto, quindi tutti e cinque i tipi sono disegnati ora, dopo i valori del campo e prima dei filigrani che siedono sopra — l'ordine il progettista impila i suoi strati in. Un rettangolo contrassegnato "rimuovere il testo sotto" ha anche il suo testo eliminato, da PdfRedactor, prima di tutto è disegnato: redaction riscrive la pagina content stream, quindi un marchio timbrato prima sarebbe riscritto via con il testo Doveva sopravvivere. Né passa lancia — una reazione che fallisce non deve perdere una firma — e un fallimento è registrato per quello che è, che è il coperto le parole sono ancora nel file consegnato.

  6. · kamo-signer-monorepo

    Disegnare il riempimento di un rettangolo nella vista del firmatario

    Il designer ora può dare un rettangolo un riempimento e un'opacità, che è come un Il membro copre qualcosa. Questo renderer disegnava il riempimento="none", così il firmatario vide un schema vuoto in cui un blocco solido era destinato ad essere — e su un rettangolo rettangolare avrebbero visto subito quello che era stato tolto. Il riempimento porta l'opacità e il confine rimane solido: sbiadire un confine lungo con un blocco del 30% lo fa leggere come un errore piuttosto che una scelta. Un rettangolo con nessun riempimentoColore è il profilo ogni salvato prima che questo ancora disegna.

  7. · kamo-internal

    Rendere lo strumento rettangolo qualcosa che si può nascondere le cose con

    Lo strumento rettangolo è stato nella barra degli strumenti di annotazione per tutto il tempo, ma ha disegnato un profilo: riempire="none" in ogni rendering. Non c'era nulla con cui nascondere qualcosa. nessuna opacità, e nessun modo di toccare di nuovo una forma una volta che è stato disegnato — annotazione la selezione era il codice irraggiungibile, perché lo strato ha preso solo eventi puntatore mentre uno strumento di disegno è stato attivo e il gestore di clic ha funzionato solo mentre lo strumento selezionato Era. Quindi un rettangolo ora ha un riempimento, un'opacità, un confine che non può essere nulla, e un interruttore che dice che il testo sottostante deve essere rimosso piuttosto che coperto (il backend fa quella parte). Arriva come un blocco nero solido, perché copre qualcosa su è quello che la gente raggiunge per esso da fare; il profilo ogni rettangolo salvato prima che questo ha ancora è ciò che nessun riempimentoColor significa, quindi nessuno di loro cambia. Disegnare è o gesto: trascinarlo fuori, o fare clic una volta per ancorarlo e ancora per finire — una stampa che non va da nessuna parte usata per essere scartata come troppo piccola per mantenere, che è esattamente il gesto che ora inizia uno. La fuga lo abbandona. Una volta tirato è selezionato, con otto maniglie e un corpo trascinabile, utilizzando lo stesso bloccaggio e mappatura pagina-spazio come maniglie angolo di un campo in modo che i due si sentano simili. E perché un annotazione selezionata non aveva alcun posto dove andare, un pannello di proprietà vuoto utilizzato per scivolare; ora ne ha uno, con gli stessi controlli dopo il fatto. Strumenti a due punti prendono tutti il secondo gesto, non solo il rettangolo, e mette in evidenza anche le maniglie — sono la stessa scatola sotto.

  8. · kamo-shared-library

    PdfRedactor, così una parola coperta è effettivamente andato

    Un rettangolo riempito disegnato sopra un numero di conto lo nasconde dall'occhio e dall'occhio nient'altro: i glifi rimangono nel flusso di contenuti della pagina, e un copia-paste o un estrattore di testo li consegna dritto indietro. Il designer di esign sta per offrire "rimuovere il testo sotto" sul suo strumento rettangolo, e questo è ciò che deve essere per questo significa qualcosa. Ogni glifo dipinge una pagina viene misurato, e quelli che una regione copre sono calati dal flusso token e sostituito da un anticipo TJ della larghezza esattamente occupato — così il resto della linea non si muove e tutto il resto della pagina è scritto indietro intatto. Il testo dipinto da dentro una forma XObject non può essere raggiunto in quel modo, perché il il flusso di token di pagina non lo contiene. Così il lavoro è verificato dopo misurando di nuovo i glifi, e una pagina che ancora dipinge il testo all'interno di una regione è re-rendered come un'immagine. Quella pagina perde il suo testo ricercabile, che è un povero esito ed è collegato come uno — ma è l'unica delle due opzioni che è Non una perdita silenziosa. PDFBox è dichiarato facoltativo in modo da non raggiungere i servizi venti-dispari che mai aprire un PDF; i due che già dichiarano 3.0.3 se stessi.

  9. · kamo-internal

    Link agli articoli un progetto di nomi

    La convenzione di autore è di nominare un articolo di fratelli mettendo il suo titolo in italics — "Leggi *I ruoli di sicurezza spiegati* prima di costruirli". 181 campate attraverso i progetti lo fanno e nulla li ha mai trasformati in link, così un pubblicato articolo dice al lettore quale andare a leggere e poi li lascia a trovare E' cosi'. C'è esattamente un link Markdown in trecento articoli e punta fuori sede. Ha anche alimentato il bug KB-link che l'assistente aveva appena avuto. contentPlainText è ciò viene incorporato e ciò che l'assistente è mostrato, e un italico spogliato legge come prose, quindi la lista di controllo di configurazione ha raggiunto il modello nominando una dozzina di articoli senza modo di raggiungere qualsiasi di loro. Questo è custodito nel servizio AI ora, ma un riferimento che è un collegamento non ha bisogno di guardia. La risoluzione avviene all'importazione, contro la base di conoscenza pubblicata in, perché l'indirizzo è una guida e una guida appartiene ad una base di conoscenza piuttosto che ai progetti — scrivendoli nei file di contenuto legare l'aiuto centro a una singola organizzazione. Corre sull'albero convertito, dove un riferimento è già un nodo di testo italico che tiene esattamente il titolo, che mantiene markdown-to-lexical.mjs intoccato così gli altri trecento articoli non possono regresso. Solo una corrispondenza esatta del titolo è collegata, e gli italics fanno doppio dovere qui — 62 italic sono etichette UI, titoli di enfasi o domande e rimanere come sono. An il nome stesso dell'articolo non è un riferimento, il link di un autore vince sempre, e una seconda corsa è una no-op. Verificato contro la base di conoscenza dal vivo: 181 riferimenti, 119 distinti destinazioni, 110 articoli che guadagnano collegamenti, niente non risolto.

  10. · kamo-internal

    Una tassa di installazione su un preventivo a singolo prezzo, e la suite sulla propria linea

    La tassa di configurazione esisteva solo su preventivi multiopzione, quindi 'One price' non aveva scatola per uno — sul modulo o sulla pagina stampata. Ora siede accanto a Shipping, appare in il live rail e le stampe come la sua linea totale. È al di fuori dello sconto subtotale, specchiante QuoteTotals: una percentuale fuori la merce non è una percentuale dal costo di installarli. Un indirizzo è arrivato come una stringa a virgola, quindi 'Suite 400' è andato in strada e la città. L'unità è il suo campo ora e ottiene la propria linea, sotto strada — sul blocco destinatario della citazione, sui dettagli della lettera del venditore, e sulla carta di indirizzo di posta del piombo in modalità vista, che è dove la stessa l'indirizzo viene letto prima che raggiunga un preventivo.

  11. · InitializerService

    Commercio quotes.setup fee

    Una tassa di setup one-off su un preventivo che presenta un unico prezzo. La tassa già esisteva su QuoteOption, dove ogni alternativa porta la propria; un foglio piatto aveva nessuna opzione per appendere uno da, in modo che non poteva registrare una tassa di configurazione affatto. Nullable, così il COLUMN ADD è accettato su un tavolo popolato e ogni esistente citazione continua a significare cosa significa: nessuna colonna, nessuna tassa.

  12. · kamo-shared-library

    Una tassa di installazione su un preventivo a singolo prezzo, e la suite sulla propria linea

    Due cose che una citazione non potrebbe dichiarare. Una tassa di setup one-off viveva solo su QuoteOption, dove ogni alternativa porta la sua proprio. Un foglio piatto non ha alcuna possibilità di appendere uno da, in modo che non poteva registrare una configurazione tassa a tutti — citando uno significa cambiare l'intera citazione per confrontare le opzioni, che cambia come il documento legge per il cliente. Quote.setup fee è il equivalente a foglio piatto. Si trova fuori dal subtotale scontato deliberatamente: un percentuale fuori la merce non è una percentuale sul costo di installarli. Un indirizzo è stato assemblato in una stringa a virgola, quindi 'Suite 400' è entrato la strada e la città. Non è così che un indirizzo è scritto, e su una citazione è quello che un cliente dovrebbe inviare un assegno a. L'unità ora viaggia come sua proprio campo sia sul blocco clienti che sui dettagli dell'org, lasciando la pagina libero di dargli la propria linea. La colonna è nullable — ogni riga scritta prima che non abbia alcuna tassa, e mezzi null nessuno — quindi nessun valore di variazione di quota esistente.

  13. · kamo-signer-monorepo

    La suite sulla propria linea, e una tassa di installazione su un preventivo a singolo prezzo

    Due cose che la pagina stampata non poteva dire. Un indirizzo è arrivato come una stringa a virgola, quindi 'Suite 400' è andato in strada e la città — non come un indirizzo è scritto, e questa è la pagina un cliente si aspettava di inviare un assegno contro. L'unità ora viaggia come proprio campo e stampe sulla propria linea, sul blocco destinatario e sui dettagli del venditore. La tassa di configurazione esisteva solo su preventivi multi-opzione, quindi un preventivo a prezzo singolo potrebbe non si dichiara affatto uno; le modalità di commutazione per registrarlo cambiato come l'intero documento legge. Ora ha la sua linea totale, mostrata solo quando c'è uno.

  14. · InitializerService

    Reprice ha memorizzato quote totali attraverso il motore di prezzi

    Le colonne di denaro citate sono scritte, non calcolate su lettura, quindi le due correzioni che è atterrato il 2026-09-02 — un prezzo unitario è un tasso al mese il termine moltiplica, e un termine impegnato vale quello a cui si impegna — lasciare ogni riga esistente portare il vecchio aritmetico fino a quando qualcosa lo salva. Sulla citazione che ha esposto questo, un'opzione di tre anni ha memorizzato un mese di sé. Chiama QuoteService.reprice, lo stesso codice che prezzi un preventivo su salvare, piuttosto che implementare le regole del denaro in SQL. Un backfill con la sua copia di loro è una seconda fonte di verità e le due deriva il momento o è toccato. Le citazioni terminali sono segnalate, mai riscritte. Registrazione totale di un preventivo ACCEPTED che cosa un cliente ha accettato alla figura che sono stati mostrati; che la cifra può essere sbagliato, ma correggere qui ribadisce silenziosamente un documento firmato. Ogni connesso con il suo valore memorizzato e ricomputato per una persona a decidere. Idempotent, e ordinato tardi perché carica entità.

  15. · kamo-signer-monorepo

    Stampare la linea completa sul preventivo del cliente

    Ogni riga ha mostrato un nome e un importo. Che chiede al cliente di prendere il quantità, l'unità, il tasso e qualsiasi riduzione sulla fiducia, e non lascia loro nulla per verificare una fattura successiva. Le schede di opzione ora stampano le stesse colonne che il foglio piatto fa, e entrambi ottengono un Colonna di sconto: una riduzione concordata appartiene al documento che afferma l'accordo. Linee senza sconto mostrano un trattino piuttosto che un gap, quindi un la colonna di loro continua a leggere come deliberato. Corrisponde alla modifica dell'anteprima di stampa di kamo-internal, che esiste per proiettare questo pagina — i due sono utili solo per il personale mentre sono d'accordo.

  16. · kamo-internal

    Stampare la linea completa sul preventivo, e smettere di perdere lavoro al commutatore di modalità

    Due cose che una citazione non poteva fare. Gli elementi della linea stampati all'interno di una scheda di opzione hanno mostrato un nome e un importo, niente — nessuna quantità, nessuna etichetta unitaria, nessun tasso, nessun sconto. Che chiede al cliente di prendere tutti e quattro sulla fiducia e non lascia loro nulla per controllare una fattura contro. Opzione carte ora stampa le stesse colonne che il foglio piatto fa, e BOTH ottenere uno sconto colonna: una riduzione concordata deve essere visibile sul documento che afferma l'accordo. La commutazione tra 'Prezzo singolo' e 'Opzioni di conformità' ha portato il lavoro solo in un modo, e solo quando non esisteva alcuna opzione. Flipping attraverso e indietro quindi scartato qualsiasi cosa fosse stata digitata in qualsiasi vista fosse lasciata indietro. Le due modalità sono due vista della stessa prima cosa che viene venduto, quindi l'interruttore ora porta entrambi i modi; opzioni oltre i primi sono alternative e sono lasciati soli, dal momento che il foglio piatto non ha un posto dove tenerli. Il trasporto è due funzioni puri esportate piuttosto che la logica all'interno di un click handler, così il comportamento che era silenziosamente sbagliato è ora il comportamento in prova.

  17. · kamo-internal

    Ristampare un link di condivisione dalla sua riga e smettere di perdere l'URL una volta

    L'elenco dei link Condividi non ha offerto modo di visualizzare o copiare un link, e niente spiegato Perche'? Nulla può rivelare uno esistente — solo il token SHA-256 è memorizzato, quindi l'URL esiste nella risposta alla menta e nella casella di posta del cliente e altrove. La risposta dell'architettura ad un link perso è quella di mentarne un altro, che lascia la copia già inviata funzionante e revocabile indipendentemente; quella risposta non era raggiungibile dall'UI. Ogni riga ora lo trasporta: Copia un nuovo link mints silenziosamente e apre la finestra di dialogo copia, e dove i nomi delle righe un destinatario, Email un nuovo link lo invia anche. Entrambi passano un percorso doMint con la creazione della finestra di dialogo, quindi i tre non possono derivare. Una captazione sotto la lista afferma il vincolo invece di lasciare il lettore a caccia di un pulsante che non può esistere. Due piccole riparazioni alla stessa denuncia. La finestra di dialogo URL una volta è stata respinta facendo clic sullo sfondo e fuga — un clic randagio e il collegamento è stato irrecuperabile; esso ora chiude solo attraverso Done. E la risposta della menta è "emailed" mentre la richiesta è l'INTENT: chiedere un'e-mail e non ottenere uno reso lo stesso "Link creato." come mai chiedere. I due sono tracciati separatamente ora e un L'invio fallito lo dice.

  18. · RAGService

    Risolvere gli articoli un nome di passaggio in obiettivi di collegamento

    Un articolo hub — "Setting Up Your Organization — A Checklist" è uno — esiste inviare il lettore a una dozzina di altri, e nomina ciascuno di loro in testo normale. L'editor memorizza nodi di link, quindi i titoli sono tutti che raggiungono contentPlainText, che è ciò che viene incorporato e che cosa l'assistente è mostrato. Ricerca poi restituito quel passaggio con i sentieri di solo la manciata di articoli che abbinavano la query vettoriale, e l'assistente, ha detto di collegare quello che cites, mettere uno di quei percorsi su tutte le dodici raccomandazioni. La risposta di ricerca ora trasporta gli articoli collegabili: gli articoli quei passaggi nome, risolto a gengive, filtrato dallo stesso pubblico tiers la ricerca usi del filtro — un articolo che l'assistente può citare è uno che può collegare. Un titolo è abbinato solo quando è abbastanza specifico per significare un articolo. "Chat", "Leads" e "Notes" sono titoli di articolo qui anche e appaiono in prosa ordinaria costantemente, così la corrispondenza è limitata a titoli di tre parole e dodici caratteri, su confini di parole. Il catalogo è solo titoli e bandiere, mai i corpi @Lob, ed è cache per org — questo viene eseguito sul percorso di ricerca.

  19. · kamo-internal

    Chiedere se gli ospiti devono essere detto, e come

    Aggiungendo un ospite a un evento non gli ha detto, e la finestra di dialogo non ha mai detto così. The solo cosa che ha mai scritto a un ospite è stato un promemoria — che raggiunge un collega in-app e raggiunge un indirizzo esterno mai — così invitando un cliente a una riunione non ha contattato nessuno, e non c'era nessun controllo da nessuna parte. Una carta sotto la lista degli ospiti, a forma di privacy e promemoria lo carda siede tra: un interruttore e due chip di percorso sotto di esso. L'interruttore si accende quando il primo ospite arriva, una volta e mai più, perché l'aggiunta di qualcuno ad un incontrare e non averle detto è il risultato sorprendente — e tornare indietro off deve attaccare anche mentre altri ospiti sono ancora in fase di aggiunta. La linea di sintesi è la parte che guadagna la carta. Un ospite esterno non ha chat thread e nessun calendario Kamo; e-mail è l'unico percorso che li raggiunge ed è che trasporta il file del calendario. Interruttore e-mail via fili loro, e nient'altro nell'interfaccia lo direbbe. Spegnere l'ultima rotta spegne tutto piuttosto che lasciare un interruttore che sostiene di essere invitare le persone durante l'invio Niente. Nascosto per il callback di piombo, che possiede il proprio salvataggio in SecurityService: mailing a lead un invito di riunione per il momento che si intende chiamare loro non è cosa significa organizzare un callback. "Aggiornamento e notifica" va. Ha postato al punto finale di invito del compositore di posta, che nega il proprio evento e rifiuta qualsiasi il cui ORGANIZER EMAIL non è il mittente — una colonna nessun evento di calendario ha mai impostato — e ha inviato l'elenco degli ospiti come era quando la finestra di dialogo è aperta, quindi una modifica che ha aggiunto qualcuno notificato a tutti tranne loro. Non avrebbe mai potuto funzionare in ogni caso: è stato gated su partecipante. èOrganizzatore, che la sincronizzazione ospite del calendario scrive come falso per ogni riga. Salvare ora fa il lavoro.

  20. · InitializerService

    Le colonne che lasciano un evento invitano i suoi ospiti

    Tre su calendar events, perché se un incontro invita le persone appartiene al incontro piuttosto che al momento in cui è stato salvato — una modifica sei settimane dopo che aggiunge un ospite deve saperlo. Tutti i default per lasciare gli eventi esistenti silenzio: CalDAV, gli ics importatore e compositore di piombo-callback tutti scrivono attraverso lo stesso servizio e nessuno di loro offre questa scelta. Due su calendar event attendees, entrambi nullable, e null è il valore portante del carico: significa "mai detto", che è ciò che ogni riga esistente è e che ogni ospite aggiunto da una modifica successiva sarà. Un default su entrambi farebbe l'intera funzione silenziosamente non fare nulla. Applicato a mano al cluster, in quanto KamoInitializerService non viene distribuito.

  21. · EmailService

    Invia l'invito alla riunione la lista degli ospiti implicita

    Aggiungere qualcuno alla lista degli ospiti di un evento non gli ha detto. Solo un ricordo ha scritto a un ospite, e un promemoria raggiunge un membro in-app e un indirizzo esterno mai — quindi un cliente invitato ad una riunione non è mai stato contattato affatto, e un Il collega ne ha sentito parlare quindici minuti prima dell'inizio. EventInviteService viene eseguito dopo i commit di salvataggio, su un thread asinc. Dopo commettere perché un invito per una riunione il cui salvataggio poi rotolato indietro non può essere richiamato; fuori dal filo perché dopoCommit corre ancora prima della risposta è scritto, e cinquanta conversazioni SMTP ci sono cinquanta secondi di spinner su un salvataggio che già è riuscito. Due percorsi, e la differenza tra loro è il motivo per cui sono due controlli. Email l'unica cosa che può raggiungere un indirizzo di nessuno qui, e porta l'allegato ics — che è l'intero meccanismo con cui una riunione ha organizzato Kamo atterra sul calendario di un ospite esterno. Chat raggiunge un collega nel filo che hanno già con l'organizzatore, attraverso la stessa coppia MediaService AlertChatService utilizza, e salta un ospite esterno per costruzione: un thread di chat è tra due membri, quindi non c'è nessuno da affrontare. Chi è tenuto ciò che viene dalla fila degli ospiti piuttosto che da quello che il salvataggio inserito. Mai detto significa un invito, ogni volta che sono stati aggiunti. Dietro SEQUENCE significa un aggiornamento. Livello significa silenzio, quindi correggere un typo non e-mail la stanza. updateEvent solleva SEQUENCE solo quando la riunione si è spostata — la descrizione è deliberatamente fuori, perché è dove gli ordini del giorno vanno e spedire ogni ospite per linea si allenerebbe la stanza per ignorare la posta che dice che il tempo è cambiato. Il record è scritto dopo che un percorso ha successo, mai prima: marcatura ottimistica sarebbe trasformare un errore SMTP transitorio in un ospite permanentemente creduto di avere è stato detto, che è il silenzio che questo esiste per finire. Inoltre imposta ORGANIZER EMAIL, dalla casella di posta effettivamente inviato da. Nessun evento fatto attraverso il calendario ha mai portato uno, e un ics senza di esso non può essere ha risposto a — il "accetta" dell'ospite non ha indirizzo di andare a. Cancellare un evento che invitato la gente ora lo ritrae dagli ospiti che sono stati detto, e solo quelli.

  22. · kamo-shared-library

    Lasciare un evento invitare i suoi ospiti, e metterlo sul loro calendario

    Salvare un evento non ha detto a nessuno. La lista degli ospiti è stata materializzata e il pubblico e la gente su di esso non ha sentito nulla fino a quando un promemoria sparato — che raggiunge un membro in-app e raggiunge un indirizzo esterno mai. Quindi un membro potrebbe invitare un cliente a una riunione, guardare il nome appaiono nella lista degli ospiti, e la il cliente semplicemente non sarebbe mai stato detto. Neanche un ospite poteva vedere l'incontro. La visibilità è stata decisa dal proprio calendario solo, quindi un evento sul calendario dell'organizzatore era invisibile a tutti gli invitati. # Ha avuto un interruttore # in Calendario Preferenze e una colonna dietro di esso dal momento che lo schermo ha spedito, e nulla l'ha mai letto. L'evento ha la scelta — se invitare, e per e-mail, chat, o entrambi — perché una modifica sei settimane dopo che aggiunge un ospite deve sapere se questo è un incontro che invita le persone. La fila ospite porta quando è stato detto l'ultima volta e che SEQUENCE, che è ciò che rende "un ospite aggiunto più tardi riceve un invito lo stesso incontro" corretto su qualsiasi numero di modifiche: derivandolo da qualsiasi righe un salvataggio inserito è esattamente una volta. Visibilità guadagna un ramo invitato-ospite attraverso un esplicito JOIN sinistro, recintato che la preferenza tramite un membro id nulla può corrispondere. Una riga piuttosto che una copia per ospite: un RSVP, e un organizzatore che muove la riunione lo sposta per tutti. I JOIN LEFT sono portanti a carico — il calendario dell'organizzazione non ha proprietà membro, quindi un'espressione di percorso implicita cade ogni evento di società condivisa, trap findBusyForMember già documenti.

  23. · SecurityService

    L'indirizzo di un membro ti indica il suo org, non ogni org

    Un membro che si iscrive con la casella di posta contrassegnata Primary sul loro membro le impostazioni sono state offerte a ogni spazio di lavoro il loro account utente appartiene. The indirizzo esiste solo all'interno di un'organizzazione — mailbox sono unici su (org id, e-mail), non globalmente — quindi la firma con esso sta firmando in THERE. The altri spazi di lavoro dell'account rimangono raggiungibili dal nome utente o dal nome utente dell'account e-mail, che è a cosa serve un identificatore a livello di account. L'identificatore ora ha un campo di applicazione. Un identificatore di account lo lascia vuoto e nulla cambia; un indirizzo mailbox membro nomina l'org(s) è Primary in, e che il set è l'unica cosa che il sign-in può entrare. Limitare la lista che il raccoglitore disegna è cosmetico da solo: la scelta torna da un browser, e il membro di solito è un membro autentico dell'altro spazi di lavoro, quindi /session/select's membership re-proof passerebbe. La restrizione vive quindi nel token di selezione, in Redis, dove il chiamante non può raggiungere esso — e torna con il token quando un difetto transitorio lo restituisce, o una riprovazione si sarebbe allargato silenziosamente in un segnale-in non limitato. - PrimaryMailboxIdentityLookup: il lookup unscoped restituisce gli org ids con il id utente. Rifiuta ancora quando l'indirizzo nomina due conti diversi; uno il conto che lo tiene in due delle proprie offerte org sia, e nient'altro. - CredentialResult guadagna orgScope, significato vuoto senza restrizioni. - loginSenzaAResolvedHost filtri enterableOrgs da esso (solo mai rimuovendo, quindi un membro inattivo ancora cade fuori), rifiuta un ?org= accenno al di fuori di esso in le parole che una password sbagliata ottiene, e non più preimposta un ultimo org id l'indirizzo non può raggiungere. - OrgSelectTokenService memorizza userId:orgIds; un utente nudo id da un pod mid dispiegare ancora decodi, come non limitato. Una restrizione illeggibile fallisce chiuso. - SessionSelectController rifiuta un out-of-scope org 403 e non consegna il token back — questo non è un difetto che il membro non ha causato. Il percorso personalizzato-dominio è intatto: l'ospite già nomina un org.

  24. · SecurityService

    Fornire la visibilità della piattaforma, e lasciare che sia modificato

    GET/PUT /api/security/reports/catalogo, entrambi gated su MANAGE REPORTS sulla piattaforma spina dorsale. La lista proviene dalla REGISTRY, non dalla tabella di sovraccarico: un operatore deve essere in grado di limitare un rapporto che non ha ancora fila, che è ogni relazione fino a Qualcuno ne tocca uno. Il controllo stesso è andato in ReportScopeResolver.mayRun, che il catalogo, il corridore, i raccoglitori, l'esportatore, la lista di visualizzazione salvata e il programma spazzare tutto già cross. Aggiungerlo a ciascuno di loro invece sarebbe stato sei possibilità per uno di loro in disaccordo — e quello che non era d'accordo sarebbe quello che ha mostrato un riferire la piattaforma era nascosta. Si trova in FRONT dei diritti propri della relazione, e Dio non lo passa. Vetro di rottura allarga ciò che un membro può vedere all'interno della loro organizzazione; questa è una domanda su che le organizzazioni un rapporto esiste per tutti, e un dio in un inquilino è ancora in quell'inquilino. ReportVisibilityService fallisce OPEN, che è il contrario di tutto il resto qui e deliberato: un tavolo di override non leggibile farebbe altrimenti ogni relazione la piattaforma svanire, e i rapporti sottostanti sono ancora gated dai loro diritti e la loro portata a livello di riga. Perdere questa tabella costa una restrizione, non una divulgazione. Impostare ALL ORGS elimina la riga piuttosto che memorizzare il default. Un rapporto ristretto ferma i suoi programmi esistenti, e la corsa è registrata FAILED con "il proprietario del programma non ha più accesso" — lo stesso percorso di audit di rievocazione Qualcuno ha ragione, che sta accadendo la stessa cosa.

  25. · kamo-internal

    Decidi chi vede ogni rapporto, da Platform Administration

    Una scheda Report sulla console di configurazione, gated da MANAGE REPORTS sulla colonna vertebrale della piattaforma — che è anche, senza ulteriore lavoro, una fila nella gestione dei diritti finestra di dialogo, poiché questa finestra di dialogo rende il catalogo del server. Ogni relazione la piattaforma navi, raggruppate per cartella, ognuna con un controllo a tre vie: tutti gli org, l'organizzazione della piattaforma, o solo gli amministratori della piattaforma. Ogni riga mostra anche il diritto che un membro ha ancora bisogno, perché un operatore limita un rapporto dovrebbe essere in grado di vedere che è già recintato — la maggior parte non ha bisogno di nulla qui, e una console che nascondeva che invitava a limitare le cose due volte. Salva per fila, ottimisticamente. Un controllo a tre vie che aspetta un viaggio rotondo si sente rotto, e l'unico costo di sbagliare è il pulsante che scatta indietro con ragione. La copia è attenta a due porte che suonano allo stesso modo. Questo è quello esterno: dentro un'organizzazione un rapporto ha ancora bisogno del diritto di disciplinare i suoi dati, e le persone ancora vedi solo i registri a cui sono autorizzati. L'aiuto dice ad alta voce che limita un la relazione ferma qualsiasi programma già predisposto per esso — il comportamento corretto e il minimo conseguenze scopribili sullo schermo. Due cose il sistema di tipo e una guardia catturata piuttosto che recensione: RIGHT ICON è un esaustivo Record, così il nuovo diritto non poteva spedire senza un glifo; e la scheda aveva no Piattaforma Amministrazione menu link. Ogni altra scheda ha una, quindi la guardia ora richiede — una scheda raggiungibile solo da qualcuno che già conosce il tab strip è c'è una scheda che nessuno trova.

  26. · kamo-internal

    Dare la scelta di fatturazione citazione uno schermo su cui vivere

    L'impostazione a livello di org decide se un preventivo viene fatturato ogni periodo o in pieno sul fronte è esistito su OrgPOSConfig per qualche tempo, e il punto finale che scrive anche lui. L'unico componente che lo rende... è importato da nulla, quindi nessun membro è mai stato in grado di raggiungerlo: l'impostazione è stato configurabile solo a mano-posting all'API. Le impostazioni di commercio guadagnano una scheda di fatturazione Quote. Il pannello porta solo la fatturazione scelta; l'altra metà del componente orfano, il tipo di fidanzamento, è già servito da Markets & Fields in questa stessa pagina. La copia è letta dalla sua messaggio namespace piuttosto che duplicato, dal momento che è già tradotto. Saving invia i tipi di fidanzamento esattamente come letto — il endpoint tratta i ha permesso l'elenco come tutta la verità, così permettendo che avrebbe disabilitato ogni verticale il Org ha.

  27. · kamo-shared-library

    Lascia che la piattaforma decida chi può vedere ogni report

    MANAGE REPORTS, allegato a PlatformRightType, e una riga di override di REPORT CATALOG per rapporto che tiene uno di ALL ORGS, PLATFORM ORG ONLY o PLATFORM ADMIN ONLY. Questo è un cancello più grosso di tutto il resto nel quadro e si siede davanti di loro: un rapporto proprio richiestoRight decide che cosa un membro vede INSIDE un inquilino, e la portata a livello di riga si restringe ulteriormente. Questo decide se l'inquilino è offerto relazione, che è la decisione della piattaforma piuttosto che l'organizzazione. Sulla spina dorsale volutamente. Un amministratore inquilino può modificare il proprio modelli di sicurezza, quindi una RoleRightType qui permetterebbe a un cliente di ampliare un rapporto il la piattaforma era limitata. Le tre impostazioni sono condizioni INDEPENDENT, non una scala — una piattaforma admin dentro un inquilino soddisfa PLATFORM ADMIN ONLY e non PLATFORM ORG ONLY, e un membro della piattaforma org che non è un amministratore soddisfa il rovescio. Leggerli come una classifica sarebbe tranquillamente allargare uno dei due, e l'ampliamento sembrerebbe la funzione che funziona. Un rapporto senza fila è ALL ORGS, che è quello che ogni relazione fa oggi, quindi questo non cambia nulla dal vivo, e limitando un rapporto rimane un deliberato. Appendato alla fine dell'enum giusto perché getSortOrder() è ordinale(): un l'inserimento potrebbe numerare la console. Le sovvenzioni sono memorizzate per nome, quindi non cambia nulla già concesso.

  28. · kamo-signer-monorepo

    Mostra l'intero termine quando il venditore fattura davanti

    La carta ha portato con il tasso ricorrente indipendentemente, quindi un cliente firma un l'accordo di tre anni pagabile alla firma ha visto una cifra mensile e un totale separato sotto. Dove la citazione dice che il termine è dovuto davanti, che totale è ora il prezzo sulla carta e le sottolinee che lo ribadiscono sono calati. Legge una base mancante come per-periodo, quindi nulla cambia finché l'API non spedisce la campo.

  29. · kamo-internal

    Condurre con l'intero termine quando il disegno di legge è dovuto davanti

    Un org che addebita il termine commesso alla firma ha visto il tasso mensile sul suo proprie citazioni di tre anni. La citazione ora porta la base che è stata sollevata sotto, e la carta, la rotaia dal vivo e l'anteprima di stampa ogni piombo con la figura che — l'intero termine, etichettato «due davanti», o un periodo come prima. La scelta è un aiuto esportato, titoloAmount, piuttosto che lo stesso ternario in tre blocchi JSX: queste superfici non devono essere in grado di non essere in disaccordo su quali il numero è il prezzo. L'equivalente mensile rimane accanto a esso, perché è l'unica cifra su cui un triennio e un'opzione annuale confrontare. Reads undefined as the per-period default, in modo che questo renders esattamente come fa oggi fino a quando SecurityService spedisce il campo.

  30. · InitializerService

    Commercio quotes.billing basis

    L'istantanea perquota della citazione dell'orgConversione Scelta di fatturazione, quindi un preventivo mantiene i termini che è stato sollevato dopo che un amministratore cambia l'impostazione. Nullable — ogni riga esistente lo precede, e null si risolve a FIRST PERIOD PLUS SETUP, il comportamento di tali citazioni è stato inviato sotto. @Order(0) per il solito motivo: una volta condiviso-lib mappa la colonna, qualsiasi corridore che Il Quote lo emette nel suo SELECT, e una migrazione tardiva non viene mai eseguita.

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