@8wave/ai-elements 0.119.0-beta.33 → 0.119.0-beta.45

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 (96) hide show
  1. package/dist/_chunks/Agent-Gdgpd3LA.js.map +1 -1
  2. package/dist/_chunks/{PkToolShowSources-D532Worv.js → PkToolShowSources-B1zXilsH.js} +2 -2
  3. package/dist/_chunks/{PkToolShowSources-D532Worv.js.map → PkToolShowSources-B1zXilsH.js.map} +1 -1
  4. package/dist/_chunks/{markdown-BbaLt57-.js → markdown-DtdG9Krq.js} +95 -89
  5. package/dist/_chunks/markdown-DtdG9Krq.js.map +1 -0
  6. package/dist/ai-elements.es.js +405 -403
  7. package/dist/ai-elements.es.js.map +1 -1
  8. package/dist-vue/PkChatbot.js +1 -1
  9. package/dist-vue/PkChatbotEmptyState.js +1 -1
  10. package/dist-vue/PkChatbotInput.js +1 -1
  11. package/dist-vue/PkChatbotMessages.js +1 -1
  12. package/dist-vue/PkChatbotStepPayload.js +1 -1
  13. package/dist-vue/PkChatbotStepToolDetail.js +1 -1
  14. package/dist-vue/PkChatbotSteps.js +1 -1
  15. package/dist-vue/PkChatbotViewChat.js +1 -1
  16. package/dist-vue/PkChatbotViewConversations.js +1 -1
  17. package/dist-vue/PkChatbotViewFiles.js +1 -1
  18. package/dist-vue/PkChatbotViewProfile.js +1 -1
  19. package/dist-vue/_chunks/{Agent-DU1WWaHR.js → Agent-DGCZCx4Y.js} +102 -101
  20. package/dist-vue/_chunks/Agent-DGCZCx4Y.js.map +1 -0
  21. package/dist-vue/_chunks/{Document-Cto-Qws0.js → Document-BZea8ewV.js} +8 -4
  22. package/dist-vue/_chunks/Document-BZea8ewV.js.map +1 -0
  23. package/dist-vue/_chunks/{PkChatbot-wODOAtOD.js → PkChatbot-BVWLvaXb.js} +8 -8
  24. package/dist-vue/_chunks/{PkChatbot-wODOAtOD.js.map → PkChatbot-BVWLvaXb.js.map} +1 -1
  25. package/dist-vue/_chunks/{PkChatbotEmptyState-Dx4mTkTX.js → PkChatbotEmptyState-B7fZ51v1.js} +2 -2
  26. package/dist-vue/_chunks/{PkChatbotEmptyState-Dx4mTkTX.js.map → PkChatbotEmptyState-B7fZ51v1.js.map} +1 -1
  27. package/dist-vue/_chunks/{PkChatbotInput-jj3qQl_f.js → PkChatbotInput-Bo4Ewf6A.js} +2 -2
  28. package/dist-vue/_chunks/{PkChatbotInput-jj3qQl_f.js.map → PkChatbotInput-Bo4Ewf6A.js.map} +1 -1
  29. package/dist-vue/_chunks/PkChatbotMessages-DHZNG6YM.js +881 -0
  30. package/dist-vue/_chunks/PkChatbotMessages-DHZNG6YM.js.map +1 -0
  31. package/dist-vue/_chunks/{PkChatbotStepPayload-f2mYAVpu.js → PkChatbotStepPayload-DuI9ZYqp.js} +2 -2
  32. package/dist-vue/_chunks/{PkChatbotStepPayload-f2mYAVpu.js.map → PkChatbotStepPayload-DuI9ZYqp.js.map} +1 -1
  33. package/dist-vue/_chunks/{PkChatbotStepToolDetail-BcYheOnU.js → PkChatbotStepToolDetail-B9hBMl15.js} +3 -3
  34. package/dist-vue/_chunks/{PkChatbotStepToolDetail-BcYheOnU.js.map → PkChatbotStepToolDetail-B9hBMl15.js.map} +1 -1
  35. package/dist-vue/_chunks/PkChatbotSteps-3qySSEYh.js +189 -0
  36. package/dist-vue/_chunks/PkChatbotSteps-3qySSEYh.js.map +1 -0
  37. package/dist-vue/_chunks/{PkChatbotViewChat-DZqXDwzk.js → PkChatbotViewChat-CLyoZH3C.js} +7 -7
  38. package/dist-vue/_chunks/{PkChatbotViewChat-DZqXDwzk.js.map → PkChatbotViewChat-CLyoZH3C.js.map} +1 -1
  39. package/dist-vue/_chunks/{PkChatbotViewConversations-CXcToApC.js → PkChatbotViewConversations-BbXFoEOv.js} +3 -3
  40. package/dist-vue/_chunks/{PkChatbotViewConversations-CXcToApC.js.map → PkChatbotViewConversations-BbXFoEOv.js.map} +1 -1
  41. package/dist-vue/_chunks/{PkChatbotViewFiles-O8lhbXAX.js → PkChatbotViewFiles-7vcERhnZ.js} +3 -3
  42. package/dist-vue/_chunks/{PkChatbotViewFiles-O8lhbXAX.js.map → PkChatbotViewFiles-7vcERhnZ.js.map} +1 -1
  43. package/dist-vue/_chunks/{PkChatbotViewProfile-kryFJi0l.js → PkChatbotViewProfile-RgFp-LpV.js} +2 -2
  44. package/dist-vue/_chunks/{PkChatbotViewProfile-kryFJi0l.js.map → PkChatbotViewProfile-RgFp-LpV.js.map} +1 -1
  45. package/dist-vue/_chunks/{PkStreamingMarkdown-CywawRVj.js → PkStreamingMarkdown-Bmm1kZpL.js} +3 -3
  46. package/dist-vue/_chunks/{PkStreamingMarkdown-CywawRVj.js.map → PkStreamingMarkdown-Bmm1kZpL.js.map} +1 -1
  47. package/dist-vue/_chunks/{PkToolEditSpreadsheet-BT4HueLs.js → PkToolEditSpreadsheet-BIQky1RK.js} +2 -2
  48. package/dist-vue/_chunks/{PkToolEditSpreadsheet-BT4HueLs.js.map → PkToolEditSpreadsheet-BIQky1RK.js.map} +1 -1
  49. package/dist-vue/_chunks/{PkToolRequestGeolocation-JZYgc-2X.js → PkToolRequestGeolocation-CYEyXZSh.js} +2 -2
  50. package/dist-vue/_chunks/{PkToolRequestGeolocation-JZYgc-2X.js.map → PkToolRequestGeolocation-CYEyXZSh.js.map} +1 -1
  51. package/dist-vue/_chunks/{PkToolRequestOAuthConnection-Ck2tRuls.js → PkToolRequestOAuthConnection-B243GJ1-.js} +2 -2
  52. package/dist-vue/_chunks/{PkToolRequestOAuthConnection-Ck2tRuls.js.map → PkToolRequestOAuthConnection-B243GJ1-.js.map} +1 -1
  53. package/dist-vue/_chunks/{PkToolShowArtifact-BiFJoOTT.js → PkToolShowArtifact-CJG-B9mE.js} +2 -2
  54. package/dist-vue/_chunks/{PkToolShowArtifact-BiFJoOTT.js.map → PkToolShowArtifact-CJG-B9mE.js.map} +1 -1
  55. package/dist-vue/_chunks/{PkToolShowContactForm-B7DvA6O1.js → PkToolShowContactForm-CG1H7xBz.js} +2 -2
  56. package/dist-vue/_chunks/{PkToolShowContactForm-B7DvA6O1.js.map → PkToolShowContactForm-CG1H7xBz.js.map} +1 -1
  57. package/dist-vue/_chunks/{PkToolShowDiagram-DGMwlxqB.js → PkToolShowDiagram-Cq0457a3.js} +2 -2
  58. package/dist-vue/_chunks/{PkToolShowDiagram-DGMwlxqB.js.map → PkToolShowDiagram-Cq0457a3.js.map} +1 -1
  59. package/dist-vue/_chunks/{PkToolShowForm-BZmAnMSD.js → PkToolShowForm-IJ8B8_yT.js} +4 -4
  60. package/dist-vue/_chunks/{PkToolShowForm-BZmAnMSD.js.map → PkToolShowForm-IJ8B8_yT.js.map} +1 -1
  61. package/dist-vue/_chunks/{PkToolShowImageGallery-BsYTRg_W.js → PkToolShowImageGallery-ala8nlAj.js} +2 -2
  62. package/dist-vue/_chunks/{PkToolShowImageGallery-BsYTRg_W.js.map → PkToolShowImageGallery-ala8nlAj.js.map} +1 -1
  63. package/dist-vue/_chunks/{PkToolShowProductList-D1_v79Xm.js → PkToolShowProductList-BDg84ZQN.js} +2 -2
  64. package/dist-vue/_chunks/{PkToolShowProductList-D1_v79Xm.js.map → PkToolShowProductList-BDg84ZQN.js.map} +1 -1
  65. package/dist-vue/_chunks/{PkToolShowSources-Czu2IiGq.js → PkToolShowSources-DaSijN_L.js} +3 -3
  66. package/dist-vue/_chunks/{PkToolShowSources-Czu2IiGq.js.map → PkToolShowSources-DaSijN_L.js.map} +1 -1
  67. package/dist-vue/_chunks/{PkToolShowSuggestedReply-I6FBos-F.js → PkToolShowSuggestedReply-CLEFPrHP.js} +2 -2
  68. package/dist-vue/_chunks/{PkToolShowSuggestedReply-I6FBos-F.js.map → PkToolShowSuggestedReply-CLEFPrHP.js.map} +1 -1
  69. package/dist-vue/_chunks/{PkToolShowVideo-D3D2sTAP.js → PkToolShowVideo-FmE-IRE7.js} +2 -2
  70. package/dist-vue/_chunks/{PkToolShowVideo-D3D2sTAP.js.map → PkToolShowVideo-FmE-IRE7.js.map} +1 -1
  71. package/dist-vue/_chunks/{PkToolShowWebPages-DTq0811l.js → PkToolShowWebPages-B554-MlD.js} +2 -2
  72. package/dist-vue/_chunks/{PkToolShowWebPages-DTq0811l.js.map → PkToolShowWebPages-B554-MlD.js.map} +1 -1
  73. package/dist-vue/_chunks/{createChatbotApiClient-BlJ952Kb.js → createChatbotApiClient-CDS3C4i6.js} +2 -2
  74. package/dist-vue/_chunks/createChatbotApiClient-CDS3C4i6.js.map +1 -0
  75. package/dist-vue/_chunks/{useChatbotStore-CueyhDPB.js → useChatbotStore-CBjBe7GI.js} +3 -3
  76. package/dist-vue/_chunks/{useChatbotStore-CueyhDPB.js.map → useChatbotStore-CBjBe7GI.js.map} +1 -1
  77. package/dist-vue/_chunks/{utils-DmRXPCqa.js → utils-Cvijhryt.js} +2 -2
  78. package/dist-vue/_chunks/{utils-DmRXPCqa.js.map → utils-Cvijhryt.js.map} +1 -1
  79. package/dist-vue/api.js +1 -1
  80. package/dist-vue/composables.js +3 -3
  81. package/dist-vue/index.js +26 -26
  82. package/dist-vue/index.js.map +1 -1
  83. package/dist-vue/packages/composable/src/chatbot/useChatbotStore.d.ts +6 -0
  84. package/dist-vue/packages/models/src/schema/Branding.d.ts +5 -0
  85. package/dist-vue/packages/models/src/schema/Chat.d.ts +8 -0
  86. package/dist-vue/packages/models/src/schema/ModelProvider.d.ts +12 -1
  87. package/dist-vue/packages/models/src/schema/constants.d.ts +26 -1
  88. package/package.json +1 -1
  89. package/dist/_chunks/markdown-BbaLt57-.js.map +0 -1
  90. package/dist-vue/_chunks/Agent-DU1WWaHR.js.map +0 -1
  91. package/dist-vue/_chunks/Document-Cto-Qws0.js.map +0 -1
  92. package/dist-vue/_chunks/PkChatbotMessages-5wPl7-j-.js +0 -876
  93. package/dist-vue/_chunks/PkChatbotMessages-5wPl7-j-.js.map +0 -1
  94. package/dist-vue/_chunks/PkChatbotSteps-DKyF0ykL.js +0 -191
  95. package/dist-vue/_chunks/PkChatbotSteps-DKyF0ykL.js.map +0 -1
  96. package/dist-vue/_chunks/createChatbotApiClient-BlJ952Kb.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { $ as e, C as t, Ct as n, Dt as r, L as i, O as a, St as o, _ as s, b as c, d as l, ft as u, g as d, h as f, it as p, m, mt as ee, r as h, t as g, v as _, wt as v, x as y, z as b } from "./vue.runtime.esm-bundler-DKVd2gci.js";
2
2
  import { t as x } from "./PkStreamingMarkdown-B1t1tBvW.js";
3
- import { r as S, t as C } from "./markdown-BbaLt57-.js";
3
+ import { r as S, t as C } from "./markdown-DtdG9Krq.js";
4
4
  import "./src-CggZ5M7x.js";
5
5
  import { t as w } from "./index.es-dTcgyeM4.js";
6
6
  import { t as T } from "./VvButtonLocalized-DV-zbH9b.js";
@@ -268,4 +268,4 @@ var F = {
268
268
  //#endregion
269
269
  export { $ as default };
270
270
 
271
- //# sourceMappingURL=PkToolShowSources-D532Worv.js.map
271
+ //# sourceMappingURL=PkToolShowSources-B1zXilsH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PkToolShowSources-D532Worv.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","withCtx","defineComponent","init_shared_esm_bundler","toDisplayString","openBlock","init_runtime_core_esm_bundler","unref","createCommentVNode","createTextVNode","Fragment","reactive","createBlock","createBaseVNode","init_reactivity_esm_bundler","ref","init_runtime_dom_esm_bundler","Transition","createElementBlock","normalizeClass","createVNode","renderList","PkStreamingMarkdown_default","getTypeIcon","stripMarkdown","Ae","VvButtonLocalized","PkUrl_default","_hoisted_1$2","_hoisted_2$2","PkChunkPreview_default","props","__props","similarityPercent","computed","max","_component_VvIcon","_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_default","toolPart","sources","groupedSources","groups","source","existing","maxSimilarity","s","expandedDocuments","expandedChunks","contextData","loadingContext","toggleDocument","documentId","toggleChunk","chunkId","handleExpandContext","content","clearContext","showMore","visibleGroups","hasMore","_component_VvButton","_ctx","group","chunk","_cache"],"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
+ {"version":3,"file":"PkToolShowSources-B1zXilsH.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","withCtx","defineComponent","init_shared_esm_bundler","toDisplayString","openBlock","init_runtime_core_esm_bundler","unref","createCommentVNode","createTextVNode","Fragment","reactive","createBlock","createBaseVNode","init_reactivity_esm_bundler","ref","init_runtime_dom_esm_bundler","Transition","createElementBlock","normalizeClass","createVNode","renderList","PkStreamingMarkdown_default","getTypeIcon","stripMarkdown","Ae","VvButtonLocalized","PkUrl_default","_hoisted_1$2","_hoisted_2$2","PkChunkPreview_default","props","__props","similarityPercent","computed","max","_component_VvIcon","_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_default","toolPart","sources","groupedSources","groups","source","existing","maxSimilarity","s","expandedDocuments","expandedChunks","contextData","loadingContext","toggleDocument","documentId","toggleChunk","chunkId","handleExpandContext","content","clearContext","showMore","visibleGroups","hasMore","_component_VvButton","_ctx","group","chunk","_cache"],"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,20 +1,26 @@
1
1
  import { C as e, S as t, _ as n, b as r, g as i, o as a, p as o, r as s, s as c, t as l, u, v as d, w as f, x as p, y as m } from "./zod-Dd1GFq_6.js";
2
2
  import { C as h, S as g, y as _ } from "./Agent-Gdgpd3LA.js";
3
+ //#region ../../packages/models/src/schema/constants.ts
4
+ var v = /* @__PURE__ */ "openai/gpt-5-nano,openai/gpt-5-mini,openai/gpt-5.1-thinking,openai/gpt-5.2,openai/gpt-5.4-nano,openai/gpt-5.4-mini,openai/gpt-5.4,openai/gpt-5.4-pro,openai/gpt-5.5,openai/gpt-5.5-pro,openai/gpt-5.6-luna,openai/gpt-5.6-terra,openai/gpt-5.6-sol,openai/gpt-5.6-luna-fast,openai/gpt-5.6-terra-fast,openai/gpt-5.6-sol-fast,openai/gpt-6-astra,openai/gpt-6-astra-fast,openai/gpt-6-sol,openai/gpt-6-sol-fast,openai/gpt-6-luna,openai/gpt-6-luna-fast,openai/gpt-6.1-sol,openai/gpt-6.1-sol-fast,google/gemini-2.5-flash-lite,google/gemini-2.5-flash,google/gemini-2.5-pro,google/gemini-3-flash,google/gemini-3.1-pro-preview,google/gemini-3.1-flash-lite,google/gemini-3.5-flash,google/gemini-3.5-flash-lite,google/gemini-3.6-flash,google/gemini-3.7-flash,google/gemini-3.8-flash,google/gemini-4-argon,anthropic/claude-haiku-4.5,anthropic/claude-haiku-5.5,anthropic/claude-sonnet-4.6,anthropic/claude-sonnet-5,anthropic/claude-sonnet-5.5,anthropic/claude-opus-4.6,anthropic/claude-opus-4.7,anthropic/claude-opus-4.8,anthropic/claude-opus-5,anthropic/claude-opus-5-fast,anthropic/claude-opus-5.5,anthropic/claude-opus-5.5-fast,anthropic/claude-fable-5,anthropic/claude-fable-5.1,deepseek/deepseek-v3.2,deepseek/deepseek-v4-flash-0731,deepseek/deepseek-v4.1-flash,deepseek/deepseek-v4-pro-0813,alibaba/qwen3.6-plus,alibaba/qwen3.7-max,alibaba/qwen3.7-plus,alibaba/qwen3.7-flash,alibaba/qwen3.8-flash,alibaba/qwen3.8-max,alibaba/qwen3.8-27b,alibaba/qwen3.8-max-0902,alibaba/qwen3.8-omni-flash,alibaba/qwen3.8-max-prime,spacexai/grok-4.3,spacexai/grok-4.6,spacexai/grok-4.7,zai/glm-5.2,zai/glm-5.2-fast,zai/glm-5.3,zai/glm-5.3-flash,zai/glm-5.3-fast,meta/muse-spark-1.1,meta/muse-spark-1.2,meta/muse-spark-1.3,meta/muse-wonder-1.0,moonshotai/kimi-k3,moonshotai/kimi-k3-fast,mistral/ministral-14b,mistral/mistral-small,mistral/mistral-medium-3.5,mistral/mistral-large-3,mistral/mistral-large-4".split(",");
3
5
  (/* @__PURE__ */ (function(e) {
4
6
  return e.textEmbedding3Small = "openai/text-embedding-3-small", e.textEmbedding3Large = "openai/text-embedding-3-large", e.geminiEmbedding2 = "google/gemini-embedding-2", e;
5
7
  })({})).geminiEmbedding2;
6
- var v = /* @__PURE__ */ function(e) {
8
+ var y = /* @__PURE__ */ function(e) {
7
9
  return e.it = "it", e.en = "en", e.es = "es", e.fr = "fr", e.de = "de", e;
8
10
  }({});
9
- v.it, v.en, v.es, v.fr, v.de;
10
- var y = /* @__PURE__ */ function(e) {
11
+ y.it, y.en, y.es, y.fr, y.de;
12
+ var b = /* @__PURE__ */ function(e) {
11
13
  return e.READABILITY = "readability", e.AI = "ai", e;
12
- }({}), b = /* @__PURE__ */ function(e) {
14
+ }({}), x = /* @__PURE__ */ function(e) {
13
15
  return e.FETCH = "fetch", e.PUPPETEER = "puppeteer", e.REMOTE = "remote", e;
14
- }({}), x = n({
16
+ }({});
17
+ new Set(v);
18
+ //#endregion
19
+ //#region ../../packages/models/src/schema/Header.ts
20
+ var S = n({
15
21
  key: r().optional(),
16
22
  value: r().optional()
17
- }), S = g(a(x), a(n({
23
+ }), C = g(a(S), a(n({
18
24
  key: r(),
19
25
  value: r()
20
26
  })), (e) => e?.filter((e) => e.key?.trim() && e.value?.trim()));
@@ -33,7 +39,7 @@ n({
33
39
  })));
34
40
  //#endregion
35
41
  //#region ../../packages/models/src/schema/Tabular.ts
36
- var C = n({
42
+ var w = n({
37
43
  name: r(),
38
44
  type: r(),
39
45
  column: r().optional(),
@@ -46,14 +52,14 @@ var C = n({
46
52
  ]),
47
53
  share: r()
48
54
  }).optional()
49
- }), w = n({
55
+ }), T = n({
50
56
  sheet: r(),
51
57
  table: r(),
52
58
  headerRow: i().optional(),
53
59
  rowCount: i(),
54
- columns: a(C),
60
+ columns: a(w),
55
61
  sample: a(m(r(), t()))
56
- }), T = n({
62
+ }), E = n({
57
63
  sheet: r(),
58
64
  reason: s([
59
65
  "chart",
@@ -61,10 +67,10 @@ var C = n({
61
67
  "too-wide",
62
68
  "unreadable"
63
69
  ])
64
- }), E = n({
70
+ }), D = n({
65
71
  converterVersion: i(),
66
- tables: a(w),
67
- skipped: a(T),
72
+ tables: a(T),
73
+ skipped: a(E),
68
74
  staleFormulas: c()
69
75
  });
70
76
  n({
@@ -74,47 +80,47 @@ n({
74
80
  "failed"
75
81
  ]),
76
82
  requestedAt: r(),
77
- conversion: E.optional(),
83
+ conversion: D.optional(),
78
84
  failure: r().optional(),
79
85
  failedConverterVersion: i().optional()
80
86
  });
81
- var D = E.extend({ sourceHash: r() }), O = /* @__PURE__ */ function(e) {
87
+ var O = D.extend({ sourceHash: r() }), k = /* @__PURE__ */ function(e) {
82
88
  return e.Pending = "pending", e.Processing = "processing", e.Success = "success", e.Failed = "failed", e;
83
- }({}), k = /* @__PURE__ */ function(e) {
84
- return e.Indexed = "indexed", e.Pending = "pending", e.Failed = "failed", e.Unavailable = "unavailable", e.Empty = "empty", e;
85
89
  }({}), A = /* @__PURE__ */ function(e) {
90
+ return e.Indexed = "indexed", e.Pending = "pending", e.Failed = "failed", e.Unavailable = "unavailable", e.Empty = "empty", e;
91
+ }({}), j = /* @__PURE__ */ function(e) {
86
92
  return e.Pending = "pending", e.Processing = "processing", e.Failed = "failed", e.Preparing = "preparing", e.Indexed = "indexed", e.NotIndexed = "not-indexed", e.Unavailable = "unavailable", e.Empty = "empty", e;
87
- }({}), j = n({
88
- extractionStrategy: s(y).optional(),
89
- browserEngine: s(b).optional().default(b.FETCH),
90
- headers: S.nullish(),
93
+ }({}), M = n({
94
+ extractionStrategy: s(b).optional(),
95
+ browserEngine: s(x).optional().default(x.FETCH),
96
+ headers: C.nullish(),
91
97
  aiDescriptionModel: r().optional(),
92
98
  aiDescriptionPrompt: r().max(5e3).optional(),
93
99
  language: r().optional(),
94
100
  forceOcr: c().default(!1),
95
101
  pages: r().max(100).regex(/^\d+(\s*-\s*\d+)?(\s*,\s*\d+(\s*-\s*\d+)?)*$/).optional(),
96
102
  asTables: c().optional()
97
- }), M = /* @__PURE__ */ function(e) {
103
+ }), N = /* @__PURE__ */ function(e) {
98
104
  return e.Web = "web", e.SharePoint = "sharepoint", e.GoogleDrive = "google-drive", e;
99
- }({}), N = /* @__PURE__ */ function(e) {
100
- return e.Updated = "updated", e.Unchanged = "unchanged", e.Failed = "failed", e.Shrunk = "shrunk", e.Gone = "gone", e;
101
105
  }({}), P = /* @__PURE__ */ function(e) {
106
+ return e.Updated = "updated", e.Unchanged = "unchanged", e.Failed = "failed", e.Shrunk = "shrunk", e.Gone = "gone", e;
107
+ }({}), F = /* @__PURE__ */ function(e) {
102
108
  return e.Daily = "daily", e.Weekly = "weekly", e.Monthly = "monthly", e;
103
109
  }({});
104
- P.Daily, P.Weekly, P.Monthly;
105
- var F = n({
110
+ F.Daily, F.Weekly, F.Monthly;
111
+ var I = n({
106
112
  at: r(),
107
- result: s(N),
113
+ result: s(P),
108
114
  httpStatus: i().optional(),
109
115
  error: r().optional(),
110
116
  consecutiveFailures: i().optional(),
111
117
  previousWordCount: i().optional(),
112
118
  newWordCount: i().optional()
113
- }), I = {
119
+ }), L = {
114
120
  contentHash: r().optional(),
115
- lastRefresh: F.optional()
116
- }, L = n({
117
- provider: o(M.Web),
121
+ lastRefresh: I.optional()
122
+ }, R = n({
123
+ provider: o(N.Web),
118
124
  url: r(),
119
125
  lastScrapedAt: r().optional(),
120
126
  extractionInputHash: r().optional(),
@@ -122,8 +128,8 @@ var F = n({
122
128
  sourceId: f().optional(),
123
129
  lastSyncedAt: r().optional(),
124
130
  lastmod: r().optional(),
125
- ...I
126
- }), R = {
131
+ ...L
132
+ }), z = {
127
133
  sourceId: f(),
128
134
  remoteId: r(),
129
135
  webUrl: r(),
@@ -139,21 +145,21 @@ var F = n({
139
145
  path: r(),
140
146
  lastModified: r().optional()
141
147
  }).optional(),
142
- ...I
143
- }, z = n({
144
- provider: o(M.SharePoint),
145
- ...R
146
- }), B = n({
147
- provider: o(M.GoogleDrive),
148
- ...R
149
- }), V = d((e) => e && typeof e == "object" && !Array.isArray(e) && !("provider" in e) ? {
150
- provider: M.Web,
148
+ ...L
149
+ }, B = n({
150
+ provider: o(N.SharePoint),
151
+ ...z
152
+ }), V = n({
153
+ provider: o(N.GoogleDrive),
154
+ ...z
155
+ }), H = d((e) => e && typeof e == "object" && !Array.isArray(e) && !("provider" in e) ? {
156
+ provider: N.Web,
151
157
  ...e
152
158
  } : e, u("provider", [
153
- L,
154
- z,
155
- B
156
- ])), H = [
159
+ R,
160
+ B,
161
+ V
162
+ ])), U = [
157
163
  "gateway-disabled",
158
164
  "endpoint-off",
159
165
  "model-unavailable",
@@ -161,7 +167,7 @@ var F = n({
161
167
  "format-unsupported",
162
168
  "credit-exhausted",
163
169
  "transcription-off"
164
- ], U = [
170
+ ], W = [
165
171
  "file-unreadable",
166
172
  "file-protected",
167
173
  "file-type-unsupported",
@@ -174,16 +180,16 @@ var F = n({
174
180
  "audio-too-large",
175
181
  "page-too-large"
176
182
  ];
177
- [...H, ...U];
178
- var W = n({
183
+ [...U, ...W];
184
+ var G = n({
179
185
  reason: r().optional(),
180
186
  status: i().optional(),
181
187
  url: r().optional(),
182
188
  limitBytes: i().optional(),
183
189
  message: r().optional(),
184
190
  at: r().optional()
185
- }).loose(), G = n({
186
- source: V.optional(),
191
+ }).loose(), K = n({
192
+ source: H.optional(),
187
193
  media: _.optional(),
188
194
  title: r().optional(),
189
195
  author: r().optional(),
@@ -221,12 +227,12 @@ var W = n({
221
227
  redundantChunksCount: i().optional(),
222
228
  hasRedundantChunks: c().optional(),
223
229
  searchIndexError: n({ at: r() }).optional(),
224
- conversionOptions: j.optional(),
225
- tabular: D.optional(),
226
- lastIndexError: W.optional().catch(void 0)
227
- }).loose(), K = /* @__PURE__ */ function(e) {
230
+ conversionOptions: M.optional(),
231
+ tabular: O.optional(),
232
+ lastIndexError: G.optional().catch(void 0)
233
+ }).loose(), q = /* @__PURE__ */ function(e) {
228
234
  return e.File = "file", e.Url = "url", e.RevisedAnswer = "revised-answer", e.PlainText = "plain-text", e;
229
- }({}), q = n({
235
+ }({}), J = n({
230
236
  id: r(),
231
237
  externalId: r().nullable(),
232
238
  name: r(),
@@ -245,24 +251,24 @@ var W = n({
245
251
  deletedBy: r().nullable(),
246
252
  organizationId: r(),
247
253
  priority: i().int().min(1).max(5).default(3),
248
- refreshInterval: s(P).nullable().optional(),
254
+ refreshInterval: s(F).nullable().optional(),
249
255
  nextRefreshAt: l().nullable().optional(),
250
- sourceProvider: s(M).nullable().optional()
256
+ sourceProvider: s(N).nullable().optional()
251
257
  }).extend({
252
- type: s(K),
253
- indexStatus: s(O),
254
- metadata: G,
258
+ type: s(q),
259
+ indexStatus: s(k),
260
+ metadata: K,
255
261
  chunksCount: i().optional(),
256
262
  redundantChunksCount: i().optional(),
257
263
  hasRedundantChunks: c().optional(),
258
- searchStatus: s(k).optional(),
264
+ searchStatus: s(A).optional(),
259
265
  agentIds: a(r()).optional(),
260
266
  folderId: r().nullable().optional(),
261
267
  folderPath: r().nullable().optional(),
262
268
  deletedByName: r().nullable().optional()
263
269
  });
264
- K.File, K.Url, K.PlainText, n({
265
- document: q,
270
+ q.File, q.Url, q.PlainText, n({
271
+ document: J,
266
272
  returnedToRoot: c()
267
273
  }), n({
268
274
  count: i().int(),
@@ -293,11 +299,11 @@ K.File, K.Url, K.PlainText, n({
293
299
  "filter[hasRedundantChunks]": r().optional(),
294
300
  "filter[refreshInterval]": r().optional(),
295
301
  "filter[sourceProvider]": r().optional(),
296
- "filter[status]": s(A).optional()
302
+ "filter[status]": s(j).optional()
297
303
  }), n({
298
- type: s(K).default(K.File),
304
+ type: s(q).default(q.File),
299
305
  name: r().min(1).max(255).optional(),
300
- language: s(v).optional(),
306
+ language: s(y).optional(),
301
307
  organizationId: r(),
302
308
  agentIds: a(r()).min(1, "At least one agent is required"),
303
309
  folderId: f().nullable().optional(),
@@ -305,34 +311,34 @@ K.File, K.Url, K.PlainText, n({
305
311
  url: e().optional(),
306
312
  content: r().optional(),
307
313
  metadata: m(r(), t()).optional(),
308
- extractionStrategy: s(y).optional(),
309
- browserEngine: s(b).optional(),
310
- headers: S.nullish().default([]),
314
+ extractionStrategy: s(b).optional(),
315
+ browserEngine: s(x).optional(),
316
+ headers: C.nullish().default([]),
311
317
  aiDescriptionModel: r().optional(),
312
318
  aiDescriptionPrompt: r().max(5e3).optional(),
313
319
  forceOcr: c().default(!1),
314
320
  pages: r().max(100).regex(/^\d+(\s*-\s*\d+)?(\s*,\s*\d+(\s*-\s*\d+)?)*$/).optional(),
315
321
  priority: i().int().min(1).max(5).default(3).optional(),
316
- refreshInterval: s(P).nullable().optional(),
322
+ refreshInterval: s(F).nullable().optional(),
317
323
  syncSourceId: f().optional()
318
324
  }).superRefine((e, t) => {
319
- e.syncSourceId && e.type !== K.Url && t.addIssue({
325
+ e.syncSourceId && e.type !== q.Url && t.addIssue({
320
326
  code: "custom",
321
327
  params: { i18n: "errors.syncSourceUrlOnly" },
322
328
  path: ["syncSourceId"]
323
- }), e.type === K.File && !e.media ? t.addIssue({
329
+ }), e.type === q.File && !e.media ? t.addIssue({
324
330
  code: "custom",
325
331
  params: { i18n: "errors.required" },
326
332
  path: ["media"]
327
- }) : (e.type === K.Url && !e.url && t.addIssue({
333
+ }) : (e.type === q.Url && !e.url && t.addIssue({
328
334
  code: "custom",
329
335
  params: { i18n: "errors.required" },
330
336
  path: ["url"]
331
- }), e.refreshInterval && e.type !== K.Url && t.addIssue({
337
+ }), e.refreshInterval && e.type !== q.Url && t.addIssue({
332
338
  code: "custom",
333
339
  params: { i18n: "errors.refreshIntervalUrlOnly" },
334
340
  path: ["refreshInterval"]
335
- }), e.type === K.PlainText && !(e.name || e.language) && (e.name || t.addIssue({
341
+ }), e.type === q.PlainText && !(e.name || e.language) && (e.name || t.addIssue({
336
342
  code: "custom",
337
343
  params: { i18n: "errors.required" },
338
344
  path: ["name"]
@@ -346,25 +352,25 @@ K.File, K.Url, K.PlainText, n({
346
352
  organizationId: r(),
347
353
  content: r().optional(),
348
354
  name: r().min(1).max(255).optional(),
349
- language: s(v).optional(),
355
+ language: s(y).optional(),
350
356
  priority: i().int().min(1).max(5).optional(),
351
357
  agentIds: a(r()).min(1).optional(),
352
358
  metadata: m(r(), t()).optional(),
353
- refreshInterval: s(P).nullable().optional()
354
- }), n({ refreshInterval: s(P).nullable() }), n({
359
+ refreshInterval: s(F).nullable().optional()
360
+ }), n({ refreshInterval: s(F).nullable() }), n({
355
361
  ids: a(f()).min(1).max(100),
356
- refreshInterval: s(P).nullable()
362
+ refreshInterval: s(F).nullable()
357
363
  }), n({ ids: a(f()).min(1).max(100) });
358
- var J = (e) => {
364
+ var Y = (e) => {
359
365
  switch (e) {
360
- case K.File: return "ri:file-line";
361
- case K.Url: return "ri:link";
362
- case K.RevisedAnswer: return "ri:feedback-line";
366
+ case q.File: return "ri:file-line";
367
+ case q.Url: return "ri:link";
368
+ case q.RevisedAnswer: return "ri:feedback-line";
363
369
  default: return "ri:input-method-line";
364
370
  }
365
- }, Y = (e) => (e ?? "").startsWith("image/"), X = (e) => Y(e) || e === "application/pdf", Z = (e) => {
371
+ }, X = (e) => (e ?? "").startsWith("image/"), Z = (e) => X(e) || e === "application/pdf", Q = (e) => {
366
372
  let t = e ?? "";
367
- return Y(t) ? {
373
+ return X(t) ? {
368
374
  icon: "ri:image-line",
369
375
  accent: "#ec4899",
370
376
  label: "Image"
@@ -405,10 +411,10 @@ var J = (e) => {
405
411
  accent: "#64748b",
406
412
  label: "File"
407
413
  };
408
- }, Q = (e) => Z(e).icon, $ = (e) => {
414
+ }, $ = (e) => Q(e).icon, ee = (e) => {
409
415
  if (e) return e.replace(/!\[.*?\]\(.*?\)/g, "").replace(/\[([^\]]+)\]\(.*?\)/g, "$1").replace(/`{1,3}[^`]*`{1,3}/g, "").replace(/#{1,6}\s/g, "").replace(/(\*{1,3}|_{1,3})(.*?)\1/g, "$2").replace(/~~(.*?)~~/g, "$1").replace(/^\s*[-*+>]\s+/gm, "").replace(/\n+/g, " ").trim();
410
416
  };
411
417
  //#endregion
412
- export { X as a, Y as i, Q as n, J as r, $ as t };
418
+ export { Z as a, X as i, $ as n, Y as r, ee as t };
413
419
 
414
- //# sourceMappingURL=markdown-BbaLt57-.js.map
420
+ //# sourceMappingURL=markdown-DtdG9Krq.js.map