@8wave/ai-elements 0.119.0-beta.26 → 0.119.0-beta.30

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 (231) hide show
  1. package/dist/_chunks/{Agent-D8YrsP52.js → Agent-Gdgpd3LA.js} +66 -66
  2. package/dist/_chunks/Agent-Gdgpd3LA.js.map +1 -0
  3. package/dist/_chunks/{PkChatbotFilePreview-DAhN8TyL.js → PkChatbotFilePreview-DiuzVVKH.js} +2 -2
  4. package/dist/_chunks/{PkChatbotFilePreview-DAhN8TyL.js.map → PkChatbotFilePreview-DiuzVVKH.js.map} +1 -1
  5. package/dist/_chunks/{PkStreamingMarkdown-Bry3y6Ru.js → PkStreamingMarkdown-DKyHYHUN.js} +890 -853
  6. package/dist/_chunks/{PkStreamingMarkdown-Bry3y6Ru.js.map → PkStreamingMarkdown-DKyHYHUN.js.map} +1 -1
  7. package/dist/_chunks/{PkToolEditSpreadsheet-5vHzEy4P.js → PkToolEditSpreadsheet-CfJ3BWMe.js} +3 -3
  8. package/dist/_chunks/{PkToolEditSpreadsheet-5vHzEy4P.js.map → PkToolEditSpreadsheet-CfJ3BWMe.js.map} +1 -1
  9. package/dist/_chunks/{PkToolRequestGeolocation-Cj8hTfNF.js → PkToolRequestGeolocation-PxhQxMP1.js} +2 -2
  10. package/dist/_chunks/{PkToolRequestGeolocation-Cj8hTfNF.js.map → PkToolRequestGeolocation-PxhQxMP1.js.map} +1 -1
  11. package/dist/_chunks/{PkToolRequestOAuthConnection-BWxR1hV4.js → PkToolRequestOAuthConnection-klmrRZWz.js} +6 -5
  12. package/dist/_chunks/PkToolRequestOAuthConnection-klmrRZWz.js.map +1 -0
  13. package/dist/_chunks/{PkToolShowArtifact-CfJLe8vD.js → PkToolShowArtifact-ChDm6ZEK.js} +3 -3
  14. package/dist/_chunks/PkToolShowArtifact-ChDm6ZEK.js.map +1 -0
  15. package/dist/_chunks/{PkToolShowCalendarEvent-Bp_yv8S7.js → PkToolShowCalendarEvent-CRVtR3oP.js} +5 -4
  16. package/dist/_chunks/PkToolShowCalendarEvent-CRVtR3oP.js.map +1 -0
  17. package/dist/_chunks/{PkToolShowComparison-Bvd4f4tJ.js → PkToolShowComparison-DLC22e1W.js} +4 -3
  18. package/dist/_chunks/PkToolShowComparison-DLC22e1W.js.map +1 -0
  19. package/dist/_chunks/{PkToolShowContactForm--9XOVqNB.js → PkToolShowContactForm-CfCy-b8w.js} +6 -6
  20. package/dist/_chunks/PkToolShowContactForm-CfCy-b8w.js.map +1 -0
  21. package/dist/_chunks/{PkToolShowDiagram-C-pNbC9n.js → PkToolShowDiagram-JpRMa4Jj.js} +11 -10
  22. package/dist/_chunks/PkToolShowDiagram-JpRMa4Jj.js.map +1 -0
  23. package/dist/_chunks/{PkToolShowEmail-BKel_O29.js → PkToolShowEmail-C7mUCqGL.js} +4 -3
  24. package/dist/_chunks/PkToolShowEmail-C7mUCqGL.js.map +1 -0
  25. package/dist/_chunks/{PkToolShowForm-CGAc1O6K.js → PkToolShowForm-DnIwTGl4.js} +6 -5
  26. package/dist/_chunks/PkToolShowForm-DnIwTGl4.js.map +1 -0
  27. package/dist/_chunks/{PkToolShowImageGallery-CIhIrIcY.js → PkToolShowImageGallery-Ab8fJ9jY.js} +4 -4
  28. package/dist/_chunks/{PkToolShowImageGallery-CIhIrIcY.js.map → PkToolShowImageGallery-Ab8fJ9jY.js.map} +1 -1
  29. package/dist/_chunks/{PkToolShowLocation-78C7jFiV.js → PkToolShowLocation-D5d6bbP-.js} +5 -4
  30. package/dist/_chunks/PkToolShowLocation-D5d6bbP-.js.map +1 -0
  31. package/dist/_chunks/{PkToolShowMessage-BScy-w4J.js → PkToolShowMessage-vw4XS4TR.js} +4 -3
  32. package/dist/_chunks/PkToolShowMessage-vw4XS4TR.js.map +1 -0
  33. package/dist/_chunks/{PkToolShowProductList-BjWKnbyD.js → PkToolShowProductList-DztzZVDd.js} +2 -2
  34. package/dist/_chunks/{PkToolShowProductList-BjWKnbyD.js.map → PkToolShowProductList-DztzZVDd.js.map} +1 -1
  35. package/dist/_chunks/{PkToolShowQrCode-B70jPHDw.js → PkToolShowQrCode-BhcAUXSZ.js} +4 -3
  36. package/dist/_chunks/PkToolShowQrCode-BhcAUXSZ.js.map +1 -0
  37. package/dist/_chunks/{PkToolShowSources-BJ-XFrLD.js → PkToolShowSources-Bvg3f3GC.js} +52 -51
  38. package/dist/_chunks/PkToolShowSources-Bvg3f3GC.js.map +1 -0
  39. package/dist/_chunks/{PkToolShowSuggestedReply-0KahUIlw.js → PkToolShowSuggestedReply-BISQY1ce.js} +2 -2
  40. package/dist/_chunks/{PkToolShowSuggestedReply-0KahUIlw.js.map → PkToolShowSuggestedReply-BISQY1ce.js.map} +1 -1
  41. package/dist/_chunks/{PkToolShowVideo-_V_d-PDr.js → PkToolShowVideo-DdoYLl7R.js} +3 -3
  42. package/dist/_chunks/{PkToolShowVideo-_V_d-PDr.js.map → PkToolShowVideo-DdoYLl7R.js.map} +1 -1
  43. package/dist/_chunks/{PkToolShowWeather-DfLsFayn.js → PkToolShowWeather-CnpPZCLm.js} +2 -2
  44. package/dist/_chunks/{PkToolShowWeather-DfLsFayn.js.map → PkToolShowWeather-CnpPZCLm.js.map} +1 -1
  45. package/dist/_chunks/{PkToolShowWebPages-D55VEPjK.js → PkToolShowWebPages-BooCEJrs.js} +3 -3
  46. package/dist/_chunks/{PkToolShowWebPages-D55VEPjK.js.map → PkToolShowWebPages-BooCEJrs.js.map} +1 -1
  47. package/dist/_chunks/VvButtonLocalized-DV-zbH9b.js +21 -0
  48. package/dist/_chunks/VvButtonLocalized-DV-zbH9b.js.map +1 -0
  49. package/dist/_chunks/{chatImagePolicy-DXkhb-N_.js → chatImagePolicy-CfJt8_9Z.js} +3 -3
  50. package/dist/_chunks/{chatImagePolicy-DXkhb-N_.js.map → chatImagePolicy-CfJt8_9Z.js.map} +1 -1
  51. package/dist/_chunks/{index.es-BrsciU25.js → index.es-oI6RqNZW.js} +2 -2
  52. package/dist/_chunks/{index.es-BrsciU25.js.map → index.es-oI6RqNZW.js.map} +1 -1
  53. package/dist/_chunks/{markdown-DpoAzJSk.js → markdown-BbaLt57-.js} +8 -8
  54. package/dist/_chunks/{markdown-DpoAzJSk.js.map → markdown-BbaLt57-.js.map} +1 -1
  55. package/dist/_chunks/{src-Dt4rhhPN.js → src-DL9TKN-Z.js} +2 -2
  56. package/dist/_chunks/src-DL9TKN-Z.js.map +1 -0
  57. package/dist/_chunks/text-BHCGblDQ.js +6 -0
  58. package/dist/_chunks/text-BHCGblDQ.js.map +1 -0
  59. package/dist/_chunks/{useLightbox-pPBe746W.js → useLightbox-1KKLemEE.js} +2 -2
  60. package/dist/_chunks/{useLightbox-pPBe746W.js.map → useLightbox-1KKLemEE.js.map} +1 -1
  61. package/dist/ai-elements.es.js +2792 -2529
  62. package/dist/ai-elements.es.js.map +1 -1
  63. package/dist-vue/PkChatbot.js +1 -1
  64. package/dist-vue/PkChatbotAudioTranscript.js +1 -1
  65. package/dist-vue/PkChatbotAuth.js +1 -1
  66. package/dist-vue/PkChatbotEmptyState.js +1 -1
  67. package/dist-vue/PkChatbotError.js +1 -1
  68. package/dist-vue/PkChatbotFeedbackForm.js +1 -1
  69. package/dist-vue/PkChatbotFilePreview.js +1 -1
  70. package/dist-vue/PkChatbotInput.js +1 -1
  71. package/dist-vue/PkChatbotMessages.js +1 -1
  72. package/dist-vue/PkChatbotStepPayload.js +1 -1
  73. package/dist-vue/PkChatbotStepToolDetail.js +1 -1
  74. package/dist-vue/PkChatbotSteps.js +1 -1
  75. package/dist-vue/PkChatbotViewChat.js +1 -1
  76. package/dist-vue/PkChatbotViewConversations.js +1 -1
  77. package/dist-vue/PkChatbotViewFiles.js +1 -1
  78. package/dist-vue/PkChatbotViewProfile.js +1 -1
  79. package/dist-vue/PkChatbotWakeupBar.js +1 -1
  80. package/dist-vue/_chunks/{Agent-dGF8mkG9.js → Agent-DU1WWaHR.js} +87 -87
  81. package/dist-vue/_chunks/Agent-DU1WWaHR.js.map +1 -0
  82. package/dist-vue/_chunks/{Document-CV-RJu_p.js → Document-Cto-Qws0.js} +2 -2
  83. package/dist-vue/_chunks/{Document-CV-RJu_p.js.map → Document-Cto-Qws0.js.map} +1 -1
  84. package/dist-vue/_chunks/{PkChatbot-536vsOfp.js → PkChatbot-C18mnGJ9.js} +86 -85
  85. package/dist-vue/_chunks/PkChatbot-C18mnGJ9.js.map +1 -0
  86. package/dist-vue/_chunks/{PkChatbotAudioTranscript-BUxBHanA.js → PkChatbotAudioTranscript-0rvrhSRQ.js} +2 -2
  87. package/dist-vue/_chunks/{PkChatbotAudioTranscript-BUxBHanA.js.map → PkChatbotAudioTranscript-0rvrhSRQ.js.map} +1 -1
  88. package/dist-vue/_chunks/{PkChatbotAuth-BMLLTSwK.js → PkChatbotAuth-BVZzjbK9.js} +4 -3
  89. package/dist-vue/_chunks/PkChatbotAuth-BVZzjbK9.js.map +1 -0
  90. package/dist-vue/_chunks/{PkChatbotEmptyState-Toj4CqXV.js → PkChatbotEmptyState-BKiyP0Ga.js} +2 -2
  91. package/dist-vue/_chunks/{PkChatbotEmptyState-Toj4CqXV.js.map → PkChatbotEmptyState-BKiyP0Ga.js.map} +1 -1
  92. package/dist-vue/_chunks/{PkChatbotError-CRGbK09-.js → PkChatbotError-BV5ga7hk.js} +4 -3
  93. package/dist-vue/_chunks/PkChatbotError-BV5ga7hk.js.map +1 -0
  94. package/dist-vue/_chunks/{PkChatbotFeedbackForm-CMFXjoKR.js → PkChatbotFeedbackForm-B5cYsWBr.js} +8 -7
  95. package/dist-vue/_chunks/PkChatbotFeedbackForm-B5cYsWBr.js.map +1 -0
  96. package/dist-vue/_chunks/{PkChatbotFilePreview-DIP8KLkS.js → PkChatbotFilePreview-D5H-RIk2.js} +2 -2
  97. package/dist-vue/_chunks/{PkChatbotFilePreview-DIP8KLkS.js.map → PkChatbotFilePreview-D5H-RIk2.js.map} +1 -1
  98. package/dist-vue/_chunks/{PkChatbotInput-BfZqRpQ2.js → PkChatbotInput-GvgsYsUw.js} +8 -7
  99. package/dist-vue/_chunks/PkChatbotInput-GvgsYsUw.js.map +1 -0
  100. package/dist-vue/_chunks/PkChatbotMessages-CDLsj7qw.js +876 -0
  101. package/dist-vue/_chunks/PkChatbotMessages-CDLsj7qw.js.map +1 -0
  102. package/dist-vue/_chunks/{PkChatbotStepPayload-D0eoPBQ8.js → PkChatbotStepPayload-Dm-HCHcG.js} +2 -2
  103. package/dist-vue/_chunks/{PkChatbotStepPayload-D0eoPBQ8.js.map → PkChatbotStepPayload-Dm-HCHcG.js.map} +1 -1
  104. package/dist-vue/_chunks/{PkChatbotStepToolDetail-CMx4cw1D.js → PkChatbotStepToolDetail-Bpd_cZEO.js} +16 -16
  105. package/dist-vue/_chunks/{PkChatbotStepToolDetail-CMx4cw1D.js.map → PkChatbotStepToolDetail-Bpd_cZEO.js.map} +1 -1
  106. package/dist-vue/_chunks/{PkChatbotSteps-DeZQhGRU.js → PkChatbotSteps-C4qBM3_t.js} +40 -40
  107. package/dist-vue/_chunks/{PkChatbotSteps-DeZQhGRU.js.map → PkChatbotSteps-C4qBM3_t.js.map} +1 -1
  108. package/dist-vue/_chunks/{PkChatbotViewChat-CVT6OUIv.js → PkChatbotViewChat-By2TY72m.js} +13 -13
  109. package/dist-vue/_chunks/{PkChatbotViewChat-CVT6OUIv.js.map → PkChatbotViewChat-By2TY72m.js.map} +1 -1
  110. package/dist-vue/_chunks/PkChatbotViewConversations-CU5NfEO4.js +199 -0
  111. package/dist-vue/_chunks/PkChatbotViewConversations-CU5NfEO4.js.map +1 -0
  112. package/dist-vue/_chunks/{PkChatbotViewFiles-CA20TBFY.js → PkChatbotViewFiles-CD-UZPT5.js} +18 -17
  113. package/dist-vue/_chunks/PkChatbotViewFiles-CD-UZPT5.js.map +1 -0
  114. package/dist-vue/_chunks/{PkChatbotViewProfile-CyzRxE3D.js → PkChatbotViewProfile-DPlb_Wca.js} +11 -10
  115. package/dist-vue/_chunks/PkChatbotViewProfile-DPlb_Wca.js.map +1 -0
  116. package/dist-vue/_chunks/{PkChatbotWakeupBar-jBti21FQ.js → PkChatbotWakeupBar-Cjgarxnw.js} +3 -2
  117. package/dist-vue/_chunks/PkChatbotWakeupBar-Cjgarxnw.js.map +1 -0
  118. package/dist-vue/_chunks/{PkStreamingMarkdown-C55Fi0Pd.js → PkStreamingMarkdown-CsHzdW69.js} +24 -24
  119. package/dist-vue/_chunks/{PkStreamingMarkdown-C55Fi0Pd.js.map → PkStreamingMarkdown-CsHzdW69.js.map} +1 -1
  120. package/dist-vue/_chunks/{PkSvgViewer-Ts3gQ1hB.js → PkSvgViewer-D6DJ2jVO.js} +7 -6
  121. package/dist-vue/_chunks/PkSvgViewer-D6DJ2jVO.js.map +1 -0
  122. package/dist-vue/_chunks/{PkToolEditSpreadsheet-HAskd6d3.js → PkToolEditSpreadsheet-D8Zp9gzW.js} +3 -3
  123. package/dist-vue/_chunks/{PkToolEditSpreadsheet-HAskd6d3.js.map → PkToolEditSpreadsheet-D8Zp9gzW.js.map} +1 -1
  124. package/dist-vue/_chunks/{PkToolRequestGeolocation-BE22qwxB.js → PkToolRequestGeolocation-JZYgc-2X.js} +2 -2
  125. package/dist-vue/_chunks/{PkToolRequestGeolocation-BE22qwxB.js.map → PkToolRequestGeolocation-JZYgc-2X.js.map} +1 -1
  126. package/dist-vue/_chunks/{PkToolRequestOAuthConnection-GfSalEJG.js → PkToolRequestOAuthConnection-DosWR9I4.js} +11 -10
  127. package/dist-vue/_chunks/PkToolRequestOAuthConnection-DosWR9I4.js.map +1 -0
  128. package/dist-vue/_chunks/{PkToolShowArtifact-z1qTnFkA.js → PkToolShowArtifact-BVofKJ7b.js} +5 -5
  129. package/dist-vue/_chunks/PkToolShowArtifact-BVofKJ7b.js.map +1 -0
  130. package/dist-vue/_chunks/{PkToolShowCalendarEvent-Dv_rss26.js → PkToolShowCalendarEvent-u9O_Sl3-.js} +8 -7
  131. package/dist-vue/_chunks/PkToolShowCalendarEvent-u9O_Sl3-.js.map +1 -0
  132. package/dist-vue/_chunks/{PkToolShowComparison-DQs3E6-k.js → PkToolShowComparison-c2e239T4.js} +3 -2
  133. package/dist-vue/_chunks/PkToolShowComparison-c2e239T4.js.map +1 -0
  134. package/dist-vue/_chunks/{PkToolShowContactForm-Y0lrHXhr.js → PkToolShowContactForm-BzdIFTnC.js} +13 -13
  135. package/dist-vue/_chunks/PkToolShowContactForm-BzdIFTnC.js.map +1 -0
  136. package/dist-vue/_chunks/{PkToolShowDiagram-7WxDObZ6.js → PkToolShowDiagram-CaoB4k6y.js} +11 -10
  137. package/dist-vue/_chunks/PkToolShowDiagram-CaoB4k6y.js.map +1 -0
  138. package/dist-vue/_chunks/{PkToolShowEmail-C591LR5N.js → PkToolShowEmail-CUgZN0J5.js} +8 -7
  139. package/dist-vue/_chunks/PkToolShowEmail-CUgZN0J5.js.map +1 -0
  140. package/dist-vue/_chunks/{PkToolShowForm-CZFWZub7.js → PkToolShowForm-vYuaPtu0.js} +14 -13
  141. package/dist-vue/_chunks/PkToolShowForm-vYuaPtu0.js.map +1 -0
  142. package/dist-vue/_chunks/{PkToolShowImageGallery-CkfXP_lD.js → PkToolShowImageGallery-ooygXk7j.js} +4 -4
  143. package/dist-vue/_chunks/{PkToolShowImageGallery-CkfXP_lD.js.map → PkToolShowImageGallery-ooygXk7j.js.map} +1 -1
  144. package/dist-vue/_chunks/{PkToolShowLocation-Dyz6h_0n.js → PkToolShowLocation-DVMpFdRk.js} +14 -13
  145. package/dist-vue/_chunks/PkToolShowLocation-DVMpFdRk.js.map +1 -0
  146. package/dist-vue/_chunks/{PkToolShowMessage-CbXERPHI.js → PkToolShowMessage-ATTN5Hac.js} +8 -7
  147. package/dist-vue/_chunks/PkToolShowMessage-ATTN5Hac.js.map +1 -0
  148. package/dist-vue/_chunks/{PkToolShowProductList-De-PtmD-.js → PkToolShowProductList-D-HJ9a_h.js} +2 -2
  149. package/dist-vue/_chunks/{PkToolShowProductList-De-PtmD-.js.map → PkToolShowProductList-D-HJ9a_h.js.map} +1 -1
  150. package/dist-vue/_chunks/{PkToolShowQrCode-DEAvfLFu.js → PkToolShowQrCode-D_5VUtEB.js} +3 -2
  151. package/dist-vue/_chunks/PkToolShowQrCode-D_5VUtEB.js.map +1 -0
  152. package/dist-vue/_chunks/{PkToolShowSources-CSN7S0zo.js → PkToolShowSources-DJ35l3Z3.js} +58 -57
  153. package/dist-vue/_chunks/PkToolShowSources-DJ35l3Z3.js.map +1 -0
  154. package/dist-vue/_chunks/{PkToolShowSuggestedReply-DjutyiEi.js → PkToolShowSuggestedReply-I6FBos-F.js} +2 -2
  155. package/dist-vue/_chunks/{PkToolShowSuggestedReply-DjutyiEi.js.map → PkToolShowSuggestedReply-I6FBos-F.js.map} +1 -1
  156. package/dist-vue/_chunks/{PkToolShowVideo-B_Q93E2y.js → PkToolShowVideo-xcg1gdIE.js} +3 -3
  157. package/dist-vue/_chunks/{PkToolShowVideo-B_Q93E2y.js.map → PkToolShowVideo-xcg1gdIE.js.map} +1 -1
  158. package/dist-vue/_chunks/{PkToolShowWeather-BOuNrvY2.js → PkToolShowWeather-DJxKxVp_.js} +2 -2
  159. package/dist-vue/_chunks/{PkToolShowWeather-BOuNrvY2.js.map → PkToolShowWeather-DJxKxVp_.js.map} +1 -1
  160. package/dist-vue/_chunks/{PkToolShowWebPages-D3CdjJUc.js → PkToolShowWebPages-BuaRjavD.js} +3 -3
  161. package/dist-vue/_chunks/{PkToolShowWebPages-D3CdjJUc.js.map → PkToolShowWebPages-BuaRjavD.js.map} +1 -1
  162. package/dist-vue/_chunks/VvButtonLocalized-BuzLsXp3.js +20 -0
  163. package/dist-vue/_chunks/VvButtonLocalized-BuzLsXp3.js.map +1 -0
  164. package/dist-vue/_chunks/{createChatbotApiClient-DSLxswr4.js → createChatbotApiClient-G3Tt1I67.js} +18 -18
  165. package/dist-vue/_chunks/{createChatbotApiClient-DSLxswr4.js.map → createChatbotApiClient-G3Tt1I67.js.map} +1 -1
  166. package/dist-vue/_chunks/{mcpOAuthReport-BeZDTl87.js → mcpOAuthReport-3A9v_gW_.js} +2 -2
  167. package/dist-vue/_chunks/{mcpOAuthReport-BeZDTl87.js.map → mcpOAuthReport-3A9v_gW_.js.map} +1 -1
  168. package/dist-vue/_chunks/{src-DCfvejyT.js → src-DpkuiHam.js} +2 -2
  169. package/dist-vue/_chunks/src-DpkuiHam.js.map +1 -0
  170. package/dist-vue/_chunks/{useChatbotStore-rtl-oKqU.js → useChatbotStore-C1sgxgD1.js} +5 -5
  171. package/dist-vue/_chunks/{useChatbotStore-rtl-oKqU.js.map → useChatbotStore-C1sgxgD1.js.map} +1 -1
  172. package/dist-vue/_chunks/{useSafeLocalStorage-OwzVTZud.js → useSafeLocalStorage-DLIc8pkn.js} +2 -2
  173. package/dist-vue/_chunks/{useSafeLocalStorage-OwzVTZud.js.map → useSafeLocalStorage-DLIc8pkn.js.map} +1 -1
  174. package/dist-vue/_chunks/{utils-CwIMEuAv.js → utils-DsnEcdW3.js} +143 -79
  175. package/dist-vue/_chunks/utils-DsnEcdW3.js.map +1 -0
  176. package/dist-vue/api.js +1 -1
  177. package/dist-vue/composables.js +279 -27
  178. package/dist-vue/composables.js.map +1 -1
  179. package/dist-vue/index.js +3909 -3881
  180. package/dist-vue/index.js.map +1 -1
  181. package/dist-vue/locales.js +42 -6
  182. package/dist-vue/packages/components/src/PkEditorMarkdown.d.ts +3 -2
  183. package/dist-vue/packages/components/src/VvButtonLocalized.d.ts +11 -0
  184. package/dist-vue/packages/components/src/chat/index.d.ts +1 -0
  185. package/dist-vue/packages/components/src/chat/utils.d.ts +30 -0
  186. package/dist-vue/packages/components/src/index.d.ts +1 -0
  187. package/package.json +1 -1
  188. package/dist/_chunks/Agent-D8YrsP52.js.map +0 -1
  189. package/dist/_chunks/PkToolRequestOAuthConnection-BWxR1hV4.js.map +0 -1
  190. package/dist/_chunks/PkToolShowArtifact-CfJLe8vD.js.map +0 -1
  191. package/dist/_chunks/PkToolShowCalendarEvent-Bp_yv8S7.js.map +0 -1
  192. package/dist/_chunks/PkToolShowComparison-Bvd4f4tJ.js.map +0 -1
  193. package/dist/_chunks/PkToolShowContactForm--9XOVqNB.js.map +0 -1
  194. package/dist/_chunks/PkToolShowDiagram-C-pNbC9n.js.map +0 -1
  195. package/dist/_chunks/PkToolShowEmail-BKel_O29.js.map +0 -1
  196. package/dist/_chunks/PkToolShowForm-CGAc1O6K.js.map +0 -1
  197. package/dist/_chunks/PkToolShowLocation-78C7jFiV.js.map +0 -1
  198. package/dist/_chunks/PkToolShowMessage-BScy-w4J.js.map +0 -1
  199. package/dist/_chunks/PkToolShowQrCode-B70jPHDw.js.map +0 -1
  200. package/dist/_chunks/PkToolShowSources-BJ-XFrLD.js.map +0 -1
  201. package/dist/_chunks/src-Dt4rhhPN.js.map +0 -1
  202. package/dist/_chunks/text-DbSEK8si.js +0 -6
  203. package/dist/_chunks/text-DbSEK8si.js.map +0 -1
  204. package/dist-vue/_chunks/Agent-dGF8mkG9.js.map +0 -1
  205. package/dist-vue/_chunks/PkChatbot-536vsOfp.js.map +0 -1
  206. package/dist-vue/_chunks/PkChatbotAuth-BMLLTSwK.js.map +0 -1
  207. package/dist-vue/_chunks/PkChatbotError-CRGbK09-.js.map +0 -1
  208. package/dist-vue/_chunks/PkChatbotFeedbackForm-CMFXjoKR.js.map +0 -1
  209. package/dist-vue/_chunks/PkChatbotInput-BfZqRpQ2.js.map +0 -1
  210. package/dist-vue/_chunks/PkChatbotMessages-CnI3e9wF.js +0 -869
  211. package/dist-vue/_chunks/PkChatbotMessages-CnI3e9wF.js.map +0 -1
  212. package/dist-vue/_chunks/PkChatbotViewConversations-DHeFtAfN.js +0 -197
  213. package/dist-vue/_chunks/PkChatbotViewConversations-DHeFtAfN.js.map +0 -1
  214. package/dist-vue/_chunks/PkChatbotViewFiles-CA20TBFY.js.map +0 -1
  215. package/dist-vue/_chunks/PkChatbotViewProfile-CyzRxE3D.js.map +0 -1
  216. package/dist-vue/_chunks/PkChatbotWakeupBar-jBti21FQ.js.map +0 -1
  217. package/dist-vue/_chunks/PkSvgViewer-Ts3gQ1hB.js.map +0 -1
  218. package/dist-vue/_chunks/PkToolRequestOAuthConnection-GfSalEJG.js.map +0 -1
  219. package/dist-vue/_chunks/PkToolShowArtifact-z1qTnFkA.js.map +0 -1
  220. package/dist-vue/_chunks/PkToolShowCalendarEvent-Dv_rss26.js.map +0 -1
  221. package/dist-vue/_chunks/PkToolShowComparison-DQs3E6-k.js.map +0 -1
  222. package/dist-vue/_chunks/PkToolShowContactForm-Y0lrHXhr.js.map +0 -1
  223. package/dist-vue/_chunks/PkToolShowDiagram-7WxDObZ6.js.map +0 -1
  224. package/dist-vue/_chunks/PkToolShowEmail-C591LR5N.js.map +0 -1
  225. package/dist-vue/_chunks/PkToolShowForm-CZFWZub7.js.map +0 -1
  226. package/dist-vue/_chunks/PkToolShowLocation-Dyz6h_0n.js.map +0 -1
  227. package/dist-vue/_chunks/PkToolShowMessage-CbXERPHI.js.map +0 -1
  228. package/dist-vue/_chunks/PkToolShowQrCode-DEAvfLFu.js.map +0 -1
  229. package/dist-vue/_chunks/PkToolShowSources-CSN7S0zo.js.map +0 -1
  230. package/dist-vue/_chunks/src-DCfvejyT.js.map +0 -1
  231. package/dist-vue/_chunks/utils-CwIMEuAv.js.map +0 -1
@@ -1,10 +1,11 @@
1
1
  import { t as e } from "./rolldown-runtime-Dy4uBu1J.js";
2
- import { i as t } from "./Document-CV-RJu_p.js";
3
- import { t as n } from "./PkStreamingMarkdown-C55Fi0Pd.js";
4
- import "./src-DCfvejyT.js";
5
- import { t as r } from "./markdown-CCMpGUA7.js";
6
- import { t as i } from "./PkUrl-CN1kkZiH.js";
7
- import { VvButton as a, VvIcon as o } from "@volverjs/ui-vue/components";
2
+ import { i as t } from "./Document-Cto-Qws0.js";
3
+ import { t as n } from "./VvButtonLocalized-BuzLsXp3.js";
4
+ import { t as r } from "./PkStreamingMarkdown-CsHzdW69.js";
5
+ import "./src-DpkuiHam.js";
6
+ import { t as i } from "./markdown-CCMpGUA7.js";
7
+ import { t as a } from "./PkUrl-CN1kkZiH.js";
8
+ import { VvIcon as o } from "@volverjs/ui-vue/components";
8
9
  import { Fragment as s, Transition as c, computed as l, createBlock as u, createCommentVNode as d, createElementBlock as f, createElementVNode as p, createTextVNode as m, createVNode as h, defineComponent as g, normalizeClass as _, openBlock as v, reactive as y, ref as b, renderList as x, toDisplayString as S, unref as C, withCtx as w } from "vue";
9
10
  //#region ../../packages/components/src/chat/PkChunkPreview.vue?vue&type=script&setup=true&lang.ts
10
11
  var T = ["title"], E = {
@@ -24,7 +25,7 @@ var T = ["title"], E = {
24
25
  let e = t.maxSimilarity && t.maxSimilarity > 0 ? t.maxSimilarity : 1;
25
26
  return Math.round(t.similarity / e * 100);
26
27
  });
27
- return (t, i) => {
28
+ return (t, r) => {
28
29
  let a = o;
29
30
  return v(), f(s, null, [
30
31
  h(a, {
@@ -34,7 +35,7 @@ var T = ["title"], E = {
34
35
  p("span", {
35
36
  class: "text-10 text-word-2 truncate flex-1",
36
37
  title: e.content
37
- }, S(C(r)(e.content)), 9, T),
38
+ }, S(C(i)(e.content)), 9, T),
38
39
  n.value == null ? d("", !0) : (v(), f("span", E, S(n.value) + "% ", 1)),
39
40
  h(a, {
40
41
  name: e.expanded ? "ri:arrow-up-s-line" : "ri:arrow-down-s-line",
@@ -60,17 +61,17 @@ var T = ["title"], E = {
60
61
  },
61
62
  setup(e) {
62
63
  return (n, r) => {
63
- let a = o;
64
- return v(), f(s, null, [h(a, {
64
+ let i = o;
65
+ return v(), f(s, null, [h(i, {
65
66
  name: C(t)(e.type),
66
67
  class: "shrink-0 text-14 text-word-3"
67
68
  }, null, 8, ["name"]), p("div", O, [
68
69
  p("strong", k, S(e.name), 1),
69
70
  e.filename ? (v(), f("span", A, S(e.filename), 1)) : d("", !0),
70
- e.url ? (v(), f("span", j, [h(a, {
71
+ e.url ? (v(), f("span", j, [h(i, {
71
72
  name: "ri:link",
72
73
  class: "shrink-0 text-10"
73
- }), h(i, {
74
+ }), h(a, {
74
75
  url: e.url,
75
76
  muted: e.mutedUrl
76
77
  }, null, 8, ["url", "muted"])])) : d("", !0)
@@ -97,9 +98,9 @@ var T = ["title"], E = {
97
98
  onDownload: { type: Function }
98
99
  },
99
100
  setup(e) {
100
- let t = e, r = l(() => t.part), i = l(() => r.value.input?.sources || []), g = l(() => {
101
+ let t = e, i = l(() => t.part), a = l(() => i.value.input?.sources || []), g = l(() => {
101
102
  let e = /* @__PURE__ */ new Map();
102
- for (let t of i.value) {
103
+ for (let t of a.value) {
103
104
  let n = e.get(t.documentId);
104
105
  n ? n.chunks.push(t) : e.set(t.documentId, {
105
106
  document: t,
@@ -107,7 +108,7 @@ var T = ["title"], E = {
107
108
  });
108
109
  }
109
110
  return [...e.values()];
110
- }), C = l(() => Math.max(...i.value.map((e) => e.similarity ?? 0), 0)), T = y(/* @__PURE__ */ new Set()), E = y(/* @__PURE__ */ new Set()), O = y(/* @__PURE__ */ new Map()), k = y(/* @__PURE__ */ new Set()), A = (e) => {
111
+ }), C = l(() => Math.max(...a.value.map((e) => e.similarity ?? 0), 0)), T = y(/* @__PURE__ */ new Set()), E = y(/* @__PURE__ */ new Set()), O = y(/* @__PURE__ */ new Map()), k = y(/* @__PURE__ */ new Set()), A = (e) => {
111
112
  T.has(e) ? T.delete(e) : T.add(e);
112
113
  }, j = (e) => {
113
114
  E.has(e) ? E.delete(e) : E.add(e);
@@ -127,9 +128,9 @@ var T = ["title"], E = {
127
128
  }, Q = (e) => {
128
129
  O.delete(e);
129
130
  }, $ = b(!1), ee = l(() => $.value ? g.value : g.value.slice(0, 3)), te = l(() => g.value.length > 3);
130
- return (t, r) => {
131
- let l = o, y = a;
132
- return i.value.length ? (v(), f("div", N, [
131
+ return (t, i) => {
132
+ let l = o, y = n;
133
+ return a.value.length ? (v(), f("div", N, [
133
134
  p("div", P, [
134
135
  h(l, {
135
136
  name: "ri:article-line",
@@ -138,19 +139,19 @@ var T = ["title"], E = {
138
139
  m(" " + S(t.$t("label.sources")) + " ", 1),
139
140
  p("span", F, " (" + S(g.value.length) + ") ", 1)
140
141
  ]),
141
- p("ul", I, [(v(!0), f(s, null, x(ee.value, (r) => (v(), f("li", {
142
- key: r.document.documentId,
142
+ p("ul", I, [(v(!0), f(s, null, x(ee.value, (n) => (v(), f("li", {
143
+ key: n.document.documentId,
143
144
  class: "border border-surface-3 rounded-xl overflow-hidden"
144
145
  }, [p("div", L, [p("button", {
145
146
  type: "button",
146
147
  class: "flex items-center gap-8 p-8 flex-1 min-w-0 text-left cursor-pointer",
147
- "aria-expanded": T.has(r.document.documentId),
148
- onClick: (e) => A(r.document.documentId)
148
+ "aria-expanded": T.has(n.document.documentId),
149
+ onClick: (e) => A(n.document.documentId)
149
150
  }, [h(M, {
150
- type: r.document.documentType,
151
- name: r.document.documentName,
152
- url: r.document.sourceUrl,
153
- filename: r.document.sourceFilename,
151
+ type: n.document.documentType,
152
+ name: n.document.documentName,
153
+ url: n.document.sourceUrl,
154
+ filename: n.document.sourceFilename,
154
155
  "muted-url": ""
155
156
  }, null, 8, [
156
157
  "type",
@@ -158,18 +159,18 @@ var T = ["title"], E = {
158
159
  "url",
159
160
  "filename"
160
161
  ]), p("div", z, [
161
- r.chunks.length > 1 ? (v(), f("span", B, S(r.chunks.length), 1)) : d("", !0),
162
- p("span", V, S(r.document.language), 1),
162
+ n.chunks.length > 1 ? (v(), f("span", B, S(n.chunks.length), 1)) : d("", !0),
163
+ p("span", V, S(n.document.language), 1),
163
164
  h(l, {
164
- name: T.has(r.document.documentId) ? "ri:arrow-up-s-line" : "ri:arrow-down-s-line",
165
+ name: T.has(n.document.documentId) ? "ri:arrow-up-s-line" : "ri:arrow-down-s-line",
165
166
  class: "text-16 text-word-3"
166
167
  }, null, 8, ["name"])
167
- ])], 8, R), r.document.sourceUrl ? (v(), u(y, {
168
+ ])], 8, R), n.document.sourceUrl ? (v(), u(y, {
168
169
  key: 0,
169
170
  modifiers: "action-quiet-small",
170
171
  icon: "ri:external-link-line",
171
172
  class: "text-10 shrink-0 mr-8",
172
- href: r.document.sourceUrl,
173
+ href: n.document.sourceUrl,
173
174
  target: "_blank",
174
175
  rel: "noopener noreferrer",
175
176
  title: t.$t("action.open"),
@@ -178,57 +179,57 @@ var T = ["title"], E = {
178
179
  "href",
179
180
  "title",
180
181
  "aria-label"
181
- ])) : d("", !0)]), T.has(r.document.documentId) ? (v(), f("div", H, [r.document.sourceDescription ? (v(), u(n, {
182
+ ])) : d("", !0)]), T.has(n.document.documentId) ? (v(), f("div", H, [n.document.sourceDescription ? (v(), u(r, {
182
183
  key: 0,
183
- markdown: r.document.sourceDescription,
184
+ markdown: n.document.sourceDescription,
184
185
  class: "px-8 py-4 text-10 text-word-3 bg-surface-1 border-b border-surface-3"
185
- }, null, 8, ["markdown"])) : d("", !0), (v(!0), f(s, null, x(r.chunks, (r) => (v(), f("div", {
186
- key: r.chunkId,
186
+ }, null, 8, ["markdown"])) : d("", !0), (v(!0), f(s, null, x(n.chunks, (n) => (v(), f("div", {
187
+ key: n.chunkId,
187
188
  class: "border-b border-surface-3 last:border-b-0"
188
189
  }, [p("button", {
189
190
  class: "flex items-center gap-8 px-8 py-6 w-full text-left hover:bg-surface-1 transition-colors cursor-pointer",
190
- onClick: (e) => j(r.chunkId)
191
+ onClick: (e) => j(n.chunkId)
191
192
  }, [h(D, {
192
- content: r.content,
193
- similarity: r.similarity,
193
+ content: n.content,
194
+ similarity: n.similarity,
194
195
  "max-similarity": C.value,
195
- expanded: E.has(r.chunkId)
196
+ expanded: E.has(n.chunkId)
196
197
  }, null, 8, [
197
198
  "content",
198
199
  "similarity",
199
200
  "max-similarity",
200
201
  "expanded"
201
- ])], 8, U), E.has(r.chunkId) ? (v(), f("div", W, [p("div", G, [h(c, { mode: "out-in" }, {
202
- default: w(() => [O.has(r.chunkId) ? (v(), u(n, {
202
+ ])], 8, U), E.has(n.chunkId) ? (v(), f("div", W, [p("div", G, [h(c, { mode: "out-in" }, {
203
+ default: w(() => [O.has(n.chunkId) ? (v(), u(r, {
203
204
  key: 0,
204
- markdown: O.get(r.chunkId),
205
+ markdown: O.get(n.chunkId),
205
206
  class: "wysiwyg"
206
- }, null, 8, ["markdown"])) : (v(), u(n, {
207
+ }, null, 8, ["markdown"])) : (v(), u(r, {
207
208
  key: 1,
208
- markdown: r.content,
209
+ markdown: n.content,
209
210
  class: "wysiwyg"
210
211
  }, null, 8, ["markdown"]))]),
211
212
  _: 2
212
213
  }, 1024)]), p("div", K, [
213
- e.onExpandContext && r.chunkIndex != null && !O.has(r.chunkId) ? (v(), f("button", {
214
+ e.onExpandContext && n.chunkIndex != null && !O.has(n.chunkId) ? (v(), f("button", {
214
215
  key: 0,
215
216
  class: "text-10 text-word-3 hover:text-word flex items-center gap-4 cursor-pointer",
216
- disabled: k.has(r.chunkId),
217
- onClick: (e) => Z(r)
217
+ disabled: k.has(n.chunkId),
218
+ onClick: (e) => Z(n)
218
219
  }, [h(l, {
219
- name: k.has(r.chunkId) ? "loading-loop" : "ri:expand-up-down-line",
220
+ name: k.has(n.chunkId) ? "loading-loop" : "ri:expand-up-down-line",
220
221
  class: "text-12"
221
- }, null, 8, ["name"]), m(" " + S(t.$t("label.expandContext")), 1)], 8, q)) : O.has(r.chunkId) ? (v(), f("button", {
222
+ }, null, 8, ["name"]), m(" " + S(t.$t("label.expandContext")), 1)], 8, q)) : O.has(n.chunkId) ? (v(), f("button", {
222
223
  key: 1,
223
224
  class: "text-10 text-word-3 hover:text-word-1 flex items-center gap-4 cursor-pointer",
224
- onClick: (e) => Q(r.chunkId)
225
+ onClick: (e) => Q(n.chunkId)
225
226
  }, [h(l, {
226
227
  name: "ri:collapse-vertical-line",
227
228
  class: "text-12"
228
229
  }), m(" " + S(t.$t("label.collapseContext")), 1)], 8, J)) : d("", !0),
229
- r.sourceUrl ? (v(), f("a", {
230
+ n.sourceUrl ? (v(), f("a", {
230
231
  key: 2,
231
- href: r.sourceUrl,
232
+ href: n.sourceUrl,
232
233
  target: "_blank",
233
234
  rel: "noopener noreferrer",
234
235
  class: "text-10 text-word-3 hover:text-word-1 flex items-center gap-4 ml-auto"
@@ -236,10 +237,10 @@ var T = ["title"], E = {
236
237
  name: "ri:external-link-line",
237
238
  class: "text-12"
238
239
  }), m(" " + S(t.$t("label.openSource")), 1)], 8, Y)) : d("", !0),
239
- e.onDownload && r.documentType === "file" ? (v(), f("button", {
240
+ e.onDownload && n.documentType === "file" ? (v(), f("button", {
240
241
  key: 3,
241
- class: _(["text-10 text-word-3 hover:text-word-1 flex items-center gap-4 cursor-pointer", { "ml-auto": !r.sourceUrl }]),
242
- onClick: (t) => e.onDownload(r.documentId)
242
+ class: _(["text-10 text-word-3 hover:text-word-1 flex items-center gap-4 cursor-pointer", { "ml-auto": !n.sourceUrl }]),
243
+ onClick: (t) => e.onDownload(n.documentId)
243
244
  }, [h(l, {
244
245
  name: "ri:download-line",
245
246
  class: "text-12"
@@ -248,7 +249,7 @@ var T = ["title"], E = {
248
249
  te.value ? (v(), f("button", {
249
250
  key: 0,
250
251
  class: "text-12 text-word-3 cursor-pointer hover:underline flex items-center gap-4 mx-auto",
251
- onClick: r[0] ||= (e) => $.value = !$.value
252
+ onClick: i[0] ||= (e) => $.value = !$.value
252
253
  }, [h(l, {
253
254
  name: $.value ? "ri:arrow-up-s-line" : "ri:arrow-down-s-line",
254
255
  class: "text-16"
@@ -260,4 +261,4 @@ var T = ["title"], E = {
260
261
  //#endregion
261
262
  export { D as i, Q as n, M as r, $ as t };
262
263
 
263
- //# sourceMappingURL=PkToolShowSources-CSN7S0zo.js.map
264
+ //# sourceMappingURL=PkToolShowSources-DJ35l3Z3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PkToolShowSources-DJ35l3Z3.js","names":["_hoisted_1","_hoisted_2","__unplugin_components_0","_openBlock","_createElementBlock","_Fragment","_createVNode","_createElementVNode","_toDisplayString","_unref","_createCommentVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","__unplugin_components_0","_openBlock","_createElementBlock","_Fragment","_createVNode","_unref","_createElementVNode","_toDisplayString","_createCommentVNode","PkUrl","_sfc_main","$t","__unplugin_components_0","__unplugin_components_1","_openBlock","_createElementBlock","_createElementVNode","_createVNode","_createTextVNode","_toDisplayString","_Fragment","_renderList","PkDocumentHeader","_createCommentVNode","_createBlock","PkStreamingMarkdown","PkChunkPreview","_Transition","_withCtx","_normalizeClass","_sfc_main","__exportAll","getTypeIcon","VvButtonLocalized","PkStreamingMarkdown_default","stripMarkdown","PkUrl_default","_hoisted_1$2","_hoisted_2$2","PkChunkPreview_default","defineComponent","props","__props","similarityPercent","computed","max","_component_VvIcon","VvIcon","openBlock","createElementBlock","Fragment","createVNode","createElementVNode","toDisplayString","unref","createCommentVNode","_hoisted_1$1","_hoisted_2$1","_hoisted_3$1","_hoisted_4$1","PkDocumentHeader_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","PkToolShowSources_vue_vue_type_script_setup_true_lang_default","toolPart","sources","groupedSources","groups","source","existing","maxSimilarity","s","expandedDocuments","reactive","expandedChunks","contextData","loadingContext","toggleDocument","documentId","toggleChunk","chunkId","handleExpandContext","content","clearContext","showMore","ref","visibleGroups","hasMore","_component_VvButton","createTextVNode","_ctx","renderList","group","createBlock","chunk","Transition","withCtx","normalizeClass","_cache","PkToolShowSources_exports","PkToolShowSources_default"],"sources":["../../../../packages/components/src/chat/PkChunkPreview.vue","../../../../packages/components/src/chat/PkChunkPreview.vue","../../../../packages/components/src/chat/PkDocumentHeader.vue","../../../../packages/components/src/chat/PkDocumentHeader.vue","../../../../packages/components/src/chat/PkToolShowSources.vue","../../../../packages/components/src/chat/PkToolShowSources.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { stripMarkdown } from 'utils'\n\n const props = defineProps<{\n content: string\n similarity?: number\n maxSimilarity?: number\n expanded: boolean\n }>()\n\n const similarityPercent = computed(() => {\n if (props.similarity == null) {\n return null\n }\n const max =\n props.maxSimilarity && props.maxSimilarity > 0\n ? props.maxSimilarity\n : 1\n return Math.round((props.similarity / max) * 100)\n })\n</script>\n\n<template>\n <VvIcon name=\"ri:text-snippet\" class=\"shrink-0 text-12 text-word-4\" />\n <span class=\"text-10 text-word-2 truncate flex-1\" :title=\"content\">\n {{ stripMarkdown(content) }}\n </span>\n <span v-if=\"similarityPercent != null\" class=\"text-10 text-word-4 shrink-0\">\n {{ similarityPercent }}%\n </span>\n <VvIcon\n :name=\"expanded ? 'ri:arrow-up-s-line' : 'ri:arrow-down-s-line'\"\n class=\"text-14 text-word-4 shrink-0\" />\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { stripMarkdown } from 'utils'\n\n const props = defineProps<{\n content: string\n similarity?: number\n maxSimilarity?: number\n expanded: boolean\n }>()\n\n const similarityPercent = computed(() => {\n if (props.similarity == null) {\n return null\n }\n const max =\n props.maxSimilarity && props.maxSimilarity > 0\n ? props.maxSimilarity\n : 1\n return Math.round((props.similarity / max) * 100)\n })\n</script>\n\n<template>\n <VvIcon name=\"ri:text-snippet\" class=\"shrink-0 text-12 text-word-4\" />\n <span class=\"text-10 text-word-2 truncate flex-1\" :title=\"content\">\n {{ stripMarkdown(content) }}\n </span>\n <span v-if=\"similarityPercent != null\" class=\"text-10 text-word-4 shrink-0\">\n {{ similarityPercent }}%\n </span>\n <VvIcon\n :name=\"expanded ? 'ri:arrow-up-s-line' : 'ri:arrow-down-s-line'\"\n class=\"text-14 text-word-4 shrink-0\" />\n</template>\n","<script setup lang=\"ts\">\n import type { DocumentType } from 'models'\n import { getTypeIcon } from 'models'\n import PkUrl from '../PkUrl.vue'\n\n defineProps<{\n type: string\n name: string\n url?: string\n filename?: string\n /**\n * The address as text, not a link: for a header drawn inside a button,\n * where a link is invalid HTML and its click also toggles the row\n */\n mutedUrl?: boolean\n }>()\n</script>\n\n<template>\n <VvIcon\n :name=\"getTypeIcon(type as DocumentType)\"\n class=\"shrink-0 text-14 text-word-3\" />\n <div class=\"flex flex-col gap-2 min-w-0 flex-1\">\n <strong class=\"font-bold text-12 text-word-1 truncate block\">\n {{ name }}\n </strong>\n <span v-if=\"filename\" class=\"text-10 text-word-4 truncate\">\n {{ filename }}\n </span>\n <span\n v-if=\"url\"\n class=\"text-10 text-word-4 truncate flex items-center gap-4\">\n <VvIcon name=\"ri:link\" class=\"shrink-0 text-10\" />\n <PkUrl :url=\"url\" :muted=\"mutedUrl\" />\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type { DocumentType } from 'models'\n import { getTypeIcon } from 'models'\n import PkUrl from '../PkUrl.vue'\n\n defineProps<{\n type: string\n name: string\n url?: string\n filename?: string\n /**\n * The address as text, not a link: for a header drawn inside a button,\n * where a link is invalid HTML and its click also toggles the row\n */\n mutedUrl?: boolean\n }>()\n</script>\n\n<template>\n <VvIcon\n :name=\"getTypeIcon(type as DocumentType)\"\n class=\"shrink-0 text-14 text-word-3\" />\n <div class=\"flex flex-col gap-2 min-w-0 flex-1\">\n <strong class=\"font-bold text-12 text-word-1 truncate block\">\n {{ name }}\n </strong>\n <span v-if=\"filename\" class=\"text-10 text-word-4 truncate\">\n {{ filename }}\n </span>\n <span\n v-if=\"url\"\n class=\"text-10 text-word-4 truncate flex items-center gap-4\">\n <VvIcon name=\"ri:link\" class=\"shrink-0 text-10\" />\n <PkUrl :url=\"url\" :muted=\"mutedUrl\" />\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref, reactive } from 'vue'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n import PkChunkPreview from './PkChunkPreview.vue'\n import PkDocumentHeader from './PkDocumentHeader.vue'\n\n interface SourceItem {\n chunkId: string\n documentId: string\n documentName: string\n documentType: string\n language: string\n content: string\n chunkIndex?: number | null\n similarity?: number\n sourceUrl?: string\n sourceFilename?: string\n sourceDescription?: string\n sourceImageUrl?: string\n }\n\n const props = defineProps<{\n part: unknown\n onExpandContext?: (payload: {\n documentId: string\n chunkIndex: number\n }) => Promise<string>\n onDownload?: (documentId: string) => void\n }>()\n\n const toolPart = computed(() => {\n return props.part as {\n input?: {\n sources: SourceItem[]\n }\n }\n })\n\n const sources = computed(() => toolPart.value.input?.sources || [])\n\n const groupedSources = computed(() => {\n const groups = new Map<\n string,\n { document: SourceItem; chunks: SourceItem[] }\n >()\n for (const source of sources.value) {\n const existing = groups.get(source.documentId)\n if (existing) {\n existing.chunks.push(source)\n } else {\n groups.set(source.documentId, {\n document: source,\n chunks: [source],\n })\n }\n }\n return [...groups.values()]\n })\n\n const maxSimilarity = computed(() => {\n return Math.max(...sources.value.map((s) => s.similarity ?? 0), 0)\n })\n\n const expandedDocuments = reactive(new Set<string>())\n const expandedChunks = reactive(new Set<string>())\n const contextData = reactive(new Map<string, string>())\n const loadingContext = reactive(new Set<string>())\n\n const toggleDocument = (documentId: string) => {\n if (expandedDocuments.has(documentId)) {\n expandedDocuments.delete(documentId)\n } else {\n expandedDocuments.add(documentId)\n }\n }\n\n const toggleChunk = (chunkId: string) => {\n if (expandedChunks.has(chunkId)) {\n expandedChunks.delete(chunkId)\n } else {\n expandedChunks.add(chunkId)\n }\n }\n\n const handleExpandContext = async (source: SourceItem) => {\n if (source.chunkIndex == null || !props.onExpandContext) {\n return\n }\n loadingContext.add(source.chunkId)\n try {\n const content = await props.onExpandContext({\n documentId: source.documentId,\n chunkIndex: source.chunkIndex,\n })\n contextData.set(source.chunkId, content)\n } finally {\n loadingContext.delete(source.chunkId)\n }\n }\n\n const clearContext = (chunkId: string) => {\n contextData.delete(chunkId)\n }\n\n const showMore = ref(false)\n const visibleGroups = computed(() => {\n if (showMore.value) {\n return groupedSources.value\n }\n return groupedSources.value.slice(0, 3)\n })\n const hasMore = computed(() => groupedSources.value.length > 3)\n</script>\n\n<template>\n <div v-if=\"sources.length\" class=\"flex flex-col gap-xs w-full\">\n <div class=\"flex items-center gap-4 text-12 text-word-3 font-semibold\">\n <VvIcon name=\"ri:article-line\" class=\"text-14\" />\n {{ $t('label.sources') }}\n <span class=\"text-word-4 font-normal\">\n ({{ groupedSources.length }})\n </span>\n </div>\n\n <ul class=\"flex flex-col gap-xs\">\n <li\n v-for=\"group in visibleGroups\"\n :key=\"group.document.documentId\"\n class=\"border border-surface-3 rounded-xl overflow-hidden\">\n <!-- Document header: the toggle, and beside it the link to\n the source, because a link inside a button is invalid\n HTML and its click also toggled the row -->\n <div\n class=\"flex items-center hover:bg-surface-1 transition-colors\">\n <button\n type=\"button\"\n class=\"flex items-center gap-8 p-8 flex-1 min-w-0 text-left cursor-pointer\"\n :aria-expanded=\"\n expandedDocuments.has(group.document.documentId)\n \"\n @click=\"toggleDocument(group.document.documentId)\">\n <PkDocumentHeader\n :type=\"group.document.documentType\"\n :name=\"group.document.documentName\"\n :url=\"group.document.sourceUrl\"\n :filename=\"group.document.sourceFilename\"\n muted-url />\n <div class=\"flex items-center gap-4 shrink-0\">\n <span\n v-if=\"group.chunks.length > 1\"\n class=\"text-10 text-word-4 bg-surface-2 rounded px-4 py-2\">\n {{ group.chunks.length }}\n </span>\n <span\n class=\"text-10 text-word-4 bg-surface-2 rounded px-4 py-2 uppercase\">\n {{ group.document.language }}\n </span>\n <VvIcon\n :name=\"\n expandedDocuments.has(\n group.document.documentId,\n )\n ? 'ri:arrow-up-s-line'\n : 'ri:arrow-down-s-line'\n \"\n class=\"text-16 text-word-3\" />\n </div>\n </button>\n <VvButton\n v-if=\"group.document.sourceUrl\"\n modifiers=\"action-quiet-small\"\n icon=\"ri:external-link-line\"\n class=\"text-10 shrink-0 mr-8\"\n :href=\"group.document.sourceUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n :title=\"$t('action.open')\"\n :aria-label=\"$t('action.open')\" />\n </div>\n\n <!-- Expanded content -->\n <div\n v-if=\"expandedDocuments.has(group.document.documentId)\"\n class=\"border-t border-surface-3\">\n <PkStreamingMarkdown\n v-if=\"group.document.sourceDescription\"\n :markdown=\"group.document.sourceDescription\"\n class=\"px-8 py-4 text-10 text-word-3 bg-surface-1 border-b border-surface-3\" />\n\n <!-- Chunk excerpts -->\n <div\n v-for=\"chunk in group.chunks\"\n :key=\"chunk.chunkId\"\n class=\"border-b border-surface-3 last:border-b-0\">\n <button\n class=\"flex items-center gap-8 px-8 py-6 w-full text-left hover:bg-surface-1 transition-colors cursor-pointer\"\n @click=\"toggleChunk(chunk.chunkId)\">\n <PkChunkPreview\n :content=\"chunk.content\"\n :similarity=\"chunk.similarity\"\n :max-similarity=\"maxSimilarity\"\n :expanded=\"expandedChunks.has(chunk.chunkId)\" />\n </button>\n\n <!-- Expanded chunk content -->\n <div\n v-if=\"expandedChunks.has(chunk.chunkId)\"\n class=\"bg-surface-1 border-t border-surface-3\">\n <div class=\"p-8 text-10 text-word-3\">\n <transition mode=\"out-in\">\n <!-- Context expansion -->\n <PkStreamingMarkdown\n v-if=\"contextData.has(chunk.chunkId)\"\n :markdown=\"\n contextData.get(chunk.chunkId)!\n \"\n class=\"wysiwyg\" />\n\n <!-- Chunk content -->\n <PkStreamingMarkdown\n v-else\n :markdown=\"chunk.content\"\n class=\"wysiwyg\" />\n </transition>\n </div>\n\n <!-- Actions bar -->\n <div\n class=\"flex items-center gap-8 px-8 py-6 border-t border-surface-3 bg-surface\">\n <!-- Expand / collapse context -->\n <button\n v-if=\"\n onExpandContext &&\n chunk.chunkIndex != null &&\n !contextData.has(chunk.chunkId)\n \"\n class=\"text-10 text-word-3 hover:text-word flex items-center gap-4 cursor-pointer\"\n :disabled=\"\n loadingContext.has(chunk.chunkId)\n \"\n @click=\"handleExpandContext(chunk)\">\n <VvIcon\n :name=\"\n loadingContext.has(chunk.chunkId)\n ? 'loading-loop'\n : 'ri:expand-up-down-line'\n \"\n class=\"text-12\" />\n {{ $t('label.expandContext') }}\n </button>\n <button\n v-else-if=\"contextData.has(chunk.chunkId)\"\n class=\"text-10 text-word-3 hover:text-word-1 flex items-center gap-4 cursor-pointer\"\n @click=\"clearContext(chunk.chunkId)\">\n <VvIcon\n name=\"ri:collapse-vertical-line\"\n class=\"text-12\" />\n {{ $t('label.collapseContext') }}\n </button>\n\n <!-- Open source URL -->\n <a\n v-if=\"chunk.sourceUrl\"\n :href=\"chunk.sourceUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"text-10 text-word-3 hover:text-word-1 flex items-center gap-4 ml-auto\">\n <VvIcon\n name=\"ri:external-link-line\"\n class=\"text-12\" />\n {{ $t('label.openSource') }}\n </a>\n\n <!-- Download file -->\n <button\n v-if=\"\n onDownload &&\n chunk.documentType === 'file'\n \"\n class=\"text-10 text-word-3 hover:text-word-1 flex items-center gap-4 cursor-pointer\"\n :class=\"{\n 'ml-auto': !chunk.sourceUrl,\n }\"\n @click=\"onDownload(chunk.documentId)\">\n <VvIcon\n name=\"ri:download-line\"\n class=\"text-12\" />\n {{ $t('label.downloadFile') }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </li>\n </ul>\n\n <!-- Show more -->\n <button\n v-if=\"hasMore\"\n class=\"text-12 text-word-3 cursor-pointer hover:underline flex items-center gap-4 mx-auto\"\n @click=\"showMore = !showMore\">\n <VvIcon\n :name=\"showMore ? 'ri:arrow-up-s-line' : 'ri:arrow-down-s-line'\"\n class=\"text-16\" />\n {{\n showMore\n ? $t('action.showLess')\n : $t('action.showMore', {\n count: groupedSources.length - 3,\n })\n }}\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref, reactive } from 'vue'\n import PkStreamingMarkdown from './PkStreamingMarkdown.vue'\n import PkChunkPreview from './PkChunkPreview.vue'\n import PkDocumentHeader from './PkDocumentHeader.vue'\n\n interface SourceItem {\n chunkId: string\n documentId: string\n documentName: string\n documentType: string\n language: string\n content: string\n chunkIndex?: number | null\n similarity?: number\n sourceUrl?: string\n sourceFilename?: string\n sourceDescription?: string\n sourceImageUrl?: string\n }\n\n const props = defineProps<{\n part: unknown\n onExpandContext?: (payload: {\n documentId: string\n chunkIndex: number\n }) => Promise<string>\n onDownload?: (documentId: string) => void\n }>()\n\n const toolPart = computed(() => {\n return props.part as {\n input?: {\n sources: SourceItem[]\n }\n }\n })\n\n const sources = computed(() => toolPart.value.input?.sources || [])\n\n const groupedSources = computed(() => {\n const groups = new Map<\n string,\n { document: SourceItem; chunks: SourceItem[] }\n >()\n for (const source of sources.value) {\n const existing = groups.get(source.documentId)\n if (existing) {\n existing.chunks.push(source)\n } else {\n groups.set(source.documentId, {\n document: source,\n chunks: [source],\n })\n }\n }\n return [...groups.values()]\n })\n\n const maxSimilarity = computed(() => {\n return Math.max(...sources.value.map((s) => s.similarity ?? 0), 0)\n })\n\n const expandedDocuments = reactive(new Set<string>())\n const expandedChunks = reactive(new Set<string>())\n const contextData = reactive(new Map<string, string>())\n const loadingContext = reactive(new Set<string>())\n\n const toggleDocument = (documentId: string) => {\n if (expandedDocuments.has(documentId)) {\n expandedDocuments.delete(documentId)\n } else {\n expandedDocuments.add(documentId)\n }\n }\n\n const toggleChunk = (chunkId: string) => {\n if (expandedChunks.has(chunkId)) {\n expandedChunks.delete(chunkId)\n } else {\n expandedChunks.add(chunkId)\n }\n }\n\n const handleExpandContext = async (source: SourceItem) => {\n if (source.chunkIndex == null || !props.onExpandContext) {\n return\n }\n loadingContext.add(source.chunkId)\n try {\n const content = await props.onExpandContext({\n documentId: source.documentId,\n chunkIndex: source.chunkIndex,\n })\n contextData.set(source.chunkId, content)\n } finally {\n loadingContext.delete(source.chunkId)\n }\n }\n\n const clearContext = (chunkId: string) => {\n contextData.delete(chunkId)\n }\n\n const showMore = ref(false)\n const visibleGroups = computed(() => {\n if (showMore.value) {\n return groupedSources.value\n }\n return groupedSources.value.slice(0, 3)\n })\n const hasMore = computed(() => groupedSources.value.length > 3)\n</script>\n\n<template>\n <div v-if=\"sources.length\" class=\"flex flex-col gap-xs w-full\">\n <div class=\"flex items-center gap-4 text-12 text-word-3 font-semibold\">\n <VvIcon name=\"ri:article-line\" class=\"text-14\" />\n {{ $t('label.sources') }}\n <span class=\"text-word-4 font-normal\">\n ({{ groupedSources.length }})\n </span>\n </div>\n\n <ul class=\"flex flex-col gap-xs\">\n <li\n v-for=\"group in visibleGroups\"\n :key=\"group.document.documentId\"\n class=\"border border-surface-3 rounded-xl overflow-hidden\">\n <!-- Document header: the toggle, and beside it the link to\n the source, because a link inside a button is invalid\n HTML and its click also toggled the row -->\n <div\n class=\"flex items-center hover:bg-surface-1 transition-colors\">\n <button\n type=\"button\"\n class=\"flex items-center gap-8 p-8 flex-1 min-w-0 text-left cursor-pointer\"\n :aria-expanded=\"\n expandedDocuments.has(group.document.documentId)\n \"\n @click=\"toggleDocument(group.document.documentId)\">\n <PkDocumentHeader\n :type=\"group.document.documentType\"\n :name=\"group.document.documentName\"\n :url=\"group.document.sourceUrl\"\n :filename=\"group.document.sourceFilename\"\n muted-url />\n <div class=\"flex items-center gap-4 shrink-0\">\n <span\n v-if=\"group.chunks.length > 1\"\n class=\"text-10 text-word-4 bg-surface-2 rounded px-4 py-2\">\n {{ group.chunks.length }}\n </span>\n <span\n class=\"text-10 text-word-4 bg-surface-2 rounded px-4 py-2 uppercase\">\n {{ group.document.language }}\n </span>\n <VvIcon\n :name=\"\n expandedDocuments.has(\n group.document.documentId,\n )\n ? 'ri:arrow-up-s-line'\n : 'ri:arrow-down-s-line'\n \"\n class=\"text-16 text-word-3\" />\n </div>\n </button>\n <VvButton\n v-if=\"group.document.sourceUrl\"\n modifiers=\"action-quiet-small\"\n icon=\"ri:external-link-line\"\n class=\"text-10 shrink-0 mr-8\"\n :href=\"group.document.sourceUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n :title=\"$t('action.open')\"\n :aria-label=\"$t('action.open')\" />\n </div>\n\n <!-- Expanded content -->\n <div\n v-if=\"expandedDocuments.has(group.document.documentId)\"\n class=\"border-t border-surface-3\">\n <PkStreamingMarkdown\n v-if=\"group.document.sourceDescription\"\n :markdown=\"group.document.sourceDescription\"\n class=\"px-8 py-4 text-10 text-word-3 bg-surface-1 border-b border-surface-3\" />\n\n <!-- Chunk excerpts -->\n <div\n v-for=\"chunk in group.chunks\"\n :key=\"chunk.chunkId\"\n class=\"border-b border-surface-3 last:border-b-0\">\n <button\n class=\"flex items-center gap-8 px-8 py-6 w-full text-left hover:bg-surface-1 transition-colors cursor-pointer\"\n @click=\"toggleChunk(chunk.chunkId)\">\n <PkChunkPreview\n :content=\"chunk.content\"\n :similarity=\"chunk.similarity\"\n :max-similarity=\"maxSimilarity\"\n :expanded=\"expandedChunks.has(chunk.chunkId)\" />\n </button>\n\n <!-- Expanded chunk content -->\n <div\n v-if=\"expandedChunks.has(chunk.chunkId)\"\n class=\"bg-surface-1 border-t border-surface-3\">\n <div class=\"p-8 text-10 text-word-3\">\n <transition mode=\"out-in\">\n <!-- Context expansion -->\n <PkStreamingMarkdown\n v-if=\"contextData.has(chunk.chunkId)\"\n :markdown=\"\n contextData.get(chunk.chunkId)!\n \"\n class=\"wysiwyg\" />\n\n <!-- Chunk content -->\n <PkStreamingMarkdown\n v-else\n :markdown=\"chunk.content\"\n class=\"wysiwyg\" />\n </transition>\n </div>\n\n <!-- Actions bar -->\n <div\n class=\"flex items-center gap-8 px-8 py-6 border-t border-surface-3 bg-surface\">\n <!-- Expand / collapse context -->\n <button\n v-if=\"\n onExpandContext &&\n chunk.chunkIndex != null &&\n !contextData.has(chunk.chunkId)\n \"\n class=\"text-10 text-word-3 hover:text-word flex items-center gap-4 cursor-pointer\"\n :disabled=\"\n loadingContext.has(chunk.chunkId)\n \"\n @click=\"handleExpandContext(chunk)\">\n <VvIcon\n :name=\"\n loadingContext.has(chunk.chunkId)\n ? 'loading-loop'\n : 'ri:expand-up-down-line'\n \"\n class=\"text-12\" />\n {{ $t('label.expandContext') }}\n </button>\n <button\n v-else-if=\"contextData.has(chunk.chunkId)\"\n class=\"text-10 text-word-3 hover:text-word-1 flex items-center gap-4 cursor-pointer\"\n @click=\"clearContext(chunk.chunkId)\">\n <VvIcon\n name=\"ri:collapse-vertical-line\"\n class=\"text-12\" />\n {{ $t('label.collapseContext') }}\n </button>\n\n <!-- Open source URL -->\n <a\n v-if=\"chunk.sourceUrl\"\n :href=\"chunk.sourceUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"text-10 text-word-3 hover:text-word-1 flex items-center gap-4 ml-auto\">\n <VvIcon\n name=\"ri:external-link-line\"\n class=\"text-12\" />\n {{ $t('label.openSource') }}\n </a>\n\n <!-- Download file -->\n <button\n v-if=\"\n onDownload &&\n chunk.documentType === 'file'\n \"\n class=\"text-10 text-word-3 hover:text-word-1 flex items-center gap-4 cursor-pointer\"\n :class=\"{\n 'ml-auto': !chunk.sourceUrl,\n }\"\n @click=\"onDownload(chunk.documentId)\">\n <VvIcon\n name=\"ri:download-line\"\n class=\"text-12\" />\n {{ $t('label.downloadFile') }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </li>\n </ul>\n\n <!-- Show more -->\n <button\n v-if=\"hasMore\"\n class=\"text-12 text-word-3 cursor-pointer hover:underline flex items-center gap-4 mx-auto\"\n @click=\"showMore = !showMore\">\n <VvIcon\n :name=\"showMore ? 'ri:arrow-up-s-line' : 'ri:arrow-down-s-line'\"\n class=\"text-16\" />\n {{\n showMore\n ? $t('action.showLess')\n : $t('action.showMore', {\n count: groupedSources.length - 3,\n })\n }}\n </button>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./rolldown-runtime-Dy4uBu1J.js";
2
- import { j as t } from "./Agent-dGF8mkG9.js";
2
+ import { P as t } from "./Agent-DU1WWaHR.js";
3
3
  import { VvIcon as n } from "@volverjs/ui-vue/components";
4
4
  import { Fragment as r, computed as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createVNode as c, defineComponent as l, normalizeClass as u, openBlock as d, ref as f, renderList as p, toDisplayString as m, withModifiers as h } from "vue";
5
5
  //#region ../../packages/components/src/chat/PkToolShowSuggestedReply.vue?vue&type=script&setup=true&lang.ts
@@ -45,4 +45,4 @@ var g = {
45
45
  //#endregion
46
46
  export { y as n, b as t };
47
47
 
48
- //# sourceMappingURL=PkToolShowSuggestedReply-DjutyiEi.js.map
48
+ //# sourceMappingURL=PkToolShowSuggestedReply-I6FBos-F.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PkToolShowSuggestedReply-DjutyiEi.js","names":["__unplugin_components_0","_openBlock","_createElementBlock","_Fragment","_renderList","_normalizeClass","_withModifiers","_createVNode","_createElementVNode","_toDisplayString","_createCommentVNode","_sfc_main","__exportAll","isVoiceRenderAck","_hoisted_1","_hoisted_2","PkToolShowSuggestedReply_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","toolPart","computed","suggestions","input","clickedIndex","ref","isInteractive","handleClick","index","suggestion","value","_component_VvIcon","VvIcon","openBlock","createElementBlock","Fragment","renderList","normalizeClass","withModifiers","createVNode","createElementVNode","toDisplayString","createCommentVNode","PkToolShowSuggestedReply_exports","PkToolShowSuggestedReply_default"],"sources":["../../../../packages/components/src/chat/PkToolShowSuggestedReply.vue","../../../../packages/components/src/chat/PkToolShowSuggestedReply.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, ref } from 'vue'\n import { isVoiceRenderAck } from 'models'\n\n type Suggestion = { label: string; prompt?: string }\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const emit = defineEmits<{\n select: [value: string]\n }>()\n\n const toolPart = computed(() => {\n return JSON.parse(JSON.stringify(props.part)) as {\n state?: string\n toolCallId?: string\n input?: {\n /** New schema: array of suggestions */\n suggestions?: Suggestion[]\n /** Legacy schema: single suggestion */\n label?: string\n prompt?: string\n }\n output?: string\n }\n })\n\n /** Normalize to always work with an array of suggestions */\n const suggestions = computed<Suggestion[]>(() => {\n const input = toolPart.value?.input\n if (!input) {\n return []\n }\n if (input.suggestions?.length) {\n return input.suggestions\n }\n // Legacy single-suggestion format (client-side fallback)\n if (input.label) {\n return [{ label: input.label, prompt: input.prompt ?? input.label }]\n }\n return []\n })\n\n const clickedIndex = ref<number | null>(null)\n\n const isInteractive = computed(() => {\n // A chip drawn during a CALL arrives already resolved: the turn could\n // not wait for a tap, so the backend closed the tool with the note\n // that it was drawn (see `isVoiceRenderAck`, same rule as the forms).\n // The note is not a tap, and without this the chips of every spoken\n // turn rendered dead.\n return (\n (toolPart.value?.state === 'input-available' ||\n isVoiceRenderAck(toolPart.value?.output)) &&\n clickedIndex.value === null\n )\n })\n\n function handleClick(index: number) {\n if (!isInteractive.value) {\n return\n }\n clickedIndex.value = index\n const suggestion = suggestions.value[index]\n const value = suggestion?.prompt ?? suggestion?.label\n if (value) {\n emit('select', value)\n }\n }\n</script>\n\n<template>\n <div v-if=\"suggestions.length\" class=\"pk-tool-suggested-reply\">\n <button\n v-for=\"(suggestion, index) in suggestions\"\n :key=\"index\"\n type=\"button\"\n class=\"pk-tool-suggested-reply__link\"\n :class=\"{\n 'is-clicked': clickedIndex === index,\n 'is-disabled': !isInteractive,\n }\"\n :disabled=\"!isInteractive\"\n @click.stop=\"handleClick(index)\">\n <VvIcon\n name=\"ri:corner-down-right-line\"\n class=\"pk-tool-suggested-reply__icon\" />\n <span>{{ suggestion.label }}</span>\n </button>\n </div>\n</template>\n\n<style lang=\"scss\">\n .pk-tool-suggested-reply {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-4);\n\n &__link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-4);\n background: none;\n border: none;\n padding: 0;\n font: inherit;\n font-size: var(--text-12);\n text-decoration: underline;\n text-underline-offset: 2px;\n cursor: pointer;\n color: var(--color-word-3);\n transition: var(--transition-colors);\n\n &:hover:not(:disabled) {\n color: var(--color-word);\n }\n\n &.is-disabled {\n cursor: default;\n pointer-events: none;\n color: var(--color-word-5);\n }\n\n &.is-clicked {\n color: var(--color-word-5);\n text-decoration: none;\n }\n }\n\n &__icon {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n }\n }\n</style>\n","<script setup lang=\"ts\">\n import { computed, ref } from 'vue'\n import { isVoiceRenderAck } from 'models'\n\n type Suggestion = { label: string; prompt?: string }\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const emit = defineEmits<{\n select: [value: string]\n }>()\n\n const toolPart = computed(() => {\n return JSON.parse(JSON.stringify(props.part)) as {\n state?: string\n toolCallId?: string\n input?: {\n /** New schema: array of suggestions */\n suggestions?: Suggestion[]\n /** Legacy schema: single suggestion */\n label?: string\n prompt?: string\n }\n output?: string\n }\n })\n\n /** Normalize to always work with an array of suggestions */\n const suggestions = computed<Suggestion[]>(() => {\n const input = toolPart.value?.input\n if (!input) {\n return []\n }\n if (input.suggestions?.length) {\n return input.suggestions\n }\n // Legacy single-suggestion format (client-side fallback)\n if (input.label) {\n return [{ label: input.label, prompt: input.prompt ?? input.label }]\n }\n return []\n })\n\n const clickedIndex = ref<number | null>(null)\n\n const isInteractive = computed(() => {\n // A chip drawn during a CALL arrives already resolved: the turn could\n // not wait for a tap, so the backend closed the tool with the note\n // that it was drawn (see `isVoiceRenderAck`, same rule as the forms).\n // The note is not a tap, and without this the chips of every spoken\n // turn rendered dead.\n return (\n (toolPart.value?.state === 'input-available' ||\n isVoiceRenderAck(toolPart.value?.output)) &&\n clickedIndex.value === null\n )\n })\n\n function handleClick(index: number) {\n if (!isInteractive.value) {\n return\n }\n clickedIndex.value = index\n const suggestion = suggestions.value[index]\n const value = suggestion?.prompt ?? suggestion?.label\n if (value) {\n emit('select', value)\n }\n }\n</script>\n\n<template>\n <div v-if=\"suggestions.length\" class=\"pk-tool-suggested-reply\">\n <button\n v-for=\"(suggestion, index) in suggestions\"\n :key=\"index\"\n type=\"button\"\n class=\"pk-tool-suggested-reply__link\"\n :class=\"{\n 'is-clicked': clickedIndex === index,\n 'is-disabled': !isInteractive,\n }\"\n :disabled=\"!isInteractive\"\n @click.stop=\"handleClick(index)\">\n <VvIcon\n name=\"ri:corner-down-right-line\"\n class=\"pk-tool-suggested-reply__icon\" />\n <span>{{ suggestion.label }}</span>\n </button>\n </div>\n</template>\n\n<style lang=\"scss\">\n .pk-tool-suggested-reply {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-4);\n\n &__link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-4);\n background: none;\n border: none;\n padding: 0;\n font: inherit;\n font-size: var(--text-12);\n text-decoration: underline;\n text-underline-offset: 2px;\n cursor: pointer;\n color: var(--color-word-3);\n transition: var(--transition-colors);\n\n &:hover:not(:disabled) {\n color: var(--color-word);\n }\n\n &.is-disabled {\n cursor: default;\n pointer-events: none;\n color: var(--color-word-5);\n }\n\n &.is-clicked {\n color: var(--color-word-5);\n text-decoration: none;\n }\n }\n\n &__icon {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n }\n }\n</style>\n"],"mappings":";;;;;;;;;;;;;EAMI,IAAMkB,IAAQC,GAIRC,IAAOH,GAIPI,IAAWC,QACN,KAAK,MAAM,KAAK,UAAUJ,EAAM,IAAI,CAAC,CAY/C,GAGKK,IAAcD,QAA6B;GAC7C,IAAME,IAAQH,EAAS,OAAO;GAW9B,OAVKG,IAGDA,EAAM,aAAa,SACZA,EAAM,cAGbA,EAAM,QACC,CAAC;IAAE,OAAOA,EAAM;IAAO,QAAQA,EAAM,UAAUA,EAAM;GAAM,CAAC,IAEhE,CAAC,IATG,CAAC;EAUhB,CAAC,GAEKC,IAAeC,EAAmB,IAAI,GAEtCC,IAAgBL,SAObD,EAAS,OAAO,UAAU,qBACvBR,EAAiBQ,EAAS,OAAO,MAAM,MAC3CI,EAAa,UAAU,IAE9B;EAED,SAASG,EAAY,GAAe;GAChC,IAAI,CAACD,EAAc,OACf;GAEJ,EAAa,QAAQE;GACrB,IAAMC,IAAaP,EAAY,MAAMM,IAC/BE,IAAQD,GAAY,UAAUA,GAAY;GAChD,AAAIC,KACAX,EAAK,UAAUW,CAAK;EAE5B;;;GAIW,OAAAR,EAAA,MAAY,UAAvBtB,EAAA,GAAAC,EAiBM,OAjBNY,GAiBM,EAhBFb,EAAA,EAAA,GAAAC,EAeSC,GAAA,MAAAC,EAdyBmB,EAAA,QAAtB,GAAY,OADxBtB,EAAA,GAAAC,EAeS,UAAA;IAbJ,KAAK2B;IACN,MAAK;IACL,OAAKxB,EAAA,CAAC,iCAA+B;KACG,cAAAoB,EAAA,UAAiBI;KAAuC,eAAA,CAAAF,EAAA;;IAI/F,UAAQ,CAAGA,EAAA;IACX,SAAKrB,GAAA,MAAOsB,EAAYC,CAAK,GAAA,CAAA,MAAA,CAAA;GAC9BtB,GAAAA,CAAAA,EAE4CyB,GAAA;IADxC,MAAK;IACL,OAAM;GACVxB,CAAAA,GAAAA,EAAmC,QAAA,MAAAC,EAA1BqB,EAAW,KAAK,GAAA,CAAA,CAAA,GAAA,IAAAf,CAAA"}
1
+ {"version":3,"file":"PkToolShowSuggestedReply-I6FBos-F.js","names":["__unplugin_components_0","_openBlock","_createElementBlock","_Fragment","_renderList","_normalizeClass","_withModifiers","_createVNode","_createElementVNode","_toDisplayString","_createCommentVNode","_sfc_main","__exportAll","isVoiceRenderAck","_hoisted_1","_hoisted_2","PkToolShowSuggestedReply_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","toolPart","computed","suggestions","input","clickedIndex","ref","isInteractive","handleClick","index","suggestion","value","_component_VvIcon","VvIcon","openBlock","createElementBlock","Fragment","renderList","normalizeClass","withModifiers","createVNode","createElementVNode","toDisplayString","createCommentVNode","PkToolShowSuggestedReply_exports","PkToolShowSuggestedReply_default"],"sources":["../../../../packages/components/src/chat/PkToolShowSuggestedReply.vue","../../../../packages/components/src/chat/PkToolShowSuggestedReply.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, ref } from 'vue'\n import { isVoiceRenderAck } from 'models'\n\n type Suggestion = { label: string; prompt?: string }\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const emit = defineEmits<{\n select: [value: string]\n }>()\n\n const toolPart = computed(() => {\n return JSON.parse(JSON.stringify(props.part)) as {\n state?: string\n toolCallId?: string\n input?: {\n /** New schema: array of suggestions */\n suggestions?: Suggestion[]\n /** Legacy schema: single suggestion */\n label?: string\n prompt?: string\n }\n output?: string\n }\n })\n\n /** Normalize to always work with an array of suggestions */\n const suggestions = computed<Suggestion[]>(() => {\n const input = toolPart.value?.input\n if (!input) {\n return []\n }\n if (input.suggestions?.length) {\n return input.suggestions\n }\n // Legacy single-suggestion format (client-side fallback)\n if (input.label) {\n return [{ label: input.label, prompt: input.prompt ?? input.label }]\n }\n return []\n })\n\n const clickedIndex = ref<number | null>(null)\n\n const isInteractive = computed(() => {\n // A chip drawn during a CALL arrives already resolved: the turn could\n // not wait for a tap, so the backend closed the tool with the note\n // that it was drawn (see `isVoiceRenderAck`, same rule as the forms).\n // The note is not a tap, and without this the chips of every spoken\n // turn rendered dead.\n return (\n (toolPart.value?.state === 'input-available' ||\n isVoiceRenderAck(toolPart.value?.output)) &&\n clickedIndex.value === null\n )\n })\n\n function handleClick(index: number) {\n if (!isInteractive.value) {\n return\n }\n clickedIndex.value = index\n const suggestion = suggestions.value[index]\n const value = suggestion?.prompt ?? suggestion?.label\n if (value) {\n emit('select', value)\n }\n }\n</script>\n\n<template>\n <div v-if=\"suggestions.length\" class=\"pk-tool-suggested-reply\">\n <button\n v-for=\"(suggestion, index) in suggestions\"\n :key=\"index\"\n type=\"button\"\n class=\"pk-tool-suggested-reply__link\"\n :class=\"{\n 'is-clicked': clickedIndex === index,\n 'is-disabled': !isInteractive,\n }\"\n :disabled=\"!isInteractive\"\n @click.stop=\"handleClick(index)\">\n <VvIcon\n name=\"ri:corner-down-right-line\"\n class=\"pk-tool-suggested-reply__icon\" />\n <span>{{ suggestion.label }}</span>\n </button>\n </div>\n</template>\n\n<style lang=\"scss\">\n .pk-tool-suggested-reply {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-4);\n\n &__link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-4);\n background: none;\n border: none;\n padding: 0;\n font: inherit;\n font-size: var(--text-12);\n text-decoration: underline;\n text-underline-offset: 2px;\n cursor: pointer;\n color: var(--color-word-3);\n transition: var(--transition-colors);\n\n &:hover:not(:disabled) {\n color: var(--color-word);\n }\n\n &.is-disabled {\n cursor: default;\n pointer-events: none;\n color: var(--color-word-5);\n }\n\n &.is-clicked {\n color: var(--color-word-5);\n text-decoration: none;\n }\n }\n\n &__icon {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n }\n }\n</style>\n","<script setup lang=\"ts\">\n import { computed, ref } from 'vue'\n import { isVoiceRenderAck } from 'models'\n\n type Suggestion = { label: string; prompt?: string }\n\n const props = defineProps<{\n part: unknown\n }>()\n\n const emit = defineEmits<{\n select: [value: string]\n }>()\n\n const toolPart = computed(() => {\n return JSON.parse(JSON.stringify(props.part)) as {\n state?: string\n toolCallId?: string\n input?: {\n /** New schema: array of suggestions */\n suggestions?: Suggestion[]\n /** Legacy schema: single suggestion */\n label?: string\n prompt?: string\n }\n output?: string\n }\n })\n\n /** Normalize to always work with an array of suggestions */\n const suggestions = computed<Suggestion[]>(() => {\n const input = toolPart.value?.input\n if (!input) {\n return []\n }\n if (input.suggestions?.length) {\n return input.suggestions\n }\n // Legacy single-suggestion format (client-side fallback)\n if (input.label) {\n return [{ label: input.label, prompt: input.prompt ?? input.label }]\n }\n return []\n })\n\n const clickedIndex = ref<number | null>(null)\n\n const isInteractive = computed(() => {\n // A chip drawn during a CALL arrives already resolved: the turn could\n // not wait for a tap, so the backend closed the tool with the note\n // that it was drawn (see `isVoiceRenderAck`, same rule as the forms).\n // The note is not a tap, and without this the chips of every spoken\n // turn rendered dead.\n return (\n (toolPart.value?.state === 'input-available' ||\n isVoiceRenderAck(toolPart.value?.output)) &&\n clickedIndex.value === null\n )\n })\n\n function handleClick(index: number) {\n if (!isInteractive.value) {\n return\n }\n clickedIndex.value = index\n const suggestion = suggestions.value[index]\n const value = suggestion?.prompt ?? suggestion?.label\n if (value) {\n emit('select', value)\n }\n }\n</script>\n\n<template>\n <div v-if=\"suggestions.length\" class=\"pk-tool-suggested-reply\">\n <button\n v-for=\"(suggestion, index) in suggestions\"\n :key=\"index\"\n type=\"button\"\n class=\"pk-tool-suggested-reply__link\"\n :class=\"{\n 'is-clicked': clickedIndex === index,\n 'is-disabled': !isInteractive,\n }\"\n :disabled=\"!isInteractive\"\n @click.stop=\"handleClick(index)\">\n <VvIcon\n name=\"ri:corner-down-right-line\"\n class=\"pk-tool-suggested-reply__icon\" />\n <span>{{ suggestion.label }}</span>\n </button>\n </div>\n</template>\n\n<style lang=\"scss\">\n .pk-tool-suggested-reply {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-4);\n\n &__link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-4);\n background: none;\n border: none;\n padding: 0;\n font: inherit;\n font-size: var(--text-12);\n text-decoration: underline;\n text-underline-offset: 2px;\n cursor: pointer;\n color: var(--color-word-3);\n transition: var(--transition-colors);\n\n &:hover:not(:disabled) {\n color: var(--color-word);\n }\n\n &.is-disabled {\n cursor: default;\n pointer-events: none;\n color: var(--color-word-5);\n }\n\n &.is-clicked {\n color: var(--color-word-5);\n text-decoration: none;\n }\n }\n\n &__icon {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n }\n }\n</style>\n"],"mappings":";;;;;;;;;;;;;EAMI,IAAMkB,IAAQC,GAIRC,IAAOH,GAIPI,IAAWC,QACN,KAAK,MAAM,KAAK,UAAUJ,EAAM,IAAI,CAAC,CAY/C,GAGKK,IAAcD,QAA6B;GAC7C,IAAME,IAAQH,EAAS,OAAO;GAW9B,OAVKG,IAGDA,EAAM,aAAa,SACZA,EAAM,cAGbA,EAAM,QACC,CAAC;IAAE,OAAOA,EAAM;IAAO,QAAQA,EAAM,UAAUA,EAAM;GAAM,CAAC,IAEhE,CAAC,IATG,CAAC;EAUhB,CAAC,GAEKC,IAAeC,EAAmB,IAAI,GAEtCC,IAAgBL,SAObD,EAAS,OAAO,UAAU,qBACvBR,EAAiBQ,EAAS,OAAO,MAAM,MAC3CI,EAAa,UAAU,IAE9B;EAED,SAASG,EAAY,GAAe;GAChC,IAAI,CAACD,EAAc,OACf;GAEJ,EAAa,QAAQE;GACrB,IAAMC,IAAaP,EAAY,MAAMM,IAC/BE,IAAQD,GAAY,UAAUA,GAAY;GAChD,AAAIC,KACAX,EAAK,UAAUW,CAAK;EAE5B;;;GAIW,OAAAR,EAAA,MAAY,UAAvBtB,EAAA,GAAAC,EAiBM,OAjBNY,GAiBM,EAhBFb,EAAA,EAAA,GAAAC,EAeSC,GAAA,MAAAC,EAdyBmB,EAAA,QAAtB,GAAY,OADxBtB,EAAA,GAAAC,EAeS,UAAA;IAbJ,KAAK2B;IACN,MAAK;IACL,OAAKxB,EAAA,CAAC,iCAA+B;KACG,cAAAoB,EAAA,UAAiBI;KAAuC,eAAA,CAAAF,EAAA;;IAI/F,UAAQ,CAAGA,EAAA;IACX,SAAKrB,GAAA,MAAOsB,EAAYC,CAAK,GAAA,CAAA,MAAA,CAAA;GAC9BtB,GAAAA,CAAAA,EAE4CyB,GAAA;IADxC,MAAK;IACL,OAAM;GACVxB,CAAAA,GAAAA,EAAmC,QAAA,MAAAC,EAA1BqB,EAAW,KAAK,GAAA,CAAA,CAAA,GAAA,IAAAf,CAAA"}
@@ -1,5 +1,5 @@
1
- import { r as e } from "./PkStreamingMarkdown-C55Fi0Pd.js";
2
- import "./src-DCfvejyT.js";
1
+ import { r as e } from "./PkStreamingMarkdown-CsHzdW69.js";
2
+ import "./src-DpkuiHam.js";
3
3
  import { t } from "./PkHeldImage-BqnlurT_.js";
4
4
  import { VvIcon as n } from "@volverjs/ui-vue/components";
5
5
  import { Fragment as r, computed as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createVNode as c, defineComponent as l, normalizeClass as u, openBlock as d, renderList as f, toDisplayString as p, unref as m } from "vue";
@@ -137,4 +137,4 @@ var b = {
137
137
  //#endregion
138
138
  export { M as default };
139
139
 
140
- //# sourceMappingURL=PkToolShowVideo-B_Q93E2y.js.map
140
+ //# sourceMappingURL=PkToolShowVideo-xcg1gdIE.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PkToolShowVideo-B_Q93E2y.js","names":["$t","__unplugin_components_0","_openBlock","_createElementBlock","_createElementVNode","_createVNode","_toDisplayString","_Fragment","_renderList","_normalizeClass","PkHeldImage","_unref","_createCommentVNode","_sfc_main","useChatImageGate","sanitizeId","raw","hostMatches","host","domain","youtubeId","u","v","m","vimeoId","parseVideoSource","url","id","hint","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","IFRAME_ALLOW","PkToolShowVideo_default","defineComponent","props","__props","PLAYER_HOSTS","imageGate","videos","computed","source","video","gated","src","release","urls","_component_VvIcon","VvIcon","openBlock","createElementBlock","createElementVNode","createVNode","toDisplayString","_ctx","Fragment","renderList","normalizeClass","index","PkHeldImage_default","unref","createCommentVNode"],"sources":["../../../../packages/utils/src/video-source.ts","../../../../packages/components/src/chat/PkToolShowVideo.vue","../../../../packages/components/src/chat/PkToolShowVideo.vue"],"sourcesContent":["/**\n * Video source parsing shared by the backend platform renderer and the frontend\n * player component, so both classify a video URL the same way.\n *\n * A URL is either a known provider (YouTube/Vimeo), which plays through the\n * provider's iframe embed, or a direct media file (`file`), which plays in a\n * native `<video>` element. Detection is by URL shape; an explicit `hint` is\n * used only as a fallback when the URL alone is inconclusive.\n */\n\nexport type VideoProvider = 'youtube' | 'vimeo' | 'file'\n\nexport interface ParsedVideoSource {\n provider: VideoProvider\n /** The original URL, unchanged. */\n url: string\n /**\n * The URL to actually load: the provider iframe embed URL for\n * YouTube/Vimeo, or the direct file URL for `file`.\n */\n embedUrl: string\n /** The provider video id (providers only). */\n videoId?: string\n /**\n * A preview image URL derived from the provider, when one is available\n * without an extra API call (currently YouTube only). Lets a link-only\n * surface (e.g. a Teams card) show a thumbnail instead of a bare link.\n */\n thumbnailUrl?: string\n}\n\n/** Keep only characters that are legal in a provider video id. */\nconst sanitizeId = (raw: string): string => raw.replace(/[^a-zA-Z0-9_-]/g, '')\n\n/**\n * True when `host` is exactly `domain` or a subdomain of it. Guards against\n * lookalike hosts (e.g. `notyoutube.com`) that a bare substring check would\n * misclassify.\n */\nconst hostMatches = (host: string, domain: string): boolean =>\n host === domain || host.endsWith(`.${domain}`)\n\n/** Extract the YouTube video id from any of its URL shapes, or null. */\nconst youtubeId = (u: URL): string | null => {\n // youtu.be/<id>\n if (u.hostname.endsWith('youtu.be')) {\n return sanitizeId(u.pathname.split('/')[1] ?? '') || null\n }\n // youtube.com/watch?v=<id>\n const v = u.searchParams.get('v')\n if (v) {\n return sanitizeId(v) || null\n }\n // youtube.com/shorts/<id>, /live/<id>, /embed/<id>, /v/<id>\n const m = u.pathname.match(/^\\/(?:shorts|live|embed|v)\\/([^/?#]+)/)\n return m ? sanitizeId(m[1]) || null : null\n}\n\n/** Extract the Vimeo (numeric) video id, or null. */\nconst vimeoId = (u: URL): string | null => {\n // player.vimeo.com/video/<id> or vimeo.com/<id>\n const m = u.pathname.match(/(?:^|\\/)(\\d+)(?:$|[/?#])/)\n return m ? m[1] : null\n}\n\n/**\n * Classify a video URL into a provider + a loadable embed/file URL.\n * Falls back to `file` (native `<video>`) for anything not recognized as a\n * supported provider, or when a provider is matched but no id can be extracted.\n */\nexport function parseVideoSource(\n url: string,\n hint?: VideoProvider,\n): ParsedVideoSource {\n let u: URL | undefined\n try {\n u = new URL(url)\n } catch {\n // Not an absolute URL: treat as a direct file reference.\n return { provider: 'file', url, embedUrl: url }\n }\n\n const host = u.hostname.toLowerCase()\n\n const isYouTube =\n hostMatches(host, 'youtube.com') ||\n hostMatches(host, 'youtu.be') ||\n hostMatches(host, 'youtube-nocookie.com')\n if (isYouTube) {\n const id = youtubeId(u)\n if (id) {\n return {\n provider: 'youtube',\n url,\n videoId: id,\n embedUrl: `https://www.youtube-nocookie.com/embed/${id}`,\n thumbnailUrl: `https://img.youtube.com/vi/${id}/hqdefault.jpg`,\n }\n }\n }\n\n if (hostMatches(host, 'vimeo.com')) {\n const id = vimeoId(u)\n if (id) {\n return {\n provider: 'vimeo',\n url,\n videoId: id,\n // `dnt=1`: the player sets no cookies and records no session\n // data, the Vimeo counterpart of youtube-nocookie above.\n embedUrl: `https://player.vimeo.com/video/${id}?dnt=1`,\n }\n }\n }\n\n // Honor an explicit provider hint only if we could not extract an id from a\n // provider URL (so a caller-tagged provider link still routes to an iframe\n // via its original URL rather than a broken native <video>).\n if (hint && hint !== 'file') {\n return { provider: hint, url, embedUrl: url }\n }\n\n return { provider: 'file', url, embedUrl: url }\n}\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { parseVideoSource, type VideoProvider } from 'utils'\n import { useChatImageGate } from './chatImagePolicy'\n import PkHeldImage from './PkHeldImage.vue'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n interface VideoInput {\n url: string\n title?: string\n description?: string\n poster?: string\n provider?: VideoProvider\n }\n\n // Permissions granted to provider embeds (YouTube/Vimeo players).\n const IFRAME_ALLOW =\n 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share'\n\n /**\n * Where a YouTube or Vimeo player lives: the url is built here from the\n * video id, so nothing the model wrote reaches these hosts but the id.\n */\n const PLAYER_HOSTS = ['www.youtube-nocookie.com', 'player.vimeo.com']\n\n // A file, its poster, or an embed this card does not recognize, fetch the\n // url the model wrote as soon as they render: from a host the agent does\n // not list they wait for a click, like an image (chatImagePolicy.ts).\n const imageGate = useChatImageGate()\n\n const videos = computed(() => {\n const part = props.part as { input?: { videos?: VideoInput[] } }\n return (part.input?.videos ?? []).map((video) => {\n const source = parseVideoSource(video.url, video.provider)\n const fetched =\n source.provider === 'file'\n ? [source.embedUrl, video.poster]\n : [source.embedUrl]\n const gated = fetched.filter(\n (src): src is string =>\n !!src &&\n !PLAYER_HOSTS.includes(imageGate.hostOf(src) ?? ''),\n )\n return {\n ...video,\n source,\n gated,\n held: gated.some((src) => !imageGate.canLoad(src)),\n }\n })\n })\n\n function release(urls: string[]) {\n for (const url of urls) {\n imageGate.release(url)\n }\n }\n</script>\n\n<template>\n <div\n v-if=\"videos.length\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden bg-surface\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8 min-h-40\">\n <VvIcon name=\"ri:film-line\" class=\"text-16\" />\n <strong class=\"font-bold\">\n {{ $t('label.video') }}\n </strong>\n </div>\n <!-- Each video bleeds to the card's edges, like the map of the\n location card: the card's overflow clips the bottom corners. -->\n <div\n v-for=\"(video, index) in videos\"\n :key=\"video.url\"\n class=\"flex flex-col\"\n :class=\"{ 'border-t border-surface-3': index > 0 }\">\n <!-- Direct file: native player. Handles MP4/WebM/OGG and works\n inside the widget's Shadow DOM without any extra CSS. -->\n <div\n v-if=\"video.held\"\n class=\"w-full overflow-hidden\"\n style=\"aspect-ratio: 16 / 9\">\n <PkHeldImage\n :host=\"imageGate.hostOf(video.gated[0])\"\n kind=\"video\"\n fill\n @release=\"release(video.gated)\" />\n </div>\n <video\n v-else-if=\"video.source.provider === 'file'\"\n :src=\"video.source.embedUrl\"\n :poster=\"video.poster\"\n controls\n preload=\"metadata\"\n playsinline\n class=\"w-full bg-black\"\n style=\"aspect-ratio: 16 / 9; max-height: 480px\">\n <a :href=\"video.url\" target=\"_blank\" rel=\"noopener noreferrer\">\n {{ video.title ?? video.url }}\n </a>\n </video>\n <!-- Provider (YouTube/Vimeo): iframe embed, 16:9 responsive. -->\n <div\n v-else\n class=\"relative w-full overflow-hidden bg-black\"\n style=\"aspect-ratio: 16 / 9\">\n <iframe\n :src=\"video.source.embedUrl\"\n :title=\"video.title ?? video.url\"\n loading=\"lazy\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n :allow=\"IFRAME_ALLOW\"\n allowfullscreen\n class=\"absolute inset-0 w-full h-full border-0\"></iframe>\n </div>\n <div\n v-if=\"video.title || video.description\"\n class=\"p-sm flex flex-col gap-4 border-t border-surface-3\">\n <strong v-if=\"video.title\" class=\"font-bold text-14\">\n {{ video.title }}\n </strong>\n <span v-if=\"video.description\" class=\"text-12 text-word-3\">\n {{ video.description }}\n </span>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { parseVideoSource, type VideoProvider } from 'utils'\n import { useChatImageGate } from './chatImagePolicy'\n import PkHeldImage from './PkHeldImage.vue'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n interface VideoInput {\n url: string\n title?: string\n description?: string\n poster?: string\n provider?: VideoProvider\n }\n\n // Permissions granted to provider embeds (YouTube/Vimeo players).\n const IFRAME_ALLOW =\n 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share'\n\n /**\n * Where a YouTube or Vimeo player lives: the url is built here from the\n * video id, so nothing the model wrote reaches these hosts but the id.\n */\n const PLAYER_HOSTS = ['www.youtube-nocookie.com', 'player.vimeo.com']\n\n // A file, its poster, or an embed this card does not recognize, fetch the\n // url the model wrote as soon as they render: from a host the agent does\n // not list they wait for a click, like an image (chatImagePolicy.ts).\n const imageGate = useChatImageGate()\n\n const videos = computed(() => {\n const part = props.part as { input?: { videos?: VideoInput[] } }\n return (part.input?.videos ?? []).map((video) => {\n const source = parseVideoSource(video.url, video.provider)\n const fetched =\n source.provider === 'file'\n ? [source.embedUrl, video.poster]\n : [source.embedUrl]\n const gated = fetched.filter(\n (src): src is string =>\n !!src &&\n !PLAYER_HOSTS.includes(imageGate.hostOf(src) ?? ''),\n )\n return {\n ...video,\n source,\n gated,\n held: gated.some((src) => !imageGate.canLoad(src)),\n }\n })\n })\n\n function release(urls: string[]) {\n for (const url of urls) {\n imageGate.release(url)\n }\n }\n</script>\n\n<template>\n <div\n v-if=\"videos.length\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden bg-surface\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8 min-h-40\">\n <VvIcon name=\"ri:film-line\" class=\"text-16\" />\n <strong class=\"font-bold\">\n {{ $t('label.video') }}\n </strong>\n </div>\n <!-- Each video bleeds to the card's edges, like the map of the\n location card: the card's overflow clips the bottom corners. -->\n <div\n v-for=\"(video, index) in videos\"\n :key=\"video.url\"\n class=\"flex flex-col\"\n :class=\"{ 'border-t border-surface-3': index > 0 }\">\n <!-- Direct file: native player. Handles MP4/WebM/OGG and works\n inside the widget's Shadow DOM without any extra CSS. -->\n <div\n v-if=\"video.held\"\n class=\"w-full overflow-hidden\"\n style=\"aspect-ratio: 16 / 9\">\n <PkHeldImage\n :host=\"imageGate.hostOf(video.gated[0])\"\n kind=\"video\"\n fill\n @release=\"release(video.gated)\" />\n </div>\n <video\n v-else-if=\"video.source.provider === 'file'\"\n :src=\"video.source.embedUrl\"\n :poster=\"video.poster\"\n controls\n preload=\"metadata\"\n playsinline\n class=\"w-full bg-black\"\n style=\"aspect-ratio: 16 / 9; max-height: 480px\">\n <a :href=\"video.url\" target=\"_blank\" rel=\"noopener noreferrer\">\n {{ video.title ?? video.url }}\n </a>\n </video>\n <!-- Provider (YouTube/Vimeo): iframe embed, 16:9 responsive. -->\n <div\n v-else\n class=\"relative w-full overflow-hidden bg-black\"\n style=\"aspect-ratio: 16 / 9\">\n <iframe\n :src=\"video.source.embedUrl\"\n :title=\"video.title ?? video.url\"\n loading=\"lazy\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n :allow=\"IFRAME_ALLOW\"\n allowfullscreen\n class=\"absolute inset-0 w-full h-full border-0\"></iframe>\n </div>\n <div\n v-if=\"video.title || video.description\"\n class=\"p-sm flex flex-col gap-4 border-t border-surface-3\">\n <strong v-if=\"video.title\" class=\"font-bold text-14\">\n {{ video.title }}\n </strong>\n <span v-if=\"video.description\" class=\"text-12 text-word-3\">\n {{ video.description }}\n </span>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"PkToolShowVideo-xcg1gdIE.js","names":["$t","__unplugin_components_0","_openBlock","_createElementBlock","_createElementVNode","_createVNode","_toDisplayString","_Fragment","_renderList","_normalizeClass","PkHeldImage","_unref","_createCommentVNode","_sfc_main","useChatImageGate","sanitizeId","raw","hostMatches","host","domain","youtubeId","u","v","m","vimeoId","parseVideoSource","url","id","hint","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","IFRAME_ALLOW","PkToolShowVideo_default","defineComponent","props","__props","PLAYER_HOSTS","imageGate","videos","computed","source","video","gated","src","release","urls","_component_VvIcon","VvIcon","openBlock","createElementBlock","createElementVNode","createVNode","toDisplayString","_ctx","Fragment","renderList","normalizeClass","index","PkHeldImage_default","unref","createCommentVNode"],"sources":["../../../../packages/utils/src/video-source.ts","../../../../packages/components/src/chat/PkToolShowVideo.vue","../../../../packages/components/src/chat/PkToolShowVideo.vue"],"sourcesContent":["/**\n * Video source parsing shared by the backend platform renderer and the frontend\n * player component, so both classify a video URL the same way.\n *\n * A URL is either a known provider (YouTube/Vimeo), which plays through the\n * provider's iframe embed, or a direct media file (`file`), which plays in a\n * native `<video>` element. Detection is by URL shape; an explicit `hint` is\n * used only as a fallback when the URL alone is inconclusive.\n */\n\nexport type VideoProvider = 'youtube' | 'vimeo' | 'file'\n\nexport interface ParsedVideoSource {\n provider: VideoProvider\n /** The original URL, unchanged. */\n url: string\n /**\n * The URL to actually load: the provider iframe embed URL for\n * YouTube/Vimeo, or the direct file URL for `file`.\n */\n embedUrl: string\n /** The provider video id (providers only). */\n videoId?: string\n /**\n * A preview image URL derived from the provider, when one is available\n * without an extra API call (currently YouTube only). Lets a link-only\n * surface (e.g. a Teams card) show a thumbnail instead of a bare link.\n */\n thumbnailUrl?: string\n}\n\n/** Keep only characters that are legal in a provider video id. */\nconst sanitizeId = (raw: string): string => raw.replace(/[^a-zA-Z0-9_-]/g, '')\n\n/**\n * True when `host` is exactly `domain` or a subdomain of it. Guards against\n * lookalike hosts (e.g. `notyoutube.com`) that a bare substring check would\n * misclassify.\n */\nconst hostMatches = (host: string, domain: string): boolean =>\n host === domain || host.endsWith(`.${domain}`)\n\n/** Extract the YouTube video id from any of its URL shapes, or null. */\nconst youtubeId = (u: URL): string | null => {\n // youtu.be/<id>\n if (u.hostname.endsWith('youtu.be')) {\n return sanitizeId(u.pathname.split('/')[1] ?? '') || null\n }\n // youtube.com/watch?v=<id>\n const v = u.searchParams.get('v')\n if (v) {\n return sanitizeId(v) || null\n }\n // youtube.com/shorts/<id>, /live/<id>, /embed/<id>, /v/<id>\n const m = u.pathname.match(/^\\/(?:shorts|live|embed|v)\\/([^/?#]+)/)\n return m ? sanitizeId(m[1]) || null : null\n}\n\n/** Extract the Vimeo (numeric) video id, or null. */\nconst vimeoId = (u: URL): string | null => {\n // player.vimeo.com/video/<id> or vimeo.com/<id>\n const m = u.pathname.match(/(?:^|\\/)(\\d+)(?:$|[/?#])/)\n return m ? m[1] : null\n}\n\n/**\n * Classify a video URL into a provider + a loadable embed/file URL.\n * Falls back to `file` (native `<video>`) for anything not recognized as a\n * supported provider, or when a provider is matched but no id can be extracted.\n */\nexport function parseVideoSource(\n url: string,\n hint?: VideoProvider,\n): ParsedVideoSource {\n let u: URL | undefined\n try {\n u = new URL(url)\n } catch {\n // Not an absolute URL: treat as a direct file reference.\n return { provider: 'file', url, embedUrl: url }\n }\n\n const host = u.hostname.toLowerCase()\n\n const isYouTube =\n hostMatches(host, 'youtube.com') ||\n hostMatches(host, 'youtu.be') ||\n hostMatches(host, 'youtube-nocookie.com')\n if (isYouTube) {\n const id = youtubeId(u)\n if (id) {\n return {\n provider: 'youtube',\n url,\n videoId: id,\n embedUrl: `https://www.youtube-nocookie.com/embed/${id}`,\n thumbnailUrl: `https://img.youtube.com/vi/${id}/hqdefault.jpg`,\n }\n }\n }\n\n if (hostMatches(host, 'vimeo.com')) {\n const id = vimeoId(u)\n if (id) {\n return {\n provider: 'vimeo',\n url,\n videoId: id,\n // `dnt=1`: the player sets no cookies and records no session\n // data, the Vimeo counterpart of youtube-nocookie above.\n embedUrl: `https://player.vimeo.com/video/${id}?dnt=1`,\n }\n }\n }\n\n // Honor an explicit provider hint only if we could not extract an id from a\n // provider URL (so a caller-tagged provider link still routes to an iframe\n // via its original URL rather than a broken native <video>).\n if (hint && hint !== 'file') {\n return { provider: hint, url, embedUrl: url }\n }\n\n return { provider: 'file', url, embedUrl: url }\n}\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { parseVideoSource, type VideoProvider } from 'utils'\n import { useChatImageGate } from './chatImagePolicy'\n import PkHeldImage from './PkHeldImage.vue'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n interface VideoInput {\n url: string\n title?: string\n description?: string\n poster?: string\n provider?: VideoProvider\n }\n\n // Permissions granted to provider embeds (YouTube/Vimeo players).\n const IFRAME_ALLOW =\n 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share'\n\n /**\n * Where a YouTube or Vimeo player lives: the url is built here from the\n * video id, so nothing the model wrote reaches these hosts but the id.\n */\n const PLAYER_HOSTS = ['www.youtube-nocookie.com', 'player.vimeo.com']\n\n // A file, its poster, or an embed this card does not recognize, fetch the\n // url the model wrote as soon as they render: from a host the agent does\n // not list they wait for a click, like an image (chatImagePolicy.ts).\n const imageGate = useChatImageGate()\n\n const videos = computed(() => {\n const part = props.part as { input?: { videos?: VideoInput[] } }\n return (part.input?.videos ?? []).map((video) => {\n const source = parseVideoSource(video.url, video.provider)\n const fetched =\n source.provider === 'file'\n ? [source.embedUrl, video.poster]\n : [source.embedUrl]\n const gated = fetched.filter(\n (src): src is string =>\n !!src &&\n !PLAYER_HOSTS.includes(imageGate.hostOf(src) ?? ''),\n )\n return {\n ...video,\n source,\n gated,\n held: gated.some((src) => !imageGate.canLoad(src)),\n }\n })\n })\n\n function release(urls: string[]) {\n for (const url of urls) {\n imageGate.release(url)\n }\n }\n</script>\n\n<template>\n <div\n v-if=\"videos.length\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden bg-surface\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8 min-h-40\">\n <VvIcon name=\"ri:film-line\" class=\"text-16\" />\n <strong class=\"font-bold\">\n {{ $t('label.video') }}\n </strong>\n </div>\n <!-- Each video bleeds to the card's edges, like the map of the\n location card: the card's overflow clips the bottom corners. -->\n <div\n v-for=\"(video, index) in videos\"\n :key=\"video.url\"\n class=\"flex flex-col\"\n :class=\"{ 'border-t border-surface-3': index > 0 }\">\n <!-- Direct file: native player. Handles MP4/WebM/OGG and works\n inside the widget's Shadow DOM without any extra CSS. -->\n <div\n v-if=\"video.held\"\n class=\"w-full overflow-hidden\"\n style=\"aspect-ratio: 16 / 9\">\n <PkHeldImage\n :host=\"imageGate.hostOf(video.gated[0])\"\n kind=\"video\"\n fill\n @release=\"release(video.gated)\" />\n </div>\n <video\n v-else-if=\"video.source.provider === 'file'\"\n :src=\"video.source.embedUrl\"\n :poster=\"video.poster\"\n controls\n preload=\"metadata\"\n playsinline\n class=\"w-full bg-black\"\n style=\"aspect-ratio: 16 / 9; max-height: 480px\">\n <a :href=\"video.url\" target=\"_blank\" rel=\"noopener noreferrer\">\n {{ video.title ?? video.url }}\n </a>\n </video>\n <!-- Provider (YouTube/Vimeo): iframe embed, 16:9 responsive. -->\n <div\n v-else\n class=\"relative w-full overflow-hidden bg-black\"\n style=\"aspect-ratio: 16 / 9\">\n <iframe\n :src=\"video.source.embedUrl\"\n :title=\"video.title ?? video.url\"\n loading=\"lazy\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n :allow=\"IFRAME_ALLOW\"\n allowfullscreen\n class=\"absolute inset-0 w-full h-full border-0\"></iframe>\n </div>\n <div\n v-if=\"video.title || video.description\"\n class=\"p-sm flex flex-col gap-4 border-t border-surface-3\">\n <strong v-if=\"video.title\" class=\"font-bold text-14\">\n {{ video.title }}\n </strong>\n <span v-if=\"video.description\" class=\"text-12 text-word-3\">\n {{ video.description }}\n </span>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { parseVideoSource, type VideoProvider } from 'utils'\n import { useChatImageGate } from './chatImagePolicy'\n import PkHeldImage from './PkHeldImage.vue'\n\n const props = defineProps<{\n part: unknown\n }>()\n\n interface VideoInput {\n url: string\n title?: string\n description?: string\n poster?: string\n provider?: VideoProvider\n }\n\n // Permissions granted to provider embeds (YouTube/Vimeo players).\n const IFRAME_ALLOW =\n 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share'\n\n /**\n * Where a YouTube or Vimeo player lives: the url is built here from the\n * video id, so nothing the model wrote reaches these hosts but the id.\n */\n const PLAYER_HOSTS = ['www.youtube-nocookie.com', 'player.vimeo.com']\n\n // A file, its poster, or an embed this card does not recognize, fetch the\n // url the model wrote as soon as they render: from a host the agent does\n // not list they wait for a click, like an image (chatImagePolicy.ts).\n const imageGate = useChatImageGate()\n\n const videos = computed(() => {\n const part = props.part as { input?: { videos?: VideoInput[] } }\n return (part.input?.videos ?? []).map((video) => {\n const source = parseVideoSource(video.url, video.provider)\n const fetched =\n source.provider === 'file'\n ? [source.embedUrl, video.poster]\n : [source.embedUrl]\n const gated = fetched.filter(\n (src): src is string =>\n !!src &&\n !PLAYER_HOSTS.includes(imageGate.hostOf(src) ?? ''),\n )\n return {\n ...video,\n source,\n gated,\n held: gated.some((src) => !imageGate.canLoad(src)),\n }\n })\n })\n\n function release(urls: string[]) {\n for (const url of urls) {\n imageGate.release(url)\n }\n }\n</script>\n\n<template>\n <div\n v-if=\"videos.length\"\n class=\"border border-surface-3 rounded-xl w-full overflow-hidden bg-surface\">\n <div\n class=\"px-sm py-6 bg-surface-1 text-12 border-b border-surface-3 text-word-3 flex items-center gap-8 min-h-40\">\n <VvIcon name=\"ri:film-line\" class=\"text-16\" />\n <strong class=\"font-bold\">\n {{ $t('label.video') }}\n </strong>\n </div>\n <!-- Each video bleeds to the card's edges, like the map of the\n location card: the card's overflow clips the bottom corners. -->\n <div\n v-for=\"(video, index) in videos\"\n :key=\"video.url\"\n class=\"flex flex-col\"\n :class=\"{ 'border-t border-surface-3': index > 0 }\">\n <!-- Direct file: native player. Handles MP4/WebM/OGG and works\n inside the widget's Shadow DOM without any extra CSS. -->\n <div\n v-if=\"video.held\"\n class=\"w-full overflow-hidden\"\n style=\"aspect-ratio: 16 / 9\">\n <PkHeldImage\n :host=\"imageGate.hostOf(video.gated[0])\"\n kind=\"video\"\n fill\n @release=\"release(video.gated)\" />\n </div>\n <video\n v-else-if=\"video.source.provider === 'file'\"\n :src=\"video.source.embedUrl\"\n :poster=\"video.poster\"\n controls\n preload=\"metadata\"\n playsinline\n class=\"w-full bg-black\"\n style=\"aspect-ratio: 16 / 9; max-height: 480px\">\n <a :href=\"video.url\" target=\"_blank\" rel=\"noopener noreferrer\">\n {{ video.title ?? video.url }}\n </a>\n </video>\n <!-- Provider (YouTube/Vimeo): iframe embed, 16:9 responsive. -->\n <div\n v-else\n class=\"relative w-full overflow-hidden bg-black\"\n style=\"aspect-ratio: 16 / 9\">\n <iframe\n :src=\"video.source.embedUrl\"\n :title=\"video.title ?? video.url\"\n loading=\"lazy\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n :allow=\"IFRAME_ALLOW\"\n allowfullscreen\n class=\"absolute inset-0 w-full h-full border-0\"></iframe>\n </div>\n <div\n v-if=\"video.title || video.description\"\n class=\"p-sm flex flex-col gap-4 border-t border-surface-3\">\n <strong v-if=\"video.title\" class=\"font-bold text-14\">\n {{ video.title }}\n </strong>\n <span v-if=\"video.description\" class=\"text-12 text-word-3\">\n {{ video.description }}\n </span>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { S as e, _ as t, o as n, v as r } from "./schemas-Bu1lick6.js";
2
- import "./src-DCfvejyT.js";
2
+ import "./src-DpkuiHam.js";
3
3
  import { VvAccordion as i, VvIcon as a } from "@volverjs/ui-vue/components";
4
4
  import { Fragment as o, Transition as s, computed as c, createBlock as ee, createCommentVNode as l, createElementBlock as u, createElementVNode as d, createTextVNode as f, createVNode as p, defineComponent as m, normalizeClass as h, openBlock as g, ref as _, renderList as v, toDisplayString as y, unref as b, watch as te, withCtx as x } from "vue";
5
5
  import { useI18n as ne } from "vue-i18n";
@@ -336,4 +336,4 @@ var ae = {
336
336
  //#endregion
337
337
  export { q as default };
338
338
 
339
- //# sourceMappingURL=PkToolShowWeather-BOuNrvY2.js.map
339
+ //# sourceMappingURL=PkToolShowWeather-DJxKxVp_.js.map