소스 검색

fix: 修改打包之后异常等问题

jiaxing.liao 1 일 전
부모
커밋
8fd1bde5fc

+ 1 - 1
apps/web/src/components/Chat/ChatInput.vue

@@ -13,7 +13,7 @@
 			:loading="loading"
 			@cancel="emit('cancel')"
 		>
-			<!-- 头部插槽 -->
+			<!-- 插槽 -->
 			<template v-for="(_, name) in $slots" :key="name" #[name]="slotProps">
 				<slot :name="name" v-bind="slotProps" />
 			</template>

+ 4 - 1
apps/web/src/features/ChatDrawer/WorkflowTraceBubble.vue

@@ -155,7 +155,10 @@ const formatWorkflowValue = (value: unknown) => {
 								:class="{ 'is-open': isWorkflowNodeOpen(node.nodeId) }"
 								:width="14"
 							/>
-							<span class="workflow-node-card__icon">
+							<span
+								class="workflow-node-card__icon"
+								:style="{ background: nodeMap[node.nodeType]?.iconColor }"
+							>
 								<img v-if="isImageIcon(nodeIcon(node))" :src="nodeIcon(node)" alt="node icon" />
 								<Icon v-else :icon="nodeIcon(node)" :width="14" />
 							</span>

+ 1 - 0
apps/web/src/i18n/locales/en-us.ts

@@ -2395,6 +2395,7 @@ export default {
 				actions: 'Actions',
 				update: 'Update',
 				reparse: 'Reparse',
+				confirmReparse: 'Are you sure you want to reparse this knowledge?',
 				delete: 'Delete',
 				noContent: 'No knowledge content',
 				createKnowledge: 'New Knowledge',

+ 1 - 0
apps/web/src/i18n/locales/zh-cn.ts

@@ -2289,6 +2289,7 @@ export default {
 				actions: '操作',
 				update: '更新',
 				reparse: '重新解析',
+				confirmReparse: '确认是否重新解析?',
 				delete: '删除',
 				noContent: '暂无知识内容',
 				createKnowledge: '新建知识',

+ 8 - 2
apps/web/src/views/chat/index.vue

@@ -70,8 +70,8 @@
 				@card-submit="handleSend"
 			>
 				<template #message-extra="{ item }">
-					<div class="min-w-400px">
-						<WorkflowTraceBubble v-if="item.workflowTraceVisible" :message="item" />
+					<div class="min-w-400px" v-if="item?.workflowTraceNodes?.length">
+						<WorkflowTraceBubble :message="item" />
 					</div>
 				</template>
 
@@ -660,6 +660,12 @@ const handleChangeTarget = async (value: [ChatTargetType, string] | string[]) =>
 		allowImageUpload.value = true
 		await loadWorkflowExecuteInfo(id)
 		return
+	} else {
+		const ins = chatInputRef.value?.getInstance()
+		if (ins) {
+			await nextTick()
+			ins.openHeader()
+		}
 	}
 
 	showForm.value = false

+ 4 - 0
apps/web/src/views/chat/types.ts

@@ -1,3 +1,5 @@
+import { type RunnerNodeState } from '@/store/modules/runner.store'
+
 /**
  * 聊天消息数据
  */
@@ -31,6 +33,8 @@ export interface BubbleMessage {
 	// 执行步骤数
 	total_steps?: number
 	stopped?: boolean
+	workflowTraceVisible?: boolean
+	workflowTraceNodes?: RunnerNodeState[]
 	[key: string]: any
 }
 

+ 113 - 23
apps/web/src/views/knowledge/DocumentManage.vue

@@ -29,13 +29,20 @@
 				</el-button>
 			</div>
 			<div class="action-bar__right">
-				<el-button v-permission="{ buttonCode: 'upload_doc', menuCode: 'sys_ai_knowledge_base' }" @click="openFileDrawer">
+				<el-button
+					v-permission="{ buttonCode: 'upload_doc', menuCode: 'sys_ai_knowledge_base' }"
+					@click="openFileDrawer"
+				>
 					<el-icon>
 						<Upload />
 					</el-icon>
 					{{ t('pages.knowledge.document.uploadFile') }}
 				</el-button>
-				<el-button v-permission="{ buttonCode: 'add_md', menuCode: 'sys_ai_knowledge_base' }" type="primary" @click="openManualDrawer">
+				<el-button
+					v-permission="{ buttonCode: 'add_md', menuCode: 'sys_ai_knowledge_base' }"
+					type="primary"
+					@click="openManualDrawer"
+				>
 					<el-icon>
 						<Plus />
 					</el-icon>
@@ -57,24 +64,46 @@
 				v-loading="loading"
 				border
 			>
-				<el-table-column prop="title" :label="t('pages.knowledge.document.title')" min-width="220" />
+				<el-table-column
+					prop="title"
+					:label="t('pages.knowledge.document.title')"
+					min-width="220"
+				/>
 				<el-table-column prop="type" :label="t('pages.knowledge.document.type')" width="100">
 					<template #default="{ row }">
-						<el-tag v-if="row.type === 'file'">{{ t('pages.knowledge.document.fileUpload') }}</el-tag>
+						<el-tag v-if="row.type === 'file'">{{
+							t('pages.knowledge.document.fileUpload')
+						}}</el-tag>
 						<el-tag v-if="row.type === 'manual'">{{ t('pages.knowledge.document.custom') }}</el-tag>
 					</template>
 				</el-table-column>
-				<el-table-column prop="file_name" :label="t('pages.knowledge.document.fileName')" min-width="180" />
-				<el-table-column prop="file_type" :label="t('pages.knowledge.document.fileType')" width="100" />
+				<el-table-column
+					prop="file_name"
+					:label="t('pages.knowledge.document.fileName')"
+					min-width="180"
+				/>
+				<el-table-column
+					prop="file_type"
+					:label="t('pages.knowledge.document.fileType')"
+					width="100"
+				/>
 				<el-table-column prop="source" :label="t('pages.knowledge.document.source')" width="110" />
-				<el-table-column prop="parse_status" :label="t('pages.knowledge.document.parseStatus')" width="120">
+				<el-table-column
+					prop="parse_status"
+					:label="t('pages.knowledge.document.parseStatus')"
+					width="120"
+				>
 					<template #default="{ row }">
 						<el-tag :type="getStatusTagType(row.parse_status)">
 							{{ row.parse_status ? stateMap?.[row.parse_status] : '-' }}
 						</el-tag>
 					</template>
 				</el-table-column>
-				<el-table-column prop="summary_status" :label="t('pages.knowledge.document.summaryStatus')" width="120">
+				<el-table-column
+					prop="summary_status"
+					:label="t('pages.knowledge.document.summaryStatus')"
+					width="120"
+				>
 					<template #default="{ row }">
 						<el-tag :type="getStatusTagType(row.summary_status)">
 							{{ row.parse_status ? stateMap?.[row.summary_status] : '-' }}
@@ -86,7 +115,11 @@
 						<span class="truncate-text">{{ row.error_message || '-' }}</span>
 					</template>
 				</el-table-column>
-				<el-table-column prop="creationTime" :label="t('pages.knowledge.document.creationTime')" width="180" />
+				<el-table-column
+					prop="creationTime"
+					:label="t('pages.knowledge.document.creationTime')"
+					width="180"
+				/>
 				<el-table-column :label="t('pages.knowledge.document.actions')" width="220" fixed="right">
 					<template #default="{ row }">
 						<el-button
@@ -98,8 +131,20 @@
 						>
 							{{ t('pages.knowledge.document.update') }}
 						</el-button>
-						<el-button v-permission="{ buttonCode: 'rebuild_index', menuCode: 'sys_ai_knowledge_base' }" link type="warning" @click="reparseKnowledge(row.id)">{{ t('pages.knowledge.document.reparse') }}</el-button>
-						<el-button v-permission="{ buttonCode: 'del_doc', menuCode: 'sys_ai_knowledge_base' }" link type="danger" @click="removeKnowledge(row.id)">{{ t('common.delete') }}</el-button>
+						<el-button
+							v-permission="{ buttonCode: 'rebuild_index', menuCode: 'sys_ai_knowledge_base' }"
+							link
+							type="warning"
+							@click="reparseKnowledge(row.id)"
+							>{{ t('pages.knowledge.document.reparse') }}</el-button
+						>
+						<el-button
+							v-permission="{ buttonCode: 'del_doc', menuCode: 'sys_ai_knowledge_base' }"
+							link
+							type="danger"
+							@click="removeKnowledge(row.id)"
+							>{{ t('common.delete') }}</el-button
+						>
 					</template>
 				</el-table-column>
 				<template #empty>{{ t('pages.knowledge.document.noContent') }}</template>
@@ -107,13 +152,25 @@
 			<el-empty v-else :description="t('pages.knowledge.document.noContent')" class="page-empty" />
 		</el-card>
 		<!-- 新建 -->
-		<el-drawer v-model="manualDrawerVisible" :title="t('pages.knowledge.document.createTitle')" direction="rtl" size="640px">
+		<el-drawer
+			v-model="manualDrawerVisible"
+			:title="t('pages.knowledge.document.createTitle')"
+			direction="rtl"
+			size="640px"
+		>
 			<el-form ref="manualFormRef" :model="manualForm" :rules="manualRules" label-position="top">
 				<el-form-item :label="t('pages.knowledge.document.title')" prop="title">
-					<el-input v-model="manualForm.title" :placeholder="t('pages.knowledge.document.titlePlaceholder')" />
+					<el-input
+						v-model="manualForm.title"
+						:placeholder="t('pages.knowledge.document.titlePlaceholder')"
+					/>
 				</el-form-item>
 				<el-form-item :label="t('pages.knowledge.document.contentLabel')" prop="content">
-					<el-input v-model="manualForm.content" type="textarea" :placeholder="t('pages.knowledge.document.contentPlaceholder')" />
+					<el-input
+						v-model="manualForm.content"
+						type="textarea"
+						:placeholder="t('pages.knowledge.document.contentPlaceholder')"
+					/>
 				</el-form-item>
 				<el-form-item :label="t('pages.knowledge.document.publish')">
 					<el-switch v-model="manualForm.publish" />
@@ -129,7 +186,12 @@
 			</template>
 		</el-drawer>
 		<!-- 导入模版 -->
-		<el-drawer v-model="fileDrawerVisible" :title="t('pages.knowledge.document.importTitle')" direction="rtl" size="640px">
+		<el-drawer
+			v-model="fileDrawerVisible"
+			:title="t('pages.knowledge.document.importTitle')"
+			direction="rtl"
+			size="640px"
+		>
 			<el-form :model="fileForm" label-position="top">
 				<el-form-item :label="t('pages.knowledge.document.uploadFile')">
 					<FileUploadInput
@@ -158,8 +220,14 @@
 								:key="`metadata-${index}`"
 								class="metadata-config__row"
 							>
-								<el-input v-model="item.key" :placeholder="t('pages.knowledge.document.metadataKeyPlaceholder')" />
-								<el-input v-model="item.value" :placeholder="t('pages.knowledge.document.metadataValuePlaceholder')" />
+								<el-input
+									v-model="item.key"
+									:placeholder="t('pages.knowledge.document.metadataKeyPlaceholder')"
+								/>
+								<el-input
+									v-model="item.value"
+									:placeholder="t('pages.knowledge.document.metadataValuePlaceholder')"
+								/>
 								<el-button
 									link
 									type="danger"
@@ -204,7 +272,10 @@
 				<el-form-item :label="t('pages.knowledge.document.title')" prop="title">
 					<el-input v-model="editForm.title" />
 				</el-form-item>
-				<el-form-item :label="t('pages.knowledge.document.descriptionLabel')" class="edit-description-item">
+				<el-form-item
+					:label="t('pages.knowledge.document.descriptionLabel')"
+					class="edit-description-item"
+				>
 					<!-- <markdown v-if="!isEdit" :content="editForm.description" @click="isEdit = true" /> -->
 					<el-input
 						v-model="editForm.description"
@@ -286,8 +357,12 @@ const editForm = reactive<KnowledgeEditForm>({
 })
 
 const manualRules = {
-	title: [{ required: true, message: t('pages.knowledge.document.titleRequired'), trigger: 'blur' }],
-	content: [{ required: true, message: t('pages.knowledge.document.contentRequired'), trigger: 'blur' }]
+	title: [
+		{ required: true, message: t('pages.knowledge.document.titleRequired'), trigger: 'blur' }
+	],
+	content: [
+		{ required: true, message: t('pages.knowledge.document.contentRequired'), trigger: 'blur' }
+	]
 }
 
 const editRules = {
@@ -472,6 +547,17 @@ async function submitEditKnowledge() {
 
 async function reparseKnowledge(id?: string) {
 	if (!id) return
+	const confirmed = await ElMessageBox.confirm(
+		t('pages.knowledge.document.confirmReparse'),
+		t('pages.knowledge.document.reparse'),
+		{
+			type: 'warning'
+		}
+	)
+		.then(() => true)
+		.catch(() => false)
+	if (!confirmed) return
+
 	await knowledge.postAiKnowledgeReparse({ id })
 	ElMessage.success(t('pages.knowledge.document.reparseSuccess'))
 	await fetchKnowledgeList()
@@ -479,9 +565,13 @@ async function reparseKnowledge(id?: string) {
 
 async function removeKnowledge(id?: string) {
 	if (!id) return
-	const confirmed = await ElMessageBox.confirm(t('pages.knowledge.document.confirmDelete'), t('pages.knowledge.document.deleteTitle'), {
-		type: 'warning'
-	})
+	const confirmed = await ElMessageBox.confirm(
+		t('pages.knowledge.document.confirmDelete'),
+		t('pages.knowledge.document.deleteTitle'),
+		{
+			type: 'warning'
+		}
+	)
 		.then(() => true)
 		.catch(() => false)
 	if (!confirmed) return

+ 20 - 1
apps/web/vite.config.ts

@@ -63,7 +63,26 @@ export default defineConfig(({ mode }) => {
 					ElementPlusResolver()
 				],
 				dts: 'components.d.ts'
-			})
+			}),
+				// 修复 prismjs 全局导出和 @lexical/code 裸 Prism 引用
+				{
+					name: 'fix-prism-global',
+					enforce: 'post',
+					transform(code, id) {
+						if (id.includes('prismjs/prism.js') || id.endsWith('/prism.js') || id.endsWith('/prism.min.js')) {
+							if (!id.includes('components/')) {
+								return code + '\nglobalThis.Prism = typeof Prism !== "undefined" ? Prism : {};\n export default Prism;\n';
+							}
+						}
+						return null;
+					},
+					renderChunk(code) {
+						if (code.includes('}(Prism)')) {
+							return code.replace(/}\((Prism)\)/g, '}(globalThis.Prism)');
+						}
+						return null;
+					}
+				},
 		],
 		resolve: {
 			alias: {

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3797 - 9974
pnpm-lock.yaml