diff --git a/ui/AGENTS.md b/ui/AGENTS.md index 21deab175e0..daf56ea9f1e 100644 --- a/ui/AGENTS.md +++ b/ui/AGENTS.md @@ -222,6 +222,8 @@ Keep these behaviors: why the current implementation exists. If the requested change is likely to remove a requirement or introduce a regression, pause before editing, explain the risk, recommend a safer approach, and wait for confirmation. +- 表单创建、保存和提交使用页面/弹窗内容 loading 或按钮 loading,不逐项禁用表单字段; + 详细规则见 `src/views/VIEW_README.md`。 - Keep UI code typed and data-driven. - Use Lodash `cloneDeep` for deep cloning; do not use `structuredClone`. - Explicitly import APIs used from Vue, Vue Router, and Pinia; do not restore API auto import. diff --git a/ui/src/api/API_README.md b/ui/src/api/API_README.md index 081726c3053..4e8c594a508 100644 --- a/ui/src/api/API_README.md +++ b/ui/src/api/API_README.md @@ -255,7 +255,7 @@ API 枚举与类型统一在 `src/api` 范围内管理,相关规则由本文 `TOOL_TYPE` 从 `@/api/enums` 导入,`ToolType` 从 `@/api/types` 导入。 触发器参数来源、间隔单位和请求字段类型直接在对应接口字段中声明字符串联合类型, -不单独导出运行时枚举;表单选项使用对应字符串值。触发周期继续复用 `TRIGGER_SCHEDULE_TYPE`。 +不单独导出运行时枚举;表单选项使用对应字符串值。触发周期继续复用 `SCHEDULE_TYPE`。 新增或移动类型时按以下顺序判断: @@ -617,3 +617,21 @@ Workspace 共享知识库详情由 `resourceScope: 'workspace-shared'` 选择上 Web 知识库创建的 `WebKnowledgeCreatePayload.doc_strategy` 使用公共 `DocumentStrategy` 类型, 包含 `split`、`visual` 和 `index`,字段与后端文档处理策略协议一致。 + +Web 知识库详情及更新响应的顶层 `doc_strategy` 使用 `DocumentStrategy | null`,由 +`KnowledgeItem` 声明;非 Web 类型返回 null。文档处理策略设置通过 `putKnowledge` 仅提交 +`{ doc_strategy }`,服务端合并到知识库 meta,保留其他来源配置,保存不立即发起同步。 + +### 知识库定时同步 + +下列接口定义暂时保留,`setting/scheduled-sync/` 页面尚不调用查询、保存或日志接口。 + +`workspace/knowledge/sync.ts` 提供 `getKnowledgeSyncSetting`、`putKnowledgeSyncSetting`, +分别通过 GET、PUT `//sync_setting` 查询和保存 Web、飞书及工作流知识库同步设置。 +`KnowledgeSyncSetting` 定义在 `types/knowledge-sync.ts`,包含 `enabled`、`schedule_type`、 +`sync_type` 及当前周期的时间、日期、间隔或 Cron 字段;`time` 为 HH:mm 数组, +每周日期为 1–7,每月日期为 1–31。服务端校验至少 5 分钟的频率,保存不立即发起同步。 +`getKnowledgeSyncLogPage(knowledgeId, page)` 查询 `//sync_log//`, +使用 `ResponsePage`,返回文档计数、消息、四种执行状态、毫秒及秒数耗时, +包含手动和定时任务。周期类型统一复用 `enums/schedule.ts` 的 `SCHEDULE_TYPE`, +触发器、长期记忆及知识库同步共享同一协议值;日志状态仍维护在 `enums/knowledge.ts`,均经 `@/api/enums` 导入。 diff --git a/ui/src/api/admin/workspace/knowledge/sync.ts b/ui/src/api/admin/workspace/knowledge/sync.ts new file mode 100644 index 00000000000..97dd257c495 --- /dev/null +++ b/ui/src/api/admin/workspace/knowledge/sync.ts @@ -0,0 +1,19 @@ +import { get, put } from '../../core/request' +import type { ParamsPage, ResponsePage } from '../../core/types' +import type { KnowledgeSyncLog, KnowledgeSyncSetting } from '@/api/types' +import { getWorkspaceId } from '@/utils/resource-context' + +const getPrefix = (knowledgeId: string) => `/workspace/${getWorkspaceId()}/knowledge/${knowledgeId}` + +/** 获取知识库定时同步设置。 */ +const getKnowledgeSyncSetting = (knowledgeId: string) => get(`${getPrefix(knowledgeId)}/sync_setting`) + +/** 保存知识库定时同步设置。 */ +const putKnowledgeSyncSetting = (knowledgeId: string, setting: KnowledgeSyncSetting) => + put(`${getPrefix(knowledgeId)}/sync_setting`, setting) + +/** 获取知识库同步日志分页。 */ +const getKnowledgeSyncLogPage = (knowledgeId: string, page: ParamsPage) => + get>(`${getPrefix(knowledgeId)}/sync_log/${page.currentPage}/${page.pageSize}`) + +export default { getKnowledgeSyncSetting, putKnowledgeSyncSetting, getKnowledgeSyncLogPage } diff --git a/ui/src/api/enums/index.ts b/ui/src/api/enums/index.ts index ae2f2e32120..7346895171c 100644 --- a/ui/src/api/enums/index.ts +++ b/ui/src/api/enums/index.ts @@ -8,6 +8,7 @@ export * from './resource-authorization' export * from './tool' export * from './knowledge' export * from './trigger' +export * from './schedule' export * from './file' export * from './state' diff --git a/ui/src/api/enums/schedule.ts b/ui/src/api/enums/schedule.ts new file mode 100644 index 00000000000..3fda409b9fb --- /dev/null +++ b/ui/src/api/enums/schedule.ts @@ -0,0 +1,2 @@ +/** 触发器、长期记忆和知识库定时同步共用的周期类型。 */ +export const SCHEDULE_TYPE = { DAILY: 'daily', WEEKLY: 'weekly', MONTHLY: 'monthly', INTERVAL: 'interval', CRON: 'cron' } as const diff --git a/ui/src/api/enums/trigger.ts b/ui/src/api/enums/trigger.ts index 195891f7cbf..083570de38f 100644 --- a/ui/src/api/enums/trigger.ts +++ b/ui/src/api/enums/trigger.ts @@ -3,6 +3,3 @@ export const TRIGGER_TYPE = { SCHEDULED: 'SCHEDULED', EVENT: 'EVENT', } as const - -/** 定时触发周期。 */ -export const TRIGGER_SCHEDULE_TYPE = { DAILY: 'daily', WEEKLY: 'weekly', MONTHLY: 'monthly', INTERVAL: 'interval', CRON: 'cron' } as const diff --git a/ui/src/api/types/index.ts b/ui/src/api/types/index.ts index c99fd1f083d..5bd2bda02c9 100644 --- a/ui/src/api/types/index.ts +++ b/ui/src/api/types/index.ts @@ -16,6 +16,7 @@ export type * from './resource-authorization' export type * from './folder' export type * from './tool' export type * from './knowledge' +export type * from './knowledge-sync' export type * from './trigger' export type * from './related-resources' export type * from './workflow-version' diff --git a/ui/src/api/types/knowledge-sync.ts b/ui/src/api/types/knowledge-sync.ts new file mode 100644 index 00000000000..0d16a92a7e7 --- /dev/null +++ b/ui/src/api/types/knowledge-sync.ts @@ -0,0 +1,34 @@ +import type { SCHEDULE_TYPE } from '@/api/enums' +import type { KnowledgeSyncType } from './knowledge' + +export type KnowledgeSyncScheduleType = (typeof SCHEDULE_TYPE)[keyof typeof SCHEDULE_TYPE] + +/** 知识库定时同步设置,时间为 HH:mm,周日期使用 1(周一)至 7(周日)。 */ +export interface KnowledgeSyncSetting { + enabled: boolean + schedule_type: KnowledgeSyncScheduleType + sync_type: KnowledgeSyncType + time?: string[] + days?: number[] + interval_unit?: 'minutes' | 'hours' + interval_value?: number + cron_expression?: string +} + +/** 知识库同步执行日志,涵盖手动与定时任务。 */ +export interface KnowledgeSyncLog { + id: string + create_time: string + update_time: string + sync_type: KnowledgeSyncType + trigger_type: 'manual' | 'scheduled' + status: boolean + total_count: number + synced_count: number + skipped_count: number + deleted_count: number + failed_count: number + duration_ms: number + duration_seconds: number + message: string +} diff --git a/ui/src/api/types/knowledge.ts b/ui/src/api/types/knowledge.ts index 106fb087913..08eeed2c1c1 100644 --- a/ui/src/api/types/knowledge.ts +++ b/ui/src/api/types/knowledge.ts @@ -26,6 +26,7 @@ export interface KnowledgeItem { char_length?: number | null create_time?: string desc?: string | null + doc_strategy?: DocumentStrategy | null document_count?: number | null embedding_model_id?: string | null file_count_limit?: number diff --git a/ui/src/api/types/trigger.ts b/ui/src/api/types/trigger.ts index 7bdf22f97ff..1b34d1661eb 100644 --- a/ui/src/api/types/trigger.ts +++ b/ui/src/api/types/trigger.ts @@ -1,5 +1,5 @@ import type { State } from './state' -import type { RESOURCE_TYPE, TRIGGER_SCHEDULE_TYPE, TRIGGER_TYPE } from '@/api/enums' +import type { RESOURCE_TYPE, SCHEDULE_TYPE, TRIGGER_TYPE } from '@/api/enums' export type TriggerType = (typeof TRIGGER_TYPE)[keyof typeof TRIGGER_TYPE] @@ -44,7 +44,7 @@ export interface TriggerBodyField { required?: boolean } export interface TriggerSetting { - schedule_type?: (typeof TRIGGER_SCHEDULE_TYPE)[keyof typeof TRIGGER_SCHEDULE_TYPE] + schedule_type?: (typeof SCHEDULE_TYPE)[keyof typeof SCHEDULE_TYPE] interval_unit?: 'minutes' | 'hours' interval_value?: number days?: (number | string)[] diff --git a/ui/src/constants/CONSTANT_README.md b/ui/src/constants/CONSTANT_README.md index 4ef12828182..eaa44aa0a4d 100644 --- a/ui/src/constants/CONSTANT_README.md +++ b/ui/src/constants/CONSTANT_README.md @@ -34,8 +34,12 @@ const knowledgeTypeLabel = KNOWLEDGE_TYPE_LABELS[knowledgeType] `resource-authorization.ts` 的 `RESOURCE_PERMISSION_OPTIONS` 统一维护权限标签和说明; 资源授权页面与资源用户授权抽屉按版本和根目录约束筛选选项。 -`trigger.ts` 的 `TRIGGER_SCHEDULE_OPTIONS` 统一提供触发器与长期记忆的周期级联选项, +`knowledge.ts` 的 `KNOWLEDGE_SYNC_OPTIONS` 统一维护增量同步、替换同步和整体同步的值、文案及说明, +手动同步弹窗与定时同步设置直接复用,日志同步方式标签也从这些选项读取。 + +`schedule.ts` 的 `SCHEDULE_OPTION` 统一提供触发器、长期记忆与知识库定时同步的周期级联选项, 包含周期文案、执行时间和间隔数值;使用方只读,配置回填与校验仍由各自组件维护。 +周期类型统一使用 `api/enums/schedule.ts` 的 `SCHEDULE_TYPE`,经 `@/api/enums` 导入。 `state.ts` 的 `EXECUTION_STATUS_OPTIONS` 维护触发器、工具和知识库工作流执行记录共用的 中文文案与图标类型,仅包含 `PENDING`、`STARTED`、`SUCCESS`、`FAILURE`、`REVOKE`、 diff --git a/ui/src/constants/knowledge.ts b/ui/src/constants/knowledge.ts index f5e928cd4e8..2855287f8e2 100644 --- a/ui/src/constants/knowledge.ts +++ b/ui/src/constants/knowledge.ts @@ -1,4 +1,4 @@ -import { KNOWLEDGE_TYPE } from '@/api/enums' +import { KNOWLEDGE_TYPE, KNOWLEDGE_SYNC_TYPE } from '@/api/enums' import type { KnowledgeType } from '@/api/types' /** 前端知识库类型标识。 */ @@ -24,3 +24,10 @@ export const KNOWLEDGE_TYPE_LABELS = { [KNOWLEDGE_TYPE_KEY.LARK]: '飞书类型', [KNOWLEDGE_TYPE_KEY.WORKFLOW]: '工作流类型', } as const satisfies Record<(typeof KNOWLEDGE_TYPE_MAP)[KnowledgeType], string> + +/** 手动同步与定时同步共用的同步方式选项。 */ +export const KNOWLEDGE_SYNC_OPTIONS = [ + { value: KNOWLEDGE_SYNC_TYPE.INCREMENTAL, label: '增量同步', description: '文档内容无更新时跳过,有更新时则更新文档的分段' }, + { value: KNOWLEDGE_SYNC_TYPE.REPLACE, label: '替换同步', description: '重新获取 Web 站点文档,替换本地知识库中相同URL的文档' }, + { value: KNOWLEDGE_SYNC_TYPE.COMPLETE, label: '整体同步', description: '先删除知识库中所有文档,重新从Web站点获取文档' }, +] as const diff --git a/ui/src/constants/trigger.ts b/ui/src/constants/schedule.ts similarity index 71% rename from ui/src/constants/trigger.ts rename to ui/src/constants/schedule.ts index f5548c00aca..487d1bb5559 100644 --- a/ui/src/constants/trigger.ts +++ b/ui/src/constants/schedule.ts @@ -1,26 +1,26 @@ import type { CascaderOption } from 'element-plus' -import { TRIGGER_SCHEDULE_TYPE } from '@/api/enums' +import { SCHEDULE_TYPE } from '@/api/enums' const scheduleTimes = Array.from({ length: 24 }, (_, hour) => { const time = `${String(hour).padStart(2, '0')}:00` return { label: time, value: time } }) -/** 触发器与长期记忆共用的周期级联选项;使用方只读。 */ -export const TRIGGER_SCHEDULE_OPTIONS: CascaderOption[] = [ - { label: '每日', value: TRIGGER_SCHEDULE_TYPE.DAILY, children: scheduleTimes }, +/** 触发器、长期记忆与知识库定时同步共用的周期级联选项;使用方只读。 */ +export const SCHEDULE_OPTION: CascaderOption[] = [ + { label: '每日', value: SCHEDULE_TYPE.DAILY, children: scheduleTimes }, { label: '每周', - value: TRIGGER_SCHEDULE_TYPE.WEEKLY, + value: SCHEDULE_TYPE.WEEKLY, children: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'].map((label, index) => ({ label, value: index + 1, children: scheduleTimes })), }, { label: '每月', - value: TRIGGER_SCHEDULE_TYPE.MONTHLY, + value: SCHEDULE_TYPE.MONTHLY, children: Array.from({ length: 31 }, (_, index) => ({ label: `${index + 1} 日`, value: String(index + 1), children: scheduleTimes })), }, { label: '按间隔', - value: TRIGGER_SCHEDULE_TYPE.INTERVAL, + value: SCHEDULE_TYPE.INTERVAL, children: [ { label: '小时', diff --git a/ui/src/layout/sidebar/ResourceDetailMenu.vue b/ui/src/layout/sidebar/ResourceDetailMenu.vue index 822627e95a7..6bd5535bfac 100644 --- a/ui/src/layout/sidebar/ResourceDetailMenu.vue +++ b/ui/src/layout/sidebar/ResourceDetailMenu.vue @@ -23,7 +23,7 @@ watch(