From c7fb63a3ee6915d3a2b872a4512f9872ddf4b30c Mon Sep 17 00:00:00 2001 From: HelloWorldU Date: Thu, 28 May 2026 21:34:09 +0800 Subject: [PATCH 1/2] fix(agent-engine): persist review comment, fix sync and ci log bugs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix four active bugs: review comment missing, false sync commit failure, CI logs truncated from wrong end, and stop not breaking retry loops. 已有功能测试覆盖,手动验证各修复路径通过。 --- docs/exec-plans/backlog.md | 62 ------------------- kimi-code-swarm/agent-engine/src/agent.ts | 13 ++-- .../agent-engine/src/github-api.ts | 4 +- 3 files changed, 8 insertions(+), 71 deletions(-) diff --git a/docs/exec-plans/backlog.md b/docs/exec-plans/backlog.md index b5d3b7d..9d56ff2 100644 --- a/docs/exec-plans/backlog.md +++ b/docs/exec-plans/backlog.md @@ -25,52 +25,6 @@ ## 🐛 活跃 Bug -### #1 — `submitReview` 丢失 reviewer 的具体评论 - -**现象** -PR #25 流程里 reviewer agent 给出了详细修改建议(如「按钮会随聊天内容滚走,建议放到 wrapper 外」),但 engine-state.json 里 `reviews[].comment` 字段全部缺失,前端 agent 收到的 fix 指令只剩 fallback「审阅未通过」空字符串,kimi 无据可改。 - -**根因(源码确认)** -- [agent.ts:1074-1117 submitReview](kimi-code-swarm/agent-engine/src/agent.ts#L1074-L1117):收到 `comment` 参数后**只用来拼 GitHub API 的 reviewBody**(1081 / 1091 / 1105 行),写入 review 记录时(1113-1114)只 set `status` 和 `reviewedAt`,**遗漏 `review.comment = comment`**。 -- [agent.ts:1473 fixBasedOnReviews](kimi-code-swarm/agent-engine/src/agent.ts#L1473):读 `r.comment || '审阅未通过'` → 永远 `undefined` → fallback「审阅未通过」→ kimi 拿到 0 信息无据可改。 - -**修复方向** -1114 行后追加一行:`review.comment = comment`。 - -**优先级**:高。直接让 review→fix 闭环失效。 - ---- - -### #2 — `stop()` 不级联取消 async 链 - -**现象** -fixBasedOnReviews 进入循环后按「停止」按钮无反应;点多次也停不下,kimi 进程被 kill 但下一轮 `sendInstruction → autoSubmitForReview` 仍按计划起来。 - -**根因** -`stop()` 只 kill 当前 kimi 子进程,不取消 engine 里的异步链(fixBasedOnReviews → 等 reviewer → 再 sendInstruction → autoSubmitForReview)。没有 cancellation token / AbortSignal 贯穿。 - -**修复方向** -agent 上挂 `AbortController`,stop 时 abort;所有 await 链入口检查 `signal.aborted` 直接 throw / return。或更彻底——下放到 agent skill 后,停止只需 kill 进程即可,不再有 engine 编排的异步链。 - -**优先级**:高。用户能感知到「按钮坏了」。 - ---- - -### #3 — `syncBranchWithMain` 同步成功却报「同步提交失败」 - -**现象** -PR squash merge 后下一次 sendInstruction 触发 sync,UI 红字「同步提交失败」+ pre-commit 输出,但 pre-commit 自己写「✅ pre-commit 检查通过」,互相打架。 - -**根因** -[agent.ts:936-946](kimi-code-swarm/agent-engine/src/agent.ts#L936-L946):`gitMerge` 在 git 默认行为下成功时已自动建 merge commit,紧接着代码又调 `gitCommit('sync: merge origin/main')` —— 此时无暂存内容 → `nothing to commit` → exit 1 → 误报。squash merge 场景必触发(agent 分支 A+B+C ≡ main 的 squash commit S,merge 必为 clean)。 - -**修复方向** -删掉 merge 成功后的 `gitCommit` 调用,直接 `this.log('system', '已同步 ...') + return true`。 - -**优先级**:中。同步实际成功,纯 UI 噪音,但加重 "engine 修不完" 感受。归并到 [架构决策项] 整体下放更彻底。 - ---- - ### #4 — F5 刷新 dashboard 后 agents 不可见 **现象** @@ -86,20 +40,4 @@ engine 新增 `list-agents` 命令:收到后全量 emit `agent-created` + `eng --- -### #5 — `getCheckRunLogs` 截断方向错(PR #28 重现) - -**现象** -CI fix 轮里 agent 思维链都说「日志被截断了,找不到完整错误」,反翻 `.github/workflows/` 反推 CI 在跑什么。PR #28 那次:fix prompt 里 8KB 窗口前面全是 git config / fetch refs / setup auth 噪音,真错误 `ERR_MODULE_NOT_FOUND: @typescript-eslint/typescript-estree` 完全被截走,kimi 是靠自己另起 tool call 去 GitHub 拉完整 log 才查出根因。 - -**根因** -[github-api.ts:244 / :265](kimi-code-swarm/agent-engine/src/github-api.ts#L244):`text.slice(0, 8000)` 取前 8k 字符 —— 但 GitHub Actions log 开头全是 setup 噪音(runner 启动 / checkout / `npm install` deprecation warnings),**真正错误在末尾**。引入新依赖后 setup+install 轻松 8k+,错误被全截走。 - -**修复方向** -- 简版:`text.slice(-8000)` —— 错误几乎永远在末尾 -- 稳版:首部 500(job 元信息)+ 末尾 7500 + 中间 `[middle truncated]` 标记 - -**优先级**:高。今晚 PR #28 再次证明不是偶发,会随依赖/复杂度增加越来越频繁。 - ---- - *Updated: 2026-05-28 — 新增架构决策项 + 4 个活跃 bug(review.comment 丢失 / stop 不级联 / sync 误报 / F5 失踪)+ 重新收回 #5(CI log 截断方向,PR #28 重现)。* diff --git a/kimi-code-swarm/agent-engine/src/agent.ts b/kimi-code-swarm/agent-engine/src/agent.ts index 59a07fa..e18a3f8 100644 --- a/kimi-code-swarm/agent-engine/src/agent.ts +++ b/kimi-code-swarm/agent-engine/src/agent.ts @@ -804,6 +804,8 @@ export class Agent { // 走流式 sendInstruction:修复过程实时显示在对话框,且无 runInstructionSilent 的硬超时; // displayAsUserInput=false 让长 fix prompt 不污染「任务指令」区与聊天面板 await this.sendInstruction(fixPrompt, undefined, { displayAsUserInput: false }) + // 若用户已点停止,中断重试循环 + if (this.state.status === 'stopped') return // 修复后重新检测变更 if (this.state.workspace) { try { @@ -935,13 +937,7 @@ export class Agent { const mergeResult = await gitMerge(this.state.workspace, 'origin/main') if (mergeResult.exitCode === 0) { - const commitResult = await gitCommit(this.state.workspace, 'sync: merge origin/main') - if (commitResult.exitCode === 0) { - this.log('system', `已同步 main 的 ${behindCount} 个 commit`) - } else { - this.log('error', `同步提交失败: ${commitResult.stderr}`) - try { await abortMerge(this.state.workspace) } catch { /* 已无 merge 状态可忽略 */ } - } + this.log('system', `已同步 main 的 ${behindCount} 个 commit`) return true } @@ -1112,6 +1108,7 @@ ${fileContents.join('\n\n')} review.status = approved ? 'approved' : 'rejected' review.reviewedAt = new Date().toISOString() + review.comment = comment || '' this.syncState() const action = approved ? '通过' : '拒绝' this.log('system', `Agent「${review.reviewerName}」审阅${action}了此 PR`) @@ -1481,6 +1478,8 @@ PR_BODY: try { // displayAsUserInput=false:审阅拒绝后引擎注入的修复 prompt 不算用户指令 await this.sendInstruction(prompt, undefined, { displayAsUserInput: false }) + // 若用户已点停止,不再继续提交 + if (this.state.status === 'stopped') return // sendInstruction 完成后状态为 ready,改回 working 以符合 submitForReview 前置条件 this.state.status = 'working' const { ok, steps } = await this.submitForReview(githubToken) diff --git a/kimi-code-swarm/agent-engine/src/github-api.ts b/kimi-code-swarm/agent-engine/src/github-api.ts index e2eb159..8686959 100644 --- a/kimi-code-swarm/agent-engine/src/github-api.ts +++ b/kimi-code-swarm/agent-engine/src/github-api.ts @@ -241,7 +241,7 @@ export async function getCheckRunLogs( const res = await fetch(url, { headers: getHeaders(token) }) if (res.ok) { const text = await res.text() - return text.length > 8000 ? text.slice(0, 8000) + '\n...[truncated]' : text + return text.length > 8000 ? text.slice(-8000) + '\n...[truncated]' : text } console.error(`[github-api] job logs ${res.status}`) } catch (err) { @@ -262,7 +262,7 @@ export async function getCheckRunLogs( return null } const text = await res.text() - return text.length > 8000 ? text.slice(0, 8000) + '\n...[truncated]' : text + return text.length > 8000 ? text.slice(-8000) + '\n...[truncated]' : text } catch (err) { console.error(`[github-api] getCheckRunLogs 异常: ${String(err)}`) return null From 8367efe7e64494b6abc93efa1de4b48237c1f19b Mon Sep 17 00:00:00 2001 From: HelloWorldU Date: Thu, 28 May 2026 21:50:20 +0800 Subject: [PATCH 2/2] feat(multi): add agent detail view and update related docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add AgentDetail component with swarm store integration and update agent-engine agent interface. Synchronize architecture, component patterns and frontend documentation. 暂无新增测试文件,需后续补充。 --- docs/ARCHITECTURE.md | 2 ++ docs/COMPONENT_PATTERNS.md | 2 +- docs/FRONTEND.md | 2 +- kimi-code-swarm/agent-engine/src/agent.ts | 2 +- kimi-code-swarm/src/components/AgentDetail.vue | 6 +++--- kimi-code-swarm/src/store/useSwarmStore.ts | 5 +++-- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 3152767..f89d390 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -50,6 +50,8 @@ PR 创建时,Store 自动生成 `ReviewEntry[]`,包含所有其他 Agent 作 所有发往 engine 的 review 相关命令(`submit-for-review` / `submit-review` / `merge-pr`)都必须携带当前 GitHub Token;engine 的 `canMerge` / `mergePr` 根据 token 是否存在决定走真实 GitHub API 还是 mock 路径,缺失 token 会导致真实 PR 走到 mock merge。 +`submit-review` 命令携带 `comment` 字段(来自自动审阅的 `review.comment`),确保 fix 闭环能获取具体审阅意见而非 fallback「审阅未通过」。 + **自动合并的 mock 区分**:`handleReviewVerdict` 在 reviewer 全 approved 后,**仅当有 GitHub Token 时**才主动调 `mergePr` 自动合并;mock 模式(无 token)不自动合并,UI「合并」按钮仍可点,由用户决定时机手动合并——避免 mock merge 跟 GitHub 现实状态脱钩造成误判。 **审阅失败上限**:`ReviewEntry` 加 `status='failed'` 枚举 + `attempts` + `failureReason` 字段。`retryDeferredReviews` 给 `performReview` 传 `onFailed` 回调,累加 attempts;达 `MAX_REVIEW_ATTEMPTS=3` 后 status 置 `failed`,retry 自然停止。`handleReviewVerdict` 看到 `hasFailed=true` 时跳过 `fixBasedOnReviews`——「审阅多次跑不通」≠「内容拒绝」,不应让 agent 改代码方向,等用户手动处置(重试 / 改派 / 强制合并 / 打回)。 diff --git a/docs/COMPONENT_PATTERNS.md b/docs/COMPONENT_PATTERNS.md index c9d8667..8606be5 100644 --- a/docs/COMPONENT_PATTERNS.md +++ b/docs/COMPONENT_PATTERNS.md @@ -35,7 +35,7 @@ const emit = defineEmits<{...}>() - `CreateTaskModal.vue` — 表单弹窗组件:收集 name / repoUrl / tokenBudget 创建 Agent,Vue `` 原生过渡动画 - `SwarmConfirmModal.vue` — 确认弹窗组件:类型化图标 + 双按钮确认/取消,配合 useConfirm composable - `SwarmToast.vue` — Toast 通知组件:类型化图标 + 进度条 + 自动消失,配合 useToast composable -- `AgentDetail.vue` — 聊天式多轮对话组件:Header + Info + PR 审阅 + 文件变更 + 聊天消息区(input/output/think 支持 **Markdown 渲染 + 代码语法高亮**,基于 `marked` + `highlight.js` + `dompurify` XSS 过滤;tool_call/mcp/tool_result 为可折叠气泡保持等宽纯文本,默认收起,点击展开查看完整内容)+ `