优化: 清理无意义注释(走查编号前缀/过时历史标注/死代码注释)
This commit is contained in:
+8
-8
@@ -36,9 +36,9 @@ import type { AiChatEvent, AiConversationSummary, AiMessage, AiProviderConfig, A
|
||||
const MESSAGE_CAP = 200
|
||||
|
||||
/**
|
||||
* 单对话 messages 的 parts 体积软上限(UX-260617-20)。
|
||||
* 单对话 messages 的 parts 体积软上限。
|
||||
*
|
||||
* 背景:MESSAGE_CAP 仅按"条数"裁剪,不感知单条体积。多模态 base64 图片(F-260614-05)
|
||||
* 背景:MESSAGE_CAP 仅按"条数"裁剪,不感知单条体积。多模态 base64 图片
|
||||
* 单条可达数 MB,极端 200 条 × 5MB ≈ 1GB 会撑爆渲染内存。
|
||||
*
|
||||
* 设计:
|
||||
@@ -51,7 +51,7 @@ const PARTS_SIZE_BUDGET = 50 * 1024 * 1024 // 50MB(base64 char 计)
|
||||
import { useAiEvents } from '@/composables/ai/useAiEvents'
|
||||
import { useAiStream } from '@/composables/ai/useAiStream'
|
||||
// 批4 双轨收口:getConvState 从 aiShared 取(下沉破环,避免 stores/ai↔useAiEvents 反向环)。
|
||||
// F-09 per-conv streaming/currentText(DEC-07a 父④):convStreamStates Map + 辅助函数亦从 aiShared 取。
|
||||
// F-09 per-conv streaming/currentText(a 父④):convStreamStates Map + 辅助函数亦从 aiShared 取。
|
||||
import { getConvState, getConvStreamState, setConvStreaming, setConvCurrentText, __bindMessages, __bindState } from '@/composables/ai/aiShared'
|
||||
import { useAiSend, initDrainQueueListener } from '@/composables/ai/useAiSend'
|
||||
import { useAiApproval } from '@/composables/ai/useAiApproval'
|
||||
@@ -62,7 +62,7 @@ import { useAiContext } from '@/composables/ai/useAiContext'
|
||||
|
||||
/// 模块级单例 state — 全应用共享(composables 通过 `import { state } from '@/stores/ai'` 取用)
|
||||
//
|
||||
// F-09 B 路线 per-conv streaming/currentText(DEC-07a 父④):
|
||||
// F-09 B 路线 per-conv streaming/currentText(a 父④):
|
||||
// `streaming`/`currentText` 不再是全局单例字段,改为 accessor 委派 aiShared.convStreamStates
|
||||
// (per-conv Map,定义于 composables/ai/aiShared.ts)按 activeConversationId 索引读写。
|
||||
//
|
||||
@@ -137,7 +137,7 @@ const _stateBase: {
|
||||
// F-260614-05 Phase 2b: parts 挂多模态图片片(供 drainQueue/force 续发时本地 user 消息渲染图)
|
||||
queue: [],
|
||||
// Agentic 循环当前轮次(0=非agentic/未开始;>0=收到后端 AiAgentRound 事件的 round)
|
||||
// AE-2025-07:进度条用; AiCompleted/AiError 复位为 0
|
||||
// 进度条用; AiCompleted/AiError 复位为 0
|
||||
agentRound: 0,
|
||||
completedTools: 0,
|
||||
// 归档分组折叠态(默认折叠)
|
||||
@@ -252,7 +252,7 @@ function estimatePartsSize(parts: ContentPart[] | undefined): number {
|
||||
}
|
||||
|
||||
/**
|
||||
* parts 体积软上限守卫(UX-260617-20):push 式增长使总 parts 体积超 PARTS_SIZE_BUDGET 时,
|
||||
* parts 体积软上限守卫push 式增长使总 parts 体积超 PARTS_SIZE_BUDGET 时,
|
||||
* 从最旧消息起逐条置空其 parts(丢历史多模态图,保文本/条数)。
|
||||
*
|
||||
* 仅拦截 push(同上 length watch 的判定),避免切换对话整体替换时误裁后端历史图。
|
||||
@@ -319,12 +319,12 @@ function isGenerating(convId: string | null | undefined): boolean {
|
||||
* (composable 内部全部是模块级单例实现,展开的只是引用,无重复实例化开销)。
|
||||
*/
|
||||
export function useAiStore() {
|
||||
// ARC-06: 启动 drain-queue 事件监听(由 useAiEvents AiCompleted 经事件总线触发)
|
||||
// 启动 drain-queue 事件监听(由 useAiEvents AiCompleted 经事件总线触发)
|
||||
void initDrainQueueListener()
|
||||
return {
|
||||
state,
|
||||
filteredConversations,
|
||||
// F-09: 生成态 helper(批4 双轨收口:仅读 isGenerating 派生自 getConvState;
|
||||
// 生成态 helper(批4 双轨收口:仅读 isGenerating 派生自 getConvState;
|
||||
// addGenerating/removeGenerating 写 helper 已删,写收敛到 useAiEvents setConvState)
|
||||
isGenerating,
|
||||
...useAiEvents(),
|
||||
|
||||
@@ -150,7 +150,7 @@ export function useKnowledgeStore() {
|
||||
}
|
||||
|
||||
async function updateStatus(id: string, status: string): Promise<boolean> {
|
||||
// WK-3:返成功布尔(失败时 runWithCatch 已置 state.error),调用方据此中止推进/报错
|
||||
// 返成功布尔(失败时 runWithCatch 已置 state.error),调用方据此中止推进/报错
|
||||
const ok = await runWithCatch(state, t('knowledge.err.updateStatusFailed'), async () => {
|
||||
await knowledgeApi.updateStatus(id, status)
|
||||
// 从 items 和 candidates 中同步移除
|
||||
|
||||
@@ -28,7 +28,7 @@ function createStore() {
|
||||
// "df-data-changed" { entity, action },前端按 entity 调对应 load 刷新列表,
|
||||
// 取代工具执行后需手动刷新。
|
||||
//
|
||||
// CR-260615-26(R-1): task 分支不再无参 loadTasks(会把 store.tasks 冲成全量,破坏
|
||||
// task 分支不再无参 loadTasks(会把 store.tasks 冲成全量,破坏
|
||||
// B-260615-29「store.tasks 反映当前筛选」契约)。改为读 _activeTaskProject:
|
||||
// - undefined: Tasks 视图未挂载/从未设过筛选 → 不触发 task load(避免破坏筛选,
|
||||
// 让 B-29 watch/handle 主导;此时改动由用户下次进 Tasks 自然刷新)
|
||||
@@ -41,7 +41,7 @@ function createStore() {
|
||||
// 避免刷新把已选 status 冲掉)。
|
||||
let _activeTaskProject: string | undefined = undefined
|
||||
let _activeTaskStatus: string | undefined = undefined
|
||||
// WK-10:Tasks 视图搜索关键字登记(数据变更联动刷新时一并下沉 keyword,避免冲掉搜索结果)
|
||||
// Tasks 视图搜索关键字登记(数据变更联动刷新时一并下沉 keyword,避免冲掉搜索结果)
|
||||
let _activeTaskKeyword: string | undefined = undefined
|
||||
function setActiveTaskProject(projectKey: string | undefined) {
|
||||
_activeTaskProject = projectKey
|
||||
@@ -62,7 +62,7 @@ function createStore() {
|
||||
return query
|
||||
}
|
||||
|
||||
// WK-4:Ideas 视图当前查询登记(数据变更联动刷新按当前筛选重载,不再无参 loadIdeas 全量冲掉筛选)。
|
||||
// Ideas 视图当前查询登记(数据变更联动刷新按当前筛选重载,不再无参 loadIdeas 全量冲掉筛选)。
|
||||
// undefined = Ideas 视图未挂载(如 Dashboard)→ 退化为全量刷新,保持面板统计新鲜。
|
||||
let _activeIdeaQuery: IdeaQuery | undefined = undefined
|
||||
function setActiveIdeaQuery(q: IdeaQuery | undefined) {
|
||||
@@ -75,7 +75,7 @@ function createStore() {
|
||||
if (_dataChangedUnlisten) return _dataChangedUnlisten
|
||||
_dataChangedUnlisten = await listen<DfDataChangedPayload>('df-data-changed', (event) => {
|
||||
const { entity } = event.payload
|
||||
// 按 entity 调对应 load 刷新(CR-260615-19:action 当前未消费,为未来 delete 本地移除等差异化刷新预留,统一 load 全量拉取)
|
||||
// 按 entity 调对应 load 刷新action 当前未消费,为未来 delete 本地移除等差异化刷新预留,统一 load 全量拉取)
|
||||
if (entity === 'project') {
|
||||
void projectsStore.loadProjects()
|
||||
} else if (entity === 'task') {
|
||||
@@ -89,7 +89,7 @@ function createStore() {
|
||||
// Dashboard 数字(与 Tasks 视图分页/筛选解耦,不受 q undefined 影响)
|
||||
void loadStats()
|
||||
} else if (entity === 'idea') {
|
||||
// WK-4:按 Ideas 视图当前 query 重载(未挂载时退化为全量刷新 Dashboard 面板)
|
||||
// 按 Ideas 视图当前 query 重载(未挂载时退化为全量刷新 Dashboard 面板)
|
||||
void ideasStore.loadIdeas(_activeIdeaQuery)
|
||||
}
|
||||
})
|
||||
@@ -182,20 +182,20 @@ function createStore() {
|
||||
startEventListener: workflowStore.startEventListener,
|
||||
stopEventListener: workflowStore.stopEventListener,
|
||||
clearLiveEvents: workflowStore.clearLiveEvents,
|
||||
// B-41: 工作流进度共享推导(按 execId 派生节点状态/进度)
|
||||
// 工作流进度共享推导(按 execId 派生节点状态/进度)
|
||||
workflowProgress: workflowStore.workflowProgress,
|
||||
approveHumanApproval: workflowStore.approveHumanApproval,
|
||||
cancelHumanApproval: workflowStore.cancelHumanApproval,
|
||||
// AR-11(方案A):数据变更联动刷新监听(后端工具执行后 emit df-data-changed)
|
||||
startDataChangedListener,
|
||||
stopDataChangedListener,
|
||||
// CR-260615-26(R-1): Tasks 视图登记当前 activeProject 筛选,供 listener 按筛选拉取
|
||||
// asks 视图登记当前 activeProject 筛选,供 listener 按筛选拉取
|
||||
setActiveTaskProject,
|
||||
// F-260621-02(P1 status 下沉):Tasks 视图登记当前 status 筛选,供 listener 复用同一筛选拉取
|
||||
setActiveTaskStatus,
|
||||
// WK-10:Tasks 视图登记当前搜索关键字,供 listener 复用同一筛选拉取
|
||||
// Tasks 视图登记当前搜索关键字,供 listener 复用同一筛选拉取
|
||||
setActiveTaskKeyword,
|
||||
// WK-4: Ideas 视图登记当前查询,供 listener 按筛选重载(不冲掉筛选视图)
|
||||
// Ideas 视图登记当前查询,供 listener 按筛选重载(不冲掉筛选视图)
|
||||
setActiveIdeaQuery,
|
||||
pendingApproval: computed(() => state.pendingApproval),
|
||||
// computed
|
||||
|
||||
@@ -9,11 +9,11 @@ export function createIdeasStore() {
|
||||
/**
|
||||
* 加载灵感列表。
|
||||
*
|
||||
* F-260621-02:status/keyword/order_by 下沉后端 WHERE,取代前端 computed filter。
|
||||
* status/keyword/order_by 下沉后端 WHERE,取代前端 computed filter。
|
||||
* - 传 `query` → 多条件查询(状态/关键词/排序/分页)。
|
||||
* - 不传 → 全量(created_at DESC,等价旧行为)。
|
||||
*
|
||||
* WK-7:成功时清 state.error(load 后不残留旧错误),失败由 runWithCatch 置 error。
|
||||
* 成功时清 state.error(load 后不残留旧错误),失败由 runWithCatch 置 error。
|
||||
*/
|
||||
async function loadIdeas(query?: IdeaQuery) {
|
||||
state.error = null
|
||||
@@ -40,7 +40,7 @@ export function createIdeasStore() {
|
||||
}
|
||||
|
||||
async function deleteIdea(id: string): Promise<boolean> {
|
||||
// WK-7:返成功布尔(失败时 runWithCatch 已置 state.error),调用方据此保留选中态
|
||||
// 返成功布尔(失败时 runWithCatch 已置 state.error),调用方据此保留选中态
|
||||
const ok = await runWithCatch(state, t('ideas.err.deleteFailed'), async () => {
|
||||
await ideaApi.delete(id)
|
||||
state.ideas = state.ideas.filter(i => i.id !== id)
|
||||
@@ -57,7 +57,7 @@ export function createIdeasStore() {
|
||||
}
|
||||
|
||||
async function promoteIdea(id: string) {
|
||||
// WK-4:不再内部全量 loadIdeas(会把 store.ideas 冲成全集、冲掉当前筛选视图)。
|
||||
// 不再内部全量 loadIdeas(会把 store.ideas 冲成全集、冲掉当前筛选视图)。
|
||||
// 由视图(Ideas.vue promoteToProject)操作后按当前 buildIdeaQuery() 主动重载。
|
||||
return await ideaApi.promote(id)
|
||||
}
|
||||
@@ -65,7 +65,7 @@ export function createIdeasStore() {
|
||||
async function relateIdeas(subjectId: string, targetIds: string[]) {
|
||||
await runWithCatch(state, t('ideas.err.relateFailed'), async () => {
|
||||
await ideaApi.relateIdeas(subjectId, targetIds)
|
||||
// WK-4:后端原子更新受影响灵感,原全量 loadIdeas 会冲掉当前筛选视图;
|
||||
// 后端原子更新受影响灵感,原全量 loadIdeas 会冲掉当前筛选视图;
|
||||
// 改由视图(Ideas.vue onUpdateRelated)按当前 query 重载。
|
||||
})
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import { state, clearError } from './state'
|
||||
export function createProjectsStore() {
|
||||
/**
|
||||
* 加载未删除项目。
|
||||
* F-260621-02:可选 query 透传(关键词/排序/分页)。不传 = 当前全量行为(向后兼容)。
|
||||
* 可选 query 透传(关键词/排序/分页)。不传 = 当前全量行为(向后兼容)。
|
||||
*/
|
||||
async function loadProjects(query?: ProjectQuery) {
|
||||
state.loading = true
|
||||
|
||||
@@ -6,14 +6,14 @@ import { state } from './state'
|
||||
|
||||
/** 任务 CRUD 子 store(共享全局 state) */
|
||||
export function createTasksStore() {
|
||||
// WK-10:并发 loadTasks 竞态守卫(快速切筛选/搜索防旧响应晚到覆盖新结果,
|
||||
// 并发 loadTasks 竞态守卫(快速切筛选/搜索防旧响应晚到覆盖新结果,
|
||||
// 对齐 knowledge store 的 _itemsSeq 模式)。旧请求的失败也不污染当前视图。
|
||||
let _tasksSeq = 0
|
||||
|
||||
/**
|
||||
* 加载任务列表。
|
||||
*
|
||||
* **双签名向后兼容**(F-260621-02):
|
||||
* **双签名向后兼容**
|
||||
* - `loadTasks(projectId?)`:旧签名,仅项目过滤(等价 `loadTasks({ project_id: projectId })`)。
|
||||
* - `loadTasks(query?)`:新签名,多条件(status/keyword/...)走后端 WHERE。
|
||||
*
|
||||
@@ -58,7 +58,7 @@ export function createTasksStore() {
|
||||
}
|
||||
|
||||
async function deleteTask(id: string): Promise<boolean> {
|
||||
// WK-13:返成功布尔(失败时 runWithCatch 已置 state.error),快捷删除据此 toast 反馈
|
||||
// 返成功布尔(失败时 runWithCatch 已置 state.error),快捷删除据此 toast 反馈
|
||||
const ok = await runWithCatch(state, t('tasks.err.deleteFailed'), async () => {
|
||||
// 后端已级联软删子任务(delete_task 返回 { ok, cascaded });
|
||||
// 本地同步移除父任务 + 其直接子任务(1 级嵌套,防悬挂 parent_id)
|
||||
|
||||
@@ -3,7 +3,7 @@ import { t } from '@/i18n/i18n-helpers'
|
||||
import type { NodeStatus, WorkflowEventPayload } from '@/api/types'
|
||||
import { state, _eventUnlisten, setEventUnlisten } from './state'
|
||||
|
||||
// B-41: 工作流进度共享推导。liveEvents 已全局收集所有 workflow-event,
|
||||
// 工作流进度共享推导。liveEvents 已全局收集所有 workflow-event,
|
||||
// 此处按 execution_id 重放派生节点状态/进度,供 TaskDetail/ProjectDetail 同源使用,
|
||||
// 替代各自维护一份 onEvent 累加状态(单事实源,并发工作流互不干扰)。
|
||||
export interface WorkflowProgress {
|
||||
@@ -74,7 +74,7 @@ function deriveWorkflowProgress(
|
||||
return { nodeStatuses, runningNode, doneCount, totalNodes, result }
|
||||
}
|
||||
|
||||
// B-03b-R10(⑦ 互斥): 审批响应/取消 IPC 进行中标记(模块级单例,createWorkflowStore 每会话只跑一次)。
|
||||
// b-R10(⑦ 互斥): 审批响应/取消 IPC 进行中标记(模块级单例,createWorkflowStore 每会话只跑一次)。
|
||||
// 防双击/连点在同一轮 IPC 未返回前发起第二次(后端无幂等键,第二次会重复消费 Request 触发
|
||||
// "node already completed" 类报错)。store 层守卫优于按钮 disabled: 共享单例 state,跨调用方统一。
|
||||
let _approvalInFlight = false
|
||||
@@ -112,18 +112,18 @@ export function createWorkflowStore() {
|
||||
if (_eventUnlisten) return _eventUnlisten
|
||||
const unlisten = await workflowApi.onEvent((payload) => {
|
||||
try {
|
||||
// 固时间戳(FR-C1):formattedEvents computed 重算时用事件发生时刻,非当前时刻
|
||||
// 固时间戳formattedEvents computed 重算时用事件发生时刻,非当前时刻
|
||||
state.liveEvents.push({ ...payload, _ts: Date.now() })
|
||||
// 限长(FR-R3):防 liveEvents 无限增长撑爆内存,保留最近 200 条
|
||||
// 限长防 liveEvents 无限增长撑爆内存,保留最近 200 条
|
||||
if (state.liveEvents.length > 200) {
|
||||
state.liveEvents.splice(0, state.liveEvents.length - 200)
|
||||
}
|
||||
// 处理人工审批请求
|
||||
// WorkflowEvent serde tag=type rename_all=snake_case → type='human_approval_request',字段扁平(无 data 包装)(B-03b-R7)
|
||||
// WorkflowEvent serde tag=type rename_all=snake_case → type='human_approval_request',字段扁平(无 data 包装)(b-R7)
|
||||
if (payload.event?.type === 'human_approval_request') {
|
||||
state.pendingApproval = payload.event as unknown as typeof state.pendingApproval
|
||||
}
|
||||
// B-03b-R10(⑤ 终态不清): 工作流走到终态(completed/failed)或审批节点被取消时,
|
||||
// b-R10(⑤ 终态不清): 工作流走到终态(completed/failed)或审批节点被取消时,
|
||||
// 若 pendingApproval 仍属于本次 execution,说明该审批未经 approve/cancel 正常路径关闭
|
||||
// (上游节点失败/工作流被整体取消/用户「稍后」关闭弹窗但 state 仍残留),清掉陈旧态
|
||||
// 避免下次进 ProjectDetail 时 watch immediate 误判仍有待审批。
|
||||
@@ -150,7 +150,7 @@ export function createWorkflowStore() {
|
||||
}
|
||||
|
||||
/**
|
||||
* B-41: 按 execution_id 派生工作流进度(读全局 liveEvents,响应式)。
|
||||
* 按 execution_id 派生工作流进度(读全局 liveEvents,响应式)。
|
||||
* 供 TaskDetail(自身推进的 execId)/ ProjectDetail(最近一次执行)共用同源状态。
|
||||
*/
|
||||
function workflowProgress(execId: string | null): WorkflowProgress {
|
||||
@@ -165,25 +165,25 @@ export function createWorkflowStore() {
|
||||
* - 多选(select_type='multiple'):decisions 透传全量。
|
||||
*
|
||||
* CR-11⑪:签名保持 approveHumanApproval(decisions: string[], comment?)。
|
||||
* F-260615-01: decisions/select_type 透传,与后端 IPC 签名对齐。
|
||||
* decisions/select_type 透传,与后端 IPC 签名对齐。
|
||||
*/
|
||||
async function approveHumanApproval(
|
||||
decisions: string[],
|
||||
comment?: string,
|
||||
) {
|
||||
if (!state.pendingApproval) return
|
||||
// B-03b-R10(⑦ 互斥): 上一轮 IPC 未返回,忽略重复点击(连点/双击)
|
||||
// b-R10(⑦ 互斥): 上一轮 IPC 未返回,忽略重复点击(连点/双击)
|
||||
if (_approvalInFlight) return
|
||||
_approvalInFlight = true
|
||||
const selectType = state.pendingApproval.select_type ?? 'single'
|
||||
// CR-260615-18:删死逻辑三元(原 selectType 多/单分支返回值相同)
|
||||
// 删死逻辑三元(原 selectType 多/单分支返回值相同)
|
||||
// 单选取首项(后端 decision 单值);多选 decision 取首项占位(后端按 decisions 走)
|
||||
const decision = decisions[0] ?? ''
|
||||
|
||||
try {
|
||||
// R-PD-5: 透传 options 闭环后端校验(options 非空时 decision 必须 ∈ options,否则 IPC 报错)。
|
||||
// 透传 options 闭环后端校验(options 非空时 decision 必须 ∈ options,否则 IPC 报错)。
|
||||
// options 来自已收到的 HumanApprovalRequest 事件 payload(IPC 无法访问节点 config)。
|
||||
// B-260615-34:snake_case 由 api 层对齐后端 workflow.rs:211
|
||||
// snake_case 由 api 层对齐后端 workflow.rs:211
|
||||
await workflowApi.approveHumanApproval({
|
||||
execution_id: state.pendingApproval.execution_id,
|
||||
node_id: state.pendingApproval.node_id,
|
||||
@@ -200,7 +200,7 @@ export function createWorkflowStore() {
|
||||
console.error('审批失败:', error)
|
||||
state.error = error?.toString() ?? t('projects.err.approveFailed')
|
||||
} finally {
|
||||
// B-03b-R10(⑦ 互斥): 无论成功/失败,IPC 已返回,释放重入锁
|
||||
// b-R10(⑦ 互斥): 无论成功/失败,IPC 已返回,释放重入锁
|
||||
_approvalInFlight = false
|
||||
}
|
||||
}
|
||||
@@ -208,7 +208,7 @@ export function createWorkflowStore() {
|
||||
/** 取消当前待审批节点(调 cancel_workflow_node IPC 置节点 Cancelled) */
|
||||
async function cancelHumanApproval() {
|
||||
if (!state.pendingApproval) return
|
||||
// B-03b-R10(⑦ 互斥): 上一轮 IPC 未返回,忽略重复点击
|
||||
// b-R10(⑦ 互斥): 上一轮 IPC 未返回,忽略重复点击
|
||||
if (_approvalInFlight) return
|
||||
_approvalInFlight = true
|
||||
|
||||
@@ -223,7 +223,7 @@ export function createWorkflowStore() {
|
||||
console.error('取消审批失败:', error)
|
||||
state.error = error?.toString() ?? t('projects.err.cancelFailed')
|
||||
} finally {
|
||||
// B-03b-R10(⑦ 互斥): 无论成功/失败,IPC 已返回,释放重入锁
|
||||
// b-R10(⑦ 互斥): 无论成功/失败,IPC 已返回,释放重入锁
|
||||
_approvalInFlight = false
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user