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,154 @@
1
+ /**
2
+ * TemporaryToolRegistry — TTL 临时工具注册
3
+ *
4
+ * 在 ToolRegistry 之上增加 TTL 自动回收机制。
5
+ * 锻造的工具默认 30 分钟有效,到期自动从 ToolRegistry 中移除。
6
+ *
7
+ * 设计:
8
+ * - 装饰器模式,不修改 ToolRegistry 核心逻辑
9
+ * - 定期检查(60s 间隔)清理过期工具
10
+ * - 支持手动续期和提前回收
11
+ */
12
+ import Logger from '#infra/logging/Logger.js';
13
+ /* ────────────────────── Constants ────────────────────── */
14
+ const DEFAULT_TTL_MS = 30 * 60 * 1000; // 30 minutes
15
+ const CLEANUP_INTERVAL_MS = 60 * 1000; // 60 seconds
16
+ /* ────────────────────── Class ────────────────────── */
17
+ export class TemporaryToolRegistry {
18
+ #registry;
19
+ #tempTools = new Map();
20
+ #cleanupTimer = null;
21
+ #signalBus;
22
+ #logger = Logger.getInstance();
23
+ constructor(registry, options = {}) {
24
+ this.#registry = registry;
25
+ this.#signalBus = options.signalBus ?? null;
26
+ this.#startCleanup();
27
+ }
28
+ /**
29
+ * 注册一个临时工具
30
+ */
31
+ registerTemporary(tool, ttlMs = DEFAULT_TTL_MS) {
32
+ const now = Date.now();
33
+ const entry = {
34
+ ...tool,
35
+ registeredAt: now,
36
+ expiresAt: ttlMs > 0 ? now + ttlMs : 0,
37
+ };
38
+ // 如果已存在同名临时工具,先移除
39
+ if (this.#tempTools.has(tool.name)) {
40
+ this.revoke(tool.name);
41
+ }
42
+ // 注册到主 ToolRegistry
43
+ this.#registry.register({
44
+ name: tool.name,
45
+ description: `[Forged:${tool.forgeMode}] ${tool.description}`,
46
+ parameters: tool.parameters,
47
+ handler: tool.handler,
48
+ });
49
+ this.#tempTools.set(tool.name, entry);
50
+ if (this.#signalBus) {
51
+ this.#signalBus.send('forge', 'TemporaryToolRegistry', 1, {
52
+ target: tool.name,
53
+ metadata: { action: 'registered', forgeMode: tool.forgeMode, ttlMs },
54
+ });
55
+ }
56
+ this.#logger.debug(`TemporaryToolRegistry: registered "${tool.name}" (mode=${tool.forgeMode}, ttl=${ttlMs}ms)`);
57
+ }
58
+ /**
59
+ * 手动回收临时工具
60
+ */
61
+ revoke(name) {
62
+ const tool = this.#tempTools.get(name);
63
+ if (!tool) {
64
+ return false;
65
+ }
66
+ this.#registry.unregister(name);
67
+ this.#tempTools.delete(name);
68
+ if (this.#signalBus) {
69
+ this.#signalBus.send('forge', 'TemporaryToolRegistry', 0, {
70
+ target: name,
71
+ metadata: { action: 'revoked' },
72
+ });
73
+ }
74
+ this.#logger.debug(`TemporaryToolRegistry: revoked "${name}"`);
75
+ return true;
76
+ }
77
+ /**
78
+ * 续期临时工具
79
+ */
80
+ renew(name, additionalMs = DEFAULT_TTL_MS) {
81
+ const tool = this.#tempTools.get(name);
82
+ if (!tool) {
83
+ return false;
84
+ }
85
+ tool.expiresAt = Date.now() + additionalMs;
86
+ return true;
87
+ }
88
+ /**
89
+ * 清理过期工具
90
+ */
91
+ cleanup() {
92
+ const now = Date.now();
93
+ let cleaned = 0;
94
+ for (const [name, tool] of this.#tempTools) {
95
+ if (tool.expiresAt > 0 && tool.expiresAt <= now) {
96
+ this.#registry.unregister(name);
97
+ this.#tempTools.delete(name);
98
+ cleaned++;
99
+ this.#logger.debug(`TemporaryToolRegistry: expired "${name}"`);
100
+ }
101
+ }
102
+ return cleaned;
103
+ }
104
+ /**
105
+ * 获取所有临时工具信息
106
+ */
107
+ list() {
108
+ const now = Date.now();
109
+ const result = [];
110
+ for (const [name, tool] of this.#tempTools) {
111
+ result.push({
112
+ name,
113
+ forgeMode: tool.forgeMode,
114
+ registeredAt: tool.registeredAt,
115
+ expiresAt: tool.expiresAt,
116
+ remainingMs: tool.expiresAt > 0 ? Math.max(0, tool.expiresAt - now) : -1,
117
+ });
118
+ }
119
+ return result;
120
+ }
121
+ /**
122
+ * 检查是否是临时工具
123
+ */
124
+ isTemporary(name) {
125
+ return this.#tempTools.has(name);
126
+ }
127
+ /** 临时工具数量 */
128
+ get size() {
129
+ return this.#tempTools.size;
130
+ }
131
+ /** 停止定期清理(用于 shutdown) */
132
+ dispose() {
133
+ if (this.#cleanupTimer) {
134
+ clearInterval(this.#cleanupTimer);
135
+ this.#cleanupTimer = null;
136
+ }
137
+ // 回收所有临时工具
138
+ for (const name of [...this.#tempTools.keys()]) {
139
+ this.revoke(name);
140
+ }
141
+ }
142
+ /* ── Internal ── */
143
+ #startCleanup() {
144
+ this.#cleanupTimer = setInterval(() => {
145
+ this.cleanup();
146
+ }, CLEANUP_INTERVAL_MS);
147
+ // 允许 Node.js 进程在只剩此 timer 时退出
148
+ if (this.#cleanupTimer &&
149
+ typeof this.#cleanupTimer === 'object' &&
150
+ 'unref' in this.#cleanupTimer) {
151
+ this.#cleanupTimer.unref();
152
+ }
153
+ }
154
+ }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * ToolForge — 工具锻造主编排器
3
+ *
4
+ * 三级锻造策略:
5
+ * Reuse (0ms) → 直接重用注册表中已有工具
6
+ * Compose (10ms) → 通过 DynamicComposer 组合已有原子工具
7
+ * Generate (5s) → LLM 生成工具代码 → SandboxRunner 验证 → 注册
8
+ *
9
+ * 瀑布逻辑:reuse → compose → generate,首个成功即返回。
10
+ */
11
+ import type { SignalBus } from '#infra/signal/SignalBus.js';
12
+ import type { CompositionSpec } from './DynamicComposer.js';
13
+ import type { SandboxTestCase } from './SandboxRunner.js';
14
+ import { TemporaryToolRegistry } from './TemporaryToolRegistry.js';
15
+ import type { AnalysisResult, ToolRequirement } from './ToolRequirementAnalyzer.js';
16
+ import { ToolRequirementAnalyzer } from './ToolRequirementAnalyzer.js';
17
+ interface ToolRegistryLike {
18
+ has(name: string): boolean;
19
+ getToolNames(): string[];
20
+ execute(name: string, params: Record<string, unknown>, context?: Record<string, unknown>): Promise<unknown>;
21
+ register(toolDef: {
22
+ name: string;
23
+ description: string;
24
+ parameters?: Record<string, unknown>;
25
+ handler: Function;
26
+ }): void;
27
+ unregister(name: string): boolean;
28
+ }
29
+ export interface ForgeRequest {
30
+ /** 用户意图 */
31
+ intent: string;
32
+ /** 关键动作 */
33
+ action: string;
34
+ /** 目标对象 */
35
+ target: string;
36
+ /** 约束条件 */
37
+ constraints?: string[];
38
+ /** LLM 代码生成回调 — 仅 generate 模式时调用 */
39
+ codeGenerator?: (requirement: ToolRequirement) => Promise<GeneratedTool | null>;
40
+ }
41
+ export interface GeneratedTool {
42
+ /** 工具名 */
43
+ name: string;
44
+ /** 描述 */
45
+ description: string;
46
+ /** JSON Schema 参数 */
47
+ parameters: Record<string, unknown>;
48
+ /** 工具代码(需包含 toolHandler 函数) */
49
+ code: string;
50
+ /** 测试用例 */
51
+ testCases: SandboxTestCase[];
52
+ }
53
+ export interface ForgeResult {
54
+ /** 是否成功 */
55
+ success: boolean;
56
+ /** 使用的模式 */
57
+ mode: 'reuse' | 'compose' | 'generate';
58
+ /** 工具名称 */
59
+ toolName?: string;
60
+ /** 需求分析结果 */
61
+ analysis: AnalysisResult;
62
+ /** 失败原因 */
63
+ error?: string;
64
+ }
65
+ export interface ToolForgeOptions {
66
+ signalBus?: SignalBus;
67
+ /** 生成工具的默认 TTL(ms),默认 30 分钟 */
68
+ defaultTtlMs?: number;
69
+ /** compose 模式下的组合 spec 生成器 */
70
+ compositionSpecBuilder?: (analysis: AnalysisResult, requirement: ToolRequirement) => CompositionSpec | null;
71
+ }
72
+ export declare class ToolForge {
73
+ #private;
74
+ constructor(registry: ToolRegistryLike, options?: ToolForgeOptions);
75
+ /**
76
+ * 锻造工具 — 瀑布流:reuse → compose → generate
77
+ */
78
+ forge(request: ForgeRequest): Promise<ForgeResult>;
79
+ /**
80
+ * 获取临时工具注册表(暴露给 Pipeline 集成用)
81
+ */
82
+ get temporaryRegistry(): TemporaryToolRegistry;
83
+ /**
84
+ * 获取分析器
85
+ */
86
+ get analyzer(): ToolRequirementAnalyzer;
87
+ /**
88
+ * 销毁 Forge(清理临时工具和定时器)
89
+ */
90
+ dispose(): void;
91
+ }
92
+ export {};
@@ -0,0 +1,239 @@
1
+ /**
2
+ * ToolForge — 工具锻造主编排器
3
+ *
4
+ * 三级锻造策略:
5
+ * Reuse (0ms) → 直接重用注册表中已有工具
6
+ * Compose (10ms) → 通过 DynamicComposer 组合已有原子工具
7
+ * Generate (5s) → LLM 生成工具代码 → SandboxRunner 验证 → 注册
8
+ *
9
+ * 瀑布逻辑:reuse → compose → generate,首个成功即返回。
10
+ */
11
+ import Logger from '#infra/logging/Logger.js';
12
+ import { DynamicComposer } from './DynamicComposer.js';
13
+ import { SandboxRunner } from './SandboxRunner.js';
14
+ import { TemporaryToolRegistry } from './TemporaryToolRegistry.js';
15
+ import { ToolRequirementAnalyzer } from './ToolRequirementAnalyzer.js';
16
+ /* ────────────────────── Class ────────────────────── */
17
+ export class ToolForge {
18
+ #registry;
19
+ #analyzer;
20
+ #composer;
21
+ #sandbox;
22
+ #tempRegistry;
23
+ #signalBus;
24
+ #logger = Logger.getInstance();
25
+ #defaultTtlMs;
26
+ #compositionSpecBuilder;
27
+ constructor(registry, options = {}) {
28
+ this.#registry = registry;
29
+ this.#signalBus = options.signalBus ?? null;
30
+ this.#defaultTtlMs = options.defaultTtlMs ?? 30 * 60 * 1000;
31
+ this.#compositionSpecBuilder = options.compositionSpecBuilder;
32
+ this.#analyzer = new ToolRequirementAnalyzer(registry);
33
+ this.#composer = new DynamicComposer(registry);
34
+ this.#sandbox = new SandboxRunner();
35
+ this.#tempRegistry = new TemporaryToolRegistry(registry, {
36
+ signalBus: this.#signalBus ?? undefined,
37
+ });
38
+ }
39
+ /* ────────── Public API ────────── */
40
+ /**
41
+ * 锻造工具 — 瀑布流:reuse → compose → generate
42
+ */
43
+ async forge(request) {
44
+ const requirement = {
45
+ intent: request.intent,
46
+ action: request.action,
47
+ target: request.target,
48
+ constraints: request.constraints,
49
+ };
50
+ // Step 1: 需求分析
51
+ const analysis = this.#analyzer.analyze(requirement);
52
+ this.#logger.info(`ToolForge: analysis for "${request.intent}" → mode=${analysis.mode}, confidence=${analysis.confidence}`);
53
+ // Step 2: 按推荐模式尝试,失败则降级
54
+ const result = (await this.#tryReuse(analysis, requirement)) ??
55
+ (await this.#tryCompose(analysis, requirement)) ??
56
+ (await this.#tryGenerate(analysis, requirement, request.codeGenerator));
57
+ if (result) {
58
+ this.#emitSignal('forge_complete', {
59
+ mode: result.mode,
60
+ tool: result.toolName,
61
+ analysis,
62
+ });
63
+ return result;
64
+ }
65
+ // 全部失败
66
+ return {
67
+ success: false,
68
+ mode: 'generate',
69
+ analysis,
70
+ error: 'All forge modes exhausted. Cannot satisfy tool requirement.',
71
+ };
72
+ }
73
+ /**
74
+ * 获取临时工具注册表(暴露给 Pipeline 集成用)
75
+ */
76
+ get temporaryRegistry() {
77
+ return this.#tempRegistry;
78
+ }
79
+ /**
80
+ * 获取分析器
81
+ */
82
+ get analyzer() {
83
+ return this.#analyzer;
84
+ }
85
+ /**
86
+ * 销毁 Forge(清理临时工具和定时器)
87
+ */
88
+ dispose() {
89
+ this.#tempRegistry.dispose();
90
+ }
91
+ /* ────────── Forge Modes ────────── */
92
+ async #tryReuse(analysis, _requirement) {
93
+ if (analysis.mode !== 'reuse' || !analysis.matchedTool) {
94
+ // 即便分析推荐 compose/generate,也尝试检查直接匹配
95
+ if (analysis.matchedTool && this.#registry.has(analysis.matchedTool)) {
96
+ return {
97
+ success: true,
98
+ mode: 'reuse',
99
+ toolName: analysis.matchedTool,
100
+ analysis,
101
+ };
102
+ }
103
+ return null;
104
+ }
105
+ if (!this.#registry.has(analysis.matchedTool)) {
106
+ return null;
107
+ }
108
+ this.#logger.debug(`ToolForge: reuse existing tool "${analysis.matchedTool}"`);
109
+ return {
110
+ success: true,
111
+ mode: 'reuse',
112
+ toolName: analysis.matchedTool,
113
+ analysis,
114
+ };
115
+ }
116
+ async #tryCompose(analysis, requirement) {
117
+ if (!analysis.composableTools || analysis.composableTools.length < 2) {
118
+ return null;
119
+ }
120
+ // 如果有外部 spec builder,使用它
121
+ const spec = this.#compositionSpecBuilder?.(analysis, requirement);
122
+ if (!spec) {
123
+ // 默认构建 sequential 组合
124
+ const defaultSpec = this.#buildDefaultCompositionSpec(analysis, requirement);
125
+ if (!defaultSpec) {
126
+ return null;
127
+ }
128
+ return this.#executeComposition(defaultSpec, analysis);
129
+ }
130
+ return this.#executeComposition(spec, analysis);
131
+ }
132
+ #buildDefaultCompositionSpec(analysis, requirement) {
133
+ const tools = analysis.composableTools;
134
+ if (!tools || tools.length < 2) {
135
+ return null;
136
+ }
137
+ const composedName = `composed_${requirement.action}_${requirement.target}`;
138
+ return {
139
+ name: composedName,
140
+ description: `Auto-composed tool for: ${requirement.intent}`,
141
+ steps: tools.map((tool) => ({
142
+ tool,
143
+ args: (prevResult) => {
144
+ if (typeof prevResult === 'object' && prevResult !== null) {
145
+ return prevResult;
146
+ }
147
+ return {};
148
+ },
149
+ })),
150
+ mergeStrategy: 'sequential',
151
+ };
152
+ }
153
+ async #executeComposition(spec, analysis) {
154
+ const result = this.#composer.compose(spec);
155
+ if (!result.success || !result.handler) {
156
+ this.#logger.debug(`ToolForge: composition failed — ${result.error}`);
157
+ return null;
158
+ }
159
+ // 注册为临时工具
160
+ this.#tempRegistry.registerTemporary({
161
+ name: spec.name,
162
+ description: spec.description,
163
+ parameters: spec.parameters ?? {},
164
+ handler: result.handler,
165
+ forgeMode: 'compose',
166
+ }, this.#defaultTtlMs);
167
+ this.#logger.info(`ToolForge: composed tool "${spec.name}" from ${spec.steps.length} steps`);
168
+ return {
169
+ success: true,
170
+ mode: 'compose',
171
+ toolName: spec.name,
172
+ analysis,
173
+ };
174
+ }
175
+ async #tryGenerate(analysis, requirement, codeGenerator) {
176
+ if (!codeGenerator) {
177
+ this.#logger.debug('ToolForge: generate mode skipped (no codeGenerator provided)');
178
+ return null;
179
+ }
180
+ // 调用 LLM 生成工具
181
+ const generated = await codeGenerator(requirement);
182
+ if (!generated) {
183
+ return null;
184
+ }
185
+ // 安全检查
186
+ const safety = this.#sandbox.checkSafety(generated.code);
187
+ if (!safety.passed) {
188
+ this.#logger.warn(`ToolForge: generated code failed safety check — ${safety.violations.join(', ')}`);
189
+ return {
190
+ success: false,
191
+ mode: 'generate',
192
+ analysis,
193
+ error: `Safety violations: ${safety.violations.join(', ')}`,
194
+ };
195
+ }
196
+ // 沙箱测试
197
+ if (generated.testCases.length > 0) {
198
+ const testResult = await this.#sandbox.run(generated.code, generated.testCases);
199
+ if (!testResult.success) {
200
+ const failures = testResult.testResults
201
+ .filter((t) => !t.passed)
202
+ .map((t) => t.description)
203
+ .join(', ');
204
+ this.#logger.warn(`ToolForge: generated code failed tests — ${failures}`);
205
+ return {
206
+ success: false,
207
+ mode: 'generate',
208
+ analysis,
209
+ error: `Test failures: ${failures}`,
210
+ };
211
+ }
212
+ }
213
+ // 构建 handler 包装
214
+ const handler = this.#sandbox.createHandler(generated.code);
215
+ // 注册为临时工具
216
+ this.#tempRegistry.registerTemporary({
217
+ name: generated.name,
218
+ description: generated.description,
219
+ parameters: generated.parameters,
220
+ handler,
221
+ forgeMode: 'generate',
222
+ }, this.#defaultTtlMs);
223
+ this.#logger.info(`ToolForge: generated and registered tool "${generated.name}"`);
224
+ return {
225
+ success: true,
226
+ mode: 'generate',
227
+ toolName: generated.name,
228
+ analysis,
229
+ };
230
+ }
231
+ /* ────────── Signal ────────── */
232
+ #emitSignal(action, data) {
233
+ if (this.#signalBus) {
234
+ this.#signalBus.send('forge', 'ToolForge', 1, {
235
+ metadata: { action, ...data },
236
+ });
237
+ }
238
+ }
239
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * ToolRequirementAnalyzer — 工具需求分析器
3
+ *
4
+ * 分析结构化意图,确定满足需求的最佳路径:
5
+ * 1. Reuse — 注册表中已有完全匹配的工具
6
+ * 2. Compose — 可通过组合已有工具满足
7
+ * 3. Generate — 必须由 LLM 生成新工具代码
8
+ */
9
+ interface ToolRegistryLike {
10
+ has(name: string): boolean;
11
+ getToolNames(): string[];
12
+ }
13
+ export interface ToolRequirement {
14
+ /** 用户意图描述 */
15
+ intent: string;
16
+ /** 关键动作词(如 read / search / transform / validate) */
17
+ action: string;
18
+ /** 目标对象(如 file / database / API) */
19
+ target: string;
20
+ /** 附加约束 */
21
+ constraints?: string[];
22
+ }
23
+ export type ForgeMode = 'reuse' | 'compose' | 'generate';
24
+ export interface AnalysisResult {
25
+ /** 推荐的 Forge 模式 */
26
+ mode: ForgeMode;
27
+ /** 置信度 0-1 */
28
+ confidence: number;
29
+ /** 推理理由 */
30
+ reasoning: string;
31
+ /** mode=reuse 时:匹配的工具名 */
32
+ matchedTool?: string;
33
+ /** mode=compose 时:建议参与组合的工具列表 */
34
+ composableTools?: string[];
35
+ }
36
+ export declare class ToolRequirementAnalyzer {
37
+ #private;
38
+ constructor(registry: ToolRegistryLike);
39
+ /**
40
+ * 分析需求并推荐 Forge 模式
41
+ */
42
+ analyze(requirement: ToolRequirement): AnalysisResult;
43
+ }
44
+ export {};
@@ -0,0 +1,119 @@
1
+ /**
2
+ * ToolRequirementAnalyzer — 工具需求分析器
3
+ *
4
+ * 分析结构化意图,确定满足需求的最佳路径:
5
+ * 1. Reuse — 注册表中已有完全匹配的工具
6
+ * 2. Compose — 可通过组合已有工具满足
7
+ * 3. Generate — 必须由 LLM 生成新工具代码
8
+ */
9
+ import Logger from '#infra/logging/Logger.js';
10
+ /* ────────────── Action → Tool Keyword mapping ────────────── */
11
+ const ACTION_TOOL_HINTS = {
12
+ read: ['read', 'get', 'fetch', 'load', 'file'],
13
+ search: ['search', 'find', 'query', 'lookup'],
14
+ write: ['write', 'save', 'create', 'update', 'set'],
15
+ delete: ['delete', 'remove', 'clear'],
16
+ transform: ['transform', 'convert', 'parse', 'format'],
17
+ validate: ['validate', 'check', 'guard', 'lint'],
18
+ analyse: ['analyze', 'analyse', 'inspect', 'stats'],
19
+ list: ['list', 'browse', 'enumerate'],
20
+ execute: ['execute', 'run', 'invoke', 'call'],
21
+ };
22
+ /* ────────────────────── Class ────────────────────── */
23
+ export class ToolRequirementAnalyzer {
24
+ #registry;
25
+ #logger = Logger.getInstance();
26
+ constructor(registry) {
27
+ this.#registry = registry;
28
+ }
29
+ /**
30
+ * 分析需求并推荐 Forge 模式
31
+ */
32
+ analyze(requirement) {
33
+ // 1. 尝试精确匹配
34
+ const exactMatch = this.#tryExactMatch(requirement);
35
+ if (exactMatch) {
36
+ return exactMatch;
37
+ }
38
+ // 2. 尝试组合匹配
39
+ const composeMatch = this.#tryComposeMatch(requirement);
40
+ if (composeMatch) {
41
+ return composeMatch;
42
+ }
43
+ // 3. Fallback: 需要生成
44
+ return {
45
+ mode: 'generate',
46
+ confidence: 0.5,
47
+ reasoning: `No existing tool matches "${requirement.action} ${requirement.target}". Code generation required.`,
48
+ };
49
+ }
50
+ /* ── Internal ── */
51
+ #tryExactMatch(req) {
52
+ // 直接检查 action_target 形式的工具名
53
+ const directName = `${req.action}_${req.target}`.toLowerCase();
54
+ if (this.#registry.has(directName)) {
55
+ return {
56
+ mode: 'reuse',
57
+ confidence: 1.0,
58
+ reasoning: `Exact tool match: "${directName}"`,
59
+ matchedTool: directName,
60
+ };
61
+ }
62
+ // 模糊匹配:遍历已注册工具,看名称是否同时包含 action 和 target 关键词
63
+ const allTools = this.#registry.getToolNames();
64
+ const actionLower = req.action.toLowerCase();
65
+ const targetLower = req.target.toLowerCase();
66
+ for (const tool of allTools) {
67
+ const toolLower = tool.toLowerCase();
68
+ if (toolLower.includes(actionLower) && toolLower.includes(targetLower)) {
69
+ return {
70
+ mode: 'reuse',
71
+ confidence: 0.85,
72
+ reasoning: `Fuzzy match: tool "${tool}" contains both "${req.action}" and "${req.target}"`,
73
+ matchedTool: tool,
74
+ };
75
+ }
76
+ }
77
+ // 通过 action hint 词尝试
78
+ const hints = ACTION_TOOL_HINTS[actionLower] ?? [actionLower];
79
+ for (const tool of allTools) {
80
+ const toolLower = tool.toLowerCase();
81
+ const matchesHint = hints.some((h) => toolLower.includes(h));
82
+ const matchesTarget = toolLower.includes(targetLower);
83
+ if (matchesHint && matchesTarget) {
84
+ return {
85
+ mode: 'reuse',
86
+ confidence: 0.7,
87
+ reasoning: `Hint match: tool "${tool}" matches action hint and target "${req.target}"`,
88
+ matchedTool: tool,
89
+ };
90
+ }
91
+ }
92
+ return null;
93
+ }
94
+ #tryComposeMatch(req) {
95
+ const allTools = this.#registry.getToolNames();
96
+ const actionLower = req.action.toLowerCase();
97
+ const targetLower = req.target.toLowerCase();
98
+ const hints = ACTION_TOOL_HINTS[actionLower] ?? [actionLower];
99
+ // 寻找和 action 相关的工具
100
+ const actionRelated = allTools.filter((t) => {
101
+ const tl = t.toLowerCase();
102
+ return hints.some((h) => tl.includes(h));
103
+ });
104
+ // 寻找和 target 相关的工具
105
+ const targetRelated = allTools.filter((t) => t.toLowerCase().includes(targetLower));
106
+ // 取并集
107
+ const candidates = [...new Set([...actionRelated, ...targetRelated])];
108
+ if (candidates.length >= 2) {
109
+ this.#logger.debug(`ToolRequirementAnalyzer: compose candidates for "${req.intent}": ${candidates.join(', ')}`);
110
+ return {
111
+ mode: 'compose',
112
+ confidence: 0.65,
113
+ reasoning: `Found ${candidates.length} composable tools for "${req.action} ${req.target}"`,
114
+ composableTools: candidates.slice(0, 5),
115
+ };
116
+ }
117
+ return null;
118
+ }
119
+ }
@@ -46,6 +46,8 @@ export declare class ToolRegistry {
46
46
  execute(name: string, params: Record<string, unknown>, context?: Record<string, unknown>): Promise<unknown>;
47
47
  /** 检查工具是否存在 */
48
48
  has(name: string): boolean;
49
+ /** 移除一个已注册的工具(Forge TTL 回收用) */
50
+ unregister(name: string): boolean;
49
51
  /** 获取所有工具名 */
50
52
  getToolNames(): string[];
51
53
  /** 工具数量 */
@@ -174,6 +174,10 @@ export class ToolRegistry {
174
174
  has(name) {
175
175
  return this.#tools.has(name);
176
176
  }
177
+ /** 移除一个已注册的工具(Forge TTL 回收用) */
178
+ unregister(name) {
179
+ return this.#tools.delete(name);
180
+ }
177
181
  /** 获取所有工具名 */
178
182
  getToolNames() {
179
183
  return [...this.#tools.keys()];
@@ -214,7 +214,6 @@ export const submitWithCheck = {
214
214
  existingFingerprints: ctx._submittedPatterns || new Set(),
215
215
  });
216
216
  const validResult = validator.validate(params, {
217
- mode: 'strict',
218
217
  systemInjectedFields: getSystemInjectedFields(),
219
218
  });
220
219
  if (!validResult.pass) {