@vinkius-core/mcp-fusion 1.6.0 → 1.6.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 (400) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +8 -6
  3. package/dist/{framework/client → client}/FusionClient.d.ts +1 -1
  4. package/dist/client/FusionClient.d.ts.map +1 -0
  5. package/dist/{framework/client → client}/FusionClient.js +1 -1
  6. package/dist/client/FusionClient.js.map +1 -0
  7. package/dist/{framework/client → client}/InferRouter.d.ts +3 -2
  8. package/dist/client/InferRouter.d.ts.map +1 -0
  9. package/dist/{framework/client → client}/InferRouter.js +2 -1
  10. package/dist/client/InferRouter.js.map +1 -0
  11. package/dist/{framework/client → client}/createTypedRegistry.d.ts +1 -1
  12. package/dist/client/createTypedRegistry.d.ts.map +1 -0
  13. package/dist/{framework/client → client}/createTypedRegistry.js +2 -2
  14. package/dist/client/createTypedRegistry.js.map +1 -0
  15. package/dist/client/index.d.ts.map +1 -0
  16. package/dist/client/index.js.map +1 -0
  17. package/dist/core/builder/ActionGroupBuilder.d.ts.map +1 -0
  18. package/dist/core/builder/ActionGroupBuilder.js.map +1 -0
  19. package/dist/{framework → core}/builder/GroupedToolBuilder.d.ts +17 -9
  20. package/dist/core/builder/GroupedToolBuilder.d.ts.map +1 -0
  21. package/dist/{framework → core}/builder/GroupedToolBuilder.js +130 -111
  22. package/dist/core/builder/GroupedToolBuilder.js.map +1 -0
  23. package/dist/core/builder/ParamDescriptors.d.ts.map +1 -0
  24. package/dist/core/builder/ParamDescriptors.js +164 -0
  25. package/dist/core/builder/ParamDescriptors.js.map +1 -0
  26. package/dist/core/builder/ToolDefinitionCompiler.d.ts.map +1 -0
  27. package/dist/{framework → core}/builder/ToolDefinitionCompiler.js +15 -17
  28. package/dist/core/builder/ToolDefinitionCompiler.js.map +1 -0
  29. package/dist/{framework → core}/builder/defineTool.d.ts +2 -2
  30. package/dist/core/builder/defineTool.d.ts.map +1 -0
  31. package/dist/{framework → core}/builder/defineTool.js +30 -59
  32. package/dist/core/builder/defineTool.js.map +1 -0
  33. package/dist/core/builder/index.d.ts.map +1 -0
  34. package/dist/core/builder/index.js.map +1 -0
  35. package/dist/core/execution/ExecutionPipeline.d.ts.map +1 -0
  36. package/dist/{framework → core}/execution/ExecutionPipeline.js +23 -11
  37. package/dist/core/execution/ExecutionPipeline.js.map +1 -0
  38. package/dist/core/execution/MiddlewareCompiler.d.ts +30 -0
  39. package/dist/core/execution/MiddlewareCompiler.d.ts.map +1 -0
  40. package/dist/{framework → core}/execution/MiddlewareCompiler.js +39 -21
  41. package/dist/core/execution/MiddlewareCompiler.js.map +1 -0
  42. package/dist/core/execution/PipelineHooks.d.ts +39 -0
  43. package/dist/core/execution/PipelineHooks.d.ts.map +1 -0
  44. package/dist/core/execution/PipelineHooks.js +27 -0
  45. package/dist/core/execution/PipelineHooks.js.map +1 -0
  46. package/dist/core/execution/ProgressHelper.d.ts.map +1 -0
  47. package/dist/core/execution/ProgressHelper.js.map +1 -0
  48. package/dist/{framework → core}/execution/ValidationErrorFormatter.d.ts +6 -5
  49. package/dist/core/execution/ValidationErrorFormatter.d.ts.map +1 -0
  50. package/dist/{framework → core}/execution/ValidationErrorFormatter.js +16 -13
  51. package/dist/core/execution/ValidationErrorFormatter.js.map +1 -0
  52. package/dist/{framework → core}/execution/index.d.ts +2 -1
  53. package/dist/core/execution/index.d.ts.map +1 -0
  54. package/dist/{framework → core}/execution/index.js +2 -1
  55. package/dist/core/execution/index.js.map +1 -0
  56. package/dist/core/index.d.ts +27 -0
  57. package/dist/core/index.d.ts.map +1 -0
  58. package/dist/core/index.js +25 -0
  59. package/dist/core/index.js.map +1 -0
  60. package/dist/core/middleware/ContextDerivation.d.ts.map +1 -0
  61. package/dist/core/middleware/ContextDerivation.js.map +1 -0
  62. package/dist/core/middleware/index.d.ts.map +1 -0
  63. package/dist/core/middleware/index.js.map +1 -0
  64. package/dist/core/registry/ToolFilterEngine.d.ts.map +1 -0
  65. package/dist/{framework → core}/registry/ToolFilterEngine.js +6 -30
  66. package/dist/core/registry/ToolFilterEngine.js.map +1 -0
  67. package/dist/{framework → core}/registry/ToolRegistry.d.ts +4 -4
  68. package/dist/core/registry/ToolRegistry.d.ts.map +1 -0
  69. package/dist/{framework → core}/registry/ToolRegistry.js +9 -6
  70. package/dist/core/registry/ToolRegistry.js.map +1 -0
  71. package/dist/core/registry/index.d.ts +4 -0
  72. package/dist/core/registry/index.d.ts.map +1 -0
  73. package/dist/{framework → core}/registry/index.js +0 -1
  74. package/dist/core/registry/index.js.map +1 -0
  75. package/dist/{framework → core}/response.d.ts +20 -0
  76. package/dist/core/response.d.ts.map +1 -0
  77. package/dist/{framework → core}/response.js +51 -6
  78. package/dist/core/response.js.map +1 -0
  79. package/dist/core/result.d.ts.map +1 -0
  80. package/dist/core/result.js.map +1 -0
  81. package/dist/core/schema/AnnotationAggregator.d.ts.map +1 -0
  82. package/dist/core/schema/AnnotationAggregator.js.map +1 -0
  83. package/dist/core/schema/DescriptionGenerator.d.ts.map +1 -0
  84. package/dist/core/schema/DescriptionGenerator.js.map +1 -0
  85. package/dist/core/schema/SchemaGenerator.d.ts.map +1 -0
  86. package/dist/{framework → core}/schema/SchemaGenerator.js +0 -1
  87. package/dist/core/schema/SchemaGenerator.js.map +1 -0
  88. package/dist/core/schema/SchemaUtils.d.ts +26 -0
  89. package/dist/core/schema/SchemaUtils.d.ts.map +1 -0
  90. package/dist/{framework → core}/schema/SchemaUtils.js +13 -0
  91. package/dist/core/schema/SchemaUtils.js.map +1 -0
  92. package/dist/core/schema/ToonDescriptionGenerator.d.ts.map +1 -0
  93. package/dist/core/schema/ToonDescriptionGenerator.js.map +1 -0
  94. package/dist/{framework → core}/schema/index.d.ts +1 -1
  95. package/dist/core/schema/index.d.ts.map +1 -0
  96. package/dist/{framework → core}/schema/index.js +1 -1
  97. package/dist/core/schema/index.js.map +1 -0
  98. package/dist/{framework → core}/types.d.ts +7 -1
  99. package/dist/core/types.d.ts.map +1 -0
  100. package/dist/{framework → core}/types.js +1 -1
  101. package/dist/core/types.js.map +1 -0
  102. package/dist/{framework/server → exposition}/ExpositionCompiler.d.ts +2 -2
  103. package/dist/exposition/ExpositionCompiler.d.ts.map +1 -0
  104. package/dist/{framework/server → exposition}/ExpositionCompiler.js +5 -20
  105. package/dist/exposition/ExpositionCompiler.js.map +1 -0
  106. package/dist/exposition/index.d.ts +4 -0
  107. package/dist/exposition/index.d.ts.map +1 -0
  108. package/dist/exposition/index.js +2 -0
  109. package/dist/exposition/index.js.map +1 -0
  110. package/dist/{framework/server/ExpositionTypes.d.ts → exposition/types.d.ts} +1 -1
  111. package/dist/exposition/types.d.ts.map +1 -0
  112. package/dist/{framework/server/ExpositionTypes.js → exposition/types.js} +1 -1
  113. package/dist/exposition/types.js.map +1 -0
  114. package/dist/index.d.ts +50 -17
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +38 -16
  117. package/dist/index.js.map +1 -1
  118. package/dist/{framework/introspection → introspection}/IntrospectionResource.d.ts +1 -1
  119. package/dist/introspection/IntrospectionResource.d.ts.map +1 -0
  120. package/dist/{framework/introspection → introspection}/IntrospectionResource.js +1 -1
  121. package/dist/introspection/IntrospectionResource.js.map +1 -0
  122. package/dist/{framework/introspection → introspection}/ManifestCompiler.d.ts +1 -1
  123. package/dist/introspection/ManifestCompiler.d.ts.map +1 -0
  124. package/dist/{framework/introspection → introspection}/ManifestCompiler.js +1 -1
  125. package/dist/introspection/ManifestCompiler.js.map +1 -0
  126. package/dist/introspection/index.d.ts.map +1 -0
  127. package/dist/introspection/index.js.map +1 -0
  128. package/dist/introspection/types.d.ts.map +1 -0
  129. package/dist/introspection/types.js.map +1 -0
  130. package/dist/observability/DebugObserver.d.ts.map +1 -0
  131. package/dist/observability/DebugObserver.js.map +1 -0
  132. package/dist/observability/Tracing.d.ts.map +1 -0
  133. package/dist/observability/Tracing.js.map +1 -0
  134. package/dist/observability/index.d.ts +10 -0
  135. package/dist/observability/index.d.ts.map +1 -0
  136. package/dist/observability/index.js +10 -0
  137. package/dist/observability/index.js.map +1 -0
  138. package/dist/{framework/presenter → presenter}/PostProcessor.d.ts +1 -1
  139. package/dist/presenter/PostProcessor.d.ts.map +1 -0
  140. package/dist/{framework/presenter → presenter}/PostProcessor.js +1 -1
  141. package/dist/presenter/PostProcessor.js.map +1 -0
  142. package/dist/presenter/Presenter.d.ts.map +1 -0
  143. package/dist/{framework/presenter → presenter}/Presenter.js +1 -1
  144. package/dist/presenter/Presenter.js.map +1 -0
  145. package/dist/{framework/presenter → presenter}/PresenterValidationError.d.ts +1 -1
  146. package/dist/presenter/PresenterValidationError.d.ts.map +1 -0
  147. package/dist/{framework/presenter → presenter}/PresenterValidationError.js +1 -1
  148. package/dist/presenter/PresenterValidationError.js.map +1 -0
  149. package/dist/{framework/presenter → presenter}/ResponseBuilder.d.ts +1 -1
  150. package/dist/presenter/ResponseBuilder.d.ts.map +1 -0
  151. package/dist/{framework/presenter → presenter}/ResponseBuilder.js +15 -13
  152. package/dist/presenter/ResponseBuilder.js.map +1 -0
  153. package/dist/presenter/index.d.ts.map +1 -0
  154. package/dist/presenter/index.js.map +1 -0
  155. package/dist/presenter/ui.d.ts.map +1 -0
  156. package/dist/presenter/ui.js.map +1 -0
  157. package/dist/{framework/prompt → prompt}/PromptExecutionPipeline.d.ts +2 -2
  158. package/dist/prompt/PromptExecutionPipeline.d.ts.map +1 -0
  159. package/dist/{framework/prompt → prompt}/PromptExecutionPipeline.js +13 -31
  160. package/dist/prompt/PromptExecutionPipeline.js.map +1 -0
  161. package/dist/{framework/prompt → prompt}/PromptMessage.d.ts +1 -1
  162. package/dist/prompt/PromptMessage.d.ts.map +1 -0
  163. package/dist/{framework/prompt → prompt}/PromptMessage.js +1 -1
  164. package/dist/prompt/PromptMessage.js.map +1 -0
  165. package/dist/{framework/registry → prompt}/PromptRegistry.d.ts +29 -1
  166. package/dist/prompt/PromptRegistry.d.ts.map +1 -0
  167. package/dist/{framework/registry → prompt}/PromptRegistry.js +100 -33
  168. package/dist/prompt/PromptRegistry.js.map +1 -0
  169. package/dist/{framework/prompt → prompt}/definePrompt.d.ts +3 -3
  170. package/dist/prompt/definePrompt.d.ts.map +1 -0
  171. package/dist/{framework/prompt → prompt}/definePrompt.js +5 -15
  172. package/dist/prompt/definePrompt.js.map +1 -0
  173. package/dist/{framework/prompt → prompt}/index.d.ts +1 -1
  174. package/dist/prompt/index.d.ts.map +1 -0
  175. package/dist/prompt/index.js.map +1 -0
  176. package/dist/{framework/prompt/PromptTypes.d.ts → prompt/types.d.ts} +173 -5
  177. package/dist/prompt/types.d.ts.map +1 -0
  178. package/dist/{framework/prompt/PromptTypes.js → prompt/types.js} +5 -4
  179. package/dist/prompt/types.js.map +1 -0
  180. package/dist/{framework/server → server}/ServerAttachment.d.ts +5 -5
  181. package/dist/server/ServerAttachment.d.ts.map +1 -0
  182. package/dist/{framework/server → server}/ServerAttachment.js +157 -127
  183. package/dist/server/ServerAttachment.js.map +1 -0
  184. package/dist/server/ServerResolver.d.ts.map +1 -0
  185. package/dist/server/ServerResolver.js.map +1 -0
  186. package/dist/{framework/server → server}/index.d.ts +3 -3
  187. package/dist/server/index.d.ts.map +1 -0
  188. package/dist/server/index.js +5 -0
  189. package/dist/server/index.js.map +1 -0
  190. package/dist/state-sync/CausalEngine.d.ts.map +1 -0
  191. package/dist/state-sync/CausalEngine.js.map +1 -0
  192. package/dist/state-sync/DescriptionDecorator.d.ts.map +1 -0
  193. package/dist/state-sync/DescriptionDecorator.js.map +1 -0
  194. package/dist/state-sync/GlobMatcher.d.ts.map +1 -0
  195. package/dist/state-sync/GlobMatcher.js.map +1 -0
  196. package/dist/state-sync/PolicyEngine.d.ts.map +1 -0
  197. package/dist/state-sync/PolicyEngine.js.map +1 -0
  198. package/dist/{framework/state-sync → state-sync}/PolicyValidator.d.ts +0 -4
  199. package/dist/state-sync/PolicyValidator.d.ts.map +1 -0
  200. package/dist/state-sync/PolicyValidator.js +87 -0
  201. package/dist/state-sync/PolicyValidator.js.map +1 -0
  202. package/dist/{framework/state-sync → state-sync}/ResponseDecorator.d.ts +1 -1
  203. package/dist/state-sync/ResponseDecorator.d.ts.map +1 -0
  204. package/dist/{framework/state-sync → state-sync}/ResponseDecorator.js +1 -1
  205. package/dist/state-sync/ResponseDecorator.js.map +1 -0
  206. package/dist/{framework/state-sync → state-sync}/StateSyncLayer.d.ts +1 -1
  207. package/dist/state-sync/StateSyncLayer.d.ts.map +1 -0
  208. package/dist/state-sync/StateSyncLayer.js.map +1 -0
  209. package/dist/state-sync/index.d.ts.map +1 -0
  210. package/dist/state-sync/index.js.map +1 -0
  211. package/dist/state-sync/types.d.ts.map +1 -0
  212. package/dist/state-sync/types.js.map +1 -0
  213. package/llms.txt +3 -1
  214. package/package.json +3 -3
  215. package/dist/framework/builder/ActionGroupBuilder.d.ts.map +0 -1
  216. package/dist/framework/builder/ActionGroupBuilder.js.map +0 -1
  217. package/dist/framework/builder/GroupedToolBuilder.d.ts.map +0 -1
  218. package/dist/framework/builder/GroupedToolBuilder.js.map +0 -1
  219. package/dist/framework/builder/ParamDescriptors.d.ts.map +0 -1
  220. package/dist/framework/builder/ParamDescriptors.js +0 -162
  221. package/dist/framework/builder/ParamDescriptors.js.map +0 -1
  222. package/dist/framework/builder/ToolDefinitionCompiler.d.ts.map +0 -1
  223. package/dist/framework/builder/ToolDefinitionCompiler.js.map +0 -1
  224. package/dist/framework/builder/defineTool.d.ts.map +0 -1
  225. package/dist/framework/builder/defineTool.js.map +0 -1
  226. package/dist/framework/builder/index.d.ts.map +0 -1
  227. package/dist/framework/builder/index.js.map +0 -1
  228. package/dist/framework/client/FusionClient.d.ts.map +0 -1
  229. package/dist/framework/client/FusionClient.js.map +0 -1
  230. package/dist/framework/client/InferRouter.d.ts.map +0 -1
  231. package/dist/framework/client/InferRouter.js.map +0 -1
  232. package/dist/framework/client/createTypedRegistry.d.ts.map +0 -1
  233. package/dist/framework/client/createTypedRegistry.js.map +0 -1
  234. package/dist/framework/client/index.d.ts.map +0 -1
  235. package/dist/framework/client/index.js.map +0 -1
  236. package/dist/framework/execution/ExecutionPipeline.d.ts.map +0 -1
  237. package/dist/framework/execution/ExecutionPipeline.js.map +0 -1
  238. package/dist/framework/execution/MiddlewareCompiler.d.ts +0 -4
  239. package/dist/framework/execution/MiddlewareCompiler.d.ts.map +0 -1
  240. package/dist/framework/execution/MiddlewareCompiler.js.map +0 -1
  241. package/dist/framework/execution/ProgressHelper.d.ts.map +0 -1
  242. package/dist/framework/execution/ProgressHelper.js.map +0 -1
  243. package/dist/framework/execution/ValidationErrorFormatter.d.ts.map +0 -1
  244. package/dist/framework/execution/ValidationErrorFormatter.js.map +0 -1
  245. package/dist/framework/execution/index.d.ts.map +0 -1
  246. package/dist/framework/execution/index.js.map +0 -1
  247. package/dist/framework/index.d.ts +0 -44
  248. package/dist/framework/index.d.ts.map +0 -1
  249. package/dist/framework/index.js +0 -39
  250. package/dist/framework/index.js.map +0 -1
  251. package/dist/framework/introspection/IntrospectionResource.d.ts.map +0 -1
  252. package/dist/framework/introspection/IntrospectionResource.js.map +0 -1
  253. package/dist/framework/introspection/ManifestCompiler.d.ts.map +0 -1
  254. package/dist/framework/introspection/ManifestCompiler.js.map +0 -1
  255. package/dist/framework/introspection/index.d.ts.map +0 -1
  256. package/dist/framework/introspection/index.js.map +0 -1
  257. package/dist/framework/introspection/types.d.ts.map +0 -1
  258. package/dist/framework/introspection/types.js.map +0 -1
  259. package/dist/framework/middleware/ContextDerivation.d.ts.map +0 -1
  260. package/dist/framework/middleware/ContextDerivation.js.map +0 -1
  261. package/dist/framework/middleware/index.d.ts.map +0 -1
  262. package/dist/framework/middleware/index.js.map +0 -1
  263. package/dist/framework/observability/DebugObserver.d.ts.map +0 -1
  264. package/dist/framework/observability/DebugObserver.js.map +0 -1
  265. package/dist/framework/observability/Tracing.d.ts.map +0 -1
  266. package/dist/framework/observability/Tracing.js.map +0 -1
  267. package/dist/framework/presenter/PostProcessor.d.ts.map +0 -1
  268. package/dist/framework/presenter/PostProcessor.js.map +0 -1
  269. package/dist/framework/presenter/Presenter.d.ts.map +0 -1
  270. package/dist/framework/presenter/Presenter.js.map +0 -1
  271. package/dist/framework/presenter/PresenterValidationError.d.ts.map +0 -1
  272. package/dist/framework/presenter/PresenterValidationError.js.map +0 -1
  273. package/dist/framework/presenter/ResponseBuilder.d.ts.map +0 -1
  274. package/dist/framework/presenter/ResponseBuilder.js.map +0 -1
  275. package/dist/framework/presenter/index.d.ts.map +0 -1
  276. package/dist/framework/presenter/index.js.map +0 -1
  277. package/dist/framework/presenter/ui.d.ts.map +0 -1
  278. package/dist/framework/presenter/ui.js.map +0 -1
  279. package/dist/framework/prompt/PromptExecutionPipeline.d.ts.map +0 -1
  280. package/dist/framework/prompt/PromptExecutionPipeline.js.map +0 -1
  281. package/dist/framework/prompt/PromptMessage.d.ts.map +0 -1
  282. package/dist/framework/prompt/PromptMessage.js.map +0 -1
  283. package/dist/framework/prompt/PromptTypes.d.ts.map +0 -1
  284. package/dist/framework/prompt/PromptTypes.js.map +0 -1
  285. package/dist/framework/prompt/definePrompt.d.ts.map +0 -1
  286. package/dist/framework/prompt/definePrompt.js.map +0 -1
  287. package/dist/framework/prompt/index.d.ts.map +0 -1
  288. package/dist/framework/prompt/index.js.map +0 -1
  289. package/dist/framework/registry/PromptRegistry.d.ts.map +0 -1
  290. package/dist/framework/registry/PromptRegistry.js.map +0 -1
  291. package/dist/framework/registry/ToolFilterEngine.d.ts.map +0 -1
  292. package/dist/framework/registry/ToolFilterEngine.js.map +0 -1
  293. package/dist/framework/registry/ToolRegistry.d.ts.map +0 -1
  294. package/dist/framework/registry/ToolRegistry.js.map +0 -1
  295. package/dist/framework/registry/index.d.ts +0 -6
  296. package/dist/framework/registry/index.d.ts.map +0 -1
  297. package/dist/framework/registry/index.js.map +0 -1
  298. package/dist/framework/response.d.ts.map +0 -1
  299. package/dist/framework/response.js.map +0 -1
  300. package/dist/framework/result.d.ts.map +0 -1
  301. package/dist/framework/result.js.map +0 -1
  302. package/dist/framework/schema/AnnotationAggregator.d.ts.map +0 -1
  303. package/dist/framework/schema/AnnotationAggregator.js.map +0 -1
  304. package/dist/framework/schema/DescriptionGenerator.d.ts.map +0 -1
  305. package/dist/framework/schema/DescriptionGenerator.js.map +0 -1
  306. package/dist/framework/schema/SchemaGenerator.d.ts.map +0 -1
  307. package/dist/framework/schema/SchemaGenerator.js.map +0 -1
  308. package/dist/framework/schema/SchemaUtils.d.ts +0 -8
  309. package/dist/framework/schema/SchemaUtils.d.ts.map +0 -1
  310. package/dist/framework/schema/SchemaUtils.js.map +0 -1
  311. package/dist/framework/schema/ToonDescriptionGenerator.d.ts.map +0 -1
  312. package/dist/framework/schema/ToonDescriptionGenerator.js.map +0 -1
  313. package/dist/framework/schema/index.d.ts.map +0 -1
  314. package/dist/framework/schema/index.js.map +0 -1
  315. package/dist/framework/server/ExpositionCompiler.d.ts.map +0 -1
  316. package/dist/framework/server/ExpositionCompiler.js.map +0 -1
  317. package/dist/framework/server/ExpositionTypes.d.ts.map +0 -1
  318. package/dist/framework/server/ExpositionTypes.js.map +0 -1
  319. package/dist/framework/server/ServerAttachment.d.ts.map +0 -1
  320. package/dist/framework/server/ServerAttachment.js.map +0 -1
  321. package/dist/framework/server/ServerResolver.d.ts.map +0 -1
  322. package/dist/framework/server/ServerResolver.js.map +0 -1
  323. package/dist/framework/server/index.d.ts.map +0 -1
  324. package/dist/framework/server/index.js +0 -5
  325. package/dist/framework/server/index.js.map +0 -1
  326. package/dist/framework/state-sync/CausalEngine.d.ts.map +0 -1
  327. package/dist/framework/state-sync/CausalEngine.js.map +0 -1
  328. package/dist/framework/state-sync/DescriptionDecorator.d.ts.map +0 -1
  329. package/dist/framework/state-sync/DescriptionDecorator.js.map +0 -1
  330. package/dist/framework/state-sync/GlobMatcher.d.ts.map +0 -1
  331. package/dist/framework/state-sync/GlobMatcher.js.map +0 -1
  332. package/dist/framework/state-sync/PolicyEngine.d.ts.map +0 -1
  333. package/dist/framework/state-sync/PolicyEngine.js.map +0 -1
  334. package/dist/framework/state-sync/PolicyValidator.d.ts.map +0 -1
  335. package/dist/framework/state-sync/PolicyValidator.js +0 -72
  336. package/dist/framework/state-sync/PolicyValidator.js.map +0 -1
  337. package/dist/framework/state-sync/ResponseDecorator.d.ts.map +0 -1
  338. package/dist/framework/state-sync/ResponseDecorator.js.map +0 -1
  339. package/dist/framework/state-sync/StateSyncLayer.d.ts.map +0 -1
  340. package/dist/framework/state-sync/StateSyncLayer.js.map +0 -1
  341. package/dist/framework/state-sync/index.d.ts.map +0 -1
  342. package/dist/framework/state-sync/index.js.map +0 -1
  343. package/dist/framework/state-sync/types.d.ts.map +0 -1
  344. package/dist/framework/state-sync/types.js.map +0 -1
  345. package/dist/framework/types.d.ts.map +0 -1
  346. package/dist/framework/types.js.map +0 -1
  347. /package/dist/{framework/client → client}/index.d.ts +0 -0
  348. /package/dist/{framework/client → client}/index.js +0 -0
  349. /package/dist/{framework → core}/builder/ActionGroupBuilder.d.ts +0 -0
  350. /package/dist/{framework → core}/builder/ActionGroupBuilder.js +0 -0
  351. /package/dist/{framework → core}/builder/ParamDescriptors.d.ts +0 -0
  352. /package/dist/{framework → core}/builder/ToolDefinitionCompiler.d.ts +0 -0
  353. /package/dist/{framework → core}/builder/index.d.ts +0 -0
  354. /package/dist/{framework → core}/builder/index.js +0 -0
  355. /package/dist/{framework → core}/execution/ExecutionPipeline.d.ts +0 -0
  356. /package/dist/{framework → core}/execution/ProgressHelper.d.ts +0 -0
  357. /package/dist/{framework → core}/execution/ProgressHelper.js +0 -0
  358. /package/dist/{framework → core}/middleware/ContextDerivation.d.ts +0 -0
  359. /package/dist/{framework → core}/middleware/ContextDerivation.js +0 -0
  360. /package/dist/{framework → core}/middleware/index.d.ts +0 -0
  361. /package/dist/{framework → core}/middleware/index.js +0 -0
  362. /package/dist/{framework → core}/registry/ToolFilterEngine.d.ts +0 -0
  363. /package/dist/{framework → core}/result.d.ts +0 -0
  364. /package/dist/{framework → core}/result.js +0 -0
  365. /package/dist/{framework → core}/schema/AnnotationAggregator.d.ts +0 -0
  366. /package/dist/{framework → core}/schema/AnnotationAggregator.js +0 -0
  367. /package/dist/{framework → core}/schema/DescriptionGenerator.d.ts +0 -0
  368. /package/dist/{framework → core}/schema/DescriptionGenerator.js +0 -0
  369. /package/dist/{framework → core}/schema/SchemaGenerator.d.ts +0 -0
  370. /package/dist/{framework → core}/schema/ToonDescriptionGenerator.d.ts +0 -0
  371. /package/dist/{framework → core}/schema/ToonDescriptionGenerator.js +0 -0
  372. /package/dist/{framework/introspection → introspection}/index.d.ts +0 -0
  373. /package/dist/{framework/introspection → introspection}/index.js +0 -0
  374. /package/dist/{framework/introspection → introspection}/types.d.ts +0 -0
  375. /package/dist/{framework/introspection → introspection}/types.js +0 -0
  376. /package/dist/{framework/observability → observability}/DebugObserver.d.ts +0 -0
  377. /package/dist/{framework/observability → observability}/DebugObserver.js +0 -0
  378. /package/dist/{framework/observability → observability}/Tracing.d.ts +0 -0
  379. /package/dist/{framework/observability → observability}/Tracing.js +0 -0
  380. /package/dist/{framework/presenter → presenter}/Presenter.d.ts +0 -0
  381. /package/dist/{framework/presenter → presenter}/index.d.ts +0 -0
  382. /package/dist/{framework/presenter → presenter}/index.js +0 -0
  383. /package/dist/{framework/presenter → presenter}/ui.d.ts +0 -0
  384. /package/dist/{framework/presenter → presenter}/ui.js +0 -0
  385. /package/dist/{framework/prompt → prompt}/index.js +0 -0
  386. /package/dist/{framework/server → server}/ServerResolver.d.ts +0 -0
  387. /package/dist/{framework/server → server}/ServerResolver.js +0 -0
  388. /package/dist/{framework/state-sync → state-sync}/CausalEngine.d.ts +0 -0
  389. /package/dist/{framework/state-sync → state-sync}/CausalEngine.js +0 -0
  390. /package/dist/{framework/state-sync → state-sync}/DescriptionDecorator.d.ts +0 -0
  391. /package/dist/{framework/state-sync → state-sync}/DescriptionDecorator.js +0 -0
  392. /package/dist/{framework/state-sync → state-sync}/GlobMatcher.d.ts +0 -0
  393. /package/dist/{framework/state-sync → state-sync}/GlobMatcher.js +0 -0
  394. /package/dist/{framework/state-sync → state-sync}/PolicyEngine.d.ts +0 -0
  395. /package/dist/{framework/state-sync → state-sync}/PolicyEngine.js +0 -0
  396. /package/dist/{framework/state-sync → state-sync}/StateSyncLayer.js +0 -0
  397. /package/dist/{framework/state-sync → state-sync}/index.d.ts +0 -0
  398. /package/dist/{framework/state-sync → state-sync}/index.js +0 -0
  399. /package/dist/{framework/state-sync → state-sync}/types.d.ts +0 -0
  400. /package/dist/{framework/state-sync → state-sync}/types.js +0 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,78 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.6.2] - 2026-02-23
9
+
10
+ ### 🧪 End-to-End Integration Test Suite
11
+
12
+ Comprehensive integration test suite (`tests/integration/FullStack.test.ts`) covering **all modules working together** through the MCP Server mock — happy paths AND sad paths. Ensures the framework resolves developer mistakes gracefully without crashing.
13
+
14
+ ### Added
15
+
16
+ - **37 integration tests** in `FullStack.test.ts` organized across 22 `describe` blocks:
17
+
18
+ **Happy paths (15 tests):**
19
+ - Builder → Registry → Server → ContextFactory
20
+ - Builder → Presenter → Server (auto-view composition)
21
+ - Builder → Middleware → Debug Observability (cross-layer events)
22
+ - Builder → Middleware → Tracing (OTel span lifecycle)
23
+ - Builder → StateSync → Server (cache-control + invalidation)
24
+ - PromptRegistry → Server (prompts/list + prompts/get)
25
+ - Builder → Flat Exposition → Server (atomic tool projection)
26
+ - Flat Exposition → Debug + Tracing (2 tests)
27
+ - Full Stack — ALL modules in a single server attachment
28
+ - Concurrent multi-tool calls (20 parallel + traced, 2 tests)
29
+ - Presenter → Tracing → Server
30
+ - Detach → Re-attach lifecycle
31
+ - defineMiddleware → defineTool → Server
32
+
33
+ **Sad paths (22 tests):**
34
+ - **Routing Failures (4):** Unknown tool (`UNKNOWN_TOOL` + suggestions), unknown action, missing/null/empty discriminator, unknown flat tool name
35
+ - **Validation Failures (3):** Wrong types, constraint violations (min/max/email), strict mode extra field rejection, flat mode validation
36
+ - **Handler Exceptions (3):** Handler `throw` → `isError=true` (grouped + flat), soft fail vs hard fail tracing distinction (`UNSET` vs `ERROR` + `recordException`)
37
+ - **Middleware Failures (3):** Middleware block + debug error event, middleware exception traced as system error, multi-middleware chain ordering (first blocker wins)
38
+ - **Concurrent Mixed Results (1):** 5 simultaneous calls — 2 success + 1 validation error + 1 throw + 1 unknown action — isolated
39
+ - **Debug + Tracing Error Correlation (2):** Debug error for unknown tool, traced validation error when both debug+tracing coexist
40
+ - **defineTool Param Descriptor Errors (2):** Constraint violations via descriptors, shared param missing/empty
41
+ - **StateSync Config Errors (2):** Invalid `cacheControl` directives rejected at attach time
42
+ - **Detach Error Handling (2):** Post-detach calls return error, tools/list returns empty, double detach is idempotent
43
+
44
+ - **Mock strategy:** Only the MCP Server is mocked — no internal framework mocking. Tests exercise the full pipeline (routing → validation → middleware → handler → observability → response).
45
+
46
+ ### Test Suite
47
+
48
+ - **1,492 tests** across 68 files, all passing.
49
+
50
+ ## [1.6.1] - 2026-02-23
51
+
52
+ ### 🛡️ XML Security & Error Protocol Hardening
53
+
54
+ Comprehensive security audit of the XML error protocol. Prevents XML injection, hardens type safety, and upgrades the registry-level error to the structured `toolError()` protocol.
55
+
56
+ ### Security
57
+
58
+ - **XML injection prevention:** Introduced `escapeXml()` (element content — escapes `&` and `<`) and `escapeXmlAttr()` (attribute values — escapes all 5 XML special characters). Applied across `response.ts`, `ExecutionPipeline.ts`, `ValidationErrorFormatter.ts`, and `PromptExecutionPipeline.ts`.
59
+ - **Dual escaping strategy:** Element content preserves `>` for LLM readability (`>= 1`, `Must be > 0`). Attribute values use strict escaping.
60
+
61
+ ### Fixed
62
+
63
+ - **Type safety in `parseDiscriminator`:** Replaced unsafe `as string` cast with runtime `typeof` check. Non-string discriminator values (numbers, booleans, objects) now return `MISSING_DISCRIMINATOR` instead of causing `TypeError: str.replace is not a function`.
64
+ - **Structured `UNKNOWN_TOOL` error:** `ToolRegistry.routeCall()` now returns `toolError('UNKNOWN_TOOL', ...)` with structured XML (code, message, available tools, recovery hint) instead of a freeform `error()` string. Consistent with pipeline-level errors (`MISSING_DISCRIMINATOR`, `UNKNOWN_ACTION`).
65
+
66
+ ### Documentation
67
+
68
+ - **error-handling.md:** Added `UNKNOWN_TOOL` to the Unified XML Protocol table. Added XML Security tip callout.
69
+ - **llms.txt:** Added XML security note with pipeline error codes. Added `unknown_tool` to tracing error classification.
70
+
71
+ ### DX
72
+
73
+ - **English error messages:** Translated remaining Portuguese error message in `defineTool.ts` to English.
74
+
75
+ ### Test Suite
76
+
77
+ - **1,389 tests** across 417 suites, all passing.
78
+
7
79
  ## [1.6.0] - 2026-02-23
8
80
 
9
81
  ### 🔗 MVA-Driven Prompts — `PromptMessage.fromView()`
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <div align="center">
2
- <h1>⚡️ mcp-fusion</h1>
2
+ <h1>⚡️ **MCP Fusion**</h1>
3
3
  <p><b>The MVA (Model-View-Agent) framework for the Model Context Protocol.</b></p>
4
4
  <p>Structured perception for AI agents — validated data, domain rules, UI blocks, and action affordances in every response.</p>
5
5
 
@@ -21,7 +21,7 @@ npm install @vinkius-core/mcp-fusion zod
21
21
 
22
22
  ## Overview
23
23
 
24
- mcp-fusion introduces the **MVA (Model-View-Agent)** pattern — a Presenter layer between your data and the AI agent. Instead of passing raw JSON through `JSON.stringify()`, every response is a **structured perception package**: validated data, domain rules, rendered charts, action affordances, and cognitive guardrails.
24
+ **MCP Fusion** introduces the **MVA (Model-View-Agent)** pattern — a Presenter layer between your data and the AI agent. Instead of passing raw JSON through `JSON.stringify()`, every response is a **structured perception package**: validated data, domain rules, rendered charts, action affordances, and cognitive guardrails.
25
25
 
26
26
  ```text
27
27
  Model (Zod Schema) → View (Presenter) → Agent (LLM)
@@ -258,10 +258,12 @@ return toolError('ProjectNotFound', {
258
258
  });
259
259
  ```
260
260
 
261
- ```text
262
- [ProjectNotFound] Project 'xyz' does not exist.
263
- 💡 Suggestion: Call projects.list first to get valid IDs.
264
- 📋 Try: projects.list
261
+ ```xml
262
+ <tool_error code="ProjectNotFound">
263
+ <message>Project 'xyz' does not exist.</message>
264
+ <recovery>Call projects.list first to get valid IDs.</recovery>
265
+ <available_actions>projects.list</available_actions>
266
+ </tool_error>
265
267
  ```
266
268
 
267
269
  ---
@@ -25,7 +25,7 @@
25
25
  *
26
26
  * @module
27
27
  */
28
- import { type ToolResponse } from '../response.js';
28
+ import { type ToolResponse } from '../core/response.js';
29
29
  /**
30
30
  * Transport interface for the fusion client.
31
31
  * This abstracts the MCP transport layer (stdio, HTTP, WebSocket, etc.)
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FusionClient.d.ts","sourceRoot":"","sources":["../../src/client/FusionClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC5B,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAChF;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,WAAW,YAAY,CAAC,OAAO,SAAS,SAAS;IACnD;;;;;;OAMG;IACH,OAAO,CAAC,OAAO,SAAS,MAAM,OAAO,GAAG,MAAM,EAC1C,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GACvB,OAAO,CAAC,YAAY,CAAC,CAAC;CAC5B;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,SAAS,SAAS,EACxD,SAAS,EAAE,eAAe,GAC3B,YAAY,CAAC,OAAO,CAAC,CAqBvB"}
@@ -25,7 +25,7 @@
25
25
  *
26
26
  * @module
27
27
  */
28
- import {} from '../response.js';
28
+ import {} from '../core/response.js';
29
29
  // ============================================================================
30
30
  // Factory
31
31
  // ============================================================================
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FusionClient.js","sourceRoot":"","sources":["../../src/client/FusionClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAqB,MAAM,qBAAqB,CAAC;AAoDxD,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,kBAAkB,CAC9B,SAA0B;IAE1B,OAAO;QACH,KAAK,CAAC,OAAO,CACT,MAAe,EACf,IAAsB;YAEtB,mDAAmD;YACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;gBAClB,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YAElD,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE;gBAChC,MAAM,EAAE,UAAU;gBAClB,GAAG,IAAI;aACV,CAAC,CAAC;QACP,CAAC;KACJ,CAAC;AACN,CAAC"}
@@ -26,7 +26,8 @@
26
26
  *
27
27
  * @module
28
28
  */
29
- import { type GroupedToolBuilder } from '../builder/GroupedToolBuilder.js';
29
+ import { type GroupedToolBuilder } from '../core/builder/GroupedToolBuilder.js';
30
+ import { type ToolRegistry } from '../core/registry/ToolRegistry.js';
30
31
  /**
31
32
  * A typed wrapper around `ToolRegistry` that preserves builder types
32
33
  * for compile-time router inference.
@@ -40,7 +41,7 @@ import { type GroupedToolBuilder } from '../builder/GroupedToolBuilder.js';
40
41
  */
41
42
  export interface TypedToolRegistry<TContext, TBuilders extends readonly unknown[]> {
42
43
  /** The underlying ToolRegistry instance (for runtime use) */
43
- readonly registry: import('../registry/ToolRegistry.js').ToolRegistry<TContext>;
44
+ readonly registry: ToolRegistry<TContext>;
44
45
  /** Branded field for type inference — never accessed at runtime */
45
46
  readonly _builders: TBuilders;
46
47
  /** Branded phantom type for context inference */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InferRouter.d.ts","sourceRoot":"","sources":["../../src/client/InferRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAMrE;;;;;;;;;;GAUG;AACH,MAAM,WAAW,iBAAiB,CAAC,QAAQ,EAAE,SAAS,SAAS,SAAS,OAAO,EAAE;IAC7E,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC/B;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IACrB,CAAC,SAAS,iBAAiB,CAAC,MAAM,KAAK,EAAE,MAAM,SAAS,CAAC,GACnD,uBAAuB,CAAC,SAAS,CAAC,GAClC,CAAC,SAAS,SAAS,OAAO,EAAE,GACxB,uBAAuB,CAAC,CAAC,CAAC,GAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEtD;;;;;;GAMG;AACH,KAAK,uBAAuB,CAAC,CAAC,IAC1B,CAAC,SAAS,SAAS,CAAC,MAAM,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,GACzC,gBAAgB,CAAC,KAAK,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,GACvD,CAAC,SAAS,SAAS,EAAE,GAEjB,EAAE,GACF,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEtD;;;;;;;GAOG;AACH,KAAK,gBAAgB,CAAC,CAAC,IACnB,CAAC,SAAS,kBAAkB,CAAC,MAAM,KAAK,EAAE,MAAM,QAAQ,EAAE,MAAM,MAAM,EAAE,MAAM,UAAU,CAAC,GACnF,UAAU,GACV,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC"}
@@ -26,5 +26,6 @@
26
26
  *
27
27
  * @module
28
28
  */
29
- import {} from '../builder/GroupedToolBuilder.js';
29
+ import {} from '../core/builder/GroupedToolBuilder.js';
30
+ import {} from '../core/registry/ToolRegistry.js';
30
31
  //# sourceMappingURL=InferRouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InferRouter.js","sourceRoot":"","sources":["../../src/client/InferRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAA2B,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAqB,MAAM,kCAAkC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type ToolBuilder } from '../types.js';
1
+ import { type ToolBuilder } from '../core/types.js';
2
2
  import { type TypedToolRegistry } from './InferRouter.js';
3
3
  /**
4
4
  * Create a type-preserving tool registry.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTypedRegistry.d.ts","sourceRoot":"","sources":["../../src/client/createTypedRegistry.ts"],"names":[],"mappings":"AAuCA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,MACvB,SAAS,SAAS,WAAW,CAAC,QAAQ,CAAC,EAAE,EACtD,GAAG,UAAU,SAAS,KACvB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAS5C"}
@@ -36,8 +36,8 @@
36
36
  *
37
37
  * @module
38
38
  */
39
- import { ToolRegistry } from '../registry/ToolRegistry.js';
40
- import {} from '../types.js';
39
+ import { ToolRegistry } from '../core/registry/ToolRegistry.js';
40
+ import {} from '../core/types.js';
41
41
  import {} from './InferRouter.js';
42
42
  /**
43
43
  * Create a type-preserving tool registry.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTypedRegistry.js","sourceRoot":"","sources":["../../src/client/createTypedRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAoB,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAA0B,MAAM,kBAAkB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,mBAAmB;IAC/B,OAAO,UACH,GAAG,QAAmB;QAEtB,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAY,CAAC;QAC9C,QAAQ,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC;QAClC,OAAO;YACH,QAAQ;YACR,SAAS,EAAE,QAAQ;YACnB,QAAQ,EAAE,SAAgC;SAC7C,CAAC;IACN,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,YAAY,EACR,YAAY,EACZ,eAAe,EACf,SAAS,GACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAMvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionGroupBuilder.d.ts","sourceRoot":"","sources":["../../../src/core/builder/ActionGroupBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AACvD,OAAO,EACH,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,EACpB,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,iBAAiB,CAAC,QAAQ,EAAE,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC3E,CAAC,KAAK,EAAE,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAI3D;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAC5C,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,EAC9B,gBAAgB,EAAE,MAAM,EAAE,GAAG,SAAS,GACvC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAC5B,YAAY,GAAG,aAAa,GAAG,QAAQ,GAAG,aAAa,GACvD,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,kBAAkB,GAAG,SAAS,CACzE,CAYA;AAID,qBAAa,kBAAkB,CAAC,QAAQ,EAAE,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IACrG,gBAAgB;IAChB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAM;IACnD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;IAClE,OAAO,CAAC,gBAAgB,CAAgB;gBAE5B,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IAKnD;;;;;;;;;;;;;;;;;;OAkBG;IACH,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,IAAI;IAKrC;;;;;;;;;;;;;;;;;;OAkBG;IACH,UAAU,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAKrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,MAAM,CAAC,OAAO,SAAS,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,SAAS,MAAM,OAAO,GAAG,KAAK,EAAE,MAAM,EAAE;QACxF,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,OAAO,CAAC;QAChB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;KACtG,GAAG,IAAI;IACR,gEAAgE;IAChE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,IAAI;CAuB/C"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionGroupBuilder.js","sourceRoot":"","sources":["../../../src/core/builder/ActionGroupBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,EAAoC,MAAM,KAAK,CAAC;AACvD,OAAO,EAKN,MAAM,aAAa,CAAC;AAsBrB,4DAA4D;AAE5D;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,uBAAuB,CACnC,MAA8B,EAC9B,gBAAsC;IAKtC,OAAO;QACH,UAAU,EAAE,MAAM,CAAC,IAAI;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,SAAS;QAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;QAClC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,SAAS;QAC5C,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;QAC1C,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,SAAS;QACtC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,gBAAgB,EAAE,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;QACpF,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,SAAS;KACvC,CAAC;AACN,CAAC;AAED,4DAA4D;AAE5D,MAAM,OAAO,kBAAkB;IAC3B,gBAAgB;IACP,QAAQ,GAA+B,EAAE,CAAC;IAClC,UAAU,CAAS;IACnB,iBAAiB,CAAS;IAC1B,iBAAiB,GAA6B,EAAE,CAAC;IAC1D,gBAAgB,GAAa,EAAE,CAAC;IAExC,YAAY,SAAiB,EAAE,WAAoB;QAC/C,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,iBAAiB,GAAG,WAAW,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,GAAG,CAAC,EAA0B;QAC1B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,UAAU,CAAC,GAAG,MAAgB;QAC1B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IAChB,CAAC;IA6CD,MAAM,CAAC,MAA8B;QACjC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CACX,gBAAgB,MAAM,CAAC,IAAI,2BAA2B;gBACtD,oEAAoE,CACvE,CAAC;QACN,CAAC;QAED,qDAAqD;QACrD,MAAM,SAAS,GAAI,MAAoC,CAAC,UAAU,IAAI,EAAE,CAAC;QACzE,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAE1E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACf,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,EAAE;YACxC,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,gBAAgB,EAAE,IAAI,CAAC,iBAAiB;YACxC,GAAG,uBAAuB,CAAC,MAAM,EAAE,UAAU,CAAC;YAC9C,WAAW,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC;gBAC1C,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS;SAChD,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
@@ -46,8 +46,8 @@
46
46
  import { type ZodObject, type ZodRawShape } from 'zod';
47
47
  import { type Tool as McpTool } from '@modelcontextprotocol/sdk/types.js';
48
48
  import { type ToolResponse, type ToolBuilder, type ActionMetadata, type InternalAction, type MiddlewareFn, type ActionConfig } from '../types.js';
49
- import { type DebugObserverFn } from '../observability/DebugObserver.js';
50
- import { type FusionTracer } from '../observability/Tracing.js';
49
+ import { type DebugObserverFn } from '../../observability/DebugObserver.js';
50
+ import { type FusionTracer } from '../../observability/Tracing.js';
51
51
  import { type ProgressSink } from '../execution/ProgressHelper.js';
52
52
  import { type GroupConfigurator } from './ActionGroupBuilder.js';
53
53
  export { ActionGroupBuilder } from './ActionGroupBuilder.js';
@@ -478,18 +478,26 @@ export declare class GroupedToolBuilder<TContext = void, TCommon extends Record<
478
478
  * ```
479
479
  */
480
480
  execute(ctx: TContext, args: Record<string, unknown>, progressSink?: ProgressSink): Promise<ToolResponse>;
481
- /** Fast path: zero overhead — no conditionals, no timing, no allocations. */
482
- private _executeFast;
483
- /** Debug path: emit structured DebugEvent at each step (unchanged from pre-tracing). */
484
- private _executeDebug;
485
481
  /**
486
- * Traced path: OpenTelemetry-compatible span creation.
482
+ * Pipeline hooks for observability instrumentation.
483
+ *
484
+ * Each hook is called at the corresponding pipeline step.
485
+ * The fast path passes `undefined` (zero overhead).
486
+ * Debug and traced paths supply their hooks via factory methods.
487
+ */
488
+ private _executePipeline;
489
+ /**
490
+ * Build debug hooks: lightweight event emission.
491
+ */
492
+ private _buildDebugHooks;
493
+ /**
494
+ * Build traced hooks: OpenTelemetry-compatible span creation.
487
495
  *
488
496
  * Creates ONE span per tool call with events for pipeline steps.
489
- * Uses `finally` for leak-proof span closure.
497
+ * Uses wrapResponse for leak-proof span closure.
490
498
  * AI errors → UNSET, system errors → ERROR.
491
499
  */
492
- private _executeTraced;
500
+ private _buildTracedHooks;
493
501
  /** Get the tool name. */
494
502
  getName(): string;
495
503
  /** Get a copy of the capability tags. */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupedToolBuilder.d.ts","sourceRoot":"","sources":["../../../src/core/builder/GroupedToolBuilder.ts"],"names":[],"mappings":"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"}
@@ -47,11 +47,12 @@ import {} from 'zod';
47
47
  import {} from '@modelcontextprotocol/sdk/types.js';
48
48
  import { error } from '../response.js';
49
49
  import {} from '../types.js';
50
- import {} from '../observability/DebugObserver.js';
51
- import { SpanStatusCode } from '../observability/Tracing.js';
50
+ import {} from '../../observability/DebugObserver.js';
51
+ import { SpanStatusCode } from '../../observability/Tracing.js';
52
52
  import { getActionRequiredFields } from '../schema/SchemaUtils.js';
53
53
  import { parseDiscriminator, resolveAction, validateArgs, runChain, } from '../execution/ExecutionPipeline.js';
54
54
  import {} from '../execution/ProgressHelper.js';
55
+ import { computeResponseSize } from '../execution/PipelineHooks.js';
55
56
  import { compileToolDefinition } from './ToolDefinitionCompiler.js';
56
57
  import { ActionGroupBuilder, mapConfigToActionFields, } from './ActionGroupBuilder.js';
57
58
  // ── Re-exports for Public API Compatibility ──────────────
@@ -515,87 +516,121 @@ export class GroupedToolBuilder {
515
516
  if (!execCtx) {
516
517
  return error(`Builder "${this._name}" failed to initialize.`);
517
518
  }
518
- // Path 1: Tracing full span hierarchy (enterprise)
519
+ // Traced path: wrap in try/catch for system error → graceful response
519
520
  if (this._tracer) {
520
- return this._executeTraced(execCtx, ctx, args, progressSink);
521
+ const hooks = this._buildTracedHooks();
522
+ try {
523
+ return await this._executePipeline(execCtx, ctx, args, progressSink, hooks);
524
+ }
525
+ catch (err) {
526
+ // System failure caught here — hooks already recorded it on the span
527
+ const message = err instanceof Error ? err.message : String(err);
528
+ const response = error(`[${this._name}] ${message}`);
529
+ hooks.wrapResponse(response); // finalize span
530
+ return response;
531
+ }
521
532
  }
522
- // Path 2: Debug lightweight event emission (backward compat)
533
+ // Debug path: hooks with event emission
523
534
  if (this._debug) {
524
- return this._executeDebug(execCtx, ctx, args, progressSink);
535
+ return this._executePipeline(execCtx, ctx, args, progressSink, this._buildDebugHooks());
525
536
  }
526
- // Path 3: Fast — zero overhead (no observability)
527
- return this._executeFast(execCtx, ctx, args, progressSink);
537
+ // Fast path: zero overhead (no hooks)
538
+ return this._executePipeline(execCtx, ctx, args, progressSink);
528
539
  }
529
540
  // ── Execution Paths (private) ────────────────────────
530
- /** Fast path: zero overhead — no conditionals, no timing, no allocations. */
531
- async _executeFast(execCtx, ctx, args, progressSink) {
532
- const disc = parseDiscriminator(execCtx, args);
533
- if (!disc.ok)
534
- return disc.response;
535
- const resolved = resolveAction(execCtx, disc.value);
536
- if (!resolved.ok)
537
- return resolved.response;
538
- const validated = validateArgs(execCtx, resolved.value, args);
539
- if (!validated.ok)
540
- return validated.response;
541
- return runChain(execCtx, resolved.value, ctx, validated.value, progressSink);
542
- }
543
- /** Debug path: emit structured DebugEvent at each step (unchanged from pre-tracing). */
544
- async _executeDebug(execCtx, ctx, args, progressSink) {
545
- const debug = this._debug;
546
- const startTime = performance.now();
541
+ /**
542
+ * Pipeline hooks for observability instrumentation.
543
+ *
544
+ * Each hook is called at the corresponding pipeline step.
545
+ * The fast path passes `undefined` (zero overhead).
546
+ * Debug and traced paths supply their hooks via factory methods.
547
+ */
548
+ async _executePipeline(execCtx, ctx, args, progressSink, hooks) {
547
549
  // Step 1: Route
548
550
  const disc = parseDiscriminator(execCtx, args);
549
551
  if (!disc.ok) {
550
- debug({ type: 'error', tool: this._name, action: '?', error: 'Missing discriminator', step: 'route', timestamp: Date.now() });
551
- return disc.response;
552
+ hooks?.onRouteError?.();
553
+ return hooks?.wrapResponse?.(disc.response) ?? disc.response;
552
554
  }
553
555
  const actionName = disc.value;
554
- debug({ type: 'route', tool: this._name, action: actionName, timestamp: Date.now() });
556
+ hooks?.onRouteOk?.(actionName);
555
557
  // Step 2: Resolve
556
558
  const resolved = resolveAction(execCtx, actionName);
557
559
  if (!resolved.ok) {
558
- debug({ type: 'error', tool: this._name, action: actionName, error: `Unknown action "${actionName}"`, step: 'route', timestamp: Date.now() });
559
- return resolved.response;
560
+ hooks?.onResolveError?.(actionName);
561
+ return hooks?.wrapResponse?.(resolved.response) ?? resolved.response;
560
562
  }
561
563
  // Step 3: Validate
562
564
  const validateStart = performance.now();
563
565
  const validated = validateArgs(execCtx, resolved.value, args);
564
- const validateDuration = performance.now() - validateStart;
566
+ const validateMs = performance.now() - validateStart;
565
567
  if (!validated.ok) {
566
- debug({ type: 'validate', tool: this._name, action: actionName, valid: false, error: 'Validation failed', durationMs: validateDuration, timestamp: Date.now() });
567
- return validated.response;
568
+ hooks?.onValidateError?.(actionName, validateMs);
569
+ return hooks?.wrapResponse?.(validated.response) ?? validated.response;
568
570
  }
569
- debug({ type: 'validate', tool: this._name, action: actionName, valid: true, durationMs: validateDuration, timestamp: Date.now() });
570
- // Step 4: Middleware chain info (global + action-level)
571
+ hooks?.onValidateOk?.(actionName, validateMs);
572
+ // Step 4: Middleware info
571
573
  const actionMwCount = resolved.value.action.middlewares?.length ?? 0;
572
574
  const globalMwCount = this._middlewares.length;
573
575
  const chainLength = globalMwCount + actionMwCount;
574
576
  if (chainLength > 0) {
575
- debug({ type: 'middleware', tool: this._name, action: actionName, chainLength, timestamp: Date.now() });
577
+ hooks?.onMiddleware?.(actionName, chainLength);
576
578
  }
577
579
  // Step 5: Execute
578
580
  try {
579
- const response = await runChain(execCtx, resolved.value, ctx, validated.value, progressSink);
580
- const totalDuration = performance.now() - startTime;
581
- const isErr = response.isError === true;
582
- debug({ type: 'execute', tool: this._name, action: actionName, durationMs: totalDuration, isError: isErr, timestamp: Date.now() });
583
- return response;
581
+ const response = await runChain(execCtx, resolved.value, ctx, validated.value, progressSink, hooks?.rethrow);
582
+ hooks?.onExecuteOk?.(actionName, response);
583
+ return hooks?.wrapResponse?.(response) ?? response;
584
584
  }
585
585
  catch (err) {
586
- const message = err instanceof Error ? err.message : String(err);
587
- debug({ type: 'error', tool: this._name, action: actionName, error: message, step: 'execute', timestamp: Date.now() });
588
- throw err;
586
+ hooks?.onExecuteError?.(actionName, err);
587
+ throw err; // only reached when rethrow=true (traced path handles it)
589
588
  }
590
589
  }
591
590
  /**
592
- * Traced path: OpenTelemetry-compatible span creation.
591
+ * Build debug hooks: lightweight event emission.
592
+ */
593
+ _buildDebugHooks() {
594
+ const debug = this._debug;
595
+ const toolName = this._name;
596
+ const startTime = performance.now();
597
+ return {
598
+ onRouteError: () => {
599
+ debug({ type: 'error', tool: toolName, action: '?', error: 'Missing discriminator', step: 'route', timestamp: Date.now() });
600
+ },
601
+ onRouteOk: (action) => {
602
+ debug({ type: 'route', tool: toolName, action, timestamp: Date.now() });
603
+ },
604
+ onResolveError: (action) => {
605
+ debug({ type: 'error', tool: toolName, action, error: `Unknown action "${action}"`, step: 'route', timestamp: Date.now() });
606
+ },
607
+ onValidateError: (action, durationMs) => {
608
+ debug({ type: 'validate', tool: toolName, action, valid: false, error: 'Validation failed', durationMs, timestamp: Date.now() });
609
+ },
610
+ onValidateOk: (action, durationMs) => {
611
+ debug({ type: 'validate', tool: toolName, action, valid: true, durationMs, timestamp: Date.now() });
612
+ },
613
+ onMiddleware: (action, chainLength) => {
614
+ debug({ type: 'middleware', tool: toolName, action, chainLength, timestamp: Date.now() });
615
+ },
616
+ onExecuteOk: (action, response) => {
617
+ const isErr = response.isError === true;
618
+ debug({ type: 'execute', tool: toolName, action, durationMs: performance.now() - startTime, isError: isErr, timestamp: Date.now() });
619
+ },
620
+ onExecuteError: (action, err) => {
621
+ const message = err instanceof Error ? err.message : String(err);
622
+ debug({ type: 'error', tool: toolName, action, error: message, step: 'execute', timestamp: Date.now() });
623
+ },
624
+ };
625
+ }
626
+ /**
627
+ * Build traced hooks: OpenTelemetry-compatible span creation.
593
628
  *
594
629
  * Creates ONE span per tool call with events for pipeline steps.
595
- * Uses `finally` for leak-proof span closure.
630
+ * Uses wrapResponse for leak-proof span closure.
596
631
  * AI errors → UNSET, system errors → ERROR.
597
632
  */
598
- async _executeTraced(execCtx, ctx, args, progressSink) {
633
+ _buildTracedHooks() {
599
634
  const tracer = this._tracer;
600
635
  const startAttrs = {
601
636
  'mcp.system': 'fusion',
@@ -609,77 +644,61 @@ export class GroupedToolBuilder {
609
644
  const startTime = performance.now();
610
645
  let statusCode = SpanStatusCode.UNSET;
611
646
  let statusMessage;
612
- let response;
613
- try {
614
- // Route
615
- const disc = parseDiscriminator(execCtx, args);
616
- if (!disc.ok) {
647
+ const finalizeSpan = (response) => {
648
+ span.setAttribute('mcp.durationMs', performance.now() - startTime);
649
+ if (response) {
650
+ span.setAttribute('mcp.response_size', computeResponseSize(response));
651
+ }
652
+ span.setStatus(statusMessage !== undefined
653
+ ? { code: statusCode, message: statusMessage }
654
+ : { code: statusCode });
655
+ span.end();
656
+ };
657
+ return {
658
+ rethrow: true,
659
+ onRouteError: () => {
617
660
  span.setAttribute('mcp.error_type', 'missing_discriminator');
618
661
  span.setAttribute('mcp.isError', true);
619
- return (response = disc.response);
620
- }
621
- span.setAttribute('mcp.action', disc.value);
622
- span.addEvent?.('mcp.route');
623
- // Resolve
624
- const resolved = resolveAction(execCtx, disc.value);
625
- if (!resolved.ok) {
662
+ },
663
+ onRouteOk: (action) => {
664
+ span.setAttribute('mcp.action', action);
665
+ span.addEvent?.('mcp.route');
666
+ },
667
+ onResolveError: () => {
626
668
  span.setAttribute('mcp.error_type', 'unknown_action');
627
669
  span.setAttribute('mcp.isError', true);
628
- return (response = resolved.response);
629
- }
630
- // Validate
631
- const validateStart = performance.now();
632
- const validated = validateArgs(execCtx, resolved.value, args);
633
- const validateMs = performance.now() - validateStart;
634
- if (!validated.ok) {
670
+ },
671
+ onValidateError: (_action, durationMs) => {
635
672
  span.setAttribute('mcp.error_type', 'validation_failed');
636
673
  span.setAttribute('mcp.isError', true);
637
- span.addEvent?.('mcp.validate', { 'mcp.valid': false, 'mcp.durationMs': validateMs });
638
- return (response = validated.response);
639
- }
640
- span.addEvent?.('mcp.validate', { 'mcp.valid': true, 'mcp.durationMs': validateMs });
641
- // Middleware info
642
- const actionMwCount = resolved.value.action.middlewares?.length ?? 0;
643
- const globalMwCount = this._middlewares.length;
644
- const chainLength = globalMwCount + actionMwCount;
645
- if (chainLength > 0) {
674
+ span.addEvent?.('mcp.validate', { 'mcp.valid': false, 'mcp.durationMs': durationMs });
675
+ },
676
+ onValidateOk: (_action, durationMs) => {
677
+ span.addEvent?.('mcp.validate', { 'mcp.valid': true, 'mcp.durationMs': durationMs });
678
+ },
679
+ onMiddleware: (_action, chainLength) => {
646
680
  span.addEvent?.('mcp.middleware', { 'mcp.chainLength': chainLength });
647
- }
648
- // Execute rethrow=true so handler exceptions propagate to our catch block
649
- response = await runChain(execCtx, resolved.value, ctx, validated.value, progressSink, true);
650
- const isErr = response.isError === true;
651
- // AI error (handler returned error()) → UNSET, not ERROR
652
- statusCode = isErr ? SpanStatusCode.UNSET : SpanStatusCode.OK;
653
- if (isErr)
654
- span.setAttribute('mcp.error_type', 'handler_returned_error');
655
- span.setAttribute('mcp.isError', isErr);
656
- return response;
657
- }
658
- catch (err) {
659
- // System failure — THIS is a real SpanStatusCode.ERROR
660
- const message = err instanceof Error ? err.message : String(err);
661
- span.recordException(err instanceof Error ? err : message);
662
- span.setAttribute('mcp.error_type', 'system_error');
663
- span.setAttribute('mcp.isError', true);
664
- statusCode = SpanStatusCode.ERROR;
665
- statusMessage = message;
666
- // Return graceful error response — don't throw (would crash MCP server)
667
- return (response = error(`[${this._name}] ${message}`));
668
- }
669
- finally {
670
- span.setAttribute('mcp.durationMs', performance.now() - startTime);
671
- if (response) {
672
- // Response size in bytes — useful for billing/quota dashboards
673
- let size = 0;
674
- for (const c of response.content) {
675
- if ('text' in c && typeof c.text === 'string')
676
- size += c.text.length;
677
- }
678
- span.setAttribute('mcp.response_size', size);
679
- }
680
- span.setStatus(statusMessage !== undefined ? { code: statusCode, message: statusMessage } : { code: statusCode });
681
- span.end(); // leak-proof: always called
682
- }
681
+ },
682
+ onExecuteOk: (_action, response) => {
683
+ const isErr = response.isError === true;
684
+ statusCode = isErr ? SpanStatusCode.UNSET : SpanStatusCode.OK;
685
+ if (isErr)
686
+ span.setAttribute('mcp.error_type', 'handler_returned_error');
687
+ span.setAttribute('mcp.isError', isErr);
688
+ },
689
+ onExecuteError: (_action, err) => {
690
+ const message = err instanceof Error ? err.message : String(err);
691
+ span.recordException(err instanceof Error ? err : message);
692
+ span.setAttribute('mcp.error_type', 'system_error');
693
+ span.setAttribute('mcp.isError', true);
694
+ statusCode = SpanStatusCode.ERROR;
695
+ statusMessage = message;
696
+ },
697
+ wrapResponse: (response) => {
698
+ finalizeSpan(response);
699
+ return response;
700
+ },
701
+ };
683
702
  }
684
703
  // ── Introspection ───────────────────────────────────
685
704
  /** Get the tool name. */