Mergi la conținut
KAMOUniverse

Jurnal de schimbări

Ce e nou.

Fiecare îmbunătățire a platformei, pe măsură ce se livrează.

  1. · SecurityService

    Releu de autor condițional-LLPA

    Relee Post *************** prin intermediul org-tipărire scriere ajutor, așa un autor administrator condiţionează ajustări doar pentru chiriaşul lor.

  2. · kamo-internal

    Bulk-reassign selectat duce la un membru al echipei

    Reţeaua avea deja cutii multi-selectate, dar nimic de-a face cu o selecţie. Verificarea rândurilor dezvăluie acum o acțiune Reasign lângă celelalte acțiuni de plumb, poarta PE RESSIGN LEADS MANUAL (serverul o reverifică; aceasta este doar comoditatea). Folosește checkRight decât checkRole astfel modul lui Dumnezeu se potrivește cu backend-ul lui Dumnezeu bypass-ul de la Dialogul alege un membru destinație prin căutare, ia o notă opțională, și spune în avans că membrul va fi trimis prin e-mail, deoarece acesta este punctul de caracteristică. Indigo/albastru mai degrabă decât portocaliu fierbinte Reassign: aceasta este o acţiune deliberată în masă, nu un transfer urgent de apeluri. Căsuța de verificare antet selectează fiecare rând în grila de client-side org mare Altfel titlul Fluxul "selectează tot și reasignează" ar eșua server-side numai după ce utilizatorul a avut completat întregul dialog, cu o eroare netradusă. Selectia este eliminata prin IdsRef selectata inainte de reincarcare: incarcatori Reselectează orice ref deține, astfel încât lăsându-l populat ar reverifica Rândurile s-au mişcat. Mesajul rezultat este compus mai degrabă decât un alt lanț, deoarece un lot poate fi atât parțial, cât și nenotificată și lanțul raportat numai Primul.

  3. · SecurityService

    Criteriul final de evaluare a reatribuirii în vrac, cu poarta pe REASSIGN LEADS MANUAL

    POST ************* se mută un lot de piste către o echipă membru și e-mailuri că membru o dată pentru întregul lot. Autorization uses REASSSE LEADS MANUAL (149) Asta. Aceasta este mai strictă decât calea de un singur lider pe Put / conduce / {id}, care verifică ASsign LEADS; reatribuirea unei sute de piste este o rază de explozie diferită de la reatribuirea unuia, iar cele două drepturi există astfel încât să poată fi acordate separat. Nivelul de vizibilitate nealocată este aplicat şi aici. Atribuirea ESTE o vizibilitate Grant: o dată ce un plumb este atribuit apelantului se citește ca "atribuit mie," care ridică neatribuit-read 403 și sare masca contact-info. Fără asta Verificați un apelant care deține 149, dar nu A vizualiza UNASsignED LEADS ar putea auto-semna conduce Grila se ascunde de ei şi îi spală în cele care pot fi citite complet. A sărit leads report NOT FOUND nu pot enumera piste ascunse sau străine. Lotul nu este în mod deliberat toate-sau-nimic: fiecare AtribuireLead ruleaza în propria sa tranzacție și un ID rău devine un salt, deoarece aruncarea nouă bun Realocările peste zece este mai rău decât raportarea care nu a luat. Blocat la 250 pe apel pentru a lega ambele încuietori rând și în timp real fan-out. Notificatorul își rezolvă datele într-o tranzacție scurtă printr-o fasole separată și trimite după aceea, astfel încât un apel outbound cu un timeout de 30 de ani citit niciodată pini o Conexiune CRDB. Trecerea frontierei de fasole este, de asemenea, ceea ce face @Transactional se aplică la toate Asociaţia utilizatorilor LAZY ar arunca.

  4. · EmailService

    Variabilele eșantionului pentru modelul LEADES ASSIGNED

    Fără un caz aici admin șablon preview editorului redă noul șablon cu fiecare titular gol, care citește mai degrabă ca un șablon rupt decât un unul necompletat. noteBlock este pre-redare HTML, deoarece randatorul nu are condiţionează .

  5. · kamo-shared-library

    Șablon de e-mail LEADS ASsigned; Harden Atribuire pentru utilizarea în vrac

    atribuireaLead a avut zero apelanți și nu a rulat în producție. Înainte de cablare Reatribuirea în vrac calea către ea, oferă-i garanțiile de care are nevoie calea: - Ia orgId și verificați atât plumbul și noul asignat îi aparține, astfel încât o Reatribuirea nu poate ajunge la chiriași (raportat ca "negăsit" mai degrabă decât "interzis" astfel încât eroarea nu poate fi folosit pentru a testa ID-uri de plumb străin) - bloca randul cu findByuidForUpdate: o reatribuire manuala si o comparatie Pool-accept țintă aceeași pistă și s-ar intersecta altfel într-o pierdere actualizare - clar steagurile piscinei, oglindirea CreditLeadAsignmentService. O pistă marcată pentru auto-atribuire, altfel rămâne în piscină după ce a fost revendicat de mână și este eliminat de sub noul său proprietar - publică ruta de chat, ca updateLead deja face, astfel încât împrumutatul deschis live chat urmează conducerea în loc să stea cu ofițerul anterior Se adaugă, de asemenea, șablonul canonic LEADS ASSIGNED. Cheia trebuie să fie în CANONIC KEYS sau nu poate fi însămânțat și nu poate fi niciodată auto-vindecare, și fiecare trimite returnează un permanent 404.

  6. · kamo-shared-library

    Adaugă MANAGEMENT ORG BRANDING (174)

    Obiectivele de branding ale Org (logo-uri, culori, fundaluri, furnizarea de teme) au fost: numai proprietar-sau-zeu, lăsând nici o modalitate de a delega branding fără predarea proprietatea orgului. Adaugă dreptul delegabil; cecurile proprietarului rămân ca un grant implicit astfel încât proprietarii existenţi să continue să lucreze fără a li se atribui.

  7. · kamo-internal

    Matrici de eligibilitate pentru autor din panoul de catalog

    Fără o matrice care să acopere locul de muncă și scopul unui scenariu, prețurile se returnează NO CO Astfel, înainte de aceasta, doar achiziţionarea unei locuinţe primare ar putea fi scumpă. Forma autorilor matricea și celulele sale pentru un tip de limită ales, ocupare și scop, cu celula de adăugare/eliminare rânduri, alături de forma politică de blocare în același panou. Lăsând produsul unset autorilor o matrice per produs activ al investitorului, deoarece definiția produsului matricei nu este NULL și nu poate exprima "toate produsele" ca un singur rând.

  8. · SecurityService

    Reluare selectionation-matrix authoring; reconstruction picks up the SUSPENDED CV

    Relee Post ***************** prin scrisul existent de org-timbru ajutor, astfel încât un administrator autori matrici numai pentru chiriaș lor. Acest impuls reconstruiește, de asemenea, împotriva schimbării în comun-lib care permite reluarea unui împrumut SUSPENDED. kamo-împărtășit-library nu are nici CI propriile clone de serviciu și-l construiește de la sursă astfel încât fix ajunge la acest serviciu numai atunci când acest serviciu reconstruiește.

  9. · kamo-internal

    Reconstruieşte studioul ca spaţiu de lucru complet

    Îndepărtarea capacului de lățime nu a fost fixarea; aspectul în sine a trebuit să fie proiectat pentru spaţiu, mai degrabă decât tolerat în el. Studioul este acum trei zone una lângă alta: - ** Outline feroviar** (IntersectionObserver, top-pondered so a section became current when its header ajunge acolo unde este de fapt atenție). Secţiunile scrise manual sunt marcate, aşa că Partea scrisă de mână poate fi găsită mai târziu fără să-i deschidă pe toţi. - **Editor** vedereport deține în loc de o panglică îngustă. - ** Live conversation** dărâmă conţinutul când este deschis. Aceasta este bucla de editare și ceas studio există pentru: schimbarea unei instrucțiuni, vezi schimbarea răspunsului, fără a naviga. O instanță TestDrivePanel, repoziționate mai degrabă decât duplicate de montare l de două ori ar începe două sesiuni de aruncare. Mai jos xl ea scade sub editor ca un rând de lățime completă, mai degrabă decât stoarcere o a treia coloană pe un ecran fără cameră pentru unul, șina se ascunde în întregime pe ecrane mici.

  10. · kamo-internal

    Autor de blocare

    RateCommitmentService refuză o blocare ori de câte ori rezultatul la preț poartă nr LockPolicyVersionId ("Versiunea de blocare-politică este necesară"), și un rezultat poartă doar unul dacă investitorul are o versiune de politică de blocare publicată. Nici un UI nu ar putea publica unul, deci rata de blocare a fost imposibil de atins pentru fiecare chiriaş și superseding corect. Numai metoda client și acest formular lipseau. Formularul ia perioadele de blocare oferite ca o listă ordonată, deoarece primul devine implicit, astfel încât să nu le sorteze în mod deliberat; intrări care nu sunt un întreg pozitiv numărul de zile este scăzut mai degrabă decât trimis ca un termen de blocare proastă.

  11. · kamo-internal

    Arată cum fiecare agent face

    Adaugă o secțiune de performanță în partea de sus a studioului agent: conversații, cum de multe ori o persoană a preluat controlul și ceea ce a declanșat-o, rezultatele de informare și costurile. Scris astfel încât nici o cifră nu poate induce în eroare: - Zero redă cuvântul "nici unul," niciodată 0. - O parte redă doar atunci când există un numitor; altfel 'Nici o conversație încă pentru a compara împotriva." Nu există procente zero-denominator. - În cazul în care nimic din perioada transporta un preţ, nu se indică deloc valoarea costurilor - doar o explicaţie că preţurile au fost stabilite după ce s-a produs traficul. Parţial acoperire arată suma plus câte răspunsuri lipsesc din ea. - Informarea reprimata este prezentata ca caracteristica este: "Acestea sunt pastrate pe scop - ei sunt înregistrarea de ce cineva nu a fost contactat. " - Codurile enum necunoscute se degradează la text lizibil mai degrabă decât o cale de cheie brută. Au fost eliminate mesajele perversiune și coloanele handoff: API nu se agrega ele per versiune, astfel încât aceste celule ar fi transformat un 0 fabricat ca și cum au fost măsurate. Numai conversaţiile răspund pentru ce este masa - care a salvat Copie manipulat care trafic. pliat în documentul studio de defilare existent mai degrabă decât o filă nouă, și Nu era pe lista de agenţi, unde un 0 gol împotriva fiecărui agent ar fi exact Am înţeles greşit că am fost evitat.

  12. · AIService

    Carte de scor per agent

    Ceea ce fiecare agent a făcut de fapt: conversații, cât de des o persoană a trebuit să preia și de ce, rezultatele de informare, inclusiv cele reținut, și ceea ce costă. Fiecare număr este unul pe care datele îl pot susţine. Trei lucruri sunt în mod deliberat Nu aici: - **Nu sunt totaluri de jetoane.** Ele sunt reale pe calea de sincronizare și fabricate pe streaming one (content. length()/4), so any total is part invented. Răspunsul costurilor aceeași întrebare sincer, pentru că este nulă mai degrabă decât ghicit în cazul în care nu se cunoaşte preţul. - ** Nici o rezoluție sau rata de deformare.** Nimic nu observă dacă o conversație s-a terminat cu bine şi "nu s-a întâmplat nimic" nu este o dovadă de succes. - ** Nici un mesaj per-versiune sau număr de predare.** Acestea nu sunt agregate per versiune, și emiterea 0 pentru ei ar fi o fabricație redată ca o masurare - esecul precis acest ecran exista pentru a evita. Costul poartă un steag urmărit explicit și o sumă nulă mai degrabă decât 0 atunci când nimic în fereastra a fost pretul, astfel încât un org al cărui trafic predates tarifare vede "nu s-a înregistrat" în loc de $00. PretCalls este mai degrabă autoritatea decât suma, astfel încât un zero autentic de la apeluri la preț gratuit încă citește ca urmărit. Transcript prose is gated on view SALES AGENT TRANSCRIPTS separate from the contesa - rezumatul modelului unui anumit vizitator este continutul conversatiei, nu un metric. Agenţi fără trafic returnează un scor complet structural: un agent care lipseşte din listă citeşte ca un bug, un agent prezent cu zerouri citeşte ca adevărul. ParseHandoffArguments este acum împărtășit cu calea de chat mai degrabă decât repunerea în aplicare, Astfel încât constrângerea de motive inventate la ALTE nu pot deriva între cele două. Apartamentul este 150 de teste, verde.

  13. · kamo-shared-library

    Interogări agregate grupate pentru scorul agentului

    12 @ Query agregate peste sesiuni, mesaje, înregistrări de utilizare și outbound atinge, astfel încât o carte de scor este o mână de întrebări grupate mai degrabă decât rânduri de încărcare în memorie. Două proprietăţi sunt aplicate în predicate, mai degrabă decât lăsate apelanţilor: - E Sesiunile de testare sunt excluse în interogarea în sine.** Pe un tânăr agent propriile drive-uri de testare ale autorului altfel ar fi majoritatea datelor, și un apelant care uită să filtreze produce numere care par reale și nu sunt. - **contul (costEstimat) contează doar costurile non-NULL.** Asta este ceea ce permite scorecard distinge "nimic nu a fost preț" de la "cost zero" - colaps care ar pune un încrezător $0,00 în fața unui org al cărui trafic pur și simplu preced preţurile. Atingeri exterioare sunt grupate prin decizie mai degrabă decât filtrate pentru a trimite. ă Refuzurile sunt jumătatea mai interesantă: un agent ale cărui atingeri sunt aproape toate SUPRESSED QUIET HOURS este configurat greșit, iar acest lucru este invizibil dacă decodoarele sunt aruncat.

  14. · kamo-internal

    Editează costurile fiecărui model

    Adaugă editarea prețului per model pe ecranul de configurare al furnizorului. Prețurile sunt însămânțate din Fiecare vânzător a publicat un preţ pe listă unde îl ştim şi e gol unde nu... un cost necompletat pur și simplu nu este urmărit pentru acest model, care este mai bun decât un numărul care este cu încredere greșit. Copie spune oamenilor să verifice cifrele însămânțate împotriva propriului lor proiect de lege, mai degrabă decât prezentarea lor ca autoritate. Fixează un bug de afișare prins în recenzie: tapițerie traseing-zero ar fi făcut o prețul de 10 ca 1. Acum benzi zero numai după punctul zecimal.

  15. · AIService

    Catalog preț model, cale de scriere și backfill

    Contabilitatea costurilor nu ar putea funcționa: AiModel are coloane de preț, AiModelController le citește și ChatOrchestration Service le citește pentru a calcula costulEstimați - dar Nimic nu le-a scris nicăieri. Modelele sunt create doar prin descoperirea furnizorului și niciun furnizor API nu returnează prețurile. 140 de modele, 0 la preţ, nici o cale prin care s-ar putea schimba. Coloanele erau inaccesibile structural. Trei părţi: - ModelPricingCatalog Seminte vanzator List preturi la descoperire, potrivit pe o Identificator normalizat cu o regulă de prefix cratimă, astfel încât GPT-4 să nu poată niciodată Reclamă GPT-4o. Modelele non-chat (TTS, incadrari, in timp real) sunt respinse de refolosind cecul de modalitate existent - ei facturează o foaie diferită. - PATCH final + UI astfel încât o org poate corecta sau șterge un preț. Org-scoped exact ca DELETE existente. - Backfill umple numai coloane NULL, pe coloană independent, și niciodată suprascrie ceea ce un org a stabilit - altfel face prețurile editate ar fi o Minţi. Idempotent, și înfășurat astfel încât contabilitatea de costuri nu poate bloca boot. ** Un model pe care nu suntem încrezători cu privire la obține prețul NU mai degrabă decât unul ghicit.** GPT-5, o3, majoritatea Mistral, DeepSeek, xAI, Cohere și Meta sunt în mod deliberat goale; OpenRouter și HuggingFace nu se potrivesc niciodată prin design, deoarece factura propriile lor rate și moștenirea prețurilor în amonte ar fi o presupunere. Un preț greșit produce o cifra în formă de factură, care este în mod sigur greșit - același motiv costul este încă necalculat pe calea de streaming, în cazul în care numărul de jetoane sunt fabricate. Conversia la coloana pe 1k folosește RoundingMode. UNRECESAR: un preț nevoie de mai mult de 6 zecimale aruncă la clasa-minit mai degrabă decât stocarea în tăcere a motiv și este lăsat gol. Apartamentul are 145 de teste, verde.

  16. · kamo-internal

    Arată contextul de predare AI agentului preluarea

    Predă un eveniment al sistemului AI HANDOFF ca o carte cu motivul, rezumatul AI, și o transcriere colapsabilă a conversației până în prezent - astfel încât împrumutatul nu nu trebuie să se reexplice persoanei care răspunde. Cele trei stări degradate sunt explicite și vizibile mai degrabă decât tăcute: transcriere nu este disponibilă, transcrierea este trunchiată și sarcina utilă este demontată în tranzit. Un agent trebuie să Să nu fii lăsat să crezi că au un context complet atunci când nu o fac. Vizitator și agent împărtășesc un subiect STOMP, astfel încât cadrul live ajunge redactat ( Rezumatul AI este evaluarea sa privată a vizitatorului și nu poate merge la ei browser). În loc să-i spună agentului să reîncarce, cardul recită întregul rând o dată din propriul obiectiv autentificat. Recidiva este validată înainte de a fi adoptat - un răspuns care s-a întors nemişcat este respins mai degrabă decât utilizat; Astfel, avertismentul poate fi clar doar atunci când contextul a fost câștigat cu adevărat. Orice eșec Reîncarcă mesajul.

  17. · APIService

    Proxy ruta de predare a oamenilor AI->

    Adds POST *************** Proxied to MediaService alături de creaţia sa, sora SusportSession. Fara aceasta caracteristica de predare a fost mort la sosire: obiectivul MediaService hard-necesită X-Normal-Auth, X-Public-Chat-Org-Id și X-Public-Chat-Key-Hash, pe care doar această poartă o injectează, aşa că widget-ul e POST 404'd aici şi niciodată A ajuns. Poartă aceeaşi gardă condiţionată cu cea de susţinere. Rulează Handoff calea completă de creare a sesiunii, astfel încât proxying-l gol ar fi lăsat un ruta de creaţie a biletelor care ocoleşte dovada muncii pe care fratele ei o aplică.

  18. · MediaService

    Purtați conversația AI în firul uman pe predare

    Creează sau reutilizează sesiunea de suport, copiază transcrierea AI într-un singur sistem eveniment, trasee ea, și spune vizitatorilor sincer ce se întâmplă în continuare. Confidenţialitatea este împărţită de public, care prima trecere a fost inversată. ă Rezumatul AI și motivulDetaliu sunt evaluarea sa privată a vizitatorului, și sarcină utilă completă a fost ajunge la propriul browser vizitator prin două uși REST și cadru STOMP în timp ce agentul nu a văzut nimic. Redactarea se aplică acum la fiecare calea cu care se confruntă vizitatorii; rândul persistent păstrează sarcina utilă completă pentru agent. chat.session. cadru este tăiat la ceea ce poate vedea vizitatorul și agentul UI re-citește rândul complet din propriul obiectiv autentificat. Idempotența este tastat pe AiSessionGuid, org-scoped, și verificat ÎNAINTE de crearea Orice. Keying-l pe sesiune și verificarea după creare - evident forma - este inutil exact atunci când contează: o rejudecare care și-a pierdut sesiunea token trece întotdeauna cecul și produce un bilet duplicat și un al doilea agent pagina. S-a raportat acum ce s-a întâmplat. A venit înainte. adevărat chiar și atunci când scrisul a eșuat în tăcere, care este cel mai rău posibil Combinație: vizitatorului i se spune contextul lor a venit peste, firul agentului este gol, şi nici una nu ştie. Copy-on-handoff, nu migraţie: AI se transformă rămâne în cazul în care analiza le citește.

  19. · AIService

    Predarea unui agent către un om, cu context

    AI nu a putut cere anterior o persoană: regulile de escaladare au atins modelul prin intermediul prompt compilat, dar nu a existat nici un semnal de citit automat înapoi, astfel încât Modelul ar putea spune doar că ar aduce pe cineva și nu sa întâmplat nimic. - Synthetic kamo request human instrument, descris din propriul agent activat escaladarea titlurilor de regulă astfel încât modelul să vadă condiții identice de declanșare în prompt și instrumentul. Interceptat înainte de expediere MCP - este un semnal, nu un apel instrument real - și rândul TOOL ea persistă este ceea ce face motivul durabil şi analiză-gata cu zero coloane noi. - Ataşat DOAR atunci când canalul are activat suport live. Înmânarea unui Un instrument care promite unui om care nu poate ajunge este mai rău decât avand nici un instrument: widget-ul nu are nici o fila de suport, astfel încât semnalul este scăzut și Vizitatorul este lăsat să aştepte pe cineva care nu venea niciodată. - Noul obiectiv intern returnează motivul de predare, rezumatul AI pentru oricine preia controlul şi transcrierea UTILIZATOR/ASSISTANT. Rândurile TOOL și SISTEM Exclus - omul are nevoie de conversație, nu de mașini. - motivDetaliu și rezumat sunt reținute în mod deliberat din browserul vizitatorului: sunt evaluarea privată a vizitatorului modelului. Numai {solicitat, motiv} trece la client; MediaService aduce restul server-side. - Al transformă nu sunt niciodată mutate sau șterse. AiChatMessage rămâne sistemul de analiză De înregistrare; partea umană devine o copie. De asemenea, repara un bug latent găsit pe drum: blocul de unelte ignorat per-model SuporteToolUse pavilion, astfel încât un model marcat în mod explicit ca nu instrumente de sprijin a fost Încă le-a trimis. 31 din 140 de modele sunt marcate fals; ai mp server configs este O rază de explozie e zero. Apartamentul este 124 de teste, verde.

  20. · MediaService

    Acceptă implicarea unui agent autorizat într-un fir de împrumut deschis

    Dispeceratul de informare al omologului AIservice sună. Fără ea totul cale de ieșire încheiată într-o înregistrare 404 - poarta autorizat o atingere, Mesajul a fost compus, şi nu avea unde să-l pună. Proprietatea rămâne divizată în mod deliberat: AIservice decide dacă o atingere poate ieși Și scrie textul, acest serviciu îl plasează. Scrierea acestor rânduri de la AIService ar fi permis proprietatea asupra transcrierii către serviciul care nu deține nici chat-ul mesele, nici priza. Două lucruri pe care nu le va face. Ea nu creează niciodată o conversație - sensibilizarea poate relua un fir pe care vizitatorul l-a deschis deja, nu a invocat niciodată o fereastră de chat la cineva care Nu. Şi nu traversează niciodată orgile: un uid de plumb rezolva la biletul altei orgi ar pune un agent de orga în conversația altei orgi, astfel încât orga este Verificat împotriva biletului mai degrabă decât încredere de la apelant. Mesajul este atribuit membrului sesiunii, exact ca un mesaj vizitator este - NU la ofițerul uman atribuit. Retrimiterea unui mesaj AI ca Deşi un nume, o persoană licenţiată a scris că există o regulă de confidenţialitate a AI preveniţi. asiguraAbonamentul precede publicarea NATS deoarece consumatorul folosește DeliverPolicy. Nou: publicarea mai întâi ar persista mesajul, dar îl picătură de la fiecare client conectat. Description se referă mai degrabă la mesaj decât la fir. 404 atunci când nu există nici un fir deschis, Aşa că apelantul înregistrează un eşec curat în loc să-şi asume livrarea.

  21. · AIService

    Declanșatoare, programator și dispecerat de chat

    Face ca coloana vertebrală să tragă. Poarta, starea de contact, consimţământul şi Auditul a existat deja; nimic nu a cauzat o atingere care să fie evaluată. - NATS activat pentru AIService prin intermediul propriilor k8s/configmap.yaml (fiecare serviciu Java poartă propriul k8s dir; KlusterServices deține numai cluster infra). JetStream NatsConfig își afirmă propriul factor de replicare împotriva Fluxurile furnizate la nivel central la pornire și AIservice se abonează doar la bază NATS și publică nimic, astfel încât permițându-ar câștiga nimic și risca o secundă Serviciul care afirmă replica contează. - Agent OutboundConsumer subscrie securitate.leads.rt.> și consumă NUMAI LEAD CREAT/LEAD actualizat. Editorul emite, de asemenea, evenimente de blocare și statistici - ajunge la o persoană pentru că un coleg a luat o blocare de editare pe dosarul lor nu este defensiv. Ids sosesc ca siruri de caractere de la editor, astfel încât acestea sunt parsed ca text, mai degrabă decât atâta timp (). - AgentOutboundScheduler evaluează declanşarea programului sub patru limite: set org derivate din agenți care au de fapt o legătură pe (captat), o alunecare subțire timp felie astfel încât costurile pistele de noua rata de plumb, mai degrabă decât conduce total, un rând per-tic capac, și un amortizor de reevaluare astfel încât o trecere de plumb în timpul orelor liniștite este rejudecată o dată decât fiecare căpuşă pentru o zi. - Seminte de compozitie Complete cu versiunea publicata compilata prompt, Niciodată proiectul, plus intenția de declanșare. Înregistrările de eroare ale compoziţiei eşuate; Nu există nici un mesaj de rezervă. - Dispeceratul WEB CHAT continuă doar un fir existent. Outreach poate relua conversație deschisă vizitatorului; nu poate invoca o fereastră de chat la cineva care nu a deschis niciodată unul. - ruta SMS/EMAIL/SOCIAL DM către un sistem înregistrat de denumire a conformității lipsă instalații sanitare, astfel încât o org care indică un declanșator la SMS vede de ce în jurnalul de informare imediat în loc să nu se întâmple nimic. 23 teste noi; suita este 68 și verde.

  22. · kamo-internal

    Editor de text obligatoriu; setări generale dedupe AI; fixați comutația modelului

    Adaugă un editor pentru text de deschidere/închidere necesar la nivel de org - compilatorul și Coloanele au existat, dar nimic nu le-a putut stabili, astfel încât capacitatea a fost mort. Copiază afirmă în mod clar că agenții nu-l pot elimina și că economisirea se aplică la fiecare Agent imediat, și toast raportează cât de mulți agenți au fost republicate mai degrabă decât un "salvat," pentru că agenţii vii au schimbat ceea ce spun. Două microfoane preexistente găsite pe drum: - Comutatorul "Auto-selectează cel mai bun model disponibil" nu a funcţionat niciodată. Frontul citeste date.AutoSelectModel si trimite automatModelul Select, dar backend-ul revine si se așteaptă automatModelEnabled - astfel încât comuta întotdeauna redat adevărat și valoarea sa a fost aruncat pe fiecare salvare. Front-side fix; nici o schimbare server necesar. - AiGeneralSettings.tsx a fost cod mort, nu a importat, în timp ce un verbatim inline duplicatul a trăit în partea de jos a SecurityModelsTab.tsx. Mai degrabă decât punerea în aplicare textul solicitat de două ori, duplicatul se elimină și SecurityModelsTab importă componentă comună. De asemenea, înlocuiește vârful de ajutor de vânzări-agenți, care încă a spus utilizatorilor caracteristica a fost Vin în curând.

  23. · AIService

    Textul necesar pentru org persist

    AiOrgSettings câștigat forțatPreamble/forcedFooter și SalesAgentCompiler deja le pliază în fiecare agent, dar controlorul de setări nici citit, nici scris ei - astfel încât capacitatea a fost mort: o salvare a apărut pentru a reuși și sa întors gol pe reîncărcare. GET returnează acum ambele câmpuri (inclusiv în nesetări implicite) și Put le persistă, normalizând gol la nul astfel încât de compensare un câmp de fapt șterge în loc să lase un şir gol să fie pliat ca un separator rătăcit. Textul necesar intră acum în vigoare imediat, prin recompilarea şi recuzarea fiecare agent publicat în org. Lăsând să se aplice pe următoarea publicaţie a fiecărui agent a fost mai ieftin și este o capcană: un admin care adaugă "întotdeauna spun că sunteți un automat Asistentul va crede că este în direct, iar un agent nimeni nu se întâmplă să respingă ar continua să vorbească fără ea pe termen nelimitat. O linie necesară care face în tăcere nu se aplică este mai rău decât nu oferă unul. Fiecare agent afectat primește un nou salvat copii etichetate cu motivul, și rapoartele de răspuns cât de multe au fost republicate astfel UI pot spune ce sa întâmplat de fapt în loc de doar "salvat.".

  24. · kamo-internal

    Studioul Agenţilor de Vânzări AI pe toată pagina, înlocuind modalele

    Editorul agentului a fost un ~800px MUI Dialog a cărui suprafaţă a fost de 10 row textarea, pe fila AI care a folosit un dialog la toate. Este acum un dedicat ruta, iar modelul de editare din spatele ei este structurat mai degrabă decât o pată. - /setings/ai/sales-agents/new Cărți model (Cartea ESTE industria, deci nici o scădere a industriei), apoi două domenii: nume și o propoziţie despre afacere. Un agent de lucru în mai puțin de un minut. - /settings/ai/sales-agents/[id] antete secţiune, conţinut limitat la 880px astfel încât intrările mono-line nu sunt întinse pe un ecran 4K. No 240px nav feroviar: nouă secțiuni este un loc de muncă pergament-spion, nu o Nav job. - Try-it-out este un comutator antet mai degrabă decât o coloană permanent rezervat. An vedere de chat gol lângă un agent nou-nouț este spațiu pierdut care citește ca Eşecul utilizatorului de a-l umple. - Readiness este o listă ordonată, de respingere a ceea ce ar ajuta O fracţiune spune cuiva că eşuează; o listă le spune ce să facă în continuare. - Reguli incuiate fac incuiate si neremovabile, si luand o sectiune cu mana avertizează atunci când conține unul ( compilatorul le re-aplică acum indiferent). - Antetul afirmă clar că editarea afectează doar conversațiile NEW, deoarece prompt este instantaneu la crearea sesiunii și utilizatorii ar încheia altfel schimbarea lor nu a funcționat. - outboundEnabled este trimis doar atunci când este efectiv schimbat: serverul 403 întregul Plasați dacă câmpul este prezent fără MANAGE SALES AGENT OUTREACH, inclusiv Fiecare autosalvare ar distruge studioul pentru oricine nu are acest drept. De asemenea, elimină dublura "AI sistem prompt" cutie de pe canalul de chat Editor. A fost un al doilea loc, mai slab de autor același lucru, cu nu versiune, fără reguli blocate și nici o istorie Deschis a decis ce au auzit clienţii. Proviziile existente încă se rezolvă; canale Folosind unul acum obține o notificare îndreptată spre agenți. Copia nu poartă jargon AI prin design, iar matricea industrială hardcoded este înlocuit cu etichete traduse.

  25. · AIService

    Compilator de agenti de vanzari, versiune, poarta de informare; repara reluare instrument

    Agent structurat config compilații ale sistemului prompt, înghețări per publicat versiune, și câștigă poarta un agent trebuie să treacă înainte de a iniția contactul. Compilator - AgentConfig + SalesAgentCompiler: compilare pura, deterministica a structurii Se confiscă într-un prompt secţionat. Secţiunile goale sunt omise astfel încât o regulă de trei agentul nu compilează pe un document care este în mare parte intitulat. - Suprascriere la nivel de secţiune ("scrieţi această parte singur") mai degrabă decât un nivel de document switch-ul brut-edit: un autor devine putere expresivă completă pe o secțiune în timp ce fiecare alte secțiuni păstrează compilarea, păstrează regulile blocate și păstrează versiunea. - Acelaşi mecanism face migraţia octe-identică - proza unui agent pre-config este stocat ca un întreg document suprascrie și compilează înapoi neschimbate, astfel migrația Ziua este un no-op pentru agenții care vorbesc deja cu clienții. Dovedită prin test. - PhraseBank este în mod deliberat două dimensiuni, cu proza bună pe mal. O banca globala tastata pe fiecare combinatie enum are nevoie de ~90 paragrafe scrise manual, degenerate în clauze stivuite, și ar face fiecare org deschis cu aceeași Sentinţa - care distruge singurul lucru pe care o org îl cumpără. - Șase șabloane (front-desk și inbound-lead primul: sunt orizontale și acoperă orice org a cărui verticală nu este listată). Fiecare navă a blocat regulile de conformitate a modelul nu poate elimina, verificat prin încercare. Ciclul de viață + autorizarea - Publică înghețări {config, compilatPrompt, hash, model, furnizor}; rollback Repunctează și restabilește proiectul astfel încât studioul nu poate arăta un singur lucru în timp ce Agentul serveşte altul. - Controlorul are drepturi pentru prima dată. Anterior, Any autentificat membru al oricărui org ar putea rescrie ceea ce spune că org la clienții săi. Se retrage. la MANAGE AI SETTINGS astfel încât nici un admin existent nu este blocat pe implementare. - Public chat preferă versiunea publicată a înghețat prompt peste live trainingContext, si marci de vanzareAgentId/versiuneId pe sesiune - agentul a fost deja rezolvată acolo și a fost aruncată. - Al-asistent de redactare: o propoziţie în, reviewable configurat. Regulile sunt blocate. cărat în cod, nu a arătat niciodată modelului, astfel încât o linie de conformitate nu poate să fie șterse prin instrucțiuni ulterioare. Poarta de ieșire (toate cele 14 reguli testate) - Opt-out bate orice alt cec și este raportat ca motivul, deoarece motivul înregistrat împotriva unui refuz este el însuși dovada. - SMS fără consimţământ este refuzat: în cadrul TCPA sarcina probei este pe expeditor, astfel încât absența unui record este absența consimțământului. - Orele liniștite sunt judecate în cazul în care CONTACT este, nu în cazul în care afacerea este. - Expedierile eşuate nu cheltuiesc bugetul de atingere; trimiterile suprimate nu fac nici una, nici un singur bloc s-ar cascada în blocarea totul după ea. - Poarta eșuează ÎNCHIS - o poartă de informare care deschide erori trimite mesaje nimeni Autorizat, singurul eșec aici care nu poate fi anulată. Reparaţii găsite pe drum - Reluarea istoricului apelului instrumental a fost ruptă: rândul TOOL a persistat fără conținut și assistant tool use turn was never persisted, so turn 2 remised a null- content blocuri. Instrumentele de activare ar fi eşuat în fiecare conversaţie multi-turn. - textComplete nu a avut timeout (blocare .get(), fixarea unui fir pe un lent furnizor) și a înregistrat nici o utilizare, făcând fiecare apel ajutor invizibil pentru facturare. - Partitia de sistem in montaj context a fost neexploatata, deci un agent verbose plus un OAR Block ar putea aduna toată istoria. - costEstimate este acum populat pe calea de sincronizare numai, de la jetoane reale furnizor. Streamingul rămâne nul: el fabrică jetoane ca conținut. lungime()/4 și multiplicare că printr-un preț real produce un număr în formă de factură care este greșit.

  26. · kamo-shared-library

    Structured sales-agent config, version spine and outreach state

    Replaces the single training-context blob with a structured, versionable agent model, and adds the per-contact spine an agent needs before it may initiate contact rather than only reply. - SalesAgent gains configJson (jsonb-as-String, matching WebChatIntegration .designConfig), hasConfig, publishedVersionId, audience and outboundEnabled. trainingContext is retained as the COMPILED OUTPUT so every existing consumer keeps working untouched. hasConfig is explicit rather than inferred from trainingContext being blank, because once it is compiled output it is never blank and any blankness test would be unreachable. - SalesAgentVersion freezes {configJson, compiledPrompt, compiledHash, modelId, providerId} per publish. The model is pinned alongside the prompt: freezing instructions while the model auto-routes would make the artifact a half-truth. - AiChatSession/AiUsageRecord gain salesAgentId + salesAgentVersionId. Previously "which agent handled this?" could only be answered by walking the mutable, nullable, non-FK WebChatIntegration.salesAgentId hop, so reassigning a channel silently re-attributed all history. - AiOrgSettings gains forcedPreamble/forcedFooter as NEW nullable columns rather than reusing defaultSystemPrompt, so concatenation is a no-op until an admin fills one in. Reusing the existing field would have changed behaviour for every org that already had one populated, on deploy day. - AgentContactState + AgentOutboundTouch: per-contact cross-channel suppression, explicit per-channel opt-out columns and timestamped consent. Opt-out is stored as real columns rather than JSON because "prove this number was suppressed on that date" must not depend on JSON path extraction. The touch log records REFUSALS as well as sends - a log of sends proves what you did, a log of decisions proves what you would not do. - Rights 168-173 split **************** off MANAGE_AI_SETTINGS(53), which previously gated none of this.

  27. · kamo-internal

    AI Sales Agents tab + pe canal de misiune agent

    Construiește /settings/ai?tab=sales-agents (was a stub): orgs crea agenți pentru lor industria de vânzări, fie dintr-un model încorporat, fie scriind contextul formării ei înşişi, apoi le editează/se pot şterge. Canalele de chat (/setings/fetures/chat) pot acum alege fiecare agent care conduce Canalul lui AI, independent, agentul suprascrie prompt sistemul brut.

  28. · SecurityService

    Traseu de chat bogat împrumutat + captură subiect-property stat

    chat-routing întoarce acum NMLS ofițerului atribuit, titlu, fotografie, telefon, e-mail şi dacă acestea deţin o licenţă valabilă pentru statul supus proprietăţii, plus să se afirme și dacă mai trebuie să o cerem. Reutilizează cardul Safe-Act date rezolvate astfel încât chat-ul nu poate arăta o identitate fabricată. Adaugă Post /portal / subiect-stat: atunci când plumbul nu are încă stare de proprietate, împrumutat poate stabili de la chat; acesta curge prin patchEstimat (și atribuirea acestuia reintrare piscină) ca orice alt fapt pretins, care deblochează linia de licență.

  29. · MediaService

    Atribuiți un agent de vânzări pe canal + raport disponibilitatea LO

    - WebChatIntegration CRUD fire salesAgentId (null curăță atribuirea) - lo-prezență returnează acum disponibilitatea membrilorStatus alături de on-line, astfel încât widget poate arăta un statut real în loc de un punct gol. Sondele Cross-org încă se întoarce numai {online: fals}.

  30. · AIService

    Agent de vânzări CRUD, șablon ipotecar, și agent-condus chat prompt

    - AiSalesAgentController (/api/ai/sales-agents): org-scoped CRUD + GET /templates - SalesAgentTemplateRegistry: built-in starter templates, begining with a asistent ipotecar (conştient de conformitate: fără cotaţii obligatorii, nu promisiuni de aprobare, amâna la ofițerul de credit licențiat, solicită statul supus) - PublicAiChatService: training-ul agenţilor de vânzăriContext devine primul nivelul cascadei prompte (agent - > integrare prompt - > org - > generic)

Universul tău te așteaptă.

Începeți gratuit în câteva minute.Adăugați produse oricând sunteți pregătit — fără migrare, fără autentificări noi.

Gratuit pentru totdeauna — nu este necesar un card de credit