@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.
- package/dist/_chunks/Agent-Gdgpd3LA.js.map +1 -1
- package/dist/_chunks/{PkToolShowSources-D532Worv.js → PkToolShowSources-B1zXilsH.js} +2 -2
- package/dist/_chunks/{PkToolShowSources-D532Worv.js.map → PkToolShowSources-B1zXilsH.js.map} +1 -1
- package/dist/_chunks/{markdown-BbaLt57-.js → markdown-DtdG9Krq.js} +95 -89
- package/dist/_chunks/markdown-DtdG9Krq.js.map +1 -0
- package/dist/ai-elements.es.js +405 -403
- package/dist/ai-elements.es.js.map +1 -1
- package/dist-vue/PkChatbot.js +1 -1
- package/dist-vue/PkChatbotEmptyState.js +1 -1
- package/dist-vue/PkChatbotInput.js +1 -1
- package/dist-vue/PkChatbotMessages.js +1 -1
- package/dist-vue/PkChatbotStepPayload.js +1 -1
- package/dist-vue/PkChatbotStepToolDetail.js +1 -1
- package/dist-vue/PkChatbotSteps.js +1 -1
- package/dist-vue/PkChatbotViewChat.js +1 -1
- package/dist-vue/PkChatbotViewConversations.js +1 -1
- package/dist-vue/PkChatbotViewFiles.js +1 -1
- package/dist-vue/PkChatbotViewProfile.js +1 -1
- package/dist-vue/_chunks/{Agent-DU1WWaHR.js → Agent-DGCZCx4Y.js} +102 -101
- package/dist-vue/_chunks/Agent-DGCZCx4Y.js.map +1 -0
- package/dist-vue/_chunks/{Document-Cto-Qws0.js → Document-BZea8ewV.js} +8 -4
- package/dist-vue/_chunks/Document-BZea8ewV.js.map +1 -0
- package/dist-vue/_chunks/{PkChatbot-wODOAtOD.js → PkChatbot-BVWLvaXb.js} +8 -8
- package/dist-vue/_chunks/{PkChatbot-wODOAtOD.js.map → PkChatbot-BVWLvaXb.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotEmptyState-Dx4mTkTX.js → PkChatbotEmptyState-B7fZ51v1.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotEmptyState-Dx4mTkTX.js.map → PkChatbotEmptyState-B7fZ51v1.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotInput-jj3qQl_f.js → PkChatbotInput-Bo4Ewf6A.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotInput-jj3qQl_f.js.map → PkChatbotInput-Bo4Ewf6A.js.map} +1 -1
- package/dist-vue/_chunks/PkChatbotMessages-DHZNG6YM.js +881 -0
- package/dist-vue/_chunks/PkChatbotMessages-DHZNG6YM.js.map +1 -0
- package/dist-vue/_chunks/{PkChatbotStepPayload-f2mYAVpu.js → PkChatbotStepPayload-DuI9ZYqp.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotStepPayload-f2mYAVpu.js.map → PkChatbotStepPayload-DuI9ZYqp.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotStepToolDetail-BcYheOnU.js → PkChatbotStepToolDetail-B9hBMl15.js} +3 -3
- package/dist-vue/_chunks/{PkChatbotStepToolDetail-BcYheOnU.js.map → PkChatbotStepToolDetail-B9hBMl15.js.map} +1 -1
- package/dist-vue/_chunks/PkChatbotSteps-3qySSEYh.js +189 -0
- package/dist-vue/_chunks/PkChatbotSteps-3qySSEYh.js.map +1 -0
- package/dist-vue/_chunks/{PkChatbotViewChat-DZqXDwzk.js → PkChatbotViewChat-CLyoZH3C.js} +7 -7
- package/dist-vue/_chunks/{PkChatbotViewChat-DZqXDwzk.js.map → PkChatbotViewChat-CLyoZH3C.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotViewConversations-CXcToApC.js → PkChatbotViewConversations-BbXFoEOv.js} +3 -3
- package/dist-vue/_chunks/{PkChatbotViewConversations-CXcToApC.js.map → PkChatbotViewConversations-BbXFoEOv.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotViewFiles-O8lhbXAX.js → PkChatbotViewFiles-7vcERhnZ.js} +3 -3
- package/dist-vue/_chunks/{PkChatbotViewFiles-O8lhbXAX.js.map → PkChatbotViewFiles-7vcERhnZ.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotViewProfile-kryFJi0l.js → PkChatbotViewProfile-RgFp-LpV.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotViewProfile-kryFJi0l.js.map → PkChatbotViewProfile-RgFp-LpV.js.map} +1 -1
- package/dist-vue/_chunks/{PkStreamingMarkdown-CywawRVj.js → PkStreamingMarkdown-Bmm1kZpL.js} +3 -3
- package/dist-vue/_chunks/{PkStreamingMarkdown-CywawRVj.js.map → PkStreamingMarkdown-Bmm1kZpL.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolEditSpreadsheet-BT4HueLs.js → PkToolEditSpreadsheet-BIQky1RK.js} +2 -2
- package/dist-vue/_chunks/{PkToolEditSpreadsheet-BT4HueLs.js.map → PkToolEditSpreadsheet-BIQky1RK.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolRequestGeolocation-JZYgc-2X.js → PkToolRequestGeolocation-CYEyXZSh.js} +2 -2
- package/dist-vue/_chunks/{PkToolRequestGeolocation-JZYgc-2X.js.map → PkToolRequestGeolocation-CYEyXZSh.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolRequestOAuthConnection-Ck2tRuls.js → PkToolRequestOAuthConnection-B243GJ1-.js} +2 -2
- package/dist-vue/_chunks/{PkToolRequestOAuthConnection-Ck2tRuls.js.map → PkToolRequestOAuthConnection-B243GJ1-.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowArtifact-BiFJoOTT.js → PkToolShowArtifact-CJG-B9mE.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowArtifact-BiFJoOTT.js.map → PkToolShowArtifact-CJG-B9mE.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowContactForm-B7DvA6O1.js → PkToolShowContactForm-CG1H7xBz.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowContactForm-B7DvA6O1.js.map → PkToolShowContactForm-CG1H7xBz.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowDiagram-DGMwlxqB.js → PkToolShowDiagram-Cq0457a3.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowDiagram-DGMwlxqB.js.map → PkToolShowDiagram-Cq0457a3.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowForm-BZmAnMSD.js → PkToolShowForm-IJ8B8_yT.js} +4 -4
- package/dist-vue/_chunks/{PkToolShowForm-BZmAnMSD.js.map → PkToolShowForm-IJ8B8_yT.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowImageGallery-BsYTRg_W.js → PkToolShowImageGallery-ala8nlAj.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowImageGallery-BsYTRg_W.js.map → PkToolShowImageGallery-ala8nlAj.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowProductList-D1_v79Xm.js → PkToolShowProductList-BDg84ZQN.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowProductList-D1_v79Xm.js.map → PkToolShowProductList-BDg84ZQN.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowSources-Czu2IiGq.js → PkToolShowSources-DaSijN_L.js} +3 -3
- package/dist-vue/_chunks/{PkToolShowSources-Czu2IiGq.js.map → PkToolShowSources-DaSijN_L.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowSuggestedReply-I6FBos-F.js → PkToolShowSuggestedReply-CLEFPrHP.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowSuggestedReply-I6FBos-F.js.map → PkToolShowSuggestedReply-CLEFPrHP.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowVideo-D3D2sTAP.js → PkToolShowVideo-FmE-IRE7.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowVideo-D3D2sTAP.js.map → PkToolShowVideo-FmE-IRE7.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowWebPages-DTq0811l.js → PkToolShowWebPages-B554-MlD.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowWebPages-DTq0811l.js.map → PkToolShowWebPages-B554-MlD.js.map} +1 -1
- package/dist-vue/_chunks/{createChatbotApiClient-BlJ952Kb.js → createChatbotApiClient-CDS3C4i6.js} +2 -2
- package/dist-vue/_chunks/createChatbotApiClient-CDS3C4i6.js.map +1 -0
- package/dist-vue/_chunks/{useChatbotStore-CueyhDPB.js → useChatbotStore-CBjBe7GI.js} +3 -3
- package/dist-vue/_chunks/{useChatbotStore-CueyhDPB.js.map → useChatbotStore-CBjBe7GI.js.map} +1 -1
- package/dist-vue/_chunks/{utils-DmRXPCqa.js → utils-Cvijhryt.js} +2 -2
- package/dist-vue/_chunks/{utils-DmRXPCqa.js.map → utils-Cvijhryt.js.map} +1 -1
- package/dist-vue/api.js +1 -1
- package/dist-vue/composables.js +3 -3
- package/dist-vue/index.js +26 -26
- package/dist-vue/index.js.map +1 -1
- package/dist-vue/packages/composable/src/chatbot/useChatbotStore.d.ts +6 -0
- package/dist-vue/packages/models/src/schema/Branding.d.ts +5 -0
- package/dist-vue/packages/models/src/schema/Chat.d.ts +8 -0
- package/dist-vue/packages/models/src/schema/ModelProvider.d.ts +12 -1
- package/dist-vue/packages/models/src/schema/constants.d.ts +26 -1
- package/package.json +1 -1
- package/dist/_chunks/markdown-BbaLt57-.js.map +0 -1
- package/dist-vue/_chunks/Agent-DU1WWaHR.js.map +0 -1
- package/dist-vue/_chunks/Document-Cto-Qws0.js.map +0 -1
- package/dist-vue/_chunks/PkChatbotMessages-5wPl7-j-.js +0 -876
- package/dist-vue/_chunks/PkChatbotMessages-5wPl7-j-.js.map +0 -1
- package/dist-vue/_chunks/PkChatbotSteps-DKyF0ykL.js +0 -191
- package/dist-vue/_chunks/PkChatbotSteps-DKyF0ykL.js.map +0 -1
- 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-
|
|
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-
|
|
271
|
+
//# sourceMappingURL=PkToolShowSources-B1zXilsH.js.map
|
package/dist/_chunks/{PkToolShowSources-D532Worv.js.map → PkToolShowSources-B1zXilsH.js.map}
RENAMED
|
@@ -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
|
|
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
|
-
|
|
10
|
-
var
|
|
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
|
-
}({}),
|
|
14
|
+
}({}), x = /* @__PURE__ */ function(e) {
|
|
13
15
|
return e.FETCH = "fetch", e.PUPPETEER = "puppeteer", e.REMOTE = "remote", e;
|
|
14
|
-
}({})
|
|
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
|
-
}),
|
|
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
|
|
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
|
-
}),
|
|
55
|
+
}), T = n({
|
|
50
56
|
sheet: r(),
|
|
51
57
|
table: r(),
|
|
52
58
|
headerRow: i().optional(),
|
|
53
59
|
rowCount: i(),
|
|
54
|
-
columns: a(
|
|
60
|
+
columns: a(w),
|
|
55
61
|
sample: a(m(r(), t()))
|
|
56
|
-
}),
|
|
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
|
-
}),
|
|
70
|
+
}), D = n({
|
|
65
71
|
converterVersion: i(),
|
|
66
|
-
tables: a(
|
|
67
|
-
skipped: a(
|
|
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:
|
|
83
|
+
conversion: D.optional(),
|
|
78
84
|
failure: r().optional(),
|
|
79
85
|
failedConverterVersion: i().optional()
|
|
80
86
|
});
|
|
81
|
-
var
|
|
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
|
-
}({}),
|
|
88
|
-
extractionStrategy: s(
|
|
89
|
-
browserEngine: s(
|
|
90
|
-
headers:
|
|
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
|
-
}),
|
|
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
|
-
|
|
105
|
-
var
|
|
110
|
+
F.Daily, F.Weekly, F.Monthly;
|
|
111
|
+
var I = n({
|
|
106
112
|
at: r(),
|
|
107
|
-
result: s(
|
|
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
|
-
}),
|
|
119
|
+
}), L = {
|
|
114
120
|
contentHash: r().optional(),
|
|
115
|
-
lastRefresh:
|
|
116
|
-
},
|
|
117
|
-
provider: o(
|
|
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
|
-
...
|
|
126
|
-
}),
|
|
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
|
-
...
|
|
143
|
-
},
|
|
144
|
-
provider: o(
|
|
145
|
-
...
|
|
146
|
-
}),
|
|
147
|
-
provider: o(
|
|
148
|
-
...
|
|
149
|
-
}),
|
|
150
|
-
provider:
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
])),
|
|
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
|
-
],
|
|
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
|
-
[...
|
|
178
|
-
var
|
|
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(),
|
|
186
|
-
source:
|
|
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:
|
|
225
|
-
tabular:
|
|
226
|
-
lastIndexError:
|
|
227
|
-
}).loose(),
|
|
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
|
-
}({}),
|
|
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(
|
|
254
|
+
refreshInterval: s(F).nullable().optional(),
|
|
249
255
|
nextRefreshAt: l().nullable().optional(),
|
|
250
|
-
sourceProvider: s(
|
|
256
|
+
sourceProvider: s(N).nullable().optional()
|
|
251
257
|
}).extend({
|
|
252
|
-
type: s(
|
|
253
|
-
indexStatus: s(
|
|
254
|
-
metadata:
|
|
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(
|
|
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
|
-
|
|
265
|
-
document:
|
|
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(
|
|
302
|
+
"filter[status]": s(j).optional()
|
|
297
303
|
}), n({
|
|
298
|
-
type: s(
|
|
304
|
+
type: s(q).default(q.File),
|
|
299
305
|
name: r().min(1).max(255).optional(),
|
|
300
|
-
language: s(
|
|
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(
|
|
309
|
-
browserEngine: s(
|
|
310
|
-
headers:
|
|
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(
|
|
322
|
+
refreshInterval: s(F).nullable().optional(),
|
|
317
323
|
syncSourceId: f().optional()
|
|
318
324
|
}).superRefine((e, t) => {
|
|
319
|
-
e.syncSourceId && e.type !==
|
|
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 ===
|
|
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 ===
|
|
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 !==
|
|
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 ===
|
|
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(
|
|
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(
|
|
354
|
-
}), n({ refreshInterval: s(
|
|
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(
|
|
362
|
+
refreshInterval: s(F).nullable()
|
|
357
363
|
}), n({ ids: a(f()).min(1).max(100) });
|
|
358
|
-
var
|
|
364
|
+
var Y = (e) => {
|
|
359
365
|
switch (e) {
|
|
360
|
-
case
|
|
361
|
-
case
|
|
362
|
-
case
|
|
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
|
-
},
|
|
371
|
+
}, X = (e) => (e ?? "").startsWith("image/"), Z = (e) => X(e) || e === "application/pdf", Q = (e) => {
|
|
366
372
|
let t = e ?? "";
|
|
367
|
-
return
|
|
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
|
-
},
|
|
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 {
|
|
418
|
+
export { Z as a, X as i, $ as n, Y as r, ee as t };
|
|
413
419
|
|
|
414
|
-
//# sourceMappingURL=markdown-
|
|
420
|
+
//# sourceMappingURL=markdown-DtdG9Krq.js.map
|