UNPKG

autosnippet

Version:

Extract code patterns into a knowledge base for AI coding assistants

81 lines (80 loc) 2.87 kB
/** * createSupersedeProposal — 统一的 supersede 提案创建逻辑 * * 内部 Agent 路径 (lifecycle.ts / composite.ts) 和外部 MCP 路径 (consolidated.ts) * 共用此函数,确保知识替代的进化架构入口唯一。 * * 流程: * 1. 从 DI 容器获取 ProposalRepository * 2. 验证旧 Recipe 存在 * 3. 去重检查(ProposalRepository 内部) * 4. 创建 type='supersede' 提案,进入 72h 观察窗口 */ /* ────────────────────── Main ────────────────────── */ /** * 在 DI 容器中查找 ProposalRepository,验证旧 Recipe 存在后创建 supersede 提案。 * * @returns SupersedeResult(成功)| null(ProposalRepo 不可用 / 旧 Recipe 不存在 / 去重拒绝) */ export async function createSupersedeProposal(container, input) { const { oldRecipeId, newRecipeIds, source = 'ide-agent', confidence = 0.8 } = input; if (!oldRecipeId || newRecipeIds.length === 0) { return null; } // 1. 获取 ProposalRepository let proposalRepo = null; try { proposalRepo = container.get('proposalRepository') ?? null; } catch { return null; } if (!proposalRepo) { return null; } // 2. 验证旧 Recipe 存在 if (!(await verifyRecipeExists(container, oldRecipeId))) { return null; } // 3. 创建 supersede 提案(ProposalRepository 内部做去重检查) const proposal = proposalRepo.create({ type: 'supersede', targetRecipeId: oldRecipeId, relatedRecipeIds: newRecipeIds, confidence, source, description: `Agent 声明新 Recipe [${newRecipeIds.join(', ')}] 替代旧 Recipe [${oldRecipeId}]。观察窗口内将对比新旧表现。`, evidence: [ { snapshotAt: Date.now(), newRecipeIds, declaredBy: source, }, ], }); if (!proposal) { return null; } return { proposalId: proposal.id, type: 'supersede', targetRecipe: { id: oldRecipeId }, status: proposal.status, expiresAt: proposal.expiresAt, message: `已创建替代提案:新 Recipe 将在观察窗口到期后自动替代旧 Recipe [${oldRecipeId}]。`, }; } /* ────────────────────── Helpers ────────────────────── */ async function verifyRecipeExists(container, recipeId) { try { const knowledgeRepo = container.get('knowledgeRepository'); if (!knowledgeRepo) { return false; } const entry = await knowledgeRepo.findById(recipeId); return entry !== null; } catch { return false; } }