# S4 TaskDrawer 查看会话跳转 — 只读勘察 ## 1. 关联数据现状:无现成映射,audit 表可推导(零 schema 变更) - spawn_agent 工具:src-tauri/src/commands/ai/tools/spawn_agent.rs(声明式注册 L164,handler L195) - 父会话经 task-local CALLER_CONV 注入;子会话 id = `{parent}::agent-{n}`(agentic/sub_agent.rs:215 next_child_id,父 id 内嵌可反推) - 子代理整轨迹落 ai_conversations,V44 origin='sub_agent' 标记(sub_agent.rs:76,452;侧栏/miniapp 按 origin 过滤,commands/conversation.rs:233) - **推导主链 = ai_tool_executions 审计表**(V9 建,migrations.rs:1576):每笔工具执行记 conversation_id(发起会话) + tool_name + result(audit/record.rs:31 build_audit_record) - create_task result = `{"id": task_id, "title", "status"}`(tools/task.rs:128) - update/advance_task result = `{"id": task_id, "field", "updated"}`(task.rs:167) - spawn_agent result 含 agent_id(即子会话 id,spawn_agent.rs:299) - project_events.conversation_id 列存在(models.rs:173 溯源链设计)但 IPC human 路径恒 None,不可依赖 - **最小落点**:新增只读 IPC,从 ai_tool_executions 查 `tool_name IN ('create_task','update_task','advance_task')` 且 result JSON 解析后 id 字段 == task_id(精确解析,勿 LIKE 防误命中);不需要 spawn 时写映射表 ## 2. TaskDrawer 现状:src/components/task/TaskDrawer.vue - Arco Drawer 640px,props { taskId, visible },仅 Tasks.vue:390 挂载 - 数据流:watch(taskId) → load()(L246)= taskApi.get + projectApi.list + ideaApi.list(防慢响应覆盖 L257) - **挂点:「关联信息」panel L46-83**——已有 parent/project/idea 三个 info-item + router-link 先例, 加「关联会话」info-item(v-if 有关联)最贴现状,零新 section ## 3. 会话跳转机制:无路由,面板 state + switchConversation - AI 非路由视图:主窗口面板(state.panelOpen,v-show)或分离窗口(state.detached) - **跳转 = `state.panelOpen = true`(useAiPanel persistUiState)+ `switchConversation(id)`** - switchConversation(useAiConversations.ts:275)是唯一正规入口:aiApi.switchConversation → parse → activeConversationId → 持久化 df-ai-active-conv;自带"对话不存在"新建兜底/瞬态失败气泡/过期丢弃 - 既有先例:无跨视图跳会话(仅侧栏点击 ConversationSidebar.vue:353);panelOpen=true 写点全在 useAiPanel/useAiWindow 内部 → S4 需新增入口函数 - 坑:子会话(origin 非空)不在侧栏列表,switchConversation 数据面可用但侧栏不高亮;v1 建议只列主会话 - detached 状态主窗口无面板:openConversation 里判 state.detached 时仅 switchConversation 不动面板 ## 4. S4 实施骨架(单代理一轮可完成,5 文件小改) 1. 后端 IPC `list_task_conversations(task_id) -> Vec<{conversation_id, tool_name, requested_at}>`: 放 src-tauri/src/commands/ai/audit/record.rs(与 list_tool_executions:207 同文件,复用 repo 读); 返回去重按 requested_at 倒序 2. 注册:src-tauri/src/lib.rs invoke_handler(list_tool_executions 在 L475,紧邻追加) 3. 前端 API:src/api/ai.ts 加 invoke 包装 4. 跳转入口:src/composables/ai/useAiConversations.ts export `openConversation(id)`: if (!state.detached) { state.panelOpen = true; persistUiState() } + await switchConversation(id) 5. TaskDrawer.vue 关联信息 panel 加 info-item:load() 并行加 listTaskConversations,点击 router 语义改为 openConversation(非 router-link) 6. i18n:taskDetail.relatedConversations(zh/en,src/i18n) - 颗粒评估:后端 1+2 一体、前端 3-6 机械接线,单代理一轮内自证完成;唯一语义决策=result 精确解析 与 detached 分支,已在骨架内定死