新增: Phase2 阶段收尾(Sprint 1-20)

重构:删 5 零引用 crate(df-evolve/plugin/stages/task/traceability)+ 清死模块、ai.rs 拆 11 子 module、ai.ts 拆 6 composable、i18n 拆目录
功能:知识库全栈(df-project/scan + CRUD + 时间线 + 前端)、Settings 拆分、appSettings KV 迁移、模型池、LLM 并发 Semaphore
修复:审批持久化根治、ConditionEngine 默认拒绝、NodeRegistry unimplemented 清除、promote 补偿删除、工具结果截断 50KB、路径校验防 symlink 逃逸
文档:B-03 人工审批设计、决策记录三分档、规格契约自检、经验记录、todo 看板、PROGRESS 更新

详见 PROGRESS.md。src-tauri/儿童每日打卡应用/ 与本项目无关,已排除。
This commit is contained in:
2026-06-14 14:08:20 +08:00
parent 98393b4908
commit cf017f81e2
167 changed files with 19549 additions and 6886 deletions

View File

@@ -2,12 +2,12 @@
import { invoke } from '@tauri-apps/api/core'
import { listen, type UnlistenFn } from '@tauri-apps/api/event'
import type { AiChatEvent, AiConversationDetail, AiConversationSummary, AiProviderConfig } from './types'
import type { AiChatEvent, AiConversationDetail, AiConversationSummary, AiProviderConfig, SkillInfo } from './types'
export const aiApi = {
/** 发送消息(非阻塞,通过 ai-chat-event 流式返回) */
sendMessage(message: string, language?: string): Promise<string> {
return invoke('ai_chat_send', { message, language: language || 'zh-CN' })
/** 发送消息(非阻塞,通过 ai-chat-event 流式返回)skill 传技能名则注入其 SKILL.md */
sendMessage(message: string, language?: string, skill?: string): Promise<string> {
return invoke('ai_chat_send', { message, language: language || 'zh-CN', skill: skill || null })
},
/** 批准/拒绝工具调用 */
@@ -15,6 +15,11 @@ export const aiApi = {
return invoke('ai_approve', { toolCallId, approved })
},
/** 查询某对话积压的待审批工具(重启后恢复 toolCard pending_approval 态用) */
pendingToolCalls(convId: string): Promise<{ tool_call_id: string; conversation_id: string | null }[]> {
return invoke('ai_pending_tool_calls', { convId })
},
/** 清空对话 */
clearChat(): Promise<void> {
return invoke('ai_chat_clear')
@@ -54,6 +59,21 @@ export const aiApi = {
return invoke('ai_set_provider', { providerId })
},
/** 删除 AI 提供商 */
deleteProvider(providerId: string): Promise<void> {
return invoke('ai_delete_provider', { providerId })
},
/** 设置 LLM 调用并发上限(全局 / 单对话,运行时即时生效;软收敛不中断进行中调用) */
setConcurrencyConfig(globalLimit: number, perConvLimit: number): Promise<void> {
return invoke('ai_set_concurrency_config', { globalLimit, perConvLimit })
},
/** 列出本机 Claude 技能skills + commands + plugins */
listSkills(): Promise<SkillInfo[]> {
return invoke('ai_list_skills')
},
/** 监听 AI 聊天事件 */
onEvent(callback: (event: AiChatEvent) => void): Promise<UnlistenFn> {
return listen<AiChatEvent>('ai-chat-event', (e) => {
@@ -68,9 +88,12 @@ export const aiApi = {
return invoke('ai_conversation_create')
},
/** 列出所有对话(摘要) */
listConversations(): Promise<AiConversationSummary[]> {
return invoke('ai_conversation_list')
/** 列出对话(摘要limit 默认 50includeArchived 默认 false 隐藏归档 */
listConversations(limit?: number, includeArchived?: boolean): Promise<AiConversationSummary[]> {
return invoke('ai_conversation_list', {
limit: limit ?? null,
includeArchived: includeArchived ?? false,
})
},
/** 切换到指定对话 */
@@ -87,4 +110,9 @@ export const aiApi = {
renameConversation(conversationId: string, title: string): Promise<void> {
return invoke('ai_conversation_rename', { conversationId, title })
},
/** 归档/取消归档对话 */
archiveConversation(conversationId: string, archived: boolean): Promise<void> {
return invoke('ai_conversation_archive', { conversationId, archived })
},
}