@xpert-ai/chatkit-ui 0.0.17 → 0.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/assets/{abap-Bwwc_1gv.js → abap-CabZ0vYL.js} +1 -1
- package/dist/app/assets/{abnf-B2dNcP9G.js → abnf-CPoubvVG.js} +1 -1
- package/dist/app/assets/{actionscript-CXHQ00sX.js → actionscript-CL1BPQFv.js} +1 -1
- package/dist/app/assets/{ada-CqG-JVlv.js → ada-BOt55oS4.js} +1 -1
- package/dist/app/assets/{agda-B17H_65R.js → agda-DKyUkxie.js} +1 -1
- package/dist/app/assets/{al-DZ1np1rt.js → al-Jnhqb7P-.js} +1 -1
- package/dist/app/assets/{antlr4-C8q5KPBn.js → antlr4-BeT3YbbK.js} +1 -1
- package/dist/app/assets/{apacheconf-ChkcfFbQ.js → apacheconf-Ck_DRZXY.js} +1 -1
- package/dist/app/assets/{apex-BH4E_dsM.js → apex-CPjbO0O4.js} +1 -1
- package/dist/app/assets/{apl-CrQcdvRs.js → apl-Ccs4_jOU.js} +1 -1
- package/dist/app/assets/{applescript-cM7xSTOK.js → applescript-C6i7vo8F.js} +1 -1
- package/dist/app/assets/{aql-CUr96LHI.js → aql-D3ZWY-VL.js} +1 -1
- package/dist/app/assets/{arduino-Cxfmugkq.js → arduino-xTj3TTXg.js} +1 -1
- package/dist/app/assets/{arff-BUd5n8om.js → arff-BOuVccGR.js} +1 -1
- package/dist/app/assets/{asciidoc-DXG-Il5x.js → asciidoc-BmShvnn0.js} +1 -1
- package/dist/app/assets/{asm6502-CGctLvPd.js → asm6502-6FWPK68i.js} +1 -1
- package/dist/app/assets/{asmatmel-D079kq0M.js → asmatmel-KLAd82QV.js} +1 -1
- package/dist/app/assets/{aspnet-8ExSjxvo.js → aspnet-vZiSZd1y.js} +1 -1
- package/dist/app/assets/{autohotkey-Dl4oXtIk.js → autohotkey-tcBDP1b7.js} +1 -1
- package/dist/app/assets/{autoit-C3CwtOjR.js → autoit-Bwt0tLM_.js} +1 -1
- package/dist/app/assets/{avisynth-Bx99tLxs.js → avisynth-Bzz43Lfu.js} +1 -1
- package/dist/app/assets/{avro-idl-C31XGLPW.js → avro-idl-Bt9aSyrD.js} +1 -1
- package/dist/app/assets/{bash-Bbt-WPbn.js → bash-BloO3C-T.js} +1 -1
- package/dist/app/assets/{basic-C61Emcak.js → basic-B-OOkRrw.js} +1 -1
- package/dist/app/assets/{batch-Djn-x2uB.js → batch-aOUu2msA.js} +1 -1
- package/dist/app/assets/{bbcode-CNJrjhuJ.js → bbcode-C4D8vm8O.js} +1 -1
- package/dist/app/assets/{bicep-CI5LT2Ae.js → bicep-BtBByAYv.js} +1 -1
- package/dist/app/assets/{birb-DbXUGjzd.js → birb-BKXLouTf.js} +1 -1
- package/dist/app/assets/{bison-DrTn1ufs.js → bison-CniuHJJN.js} +1 -1
- package/dist/app/assets/{bnf-IYAsThC7.js → bnf-CGcuZYv2.js} +1 -1
- package/dist/app/assets/{brainfuck-BP2_pLcy.js → brainfuck-C9dlh056.js} +1 -1
- package/dist/app/assets/{brightscript-DAQk2Wd6.js → brightscript-nhHFw9_4.js} +1 -1
- package/dist/app/assets/{bro-DLuKh1Ny.js → bro-BTsReVOc.js} +1 -1
- package/dist/app/assets/{bsl-kl73aWRB.js → bsl-CmOTwcFR.js} +1 -1
- package/dist/app/assets/{c-CIhTtviR.js → c-Yjfq4oES.js} +1 -1
- package/dist/app/assets/{cfscript-CbFVl9I3.js → cfscript-DGhYlgJ7.js} +1 -1
- package/dist/app/assets/{chaiscript-D-0nW1Dm.js → chaiscript-CpP8bBSU.js} +1 -1
- package/dist/app/assets/{cil-BDy_lgSO.js → cil-CZ7j4pcz.js} +1 -1
- package/dist/app/assets/{clike-CpJMZ32o.js → clike-D581thF2.js} +1 -1
- package/dist/app/assets/{clojure-DGR-MOcf.js → clojure-AXVmar0o.js} +1 -1
- package/dist/app/assets/{cmake-DN0Hfx1z.js → cmake-BozSSfax.js} +1 -1
- package/dist/app/assets/{cobol-CizJYTKX.js → cobol-OciN9vwY.js} +1 -1
- package/dist/app/assets/{coffeescript-R-3uLIaS.js → coffeescript-B9yMzVL5.js} +1 -1
- package/dist/app/assets/{concurnas-CQkxgZj4.js → concurnas-DeQIM64O.js} +1 -1
- package/dist/app/assets/{coq-DQgbmzEf.js → coq-CicPksao.js} +1 -1
- package/dist/app/assets/{core-DycsgPCm.js → core-BIcqXTaK.js} +1 -1
- package/dist/app/assets/{cpp-CWEafQ-5.js → cpp-DKQF7403.js} +1 -1
- package/dist/app/assets/{crystal-B99VfLZA.js → crystal-Bcau7QFZ.js} +1 -1
- package/dist/app/assets/{csharp-BpTiSprW.js → csharp-BYghYpTl.js} +1 -1
- package/dist/app/assets/{cshtml-Vijio5v4.js → cshtml-BIxIGrsH.js} +1 -1
- package/dist/app/assets/{csp-tvYUeGBl.js → csp-CzDOD-m1.js} +1 -1
- package/dist/app/assets/{css-DKouri6h.js → css-CPRwU6oY.js} +1 -1
- package/dist/app/assets/{css-extras-CBuI96HF.js → css-extras-C28yWYxN.js} +1 -1
- package/dist/app/assets/{csv-CwTWJ9fy.js → csv-D8IAZwKO.js} +1 -1
- package/dist/app/assets/{cypher-D88tClXE.js → cypher-0hMRBt8D.js} +1 -1
- package/dist/app/assets/{d-BWG0iTE-.js → d-B5PQgXXo.js} +1 -1
- package/dist/app/assets/{dart-CuUeEfkB.js → dart-CvCyf8me.js} +1 -1
- package/dist/app/assets/{dataweave-Y5qfzSJO.js → dataweave-Izl0xtz9.js} +1 -1
- package/dist/app/assets/{dax-z1vJoJqt.js → dax-D-bGAkbS.js} +1 -1
- package/dist/app/assets/{dhall-fDEBchRN.js → dhall-DXIOSM5Q.js} +1 -1
- package/dist/app/assets/{diff-DWMZ6ihZ.js → diff-BE-xKdIi.js} +1 -1
- package/dist/app/assets/{django-DCaIOARB.js → django-DxEZdkeU.js} +1 -1
- package/dist/app/assets/{dns-zone-file-BDhluMwF.js → dns-zone-file-D406E4S7.js} +1 -1
- package/dist/app/assets/{docker-ADTABOD7.js → docker-BZkb2U00.js} +1 -1
- package/dist/app/assets/{dot-dm0hRI_d.js → dot-BGJNVmx1.js} +1 -1
- package/dist/app/assets/{ebnf-qFQ8NGRa.js → ebnf-_PEATas2.js} +1 -1
- package/dist/app/assets/{editorconfig-M1PNmDB7.js → editorconfig-C1UuLwJC.js} +1 -1
- package/dist/app/assets/{eiffel-Bk5GVHNc.js → eiffel-PzXVtlzf.js} +1 -1
- package/dist/app/assets/{ejs-BXbi7DMO.js → ejs-707c0691.js} +1 -1
- package/dist/app/assets/{elixir-nt7_rP4L.js → elixir-Bd3zWMjP.js} +1 -1
- package/dist/app/assets/{elm-CDcRzvrq.js → elm-DvEDEOdK.js} +1 -1
- package/dist/app/assets/{erb-D3tcO__0.js → erb-B6lZT1P9.js} +1 -1
- package/dist/app/assets/{erlang-B4u--80w.js → erlang-BwhqRmQk.js} +1 -1
- package/dist/app/assets/{etlua-BnbSsaIV.js → etlua-Bkg93PrU.js} +1 -1
- package/dist/app/assets/{excel-formula-DLztFxwy.js → excel-formula-BD0I0dyD.js} +1 -1
- package/dist/app/assets/{factor-k_q8DU3n.js → factor-CiQgOsxY.js} +1 -1
- package/dist/app/assets/{false-EqgS-Tkv.js → false-DlJ-f_Rc.js} +1 -1
- package/dist/app/assets/{firestore-security-rules-BNeM0zmk.js → firestore-security-rules-CxrEhPSm.js} +1 -1
- package/dist/app/assets/{flow-C6rIqrD4.js → flow-DOjTBDi4.js} +1 -1
- package/dist/app/assets/{fortran-CtcKyblB.js → fortran-D6uA-pWI.js} +1 -1
- package/dist/app/assets/{fsharp-DvC6evnC.js → fsharp-CFL1DcvT.js} +1 -1
- package/dist/app/assets/{ftl-B_JlxDIr.js → ftl-DzWZwecM.js} +1 -1
- package/dist/app/assets/{gap-gLflRQGF.js → gap-DatQeRFY.js} +1 -1
- package/dist/app/assets/{gcode-CnfAyvEE.js → gcode-5FSxboIT.js} +1 -1
- package/dist/app/assets/{gdscript-EKerpVNS.js → gdscript-Dz-OC8bG.js} +1 -1
- package/dist/app/assets/{gedcom-Ad0m6Zc2.js → gedcom-BS0539Ys.js} +1 -1
- package/dist/app/assets/{gherkin-uCNN1ATX.js → gherkin-BJKrWYAT.js} +1 -1
- package/dist/app/assets/{git-Bjayw6ss.js → git-DCjIevVw.js} +1 -1
- package/dist/app/assets/{glsl-bHhLBW8P.js → glsl-toSXKJrw.js} +1 -1
- package/dist/app/assets/{gml-BQNjMX9m.js → gml-DODsSWU7.js} +1 -1
- package/dist/app/assets/{gn-AZpH8rMM.js → gn-CzmtMWMm.js} +1 -1
- package/dist/app/assets/{go-B04a4gPD.js → go-BCQUEKVv.js} +1 -1
- package/dist/app/assets/{go-module-B-KN1Mlr.js → go-module-BbcV-9oG.js} +1 -1
- package/dist/app/assets/{graphql-DHjSGdnz.js → graphql-C_KxCYJO.js} +1 -1
- package/dist/app/assets/{groovy-DEug64iA.js → groovy-Cj97iKYK.js} +1 -1
- package/dist/app/assets/{haml-Bz8MK1Hn.js → haml-tLXJGYDb.js} +1 -1
- package/dist/app/assets/{handlebars-r_hDn-yj.js → handlebars-DIdVe3xN.js} +1 -1
- package/dist/app/assets/{haskell-DhRqgzP_.js → haskell-DPqw5u4H.js} +1 -1
- package/dist/app/assets/{haxe-DQFQxvE_.js → haxe-AsnHNCIR.js} +1 -1
- package/dist/app/assets/{hcl-BKp5VAPU.js → hcl-C6aoWR34.js} +1 -1
- package/dist/app/assets/{hlsl-CghIWoQj.js → hlsl-B2hhU30-.js} +1 -1
- package/dist/app/assets/{hoon-Dm-fnZxk.js → hoon-Bs-KhWO3.js} +1 -1
- package/dist/app/assets/{hpkp-lkuwmSbZ.js → hpkp-C-J4O-Mp.js} +1 -1
- package/dist/app/assets/{hsts-Wd4KhVht.js → hsts-BNFEkSnm.js} +1 -1
- package/dist/app/assets/{http-CmfhFPEg.js → http-D7UlQANy.js} +1 -1
- package/dist/app/assets/{ichigojam-Dc2L55jh.js → ichigojam-B01TJ8BA.js} +1 -1
- package/dist/app/assets/{icon-DdCxyxIH.js → icon-Ca_ghvQd.js} +1 -1
- package/dist/app/assets/{icu-message-format-BQYI0sFj.js → icu-message-format-CkcsJ0ML.js} +1 -1
- package/dist/app/assets/{idris-C5tNclWm.js → idris-BApVxI9a.js} +1 -1
- package/dist/app/assets/{iecst-BKVUYIbF.js → iecst-CXLR8sGn.js} +1 -1
- package/dist/app/assets/{ignore-CfwJhNgR.js → ignore-7LzAeAFj.js} +1 -1
- package/dist/app/assets/{index-3k-bKyOc.js → index-BUg2yVDW.js} +99 -99
- package/dist/app/assets/{index-Ki_i49D-.css → index-om2E9pNd.css} +1 -1
- package/dist/app/assets/{inform7-Cdcod1ei.js → inform7-CtnRN-Iq.js} +1 -1
- package/dist/app/assets/{ini-C2cDeXd9.js → ini-Cjpl6yTL.js} +1 -1
- package/dist/app/assets/{io-DuXAvwXa.js → io-C6W_EboY.js} +1 -1
- package/dist/app/assets/{j-BYVASY6X.js → j-BOBDun2W.js} +1 -1
- package/dist/app/assets/{java-4VrDHvxX.js → java-CNwVyXY2.js} +1 -1
- package/dist/app/assets/{javadoc-CuF60fip.js → javadoc-DS6hxu7_.js} +1 -1
- package/dist/app/assets/{javadoclike-C44_Y4pE.js → javadoclike-J6YT11JS.js} +1 -1
- package/dist/app/assets/{javascript-DWYY3Hmb.js → javascript-IbEfuVSB.js} +1 -1
- package/dist/app/assets/{javastacktrace-C1VDqTgi.js → javastacktrace-DjxwGV26.js} +1 -1
- package/dist/app/assets/{jexl-DeQ9RUDn.js → jexl-TLHmHaQ5.js} +1 -1
- package/dist/app/assets/{jolie-BRudN8eg.js → jolie-CLk71kur.js} +1 -1
- package/dist/app/assets/{jq-CtXc1LOh.js → jq-DZKnIQZM.js} +1 -1
- package/dist/app/assets/{js-extras-CvvdpdSS.js → js-extras-CJab09ti.js} +1 -1
- package/dist/app/assets/{js-templates-M2G0Wqhr.js → js-templates-CQGqrHhi.js} +1 -1
- package/dist/app/assets/{jsdoc-Bu2t9JLm.js → jsdoc--ymvl4aq.js} +1 -1
- package/dist/app/assets/{json-Cq-mABJ1.js → json-D9b-V85G.js} +1 -1
- package/dist/app/assets/{json5-4HqEH5T5.js → json5-LgA47n7A.js} +1 -1
- package/dist/app/assets/{jsonp-BEtlh398.js → jsonp-Cvwp3f8M.js} +1 -1
- package/dist/app/assets/{jsstacktrace-Dx0Y7B74.js → jsstacktrace-z8t2H6h6.js} +1 -1
- package/dist/app/assets/{jsx-DsbRpy7E.js → jsx-B71LrwNd.js} +1 -1
- package/dist/app/assets/{julia-DcsLQWYM.js → julia-DCATdxwO.js} +1 -1
- package/dist/app/assets/{keepalived-Dv8pDJFo.js → keepalived-DVYYbgrL.js} +1 -1
- package/dist/app/assets/{keyman-Ci2jdsqC.js → keyman-DLyOXnhf.js} +1 -1
- package/dist/app/assets/{kotlin-SayKmA5u.js → kotlin-CYoDfyDA.js} +1 -1
- package/dist/app/assets/{kumir-DMWOjK8x.js → kumir-CPWiEvmL.js} +1 -1
- package/dist/app/assets/{kusto-aI0GRJrT.js → kusto-BkfRYk0W.js} +1 -1
- package/dist/app/assets/{latex-DTp_-VF9.js → latex-BEjZ0ppC.js} +1 -1
- package/dist/app/assets/{latte-LZMPGx1E.js → latte-DaZOqdGV.js} +1 -1
- package/dist/app/assets/{less-gB0H6bSD.js → less-BmKsj1gN.js} +1 -1
- package/dist/app/assets/{lilypond-F37QUedl.js → lilypond-mmng28aJ.js} +1 -1
- package/dist/app/assets/{liquid-D--Wm3ha.js → liquid-BuuJO6_6.js} +1 -1
- package/dist/app/assets/{lisp-DIM2rPYE.js → lisp-DnffFM5N.js} +1 -1
- package/dist/app/assets/{livescript-BXTz0GVS.js → livescript-BSsr00Wr.js} +1 -1
- package/dist/app/assets/{llvm-ao5q-dod.js → llvm-37YjcHN5.js} +1 -1
- package/dist/app/assets/{log-DSdp1PUj.js → log-D3l5N3To.js} +1 -1
- package/dist/app/assets/{lolcode-DTgLBwjE.js → lolcode-C0Q2M_6s.js} +1 -1
- package/dist/app/assets/{lua-D1IySTDW.js → lua-DcLwN4Tg.js} +1 -1
- package/dist/app/assets/{magma-By0NJTpR.js → magma-CK0Amip9.js} +1 -1
- package/dist/app/assets/{makefile-CGoRDnpf.js → makefile-CtpS-RoO.js} +1 -1
- package/dist/app/assets/{markdown-D1L-HQf5.js → markdown-BNK3F4ql.js} +1 -1
- package/dist/app/assets/{markup-raYrASfk.js → markup-C9GIL65H.js} +1 -1
- package/dist/app/assets/{markup-templating-CssRUGmY.js → markup-templating-Du1J3ADP.js} +1 -1
- package/dist/app/assets/{matlab-Bkpr6UVS.js → matlab-DEM6O1Ul.js} +1 -1
- package/dist/app/assets/{maxscript-BqOK2v7p.js → maxscript-DMvqa3gf.js} +1 -1
- package/dist/app/assets/{mel-CH03lWHq.js → mel-C8DBIw1g.js} +1 -1
- package/dist/app/assets/{mermaid-BN5SfVaW.js → mermaid-CVko6NSq.js} +1 -1
- package/dist/app/assets/{mizar-B5EFFzYR.js → mizar-CwYm3_It.js} +1 -1
- package/dist/app/assets/{mongodb-6kvQytJm.js → mongodb-DRqGwjq6.js} +1 -1
- package/dist/app/assets/{monkey-CrULcDcp.js → monkey-BxiKe6Nr.js} +1 -1
- package/dist/app/assets/{moonscript-BUk4hr1Y.js → moonscript-CJyt1xoM.js} +1 -1
- package/dist/app/assets/{n1ql-BD0zH2HW.js → n1ql-BBmjIGEU.js} +1 -1
- package/dist/app/assets/{n4js-BmHkGn_8.js → n4js-ByKsJMJL.js} +1 -1
- package/dist/app/assets/{nand2tetris-hdl-B8Jd5FCr.js → nand2tetris-hdl-BTSXj71h.js} +1 -1
- package/dist/app/assets/{naniscript-B6Iuqu44.js → naniscript-C4jykFVF.js} +1 -1
- package/dist/app/assets/{nasm-CenqrlGz.js → nasm-DPA0eXtX.js} +1 -1
- package/dist/app/assets/{neon-BlyFo4oH.js → neon-upN4Ak64.js} +1 -1
- package/dist/app/assets/{nevod-FI2_D4MV.js → nevod-CdttHB8F.js} +1 -1
- package/dist/app/assets/{nginx-vOnlcjjK.js → nginx-DI1fsQ3j.js} +1 -1
- package/dist/app/assets/{nim-BTBcND8I.js → nim-D7kc_mK9.js} +1 -1
- package/dist/app/assets/{nix-CxWC3x_A.js → nix-BUG5ppr9.js} +1 -1
- package/dist/app/assets/{nsis-DWRIAzZl.js → nsis-BnXhmmxO.js} +1 -1
- package/dist/app/assets/{objectivec-DnNYqiEV.js → objectivec-Bu4dOfb9.js} +1 -1
- package/dist/app/assets/{ocaml-MWcE4wPG.js → ocaml-aT7VVPiL.js} +1 -1
- package/dist/app/assets/{opencl-CEoyfv1f.js → opencl-BzyWcYkI.js} +1 -1
- package/dist/app/assets/{openqasm-B9J2Sj4l.js → openqasm-b2yFBJdq.js} +1 -1
- package/dist/app/assets/{oz-Q6fkizOZ.js → oz-D46TtIuw.js} +1 -1
- package/dist/app/assets/{parigp-qViHuHAI.js → parigp-BAJyhdut.js} +1 -1
- package/dist/app/assets/{parser-D1TDrUDK.js → parser-B-ALvauC.js} +1 -1
- package/dist/app/assets/{pascal-C_GcAzVz.js → pascal-B0ap4FDW.js} +1 -1
- package/dist/app/assets/{pascaligo-BGECHz22.js → pascaligo-ChOneu9-.js} +1 -1
- package/dist/app/assets/{pcaxis-5_0lQ0o8.js → pcaxis-DTAmxHgs.js} +1 -1
- package/dist/app/assets/{peoplecode-C-_cyguZ.js → peoplecode-dQfUy8zn.js} +1 -1
- package/dist/app/assets/{perl-Bhu_9hey.js → perl-CYk00e1Q.js} +1 -1
- package/dist/app/assets/{php-CUhDCFAS.js → php-DvSqFnSN.js} +1 -1
- package/dist/app/assets/{php-extras-DSKZN6SK.js → php-extras-BFjUbIU6.js} +1 -1
- package/dist/app/assets/{phpdoc-C1FLn7tF.js → phpdoc-Di7rKCNL.js} +1 -1
- package/dist/app/assets/{plsql-DMfpGYGl.js → plsql-dX0-BKqD.js} +1 -1
- package/dist/app/assets/{powerquery-BRhf1hs3.js → powerquery-3xq4KaAs.js} +1 -1
- package/dist/app/assets/{powershell-CRaHW94B.js → powershell-BbXooszO.js} +1 -1
- package/dist/app/assets/{processing-I8nRKQlO.js → processing-GWbfNCzH.js} +1 -1
- package/dist/app/assets/{prolog-FrUePJiK.js → prolog-Tb2TbunJ.js} +1 -1
- package/dist/app/assets/{promql-BvAq16Ge.js → promql-QS8vHhL7.js} +1 -1
- package/dist/app/assets/{properties-DbxGMSRW.js → properties-BJ8AWlqX.js} +1 -1
- package/dist/app/assets/{protobuf-DrIGvjWL.js → protobuf-De-puAg3.js} +1 -1
- package/dist/app/assets/{psl-0HKrjoj1.js → psl-hZft3C8K.js} +1 -1
- package/dist/app/assets/{pug-CxH9bsi7.js → pug-BcYHdk-i.js} +1 -1
- package/dist/app/assets/{puppet-DHgc1gZg.js → puppet-BWbqDQJD.js} +1 -1
- package/dist/app/assets/{pure-B0kLfpMx.js → pure-Bz2pjTxR.js} +1 -1
- package/dist/app/assets/{purebasic-Ca1sSC6z.js → purebasic-BlO48lYx.js} +1 -1
- package/dist/app/assets/{purescript-BQK7br_N.js → purescript-BxSMm2Br.js} +1 -1
- package/dist/app/assets/{q-DwDhLegJ.js → q-DDUTW9aK.js} +1 -1
- package/dist/app/assets/{qml-CtbldBP6.js → qml-DisOV-LV.js} +1 -1
- package/dist/app/assets/{qore-D3LZb6ma.js → qore-FNRP4gBF.js} +1 -1
- package/dist/app/assets/{qsharp-CiLCdqjv.js → qsharp-DhtMV0oO.js} +1 -1
- package/dist/app/assets/{r-Dilam18q.js → r-CyiuHjNN.js} +1 -1
- package/dist/app/assets/{racket-BBckdZP5.js → racket-DFgoSckH.js} +1 -1
- package/dist/app/assets/{reason-C20wa4Ng.js → reason-HhYbY7K3.js} +1 -1
- package/dist/app/assets/{regex-COQGBYpa.js → regex-jU5TpvM-.js} +1 -1
- package/dist/app/assets/{rego-pKEk3RLD.js → rego-BCjDPrQO.js} +1 -1
- package/dist/app/assets/{renpy-CDmk4rPI.js → renpy-BTSgQi2v.js} +1 -1
- package/dist/app/assets/{rest-Dl5zGTqN.js → rest-BLcZ4e-5.js} +1 -1
- package/dist/app/assets/{rip-Dn6GOHWS.js → rip-SltRJnuI.js} +1 -1
- package/dist/app/assets/{roboconf-BBJnM0BC.js → roboconf-B-GZm2Oe.js} +1 -1
- package/dist/app/assets/{robotframework-B3glKH4d.js → robotframework-BOt8S6cX.js} +1 -1
- package/dist/app/assets/{ruby-BQGh_6Rr.js → ruby-CVfYH0zM.js} +1 -1
- package/dist/app/assets/{rust-QlUGh2de.js → rust-B6mEp4Sj.js} +1 -1
- package/dist/app/assets/{sas-BDC68F8y.js → sas-DvEI8RJ0.js} +1 -1
- package/dist/app/assets/{sass-DieDF6XQ.js → sass-Cv25Jxqq.js} +1 -1
- package/dist/app/assets/{scala-D3MUhHYj.js → scala-CyqNr7Uv.js} +1 -1
- package/dist/app/assets/{scheme-BGgE-kqm.js → scheme-ji0XoXLf.js} +1 -1
- package/dist/app/assets/{scss--_H8DdDE.js → scss-B7_0neO_.js} +1 -1
- package/dist/app/assets/{shell-session-LGnbrToj.js → shell-session-CqZEoMQD.js} +1 -1
- package/dist/app/assets/{smali-CBlokkez.js → smali-DKSzZYkI.js} +1 -1
- package/dist/app/assets/{smalltalk-BbGkP-W2.js → smalltalk-BOA4piuq.js} +1 -1
- package/dist/app/assets/{smarty-HZnEokqM.js → smarty-Du99BSgN.js} +1 -1
- package/dist/app/assets/{sml-D3kN5fHv.js → sml-BJedIA4B.js} +1 -1
- package/dist/app/assets/{solidity-COzqk2SX.js → solidity-DidQwG5Z.js} +1 -1
- package/dist/app/assets/{solution-file-B_WMCfok.js → solution-file-Bx0d9qN8.js} +1 -1
- package/dist/app/assets/{soy-BnjJHZA_.js → soy-BBLv3Cfa.js} +1 -1
- package/dist/app/assets/{sparql-B5TBM1ys.js → sparql-Da5WZKbL.js} +1 -1
- package/dist/app/assets/{splunk-spl-B2w0z96G.js → splunk-spl-DbJKl8So.js} +1 -1
- package/dist/app/assets/{sqf-XPpbNZWG.js → sqf-CYrx0jxf.js} +1 -1
- package/dist/app/assets/{sql-BdoHQUvu.js → sql-Gv-aOlOf.js} +1 -1
- package/dist/app/assets/{squirrel-C7PSbqa8.js → squirrel-FpIGPPw4.js} +1 -1
- package/dist/app/assets/{stan-j2SrNXay.js → stan-Dq001Nrk.js} +1 -1
- package/dist/app/assets/{stylus-B4ESB7LK.js → stylus-aatfgWwe.js} +1 -1
- package/dist/app/assets/{swift-0REuIxse.js → swift-pn7VW95d.js} +1 -1
- package/dist/app/assets/{systemd-C-jON-S5.js → systemd-9capsVJ6.js} +1 -1
- package/dist/app/assets/{t4-cs-73fI4ZnY.js → t4-cs-CKXcczci.js} +1 -1
- package/dist/app/assets/{t4-templating-B7K5zZjl.js → t4-templating-1wTayb8u.js} +1 -1
- package/dist/app/assets/{t4-vb-nmeCn59t.js → t4-vb-B_O7wBow.js} +1 -1
- package/dist/app/assets/{tap-CC3qoO-h.js → tap-D-TV5_gQ.js} +1 -1
- package/dist/app/assets/{tcl-CXW6dWdJ.js → tcl-BaVob1Om.js} +1 -1
- package/dist/app/assets/{textile-CcZgymJI.js → textile-COMk-HmI.js} +1 -1
- package/dist/app/assets/{toml-Bt-KwXSX.js → toml-D9NJpArC.js} +1 -1
- package/dist/app/assets/{tremor-CfkeSZOn.js → tremor-rCNHwdQL.js} +1 -1
- package/dist/app/assets/{tt2-VjO-nd3t.js → tt2-DTDvfOgc.js} +1 -1
- package/dist/app/assets/{turtle-C7lex_1P.js → turtle-D8pkqXh1.js} +1 -1
- package/dist/app/assets/{twig-ydMCwYBK.js → twig-DxSF8gqH.js} +1 -1
- package/dist/app/assets/{typescript-BgbE9enz.js → typescript-Caebatmk.js} +1 -1
- package/dist/app/assets/{typoscript-mPjPihGb.js → typoscript-B3uk1kES.js} +1 -1
- package/dist/app/assets/{unrealscript-B1h3FIp7.js → unrealscript-ZNoSG8ji.js} +1 -1
- package/dist/app/assets/{uorazor-BixEY3TF.js → uorazor-LekoNNOo.js} +1 -1
- package/dist/app/assets/{uri-a9CNoVTl.js → uri-B8YcIzOv.js} +1 -1
- package/dist/app/assets/{v-Bun8Oo4V.js → v-6rOne2a0.js} +1 -1
- package/dist/app/assets/{vala-Yh7IL00A.js → vala-CjEJEdsP.js} +1 -1
- package/dist/app/assets/{vbnet-D1bws4TN.js → vbnet-DBPmBm7_.js} +1 -1
- package/dist/app/assets/{velocity-BTBe_YdS.js → velocity-DOooMwL8.js} +1 -1
- package/dist/app/assets/{verilog-CZb0BmwQ.js → verilog-Cq0ZocvP.js} +1 -1
- package/dist/app/assets/{vhdl-GveK8MNv.js → vhdl-Dxs_xidb.js} +1 -1
- package/dist/app/assets/{vim-BFnGQW9p.js → vim-BqsnXwB6.js} +1 -1
- package/dist/app/assets/{visual-basic-C6IoFdCy.js → visual-basic-zAzjvaqP.js} +1 -1
- package/dist/app/assets/{warpscript-BhRK7JpJ.js → warpscript-D9hbfr6_.js} +1 -1
- package/dist/app/assets/{wasm-BPlRsQZE.js → wasm-C4TU9VDY.js} +1 -1
- package/dist/app/assets/{web-idl-DsR59OqK.js → web-idl-DD5JcddQ.js} +1 -1
- package/dist/app/assets/{wiki-CqKbsRaB.js → wiki-Des21yVK.js} +1 -1
- package/dist/app/assets/{wolfram-DBwl_BKC.js → wolfram-B7enpov1.js} +1 -1
- package/dist/app/assets/{wren-BiiMWCe5.js → wren-Rr8h-Ayu.js} +1 -1
- package/dist/app/assets/{xeora-BAHjHPpy.js → xeora-EjcLXBhx.js} +1 -1
- package/dist/app/assets/{xml-doc-C7XMC-Tu.js → xml-doc-uaTxx6-m.js} +1 -1
- package/dist/app/assets/{xojo-B8_jJVJy.js → xojo-CX6G8nhh.js} +1 -1
- package/dist/app/assets/{xquery-C4b31bTA.js → xquery-DvPb3Uw9.js} +1 -1
- package/dist/app/assets/{yaml-BZKzmGBJ.js → yaml-D-l_Y2hx.js} +1 -1
- package/dist/app/assets/{yang-Bbsnlksx.js → yang-KBoIIT4_.js} +1 -1
- package/dist/app/assets/{zig-BnOm7PBz.js → zig-_uNXp9cY.js} +1 -1
- package/dist/app/index.html +2 -2
- package/dist/index.cjs +391 -224
- package/dist/index.d.cts +24 -1
- package/dist/index.d.ts +24 -1
- package/dist/index.js +387 -224
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/components/chat.tsx
|
|
2
|
-
import * as
|
|
2
|
+
import * as React20 from "react";
|
|
3
3
|
import { ArrowDown, FileText as FileText2, Loader2 as Loader22, Pencil as Pencil3, RefreshCw as RefreshCw2, X as X2 } from "lucide-react";
|
|
4
4
|
|
|
5
5
|
// src/lib/utils.ts
|
|
@@ -8,19 +8,14 @@ import { twMerge } from "tailwind-merge";
|
|
|
8
8
|
function cn(...inputs) {
|
|
9
9
|
return twMerge(clsx(inputs));
|
|
10
10
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
case "sharp":
|
|
20
|
-
return "rounded-none";
|
|
21
|
-
default:
|
|
22
|
-
return "rounded-full";
|
|
23
|
-
}
|
|
11
|
+
var THEME_RADIUS_PRESET_CLASS = {
|
|
12
|
+
pill: "rounded-full",
|
|
13
|
+
round: "rounded-xl",
|
|
14
|
+
soft: "rounded-lg",
|
|
15
|
+
sharp: "rounded-none"
|
|
16
|
+
};
|
|
17
|
+
function getRoundedClass(themeRadius, fallback = "rounded-full") {
|
|
18
|
+
return themeRadius ? THEME_RADIUS_PRESET_CLASS[themeRadius] : fallback;
|
|
24
19
|
}
|
|
25
20
|
function createMessageId() {
|
|
26
21
|
return globalThis.crypto?.randomUUID?.() ?? `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
|
|
@@ -52,25 +47,6 @@ import {
|
|
|
52
47
|
import "@langchain/core/messages/tool";
|
|
53
48
|
import { ChatMessageEventTypeEnum, ChatMessageTypeEnum } from "@xpert-ai/chatkit-types";
|
|
54
49
|
|
|
55
|
-
// src/hooks/useParentMessenger.tsx
|
|
56
|
-
import { useContext, useEffect as useEffect2, useRef as useRef2 } from "react";
|
|
57
|
-
|
|
58
|
-
// src/providers/ParentMessenger.tsx
|
|
59
|
-
import { createContext, useCallback, useEffect, useMemo, useRef } from "react";
|
|
60
|
-
import { STATE_VARIABLE_HUMAN as STATE_VARIABLE_HUMAN2 } from "@xpert-ai/chatkit-types";
|
|
61
|
-
|
|
62
|
-
// src/hooks/useStream.ts
|
|
63
|
-
var streamRef = { current: null };
|
|
64
|
-
function useStreamManager() {
|
|
65
|
-
return {
|
|
66
|
-
streamRef,
|
|
67
|
-
stream: streamRef.current,
|
|
68
|
-
setStream: (stream) => {
|
|
69
|
-
streamRef.current = stream;
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
50
|
// src/lib/request-options.ts
|
|
75
51
|
import {
|
|
76
52
|
STATE_VARIABLE_HUMAN
|
|
@@ -82,16 +58,53 @@ function resolveHumanStateValue(value) {
|
|
|
82
58
|
const human = value?.[STATE_VARIABLE_HUMAN];
|
|
83
59
|
return isRecord(human) ? human : {};
|
|
84
60
|
}
|
|
61
|
+
function splitEnvCarrier(value) {
|
|
62
|
+
if (!isRecord(value)) {
|
|
63
|
+
return { value: {}, env: {} };
|
|
64
|
+
}
|
|
65
|
+
const { env, ...rest } = value;
|
|
66
|
+
return {
|
|
67
|
+
value: rest,
|
|
68
|
+
env: isRecord(env) ? env : {}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function mergeRequestOptions(input) {
|
|
72
|
+
const defaultContext = splitEnvCarrier(input.defaults?.context);
|
|
73
|
+
const explicitContext = splitEnvCarrier(input.context);
|
|
74
|
+
const defaultConfig = isRecord(input.defaults?.config) ? input.defaults?.config : {};
|
|
75
|
+
const explicitConfig = isRecord(input.config) ? input.config : {};
|
|
76
|
+
const mergedEnv = {
|
|
77
|
+
...defaultContext.env,
|
|
78
|
+
...explicitContext.env
|
|
79
|
+
};
|
|
80
|
+
const mergedContextBase = {
|
|
81
|
+
...defaultContext.value,
|
|
82
|
+
...explicitContext.value
|
|
83
|
+
};
|
|
84
|
+
const mergedConfig = {
|
|
85
|
+
...defaultConfig,
|
|
86
|
+
...explicitConfig
|
|
87
|
+
};
|
|
88
|
+
const hasEnv = Object.keys(mergedEnv).length > 0;
|
|
89
|
+
const mergedContext = hasEnv ? { ...mergedContextBase, env: mergedEnv } : mergedContextBase;
|
|
90
|
+
const hasContext = Object.keys(mergedContextBase).length > 0 || hasEnv;
|
|
91
|
+
const hasConfig = Object.keys(mergedConfig).length > 0;
|
|
92
|
+
return {
|
|
93
|
+
...hasContext ? { context: mergedContext } : {},
|
|
94
|
+
...hasConfig ? { config: mergedConfig } : {}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
85
97
|
function buildInjectedRequestOptions(input) {
|
|
86
98
|
const defaultState = input.defaults?.state;
|
|
87
99
|
const explicitState = input.state;
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
100
|
+
const normalizedRequest = mergeRequestOptions({
|
|
101
|
+
defaults: {
|
|
102
|
+
context: input.defaults?.context,
|
|
103
|
+
config: input.defaults?.config
|
|
104
|
+
},
|
|
105
|
+
context: input.context,
|
|
106
|
+
config: input.config
|
|
107
|
+
});
|
|
95
108
|
const mergedState = {
|
|
96
109
|
...defaultState ?? {},
|
|
97
110
|
...explicitState ?? {}
|
|
@@ -107,7 +120,27 @@ function buildInjectedRequestOptions(input) {
|
|
|
107
120
|
const hasState = Object.keys(mergedState).length > 0;
|
|
108
121
|
return {
|
|
109
122
|
...hasState ? { state: mergedState } : {},
|
|
110
|
-
...
|
|
123
|
+
...normalizedRequest.context ? { context: normalizedRequest.context } : {},
|
|
124
|
+
...normalizedRequest.config ? { config: normalizedRequest.config } : {}
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// src/hooks/useParentMessenger.tsx
|
|
129
|
+
import { useContext, useEffect as useEffect2, useRef as useRef2 } from "react";
|
|
130
|
+
|
|
131
|
+
// src/providers/ParentMessenger.tsx
|
|
132
|
+
import { createContext, useCallback, useEffect, useMemo, useRef } from "react";
|
|
133
|
+
import { STATE_VARIABLE_HUMAN as STATE_VARIABLE_HUMAN2 } from "@xpert-ai/chatkit-types";
|
|
134
|
+
|
|
135
|
+
// src/hooks/useStream.ts
|
|
136
|
+
var streamRef = { current: null };
|
|
137
|
+
function useStreamManager() {
|
|
138
|
+
return {
|
|
139
|
+
streamRef,
|
|
140
|
+
stream: streamRef.current,
|
|
141
|
+
setStream: (stream) => {
|
|
142
|
+
streamRef.current = stream;
|
|
143
|
+
}
|
|
111
144
|
};
|
|
112
145
|
}
|
|
113
146
|
|
|
@@ -205,6 +238,7 @@ function ParentMessengerProvider({
|
|
|
205
238
|
{
|
|
206
239
|
newThread: params.newThread,
|
|
207
240
|
...requestOptions.context ? { context: requestOptions.context } : {},
|
|
241
|
+
...requestOptions.config ? { config: requestOptions.config } : {},
|
|
208
242
|
optimisticValues: (prev) => {
|
|
209
243
|
const prevMessages = prev?.messages ?? [];
|
|
210
244
|
return { ...prev, messages: [...prevMessages, newMessage] };
|
|
@@ -536,6 +570,10 @@ var en_US_default = {
|
|
|
536
570
|
errorToast: "An error occurred. Please try again.",
|
|
537
571
|
errorLabel: "Error:",
|
|
538
572
|
langGraphMessages: "LangGraph Messages..."
|
|
573
|
+
},
|
|
574
|
+
message: {
|
|
575
|
+
answer: "Answer",
|
|
576
|
+
reasoning: "Reasoning"
|
|
539
577
|
}
|
|
540
578
|
};
|
|
541
579
|
|
|
@@ -595,6 +633,10 @@ var zh_CN_default = {
|
|
|
595
633
|
errorToast: "\u53D1\u751F\u9519\u8BEF\uFF0C\u8BF7\u91CD\u8BD5\u3002",
|
|
596
634
|
errorLabel: "\u9519\u8BEF\uFF1A",
|
|
597
635
|
langGraphMessages: "LangGraph \u6D88\u606F..."
|
|
636
|
+
},
|
|
637
|
+
message: {
|
|
638
|
+
answer: "\u56DE\u7B54",
|
|
639
|
+
reasoning: "\u63A8\u7406"
|
|
598
640
|
}
|
|
599
641
|
};
|
|
600
642
|
|
|
@@ -2157,6 +2199,7 @@ function renderContent(content, messageId) {
|
|
|
2157
2199
|
return /* @__PURE__ */ jsx19("div", { className: "space-y-3", children: content.map((item, index) => renderContentItem(item, index, messageId)) });
|
|
2158
2200
|
}
|
|
2159
2201
|
function AssistantMessage({ message, className, isStreaming = false }) {
|
|
2202
|
+
const { t } = useChatkitTranslation();
|
|
2160
2203
|
const content = message.content;
|
|
2161
2204
|
const hasContent = content != null && !(typeof content === "string" && content.trim() === "" || Array.isArray(message.content) && message.content.length === 0);
|
|
2162
2205
|
const hasReasoning = Array.isArray(message.reasoning) && message.reasoning.some((item) => item.text?.trim());
|
|
@@ -2172,8 +2215,8 @@ function AssistantMessage({ message, className, isStreaming = false }) {
|
|
|
2172
2215
|
className: "w-full",
|
|
2173
2216
|
children: [
|
|
2174
2217
|
/* @__PURE__ */ jsxs8(TabsList, { className: "h-9", children: [
|
|
2175
|
-
/* @__PURE__ */ jsx19(TabsTrigger, { value: "answer", children: "
|
|
2176
|
-
/* @__PURE__ */ jsx19(TabsTrigger, { value: "reasoning", children: "
|
|
2218
|
+
/* @__PURE__ */ jsx19(TabsTrigger, { value: "answer", children: t("message.answer") }),
|
|
2219
|
+
/* @__PURE__ */ jsx19(TabsTrigger, { value: "reasoning", children: t("message.reasoning") })
|
|
2177
2220
|
] }),
|
|
2178
2221
|
/* @__PURE__ */ jsx19(TabsContent, { value: "answer", className: "space-y-3", children: answerNode }),
|
|
2179
2222
|
/* @__PURE__ */ jsx19(TabsContent, { value: "reasoning", className: "space-y-3", children: reasoningNode })
|
|
@@ -2299,8 +2342,136 @@ function StartScreen({ startScreen, onPromptClick, className }) {
|
|
|
2299
2342
|
] });
|
|
2300
2343
|
}
|
|
2301
2344
|
|
|
2302
|
-
// src/
|
|
2345
|
+
// src/components/ui/chatkit-avatar.tsx
|
|
2346
|
+
import "react";
|
|
2347
|
+
|
|
2348
|
+
// src/components/ui/avatar.tsx
|
|
2303
2349
|
import * as React16 from "react";
|
|
2350
|
+
import * as AvatarPrimitive from "@radix-ui/react-avatar";
|
|
2351
|
+
import { jsx as jsx22 } from "react/jsx-runtime";
|
|
2352
|
+
var Avatar = React16.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx22(
|
|
2353
|
+
AvatarPrimitive.Root,
|
|
2354
|
+
{
|
|
2355
|
+
ref,
|
|
2356
|
+
className: cn(
|
|
2357
|
+
"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
|
|
2358
|
+
className
|
|
2359
|
+
),
|
|
2360
|
+
...props
|
|
2361
|
+
}
|
|
2362
|
+
));
|
|
2363
|
+
Avatar.displayName = AvatarPrimitive.Root.displayName;
|
|
2364
|
+
var AvatarImage = React16.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx22(
|
|
2365
|
+
AvatarPrimitive.Image,
|
|
2366
|
+
{
|
|
2367
|
+
ref,
|
|
2368
|
+
className: cn("aspect-square h-full w-full", className),
|
|
2369
|
+
...props
|
|
2370
|
+
}
|
|
2371
|
+
));
|
|
2372
|
+
AvatarImage.displayName = AvatarPrimitive.Image.displayName;
|
|
2373
|
+
var AvatarFallback = React16.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx22(
|
|
2374
|
+
AvatarPrimitive.Fallback,
|
|
2375
|
+
{
|
|
2376
|
+
ref,
|
|
2377
|
+
className: cn(
|
|
2378
|
+
"flex h-full w-full items-center justify-center rounded-full bg-muted",
|
|
2379
|
+
className
|
|
2380
|
+
),
|
|
2381
|
+
...props
|
|
2382
|
+
}
|
|
2383
|
+
));
|
|
2384
|
+
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
|
|
2385
|
+
|
|
2386
|
+
// src/components/ui/chatkit-avatar.tsx
|
|
2387
|
+
import { jsx as jsx23, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
2388
|
+
function asRecord(value) {
|
|
2389
|
+
return value && typeof value === "object" ? value : null;
|
|
2390
|
+
}
|
|
2391
|
+
function getNonEmptyString(value) {
|
|
2392
|
+
if (typeof value !== "string") return void 0;
|
|
2393
|
+
const normalized = value.trim();
|
|
2394
|
+
return normalized || void 0;
|
|
2395
|
+
}
|
|
2396
|
+
function unicodeFromUnified(unified) {
|
|
2397
|
+
const normalized = getNonEmptyString(unified);
|
|
2398
|
+
if (!normalized) return void 0;
|
|
2399
|
+
try {
|
|
2400
|
+
return normalized.split("-").map((hex) => String.fromCodePoint(Number.parseInt(hex, 16))).join("");
|
|
2401
|
+
} catch {
|
|
2402
|
+
return void 0;
|
|
2403
|
+
}
|
|
2404
|
+
}
|
|
2405
|
+
function getEmojiCharacter(avatar) {
|
|
2406
|
+
return unicodeFromUnified(avatar?.emoji?.unified);
|
|
2407
|
+
}
|
|
2408
|
+
function getAvatarFallback(label) {
|
|
2409
|
+
return label.trim().charAt(0).toUpperCase() || "A";
|
|
2410
|
+
}
|
|
2411
|
+
function normalizeChatkitAvatar(rawAvatar) {
|
|
2412
|
+
if (typeof rawAvatar === "string") {
|
|
2413
|
+
const url = getNonEmptyString(rawAvatar);
|
|
2414
|
+
return url ? { url } : null;
|
|
2415
|
+
}
|
|
2416
|
+
const avatarRecord = asRecord(rawAvatar);
|
|
2417
|
+
if (!avatarRecord) return null;
|
|
2418
|
+
const emojiRecord = asRecord(avatarRecord.emoji);
|
|
2419
|
+
const avatar = {
|
|
2420
|
+
background: getNonEmptyString(avatarRecord.background),
|
|
2421
|
+
url: getNonEmptyString(avatarRecord.url),
|
|
2422
|
+
useNotoColor: Boolean(avatarRecord.useNotoColor)
|
|
2423
|
+
};
|
|
2424
|
+
if (emojiRecord) {
|
|
2425
|
+
avatar.emoji = {
|
|
2426
|
+
colons: getNonEmptyString(emojiRecord.colons),
|
|
2427
|
+
id: getNonEmptyString(emojiRecord.id),
|
|
2428
|
+
unified: getNonEmptyString(emojiRecord.unified)
|
|
2429
|
+
};
|
|
2430
|
+
}
|
|
2431
|
+
return avatar.url || avatar.background || avatar.emoji?.id || avatar.emoji?.unified ? avatar : null;
|
|
2432
|
+
}
|
|
2433
|
+
function extractAssistantAvatar(assistant) {
|
|
2434
|
+
const assistantRecord = asRecord(assistant);
|
|
2435
|
+
const metadata = asRecord(assistant.metadata);
|
|
2436
|
+
const rawAvatar = assistantRecord?.avatar ?? metadata?.avatar;
|
|
2437
|
+
const avatar = normalizeChatkitAvatar(rawAvatar);
|
|
2438
|
+
if (avatar) return avatar;
|
|
2439
|
+
const metadataAvatar = getNonEmptyString(metadata?.avatarUrl) ?? getNonEmptyString(metadata?.avatar_url);
|
|
2440
|
+
return metadataAvatar ? { url: metadataAvatar } : null;
|
|
2441
|
+
}
|
|
2442
|
+
function ChatkitAvatar({
|
|
2443
|
+
avatar,
|
|
2444
|
+
className,
|
|
2445
|
+
fallback,
|
|
2446
|
+
fallbackClassName,
|
|
2447
|
+
imageClassName,
|
|
2448
|
+
label,
|
|
2449
|
+
style,
|
|
2450
|
+
...props
|
|
2451
|
+
}) {
|
|
2452
|
+
const { theme } = useTheme();
|
|
2453
|
+
const emojiCharacter = getEmojiCharacter(avatar);
|
|
2454
|
+
const fallbackText = fallback || getAvatarFallback(label);
|
|
2455
|
+
const roundedClass = getRoundedClass(theme.radius);
|
|
2456
|
+
const emojiStyle = avatar?.useNotoColor ? { fontFamily: '"Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", sans-serif' } : void 0;
|
|
2457
|
+
const fallbackStyle = {
|
|
2458
|
+
...avatar?.background ? { background: avatar.background } : {}
|
|
2459
|
+
};
|
|
2460
|
+
return /* @__PURE__ */ jsxs11(Avatar, { className: cn(roundedClass, className), style, ...props, children: [
|
|
2461
|
+
avatar?.url ? /* @__PURE__ */ jsx23(AvatarImage, { className: imageClassName, src: avatar.url, alt: label }) : null,
|
|
2462
|
+
/* @__PURE__ */ jsx23(
|
|
2463
|
+
AvatarFallback,
|
|
2464
|
+
{
|
|
2465
|
+
className: cn(roundedClass, "text-sm font-medium text-foreground", fallbackClassName),
|
|
2466
|
+
style: fallbackStyle,
|
|
2467
|
+
children: emojiCharacter ? /* @__PURE__ */ jsx23("span", { className: "text-[1.1em] leading-none", style: emojiStyle, children: emojiCharacter }) : fallbackText
|
|
2468
|
+
}
|
|
2469
|
+
)
|
|
2470
|
+
] });
|
|
2471
|
+
}
|
|
2472
|
+
|
|
2473
|
+
// src/hooks/useThreads.ts
|
|
2474
|
+
import * as React18 from "react";
|
|
2304
2475
|
var DEFAULT_LIMIT = 50;
|
|
2305
2476
|
var getThreadTitle = (threadRecord) => {
|
|
2306
2477
|
const title = threadRecord.title?.trim();
|
|
@@ -2338,16 +2509,16 @@ function useThreads(limit = DEFAULT_LIMIT) {
|
|
|
2338
2509
|
isReady,
|
|
2339
2510
|
isLoading: isStreamLoading
|
|
2340
2511
|
} = useStreamContext();
|
|
2341
|
-
const [threadRecords, setThreadRecords] =
|
|
2342
|
-
const [isLoading, setIsLoading] =
|
|
2343
|
-
const [error, setError] =
|
|
2344
|
-
const upsertThreadRecord =
|
|
2512
|
+
const [threadRecords, setThreadRecords] = React18.useState([]);
|
|
2513
|
+
const [isLoading, setIsLoading] = React18.useState(false);
|
|
2514
|
+
const [error, setError] = React18.useState(null);
|
|
2515
|
+
const upsertThreadRecord = React18.useCallback((threadRecord) => {
|
|
2345
2516
|
setThreadRecords((prev) => {
|
|
2346
2517
|
const next = prev.filter((item) => item.id !== threadRecord.id);
|
|
2347
2518
|
return sortThreadRecords([threadRecord, ...next]);
|
|
2348
2519
|
});
|
|
2349
2520
|
}, []);
|
|
2350
|
-
const refreshThreads =
|
|
2521
|
+
const refreshThreads = React18.useCallback(async () => {
|
|
2351
2522
|
setIsLoading(true);
|
|
2352
2523
|
setError(null);
|
|
2353
2524
|
try {
|
|
@@ -2363,7 +2534,7 @@ function useThreads(limit = DEFAULT_LIMIT) {
|
|
|
2363
2534
|
setIsLoading(false);
|
|
2364
2535
|
}
|
|
2365
2536
|
}, [client, limit, assistantId]);
|
|
2366
|
-
const createThread =
|
|
2537
|
+
const createThread = React18.useCallback(
|
|
2367
2538
|
async (input) => {
|
|
2368
2539
|
setError(null);
|
|
2369
2540
|
const payload = {};
|
|
@@ -2377,7 +2548,7 @@ function useThreads(limit = DEFAULT_LIMIT) {
|
|
|
2377
2548
|
},
|
|
2378
2549
|
[client, upsertThreadRecord]
|
|
2379
2550
|
);
|
|
2380
|
-
const updateThread =
|
|
2551
|
+
const updateThread = React18.useCallback(
|
|
2381
2552
|
async (recordId, payload) => {
|
|
2382
2553
|
setError(null);
|
|
2383
2554
|
const updated = await client.conversations.update(recordId, payload);
|
|
@@ -2386,7 +2557,7 @@ function useThreads(limit = DEFAULT_LIMIT) {
|
|
|
2386
2557
|
},
|
|
2387
2558
|
[client, upsertThreadRecord]
|
|
2388
2559
|
);
|
|
2389
|
-
const deleteThread =
|
|
2560
|
+
const deleteThread = React18.useCallback(
|
|
2390
2561
|
async (recordId) => {
|
|
2391
2562
|
setError(null);
|
|
2392
2563
|
await client.conversations.delete(recordId);
|
|
@@ -2394,11 +2565,11 @@ function useThreads(limit = DEFAULT_LIMIT) {
|
|
|
2394
2565
|
},
|
|
2395
2566
|
[client]
|
|
2396
2567
|
);
|
|
2397
|
-
|
|
2568
|
+
React18.useEffect(() => {
|
|
2398
2569
|
if (!isReady) return;
|
|
2399
2570
|
void refreshThreads();
|
|
2400
2571
|
}, [refreshThreads, isReady]);
|
|
2401
|
-
|
|
2572
|
+
React18.useEffect(() => {
|
|
2402
2573
|
if (!threadId || !isStreamLoading) return;
|
|
2403
2574
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
2404
2575
|
setThreadRecords((prev) => {
|
|
@@ -2418,7 +2589,7 @@ function useThreads(limit = DEFAULT_LIMIT) {
|
|
|
2418
2589
|
return changed ? sortThreadRecords(next) : prev;
|
|
2419
2590
|
});
|
|
2420
2591
|
}, [threadId, isStreamLoading]);
|
|
2421
|
-
|
|
2592
|
+
React18.useEffect(() => {
|
|
2422
2593
|
if (!isReady || !threadId || isStreamLoading) return;
|
|
2423
2594
|
let cancelled = false;
|
|
2424
2595
|
void client.conversations.search({ where: { threadId }, limit: 1 }).then((result) => {
|
|
@@ -2432,7 +2603,7 @@ function useThreads(limit = DEFAULT_LIMIT) {
|
|
|
2432
2603
|
cancelled = true;
|
|
2433
2604
|
};
|
|
2434
2605
|
}, [client, threadId, upsertThreadRecord, isReady, isStreamLoading]);
|
|
2435
|
-
const threads =
|
|
2606
|
+
const threads = React18.useMemo(
|
|
2436
2607
|
() => threadRecords.map((threadRecord) => toThreadItem(threadRecord)),
|
|
2437
2608
|
[threadRecords]
|
|
2438
2609
|
);
|
|
@@ -2449,10 +2620,10 @@ function useThreads(limit = DEFAULT_LIMIT) {
|
|
|
2449
2620
|
}
|
|
2450
2621
|
|
|
2451
2622
|
// src/components/thread/context-usage-indicator.tsx
|
|
2452
|
-
import * as
|
|
2623
|
+
import * as React19 from "react";
|
|
2453
2624
|
|
|
2454
2625
|
// src/components/ui/progress-circle.tsx
|
|
2455
|
-
import { jsx as
|
|
2626
|
+
import { jsx as jsx24, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
2456
2627
|
function clamp(input, a, b) {
|
|
2457
2628
|
return Math.max(Math.min(input, Math.max(a, b)), Math.min(a, b));
|
|
2458
2629
|
}
|
|
@@ -2475,7 +2646,7 @@ var ProgressCircle = ({ value, className, ...restSvgProps }) => {
|
|
|
2475
2646
|
return (
|
|
2476
2647
|
// biome-ignore lint/a11y/useFocusableInteractive: false positive (progress + progressbar are not focusable interactives)
|
|
2477
2648
|
// biome-ignore lint/nursery/useAriaPropsSupportedByRole: biome rule at odds with mdn docs (presumed nursary bug with rule)
|
|
2478
|
-
/* @__PURE__ */
|
|
2649
|
+
/* @__PURE__ */ jsxs12(
|
|
2479
2650
|
"svg",
|
|
2480
2651
|
{
|
|
2481
2652
|
role: "progressbar",
|
|
@@ -2486,8 +2657,8 @@ var ProgressCircle = ({ value, className, ...restSvgProps }) => {
|
|
|
2486
2657
|
"aria-valuemax": 100,
|
|
2487
2658
|
...restSvgProps,
|
|
2488
2659
|
children: [
|
|
2489
|
-
/* @__PURE__ */
|
|
2490
|
-
/* @__PURE__ */
|
|
2660
|
+
/* @__PURE__ */ jsx24("circle", { ...commonParams, className: "stroke-current/25" }),
|
|
2661
|
+
/* @__PURE__ */ jsx24(
|
|
2491
2662
|
"circle",
|
|
2492
2663
|
{
|
|
2493
2664
|
...commonParams,
|
|
@@ -2506,7 +2677,7 @@ var ProgressCircle = ({ value, className, ...restSvgProps }) => {
|
|
|
2506
2677
|
};
|
|
2507
2678
|
|
|
2508
2679
|
// src/components/thread/context-usage-indicator.tsx
|
|
2509
|
-
import { jsx as
|
|
2680
|
+
import { jsx as jsx25, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
2510
2681
|
var kNumberFormatter = new Intl.NumberFormat("en-US", {
|
|
2511
2682
|
minimumFractionDigits: 0,
|
|
2512
2683
|
maximumFractionDigits: 1
|
|
@@ -2539,20 +2710,20 @@ function ContextUsageIndicator({
|
|
|
2539
2710
|
}) {
|
|
2540
2711
|
const { t } = useChatkitTranslation();
|
|
2541
2712
|
const stream = useStreamContext();
|
|
2542
|
-
const [maxContextSize, setMaxContextSize] =
|
|
2543
|
-
const [usedContextSize, setUsedContextSize] =
|
|
2544
|
-
const [assistantAgentKey, setAssistantAgentKey] =
|
|
2545
|
-
const latestRealtimeUsageRef =
|
|
2713
|
+
const [maxContextSize, setMaxContextSize] = React19.useState(null);
|
|
2714
|
+
const [usedContextSize, setUsedContextSize] = React19.useState(null);
|
|
2715
|
+
const [assistantAgentKey, setAssistantAgentKey] = React19.useState(null);
|
|
2716
|
+
const latestRealtimeUsageRef = React19.useRef({
|
|
2546
2717
|
threadId: null,
|
|
2547
2718
|
agentKey: null,
|
|
2548
2719
|
usedTokens: null
|
|
2549
2720
|
});
|
|
2550
|
-
const realtimeUsage =
|
|
2721
|
+
const realtimeUsage = React19.useMemo(
|
|
2551
2722
|
() => getThreadContextUsage(stream.contextUsageByAgentKey, assistantAgentKey),
|
|
2552
2723
|
[assistantAgentKey, stream.contextUsageByAgentKey]
|
|
2553
2724
|
);
|
|
2554
2725
|
const realtimeUsedContextSize = getThreadContextUsageTotalTokens(realtimeUsage);
|
|
2555
|
-
|
|
2726
|
+
React19.useEffect(() => {
|
|
2556
2727
|
if (!stream.client || !stream.assistantId) {
|
|
2557
2728
|
setMaxContextSize(null);
|
|
2558
2729
|
setAssistantAgentKey(null);
|
|
@@ -2572,18 +2743,18 @@ function ContextUsageIndicator({
|
|
|
2572
2743
|
cancelled = true;
|
|
2573
2744
|
};
|
|
2574
2745
|
}, [stream.client, stream.assistantId]);
|
|
2575
|
-
|
|
2746
|
+
React19.useEffect(() => {
|
|
2576
2747
|
latestRealtimeUsageRef.current = {
|
|
2577
2748
|
threadId: stream.threadId ?? null,
|
|
2578
2749
|
agentKey: assistantAgentKey,
|
|
2579
2750
|
usedTokens: realtimeUsedContextSize
|
|
2580
2751
|
};
|
|
2581
2752
|
}, [assistantAgentKey, realtimeUsedContextSize, stream.threadId]);
|
|
2582
|
-
|
|
2753
|
+
React19.useEffect(() => {
|
|
2583
2754
|
if (realtimeUsedContextSize == null) return;
|
|
2584
2755
|
setUsedContextSize(realtimeUsedContextSize);
|
|
2585
2756
|
}, [realtimeUsedContextSize]);
|
|
2586
|
-
|
|
2757
|
+
React19.useEffect(() => {
|
|
2587
2758
|
if (!stream.client) {
|
|
2588
2759
|
setUsedContextSize(null);
|
|
2589
2760
|
return;
|
|
@@ -2648,8 +2819,8 @@ function ContextUsageIndicator({
|
|
|
2648
2819
|
});
|
|
2649
2820
|
const usageLabelWithSuffix = usageLabel.endsWith(":") ? usageLabel : `${usageLabel}:`;
|
|
2650
2821
|
const progressClassName = percent >= 90 ? "text-destructive" : percent >= 75 ? "text-amber-500" : "text-primary dark:text-zinc-300";
|
|
2651
|
-
return /* @__PURE__ */
|
|
2652
|
-
/* @__PURE__ */
|
|
2822
|
+
return /* @__PURE__ */ jsxs13(Tooltip, { children: [
|
|
2823
|
+
/* @__PURE__ */ jsx25(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx25(
|
|
2653
2824
|
"button",
|
|
2654
2825
|
{
|
|
2655
2826
|
type: "button",
|
|
@@ -2658,19 +2829,19 @@ function ContextUsageIndicator({
|
|
|
2658
2829
|
className
|
|
2659
2830
|
),
|
|
2660
2831
|
"aria-label": `${usageLabelWithSuffix} ${usageFullLabel}. ${usageTokensLabel}`,
|
|
2661
|
-
children: /* @__PURE__ */
|
|
2832
|
+
children: /* @__PURE__ */ jsx25(ProgressCircle, { value: percent, className: cn("size-3.5", progressClassName) })
|
|
2662
2833
|
}
|
|
2663
2834
|
) }),
|
|
2664
|
-
/* @__PURE__ */
|
|
2665
|
-
/* @__PURE__ */
|
|
2666
|
-
/* @__PURE__ */
|
|
2667
|
-
/* @__PURE__ */
|
|
2835
|
+
/* @__PURE__ */ jsxs13(TooltipContent, { side: "top", sideOffset: 6, className: "space-y-0.5 px-3 py-2 text-center", children: [
|
|
2836
|
+
/* @__PURE__ */ jsx25("div", { className: "text-primary-foreground/70", children: usageLabelWithSuffix }),
|
|
2837
|
+
/* @__PURE__ */ jsx25("div", { className: "font-medium text-primary-foreground/80", children: usageFullLabel }),
|
|
2838
|
+
/* @__PURE__ */ jsx25("div", { className: "text-sm font-semibold", children: usageTokensLabel })
|
|
2668
2839
|
] })
|
|
2669
2840
|
] });
|
|
2670
2841
|
}
|
|
2671
2842
|
|
|
2672
2843
|
// src/components/chat.tsx
|
|
2673
|
-
import { Fragment as Fragment3, jsx as
|
|
2844
|
+
import { Fragment as Fragment3, jsx as jsx26, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
2674
2845
|
var defaultApiUrl2 = import.meta.env.VITE_XPERTAI_API_URL;
|
|
2675
2846
|
function formatMessageContent(content) {
|
|
2676
2847
|
if (typeof content === "string") {
|
|
@@ -2709,16 +2880,17 @@ function Chat({
|
|
|
2709
2880
|
const apiUrl = options?.api?.apiUrl || defaultApiUrl2;
|
|
2710
2881
|
const { setStream } = useStreamManager();
|
|
2711
2882
|
const stream = useStreamContext();
|
|
2712
|
-
const [isHistoryLoading, setIsHistoryLoading] =
|
|
2713
|
-
const [historyError, setHistoryError] =
|
|
2714
|
-
const [assistantName, setAssistantName] =
|
|
2883
|
+
const [isHistoryLoading, setIsHistoryLoading] = React20.useState(false);
|
|
2884
|
+
const [historyError, setHistoryError] = React20.useState(null);
|
|
2885
|
+
const [assistantName, setAssistantName] = React20.useState(null);
|
|
2886
|
+
const [assistantAvatar, setAssistantAvatar] = React20.useState(null);
|
|
2715
2887
|
const LOADING_DOTS_MIN_DURATION = 800;
|
|
2716
|
-
const [showLoadingDots, setShowLoadingDots] =
|
|
2717
|
-
const loadingStartTimeRef =
|
|
2718
|
-
|
|
2888
|
+
const [showLoadingDots, setShowLoadingDots] = React20.useState(false);
|
|
2889
|
+
const loadingStartTimeRef = React20.useRef(null);
|
|
2890
|
+
React20.useEffect(() => {
|
|
2719
2891
|
setStream(stream);
|
|
2720
2892
|
}, [setStream, stream]);
|
|
2721
|
-
|
|
2893
|
+
React20.useEffect(() => {
|
|
2722
2894
|
if (stream.isLoading) {
|
|
2723
2895
|
if (!loadingStartTimeRef.current) {
|
|
2724
2896
|
loadingStartTimeRef.current = Date.now();
|
|
@@ -2741,48 +2913,48 @@ function Chat({
|
|
|
2741
2913
|
}
|
|
2742
2914
|
}
|
|
2743
2915
|
}, [stream.isLoading]);
|
|
2744
|
-
const [draft, setDraft] =
|
|
2745
|
-
const [selectedTool, setSelectedTool] =
|
|
2746
|
-
const [attachments, setAttachments] =
|
|
2747
|
-
const [isAtBottom, setIsAtBottom] =
|
|
2748
|
-
const [hasUpdatesBelow, setHasUpdatesBelow] =
|
|
2916
|
+
const [draft, setDraft] = React20.useState("");
|
|
2917
|
+
const [selectedTool, setSelectedTool] = React20.useState(null);
|
|
2918
|
+
const [attachments, setAttachments] = React20.useState([]);
|
|
2919
|
+
const [isAtBottom, setIsAtBottom] = React20.useState(true);
|
|
2920
|
+
const [hasUpdatesBelow, setHasUpdatesBelow] = React20.useState(false);
|
|
2749
2921
|
const {
|
|
2750
2922
|
threads,
|
|
2751
2923
|
deleteThread,
|
|
2752
2924
|
refreshThreads,
|
|
2753
2925
|
isLoading: isThreadsLoading
|
|
2754
2926
|
} = useThreads();
|
|
2755
|
-
const viewportRef =
|
|
2756
|
-
const fileInputRef =
|
|
2757
|
-
const shouldAutoScrollRef =
|
|
2758
|
-
const forceFollowRef =
|
|
2759
|
-
const previousMessageCountRef =
|
|
2760
|
-
const previousScrollTopRef =
|
|
2761
|
-
const autoScrollFrameRef =
|
|
2762
|
-
const isPointerDownRef =
|
|
2763
|
-
const lastTouchYRef =
|
|
2927
|
+
const viewportRef = React20.useRef(null);
|
|
2928
|
+
const fileInputRef = React20.useRef(null);
|
|
2929
|
+
const shouldAutoScrollRef = React20.useRef(true);
|
|
2930
|
+
const forceFollowRef = React20.useRef(false);
|
|
2931
|
+
const previousMessageCountRef = React20.useRef(0);
|
|
2932
|
+
const previousScrollTopRef = React20.useRef(0);
|
|
2933
|
+
const autoScrollFrameRef = React20.useRef(null);
|
|
2934
|
+
const isPointerDownRef = React20.useRef(false);
|
|
2935
|
+
const lastTouchYRef = React20.useRef(null);
|
|
2764
2936
|
const resolvedTitle = title ?? t("chat.title");
|
|
2765
2937
|
const resolvedPlaceholder = placeholder ?? t("chat.placeholder");
|
|
2766
2938
|
const inputPlaceholder = selectedTool?.placeholderOverride ?? composer?.placeholder ?? resolvedPlaceholder;
|
|
2767
|
-
const messages =
|
|
2939
|
+
const messages = React20.useMemo(() => stream.messages ?? [], [stream.messages]);
|
|
2768
2940
|
const trimmedDraft = draft.trim();
|
|
2769
|
-
const cancelPendingAutoScroll =
|
|
2941
|
+
const cancelPendingAutoScroll = React20.useCallback(() => {
|
|
2770
2942
|
if (autoScrollFrameRef.current !== null) {
|
|
2771
2943
|
cancelAnimationFrame(autoScrollFrameRef.current);
|
|
2772
2944
|
autoScrollFrameRef.current = null;
|
|
2773
2945
|
}
|
|
2774
2946
|
}, []);
|
|
2775
|
-
const disableAutoFollow =
|
|
2947
|
+
const disableAutoFollow = React20.useCallback(() => {
|
|
2776
2948
|
forceFollowRef.current = false;
|
|
2777
2949
|
shouldAutoScrollRef.current = false;
|
|
2778
2950
|
cancelPendingAutoScroll();
|
|
2779
2951
|
}, [cancelPendingAutoScroll]);
|
|
2780
|
-
const enableAutoFollow =
|
|
2952
|
+
const enableAutoFollow = React20.useCallback(() => {
|
|
2781
2953
|
forceFollowRef.current = true;
|
|
2782
2954
|
shouldAutoScrollRef.current = true;
|
|
2783
2955
|
setHasUpdatesBelow(false);
|
|
2784
2956
|
}, []);
|
|
2785
|
-
const scrollToBottom =
|
|
2957
|
+
const scrollToBottom = React20.useCallback((smooth = false, force = false) => {
|
|
2786
2958
|
if (force) {
|
|
2787
2959
|
enableAutoFollow();
|
|
2788
2960
|
}
|
|
@@ -2801,7 +2973,7 @@ function Chat({
|
|
|
2801
2973
|
}
|
|
2802
2974
|
});
|
|
2803
2975
|
}, [cancelPendingAutoScroll, enableAutoFollow]);
|
|
2804
|
-
|
|
2976
|
+
React20.useEffect(() => {
|
|
2805
2977
|
const viewport = viewportRef.current;
|
|
2806
2978
|
if (!viewport) return;
|
|
2807
2979
|
previousScrollTopRef.current = viewport.scrollTop;
|
|
@@ -2872,14 +3044,14 @@ function Chat({
|
|
|
2872
3044
|
window.removeEventListener("pointercancel", stopPointerTracking);
|
|
2873
3045
|
};
|
|
2874
3046
|
}, [cancelPendingAutoScroll, disableAutoFollow]);
|
|
2875
|
-
|
|
3047
|
+
React20.useEffect(() => {
|
|
2876
3048
|
shouldAutoScrollRef.current = true;
|
|
2877
3049
|
forceFollowRef.current = false;
|
|
2878
3050
|
previousScrollTopRef.current = 0;
|
|
2879
3051
|
setIsAtBottom(true);
|
|
2880
3052
|
setHasUpdatesBelow(false);
|
|
2881
3053
|
}, [stream.threadId]);
|
|
2882
|
-
|
|
3054
|
+
React20.useEffect(() => {
|
|
2883
3055
|
const messageCountChanged = messages.length !== previousMessageCountRef.current;
|
|
2884
3056
|
previousMessageCountRef.current = messages.length;
|
|
2885
3057
|
if (!shouldAutoScrollRef.current) {
|
|
@@ -2898,19 +3070,32 @@ function Chat({
|
|
|
2898
3070
|
const showMissingConfig = !isClientSecretInitializing && missingConfig;
|
|
2899
3071
|
const hasUploadingFiles = attachments.some((a) => a.status === "uploading");
|
|
2900
3072
|
const isSendDisabled = !trimmedDraft || stream.isLoading || missingConfig || isHistoryLoading || hasUploadingFiles;
|
|
2901
|
-
|
|
3073
|
+
React20.useEffect(() => {
|
|
2902
3074
|
if (missingConfig) return;
|
|
2903
3075
|
void refreshThreads();
|
|
2904
3076
|
}, [missingConfig, refreshThreads]);
|
|
2905
|
-
|
|
2906
|
-
if (missingConfig || !stream.client || !stream.assistantId)
|
|
3077
|
+
React20.useEffect(() => {
|
|
3078
|
+
if (missingConfig || !stream.client || !stream.assistantId) {
|
|
3079
|
+
setAssistantName(null);
|
|
3080
|
+
setAssistantAvatar(null);
|
|
3081
|
+
return;
|
|
3082
|
+
}
|
|
3083
|
+
setAssistantName(null);
|
|
3084
|
+
setAssistantAvatar(null);
|
|
3085
|
+
let cancelled = false;
|
|
2907
3086
|
stream.client.assistants.get(stream.assistantId).then((assistant) => {
|
|
2908
|
-
if (assistant)
|
|
2909
|
-
|
|
2910
|
-
|
|
3087
|
+
if (cancelled || !assistant) return;
|
|
3088
|
+
const assistantTitle2 = typeof assistant.metadata?.title === "string" && assistant.metadata.title.trim() ? assistant.metadata.title : assistant.name;
|
|
3089
|
+
setAssistantName(assistantTitle2);
|
|
3090
|
+
setAssistantAvatar(extractAssistantAvatar(assistant));
|
|
2911
3091
|
}).catch((err) => {
|
|
3092
|
+
if (cancelled) return;
|
|
3093
|
+
setAssistantAvatar(null);
|
|
2912
3094
|
console.warn("[Chat] Failed to load assistant info:", err);
|
|
2913
3095
|
});
|
|
3096
|
+
return () => {
|
|
3097
|
+
cancelled = true;
|
|
3098
|
+
};
|
|
2914
3099
|
}, [missingConfig, stream.client, stream.assistantId]);
|
|
2915
3100
|
const uploadedFiles = attachments.filter((a) => a.status === "success" && a.storageFile).map((a) => ({
|
|
2916
3101
|
id: a.storageFile?.id,
|
|
@@ -2948,6 +3133,7 @@ function Chat({
|
|
|
2948
3133
|
},
|
|
2949
3134
|
{
|
|
2950
3135
|
...requestOptions.context ? { context: requestOptions.context } : {},
|
|
3136
|
+
...requestOptions.config ? { config: requestOptions.config } : {},
|
|
2951
3137
|
optimisticValues: (prev) => {
|
|
2952
3138
|
const prevMessages = prev?.messages ?? [];
|
|
2953
3139
|
return { ...prev, messages: [...prevMessages, newMessage] };
|
|
@@ -2963,7 +3149,7 @@ function Chat({
|
|
|
2963
3149
|
const handleAttachmentClick = () => {
|
|
2964
3150
|
fileInputRef.current?.click();
|
|
2965
3151
|
};
|
|
2966
|
-
const uploadFile =
|
|
3152
|
+
const uploadFile = React20.useCallback(async (localId, file) => {
|
|
2967
3153
|
try {
|
|
2968
3154
|
const result = await stream.client.contexts.uploadFile(file);
|
|
2969
3155
|
setAttachments(
|
|
@@ -2983,7 +3169,7 @@ function Chat({
|
|
|
2983
3169
|
);
|
|
2984
3170
|
}
|
|
2985
3171
|
}, [stream.client]);
|
|
2986
|
-
const handleRetryUpload =
|
|
3172
|
+
const handleRetryUpload = React20.useCallback((localId) => {
|
|
2987
3173
|
const attachment = attachments.find((a) => a.localId === localId);
|
|
2988
3174
|
if (!attachment || attachment.status !== "error") return;
|
|
2989
3175
|
setAttachments(
|
|
@@ -3058,7 +3244,7 @@ function Chat({
|
|
|
3058
3244
|
);
|
|
3059
3245
|
scrollToBottom(true, true);
|
|
3060
3246
|
};
|
|
3061
|
-
const loadConversationMessages =
|
|
3247
|
+
const loadConversationMessages = React20.useCallback(
|
|
3062
3248
|
async (recordId) => {
|
|
3063
3249
|
if (missingConfig) {
|
|
3064
3250
|
setHistoryError(t("chat.missingConfigShort"));
|
|
@@ -3140,17 +3326,18 @@ function Chat({
|
|
|
3140
3326
|
}
|
|
3141
3327
|
};
|
|
3142
3328
|
const acceptMimes = composer?.attachments?.accept ? Object.entries(composer.attachments.accept).map(([mime, exts]) => [mime, ...exts.map((e) => `.${e}`)].join(",")).join(",") : void 0;
|
|
3143
|
-
const currentThread =
|
|
3329
|
+
const currentThread = React20.useMemo(
|
|
3144
3330
|
() => threads.find((item) => item.id === stream.threadId),
|
|
3145
3331
|
[threads, stream.threadId]
|
|
3146
3332
|
);
|
|
3147
3333
|
const errorMessage = stream.error instanceof Error ? stream.error.message : void 0;
|
|
3148
|
-
const threadErrorMessage =
|
|
3334
|
+
const threadErrorMessage = React20.useMemo(() => {
|
|
3149
3335
|
if (currentThread?.status !== "error") return void 0;
|
|
3150
3336
|
const message = currentThread.error?.trim();
|
|
3151
3337
|
return message || t("thread.errorToast");
|
|
3152
3338
|
}, [currentThread, t]);
|
|
3153
|
-
|
|
3339
|
+
const assistantTitle = assistantName || resolvedTitle;
|
|
3340
|
+
return /* @__PURE__ */ jsxs14(
|
|
3154
3341
|
"div",
|
|
3155
3342
|
{
|
|
3156
3343
|
ref: viewportRef,
|
|
@@ -3159,16 +3346,26 @@ function Chat({
|
|
|
3159
3346
|
className
|
|
3160
3347
|
),
|
|
3161
3348
|
children: [
|
|
3162
|
-
/* @__PURE__ */
|
|
3163
|
-
/* @__PURE__ */
|
|
3164
|
-
/* @__PURE__ */
|
|
3165
|
-
|
|
3166
|
-
|
|
3167
|
-
|
|
3349
|
+
/* @__PURE__ */ jsxs14("div", { className: "flex items-center justify-between border-b p-2 sticky top-0 z-10 bg-background", children: [
|
|
3350
|
+
/* @__PURE__ */ jsxs14("div", { className: "flex items-center gap-3 overflow-hidden", children: [
|
|
3351
|
+
/* @__PURE__ */ jsxs14("div", { className: "relative shrink-0", children: [
|
|
3352
|
+
/* @__PURE__ */ jsx26(
|
|
3353
|
+
ChatkitAvatar,
|
|
3354
|
+
{
|
|
3355
|
+
avatar: assistantAvatar,
|
|
3356
|
+
className: "h-9 w-9 border border-border/60",
|
|
3357
|
+
label: assistantTitle
|
|
3358
|
+
}
|
|
3359
|
+
),
|
|
3360
|
+
/* @__PURE__ */ jsx26("span", { className: "absolute bottom-0 right-0 h-2.5 w-2.5 rounded-full border-2 border-background bg-green-500" })
|
|
3361
|
+
] }),
|
|
3362
|
+
/* @__PURE__ */ jsxs14("div", { className: "truncate", children: [
|
|
3363
|
+
/* @__PURE__ */ jsx26("h2", { className: "text-lg font-semibold truncate", title: assistantTitle, children: assistantTitle }),
|
|
3364
|
+
/* @__PURE__ */ jsx26("p", { className: "text-xs text-muted-foreground", children: t("chat.statusOnline") })
|
|
3168
3365
|
] })
|
|
3169
3366
|
] }),
|
|
3170
|
-
history?.enabled !== false && /* @__PURE__ */
|
|
3171
|
-
/* @__PURE__ */
|
|
3367
|
+
history?.enabled !== false && /* @__PURE__ */ jsxs14("div", { className: "flex items-center gap-1", children: [
|
|
3368
|
+
/* @__PURE__ */ jsx26(
|
|
3172
3369
|
"button",
|
|
3173
3370
|
{
|
|
3174
3371
|
type: "button",
|
|
@@ -3181,10 +3378,10 @@ function Chat({
|
|
|
3181
3378
|
"disabled:opacity-50 disabled:cursor-not-allowed"
|
|
3182
3379
|
),
|
|
3183
3380
|
title: t("history.newThread"),
|
|
3184
|
-
children: /* @__PURE__ */
|
|
3381
|
+
children: /* @__PURE__ */ jsx26(Pencil3, { size: 16 })
|
|
3185
3382
|
}
|
|
3186
3383
|
),
|
|
3187
|
-
/* @__PURE__ */
|
|
3384
|
+
/* @__PURE__ */ jsx26(
|
|
3188
3385
|
HistorySidebar,
|
|
3189
3386
|
{
|
|
3190
3387
|
threads,
|
|
@@ -3198,23 +3395,23 @@ function Chat({
|
|
|
3198
3395
|
)
|
|
3199
3396
|
] })
|
|
3200
3397
|
] }),
|
|
3201
|
-
/* @__PURE__ */
|
|
3202
|
-
errorMessage && /* @__PURE__ */
|
|
3203
|
-
historyError && /* @__PURE__ */
|
|
3204
|
-
showMissingConfig && /* @__PURE__ */
|
|
3205
|
-
isHistoryLoading && /* @__PURE__ */
|
|
3206
|
-
messages.length === 0 ? /* @__PURE__ */
|
|
3398
|
+
/* @__PURE__ */ jsxs14("div", { className: "flex-1 p-4", children: [
|
|
3399
|
+
errorMessage && /* @__PURE__ */ jsx26("div", { className: "mb-4 rounded-lg border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive", children: errorMessage }),
|
|
3400
|
+
historyError && /* @__PURE__ */ jsx26("div", { className: "mb-4 rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-900", children: historyError }),
|
|
3401
|
+
showMissingConfig && /* @__PURE__ */ jsx26("div", { className: "mb-4 rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-900", children: t("chat.missingConfigDetail") }),
|
|
3402
|
+
isHistoryLoading && /* @__PURE__ */ jsx26("div", { className: "mb-4 rounded-lg border border-muted px-3 py-2 text-sm text-muted-foreground", children: t("chat.loadingThread") }),
|
|
3403
|
+
messages.length === 0 ? /* @__PURE__ */ jsx26(
|
|
3207
3404
|
StartScreen,
|
|
3208
3405
|
{
|
|
3209
3406
|
startScreen,
|
|
3210
3407
|
onPromptClick: handlePromptClick
|
|
3211
3408
|
}
|
|
3212
|
-
) : /* @__PURE__ */
|
|
3409
|
+
) : /* @__PURE__ */ jsxs14("div", { className: "space-y-4", children: [
|
|
3213
3410
|
messages.map((message, index) => {
|
|
3214
3411
|
const messageType = String(message.type);
|
|
3215
3412
|
const isAssistantMessage = messageType === "assistant" || messageType === "ai";
|
|
3216
3413
|
const messageContent = typeof message.content === "string" ? message.content : Array.isArray(message.content) ? message.content.map((part) => formatMessageContent(part)).join("") : formatMessageContent(message.content);
|
|
3217
|
-
return /* @__PURE__ */
|
|
3414
|
+
return /* @__PURE__ */ jsx26(
|
|
3218
3415
|
"div",
|
|
3219
3416
|
{
|
|
3220
3417
|
className: cn(
|
|
@@ -3222,8 +3419,8 @@ function Chat({
|
|
|
3222
3419
|
message.type === "human" ? "justify-end" : "justify-start -ml-1"
|
|
3223
3420
|
// AI messages: slightly closer to left
|
|
3224
3421
|
),
|
|
3225
|
-
children: /* @__PURE__ */
|
|
3226
|
-
/* @__PURE__ */
|
|
3422
|
+
children: /* @__PURE__ */ jsxs14("div", { className: "flex flex-col px-3 overflow-hidden", children: [
|
|
3423
|
+
/* @__PURE__ */ jsx26(
|
|
3227
3424
|
"div",
|
|
3228
3425
|
{
|
|
3229
3426
|
className: cn(
|
|
@@ -3231,7 +3428,7 @@ function Chat({
|
|
|
3231
3428
|
message.type === "human" ? "bg-primary text-primary-foreground px-4 py-2.5" : message.type === "system" ? "bg-muted text-muted-foreground text-xs px-4 py-2.5" : "py-1 text-chat-foreground"
|
|
3232
3429
|
// AI messages: use chat-specific foreground color
|
|
3233
3430
|
),
|
|
3234
|
-
children: isAssistantMessage ? /* @__PURE__ */
|
|
3431
|
+
children: isAssistantMessage ? /* @__PURE__ */ jsx26(
|
|
3235
3432
|
AssistantMessage,
|
|
3236
3433
|
{
|
|
3237
3434
|
message: {
|
|
@@ -3240,30 +3437,30 @@ function Chat({
|
|
|
3240
3437
|
},
|
|
3241
3438
|
isStreaming: stream.isLoading && index === messages.length - 1
|
|
3242
3439
|
}
|
|
3243
|
-
) : /* @__PURE__ */
|
|
3244
|
-
message.type === "human" && message.attachments?.length > 0 && /* @__PURE__ */
|
|
3440
|
+
) : /* @__PURE__ */ jsxs14(Fragment3, { children: [
|
|
3441
|
+
message.type === "human" && message.attachments?.length > 0 && /* @__PURE__ */ jsx26("div", { className: "flex flex-wrap gap-1.5 mb-2", children: message.attachments.map((file, fileIndex) => /* @__PURE__ */ jsxs14(
|
|
3245
3442
|
"div",
|
|
3246
3443
|
{
|
|
3247
3444
|
className: "flex items-center gap-1.5 rounded-md bg-primary-foreground/20 px-2 py-1 text-xs",
|
|
3248
3445
|
children: [
|
|
3249
|
-
/* @__PURE__ */
|
|
3250
|
-
/* @__PURE__ */
|
|
3446
|
+
/* @__PURE__ */ jsx26(FileText2, { size: 12 }),
|
|
3447
|
+
/* @__PURE__ */ jsx26("span", { className: "max-w-[100px] truncate", children: file.originalName })
|
|
3251
3448
|
]
|
|
3252
3449
|
},
|
|
3253
3450
|
fileIndex
|
|
3254
3451
|
)) }),
|
|
3255
|
-
Array.isArray(message.content) ? message.content.map((part, partIndex) => /* @__PURE__ */
|
|
3452
|
+
Array.isArray(message.content) ? message.content.map((part, partIndex) => /* @__PURE__ */ jsx26(
|
|
3256
3453
|
"p",
|
|
3257
3454
|
{
|
|
3258
3455
|
className: "wrap-break-word text-sm leading-relaxed",
|
|
3259
3456
|
children: formatMessageContent(part)
|
|
3260
3457
|
},
|
|
3261
3458
|
`${part.type}-${partIndex}`
|
|
3262
|
-
)) : /* @__PURE__ */
|
|
3459
|
+
)) : /* @__PURE__ */ jsx26("span", { className: "wrap-break-word text-sm leading-relaxed", children: formatMessageContent(message.content) })
|
|
3263
3460
|
] })
|
|
3264
3461
|
}
|
|
3265
3462
|
),
|
|
3266
|
-
/* @__PURE__ */
|
|
3463
|
+
/* @__PURE__ */ jsx26(
|
|
3267
3464
|
MessageActions,
|
|
3268
3465
|
{
|
|
3269
3466
|
content: messageContent,
|
|
@@ -3284,15 +3481,15 @@ function Chat({
|
|
|
3284
3481
|
const lastMsgContent = lastMessage?.content;
|
|
3285
3482
|
const hasSubstantialContent = isLastMessageFromAI && (typeof lastMsgContent === "string" && lastMsgContent.length > 10 || Array.isArray(lastMsgContent) && lastMsgContent.length > 0);
|
|
3286
3483
|
if (hasSubstantialContent) return null;
|
|
3287
|
-
return /* @__PURE__ */
|
|
3288
|
-
/* @__PURE__ */
|
|
3289
|
-
/* @__PURE__ */
|
|
3290
|
-
/* @__PURE__ */
|
|
3484
|
+
return /* @__PURE__ */ jsx26("div", { className: "flex justify-start gap-3 -ml-2", children: /* @__PURE__ */ jsx26("div", { className: "max-w-full rounded-2xl py-2.5", children: /* @__PURE__ */ jsxs14("div", { className: "flex gap-1.5", children: [
|
|
3485
|
+
/* @__PURE__ */ jsx26("div", { className: "h-2 w-2 animate-bounce rounded-full bg-muted-foreground/60 [animation-delay:-0.3s]" }),
|
|
3486
|
+
/* @__PURE__ */ jsx26("div", { className: "h-2 w-2 animate-bounce rounded-full bg-muted-foreground/60 [animation-delay:-0.15s]" }),
|
|
3487
|
+
/* @__PURE__ */ jsx26("div", { className: "h-2 w-2 animate-bounce rounded-full bg-muted-foreground/60" })
|
|
3291
3488
|
] }) }) });
|
|
3292
3489
|
})()
|
|
3293
3490
|
] })
|
|
3294
3491
|
] }),
|
|
3295
|
-
!isAtBottom && messages.length > 0 && /* @__PURE__ */
|
|
3492
|
+
!isAtBottom && messages.length > 0 && /* @__PURE__ */ jsx26("div", { className: "sticky bottom-20 z-20 flex justify-center px-4 pointer-events-none", children: /* @__PURE__ */ jsx26(
|
|
3296
3493
|
Button,
|
|
3297
3494
|
{
|
|
3298
3495
|
type: "button",
|
|
@@ -3305,12 +3502,12 @@ function Chat({
|
|
|
3305
3502
|
onClick: () => scrollToBottom(true, true),
|
|
3306
3503
|
"aria-label": t("chat.scrollToBottom"),
|
|
3307
3504
|
title: t("chat.scrollToBottom"),
|
|
3308
|
-
children: /* @__PURE__ */
|
|
3505
|
+
children: /* @__PURE__ */ jsx26(ArrowDown, { size: 16 })
|
|
3309
3506
|
}
|
|
3310
3507
|
) }),
|
|
3311
|
-
/* @__PURE__ */
|
|
3312
|
-
threadErrorMessage && /* @__PURE__ */
|
|
3313
|
-
/* @__PURE__ */
|
|
3508
|
+
/* @__PURE__ */ jsxs14("div", { className: "p-2 sticky bottom-0 z-10 bg-background", children: [
|
|
3509
|
+
threadErrorMessage && /* @__PURE__ */ jsx26("div", { className: "mb-3 rounded-lg border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive", children: threadErrorMessage }),
|
|
3510
|
+
/* @__PURE__ */ jsx26(
|
|
3314
3511
|
"input",
|
|
3315
3512
|
{
|
|
3316
3513
|
ref: fileInputRef,
|
|
@@ -3321,7 +3518,7 @@ function Chat({
|
|
|
3321
3518
|
className: "hidden"
|
|
3322
3519
|
}
|
|
3323
3520
|
),
|
|
3324
|
-
attachments.length > 0 && /* @__PURE__ */
|
|
3521
|
+
attachments.length > 0 && /* @__PURE__ */ jsx26("div", { className: "mb-3 flex flex-wrap gap-2", children: attachments.map((item) => /* @__PURE__ */ jsxs14(
|
|
3325
3522
|
"div",
|
|
3326
3523
|
{
|
|
3327
3524
|
className: cn(
|
|
@@ -3329,24 +3526,24 @@ function Chat({
|
|
|
3329
3526
|
item.status === "error" ? "bg-destructive/10 border border-destructive/30" : "bg-muted"
|
|
3330
3527
|
),
|
|
3331
3528
|
children: [
|
|
3332
|
-
item.status === "uploading" && /* @__PURE__ */
|
|
3333
|
-
item.status === "success" && /* @__PURE__ */
|
|
3334
|
-
item.status === "error" && /* @__PURE__ */
|
|
3335
|
-
/* @__PURE__ */
|
|
3529
|
+
item.status === "uploading" && /* @__PURE__ */ jsx26(Loader22, { size: 14, className: "animate-spin text-muted-foreground" }),
|
|
3530
|
+
item.status === "success" && /* @__PURE__ */ jsx26(FileText2, { size: 14, className: "text-muted-foreground" }),
|
|
3531
|
+
item.status === "error" && /* @__PURE__ */ jsx26(FileText2, { size: 14, className: "text-destructive" }),
|
|
3532
|
+
/* @__PURE__ */ jsx26("span", { className: cn(
|
|
3336
3533
|
"max-w-30 truncate",
|
|
3337
3534
|
item.status === "error" && "text-destructive"
|
|
3338
3535
|
), children: item.file.name }),
|
|
3339
|
-
item.status === "error" && /* @__PURE__ */
|
|
3536
|
+
item.status === "error" && /* @__PURE__ */ jsx26(
|
|
3340
3537
|
"button",
|
|
3341
3538
|
{
|
|
3342
3539
|
type: "button",
|
|
3343
3540
|
onClick: () => handleRetryUpload(item.localId),
|
|
3344
3541
|
className: "ml-1 rounded-full p-0.5 text-destructive hover:bg-destructive/20",
|
|
3345
3542
|
title: t("chat.retryUpload"),
|
|
3346
|
-
children: /* @__PURE__ */
|
|
3543
|
+
children: /* @__PURE__ */ jsx26(RefreshCw2, { size: 12 })
|
|
3347
3544
|
}
|
|
3348
3545
|
),
|
|
3349
|
-
/* @__PURE__ */
|
|
3546
|
+
/* @__PURE__ */ jsx26(
|
|
3350
3547
|
"button",
|
|
3351
3548
|
{
|
|
3352
3549
|
type: "button",
|
|
@@ -3355,26 +3552,26 @@ function Chat({
|
|
|
3355
3552
|
"ml-1 rounded-full p-0.5",
|
|
3356
3553
|
item.status === "error" ? "text-destructive hover:bg-destructive/20" : "hover:bg-muted-foreground/20"
|
|
3357
3554
|
),
|
|
3358
|
-
children: /* @__PURE__ */
|
|
3555
|
+
children: /* @__PURE__ */ jsx26(X2, { size: 12 })
|
|
3359
3556
|
}
|
|
3360
3557
|
)
|
|
3361
3558
|
]
|
|
3362
3559
|
},
|
|
3363
3560
|
item.localId
|
|
3364
3561
|
)) }),
|
|
3365
|
-
selectedTool && /* @__PURE__ */
|
|
3366
|
-
/* @__PURE__ */
|
|
3367
|
-
/* @__PURE__ */
|
|
3562
|
+
selectedTool && /* @__PURE__ */ jsxs14("div", { className: "mb-2 flex items-center gap-2", children: [
|
|
3563
|
+
/* @__PURE__ */ jsx26("span", { className: "rounded-full bg-primary/10 px-2 py-0.5 text-xs font-medium text-primary", children: selectedTool.shortLabel ?? selectedTool.label }),
|
|
3564
|
+
/* @__PURE__ */ jsx26(
|
|
3368
3565
|
"button",
|
|
3369
3566
|
{
|
|
3370
3567
|
type: "button",
|
|
3371
3568
|
onClick: () => setSelectedTool(null),
|
|
3372
3569
|
className: "rounded-full p-0.5 text-muted-foreground hover:bg-muted",
|
|
3373
|
-
children: /* @__PURE__ */
|
|
3570
|
+
children: /* @__PURE__ */ jsx26(X2, { size: 12 })
|
|
3374
3571
|
}
|
|
3375
3572
|
)
|
|
3376
3573
|
] }),
|
|
3377
|
-
/* @__PURE__ */
|
|
3574
|
+
/* @__PURE__ */ jsx26("form", { className: "flex items-center", onSubmit: handleSubmit, children: /* @__PURE__ */ jsxs14(
|
|
3378
3575
|
"div",
|
|
3379
3576
|
{
|
|
3380
3577
|
className: cn(
|
|
@@ -3385,7 +3582,7 @@ function Chat({
|
|
|
3385
3582
|
"transition-shadow duration-200"
|
|
3386
3583
|
),
|
|
3387
3584
|
children: [
|
|
3388
|
-
/* @__PURE__ */
|
|
3585
|
+
/* @__PURE__ */ jsx26(
|
|
3389
3586
|
ComposerMenu,
|
|
3390
3587
|
{
|
|
3391
3588
|
composer,
|
|
@@ -3395,7 +3592,7 @@ function Chat({
|
|
|
3395
3592
|
disabled: stream.isLoading || missingConfig || isHistoryLoading
|
|
3396
3593
|
}
|
|
3397
3594
|
),
|
|
3398
|
-
/* @__PURE__ */
|
|
3595
|
+
/* @__PURE__ */ jsx26(
|
|
3399
3596
|
"input",
|
|
3400
3597
|
{
|
|
3401
3598
|
type: "text",
|
|
@@ -3411,7 +3608,7 @@ function Chat({
|
|
|
3411
3608
|
autoComplete: "off"
|
|
3412
3609
|
}
|
|
3413
3610
|
),
|
|
3414
|
-
/* @__PURE__ */
|
|
3611
|
+
/* @__PURE__ */ jsx26(
|
|
3415
3612
|
SendButton,
|
|
3416
3613
|
{
|
|
3417
3614
|
disabled: isSendDisabled,
|
|
@@ -3424,7 +3621,7 @@ function Chat({
|
|
|
3424
3621
|
]
|
|
3425
3622
|
}
|
|
3426
3623
|
) }),
|
|
3427
|
-
disclaimer?.text && /* @__PURE__ */
|
|
3624
|
+
disclaimer?.text && /* @__PURE__ */ jsx26(
|
|
3428
3625
|
"p",
|
|
3429
3626
|
{
|
|
3430
3627
|
className: cn(
|
|
@@ -3434,9 +3631,9 @@ function Chat({
|
|
|
3434
3631
|
children: disclaimer.text
|
|
3435
3632
|
}
|
|
3436
3633
|
),
|
|
3437
|
-
/* @__PURE__ */
|
|
3438
|
-
/* @__PURE__ */
|
|
3439
|
-
/* @__PURE__ */
|
|
3634
|
+
/* @__PURE__ */ jsxs14("div", { className: "mt-2 flex items-center justify-center gap-2 text-xs text-muted-foreground", children: [
|
|
3635
|
+
/* @__PURE__ */ jsx26("span", { children: t("chat.poweredBy") }),
|
|
3636
|
+
/* @__PURE__ */ jsx26(ContextUsageIndicator, { className: "absolute right-4" })
|
|
3440
3637
|
] })
|
|
3441
3638
|
] })
|
|
3442
3639
|
]
|
|
@@ -3445,11 +3642,11 @@ function Chat({
|
|
|
3445
3642
|
}
|
|
3446
3643
|
|
|
3447
3644
|
// src/components/ui/input.tsx
|
|
3448
|
-
import * as
|
|
3449
|
-
import { jsx as
|
|
3450
|
-
var Input =
|
|
3645
|
+
import * as React21 from "react";
|
|
3646
|
+
import { jsx as jsx27 } from "react/jsx-runtime";
|
|
3647
|
+
var Input = React21.forwardRef(
|
|
3451
3648
|
({ className, type, ...props }, ref) => {
|
|
3452
|
-
return /* @__PURE__ */
|
|
3649
|
+
return /* @__PURE__ */ jsx27(
|
|
3453
3650
|
"input",
|
|
3454
3651
|
{
|
|
3455
3652
|
ref,
|
|
@@ -3465,49 +3662,11 @@ var Input = React19.forwardRef(
|
|
|
3465
3662
|
);
|
|
3466
3663
|
Input.displayName = "Input";
|
|
3467
3664
|
|
|
3468
|
-
// src/components/ui/avatar.tsx
|
|
3469
|
-
import * as React20 from "react";
|
|
3470
|
-
import * as AvatarPrimitive from "@radix-ui/react-avatar";
|
|
3471
|
-
import { jsx as jsx26 } from "react/jsx-runtime";
|
|
3472
|
-
var Avatar = React20.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx26(
|
|
3473
|
-
AvatarPrimitive.Root,
|
|
3474
|
-
{
|
|
3475
|
-
ref,
|
|
3476
|
-
className: cn(
|
|
3477
|
-
"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
|
|
3478
|
-
className
|
|
3479
|
-
),
|
|
3480
|
-
...props
|
|
3481
|
-
}
|
|
3482
|
-
));
|
|
3483
|
-
Avatar.displayName = AvatarPrimitive.Root.displayName;
|
|
3484
|
-
var AvatarImage = React20.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx26(
|
|
3485
|
-
AvatarPrimitive.Image,
|
|
3486
|
-
{
|
|
3487
|
-
ref,
|
|
3488
|
-
className: cn("aspect-square h-full w-full", className),
|
|
3489
|
-
...props
|
|
3490
|
-
}
|
|
3491
|
-
));
|
|
3492
|
-
AvatarImage.displayName = AvatarPrimitive.Image.displayName;
|
|
3493
|
-
var AvatarFallback = React20.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx26(
|
|
3494
|
-
AvatarPrimitive.Fallback,
|
|
3495
|
-
{
|
|
3496
|
-
ref,
|
|
3497
|
-
className: cn(
|
|
3498
|
-
"flex h-full w-full items-center justify-center rounded-full bg-muted",
|
|
3499
|
-
className
|
|
3500
|
-
),
|
|
3501
|
-
...props
|
|
3502
|
-
}
|
|
3503
|
-
));
|
|
3504
|
-
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
|
|
3505
|
-
|
|
3506
3665
|
// src/components/ui/separator.tsx
|
|
3507
|
-
import * as
|
|
3508
|
-
import { jsx as
|
|
3509
|
-
var Separator =
|
|
3510
|
-
({ className, orientation = "horizontal", ...props }, ref) => /* @__PURE__ */
|
|
3666
|
+
import * as React22 from "react";
|
|
3667
|
+
import { jsx as jsx28 } from "react/jsx-runtime";
|
|
3668
|
+
var Separator = React22.forwardRef(
|
|
3669
|
+
({ className, orientation = "horizontal", ...props }, ref) => /* @__PURE__ */ jsx28(
|
|
3511
3670
|
"div",
|
|
3512
3671
|
{
|
|
3513
3672
|
ref,
|
|
@@ -3537,6 +3696,7 @@ export {
|
|
|
3537
3696
|
CardHeader,
|
|
3538
3697
|
CardTitle,
|
|
3539
3698
|
Chat,
|
|
3699
|
+
ChatkitAvatar,
|
|
3540
3700
|
Input,
|
|
3541
3701
|
ParentMessengerProvider,
|
|
3542
3702
|
ScrollArea,
|
|
@@ -3548,7 +3708,10 @@ export {
|
|
|
3548
3708
|
TabsTrigger,
|
|
3549
3709
|
ThemeProvider,
|
|
3550
3710
|
supportedLocales as chatkitSupportedLocales,
|
|
3711
|
+
extractAssistantAvatar,
|
|
3712
|
+
getAvatarFallback,
|
|
3551
3713
|
getLanguage as getChatkitLanguage,
|
|
3714
|
+
normalizeChatkitAvatar,
|
|
3552
3715
|
setLanguage as setChatkitLanguage,
|
|
3553
3716
|
useParentMessenger,
|
|
3554
3717
|
useTheme
|