autosnippet 3.3.5 → 3.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/dashboard/dist/assets/icons-D1aVZYFW.js +1 -0
  2. package/dashboard/dist/assets/index-CxHOu8Hd.css +1 -0
  3. package/dashboard/dist/assets/index-DDdAOpYT.js +128 -0
  4. package/dashboard/dist/index.html +3 -3
  5. package/dist/bin/api-server.js +1 -0
  6. package/dist/bin/cli.d.ts +1 -0
  7. package/dist/bin/cli.js +136 -9
  8. package/dist/lib/agent/AgentFactory.d.ts +0 -17
  9. package/dist/lib/agent/AgentFactory.js +1 -25
  10. package/dist/lib/agent/capabilities.d.ts +11 -0
  11. package/dist/lib/agent/capabilities.js +29 -5
  12. package/dist/lib/agent/context/ExplorationTracker.js +10 -1
  13. package/dist/lib/agent/context/exploration/ExplorationStrategies.d.ts +2 -0
  14. package/dist/lib/agent/context/exploration/ExplorationStrategies.js +2 -2
  15. package/dist/lib/agent/domain/insight-analyst.d.ts +47 -3
  16. package/dist/lib/agent/domain/insight-analyst.js +111 -11
  17. package/dist/lib/agent/domain/insight-evolver.d.ts +69 -0
  18. package/dist/lib/agent/domain/insight-evolver.js +230 -0
  19. package/dist/lib/agent/domain/insight-gate.d.ts +42 -0
  20. package/dist/lib/agent/domain/insight-gate.js +41 -0
  21. package/dist/lib/agent/domain/insight-producer.d.ts +27 -2
  22. package/dist/lib/agent/domain/insight-producer.js +60 -5
  23. package/dist/lib/agent/domain/scan-prompts.js +10 -7
  24. package/dist/lib/agent/memory/ActiveContext.d.ts +2 -28
  25. package/dist/lib/agent/memory/MemoryCoordinator.d.ts +2 -2
  26. package/dist/lib/agent/memory/SessionStore.d.ts +6 -12
  27. package/dist/lib/agent/memory/SessionStore.js +9 -15
  28. package/dist/lib/agent/memory/memory-flush-contract.d.ts +49 -0
  29. package/dist/lib/agent/memory/memory-flush-contract.js +16 -0
  30. package/dist/lib/agent/memory/session-store-schema.d.ts +20 -0
  31. package/dist/lib/agent/memory/session-store-schema.js +41 -0
  32. package/dist/lib/agent/presets.d.ts +89 -1
  33. package/dist/lib/agent/presets.js +53 -5
  34. package/dist/lib/agent/tools/_shared.d.ts +7 -15
  35. package/dist/lib/agent/tools/_shared.js +20 -21
  36. package/dist/lib/agent/tools/composite.d.ts +25 -22
  37. package/dist/lib/agent/tools/composite.js +108 -109
  38. package/dist/lib/agent/tools/evolution-tools.d.ts +145 -0
  39. package/dist/lib/agent/tools/evolution-tools.js +161 -0
  40. package/dist/lib/agent/tools/index.d.ts +163 -92
  41. package/dist/lib/agent/tools/index.js +9 -1
  42. package/dist/lib/agent/tools/lifecycle.d.ts +7 -1
  43. package/dist/lib/agent/tools/lifecycle.js +59 -75
  44. package/dist/lib/cli/AiScanService.js +1 -1
  45. package/dist/lib/cli/KnowledgeSyncService.js +1 -1
  46. package/dist/lib/core/AstAnalyzer.d.ts +1 -0
  47. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.d.ts → domain/dimension/DimensionCopy.d.ts} +2 -2
  48. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.js → domain/dimension/DimensionCopy.js} +22 -72
  49. package/dist/lib/domain/dimension/DimensionRegistry.d.ts +54 -0
  50. package/dist/lib/domain/dimension/DimensionRegistry.js +620 -0
  51. package/dist/lib/domain/dimension/DimensionSop.d.ts +55 -0
  52. package/dist/lib/domain/dimension/DimensionSop.js +1604 -0
  53. package/dist/lib/domain/dimension/UnifiedDimension.d.ts +61 -0
  54. package/dist/lib/domain/dimension/UnifiedDimension.js +53 -0
  55. package/dist/lib/domain/dimension/index.d.ts +10 -0
  56. package/dist/lib/domain/dimension/index.js +9 -0
  57. package/dist/lib/domain/knowledge/FieldSpec.d.ts +1 -1
  58. package/dist/lib/domain/knowledge/FieldSpec.js +29 -16
  59. package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +33 -111
  60. package/dist/lib/domain/knowledge/KnowledgeEntry.js +27 -6
  61. package/dist/lib/domain/knowledge/KnowledgeRepository.d.ts +1 -0
  62. package/dist/lib/domain/knowledge/KnowledgeRepository.js +3 -0
  63. package/dist/lib/domain/knowledge/Lifecycle.js +1 -1
  64. package/dist/lib/domain/knowledge/StyleGuide.d.ts +1 -1
  65. package/dist/lib/domain/knowledge/StyleGuide.js +1 -1
  66. package/dist/lib/domain/knowledge/UnifiedValidator.js +15 -0
  67. package/dist/lib/external/mcp/McpServer.js +4 -0
  68. package/dist/lib/external/mcp/handlers/TargetClassifier.d.ts +1 -1
  69. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.d.ts +8 -16
  70. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.js +10 -10
  71. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.d.ts +7 -0
  72. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.js +20 -0
  73. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +52 -132
  74. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +204 -17
  75. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.d.ts +11 -75
  76. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.js +40 -191
  77. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.d.ts +13 -78
  78. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.js +30 -52
  79. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.d.ts +0 -1
  80. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.d.ts +99 -12
  81. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +172 -161
  82. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +7 -17
  83. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.d.ts +46 -0
  84. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.js +58 -0
  85. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.d.ts +25 -0
  86. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.js +47 -0
  87. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +50 -12
  88. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +30 -10
  89. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-text.js +1 -1
  90. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.d.ts +24 -0
  91. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.js +14 -0
  92. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.d.ts +14 -0
  93. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.js +48 -0
  94. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.d.ts +21 -0
  95. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.js +45 -0
  96. package/dist/lib/external/mcp/handlers/bootstrap/shared/skill-generator.d.ts +1 -1
  97. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.d.ts +27 -0
  98. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.js +44 -0
  99. package/dist/lib/external/mcp/handlers/bootstrap-external.d.ts +14 -10
  100. package/dist/lib/external/mcp/handlers/bootstrap-external.js +39 -51
  101. package/dist/lib/external/mcp/handlers/bootstrap-internal.d.ts +2 -0
  102. package/dist/lib/external/mcp/handlers/bootstrap-internal.js +115 -82
  103. package/dist/lib/external/mcp/handlers/consolidated.d.ts +4 -4
  104. package/dist/lib/external/mcp/handlers/consolidated.js +107 -332
  105. package/dist/lib/external/mcp/handlers/dimension-complete-external.js +69 -1
  106. package/dist/lib/external/mcp/handlers/evolve-external.d.ts +54 -0
  107. package/dist/lib/external/mcp/handlers/evolve-external.js +226 -0
  108. package/dist/lib/external/mcp/handlers/knowledge.js +26 -2
  109. package/dist/lib/external/mcp/handlers/rescan-external.d.ts +76 -0
  110. package/dist/lib/external/mcp/handlers/rescan-external.js +335 -0
  111. package/dist/lib/external/mcp/handlers/rescan-internal.d.ts +120 -0
  112. package/dist/lib/external/mcp/handlers/rescan-internal.js +359 -0
  113. package/dist/lib/external/mcp/handlers/search.d.ts +6 -5
  114. package/dist/lib/external/mcp/handlers/search.js +6 -5
  115. package/dist/lib/external/mcp/handlers/types.d.ts +2 -1
  116. package/dist/lib/external/mcp/handlers/wiki-external.js +2 -2
  117. package/dist/lib/external/mcp/tools.d.ts +8 -18
  118. package/dist/lib/external/mcp/tools.js +58 -2
  119. package/dist/lib/http/routes/knowledge.js +122 -1
  120. package/dist/lib/http/routes/modules.js +25 -3
  121. package/dist/lib/http/routes/panorama.js +16 -4
  122. package/dist/lib/infrastructure/cache/CacheCoordinator.d.ts +41 -0
  123. package/dist/lib/infrastructure/cache/CacheCoordinator.js +105 -0
  124. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.d.ts +7 -0
  125. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.js +28 -0
  126. package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +1 -1
  127. package/dist/lib/injection/ServiceContainer.js +55 -0
  128. package/dist/lib/injection/ServiceMap.d.ts +8 -1
  129. package/dist/lib/injection/modules/KnowledgeModule.js +15 -1
  130. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +4 -0
  131. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +16 -1
  132. package/dist/lib/service/bootstrap/BootstrapEventEmitter.d.ts +3 -2
  133. package/dist/lib/service/bootstrap/BootstrapEventEmitter.js +1 -1
  134. package/dist/lib/service/bootstrap/DeliveryVerifier.d.ts +51 -0
  135. package/dist/lib/service/bootstrap/DeliveryVerifier.js +163 -0
  136. package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +5 -0
  137. package/dist/lib/service/bootstrap/UiStartupTasks.js +20 -0
  138. package/dist/lib/service/bootstrap/bootstrap-event-types.d.ts +54 -0
  139. package/dist/lib/service/bootstrap/bootstrap-event-types.js +10 -0
  140. package/dist/lib/service/cleanup/CleanupService.d.ts +85 -0
  141. package/dist/lib/service/cleanup/CleanupService.js +324 -0
  142. package/dist/lib/service/delivery/AgentInstructionsGenerator.js +39 -43
  143. package/dist/lib/service/delivery/FileProtection.d.ts +20 -0
  144. package/dist/lib/service/delivery/FileProtection.js +54 -0
  145. package/dist/lib/service/delivery/SkillsSyncer.js +16 -21
  146. package/dist/lib/service/evolution/ContentPatcher.d.ts +44 -0
  147. package/dist/lib/service/evolution/ContentPatcher.js +310 -0
  148. package/dist/lib/service/evolution/ProposalExecutor.d.ts +4 -0
  149. package/dist/lib/service/evolution/ProposalExecutor.js +77 -13
  150. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.d.ts +64 -0
  151. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.js +458 -0
  152. package/dist/lib/service/evolution/RecipeRelevanceAuditor.d.ts +89 -0
  153. package/dist/lib/service/evolution/RecipeRelevanceAuditor.js +492 -0
  154. package/dist/lib/service/evolution/createSupersedeProposal.d.ts +44 -0
  155. package/dist/lib/service/evolution/createSupersedeProposal.js +81 -0
  156. package/dist/lib/service/guard/ComplianceReporter.d.ts +4 -0
  157. package/dist/lib/service/guard/ComplianceReporter.js +51 -0
  158. package/dist/lib/service/guard/GuardCheckEngine.js +5 -4
  159. package/dist/lib/service/knowledge/ConfidenceRouter.js +1 -1
  160. package/dist/lib/service/knowledge/KnowledgeService.d.ts +11 -1
  161. package/dist/lib/service/knowledge/KnowledgeService.js +44 -4
  162. package/dist/lib/service/knowledge/RecipeProductionGateway.d.ts +225 -0
  163. package/dist/lib/service/knowledge/RecipeProductionGateway.js +384 -0
  164. package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +3 -2
  165. package/dist/lib/service/panorama/DimensionAnalyzer.js +15 -140
  166. package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
  167. package/dist/lib/service/search/SearchEngine.d.ts +11 -10
  168. package/dist/lib/service/search/SearchEngine.js +38 -36
  169. package/dist/lib/service/search/SearchTypes.d.ts +14 -8
  170. package/dist/lib/service/search/SearchTypes.js +1 -1
  171. package/dist/lib/service/search/tokenizer.d.ts +1 -1
  172. package/dist/lib/service/search/tokenizer.js +2 -2
  173. package/dist/lib/shared/schemas/common.d.ts +4 -4
  174. package/dist/lib/shared/schemas/http-requests.d.ts +12 -1
  175. package/dist/lib/shared/schemas/http-requests.js +8 -0
  176. package/dist/lib/shared/schemas/mcp-tools.d.ts +32 -2
  177. package/dist/lib/shared/schemas/mcp-tools.js +38 -0
  178. package/dist/lib/types/evolution.d.ts +135 -0
  179. package/dist/lib/types/evolution.js +6 -0
  180. package/dist/lib/types/graph-shared.d.ts +25 -0
  181. package/dist/lib/types/graph-shared.js +7 -0
  182. package/dist/lib/types/knowledge-wire.d.ts +131 -0
  183. package/dist/lib/types/knowledge-wire.js +7 -0
  184. package/dist/lib/types/project-snapshot-builder.d.ts +19 -0
  185. package/dist/lib/types/project-snapshot-builder.js +189 -0
  186. package/dist/lib/types/project-snapshot.d.ts +399 -0
  187. package/dist/lib/types/project-snapshot.js +17 -0
  188. package/dist/lib/types/search-wire.d.ts +46 -0
  189. package/dist/lib/types/search-wire.js +7 -0
  190. package/dist/lib/types/snapshot-views.d.ts +58 -0
  191. package/dist/lib/types/snapshot-views.js +103 -0
  192. package/package.json +1 -1
  193. package/skills/autosnippet-recipes/SKILL.md +1 -1
  194. package/templates/instructions/agent-static.md +2 -0
  195. package/templates/instructions/conventions.md +3 -1
  196. package/templates/recipes-setup/README.md +2 -2
  197. package/dashboard/dist/assets/icons-BJ2mUBi8.js +0 -1
  198. package/dashboard/dist/assets/index-B659K9t5.js +0 -128
  199. package/dashboard/dist/assets/index-NCm40PMD.css +0 -1
  200. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.d.ts +0 -169
  201. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.js +0 -727
  202. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.d.ts +0 -370
  203. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.js +0 -821
@@ -678,13 +678,14 @@ export class GuardCheckEngine {
678
678
  }
679
679
  // 如果有 scope,按层级过滤:project ⊇ target ⊇ file
680
680
  // project 范围包含所有维度的规则;target 包含 file+target;file 仅匹配 file
681
+ // 'universal' 维度在所有 scope 下都生效
681
682
  if (scope) {
682
683
  const SCOPE_HIERARCHY = {
683
- project: ['file', 'target', 'project'],
684
- target: ['file', 'target'],
685
- file: ['file'],
684
+ project: ['file', 'target', 'project', 'universal'],
685
+ target: ['file', 'target', 'universal'],
686
+ file: ['file', 'universal'],
686
687
  };
687
- const allowedDimensions = SCOPE_HIERARCHY[scope] || [scope];
688
+ const allowedDimensions = SCOPE_HIERARCHY[scope] || [scope, 'universal'];
688
689
  rules = rules.filter((r) => !r.dimension || allowedDimensions.includes(r.dimension));
689
690
  }
690
691
  const lines = (code || '').split(/\r?\n/);
@@ -20,7 +20,7 @@ const DEFAULT_CONFIG = {
20
20
  /** 自动通过要求 reasoning.isValid() */
21
21
  requireReasoning: true,
22
22
  /** 来源白名单(这些来源可以适用更宽松的阈值) */
23
- trustedSources: ['bootstrap', 'cursor-scan'],
23
+ trustedSources: ['bootstrap', 'cursor-scan', 'mcp'],
24
24
  /** 可信来源的自动通过阈值 */
25
25
  trustedAutoApproveThreshold: 0.7,
26
26
  /** 极高置信度阈值 (≥0.90 → 24h Grace) */
@@ -105,8 +105,16 @@ export declare class KnowledgeService {
105
105
  _triggerCursorDeliveryAsync(): void;
106
106
  /** 弃用 (pending|active → deprecated) */
107
107
  deprecate(id: string, reason: string, context: ServiceContext): Promise<KnowledgeEntry>;
108
- /** 重新激活 (deprecated → pending) */
108
+ /** 重新激活 (deprecated|staging → pending) */
109
109
  reactivate(id: string, context: ServiceContext): Promise<KnowledgeEntry>;
110
+ /** 进入暂存期 (pending → staging) */
111
+ stage(id: string, context: ServiceContext): Promise<KnowledgeEntry>;
112
+ /** 进入进化态 (active → evolving) */
113
+ evolve(id: string, context: ServiceContext): Promise<KnowledgeEntry>;
114
+ /** 进入衰退观察 (active|evolving → decaying) */
115
+ decay(id: string, context: ServiceContext): Promise<KnowledgeEntry>;
116
+ /** 恢复为已发布 (decaying|evolving → active) */
117
+ restore(id: string, context: ServiceContext): Promise<KnowledgeEntry>;
110
118
  /** @deprecated 简化后所有条目直接进 pending */
111
119
  submit(id: string, _context: ServiceContext): Promise<KnowledgeEntry>;
112
120
  /** @deprecated 简化后 approve = publish */
@@ -171,6 +179,8 @@ export declare class KnowledgeService {
171
179
  _syncRelationsToGraph(id: string, relations: unknown): void;
172
180
  /** 删除所有关联边 */
173
181
  _removeAllEdges(id: string): void;
182
+ /** 删除关联的 evolution_proposals(target_recipe_id 无 CASCADE) */
183
+ _removeRelatedProposals(id: string): void;
174
184
  /** 落盘到 .md 文件 + 回写 sourceFile */
175
185
  _persistToFile(entry: KnowledgeEntry): void;
176
186
  /** 删除 .md 文件 */
@@ -49,6 +49,13 @@ export class KnowledgeService {
49
49
  async create(data, context) {
50
50
  try {
51
51
  this._validateCreateInput(data);
52
+ // ── 标题去重:防止跨维度/跨调用创建同名条目 ──
53
+ if (data.title) {
54
+ const existing = await this.repository.findByTitle(data.title);
55
+ if (existing) {
56
+ throw new ConflictError(`Knowledge entry with title "${data.title}" already exists (id: ${existing.id})`, { existingId: existing.id, title: data.title });
57
+ }
58
+ }
52
59
  const entry = KnowledgeEntry.fromJSON({
53
60
  ...data,
54
61
  lifecycle: Lifecycle.PENDING,
@@ -280,6 +287,8 @@ export class KnowledgeService {
280
287
  this._removeFile(entry);
281
288
  // 清除 knowledge_edges
282
289
  this._removeAllEdges(id);
290
+ // 清除 evolution_proposals(无 ON DELETE CASCADE,需手动删除)
291
+ this._removeRelatedProposals(id);
283
292
  await this.repository.delete(id);
284
293
  await this._audit('delete_knowledge', id, context.userId, {
285
294
  title: entry.title,
@@ -340,10 +349,26 @@ export class KnowledgeService {
340
349
  entityArgs: [reason],
341
350
  });
342
351
  }
343
- /** 重新激活 (deprecated → pending) */
352
+ /** 重新激活 (deprecated|staging → pending) */
344
353
  async reactivate(id, context) {
345
354
  return this._lifecycleTransition(id, 'reactivate', context);
346
355
  }
356
+ /** 进入暂存期 (pending → staging) */
357
+ async stage(id, context) {
358
+ return this._lifecycleTransition(id, 'stage', context);
359
+ }
360
+ /** 进入进化态 (active → evolving) */
361
+ async evolve(id, context) {
362
+ return this._lifecycleTransition(id, 'evolve', context);
363
+ }
364
+ /** 进入衰退观察 (active|evolving → decaying) */
365
+ async decay(id, context) {
366
+ return this._lifecycleTransition(id, 'decay', context);
367
+ }
368
+ /** 恢复为已发布 (decaying|evolving → active) */
369
+ async restore(id, context) {
370
+ return this._lifecycleTransition(id, 'restore', context);
371
+ }
347
372
  // ── 向后兼容别名 ──
348
373
  /** @deprecated 简化后所有条目直接进 pending */
349
374
  async submit(id, _context) {
@@ -555,9 +580,8 @@ export class KnowledgeService {
555
580
  if (entry.reviewedAt) {
556
581
  dbUpdates.reviewedAt = entry.reviewedAt;
557
582
  }
558
- if (entry.rejectionReason !== null) {
559
- dbUpdates.rejectionReason = entry.rejectionReason;
560
- }
583
+ // 驳回原因(含清除:reactivate 后 rejectionReason = null 需写入 DB)
584
+ dbUpdates.rejectionReason = entry.rejectionReason;
561
585
  // 发布字段
562
586
  if (entry.publishedAt) {
563
587
  dbUpdates.publishedAt = entry.publishedAt;
@@ -781,6 +805,22 @@ export class KnowledgeService {
781
805
  });
782
806
  }
783
807
  }
808
+ /** 删除关联的 evolution_proposals(target_recipe_id 无 CASCADE) */
809
+ _removeRelatedProposals(id) {
810
+ const gs = this._knowledgeGraphService;
811
+ if (!gs) {
812
+ return;
813
+ }
814
+ try {
815
+ gs.db.prepare(`DELETE FROM evolution_proposals WHERE target_recipe_id = ?`).run(id);
816
+ }
817
+ catch (err) {
818
+ this.logger.warn('Failed to remove related proposals', {
819
+ id,
820
+ error: err instanceof Error ? err.message : String(err),
821
+ });
822
+ }
823
+ }
784
824
  /* ═══ 文件落盘 ═════════════════════════════════ */
785
825
  /** 落盘到 .md 文件 + 回写 sourceFile */
786
826
  _persistToFile(entry) {
@@ -0,0 +1,225 @@
1
+ /**
2
+ * RecipeProductionGateway — 统一 Recipe 生产入口
3
+ *
4
+ * 所有 Recipe 创建(Agent Tool / MCP / IDE Agent / Batch Import)
5
+ * 通过此 Gateway 的统一管道,保证前置校验一致:
6
+ *
7
+ * 1. Schema Validation (UnifiedValidator)
8
+ * 2. Similarity Check — 去重检测(可选跳过)
9
+ * 3. Consolidation Scan — 融合/重组建议(可选)
10
+ * 4. KnowledgeService.create() — 包含 ConfidenceRouter → staging / pending
11
+ * 5. Quality Scoring — 质量评分
12
+ * 6. Supersede Proposal — 创建替代提案
13
+ * 7. Audit — 统一审计
14
+ *
15
+ * @see docs/copilot/recipe-lifecycle-management.md §6
16
+ */
17
+ /** Lightweight log interface — avoids importing static-only Logger class. */
18
+ interface GatewayLogger {
19
+ info(msg: string): void;
20
+ warn(msg: string): void;
21
+ }
22
+ export type GatewaySource = 'agent-tool' | 'mcp-external' | 'ide-agent' | 'batch-import';
23
+ export interface CreateRecipeItem {
24
+ title?: string;
25
+ description?: string;
26
+ content?: {
27
+ markdown?: string;
28
+ pattern?: string;
29
+ rationale?: string;
30
+ [key: string]: unknown;
31
+ };
32
+ trigger?: string;
33
+ kind?: string;
34
+ topicHint?: string;
35
+ whenClause?: string;
36
+ doClause?: string;
37
+ dontClause?: string;
38
+ coreCode?: string;
39
+ sourceRefs?: string[];
40
+ tags?: string[];
41
+ reasoning?: {
42
+ whyStandard?: string;
43
+ sources?: string[];
44
+ confidence?: number;
45
+ };
46
+ headers?: string[];
47
+ usageGuide?: string;
48
+ scope?: string;
49
+ complexity?: string;
50
+ sourceFile?: string;
51
+ knowledgeType?: string;
52
+ language?: string;
53
+ category?: string;
54
+ source?: string;
55
+ [key: string]: unknown;
56
+ }
57
+ export interface CreateRecipeRequest {
58
+ source: GatewaySource;
59
+ items: CreateRecipeItem[];
60
+ options?: {
61
+ /** 跳过相似度检测(仅 batch-import 可用) */
62
+ skipSimilarityCheck?: boolean;
63
+ /** 跳过 ConsolidationAdvisor 分析 */
64
+ skipConsolidation?: boolean;
65
+ /** 被替代的旧 Recipe ID */
66
+ supersedes?: string;
67
+ /** 相似度阈值,默认 0.7 */
68
+ similarityThreshold?: number;
69
+ /** 已提交标题集(批量去重用) */
70
+ existingTitles?: Set<string>;
71
+ /** 已提交指纹集(批量去重用) */
72
+ existingFingerprints?: Set<string>;
73
+ /** UnifiedValidator 跳过系统注入字段列表 */
74
+ systemInjectedFields?: string[];
75
+ /** 跳过唯一性校验 */
76
+ skipUniqueness?: boolean;
77
+ /** 操作用户 ID */
78
+ userId?: string;
79
+ };
80
+ }
81
+ export interface CreatedRecipeInfo {
82
+ id: string;
83
+ title: string;
84
+ lifecycle: string;
85
+ /** Raw saved entry from KnowledgeService.create() */
86
+ raw: Record<string, unknown>;
87
+ }
88
+ export interface RejectedRecipeInfo {
89
+ index: number;
90
+ title: string;
91
+ reason: string;
92
+ errors: string[];
93
+ warnings: string[];
94
+ }
95
+ export interface MergedRecipeInfo {
96
+ index: number;
97
+ proposalId: string;
98
+ type: string;
99
+ targetRecipeId: string;
100
+ targetTitle: string;
101
+ status: string;
102
+ expiresAt: number;
103
+ message: string;
104
+ }
105
+ export interface BlockedRecipeInfo {
106
+ index: number;
107
+ title: string;
108
+ consolidation: unknown;
109
+ }
110
+ export interface SimilarRecipeInfo {
111
+ index: number;
112
+ title: string;
113
+ similarTo: {
114
+ file: string;
115
+ title: string;
116
+ similarity: number;
117
+ }[];
118
+ }
119
+ export interface CreateRecipeResult {
120
+ created: CreatedRecipeInfo[];
121
+ rejected: RejectedRecipeInfo[];
122
+ merged: MergedRecipeInfo[];
123
+ blocked: BlockedRecipeInfo[];
124
+ duplicates: SimilarRecipeInfo[];
125
+ supersedeProposal: {
126
+ proposalId: string;
127
+ } | null;
128
+ }
129
+ interface GatewayKnowledgeService {
130
+ create(data: Record<string, unknown>, context: {
131
+ userId: string;
132
+ }): Promise<{
133
+ id: string;
134
+ title: string;
135
+ lifecycle: string;
136
+ kind?: string;
137
+ [key: string]: unknown;
138
+ }>;
139
+ updateQuality(id: string, context: {
140
+ userId: string;
141
+ }): Promise<unknown>;
142
+ }
143
+ interface GatewayConsolidationAdvisor {
144
+ analyzeBatch(candidates: Array<{
145
+ title: string;
146
+ category?: string;
147
+ [key: string]: unknown;
148
+ }>): {
149
+ items: Array<{
150
+ index: number;
151
+ advice: {
152
+ action: string;
153
+ confidence: number;
154
+ reason: string;
155
+ targetRecipe?: {
156
+ id: string;
157
+ title: string;
158
+ similarity: number;
159
+ };
160
+ reorganizeTargets?: {
161
+ id: string;
162
+ title: string;
163
+ similarity: number;
164
+ }[];
165
+ coveredBy?: {
166
+ id: string;
167
+ title: string;
168
+ similarity: number;
169
+ }[];
170
+ mergeDirection?: {
171
+ addedDimensions: string[];
172
+ summary: string;
173
+ };
174
+ };
175
+ }>;
176
+ };
177
+ }
178
+ interface GatewayProposalRepository {
179
+ create(data: Record<string, unknown>): {
180
+ id: string;
181
+ status: string;
182
+ expiresAt: number;
183
+ [key: string]: unknown;
184
+ } | null;
185
+ }
186
+ type GatewaySimilarityFn = (projectRoot: string, candidate: {
187
+ title: string;
188
+ summary: string;
189
+ code: string;
190
+ }, opts: {
191
+ threshold: number;
192
+ topK: number;
193
+ }) => {
194
+ file: string;
195
+ title: string;
196
+ similarity: number;
197
+ }[];
198
+ export interface GatewayDeps {
199
+ knowledgeService: GatewayKnowledgeService;
200
+ projectRoot: string;
201
+ logger?: GatewayLogger;
202
+ /** ConsolidationAdvisor(可选 — MCP 路径使用) */
203
+ consolidationAdvisor?: GatewayConsolidationAdvisor | null;
204
+ /** ProposalRepository(可选 — supersede 提案需要) */
205
+ proposalRepository?: GatewayProposalRepository | null;
206
+ /** 相似度检测函数(可选 — 默认导入 SimilarityService) */
207
+ findSimilarRecipes?: GatewaySimilarityFn | null;
208
+ }
209
+ export declare class RecipeProductionGateway {
210
+ #private;
211
+ constructor(deps: GatewayDeps);
212
+ /**
213
+ * 统一创建入口
214
+ *
215
+ * Pipeline:
216
+ * 1. Schema Validation (UnifiedValidator)
217
+ * 2. Similarity Check (除非 skipSimilarityCheck)
218
+ * 3. Consolidation Scan (除非 skipConsolidation)
219
+ * 4. KnowledgeService.create() — ConfidenceRouter → staging / pending
220
+ * 5. Quality Scoring
221
+ * 6. Supersede Proposal 创建 (if supersedes)
222
+ */
223
+ create(request: CreateRecipeRequest): Promise<CreateRecipeResult>;
224
+ }
225
+ export {};