@8wave/ai-elements 0.82.0 → 0.83.0
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/_chunks/{PkToolShowComparison-D_DtpXRO.js → PkToolShowComparison-CGflZD9j.js} +2 -2
- package/dist/_chunks/PkToolShowComparison-CGflZD9j.js.map +1 -0
- package/dist/_chunks/{PkToolShowProductList-Ds6ah3dL.js → PkToolShowProductList-DvSGk45f.js} +2 -2
- package/dist/_chunks/{PkToolShowProductList-Ds6ah3dL.js.map → PkToolShowProductList-DvSGk45f.js.map} +1 -1
- package/dist/_chunks/{PkToolShowWebPages-C1ZXSB00.js → PkToolShowWebPages-C2VvN6sE.js} +2 -2
- package/dist/_chunks/{PkToolShowWebPages-C1ZXSB00.js.map → PkToolShowWebPages-C2VvN6sE.js.map} +1 -1
- package/dist/_chunks/{PkUrl-Dsi-Zezs.js → PkUrl-BVv89CMm.js} +2 -2
- package/dist/_chunks/{PkUrl-Dsi-Zezs.js.map → PkUrl-BVv89CMm.js.map} +1 -1
- package/dist/_chunks/{VvCheckbox.es-LSjS8_8K.js → VvCheckbox.es-BsF_JJw_.js} +2 -2
- package/dist/_chunks/VvCheckbox.es-BsF_JJw_.js.map +1 -0
- package/dist/_chunks/{VvCheckboxGroup.es-CR5ZTD2H.js → VvCheckboxGroup.es-Blgwe85A.js} +2 -2
- package/dist/_chunks/VvCheckboxGroup.es-Blgwe85A.js.map +1 -0
- package/dist/_chunks/{VvCombobox.es-B8E1RmUn.js → VvCombobox.es-BQ31qIIa.js} +2 -2
- package/dist/_chunks/VvCombobox.es-BQ31qIIa.js.map +1 -0
- package/dist/_chunks/{VvInputText.es-BYAhw1yP.js → VvInputText.es-DtzvbGMQ.js} +2 -2
- package/dist/_chunks/VvInputText.es-DtzvbGMQ.js.map +1 -0
- package/dist/_chunks/{VvRadio.es-CQj6S-QP.js → VvRadio.es-DJY-UZOw.js} +2 -2
- package/dist/_chunks/VvRadio.es-DJY-UZOw.js.map +1 -0
- package/dist/_chunks/{VvRadioGroup.es-9AWwbBXm.js → VvRadioGroup.es-2xgX8Gdu.js} +2 -2
- package/dist/_chunks/VvRadioGroup.es-2xgX8Gdu.js.map +1 -0
- package/dist/_chunks/{VvSelect.es-DAmZPvCV.js → VvSelect.es-D5RIWAgh.js} +2 -2
- package/dist/_chunks/VvSelect.es-D5RIWAgh.js.map +1 -0
- package/dist/_chunks/{VvTextarea.es-BfgLTEPk.js → VvTextarea.es-C_kKlPCs.js} +2 -2
- package/dist/_chunks/VvTextarea.es-C_kKlPCs.js.map +1 -0
- package/dist/_chunks/index.es-D6JnX5Jz.js.map +1 -1
- package/dist/ai-elements.es.js +5538 -5413
- package/dist/ai-elements.es.js.map +1 -1
- package/dist-vue/PkChatbot.js +1 -1
- package/dist-vue/PkChatbotError.js +1 -1
- package/dist-vue/PkChatbotFeedbackForm.js +1 -1
- package/dist-vue/PkChatbotFilePreview.js +1 -1
- package/dist-vue/PkChatbotInput.js +1 -1
- package/dist-vue/PkChatbotMessages.js +1 -1
- package/dist-vue/PkChatbotViewChat.js +1 -1
- package/dist-vue/PkChatbotViewConversations.js +1 -1
- package/dist-vue/PkChatbotViewProfile.js +1 -1
- package/dist-vue/_chunks/PkChatbot-C1gpRhfP.js +191 -0
- package/dist-vue/_chunks/PkChatbot-C1gpRhfP.js.map +1 -0
- package/dist-vue/_chunks/{PkChatbotError-C1ZxZlwQ.js → PkChatbotError-BlZ4WNup.js} +2 -2
- package/dist-vue/_chunks/PkChatbotError-BlZ4WNup.js.map +1 -0
- package/dist-vue/_chunks/{PkChatbotFeedbackForm-BFG5AcGR.js → PkChatbotFeedbackForm-Buzwweuj.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotFeedbackForm-BFG5AcGR.js.map → PkChatbotFeedbackForm-Buzwweuj.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotFilePreview-BPJwRxAC.js → PkChatbotFilePreview-0N9ASbIp.js} +1 -1
- package/dist-vue/_chunks/{PkChatbotFilePreview-BPJwRxAC.js.map → PkChatbotFilePreview-0N9ASbIp.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotInput-CEWPF7af.js → PkChatbotInput-CsazCkTA.js} +3 -3
- package/dist-vue/_chunks/{PkChatbotInput-CEWPF7af.js.map → PkChatbotInput-CsazCkTA.js.map} +1 -1
- package/dist-vue/_chunks/PkChatbotMessages-NODnY9a2.js +472 -0
- package/dist-vue/_chunks/PkChatbotMessages-NODnY9a2.js.map +1 -0
- package/dist-vue/_chunks/{PkChatbotViewChat-hqsvz_7X.js → PkChatbotViewChat-BROfuqG3.js} +23 -22
- package/dist-vue/_chunks/PkChatbotViewChat-BROfuqG3.js.map +1 -0
- package/dist-vue/_chunks/{PkChatbotViewConversations-GNm8qoqA.js → PkChatbotViewConversations-B19iyIBD.js} +3 -3
- package/dist-vue/_chunks/{PkChatbotViewConversations-GNm8qoqA.js.map → PkChatbotViewConversations-B19iyIBD.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotViewProfile-C605zDZy.js → PkChatbotViewProfile-D2raknfo.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotViewProfile-C605zDZy.js.map → PkChatbotViewProfile-D2raknfo.js.map} +1 -1
- package/dist-vue/_chunks/{PkRelativeTime-jP41qAJ5.js → PkRelativeTime-WZ2aPcp_.js} +1 -1
- package/dist-vue/_chunks/{PkRelativeTime-jP41qAJ5.js.map → PkRelativeTime-WZ2aPcp_.js.map} +1 -1
- package/dist-vue/_chunks/{PkStreamingMarkdown-DvjHrpmN.js → PkStreamingMarkdown-BUiAi-qv.js} +1 -1
- package/dist-vue/_chunks/{PkStreamingMarkdown-DvjHrpmN.js.map → PkStreamingMarkdown-BUiAi-qv.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolRequestOAuthConnection-CsQc0Ju7.js → PkToolRequestOAuthConnection-CCVLUbiX.js} +2 -2
- package/dist-vue/_chunks/{PkToolRequestOAuthConnection-CsQc0Ju7.js.map → PkToolRequestOAuthConnection-CCVLUbiX.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowArtifact-LwE9r0Dz.js → PkToolShowArtifact-B13M7nEV.js} +3 -3
- package/dist-vue/_chunks/{PkToolShowArtifact-LwE9r0Dz.js.map → PkToolShowArtifact-B13M7nEV.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowCalendarEvent-ze3jGmX5.js → PkToolShowCalendarEvent-BuTDY0xa.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowCalendarEvent-ze3jGmX5.js.map → PkToolShowCalendarEvent-BuTDY0xa.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowComparison-CZ3kO6PT.js → PkToolShowComparison-By5K23oe.js} +3 -3
- package/dist-vue/_chunks/PkToolShowComparison-By5K23oe.js.map +1 -0
- package/dist-vue/_chunks/PkToolShowContactForm-D9mmqNvI.js +122 -0
- package/dist-vue/_chunks/PkToolShowContactForm-D9mmqNvI.js.map +1 -0
- package/dist-vue/_chunks/{PkToolShowEmail-BfpB-rs5.js → PkToolShowEmail-DFM6ClX-.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowEmail-BfpB-rs5.js.map → PkToolShowEmail-DFM6ClX-.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowImageGallery-D78Uthkj.js → PkToolShowImageGallery-By3Evwn4.js} +3 -3
- package/dist-vue/_chunks/{PkToolShowImageGallery-D78Uthkj.js.map → PkToolShowImageGallery-By3Evwn4.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowLocation-CsYef0jY.js → PkToolShowLocation-DW55PIk2.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowLocation-CsYef0jY.js.map → PkToolShowLocation-DW55PIk2.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowMessage-CWpjXtzt.js → PkToolShowMessage-BUujtIdB.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowMessage-CWpjXtzt.js.map → PkToolShowMessage-BUujtIdB.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowMultipleChoice-DF0ub4qZ.js → PkToolShowMultipleChoice-DoQHEPc0.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowMultipleChoice-DF0ub4qZ.js.map → PkToolShowMultipleChoice-DoQHEPc0.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowProductList-BQWK3I7I.js → PkToolShowProductList-C6pMC0td.js} +3 -3
- package/dist-vue/_chunks/{PkToolShowProductList-BQWK3I7I.js.map → PkToolShowProductList-C6pMC0td.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowQrCode-fGmIY8_T.js → PkToolShowQrCode-DZNSI7WD.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowQrCode-fGmIY8_T.js.map → PkToolShowQrCode-DZNSI7WD.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowSources-DjvToy__.js → PkToolShowSources-9avCy0zx.js} +4 -4
- package/dist-vue/_chunks/{PkToolShowSources-DjvToy__.js.map → PkToolShowSources-9avCy0zx.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowSuggestedReply-DtOTPUVf.js → PkToolShowSuggestedReply-BCdanuPg.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowSuggestedReply-DtOTPUVf.js.map → PkToolShowSuggestedReply-BCdanuPg.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowWeather-a4_T7lIK.js → PkToolShowWeather-BAHfvDAa.js} +1 -1
- package/dist-vue/_chunks/{PkToolShowWeather-a4_T7lIK.js.map → PkToolShowWeather-BAHfvDAa.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowWebPages-C-ClBVZm.js → PkToolShowWebPages-CRnjWep6.js} +3 -3
- package/dist-vue/_chunks/{PkToolShowWebPages-C-ClBVZm.js.map → PkToolShowWebPages-CRnjWep6.js.map} +1 -1
- package/dist-vue/_chunks/{PkUrl-C8L1MG2A.js → PkUrl-Da1k1VEM.js} +1 -1
- package/dist-vue/_chunks/{PkUrl-C8L1MG2A.js.map → PkUrl-Da1k1VEM.js.map} +1 -1
- package/dist-vue/_chunks/{apl-Q8pZMVVP.js → apl-BAiRVRB9.js} +1 -1
- package/dist-vue/_chunks/{apl-Q8pZMVVP.js.map → apl-BAiRVRB9.js.map} +1 -1
- package/dist-vue/_chunks/{asciiarmor-Dgm0UqoJ.js → asciiarmor-CDnl80Cc.js} +1 -1
- package/dist-vue/_chunks/{asciiarmor-Dgm0UqoJ.js.map → asciiarmor-CDnl80Cc.js.map} +1 -1
- package/dist-vue/_chunks/{asn1-D02Lu2iy.js → asn1-f4a3R9bP.js} +1 -1
- package/dist-vue/_chunks/{asn1-D02Lu2iy.js.map → asn1-f4a3R9bP.js.map} +1 -1
- package/dist-vue/_chunks/{asterisk-CNRpuZz9.js → asterisk-TbfcWk59.js} +1 -1
- package/dist-vue/_chunks/{asterisk-CNRpuZz9.js.map → asterisk-TbfcWk59.js.map} +1 -1
- package/dist-vue/_chunks/{brainfuck-B2UPzG6P.js → brainfuck-4PV2XjYq.js} +1 -1
- package/dist-vue/_chunks/{brainfuck-B2UPzG6P.js.map → brainfuck-4PV2XjYq.js.map} +1 -1
- package/dist-vue/_chunks/{clike-D8bd4tzV.js → clike-BwgfIzU-.js} +1 -1
- package/dist-vue/_chunks/{clike-D8bd4tzV.js.map → clike-BwgfIzU-.js.map} +1 -1
- package/dist-vue/_chunks/{clojure-wIiobTMZ.js → clojure-D3pGxSKq.js} +1 -1
- package/dist-vue/_chunks/{clojure-wIiobTMZ.js.map → clojure-D3pGxSKq.js.map} +1 -1
- package/dist-vue/_chunks/{cmake-BXv0H94m.js → cmake-BCnKEIrD.js} +1 -1
- package/dist-vue/_chunks/{cmake-BXv0H94m.js.map → cmake-BCnKEIrD.js.map} +1 -1
- package/dist-vue/_chunks/{cobol-DHS--Q0E.js → cobol-BYaGw1Yw.js} +1 -1
- package/dist-vue/_chunks/{cobol-DHS--Q0E.js.map → cobol-BYaGw1Yw.js.map} +1 -1
- package/dist-vue/_chunks/{coffeescript-DuPphqba.js → coffeescript-BkiWHrll.js} +1 -1
- package/dist-vue/_chunks/{coffeescript-DuPphqba.js.map → coffeescript-BkiWHrll.js.map} +1 -1
- package/dist-vue/_chunks/{commonlisp-C978VsBx.js → commonlisp-BmB0kcsA.js} +1 -1
- package/dist-vue/_chunks/{commonlisp-C978VsBx.js.map → commonlisp-BmB0kcsA.js.map} +1 -1
- package/dist-vue/_chunks/{createChatbotApiClient-tAXyZCUx.js → createChatbotApiClient-Dcrje955.js} +211 -115
- package/dist-vue/_chunks/createChatbotApiClient-Dcrje955.js.map +1 -0
- package/dist-vue/_chunks/{crystal-BTi9IGqB.js → crystal-j2Uodr6G.js} +1 -1
- package/dist-vue/_chunks/{crystal-BTi9IGqB.js.map → crystal-j2Uodr6G.js.map} +1 -1
- package/dist-vue/_chunks/{css-Byc0XEOa.js → css-DikOvTi5.js} +1 -1
- package/dist-vue/_chunks/{css-Byc0XEOa.js.map → css-DikOvTi5.js.map} +1 -1
- package/dist-vue/_chunks/{cypher-DbIDcgjc.js → cypher-CocRBvf0.js} +1 -1
- package/dist-vue/_chunks/{cypher-DbIDcgjc.js.map → cypher-CocRBvf0.js.map} +1 -1
- package/dist-vue/_chunks/{d-CfpiXU_s.js → d-By563UA3.js} +1 -1
- package/dist-vue/_chunks/{d-CfpiXU_s.js.map → d-By563UA3.js.map} +1 -1
- package/dist-vue/_chunks/{diff-Chsz7v8H.js → diff-B1bbhSQg.js} +1 -1
- package/dist-vue/_chunks/{diff-Chsz7v8H.js.map → diff-B1bbhSQg.js.map} +1 -1
- package/dist-vue/_chunks/{dist-BX9gMnDv.js → dist-1VuiSmDe.js} +3 -3
- package/dist-vue/_chunks/{dist-BX9gMnDv.js.map → dist-1VuiSmDe.js.map} +1 -1
- package/dist-vue/_chunks/{dist--K3HVPFP.js → dist-4zE2m0cC.js} +2 -2
- package/dist-vue/_chunks/{dist--K3HVPFP.js.map → dist-4zE2m0cC.js.map} +1 -1
- package/dist-vue/_chunks/{dist-DKu5hMyS.js → dist-6CvrlmzR.js} +5 -5
- package/dist-vue/_chunks/{dist-DKu5hMyS.js.map → dist-6CvrlmzR.js.map} +1 -1
- package/dist-vue/_chunks/{dist-dGGJB751.js → dist-BDIP4oQC.js} +3 -3
- package/dist-vue/_chunks/{dist-dGGJB751.js.map → dist-BDIP4oQC.js.map} +1 -1
- package/dist-vue/_chunks/{dist-BAhi8JnF.js → dist-BYcMzoKR.js} +2 -2
- package/dist-vue/_chunks/{dist-BAhi8JnF.js.map → dist-BYcMzoKR.js.map} +1 -1
- package/dist-vue/_chunks/{dist-sJCKYKfx.js → dist-BxM_in4x.js} +3 -3
- package/dist-vue/_chunks/{dist-sJCKYKfx.js.map → dist-BxM_in4x.js.map} +1 -1
- package/dist-vue/_chunks/{dist-qpPts-lE.js → dist-ByBDQkx9.js} +4 -4
- package/dist-vue/_chunks/{dist-qpPts-lE.js.map → dist-ByBDQkx9.js.map} +1 -1
- package/dist-vue/_chunks/{dist-C4Q2oVwo.js → dist-CbDm9BNK.js} +2 -2
- package/dist-vue/_chunks/{dist-C4Q2oVwo.js.map → dist-CbDm9BNK.js.map} +1 -1
- package/dist-vue/_chunks/{dist-Tm13weGi.js → dist-CcI0VoWs.js} +3 -3
- package/dist-vue/_chunks/{dist-Tm13weGi.js.map → dist-CcI0VoWs.js.map} +1 -1
- package/dist-vue/_chunks/{dist-DyCRk5Sz2.js → dist-CkV64K6q2.js} +3 -3
- package/dist-vue/_chunks/{dist-DyCRk5Sz2.js.map → dist-CkV64K6q2.js.map} +1 -1
- package/dist-vue/_chunks/{dist-CIN_Avbm.js → dist-D-R9PvqV.js} +1 -1
- package/dist-vue/_chunks/{dist-CIN_Avbm.js.map → dist-D-R9PvqV.js.map} +1 -1
- package/dist-vue/_chunks/{dist-KnH97L2h2.js → dist-D0U7Raxc2.js} +4 -4
- package/dist-vue/_chunks/{dist-KnH97L2h2.js.map → dist-D0U7Raxc2.js.map} +1 -1
- package/dist-vue/_chunks/{dist-B0QmqS0N.js → dist-D0Wm5IxH.js} +3 -3
- package/dist-vue/_chunks/{dist-B0QmqS0N.js.map → dist-D0Wm5IxH.js.map} +1 -1
- package/dist-vue/_chunks/{dist-DFvVVU0-.js → dist-D1-E577I.js} +2 -2
- package/dist-vue/_chunks/{dist-DFvVVU0-.js.map → dist-D1-E577I.js.map} +1 -1
- package/dist-vue/_chunks/{dist-DBu5ECbV2.js → dist-DC8yN_w12.js} +2 -2
- package/dist-vue/_chunks/{dist-DBu5ECbV2.js.map → dist-DC8yN_w12.js.map} +1 -1
- package/dist-vue/_chunks/{dist-DfJ0x-DV.js → dist-DIVYK7vr.js} +2 -2
- package/dist-vue/_chunks/{dist-DfJ0x-DV.js.map → dist-DIVYK7vr.js.map} +1 -1
- package/dist-vue/_chunks/{dist-DnGUlg51.js → dist-DIujXFeP.js} +3 -3
- package/dist-vue/_chunks/{dist-DnGUlg51.js.map → dist-DIujXFeP.js.map} +1 -1
- package/dist-vue/_chunks/{dist-8Ba2NTwQ.js → dist-DNMuMsYA.js} +3 -3
- package/dist-vue/_chunks/{dist-8Ba2NTwQ.js.map → dist-DNMuMsYA.js.map} +1 -1
- package/dist-vue/_chunks/{dist-DpBbH8yX.js → dist-Dq2JgmgY.js} +3 -3
- package/dist-vue/_chunks/{dist-DpBbH8yX.js.map → dist-Dq2JgmgY.js.map} +1 -1
- package/dist-vue/_chunks/{dist-D1vdEteA.js → dist-DtMND9KH.js} +2 -2
- package/dist-vue/_chunks/{dist-D1vdEteA.js.map → dist-DtMND9KH.js.map} +1 -1
- package/dist-vue/_chunks/{dist-BXMdPs2n.js → dist-Dy4eir4A.js} +2 -2
- package/dist-vue/_chunks/{dist-BXMdPs2n.js.map → dist-Dy4eir4A.js.map} +1 -1
- package/dist-vue/_chunks/{dist-zSYkbMGo.js → dist-x0QhP1E9.js} +4 -4
- package/dist-vue/_chunks/{dist-zSYkbMGo.js.map → dist-x0QhP1E9.js.map} +1 -1
- package/dist-vue/_chunks/{dockerfile-Bctf8YOl.js → dockerfile-DE9wt2dL.js} +2 -2
- package/dist-vue/_chunks/{dockerfile-Bctf8YOl.js.map → dockerfile-DE9wt2dL.js.map} +1 -1
- package/dist-vue/_chunks/{dtd-Bly5BFAf.js → dtd-CqxlpCqG.js} +1 -1
- package/dist-vue/_chunks/{dtd-Bly5BFAf.js.map → dtd-CqxlpCqG.js.map} +1 -1
- package/dist-vue/_chunks/{dylan-CzoYHa03.js → dylan-D1Gpc3L-.js} +1 -1
- package/dist-vue/_chunks/{dylan-CzoYHa03.js.map → dylan-D1Gpc3L-.js.map} +1 -1
- package/dist-vue/_chunks/{ebnf-4baG1T13.js → ebnf-DgP0YVa-.js} +1 -1
- package/dist-vue/_chunks/{ebnf-4baG1T13.js.map → ebnf-DgP0YVa-.js.map} +1 -1
- package/dist-vue/_chunks/{ecl-DUKN-Onz.js → ecl-KeBeM266.js} +1 -1
- package/dist-vue/_chunks/{ecl-DUKN-Onz.js.map → ecl-KeBeM266.js.map} +1 -1
- package/dist-vue/_chunks/{eiffel-Call-dqp.js → eiffel-C2i3fXO-.js} +1 -1
- package/dist-vue/_chunks/{eiffel-Call-dqp.js.map → eiffel-C2i3fXO-.js.map} +1 -1
- package/dist-vue/_chunks/{elm-DW-uVY9B.js → elm-Bv3L_mvL.js} +1 -1
- package/dist-vue/_chunks/{elm-DW-uVY9B.js.map → elm-Bv3L_mvL.js.map} +1 -1
- package/dist-vue/_chunks/{erlang-qvATK88s.js → erlang-DDXGK6MZ.js} +1 -1
- package/dist-vue/_chunks/{erlang-qvATK88s.js.map → erlang-DDXGK6MZ.js.map} +1 -1
- package/dist-vue/_chunks/{factor-DLyqB44S.js → factor-BMluBoEh.js} +2 -2
- package/dist-vue/_chunks/{factor-DLyqB44S.js.map → factor-BMluBoEh.js.map} +1 -1
- package/dist-vue/_chunks/{fcl-BrnRqE-k.js → fcl-Cmz-2giq.js} +1 -1
- package/dist-vue/_chunks/{fcl-BrnRqE-k.js.map → fcl-Cmz-2giq.js.map} +1 -1
- package/dist-vue/_chunks/{forth-DeYqvv5h.js → forth-DaWjj3JF.js} +1 -1
- package/dist-vue/_chunks/{forth-DeYqvv5h.js.map → forth-DaWjj3JF.js.map} +1 -1
- package/dist-vue/_chunks/{fortran-DdvDmAzM.js → fortran-Cjf1_njC.js} +1 -1
- package/dist-vue/_chunks/{fortran-DdvDmAzM.js.map → fortran-Cjf1_njC.js.map} +1 -1
- package/dist-vue/_chunks/{gas-BNdHmuUu.js → gas-Dw0EKIt6.js} +1 -1
- package/dist-vue/_chunks/{gas-BNdHmuUu.js.map → gas-Dw0EKIt6.js.map} +1 -1
- package/dist-vue/_chunks/{gherkin-CBC9qNkO.js → gherkin-BmhCQ-3F.js} +1 -1
- package/dist-vue/_chunks/{gherkin-CBC9qNkO.js.map → gherkin-BmhCQ-3F.js.map} +1 -1
- package/dist-vue/_chunks/{groovy-GC0PSVJU.js → groovy-Ce2VCAj0.js} +1 -1
- package/dist-vue/_chunks/{groovy-GC0PSVJU.js.map → groovy-Ce2VCAj0.js.map} +1 -1
- package/dist-vue/_chunks/{haskell-BKrhNlBi.js → haskell-CL9NsPDf.js} +1 -1
- package/dist-vue/_chunks/{haskell-BKrhNlBi.js.map → haskell-CL9NsPDf.js.map} +1 -1
- package/dist-vue/_chunks/{haxe-CPxacElW.js → haxe-Bbed1mIk.js} +1 -1
- package/dist-vue/_chunks/{haxe-CPxacElW.js.map → haxe-Bbed1mIk.js.map} +1 -1
- package/dist-vue/_chunks/{http-B_g6rpYy.js → http-CQ9T-AS4.js} +1 -1
- package/dist-vue/_chunks/{http-B_g6rpYy.js.map → http-CQ9T-AS4.js.map} +1 -1
- package/dist-vue/_chunks/{idl-nWWgQIyM.js → idl-CvhgP0zv.js} +1 -1
- package/dist-vue/_chunks/{idl-nWWgQIyM.js.map → idl-CvhgP0zv.js.map} +1 -1
- package/dist-vue/_chunks/{javascript-LK1o3VqT.js → javascript-Btb8UHXp.js} +1 -1
- package/dist-vue/_chunks/{javascript-LK1o3VqT.js.map → javascript-Btb8UHXp.js.map} +1 -1
- package/dist-vue/_chunks/{julia-BTozo5av.js → julia-DTNyuRVE.js} +1 -1
- package/dist-vue/_chunks/{julia-BTozo5av.js.map → julia-DTNyuRVE.js.map} +1 -1
- package/dist-vue/_chunks/{livescript-DpF2_JFC.js → livescript-CsLAR-Dk.js} +1 -1
- package/dist-vue/_chunks/{livescript-DpF2_JFC.js.map → livescript-CsLAR-Dk.js.map} +1 -1
- package/dist-vue/_chunks/{lua-tQN-2Pk0.js → lua-TjS61pff.js} +1 -1
- package/dist-vue/_chunks/{lua-tQN-2Pk0.js.map → lua-TjS61pff.js.map} +1 -1
- package/dist-vue/_chunks/{mathematica-CvawU267.js → mathematica-B36wjihf.js} +1 -1
- package/dist-vue/_chunks/{mathematica-CvawU267.js.map → mathematica-B36wjihf.js.map} +1 -1
- package/dist-vue/_chunks/{mbox-CoCfe6cW.js → mbox-l34D_Sup.js} +1 -1
- package/dist-vue/_chunks/{mbox-CoCfe6cW.js.map → mbox-l34D_Sup.js.map} +1 -1
- package/dist-vue/_chunks/{mirc-COd5tE63.js → mirc-ClsitdIY.js} +1 -1
- package/dist-vue/_chunks/{mirc-COd5tE63.js.map → mirc-ClsitdIY.js.map} +1 -1
- package/dist-vue/_chunks/{mllike-DDHxpeHd.js → mllike-CfQSkcI7.js} +1 -1
- package/dist-vue/_chunks/{mllike-DDHxpeHd.js.map → mllike-CfQSkcI7.js.map} +1 -1
- package/dist-vue/_chunks/{modelica-lMYNHoEu.js → modelica-CbCNcNrB.js} +1 -1
- package/dist-vue/_chunks/{modelica-lMYNHoEu.js.map → modelica-CbCNcNrB.js.map} +1 -1
- package/dist-vue/_chunks/{mscgen-BDVHHK85.js → mscgen-BEGyn8Kg.js} +1 -1
- package/dist-vue/_chunks/{mscgen-BDVHHK85.js.map → mscgen-BEGyn8Kg.js.map} +1 -1
- package/dist-vue/_chunks/{mumps-Cytx8qiy.js → mumps-Dr2ezLO-.js} +1 -1
- package/dist-vue/_chunks/{mumps-Cytx8qiy.js.map → mumps-Dr2ezLO-.js.map} +1 -1
- package/dist-vue/_chunks/{nginx-DkyUeyBK.js → nginx-Bi4gDD3m.js} +1 -1
- package/dist-vue/_chunks/{nginx-DkyUeyBK.js.map → nginx-Bi4gDD3m.js.map} +1 -1
- package/dist-vue/_chunks/{nsis-if-eCOXK.js → nsis-tIoKsxwO.js} +2 -2
- package/dist-vue/_chunks/{nsis-if-eCOXK.js.map → nsis-tIoKsxwO.js.map} +1 -1
- package/dist-vue/_chunks/{ntriples-D-c0_vEi.js → ntriples-BpLyHtBK.js} +1 -1
- package/dist-vue/_chunks/{ntriples-D-c0_vEi.js.map → ntriples-BpLyHtBK.js.map} +1 -1
- package/dist-vue/_chunks/{octave-Co_9SHXf.js → octave-BFLmhqOS.js} +1 -1
- package/dist-vue/_chunks/{octave-Co_9SHXf.js.map → octave-BFLmhqOS.js.map} +1 -1
- package/dist-vue/_chunks/{oz-0gSLg5tX.js → oz-DZWYUv0Q.js} +1 -1
- package/dist-vue/_chunks/{oz-0gSLg5tX.js.map → oz-DZWYUv0Q.js.map} +1 -1
- package/dist-vue/_chunks/{pascal-EFiy6L3H.js → pascal-C9E98ftD.js} +1 -1
- package/dist-vue/_chunks/{pascal-EFiy6L3H.js.map → pascal-C9E98ftD.js.map} +1 -1
- package/dist-vue/_chunks/{perl-6G11E8em.js → perl-BVKFqc1F.js} +1 -1
- package/dist-vue/_chunks/{perl-6G11E8em.js.map → perl-BVKFqc1F.js.map} +1 -1
- package/dist-vue/_chunks/{pig-BW1hm3XT.js → pig-D6QFO3WI.js} +1 -1
- package/dist-vue/_chunks/{pig-BW1hm3XT.js.map → pig-D6QFO3WI.js.map} +1 -1
- package/dist-vue/_chunks/{powershell-Bt-QJoDH.js → powershell-2IfoeWan.js} +1 -1
- package/dist-vue/_chunks/{powershell-Bt-QJoDH.js.map → powershell-2IfoeWan.js.map} +1 -1
- package/dist-vue/_chunks/{properties-D_XHdyRl.js → properties-C2B2ArUy.js} +1 -1
- package/dist-vue/_chunks/{properties-D_XHdyRl.js.map → properties-C2B2ArUy.js.map} +1 -1
- package/dist-vue/_chunks/{protobuf-B2341jP2.js → protobuf-B4WeH-l7.js} +1 -1
- package/dist-vue/_chunks/{protobuf-B2341jP2.js.map → protobuf-B4WeH-l7.js.map} +1 -1
- package/dist-vue/_chunks/{pug-16scRmP0.js → pug-CQ-5YOub.js} +2 -2
- package/dist-vue/_chunks/{pug-16scRmP0.js.map → pug-CQ-5YOub.js.map} +1 -1
- package/dist-vue/_chunks/{puppet-BnknQ9uc.js → puppet-C57db21O.js} +1 -1
- package/dist-vue/_chunks/{puppet-BnknQ9uc.js.map → puppet-C57db21O.js.map} +1 -1
- package/dist-vue/_chunks/{python-Dx6wyD-h.js → python-L3kdHi6C.js} +1 -1
- package/dist-vue/_chunks/{python-Dx6wyD-h.js.map → python-L3kdHi6C.js.map} +1 -1
- package/dist-vue/_chunks/{q-CwYXS2Js.js → q-DQI-vHRp.js} +1 -1
- package/dist-vue/_chunks/{q-CwYXS2Js.js.map → q-DQI-vHRp.js.map} +1 -1
- package/dist-vue/_chunks/{r-B31sqbQ3.js → r-DhKB-o8I.js} +1 -1
- package/dist-vue/_chunks/{r-B31sqbQ3.js.map → r-DhKB-o8I.js.map} +1 -1
- package/dist-vue/_chunks/{rpm-B0MmKWRw.js → rpm-D56QajaS.js} +1 -1
- package/dist-vue/_chunks/{rpm-B0MmKWRw.js.map → rpm-D56QajaS.js.map} +1 -1
- package/dist-vue/_chunks/{ruby-DXiHl-Yz.js → ruby-BcD3iVWj.js} +1 -1
- package/dist-vue/_chunks/{ruby-DXiHl-Yz.js.map → ruby-BcD3iVWj.js.map} +1 -1
- package/dist-vue/_chunks/{sas-B4XJ2693.js → sas-D1OuUIKN.js} +1 -1
- package/dist-vue/_chunks/{sas-B4XJ2693.js.map → sas-D1OuUIKN.js.map} +1 -1
- package/dist-vue/_chunks/{scheme-Df6d10fH.js → scheme-CUrJ3_0S.js} +1 -1
- package/dist-vue/_chunks/{scheme-Df6d10fH.js.map → scheme-CUrJ3_0S.js.map} +1 -1
- package/dist-vue/_chunks/{shell-BV8cKKHJ.js → shell-BPM0XoRU.js} +1 -1
- package/dist-vue/_chunks/{shell-BV8cKKHJ.js.map → shell-BPM0XoRU.js.map} +1 -1
- package/dist-vue/_chunks/{sieve-KCcjO0gU.js → sieve-n-ojLaJW.js} +1 -1
- package/dist-vue/_chunks/{sieve-KCcjO0gU.js.map → sieve-n-ojLaJW.js.map} +1 -1
- package/dist-vue/_chunks/{simple-mode-eFYrLHNd.js → simple-mode-DGBVTMBE.js} +1 -1
- package/dist-vue/_chunks/{simple-mode-eFYrLHNd.js.map → simple-mode-DGBVTMBE.js.map} +1 -1
- package/dist-vue/_chunks/{smalltalk-TnIZTtVY.js → smalltalk-CbOtG3J-.js} +1 -1
- package/dist-vue/_chunks/{smalltalk-TnIZTtVY.js.map → smalltalk-CbOtG3J-.js.map} +1 -1
- package/dist-vue/_chunks/{solr-D67CeY1D.js → solr-CC7GnBmE.js} +1 -1
- package/dist-vue/_chunks/{solr-D67CeY1D.js.map → solr-CC7GnBmE.js.map} +1 -1
- package/dist-vue/_chunks/{sparql-D0t-Guzg.js → sparql-DC2C8LuG.js} +1 -1
- package/dist-vue/_chunks/{sparql-D0t-Guzg.js.map → sparql-DC2C8LuG.js.map} +1 -1
- package/dist-vue/_chunks/{spreadsheet-NH0IWwbw.js → spreadsheet-rMh9jzuD.js} +1 -1
- package/dist-vue/_chunks/{spreadsheet-NH0IWwbw.js.map → spreadsheet-rMh9jzuD.js.map} +1 -1
- package/dist-vue/_chunks/{sql-B5Rl3TuV.js → sql-C15h02N-.js} +1 -1
- package/dist-vue/_chunks/{sql-B5Rl3TuV.js.map → sql-C15h02N-.js.map} +1 -1
- package/dist-vue/_chunks/{stex-Bu2gC9SM.js → stex-BQU7jli4.js} +1 -1
- package/dist-vue/_chunks/{stex-Bu2gC9SM.js.map → stex-BQU7jli4.js.map} +1 -1
- package/dist-vue/_chunks/{stylus-SIPLRHxF.js → stylus-Fj84CAVA.js} +1 -1
- package/dist-vue/_chunks/{stylus-SIPLRHxF.js.map → stylus-Fj84CAVA.js.map} +1 -1
- package/dist-vue/_chunks/{swift-B_JaBro8.js → swift-CrzZIdws.js} +1 -1
- package/dist-vue/_chunks/{swift-B_JaBro8.js.map → swift-CrzZIdws.js.map} +1 -1
- package/dist-vue/_chunks/{tcl-ChmdQusa.js → tcl-BvFcqrC1.js} +1 -1
- package/dist-vue/_chunks/{tcl-ChmdQusa.js.map → tcl-BvFcqrC1.js.map} +1 -1
- package/dist-vue/_chunks/{textile-BukFHU5C.js → textile-CAX0nrzJ.js} +1 -1
- package/dist-vue/_chunks/{textile-BukFHU5C.js.map → textile-CAX0nrzJ.js.map} +1 -1
- package/dist-vue/_chunks/{tiddlywiki-Cjof9i6e.js → tiddlywiki-D5Gu8Cgp.js} +1 -1
- package/dist-vue/_chunks/{tiddlywiki-Cjof9i6e.js.map → tiddlywiki-D5Gu8Cgp.js.map} +1 -1
- package/dist-vue/_chunks/{tiki-DqShKWqG.js → tiki-BelGwBNb.js} +1 -1
- package/dist-vue/_chunks/{tiki-DqShKWqG.js.map → tiki-BelGwBNb.js.map} +1 -1
- package/dist-vue/_chunks/{toml-BATqZFcK.js → toml-BEm4Ctws.js} +1 -1
- package/dist-vue/_chunks/{toml-BATqZFcK.js.map → toml-BEm4Ctws.js.map} +1 -1
- package/dist-vue/_chunks/{troff-PbwxY1FZ.js → troff-lWffuAea.js} +1 -1
- package/dist-vue/_chunks/{troff-PbwxY1FZ.js.map → troff-lWffuAea.js.map} +1 -1
- package/dist-vue/_chunks/{ttcn-BSxIkHWh.js → ttcn-CJo3GWqH.js} +1 -1
- package/dist-vue/_chunks/{ttcn-BSxIkHWh.js.map → ttcn-CJo3GWqH.js.map} +1 -1
- package/dist-vue/_chunks/{ttcn-cfg-pJEPzif5.js → ttcn-cfg-C9gCx5K3.js} +1 -1
- package/dist-vue/_chunks/{ttcn-cfg-pJEPzif5.js.map → ttcn-cfg-C9gCx5K3.js.map} +1 -1
- package/dist-vue/_chunks/{turtle-B0nZo8hJ.js → turtle-Bg3JtSZx.js} +1 -1
- package/dist-vue/_chunks/{turtle-B0nZo8hJ.js.map → turtle-Bg3JtSZx.js.map} +1 -1
- package/dist-vue/_chunks/{useChatbotStore-C1gZgvam.js → useChatbotStore-DE8leYO8.js} +3 -2
- package/dist-vue/_chunks/{useChatbotStore-C1gZgvam.js.map → useChatbotStore-DE8leYO8.js.map} +1 -1
- package/dist-vue/_chunks/useLocalizedString-CW0dVF2K.js +14 -0
- package/dist-vue/_chunks/useLocalizedString-CW0dVF2K.js.map +1 -0
- package/dist-vue/_chunks/{utils-BTa2h3WM.js → utils-CRojvghU.js} +26 -11
- package/dist-vue/_chunks/utils-CRojvghU.js.map +1 -0
- package/dist-vue/_chunks/{vb-BRq_7ZF9.js → vb-Xh1Jl3M6.js} +1 -1
- package/dist-vue/_chunks/{vb-BRq_7ZF9.js.map → vb-Xh1Jl3M6.js.map} +1 -1
- package/dist-vue/_chunks/{vbscript-B6ZIwOLd.js → vbscript-NjJzWxN6.js} +1 -1
- package/dist-vue/_chunks/{vbscript-B6ZIwOLd.js.map → vbscript-NjJzWxN6.js.map} +1 -1
- package/dist-vue/_chunks/{velocity-BvxA2zsa.js → velocity-CRJkj7qc.js} +1 -1
- package/dist-vue/_chunks/{velocity-BvxA2zsa.js.map → velocity-CRJkj7qc.js.map} +1 -1
- package/dist-vue/_chunks/{verilog-B3osH5GQ.js → verilog-CBHbxdbo.js} +1 -1
- package/dist-vue/_chunks/{verilog-B3osH5GQ.js.map → verilog-CBHbxdbo.js.map} +1 -1
- package/dist-vue/_chunks/{vhdl-CR1z1JUE.js → vhdl-BxdacNfs.js} +1 -1
- package/dist-vue/_chunks/{vhdl-CR1z1JUE.js.map → vhdl-BxdacNfs.js.map} +1 -1
- package/dist-vue/_chunks/{webidl-C74Qva8l.js → webidl-BuFj0gB5.js} +1 -1
- package/dist-vue/_chunks/{webidl-C74Qva8l.js.map → webidl-BuFj0gB5.js.map} +1 -1
- package/dist-vue/_chunks/{xquery-hmT-vB1m.js → xquery-DA__vFXM.js} +1 -1
- package/dist-vue/_chunks/{xquery-hmT-vB1m.js.map → xquery-DA__vFXM.js.map} +1 -1
- package/dist-vue/_chunks/{yacas-B2_Uw5g-.js → yacas-C0zyYz-1.js} +1 -1
- package/dist-vue/_chunks/{yacas-B2_Uw5g-.js.map → yacas-C0zyYz-1.js.map} +1 -1
- package/dist-vue/_chunks/{z80-BDY8ScET.js → z80-D0C3d2Md.js} +1 -1
- package/dist-vue/_chunks/{z80-BDY8ScET.js.map → z80-D0C3d2Md.js.map} +1 -1
- package/dist-vue/api.js +1 -1
- package/dist-vue/apps/web-component/src/composables/index.d.ts +1 -0
- package/dist-vue/apps/web-component/src/composables/useChatbotAuth.d.ts +2 -2
- package/dist-vue/composables.js +62 -61
- package/dist-vue/composables.js.map +1 -1
- package/dist-vue/index.js +4536 -3897
- package/dist-vue/index.js.map +1 -1
- package/dist-vue/locales.js +72 -28
- package/dist-vue/packages/auth/src/index.d.ts +2 -2
- package/dist-vue/packages/components/src/PkEditorMedia.d.ts +1 -1
- package/dist-vue/packages/components/src/chat/PkAgentSettingsPanel.d.ts +135 -9
- package/dist-vue/packages/components/src/chat/PkReasoningSettings.d.ts +54 -0
- package/dist-vue/packages/components/src/chat/PkWebSearchSettings.d.ts +105 -0
- package/dist-vue/packages/components/src/chat/constants.d.ts +1 -1
- package/dist-vue/packages/components/src/chat/index.d.ts +3 -1
- package/dist-vue/packages/components/src/chat/utils.d.ts +6 -0
- package/dist-vue/packages/components/src/composables/index.d.ts +0 -2
- package/dist-vue/packages/composable/src/index.d.ts +2 -0
- package/dist-vue/packages/{components/src/composables → composable/src}/useChatbotError.d.ts +1 -1
- package/dist-vue/packages/{components/src/composables → composable/src}/useLocalizedString.d.ts +1 -1
- package/dist-vue/packages/models/src/schema/Agent.d.ts +633 -63
- package/dist-vue/packages/models/src/schema/AgentChatStatistics.d.ts +1 -1
- package/dist-vue/packages/models/src/schema/Chat.d.ts +104 -13
- package/dist-vue/packages/models/src/schema/Integration.d.ts +1 -1
- package/dist-vue/packages/models/src/schema/McpServer.d.ts +6 -6
- package/dist-vue/packages/models/src/schema/ReasoningChat.d.ts +209 -27
- package/dist-vue/packages/models/src/schema/SubAgent.d.ts +209 -27
- package/dist-vue/style.css +1 -1
- package/package.json +2 -2
- package/dist/_chunks/PkToolShowComparison-D_DtpXRO.js.map +0 -1
- package/dist/_chunks/VvCheckbox.es-LSjS8_8K.js.map +0 -1
- package/dist/_chunks/VvCheckboxGroup.es-CR5ZTD2H.js.map +0 -1
- package/dist/_chunks/VvCombobox.es-B8E1RmUn.js.map +0 -1
- package/dist/_chunks/VvInputText.es-BYAhw1yP.js.map +0 -1
- package/dist/_chunks/VvRadio.es-CQj6S-QP.js.map +0 -1
- package/dist/_chunks/VvRadioGroup.es-9AWwbBXm.js.map +0 -1
- package/dist/_chunks/VvSelect.es-DAmZPvCV.js.map +0 -1
- package/dist/_chunks/VvTextarea.es-BfgLTEPk.js.map +0 -1
- package/dist-vue/_chunks/PkChatbot-Cqu5lhyS.js +0 -191
- package/dist-vue/_chunks/PkChatbot-Cqu5lhyS.js.map +0 -1
- package/dist-vue/_chunks/PkChatbotError-C1ZxZlwQ.js.map +0 -1
- package/dist-vue/_chunks/PkChatbotMessages-DFgERA1l.js +0 -468
- package/dist-vue/_chunks/PkChatbotMessages-DFgERA1l.js.map +0 -1
- package/dist-vue/_chunks/PkChatbotViewChat-hqsvz_7X.js.map +0 -1
- package/dist-vue/_chunks/PkToolShowComparison-CZ3kO6PT.js.map +0 -1
- package/dist-vue/_chunks/PkToolShowContactForm-CTbMiGnv.js +0 -130
- package/dist-vue/_chunks/PkToolShowContactForm-CTbMiGnv.js.map +0 -1
- package/dist-vue/_chunks/createChatbotApiClient-tAXyZCUx.js.map +0 -1
- package/dist-vue/_chunks/utils-BTa2h3WM.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PkChatbotMessages-DFgERA1l.js","names":["$d","$emit","$n"],"sources":["../../../../packages/components/src/chat/toolComponentMap.ts","../../../../packages/components/src/chat/PkStreamingMarkdownAutoscroll.vue","../../../../packages/components/src/chat/PkStreamingMarkdownAutoscroll.vue","../../../../packages/components/src/chat/useChatScroll.ts","../../../../packages/components/src/chat/PkChatbotMessages.vue","../../../../packages/components/src/chat/PkChatbotMessages.vue"],"sourcesContent":["import { defineAsyncComponent } from 'vue'\n\n/**\n * Maps tool `part.type` to the corresponding component for auto-rendering.\n * Only includes simple tools that accept only a `:part` prop.\n * Interactive tools (showContactForm, showSuggestedReply, showSources,\n * showMultipleChoice) must be wired explicitly in the parent with their\n * required callbacks/events.\n */\nexport const toolComponentMap: Record<\n string,\n ReturnType<typeof defineAsyncComponent>\n> = {\n showArtifact: defineAsyncComponent(\n () => import('./PkToolShowArtifact.vue'),\n ),\n showCalendarEvent: defineAsyncComponent(\n () => import('./PkToolShowCalendarEvent.vue'),\n ),\n showComparison: defineAsyncComponent(\n () => import('./PkToolShowComparison.vue'),\n ),\n showContactForm: defineAsyncComponent(\n () => import('./PkToolShowContactForm.vue'),\n ),\n showEmail: defineAsyncComponent(() => import('./PkToolShowEmail.vue')),\n showImageGallery: defineAsyncComponent(\n () => import('./PkToolShowImageGallery.vue'),\n ),\n showLocation: defineAsyncComponent(\n () => import('./PkToolShowLocation.vue'),\n ),\n showMessage: defineAsyncComponent(() => import('./PkToolShowMessage.vue')),\n showMultipleChoice: defineAsyncComponent(\n () => import('./PkToolShowMultipleChoice.vue'),\n ),\n showProductList: defineAsyncComponent(\n () => import('./PkToolShowProductList.vue'),\n ),\n showQrCode: defineAsyncComponent(() => import('./PkToolShowQrCode.vue')),\n showSources: defineAsyncComponent(() => import('./PkToolShowSources.vue')),\n showSuggestedReply: defineAsyncComponent(\n () => import('./PkToolShowSuggestedReply.vue'),\n ),\n requestOAuthConnection: defineAsyncComponent(\n () => import('./PkToolRequestOAuthConnection.vue'),\n ),\n showWeather: defineAsyncComponent(() => import('./PkToolShowWeather.vue')),\n showWebPages: defineAsyncComponent(\n () => import('./PkToolShowWebPages.vue'),\n ),\n}\n","<script lang=\"ts\" setup>\n import { nextTick, ref, watch } from 'vue'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n\n const props = defineProps<{\n markdown?: string\n innerClass?: string\n }>()\n\n const scrollEl = ref<HTMLDivElement>()\n const lastScrollTop = ref<number>(0)\n const stopAutoScroll = ref<boolean>(false)\n\n const handleScroll = () => {\n if (!scrollEl.value) {\n return\n }\n const currentScrollTop = scrollEl.value.scrollTop\n if (currentScrollTop < lastScrollTop.value) {\n const delta = lastScrollTop.value - currentScrollTop\n if (delta < 50) {\n stopAutoScroll.value = true\n }\n }\n if (currentScrollTop > lastScrollTop.value) {\n if (\n currentScrollTop ===\n scrollEl.value.scrollHeight - scrollEl.value.clientHeight\n ) {\n stopAutoScroll.value = false\n }\n }\n lastScrollTop.value = currentScrollTop\n }\n\n watch(\n () => props.markdown,\n async () => {\n await nextTick()\n if (scrollEl.value && !stopAutoScroll.value) {\n scrollEl.value.scrollTop = scrollEl.value.scrollHeight\n }\n },\n { immediate: true },\n )\n</script>\n\n<template>\n <div\n ref=\"scrollEl\"\n class=\"overflow-auto light-scrollbar\"\n @scroll=\"handleScroll\">\n <PkStreamingMarkdown :markdown=\"markdown\" :class=\"innerClass\" />\n </div>\n</template>\n","<script lang=\"ts\" setup>\n import { nextTick, ref, watch } from 'vue'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n\n const props = defineProps<{\n markdown?: string\n innerClass?: string\n }>()\n\n const scrollEl = ref<HTMLDivElement>()\n const lastScrollTop = ref<number>(0)\n const stopAutoScroll = ref<boolean>(false)\n\n const handleScroll = () => {\n if (!scrollEl.value) {\n return\n }\n const currentScrollTop = scrollEl.value.scrollTop\n if (currentScrollTop < lastScrollTop.value) {\n const delta = lastScrollTop.value - currentScrollTop\n if (delta < 50) {\n stopAutoScroll.value = true\n }\n }\n if (currentScrollTop > lastScrollTop.value) {\n if (\n currentScrollTop ===\n scrollEl.value.scrollHeight - scrollEl.value.clientHeight\n ) {\n stopAutoScroll.value = false\n }\n }\n lastScrollTop.value = currentScrollTop\n }\n\n watch(\n () => props.markdown,\n async () => {\n await nextTick()\n if (scrollEl.value && !stopAutoScroll.value) {\n scrollEl.value.scrollTop = scrollEl.value.scrollHeight\n }\n },\n { immediate: true },\n )\n</script>\n\n<template>\n <div\n ref=\"scrollEl\"\n class=\"overflow-auto light-scrollbar\"\n @scroll=\"handleScroll\">\n <PkStreamingMarkdown :markdown=\"markdown\" :class=\"innerClass\" />\n </div>\n</template>\n","import type { Ref, ShallowRef } from 'vue'\nimport { ref, watch, onMounted, onBeforeUnmount, nextTick } from 'vue'\n\nconst NEAR_BOTTOM_THRESHOLD = 30\nconst SCROLL_UP_THRESHOLD = 50\nconst SMOOTH_SCROLL_DURATION = 500\n\ninterface UseChatScrollOptions {\n scrollEl:\n | Readonly<ShallowRef<HTMLDivElement | null>>\n | Ref<HTMLDivElement | undefined>\n status: () => string | undefined\n messagesLength: () => number | undefined\n lastMessageRole: () => string | undefined\n onScrollUp?: () => void\n onScrollDown?: () => void\n}\n\nexport function useChatScroll(options: UseChatScrollOptions) {\n const {\n scrollEl,\n status,\n messagesLength,\n lastMessageRole,\n onScrollUp,\n onScrollDown,\n } = options\n\n const userScrolledUp = ref(false)\n let isAutoScrolling = false\n let mutationObserver: MutationObserver | null = null\n let resizeObserver: ResizeObserver | null = null\n let initMutationObserver: MutationObserver | null = null\n let lastScrollTop = 0\n\n // --- Core scroll ---\n\n const scrollToBottom = (behavior: ScrollBehavior = 'smooth') => {\n if (!scrollEl.value || userScrolledUp.value) {\n return\n }\n isAutoScrolling = true\n scrollEl.value.scrollTo({\n top: scrollEl.value.scrollHeight,\n behavior,\n })\n const unlockDelay = behavior === 'instant' ? 0 : SMOOTH_SCROLL_DURATION\n setTimeout(() => {\n isAutoScrolling = false\n }, unlockDelay)\n }\n\n // --- User scroll detection ---\n\n const handleScroll = () => {\n if (!scrollEl.value) {\n return\n }\n const currentScrollTop = scrollEl.value.scrollTop\n if (isAutoScrolling) {\n lastScrollTop = currentScrollTop\n return\n }\n\n if (currentScrollTop < lastScrollTop) {\n if (lastScrollTop - currentScrollTop < SCROLL_UP_THRESHOLD) {\n userScrolledUp.value = true\n }\n onScrollUp?.()\n }\n\n if (currentScrollTop > lastScrollTop) {\n const { scrollHeight, clientHeight } = scrollEl.value\n if (\n scrollHeight - clientHeight - currentScrollTop <\n NEAR_BOTTOM_THRESHOLD\n ) {\n userScrolledUp.value = false\n }\n onScrollDown?.()\n }\n\n lastScrollTop = currentScrollTop\n }\n\n // --- Streaming auto-scroll ---\n\n const startMutationScroll = () => {\n if (mutationObserver || !scrollEl.value) {\n return\n }\n mutationObserver = new MutationObserver(() => {\n if (isAutoScrolling || userScrolledUp.value || !scrollEl.value) {\n return\n }\n isAutoScrolling = true\n scrollEl.value.scrollTop = scrollEl.value.scrollHeight\n requestAnimationFrame(() => {\n isAutoScrolling = false\n })\n })\n mutationObserver.observe(scrollEl.value, {\n childList: true,\n subtree: true,\n characterData: true,\n })\n }\n\n const stopMutationScroll = () => {\n mutationObserver?.disconnect()\n mutationObserver = null\n }\n\n // --- Status watcher ---\n\n watch(status, (newStatus, oldStatus) => {\n if (newStatus === 'streaming' || newStatus === 'submitted') {\n startMutationScroll()\n return\n }\n if (newStatus === 'ready' && oldStatus === 'streaming') {\n // Keep observer active to catch footer buttons rendering\n return\n }\n stopMutationScroll()\n })\n\n // --- New message watcher ---\n\n watch(messagesLength, async () => {\n if (!messagesLength()) {\n return\n }\n if (lastMessageRole() === 'assistant') {\n return\n }\n userScrolledUp.value = false\n isAutoScrolling = true\n await nextTick()\n scrollToBottom()\n })\n\n // --- Initial scroll ---\n\n let initialScrollTimer: ReturnType<typeof setTimeout> | null = null\n const INITIAL_SCROLL_SETTLE_MS = 300\n\n const tryInitialScroll = () => {\n if (!scrollEl.value) {\n return\n }\n if (scrollEl.value.scrollHeight <= scrollEl.value.clientHeight) {\n return\n }\n scrollEl.value.scrollTop = scrollEl.value.scrollHeight\n\n // Reset the settle timer on each mutation — disconnect only after stability\n if (initialScrollTimer) {\n clearTimeout(initialScrollTimer)\n }\n initialScrollTimer = setTimeout(\n cleanupInitialObservers,\n INITIAL_SCROLL_SETTLE_MS,\n )\n }\n\n const cleanupInitialObservers = () => {\n resizeObserver?.disconnect()\n resizeObserver = null\n initMutationObserver?.disconnect()\n initMutationObserver = null\n if (initialScrollTimer) {\n clearTimeout(initialScrollTimer)\n initialScrollTimer = null\n }\n }\n\n onMounted(() => {\n if (!scrollEl.value) {\n return\n }\n resizeObserver = new ResizeObserver(tryInitialScroll)\n resizeObserver.observe(scrollEl.value)\n\n initMutationObserver = new MutationObserver(tryInitialScroll)\n initMutationObserver.observe(scrollEl.value, {\n childList: true,\n subtree: true,\n })\n\n tryInitialScroll()\n })\n\n onBeforeUnmount(() => {\n stopMutationScroll()\n cleanupInitialObservers()\n })\n\n return {\n handleScroll,\n scrollToBottom,\n userScrolledUp,\n }\n}\n","<script lang=\"ts\" setup>\n import type {\n ChatMessageActions,\n MessageFeedback,\n RevisedAnswer,\n UIChatMessage,\n } from 'models'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n import PkChatbotError from './PkChatbotError.vue'\n import PkChatbotFeedbackForm from './PkChatbotFeedbackForm.vue'\n import PkChatbotFilePreview from './PkChatbotFilePreview.vue'\n import PkRelativeTime from '../PkRelativeTime.vue'\n import { useI18n } from 'vue-i18n'\n import {\n useTemplateRef,\n ref,\n watch,\n computed,\n nextTick,\n useSlots,\n } from 'vue'\n import { toolComponentMap } from './toolComponentMap'\n import {\n resolveContrastColor,\n getPartState,\n isTextPart,\n isFilePart,\n isToolPart,\n isStreamingPart,\n getPartIcon,\n getToolPartLabel,\n } from './utils'\n import { getToolPartName, toKebabCase } from 'utils'\n import PkStreamingMarkdownAutoscroll from './PkStreamingMarkdownAutoscroll.vue'\n import { useChatScroll } from './useChatScroll'\n\n const props = defineProps<{\n status?: 'submitted' | 'streaming' | 'ready' | 'error'\n messages?: UIChatMessage[]\n logo?: string\n name?: string\n error?: Error\n actions?: ChatMessageActions[]\n mainColor?: string\n textColor?: 'auto' | 'white' | 'black'\n revisedAnswers?: RevisedAnswer[]\n messageFeedbacks?: MessageFeedback[]\n disableHeightAdjustment?: boolean\n showMessageDateTime?: boolean\n showMessageTokensCount?: boolean\n showAllMessageParts?: boolean\n // TODO: move feedback in a separate component to avoid passing these props\n feedbackMessageId?: string\n feedbackLoading?: boolean\n feedbackSubmitted?: boolean\n feedbackError?: string\n }>()\n\n const emit = defineEmits<{\n (e: 'show-info', message: UIChatMessage): void\n (e: 'regenerate'): void\n (e: 'revise', message: UIChatMessage): void\n (e: 'upvote', message: UIChatMessage): void\n (e: 'downvote', message: UIChatMessage): void\n (e: 'feedback', message: UIChatMessage): void\n (e: 'feedback-submit', comment: string): void\n (e: 'feedback-close'): void\n (e: 'scroll-up'): void\n (e: 'scroll-down'): void\n (e: 'auto-retry'): void\n (e: 'reset-chat'): void\n }>()\n\n const { t: $t } = useI18n({\n useScope: 'global',\n })\n\n const slots = useSlots()\n\n const scrollEl = useTemplateRef<HTMLDivElement>('scrollEl')\n const contrastColor = computed(() =>\n resolveContrastColor(props.textColor, props.mainColor),\n )\n\n // --- Scroll ---\n\n const { handleScroll, scrollToBottom } = useChatScroll({\n scrollEl,\n status: () => props.status,\n messagesLength: () => props.messages?.length,\n lastMessageRole: () =>\n props.messages?.[props.messages.length - 1]?.role,\n onScrollUp: () => emit('scroll-up'),\n onScrollDown: () => emit('scroll-down'),\n })\n\n // --- Height adjustment ---\n\n const messagesElRefs = useTemplateRef<HTMLDivElement[]>('messagesEl')\n const height = ref<number>(0)\n\n watch(\n () => props.messages,\n async (messages) => {\n if (!messages?.length || props.disableHeightAdjustment) {\n return\n }\n await nextTick()\n const scrollElHeight = (scrollEl.value?.clientHeight ?? 0) - 48\n const lastUserMessageIndex = messages\n .map((message) => message.role)\n .lastIndexOf('user')\n const lastUserMessageHeight =\n messagesElRefs.value?.[lastUserMessageIndex]?.clientHeight ?? 0\n const newHeight = scrollElHeight - lastUserMessageHeight\n if (newHeight) {\n height.value = newHeight\n }\n },\n { deep: true },\n )\n\n const isRevised = (messageId: string) => {\n return props.revisedAnswers?.some((r) => r.messageId === messageId)\n }\n\n const getMessageFeedback = (messageId: string) =>\n props.messageFeedbacks?.find((f) => f.messageId === messageId)\n\n const activeMessage = computed(() => {\n return props.messages?.[props.messages.length - 1]\n })\n const activeMessageLastPart = computed(() => {\n const active = activeMessage.value\n if (!active) {\n return null\n }\n return active.parts[active.parts.length - 1]\n })\n const isLoading = computed(() => {\n return props.status === 'submitted' || props.status === 'streaming'\n })\n const isError = computed(() => props.status === 'error')\n\n const activeMessageLastPartLabel = computed(() => {\n const part = activeMessageLastPart.value\n return getToolPartLabel($t, part)\n })\n const activeMessageLastPartIcon = computed(() => {\n const part = activeMessageLastPart.value\n return getPartIcon(part)\n })\n\n const getMessageIndexById = (messageId: string) => {\n return props.messages?.findIndex((m) => m.id === messageId)\n }\n const isLastMessage = (index?: number) => {\n if (index === undefined || !props.messages) {\n return false\n }\n return index === (props.messages?.length ?? 0) - 1\n }\n const isMessageRegenerateButtonVisible = (index: number) => {\n return (\n isLastMessage(index) &&\n props.status === 'ready' &&\n props.actions?.includes('regenerate')\n )\n }\n const isActionButtonVisible = (\n action: ChatMessageActions,\n index: number,\n ) => {\n return (\n ((isLastMessage(index) && props.status === 'ready') ||\n !isLastMessage(index)) &&\n props.actions?.includes(action)\n )\n }\n const isLastTextPart = (message: UIChatMessage) => {\n const lastPart = message.parts[message.parts.length - 1]\n return isTextPart(lastPart)\n }\n const isAssistant = (message: UIChatMessage) => message.role === 'assistant'\n const isUser = (message: UIChatMessage) => message.role === 'user'\n const getPreviousAssistantMessage = (index: number) => {\n return props.messages\n ?.slice(0, index)\n .reverse()\n .find((message) => isAssistant(message))\n }\n const getNextAssistantMessage = (index: number) => {\n return props.messages\n ?.slice(index + 1)\n .find((message) => isAssistant(message))\n }\n const isDayChanged = (index: number) => {\n const previousAssistantMessage = getPreviousAssistantMessage(index)\n const nextAssistantMessage = getNextAssistantMessage(index)\n if (\n !previousAssistantMessage?.metadata?.createdAt ||\n !nextAssistantMessage?.metadata?.createdAt\n ) {\n return false\n }\n const currentDate = new Date(\n previousAssistantMessage.metadata.createdAt,\n )\n const previousDate = new Date(nextAssistantMessage.metadata.createdAt)\n return (\n currentDate.getFullYear() !== previousDate.getFullYear() ||\n currentDate.getMonth() !== previousDate.getMonth() ||\n currentDate.getDate() !== previousDate.getDate()\n )\n }\n const showMessageFooter = (message: UIChatMessage, index: number) => {\n if (index === 0 || message.role !== 'assistant') {\n return false\n }\n return (\n props.actions?.length ||\n (props.showMessageDateTime &&\n message.metadata?.createdAt !== undefined) ||\n (props.showMessageTokensCount &&\n message.metadata?.totalTokens !== undefined)\n )\n }\n // feedback message auto scroll\n const feedbackMessageEl = ref<(typeof PkChatbotFeedbackForm)[]>()\n watch(\n () => props.feedbackMessageId,\n async () => {\n await nextTick()\n if (!props.feedbackMessageId) {\n return\n }\n const el = feedbackMessageEl.value?.[0]?.$el\n if (!el) {\n return\n }\n if (isLastMessage(getMessageIndexById(props.feedbackMessageId))) {\n scrollToBottom()\n return\n }\n el.scrollIntoView({ behavior: 'smooth', block: 'center' })\n },\n )\n</script>\n\n<template>\n <div\n ref=\"scrollEl\"\n class=\"pk-chatbot-messages\"\n :style=\"{\n '--chatbot-main-color': mainColor,\n '--chatbot-contrast-color': contrastColor,\n }\"\n @scroll=\"handleScroll\">\n <div class=\"pk-chatbot-messages__wrapper\">\n <template v-for=\"(message, index) in messages\" :key=\"message.id\">\n <div\n v-if=\"index > 0 && isUser(message) && isDayChanged(index)\"\n class=\"pk-chatbot-divider\">\n <span class=\"pk-chatbot-divider__label\">\n {{\n $d(\n new Date(\n getNextAssistantMessage(index)?.metadata\n ?.createdAt ?? '',\n ),\n 'short',\n )\n }}\n </span>\n </div>\n <div\n v-if=\"\n message.parts.length ||\n (isLastMessage(index) &&\n isLoading &&\n isAssistant(message))\n \"\n ref=\"messagesEl\"\n class=\"pk-chatbot-message\"\n :class=\"[\n `pk-chatbot-message--${message.role}`,\n {\n 'pk-chatbot-message--loading':\n isLoading &&\n isLastMessage(index) &&\n isAssistant(message),\n },\n ]\"\n :style=\"{\n minHeight:\n isLastMessage(index) &&\n isAssistant(message) &&\n !isError\n ? `${height}px`\n : undefined,\n }\">\n <template\n v-for=\"(part, partIndex) in message.parts\"\n :key=\"partIndex\">\n <transition\n v-if=\"isTextPart(part) && part.text.trim()\"\n appear\n name=\"pk-chatbot-part\">\n <div class=\"pk-chatbot-message__text\">\n <slot\n v-bind=\"{\n message,\n part,\n index,\n isLoading,\n }\"\n name=\"text\">\n <PkStreamingMarkdown\n v-if=\"isAssistant(message)\"\n class=\"wysiwyg\"\n :markdown=\"part.text\"\n :loading=\"\n index ===\n (messages?.length ?? 0) - 1 &&\n status === 'streaming'\n \" />\n <template v-else>\n {{ part.text }}\n </template>\n </slot>\n </div>\n </transition>\n <transition\n v-else-if=\"isFilePart(part)\"\n appear\n name=\"pk-chatbot-part\">\n <PkChatbotFilePreview\n :media-type=\"part.mediaType\"\n :url=\"part.url\"\n :filename=\"part.filename\" />\n </transition>\n <transition\n v-else-if=\"\n isToolPart(part) &&\n !isStreamingPart(part) &&\n (toolComponentMap[getToolPartName(part)] ||\n slots[part.type] ||\n showAllMessageParts)\n \"\n appear\n name=\"pk-chatbot-part\">\n <component\n :is=\"toolComponentMap[getToolPartName(part)]\"\n v-if=\"\n !slots[part.type] &&\n toolComponentMap[getToolPartName(part)]\n \"\n :key=\"`component-${partIndex}-${getPartState(part)}`\"\n :part />\n <slot\n v-else\n :name=\"part.type\"\n v-bind=\"{\n message,\n part,\n index,\n isLoading,\n }\">\n <div\n v-if=\"showAllMessageParts\"\n class=\"pk-chatbot-message__loading-info\">\n <div class=\"flex gap-8 items-center\">\n <VvIcon\n v-if=\"getPartIcon(part)\"\n :name=\"getPartIcon(part)!\"\n class=\"shrink-0\" />\n <code class=\"font-mono rounded text-10\">\n {{ toKebabCase(part.type) }}\n </code>\n </div>\n </div>\n </slot>\n </transition>\n </template>\n <transition name=\"pk-chatbot-fade\" mode=\"out-in\">\n <div\n v-if=\"\n isLoading &&\n isLastMessage(index) &&\n !isLastTextPart(message) &&\n isAssistant(message)\n \"\n :key=\"`loading-info-${message.id}`\"\n class=\"pk-chatbot-message__loading-info\">\n <div class=\"flex gap-8 items-center\">\n <VvIcon\n name=\"line-md:loading-loop\"\n class=\"shrink-0\" />\n <transition mode=\"out-in\">\n <VvIcon\n v-if=\"activeMessageLastPartIcon\"\n :key=\"activeMessageLastPartIcon\"\n class=\"shrink-0\"\n :name=\"activeMessageLastPartIcon\" />\n </transition>\n <transition mode=\"out-in\">\n <span\n v-if=\"activeMessageLastPartLabel\"\n :key=\"activeMessageLastPartLabel\"\n class=\"text-10\">\n {{ activeMessageLastPartLabel }}\n </span>\n </transition>\n </div>\n <transition mode=\"out-in\">\n <PkStreamingMarkdownAutoscroll\n v-if=\"\n activeMessageLastPart &&\n 'text' in activeMessageLastPart &&\n activeMessageLastPart.text.trim()\n \"\n :markdown=\"activeMessageLastPart.text\"\n inner-class=\"wysiwyg\"\n class=\"border border-surface-4 rounded p-4 mt-8 bg-surface-1 max-h-64 text-10 w-full\" />\n </transition>\n </div>\n </transition>\n <transition mode=\"out-in\">\n <div\n v-if=\"showMessageFooter(message, index)\"\n class=\"pk-chatbot-message__footer\">\n <VvButtonGroup modifiers=\"compact\" class=\"mr-auto\">\n <transition mode=\"out-in\">\n <VvButton\n v-if=\"\n isMessageRegenerateButtonVisible(\n index,\n )\n \"\n icon=\"ri:reset-right-line\"\n modifiers=\"action-quiet-small\"\n :title=\"$t('action.regenerate')\"\n @click.stop=\"$emit('regenerate')\" />\n </transition>\n <transition mode=\"out-in\">\n <VvButton\n v-if=\"\n isActionButtonVisible(\n 'show-info',\n index,\n )\n \"\n icon=\"ri:information-line\"\n :title=\"$t('action.getMoreInfo')\"\n modifiers=\"action-quiet-small\"\n @click.stop=\"\n $emit('show-info', message)\n \" />\n </transition>\n <transition mode=\"out-in\">\n <VvButton\n v-if=\"\n isActionButtonVisible(\n 'revise',\n index,\n )\n \"\n :icon=\"\n isRevised(message.id)\n ? 'ri:file-edit-fill'\n : 'ri:file-edit-line'\n \"\n :title=\"\n isRevised(message.id)\n ? $t('action.editRevise')\n : $t('action.createRevise')\n \"\n modifiers=\"action-quiet-small\"\n :class=\"{\n 'text-brand': isRevised(message.id),\n }\"\n @click.stop=\"\n $emit('revise', message)\n \" />\n </transition>\n <transition mode=\"out-in\">\n <VvButton\n v-if=\"\n isActionButtonVisible(\n 'upvote',\n index,\n )\n \"\n :icon=\"\n getMessageFeedback(message.id)\n ?.vote === 'upvote'\n ? 'ri:thumb-up-fill'\n : 'ri:thumb-up-line'\n \"\n :title=\"$t('action.upvote')\"\n modifiers=\"action-quiet-small\"\n @click.stop=\"\n $emit('upvote', message)\n \" />\n </transition>\n <transition mode=\"out-in\">\n <VvButton\n v-if=\"\n isActionButtonVisible(\n 'downvote',\n index,\n )\n \"\n :icon=\"\n getMessageFeedback(message.id)\n ?.vote === 'downvote'\n ? 'ri:thumb-down-fill'\n : 'ri:thumb-down-line'\n \"\n :title=\"$t('action.downvote')\"\n modifiers=\"action-quiet-small\"\n @click.stop=\"\n $emit('downvote', message)\n \" />\n </transition>\n <transition mode=\"out-in\">\n <VvButton\n v-if=\"\n isActionButtonVisible(\n 'feedback',\n index,\n )\n \"\n :icon=\"\n getMessageFeedback(message.id)\n ?.comment\n ? 'ri:feedback-fill'\n : 'ri:feedback-line'\n \"\n :title=\"$t('action.feedback')\"\n modifiers=\"action-quiet-small\"\n @click.stop=\"\n $emit('feedback', message)\n \" />\n </transition>\n </VvButtonGroup>\n <span\n v-if=\"\n showMessageTokensCount &&\n message.metadata?.totalTokens\n \"\n class=\"flex items-center gap-4 text-12 text-word-3\">\n <VvIcon name=\"ri:ai-generate-2-line\" />\n {{\n $n(message.metadata.totalTokens, 'integer')\n }}\n {{ $t('label.tokens') }}\n </span>\n <time\n v-if=\"\n showMessageDateTime &&\n message.metadata?.createdAt\n \"\n :datetime=\"\n new Date(\n message.metadata?.createdAt,\n ).toISOString()\n \"\n class=\"flex items-center gap-4 text-12 text-word-3\">\n <VvIcon name=\"ri:time-line\" />\n {{\n $d(\n new Date(message.metadata?.createdAt),\n 'date-time',\n )\n }}\n </time>\n <div\n v-if=\"\n showMessageDateTime &&\n message?.metadata?.completedAt &&\n message?.metadata?.createdAt\n \"\n class=\"flex items-center gap-4 text-12 text-word-3\">\n <VvIcon name=\"ri:hourglass-line\" />\n <PkRelativeTime\n :date=\"message.metadata?.createdAt\"\n :end-date=\"message.metadata?.completedAt\" />\n </div>\n </div>\n </transition>\n <transition mode=\"out-in\">\n <PkChatbotFeedbackForm\n v-if=\"message.id === feedbackMessageId\"\n ref=\"feedbackMessageEl\"\n :loading=\"feedbackLoading\"\n :submitted=\"feedbackSubmitted\"\n :error=\"feedbackError\"\n @submit=\"$emit('feedback-submit', $event)\"\n @close=\"$emit('feedback-close')\" />\n </transition>\n </div>\n </template>\n <transition appear name=\"pk-chatbot-part\">\n <PkChatbotError\n v-if=\"isError\"\n :error\n @retry=\"$emit('auto-retry')\"\n @reset=\"$emit('reset-chat')\" />\n </transition>\n <div\n v-if=\"activeMessage?.role === 'user' || isError\"\n :style=\"{ minHeight: `${height}px` }\"></div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n .pk-chatbot-messages {\n overflow-y: auto;\n flex: 1;\n min-width: 0;\n font-size: var(--spacing-14);\n\n scrollbar-width: thin;\n scrollbar-gutter: auto;\n scrollbar-color: var(--color-word-5) var(--color-surface-1);\n\n &__wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-16);\n min-width: 0;\n }\n\n &__divider {\n border-bottom: 1px solid var(--color-surface-3);\n }\n }\n\n .pk-chatbot-divider {\n position: relative;\n border-bottom: 1px solid var(--color-surface-3);\n\n &__label {\n position: absolute;\n padding-inline: var(--spacing-8);\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background-color: var(--color-surface);\n color: var(--color-word-4);\n font-size: var(--text-12);\n }\n }\n\n .pk-chatbot-message {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-sm);\n min-width: 0;\n align-items: flex-start;\n\n &__text {\n color: var(--color-word-2);\n line-height: var(--leading-normal);\n border-width: var(--spacing-px);\n border-color: var(--color-surface-3);\n padding: var(--spacing-sm);\n border-radius: var(--rounded-xl) var(--rounded-xl) var(--rounded-xl)\n 0;\n }\n\n &__loading-info {\n line-height: var(--leading-normal);\n border-width: var(--spacing-px);\n border-color: var(--color-surface-3);\n padding: var(--spacing-sm);\n border-radius: var(--rounded-xl) var(--rounded-xl) var(--rounded-xl)\n 0;\n font-size: var(--text-12);\n color: var(--color-word-3);\n }\n\n &__footer {\n width: 100%;\n display: flex;\n gap: var(--spacing-8);\n align-items: center;\n }\n\n &--user {\n align-items: flex-end;\n\n .pk-chatbot-message__text {\n background-color: var(\n --chatbot-main-color,\n var(--color-surface-1)\n );\n border-width: var(--spacing-px);\n border-color: var(--chatbot-main-color, var(--color-surface-4));\n color: var(--chatbot-contrast-color, var(--color-word-1));\n border-radius: var(--rounded-xl) var(--rounded-xl) 0\n var(--rounded-xl);\n }\n }\n\n &--assistant {\n width: 100%;\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: var(--spacing-16);\n overflow: hidden;\n\n .pk-chatbot-message__text {\n width: 100%;\n }\n }\n\n &--system {\n align-items: flex-end;\n\n .pk-chatbot-message__text {\n display: flex;\n gap: var(--spacing-8);\n font-size: var(--text-12);\n padding: var(--spacing-8) var(--spacing-sm);\n align-items: center;\n border-width: var(--spacing-px);\n border-color: var(--chatbot-main-color, var(--color-surface-4));\n color: var(--chatbot-main-color, var(--color-word-1));\n border-radius: var(--rounded-xl) var(--rounded-xl) 0\n var(--rounded-xl);\n }\n }\n }\n\n .pk-chatbot-part-enter-active {\n transition:\n opacity 0.25s ease,\n transform 0.25s ease;\n }\n\n .pk-chatbot-part-enter-from {\n opacity: 0;\n transform: translateY(8px);\n }\n\n .pk-chatbot-fade-enter-active,\n .pk-chatbot-fade-leave-active {\n transition: opacity 0.2s ease;\n }\n\n .pk-chatbot-fade-enter-from,\n .pk-chatbot-fade-leave-to {\n opacity: 0;\n }\n</style>\n","<script lang=\"ts\" setup>\n import type {\n ChatMessageActions,\n MessageFeedback,\n RevisedAnswer,\n UIChatMessage,\n } from 'models'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n import PkChatbotError from './PkChatbotError.vue'\n import PkChatbotFeedbackForm from './PkChatbotFeedbackForm.vue'\n import PkChatbotFilePreview from './PkChatbotFilePreview.vue'\n import PkRelativeTime from '../PkRelativeTime.vue'\n import { useI18n } from 'vue-i18n'\n import {\n useTemplateRef,\n ref,\n watch,\n computed,\n nextTick,\n useSlots,\n } from 'vue'\n import { toolComponentMap } from './toolComponentMap'\n import {\n resolveContrastColor,\n getPartState,\n isTextPart,\n isFilePart,\n isToolPart,\n isStreamingPart,\n getPartIcon,\n getToolPartLabel,\n } from './utils'\n import { getToolPartName, toKebabCase } from 'utils'\n import PkStreamingMarkdownAutoscroll from './PkStreamingMarkdownAutoscroll.vue'\n import { useChatScroll } from './useChatScroll'\n\n const props = defineProps<{\n status?: 'submitted' | 'streaming' | 'ready' | 'error'\n messages?: UIChatMessage[]\n logo?: string\n name?: string\n error?: Error\n actions?: ChatMessageActions[]\n mainColor?: string\n textColor?: 'auto' | 'white' | 'black'\n revisedAnswers?: RevisedAnswer[]\n messageFeedbacks?: MessageFeedback[]\n disableHeightAdjustment?: boolean\n showMessageDateTime?: boolean\n showMessageTokensCount?: boolean\n showAllMessageParts?: boolean\n // TODO: move feedback in a separate component to avoid passing these props\n feedbackMessageId?: string\n feedbackLoading?: boolean\n feedbackSubmitted?: boolean\n feedbackError?: string\n }>()\n\n const emit = defineEmits<{\n (e: 'show-info', message: UIChatMessage): void\n (e: 'regenerate'): void\n (e: 'revise', message: UIChatMessage): void\n (e: 'upvote', message: UIChatMessage): void\n (e: 'downvote', message: UIChatMessage): void\n (e: 'feedback', message: UIChatMessage): void\n (e: 'feedback-submit', comment: string): void\n (e: 'feedback-close'): void\n (e: 'scroll-up'): void\n (e: 'scroll-down'): void\n (e: 'auto-retry'): void\n (e: 'reset-chat'): void\n }>()\n\n const { t: $t } = useI18n({\n useScope: 'global',\n })\n\n const slots = useSlots()\n\n const scrollEl = useTemplateRef<HTMLDivElement>('scrollEl')\n const contrastColor = computed(() =>\n resolveContrastColor(props.textColor, props.mainColor),\n )\n\n // --- Scroll ---\n\n const { handleScroll, scrollToBottom } = useChatScroll({\n scrollEl,\n status: () => props.status,\n messagesLength: () => props.messages?.length,\n lastMessageRole: () =>\n props.messages?.[props.messages.length - 1]?.role,\n onScrollUp: () => emit('scroll-up'),\n onScrollDown: () => emit('scroll-down'),\n })\n\n // --- Height adjustment ---\n\n const messagesElRefs = useTemplateRef<HTMLDivElement[]>('messagesEl')\n const height = ref<number>(0)\n\n watch(\n () => props.messages,\n async (messages) => {\n if (!messages?.length || props.disableHeightAdjustment) {\n return\n }\n await nextTick()\n const scrollElHeight = (scrollEl.value?.clientHeight ?? 0) - 48\n const lastUserMessageIndex = messages\n .map((message) => message.role)\n .lastIndexOf('user')\n const lastUserMessageHeight =\n messagesElRefs.value?.[lastUserMessageIndex]?.clientHeight ?? 0\n const newHeight = scrollElHeight - lastUserMessageHeight\n if (newHeight) {\n height.value = newHeight\n }\n },\n { deep: true },\n )\n\n const isRevised = (messageId: string) => {\n return props.revisedAnswers?.some((r) => r.messageId === messageId)\n }\n\n const getMessageFeedback = (messageId: string) =>\n props.messageFeedbacks?.find((f) => f.messageId === messageId)\n\n const activeMessage = computed(() => {\n return props.messages?.[props.messages.length - 1]\n })\n const activeMessageLastPart = computed(() => {\n const active = activeMessage.value\n if (!active) {\n return null\n }\n return active.parts[active.parts.length - 1]\n })\n const isLoading = computed(() => {\n return props.status === 'submitted' || props.status === 'streaming'\n })\n const isError = computed(() => props.status === 'error')\n\n const activeMessageLastPartLabel = computed(() => {\n const part = activeMessageLastPart.value\n return getToolPartLabel($t, part)\n })\n const activeMessageLastPartIcon = computed(() => {\n const part = activeMessageLastPart.value\n return getPartIcon(part)\n })\n\n const getMessageIndexById = (messageId: string) => {\n return props.messages?.findIndex((m) => m.id === messageId)\n }\n const isLastMessage = (index?: number) => {\n if (index === undefined || !props.messages) {\n return false\n }\n return index === (props.messages?.length ?? 0) - 1\n }\n const isMessageRegenerateButtonVisible = (index: number) => {\n return (\n isLastMessage(index) &&\n props.status === 'ready' &&\n props.actions?.includes('regenerate')\n )\n }\n const isActionButtonVisible = (\n action: ChatMessageActions,\n index: number,\n ) => {\n return (\n ((isLastMessage(index) && props.status === 'ready') ||\n !isLastMessage(index)) &&\n props.actions?.includes(action)\n )\n }\n const isLastTextPart = (message: UIChatMessage) => {\n const lastPart = message.parts[message.parts.length - 1]\n return isTextPart(lastPart)\n }\n const isAssistant = (message: UIChatMessage) => message.role === 'assistant'\n const isUser = (message: UIChatMessage) => message.role === 'user'\n const getPreviousAssistantMessage = (index: number) => {\n return props.messages\n ?.slice(0, index)\n .reverse()\n .find((message) => isAssistant(message))\n }\n const getNextAssistantMessage = (index: number) => {\n return props.messages\n ?.slice(index + 1)\n .find((message) => isAssistant(message))\n }\n const isDayChanged = (index: number) => {\n const previousAssistantMessage = getPreviousAssistantMessage(index)\n const nextAssistantMessage = getNextAssistantMessage(index)\n if (\n !previousAssistantMessage?.metadata?.createdAt ||\n !nextAssistantMessage?.metadata?.createdAt\n ) {\n return false\n }\n const currentDate = new Date(\n previousAssistantMessage.metadata.createdAt,\n )\n const previousDate = new Date(nextAssistantMessage.metadata.createdAt)\n return (\n currentDate.getFullYear() !== previousDate.getFullYear() ||\n currentDate.getMonth() !== previousDate.getMonth() ||\n currentDate.getDate() !== previousDate.getDate()\n )\n }\n const showMessageFooter = (message: UIChatMessage, index: number) => {\n if (index === 0 || message.role !== 'assistant') {\n return false\n }\n return (\n props.actions?.length ||\n (props.showMessageDateTime &&\n message.metadata?.createdAt !== undefined) ||\n (props.showMessageTokensCount &&\n message.metadata?.totalTokens !== undefined)\n )\n }\n // feedback message auto scroll\n const feedbackMessageEl = ref<(typeof PkChatbotFeedbackForm)[]>()\n watch(\n () => props.feedbackMessageId,\n async () => {\n await nextTick()\n if (!props.feedbackMessageId) {\n return\n }\n const el = feedbackMessageEl.value?.[0]?.$el\n if (!el) {\n return\n }\n if (isLastMessage(getMessageIndexById(props.feedbackMessageId))) {\n scrollToBottom()\n return\n }\n el.scrollIntoView({ behavior: 'smooth', block: 'center' })\n },\n )\n</script>\n\n<template>\n <div\n ref=\"scrollEl\"\n class=\"pk-chatbot-messages\"\n :style=\"{\n '--chatbot-main-color': mainColor,\n '--chatbot-contrast-color': contrastColor,\n }\"\n @scroll=\"handleScroll\">\n <div class=\"pk-chatbot-messages__wrapper\">\n <template v-for=\"(message, index) in messages\" :key=\"message.id\">\n <div\n v-if=\"index > 0 && isUser(message) && isDayChanged(index)\"\n class=\"pk-chatbot-divider\">\n <span class=\"pk-chatbot-divider__label\">\n {{\n $d(\n new Date(\n getNextAssistantMessage(index)?.metadata\n ?.createdAt ?? '',\n ),\n 'short',\n )\n }}\n </span>\n </div>\n <div\n v-if=\"\n message.parts.length ||\n (isLastMessage(index) &&\n isLoading &&\n isAssistant(message))\n \"\n ref=\"messagesEl\"\n class=\"pk-chatbot-message\"\n :class=\"[\n `pk-chatbot-message--${message.role}`,\n {\n 'pk-chatbot-message--loading':\n isLoading &&\n isLastMessage(index) &&\n isAssistant(message),\n },\n ]\"\n :style=\"{\n minHeight:\n isLastMessage(index) &&\n isAssistant(message) &&\n !isError\n ? `${height}px`\n : undefined,\n }\">\n <template\n v-for=\"(part, partIndex) in message.parts\"\n :key=\"partIndex\">\n <transition\n v-if=\"isTextPart(part) && part.text.trim()\"\n appear\n name=\"pk-chatbot-part\">\n <div class=\"pk-chatbot-message__text\">\n <slot\n v-bind=\"{\n message,\n part,\n index,\n isLoading,\n }\"\n name=\"text\">\n <PkStreamingMarkdown\n v-if=\"isAssistant(message)\"\n class=\"wysiwyg\"\n :markdown=\"part.text\"\n :loading=\"\n index ===\n (messages?.length ?? 0) - 1 &&\n status === 'streaming'\n \" />\n <template v-else>\n {{ part.text }}\n </template>\n </slot>\n </div>\n </transition>\n <transition\n v-else-if=\"isFilePart(part)\"\n appear\n name=\"pk-chatbot-part\">\n <PkChatbotFilePreview\n :media-type=\"part.mediaType\"\n :url=\"part.url\"\n :filename=\"part.filename\" />\n </transition>\n <transition\n v-else-if=\"\n isToolPart(part) &&\n !isStreamingPart(part) &&\n (toolComponentMap[getToolPartName(part)] ||\n slots[part.type] ||\n showAllMessageParts)\n \"\n appear\n name=\"pk-chatbot-part\">\n <component\n :is=\"toolComponentMap[getToolPartName(part)]\"\n v-if=\"\n !slots[part.type] &&\n toolComponentMap[getToolPartName(part)]\n \"\n :key=\"`component-${partIndex}-${getPartState(part)}`\"\n :part />\n <slot\n v-else\n :name=\"part.type\"\n v-bind=\"{\n message,\n part,\n index,\n isLoading,\n }\">\n <div\n v-if=\"showAllMessageParts\"\n class=\"pk-chatbot-message__loading-info\">\n <div class=\"flex gap-8 items-center\">\n <VvIcon\n v-if=\"getPartIcon(part)\"\n :name=\"getPartIcon(part)!\"\n class=\"shrink-0\" />\n <code class=\"font-mono rounded text-10\">\n {{ toKebabCase(part.type) }}\n </code>\n </div>\n </div>\n </slot>\n </transition>\n </template>\n <transition name=\"pk-chatbot-fade\" mode=\"out-in\">\n <div\n v-if=\"\n isLoading &&\n isLastMessage(index) &&\n !isLastTextPart(message) &&\n isAssistant(message)\n \"\n :key=\"`loading-info-${message.id}`\"\n class=\"pk-chatbot-message__loading-info\">\n <div class=\"flex gap-8 items-center\">\n <VvIcon\n name=\"line-md:loading-loop\"\n class=\"shrink-0\" />\n <transition mode=\"out-in\">\n <VvIcon\n v-if=\"activeMessageLastPartIcon\"\n :key=\"activeMessageLastPartIcon\"\n class=\"shrink-0\"\n :name=\"activeMessageLastPartIcon\" />\n </transition>\n <transition mode=\"out-in\">\n <span\n v-if=\"activeMessageLastPartLabel\"\n :key=\"activeMessageLastPartLabel\"\n class=\"text-10\">\n {{ activeMessageLastPartLabel }}\n </span>\n </transition>\n </div>\n <transition mode=\"out-in\">\n <PkStreamingMarkdownAutoscroll\n v-if=\"\n activeMessageLastPart &&\n 'text' in activeMessageLastPart &&\n activeMessageLastPart.text.trim()\n \"\n :markdown=\"activeMessageLastPart.text\"\n inner-class=\"wysiwyg\"\n class=\"border border-surface-4 rounded p-4 mt-8 bg-surface-1 max-h-64 text-10 w-full\" />\n </transition>\n </div>\n </transition>\n <transition mode=\"out-in\">\n <div\n v-if=\"showMessageFooter(message, index)\"\n class=\"pk-chatbot-message__footer\">\n <VvButtonGroup modifiers=\"compact\" class=\"mr-auto\">\n <transition mode=\"out-in\">\n <VvButton\n v-if=\"\n isMessageRegenerateButtonVisible(\n index,\n )\n \"\n icon=\"ri:reset-right-line\"\n modifiers=\"action-quiet-small\"\n :title=\"$t('action.regenerate')\"\n @click.stop=\"$emit('regenerate')\" />\n </transition>\n <transition mode=\"out-in\">\n <VvButton\n v-if=\"\n isActionButtonVisible(\n 'show-info',\n index,\n )\n \"\n icon=\"ri:information-line\"\n :title=\"$t('action.getMoreInfo')\"\n modifiers=\"action-quiet-small\"\n @click.stop=\"\n $emit('show-info', message)\n \" />\n </transition>\n <transition mode=\"out-in\">\n <VvButton\n v-if=\"\n isActionButtonVisible(\n 'revise',\n index,\n )\n \"\n :icon=\"\n isRevised(message.id)\n ? 'ri:file-edit-fill'\n : 'ri:file-edit-line'\n \"\n :title=\"\n isRevised(message.id)\n ? $t('action.editRevise')\n : $t('action.createRevise')\n \"\n modifiers=\"action-quiet-small\"\n :class=\"{\n 'text-brand': isRevised(message.id),\n }\"\n @click.stop=\"\n $emit('revise', message)\n \" />\n </transition>\n <transition mode=\"out-in\">\n <VvButton\n v-if=\"\n isActionButtonVisible(\n 'upvote',\n index,\n )\n \"\n :icon=\"\n getMessageFeedback(message.id)\n ?.vote === 'upvote'\n ? 'ri:thumb-up-fill'\n : 'ri:thumb-up-line'\n \"\n :title=\"$t('action.upvote')\"\n modifiers=\"action-quiet-small\"\n @click.stop=\"\n $emit('upvote', message)\n \" />\n </transition>\n <transition mode=\"out-in\">\n <VvButton\n v-if=\"\n isActionButtonVisible(\n 'downvote',\n index,\n )\n \"\n :icon=\"\n getMessageFeedback(message.id)\n ?.vote === 'downvote'\n ? 'ri:thumb-down-fill'\n : 'ri:thumb-down-line'\n \"\n :title=\"$t('action.downvote')\"\n modifiers=\"action-quiet-small\"\n @click.stop=\"\n $emit('downvote', message)\n \" />\n </transition>\n <transition mode=\"out-in\">\n <VvButton\n v-if=\"\n isActionButtonVisible(\n 'feedback',\n index,\n )\n \"\n :icon=\"\n getMessageFeedback(message.id)\n ?.comment\n ? 'ri:feedback-fill'\n : 'ri:feedback-line'\n \"\n :title=\"$t('action.feedback')\"\n modifiers=\"action-quiet-small\"\n @click.stop=\"\n $emit('feedback', message)\n \" />\n </transition>\n </VvButtonGroup>\n <span\n v-if=\"\n showMessageTokensCount &&\n message.metadata?.totalTokens\n \"\n class=\"flex items-center gap-4 text-12 text-word-3\">\n <VvIcon name=\"ri:ai-generate-2-line\" />\n {{\n $n(message.metadata.totalTokens, 'integer')\n }}\n {{ $t('label.tokens') }}\n </span>\n <time\n v-if=\"\n showMessageDateTime &&\n message.metadata?.createdAt\n \"\n :datetime=\"\n new Date(\n message.metadata?.createdAt,\n ).toISOString()\n \"\n class=\"flex items-center gap-4 text-12 text-word-3\">\n <VvIcon name=\"ri:time-line\" />\n {{\n $d(\n new Date(message.metadata?.createdAt),\n 'date-time',\n )\n }}\n </time>\n <div\n v-if=\"\n showMessageDateTime &&\n message?.metadata?.completedAt &&\n message?.metadata?.createdAt\n \"\n class=\"flex items-center gap-4 text-12 text-word-3\">\n <VvIcon name=\"ri:hourglass-line\" />\n <PkRelativeTime\n :date=\"message.metadata?.createdAt\"\n :end-date=\"message.metadata?.completedAt\" />\n </div>\n </div>\n </transition>\n <transition mode=\"out-in\">\n <PkChatbotFeedbackForm\n v-if=\"message.id === feedbackMessageId\"\n ref=\"feedbackMessageEl\"\n :loading=\"feedbackLoading\"\n :submitted=\"feedbackSubmitted\"\n :error=\"feedbackError\"\n @submit=\"$emit('feedback-submit', $event)\"\n @close=\"$emit('feedback-close')\" />\n </transition>\n </div>\n </template>\n <transition appear name=\"pk-chatbot-part\">\n <PkChatbotError\n v-if=\"isError\"\n :error\n @retry=\"$emit('auto-retry')\"\n @reset=\"$emit('reset-chat')\" />\n </transition>\n <div\n v-if=\"activeMessage?.role === 'user' || isError\"\n :style=\"{ minHeight: `${height}px` }\"></div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n .pk-chatbot-messages {\n overflow-y: auto;\n flex: 1;\n min-width: 0;\n font-size: var(--spacing-14);\n\n scrollbar-width: thin;\n scrollbar-gutter: auto;\n scrollbar-color: var(--color-word-5) var(--color-surface-1);\n\n &__wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-16);\n min-width: 0;\n }\n\n &__divider {\n border-bottom: 1px solid var(--color-surface-3);\n }\n }\n\n .pk-chatbot-divider {\n position: relative;\n border-bottom: 1px solid var(--color-surface-3);\n\n &__label {\n position: absolute;\n padding-inline: var(--spacing-8);\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background-color: var(--color-surface);\n color: var(--color-word-4);\n font-size: var(--text-12);\n }\n }\n\n .pk-chatbot-message {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-sm);\n min-width: 0;\n align-items: flex-start;\n\n &__text {\n color: var(--color-word-2);\n line-height: var(--leading-normal);\n border-width: var(--spacing-px);\n border-color: var(--color-surface-3);\n padding: var(--spacing-sm);\n border-radius: var(--rounded-xl) var(--rounded-xl) var(--rounded-xl)\n 0;\n }\n\n &__loading-info {\n line-height: var(--leading-normal);\n border-width: var(--spacing-px);\n border-color: var(--color-surface-3);\n padding: var(--spacing-sm);\n border-radius: var(--rounded-xl) var(--rounded-xl) var(--rounded-xl)\n 0;\n font-size: var(--text-12);\n color: var(--color-word-3);\n }\n\n &__footer {\n width: 100%;\n display: flex;\n gap: var(--spacing-8);\n align-items: center;\n }\n\n &--user {\n align-items: flex-end;\n\n .pk-chatbot-message__text {\n background-color: var(\n --chatbot-main-color,\n var(--color-surface-1)\n );\n border-width: var(--spacing-px);\n border-color: var(--chatbot-main-color, var(--color-surface-4));\n color: var(--chatbot-contrast-color, var(--color-word-1));\n border-radius: var(--rounded-xl) var(--rounded-xl) 0\n var(--rounded-xl);\n }\n }\n\n &--assistant {\n width: 100%;\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: var(--spacing-16);\n overflow: hidden;\n\n .pk-chatbot-message__text {\n width: 100%;\n }\n }\n\n &--system {\n align-items: flex-end;\n\n .pk-chatbot-message__text {\n display: flex;\n gap: var(--spacing-8);\n font-size: var(--text-12);\n padding: var(--spacing-8) var(--spacing-sm);\n align-items: center;\n border-width: var(--spacing-px);\n border-color: var(--chatbot-main-color, var(--color-surface-4));\n color: var(--chatbot-main-color, var(--color-word-1));\n border-radius: var(--rounded-xl) var(--rounded-xl) 0\n var(--rounded-xl);\n }\n }\n }\n\n .pk-chatbot-part-enter-active {\n transition:\n opacity 0.25s ease,\n transform 0.25s ease;\n }\n\n .pk-chatbot-part-enter-from {\n opacity: 0;\n transform: translateY(8px);\n }\n\n .pk-chatbot-fade-enter-active,\n .pk-chatbot-fade-leave-active {\n transition: opacity 0.2s ease;\n }\n\n .pk-chatbot-fade-enter-from,\n .pk-chatbot-fade-leave-to {\n opacity: 0;\n }\n</style>\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PkChatbotViewChat-hqsvz_7X.js","names":["$n","$t"],"sources":["../../../../packages/components/src/chat/PkToolRequestGeolocation.vue","../../../../packages/components/src/chat/PkToolRequestGeolocation.vue","../../../../packages/components/src/chat/PkChatbotViewChat.vue","../../../../packages/components/src/chat/PkChatbotViewChat.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, onMounted } from 'vue'\n import { useI18n } from 'vue-i18n'\n\n import type { ReverseGeocodeFn } from 'utils/src/device-context'\n\n type GeolocationOutput =\n | {\n latitude: number\n longitude: number\n accuracy?: number\n city?: string\n }\n | { error: 'permission_denied' | 'position_unavailable' | 'timeout' }\n\n const props = defineProps<{\n part: unknown\n reverseGeocode?: ReverseGeocodeFn\n }>()\n\n const emit = defineEmits<{\n result: [output: GeolocationOutput]\n }>()\n\n const { t: $t } = useI18n({ useScope: 'global' })\n\n const toolPart = computed(() => {\n return props.part as {\n state?: string\n input?: { reason?: string }\n output?: GeolocationOutput\n }\n })\n\n const state = computed(() => toolPart.value.state ?? 'unknown')\n\n const isOutputAvailable = computed(() => state.value === 'output-available')\n\n const successOutput = computed(() => {\n const out = toolPart.value.output\n if (!out || 'error' in out) {\n return undefined\n }\n return out\n })\n\n const errorOutput = computed(() => {\n const out = toolPart.value.output\n if (!out || !('error' in out)) {\n return undefined\n }\n return out\n })\n\n /** Maps GeolocationPositionError.code to a typed string */\n function mapGeolocationError(\n code: number,\n ): 'permission_denied' | 'position_unavailable' | 'timeout' {\n if (code === 1) {\n return 'permission_denied'\n }\n if (code === 3) {\n return 'timeout'\n }\n return 'position_unavailable'\n }\n\n onMounted(() => {\n if (state.value !== 'input-available') {\n return\n }\n\n if (!navigator.geolocation) {\n emit('result', { error: 'position_unavailable' })\n return\n }\n\n navigator.geolocation.getCurrentPosition(\n async (position) => {\n const { latitude, longitude, accuracy } = position.coords\n const city = props.reverseGeocode\n ? await props\n .reverseGeocode(latitude, longitude)\n .catch(() => undefined)\n : undefined\n emit('result', { latitude, longitude, accuracy, city })\n },\n (error) => {\n emit('result', { error: mapGeolocationError(error.code) })\n },\n { timeout: 15000 },\n )\n })\n</script>\n\n<template>\n <div\n class=\"flex items-center gap-6 text-12 text-word-3 border border-surface-3 rounded-xl px-sm py-10\">\n <!-- Loading state -->\n <template v-if=\"!isOutputAvailable\">\n <VvIcon name=\"line-md:loading-loop\" class=\"text-16\" />\n <span>{{ $t('messagePart.requestGeolocation') }}</span>\n </template>\n\n <!-- Success state -->\n <template v-else-if=\"successOutput\">\n <VvIcon name=\"ri:map-pin-line\" class=\"text-16\" />\n <span>\n {{\n $n(successOutput.latitude, {\n style: 'decimal',\n minimumFractionDigits: 5,\n maximumFractionDigits: 5,\n })\n }},\n {{\n $n(successOutput.longitude, {\n style: 'decimal',\n minimumFractionDigits: 5,\n maximumFractionDigits: 5,\n })\n }}\n <template v-if=\"successOutput.accuracy !== undefined\">\n (±{{\n $n(successOutput.accuracy, {\n style: 'unit',\n unit: 'meter',\n })\n }})\n </template>\n </span>\n </template>\n\n <!-- Error state -->\n <template v-else-if=\"errorOutput\">\n <span class=\"i-vv-alert-circle text-16 shrink-0 text-danger\" />\n <span>\n {{\n errorOutput.error === 'permission_denied'\n ? $t('message.geolocationPermissionDenied')\n : $t('message.geolocationUnavailable')\n }}\n </span>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, onMounted } from 'vue'\n import { useI18n } from 'vue-i18n'\n\n import type { ReverseGeocodeFn } from 'utils/src/device-context'\n\n type GeolocationOutput =\n | {\n latitude: number\n longitude: number\n accuracy?: number\n city?: string\n }\n | { error: 'permission_denied' | 'position_unavailable' | 'timeout' }\n\n const props = defineProps<{\n part: unknown\n reverseGeocode?: ReverseGeocodeFn\n }>()\n\n const emit = defineEmits<{\n result: [output: GeolocationOutput]\n }>()\n\n const { t: $t } = useI18n({ useScope: 'global' })\n\n const toolPart = computed(() => {\n return props.part as {\n state?: string\n input?: { reason?: string }\n output?: GeolocationOutput\n }\n })\n\n const state = computed(() => toolPart.value.state ?? 'unknown')\n\n const isOutputAvailable = computed(() => state.value === 'output-available')\n\n const successOutput = computed(() => {\n const out = toolPart.value.output\n if (!out || 'error' in out) {\n return undefined\n }\n return out\n })\n\n const errorOutput = computed(() => {\n const out = toolPart.value.output\n if (!out || !('error' in out)) {\n return undefined\n }\n return out\n })\n\n /** Maps GeolocationPositionError.code to a typed string */\n function mapGeolocationError(\n code: number,\n ): 'permission_denied' | 'position_unavailable' | 'timeout' {\n if (code === 1) {\n return 'permission_denied'\n }\n if (code === 3) {\n return 'timeout'\n }\n return 'position_unavailable'\n }\n\n onMounted(() => {\n if (state.value !== 'input-available') {\n return\n }\n\n if (!navigator.geolocation) {\n emit('result', { error: 'position_unavailable' })\n return\n }\n\n navigator.geolocation.getCurrentPosition(\n async (position) => {\n const { latitude, longitude, accuracy } = position.coords\n const city = props.reverseGeocode\n ? await props\n .reverseGeocode(latitude, longitude)\n .catch(() => undefined)\n : undefined\n emit('result', { latitude, longitude, accuracy, city })\n },\n (error) => {\n emit('result', { error: mapGeolocationError(error.code) })\n },\n { timeout: 15000 },\n )\n })\n</script>\n\n<template>\n <div\n class=\"flex items-center gap-6 text-12 text-word-3 border border-surface-3 rounded-xl px-sm py-10\">\n <!-- Loading state -->\n <template v-if=\"!isOutputAvailable\">\n <VvIcon name=\"line-md:loading-loop\" class=\"text-16\" />\n <span>{{ $t('messagePart.requestGeolocation') }}</span>\n </template>\n\n <!-- Success state -->\n <template v-else-if=\"successOutput\">\n <VvIcon name=\"ri:map-pin-line\" class=\"text-16\" />\n <span>\n {{\n $n(successOutput.latitude, {\n style: 'decimal',\n minimumFractionDigits: 5,\n maximumFractionDigits: 5,\n })\n }},\n {{\n $n(successOutput.longitude, {\n style: 'decimal',\n minimumFractionDigits: 5,\n maximumFractionDigits: 5,\n })\n }}\n <template v-if=\"successOutput.accuracy !== undefined\">\n (±{{\n $n(successOutput.accuracy, {\n style: 'unit',\n unit: 'meter',\n })\n }})\n </template>\n </span>\n </template>\n\n <!-- Error state -->\n <template v-else-if=\"errorOutput\">\n <span class=\"i-vv-alert-circle text-16 shrink-0 text-danger\" />\n <span>\n {{\n errorOutput.error === 'permission_denied'\n ? $t('message.geolocationPermissionDenied')\n : $t('message.geolocationUnavailable')\n }}\n </span>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, useTemplateRef } from 'vue'\n import { useDropZone } from '@vueuse/core'\n import { storeToRefs } from 'pinia'\n import PkChatbotMessages from './PkChatbotMessages.vue'\n import PkChatbotInput from './PkChatbotInput.vue'\n import PkToolShowMultipleChoice from './PkToolShowMultipleChoice.vue'\n import PkToolShowContactForm from './PkToolShowContactForm.vue'\n import PkToolShowSuggestedReply from './PkToolShowSuggestedReply.vue'\n import PkToolShowSources from './PkToolShowSources.vue'\n import PkToolRequestGeolocation from './PkToolRequestGeolocation.vue'\n import PkToolRequestOAuthConnection from './PkToolRequestOAuthConnection.vue'\n import PkToolShowLocation from './PkToolShowLocation.vue'\n import { useLocalizedString } from '../composables/useLocalizedString'\n import { useChatbotStore } from 'composables'\n import type { UIChatMessage } from 'models'\n\n const props = defineProps<{ agentId: string }>()\n\n const emit = defineEmits<{\n 'show-info': [message: UIChatMessage]\n revise: [message: UIChatMessage]\n }>()\n\n const store = useChatbotStore(props.agentId)\n\n const {\n name,\n agentInterface,\n agentFileUpload,\n agentTools,\n actions,\n revisedAnswers,\n messages,\n chat,\n messageFeedbacks,\n feedbackDialogMessage,\n isFeedbackSubmitting,\n isFeedbackSubmitted,\n feedbackSubmitError,\n isLeadSubmitted,\n isLoadingSubmitLead,\n submitLeadError,\n input,\n inputMessagePlaceholder,\n isConversationBlocked,\n baseUrl,\n pendingAttachments,\n apiClient,\n } = storeToRefs(store)\n\n const {\n handleSubmit: storeHandleSubmit,\n stopGeneration,\n regenerate,\n onUpvote,\n onDownvote,\n onFeedback,\n onFeedbackSubmit,\n onLeadSubmit,\n startNewChat,\n addToolOutput,\n handleFileSelect,\n } = store\n\n const dismissableNotice = useLocalizedString(\n () => agentInterface.value?.dismissableNotice,\n )\n\n const chatViewEl = useTemplateRef<HTMLDivElement>('chatViewEl')\n\n const handleExpandSourceContext = async (payload: {\n documentId: string\n chunkIndex: number\n }) => {\n const result = await apiClient.value.expandSourceContext(\n props.agentId,\n payload.documentId,\n payload.chunkIndex,\n )\n return result.content\n }\n\n const handleDownloadSource = async (documentId: string) => {\n const result = await apiClient.value.downloadSourceDocument(\n props.agentId,\n documentId,\n )\n window.open(result.downloadUrl, '_blank')\n }\n\n const handleFileDrop = (files: File[] | null) => {\n if (!agentFileUpload.value?.enabled || !files) {\n return\n }\n for (const file of files) {\n handleFileSelect(file)\n }\n }\n\n const { isOverDropZone } = useDropZone(chatViewEl, {\n dataTypes: computed(\n () => agentFileUpload.value?.allowedMimeTypes ?? [],\n ),\n onDrop: handleFileDrop,\n })\n</script>\n\n<template>\n <div\n ref=\"chatViewEl\"\n class=\"pk-chatbot-view-chat\"\n :class=\"{\n 'pk-chatbot-view-chat--dragover':\n isOverDropZone && agentFileUpload?.enabled,\n }\">\n <!-- #region messages -->\n <PkChatbotMessages\n class=\"flex flex-col flex-1 min-h-0 p-md overflow-y-auto\"\n :name=\"name\"\n :messages=\"messages\"\n :status=\"chat.status\"\n :error=\"chat.error\"\n :main-color=\"agentInterface?.mainColor\"\n :text-color=\"agentInterface?.textColor\"\n :revised-answers=\"revisedAnswers\"\n :actions=\"actions\"\n :logo=\"agentInterface?.logo\"\n :message-feedbacks=\"messageFeedbacks\"\n :feedback-message-id=\"feedbackDialogMessage?.id\"\n :feedback-loading=\"isFeedbackSubmitting\"\n :feedback-submitted=\"isFeedbackSubmitted\"\n :feedback-error=\"feedbackSubmitError\"\n @feedback-submit=\"onFeedbackSubmit($event)\"\n @feedback-close=\"feedbackDialogMessage = undefined\"\n @regenerate=\"regenerate\"\n @auto-retry=\"regenerate\"\n @reset-chat=\"startNewChat\"\n @show-info=\"emit('show-info', $event)\"\n @revise=\"emit('revise', $event)\"\n @upvote=\"onUpvote\"\n @downvote=\"onDownvote\"\n @feedback=\"onFeedback\">\n <template #tool-showContactForm=\"{ part }\">\n <PkToolShowContactForm\n :part\n :readonly=\"!baseUrl\"\n :submitted=\"isLeadSubmitted\"\n :loading=\"isLoadingSubmitLead\"\n :error=\"submitLeadError\"\n :privacy-policy-notice=\"agentInterface?.privacyPolicyNotice\"\n @submit=\"onLeadSubmit\" />\n </template>\n <template #tool-showSuggestedReply=\"{ part }\">\n <PkToolShowSuggestedReply\n :part\n @select=\"\n ($event) => {\n input = $event\n storeHandleSubmit()\n }\n \" />\n </template>\n <template #tool-showSources=\"{ part }\">\n <PkToolShowSources\n :part\n :on-expand-context=\"handleExpandSourceContext\"\n :on-download=\"handleDownloadSource\" />\n </template>\n <template #tool-showMultipleChoice=\"{ part }\">\n <transition mode=\"out-in\">\n <PkToolShowMultipleChoice\n :part\n :allow-custom-answer=\"\n agentTools?.showMultipleChoice?.allowCustomAnswer\n \"\n @select=\"\n addToolOutput({\n tool: 'showMultipleChoice',\n toolCallId: (part as any).toolCallId,\n output: $event,\n })\n \" />\n </transition>\n </template>\n <template #tool-requestOAuthConnection=\"{ part }\">\n <PkToolRequestOAuthConnection\n :part\n :resolve-connection=\"\n (serverName: string) =>\n apiClient.getOAuthAuthorizeUrl(\n props.agentId,\n serverName,\n )\n \"\n @connected=\"\n addToolOutput({\n tool: 'requestOAuthConnection',\n toolCallId: (part as any).toolCallId,\n output: { connected: true, mcpServerId: $event },\n })\n \" />\n </template>\n <template #tool-requestGeolocation=\"{ part }\">\n <PkToolRequestGeolocation\n :part\n :reverse-geocode=\"\n (lat: number, lon: number) =>\n apiClient.reverseGeocode(lat, lon)\n \"\n @result=\"\n addToolOutput({\n tool: 'requestGeolocation',\n toolCallId: (part as any).toolCallId,\n output: $event,\n })\n \" />\n </template>\n <template #tool-showLocation=\"{ part }\">\n <PkToolShowLocation\n :part\n :forward-geocode=\"\n (query: string, lang?: string) =>\n apiClient.forwardGeocode(query, lang)\n \" />\n </template>\n </PkChatbotMessages>\n <!-- #endregion -->\n\n <!-- #region input -->\n <div\n v-if=\"isConversationBlocked\"\n class=\"p-md border-t border-surface-3 text-center text-12 text-danger-darken-2 bg-surface-danger\">\n {{ $t('message.chatErrorConversationBlocked') }}\n </div>\n <PkChatbotInput\n v-else\n v-model=\"input\"\n v-model:pending-attachments=\"pendingAttachments\"\n :placeholder=\"inputMessagePlaceholder\"\n :dismissable-notice=\"\n dismissableNotice && chat.messages.length <= 1\n ? dismissableNotice\n : undefined\n \"\n :status=\"chat.status\"\n :max-message-length=\"agentInterface?.maxMessageLength\"\n :file-upload=\"agentFileUpload\"\n @stop-generation=\"stopGeneration\"\n @submit=\"storeHandleSubmit\"\n @file-select=\"handleFileSelect\" />\n <!-- #endregion -->\n <Transition>\n <div\n v-if=\"isOverDropZone && agentFileUpload?.enabled\"\n class=\"pk-chatbot-view-chat__drop-overlay\">\n <VvIcon\n name=\"ri:upload-cloud-2-line\"\n class=\"pk-chatbot-view-chat__drop-overlay-icon\" />\n <span>{{ $t('action.dropFile') }}</span>\n </div>\n </Transition>\n </div>\n</template>\n\n<style lang=\"scss\">\n .pk-chatbot-view-chat {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n\n &__drop-overlay {\n position: absolute;\n inset: var(--spacing-sm) var(--spacing-sm) var(--spacing-sm)\n var(--spacing-sm);\n z-index: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-xs);\n background-color: color-mix(\n in srgb,\n var(--color-surface) 85%,\n transparent\n );\n border-radius: var(--rounded-xl);\n border: var(--spacing-2) dashed var(--color-surface-5);\n pointer-events: none;\n color: var(--color-word-3);\n\n &-icon {\n font-size: var(--spacing-32);\n }\n }\n }\n</style>\n","<script setup lang=\"ts\">\n import { computed, useTemplateRef } from 'vue'\n import { useDropZone } from '@vueuse/core'\n import { storeToRefs } from 'pinia'\n import PkChatbotMessages from './PkChatbotMessages.vue'\n import PkChatbotInput from './PkChatbotInput.vue'\n import PkToolShowMultipleChoice from './PkToolShowMultipleChoice.vue'\n import PkToolShowContactForm from './PkToolShowContactForm.vue'\n import PkToolShowSuggestedReply from './PkToolShowSuggestedReply.vue'\n import PkToolShowSources from './PkToolShowSources.vue'\n import PkToolRequestGeolocation from './PkToolRequestGeolocation.vue'\n import PkToolRequestOAuthConnection from './PkToolRequestOAuthConnection.vue'\n import PkToolShowLocation from './PkToolShowLocation.vue'\n import { useLocalizedString } from '../composables/useLocalizedString'\n import { useChatbotStore } from 'composables'\n import type { UIChatMessage } from 'models'\n\n const props = defineProps<{ agentId: string }>()\n\n const emit = defineEmits<{\n 'show-info': [message: UIChatMessage]\n revise: [message: UIChatMessage]\n }>()\n\n const store = useChatbotStore(props.agentId)\n\n const {\n name,\n agentInterface,\n agentFileUpload,\n agentTools,\n actions,\n revisedAnswers,\n messages,\n chat,\n messageFeedbacks,\n feedbackDialogMessage,\n isFeedbackSubmitting,\n isFeedbackSubmitted,\n feedbackSubmitError,\n isLeadSubmitted,\n isLoadingSubmitLead,\n submitLeadError,\n input,\n inputMessagePlaceholder,\n isConversationBlocked,\n baseUrl,\n pendingAttachments,\n apiClient,\n } = storeToRefs(store)\n\n const {\n handleSubmit: storeHandleSubmit,\n stopGeneration,\n regenerate,\n onUpvote,\n onDownvote,\n onFeedback,\n onFeedbackSubmit,\n onLeadSubmit,\n startNewChat,\n addToolOutput,\n handleFileSelect,\n } = store\n\n const dismissableNotice = useLocalizedString(\n () => agentInterface.value?.dismissableNotice,\n )\n\n const chatViewEl = useTemplateRef<HTMLDivElement>('chatViewEl')\n\n const handleExpandSourceContext = async (payload: {\n documentId: string\n chunkIndex: number\n }) => {\n const result = await apiClient.value.expandSourceContext(\n props.agentId,\n payload.documentId,\n payload.chunkIndex,\n )\n return result.content\n }\n\n const handleDownloadSource = async (documentId: string) => {\n const result = await apiClient.value.downloadSourceDocument(\n props.agentId,\n documentId,\n )\n window.open(result.downloadUrl, '_blank')\n }\n\n const handleFileDrop = (files: File[] | null) => {\n if (!agentFileUpload.value?.enabled || !files) {\n return\n }\n for (const file of files) {\n handleFileSelect(file)\n }\n }\n\n const { isOverDropZone } = useDropZone(chatViewEl, {\n dataTypes: computed(\n () => agentFileUpload.value?.allowedMimeTypes ?? [],\n ),\n onDrop: handleFileDrop,\n })\n</script>\n\n<template>\n <div\n ref=\"chatViewEl\"\n class=\"pk-chatbot-view-chat\"\n :class=\"{\n 'pk-chatbot-view-chat--dragover':\n isOverDropZone && agentFileUpload?.enabled,\n }\">\n <!-- #region messages -->\n <PkChatbotMessages\n class=\"flex flex-col flex-1 min-h-0 p-md overflow-y-auto\"\n :name=\"name\"\n :messages=\"messages\"\n :status=\"chat.status\"\n :error=\"chat.error\"\n :main-color=\"agentInterface?.mainColor\"\n :text-color=\"agentInterface?.textColor\"\n :revised-answers=\"revisedAnswers\"\n :actions=\"actions\"\n :logo=\"agentInterface?.logo\"\n :message-feedbacks=\"messageFeedbacks\"\n :feedback-message-id=\"feedbackDialogMessage?.id\"\n :feedback-loading=\"isFeedbackSubmitting\"\n :feedback-submitted=\"isFeedbackSubmitted\"\n :feedback-error=\"feedbackSubmitError\"\n @feedback-submit=\"onFeedbackSubmit($event)\"\n @feedback-close=\"feedbackDialogMessage = undefined\"\n @regenerate=\"regenerate\"\n @auto-retry=\"regenerate\"\n @reset-chat=\"startNewChat\"\n @show-info=\"emit('show-info', $event)\"\n @revise=\"emit('revise', $event)\"\n @upvote=\"onUpvote\"\n @downvote=\"onDownvote\"\n @feedback=\"onFeedback\">\n <template #tool-showContactForm=\"{ part }\">\n <PkToolShowContactForm\n :part\n :readonly=\"!baseUrl\"\n :submitted=\"isLeadSubmitted\"\n :loading=\"isLoadingSubmitLead\"\n :error=\"submitLeadError\"\n :privacy-policy-notice=\"agentInterface?.privacyPolicyNotice\"\n @submit=\"onLeadSubmit\" />\n </template>\n <template #tool-showSuggestedReply=\"{ part }\">\n <PkToolShowSuggestedReply\n :part\n @select=\"\n ($event) => {\n input = $event\n storeHandleSubmit()\n }\n \" />\n </template>\n <template #tool-showSources=\"{ part }\">\n <PkToolShowSources\n :part\n :on-expand-context=\"handleExpandSourceContext\"\n :on-download=\"handleDownloadSource\" />\n </template>\n <template #tool-showMultipleChoice=\"{ part }\">\n <transition mode=\"out-in\">\n <PkToolShowMultipleChoice\n :part\n :allow-custom-answer=\"\n agentTools?.showMultipleChoice?.allowCustomAnswer\n \"\n @select=\"\n addToolOutput({\n tool: 'showMultipleChoice',\n toolCallId: (part as any).toolCallId,\n output: $event,\n })\n \" />\n </transition>\n </template>\n <template #tool-requestOAuthConnection=\"{ part }\">\n <PkToolRequestOAuthConnection\n :part\n :resolve-connection=\"\n (serverName: string) =>\n apiClient.getOAuthAuthorizeUrl(\n props.agentId,\n serverName,\n )\n \"\n @connected=\"\n addToolOutput({\n tool: 'requestOAuthConnection',\n toolCallId: (part as any).toolCallId,\n output: { connected: true, mcpServerId: $event },\n })\n \" />\n </template>\n <template #tool-requestGeolocation=\"{ part }\">\n <PkToolRequestGeolocation\n :part\n :reverse-geocode=\"\n (lat: number, lon: number) =>\n apiClient.reverseGeocode(lat, lon)\n \"\n @result=\"\n addToolOutput({\n tool: 'requestGeolocation',\n toolCallId: (part as any).toolCallId,\n output: $event,\n })\n \" />\n </template>\n <template #tool-showLocation=\"{ part }\">\n <PkToolShowLocation\n :part\n :forward-geocode=\"\n (query: string, lang?: string) =>\n apiClient.forwardGeocode(query, lang)\n \" />\n </template>\n </PkChatbotMessages>\n <!-- #endregion -->\n\n <!-- #region input -->\n <div\n v-if=\"isConversationBlocked\"\n class=\"p-md border-t border-surface-3 text-center text-12 text-danger-darken-2 bg-surface-danger\">\n {{ $t('message.chatErrorConversationBlocked') }}\n </div>\n <PkChatbotInput\n v-else\n v-model=\"input\"\n v-model:pending-attachments=\"pendingAttachments\"\n :placeholder=\"inputMessagePlaceholder\"\n :dismissable-notice=\"\n dismissableNotice && chat.messages.length <= 1\n ? dismissableNotice\n : undefined\n \"\n :status=\"chat.status\"\n :max-message-length=\"agentInterface?.maxMessageLength\"\n :file-upload=\"agentFileUpload\"\n @stop-generation=\"stopGeneration\"\n @submit=\"storeHandleSubmit\"\n @file-select=\"handleFileSelect\" />\n <!-- #endregion -->\n <Transition>\n <div\n v-if=\"isOverDropZone && agentFileUpload?.enabled\"\n class=\"pk-chatbot-view-chat__drop-overlay\">\n <VvIcon\n name=\"ri:upload-cloud-2-line\"\n class=\"pk-chatbot-view-chat__drop-overlay-icon\" />\n <span>{{ $t('action.dropFile') }}</span>\n </div>\n </Transition>\n </div>\n</template>\n\n<style lang=\"scss\">\n .pk-chatbot-view-chat {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n\n &__drop-overlay {\n position: absolute;\n inset: var(--spacing-sm) var(--spacing-sm) var(--spacing-sm)\n var(--spacing-sm);\n z-index: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-xs);\n background-color: color-mix(\n in srgb,\n var(--color-surface) 85%,\n transparent\n );\n border-radius: var(--rounded-xl);\n border: var(--spacing-2) dashed var(--color-surface-5);\n pointer-events: none;\n color: var(--color-word-3);\n\n &-icon {\n font-size: var(--spacing-32);\n }\n }\n }\n</style>\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PkToolShowComparison-CZ3kO6PT.js","names":["$t"],"sources":["../../../../packages/components/src/chat/PkToolShowComparison.vue","../../../../packages/components/src/chat/PkToolShowComparison.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useClipboard } from '@vueuse/core'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const { copy, copied } = useClipboard()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title?: string\n items: Array<{\n name: string\n values: Record<string, string>\n highlighted?: boolean\n }>\n }\n }\n return part\n })\n\n const features = computed(() => {\n const items = toolPart.value.input?.items\n if (!items || items.length === 0) {\n return []\n }\n return Object.keys(items[0].values)\n })\n\n const copyTable = () => {\n const items = toolPart.value.input?.items\n if (!items) {\n return\n }\n const header = ['', ...items.map((i) => i.name)].join('\\t')\n const rows = features.value.map((f) =>\n [f.replace(/_/g, ' '), ...items.map((i) => i.values[f] ?? '')].join(\n '\\t',\n ),\n )\n copy([header, ...rows].join('\\n'))\n }\n</script>\n\n<template>\n <div\n v-if=\"toolPart?.input?.items?.length\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8\">\n <VvIcon name=\"ri:scales-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{\n toolPart.input.title ?? $t('label.comparison')\n }}</strong>\n <VvButtonGroup modifiers=\"compact\" class=\"ml-auto shrink-0\">\n <VvButton\n modifiers=\"action-quiet-small\"\n :icon=\"copied ? 'ri:check-line' : 'ri:file-copy-line'\"\n :label=\"copied ? $t('action.copied') : $t('action.copy')\"\n @click=\"copyTable\" />\n </VvButtonGroup>\n </div>\n <div class=\"overflow-x-auto\">\n <table class=\"w-full text-12 border-collapse\">\n <thead>\n <tr>\n <th\n class=\"text-left text-word-3 font-medium p-8 border-b border-surface-3 min-w-32\"></th>\n <th\n v-for=\"item in toolPart.input.items\"\n :key=\"item.name\"\n class=\"text-center font-semibold text-word-1 p-8 border-b border-surface-3 min-w-24\"\n :class=\"\n item.highlighted\n ? 'bg-primary/5 border-primary/20'\n : ''\n \">\n {{ item.name }}\n <span v-if=\"item.highlighted\" class=\"ml-4\">⭐</span>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n v-for=\"(feature, fIdx) in features\"\n :key=\"feature\"\n :class=\"{ 'bg-surface-1': fIdx % 2 !== 0 }\">\n <td\n class=\"text-word-3 font-medium p-8 whitespace-nowrap\"\n :class=\"{\n 'border-b border-surface-3':\n fIdx !== features.length - 1,\n }\">\n {{ feature.replace(/_/g, ' ') }}\n </td>\n <td\n v-for=\"item in toolPart.input.items\"\n :key=\"item.name\"\n class=\"text-center p-8\"\n :class=\"{\n 'border-b border-surface-3':\n fIdx !== features.length - 1,\n 'bg-surface-info': item.highlighted,\n 'text-success': item.values[feature] === '✓',\n 'text-danger':\n item.values[feature] === '\\u2717',\n 'text-word-2':\n item.values[feature] !== '✓' &&\n item.values[feature] !== '\\u2717',\n }\">\n {{ item.values[feature] ?? '—' }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useClipboard } from '@vueuse/core'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const { copy, copied } = useClipboard()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title?: string\n items: Array<{\n name: string\n values: Record<string, string>\n highlighted?: boolean\n }>\n }\n }\n return part\n })\n\n const features = computed(() => {\n const items = toolPart.value.input?.items\n if (!items || items.length === 0) {\n return []\n }\n return Object.keys(items[0].values)\n })\n\n const copyTable = () => {\n const items = toolPart.value.input?.items\n if (!items) {\n return\n }\n const header = ['', ...items.map((i) => i.name)].join('\\t')\n const rows = features.value.map((f) =>\n [f.replace(/_/g, ' '), ...items.map((i) => i.values[f] ?? '')].join(\n '\\t',\n ),\n )\n copy([header, ...rows].join('\\n'))\n }\n</script>\n\n<template>\n <div\n v-if=\"toolPart?.input?.items?.length\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8\">\n <VvIcon name=\"ri:scales-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{\n toolPart.input.title ?? $t('label.comparison')\n }}</strong>\n <VvButtonGroup modifiers=\"compact\" class=\"ml-auto shrink-0\">\n <VvButton\n modifiers=\"action-quiet-small\"\n :icon=\"copied ? 'ri:check-line' : 'ri:file-copy-line'\"\n :label=\"copied ? $t('action.copied') : $t('action.copy')\"\n @click=\"copyTable\" />\n </VvButtonGroup>\n </div>\n <div class=\"overflow-x-auto\">\n <table class=\"w-full text-12 border-collapse\">\n <thead>\n <tr>\n <th\n class=\"text-left text-word-3 font-medium p-8 border-b border-surface-3 min-w-32\"></th>\n <th\n v-for=\"item in toolPart.input.items\"\n :key=\"item.name\"\n class=\"text-center font-semibold text-word-1 p-8 border-b border-surface-3 min-w-24\"\n :class=\"\n item.highlighted\n ? 'bg-primary/5 border-primary/20'\n : ''\n \">\n {{ item.name }}\n <span v-if=\"item.highlighted\" class=\"ml-4\">⭐</span>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n v-for=\"(feature, fIdx) in features\"\n :key=\"feature\"\n :class=\"{ 'bg-surface-1': fIdx % 2 !== 0 }\">\n <td\n class=\"text-word-3 font-medium p-8 whitespace-nowrap\"\n :class=\"{\n 'border-b border-surface-3':\n fIdx !== features.length - 1,\n }\">\n {{ feature.replace(/_/g, ' ') }}\n </td>\n <td\n v-for=\"item in toolPart.input.items\"\n :key=\"item.name\"\n class=\"text-center p-8\"\n :class=\"{\n 'border-b border-surface-3':\n fIdx !== features.length - 1,\n 'bg-surface-info': item.highlighted,\n 'text-success': item.values[feature] === '✓',\n 'text-danger':\n item.values[feature] === '\\u2717',\n 'text-word-2':\n item.values[feature] !== '✓' &&\n item.values[feature] !== '\\u2717',\n }\">\n {{ item.values[feature] ?? '—' }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;EAII,IAAM,IAAQ,GAIR,EAAE,SAAM,cAAW,EAAa,GAEhC,IAAW,QACA,EAAM,IAWtB,GAEK,IAAW,QAAe;GAC5B,IAAM,IAAQ,EAAS,MAAM,OAAO;GAIpC,OAHI,CAAC,KAAS,EAAM,WAAW,IACpB,CAAC,IAEL,OAAO,KAAK,EAAM,GAAG,MAAM;EACtC,CAAC,GAEK,UAAkB;GACpB,IAAM,IAAQ,EAAS,MAAM,OAAO;GAC/B,KASL,EAAK,CANU,CAAC,IAAI,GAAG,EAAM,KAAK,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,GAMhD,GAAQ,GALD,EAAS,MAAM,KAAK,MAC7B,CAAC,EAAE,QAAQ,MAAM,GAAG,GAAG,GAAG,EAAM,KAAK,MAAM,EAAE,OAAO,MAAM,EAAE,CAAC,EAAE,KAC3D,GACJ,CAEa,CAAI,EAAE,KAAK,IAAI,CAAC;EACrC;;;UAKU,EAAA,OAAU,OAAO,OAAO,UAAA,EAAA,GADlC,EAuEM,OAvEN,GAuEM,CApEF,EAaM,OAbN,GAaM;IAXF,EAAgD,GAAA;KAAxC,MAAK;KAAiB,OAAM;;IACpC,EAEW,UAFX,GAEW,EADP,EAAA,MAAS,MAAM,SAASA,EAAAA,GAAE,kBAAA,CAAA,GAAA,CAAA;IAE9B,EAMgB,GAAA;KAND,WAAU;KAAU,OAAM;;sBAKZ,CAJzB,EAIyB,GAAA;MAHrB,WAAU;MACT,MAAM,EAAA,CAAA,IAAM,kBAAA;MACZ,OAAO,EAAA,CAAA,IAASA,EAAAA,GAAE,eAAA,IAAoBA,EAAAA,GAAE,aAAA;MACxC,SAAO;;;;OAGpB,EAqDM,OArDN,GAqDM,CApDF,EAmDQ,SAnDR,GAmDQ,CAlDJ,EAiBQ,SAAA,MAAA,CAhBJ,EAeK,MAAA,MAAA,CAAA,AAAA,EAAA,OAdD,EAC0F,MAAA,EAAtF,OAAM,2EAA0E,GAAA,MAAA,EAAA,IAAA,EAAA,EAAA,GACpF,EAWK,GAAA,MAAA,EAVc,EAAA,MAAS,MAAM,QAAvB,YADX,EAWK,MAAA;IATA,KAAK,EAAK;IACX,OAAK,EAAA,CAAC,gFACmC,EAAK,cAAA,mCAAA,EAAA,CAAA;WAK3C,EAAK,IAAI,IAAG,KACf,CAAA,GAAY,EAAK,eAAA,EAAA,GAAjB,EAAmD,QAAnD,GAA2C,GAAC,KAAA,EAAA,IAAA,EAAA,CAAA,GAAA,CAAA,gBAIxD,EA+BQ,SAAA,MAAA,EAAA,EAAA,EAAA,GA9BJ,EA6BK,GAAA,MAAA,EA5ByB,EAAA,QAAlB,GAAS,YADrB,EA6BK,MAAA;IA3BA,KAAK;IACL,OAAK,EAAA,EAAA,gBAAoB,IAAI,KAAA,EAAA,CAAA;OAC9B,EAOK,MAAA,EAND,OAAK,EAAA,CAAC,iDAA+C,EAAA,6BACsD,MAAS,EAAA,MAAS,SAAM,EAAA,CAAA,CAAA,EAAA,GAAA,EAIhI,EAAQ,QAAO,MAAA,GAAA,CAAA,GAAA,CAAA,IAAA,EAAA,EAAA,GAEtB,EAgBK,GAAA,MAAA,EAfc,EAAA,MAAS,MAAM,QAAvB,YADX,EAgBK,MAAA;IAdA,KAAK,EAAK;IACX,OAAK,EAAA,CAAC,mBAAiB;kCACoF,MAAS,EAAA,MAAS,SAAM;wBAAyD,EAAK;qBAA6D,EAAK,OAAO,OAAO;oBAA8F,EAAK,OAAO,OAAO;oBAAmG,EAAK,OAAO,OAAO,OAAiD,EAAK,OAAO,OAAO;;QAWzjB,EAAK,OAAO,MAAO,GAAA,GAAA,CAAA"}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { o as e } from "./useChatbotStore-C1gZgvam.js";
|
|
2
|
-
import { l as t, m as n, v as r } from "./schemas-iFPUt2Jr.js";
|
|
3
|
-
import { t as i } from "./useSafeLocalStorage-BL5mqfb7.js";
|
|
4
|
-
import { t as a } from "./PkStreamingMarkdown-DvjHrpmN.js";
|
|
5
|
-
import { n as o } from "./PkChatbotFeedbackForm-BFG5AcGR.js";
|
|
6
|
-
import { VvButton as s, VvIcon as c } from "@volverjs/ui-vue/components";
|
|
7
|
-
import { Transition as l, computed as u, createElementBlock as d, createElementVNode as f, createVNode as p, defineComponent as m, isRef as h, openBlock as g, toDisplayString as _, toValue as v, unref as y, watch as b, withCtx as x } from "vue";
|
|
8
|
-
import { useI18n as S } from "vue-i18n";
|
|
9
|
-
//#region ../../packages/components/src/composables/useLocalizedString.ts
|
|
10
|
-
function C(e, t) {
|
|
11
|
-
let { locale: n, t: r, te: i } = S({ useScope: "global" });
|
|
12
|
-
return u(() => {
|
|
13
|
-
let a = v(e), o = t !== void 0 && i(t) ? r(t) : void 0;
|
|
14
|
-
return a && a[n.value] || o;
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
//#endregion
|
|
18
|
-
//#region ../../packages/components/src/chat/PkToolShowContactForm.vue?vue&type=script&setup=true&lang.ts
|
|
19
|
-
var w = { class: "border border-surface-3 rounded-xl w-full overflow-hidden" }, T = { class: "px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8 min-h-40" }, E = { class: "font-bold" }, D = {
|
|
20
|
-
key: 0,
|
|
21
|
-
class: "p-sm"
|
|
22
|
-
}, O = { class: "flex justify-between items-center gap-16 mt-xs" }, k = { class: "text-smaller text-word-3 flex items-center gap-8" }, A = {
|
|
23
|
-
key: 1,
|
|
24
|
-
class: "p-sm"
|
|
25
|
-
}, j = { class: "flex items-center gap-sm" }, M = { class: "font-semibold block text-success" }, N = { class: "text-word-3" }, P = /* @__PURE__ */ m({
|
|
26
|
-
__name: "PkToolShowContactForm",
|
|
27
|
-
props: {
|
|
28
|
-
part: {},
|
|
29
|
-
submitted: { type: Boolean },
|
|
30
|
-
loading: { type: Boolean },
|
|
31
|
-
error: {},
|
|
32
|
-
readonly: { type: Boolean },
|
|
33
|
-
privacyPolicyNotice: {}
|
|
34
|
-
},
|
|
35
|
-
emits: ["submit"],
|
|
36
|
-
setup(e, { emit: m }) {
|
|
37
|
-
let { t: v } = S({ useScope: "global" }), P = e, F = u(() => P.part), I = u(() => F.value.input), L = i(u(() => `${F.value.toolCallId}-${F.value.type}-submitted`), !1), R = n({
|
|
38
|
-
name: r().min(1).max(255).default(""),
|
|
39
|
-
email: t().max(255).default(""),
|
|
40
|
-
phone: r().max(50).regex(/^[+0-9\s\-.()]*$/, v("validation.invalidPhoneNumber")).optional()
|
|
41
|
-
}), z = m, { VvForm: B, VvFormField: V, formData: H } = o(R, { lazyLoad: !0 });
|
|
42
|
-
b(I, (e) => {
|
|
43
|
-
H.value = {
|
|
44
|
-
name: e?.name || "",
|
|
45
|
-
email: e?.email || "",
|
|
46
|
-
phone: e?.phone || ""
|
|
47
|
-
};
|
|
48
|
-
}, { immediate: !0 }), b(() => P.submitted, (e) => {
|
|
49
|
-
e && (L.value = !0);
|
|
50
|
-
}, { immediate: !0 });
|
|
51
|
-
let U = u(() => P.submitted || L.value), W = async (e) => {
|
|
52
|
-
z("submit", {
|
|
53
|
-
...e,
|
|
54
|
-
metadata: I.value?.conversationContext
|
|
55
|
-
});
|
|
56
|
-
}, G = C(() => P.privacyPolicyNotice, "message.defaultPrivacyPolicyNotice");
|
|
57
|
-
return (t, n) => {
|
|
58
|
-
let r = c, i = s;
|
|
59
|
-
return g(), d("div", w, [f("div", T, [p(r, {
|
|
60
|
-
name: "ri:send-plane-2-line",
|
|
61
|
-
class: "text-16"
|
|
62
|
-
}), f("strong", E, _(y(v)("label.contactUs")), 1)]), p(l, { mode: "out-in" }, {
|
|
63
|
-
default: x(() => [U.value ? (g(), d("div", A, [f("div", j, [p(r, {
|
|
64
|
-
name: "ri:mail-check-line",
|
|
65
|
-
class: "text-24 text-success"
|
|
66
|
-
}), f("div", null, [f("strong", M, _(y(v)("message.leadSubmittedTitle")), 1), f("p", N, _(y(v)("message.leadSubmittedMessage")), 1)])])])) : (g(), d("div", D, [p(y(B), {
|
|
67
|
-
modelValue: y(H),
|
|
68
|
-
"onUpdate:modelValue": n[0] ||= (e) => h(H) ? H.value = e : null,
|
|
69
|
-
readonly: e.readonly,
|
|
70
|
-
onSubmit: W
|
|
71
|
-
}, {
|
|
72
|
-
default: x(() => [
|
|
73
|
-
p(y(V), {
|
|
74
|
-
name: "name",
|
|
75
|
-
type: "text",
|
|
76
|
-
label: y(v)("label.name"),
|
|
77
|
-
placeholder: y(v)("placeholder.name"),
|
|
78
|
-
icon: "ri:user-line",
|
|
79
|
-
modifiers: "compact no-label",
|
|
80
|
-
class: "mb-md"
|
|
81
|
-
}, null, 8, ["label", "placeholder"]),
|
|
82
|
-
p(y(V), {
|
|
83
|
-
name: "email",
|
|
84
|
-
type: "email",
|
|
85
|
-
label: y(v)("label.email"),
|
|
86
|
-
placeholder: y(v)("placeholder.email"),
|
|
87
|
-
icon: "ri:mail-line",
|
|
88
|
-
modifiers: "compact no-label",
|
|
89
|
-
class: "mb-md"
|
|
90
|
-
}, null, 8, ["label", "placeholder"]),
|
|
91
|
-
p(y(V), {
|
|
92
|
-
name: "phone",
|
|
93
|
-
type: "tel",
|
|
94
|
-
label: y(v)("label.phone"),
|
|
95
|
-
placeholder: y(v)("placeholder.phone"),
|
|
96
|
-
icon: "ri:phone-line",
|
|
97
|
-
class: "mb-md",
|
|
98
|
-
modifiers: "compact no-label"
|
|
99
|
-
}, null, 8, ["label", "placeholder"]),
|
|
100
|
-
f("div", O, [f("div", k, [p(r, {
|
|
101
|
-
name: "ri:shield-check-line",
|
|
102
|
-
class: "text-16 shrink-0"
|
|
103
|
-
}), p(a, {
|
|
104
|
-
markdown: y(G),
|
|
105
|
-
class: "wysiwyg"
|
|
106
|
-
}, null, 8, ["markdown"])]), p(i, {
|
|
107
|
-
type: "submit",
|
|
108
|
-
modifiers: "primary",
|
|
109
|
-
loading: e.loading,
|
|
110
|
-
disabled: e.loading || e.readonly,
|
|
111
|
-
"icon-position": "right",
|
|
112
|
-
class: "shrink-0",
|
|
113
|
-
label: y(v)("action.submit")
|
|
114
|
-
}, null, 8, [
|
|
115
|
-
"loading",
|
|
116
|
-
"disabled",
|
|
117
|
-
"label"
|
|
118
|
-
])])
|
|
119
|
-
]),
|
|
120
|
-
_: 1
|
|
121
|
-
}, 8, ["modelValue", "readonly"])]))]),
|
|
122
|
-
_: 1
|
|
123
|
-
})]);
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
}), F = /* @__PURE__ */ e({ default: () => I }), I = P;
|
|
127
|
-
//#endregion
|
|
128
|
-
export { F as n, C as r, I as t };
|
|
129
|
-
|
|
130
|
-
//# sourceMappingURL=PkToolShowContactForm-CTbMiGnv.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PkToolShowContactForm-CTbMiGnv.js","names":[],"sources":["../../../../packages/components/src/composables/useLocalizedString.ts","../../../../packages/components/src/chat/PkToolShowContactForm.vue","../../../../packages/components/src/chat/PkToolShowContactForm.vue"],"sourcesContent":["import { computed, toValue, type ComputedRef, type MaybeRefOrGetter } from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport type { LocalizedString } from 'models'\n\nexport function useLocalizedString(\n value: MaybeRefOrGetter<LocalizedString | undefined>,\n fallbackKey: string,\n): ComputedRef<string>\nexport function useLocalizedString(\n value: MaybeRefOrGetter<LocalizedString | undefined>,\n): ComputedRef<string | undefined>\nexport function useLocalizedString(\n value: MaybeRefOrGetter<LocalizedString | undefined>,\n fallbackKey?: string,\n): ComputedRef<string | undefined> {\n const { locale, t, te } = useI18n({ useScope: 'global' })\n\n return computed(() => {\n const val = toValue(value)\n const fb =\n fallbackKey !== undefined && te(fallbackKey)\n ? t(fallbackKey)\n : undefined\n\n if (!val) {\n return fb\n }\n\n return val[locale.value] || fb\n })\n}\n","<script setup lang=\"ts\">\n import { computed, watch } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { useForm } from '@volverjs/form-vue'\n import * as z from 'zod'\n import { useSafeLocalStorage } from 'composables'\n import type { LocalizedString } from 'models'\n import { useLocalizedString } from '../composables/useLocalizedString'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n\n const { t: $t } = useI18n({ useScope: 'global' })\n\n const props = defineProps<{\n part: unknown\n submitted?: boolean\n loading?: boolean\n error?: string\n readonly?: boolean\n privacyPolicyNotice?: LocalizedString\n }>()\n\n const toolPart = computed(() => {\n const part = props.part as {\n type: string\n toolCallId: string\n input?: {\n name: string\n email: string\n phone?: string\n conversationContext?: Record<string, unknown>\n }\n }\n return part\n })\n\n const input = computed(() => toolPart.value.input)\n\n const localSubmitted = useSafeLocalStorage<boolean>(\n computed(\n () =>\n `${toolPart.value.toolCallId}-${toolPart.value.type}-submitted`,\n ),\n false,\n )\n\n const LeadFormSchema = z.object({\n name: z.string().min(1).max(255).default(''),\n email: z.email().max(255).default(''),\n phone: z\n .string()\n .max(50)\n .regex(/^[+0-9\\s\\-.()]*$/, $t('validation.invalidPhoneNumber'))\n .optional(),\n })\n\n const emit = defineEmits<{\n submit: [data: Record<string, unknown>]\n }>()\n\n const { VvForm, VvFormField, formData } = useForm(LeadFormSchema, {\n lazyLoad: true,\n })\n\n // Pre-populate form with input values\n watch(\n input,\n (newInput) => {\n formData.value = {\n name: newInput?.name || '',\n email: newInput?.email || '',\n phone: newInput?.phone || '',\n }\n },\n { immediate: true },\n )\n\n watch(\n () => props.submitted,\n (submitted) => {\n if (submitted) {\n localSubmitted.value = true\n }\n },\n { immediate: true },\n )\n\n const isSubmitted = computed(() => {\n return props.submitted || localSubmitted.value\n })\n\n const submitLead = async (data: Record<string, unknown>): Promise<void> => {\n emit('submit', { ...data, metadata: input.value?.conversationContext })\n }\n\n const privacyNotice = useLocalizedString(\n () => props.privacyPolicyNotice,\n 'message.defaultPrivacyPolicyNotice',\n )\n</script>\n\n<template>\n <div class=\"border border-surface-3 rounded-xl w-full overflow-hidden\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8 min-h-40\">\n <VvIcon name=\"ri:send-plane-2-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{ $t('label.contactUs') }}</strong>\n </div>\n\n <Transition mode=\"out-in\">\n <div v-if=\"!isSubmitted\" class=\"p-sm\">\n <VvForm v-model=\"formData\" :readonly @submit=\"submitLead\">\n <VvFormField\n name=\"name\"\n type=\"text\"\n :label=\"$t('label.name')\"\n :placeholder=\"$t('placeholder.name')\"\n icon=\"ri:user-line\"\n modifiers=\"compact no-label\"\n class=\"mb-md\" />\n <VvFormField\n name=\"email\"\n type=\"email\"\n :label=\"$t('label.email')\"\n :placeholder=\"$t('placeholder.email')\"\n icon=\"ri:mail-line\"\n modifiers=\"compact no-label\"\n class=\"mb-md\" />\n <VvFormField\n name=\"phone\"\n type=\"tel\"\n :label=\"$t('label.phone')\"\n :placeholder=\"$t('placeholder.phone')\"\n icon=\"ri:phone-line\"\n class=\"mb-md\"\n modifiers=\"compact no-label\" />\n\n <div class=\"flex justify-between items-center gap-16 mt-xs\">\n <div\n class=\"text-smaller text-word-3 flex items-center gap-8\">\n <VvIcon\n name=\"ri:shield-check-line\"\n class=\"text-16 shrink-0\" />\n <PkStreamingMarkdown\n :markdown=\"privacyNotice\"\n class=\"wysiwyg\" />\n </div>\n <VvButton\n type=\"submit\"\n modifiers=\"primary\"\n :loading\n :disabled=\"loading || readonly\"\n icon-position=\"right\"\n class=\"shrink-0\"\n :label=\"$t('action.submit')\" />\n </div>\n </VvForm>\n </div>\n <div v-else class=\"p-sm\">\n <div class=\"flex items-center gap-sm\">\n <VvIcon\n name=\"ri:mail-check-line\"\n class=\"text-24 text-success\" />\n <div>\n <strong class=\"font-semibold block text-success\">\n {{ $t('message.leadSubmittedTitle') }}\n </strong>\n <p class=\"text-word-3\">\n {{ $t('message.leadSubmittedMessage') }}\n </p>\n </div>\n </div>\n </div>\n </Transition>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, watch } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { useForm } from '@volverjs/form-vue'\n import * as z from 'zod'\n import { useSafeLocalStorage } from 'composables'\n import type { LocalizedString } from 'models'\n import { useLocalizedString } from '../composables/useLocalizedString'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n\n const { t: $t } = useI18n({ useScope: 'global' })\n\n const props = defineProps<{\n part: unknown\n submitted?: boolean\n loading?: boolean\n error?: string\n readonly?: boolean\n privacyPolicyNotice?: LocalizedString\n }>()\n\n const toolPart = computed(() => {\n const part = props.part as {\n type: string\n toolCallId: string\n input?: {\n name: string\n email: string\n phone?: string\n conversationContext?: Record<string, unknown>\n }\n }\n return part\n })\n\n const input = computed(() => toolPart.value.input)\n\n const localSubmitted = useSafeLocalStorage<boolean>(\n computed(\n () =>\n `${toolPart.value.toolCallId}-${toolPart.value.type}-submitted`,\n ),\n false,\n )\n\n const LeadFormSchema = z.object({\n name: z.string().min(1).max(255).default(''),\n email: z.email().max(255).default(''),\n phone: z\n .string()\n .max(50)\n .regex(/^[+0-9\\s\\-.()]*$/, $t('validation.invalidPhoneNumber'))\n .optional(),\n })\n\n const emit = defineEmits<{\n submit: [data: Record<string, unknown>]\n }>()\n\n const { VvForm, VvFormField, formData } = useForm(LeadFormSchema, {\n lazyLoad: true,\n })\n\n // Pre-populate form with input values\n watch(\n input,\n (newInput) => {\n formData.value = {\n name: newInput?.name || '',\n email: newInput?.email || '',\n phone: newInput?.phone || '',\n }\n },\n { immediate: true },\n )\n\n watch(\n () => props.submitted,\n (submitted) => {\n if (submitted) {\n localSubmitted.value = true\n }\n },\n { immediate: true },\n )\n\n const isSubmitted = computed(() => {\n return props.submitted || localSubmitted.value\n })\n\n const submitLead = async (data: Record<string, unknown>): Promise<void> => {\n emit('submit', { ...data, metadata: input.value?.conversationContext })\n }\n\n const privacyNotice = useLocalizedString(\n () => props.privacyPolicyNotice,\n 'message.defaultPrivacyPolicyNotice',\n )\n</script>\n\n<template>\n <div class=\"border border-surface-3 rounded-xl w-full overflow-hidden\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8 min-h-40\">\n <VvIcon name=\"ri:send-plane-2-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{ $t('label.contactUs') }}</strong>\n </div>\n\n <Transition mode=\"out-in\">\n <div v-if=\"!isSubmitted\" class=\"p-sm\">\n <VvForm v-model=\"formData\" :readonly @submit=\"submitLead\">\n <VvFormField\n name=\"name\"\n type=\"text\"\n :label=\"$t('label.name')\"\n :placeholder=\"$t('placeholder.name')\"\n icon=\"ri:user-line\"\n modifiers=\"compact no-label\"\n class=\"mb-md\" />\n <VvFormField\n name=\"email\"\n type=\"email\"\n :label=\"$t('label.email')\"\n :placeholder=\"$t('placeholder.email')\"\n icon=\"ri:mail-line\"\n modifiers=\"compact no-label\"\n class=\"mb-md\" />\n <VvFormField\n name=\"phone\"\n type=\"tel\"\n :label=\"$t('label.phone')\"\n :placeholder=\"$t('placeholder.phone')\"\n icon=\"ri:phone-line\"\n class=\"mb-md\"\n modifiers=\"compact no-label\" />\n\n <div class=\"flex justify-between items-center gap-16 mt-xs\">\n <div\n class=\"text-smaller text-word-3 flex items-center gap-8\">\n <VvIcon\n name=\"ri:shield-check-line\"\n class=\"text-16 shrink-0\" />\n <PkStreamingMarkdown\n :markdown=\"privacyNotice\"\n class=\"wysiwyg\" />\n </div>\n <VvButton\n type=\"submit\"\n modifiers=\"primary\"\n :loading\n :disabled=\"loading || readonly\"\n icon-position=\"right\"\n class=\"shrink-0\"\n :label=\"$t('action.submit')\" />\n </div>\n </VvForm>\n </div>\n <div v-else class=\"p-sm\">\n <div class=\"flex items-center gap-sm\">\n <VvIcon\n name=\"ri:mail-check-line\"\n class=\"text-24 text-success\" />\n <div>\n <strong class=\"font-semibold block text-success\">\n {{ $t('message.leadSubmittedTitle') }}\n </strong>\n <p class=\"text-word-3\">\n {{ $t('message.leadSubmittedMessage') }}\n </p>\n </div>\n </div>\n </div>\n </Transition>\n </div>\n</template>\n"],"mappings":"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"}
|