@8wave/ai-elements 0.84.0 → 0.85.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.
Files changed (459) hide show
  1. package/README.md +109 -0
  2. package/dist/_chunks/Media-Cu3QLEp0.js +120 -0
  3. package/dist/_chunks/Media-Cu3QLEp0.js.map +1 -0
  4. package/dist/_chunks/{PkStreamingMarkdown-SVWv4Oye.js → PkStreamingMarkdown-C_fNNe9O.js} +307 -295
  5. package/dist/_chunks/PkStreamingMarkdown-C_fNNe9O.js.map +1 -0
  6. package/dist/_chunks/PkToolRequestConfirm-DfRFlvE0.js +48 -0
  7. package/dist/_chunks/PkToolRequestConfirm-DfRFlvE0.js.map +1 -0
  8. package/dist/_chunks/PkToolRequestGeolocation-BpH3Ev71.js +67 -0
  9. package/dist/_chunks/PkToolRequestGeolocation-BpH3Ev71.js.map +1 -0
  10. package/dist/_chunks/PkToolRequestOAuthConnection-Ctz50teF.js +63 -0
  11. package/dist/_chunks/PkToolRequestOAuthConnection-Ctz50teF.js.map +1 -0
  12. package/dist/_chunks/{PkToolShowArtifact-Ddz3DsWl.js → PkToolShowArtifact-Drp_zW-3.js} +33 -33
  13. package/dist/_chunks/{PkToolShowArtifact-Ddz3DsWl.js.map → PkToolShowArtifact-Drp_zW-3.js.map} +1 -1
  14. package/dist/_chunks/{PkToolShowCalendarEvent-Kl7HolAK.js → PkToolShowCalendarEvent-D1XYExcQ.js} +40 -40
  15. package/dist/_chunks/{PkToolShowCalendarEvent-Kl7HolAK.js.map → PkToolShowCalendarEvent-D1XYExcQ.js.map} +1 -1
  16. package/dist/_chunks/PkToolShowComparison-DjK4sXS0.js +64 -0
  17. package/dist/_chunks/{PkToolShowComparison-BzyqEIMV.js.map → PkToolShowComparison-DjK4sXS0.js.map} +1 -1
  18. package/dist/_chunks/PkToolShowContactForm-DresTyBD.js +119 -0
  19. package/dist/_chunks/PkToolShowContactForm-DresTyBD.js.map +1 -0
  20. package/dist/_chunks/PkToolShowDiagram-Bg6gQn7r.js +228 -0
  21. package/dist/_chunks/PkToolShowDiagram-Bg6gQn7r.js.map +1 -0
  22. package/dist/_chunks/{PkToolShowEmail-DsmUAss-.js → PkToolShowEmail-DGCKzD3s.js} +31 -31
  23. package/dist/_chunks/{PkToolShowEmail-DsmUAss-.js.map → PkToolShowEmail-DGCKzD3s.js.map} +1 -1
  24. package/dist/_chunks/{PkToolShowImageGallery-BDKm1kSX.js → PkToolShowImageGallery-BhyAMaes.js} +19 -19
  25. package/dist/_chunks/{PkToolShowImageGallery-BDKm1kSX.js.map → PkToolShowImageGallery-BhyAMaes.js.map} +1 -1
  26. package/dist/_chunks/PkToolShowLocation-BDVFw7qK.js +1140 -0
  27. package/dist/_chunks/PkToolShowLocation-BDVFw7qK.js.map +1 -0
  28. package/dist/_chunks/{PkToolShowMessage-xy09z85p.js → PkToolShowMessage-BqH-tE8K.js} +27 -27
  29. package/dist/_chunks/{PkToolShowMessage-xy09z85p.js.map → PkToolShowMessage-BqH-tE8K.js.map} +1 -1
  30. package/dist/_chunks/PkToolShowMultipleChoice-DNfjzGxI.js +81 -0
  31. package/dist/_chunks/PkToolShowMultipleChoice-DNfjzGxI.js.map +1 -0
  32. package/dist/_chunks/{PkToolShowProductList-Al_csZaz.js → PkToolShowProductList-DeU4qyZp.js} +26 -26
  33. package/dist/_chunks/{PkToolShowProductList-Al_csZaz.js.map → PkToolShowProductList-DeU4qyZp.js.map} +1 -1
  34. package/dist/_chunks/{PkToolShowQrCode-RUJ3enlC.js → PkToolShowQrCode-BrljSubk.js} +22 -22
  35. package/dist/_chunks/{PkToolShowQrCode-RUJ3enlC.js.map → PkToolShowQrCode-BrljSubk.js.map} +1 -1
  36. package/dist/_chunks/PkToolShowSources-Ca36N91a.js +396 -0
  37. package/dist/_chunks/PkToolShowSources-Ca36N91a.js.map +1 -0
  38. package/dist/_chunks/PkToolShowSuggestedReply-2lyEikVx.js +47 -0
  39. package/dist/_chunks/PkToolShowSuggestedReply-2lyEikVx.js.map +1 -0
  40. package/dist/_chunks/{PkToolShowWeather-CSua0gHs.js → PkToolShowWeather-CnTyMQTT.js} +63 -63
  41. package/dist/_chunks/{PkToolShowWeather-CSua0gHs.js.map → PkToolShowWeather-CnTyMQTT.js.map} +1 -1
  42. package/dist/_chunks/{PkToolShowWebPages-8GWslqfY.js → PkToolShowWebPages-X0tkNJhc.js} +19 -19
  43. package/dist/_chunks/{PkToolShowWebPages-8GWslqfY.js.map → PkToolShowWebPages-X0tkNJhc.js.map} +1 -1
  44. package/dist/_chunks/{PkUrl-CeYapZ9E.js → PkUrl-ChRoceUn.js} +12 -12
  45. package/dist/_chunks/{PkUrl-CeYapZ9E.js.map → PkUrl-ChRoceUn.js.map} +1 -1
  46. package/dist/_chunks/{VvCheckbox.es-kAXSBkfn.js → VvCheckbox.es-CjtdGRKd.js} +63 -63
  47. package/dist/_chunks/{VvCheckbox.es-kAXSBkfn.js.map → VvCheckbox.es-CjtdGRKd.js.map} +1 -1
  48. package/dist/_chunks/{VvCheckboxGroup.es-Db-bLs2D.js → VvCheckboxGroup.es-DYHTVBaF.js} +91 -91
  49. package/dist/_chunks/{VvCheckboxGroup.es-Db-bLs2D.js.map → VvCheckboxGroup.es-DYHTVBaF.js.map} +1 -1
  50. package/dist/_chunks/VvCombobox.es-BxxQaz48.js +1998 -0
  51. package/dist/_chunks/{VvCombobox.es-CUUNtqyJ.js.map → VvCombobox.es-BxxQaz48.js.map} +1 -1
  52. package/dist/_chunks/{VvInputText.es-DeAexenB.js → VvInputText.es-B13qbrJj.js} +420 -420
  53. package/dist/_chunks/{VvInputText.es-DeAexenB.js.map → VvInputText.es-B13qbrJj.js.map} +1 -1
  54. package/dist/_chunks/{VvRadio.es-lb_BYfq5.js → VvRadio.es-DuSk75Cl.js} +117 -117
  55. package/dist/_chunks/{VvRadio.es-lb_BYfq5.js.map → VvRadio.es-DuSk75Cl.js.map} +1 -1
  56. package/dist/_chunks/{VvRadioGroup.es-BjvxDtU_.js → VvRadioGroup.es-BjPz7xfR.js} +91 -91
  57. package/dist/_chunks/{VvRadioGroup.es-BjvxDtU_.js.map → VvRadioGroup.es-BjPz7xfR.js.map} +1 -1
  58. package/dist/_chunks/{VvSelect.es-C9hkmhJf.js → VvSelect.es-CKFBoQN-.js} +119 -119
  59. package/dist/_chunks/{VvSelect.es-C9hkmhJf.js.map → VvSelect.es-CKFBoQN-.js.map} +1 -1
  60. package/dist/_chunks/VvTextarea.es-CICFo2Rh.js +1110 -0
  61. package/dist/_chunks/{VvTextarea.es-B5txwRRm.js.map → VvTextarea.es-CICFo2Rh.js.map} +1 -1
  62. package/dist/_chunks/dist-Dplp2WfI.js +799 -0
  63. package/dist/_chunks/{dist-DHG50RNO.js.map → dist-Dplp2WfI.js.map} +1 -1
  64. package/dist/_chunks/{esm-8uCGyZon.js → esm-CtL6xvv9.js} +19 -19
  65. package/dist/_chunks/{esm-8uCGyZon.js.map → esm-CtL6xvv9.js.map} +1 -1
  66. package/dist/_chunks/{floating-ui.vue-bC-fUl9J.js → floating-ui.vue-BWkka9Fn.js} +6 -6
  67. package/dist/_chunks/{floating-ui.vue-bC-fUl9J.js.map → floating-ui.vue-BWkka9Fn.js.map} +1 -1
  68. package/dist/_chunks/{iconify-B2ZQHsNr.js → iconify-DlYsYC8z.js} +5 -5
  69. package/dist/_chunks/{iconify-B2ZQHsNr.js.map → iconify-DlYsYC8z.js.map} +1 -1
  70. package/dist/_chunks/{index.es-CusxIi0s.js → index.es-9_Td6lnP.js} +2306 -2306
  71. package/dist/_chunks/{index.es-CusxIi0s.js.map → index.es-9_Td6lnP.js.map} +1 -1
  72. package/dist/_chunks/index.es-BC4SxvmK.js +994 -0
  73. package/dist/_chunks/index.es-BC4SxvmK.js.map +1 -0
  74. package/dist/_chunks/{src-RaVs-PqK.js → src-L9Jq1dyr.js} +11 -11
  75. package/dist/_chunks/{src-RaVs-PqK.js.map → src-L9Jq1dyr.js.map} +1 -1
  76. package/dist/_chunks/{useLightbox-C7JFztx4.js → useLightbox-kKLPhYUx.js} +9 -7
  77. package/dist/_chunks/{useLightbox-C7JFztx4.js.map → useLightbox-kKLPhYUx.js.map} +1 -1
  78. package/dist/_chunks/{vue-i18n-fHp3k8qw.js → vue-i18n-BjaFxqmH.js} +40 -40
  79. package/dist/_chunks/{vue-i18n-fHp3k8qw.js.map → vue-i18n-BjaFxqmH.js.map} +1 -1
  80. package/dist/_chunks/{vue.runtime.esm-bundler-7_kt7y9A.js → vue.runtime.esm-bundler-B-iHWsf4.js} +702 -702
  81. package/dist/_chunks/{vue.runtime.esm-bundler-7_kt7y9A.js.map → vue.runtime.esm-bundler-B-iHWsf4.js.map} +1 -1
  82. package/dist/ai-elements.es.js +4016 -10669
  83. package/dist/ai-elements.es.js.map +1 -1
  84. package/dist-vue/PkChatbot.js +1 -1
  85. package/dist-vue/PkChatbotFeedbackForm.js +1 -1
  86. package/dist-vue/PkChatbotFilePreview.js +1 -1
  87. package/dist-vue/PkChatbotInput.js +1 -1
  88. package/dist-vue/PkChatbotMessages.js +1 -1
  89. package/dist-vue/PkChatbotViewChat.js +1 -1
  90. package/dist-vue/PkChatbotViewConversations.js +1 -1
  91. package/dist-vue/PkChatbotViewProfile.js +1 -1
  92. package/dist-vue/_chunks/Media-D5pFbMNh.js +120 -0
  93. package/dist-vue/_chunks/Media-D5pFbMNh.js.map +1 -0
  94. package/dist-vue/_chunks/PkChatbot-UDExD81D.js +190 -0
  95. package/dist-vue/_chunks/PkChatbot-UDExD81D.js.map +1 -0
  96. package/dist-vue/_chunks/{PkChatbotFeedbackForm-BiVUo4kv.js → PkChatbotFeedbackForm-Dy2ojy2E.js} +1 -1
  97. package/dist-vue/_chunks/{PkChatbotFeedbackForm-BiVUo4kv.js.map → PkChatbotFeedbackForm-Dy2ojy2E.js.map} +1 -1
  98. package/dist-vue/_chunks/{PkChatbotFilePreview-0N9ASbIp.js → PkChatbotFilePreview-7hRouK9o.js} +5 -3
  99. package/dist-vue/_chunks/PkChatbotFilePreview-7hRouK9o.js.map +1 -0
  100. package/dist-vue/_chunks/{PkChatbotInput-CsazCkTA.js → PkChatbotInput-Dn4KFNfx.js} +3 -3
  101. package/dist-vue/_chunks/{PkChatbotInput-CsazCkTA.js.map → PkChatbotInput-Dn4KFNfx.js.map} +1 -1
  102. package/dist-vue/_chunks/{PkChatbotMessages-BDziUgck.js → PkChatbotMessages-DUOrit9Y.js} +47 -33
  103. package/dist-vue/_chunks/PkChatbotMessages-DUOrit9Y.js.map +1 -0
  104. package/dist-vue/_chunks/PkChatbotViewChat-BgH9Op_G.js +225 -0
  105. package/dist-vue/_chunks/PkChatbotViewChat-BgH9Op_G.js.map +1 -0
  106. package/dist-vue/_chunks/{PkChatbotViewConversations-kIc1reZT.js → PkChatbotViewConversations-B9KC-0ir.js} +13 -13
  107. package/dist-vue/_chunks/{PkChatbotViewConversations-kIc1reZT.js.map → PkChatbotViewConversations-B9KC-0ir.js.map} +1 -1
  108. package/dist-vue/_chunks/{PkChatbotViewProfile-pSKOgtIR.js → PkChatbotViewProfile-C0q898hz.js} +2 -2
  109. package/dist-vue/_chunks/{PkChatbotViewProfile-pSKOgtIR.js.map → PkChatbotViewProfile-C0q898hz.js.map} +1 -1
  110. package/dist-vue/_chunks/{PkStreamingMarkdown-BUiAi-qv.js → PkStreamingMarkdown-BDtjktHX.js} +296 -284
  111. package/dist-vue/_chunks/PkStreamingMarkdown-BDtjktHX.js.map +1 -0
  112. package/dist-vue/_chunks/PkSvgViewer-DoClMDnF.js +125 -0
  113. package/dist-vue/_chunks/PkSvgViewer-DoClMDnF.js.map +1 -0
  114. package/dist-vue/_chunks/PkToolRequestConfirm-BcZ10rMb.js +48 -0
  115. package/dist-vue/_chunks/{PkToolRequestConfirm-BsHpoI-c.js.map → PkToolRequestConfirm-BcZ10rMb.js.map} +1 -1
  116. package/dist-vue/_chunks/PkToolRequestGeolocation-DXSqWFTR.js +67 -0
  117. package/dist-vue/_chunks/PkToolRequestGeolocation-DXSqWFTR.js.map +1 -0
  118. package/dist-vue/_chunks/PkToolRequestOAuthConnection-CIrFBhxL.js +63 -0
  119. package/dist-vue/_chunks/{PkToolRequestOAuthConnection-shcJXxtk.js.map → PkToolRequestOAuthConnection-CIrFBhxL.js.map} +1 -1
  120. package/dist-vue/_chunks/{PkToolShowArtifact-D4BVWuMi.js → PkToolShowArtifact-BVFPfZT8.js} +3 -3
  121. package/dist-vue/_chunks/{PkToolShowArtifact-D4BVWuMi.js.map → PkToolShowArtifact-BVFPfZT8.js.map} +1 -1
  122. package/dist-vue/_chunks/{PkToolShowCalendarEvent-Q_2-tXmC.js → PkToolShowCalendarEvent-9jaBqWBJ.js} +3 -3
  123. package/dist-vue/_chunks/{PkToolShowCalendarEvent-Q_2-tXmC.js.map → PkToolShowCalendarEvent-9jaBqWBJ.js.map} +1 -1
  124. package/dist-vue/_chunks/{PkToolShowComparison-BpYZb-z5.js → PkToolShowComparison-D1YHzvyy.js} +2 -2
  125. package/dist-vue/_chunks/{PkToolShowComparison-BpYZb-z5.js.map → PkToolShowComparison-D1YHzvyy.js.map} +1 -1
  126. package/dist-vue/_chunks/{PkToolShowContactForm-DuOeYoCU.js → PkToolShowContactForm-BVtuQVGs.js} +5 -5
  127. package/dist-vue/_chunks/{PkToolShowContactForm-DuOeYoCU.js.map → PkToolShowContactForm-BVtuQVGs.js.map} +1 -1
  128. package/dist-vue/_chunks/PkToolShowDiagram-CLyYku9I.js +112 -0
  129. package/dist-vue/_chunks/PkToolShowDiagram-CLyYku9I.js.map +1 -0
  130. package/dist-vue/_chunks/{PkToolShowEmail-CDR-Cw-s.js → PkToolShowEmail-BZzv2-6y.js} +2 -2
  131. package/dist-vue/_chunks/{PkToolShowEmail-CDR-Cw-s.js.map → PkToolShowEmail-BZzv2-6y.js.map} +1 -1
  132. package/dist-vue/_chunks/{PkToolShowImageGallery-DhGmTPMP.js → PkToolShowImageGallery-Bt7QNtGe.js} +4 -4
  133. package/dist-vue/_chunks/{PkToolShowImageGallery-DhGmTPMP.js.map → PkToolShowImageGallery-Bt7QNtGe.js.map} +1 -1
  134. package/dist-vue/_chunks/PkToolShowLocation-DAg9HeYq.js +143 -0
  135. package/dist-vue/_chunks/PkToolShowLocation-DAg9HeYq.js.map +1 -0
  136. package/dist-vue/_chunks/{PkToolShowMessage-Cqb0WP-x.js → PkToolShowMessage-DvnO4DDb.js} +2 -2
  137. package/dist-vue/_chunks/{PkToolShowMessage-Cqb0WP-x.js.map → PkToolShowMessage-DvnO4DDb.js.map} +1 -1
  138. package/dist-vue/_chunks/{PkToolShowMultipleChoice-x7hNm6I2.js → PkToolShowMultipleChoice-BEWDze3p.js} +2 -2
  139. package/dist-vue/_chunks/{PkToolShowMultipleChoice-x7hNm6I2.js.map → PkToolShowMultipleChoice-BEWDze3p.js.map} +1 -1
  140. package/dist-vue/_chunks/{PkToolShowProductList-CMFBvHAY.js → PkToolShowProductList-Cyh_fdTh.js} +3 -3
  141. package/dist-vue/_chunks/{PkToolShowProductList-CMFBvHAY.js.map → PkToolShowProductList-Cyh_fdTh.js.map} +1 -1
  142. package/dist-vue/_chunks/{PkToolShowQrCode-LFCfdWyu.js → PkToolShowQrCode-Dz3HlJGs.js} +2 -2
  143. package/dist-vue/_chunks/{PkToolShowQrCode-LFCfdWyu.js.map → PkToolShowQrCode-Dz3HlJGs.js.map} +1 -1
  144. package/dist-vue/_chunks/{PkToolShowSources-D0wbYpTR.js → PkToolShowSources-cFvwqgDz.js} +21 -21
  145. package/dist-vue/_chunks/{PkToolShowSources-D0wbYpTR.js.map → PkToolShowSources-cFvwqgDz.js.map} +1 -1
  146. package/dist-vue/_chunks/{PkToolShowSuggestedReply-CIP1xfB1.js → PkToolShowSuggestedReply-DIrmkOUq.js} +2 -2
  147. package/dist-vue/_chunks/{PkToolShowSuggestedReply-CIP1xfB1.js.map → PkToolShowSuggestedReply-DIrmkOUq.js.map} +1 -1
  148. package/dist-vue/_chunks/{PkToolShowWeather-zT-4E-aX.js → PkToolShowWeather-CKFmoP6M.js} +1 -1
  149. package/dist-vue/_chunks/{PkToolShowWeather-zT-4E-aX.js.map → PkToolShowWeather-CKFmoP6M.js.map} +1 -1
  150. package/dist-vue/_chunks/{PkToolShowWebPages-DLc-5nE0.js → PkToolShowWebPages-DDsErkru.js} +4 -4
  151. package/dist-vue/_chunks/{PkToolShowWebPages-DLc-5nE0.js.map → PkToolShowWebPages-DDsErkru.js.map} +1 -1
  152. package/dist-vue/_chunks/{PkUrl-Da1k1VEM.js → PkUrl-DdRprvPJ.js} +1 -1
  153. package/dist-vue/_chunks/{PkUrl-Da1k1VEM.js.map → PkUrl-DdRprvPJ.js.map} +1 -1
  154. package/dist-vue/_chunks/{apl-gZJv8aE0.js → apl-CiKuf38q.js} +1 -1
  155. package/dist-vue/_chunks/{apl-gZJv8aE0.js.map → apl-CiKuf38q.js.map} +1 -1
  156. package/dist-vue/_chunks/{asciiarmor-BKzT2CxY.js → asciiarmor-Cv_figT_.js} +1 -1
  157. package/dist-vue/_chunks/{asciiarmor-BKzT2CxY.js.map → asciiarmor-Cv_figT_.js.map} +1 -1
  158. package/dist-vue/_chunks/{asn1-CUOx9oeT.js → asn1-o22T4Rhb.js} +1 -1
  159. package/dist-vue/_chunks/{asn1-CUOx9oeT.js.map → asn1-o22T4Rhb.js.map} +1 -1
  160. package/dist-vue/_chunks/{asterisk-CtQouKe4.js → asterisk-BVQJUqvD.js} +1 -1
  161. package/dist-vue/_chunks/{asterisk-CtQouKe4.js.map → asterisk-BVQJUqvD.js.map} +1 -1
  162. package/dist-vue/_chunks/{brainfuck-C6v-NuzS.js → brainfuck-BUjoLd18.js} +1 -1
  163. package/dist-vue/_chunks/{brainfuck-C6v-NuzS.js.map → brainfuck-BUjoLd18.js.map} +1 -1
  164. package/dist-vue/_chunks/{clike-DBPD1mz3.js → clike-DnfYdh2t.js} +1 -1
  165. package/dist-vue/_chunks/{clike-DBPD1mz3.js.map → clike-DnfYdh2t.js.map} +1 -1
  166. package/dist-vue/_chunks/{clojure-xtczAEDV.js → clojure-Spy-VDMe.js} +1 -1
  167. package/dist-vue/_chunks/{clojure-xtczAEDV.js.map → clojure-Spy-VDMe.js.map} +1 -1
  168. package/dist-vue/_chunks/{cmake-DdDZ3JWF.js → cmake-Ctp7rWzy.js} +1 -1
  169. package/dist-vue/_chunks/{cmake-DdDZ3JWF.js.map → cmake-Ctp7rWzy.js.map} +1 -1
  170. package/dist-vue/_chunks/{cobol-BAMxIfCa.js → cobol-DX59jXra.js} +1 -1
  171. package/dist-vue/_chunks/{cobol-BAMxIfCa.js.map → cobol-DX59jXra.js.map} +1 -1
  172. package/dist-vue/_chunks/{coffeescript-CGTuQQp6.js → coffeescript-Bq4R3kBT.js} +1 -1
  173. package/dist-vue/_chunks/{coffeescript-CGTuQQp6.js.map → coffeescript-Bq4R3kBT.js.map} +1 -1
  174. package/dist-vue/_chunks/{commonlisp-Ccb03OgK.js → commonlisp-qnCvPlJb.js} +1 -1
  175. package/dist-vue/_chunks/{commonlisp-Ccb03OgK.js.map → commonlisp-qnCvPlJb.js.map} +1 -1
  176. package/dist-vue/_chunks/{createChatbotApiClient-C_E35aQf.js → createChatbotApiClient-C-jT5hE0.js} +96 -95
  177. package/dist-vue/_chunks/createChatbotApiClient-C-jT5hE0.js.map +1 -0
  178. package/dist-vue/_chunks/{crystal-DdoSQSAv.js → crystal-B02ya4cQ.js} +1 -1
  179. package/dist-vue/_chunks/{crystal-DdoSQSAv.js.map → crystal-B02ya4cQ.js.map} +1 -1
  180. package/dist-vue/_chunks/{css-TU14Ca1R.js → css-CzWlO-Xb.js} +1 -1
  181. package/dist-vue/_chunks/{css-TU14Ca1R.js.map → css-CzWlO-Xb.js.map} +1 -1
  182. package/dist-vue/_chunks/{cypher-CXLa4pI5.js → cypher-CLyYkG2-.js} +1 -1
  183. package/dist-vue/_chunks/{cypher-CXLa4pI5.js.map → cypher-CLyYkG2-.js.map} +1 -1
  184. package/dist-vue/_chunks/{d-BArAGMlp.js → d-DGUXRLLi.js} +1 -1
  185. package/dist-vue/_chunks/{d-BArAGMlp.js.map → d-DGUXRLLi.js.map} +1 -1
  186. package/dist-vue/_chunks/{diff-C3LIbTwG.js → diff-DRe8JdWk.js} +1 -1
  187. package/dist-vue/_chunks/{diff-C3LIbTwG.js.map → diff-DRe8JdWk.js.map} +1 -1
  188. package/dist-vue/_chunks/{dist-CUYb2Ykk.js → dist-7BKkikZw.js} +2 -2
  189. package/dist-vue/_chunks/{dist-CUYb2Ykk.js.map → dist-7BKkikZw.js.map} +1 -1
  190. package/dist-vue/_chunks/{dist-DlMrwhCk.js → dist-7u7jBD-H.js} +1 -1
  191. package/dist-vue/_chunks/{dist-DlMrwhCk.js.map → dist-7u7jBD-H.js.map} +1 -1
  192. package/dist-vue/_chunks/{dist-Bj32YA2b.js → dist-8BVnK6QW.js} +4 -4
  193. package/dist-vue/_chunks/{dist-Bj32YA2b.js.map → dist-8BVnK6QW.js.map} +1 -1
  194. package/dist-vue/_chunks/{dist-BtzPY8uU.js → dist-9IwNDEHQ.js} +2 -2
  195. package/dist-vue/_chunks/{dist-BtzPY8uU.js.map → dist-9IwNDEHQ.js.map} +1 -1
  196. package/dist-vue/_chunks/{dist-BMTTRExI.js → dist-BGTESNxJ.js} +1 -1
  197. package/dist-vue/_chunks/{dist-BMTTRExI.js.map → dist-BGTESNxJ.js.map} +1 -1
  198. package/dist-vue/_chunks/{dist-BUm8Nt7d.js → dist-BWdaSTBW.js} +2 -2
  199. package/dist-vue/_chunks/{dist-BUm8Nt7d.js.map → dist-BWdaSTBW.js.map} +1 -1
  200. package/dist-vue/_chunks/{dist-tDt7-5Hh.js → dist-BtFxPYCM.js} +1 -1
  201. package/dist-vue/_chunks/{dist-tDt7-5Hh.js.map → dist-BtFxPYCM.js.map} +1 -1
  202. package/dist-vue/_chunks/{dist-BM3i3wHC.js → dist-BwrhMmQA.js} +1 -1
  203. package/dist-vue/_chunks/{dist-BM3i3wHC.js.map → dist-BwrhMmQA.js.map} +1 -1
  204. package/dist-vue/_chunks/{dist-B_3TGJwf.js → dist-Cm-J5l4S2.js} +1 -1
  205. package/dist-vue/_chunks/dist-Cm-J5l4S2.js.map +1 -0
  206. package/dist-vue/_chunks/{dist-CUah0Xys.js → dist-CnmeOb2N.js} +3 -3
  207. package/dist-vue/_chunks/{dist-CUah0Xys.js.map → dist-CnmeOb2N.js.map} +1 -1
  208. package/dist-vue/_chunks/{dist-DI-XHVdE.js → dist-D34LRAfv.js} +2 -2
  209. package/dist-vue/_chunks/{dist-DI-XHVdE.js.map → dist-D34LRAfv.js.map} +1 -1
  210. package/dist-vue/_chunks/{dist-DACzskoy2.js → dist-D35h9xud2.js} +3 -3
  211. package/dist-vue/_chunks/{dist-DACzskoy2.js.map → dist-D35h9xud2.js.map} +1 -1
  212. package/dist-vue/_chunks/dist-DMKuVADK2.js +441 -0
  213. package/dist-vue/_chunks/dist-DMKuVADK2.js.map +1 -0
  214. package/dist-vue/_chunks/{dist-CwWFe7zF.js → dist-Dg1nGvwP.js} +1 -1
  215. package/dist-vue/_chunks/{dist-CwWFe7zF.js.map → dist-Dg1nGvwP.js.map} +1 -1
  216. package/dist-vue/_chunks/{dist-B2nNrire.js → dist-YcwJuFBx.js} +2 -2
  217. package/dist-vue/_chunks/{dist-B2nNrire.js.map → dist-YcwJuFBx.js.map} +1 -1
  218. package/dist-vue/_chunks/{dist-2JsKACZj.js → dist-b5CbbjSp.js} +1 -1
  219. package/dist-vue/_chunks/{dist-2JsKACZj.js.map → dist-b5CbbjSp.js.map} +1 -1
  220. package/dist-vue/_chunks/{dist-Cr5fwgdD.js → dist-kywGQjza.js} +2 -2
  221. package/dist-vue/_chunks/{dist-Cr5fwgdD.js.map → dist-kywGQjza.js.map} +1 -1
  222. package/dist-vue/_chunks/{dist-Df_bnb-v.js → dist-l6sREGf7.js} +1 -1
  223. package/dist-vue/_chunks/{dist-Df_bnb-v.js.map → dist-l6sREGf7.js.map} +1 -1
  224. package/dist-vue/_chunks/{dist-B1Xwe66S.js → dist-x5C6fPIQ.js} +2 -2
  225. package/dist-vue/_chunks/{dist-B1Xwe66S.js.map → dist-x5C6fPIQ.js.map} +1 -1
  226. package/dist-vue/_chunks/{dist-BgntOJ9J.js → dist-x73cXb-w.js} +3 -3
  227. package/dist-vue/_chunks/{dist-BgntOJ9J.js.map → dist-x73cXb-w.js.map} +1 -1
  228. package/dist-vue/_chunks/{dockerfile-DzujQve1.js → dockerfile-BpKVodrd.js} +2 -2
  229. package/dist-vue/_chunks/{dockerfile-DzujQve1.js.map → dockerfile-BpKVodrd.js.map} +1 -1
  230. package/dist-vue/_chunks/{dtd-B1f0YqWO.js → dtd-q9vHTxZ1.js} +1 -1
  231. package/dist-vue/_chunks/{dtd-B1f0YqWO.js.map → dtd-q9vHTxZ1.js.map} +1 -1
  232. package/dist-vue/_chunks/{dylan-bedk9ukf.js → dylan-CTRyD_yN.js} +1 -1
  233. package/dist-vue/_chunks/{dylan-bedk9ukf.js.map → dylan-CTRyD_yN.js.map} +1 -1
  234. package/dist-vue/_chunks/{ebnf-Cs5X8R8U.js → ebnf-DPw9AGDC.js} +1 -1
  235. package/dist-vue/_chunks/{ebnf-Cs5X8R8U.js.map → ebnf-DPw9AGDC.js.map} +1 -1
  236. package/dist-vue/_chunks/{ecl-CXPqOJjc.js → ecl-CuLlc0XE.js} +1 -1
  237. package/dist-vue/_chunks/{ecl-CXPqOJjc.js.map → ecl-CuLlc0XE.js.map} +1 -1
  238. package/dist-vue/_chunks/{eiffel-Oa4yGKHO.js → eiffel-DYyjt7F3.js} +1 -1
  239. package/dist-vue/_chunks/{eiffel-Oa4yGKHO.js.map → eiffel-DYyjt7F3.js.map} +1 -1
  240. package/dist-vue/_chunks/{elm-CEbGa4zC.js → elm-DcYv6ZJY.js} +1 -1
  241. package/dist-vue/_chunks/{elm-CEbGa4zC.js.map → elm-DcYv6ZJY.js.map} +1 -1
  242. package/dist-vue/_chunks/{erlang-BNnTSw8C.js → erlang-nipePvRg.js} +1 -1
  243. package/dist-vue/_chunks/{erlang-BNnTSw8C.js.map → erlang-nipePvRg.js.map} +1 -1
  244. package/dist-vue/_chunks/{factor-BIER3ncI.js → factor-C_jm0Hi8.js} +2 -2
  245. package/dist-vue/_chunks/{factor-BIER3ncI.js.map → factor-C_jm0Hi8.js.map} +1 -1
  246. package/dist-vue/_chunks/{fcl-HxmGK-W5.js → fcl-CqmPhDgo.js} +1 -1
  247. package/dist-vue/_chunks/{fcl-HxmGK-W5.js.map → fcl-CqmPhDgo.js.map} +1 -1
  248. package/dist-vue/_chunks/{forth-BoRU1oYL.js → forth-GAg6IwF6.js} +1 -1
  249. package/dist-vue/_chunks/{forth-BoRU1oYL.js.map → forth-GAg6IwF6.js.map} +1 -1
  250. package/dist-vue/_chunks/{fortran-8E8eLx-x.js → fortran-DyrSTiy7.js} +1 -1
  251. package/dist-vue/_chunks/{fortran-8E8eLx-x.js.map → fortran-DyrSTiy7.js.map} +1 -1
  252. package/dist-vue/_chunks/{gas-DzrG9cIr.js → gas-CBY6LBUu.js} +1 -1
  253. package/dist-vue/_chunks/{gas-DzrG9cIr.js.map → gas-CBY6LBUu.js.map} +1 -1
  254. package/dist-vue/_chunks/{gherkin-d-xjbPN9.js → gherkin-F6vIWaV0.js} +1 -1
  255. package/dist-vue/_chunks/{gherkin-d-xjbPN9.js.map → gherkin-F6vIWaV0.js.map} +1 -1
  256. package/dist-vue/_chunks/{groovy-DluoS5pg.js → groovy-DBvpslJE.js} +1 -1
  257. package/dist-vue/_chunks/{groovy-DluoS5pg.js.map → groovy-DBvpslJE.js.map} +1 -1
  258. package/dist-vue/_chunks/{haskell-DWzSrwGO.js → haskell-CzcXTuY3.js} +1 -1
  259. package/dist-vue/_chunks/{haskell-DWzSrwGO.js.map → haskell-CzcXTuY3.js.map} +1 -1
  260. package/dist-vue/_chunks/{haxe-nucWqdAl.js → haxe-C0K87vd-.js} +1 -1
  261. package/dist-vue/_chunks/{haxe-nucWqdAl.js.map → haxe-C0K87vd-.js.map} +1 -1
  262. package/dist-vue/_chunks/{http-wcQY3fv1.js → http-lhCYiIUK.js} +1 -1
  263. package/dist-vue/_chunks/{http-wcQY3fv1.js.map → http-lhCYiIUK.js.map} +1 -1
  264. package/dist-vue/_chunks/{idl-BZjtu2uP.js → idl-DiwlVJ2e.js} +1 -1
  265. package/dist-vue/_chunks/{idl-BZjtu2uP.js.map → idl-DiwlVJ2e.js.map} +1 -1
  266. package/dist-vue/_chunks/{javascript-D-DeSYfi.js → javascript-DoLQ_01m.js} +1 -1
  267. package/dist-vue/_chunks/{javascript-D-DeSYfi.js.map → javascript-DoLQ_01m.js.map} +1 -1
  268. package/dist-vue/_chunks/{julia-BdkHYLKN.js → julia-D-9kev9I.js} +1 -1
  269. package/dist-vue/_chunks/{julia-BdkHYLKN.js.map → julia-D-9kev9I.js.map} +1 -1
  270. package/dist-vue/_chunks/{livescript-B-rE2yGH.js → livescript-BXKPrYL1.js} +1 -1
  271. package/dist-vue/_chunks/{livescript-B-rE2yGH.js.map → livescript-BXKPrYL1.js.map} +1 -1
  272. package/dist-vue/_chunks/{lua-8MR4kmO6.js → lua-CmoiUImJ.js} +1 -1
  273. package/dist-vue/_chunks/{lua-8MR4kmO6.js.map → lua-CmoiUImJ.js.map} +1 -1
  274. package/dist-vue/_chunks/{mathematica-DsQZ56s1.js → mathematica-C0zVH3hb.js} +1 -1
  275. package/dist-vue/_chunks/{mathematica-DsQZ56s1.js.map → mathematica-C0zVH3hb.js.map} +1 -1
  276. package/dist-vue/_chunks/{mbox-BlqAOSZk.js → mbox-BQjArxBt.js} +1 -1
  277. package/dist-vue/_chunks/{mbox-BlqAOSZk.js.map → mbox-BQjArxBt.js.map} +1 -1
  278. package/dist-vue/_chunks/{mirc-CeWiL7Xj.js → mirc-CH7vSjBP.js} +1 -1
  279. package/dist-vue/_chunks/{mirc-CeWiL7Xj.js.map → mirc-CH7vSjBP.js.map} +1 -1
  280. package/dist-vue/_chunks/{mllike-B4w9rV72.js → mllike-BtNDtwtH.js} +1 -1
  281. package/dist-vue/_chunks/{mllike-B4w9rV72.js.map → mllike-BtNDtwtH.js.map} +1 -1
  282. package/dist-vue/_chunks/{modelica-BeZSjbWb.js → modelica-D0D4gw71.js} +1 -1
  283. package/dist-vue/_chunks/{modelica-BeZSjbWb.js.map → modelica-D0D4gw71.js.map} +1 -1
  284. package/dist-vue/_chunks/{mscgen-Diy4rp5E.js → mscgen-BREuUTcQ.js} +1 -1
  285. package/dist-vue/_chunks/{mscgen-Diy4rp5E.js.map → mscgen-BREuUTcQ.js.map} +1 -1
  286. package/dist-vue/_chunks/{mumps-DHp_hepw.js → mumps-Cj1f6cBa.js} +1 -1
  287. package/dist-vue/_chunks/{mumps-DHp_hepw.js.map → mumps-Cj1f6cBa.js.map} +1 -1
  288. package/dist-vue/_chunks/{nginx-ZUseZ3KV.js → nginx-CTa-DOcs.js} +1 -1
  289. package/dist-vue/_chunks/{nginx-ZUseZ3KV.js.map → nginx-CTa-DOcs.js.map} +1 -1
  290. package/dist-vue/_chunks/{nsis-g-2nkKRi.js → nsis-BWAOyRUP.js} +2 -2
  291. package/dist-vue/_chunks/{nsis-g-2nkKRi.js.map → nsis-BWAOyRUP.js.map} +1 -1
  292. package/dist-vue/_chunks/{ntriples-COZl-CW9.js → ntriples-zIN_qrIe.js} +1 -1
  293. package/dist-vue/_chunks/{ntriples-COZl-CW9.js.map → ntriples-zIN_qrIe.js.map} +1 -1
  294. package/dist-vue/_chunks/{octave-qefefCKI.js → octave-DIV6S7Pt.js} +1 -1
  295. package/dist-vue/_chunks/{octave-qefefCKI.js.map → octave-DIV6S7Pt.js.map} +1 -1
  296. package/dist-vue/_chunks/{oz-B7xBKeTb.js → oz-5rNpxapS.js} +1 -1
  297. package/dist-vue/_chunks/{oz-B7xBKeTb.js.map → oz-5rNpxapS.js.map} +1 -1
  298. package/dist-vue/_chunks/{pascal-B0deIU4R.js → pascal-7C5712Nh.js} +1 -1
  299. package/dist-vue/_chunks/{pascal-B0deIU4R.js.map → pascal-7C5712Nh.js.map} +1 -1
  300. package/dist-vue/_chunks/{perl-CrEeHa0-.js → perl-eAVlqDxG.js} +1 -1
  301. package/dist-vue/_chunks/{perl-CrEeHa0-.js.map → perl-eAVlqDxG.js.map} +1 -1
  302. package/dist-vue/_chunks/{pig-CQcAmjLr.js → pig-C6AL_r8r.js} +1 -1
  303. package/dist-vue/_chunks/{pig-CQcAmjLr.js.map → pig-C6AL_r8r.js.map} +1 -1
  304. package/dist-vue/_chunks/{powershell-CEOsLn17.js → powershell-DsA9A7ee.js} +1 -1
  305. package/dist-vue/_chunks/{powershell-CEOsLn17.js.map → powershell-DsA9A7ee.js.map} +1 -1
  306. package/dist-vue/_chunks/{properties-CIZ3QFxD.js → properties-DuF6jBwF.js} +1 -1
  307. package/dist-vue/_chunks/{properties-CIZ3QFxD.js.map → properties-DuF6jBwF.js.map} +1 -1
  308. package/dist-vue/_chunks/{protobuf-B9FrV1JK.js → protobuf-nlPU8ZM-.js} +1 -1
  309. package/dist-vue/_chunks/{protobuf-B9FrV1JK.js.map → protobuf-nlPU8ZM-.js.map} +1 -1
  310. package/dist-vue/_chunks/{pug-Dn8VvwH3.js → pug-C1RwTStM.js} +2 -2
  311. package/dist-vue/_chunks/{pug-Dn8VvwH3.js.map → pug-C1RwTStM.js.map} +1 -1
  312. package/dist-vue/_chunks/{puppet-C6TXtx4p.js → puppet-DFYbyNW2.js} +1 -1
  313. package/dist-vue/_chunks/{puppet-C6TXtx4p.js.map → puppet-DFYbyNW2.js.map} +1 -1
  314. package/dist-vue/_chunks/{python-DcAJJ0JG.js → python-Dv1DGCiz.js} +1 -1
  315. package/dist-vue/_chunks/{python-DcAJJ0JG.js.map → python-Dv1DGCiz.js.map} +1 -1
  316. package/dist-vue/_chunks/{q-WbmgnnmF.js → q-X1HLKyVv.js} +1 -1
  317. package/dist-vue/_chunks/{q-WbmgnnmF.js.map → q-X1HLKyVv.js.map} +1 -1
  318. package/dist-vue/_chunks/{r-C22XZ_AN.js → r-BZGUCY-c.js} +1 -1
  319. package/dist-vue/_chunks/{r-C22XZ_AN.js.map → r-BZGUCY-c.js.map} +1 -1
  320. package/dist-vue/_chunks/{rpm-B9APie5d.js → rpm-CDLCwfOD.js} +1 -1
  321. package/dist-vue/_chunks/{rpm-B9APie5d.js.map → rpm-CDLCwfOD.js.map} +1 -1
  322. package/dist-vue/_chunks/{ruby-D24Ax8EE.js → ruby-cVyKV-zg.js} +1 -1
  323. package/dist-vue/_chunks/{ruby-D24Ax8EE.js.map → ruby-cVyKV-zg.js.map} +1 -1
  324. package/dist-vue/_chunks/{sas-D4-twsz3.js → sas-BDPIwc3L.js} +1 -1
  325. package/dist-vue/_chunks/{sas-D4-twsz3.js.map → sas-BDPIwc3L.js.map} +1 -1
  326. package/dist-vue/_chunks/{scheme-CCmbAfjG.js → scheme-6m6S6r1m.js} +1 -1
  327. package/dist-vue/_chunks/{scheme-CCmbAfjG.js.map → scheme-6m6S6r1m.js.map} +1 -1
  328. package/dist-vue/_chunks/{shell-oVzTSWfo.js → shell-Dcuubvcg.js} +1 -1
  329. package/dist-vue/_chunks/{shell-oVzTSWfo.js.map → shell-Dcuubvcg.js.map} +1 -1
  330. package/dist-vue/_chunks/{sieve-DUlxvKqS.js → sieve-C0Ec4mOZ.js} +1 -1
  331. package/dist-vue/_chunks/{sieve-DUlxvKqS.js.map → sieve-C0Ec4mOZ.js.map} +1 -1
  332. package/dist-vue/_chunks/{simple-mode-B6svE9zR.js → simple-mode-CaO_UoX6.js} +1 -1
  333. package/dist-vue/_chunks/{simple-mode-B6svE9zR.js.map → simple-mode-CaO_UoX6.js.map} +1 -1
  334. package/dist-vue/_chunks/{smalltalk-9-Xd93Rn.js → smalltalk-C8mY0f87.js} +1 -1
  335. package/dist-vue/_chunks/{smalltalk-9-Xd93Rn.js.map → smalltalk-C8mY0f87.js.map} +1 -1
  336. package/dist-vue/_chunks/{solr-DzeE5sFM.js → solr-jbM7m8s0.js} +1 -1
  337. package/dist-vue/_chunks/{solr-DzeE5sFM.js.map → solr-jbM7m8s0.js.map} +1 -1
  338. package/dist-vue/_chunks/{sparql-GFDxBmFa.js → sparql-DJZXdQFZ.js} +1 -1
  339. package/dist-vue/_chunks/{sparql-GFDxBmFa.js.map → sparql-DJZXdQFZ.js.map} +1 -1
  340. package/dist-vue/_chunks/{spreadsheet-BD6sBFg8.js → spreadsheet-iKWvNdRt.js} +1 -1
  341. package/dist-vue/_chunks/{spreadsheet-BD6sBFg8.js.map → spreadsheet-iKWvNdRt.js.map} +1 -1
  342. package/dist-vue/_chunks/{sql-JuMmsoSB.js → sql-BQ2tj9MP.js} +1 -1
  343. package/dist-vue/_chunks/{sql-JuMmsoSB.js.map → sql-BQ2tj9MP.js.map} +1 -1
  344. package/dist-vue/_chunks/{src-EtGd6cRz.js → src-DW4YojFN.js} +10 -10
  345. package/dist-vue/_chunks/{src-EtGd6cRz.js.map → src-DW4YojFN.js.map} +1 -1
  346. package/dist-vue/_chunks/{stex-Cy057UFl.js → stex-BEcrdSPS.js} +1 -1
  347. package/dist-vue/_chunks/{stex-Cy057UFl.js.map → stex-BEcrdSPS.js.map} +1 -1
  348. package/dist-vue/_chunks/{stylus-0KIe3uMX.js → stylus-b5gEI930.js} +1 -1
  349. package/dist-vue/_chunks/{stylus-0KIe3uMX.js.map → stylus-b5gEI930.js.map} +1 -1
  350. package/dist-vue/_chunks/{swift-tYMDqvYT.js → swift-RNJNWQs6.js} +1 -1
  351. package/dist-vue/_chunks/{swift-tYMDqvYT.js.map → swift-RNJNWQs6.js.map} +1 -1
  352. package/dist-vue/_chunks/{tcl-CSbjfJ81.js → tcl-BbY3AuDS.js} +1 -1
  353. package/dist-vue/_chunks/{tcl-CSbjfJ81.js.map → tcl-BbY3AuDS.js.map} +1 -1
  354. package/dist-vue/_chunks/{textile-Qe0pFxF7.js → textile-BM2q07iw.js} +1 -1
  355. package/dist-vue/_chunks/{textile-Qe0pFxF7.js.map → textile-BM2q07iw.js.map} +1 -1
  356. package/dist-vue/_chunks/{tiddlywiki-CYhUSC90.js → tiddlywiki-Bu7ffwvE.js} +1 -1
  357. package/dist-vue/_chunks/{tiddlywiki-CYhUSC90.js.map → tiddlywiki-Bu7ffwvE.js.map} +1 -1
  358. package/dist-vue/_chunks/{tiki-jtNVir5w.js → tiki-BSMiLiXp.js} +1 -1
  359. package/dist-vue/_chunks/{tiki-jtNVir5w.js.map → tiki-BSMiLiXp.js.map} +1 -1
  360. package/dist-vue/_chunks/{toml-C3FMZ9FE.js → toml-D3U9uI6V.js} +1 -1
  361. package/dist-vue/_chunks/{toml-C3FMZ9FE.js.map → toml-D3U9uI6V.js.map} +1 -1
  362. package/dist-vue/_chunks/{troff-FdVM_sPB.js → troff-DK_RaQh-.js} +1 -1
  363. package/dist-vue/_chunks/{troff-FdVM_sPB.js.map → troff-DK_RaQh-.js.map} +1 -1
  364. package/dist-vue/_chunks/{ttcn-Tmx7e7xS.js → ttcn-DVxr7ZdN.js} +1 -1
  365. package/dist-vue/_chunks/{ttcn-Tmx7e7xS.js.map → ttcn-DVxr7ZdN.js.map} +1 -1
  366. package/dist-vue/_chunks/{ttcn-cfg-BP7MXn1J.js → ttcn-cfg-CJG9xdrY.js} +1 -1
  367. package/dist-vue/_chunks/{ttcn-cfg-BP7MXn1J.js.map → ttcn-cfg-CJG9xdrY.js.map} +1 -1
  368. package/dist-vue/_chunks/{turtle-BtDXIrpF.js → turtle-Cj5kMy4D.js} +1 -1
  369. package/dist-vue/_chunks/{turtle-BtDXIrpF.js.map → turtle-Cj5kMy4D.js.map} +1 -1
  370. package/dist-vue/_chunks/{useChatbotStore-BXi-Gx7b.js → useChatbotStore-DCCWlutT.js} +1244 -1217
  371. package/dist-vue/_chunks/useChatbotStore-DCCWlutT.js.map +1 -0
  372. package/dist-vue/_chunks/{useSafeLocalStorage-BL5mqfb7.js → useSafeLocalStorage-DmA2eEi6.js} +2 -2
  373. package/dist-vue/_chunks/{useSafeLocalStorage-BL5mqfb7.js.map → useSafeLocalStorage-DmA2eEi6.js.map} +1 -1
  374. package/dist-vue/_chunks/{utils-CRojvghU.js → utils-UX35fb5C.js} +13 -13
  375. package/dist-vue/_chunks/{utils-CRojvghU.js.map → utils-UX35fb5C.js.map} +1 -1
  376. package/dist-vue/_chunks/{vb-DZ7E2F9i.js → vb-RlGsZALV.js} +1 -1
  377. package/dist-vue/_chunks/{vb-DZ7E2F9i.js.map → vb-RlGsZALV.js.map} +1 -1
  378. package/dist-vue/_chunks/{vbscript-DmYal433.js → vbscript-C6LN5bsX.js} +1 -1
  379. package/dist-vue/_chunks/{vbscript-DmYal433.js.map → vbscript-C6LN5bsX.js.map} +1 -1
  380. package/dist-vue/_chunks/{velocity-Dwi9C1bZ.js → velocity-7A5nvZTA.js} +1 -1
  381. package/dist-vue/_chunks/{velocity-Dwi9C1bZ.js.map → velocity-7A5nvZTA.js.map} +1 -1
  382. package/dist-vue/_chunks/{verilog-6XMMKLGD.js → verilog-CoPTkjsM.js} +1 -1
  383. package/dist-vue/_chunks/{verilog-6XMMKLGD.js.map → verilog-CoPTkjsM.js.map} +1 -1
  384. package/dist-vue/_chunks/{vhdl-BczymJF3.js → vhdl-BRtaeCKx.js} +1 -1
  385. package/dist-vue/_chunks/{vhdl-BczymJF3.js.map → vhdl-BRtaeCKx.js.map} +1 -1
  386. package/dist-vue/_chunks/{webidl-CaC70GJ2.js → webidl-BVwPXw7k.js} +1 -1
  387. package/dist-vue/_chunks/{webidl-CaC70GJ2.js.map → webidl-BVwPXw7k.js.map} +1 -1
  388. package/dist-vue/_chunks/{xquery-JS07XjNe.js → xquery-CXV9KVdL.js} +1 -1
  389. package/dist-vue/_chunks/{xquery-JS07XjNe.js.map → xquery-CXV9KVdL.js.map} +1 -1
  390. package/dist-vue/_chunks/{yacas-BXZNhOsZ.js → yacas-5ByKKRqf.js} +1 -1
  391. package/dist-vue/_chunks/{yacas-BXZNhOsZ.js.map → yacas-5ByKKRqf.js.map} +1 -1
  392. package/dist-vue/_chunks/{z80-Dtc8Q5vA.js → z80-wbH4fW7-.js} +1 -1
  393. package/dist-vue/_chunks/{z80-Dtc8Q5vA.js.map → z80-wbH4fW7-.js.map} +1 -1
  394. package/dist-vue/api.js +1 -1
  395. package/dist-vue/apps/web-component/src/components/EmbeddedChatWidget.ce.d.ts +8 -5
  396. package/dist-vue/apps/web-component/src/components/FloatingChatWidget.ce.d.ts +8 -1
  397. package/dist-vue/apps/web-component/src/composables/useChatbotAuth.d.ts +4 -0
  398. package/dist-vue/apps/web-component/src/lib.d.ts +34 -0
  399. package/dist-vue/apps/web-component/src/utils/emitWidgetEvent.d.ts +10 -0
  400. package/dist-vue/composables.js +4 -4
  401. package/dist-vue/index.js +8628 -4422
  402. package/dist-vue/index.js.map +1 -1
  403. package/dist-vue/locales.js +106 -62
  404. package/dist-vue/packages/auth/src/index.d.ts +12 -12
  405. package/dist-vue/packages/components/src/PkEditorJsonSchema.d.ts +36 -0
  406. package/dist-vue/packages/components/src/PkSchemaField.d.ts +17 -0
  407. package/dist-vue/packages/components/src/PkSvgViewer.d.ts +8 -0
  408. package/dist-vue/packages/components/src/chat/PkAgentSettingsPanel.d.ts +5 -2
  409. package/dist-vue/packages/components/src/chat/PkChatbot.d.ts +2 -0
  410. package/dist-vue/packages/components/src/chat/PkChatbotMessages.d.ts +1 -0
  411. package/dist-vue/packages/components/src/chat/PkMessageParts.d.ts +6 -6
  412. package/dist-vue/packages/components/src/chat/PkStreamingMarkdown.d.ts +2 -0
  413. package/dist-vue/packages/components/src/chat/PkStreamingMarkdownAutoscroll.d.ts +1 -0
  414. package/dist-vue/packages/components/src/chat/PkToolShowDiagram.d.ts +8 -0
  415. package/dist-vue/packages/components/src/chat/PkToolShowLocation.d.ts +2 -0
  416. package/dist-vue/packages/components/src/chat/constants.d.ts +1 -1
  417. package/dist-vue/packages/components/src/index.d.ts +4 -1
  418. package/dist-vue/packages/composable/src/chatbot/useChatbotStore.d.ts +21 -3
  419. package/dist-vue/packages/composable/src/index.d.ts +1 -0
  420. package/dist-vue/packages/composable/src/useJsonSchemaEditor.d.ts +45 -0
  421. package/dist-vue/packages/models/src/schema/Agent.d.ts +4 -0
  422. package/dist-vue/packages/models/src/schema/Chat.d.ts +3 -0
  423. package/dist-vue/packages/models/src/schema/Notification.d.ts +6 -0
  424. package/dist-vue/packages/models/src/schema/ReasoningChat.d.ts +2 -0
  425. package/dist-vue/packages/models/src/schema/SubAgent.d.ts +2 -0
  426. package/dist-vue/packages/models/src/schema/constants.d.ts +2 -0
  427. package/dist-vue/packages/models/src/utils.d.ts +2 -0
  428. package/dist-vue/style.css +1 -1
  429. package/package.json +7 -7
  430. package/dist/_chunks/PkStreamingMarkdown-SVWv4Oye.js.map +0 -1
  431. package/dist/_chunks/PkToolShowComparison-BzyqEIMV.js +0 -64
  432. package/dist/_chunks/VvCombobox.es-CUUNtqyJ.js +0 -1998
  433. package/dist/_chunks/VvTextarea.es-B5txwRRm.js +0 -1110
  434. package/dist/_chunks/dist-DHG50RNO.js +0 -768
  435. package/dist/_chunks/marker-icon-2x-Df3ovzYv.js +0 -7
  436. package/dist/_chunks/marker-icon-2x-Df3ovzYv.js.map +0 -1
  437. package/dist/_chunks/marker-icon-CCYFvBsS.js +0 -7
  438. package/dist/_chunks/marker-icon-CCYFvBsS.js.map +0 -1
  439. package/dist/_chunks/marker-shadow-CHjnGkIt.js +0 -7
  440. package/dist/_chunks/marker-shadow-CHjnGkIt.js.map +0 -1
  441. package/dist-vue/_chunks/Media-Dq8UU7iQ.js +0 -120
  442. package/dist-vue/_chunks/Media-Dq8UU7iQ.js.map +0 -1
  443. package/dist-vue/_chunks/PkChatbot-CoXx7Rul.js +0 -191
  444. package/dist-vue/_chunks/PkChatbot-CoXx7Rul.js.map +0 -1
  445. package/dist-vue/_chunks/PkChatbotFilePreview-0N9ASbIp.js.map +0 -1
  446. package/dist-vue/_chunks/PkChatbotMessages-BDziUgck.js.map +0 -1
  447. package/dist-vue/_chunks/PkChatbotViewChat-DMnMkELX.js +0 -278
  448. package/dist-vue/_chunks/PkChatbotViewChat-DMnMkELX.js.map +0 -1
  449. package/dist-vue/_chunks/PkStreamingMarkdown-BUiAi-qv.js.map +0 -1
  450. package/dist-vue/_chunks/PkToolRequestConfirm-BsHpoI-c.js +0 -49
  451. package/dist-vue/_chunks/PkToolRequestOAuthConnection-shcJXxtk.js +0 -64
  452. package/dist-vue/_chunks/PkToolShowLocation-DBHdxOFr.js +0 -149
  453. package/dist-vue/_chunks/PkToolShowLocation-DBHdxOFr.js.map +0 -1
  454. package/dist-vue/_chunks/createChatbotApiClient-C_E35aQf.js.map +0 -1
  455. package/dist-vue/_chunks/dist-B_3TGJwf.js.map +0 -1
  456. package/dist-vue/_chunks/dist-sx4PacBp2.js +0 -440
  457. package/dist-vue/_chunks/dist-sx4PacBp2.js.map +0 -1
  458. package/dist-vue/_chunks/useChatbotStore-BXi-Gx7b.js.map +0 -1
  459. /package/dist/_chunks/{_plugin-vue_export-helper-BWIS0o4o.js → _plugin-vue_export-helper-5qR9iAls.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"PkToolRequestConfirm-BsHpoI-c.js","names":[],"sources":["../../../../packages/components/src/chat/PkToolRequestConfirm.vue","../../../../packages/components/src/chat/PkToolRequestConfirm.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useI18n } from 'vue-i18n'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const emit = defineEmits<{\n confirm: [confirmed: boolean]\n }>()\n\n const { t: $t } = useI18n({ useScope: 'global' })\n\n const toolPart = computed(() => {\n return props.part as {\n state?: string\n toolCallId?: string\n input?: {\n message: string\n }\n output?: string\n }\n })\n\n const toolState = computed(() => {\n return toolPart.value?.state || 'unknown'\n })\n\n const isInteractive = computed(() => {\n return toolState.value === 'input-available'\n })\n</script>\n\n<template>\n <div\n v-if=\"toolPart.input?.message\"\n class=\"w-full overflow-hidden bg-surface-1 p-sm rounded-xl\">\n <div class=\"text-12 text-word-3 mb-xs\">\n {{ toolPart.input.message }}\n </div>\n <VvButtonGroup>\n <VvButton\n modifiers=\"primary-small\"\n :class=\"{ pressed: toolPart.output === 'confirmed' }\"\n :disabled=\"!isInteractive\"\n icon=\"ri:check-line\"\n :label=\"$t('action.proceed')\"\n @click.stop=\"emit('confirm', true)\" />\n <VvButton\n modifiers=\"action-quiet-small\"\n :class=\"{ pressed: toolPart.output === 'cancelled' }\"\n :disabled=\"!isInteractive\"\n icon=\"ri:close-line\"\n :label=\"$t('action.cancel')\"\n @click.stop=\"emit('confirm', false)\" />\n </VvButtonGroup>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useI18n } from 'vue-i18n'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const emit = defineEmits<{\n confirm: [confirmed: boolean]\n }>()\n\n const { t: $t } = useI18n({ useScope: 'global' })\n\n const toolPart = computed(() => {\n return props.part as {\n state?: string\n toolCallId?: string\n input?: {\n message: string\n }\n output?: string\n }\n })\n\n const toolState = computed(() => {\n return toolPart.value?.state || 'unknown'\n })\n\n const isInteractive = computed(() => {\n return toolState.value === 'input-available'\n })\n</script>\n\n<template>\n <div\n v-if=\"toolPart.input?.message\"\n class=\"w-full overflow-hidden bg-surface-1 p-sm rounded-xl\">\n <div class=\"text-12 text-word-3 mb-xs\">\n {{ toolPart.input.message }}\n </div>\n <VvButtonGroup>\n <VvButton\n modifiers=\"primary-small\"\n :class=\"{ pressed: toolPart.output === 'confirmed' }\"\n :disabled=\"!isInteractive\"\n icon=\"ri:check-line\"\n :label=\"$t('action.proceed')\"\n @click.stop=\"emit('confirm', true)\" />\n <VvButton\n modifiers=\"action-quiet-small\"\n :class=\"{ pressed: toolPart.output === 'cancelled' }\"\n :disabled=\"!isInteractive\"\n icon=\"ri:close-line\"\n :label=\"$t('action.cancel')\"\n @click.stop=\"emit('confirm', false)\" />\n </VvButtonGroup>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;EAII,IAAM,IAAQ,GAIR,IAAO,GAIP,EAAE,GAAG,MAAO,EAAQ,EAAE,UAAU,SAAS,CAAC,GAE1C,IAAW,QACN,EAAM,IAQhB,GAEK,IAAY,QACP,EAAS,OAAO,SAAS,SACnC,GAEK,IAAgB,QACX,EAAU,UAAU,iBAC9B;;;UAKS,EAAA,MAAS,OAAO,WAAA,EAAA,GAD1B,EAsBM,OAtBN,GAsBM,CAnBF,EAEM,OAFN,GAEM,EADC,EAAA,MAAS,MAAM,OAAO,GAAA,CAAA,GAE7B,EAegB,GAAA,MAAA;qBAR8B,CAN1C,EAM0C,GAAA;KALtC,WAAU;KACT,OAAK,EAAA,EAAA,SAAa,EAAA,MAAS,WAAM,YAAA,CAAA;KACjC,UAAQ,CAAG,EAAA;KACZ,MAAK;KACJ,OAAO,EAAA,CAAA,EAAE,gBAAA;KACT,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAI,WAAA,EAAA,GAAA,CAAA,MAAA,CAAA;;;;;QACrB,EAM2C,GAAA;KALvC,WAAU;KACT,OAAK,EAAA,EAAA,SAAa,EAAA,MAAS,WAAM,YAAA,CAAA;KACjC,UAAQ,CAAG,EAAA;KACZ,MAAK;KACJ,OAAO,EAAA,CAAA,EAAE,eAAA;KACT,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAI,WAAA,EAAA,GAAA,CAAA,MAAA,CAAA"}
1
+ {"version":3,"file":"PkToolRequestConfirm-BcZ10rMb.js","names":[],"sources":["../../../../packages/components/src/chat/PkToolRequestConfirm.vue","../../../../packages/components/src/chat/PkToolRequestConfirm.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useI18n } from 'vue-i18n'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const emit = defineEmits<{\n confirm: [confirmed: boolean]\n }>()\n\n const { t: $t } = useI18n({ useScope: 'global' })\n\n const toolPart = computed(() => {\n return props.part as {\n state?: string\n toolCallId?: string\n input?: {\n message: string\n }\n output?: string\n }\n })\n\n const toolState = computed(() => {\n return toolPart.value?.state || 'unknown'\n })\n\n const isInteractive = computed(() => {\n return toolState.value === 'input-available'\n })\n</script>\n\n<template>\n <div\n v-if=\"toolPart.input?.message\"\n class=\"w-full overflow-hidden bg-surface-1 p-sm rounded-xl\">\n <div class=\"text-12 text-word-3 mb-xs\">\n {{ toolPart.input.message }}\n </div>\n <VvButtonGroup>\n <VvButton\n modifiers=\"primary-small\"\n :class=\"{ pressed: toolPart.output === 'confirmed' }\"\n :disabled=\"!isInteractive\"\n icon=\"ri:check-line\"\n :label=\"$t('action.proceed')\"\n @click.stop=\"emit('confirm', true)\" />\n <VvButton\n modifiers=\"action-quiet-small\"\n :class=\"{ pressed: toolPart.output === 'cancelled' }\"\n :disabled=\"!isInteractive\"\n icon=\"ri:close-line\"\n :label=\"$t('action.cancel')\"\n @click.stop=\"emit('confirm', false)\" />\n </VvButtonGroup>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useI18n } from 'vue-i18n'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const emit = defineEmits<{\n confirm: [confirmed: boolean]\n }>()\n\n const { t: $t } = useI18n({ useScope: 'global' })\n\n const toolPart = computed(() => {\n return props.part as {\n state?: string\n toolCallId?: string\n input?: {\n message: string\n }\n output?: string\n }\n })\n\n const toolState = computed(() => {\n return toolPart.value?.state || 'unknown'\n })\n\n const isInteractive = computed(() => {\n return toolState.value === 'input-available'\n })\n</script>\n\n<template>\n <div\n v-if=\"toolPart.input?.message\"\n class=\"w-full overflow-hidden bg-surface-1 p-sm rounded-xl\">\n <div class=\"text-12 text-word-3 mb-xs\">\n {{ toolPart.input.message }}\n </div>\n <VvButtonGroup>\n <VvButton\n modifiers=\"primary-small\"\n :class=\"{ pressed: toolPart.output === 'confirmed' }\"\n :disabled=\"!isInteractive\"\n icon=\"ri:check-line\"\n :label=\"$t('action.proceed')\"\n @click.stop=\"emit('confirm', true)\" />\n <VvButton\n modifiers=\"action-quiet-small\"\n :class=\"{ pressed: toolPart.output === 'cancelled' }\"\n :disabled=\"!isInteractive\"\n icon=\"ri:close-line\"\n :label=\"$t('action.cancel')\"\n @click.stop=\"emit('confirm', false)\" />\n </VvButtonGroup>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;EAII,IAAM,IAAQ,GAIR,IAAO,GAIP,EAAE,GAAG,MAAO,EAAQ,EAAE,UAAU,SAAS,CAAC,GAE1C,IAAW,QACN,EAAM,IAQhB,GAEK,IAAY,QACP,EAAS,OAAO,SAAS,SACnC,GAEK,IAAgB,QACX,EAAU,UAAU,iBAC9B;;;UAKS,EAAA,MAAS,OAAO,WAAA,EAAA,GAD1B,EAsBM,OAtBN,GAsBM,CAnBF,EAEM,OAFN,GAEM,EADC,EAAA,MAAS,MAAM,OAAO,GAAA,CAAA,GAE7B,EAegB,GAAA,MAAA;qBAR8B,CAN1C,EAM0C,GAAA;KALtC,WAAU;KACT,OAAK,EAAA,EAAA,SAAa,EAAA,MAAS,WAAM,YAAA,CAAA;KACjC,UAAQ,CAAG,EAAA;KACZ,MAAK;KACJ,OAAO,EAAA,CAAA,EAAE,gBAAA;KACT,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAI,WAAA,EAAA,GAAA,CAAA,MAAA,CAAA;;;;;QACrB,EAM2C,GAAA;KALvC,WAAU;KACT,OAAK,EAAA,EAAA,SAAa,EAAA,MAAS,WAAM,YAAA,CAAA;KACjC,UAAQ,CAAG,EAAA;KACZ,MAAK;KACJ,OAAO,EAAA,CAAA,EAAE,eAAA;KACT,SAAK,AAAA,EAAA,OAAA,GAAA,MAAO,EAAI,WAAA,EAAA,GAAA,CAAA,MAAA,CAAA"}
@@ -0,0 +1,67 @@
1
+ import { VvIcon as e } from "@volverjs/ui-vue/components";
2
+ import { Fragment as t, computed as n, createCommentVNode as r, createElementBlock as i, createElementVNode as a, createTextVNode as o, createVNode as s, defineComponent as c, onMounted as l, openBlock as u, toDisplayString as d, unref as f } from "vue";
3
+ import { useI18n as p } from "vue-i18n";
4
+ //#region ../../packages/components/src/chat/PkToolRequestGeolocation.vue?vue&type=script&setup=true&lang.ts
5
+ var m = { class: "flex items-center gap-6 text-12 text-word-3 border border-surface-3 rounded-xl px-sm py-10" }, h = /* @__PURE__ */ c({
6
+ __name: "PkToolRequestGeolocation",
7
+ props: {
8
+ part: {},
9
+ reverseGeocode: { type: Function }
10
+ },
11
+ emits: ["result"],
12
+ setup(c, { emit: h }) {
13
+ let g = c, _ = h, { t: v } = p({ useScope: "global" }), y = n(() => g.part), b = n(() => y.value.state ?? "unknown"), x = n(() => b.value === "output-available"), S = n(() => {
14
+ let e = y.value.output;
15
+ if (!(!e || "error" in e)) return e;
16
+ }), C = n(() => {
17
+ let e = y.value.output;
18
+ if (!(!e || !("error" in e))) return e;
19
+ });
20
+ function w(e) {
21
+ return e === 1 ? "permission_denied" : e === 3 ? "timeout" : "position_unavailable";
22
+ }
23
+ return l(() => {
24
+ if (b.value === "input-available") {
25
+ if (!navigator.geolocation) {
26
+ _("result", { error: "position_unavailable" });
27
+ return;
28
+ }
29
+ navigator.geolocation.getCurrentPosition(async (e) => {
30
+ let { latitude: t, longitude: n, accuracy: r } = e.coords;
31
+ _("result", {
32
+ latitude: t,
33
+ longitude: n,
34
+ accuracy: r,
35
+ city: g.reverseGeocode ? await g.reverseGeocode(t, n).catch(() => void 0) : void 0
36
+ });
37
+ }, (e) => {
38
+ _("result", { error: w(e.code) });
39
+ }, { timeout: 15e3 });
40
+ }
41
+ }), (n, c) => {
42
+ let l = e;
43
+ return u(), i("div", m, [x.value ? S.value ? (u(), i(t, { key: 1 }, [s(l, {
44
+ name: "ri:map-pin-line",
45
+ class: "text-16"
46
+ }), a("span", null, [o(d(n.$n(S.value.latitude, {
47
+ style: "decimal",
48
+ minimumFractionDigits: 5,
49
+ maximumFractionDigits: 5
50
+ })) + ", " + d(n.$n(S.value.longitude, {
51
+ style: "decimal",
52
+ minimumFractionDigits: 5,
53
+ maximumFractionDigits: 5
54
+ })) + " ", 1), S.value.accuracy === void 0 ? r("", !0) : (u(), i(t, { key: 0 }, [o(" (±" + d(n.$n(S.value.accuracy, {
55
+ style: "unit",
56
+ unit: "meter"
57
+ })) + ") ", 1)], 64))])], 64)) : C.value ? (u(), i(t, { key: 2 }, [c[0] ||= a("span", { class: "i-vv-alert-circle text-16 shrink-0 text-danger" }, null, -1), a("span", null, d(C.value.error === "permission_denied" ? f(v)("message.geolocationPermissionDenied") : f(v)("message.geolocationUnavailable")), 1)], 64)) : r("", !0) : (u(), i(t, { key: 0 }, [s(l, {
58
+ name: "line-md:loading-loop",
59
+ class: "text-16"
60
+ }), a("span", null, d(f(v)("messagePart.requestGeolocation")), 1)], 64))]);
61
+ };
62
+ }
63
+ });
64
+ //#endregion
65
+ export { h as default };
66
+
67
+ //# sourceMappingURL=PkToolRequestGeolocation-DXSqWFTR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PkToolRequestGeolocation-DXSqWFTR.js","names":["$n"],"sources":["../../../../packages/components/src/chat/PkToolRequestGeolocation.vue","../../../../packages/components/src/chat/PkToolRequestGeolocation.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"],"mappings":";;;;;;;;;;;;EAeI,IAAM,IAAQ,GAKR,IAAO,GAIP,EAAE,GAAG,MAAO,EAAQ,EAAE,UAAU,SAAS,CAAC,GAE1C,IAAW,QACN,EAAM,IAKhB,GAEK,IAAQ,QAAe,EAAS,MAAM,SAAS,SAAS,GAExD,IAAoB,QAAe,EAAM,UAAU,kBAAkB,GAErE,IAAgB,QAAe;GACjC,IAAM,IAAM,EAAS,MAAM;GACvB,OAAC,KAAO,WAAW,IAGvB,OAAO;EACX,CAAC,GAEK,IAAc,QAAe;GAC/B,IAAM,IAAM,EAAS,MAAM;GACvB,OAAC,KAAO,EAAE,WAAW,KAGzB,OAAO;EACX,CAAC;EAGD,SAAS,EACL,GACwD;GAOxD,OANI,MAAS,IACF,sBAEP,MAAS,IACF,YAEJ;EACX;SAEA,QAAgB;GACR,MAAM,UAAU,mBAIpB;QAAI,CAAC,UAAU,aAAa;KACxB,EAAK,UAAU,EAAE,OAAO,uBAAuB,CAAC;KAChD;IACJ;IAEA,UAAU,YAAY,mBAClB,OAAO,MAAa;KAChB,IAAM,EAAE,aAAU,cAAW,gBAAa,EAAS;KAMnD,EAAK,UAAU;MAAE;MAAU;MAAW;MAAU,MALnC,EAAM,iBACb,MAAM,EACD,eAAe,GAAU,CAAS,EAClC,YAAY,KAAA,CAAS,IAC1B,KAAA;KAC+C,CAAC;IAC1D,IACC,MAAU;KACP,EAAK,UAAU,EAAE,OAAO,EAAoB,EAAM,IAAI,EAAE,CAAC;IAC7D,GACA,EAAE,SAAS,KAAM,CACrB;GAhBA;EAiBJ,CAAC;;eAID,EAgDM,OAhDN,GAgDM,CA7Ce,EAAA,QAMI,EAAA,SAAA,EAAA,GAArB,EA0BW,GAAA,EAAA,KAAA,EAAA,GAAA,CAzBP,EAAiD,GAAA;IAAzC,MAAK;IAAkB,OAAM;OACrC,EAuBO,QAAA,MAAA,CAAA,EAAA,EArBCA,EAAAA,GAAG,EAAA,MAAc,UAAQ;;;;SAK3B,OACF,EACIA,EAAAA,GAAG,EAAA,MAAc,WAAS;;;;SAK5B,KACF,CAAA,GAAgB,EAAA,MAAc,aAAa,KAAA,IAO3C,EAAA,IAAA,EAAA,KAP2C,EAAA,GAA3C,EAOW,GAAA,EAAA,KAAA,EAAA,GAAA,CAAA,EAP2C,QAChD,EACEA,EAAAA,GAAG,EAAA,MAAc,UAAQ;;;SAI3B,MACN,CAAA,CAAA,GAAA,EAAA,EAAA,CAAA,CAAA,GAAA,EAAA,KAKa,EAAA,SAAA,EAAA,GAArB,EASW,GAAA,EAAA,KAAA,EAAA,GAAA,CAAA,AAAA,EAAA,OARP,EAA+D,QAAA,EAAzD,OAAM,iDAAgD,GAAA,MAAA,EAAA,GAC5D,EAMO,QAAA,MAAA,EAJC,EAAA,MAAY,UAAK,sBAAmD,EAAA,CAAA,EAAE,qCAAA,IAAkE,EAAA,CAAA,EAAE,gCAAA,CAAA,GAAA,CAAA,CAAA,GAAA,EAAA,KAAA,EAAA,IAAA,EAAA,KAvCrI,EAAA,GAAjB,EAGW,GAAA,EAAA,KAAA,EAAA,GAAA,CAFP,EAAsD,GAAA;IAA9C,MAAK;IAAuB,OAAM;OAC1C,EAAuD,QAAA,MAAA,EAA9C,EAAA,CAAA,EAAE,gCAAA,CAAA,GAAA,CAAA,CAAA,GAAA,EAAA,EAqCuI,CAAA"}
@@ -0,0 +1,63 @@
1
+ import { VvButton as e, VvIcon as t } from "@volverjs/ui-vue/components";
2
+ import { Fragment as n, computed as r, createElementBlock as i, createElementVNode as a, createVNode as o, defineComponent as s, onUnmounted as c, openBlock as l, ref as u, toDisplayString as d, unref as f, watch as p } from "vue";
3
+ import { useI18n as m } from "vue-i18n";
4
+ //#region ../../packages/components/src/chat/PkToolRequestOAuthConnection.vue?vue&type=script&setup=true&lang.ts
5
+ var h = { class: "w-full overflow-hidden bg-surface-1 p-sm rounded-xl text-12" }, g = {
6
+ key: 0,
7
+ class: "flex items-center gap-8 text-word-3"
8
+ }, _ = { class: "text-10" }, v = {
9
+ key: 1,
10
+ class: "flex items-center gap-8 text-word-3"
11
+ }, y = { class: "text-10" }, b = {
12
+ key: 2,
13
+ class: "flex items-center gap-8 text-word-3"
14
+ }, x = { class: "text-10" }, S = { class: "flex items-center gap-6 text-word-3 mb-xs" }, C = {
15
+ key: 4,
16
+ class: "flex items-center gap-8 text-word-3"
17
+ }, w = { class: "text-10" }, T = /* @__PURE__ */ s({
18
+ __name: "PkToolRequestOAuthConnection",
19
+ props: {
20
+ part: {},
21
+ resolveConnection: { type: Function }
22
+ },
23
+ emits: ["connected"],
24
+ setup(s, { emit: T }) {
25
+ let E = s, D = T, { t: O } = m({ useScope: "global" }), k = r(() => E.part), A = r(() => k.value.state ?? "unknown"), j = r(() => k.value.input?.serverName), M = u(null), N = u(!1), P = u(!1), F = u(null);
26
+ async function I() {
27
+ if (!(!j.value || !E.resolveConnection || M.value || N.value)) {
28
+ N.value = !0;
29
+ try {
30
+ M.value = await E.resolveConnection(j.value);
31
+ } catch (e) {
32
+ F.value = e instanceof Error ? e.message : "Failed to resolve OAuth";
33
+ } finally {
34
+ N.value = !1;
35
+ }
36
+ }
37
+ }
38
+ p(() => A.value === "input-available" && j.value, (e) => {
39
+ e && I();
40
+ }, { immediate: !0 });
41
+ function L(e) {
42
+ e.data?.type === "mcp-oauth-complete" && e.data.mcpServerId === M.value?.mcpServerId && (window.removeEventListener("message", L), e.data.success ? (P.value = !0, D("connected", e.data.mcpServerId)) : F.value = e.data.error ?? "Unknown error");
43
+ }
44
+ function R() {
45
+ M.value?.authorizeUrl && (window.addEventListener("message", L), window.open(M.value.authorizeUrl, "mcp_oauth", "width=600,height=700"));
46
+ }
47
+ return c(() => {
48
+ window.removeEventListener("message", L);
49
+ }), (r, s) => {
50
+ let c = t, u = e;
51
+ return l(), i("div", h, [N.value ? (l(), i("div", g, [o(c, { name: "line-md:loading-loop" }), a("span", _, d(f(O)("messagePart.requestOAuthConnection")), 1)])) : P.value ? (l(), i("div", v, [o(c, { name: "ri:check-line" }), a("strong", y, d(f(O)("messagePart.requestOAuthConnectionSuccess", { name: j.value })), 1)])) : F.value ? (l(), i("div", b, [o(c, { name: "ri:close-line" }), a("strong", x, d(F.value), 1)])) : M.value ? (l(), i(n, { key: 3 }, [a("div", S, [a("span", null, d(f(O)("messagePart.requestOAuthConnectionPrompt", { name: j.value })), 1)]), o(u, {
52
+ modifiers: "primary-small",
53
+ icon: "ri:external-link-line",
54
+ label: f(O)("messagePart.requestOAuthConnectionButton", { name: j.value }),
55
+ onClick: R
56
+ }, null, 8, ["label"])], 64)) : (l(), i("div", C, [o(c, { name: "ri:link-m" }), a("span", w, d(f(O)("messagePart.requestOAuthConnectionInfo", { name: j.value })), 1)]))]);
57
+ };
58
+ }
59
+ });
60
+ //#endregion
61
+ export { T as default };
62
+
63
+ //# sourceMappingURL=PkToolRequestOAuthConnection-CIrFBhxL.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PkToolRequestOAuthConnection-shcJXxtk.js","names":[],"sources":["../../../../packages/components/src/chat/PkToolRequestOAuthConnection.vue","../../../../packages/components/src/chat/PkToolRequestOAuthConnection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, onUnmounted, ref, watch } from 'vue'\n import { useI18n } from 'vue-i18n'\n\n const props = defineProps<{\n part: unknown\n resolveConnection?: (\n serverName: string,\n ) => Promise<{ mcpServerId: string; authorizeUrl: string }>\n }>()\n\n const emit = defineEmits<{\n connected: [mcpServerId: string]\n }>()\n\n const { t: $t } = useI18n({ useScope: 'global' })\n\n const toolPart = computed(() => {\n return props.part as {\n state?: string\n toolCallId?: string\n input?: { serverName: string }\n }\n })\n\n const state = computed(() => toolPart.value.state ?? 'unknown')\n const serverName = computed(() => toolPart.value.input?.serverName)\n\n const connectionData = ref<{\n mcpServerId: string\n authorizeUrl: string\n } | null>(null)\n const isResolving = ref(false)\n const oauthCompleted = ref(false)\n const oauthError = ref<string | null>(null)\n\n async function resolveConnectionData() {\n if (\n !serverName.value ||\n !props.resolveConnection ||\n connectionData.value ||\n isResolving.value\n ) {\n return\n }\n isResolving.value = true\n try {\n connectionData.value = await props.resolveConnection(\n serverName.value,\n )\n } catch (err) {\n oauthError.value =\n err instanceof Error ? err.message : 'Failed to resolve OAuth'\n } finally {\n isResolving.value = false\n }\n }\n\n watch(\n () => state.value === 'input-available' && serverName.value,\n (ready) => {\n if (ready) {\n resolveConnectionData()\n }\n },\n { immediate: true },\n )\n\n function onMessage(event: MessageEvent) {\n if (event.data?.type !== 'mcp-oauth-complete') {\n return\n }\n if (event.data.mcpServerId !== connectionData.value?.mcpServerId) {\n return\n }\n window.removeEventListener('message', onMessage)\n if (event.data.success) {\n oauthCompleted.value = true\n emit('connected', event.data.mcpServerId)\n } else {\n oauthError.value = event.data.error ?? 'Unknown error'\n }\n }\n\n function openAuthWindow() {\n if (!connectionData.value?.authorizeUrl) {\n return\n }\n window.addEventListener('message', onMessage)\n window.open(\n connectionData.value.authorizeUrl,\n 'mcp_oauth',\n 'width=600,height=700',\n )\n }\n\n onUnmounted(() => {\n window.removeEventListener('message', onMessage)\n })\n</script>\n\n<template>\n <div class=\"w-full overflow-hidden bg-surface-1 p-sm rounded-xl text-12\">\n <!-- Loading state -->\n <template v-if=\"isResolving\">\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"line-md:loading-loop\" />\n <span class=\"text-10\">{{\n $t('messagePart.requestOAuthConnection')\n }}</span>\n </div>\n </template>\n\n <!-- Connected successfully -->\n <template v-else-if=\"oauthCompleted\">\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"ri:check-line\" />\n <strong class=\"text-10\">\n {{\n $t('messagePart.requestOAuthConnectionSuccess', {\n name: serverName,\n })\n }}\n </strong>\n </div>\n </template>\n\n <!-- OAuth error -->\n <template v-else-if=\"oauthError\">\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"ri:close-line\" />\n <strong class=\"text-10\">\n {{ oauthError }}\n </strong>\n </div>\n </template>\n\n <!-- Call ready — show connect button -->\n <template v-else-if=\"connectionData\">\n <div class=\"flex items-center gap-6 text-word-3 mb-xs\">\n <span>\n {{\n $t('messagePart.requestOAuthConnectionPrompt', {\n name: serverName,\n })\n }}\n </span>\n </div>\n <VvButton\n modifiers=\"primary-small\"\n icon=\"ri:external-link-line\"\n :label=\"\n $t('messagePart.requestOAuthConnectionButton', {\n name: serverName,\n })\n \"\n @click=\"openAuthWindow\" />\n </template>\n <!-- Fallback for unknown state -->\n <template v-else>\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"ri:link-m\" />\n <span class=\"text-10\">\n {{\n $t('messagePart.requestOAuthConnectionInfo', {\n name: serverName,\n })\n }}\n </span>\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, onUnmounted, ref, watch } from 'vue'\n import { useI18n } from 'vue-i18n'\n\n const props = defineProps<{\n part: unknown\n resolveConnection?: (\n serverName: string,\n ) => Promise<{ mcpServerId: string; authorizeUrl: string }>\n }>()\n\n const emit = defineEmits<{\n connected: [mcpServerId: string]\n }>()\n\n const { t: $t } = useI18n({ useScope: 'global' })\n\n const toolPart = computed(() => {\n return props.part as {\n state?: string\n toolCallId?: string\n input?: { serverName: string }\n }\n })\n\n const state = computed(() => toolPart.value.state ?? 'unknown')\n const serverName = computed(() => toolPart.value.input?.serverName)\n\n const connectionData = ref<{\n mcpServerId: string\n authorizeUrl: string\n } | null>(null)\n const isResolving = ref(false)\n const oauthCompleted = ref(false)\n const oauthError = ref<string | null>(null)\n\n async function resolveConnectionData() {\n if (\n !serverName.value ||\n !props.resolveConnection ||\n connectionData.value ||\n isResolving.value\n ) {\n return\n }\n isResolving.value = true\n try {\n connectionData.value = await props.resolveConnection(\n serverName.value,\n )\n } catch (err) {\n oauthError.value =\n err instanceof Error ? err.message : 'Failed to resolve OAuth'\n } finally {\n isResolving.value = false\n }\n }\n\n watch(\n () => state.value === 'input-available' && serverName.value,\n (ready) => {\n if (ready) {\n resolveConnectionData()\n }\n },\n { immediate: true },\n )\n\n function onMessage(event: MessageEvent) {\n if (event.data?.type !== 'mcp-oauth-complete') {\n return\n }\n if (event.data.mcpServerId !== connectionData.value?.mcpServerId) {\n return\n }\n window.removeEventListener('message', onMessage)\n if (event.data.success) {\n oauthCompleted.value = true\n emit('connected', event.data.mcpServerId)\n } else {\n oauthError.value = event.data.error ?? 'Unknown error'\n }\n }\n\n function openAuthWindow() {\n if (!connectionData.value?.authorizeUrl) {\n return\n }\n window.addEventListener('message', onMessage)\n window.open(\n connectionData.value.authorizeUrl,\n 'mcp_oauth',\n 'width=600,height=700',\n )\n }\n\n onUnmounted(() => {\n window.removeEventListener('message', onMessage)\n })\n</script>\n\n<template>\n <div class=\"w-full overflow-hidden bg-surface-1 p-sm rounded-xl text-12\">\n <!-- Loading state -->\n <template v-if=\"isResolving\">\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"line-md:loading-loop\" />\n <span class=\"text-10\">{{\n $t('messagePart.requestOAuthConnection')\n }}</span>\n </div>\n </template>\n\n <!-- Connected successfully -->\n <template v-else-if=\"oauthCompleted\">\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"ri:check-line\" />\n <strong class=\"text-10\">\n {{\n $t('messagePart.requestOAuthConnectionSuccess', {\n name: serverName,\n })\n }}\n </strong>\n </div>\n </template>\n\n <!-- OAuth error -->\n <template v-else-if=\"oauthError\">\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"ri:close-line\" />\n <strong class=\"text-10\">\n {{ oauthError }}\n </strong>\n </div>\n </template>\n\n <!-- Call ready — show connect button -->\n <template v-else-if=\"connectionData\">\n <div class=\"flex items-center gap-6 text-word-3 mb-xs\">\n <span>\n {{\n $t('messagePart.requestOAuthConnectionPrompt', {\n name: serverName,\n })\n }}\n </span>\n </div>\n <VvButton\n modifiers=\"primary-small\"\n icon=\"ri:external-link-line\"\n :label=\"\n $t('messagePart.requestOAuthConnectionButton', {\n name: serverName,\n })\n \"\n @click=\"openAuthWindow\" />\n </template>\n <!-- Fallback for unknown state -->\n <template v-else>\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"ri:link-m\" />\n <span class=\"text-10\">\n {{\n $t('messagePart.requestOAuthConnectionInfo', {\n name: serverName,\n })\n }}\n </span>\n </div>\n </template>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EAII,IAAM,IAAQ,GAOR,IAAO,GAIP,EAAE,GAAG,MAAO,EAAQ,EAAE,UAAU,SAAS,CAAC,GAE1C,IAAW,QACN,EAAM,IAKhB,GAEK,IAAQ,QAAe,EAAS,MAAM,SAAS,SAAS,GACxD,IAAa,QAAe,EAAS,MAAM,OAAO,UAAU,GAE5D,IAAiB,EAGb,IAAI,GACR,IAAc,EAAI,EAAK,GACvB,IAAiB,EAAI,EAAK,GAC1B,IAAa,EAAmB,IAAI;EAE1C,eAAe,IAAwB;GAE/B,OAAC,EAAW,SACZ,CAAC,EAAM,qBACP,EAAe,SACf,EAAY,QAIhB;MAAY,QAAQ;IACpB,IAAI;KACA,EAAe,QAAQ,MAAM,EAAM,kBAC/B,EAAW,KACf;IACJ,SAAS,GAAK;KACV,EAAW,QACP,aAAe,QAAQ,EAAI,UAAU;IAC7C,UAAU;KACN,EAAY,QAAQ;IACxB;GAVoB;EAWxB;EAEA,QACU,EAAM,UAAU,qBAAqB,EAAW,QACrD,MAAU;GACP,AAAI,KACA,EAAsB;EAE9B,GACA,EAAE,WAAW,GAAK,CACtB;EAEA,SAAS,EAAU,GAAqB;GAChC,EAAM,MAAM,SAAS,wBAGrB,EAAM,KAAK,gBAAgB,EAAe,OAAO,gBAGrD,OAAO,oBAAoB,WAAW,CAAS,GAC3C,EAAM,KAAK,WACX,EAAe,QAAQ,IACvB,EAAK,aAAa,EAAM,KAAK,WAAW,KAExC,EAAW,QAAQ,EAAM,KAAK,SAAS;EAE/C;EAEA,SAAS,IAAiB;GACjB,EAAe,OAAO,iBAG3B,OAAO,iBAAiB,WAAW,CAAS,GAC5C,OAAO,KACH,EAAe,MAAM,cACrB,aACA,sBACJ;EACJ;SAEA,QAAkB;GACd,OAAO,oBAAoB,WAAW,CAAS;EACnD,CAAC;;eAID,EAqEM,OArEN,GAqEM,CAnEc,EAAA,SAAA,EAAA,GACZ,EAKM,OALN,GAKM,CAJF,EAAsC,GAAA,EAA9B,MAAK,uBAAsB,CAAA,GACnC,EAES,QAFT,GAES,EADL,EAAA,CAAA,EAAE,oCAAA,CAAA,GAAA,CAAA,CAAA,CAAA,KAMO,EAAA,SAAA,EAAA,GACjB,EASM,OATN,GASM,CARF,EAA+B,GAAA,EAAvB,MAAK,gBAAe,CAAA,GAC5B,EAMS,UANT,GAMS,EAJD,EAAA,CAAA,EAAE,6CAAA,EAAA,MAAkF,EAAA,MAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,KAS/E,EAAA,SAAA,EAAA,GACjB,EAKM,OALN,GAKM,CAJF,EAA+B,GAAA,EAAvB,MAAK,gBAAe,CAAA,GAC5B,EAES,UAFT,GAES,EADF,EAAA,KAAU,GAAA,CAAA,CAAA,CAAA,KAMJ,EAAA,SAAA,EAAA,GAArB,EAmBW,GAAA,EAAA,KAAA,EAAA,GAAA,CAlBP,EAQM,OARN,GAQM,CAPF,EAMO,QAAA,MAAA,EAJC,EAAA,CAAA,EAAE,4CAAA,EAAA,MAAiF,EAAA,MAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,GAM/F,EAQ8B,GAAA;IAP1B,WAAU;IACV,MAAK;IACJ,OAA4B,EAAA,CAAA,EAAE,4CAAA,EAAA,MAA6E,EAAA,MAAA,CAAA;IAK3G,SAAO;yCAIZ,EASM,OATN,GASM,CARF,EAA2B,GAAA,EAAnB,MAAK,YAAW,CAAA,GACxB,EAMO,QANP,GAMO,EAJC,EAAA,CAAA,EAAE,0CAAA,EAAA,MAA+E,EAAA,MAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,EAAA,CAAA"}
1
+ {"version":3,"file":"PkToolRequestOAuthConnection-CIrFBhxL.js","names":[],"sources":["../../../../packages/components/src/chat/PkToolRequestOAuthConnection.vue","../../../../packages/components/src/chat/PkToolRequestOAuthConnection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, onUnmounted, ref, watch } from 'vue'\n import { useI18n } from 'vue-i18n'\n\n const props = defineProps<{\n part: unknown\n resolveConnection?: (\n serverName: string,\n ) => Promise<{ mcpServerId: string; authorizeUrl: string }>\n }>()\n\n const emit = defineEmits<{\n connected: [mcpServerId: string]\n }>()\n\n const { t: $t } = useI18n({ useScope: 'global' })\n\n const toolPart = computed(() => {\n return props.part as {\n state?: string\n toolCallId?: string\n input?: { serverName: string }\n }\n })\n\n const state = computed(() => toolPart.value.state ?? 'unknown')\n const serverName = computed(() => toolPart.value.input?.serverName)\n\n const connectionData = ref<{\n mcpServerId: string\n authorizeUrl: string\n } | null>(null)\n const isResolving = ref(false)\n const oauthCompleted = ref(false)\n const oauthError = ref<string | null>(null)\n\n async function resolveConnectionData() {\n if (\n !serverName.value ||\n !props.resolveConnection ||\n connectionData.value ||\n isResolving.value\n ) {\n return\n }\n isResolving.value = true\n try {\n connectionData.value = await props.resolveConnection(\n serverName.value,\n )\n } catch (err) {\n oauthError.value =\n err instanceof Error ? err.message : 'Failed to resolve OAuth'\n } finally {\n isResolving.value = false\n }\n }\n\n watch(\n () => state.value === 'input-available' && serverName.value,\n (ready) => {\n if (ready) {\n resolveConnectionData()\n }\n },\n { immediate: true },\n )\n\n function onMessage(event: MessageEvent) {\n if (event.data?.type !== 'mcp-oauth-complete') {\n return\n }\n if (event.data.mcpServerId !== connectionData.value?.mcpServerId) {\n return\n }\n window.removeEventListener('message', onMessage)\n if (event.data.success) {\n oauthCompleted.value = true\n emit('connected', event.data.mcpServerId)\n } else {\n oauthError.value = event.data.error ?? 'Unknown error'\n }\n }\n\n function openAuthWindow() {\n if (!connectionData.value?.authorizeUrl) {\n return\n }\n window.addEventListener('message', onMessage)\n window.open(\n connectionData.value.authorizeUrl,\n 'mcp_oauth',\n 'width=600,height=700',\n )\n }\n\n onUnmounted(() => {\n window.removeEventListener('message', onMessage)\n })\n</script>\n\n<template>\n <div class=\"w-full overflow-hidden bg-surface-1 p-sm rounded-xl text-12\">\n <!-- Loading state -->\n <template v-if=\"isResolving\">\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"line-md:loading-loop\" />\n <span class=\"text-10\">{{\n $t('messagePart.requestOAuthConnection')\n }}</span>\n </div>\n </template>\n\n <!-- Connected successfully -->\n <template v-else-if=\"oauthCompleted\">\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"ri:check-line\" />\n <strong class=\"text-10\">\n {{\n $t('messagePart.requestOAuthConnectionSuccess', {\n name: serverName,\n })\n }}\n </strong>\n </div>\n </template>\n\n <!-- OAuth error -->\n <template v-else-if=\"oauthError\">\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"ri:close-line\" />\n <strong class=\"text-10\">\n {{ oauthError }}\n </strong>\n </div>\n </template>\n\n <!-- Call ready — show connect button -->\n <template v-else-if=\"connectionData\">\n <div class=\"flex items-center gap-6 text-word-3 mb-xs\">\n <span>\n {{\n $t('messagePart.requestOAuthConnectionPrompt', {\n name: serverName,\n })\n }}\n </span>\n </div>\n <VvButton\n modifiers=\"primary-small\"\n icon=\"ri:external-link-line\"\n :label=\"\n $t('messagePart.requestOAuthConnectionButton', {\n name: serverName,\n })\n \"\n @click=\"openAuthWindow\" />\n </template>\n <!-- Fallback for unknown state -->\n <template v-else>\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"ri:link-m\" />\n <span class=\"text-10\">\n {{\n $t('messagePart.requestOAuthConnectionInfo', {\n name: serverName,\n })\n }}\n </span>\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, onUnmounted, ref, watch } from 'vue'\n import { useI18n } from 'vue-i18n'\n\n const props = defineProps<{\n part: unknown\n resolveConnection?: (\n serverName: string,\n ) => Promise<{ mcpServerId: string; authorizeUrl: string }>\n }>()\n\n const emit = defineEmits<{\n connected: [mcpServerId: string]\n }>()\n\n const { t: $t } = useI18n({ useScope: 'global' })\n\n const toolPart = computed(() => {\n return props.part as {\n state?: string\n toolCallId?: string\n input?: { serverName: string }\n }\n })\n\n const state = computed(() => toolPart.value.state ?? 'unknown')\n const serverName = computed(() => toolPart.value.input?.serverName)\n\n const connectionData = ref<{\n mcpServerId: string\n authorizeUrl: string\n } | null>(null)\n const isResolving = ref(false)\n const oauthCompleted = ref(false)\n const oauthError = ref<string | null>(null)\n\n async function resolveConnectionData() {\n if (\n !serverName.value ||\n !props.resolveConnection ||\n connectionData.value ||\n isResolving.value\n ) {\n return\n }\n isResolving.value = true\n try {\n connectionData.value = await props.resolveConnection(\n serverName.value,\n )\n } catch (err) {\n oauthError.value =\n err instanceof Error ? err.message : 'Failed to resolve OAuth'\n } finally {\n isResolving.value = false\n }\n }\n\n watch(\n () => state.value === 'input-available' && serverName.value,\n (ready) => {\n if (ready) {\n resolveConnectionData()\n }\n },\n { immediate: true },\n )\n\n function onMessage(event: MessageEvent) {\n if (event.data?.type !== 'mcp-oauth-complete') {\n return\n }\n if (event.data.mcpServerId !== connectionData.value?.mcpServerId) {\n return\n }\n window.removeEventListener('message', onMessage)\n if (event.data.success) {\n oauthCompleted.value = true\n emit('connected', event.data.mcpServerId)\n } else {\n oauthError.value = event.data.error ?? 'Unknown error'\n }\n }\n\n function openAuthWindow() {\n if (!connectionData.value?.authorizeUrl) {\n return\n }\n window.addEventListener('message', onMessage)\n window.open(\n connectionData.value.authorizeUrl,\n 'mcp_oauth',\n 'width=600,height=700',\n )\n }\n\n onUnmounted(() => {\n window.removeEventListener('message', onMessage)\n })\n</script>\n\n<template>\n <div class=\"w-full overflow-hidden bg-surface-1 p-sm rounded-xl text-12\">\n <!-- Loading state -->\n <template v-if=\"isResolving\">\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"line-md:loading-loop\" />\n <span class=\"text-10\">{{\n $t('messagePart.requestOAuthConnection')\n }}</span>\n </div>\n </template>\n\n <!-- Connected successfully -->\n <template v-else-if=\"oauthCompleted\">\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"ri:check-line\" />\n <strong class=\"text-10\">\n {{\n $t('messagePart.requestOAuthConnectionSuccess', {\n name: serverName,\n })\n }}\n </strong>\n </div>\n </template>\n\n <!-- OAuth error -->\n <template v-else-if=\"oauthError\">\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"ri:close-line\" />\n <strong class=\"text-10\">\n {{ oauthError }}\n </strong>\n </div>\n </template>\n\n <!-- Call ready — show connect button -->\n <template v-else-if=\"connectionData\">\n <div class=\"flex items-center gap-6 text-word-3 mb-xs\">\n <span>\n {{\n $t('messagePart.requestOAuthConnectionPrompt', {\n name: serverName,\n })\n }}\n </span>\n </div>\n <VvButton\n modifiers=\"primary-small\"\n icon=\"ri:external-link-line\"\n :label=\"\n $t('messagePart.requestOAuthConnectionButton', {\n name: serverName,\n })\n \"\n @click=\"openAuthWindow\" />\n </template>\n <!-- Fallback for unknown state -->\n <template v-else>\n <div class=\"flex items-center gap-8 text-word-3\">\n <VvIcon name=\"ri:link-m\" />\n <span class=\"text-10\">\n {{\n $t('messagePart.requestOAuthConnectionInfo', {\n name: serverName,\n })\n }}\n </span>\n </div>\n </template>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;EAII,IAAM,IAAQ,GAOR,IAAO,GAIP,EAAE,GAAG,MAAO,EAAQ,EAAE,UAAU,SAAS,CAAC,GAE1C,IAAW,QACN,EAAM,IAKhB,GAEK,IAAQ,QAAe,EAAS,MAAM,SAAS,SAAS,GACxD,IAAa,QAAe,EAAS,MAAM,OAAO,UAAU,GAE5D,IAAiB,EAGb,IAAI,GACR,IAAc,EAAI,EAAK,GACvB,IAAiB,EAAI,EAAK,GAC1B,IAAa,EAAmB,IAAI;EAE1C,eAAe,IAAwB;GAE/B,OAAC,EAAW,SACZ,CAAC,EAAM,qBACP,EAAe,SACf,EAAY,QAIhB;MAAY,QAAQ;IACpB,IAAI;KACA,EAAe,QAAQ,MAAM,EAAM,kBAC/B,EAAW,KACf;IACJ,SAAS,GAAK;KACV,EAAW,QACP,aAAe,QAAQ,EAAI,UAAU;IAC7C,UAAU;KACN,EAAY,QAAQ;IACxB;GAVoB;EAWxB;EAEA,QACU,EAAM,UAAU,qBAAqB,EAAW,QACrD,MAAU;GACP,AAAI,KACA,EAAsB;EAE9B,GACA,EAAE,WAAW,GAAK,CACtB;EAEA,SAAS,EAAU,GAAqB;GAChC,EAAM,MAAM,SAAS,wBAGrB,EAAM,KAAK,gBAAgB,EAAe,OAAO,gBAGrD,OAAO,oBAAoB,WAAW,CAAS,GAC3C,EAAM,KAAK,WACX,EAAe,QAAQ,IACvB,EAAK,aAAa,EAAM,KAAK,WAAW,KAExC,EAAW,QAAQ,EAAM,KAAK,SAAS;EAE/C;EAEA,SAAS,IAAiB;GACjB,EAAe,OAAO,iBAG3B,OAAO,iBAAiB,WAAW,CAAS,GAC5C,OAAO,KACH,EAAe,MAAM,cACrB,aACA,sBACJ;EACJ;SAEA,QAAkB;GACd,OAAO,oBAAoB,WAAW,CAAS;EACnD,CAAC;;eAID,EAqEM,OArEN,GAqEM,CAnEc,EAAA,SAAA,EAAA,GACZ,EAKM,OALN,GAKM,CAJF,EAAsC,GAAA,EAA9B,MAAK,uBAAsB,CAAA,GACnC,EAES,QAFT,GAES,EADL,EAAA,CAAA,EAAE,oCAAA,CAAA,GAAA,CAAA,CAAA,CAAA,KAMO,EAAA,SAAA,EAAA,GACjB,EASM,OATN,GASM,CARF,EAA+B,GAAA,EAAvB,MAAK,gBAAe,CAAA,GAC5B,EAMS,UANT,GAMS,EAJD,EAAA,CAAA,EAAE,6CAAA,EAAA,MAAkF,EAAA,MAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,KAS/E,EAAA,SAAA,EAAA,GACjB,EAKM,OALN,GAKM,CAJF,EAA+B,GAAA,EAAvB,MAAK,gBAAe,CAAA,GAC5B,EAES,UAFT,GAES,EADF,EAAA,KAAU,GAAA,CAAA,CAAA,CAAA,KAMJ,EAAA,SAAA,EAAA,GAArB,EAmBW,GAAA,EAAA,KAAA,EAAA,GAAA,CAlBP,EAQM,OARN,GAQM,CAPF,EAMO,QAAA,MAAA,EAJC,EAAA,CAAA,EAAE,4CAAA,EAAA,MAAiF,EAAA,MAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,GAM/F,EAQ8B,GAAA;IAP1B,WAAU;IACV,MAAK;IACJ,OAA4B,EAAA,CAAA,EAAE,4CAAA,EAAA,MAA6E,EAAA,MAAA,CAAA;IAK3G,SAAO;yCAIZ,EASM,OATN,GASM,CARF,EAA2B,GAAA,EAAnB,MAAK,YAAW,CAAA,GACxB,EAMO,QANP,GAMO,EAJC,EAAA,CAAA,EAAE,0CAAA,EAAA,MAA+E,EAAA,MAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,EAAA,CAAA"}
@@ -1,5 +1,5 @@
1
- import { a as e } from "./useChatbotStore-BXi-Gx7b.js";
2
- import { t } from "./PkStreamingMarkdown-BUiAi-qv.js";
1
+ import { s as e } from "./useChatbotStore-DCCWlutT.js";
2
+ import { t } from "./PkStreamingMarkdown-BDtjktHX.js";
3
3
  import { VvButton as n } from "@volverjs/ui-vue/components";
4
4
  import { computed as r, createBlock as i, createElementBlock as a, createElementVNode as o, createTextVNode as s, createVNode as c, defineComponent as l, normalizeClass as u, openBlock as d, ref as f, toDisplayString as p, unref as m, watch as h } from "vue";
5
5
  import { useClipboard as g } from "@vueuse/core";
@@ -88,4 +88,4 @@ var _ = ["innerHTML"], v = /* @__PURE__ */ l({
88
88
  //#endregion
89
89
  export { T as n, v as r, E as t };
90
90
 
91
- //# sourceMappingURL=PkToolShowArtifact-D4BVWuMi.js.map
91
+ //# sourceMappingURL=PkToolShowArtifact-BVFPfZT8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PkToolShowArtifact-D4BVWuMi.js","names":["$attrs","$t"],"sources":["../../../../packages/components/src/chat/PkCode.vue","../../../../packages/components/src/chat/PkCode.vue","../../../../packages/components/src/chat/PkToolShowArtifact.vue","../../../../packages/components/src/chat/PkToolShowArtifact.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, ref, watch } from 'vue'\n\n defineOptions({\n inheritAttrs: false,\n })\n\n const props = defineProps<{\n code: unknown\n language: string\n line?: boolean\n }>()\n\n const highlightedHtml = ref('')\n\n const hasCode = computed(() => {\n if (typeof props.code === 'string') {\n return props.code\n }\n return JSON.stringify(props.code, null, 2)\n })\n\n async function highlight() {\n const hljs = (await import('highlight.js/lib/common')).default\n try {\n const result = props.language\n ? hljs.highlight(hasCode.value, { language: props.language })\n : hljs.highlightAuto(hasCode.value)\n highlightedHtml.value = result.value\n } catch {\n highlightedHtml.value = hasCode.value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n }\n }\n\n watch(hasCode, highlight, { immediate: true })\n</script>\n\n<template>\n <pre\n :class=\"\n $attrs.class\n ? $attrs.class\n : 'font-mono leading-snug text-smaller bg-surface-1'\n \">\n <code :class=\"['hljs', line ? 'whitespace-pre-line' : 'whitespace-pre', language]\" v-html=\"highlightedHtml\"></code>\n </pre>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref, watch } from 'vue'\n\n defineOptions({\n inheritAttrs: false,\n })\n\n const props = defineProps<{\n code: unknown\n language: string\n line?: boolean\n }>()\n\n const highlightedHtml = ref('')\n\n const hasCode = computed(() => {\n if (typeof props.code === 'string') {\n return props.code\n }\n return JSON.stringify(props.code, null, 2)\n })\n\n async function highlight() {\n const hljs = (await import('highlight.js/lib/common')).default\n try {\n const result = props.language\n ? hljs.highlight(hasCode.value, { language: props.language })\n : hljs.highlightAuto(hasCode.value)\n highlightedHtml.value = result.value\n } catch {\n highlightedHtml.value = hasCode.value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n }\n }\n\n watch(hasCode, highlight, { immediate: true })\n</script>\n\n<template>\n <pre\n :class=\"\n $attrs.class\n ? $attrs.class\n : 'font-mono leading-snug text-smaller bg-surface-1'\n \">\n <code :class=\"['hljs', line ? 'whitespace-pre-line' : 'whitespace-pre', language]\" v-html=\"highlightedHtml\"></code>\n </pre>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useClipboard } from '@vueuse/core'\n import PkCode from './PkCode.vue'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n\n const { copy, copied } = useClipboard()\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title: string\n content: string\n artifactType: string\n language?: string\n }\n }\n return part\n })\n\n const artifactTypeLabel = computed(() => {\n const labels: Record<string, string> = {\n code: 'Code',\n document: 'Document',\n markdown: 'Markdown',\n json: 'JSON',\n xml: 'XML',\n csv: 'CSV',\n html: 'HTML',\n yaml: 'YAML',\n sql: 'SQL',\n text: 'Text',\n }\n if (!toolPart.value.input?.artifactType) {\n return 'Artifact'\n }\n return labels[toolPart.value.input.artifactType] || 'Artifact'\n })\n\n const languageLabel = computed(() => {\n if (!toolPart.value.input?.language) {\n return ''\n }\n return ` (${toolPart.value.input.language})`\n })\n\n const isCodeType = computed(() => {\n return (\n toolPart.value.input?.artifactType === 'code' ||\n toolPart.value.input?.artifactType === 'json' ||\n toolPart.value.input?.artifactType === 'xml' ||\n toolPart.value.input?.artifactType === 'yaml' ||\n toolPart.value.input?.artifactType === 'html' ||\n toolPart.value.input?.artifactType === 'sql'\n )\n })\n\n const isMarkdownType = computed(() => {\n return toolPart.value.input?.artifactType === 'markdown'\n })\n\n const codeLanguage = computed(() => {\n if (toolPart.value.input?.language) {\n return toolPart.value.input.language\n }\n // Map artifact types to highlight.js languages\n const languageMap: Record<string, string> = {\n json: 'json',\n xml: 'xml',\n yaml: 'yaml',\n html: 'html',\n sql: 'sql',\n }\n if (!toolPart.value.input?.artifactType) {\n return 'plaintext'\n }\n return languageMap[toolPart.value.input.artifactType] || 'plaintext'\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 font-bold bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex justify-between items-center\">\n <div class=\"flex flex-col items-start gap-4\">\n <span>{{ toolPart?.input?.title }}</span>\n <span class=\"text-10 opacity-60 font-normal\">\n {{ artifactTypeLabel }}{{ languageLabel }}\n </span>\n </div>\n <VvButton\n :icon=\"copied ? 'ri:check-line' : 'ri:file-copy-line'\"\n :label=\"copied ? $t('action.copied') : $t('action.copy')\"\n modifiers=\"action-quiet-small\"\n :title=\"$t('action.copy')\"\n class=\"shrink-0\"\n @click=\"copy(toolPart?.input?.content || '')\" />\n </div>\n <div class=\"px-sm py-10\">\n <PkCode\n v-if=\"isCodeType\"\n :code=\"toolPart?.input?.content\"\n :language=\"codeLanguage\" />\n <PkStreamingMarkdown\n v-else-if=\"isMarkdownType\"\n :markdown=\"toolPart?.input?.content\"\n class=\"wysiwyg text-word-2\" />\n <pre\n v-else\n class=\"text-word-2 whitespace-pre-wrap break-words\"\n :class=\"{\n italic:\n toolPart?.input?.artifactType === 'document' ||\n toolPart?.input?.artifactType === 'text',\n }\"\n >{{ toolPart?.input?.content }}</pre\n >\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useClipboard } from '@vueuse/core'\n import PkCode from './PkCode.vue'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n\n const { copy, copied } = useClipboard()\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title: string\n content: string\n artifactType: string\n language?: string\n }\n }\n return part\n })\n\n const artifactTypeLabel = computed(() => {\n const labels: Record<string, string> = {\n code: 'Code',\n document: 'Document',\n markdown: 'Markdown',\n json: 'JSON',\n xml: 'XML',\n csv: 'CSV',\n html: 'HTML',\n yaml: 'YAML',\n sql: 'SQL',\n text: 'Text',\n }\n if (!toolPart.value.input?.artifactType) {\n return 'Artifact'\n }\n return labels[toolPart.value.input.artifactType] || 'Artifact'\n })\n\n const languageLabel = computed(() => {\n if (!toolPart.value.input?.language) {\n return ''\n }\n return ` (${toolPart.value.input.language})`\n })\n\n const isCodeType = computed(() => {\n return (\n toolPart.value.input?.artifactType === 'code' ||\n toolPart.value.input?.artifactType === 'json' ||\n toolPart.value.input?.artifactType === 'xml' ||\n toolPart.value.input?.artifactType === 'yaml' ||\n toolPart.value.input?.artifactType === 'html' ||\n toolPart.value.input?.artifactType === 'sql'\n )\n })\n\n const isMarkdownType = computed(() => {\n return toolPart.value.input?.artifactType === 'markdown'\n })\n\n const codeLanguage = computed(() => {\n if (toolPart.value.input?.language) {\n return toolPart.value.input.language\n }\n // Map artifact types to highlight.js languages\n const languageMap: Record<string, string> = {\n json: 'json',\n xml: 'xml',\n yaml: 'yaml',\n html: 'html',\n sql: 'sql',\n }\n if (!toolPart.value.input?.artifactType) {\n return 'plaintext'\n }\n return languageMap[toolPart.value.input.artifactType] || 'plaintext'\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 font-bold bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex justify-between items-center\">\n <div class=\"flex flex-col items-start gap-4\">\n <span>{{ toolPart?.input?.title }}</span>\n <span class=\"text-10 opacity-60 font-normal\">\n {{ artifactTypeLabel }}{{ languageLabel }}\n </span>\n </div>\n <VvButton\n :icon=\"copied ? 'ri:check-line' : 'ri:file-copy-line'\"\n :label=\"copied ? $t('action.copied') : $t('action.copy')\"\n modifiers=\"action-quiet-small\"\n :title=\"$t('action.copy')\"\n class=\"shrink-0\"\n @click=\"copy(toolPart?.input?.content || '')\" />\n </div>\n <div class=\"px-sm py-10\">\n <PkCode\n v-if=\"isCodeType\"\n :code=\"toolPart?.input?.content\"\n :language=\"codeLanguage\" />\n <PkStreamingMarkdown\n v-else-if=\"isMarkdownType\"\n :markdown=\"toolPart?.input?.content\"\n class=\"wysiwyg text-word-2\" />\n <pre\n v-else\n class=\"text-word-2 whitespace-pre-wrap break-words\"\n :class=\"{\n italic:\n toolPart?.input?.artifactType === 'document' ||\n toolPart?.input?.artifactType === 'text',\n }\"\n >{{ toolPart?.input?.content }}</pre\n >\n </div>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"PkToolShowArtifact-BVFPfZT8.js","names":["$attrs","$t"],"sources":["../../../../packages/components/src/chat/PkCode.vue","../../../../packages/components/src/chat/PkCode.vue","../../../../packages/components/src/chat/PkToolShowArtifact.vue","../../../../packages/components/src/chat/PkToolShowArtifact.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, ref, watch } from 'vue'\n\n defineOptions({\n inheritAttrs: false,\n })\n\n const props = defineProps<{\n code: unknown\n language: string\n line?: boolean\n }>()\n\n const highlightedHtml = ref('')\n\n const hasCode = computed(() => {\n if (typeof props.code === 'string') {\n return props.code\n }\n return JSON.stringify(props.code, null, 2)\n })\n\n async function highlight() {\n const hljs = (await import('highlight.js/lib/common')).default\n try {\n const result = props.language\n ? hljs.highlight(hasCode.value, { language: props.language })\n : hljs.highlightAuto(hasCode.value)\n highlightedHtml.value = result.value\n } catch {\n highlightedHtml.value = hasCode.value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n }\n }\n\n watch(hasCode, highlight, { immediate: true })\n</script>\n\n<template>\n <pre\n :class=\"\n $attrs.class\n ? $attrs.class\n : 'font-mono leading-snug text-smaller bg-surface-1'\n \">\n <code :class=\"['hljs', line ? 'whitespace-pre-line' : 'whitespace-pre', language]\" v-html=\"highlightedHtml\"></code>\n </pre>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref, watch } from 'vue'\n\n defineOptions({\n inheritAttrs: false,\n })\n\n const props = defineProps<{\n code: unknown\n language: string\n line?: boolean\n }>()\n\n const highlightedHtml = ref('')\n\n const hasCode = computed(() => {\n if (typeof props.code === 'string') {\n return props.code\n }\n return JSON.stringify(props.code, null, 2)\n })\n\n async function highlight() {\n const hljs = (await import('highlight.js/lib/common')).default\n try {\n const result = props.language\n ? hljs.highlight(hasCode.value, { language: props.language })\n : hljs.highlightAuto(hasCode.value)\n highlightedHtml.value = result.value\n } catch {\n highlightedHtml.value = hasCode.value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n }\n }\n\n watch(hasCode, highlight, { immediate: true })\n</script>\n\n<template>\n <pre\n :class=\"\n $attrs.class\n ? $attrs.class\n : 'font-mono leading-snug text-smaller bg-surface-1'\n \">\n <code :class=\"['hljs', line ? 'whitespace-pre-line' : 'whitespace-pre', language]\" v-html=\"highlightedHtml\"></code>\n </pre>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useClipboard } from '@vueuse/core'\n import PkCode from './PkCode.vue'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n\n const { copy, copied } = useClipboard()\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title: string\n content: string\n artifactType: string\n language?: string\n }\n }\n return part\n })\n\n const artifactTypeLabel = computed(() => {\n const labels: Record<string, string> = {\n code: 'Code',\n document: 'Document',\n markdown: 'Markdown',\n json: 'JSON',\n xml: 'XML',\n csv: 'CSV',\n html: 'HTML',\n yaml: 'YAML',\n sql: 'SQL',\n text: 'Text',\n }\n if (!toolPart.value.input?.artifactType) {\n return 'Artifact'\n }\n return labels[toolPart.value.input.artifactType] || 'Artifact'\n })\n\n const languageLabel = computed(() => {\n if (!toolPart.value.input?.language) {\n return ''\n }\n return ` (${toolPart.value.input.language})`\n })\n\n const isCodeType = computed(() => {\n return (\n toolPart.value.input?.artifactType === 'code' ||\n toolPart.value.input?.artifactType === 'json' ||\n toolPart.value.input?.artifactType === 'xml' ||\n toolPart.value.input?.artifactType === 'yaml' ||\n toolPart.value.input?.artifactType === 'html' ||\n toolPart.value.input?.artifactType === 'sql'\n )\n })\n\n const isMarkdownType = computed(() => {\n return toolPart.value.input?.artifactType === 'markdown'\n })\n\n const codeLanguage = computed(() => {\n if (toolPart.value.input?.language) {\n return toolPart.value.input.language\n }\n // Map artifact types to highlight.js languages\n const languageMap: Record<string, string> = {\n json: 'json',\n xml: 'xml',\n yaml: 'yaml',\n html: 'html',\n sql: 'sql',\n }\n if (!toolPart.value.input?.artifactType) {\n return 'plaintext'\n }\n return languageMap[toolPart.value.input.artifactType] || 'plaintext'\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 font-bold bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex justify-between items-center\">\n <div class=\"flex flex-col items-start gap-4\">\n <span>{{ toolPart?.input?.title }}</span>\n <span class=\"text-10 opacity-60 font-normal\">\n {{ artifactTypeLabel }}{{ languageLabel }}\n </span>\n </div>\n <VvButton\n :icon=\"copied ? 'ri:check-line' : 'ri:file-copy-line'\"\n :label=\"copied ? $t('action.copied') : $t('action.copy')\"\n modifiers=\"action-quiet-small\"\n :title=\"$t('action.copy')\"\n class=\"shrink-0\"\n @click=\"copy(toolPart?.input?.content || '')\" />\n </div>\n <div class=\"px-sm py-10\">\n <PkCode\n v-if=\"isCodeType\"\n :code=\"toolPart?.input?.content\"\n :language=\"codeLanguage\" />\n <PkStreamingMarkdown\n v-else-if=\"isMarkdownType\"\n :markdown=\"toolPart?.input?.content\"\n class=\"wysiwyg text-word-2\" />\n <pre\n v-else\n class=\"text-word-2 whitespace-pre-wrap break-words\"\n :class=\"{\n italic:\n toolPart?.input?.artifactType === 'document' ||\n toolPart?.input?.artifactType === 'text',\n }\"\n >{{ toolPart?.input?.content }}</pre\n >\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useClipboard } from '@vueuse/core'\n import PkCode from './PkCode.vue'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n\n const { copy, copied } = useClipboard()\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title: string\n content: string\n artifactType: string\n language?: string\n }\n }\n return part\n })\n\n const artifactTypeLabel = computed(() => {\n const labels: Record<string, string> = {\n code: 'Code',\n document: 'Document',\n markdown: 'Markdown',\n json: 'JSON',\n xml: 'XML',\n csv: 'CSV',\n html: 'HTML',\n yaml: 'YAML',\n sql: 'SQL',\n text: 'Text',\n }\n if (!toolPart.value.input?.artifactType) {\n return 'Artifact'\n }\n return labels[toolPart.value.input.artifactType] || 'Artifact'\n })\n\n const languageLabel = computed(() => {\n if (!toolPart.value.input?.language) {\n return ''\n }\n return ` (${toolPart.value.input.language})`\n })\n\n const isCodeType = computed(() => {\n return (\n toolPart.value.input?.artifactType === 'code' ||\n toolPart.value.input?.artifactType === 'json' ||\n toolPart.value.input?.artifactType === 'xml' ||\n toolPart.value.input?.artifactType === 'yaml' ||\n toolPart.value.input?.artifactType === 'html' ||\n toolPart.value.input?.artifactType === 'sql'\n )\n })\n\n const isMarkdownType = computed(() => {\n return toolPart.value.input?.artifactType === 'markdown'\n })\n\n const codeLanguage = computed(() => {\n if (toolPart.value.input?.language) {\n return toolPart.value.input.language\n }\n // Map artifact types to highlight.js languages\n const languageMap: Record<string, string> = {\n json: 'json',\n xml: 'xml',\n yaml: 'yaml',\n html: 'html',\n sql: 'sql',\n }\n if (!toolPart.value.input?.artifactType) {\n return 'plaintext'\n }\n return languageMap[toolPart.value.input.artifactType] || 'plaintext'\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 font-bold bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex justify-between items-center\">\n <div class=\"flex flex-col items-start gap-4\">\n <span>{{ toolPart?.input?.title }}</span>\n <span class=\"text-10 opacity-60 font-normal\">\n {{ artifactTypeLabel }}{{ languageLabel }}\n </span>\n </div>\n <VvButton\n :icon=\"copied ? 'ri:check-line' : 'ri:file-copy-line'\"\n :label=\"copied ? $t('action.copied') : $t('action.copy')\"\n modifiers=\"action-quiet-small\"\n :title=\"$t('action.copy')\"\n class=\"shrink-0\"\n @click=\"copy(toolPart?.input?.content || '')\" />\n </div>\n <div class=\"px-sm py-10\">\n <PkCode\n v-if=\"isCodeType\"\n :code=\"toolPart?.input?.content\"\n :language=\"codeLanguage\" />\n <PkStreamingMarkdown\n v-else-if=\"isMarkdownType\"\n :markdown=\"toolPart?.input?.content\"\n class=\"wysiwyg text-word-2\" />\n <pre\n v-else\n class=\"text-word-2 whitespace-pre-wrap break-words\"\n :class=\"{\n italic:\n toolPart?.input?.artifactType === 'document' ||\n toolPart?.input?.artifactType === 'text',\n }\"\n >{{ toolPart?.input?.content }}</pre\n >\n </div>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { a as e } from "./useChatbotStore-BXi-Gx7b.js";
2
- import { n as t } from "./src-EtGd6cRz.js";
1
+ import { s as e } from "./useChatbotStore-DCCWlutT.js";
2
+ import { n as t } from "./src-DW4YojFN.js";
3
3
  import { VvButton as n, VvButtonGroup as r, VvDropdown as i, VvDropdownAction as a, VvIcon as o } from "@volverjs/ui-vue/components";
4
4
  import { computed as s, createCommentVNode as c, createElementBlock as l, createElementVNode as u, createTextVNode as d, createVNode as f, defineComponent as p, guardReactiveProps as m, normalizeProps as h, openBlock as g, toDisplayString as _, unref as v, withCtx as y } from "vue";
5
5
  import { useI18n as b } from "vue-i18n";
@@ -144,4 +144,4 @@ var S = {
144
144
  //#endregion
145
145
  export { R as n, z as t };
146
146
 
147
- //# sourceMappingURL=PkToolShowCalendarEvent-Q_2-tXmC.js.map
147
+ //# sourceMappingURL=PkToolShowCalendarEvent-9jaBqWBJ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PkToolShowCalendarEvent-Q_2-tXmC.js","names":["$t"],"sources":["../../../../packages/components/src/chat/PkToolShowCalendarEvent.vue","../../../../packages/components/src/chat/PkToolShowCalendarEvent.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { useClipboard } from '@vueuse/core'\n import { isSameSite } from 'utils'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const { copy, copied } = useClipboard()\n const { d } = useI18n()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title: string\n startDate: string\n endDate: string\n location?: string\n additionalInfo?: string\n allDay?: boolean\n }\n }\n return part\n })\n\n const dateDisplay = computed(() => {\n const input = toolPart.value.input\n if (!input) {\n return ''\n }\n const { startDate, endDate, allDay } = input\n const start = new Date(startDate)\n const end = new Date(endDate)\n const startDay = startDate.slice(0, 10)\n const endDay = endDate.slice(0, 10)\n if (allDay) {\n if (startDay === endDay) {\n return d(start, 'date-medium')\n }\n return `${d(start, 'date-medium')} - ${d(end, 'date-medium')}`\n }\n if (startDay === endDay) {\n return `${d(start, 'date-time-medium')} - ${d(end, 'time')}`\n }\n return `${d(start, 'date-time-medium')} - ${d(end, 'date-time-medium')}`\n })\n\n const calendarStart = computed(() =>\n toolPart.value.input ? new Date(toolPart.value.input.startDate) : null,\n )\n\n const calendarDay = computed(\n () => calendarStart.value?.getDate().toString() ?? '',\n )\n\n const calendarMonth = computed(() =>\n calendarStart.value ? d(calendarStart.value, 'month-short') : '',\n )\n\n // Floating time: remove dashes/colons without converting to UTC\n const toIcsDateTime = (iso: string) =>\n iso.replace(/[-:]/g, '').replace(/\\.\\d{3}$/, '')\n\n const escapeIcs = (str: string) =>\n str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/;/g, '\\\\;')\n .replace(/,/g, '\\\\,')\n .replace(/\\n/g, '\\\\n')\n\n const generateIcs = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const ics = [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n 'PRODID:-//8wave//8bot//EN',\n 'BEGIN:VEVENT',\n `DTSTART:${toIcsDateTime(startDate)}`,\n `DTEND:${toIcsDateTime(endDate)}`,\n `SUMMARY:${escapeIcs(title)}`,\n location ? `LOCATION:${escapeIcs(location)}` : '',\n additionalInfo ? `DESCRIPTION:${escapeIcs(additionalInfo)}` : '',\n `DTSTAMP:${new Date()\n .toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\.\\d{3}/, '')}`,\n `UID:${crypto.randomUUID()}@8bot.ai`,\n 'END:VEVENT',\n 'END:VCALENDAR',\n ]\n .filter(Boolean)\n .join('\\r\\n')\n\n const blob = new Blob([ics], { type: 'text/calendar;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${title.replace(/[^a-zA-Z0-9\\s-]/g, '')}.ics`\n a.click()\n URL.revokeObjectURL(url)\n }\n\n const openGoogleCalendar = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const start = toIcsDateTime(startDate)\n const end = toIcsDateTime(endDate)\n const params = new URLSearchParams({\n action: 'TEMPLATE',\n text: title,\n dates: `${start}/${end}`,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('details', additionalInfo)\n }\n window.open(\n `https://calendar.google.com/calendar/render?${params.toString()}`,\n '_blank',\n )\n }\n\n const openOutlook = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const params = new URLSearchParams({\n subject: title,\n startdt: startDate,\n enddt: endDate,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('body', additionalInfo)\n }\n window.open(\n `https://outlook.office.com/calendar/0/action/compose?${params.toString()}`,\n '_blank',\n )\n }\n\n const copyEvent = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const lines = [input.title, dateDisplay.value]\n if (input.location) {\n lines.push(input.location)\n }\n if (input.additionalInfo) {\n lines.push(input.additionalInfo)\n }\n copy(lines.join('\\n'))\n }\n</script>\n\n<template>\n <div\n v-if=\"toolPart?.input\"\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:calendar-event-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{ $t('label.calendarEvent') }}</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=\"copyEvent\" />\n <VvDropdown\n v-bind=\"{\n placement: 'bottom-end',\n modifiers: 'menu',\n flip: true,\n offset: 3,\n strategy: 'fixed',\n }\">\n <VvButton\n icon=\"ri:calendar-line\"\n modifiers=\"action-quiet-small\"\n :label=\"$t('action.addToCalendar')\" />\n <template #items>\n <VvDropdownAction @click=\"openGoogleCalendar\">\n <VvIcon name=\"ri:google-line\" />\n Google Calendar\n </VvDropdownAction>\n <VvDropdownAction @click=\"openOutlook\">\n <VvIcon name=\"ri:microsoft-line\" />\n Outlook\n </VvDropdownAction>\n <VvDropdownAction @click=\"generateIcs\">\n <VvIcon name=\"ri:download-line\" />\n {{ $t('action.downloadIcs') }}\n </VvDropdownAction>\n </template>\n </VvDropdown>\n </VvButtonGroup>\n </div>\n <div class=\"p-sm flex gap-sm items-start\">\n <div\n class=\"shrink-0 w-44 rounded-xl overflow-hidden border border-surface-3 text-center select-none\">\n <div\n class=\"bg-brand px-8 py-2 text-white text-10 font-bold uppercase tracking-wide\">\n {{ calendarMonth }}\n </div>\n <div\n class=\"bg-surface-1 py-4 text-word-1 text-24 font-bold leading-none\">\n {{ calendarDay }}\n </div>\n </div>\n <div class=\"flex flex-col gap-4 min-w-0\">\n <p class=\"font-semibold text-word-1 text-14\">\n {{ toolPart.input.title }}\n </p>\n <div class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:time-line\" class=\"text-14 shrink-0\" />\n <time :datetime=\"toolPart.input.startDate\">{{\n dateDisplay\n }}</time>\n </div>\n <div\n v-if=\"toolPart.input.location\"\n class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:map-pin-line\" class=\"text-14 shrink-0\" />\n <a\n v-if=\"toolPart.input.location.startsWith('http')\"\n :href=\"toolPart.input.location\"\n :target=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : '_blank'\n \"\n :rel=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : 'noopener noreferrer'\n \"\n class=\"underline truncate\">\n {{ toolPart.input.location }}\n </a>\n <span v-else>{{ toolPart.input.location }}</span>\n </div>\n <div\n v-if=\"toolPart.input.additionalInfo\"\n class=\"flex items-start gap-8 text-12 text-word-3\">\n <VvIcon\n name=\"ri:sticky-note-line\"\n class=\"text-14 shrink-0 mt-1\" />\n <span>{{ toolPart.input.additionalInfo }}</span>\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { useClipboard } from '@vueuse/core'\n import { isSameSite } from 'utils'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const { copy, copied } = useClipboard()\n const { d } = useI18n()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title: string\n startDate: string\n endDate: string\n location?: string\n additionalInfo?: string\n allDay?: boolean\n }\n }\n return part\n })\n\n const dateDisplay = computed(() => {\n const input = toolPart.value.input\n if (!input) {\n return ''\n }\n const { startDate, endDate, allDay } = input\n const start = new Date(startDate)\n const end = new Date(endDate)\n const startDay = startDate.slice(0, 10)\n const endDay = endDate.slice(0, 10)\n if (allDay) {\n if (startDay === endDay) {\n return d(start, 'date-medium')\n }\n return `${d(start, 'date-medium')} - ${d(end, 'date-medium')}`\n }\n if (startDay === endDay) {\n return `${d(start, 'date-time-medium')} - ${d(end, 'time')}`\n }\n return `${d(start, 'date-time-medium')} - ${d(end, 'date-time-medium')}`\n })\n\n const calendarStart = computed(() =>\n toolPart.value.input ? new Date(toolPart.value.input.startDate) : null,\n )\n\n const calendarDay = computed(\n () => calendarStart.value?.getDate().toString() ?? '',\n )\n\n const calendarMonth = computed(() =>\n calendarStart.value ? d(calendarStart.value, 'month-short') : '',\n )\n\n // Floating time: remove dashes/colons without converting to UTC\n const toIcsDateTime = (iso: string) =>\n iso.replace(/[-:]/g, '').replace(/\\.\\d{3}$/, '')\n\n const escapeIcs = (str: string) =>\n str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/;/g, '\\\\;')\n .replace(/,/g, '\\\\,')\n .replace(/\\n/g, '\\\\n')\n\n const generateIcs = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const ics = [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n 'PRODID:-//8wave//8bot//EN',\n 'BEGIN:VEVENT',\n `DTSTART:${toIcsDateTime(startDate)}`,\n `DTEND:${toIcsDateTime(endDate)}`,\n `SUMMARY:${escapeIcs(title)}`,\n location ? `LOCATION:${escapeIcs(location)}` : '',\n additionalInfo ? `DESCRIPTION:${escapeIcs(additionalInfo)}` : '',\n `DTSTAMP:${new Date()\n .toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\.\\d{3}/, '')}`,\n `UID:${crypto.randomUUID()}@8bot.ai`,\n 'END:VEVENT',\n 'END:VCALENDAR',\n ]\n .filter(Boolean)\n .join('\\r\\n')\n\n const blob = new Blob([ics], { type: 'text/calendar;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${title.replace(/[^a-zA-Z0-9\\s-]/g, '')}.ics`\n a.click()\n URL.revokeObjectURL(url)\n }\n\n const openGoogleCalendar = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const start = toIcsDateTime(startDate)\n const end = toIcsDateTime(endDate)\n const params = new URLSearchParams({\n action: 'TEMPLATE',\n text: title,\n dates: `${start}/${end}`,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('details', additionalInfo)\n }\n window.open(\n `https://calendar.google.com/calendar/render?${params.toString()}`,\n '_blank',\n )\n }\n\n const openOutlook = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const params = new URLSearchParams({\n subject: title,\n startdt: startDate,\n enddt: endDate,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('body', additionalInfo)\n }\n window.open(\n `https://outlook.office.com/calendar/0/action/compose?${params.toString()}`,\n '_blank',\n )\n }\n\n const copyEvent = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const lines = [input.title, dateDisplay.value]\n if (input.location) {\n lines.push(input.location)\n }\n if (input.additionalInfo) {\n lines.push(input.additionalInfo)\n }\n copy(lines.join('\\n'))\n }\n</script>\n\n<template>\n <div\n v-if=\"toolPart?.input\"\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:calendar-event-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{ $t('label.calendarEvent') }}</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=\"copyEvent\" />\n <VvDropdown\n v-bind=\"{\n placement: 'bottom-end',\n modifiers: 'menu',\n flip: true,\n offset: 3,\n strategy: 'fixed',\n }\">\n <VvButton\n icon=\"ri:calendar-line\"\n modifiers=\"action-quiet-small\"\n :label=\"$t('action.addToCalendar')\" />\n <template #items>\n <VvDropdownAction @click=\"openGoogleCalendar\">\n <VvIcon name=\"ri:google-line\" />\n Google Calendar\n </VvDropdownAction>\n <VvDropdownAction @click=\"openOutlook\">\n <VvIcon name=\"ri:microsoft-line\" />\n Outlook\n </VvDropdownAction>\n <VvDropdownAction @click=\"generateIcs\">\n <VvIcon name=\"ri:download-line\" />\n {{ $t('action.downloadIcs') }}\n </VvDropdownAction>\n </template>\n </VvDropdown>\n </VvButtonGroup>\n </div>\n <div class=\"p-sm flex gap-sm items-start\">\n <div\n class=\"shrink-0 w-44 rounded-xl overflow-hidden border border-surface-3 text-center select-none\">\n <div\n class=\"bg-brand px-8 py-2 text-white text-10 font-bold uppercase tracking-wide\">\n {{ calendarMonth }}\n </div>\n <div\n class=\"bg-surface-1 py-4 text-word-1 text-24 font-bold leading-none\">\n {{ calendarDay }}\n </div>\n </div>\n <div class=\"flex flex-col gap-4 min-w-0\">\n <p class=\"font-semibold text-word-1 text-14\">\n {{ toolPart.input.title }}\n </p>\n <div class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:time-line\" class=\"text-14 shrink-0\" />\n <time :datetime=\"toolPart.input.startDate\">{{\n dateDisplay\n }}</time>\n </div>\n <div\n v-if=\"toolPart.input.location\"\n class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:map-pin-line\" class=\"text-14 shrink-0\" />\n <a\n v-if=\"toolPart.input.location.startsWith('http')\"\n :href=\"toolPart.input.location\"\n :target=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : '_blank'\n \"\n :rel=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : 'noopener noreferrer'\n \"\n class=\"underline truncate\">\n {{ toolPart.input.location }}\n </a>\n <span v-else>{{ toolPart.input.location }}</span>\n </div>\n <div\n v-if=\"toolPart.input.additionalInfo\"\n class=\"flex items-start gap-8 text-12 text-word-3\">\n <VvIcon\n name=\"ri:sticky-note-line\"\n class=\"text-14 shrink-0 mt-1\" />\n <span>{{ toolPart.input.additionalInfo }}</span>\n </div>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"PkToolShowCalendarEvent-9jaBqWBJ.js","names":["$t"],"sources":["../../../../packages/components/src/chat/PkToolShowCalendarEvent.vue","../../../../packages/components/src/chat/PkToolShowCalendarEvent.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { useClipboard } from '@vueuse/core'\n import { isSameSite } from 'utils'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const { copy, copied } = useClipboard()\n const { d } = useI18n()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title: string\n startDate: string\n endDate: string\n location?: string\n additionalInfo?: string\n allDay?: boolean\n }\n }\n return part\n })\n\n const dateDisplay = computed(() => {\n const input = toolPart.value.input\n if (!input) {\n return ''\n }\n const { startDate, endDate, allDay } = input\n const start = new Date(startDate)\n const end = new Date(endDate)\n const startDay = startDate.slice(0, 10)\n const endDay = endDate.slice(0, 10)\n if (allDay) {\n if (startDay === endDay) {\n return d(start, 'date-medium')\n }\n return `${d(start, 'date-medium')} - ${d(end, 'date-medium')}`\n }\n if (startDay === endDay) {\n return `${d(start, 'date-time-medium')} - ${d(end, 'time')}`\n }\n return `${d(start, 'date-time-medium')} - ${d(end, 'date-time-medium')}`\n })\n\n const calendarStart = computed(() =>\n toolPart.value.input ? new Date(toolPart.value.input.startDate) : null,\n )\n\n const calendarDay = computed(\n () => calendarStart.value?.getDate().toString() ?? '',\n )\n\n const calendarMonth = computed(() =>\n calendarStart.value ? d(calendarStart.value, 'month-short') : '',\n )\n\n // Floating time: remove dashes/colons without converting to UTC\n const toIcsDateTime = (iso: string) =>\n iso.replace(/[-:]/g, '').replace(/\\.\\d{3}$/, '')\n\n const escapeIcs = (str: string) =>\n str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/;/g, '\\\\;')\n .replace(/,/g, '\\\\,')\n .replace(/\\n/g, '\\\\n')\n\n const generateIcs = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const ics = [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n 'PRODID:-//8wave//8bot//EN',\n 'BEGIN:VEVENT',\n `DTSTART:${toIcsDateTime(startDate)}`,\n `DTEND:${toIcsDateTime(endDate)}`,\n `SUMMARY:${escapeIcs(title)}`,\n location ? `LOCATION:${escapeIcs(location)}` : '',\n additionalInfo ? `DESCRIPTION:${escapeIcs(additionalInfo)}` : '',\n `DTSTAMP:${new Date()\n .toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\.\\d{3}/, '')}`,\n `UID:${crypto.randomUUID()}@8bot.ai`,\n 'END:VEVENT',\n 'END:VCALENDAR',\n ]\n .filter(Boolean)\n .join('\\r\\n')\n\n const blob = new Blob([ics], { type: 'text/calendar;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${title.replace(/[^a-zA-Z0-9\\s-]/g, '')}.ics`\n a.click()\n URL.revokeObjectURL(url)\n }\n\n const openGoogleCalendar = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const start = toIcsDateTime(startDate)\n const end = toIcsDateTime(endDate)\n const params = new URLSearchParams({\n action: 'TEMPLATE',\n text: title,\n dates: `${start}/${end}`,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('details', additionalInfo)\n }\n window.open(\n `https://calendar.google.com/calendar/render?${params.toString()}`,\n '_blank',\n )\n }\n\n const openOutlook = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const params = new URLSearchParams({\n subject: title,\n startdt: startDate,\n enddt: endDate,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('body', additionalInfo)\n }\n window.open(\n `https://outlook.office.com/calendar/0/action/compose?${params.toString()}`,\n '_blank',\n )\n }\n\n const copyEvent = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const lines = [input.title, dateDisplay.value]\n if (input.location) {\n lines.push(input.location)\n }\n if (input.additionalInfo) {\n lines.push(input.additionalInfo)\n }\n copy(lines.join('\\n'))\n }\n</script>\n\n<template>\n <div\n v-if=\"toolPart?.input\"\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:calendar-event-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{ $t('label.calendarEvent') }}</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=\"copyEvent\" />\n <VvDropdown\n v-bind=\"{\n placement: 'bottom-end',\n modifiers: 'menu',\n flip: true,\n offset: 3,\n strategy: 'fixed',\n }\">\n <VvButton\n icon=\"ri:calendar-line\"\n modifiers=\"action-quiet-small\"\n :label=\"$t('action.addToCalendar')\" />\n <template #items>\n <VvDropdownAction @click=\"openGoogleCalendar\">\n <VvIcon name=\"ri:google-line\" />\n Google Calendar\n </VvDropdownAction>\n <VvDropdownAction @click=\"openOutlook\">\n <VvIcon name=\"ri:microsoft-line\" />\n Outlook\n </VvDropdownAction>\n <VvDropdownAction @click=\"generateIcs\">\n <VvIcon name=\"ri:download-line\" />\n {{ $t('action.downloadIcs') }}\n </VvDropdownAction>\n </template>\n </VvDropdown>\n </VvButtonGroup>\n </div>\n <div class=\"p-sm flex gap-sm items-start\">\n <div\n class=\"shrink-0 w-44 rounded-xl overflow-hidden border border-surface-3 text-center select-none\">\n <div\n class=\"bg-brand px-8 py-2 text-white text-10 font-bold uppercase tracking-wide\">\n {{ calendarMonth }}\n </div>\n <div\n class=\"bg-surface-1 py-4 text-word-1 text-24 font-bold leading-none\">\n {{ calendarDay }}\n </div>\n </div>\n <div class=\"flex flex-col gap-4 min-w-0\">\n <p class=\"font-semibold text-word-1 text-14\">\n {{ toolPart.input.title }}\n </p>\n <div class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:time-line\" class=\"text-14 shrink-0\" />\n <time :datetime=\"toolPart.input.startDate\">{{\n dateDisplay\n }}</time>\n </div>\n <div\n v-if=\"toolPart.input.location\"\n class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:map-pin-line\" class=\"text-14 shrink-0\" />\n <a\n v-if=\"toolPart.input.location.startsWith('http')\"\n :href=\"toolPart.input.location\"\n :target=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : '_blank'\n \"\n :rel=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : 'noopener noreferrer'\n \"\n class=\"underline truncate\">\n {{ toolPart.input.location }}\n </a>\n <span v-else>{{ toolPart.input.location }}</span>\n </div>\n <div\n v-if=\"toolPart.input.additionalInfo\"\n class=\"flex items-start gap-8 text-12 text-word-3\">\n <VvIcon\n name=\"ri:sticky-note-line\"\n class=\"text-14 shrink-0 mt-1\" />\n <span>{{ toolPart.input.additionalInfo }}</span>\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useI18n } from 'vue-i18n'\n import { useClipboard } from '@vueuse/core'\n import { isSameSite } from 'utils'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const { copy, copied } = useClipboard()\n const { d } = useI18n()\n\n const toolPart = computed(() => {\n const part = props.part as {\n input?: {\n title: string\n startDate: string\n endDate: string\n location?: string\n additionalInfo?: string\n allDay?: boolean\n }\n }\n return part\n })\n\n const dateDisplay = computed(() => {\n const input = toolPart.value.input\n if (!input) {\n return ''\n }\n const { startDate, endDate, allDay } = input\n const start = new Date(startDate)\n const end = new Date(endDate)\n const startDay = startDate.slice(0, 10)\n const endDay = endDate.slice(0, 10)\n if (allDay) {\n if (startDay === endDay) {\n return d(start, 'date-medium')\n }\n return `${d(start, 'date-medium')} - ${d(end, 'date-medium')}`\n }\n if (startDay === endDay) {\n return `${d(start, 'date-time-medium')} - ${d(end, 'time')}`\n }\n return `${d(start, 'date-time-medium')} - ${d(end, 'date-time-medium')}`\n })\n\n const calendarStart = computed(() =>\n toolPart.value.input ? new Date(toolPart.value.input.startDate) : null,\n )\n\n const calendarDay = computed(\n () => calendarStart.value?.getDate().toString() ?? '',\n )\n\n const calendarMonth = computed(() =>\n calendarStart.value ? d(calendarStart.value, 'month-short') : '',\n )\n\n // Floating time: remove dashes/colons without converting to UTC\n const toIcsDateTime = (iso: string) =>\n iso.replace(/[-:]/g, '').replace(/\\.\\d{3}$/, '')\n\n const escapeIcs = (str: string) =>\n str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/;/g, '\\\\;')\n .replace(/,/g, '\\\\,')\n .replace(/\\n/g, '\\\\n')\n\n const generateIcs = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const ics = [\n 'BEGIN:VCALENDAR',\n 'VERSION:2.0',\n 'PRODID:-//8wave//8bot//EN',\n 'BEGIN:VEVENT',\n `DTSTART:${toIcsDateTime(startDate)}`,\n `DTEND:${toIcsDateTime(endDate)}`,\n `SUMMARY:${escapeIcs(title)}`,\n location ? `LOCATION:${escapeIcs(location)}` : '',\n additionalInfo ? `DESCRIPTION:${escapeIcs(additionalInfo)}` : '',\n `DTSTAMP:${new Date()\n .toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\.\\d{3}/, '')}`,\n `UID:${crypto.randomUUID()}@8bot.ai`,\n 'END:VEVENT',\n 'END:VCALENDAR',\n ]\n .filter(Boolean)\n .join('\\r\\n')\n\n const blob = new Blob([ics], { type: 'text/calendar;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${title.replace(/[^a-zA-Z0-9\\s-]/g, '')}.ics`\n a.click()\n URL.revokeObjectURL(url)\n }\n\n const openGoogleCalendar = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const start = toIcsDateTime(startDate)\n const end = toIcsDateTime(endDate)\n const params = new URLSearchParams({\n action: 'TEMPLATE',\n text: title,\n dates: `${start}/${end}`,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('details', additionalInfo)\n }\n window.open(\n `https://calendar.google.com/calendar/render?${params.toString()}`,\n '_blank',\n )\n }\n\n const openOutlook = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const { title, startDate, endDate, location, additionalInfo } = input\n const params = new URLSearchParams({\n subject: title,\n startdt: startDate,\n enddt: endDate,\n })\n if (location) {\n params.set('location', location)\n }\n if (additionalInfo) {\n params.set('body', additionalInfo)\n }\n window.open(\n `https://outlook.office.com/calendar/0/action/compose?${params.toString()}`,\n '_blank',\n )\n }\n\n const copyEvent = () => {\n const input = toolPart.value.input\n if (!input) {\n return\n }\n const lines = [input.title, dateDisplay.value]\n if (input.location) {\n lines.push(input.location)\n }\n if (input.additionalInfo) {\n lines.push(input.additionalInfo)\n }\n copy(lines.join('\\n'))\n }\n</script>\n\n<template>\n <div\n v-if=\"toolPart?.input\"\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:calendar-event-line\" class=\"text-16\" />\n <strong class=\"font-bold\">{{ $t('label.calendarEvent') }}</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=\"copyEvent\" />\n <VvDropdown\n v-bind=\"{\n placement: 'bottom-end',\n modifiers: 'menu',\n flip: true,\n offset: 3,\n strategy: 'fixed',\n }\">\n <VvButton\n icon=\"ri:calendar-line\"\n modifiers=\"action-quiet-small\"\n :label=\"$t('action.addToCalendar')\" />\n <template #items>\n <VvDropdownAction @click=\"openGoogleCalendar\">\n <VvIcon name=\"ri:google-line\" />\n Google Calendar\n </VvDropdownAction>\n <VvDropdownAction @click=\"openOutlook\">\n <VvIcon name=\"ri:microsoft-line\" />\n Outlook\n </VvDropdownAction>\n <VvDropdownAction @click=\"generateIcs\">\n <VvIcon name=\"ri:download-line\" />\n {{ $t('action.downloadIcs') }}\n </VvDropdownAction>\n </template>\n </VvDropdown>\n </VvButtonGroup>\n </div>\n <div class=\"p-sm flex gap-sm items-start\">\n <div\n class=\"shrink-0 w-44 rounded-xl overflow-hidden border border-surface-3 text-center select-none\">\n <div\n class=\"bg-brand px-8 py-2 text-white text-10 font-bold uppercase tracking-wide\">\n {{ calendarMonth }}\n </div>\n <div\n class=\"bg-surface-1 py-4 text-word-1 text-24 font-bold leading-none\">\n {{ calendarDay }}\n </div>\n </div>\n <div class=\"flex flex-col gap-4 min-w-0\">\n <p class=\"font-semibold text-word-1 text-14\">\n {{ toolPart.input.title }}\n </p>\n <div class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:time-line\" class=\"text-14 shrink-0\" />\n <time :datetime=\"toolPart.input.startDate\">{{\n dateDisplay\n }}</time>\n </div>\n <div\n v-if=\"toolPart.input.location\"\n class=\"flex items-center gap-8 text-12 text-word-3\">\n <VvIcon name=\"ri:map-pin-line\" class=\"text-14 shrink-0\" />\n <a\n v-if=\"toolPart.input.location.startsWith('http')\"\n :href=\"toolPart.input.location\"\n :target=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : '_blank'\n \"\n :rel=\"\n isSameSite(toolPart.input.location)\n ? undefined\n : 'noopener noreferrer'\n \"\n class=\"underline truncate\">\n {{ toolPart.input.location }}\n </a>\n <span v-else>{{ toolPart.input.location }}</span>\n </div>\n <div\n v-if=\"toolPart.input.additionalInfo\"\n class=\"flex items-start gap-8 text-12 text-word-3\">\n <VvIcon\n name=\"ri:sticky-note-line\"\n class=\"text-14 shrink-0 mt-1\" />\n <span>{{ toolPart.input.additionalInfo }}</span>\n </div>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { a as e } from "./useChatbotStore-BXi-Gx7b.js";
1
+ import { s as e } from "./useChatbotStore-DCCWlutT.js";
2
2
  import { VvButton as t, VvButtonGroup as n, VvIcon as r } from "@volverjs/ui-vue/components";
3
3
  import { Fragment as i, computed as a, createCommentVNode as o, createElementBlock as s, createElementVNode as c, createTextVNode as l, createVNode as u, defineComponent as d, normalizeClass as f, openBlock as p, renderList as m, toDisplayString as h, unref as g, withCtx as _ } from "vue";
4
4
  import { useClipboard as v } from "@vueuse/core";
@@ -62,4 +62,4 @@ var y = {
62
62
  //#endregion
63
63
  export { E as n, D as t };
64
64
 
65
- //# sourceMappingURL=PkToolShowComparison-BpYZb-z5.js.map
65
+ //# sourceMappingURL=PkToolShowComparison-D1YHzvyy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PkToolShowComparison-BpYZb-z5.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
+ {"version":3,"file":"PkToolShowComparison-D1YHzvyy.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"}