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,68 @@
1
+ /**
2
+ * HitRecorder — 批量使用信号采集器
3
+ *
4
+ * Phase 0 核心服务。将高频使用事件(Guard 命中、搜索命中、采用等)
5
+ * 先写入内存 buffer,定时批量持久化到 Stats JSON,同时发射 SignalBus 信号。
6
+ *
7
+ * 设计要点:
8
+ * - 即时 emit Signal(信号不延迟)
9
+ * - buffer → 30s flush → 批量 UPDATE(减少 SQLite 写)
10
+ * - shutdown hook 保证进程退出前数据落盘
11
+ *
12
+ * @module service/signal/HitRecorder
13
+ */
14
+ import type { SignalBus } from '#infra/signal/SignalBus.js';
15
+ /** better-sqlite3 兼容类型(与 GuardCheckEngine 相同模式) */
16
+ interface DatabaseLike {
17
+ prepare(sql: string): {
18
+ run(...params: unknown[]): unknown;
19
+ };
20
+ }
21
+ /** 支持的命中事件类型 */
22
+ export type HitEventType = 'guardHit' | 'searchHit' | 'view' | 'adoption' | 'application';
23
+ /** HitRecorder 配置 */
24
+ export interface HitRecorderConfig {
25
+ /** flush 间隔(ms),默认 30000 */
26
+ flushIntervalMs?: number;
27
+ /** 立即 flush 的最大缓冲条目数,默认 100 */
28
+ maxBufferSize?: number;
29
+ }
30
+ export declare class HitRecorder {
31
+ #private;
32
+ constructor(bus: SignalBus, db: DatabaseLike | {
33
+ getDb(): DatabaseLike;
34
+ }, config?: HitRecorderConfig);
35
+ /**
36
+ * 启动定时 flush。通常在服务初始化时调用。
37
+ */
38
+ start(): void;
39
+ /**
40
+ * 停止定时 flush 并执行最后一次 flush。
41
+ * 供 shutdown hook 调用。
42
+ */
43
+ stop(): Promise<void>;
44
+ /**
45
+ * 记录一次命中事件。
46
+ *
47
+ * 1. 立即通过 SignalBus 发射信号(信号不延迟)
48
+ * 2. 事件写入内存 buffer,等待 flush 批量持久化
49
+ *
50
+ * @param recipeId 关联的知识条目 ID
51
+ * @param eventType 事件类型
52
+ * @param value 信号强度 0-1(默认 1)
53
+ * @param metadata 附加元数据
54
+ */
55
+ record(recipeId: string, eventType: HitEventType, value?: number, metadata?: Record<string, unknown>): void;
56
+ /**
57
+ * 批量持久化 buffer 到数据库。
58
+ * 使用 json_set 原子更新 Stats JSON 中对应字段。
59
+ */
60
+ flush(): Promise<number>;
61
+ /** 当前 buffer 中的条目数(诊断用) */
62
+ get bufferSize(): number;
63
+ /** 累计记录次数 */
64
+ get totalRecorded(): number;
65
+ /** 累计已持久化次数 */
66
+ get totalFlushed(): number;
67
+ }
68
+ export {};
@@ -0,0 +1,173 @@
1
+ /**
2
+ * HitRecorder — 批量使用信号采集器
3
+ *
4
+ * Phase 0 核心服务。将高频使用事件(Guard 命中、搜索命中、采用等)
5
+ * 先写入内存 buffer,定时批量持久化到 Stats JSON,同时发射 SignalBus 信号。
6
+ *
7
+ * 设计要点:
8
+ * - 即时 emit Signal(信号不延迟)
9
+ * - buffer → 30s flush → 批量 UPDATE(减少 SQLite 写)
10
+ * - shutdown hook 保证进程退出前数据落盘
11
+ *
12
+ * @module service/signal/HitRecorder
13
+ */
14
+ /** 事件类型 → Stats JSON 字段 映射 */
15
+ const EVENT_TO_STATS_FIELD = {
16
+ guardHit: 'guardHits',
17
+ searchHit: 'searchHits',
18
+ view: 'views',
19
+ adoption: 'adoptions',
20
+ application: 'applications',
21
+ };
22
+ /** 事件类型 → SignalBus 信号类型 映射 */
23
+ const EVENT_TO_SIGNAL_TYPE = {
24
+ guardHit: 'guard',
25
+ searchHit: 'search',
26
+ view: 'usage',
27
+ adoption: 'usage',
28
+ application: 'usage',
29
+ };
30
+ // ── HitRecorder ─────────────────────────────────────
31
+ export class HitRecorder {
32
+ #bus;
33
+ #db;
34
+ #buffer = new Map();
35
+ #flushIntervalMs;
36
+ #maxBufferSize;
37
+ #timer = null;
38
+ #totalRecorded = 0;
39
+ #totalFlushed = 0;
40
+ constructor(bus, db, config = {}) {
41
+ this.#bus = bus;
42
+ this.#db =
43
+ 'getDb' in db && typeof db.getDb === 'function'
44
+ ? db.getDb()
45
+ : db;
46
+ this.#flushIntervalMs = config.flushIntervalMs ?? 30_000;
47
+ this.#maxBufferSize = config.maxBufferSize ?? 100;
48
+ }
49
+ /**
50
+ * 启动定时 flush。通常在服务初始化时调用。
51
+ */
52
+ start() {
53
+ if (this.#timer) {
54
+ return;
55
+ }
56
+ this.#timer = setInterval(() => {
57
+ void this.flush();
58
+ }, this.#flushIntervalMs);
59
+ this.#timer.unref(); // 不阻止进程退出
60
+ }
61
+ /**
62
+ * 停止定时 flush 并执行最后一次 flush。
63
+ * 供 shutdown hook 调用。
64
+ */
65
+ async stop() {
66
+ if (this.#timer) {
67
+ clearInterval(this.#timer);
68
+ this.#timer = null;
69
+ }
70
+ await this.flush();
71
+ }
72
+ /**
73
+ * 记录一次命中事件。
74
+ *
75
+ * 1. 立即通过 SignalBus 发射信号(信号不延迟)
76
+ * 2. 事件写入内存 buffer,等待 flush 批量持久化
77
+ *
78
+ * @param recipeId 关联的知识条目 ID
79
+ * @param eventType 事件类型
80
+ * @param value 信号强度 0-1(默认 1)
81
+ * @param metadata 附加元数据
82
+ */
83
+ record(recipeId, eventType, value = 1, metadata = {}) {
84
+ this.#totalRecorded++;
85
+ // 1. 即时发射信号
86
+ this.#bus.send(EVENT_TO_SIGNAL_TYPE[eventType], `HitRecorder.${eventType}`, value, {
87
+ target: recipeId,
88
+ metadata: { ...metadata, eventType },
89
+ });
90
+ // 2. 聚合进 buffer
91
+ const key = `${recipeId}:${eventType}`;
92
+ const now = Date.now();
93
+ const existing = this.#buffer.get(key);
94
+ if (existing) {
95
+ existing.count++;
96
+ existing.lastAt = now;
97
+ }
98
+ else {
99
+ this.#buffer.set(key, {
100
+ recipeId,
101
+ eventType,
102
+ count: 1,
103
+ firstAt: now,
104
+ lastAt: now,
105
+ });
106
+ }
107
+ // 3. buffer 满时立即 flush
108
+ if (this.#buffer.size >= this.#maxBufferSize) {
109
+ void this.flush();
110
+ }
111
+ }
112
+ /**
113
+ * 批量持久化 buffer 到数据库。
114
+ * 使用 json_set 原子更新 Stats JSON 中对应字段。
115
+ */
116
+ async flush() {
117
+ if (this.#buffer.size === 0) {
118
+ return 0;
119
+ }
120
+ // 取出当前 buffer 并清空(后续 record 写入新 buffer)
121
+ const entries = [...this.#buffer.values()];
122
+ this.#buffer.clear();
123
+ let flushed = 0;
124
+ const now = Math.floor(Date.now() / 1000);
125
+ try {
126
+ const stmt = this.#db.prepare(`UPDATE knowledge_entries
127
+ SET stats = json_set(
128
+ COALESCE(stats, '{}'),
129
+ '$.' || ?,
130
+ COALESCE(json_extract(stats, '$.' || ?), 0) + ?
131
+ ),
132
+ updatedAt = ?
133
+ WHERE id = ?`);
134
+ for (const entry of entries) {
135
+ const field = EVENT_TO_STATS_FIELD[entry.eventType];
136
+ try {
137
+ stmt.run(field, field, entry.count, now, entry.recipeId);
138
+ flushed += entry.count;
139
+ }
140
+ catch {
141
+ // Recipe 可能已被删除,静默忽略
142
+ }
143
+ }
144
+ }
145
+ catch {
146
+ // DB statement prepare 失败(表可能不存在),回填 buffer
147
+ for (const entry of entries) {
148
+ const key = `${entry.recipeId}:${entry.eventType}`;
149
+ const existing = this.#buffer.get(key);
150
+ if (existing) {
151
+ existing.count += entry.count;
152
+ }
153
+ else {
154
+ this.#buffer.set(key, entry);
155
+ }
156
+ }
157
+ }
158
+ this.#totalFlushed += flushed;
159
+ return flushed;
160
+ }
161
+ /** 当前 buffer 中的条目数(诊断用) */
162
+ get bufferSize() {
163
+ return this.#buffer.size;
164
+ }
165
+ /** 累计记录次数 */
166
+ get totalRecorded() {
167
+ return this.#totalRecorded;
168
+ }
169
+ /** 累计已持久化次数 */
170
+ get totalFlushed() {
171
+ return this.#totalFlushed;
172
+ }
173
+ }
@@ -41,6 +41,7 @@ interface SignalCollectorOpts {
41
41
  database?: DatabaseLike | null;
42
42
  agentFactory?: AgentFactoryLike | null;
43
43
  container?: ContainerLike | null;
44
+ signalBus?: import('../../infrastructure/signal/SignalBus.js').SignalBus | null;
44
45
  mode?: string;
45
46
  intervalMs?: number;
46
47
  onSuggestions?: ((suggestions: Record<string, unknown>[]) => void) | null;
@@ -80,11 +81,12 @@ export declare class SignalCollector {
80
81
  * @param [opts.database] better-sqlite3 实例
81
82
  * @param [opts.agentFactory] AgentFactory 实例
82
83
  * @param [opts.container] ServiceContainer 实例
84
+ * @param [opts.signalBus] SignalBus 实例(实时信号订阅)
83
85
  * @param [opts.mode] 'off' | 'suggest' | 'auto'
84
86
  * @param [opts.intervalMs] 初始收集间隔(毫秒),后续由 AI 动态调整
85
87
  * @param [opts.onSuggestions] 新建议回调 (suggestions[]) => void
86
88
  */
87
- constructor({ projectRoot, database, agentFactory, container, mode, intervalMs, onSuggestions, }: SignalCollectorOpts);
89
+ constructor({ projectRoot, database, agentFactory, container, signalBus, mode, intervalMs, onSuggestions, }: SignalCollectorOpts);
88
90
  start(): void;
89
91
  stop(): void;
90
92
  /**
@@ -62,16 +62,19 @@ export class SignalCollector {
62
62
  #onSuggestions;
63
63
  /** 信号聚类引擎 */
64
64
  #aggregator;
65
+ /** 各维度最新信号快照(由 SignalBus 实时更新) */
66
+ #dimensionSignals = {};
65
67
  /**
66
68
  * @param opts.projectRoot 用户项目根目录
67
69
  * @param [opts.database] better-sqlite3 实例
68
70
  * @param [opts.agentFactory] AgentFactory 实例
69
71
  * @param [opts.container] ServiceContainer 实例
72
+ * @param [opts.signalBus] SignalBus 实例(实时信号订阅)
70
73
  * @param [opts.mode] 'off' | 'suggest' | 'auto'
71
74
  * @param [opts.intervalMs] 初始收集间隔(毫秒),后续由 AI 动态调整
72
75
  * @param [opts.onSuggestions] 新建议回调 (suggestions[]) => void
73
76
  */
74
- constructor({ projectRoot, database = null, agentFactory = null, container = null, mode = 'auto', intervalMs = DEFAULT_INTERVAL_MS, onSuggestions = null, }) {
77
+ constructor({ projectRoot, database = null, agentFactory = null, container = null, signalBus = null, mode = 'auto', intervalMs = DEFAULT_INTERVAL_MS, onSuggestions = null, }) {
75
78
  this.#projectRoot = projectRoot;
76
79
  this.#db = database;
77
80
  this.#agentFactory = agentFactory;
@@ -94,6 +97,12 @@ export class SignalCollector {
94
97
  this.#timer = setTimeout(() => this.#tick(), 3000); // 3 秒后执行,留出更多聚合时间
95
98
  }
96
99
  });
100
+ // Phase 2: 订阅 SignalBus 全量信号,维护维度快照
101
+ if (signalBus) {
102
+ signalBus.subscribe('*', (signal) => {
103
+ this.#updateDimension(signal);
104
+ });
105
+ }
97
106
  }
98
107
  // ═══════════════════════════════════════════════════════
99
108
  // 公共 API
@@ -144,6 +153,27 @@ export class SignalCollector {
144
153
  getSnapshot() {
145
154
  return { ...this.#snapshot };
146
155
  }
156
+ /** 由 SignalBus 实时更新的维度信号快照 */
157
+ #updateDimension(signal) {
158
+ switch (signal.type) {
159
+ case 'guard':
160
+ case 'guard_blind_spot':
161
+ this.#dimensionSignals.compliance = signal;
162
+ break;
163
+ case 'usage':
164
+ this.#dimensionSignals.adoption = signal;
165
+ break;
166
+ case 'quality':
167
+ this.#dimensionSignals.quality = signal;
168
+ break;
169
+ case 'decay':
170
+ this.#dimensionSignals.decay = signal;
171
+ break;
172
+ case 'lifecycle':
173
+ this.#dimensionSignals.evolution = signal;
174
+ break;
175
+ }
176
+ }
147
177
  getMode() {
148
178
  return this.#mode;
149
179
  }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * IntentExtractor — Intake Layer
3
+ *
4
+ * Pure functions: extract intent signals from user query + active file.
5
+ * Builds multi-query set, infers language/module/scenario for search routing.
6
+ *
7
+ * @module service/task/IntentExtractor
8
+ */
9
+ export type SearchScenario = 'lint' | 'generate' | 'search' | 'learning';
10
+ export interface ExtractedIntent {
11
+ /** Multi-query set: Q1 raw + Q2 tech terms + Q3 file context */
12
+ queries: string[];
13
+ /** Inferred language from activeFile or args */
14
+ language: string | null;
15
+ /** Inferred module path from activeFile */
16
+ module: string | null;
17
+ /** Search scenario for MultiSignalRanker routing */
18
+ scenario: SearchScenario;
19
+ /** Original inputs */
20
+ raw: {
21
+ userQuery: string;
22
+ activeFile?: string;
23
+ language?: string;
24
+ };
25
+ }
26
+ export interface TechTermOptions {
27
+ /** Project-specific class prefixes, e.g. ['BD', 'BBA', 'KS'] */
28
+ projectPrefixes?: string[];
29
+ /** Language/platform common prefixes, e.g. ObjC: ['UI', 'NS', 'CA', 'AV'] */
30
+ platformPrefixes?: string[];
31
+ }
32
+ /**
33
+ * Extract intent signals from user query and active file.
34
+ * Pure function — no side effects, no DI.
35
+ */
36
+ export declare function extract(userQuery: string, activeFile?: string, language?: string, termOpts?: TechTermOptions): ExtractedIntent;
37
+ /**
38
+ * Build multi-query set from user query + active file.
39
+ * Q1: raw query, Q2: extracted tech terms, Q3: file context.
40
+ */
41
+ export declare function buildQueries(userQuery: string, activeFile?: string, termOpts?: TechTermOptions): string[];
42
+ /**
43
+ * Extract tech terms from query using universal patterns + dynamic project prefixes.
44
+ */
45
+ export declare function extractTechTerms(query: string, opts?: TechTermOptions): string[];
46
+ /**
47
+ * Infer file context string from file path for search augmentation.
48
+ * Returns module path + class name, e.g. "Services/Network BDNetworkManager"
49
+ */
50
+ export declare function inferFileContext(filePath: string): string | null;
51
+ /**
52
+ * Infer language from file extension.
53
+ */
54
+ export declare function inferLanguage(filePath: string): string | null;
55
+ /**
56
+ * Classify search scenario from user query (lightweight rule-based).
57
+ */
58
+ export declare function classifyScenario(userQuery: string): SearchScenario;
@@ -0,0 +1,142 @@
1
+ /**
2
+ * IntentExtractor — Intake Layer
3
+ *
4
+ * Pure functions: extract intent signals from user query + active file.
5
+ * Builds multi-query set, infers language/module/scenario for search routing.
6
+ *
7
+ * @module service/task/IntentExtractor
8
+ */
9
+ // ── Universal Patterns (language-agnostic) ──────────
10
+ const UNIVERSAL_PATTERNS = [
11
+ /\b[A-Z][a-z]+(?:[A-Z][a-z]+)+\b/g, // CamelCase
12
+ /`([^`]+)`/g, // backtick code
13
+ /\b[\w-]+\.(?:ts|js|m|h|swift|py|java|go|rs|tsx|kt)\b/g, // file names
14
+ /@[\w-]+/g, // trigger references
15
+ ];
16
+ // ── Language Extension Map ──────────────────────────
17
+ const LANG_MAP = {
18
+ m: 'objectivec',
19
+ h: 'objectivec',
20
+ mm: 'objectivec',
21
+ swift: 'swift',
22
+ ts: 'typescript',
23
+ tsx: 'typescript',
24
+ js: 'javascript',
25
+ jsx: 'javascript',
26
+ py: 'python',
27
+ go: 'go',
28
+ rs: 'rust',
29
+ java: 'java',
30
+ kt: 'kotlin',
31
+ };
32
+ // ── Public API ──────────────────────────────────────
33
+ /**
34
+ * Extract intent signals from user query and active file.
35
+ * Pure function — no side effects, no DI.
36
+ */
37
+ export function extract(userQuery, activeFile, language, termOpts) {
38
+ const queries = buildQueries(userQuery, activeFile, termOpts);
39
+ const inferredLang = language || (activeFile ? inferLanguage(activeFile) : null);
40
+ const module = activeFile ? inferFileContext(activeFile) : null;
41
+ const scenario = classifyScenario(userQuery);
42
+ return {
43
+ queries,
44
+ language: inferredLang,
45
+ module,
46
+ scenario,
47
+ raw: { userQuery, activeFile, language },
48
+ };
49
+ }
50
+ /**
51
+ * Build multi-query set from user query + active file.
52
+ * Q1: raw query, Q2: extracted tech terms, Q3: file context.
53
+ */
54
+ export function buildQueries(userQuery, activeFile, termOpts) {
55
+ const queries = [userQuery];
56
+ const terms = extractTechTerms(userQuery, termOpts);
57
+ if (terms.length > 0) {
58
+ queries.push(terms.join(' '));
59
+ }
60
+ if (activeFile) {
61
+ const ctx = inferFileContext(activeFile);
62
+ if (ctx) {
63
+ queries.push(ctx);
64
+ }
65
+ }
66
+ return queries;
67
+ }
68
+ /**
69
+ * Extract tech terms from query using universal patterns + dynamic project prefixes.
70
+ */
71
+ export function extractTechTerms(query, opts = {}) {
72
+ const terms = new Set();
73
+ // 1. Universal patterns (always run)
74
+ for (const pattern of UNIVERSAL_PATTERNS) {
75
+ for (const match of query.matchAll(new RegExp(pattern.source, pattern.flags))) {
76
+ const term = match[1] || match[0];
77
+ if (term.length >= 3 && term.length <= 50) {
78
+ terms.add(term);
79
+ }
80
+ }
81
+ }
82
+ // 2. Project prefix patterns (dynamic)
83
+ const allPrefixes = [...(opts.projectPrefixes ?? []), ...(opts.platformPrefixes ?? [])];
84
+ const prefixPattern = buildPrefixPattern(allPrefixes);
85
+ if (prefixPattern) {
86
+ for (const match of query.matchAll(prefixPattern)) {
87
+ if (match[0].length >= 3 && match[0].length <= 50) {
88
+ terms.add(match[0]);
89
+ }
90
+ }
91
+ }
92
+ return [...terms].slice(0, 8);
93
+ }
94
+ /**
95
+ * Infer file context string from file path for search augmentation.
96
+ * Returns module path + class name, e.g. "Services/Network BDNetworkManager"
97
+ */
98
+ export function inferFileContext(filePath) {
99
+ const parts = filePath.replace(/\\/g, '/').split('/');
100
+ const fileName = parts[parts.length - 1] || '';
101
+ // Extract class name (remove extension)
102
+ const className = fileName.replace(/\.\w+$/, '');
103
+ // Extract meaningful module path (skip root dir and file name)
104
+ const meaningful = parts
105
+ .slice(1, -1)
106
+ .filter((p) => !['src', 'lib', 'Sources', 'BiliDili', 'BiliDemo'].includes(p));
107
+ const module = meaningful.slice(0, 2).join('/');
108
+ const segments = [module, className].filter(Boolean);
109
+ return segments.length > 0 ? segments.join(' ') : null;
110
+ }
111
+ /**
112
+ * Infer language from file extension.
113
+ */
114
+ export function inferLanguage(filePath) {
115
+ const ext = filePath.split('.').pop()?.toLowerCase();
116
+ return ext ? (LANG_MAP[ext] ?? null) : null;
117
+ }
118
+ /**
119
+ * Classify search scenario from user query (lightweight rule-based).
120
+ */
121
+ export function classifyScenario(userQuery) {
122
+ const q = userQuery.toLowerCase();
123
+ if (/帮我[加写做实现创建]|implement|add|create|新[增加建]/.test(q)) {
124
+ return 'generate';
125
+ }
126
+ if (/检查|review|lint|合规|违规|guard|规[则范]/.test(q)) {
127
+ return 'lint';
128
+ }
129
+ if (/什么是|怎么[用做]|原理|explain|学习|理解|为什么/.test(q)) {
130
+ return 'learning';
131
+ }
132
+ return 'search';
133
+ }
134
+ // ── Internal Helpers ────────────────────────────────
135
+ function buildPrefixPattern(prefixes) {
136
+ if (prefixes.length === 0) {
137
+ return null;
138
+ }
139
+ const sorted = [...prefixes].sort((a, b) => b.length - a.length);
140
+ const escaped = sorted.map((p) => p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
141
+ return new RegExp(`\\b(?:${escaped.join('|')})\\w{2,}\\b`, 'g');
142
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * PrimeSearchPipeline — Enrichment Layer
3
+ *
4
+ * Multi-query parallel search + scenario routing + session history accumulation.
5
+ * Replaces TaskKnowledgeBridge with full search pipeline integration.
6
+ *
7
+ * @module service/task/PrimeSearchPipeline
8
+ */
9
+ import type { SlimSearchResult } from '#service/search/SearchTypes.js';
10
+ import type { ExtractedIntent } from './IntentExtractor.js';
11
+ /** Slim search result (re-export for external use) */
12
+ export type { SlimSearchResult } from '#service/search/SearchTypes.js';
13
+ export interface PrimeSearchMeta {
14
+ queries: string[];
15
+ scenario: string;
16
+ language: string | null;
17
+ module: string | null;
18
+ resultCount: number;
19
+ filteredCount: number;
20
+ }
21
+ export interface PrimeSearchResult {
22
+ relatedKnowledge: SlimSearchResult[];
23
+ guardRules: SlimSearchResult[];
24
+ searchMeta: PrimeSearchMeta;
25
+ }
26
+ /** Minimal SearchEngine shape — duck-typed for DI flexibility */
27
+ interface SearchEngineLike {
28
+ search(query: string, options?: {
29
+ mode?: string;
30
+ limit?: number;
31
+ rank?: boolean;
32
+ context?: {
33
+ sessionHistory?: Array<{
34
+ content?: string;
35
+ }>;
36
+ language?: string;
37
+ intent?: string;
38
+ };
39
+ }): Promise<{
40
+ items?: unknown[];
41
+ }>;
42
+ }
43
+ export declare class PrimeSearchPipeline {
44
+ #private;
45
+ constructor(searchEngine: SearchEngineLike);
46
+ /**
47
+ * Core method: multi-query search + scenario routing + result merging.
48
+ */
49
+ search(intent: ExtractedIntent): Promise<PrimeSearchResult | null>;
50
+ /**
51
+ * Reset session history (called on new session start).
52
+ */
53
+ resetSession(): void;
54
+ }
@@ -0,0 +1,98 @@
1
+ /**
2
+ * PrimeSearchPipeline — Enrichment Layer
3
+ *
4
+ * Multi-query parallel search + scenario routing + session history accumulation.
5
+ * Replaces TaskKnowledgeBridge with full search pipeline integration.
6
+ *
7
+ * @module service/task/PrimeSearchPipeline
8
+ */
9
+ import { slimSearchResult } from '#service/search/SearchTypes.js';
10
+ // ── Constants ───────────────────────────────────────
11
+ const RELEVANCE_THRESHOLD = 0.44;
12
+ // ── PrimeSearchPipeline ─────────────────────────────
13
+ export class PrimeSearchPipeline {
14
+ #search;
15
+ #sessionQueries = [];
16
+ constructor(searchEngine) {
17
+ this.#search = searchEngine;
18
+ }
19
+ /**
20
+ * Core method: multi-query search + scenario routing + result merging.
21
+ */
22
+ async search(intent) {
23
+ if (!intent.queries.length || !intent.queries[0]?.trim()) {
24
+ return null;
25
+ }
26
+ // Build ranking context
27
+ const context = {
28
+ language: intent.language ?? undefined,
29
+ intent: intent.scenario,
30
+ sessionHistory: this.#buildSessionHistory(),
31
+ };
32
+ // Multi-query parallel search
33
+ const allResults = await this.#multiQuerySearch(intent.queries, context);
34
+ // Threshold filter
35
+ const filtered = allResults.filter((r) => (r.score ?? 0) >= RELEVANCE_THRESHOLD);
36
+ if (filtered.length === 0) {
37
+ return null;
38
+ }
39
+ // Classify: knowledge vs rules
40
+ const knowledge = filtered.filter((r) => r.kind !== 'rule').slice(0, 5);
41
+ const rules = filtered.filter((r) => r.kind === 'rule').slice(0, 3);
42
+ // Record search to session history
43
+ this.#sessionQueries.push(intent.raw.userQuery);
44
+ return {
45
+ relatedKnowledge: knowledge,
46
+ guardRules: rules,
47
+ searchMeta: {
48
+ queries: intent.queries,
49
+ scenario: intent.scenario,
50
+ language: intent.language,
51
+ module: intent.module,
52
+ resultCount: allResults.length,
53
+ filteredCount: filtered.length,
54
+ },
55
+ };
56
+ }
57
+ /**
58
+ * Reset session history (called on new session start).
59
+ */
60
+ resetSession() {
61
+ this.#sessionQueries = [];
62
+ }
63
+ // ── Private ───────────────────────────────────────
64
+ /**
65
+ * Multi-query parallel search + de-dup by ID (keep highest score).
66
+ */
67
+ async #multiQuerySearch(queries, context) {
68
+ const promises = queries.map((q) => this.#search
69
+ .search(q, {
70
+ mode: 'auto',
71
+ limit: 8,
72
+ rank: true,
73
+ context,
74
+ })
75
+ .catch(() => ({ items: [] })));
76
+ const responses = await Promise.all(promises);
77
+ // Merge by ID, keep highest score
78
+ const bestById = new Map();
79
+ for (const resp of responses) {
80
+ const items = resp.items || [];
81
+ for (const raw of items) {
82
+ const item = slimSearchResult(raw);
83
+ const existing = bestById.get(item.id);
84
+ if (!existing || item.score > existing.score) {
85
+ bestById.set(item.id, item);
86
+ }
87
+ }
88
+ }
89
+ // Sort by score descending
90
+ return [...bestById.values()].sort((a, b) => b.score - a.score);
91
+ }
92
+ /**
93
+ * Build sessionHistory for contextBoost (last 5 queries).
94
+ */
95
+ #buildSessionHistory() {
96
+ return this.#sessionQueries.slice(-5).map((q) => ({ content: q }));
97
+ }
98
+ }