autosnippet 3.2.21 → 3.3.2

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 (311) hide show
  1. package/dashboard/dist/assets/icons-BJ2mUBi8.js +1 -0
  2. package/dashboard/dist/assets/index-B659K9t5.js +128 -0
  3. package/dashboard/dist/assets/index-NCm40PMD.css +1 -0
  4. package/dashboard/dist/index.html +3 -3
  5. package/dist/bin/cli.d.ts +1 -1
  6. package/dist/bin/cli.js +244 -261
  7. package/dist/lib/agent/context/ExplorationTracker.d.ts +2 -0
  8. package/dist/lib/agent/context/ExplorationTracker.js +21 -3
  9. package/dist/lib/agent/core/ToolExecutionPipeline.d.ts +3 -1
  10. package/dist/lib/agent/core/ToolExecutionPipeline.js +8 -1
  11. package/dist/lib/agent/forge/DynamicComposer.d.ts +58 -0
  12. package/dist/lib/agent/forge/DynamicComposer.js +99 -0
  13. package/dist/lib/agent/forge/SandboxRunner.d.ts +60 -0
  14. package/dist/lib/agent/forge/SandboxRunner.js +251 -0
  15. package/dist/lib/agent/forge/TemporaryToolRegistry.d.ts +76 -0
  16. package/dist/lib/agent/forge/TemporaryToolRegistry.js +154 -0
  17. package/dist/lib/agent/forge/ToolForge.d.ts +92 -0
  18. package/dist/lib/agent/forge/ToolForge.js +239 -0
  19. package/dist/lib/agent/forge/ToolRequirementAnalyzer.d.ts +44 -0
  20. package/dist/lib/agent/forge/ToolRequirementAnalyzer.js +119 -0
  21. package/dist/lib/agent/tools/ToolRegistry.d.ts +2 -0
  22. package/dist/lib/agent/tools/ToolRegistry.js +4 -0
  23. package/dist/lib/agent/tools/composite.js +0 -1
  24. package/dist/lib/agent/tools/index.d.ts +2 -50
  25. package/dist/lib/agent/tools/index.js +2 -3
  26. package/dist/lib/agent/tools/lifecycle.d.ts +1 -58
  27. package/dist/lib/agent/tools/lifecycle.js +2 -75
  28. package/dist/lib/cli/SetupService.d.ts +46 -2
  29. package/dist/lib/cli/SetupService.js +2 -27
  30. package/dist/lib/cli/deploy/FileManifest.d.ts +0 -21
  31. package/dist/lib/cli/deploy/FileManifest.js +0 -11
  32. package/dist/lib/{platform/ios/spm → core/discovery}/SpmDiscoverer.d.ts +2 -5
  33. package/dist/lib/{platform/ios/spm → core/discovery}/SpmDiscoverer.js +159 -44
  34. package/dist/lib/core/discovery/index.d.ts +1 -1
  35. package/dist/lib/core/discovery/index.js +2 -2
  36. package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +10 -0
  37. package/dist/lib/domain/knowledge/KnowledgeEntry.js +2 -0
  38. package/dist/lib/domain/knowledge/Lifecycle.d.ts +19 -2
  39. package/dist/lib/domain/knowledge/Lifecycle.js +32 -6
  40. package/dist/lib/domain/knowledge/UnifiedValidator.d.ts +1 -5
  41. package/dist/lib/domain/knowledge/UnifiedValidator.js +7 -44
  42. package/dist/lib/domain/knowledge/values/Stats.d.ts +29 -0
  43. package/dist/lib/domain/knowledge/values/Stats.js +41 -0
  44. package/dist/lib/external/mcp/McpServer.d.ts +19 -38
  45. package/dist/lib/external/mcp/McpServer.js +145 -117
  46. package/dist/lib/external/mcp/autoApproveInjector.js +0 -2
  47. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +26 -1
  48. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +41 -0
  49. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +49 -0
  50. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +3 -0
  51. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +27 -0
  52. package/dist/lib/external/mcp/handlers/bootstrap/skills.js +1 -1
  53. package/dist/lib/external/mcp/handlers/bootstrap-external.js +1 -0
  54. package/dist/lib/external/mcp/handlers/bootstrap-internal.js +2 -0
  55. package/dist/lib/external/mcp/handlers/consolidated.d.ts +116 -6
  56. package/dist/lib/external/mcp/handlers/consolidated.js +251 -71
  57. package/dist/lib/external/mcp/handlers/guard.d.ts +150 -0
  58. package/dist/lib/external/mcp/handlers/guard.js +245 -8
  59. package/dist/lib/external/mcp/handlers/knowledge.d.ts +0 -29
  60. package/dist/lib/external/mcp/handlers/knowledge.js +1 -76
  61. package/dist/lib/external/mcp/handlers/panorama.d.ts +36 -0
  62. package/dist/lib/external/mcp/handlers/panorama.js +156 -0
  63. package/dist/lib/external/mcp/handlers/system.d.ts +2 -54
  64. package/dist/lib/external/mcp/handlers/system.js +3 -113
  65. package/dist/lib/external/mcp/handlers/task.d.ts +13 -24
  66. package/dist/lib/external/mcp/handlers/task.js +217 -557
  67. package/dist/lib/external/mcp/handlers/types.d.ts +91 -8
  68. package/dist/lib/external/mcp/handlers/types.js +18 -1
  69. package/dist/lib/external/mcp/handlers/wiki-external.d.ts +18 -1
  70. package/dist/lib/external/mcp/handlers/wiki-external.js +16 -1
  71. package/dist/lib/external/mcp/tools.d.ts +14 -20
  72. package/dist/lib/external/mcp/tools.js +62 -91
  73. package/dist/lib/http/HttpServer.js +52 -6
  74. package/dist/lib/http/routes/{snippets.d.ts → audit.d.ts} +4 -2
  75. package/dist/lib/http/routes/audit.js +51 -0
  76. package/dist/lib/http/routes/commands.d.ts +1 -1
  77. package/dist/lib/http/routes/commands.js +1 -66
  78. package/dist/lib/http/routes/guardReport.d.ts +10 -0
  79. package/dist/lib/http/routes/guardReport.js +143 -0
  80. package/dist/lib/http/routes/knowledge.js +32 -1
  81. package/dist/lib/http/routes/panorama.d.ts +11 -0
  82. package/dist/lib/http/routes/panorama.js +322 -0
  83. package/dist/lib/http/routes/remote.js +0 -5
  84. package/dist/lib/http/routes/signals.d.ts +10 -0
  85. package/dist/lib/http/routes/signals.js +104 -0
  86. package/dist/lib/http/routes/task.d.ts +2 -3
  87. package/dist/lib/http/routes/task.js +17 -347
  88. package/dist/lib/http/routes/violations.js +1 -1
  89. package/dist/lib/infrastructure/audit/AuditLogger.d.ts +6 -1
  90. package/dist/lib/infrastructure/audit/AuditLogger.js +14 -1
  91. package/dist/lib/infrastructure/database/drizzle/schema.d.ts +181 -583
  92. package/dist/lib/infrastructure/database/drizzle/schema.js +28 -69
  93. package/dist/lib/infrastructure/database/migrations/004_evolution_proposals.d.ts +8 -0
  94. package/dist/lib/infrastructure/database/migrations/004_evolution_proposals.js +43 -0
  95. package/dist/lib/infrastructure/logging/Logger.d.ts +2 -0
  96. package/dist/lib/infrastructure/logging/Logger.js +34 -7
  97. package/dist/lib/infrastructure/monitoring/ErrorTracker.js +3 -1
  98. package/dist/lib/infrastructure/monitoring/PerformanceMonitor.d.ts +2 -2
  99. package/dist/lib/infrastructure/monitoring/PerformanceMonitor.js +12 -10
  100. package/dist/lib/infrastructure/notification/LarkNotifier.d.ts +24 -0
  101. package/dist/lib/infrastructure/notification/LarkNotifier.js +97 -0
  102. package/dist/lib/infrastructure/report/ReportStore.d.ts +45 -0
  103. package/dist/lib/infrastructure/report/ReportStore.js +133 -0
  104. package/dist/lib/infrastructure/signal/SignalAggregator.d.ts +18 -0
  105. package/dist/lib/infrastructure/signal/SignalAggregator.js +84 -0
  106. package/dist/lib/infrastructure/signal/SignalBridge.d.ts +13 -0
  107. package/dist/lib/infrastructure/signal/SignalBridge.js +20 -0
  108. package/dist/lib/infrastructure/signal/SignalBus.d.ts +63 -0
  109. package/dist/lib/infrastructure/signal/SignalBus.js +106 -0
  110. package/dist/lib/infrastructure/signal/SignalTraceWriter.d.ts +36 -0
  111. package/dist/lib/infrastructure/signal/SignalTraceWriter.js +130 -0
  112. package/dist/lib/injection/ServiceContainer.js +6 -0
  113. package/dist/lib/injection/ServiceMap.d.ts +16 -19
  114. package/dist/lib/injection/modules/AgentModule.d.ts +1 -1
  115. package/dist/lib/injection/modules/AgentModule.js +7 -1
  116. package/dist/lib/injection/modules/AppModule.d.ts +3 -4
  117. package/dist/lib/injection/modules/AppModule.js +7 -43
  118. package/dist/lib/injection/modules/GuardModule.js +59 -2
  119. package/dist/lib/injection/modules/InfraModule.d.ts +0 -1
  120. package/dist/lib/injection/modules/InfraModule.js +9 -7
  121. package/dist/lib/injection/modules/KnowledgeModule.js +51 -0
  122. package/dist/lib/injection/modules/PanoramaModule.d.ts +18 -0
  123. package/dist/lib/injection/modules/PanoramaModule.js +76 -0
  124. package/dist/lib/injection/modules/SignalModule.d.ts +10 -0
  125. package/dist/lib/injection/modules/SignalModule.js +84 -0
  126. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +1 -0
  127. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +6 -0
  128. package/dist/lib/service/bootstrap/BootstrapTaskManager.d.ts +3 -1
  129. package/dist/lib/service/bootstrap/BootstrapTaskManager.js +20 -1
  130. package/dist/lib/service/delivery/AgentInstructionsGenerator.js +4 -5
  131. package/dist/lib/service/delivery/CursorDeliveryPipeline.d.ts +3 -1
  132. package/dist/lib/service/delivery/CursorDeliveryPipeline.js +13 -10
  133. package/dist/lib/service/delivery/RulesGenerator.js +3 -2
  134. package/dist/lib/service/evolution/ConsolidationAdvisor.d.ts +114 -0
  135. package/dist/lib/service/evolution/ConsolidationAdvisor.js +542 -0
  136. package/dist/lib/service/evolution/ContradictionDetector.d.ts +54 -0
  137. package/dist/lib/service/evolution/ContradictionDetector.js +253 -0
  138. package/dist/lib/service/evolution/DecayDetector.d.ts +71 -0
  139. package/dist/lib/service/evolution/DecayDetector.js +244 -0
  140. package/dist/lib/service/evolution/EnhancementSuggester.d.ts +38 -0
  141. package/dist/lib/service/evolution/EnhancementSuggester.js +220 -0
  142. package/dist/lib/service/evolution/KnowledgeMetabolism.d.ts +82 -0
  143. package/dist/lib/service/evolution/KnowledgeMetabolism.js +167 -0
  144. package/dist/lib/service/evolution/RedundancyAnalyzer.d.ts +53 -0
  145. package/dist/lib/service/evolution/RedundancyAnalyzer.js +210 -0
  146. package/dist/lib/service/evolution/StagingManager.d.ts +57 -0
  147. package/dist/lib/service/evolution/StagingManager.js +201 -0
  148. package/dist/lib/service/guard/ComplianceReporter.d.ts +42 -2
  149. package/dist/lib/service/guard/ComplianceReporter.js +43 -5
  150. package/dist/lib/service/guard/CoverageAnalyzer.d.ts +54 -0
  151. package/dist/lib/service/guard/CoverageAnalyzer.js +149 -0
  152. package/dist/lib/service/guard/GuardCheckEngine.d.ts +55 -1
  153. package/dist/lib/service/guard/GuardCheckEngine.js +508 -15
  154. package/dist/lib/service/guard/GuardFeedbackLoop.d.ts +3 -0
  155. package/dist/lib/service/guard/GuardFeedbackLoop.js +9 -0
  156. package/dist/lib/service/guard/ReverseGuard.d.ts +73 -0
  157. package/dist/lib/service/guard/ReverseGuard.js +256 -0
  158. package/dist/lib/service/guard/RuleLearner.d.ts +12 -0
  159. package/dist/lib/service/guard/RuleLearner.js +38 -0
  160. package/dist/lib/service/guard/UncertaintyCollector.d.ts +83 -0
  161. package/dist/lib/service/guard/UncertaintyCollector.js +149 -0
  162. package/dist/lib/service/guard/ViolationsStore.d.ts +1 -0
  163. package/dist/lib/service/guard/ViolationsStore.js +33 -3
  164. package/dist/lib/service/knowledge/ConfidenceRouter.d.ts +13 -0
  165. package/dist/lib/service/knowledge/ConfidenceRouter.js +14 -0
  166. package/dist/lib/service/knowledge/KnowledgeService.js +22 -4
  167. package/dist/lib/service/module/ModuleService.js +3 -13
  168. package/dist/lib/service/panorama/CouplingAnalyzer.d.ts +27 -0
  169. package/dist/lib/service/panorama/CouplingAnalyzer.js +192 -0
  170. package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +28 -0
  171. package/dist/lib/service/panorama/DimensionAnalyzer.js +320 -0
  172. package/dist/lib/service/panorama/LayerInferrer.d.ts +19 -0
  173. package/dist/lib/service/panorama/LayerInferrer.js +182 -0
  174. package/dist/lib/service/panorama/ModuleDiscoverer.d.ts +24 -0
  175. package/dist/lib/service/panorama/ModuleDiscoverer.js +185 -0
  176. package/dist/lib/service/panorama/PanoramaAggregator.d.ts +29 -0
  177. package/dist/lib/service/panorama/PanoramaAggregator.js +228 -0
  178. package/dist/lib/service/panorama/PanoramaScanner.d.ts +52 -0
  179. package/dist/lib/service/panorama/PanoramaScanner.js +188 -0
  180. package/dist/lib/service/panorama/PanoramaService.d.ts +108 -0
  181. package/dist/lib/service/panorama/PanoramaService.js +220 -0
  182. package/dist/lib/service/panorama/PanoramaTypes.d.ts +134 -0
  183. package/dist/lib/service/panorama/PanoramaTypes.js +6 -0
  184. package/dist/lib/service/panorama/RoleRefiner.d.ts +48 -0
  185. package/dist/lib/service/panorama/RoleRefiner.js +535 -0
  186. package/dist/lib/service/search/MultiSignalRanker.d.ts +1 -0
  187. package/dist/lib/service/search/MultiSignalRanker.js +16 -0
  188. package/dist/lib/service/search/SearchEngine.d.ts +1 -0
  189. package/dist/lib/service/search/SearchEngine.js +9 -1
  190. package/dist/lib/service/search/SearchTypes.d.ts +2 -0
  191. package/dist/lib/service/signal/HitRecorder.d.ts +68 -0
  192. package/dist/lib/service/signal/HitRecorder.js +173 -0
  193. package/dist/lib/service/skills/SignalCollector.d.ts +3 -1
  194. package/dist/lib/service/skills/SignalCollector.js +31 -1
  195. package/dist/lib/service/task/IntentExtractor.d.ts +58 -0
  196. package/dist/lib/service/task/IntentExtractor.js +142 -0
  197. package/dist/lib/service/task/PrimeSearchPipeline.d.ts +54 -0
  198. package/dist/lib/service/task/PrimeSearchPipeline.js +98 -0
  199. package/dist/lib/shared/constants.d.ts +0 -15
  200. package/dist/lib/shared/constants.js +0 -10
  201. package/dist/lib/shared/schemas/config.d.ts +4 -1
  202. package/dist/lib/shared/schemas/config.js +8 -1
  203. package/dist/lib/shared/schemas/mcp-tools.d.ts +41 -96
  204. package/dist/lib/shared/schemas/mcp-tools.js +59 -119
  205. package/dist/scripts/analyze-signals.d.ts +20 -0
  206. package/dist/scripts/analyze-signals.js +155 -0
  207. package/dist/scripts/diagnose-mcp.js +1 -1
  208. package/dist/scripts/release.js +2 -10
  209. package/package.json +4 -19
  210. package/skills/autosnippet-devdocs/SKILL.md +11 -8
  211. package/templates/claude-code/hooks/autosnippet-session.sh +10 -15
  212. package/templates/cursor-hooks/hooks/session-start.sh +1 -1
  213. package/templates/instructions/agent-static.md +2 -1
  214. package/templates/instructions/conventions.md +5 -6
  215. package/templates/recipes-setup/README.md +1 -2
  216. package/dashboard/dist/assets/icons-C1dUryS-.js +0 -1
  217. package/dashboard/dist/assets/index-D0whuycy.css +0 -1
  218. package/dashboard/dist/assets/index-DdvZE4Yd.js +0 -128
  219. package/dist/lib/domain/task/Task.d.ts +0 -140
  220. package/dist/lib/domain/task/Task.js +0 -254
  221. package/dist/lib/domain/task/TaskDependency.d.ts +0 -23
  222. package/dist/lib/domain/task/TaskDependency.js +0 -34
  223. package/dist/lib/domain/task/TaskIdGenerator.d.ts +0 -40
  224. package/dist/lib/domain/task/TaskIdGenerator.js +0 -75
  225. package/dist/lib/domain/task/index.d.ts +0 -4
  226. package/dist/lib/domain/task/index.js +0 -4
  227. package/dist/lib/http/routes/snippets.js +0 -49
  228. package/dist/lib/infrastructure/database/migrations/002_add_tasks.d.ts +0 -11
  229. package/dist/lib/infrastructure/database/migrations/002_add_tasks.js +0 -86
  230. package/dist/lib/platform/ClipboardManager.d.ts +0 -24
  231. package/dist/lib/platform/ClipboardManager.js +0 -142
  232. package/dist/lib/platform/NativeUi.d.ts +0 -53
  233. package/dist/lib/platform/NativeUi.js +0 -284
  234. package/dist/lib/platform/ios/index.d.ts +0 -38
  235. package/dist/lib/platform/ios/index.js +0 -42
  236. package/dist/lib/platform/ios/routes/spm.d.ts +0 -9
  237. package/dist/lib/platform/ios/routes/spm.js +0 -371
  238. package/dist/lib/platform/ios/snippet/PlaceholderConverter.d.ts +0 -21
  239. package/dist/lib/platform/ios/snippet/PlaceholderConverter.js +0 -48
  240. package/dist/lib/platform/ios/snippet/XcodeCodec.d.ts +0 -23
  241. package/dist/lib/platform/ios/snippet/XcodeCodec.js +0 -96
  242. package/dist/lib/platform/ios/spm/DependencyGraph.d.ts +0 -56
  243. package/dist/lib/platform/ios/spm/DependencyGraph.js +0 -195
  244. package/dist/lib/platform/ios/spm/PackageSwiftParser.d.ts +0 -69
  245. package/dist/lib/platform/ios/spm/PackageSwiftParser.js +0 -231
  246. package/dist/lib/platform/ios/spm/PathFinder.d.ts +0 -28
  247. package/dist/lib/platform/ios/spm/PathFinder.js +0 -117
  248. package/dist/lib/platform/ios/spm/PolicyEngine.d.ts +0 -44
  249. package/dist/lib/platform/ios/spm/PolicyEngine.js +0 -79
  250. package/dist/lib/platform/ios/spm/SpmHelper.d.ts +0 -102
  251. package/dist/lib/platform/ios/spm/SpmHelper.js +0 -464
  252. package/dist/lib/platform/ios/xcode/HeaderResolver.d.ts +0 -33
  253. package/dist/lib/platform/ios/xcode/HeaderResolver.js +0 -90
  254. package/dist/lib/platform/ios/xcode/SaveEventFilter.d.ts +0 -66
  255. package/dist/lib/platform/ios/xcode/SaveEventFilter.js +0 -142
  256. package/dist/lib/platform/ios/xcode/XcodeAutomation.d.ts +0 -71
  257. package/dist/lib/platform/ios/xcode/XcodeAutomation.js +0 -327
  258. package/dist/lib/platform/ios/xcode/XcodeImportResolver.d.ts +0 -130
  259. package/dist/lib/platform/ios/xcode/XcodeImportResolver.js +0 -404
  260. package/dist/lib/platform/ios/xcode/XcodeIntegration.d.ts +0 -89
  261. package/dist/lib/platform/ios/xcode/XcodeIntegration.js +0 -588
  262. package/dist/lib/platform/ios/xcode/XcodeWriteUtils.d.ts +0 -99
  263. package/dist/lib/platform/ios/xcode/XcodeWriteUtils.js +0 -190
  264. package/dist/lib/repository/task/TaskRepository.impl.d.ts +0 -171
  265. package/dist/lib/repository/task/TaskRepository.impl.js +0 -347
  266. package/dist/lib/service/automation/ActionPipeline.d.ts +0 -34
  267. package/dist/lib/service/automation/ActionPipeline.js +0 -53
  268. package/dist/lib/service/automation/AutomationOrchestrator.d.ts +0 -86
  269. package/dist/lib/service/automation/AutomationOrchestrator.js +0 -57
  270. package/dist/lib/service/automation/ContextCollector.d.ts +0 -24
  271. package/dist/lib/service/automation/ContextCollector.js +0 -35
  272. package/dist/lib/service/automation/DirectiveDetector.d.ts +0 -51
  273. package/dist/lib/service/automation/DirectiveDetector.js +0 -112
  274. package/dist/lib/service/automation/FileWatcher.d.ts +0 -51
  275. package/dist/lib/service/automation/FileWatcher.js +0 -366
  276. package/dist/lib/service/automation/TriggerResolver.d.ts +0 -36
  277. package/dist/lib/service/automation/TriggerResolver.js +0 -62
  278. package/dist/lib/service/automation/handlers/AlinkHandler.d.ts +0 -7
  279. package/dist/lib/service/automation/handlers/AlinkHandler.js +0 -80
  280. package/dist/lib/service/automation/handlers/CreateHandler.d.ts +0 -11
  281. package/dist/lib/service/automation/handlers/CreateHandler.js +0 -170
  282. package/dist/lib/service/automation/handlers/GuardHandler.d.ts +0 -17
  283. package/dist/lib/service/automation/handlers/GuardHandler.js +0 -218
  284. package/dist/lib/service/automation/handlers/HeaderHandler.d.ts +0 -2
  285. package/dist/lib/service/automation/handlers/HeaderHandler.js +0 -32
  286. package/dist/lib/service/automation/handlers/SearchHandler.d.ts +0 -11
  287. package/dist/lib/service/automation/handlers/SearchHandler.js +0 -278
  288. package/dist/lib/service/snippet/SnippetFactory.d.ts +0 -101
  289. package/dist/lib/service/snippet/SnippetFactory.js +0 -145
  290. package/dist/lib/service/snippet/SnippetInstaller.d.ts +0 -91
  291. package/dist/lib/service/snippet/SnippetInstaller.js +0 -276
  292. package/dist/lib/service/snippet/codecs/SnippetCodec.d.ts +0 -44
  293. package/dist/lib/service/snippet/codecs/SnippetCodec.js +0 -35
  294. package/dist/lib/service/snippet/codecs/VSCodeCodec.d.ts +0 -27
  295. package/dist/lib/service/snippet/codecs/VSCodeCodec.js +0 -82
  296. package/dist/lib/service/task/TaskGraphService.d.ts +0 -222
  297. package/dist/lib/service/task/TaskGraphService.js +0 -597
  298. package/dist/lib/service/task/TaskKnowledgeBridge.d.ts +0 -95
  299. package/dist/lib/service/task/TaskKnowledgeBridge.js +0 -298
  300. package/dist/lib/service/task/TaskReadyEngine.d.ts +0 -84
  301. package/dist/lib/service/task/TaskReadyEngine.js +0 -115
  302. package/dist/scripts/build-native-ui.d.ts +0 -3
  303. package/dist/scripts/build-native-ui.js +0 -62
  304. package/dist/scripts/init-snippets.d.ts +0 -30
  305. package/dist/scripts/init-snippets.js +0 -298
  306. package/dist/scripts/install-full.d.ts +0 -7
  307. package/dist/scripts/install-full.js +0 -38
  308. package/resources/native-ui/README.md +0 -29
  309. package/resources/native-ui/combined-window.swift +0 -494
  310. package/resources/native-ui/main.swift +0 -598
  311. package/scripts/postinstall-safe.mjs +0 -89
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Audit Log API 路由
3
+ *
4
+ * 端点:
5
+ * GET /api/v1/audit — 查询审计日志
6
+ */
7
+ import express from 'express';
8
+ import { getServiceContainer } from '../../injection/ServiceContainer.js';
9
+ const router = express.Router();
10
+ /**
11
+ * GET /api/v1/audit
12
+ * 查询审计日志,支持按 actor/action/result/时间范围过滤
13
+ *
14
+ * Query params:
15
+ * actor — 操作人过滤
16
+ * action — 操作类型过滤
17
+ * result — 结果过滤 (success|failure)
18
+ * startDate — 起始时间戳 (毫秒)
19
+ * endDate — 结束时间戳 (毫秒)
20
+ * limit — 返回条数上限 (默认 100, 最大 500)
21
+ */
22
+ router.get('/', async (req, res) => {
23
+ try {
24
+ const container = getServiceContainer();
25
+ const auditStore = container.get('auditStore');
26
+ if (!auditStore) {
27
+ res.status(503).json({
28
+ success: false,
29
+ error: { code: 'SERVICE_UNAVAILABLE', message: 'AuditStore not available' },
30
+ });
31
+ return;
32
+ }
33
+ const limit = Math.min(Number(req.query.limit) || 100, 500);
34
+ const logs = auditStore.query({
35
+ actor: req.query.actor,
36
+ action: req.query.action,
37
+ result: req.query.result,
38
+ startDate: req.query.startDate ? Number(req.query.startDate) : undefined,
39
+ endDate: req.query.endDate ? Number(req.query.endDate) : undefined,
40
+ limit,
41
+ });
42
+ res.json({ success: true, data: { logs, total: logs.length } });
43
+ }
44
+ catch (err) {
45
+ res.status(500).json({
46
+ success: false,
47
+ error: { code: 'AUDIT_ERROR', message: err.message },
48
+ });
49
+ }
50
+ });
51
+ export default router;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Commands API 路由
3
- * 执行 Install (同步 Snippet 到 IDE)、SPM Map 刷新、Embed (重建索引) 等命令
3
+ * 执行 Module Map 刷新、Embed (重建索引) 等命令
4
4
  */
5
5
  declare const router: import("express-serve-static-core").Router;
6
6
  export default router;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Commands API 路由
3
- * 执行 Install (同步 Snippet 到 IDE)、SPM Map 刷新、Embed (重建索引) 等命令
3
+ * 执行 Module Map 刷新、Embed (重建索引) 等命令
4
4
  */
5
5
  import express from 'express';
6
6
  import Logger from '../../infrastructure/logging/Logger.js';
@@ -9,56 +9,6 @@ import { FileReadQuery, FileSaveBody } from '../../shared/schemas/http-requests.
9
9
  import { validate, validateQuery } from '../middleware/validate.js';
10
10
  const router = express.Router();
11
11
  const logger = Logger.getInstance();
12
- /**
13
- * POST /api/v1/commands/install
14
- * 从 Recipe 生成并同步 Snippet 到 IDE
15
- * Body: { target?: 'xcode' | 'vscode' | 'all' }
16
- */
17
- router.post('/install', async (req, res) => {
18
- const container = getServiceContainer();
19
- const knowledgeRepository = container.get('knowledgeRepository');
20
- const target = req.body?.target || 'all';
21
- // 获取所有活跃 Recipe(V3: lifecycle='active' 即 Recipe)
22
- const result = await knowledgeRepository.findWithPagination({ lifecycle: 'active' }, { page: 1, pageSize: 9999 });
23
- const recipes = (result?.data ??
24
- result?.items ??
25
- [])
26
- .map((r) => ({
27
- id: r.id,
28
- title: r.title,
29
- trigger: r.trigger,
30
- code: r.content?.pattern || '',
31
- description: r.description || r.summaryCn || '',
32
- language: r.language || 'unknown',
33
- }))
34
- .filter((r) => String(r.code).trim().length > 0);
35
- const installResults = {};
36
- // Xcode
37
- if ((target === 'all' || target === 'xcode') && process.platform === 'darwin') {
38
- try {
39
- const xcodeInstaller = container.get('snippetInstaller');
40
- installResults.xcode = xcodeInstaller.installFromRecipes(recipes);
41
- }
42
- catch (e) {
43
- installResults.xcode = { success: false, error: e.message };
44
- }
45
- }
46
- // VSCode
47
- if (target === 'all' || target === 'vscode') {
48
- try {
49
- const vscodeInstaller = container.get('vscodeSnippetInstaller');
50
- installResults.vscode = vscodeInstaller.installFromRecipes(recipes);
51
- }
52
- catch (e) {
53
- installResults.vscode = { success: false, error: e.message };
54
- }
55
- }
56
- logger.info('Snippets installed via dashboard', { target, results: installResults });
57
- res.json({
58
- success: true,
59
- data: installResults,
60
- });
61
- });
62
12
  /**
63
13
  * POST /api/v1/commands/spm-map
64
14
  * 执行 SPM 依赖映射刷新(向后兼容)
@@ -126,24 +76,9 @@ router.post('/embed', async (req, res) => {
126
76
  router.get('/status', async (req, res) => {
127
77
  const container = getServiceContainer();
128
78
  const status = {
129
- snippets: { xcode: { synced: false }, vscode: { synced: false } },
130
79
  index: { ready: false },
131
80
  spmMap: { available: false },
132
81
  };
133
- try {
134
- const snippetInstaller = container.get('snippetInstaller');
135
- status.snippets.xcode.synced = (await snippetInstaller.listInstalled?.())?.length > 0;
136
- }
137
- catch {
138
- /* ignore */
139
- }
140
- try {
141
- const vscodeInstaller = container.get('vscodeSnippetInstaller');
142
- status.snippets.vscode.synced = (await vscodeInstaller.listInstalled?.())?.length > 0;
143
- }
144
- catch {
145
- /* ignore */
146
- }
147
82
  try {
148
83
  const indexingPipeline = container.get('indexingPipeline');
149
84
  status.index.ready = true; // IndexingPipeline is available
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Guard Report API 路由
3
+ *
4
+ * 端点:
5
+ * GET /api/v1/guard/report — 项目合规性报告(ComplianceReporter + Uncertainty)
6
+ * GET /api/v1/guard/report/reverse — ReverseGuard 反向验证
7
+ * GET /api/v1/guard/report/coverage — CoverageAnalyzer 覆盖率矩阵
8
+ */
9
+ declare const router: import("express-serve-static-core").Router;
10
+ export default router;
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Guard Report API 路由
3
+ *
4
+ * 端点:
5
+ * GET /api/v1/guard/report — 项目合规性报告(ComplianceReporter + Uncertainty)
6
+ * GET /api/v1/guard/report/reverse — ReverseGuard 反向验证
7
+ * GET /api/v1/guard/report/coverage — CoverageAnalyzer 覆盖率矩阵
8
+ */
9
+ import express from 'express';
10
+ import { getServiceContainer } from '../../injection/ServiceContainer.js';
11
+ import { resolveProjectRoot } from '../../shared/resolveProjectRoot.js';
12
+ const router = express.Router();
13
+ /**
14
+ * GET /api/v1/guard/report
15
+ * 生成完整的合规性报告,含 uncertain/coverage/confidence
16
+ *
17
+ * Query params:
18
+ * minScore — 最低通过分数 (默认 60)
19
+ * maxErrors — 最大错误数 (默认 0)
20
+ * maxFiles — 扫描文件上限
21
+ */
22
+ router.get('/', async (req, res) => {
23
+ try {
24
+ const container = getServiceContainer();
25
+ const complianceReporter = container.get('complianceReporter');
26
+ if (!complianceReporter) {
27
+ res.status(503).json({
28
+ success: false,
29
+ error: { code: 'SERVICE_UNAVAILABLE', message: 'ComplianceReporter not available' },
30
+ });
31
+ return;
32
+ }
33
+ const projectRoot = resolveProjectRoot(container);
34
+ const qualityGate = {
35
+ minScore: req.query.minScore ? Number(req.query.minScore) : undefined,
36
+ maxErrors: req.query.maxErrors ? Number(req.query.maxErrors) : undefined,
37
+ };
38
+ const maxFiles = req.query.maxFiles ? Number(req.query.maxFiles) : undefined;
39
+ const report = await complianceReporter.generate(projectRoot, {
40
+ qualityGate,
41
+ maxFiles,
42
+ });
43
+ res.json({ success: true, data: report });
44
+ }
45
+ catch (err) {
46
+ res.status(500).json({
47
+ success: false,
48
+ error: { code: 'GUARD_REPORT_ERROR', message: err.message },
49
+ });
50
+ }
51
+ });
52
+ /**
53
+ * GET /api/v1/guard/report/reverse
54
+ * ReverseGuard — Recipe→Code 反向验证
55
+ *
56
+ * Query params:
57
+ * maxFiles — 扫描文件上限 (默认 200)
58
+ */
59
+ router.get('/reverse', async (req, res) => {
60
+ try {
61
+ const container = getServiceContainer();
62
+ const projectRoot = resolveProjectRoot(container);
63
+ const { ReverseGuard } = await import('../../service/guard/ReverseGuard.js');
64
+ const { collectSourceFilesWithContent } = await import('../../service/guard/SourceFileCollector.js');
65
+ let reverseGuard;
66
+ try {
67
+ reverseGuard = container.get('reverseGuard');
68
+ }
69
+ catch {
70
+ const db = container.get('database');
71
+ reverseGuard = new ReverseGuard(db.getDb());
72
+ }
73
+ const maxFiles = req.query.maxFiles ? Number(req.query.maxFiles) : 200;
74
+ const projectFiles = await collectSourceFilesWithContent(projectRoot, { maxFiles });
75
+ const results = reverseGuard.auditAllRules(projectFiles);
76
+ const drifts = reverseGuard.getDriftResults(results);
77
+ res.json({
78
+ success: true,
79
+ data: {
80
+ totalRecipes: results.length,
81
+ healthy: results.filter((r) => r.recommendation === 'healthy').length,
82
+ investigate: results.filter((r) => r.recommendation === 'investigate').length,
83
+ decay: results.filter((r) => r.recommendation === 'decay').length,
84
+ drifts,
85
+ allResults: results.map((r) => ({
86
+ recipeId: r.recipeId,
87
+ title: r.title,
88
+ recommendation: r.recommendation,
89
+ signalCount: r.signals.length,
90
+ })),
91
+ },
92
+ });
93
+ }
94
+ catch (err) {
95
+ res.status(500).json({
96
+ success: false,
97
+ error: { code: 'REVERSE_GUARD_ERROR', message: err.message },
98
+ });
99
+ }
100
+ });
101
+ /**
102
+ * GET /api/v1/guard/report/coverage
103
+ * CoverageAnalyzer — 模块覆盖率矩阵
104
+ */
105
+ router.get('/coverage', async (_req, res) => {
106
+ try {
107
+ const container = getServiceContainer();
108
+ const { CoverageAnalyzer } = await import('../../service/guard/CoverageAnalyzer.js');
109
+ let analyzer;
110
+ try {
111
+ analyzer = container.get('coverageAnalyzer');
112
+ }
113
+ catch {
114
+ const db = container.get('database');
115
+ analyzer = new CoverageAnalyzer(db.getDb());
116
+ }
117
+ // 从 Panorama 或目录结构获取模块文件
118
+ const moduleFiles = new Map();
119
+ try {
120
+ const panorama = container.get('panoramaService');
121
+ const overview = panorama.getOverview();
122
+ if (overview?.modules) {
123
+ for (const mod of overview.modules) {
124
+ if (mod.files?.length > 0) {
125
+ moduleFiles.set(mod.name, mod.files);
126
+ }
127
+ }
128
+ }
129
+ }
130
+ catch {
131
+ /* PanoramaService not available */
132
+ }
133
+ const matrix = analyzer.analyze(moduleFiles);
134
+ res.json({ success: true, data: matrix });
135
+ }
136
+ catch (err) {
137
+ res.status(500).json({
138
+ success: false,
139
+ error: { code: 'COVERAGE_ANALYZER_ERROR', message: err.message },
140
+ });
141
+ }
142
+ });
143
+ export default router;
@@ -109,6 +109,37 @@ router.get('/stats', async (req, res) => {
109
109
  const stats = await knowledgeService.getStats();
110
110
  res.json({ success: true, data: stats });
111
111
  });
112
+ /**
113
+ * GET /api/v1/knowledge/lifecycle
114
+ * 获取六态生命周期统计 + 各状态条目列表
115
+ */
116
+ router.get('/lifecycle', async (req, res) => {
117
+ const container = getServiceContainer();
118
+ const knowledgeService = container.get('knowledgeService');
119
+ const stats = await knowledgeService.getStats();
120
+ const states = ['pending', 'staging', 'active', 'evolving', 'decaying', 'deprecated'];
121
+ const lifecycle = {
122
+ counts: {},
123
+ entries: {},
124
+ };
125
+ const counts = lifecycle.counts;
126
+ for (const state of states) {
127
+ counts[state] = stats?.[state] ?? 0;
128
+ }
129
+ // 仅对过渡态(staging / evolving / decaying)返回条目详情
130
+ const transitionalStates = ['staging', 'evolving', 'decaying'];
131
+ const entries = lifecycle.entries;
132
+ for (const state of transitionalStates) {
133
+ if (counts[state] > 0) {
134
+ const result = await knowledgeService.list({ lifecycle: state }, { page: 1, pageSize: 20 });
135
+ entries[state] = result.items ?? [];
136
+ }
137
+ else {
138
+ entries[state] = [];
139
+ }
140
+ }
141
+ res.json({ success: true, data: lifecycle });
142
+ });
112
143
  /**
113
144
  * GET /api/v1/knowledge/:id
114
145
  * 获取知识条目详情
@@ -160,7 +191,7 @@ router.delete('/:id', requirePermission('knowledge', 'delete'), async (req, res)
160
191
  const result = await knowledgeService.delete(id, context);
161
192
  res.json({ success: true, data: result });
162
193
  });
163
- /* ═══ 生命周期操作(3 状态: pending / active / deprecated)═══ */
194
+ /* ═══ 生命周期操作(6 态: pending / staging / active / evolving / decaying / deprecated)═══ */
164
195
  /**
165
196
  * PATCH /api/v1/knowledge/:id/publish
166
197
  * 发布 (pending → active) — 仅开发者
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Panorama API 路由
3
+ *
4
+ * 端点:
5
+ * GET /api/v1/panorama — 项目全景概览
6
+ * GET /api/v1/panorama/health — 全景健康度
7
+ * GET /api/v1/panorama/gaps — 知识空白区
8
+ * GET /api/v1/panorama/module/:name — 单模块详情
9
+ */
10
+ declare const router: import("express-serve-static-core").Router;
11
+ export default router;
@@ -0,0 +1,322 @@
1
+ /**
2
+ * Panorama API 路由
3
+ *
4
+ * 端点:
5
+ * GET /api/v1/panorama — 项目全景概览
6
+ * GET /api/v1/panorama/health — 全景健康度
7
+ * GET /api/v1/panorama/gaps — 知识空白区
8
+ * GET /api/v1/panorama/module/:name — 单模块详情
9
+ */
10
+ import express from 'express';
11
+ import { getServiceContainer } from '../../injection/ServiceContainer.js';
12
+ const router = express.Router();
13
+ /**
14
+ * GET /api/v1/panorama
15
+ * 返回项目全景概览(层级、模块、覆盖率)
16
+ */
17
+ router.get('/', async (_req, res) => {
18
+ try {
19
+ const container = getServiceContainer();
20
+ const panoramaService = container.get('panoramaService');
21
+ if (!panoramaService) {
22
+ res.status(503).json({
23
+ success: false,
24
+ error: { code: 'SERVICE_UNAVAILABLE', message: 'PanoramaService not available' },
25
+ });
26
+ return;
27
+ }
28
+ if (typeof panoramaService.ensureData === 'function') {
29
+ await panoramaService.ensureData();
30
+ }
31
+ const overview = panoramaService.getOverview();
32
+ res.json({ success: true, data: overview });
33
+ }
34
+ catch (err) {
35
+ res.status(500).json({
36
+ success: false,
37
+ error: { code: 'PANORAMA_ERROR', message: err.message },
38
+ });
39
+ }
40
+ });
41
+ /**
42
+ * GET /api/v1/panorama/health
43
+ * 返回全景健康度评分
44
+ */
45
+ router.get('/health', async (_req, res) => {
46
+ try {
47
+ const container = getServiceContainer();
48
+ const panoramaService = container.get('panoramaService');
49
+ if (!panoramaService) {
50
+ res.status(503).json({
51
+ success: false,
52
+ error: { code: 'SERVICE_UNAVAILABLE', message: 'PanoramaService not available' },
53
+ });
54
+ return;
55
+ }
56
+ if (typeof panoramaService.ensureData === 'function') {
57
+ await panoramaService.ensureData();
58
+ }
59
+ const health = panoramaService.getHealth();
60
+ res.json({ success: true, data: health });
61
+ }
62
+ catch (err) {
63
+ res.status(500).json({
64
+ success: false,
65
+ error: { code: 'PANORAMA_ERROR', message: err.message },
66
+ });
67
+ }
68
+ });
69
+ /**
70
+ * GET /api/v1/panorama/gaps
71
+ * 返回知识空白区列表
72
+ */
73
+ router.get('/gaps', async (_req, res) => {
74
+ try {
75
+ const container = getServiceContainer();
76
+ const panoramaService = container.get('panoramaService');
77
+ if (!panoramaService) {
78
+ res.status(503).json({
79
+ success: false,
80
+ error: { code: 'SERVICE_UNAVAILABLE', message: 'PanoramaService not available' },
81
+ });
82
+ return;
83
+ }
84
+ if (typeof panoramaService.ensureData === 'function') {
85
+ await panoramaService.ensureData();
86
+ }
87
+ const gaps = panoramaService.getGaps();
88
+ res.json({ success: true, data: gaps });
89
+ }
90
+ catch (err) {
91
+ res.status(500).json({
92
+ success: false,
93
+ error: { code: 'PANORAMA_ERROR', message: err.message },
94
+ });
95
+ }
96
+ });
97
+ /**
98
+ * GET /api/v1/panorama/coverage
99
+ * 返回各模块知识覆盖率热力图数据
100
+ */
101
+ router.get('/coverage', async (_req, res) => {
102
+ try {
103
+ const container = getServiceContainer();
104
+ const panoramaService = container.get('panoramaService');
105
+ if (!panoramaService) {
106
+ res.status(503).json({
107
+ success: false,
108
+ error: { code: 'SERVICE_UNAVAILABLE', message: 'PanoramaService not available' },
109
+ });
110
+ return;
111
+ }
112
+ if (typeof panoramaService.ensureData === 'function') {
113
+ await panoramaService.ensureData();
114
+ }
115
+ const overview = panoramaService.getOverview();
116
+ const gaps = panoramaService.getGaps?.() ?? [];
117
+ // 构建模块级覆盖率数据:从 overview.layers 中提取每个模块的文件数和 recipe 数
118
+ const modules = [];
119
+ for (const layer of overview.layers || []) {
120
+ const layerModules = layer.modules || [];
121
+ for (const mod of layerModules) {
122
+ const fileCount = mod.fileCount || 0;
123
+ const recipeCount = mod.recipeCount || 0;
124
+ const coverage = fileCount > 0 ? Math.round((recipeCount / fileCount) * 100) : 0;
125
+ modules.push({
126
+ name: mod.name || 'unknown',
127
+ layer: layer.name,
128
+ fileCount,
129
+ recipeCount,
130
+ coverage: Math.min(coverage, 100),
131
+ });
132
+ }
133
+ }
134
+ // 按覆盖率升序(低覆盖在前,方便高亮)
135
+ modules.sort((a, b) => a.coverage - b.coverage);
136
+ // 空白区按维度聚合
137
+ const gapsByDimension = {};
138
+ for (const gap of gaps) {
139
+ const dim = gap.dimensionName || 'unknown';
140
+ gapsByDimension[dim] = (gapsByDimension[dim] || 0) + 1;
141
+ }
142
+ res.json({
143
+ success: true,
144
+ data: {
145
+ modules,
146
+ gapsByDimension,
147
+ overallCoverage: overview.overallCoverage ?? 0,
148
+ totalFiles: overview.totalFiles ?? 0,
149
+ totalRecipes: overview.totalRecipes ?? 0,
150
+ },
151
+ });
152
+ }
153
+ catch (err) {
154
+ res.status(500).json({
155
+ success: false,
156
+ error: { code: 'PANORAMA_ERROR', message: err.message },
157
+ });
158
+ }
159
+ });
160
+ /**
161
+ * GET /api/v1/panorama/module/:name
162
+ * 返回单模块详情
163
+ */
164
+ router.get('/module/:name', async (req, res) => {
165
+ try {
166
+ const container = getServiceContainer();
167
+ const panoramaService = container.get('panoramaService');
168
+ if (!panoramaService) {
169
+ res.status(503).json({
170
+ success: false,
171
+ error: { code: 'SERVICE_UNAVAILABLE', message: 'PanoramaService not available' },
172
+ });
173
+ return;
174
+ }
175
+ if (typeof panoramaService.ensureData === 'function') {
176
+ await panoramaService.ensureData();
177
+ }
178
+ const detail = panoramaService.getModule(req.params.name);
179
+ if (!detail) {
180
+ res.status(404).json({
181
+ success: false,
182
+ error: { code: 'MODULE_NOT_FOUND', message: `Module "${req.params.name}" not found` },
183
+ });
184
+ return;
185
+ }
186
+ res.json({ success: true, data: detail });
187
+ }
188
+ catch (err) {
189
+ res.status(500).json({
190
+ success: false,
191
+ error: { code: 'PANORAMA_ERROR', message: err.message },
192
+ });
193
+ }
194
+ });
195
+ /* ═══ 治理 (Governance) ═══════════════════════════════════════ */
196
+ /**
197
+ * POST /api/v1/panorama/governance/cycle
198
+ * 执行完整治理周期(矛盾检测 + 冗余分析 + 衰退扫描)
199
+ */
200
+ router.post('/governance/cycle', async (_req, res) => {
201
+ try {
202
+ const container = getServiceContainer();
203
+ const metabolism = container.get('knowledgeMetabolism');
204
+ if (!metabolism) {
205
+ res.status(503).json({
206
+ success: false,
207
+ error: { code: 'SERVICE_UNAVAILABLE', message: 'KnowledgeMetabolism not available' },
208
+ });
209
+ return;
210
+ }
211
+ const report = metabolism.runFullCycle();
212
+ res.json({ success: true, data: report });
213
+ }
214
+ catch (err) {
215
+ res.status(500).json({
216
+ success: false,
217
+ error: { code: 'GOVERNANCE_ERROR', message: err.message },
218
+ });
219
+ }
220
+ });
221
+ /**
222
+ * GET /api/v1/panorama/governance/decay
223
+ * 获取衰退评估报告
224
+ */
225
+ router.get('/governance/decay', async (_req, res) => {
226
+ try {
227
+ const container = getServiceContainer();
228
+ const decayDetector = container.get('decayDetector');
229
+ if (!decayDetector) {
230
+ res.status(503).json({
231
+ success: false,
232
+ error: { code: 'SERVICE_UNAVAILABLE', message: 'DecayDetector not available' },
233
+ });
234
+ return;
235
+ }
236
+ const results = decayDetector.scanAll();
237
+ res.json({ success: true, data: { results } });
238
+ }
239
+ catch (err) {
240
+ res.status(500).json({
241
+ success: false,
242
+ error: { code: 'GOVERNANCE_ERROR', message: err.message },
243
+ });
244
+ }
245
+ });
246
+ /**
247
+ * POST /api/v1/panorama/governance/staging-check
248
+ * 检查 staging 条目并自动发布到期的
249
+ */
250
+ router.post('/governance/staging-check', async (_req, res) => {
251
+ try {
252
+ const container = getServiceContainer();
253
+ const stagingManager = container.get('stagingManager');
254
+ if (!stagingManager) {
255
+ res.status(503).json({
256
+ success: false,
257
+ error: { code: 'SERVICE_UNAVAILABLE', message: 'StagingManager not available' },
258
+ });
259
+ return;
260
+ }
261
+ const checkResult = stagingManager.checkAndPromote();
262
+ const currentStaging = stagingManager.listStaging();
263
+ res.json({ success: true, data: { checkResult, currentStaging } });
264
+ }
265
+ catch (err) {
266
+ res.status(500).json({
267
+ success: false,
268
+ error: { code: 'GOVERNANCE_ERROR', message: err.message },
269
+ });
270
+ }
271
+ });
272
+ /**
273
+ * GET /api/v1/panorama/governance/staging
274
+ * 获取当前 staging 列表(只读)
275
+ */
276
+ router.get('/governance/staging', async (_req, res) => {
277
+ try {
278
+ const container = getServiceContainer();
279
+ const stagingManager = container.get('stagingManager');
280
+ if (!stagingManager) {
281
+ res.status(503).json({
282
+ success: false,
283
+ error: { code: 'SERVICE_UNAVAILABLE', message: 'StagingManager not available' },
284
+ });
285
+ return;
286
+ }
287
+ const entries = stagingManager.listStaging();
288
+ res.json({ success: true, data: { entries } });
289
+ }
290
+ catch (err) {
291
+ res.status(500).json({
292
+ success: false,
293
+ error: { code: 'GOVERNANCE_ERROR', message: err.message },
294
+ });
295
+ }
296
+ });
297
+ /**
298
+ * GET /api/v1/panorama/governance/enhancements
299
+ * 获取增强建议
300
+ */
301
+ router.get('/governance/enhancements', async (_req, res) => {
302
+ try {
303
+ const container = getServiceContainer();
304
+ const suggester = container.get('enhancementSuggester');
305
+ if (!suggester) {
306
+ res.status(503).json({
307
+ success: false,
308
+ error: { code: 'SERVICE_UNAVAILABLE', message: 'EnhancementSuggester not available' },
309
+ });
310
+ return;
311
+ }
312
+ const suggestions = suggester.analyzeAll();
313
+ res.json({ success: true, data: { suggestions } });
314
+ }
315
+ catch (err) {
316
+ res.status(500).json({
317
+ success: false,
318
+ error: { code: 'GOVERNANCE_ERROR', message: err.message },
319
+ });
320
+ }
321
+ });
322
+ export default router;