autosnippet 3.3.5 → 3.3.7

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 (279) hide show
  1. package/dashboard/dist/assets/icons-FHns2ypa.js +1 -0
  2. package/dashboard/dist/assets/index-BRJv5Y3r.js +135 -0
  3. package/dashboard/dist/assets/index-DzoB7kxK.css +1 -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 +137 -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/AgentRuntime.d.ts +2 -2
  11. package/dist/lib/agent/AgentRuntime.js +26 -18
  12. package/dist/lib/agent/capabilities.d.ts +11 -0
  13. package/dist/lib/agent/capabilities.js +29 -5
  14. package/dist/lib/agent/context/ExplorationTracker.js +10 -1
  15. package/dist/lib/agent/context/exploration/ExplorationStrategies.d.ts +2 -0
  16. package/dist/lib/agent/context/exploration/ExplorationStrategies.js +2 -2
  17. package/dist/lib/agent/domain/ChatAgentTasks.js +4 -0
  18. package/dist/lib/agent/domain/insight-analyst.d.ts +47 -3
  19. package/dist/lib/agent/domain/insight-analyst.js +111 -11
  20. package/dist/lib/agent/domain/insight-evolver.d.ts +69 -0
  21. package/dist/lib/agent/domain/insight-evolver.js +230 -0
  22. package/dist/lib/agent/domain/insight-gate.d.ts +42 -0
  23. package/dist/lib/agent/domain/insight-gate.js +41 -0
  24. package/dist/lib/agent/domain/insight-producer.d.ts +27 -2
  25. package/dist/lib/agent/domain/insight-producer.js +60 -5
  26. package/dist/lib/agent/domain/scan-prompts.js +10 -7
  27. package/dist/lib/agent/forced-summary.js +7 -2
  28. package/dist/lib/agent/memory/ActiveContext.d.ts +2 -28
  29. package/dist/lib/agent/memory/MemoryCoordinator.d.ts +2 -2
  30. package/dist/lib/agent/memory/SessionStore.d.ts +6 -12
  31. package/dist/lib/agent/memory/SessionStore.js +9 -15
  32. package/dist/lib/agent/memory/memory-flush-contract.d.ts +49 -0
  33. package/dist/lib/agent/memory/memory-flush-contract.js +16 -0
  34. package/dist/lib/agent/memory/session-store-schema.d.ts +20 -0
  35. package/dist/lib/agent/memory/session-store-schema.js +41 -0
  36. package/dist/lib/agent/presets.d.ts +89 -1
  37. package/dist/lib/agent/presets.js +53 -5
  38. package/dist/lib/agent/tools/_shared.d.ts +7 -15
  39. package/dist/lib/agent/tools/_shared.js +20 -21
  40. package/dist/lib/agent/tools/composite.d.ts +25 -22
  41. package/dist/lib/agent/tools/composite.js +108 -109
  42. package/dist/lib/agent/tools/evolution-tools.d.ts +145 -0
  43. package/dist/lib/agent/tools/evolution-tools.js +161 -0
  44. package/dist/lib/agent/tools/index.d.ts +163 -92
  45. package/dist/lib/agent/tools/index.js +9 -1
  46. package/dist/lib/agent/tools/lifecycle.d.ts +7 -1
  47. package/dist/lib/agent/tools/lifecycle.js +59 -75
  48. package/dist/lib/cli/AiScanService.js +5 -5
  49. package/dist/lib/cli/KnowledgeSyncService.js +1 -1
  50. package/dist/lib/core/AstAnalyzer.d.ts +1 -0
  51. package/dist/lib/core/discovery/ConfigWatcher.d.ts +64 -0
  52. package/dist/lib/core/discovery/ConfigWatcher.js +336 -0
  53. package/dist/lib/core/discovery/CustomConfigDiscoverer.d.ts +30 -0
  54. package/dist/lib/core/discovery/CustomConfigDiscoverer.js +1305 -0
  55. package/dist/lib/core/discovery/DiscovererPreference.d.ts +44 -0
  56. package/dist/lib/core/discovery/DiscovererPreference.js +141 -0
  57. package/dist/lib/core/discovery/DiscovererRegistry.d.ts +10 -1
  58. package/dist/lib/core/discovery/DiscovererRegistry.js +42 -2
  59. package/dist/lib/core/discovery/ProjectDiscoverer.d.ts +19 -0
  60. package/dist/lib/core/discovery/index.d.ts +2 -0
  61. package/dist/lib/core/discovery/index.js +4 -0
  62. package/dist/lib/core/discovery/parsers/CMakeParser.d.ts +32 -0
  63. package/dist/lib/core/discovery/parsers/CMakeParser.js +148 -0
  64. package/dist/lib/core/discovery/parsers/GradleDslParser.d.ts +43 -0
  65. package/dist/lib/core/discovery/parsers/GradleDslParser.js +171 -0
  66. package/dist/lib/core/discovery/parsers/JsonConfigParser.d.ts +45 -0
  67. package/dist/lib/core/discovery/parsers/JsonConfigParser.js +122 -0
  68. package/dist/lib/core/discovery/parsers/RubyDslParser.d.ts +49 -0
  69. package/dist/lib/core/discovery/parsers/RubyDslParser.js +282 -0
  70. package/dist/lib/core/discovery/parsers/StarlarkParser.d.ts +33 -0
  71. package/dist/lib/core/discovery/parsers/StarlarkParser.js +229 -0
  72. package/dist/lib/core/discovery/parsers/YamlConfigParser.d.ts +37 -0
  73. package/dist/lib/core/discovery/parsers/YamlConfigParser.js +212 -0
  74. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.d.ts → domain/dimension/DimensionCopy.d.ts} +2 -2
  75. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.js → domain/dimension/DimensionCopy.js} +22 -72
  76. package/dist/lib/domain/dimension/DimensionRegistry.d.ts +54 -0
  77. package/dist/lib/domain/dimension/DimensionRegistry.js +620 -0
  78. package/dist/lib/domain/dimension/DimensionSop.d.ts +55 -0
  79. package/dist/lib/domain/dimension/DimensionSop.js +1604 -0
  80. package/dist/lib/domain/dimension/UnifiedDimension.d.ts +61 -0
  81. package/dist/lib/domain/dimension/UnifiedDimension.js +53 -0
  82. package/dist/lib/domain/dimension/index.d.ts +10 -0
  83. package/dist/lib/domain/dimension/index.js +9 -0
  84. package/dist/lib/domain/knowledge/FieldSpec.d.ts +1 -1
  85. package/dist/lib/domain/knowledge/FieldSpec.js +29 -16
  86. package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +40 -112
  87. package/dist/lib/domain/knowledge/KnowledgeEntry.js +44 -9
  88. package/dist/lib/domain/knowledge/KnowledgeRepository.d.ts +1 -0
  89. package/dist/lib/domain/knowledge/KnowledgeRepository.js +3 -0
  90. package/dist/lib/domain/knowledge/Lifecycle.js +1 -1
  91. package/dist/lib/domain/knowledge/StyleGuide.d.ts +1 -1
  92. package/dist/lib/domain/knowledge/StyleGuide.js +1 -1
  93. package/dist/lib/domain/knowledge/UnifiedValidator.js +15 -0
  94. package/dist/lib/external/ai/AiProvider.d.ts +12 -0
  95. package/dist/lib/external/ai/AiProvider.js +24 -0
  96. package/dist/lib/external/ai/AiProviderManager.d.ts +101 -0
  97. package/dist/lib/external/ai/AiProviderManager.js +193 -0
  98. package/dist/lib/external/ai/providers/ClaudeProvider.js +11 -0
  99. package/dist/lib/external/ai/providers/GoogleGeminiProvider.js +18 -0
  100. package/dist/lib/external/ai/providers/MockProvider.d.ts +21 -3
  101. package/dist/lib/external/ai/providers/MockProvider.js +290 -14
  102. package/dist/lib/external/ai/providers/OpenAiProvider.js +16 -0
  103. package/dist/lib/external/lark/LarkTransport.d.ts +5 -1
  104. package/dist/lib/external/lark/LarkTransport.js +10 -2
  105. package/dist/lib/external/mcp/McpServer.js +4 -0
  106. package/dist/lib/external/mcp/handlers/TargetClassifier.d.ts +1 -1
  107. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.d.ts +8 -16
  108. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.js +10 -10
  109. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.d.ts +7 -0
  110. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.js +20 -0
  111. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +52 -132
  112. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +204 -17
  113. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.d.ts +11 -75
  114. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.js +40 -191
  115. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.d.ts +13 -78
  116. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.js +30 -52
  117. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.d.ts +0 -1
  118. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/mock-pipeline.d.ts +20 -0
  119. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/mock-pipeline.js +432 -0
  120. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.d.ts +99 -12
  121. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +188 -169
  122. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +7 -17
  123. package/dist/lib/external/mcp/handlers/bootstrap/refine.js +8 -0
  124. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.d.ts +46 -0
  125. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.js +58 -0
  126. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.d.ts +25 -0
  127. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.js +47 -0
  128. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +50 -12
  129. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +30 -10
  130. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-text.js +1 -1
  131. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.d.ts +24 -0
  132. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.js +14 -0
  133. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.d.ts +14 -0
  134. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.js +48 -0
  135. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.d.ts +21 -0
  136. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.js +45 -0
  137. package/dist/lib/external/mcp/handlers/bootstrap/shared/skill-generator.d.ts +1 -1
  138. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.d.ts +27 -0
  139. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.js +44 -0
  140. package/dist/lib/external/mcp/handlers/bootstrap-external.d.ts +23 -10
  141. package/dist/lib/external/mcp/handlers/bootstrap-external.js +41 -51
  142. package/dist/lib/external/mcp/handlers/bootstrap-internal.d.ts +2 -0
  143. package/dist/lib/external/mcp/handlers/bootstrap-internal.js +117 -82
  144. package/dist/lib/external/mcp/handlers/consolidated.d.ts +4 -4
  145. package/dist/lib/external/mcp/handlers/consolidated.js +108 -332
  146. package/dist/lib/external/mcp/handlers/dimension-complete-external.js +71 -2
  147. package/dist/lib/external/mcp/handlers/evolve-external.d.ts +54 -0
  148. package/dist/lib/external/mcp/handlers/evolve-external.js +229 -0
  149. package/dist/lib/external/mcp/handlers/knowledge.js +30 -5
  150. package/dist/lib/external/mcp/handlers/rescan-external.d.ts +76 -0
  151. package/dist/lib/external/mcp/handlers/rescan-external.js +335 -0
  152. package/dist/lib/external/mcp/handlers/rescan-internal.d.ts +120 -0
  153. package/dist/lib/external/mcp/handlers/rescan-internal.js +359 -0
  154. package/dist/lib/external/mcp/handlers/search.d.ts +6 -5
  155. package/dist/lib/external/mcp/handlers/search.js +6 -5
  156. package/dist/lib/external/mcp/handlers/types.d.ts +2 -1
  157. package/dist/lib/external/mcp/handlers/wiki-external.js +2 -2
  158. package/dist/lib/external/mcp/tools.d.ts +8 -18
  159. package/dist/lib/external/mcp/tools.js +58 -2
  160. package/dist/lib/http/routes/ai.js +111 -30
  161. package/dist/lib/http/routes/candidates.js +11 -4
  162. package/dist/lib/http/routes/commands.js +10 -1
  163. package/dist/lib/http/routes/health.js +11 -0
  164. package/dist/lib/http/routes/knowledge.js +122 -1
  165. package/dist/lib/http/routes/modules.js +52 -3
  166. package/dist/lib/http/routes/panorama.js +16 -4
  167. package/dist/lib/http/routes/recipes.js +7 -0
  168. package/dist/lib/http/utils/routeHelpers.js +2 -1
  169. package/dist/lib/infrastructure/cache/CacheCoordinator.d.ts +41 -0
  170. package/dist/lib/infrastructure/cache/CacheCoordinator.js +105 -0
  171. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.d.ts +7 -0
  172. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.js +28 -0
  173. package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +1 -1
  174. package/dist/lib/injection/ServiceContainer.d.ts +6 -5
  175. package/dist/lib/injection/ServiceContainer.js +64 -25
  176. package/dist/lib/injection/ServiceMap.d.ts +10 -1
  177. package/dist/lib/injection/modules/AiModule.d.ts +6 -9
  178. package/dist/lib/injection/modules/AiModule.js +82 -39
  179. package/dist/lib/injection/modules/KnowledgeModule.js +15 -1
  180. package/dist/lib/injection/modules/PanoramaModule.js +1 -1
  181. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +4 -0
  182. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +16 -1
  183. package/dist/lib/service/bootstrap/BootstrapEventEmitter.d.ts +3 -2
  184. package/dist/lib/service/bootstrap/BootstrapEventEmitter.js +1 -1
  185. package/dist/lib/service/bootstrap/DeliveryVerifier.d.ts +51 -0
  186. package/dist/lib/service/bootstrap/DeliveryVerifier.js +163 -0
  187. package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +5 -0
  188. package/dist/lib/service/bootstrap/UiStartupTasks.js +20 -0
  189. package/dist/lib/service/bootstrap/bootstrap-event-types.d.ts +54 -0
  190. package/dist/lib/service/bootstrap/bootstrap-event-types.js +10 -0
  191. package/dist/lib/service/cleanup/CleanupService.d.ts +132 -0
  192. package/dist/lib/service/cleanup/CleanupService.js +571 -0
  193. package/dist/lib/service/delivery/AgentInstructionsGenerator.js +39 -43
  194. package/dist/lib/service/delivery/FileProtection.d.ts +20 -0
  195. package/dist/lib/service/delivery/FileProtection.js +54 -0
  196. package/dist/lib/service/delivery/SkillsSyncer.js +16 -21
  197. package/dist/lib/service/evolution/ContentPatcher.d.ts +44 -0
  198. package/dist/lib/service/evolution/ContentPatcher.js +310 -0
  199. package/dist/lib/service/evolution/ProposalExecutor.d.ts +4 -0
  200. package/dist/lib/service/evolution/ProposalExecutor.js +77 -13
  201. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.d.ts +64 -0
  202. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.js +458 -0
  203. package/dist/lib/service/evolution/RecipeRelevanceAuditor.d.ts +89 -0
  204. package/dist/lib/service/evolution/RecipeRelevanceAuditor.js +492 -0
  205. package/dist/lib/service/evolution/createSupersedeProposal.d.ts +44 -0
  206. package/dist/lib/service/evolution/createSupersedeProposal.js +81 -0
  207. package/dist/lib/service/guard/ComplianceReporter.d.ts +4 -0
  208. package/dist/lib/service/guard/ComplianceReporter.js +51 -0
  209. package/dist/lib/service/guard/GuardCheckEngine.js +5 -4
  210. package/dist/lib/service/knowledge/CodeEntityGraph.d.ts +6 -0
  211. package/dist/lib/service/knowledge/CodeEntityGraph.js +16 -0
  212. package/dist/lib/service/knowledge/ConfidenceRouter.js +1 -1
  213. package/dist/lib/service/knowledge/KnowledgeService.d.ts +11 -1
  214. package/dist/lib/service/knowledge/KnowledgeService.js +67 -14
  215. package/dist/lib/service/knowledge/RecipeProductionGateway.d.ts +225 -0
  216. package/dist/lib/service/knowledge/RecipeProductionGateway.js +384 -0
  217. package/dist/lib/service/module/ModuleService.js +10 -19
  218. package/dist/lib/service/panorama/CouplingAnalyzer.d.ts +10 -1
  219. package/dist/lib/service/panorama/CouplingAnalyzer.js +44 -2
  220. package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +4 -3
  221. package/dist/lib/service/panorama/DimensionAnalyzer.js +40 -151
  222. package/dist/lib/service/panorama/LayerInferrer.d.ts +16 -1
  223. package/dist/lib/service/panorama/LayerInferrer.js +118 -1
  224. package/dist/lib/service/panorama/ModuleDiscoverer.d.ts +9 -0
  225. package/dist/lib/service/panorama/ModuleDiscoverer.js +58 -2
  226. package/dist/lib/service/panorama/PanoramaAggregator.d.ts +6 -2
  227. package/dist/lib/service/panorama/PanoramaAggregator.js +84 -6
  228. package/dist/lib/service/panorama/PanoramaScanner.js +28 -0
  229. package/dist/lib/service/panorama/PanoramaService.js +10 -5
  230. package/dist/lib/service/panorama/PanoramaTypes.d.ts +38 -0
  231. package/dist/lib/service/panorama/RoleRefiner.d.ts +2 -0
  232. package/dist/lib/service/panorama/RoleRefiner.js +41 -0
  233. package/dist/lib/service/panorama/TechStackProfiler.d.ts +13 -0
  234. package/dist/lib/service/panorama/TechStackProfiler.js +191 -0
  235. package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
  236. package/dist/lib/service/search/SearchEngine.d.ts +11 -10
  237. package/dist/lib/service/search/SearchEngine.js +38 -36
  238. package/dist/lib/service/search/SearchTypes.d.ts +14 -8
  239. package/dist/lib/service/search/SearchTypes.js +1 -1
  240. package/dist/lib/service/search/tokenizer.d.ts +1 -1
  241. package/dist/lib/service/search/tokenizer.js +2 -2
  242. package/dist/lib/service/skills/SignalCollector.d.ts +1 -0
  243. package/dist/lib/service/skills/SignalCollector.js +6 -5
  244. package/dist/lib/service/vector/ContextualEnricher.d.ts +1 -0
  245. package/dist/lib/service/vector/ContextualEnricher.js +4 -0
  246. package/dist/lib/shared/LanguageService.js +3 -0
  247. package/dist/lib/shared/developer-identity.d.ts +18 -0
  248. package/dist/lib/shared/developer-identity.js +62 -0
  249. package/dist/lib/shared/schemas/common.d.ts +4 -4
  250. package/dist/lib/shared/schemas/http-requests.d.ts +20 -18
  251. package/dist/lib/shared/schemas/http-requests.js +17 -6
  252. package/dist/lib/shared/schemas/mcp-tools.d.ts +32 -2
  253. package/dist/lib/shared/schemas/mcp-tools.js +38 -0
  254. package/dist/lib/types/evolution.d.ts +135 -0
  255. package/dist/lib/types/evolution.js +6 -0
  256. package/dist/lib/types/graph-shared.d.ts +25 -0
  257. package/dist/lib/types/graph-shared.js +7 -0
  258. package/dist/lib/types/knowledge-wire.d.ts +132 -0
  259. package/dist/lib/types/knowledge-wire.js +7 -0
  260. package/dist/lib/types/project-snapshot-builder.d.ts +19 -0
  261. package/dist/lib/types/project-snapshot-builder.js +189 -0
  262. package/dist/lib/types/project-snapshot.d.ts +399 -0
  263. package/dist/lib/types/project-snapshot.js +17 -0
  264. package/dist/lib/types/search-wire.d.ts +46 -0
  265. package/dist/lib/types/search-wire.js +7 -0
  266. package/dist/lib/types/snapshot-views.d.ts +58 -0
  267. package/dist/lib/types/snapshot-views.js +103 -0
  268. package/package.json +1 -1
  269. package/skills/autosnippet-recipes/SKILL.md +1 -1
  270. package/templates/instructions/agent-static.md +2 -0
  271. package/templates/instructions/conventions.md +3 -1
  272. package/templates/recipes-setup/README.md +2 -2
  273. package/dashboard/dist/assets/icons-BJ2mUBi8.js +0 -1
  274. package/dashboard/dist/assets/index-B659K9t5.js +0 -128
  275. package/dashboard/dist/assets/index-NCm40PMD.css +0 -1
  276. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.d.ts +0 -169
  277. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.js +0 -727
  278. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.d.ts +0 -370
  279. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.js +0 -821
@@ -0,0 +1,432 @@
1
+ /**
2
+ * mock-pipeline.ts — Mock AI Bootstrap 轻量管线
3
+ *
4
+ * 当 AI Provider 为 mock 时,利用 Phase 1-4 已收集的真实数据
5
+ * (AST、依赖图、文件列表、Panorama) 为每个维度生成模板化候选知识。
6
+ *
7
+ * 不调用 AI,但走完完整的 submit → dimension_complete 流程,
8
+ * 使 Dashboard 能正常展示知识库、健康雷达等 UI。
9
+ *
10
+ * @module pipeline/mock-pipeline
11
+ */
12
+ import path from 'node:path';
13
+ import Logger from '#infra/logging/Logger.js';
14
+ import { BootstrapEventEmitter } from '#service/bootstrap/BootstrapEventEmitter.js';
15
+ const logger = Logger.getInstance();
16
+ // ── 模板生成器 ────────────────────────────────────────────
17
+ /** 从 AST 指标提取代码统计 */
18
+ function extractAstStats(ast) {
19
+ if (!ast) {
20
+ return { classes: 0, protocols: 0, functions: 0 };
21
+ }
22
+ const pm = (ast.projectMetrics ?? ast);
23
+ return {
24
+ classes: pm.totalClasses ?? 0,
25
+ protocols: pm.totalProtocols ?? 0,
26
+ functions: pm.totalFunctions ?? 0,
27
+ };
28
+ }
29
+ /** 从文件列表中按 target 分组并提取代表性文件 */
30
+ function getRepresentativeFiles(files, targetFileMap) {
31
+ const result = new Map();
32
+ if (targetFileMap) {
33
+ for (const [target, paths] of Object.entries(targetFileMap)) {
34
+ result.set(target, paths.slice(0, 5));
35
+ }
36
+ }
37
+ else if (files) {
38
+ const grouped = new Map();
39
+ for (const f of files) {
40
+ const target = f.targetName || 'default';
41
+ const list = grouped.get(target) || [];
42
+ list.push(f.relativePath || f.name);
43
+ grouped.set(target, list);
44
+ }
45
+ for (const [target, paths] of grouped) {
46
+ result.set(target, paths.slice(0, 5));
47
+ }
48
+ }
49
+ return result;
50
+ }
51
+ /** 从文件内容中提取 import 语句(作为 headers)*/
52
+ function extractImports(content, lang) {
53
+ const imports = [];
54
+ const lines = content.split('\n').slice(0, 30);
55
+ for (const line of lines) {
56
+ const trimmed = line.trim();
57
+ if (lang === 'swift' && trimmed.startsWith('import ')) {
58
+ imports.push(trimmed);
59
+ }
60
+ else if ((lang === 'typescript' || lang === 'javascript') && trimmed.startsWith('import ')) {
61
+ imports.push(trimmed);
62
+ }
63
+ }
64
+ return [...new Set(imports)].slice(0, 5);
65
+ }
66
+ /** 从文件内容中提取类/结构体/协议名 */
67
+ function extractTypes(content) {
68
+ const types = [];
69
+ for (const m of content.matchAll(/(?:class|struct|protocol|enum|interface|type)\s+(\w+)/g)) {
70
+ types.push(m[1]);
71
+ }
72
+ return [...new Set(types)].slice(0, 10);
73
+ }
74
+ /** 生成 kebab-case trigger */
75
+ function toKebab(text) {
76
+ return text
77
+ .replace(/([a-z])([A-Z])/g, '$1-$2')
78
+ .replace(/[\s_]+/g, '-')
79
+ .toLowerCase()
80
+ .replace(/[^a-z0-9-]/g, '')
81
+ .slice(0, 40);
82
+ }
83
+ // ── 维度级候选生成 ────────────────────────────────────────
84
+ /** 为单个维度生成 Mock 候选 */
85
+ function generateDimensionCandidates(dimId, dimLabel, files, lang, projectName, astStats, targetFiles) {
86
+ const candidates = [];
87
+ // 从文件中收集有代表性的类型和源文件
88
+ const allTypes = [];
89
+ const allSources = [];
90
+ const allImports = [];
91
+ const dimFiles = files?.filter((f) => {
92
+ const p = f.relativePath?.toLowerCase() || f.name.toLowerCase();
93
+ // 根据维度 ID 做简单相关性匹配
94
+ switch (dimId) {
95
+ case 'architecture':
96
+ return (p.includes('coordinator') ||
97
+ p.includes('delegate') ||
98
+ p.includes('service') ||
99
+ p.includes('manager'));
100
+ case 'code-pattern':
101
+ return p.includes('extension') || p.includes('helper') || p.includes('util');
102
+ case 'naming-style':
103
+ return true; // 全局适用
104
+ case 'error-handling':
105
+ return p.includes('error') || p.includes('result') || p.includes('handler');
106
+ case 'networking':
107
+ return (p.includes('network') ||
108
+ p.includes('api') ||
109
+ p.includes('request') ||
110
+ p.includes('http'));
111
+ case 'data-model':
112
+ return p.includes('model') || p.includes('entity') || p.includes('dto');
113
+ case 'testing-quality':
114
+ return p.includes('test') || p.includes('spec') || p.includes('mock');
115
+ case 'ui-patterns':
116
+ return (p.includes('view') ||
117
+ p.includes('controller') ||
118
+ p.includes('cell') ||
119
+ p.includes('component'));
120
+ case 'concurrency':
121
+ return (p.includes('actor') ||
122
+ p.includes('async') ||
123
+ p.includes('queue') ||
124
+ p.includes('dispatch'));
125
+ case 'storage':
126
+ return (p.includes('store') ||
127
+ p.includes('cache') ||
128
+ p.includes('database') ||
129
+ p.includes('persist'));
130
+ default:
131
+ return true;
132
+ }
133
+ }) || [];
134
+ // 提取文件中的类型和导入
135
+ for (const f of dimFiles.slice(0, 10)) {
136
+ allTypes.push(...extractTypes(f.content || ''));
137
+ allSources.push(f.relativePath || f.name);
138
+ allImports.push(...extractImports(f.content || '', lang));
139
+ }
140
+ // 如果没找到相关文件,用全部文件兜底
141
+ if (allTypes.length === 0 && files) {
142
+ for (const f of files.slice(0, 5)) {
143
+ allTypes.push(...extractTypes(f.content || ''));
144
+ allSources.push(f.relativePath || f.name);
145
+ }
146
+ }
147
+ const uniqueTypes = [...new Set(allTypes)].slice(0, 8);
148
+ const uniqueSources = [...new Set(allSources)].slice(0, 5);
149
+ const uniqueImports = [...new Set(allImports)].slice(0, 5);
150
+ // 为每个维度生成 3 个候选
151
+ const templates = getDimensionTemplates(dimId, dimLabel, uniqueTypes, uniqueSources, lang, projectName, astStats);
152
+ for (const tpl of templates.slice(0, 3)) {
153
+ candidates.push({
154
+ ...tpl,
155
+ headers: uniqueImports,
156
+ sourceRefs: uniqueSources.slice(0, 3),
157
+ reasoning: {
158
+ whyStandard: `基于 ${projectName} 项目 ${dimFiles.length} 个相关文件的代码分析(Mock 模式自动生成)`,
159
+ sources: uniqueSources.slice(0, 3),
160
+ confidence: 0.7,
161
+ },
162
+ tags: ['mock-generated', dimId, lang],
163
+ });
164
+ }
165
+ return candidates;
166
+ }
167
+ /** 根据维度 ID 返回候选模板 */
168
+ function getDimensionTemplates(dimId, dimLabel, types, sources, lang, projectName, ast) {
169
+ const typeList = types.length > 0 ? types.slice(0, 3).join('、') : '核心模块';
170
+ const typeFirst = types[0] || 'AppModule';
171
+ const srcFirst = sources[0] || 'Sources/Main.swift';
172
+ const base = {
173
+ language: lang,
174
+ knowledgeType: dimId,
175
+ };
176
+ switch (dimId) {
177
+ case 'architecture':
178
+ return [
179
+ {
180
+ ...base,
181
+ title: `${projectName} 分层架构模式`,
182
+ description: `项目采用分层架构,包含 ${ast.classes} 个类、${ast.protocols} 个协议`,
183
+ trigger: `@${toKebab(projectName)}-layered-arch`,
184
+ kind: 'pattern',
185
+ category: 'Architecture',
186
+ topicHint: 'architecture',
187
+ content: {
188
+ markdown: `### ${projectName} 分层架构\n\n项目基于分层架构设计,核心类型包括 ${typeList}。\n\n**层次结构**:\n- 表现层: View/Controller\n- 业务层: Service/Manager\n- 数据层: Repository/Store\n\n**来源**: \`${srcFirst}\`\n\n> ⚠️ 此条目由 Mock AI 基于代码结构自动生成`,
189
+ rationale: `分层架构是 ${projectName} 的核心设计决策,确保模块间关注点分离`,
190
+ },
191
+ coreCode: `// ${lang === 'swift' ? 'protocol' : 'interface'} ${typeFirst}Service { ... }`,
192
+ doClause: `Follow the layered architecture with ${typeFirst} as the core service boundary`,
193
+ dontClause: 'Do not bypass service layer to access data layer directly',
194
+ whenClause: 'When adding new features or modules to the project',
195
+ usageGuide: `### 使用指南\n\n遵循 ${projectName} 的分层架构进行模块设计。`,
196
+ },
197
+ {
198
+ ...base,
199
+ title: `${typeFirst} 依赖注入约定`,
200
+ description: `${typeFirst} 等核心类型通过依赖注入管理生命周期`,
201
+ trigger: `@${toKebab(typeFirst)}-di-pattern`,
202
+ kind: 'pattern',
203
+ category: 'Architecture',
204
+ topicHint: 'architecture',
205
+ content: {
206
+ markdown: `### 依赖注入约定\n\n${projectName} 使用依赖注入管理 ${typeList} 等组件的生命周期。\n\n**来源**: \`${srcFirst}\`\n\n> ⚠️ Mock AI 自动生成`,
207
+ rationale: '依赖注入提高可测试性和模块解耦',
208
+ },
209
+ coreCode: `${lang === 'swift' ? `class ${typeFirst} {\n init(service: Service) { }\n}` : `class ${typeFirst} {\n constructor(private service: Service) {}\n}`}`,
210
+ doClause: `Use constructor injection for ${typeFirst} dependencies`,
211
+ dontClause: 'Do not use service locator or global singletons',
212
+ whenClause: `When creating or modifying ${typeFirst} and its dependencies`,
213
+ usageGuide: `### 使用指南\n\n通过构造器注入依赖项。`,
214
+ },
215
+ {
216
+ ...base,
217
+ title: `${projectName} 模块通信约定`,
218
+ description: `模块间通过协议/接口进行通信,避免直接耦合`,
219
+ trigger: `@${toKebab(projectName)}-module-comm`,
220
+ kind: 'rule',
221
+ category: 'Architecture',
222
+ topicHint: 'architecture',
223
+ content: {
224
+ markdown: `### 模块通信\n\n${projectName} 的模块通信遵循接口隔离原则,${ast.protocols} 个协议定义了清晰的边界。\n\n> ⚠️ Mock AI 自动生成`,
225
+ rationale: '接口隔离确保模块可独立演进和测试',
226
+ },
227
+ coreCode: `${lang === 'swift' ? `protocol ${typeFirst}Protocol {\n func execute() async\n}` : `interface I${typeFirst} {\n execute(): Promise<void>\n}`}`,
228
+ doClause: 'Define protocols/interfaces for all cross-module communication',
229
+ dontClause: 'Do not import concrete implementations across module boundaries',
230
+ whenClause: 'When modules need to communicate or share data',
231
+ usageGuide: `### 使用指南\n\n定义协议作为模块间通信契约。`,
232
+ },
233
+ ];
234
+ case 'code-pattern':
235
+ return [
236
+ {
237
+ ...base,
238
+ title: `${typeFirst} 扩展方法约定`,
239
+ description: `使用扩展方法为 ${typeFirst} 添加功能,保持核心类型精简`,
240
+ trigger: `@${toKebab(typeFirst)}-extension-pattern`,
241
+ kind: 'pattern',
242
+ category: 'Tool',
243
+ topicHint: 'conventions',
244
+ content: {
245
+ markdown: `### 扩展方法约定\n\n${projectName} 广泛使用扩展方法组织代码,${typeList} 等类型均采用此模式。\n\n**来源**: \`${srcFirst}\`\n\n> ⚠️ Mock AI 自动生成`,
246
+ rationale: '扩展方法使核心类型保持精简,增强可读性',
247
+ },
248
+ coreCode: `${lang === 'swift' ? `extension ${typeFirst} {\n func helper() { }\n}` : `// ${typeFirst}.extensions.ts`}`,
249
+ doClause: `Group related functionality in ${lang === 'swift' ? 'extensions' : 'utility modules'}`,
250
+ dontClause: 'Do not bloat core types with unrelated methods',
251
+ whenClause: `When adding utility or convenience methods to ${typeFirst}`,
252
+ usageGuide: `### 使用指南\n\n按功能分组创建扩展文件。`,
253
+ },
254
+ {
255
+ ...base,
256
+ title: `${projectName} 类型安全惯例`,
257
+ description: `项目统一使用强类型和类型守卫确保安全`,
258
+ trigger: `@${toKebab(projectName)}-type-safety`,
259
+ kind: 'rule',
260
+ category: 'Tool',
261
+ topicHint: 'conventions',
262
+ content: {
263
+ markdown: `### 类型安全\n\n${projectName} 强制类型安全,包含 ${ast.classes} 个类和 ${ast.protocols} 个协议定义。\n\n> ⚠️ Mock AI 自动生成`,
264
+ rationale: '类型安全减少运行时错误',
265
+ },
266
+ coreCode: `${lang === 'swift' ? 'guard let value = optional else { return }' : 'if (value === undefined) { return; }'}`,
267
+ doClause: 'Use type guards and optional binding for safe access',
268
+ dontClause: 'Do not use force unwrapping or type casting without checks',
269
+ whenClause: 'When handling optional values or type conversions',
270
+ usageGuide: `### 使用指南\n\n始终使用安全的类型转换。`,
271
+ },
272
+ {
273
+ ...base,
274
+ title: `${projectName} 命名约定`,
275
+ description: `文件和类型命名遵循一致的约定`,
276
+ trigger: `@${toKebab(projectName)}-naming-conventions`,
277
+ kind: 'rule',
278
+ category: 'Tool',
279
+ topicHint: 'conventions',
280
+ content: {
281
+ markdown: `### 命名约定\n\n${projectName} 使用一致的命名风格。类型: PascalCase, 方法/属性: camelCase。\n\n> ⚠️ Mock AI 自动生成`,
282
+ rationale: '统一命名提高代码可读性',
283
+ },
284
+ coreCode: `// ${typeFirst}.swift / ${typeFirst}.ts`,
285
+ doClause: 'Follow PascalCase for types and camelCase for members',
286
+ dontClause: 'Do not use abbreviations or inconsistent casing',
287
+ whenClause: 'When naming new types, methods, or properties',
288
+ usageGuide: `### 使用指南\n\n遵循项目既有命名风格。`,
289
+ },
290
+ ];
291
+ default:
292
+ return [
293
+ {
294
+ ...base,
295
+ title: `${projectName} ${dimLabel}实践`,
296
+ description: `${dimLabel}维度的最佳实践,基于 ${typeList} 等代码分析`,
297
+ trigger: `@${toKebab(projectName)}-${toKebab(dimLabel)}-practice`,
298
+ kind: 'pattern',
299
+ category: 'Tool',
300
+ topicHint: dimId.includes('network')
301
+ ? 'networking'
302
+ : dimId.includes('ui')
303
+ ? 'ui'
304
+ : 'conventions',
305
+ content: {
306
+ markdown: `### ${dimLabel}\n\n${projectName} 在 ${dimLabel} 方面的实践,涉及 ${typeList} 等核心类型。\n\n**文件统计**: ${ast.classes} 类, ${ast.protocols} 协议, ${ast.functions} 函数\n\n**来源**: \`${srcFirst}\`\n\n> ⚠️ Mock AI 自动生成`,
307
+ rationale: `${dimLabel}是项目质量的重要维度`,
308
+ },
309
+ coreCode: `// See ${srcFirst}`,
310
+ doClause: `Follow established ${dimLabel} patterns in the project`,
311
+ dontClause: `Do not deviate from the project's ${dimLabel} conventions`,
312
+ whenClause: `When working on ${dimLabel}-related code`,
313
+ usageGuide: `### 使用指南\n\n遵循项目的 ${dimLabel} 约定。`,
314
+ },
315
+ {
316
+ ...base,
317
+ title: `${typeFirst} ${dimLabel}约定`,
318
+ description: `${typeFirst} 相关的 ${dimLabel} 约定`,
319
+ trigger: `@${toKebab(typeFirst)}-${toKebab(dimLabel)}`,
320
+ kind: 'rule',
321
+ category: 'Tool',
322
+ topicHint: dimId.includes('network') ? 'networking' : 'conventions',
323
+ content: {
324
+ markdown: `### ${typeFirst} ${dimLabel}\n\n${typeFirst} 遵循的 ${dimLabel} 约定。\n\n> ⚠️ Mock AI 自动生成`,
325
+ rationale: `基于 ${typeFirst} 的实际代码模式`,
326
+ },
327
+ coreCode: `// ${typeFirst} — ${dimLabel}`,
328
+ doClause: `Apply ${dimLabel} patterns consistent with ${typeFirst}`,
329
+ dontClause: `Do not introduce inconsistent ${dimLabel} approaches`,
330
+ whenClause: `When modifying ${typeFirst} or related components`,
331
+ usageGuide: `### 使用指南\n\n参考 ${typeFirst} 的既有实现。`,
332
+ },
333
+ {
334
+ ...base,
335
+ title: `${projectName} ${dimLabel}检查清单`,
336
+ description: `${dimLabel}方面的代码审查清单`,
337
+ trigger: `@${toKebab(projectName)}-${toKebab(dimLabel)}-checklist`,
338
+ kind: 'fact',
339
+ category: 'Tool',
340
+ topicHint: 'conventions',
341
+ content: {
342
+ markdown: `### ${dimLabel} 检查清单\n\n1. 遵循项目既有模式\n2. 确保类型安全\n3. 添加适当的错误处理\n4. 保持代码一致性\n\n> ⚠️ Mock AI 自动生成`,
343
+ rationale: `${dimLabel}检查清单帮助保持代码质量`,
344
+ },
345
+ coreCode: `// ${dimLabel} checklist applied`,
346
+ doClause: `Review code against the ${dimLabel} checklist before committing`,
347
+ dontClause: `Do not skip ${dimLabel} review for shortcuts`,
348
+ whenClause: `During code review for ${dimLabel}-related changes`,
349
+ usageGuide: `### 使用指南\n\n在代码审查时参考此清单。`,
350
+ },
351
+ ];
352
+ }
353
+ }
354
+ // ── Mock Pipeline 入口 ────────────────────────────────────────
355
+ /**
356
+ * fillDimensionsMock — Mock AI 轻量管线
357
+ *
358
+ * 利用 Phase 1-4 的真实数据(AST、文件列表、Panorama)自动生成候选知识,
359
+ * 不调用任何 AI API,但走完 submit → dimension_complete 的完整流程。
360
+ */
361
+ export async function fillDimensionsMock(view, dimensions) {
362
+ const { snapshot, projectRoot } = view;
363
+ const ctx = view.ctx;
364
+ const emitter = new BootstrapEventEmitter(ctx.container);
365
+ const projectName = path.basename(projectRoot);
366
+ const primaryLang = snapshot.language.primaryLang ?? 'unknown';
367
+ const astStats = extractAstStats(snapshot.ast);
368
+ const allFiles = snapshot.allFiles;
369
+ const targetFileMap = view.targetFileMap;
370
+ const repFiles = getRepresentativeFiles(allFiles, targetFileMap);
371
+ logger.info(`[MockPipeline] ═══ Starting Mock bootstrap — ${dimensions.length} dimensions, ` +
372
+ `${allFiles?.length || 0} files, lang=${primaryLang}`);
373
+ emitter.emitProgress('bootstrap:mock-mode', {
374
+ message: '🧪 Mock AI 模式 — 基于代码结构自动生成知识候选(非 AI 深度分析)',
375
+ mockMode: true,
376
+ });
377
+ const knowledgeService = ctx.container.get('knowledgeService');
378
+ let totalCreated = 0;
379
+ for (const dim of dimensions) {
380
+ const dimStartTime = Date.now();
381
+ const dimLabel = dim.label ?? dim.id;
382
+ emitter.emitProgress('bootstrap:dimension-start', {
383
+ dimensionId: dim.id,
384
+ dimensionLabel: dimLabel,
385
+ mockMode: true,
386
+ });
387
+ logger.info(`[MockPipeline] ── Dimension "${dim.id}" (${dimLabel}) ──`);
388
+ // 生成候选
389
+ const candidates = generateDimensionCandidates(dim.id, dimLabel, allFiles, primaryLang, projectName, astStats, repFiles);
390
+ const createdIds = [];
391
+ for (const candidate of candidates) {
392
+ try {
393
+ const entry = await knowledgeService.create({
394
+ ...candidate,
395
+ source: 'mock-bootstrap',
396
+ }, { userId: 'mock-ai' });
397
+ createdIds.push(entry.id);
398
+ totalCreated++;
399
+ // 尝试自动评分(非关键路径)
400
+ try {
401
+ await knowledgeService.updateQuality?.(entry.id, { userId: 'mock-ai' });
402
+ }
403
+ catch {
404
+ /* best effort */
405
+ }
406
+ logger.info(`[MockPipeline] ✅ Created: "${candidate.title}" → ${entry.id}`);
407
+ }
408
+ catch (err) {
409
+ const msg = err instanceof Error ? err.message : String(err);
410
+ logger.warn(`[MockPipeline] ⚠️ Failed to create "${candidate.title}": ${msg}`);
411
+ }
412
+ }
413
+ const durationMs = Date.now() - dimStartTime;
414
+ emitter.emitDimensionComplete(dim.id, {
415
+ type: 'candidate',
416
+ extracted: candidates.length,
417
+ created: createdIds.length,
418
+ status: 'mock-pipeline-complete',
419
+ degraded: false,
420
+ durationMs,
421
+ toolCallCount: 0,
422
+ source: 'mock-pipeline',
423
+ });
424
+ logger.info(`[MockPipeline] ✅ "${dim.id}": ${createdIds.length}/${candidates.length} candidates, ${durationMs}ms`);
425
+ }
426
+ emitter.emitProgress('bootstrap:mock-complete', {
427
+ message: `🧪 Mock Bootstrap 完成: ${totalCreated} 个候选知识已生成`,
428
+ totalCreated,
429
+ mockMode: true,
430
+ });
431
+ logger.info(`[MockPipeline] ═══ Mock bootstrap complete — ${totalCreated} candidates from ${dimensions.length} dimensions`);
432
+ }
@@ -13,28 +13,115 @@
13
13
  *
14
14
  * @module pipeline/orchestrator
15
15
  */
16
+ import type { DimensionDef } from '#types/project-snapshot.js';
17
+ import type { PipelineFillView } from '#types/snapshot-views.js';
16
18
  import { clearCheckpoints } from './checkpoint.js';
17
- /** Extended DI container shape for orchestrator (supports buildProjectGraph etc.) */
19
+ /** Singleton properties accessed by orchestrator */
20
+ interface OrchestratorSingletons {
21
+ aiProvider?: {
22
+ name?: string;
23
+ model?: string;
24
+ supportsEmbedding?: () => boolean;
25
+ [key: string]: unknown;
26
+ } | null;
27
+ _embedProvider?: {
28
+ embed?: (text: string) => Promise<number[]>;
29
+ [key: string]: unknown;
30
+ } | null;
31
+ _fileCache?: BootstrapFileEntry[] | null;
32
+ _projectRoot?: string;
33
+ _config?: Record<string, unknown>;
34
+ _lang?: string | null;
35
+ [key: string]: unknown;
36
+ }
37
+ /** Services orchestrator accesses via container.get() */
38
+ interface OrchestratorServiceKeys {
39
+ agentFactory: AgentFactoryLike;
40
+ bootstrapTaskManager: TaskManagerLike;
41
+ database: any;
42
+ }
43
+ /** Extended DI container shape for orchestrator */
18
44
  interface OrchestratorContainer {
45
+ get<K extends keyof OrchestratorServiceKeys>(name: K): OrchestratorServiceKeys[K];
19
46
  get(name: string): any;
20
- [key: string]: any;
47
+ singletons: OrchestratorSingletons;
48
+ buildProjectGraph?(projectRoot: string, options?: Record<string, unknown>): Promise<ProjectGraphLike | null>;
49
+ [key: string]: unknown;
21
50
  }
22
- /** Orchestrator context (extended McpContext) */
23
- interface OrchestratorContext {
24
- container: OrchestratorContainer;
25
- [key: string]: any;
51
+ /** ProjectGraph minimal shape */
52
+ interface ProjectGraphLike {
53
+ getOverview(): {
54
+ totalClasses: number;
55
+ totalProtocols: number;
56
+ [key: string]: unknown;
57
+ };
58
+ [key: string]: unknown;
59
+ }
60
+ /** Bootstrap file entry */
61
+ interface BootstrapFileEntry {
62
+ name: string;
63
+ path: string;
64
+ relativePath: string;
65
+ content: string;
66
+ targetName?: string;
67
+ }
68
+ /** Task manager minimal shape */
69
+ interface TaskManagerLike {
70
+ isSessionValid(sessionId: string): boolean;
71
+ emitProgress?(event: string, data: Record<string, unknown>): void;
72
+ [key: string]: unknown;
73
+ }
74
+ /** Agent factory minimal shape */
75
+ interface AgentFactoryLike {
76
+ createRuntime(preset: string, overrides?: Record<string, unknown>): AgentRuntimeLike;
77
+ createContextWindow(opts?: {
78
+ isSystem?: boolean;
79
+ }): unknown;
80
+ [key: string]: unknown;
81
+ }
82
+ /** Agent runtime minimal shape */
83
+ interface AgentRuntimeLike {
84
+ execute(message: unknown, opts?: Record<string, unknown>): Promise<AgentResultLike>;
85
+ setFileCache(files: unknown[] | null): void;
86
+ aiProvider: {
87
+ name?: string;
88
+ model?: string;
89
+ [key: string]: unknown;
90
+ };
91
+ [key: string]: unknown;
92
+ }
93
+ /** Agent execution result */
94
+ interface AgentResultLike {
95
+ reply?: string;
96
+ toolCalls?: ToolCallRecord[];
97
+ tokenUsage?: {
98
+ input: number;
99
+ output: number;
100
+ };
101
+ phases?: Record<string, {
102
+ reply?: string;
103
+ artifact?: Record<string, any>;
104
+ [key: string]: any;
105
+ }>;
106
+ degraded?: boolean;
107
+ [key: string]: unknown;
26
108
  }
27
- /** Fill context passed from bootstrapKnowledge to fillDimensionsV3 */
28
- interface FillContextV3 {
29
- ctx: OrchestratorContext;
30
- [key: string]: any;
109
+ /** Tool call record from runtime */
110
+ interface ToolCallRecord {
111
+ tool?: string;
112
+ name?: string;
113
+ args?: Record<string, unknown>;
114
+ params?: Record<string, unknown>;
115
+ result?: unknown;
116
+ [key: string]: unknown;
31
117
  }
32
118
  /**
33
119
  * fillDimensionsV3 — v3.0 AI-First 维度填充管线
34
120
  *
35
- * @param fillContext bootstrapKnowledge 构建的上下文
121
+ * @param view PipelineFillView 从 handler 传入的类型化视图
122
+ * @param dimensions 当前运行的维度列表(rescan 可能是 gap 子集)
36
123
  */
37
- export declare function fillDimensionsV3(fillContext: FillContextV3): Promise<void>;
124
+ export declare function fillDimensionsV3(view: PipelineFillView, dimensions: DimensionDef[]): Promise<void>;
38
125
  /**
39
126
  * 清除增量 Bootstrap 快照 — 供 bootstrapKnowledge 在手动冷启动时调用
40
127
  * @param ctx { container, logger }