@vurb/core 3.2.0

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 (642) hide show
  1. package/README.md +677 -0
  2. package/dist/cli/args.d.ts +26 -0
  3. package/dist/cli/args.d.ts.map +1 -0
  4. package/dist/cli/args.js +117 -0
  5. package/dist/cli/args.js.map +1 -0
  6. package/dist/cli/commands/create.d.ts +11 -0
  7. package/dist/cli/commands/create.d.ts.map +1 -0
  8. package/dist/cli/commands/create.js +121 -0
  9. package/dist/cli/commands/create.js.map +1 -0
  10. package/dist/cli/commands/deploy.d.ts +3 -0
  11. package/dist/cli/commands/deploy.d.ts.map +1 -0
  12. package/dist/cli/commands/deploy.js +268 -0
  13. package/dist/cli/commands/deploy.js.map +1 -0
  14. package/dist/cli/commands/dev.d.ts +9 -0
  15. package/dist/cli/commands/dev.d.ts.map +1 -0
  16. package/dist/cli/commands/dev.js +58 -0
  17. package/dist/cli/commands/dev.js.map +1 -0
  18. package/dist/cli/commands/lock.d.ts +5 -0
  19. package/dist/cli/commands/lock.d.ts.map +1 -0
  20. package/dist/cli/commands/lock.js +94 -0
  21. package/dist/cli/commands/lock.js.map +1 -0
  22. package/dist/cli/commands/remote.d.ts +3 -0
  23. package/dist/cli/commands/remote.d.ts.map +1 -0
  24. package/dist/cli/commands/remote.js +37 -0
  25. package/dist/cli/commands/remote.js.map +1 -0
  26. package/dist/cli/constants.d.ts +18 -0
  27. package/dist/cli/constants.d.ts.map +1 -0
  28. package/dist/cli/constants.js +95 -0
  29. package/dist/cli/constants.js.map +1 -0
  30. package/dist/cli/progress.d.ts +34 -0
  31. package/dist/cli/progress.d.ts.map +1 -0
  32. package/dist/cli/progress.js +102 -0
  33. package/dist/cli/progress.js.map +1 -0
  34. package/dist/cli/rc.d.ts +11 -0
  35. package/dist/cli/rc.d.ts.map +1 -0
  36. package/dist/cli/rc.js +75 -0
  37. package/dist/cli/rc.js.map +1 -0
  38. package/dist/cli/registry.d.ts +25 -0
  39. package/dist/cli/registry.d.ts.map +1 -0
  40. package/dist/cli/registry.js +86 -0
  41. package/dist/cli/registry.js.map +1 -0
  42. package/dist/cli/scaffold.d.ts +10 -0
  43. package/dist/cli/scaffold.d.ts.map +1 -0
  44. package/dist/cli/scaffold.js +105 -0
  45. package/dist/cli/scaffold.js.map +1 -0
  46. package/dist/cli/templates/config.d.ts +14 -0
  47. package/dist/cli/templates/config.d.ts.map +1 -0
  48. package/dist/cli/templates/config.js +133 -0
  49. package/dist/cli/templates/config.js.map +1 -0
  50. package/dist/cli/templates/constants.d.ts +9 -0
  51. package/dist/cli/templates/constants.d.ts.map +1 -0
  52. package/dist/cli/templates/constants.js +9 -0
  53. package/dist/cli/templates/constants.js.map +1 -0
  54. package/dist/cli/templates/core.d.ts +14 -0
  55. package/dist/cli/templates/core.d.ts.map +1 -0
  56. package/dist/cli/templates/core.js +186 -0
  57. package/dist/cli/templates/core.js.map +1 -0
  58. package/dist/cli/templates/cursor.d.ts +8 -0
  59. package/dist/cli/templates/cursor.d.ts.map +1 -0
  60. package/dist/cli/templates/cursor.js +13 -0
  61. package/dist/cli/templates/cursor.js.map +1 -0
  62. package/dist/cli/templates/index.d.ts +17 -0
  63. package/dist/cli/templates/index.d.ts.map +1 -0
  64. package/dist/cli/templates/index.js +27 -0
  65. package/dist/cli/templates/index.js.map +1 -0
  66. package/dist/cli/templates/middleware.d.ts +7 -0
  67. package/dist/cli/templates/middleware.d.ts.map +1 -0
  68. package/dist/cli/templates/middleware.js +34 -0
  69. package/dist/cli/templates/middleware.js.map +1 -0
  70. package/dist/cli/templates/presenter.d.ts +7 -0
  71. package/dist/cli/templates/presenter.d.ts.map +1 -0
  72. package/dist/cli/templates/presenter.js +46 -0
  73. package/dist/cli/templates/presenter.js.map +1 -0
  74. package/dist/cli/templates/prompt.d.ts +7 -0
  75. package/dist/cli/templates/prompt.d.ts.map +1 -0
  76. package/dist/cli/templates/prompt.js +42 -0
  77. package/dist/cli/templates/prompt.js.map +1 -0
  78. package/dist/cli/templates/readme.d.ts +8 -0
  79. package/dist/cli/templates/readme.d.ts.map +1 -0
  80. package/dist/cli/templates/readme.js +173 -0
  81. package/dist/cli/templates/readme.js.map +1 -0
  82. package/dist/cli/templates/testing.d.ts +11 -0
  83. package/dist/cli/templates/testing.d.ts.map +1 -0
  84. package/dist/cli/templates/testing.js +101 -0
  85. package/dist/cli/templates/testing.js.map +1 -0
  86. package/dist/cli/templates/tools.d.ts +13 -0
  87. package/dist/cli/templates/tools.d.ts.map +1 -0
  88. package/dist/cli/templates/tools.js +63 -0
  89. package/dist/cli/templates/tools.js.map +1 -0
  90. package/dist/cli/templates/vectors/database.d.ts +9 -0
  91. package/dist/cli/templates/vectors/database.d.ts.map +1 -0
  92. package/dist/cli/templates/vectors/database.js +82 -0
  93. package/dist/cli/templates/vectors/database.js.map +1 -0
  94. package/dist/cli/templates/vectors/index.d.ts +9 -0
  95. package/dist/cli/templates/vectors/index.d.ts.map +1 -0
  96. package/dist/cli/templates/vectors/index.js +9 -0
  97. package/dist/cli/templates/vectors/index.js.map +1 -0
  98. package/dist/cli/templates/vectors/oauth.d.ts +10 -0
  99. package/dist/cli/templates/vectors/oauth.d.ts.map +1 -0
  100. package/dist/cli/templates/vectors/oauth.js +76 -0
  101. package/dist/cli/templates/vectors/oauth.js.map +1 -0
  102. package/dist/cli/templates/vectors/openapi.d.ts +10 -0
  103. package/dist/cli/templates/vectors/openapi.d.ts.map +1 -0
  104. package/dist/cli/templates/vectors/openapi.js +106 -0
  105. package/dist/cli/templates/vectors/openapi.js.map +1 -0
  106. package/dist/cli/templates/vectors/workflow.d.ts +7 -0
  107. package/dist/cli/templates/vectors/workflow.d.ts.map +1 -0
  108. package/dist/cli/templates/vectors/workflow.js +49 -0
  109. package/dist/cli/templates/vectors/workflow.js.map +1 -0
  110. package/dist/cli/types.d.ts +36 -0
  111. package/dist/cli/types.d.ts.map +1 -0
  112. package/dist/cli/types.js +10 -0
  113. package/dist/cli/types.js.map +1 -0
  114. package/dist/cli/utils.d.ts +27 -0
  115. package/dist/cli/utils.d.ts.map +1 -0
  116. package/dist/cli/utils.js +73 -0
  117. package/dist/cli/utils.js.map +1 -0
  118. package/dist/cli/vurb.d.ts +15 -0
  119. package/dist/cli/vurb.d.ts.map +1 -0
  120. package/dist/cli/vurb.js +87 -0
  121. package/dist/cli/vurb.js.map +1 -0
  122. package/dist/client/InferRouter.d.ts +92 -0
  123. package/dist/client/InferRouter.d.ts.map +1 -0
  124. package/dist/client/InferRouter.js +31 -0
  125. package/dist/client/InferRouter.js.map +1 -0
  126. package/dist/client/VurbClient.d.ts +282 -0
  127. package/dist/client/VurbClient.d.ts.map +1 -0
  128. package/dist/client/VurbClient.js +287 -0
  129. package/dist/client/VurbClient.js.map +1 -0
  130. package/dist/client/createTypedRegistry.d.ts +25 -0
  131. package/dist/client/createTypedRegistry.d.ts.map +1 -0
  132. package/dist/client/createTypedRegistry.js +74 -0
  133. package/dist/client/createTypedRegistry.js.map +1 -0
  134. package/dist/client/index.d.ts +6 -0
  135. package/dist/client/index.d.ts.map +1 -0
  136. package/dist/client/index.js +4 -0
  137. package/dist/client/index.js.map +1 -0
  138. package/dist/converters/ConverterBase.d.ts +68 -0
  139. package/dist/converters/ConverterBase.d.ts.map +1 -0
  140. package/dist/converters/ConverterBase.js +62 -0
  141. package/dist/converters/ConverterBase.js.map +1 -0
  142. package/dist/converters/GroupConverter.d.ts +33 -0
  143. package/dist/converters/GroupConverter.d.ts.map +1 -0
  144. package/dist/converters/GroupConverter.js +26 -0
  145. package/dist/converters/GroupConverter.js.map +1 -0
  146. package/dist/converters/PromptConverter.d.ts +33 -0
  147. package/dist/converters/PromptConverter.d.ts.map +1 -0
  148. package/dist/converters/PromptConverter.js +26 -0
  149. package/dist/converters/PromptConverter.js.map +1 -0
  150. package/dist/converters/ResourceConverter.d.ts +35 -0
  151. package/dist/converters/ResourceConverter.d.ts.map +1 -0
  152. package/dist/converters/ResourceConverter.js +28 -0
  153. package/dist/converters/ResourceConverter.js.map +1 -0
  154. package/dist/converters/ToolAnnotationsConverter.d.ts +33 -0
  155. package/dist/converters/ToolAnnotationsConverter.d.ts.map +1 -0
  156. package/dist/converters/ToolAnnotationsConverter.js +26 -0
  157. package/dist/converters/ToolAnnotationsConverter.js.map +1 -0
  158. package/dist/converters/ToolConverter.d.ts +35 -0
  159. package/dist/converters/ToolConverter.d.ts.map +1 -0
  160. package/dist/converters/ToolConverter.js +28 -0
  161. package/dist/converters/ToolConverter.js.map +1 -0
  162. package/dist/converters/index.d.ts +7 -0
  163. package/dist/converters/index.d.ts.map +1 -0
  164. package/dist/converters/index.js +7 -0
  165. package/dist/converters/index.js.map +1 -0
  166. package/dist/core/StandardSchema.d.ts +178 -0
  167. package/dist/core/StandardSchema.d.ts.map +1 -0
  168. package/dist/core/StandardSchema.js +174 -0
  169. package/dist/core/StandardSchema.js.map +1 -0
  170. package/dist/core/builder/ActionGroupBuilder.d.ts +208 -0
  171. package/dist/core/builder/ActionGroupBuilder.d.ts.map +1 -0
  172. package/dist/core/builder/ActionGroupBuilder.js +193 -0
  173. package/dist/core/builder/ActionGroupBuilder.js.map +1 -0
  174. package/dist/core/builder/ErrorBuilder.d.ts +59 -0
  175. package/dist/core/builder/ErrorBuilder.d.ts.map +1 -0
  176. package/dist/core/builder/ErrorBuilder.js +99 -0
  177. package/dist/core/builder/ErrorBuilder.js.map +1 -0
  178. package/dist/core/builder/FluentRouter.d.ts +96 -0
  179. package/dist/core/builder/FluentRouter.d.ts.map +1 -0
  180. package/dist/core/builder/FluentRouter.js +116 -0
  181. package/dist/core/builder/FluentRouter.js.map +1 -0
  182. package/dist/core/builder/FluentSchemaHelpers.d.ts +237 -0
  183. package/dist/core/builder/FluentSchemaHelpers.d.ts.map +1 -0
  184. package/dist/core/builder/FluentSchemaHelpers.js +227 -0
  185. package/dist/core/builder/FluentSchemaHelpers.js.map +1 -0
  186. package/dist/core/builder/FluentToolBuilder.d.ts +419 -0
  187. package/dist/core/builder/FluentToolBuilder.d.ts.map +1 -0
  188. package/dist/core/builder/FluentToolBuilder.js +643 -0
  189. package/dist/core/builder/FluentToolBuilder.js.map +1 -0
  190. package/dist/core/builder/GroupedToolBuilder.d.ts +832 -0
  191. package/dist/core/builder/GroupedToolBuilder.d.ts.map +1 -0
  192. package/dist/core/builder/GroupedToolBuilder.js +1306 -0
  193. package/dist/core/builder/GroupedToolBuilder.js.map +1 -0
  194. package/dist/core/builder/ParamDescriptors.d.ts +142 -0
  195. package/dist/core/builder/ParamDescriptors.d.ts.map +1 -0
  196. package/dist/core/builder/ParamDescriptors.js +164 -0
  197. package/dist/core/builder/ParamDescriptors.js.map +1 -0
  198. package/dist/core/builder/ToolDefinitionCompiler.d.ts +37 -0
  199. package/dist/core/builder/ToolDefinitionCompiler.d.ts.map +1 -0
  200. package/dist/core/builder/ToolDefinitionCompiler.js +72 -0
  201. package/dist/core/builder/ToolDefinitionCompiler.js.map +1 -0
  202. package/dist/core/builder/defineTool.d.ts +180 -0
  203. package/dist/core/builder/defineTool.d.ts.map +1 -0
  204. package/dist/core/builder/defineTool.js +164 -0
  205. package/dist/core/builder/defineTool.js.map +1 -0
  206. package/dist/core/builder/index.d.ts +13 -0
  207. package/dist/core/builder/index.d.ts.map +1 -0
  208. package/dist/core/builder/index.js +13 -0
  209. package/dist/core/builder/index.js.map +1 -0
  210. package/dist/core/createGroup.d.ts +140 -0
  211. package/dist/core/createGroup.d.ts.map +1 -0
  212. package/dist/core/createGroup.js +144 -0
  213. package/dist/core/createGroup.js.map +1 -0
  214. package/dist/core/execution/ConcurrencyGuard.d.ts +103 -0
  215. package/dist/core/execution/ConcurrencyGuard.d.ts.map +1 -0
  216. package/dist/core/execution/ConcurrencyGuard.js +147 -0
  217. package/dist/core/execution/ConcurrencyGuard.js.map +1 -0
  218. package/dist/core/execution/EgressGuard.d.ts +72 -0
  219. package/dist/core/execution/EgressGuard.d.ts.map +1 -0
  220. package/dist/core/execution/EgressGuard.js +163 -0
  221. package/dist/core/execution/EgressGuard.js.map +1 -0
  222. package/dist/core/execution/ExecutionPipeline.d.ts +67 -0
  223. package/dist/core/execution/ExecutionPipeline.d.ts.map +1 -0
  224. package/dist/core/execution/ExecutionPipeline.js +176 -0
  225. package/dist/core/execution/ExecutionPipeline.js.map +1 -0
  226. package/dist/core/execution/MiddlewareCompiler.d.ts +35 -0
  227. package/dist/core/execution/MiddlewareCompiler.d.ts.map +1 -0
  228. package/dist/core/execution/MiddlewareCompiler.js +111 -0
  229. package/dist/core/execution/MiddlewareCompiler.js.map +1 -0
  230. package/dist/core/execution/MutationSerializer.d.ts +78 -0
  231. package/dist/core/execution/MutationSerializer.d.ts.map +1 -0
  232. package/dist/core/execution/MutationSerializer.js +106 -0
  233. package/dist/core/execution/MutationSerializer.js.map +1 -0
  234. package/dist/core/execution/PipelineHooks.d.ts +46 -0
  235. package/dist/core/execution/PipelineHooks.d.ts.map +1 -0
  236. package/dist/core/execution/PipelineHooks.js +66 -0
  237. package/dist/core/execution/PipelineHooks.js.map +1 -0
  238. package/dist/core/execution/ProgressHelper.d.ts +67 -0
  239. package/dist/core/execution/ProgressHelper.d.ts.map +1 -0
  240. package/dist/core/execution/ProgressHelper.js +59 -0
  241. package/dist/core/execution/ProgressHelper.js.map +1 -0
  242. package/dist/core/execution/ValidationErrorFormatter.d.ts +34 -0
  243. package/dist/core/execution/ValidationErrorFormatter.d.ts.map +1 -0
  244. package/dist/core/execution/ValidationErrorFormatter.js +193 -0
  245. package/dist/core/execution/ValidationErrorFormatter.js.map +1 -0
  246. package/dist/core/execution/index.d.ts +9 -0
  247. package/dist/core/execution/index.d.ts.map +1 -0
  248. package/dist/core/execution/index.js +9 -0
  249. package/dist/core/execution/index.js.map +1 -0
  250. package/dist/core/index.d.ts +34 -0
  251. package/dist/core/index.d.ts.map +1 -0
  252. package/dist/core/index.js +29 -0
  253. package/dist/core/index.js.map +1 -0
  254. package/dist/core/initVurb.d.ts +295 -0
  255. package/dist/core/initVurb.d.ts.map +1 -0
  256. package/dist/core/initVurb.js +171 -0
  257. package/dist/core/initVurb.js.map +1 -0
  258. package/dist/core/middleware/ContextDerivation.d.ts +124 -0
  259. package/dist/core/middleware/ContextDerivation.d.ts.map +1 -0
  260. package/dist/core/middleware/ContextDerivation.js +117 -0
  261. package/dist/core/middleware/ContextDerivation.js.map +1 -0
  262. package/dist/core/middleware/index.d.ts +4 -0
  263. package/dist/core/middleware/index.d.ts.map +1 -0
  264. package/dist/core/middleware/index.js +3 -0
  265. package/dist/core/middleware/index.js.map +1 -0
  266. package/dist/core/registry/ToolFilterEngine.d.ts +27 -0
  267. package/dist/core/registry/ToolFilterEngine.d.ts.map +1 -0
  268. package/dist/core/registry/ToolFilterEngine.js +45 -0
  269. package/dist/core/registry/ToolFilterEngine.js.map +1 -0
  270. package/dist/core/registry/ToolRegistry.d.ts +259 -0
  271. package/dist/core/registry/ToolRegistry.d.ts.map +1 -0
  272. package/dist/core/registry/ToolRegistry.js +343 -0
  273. package/dist/core/registry/ToolRegistry.js.map +1 -0
  274. package/dist/core/registry/index.d.ts +4 -0
  275. package/dist/core/registry/index.d.ts.map +1 -0
  276. package/dist/core/registry/index.js +3 -0
  277. package/dist/core/registry/index.js.map +1 -0
  278. package/dist/core/response.d.ts +289 -0
  279. package/dist/core/response.d.ts.map +1 -0
  280. package/dist/core/response.js +286 -0
  281. package/dist/core/response.js.map +1 -0
  282. package/dist/core/result.d.ts +93 -0
  283. package/dist/core/result.d.ts.map +1 -0
  284. package/dist/core/result.js +66 -0
  285. package/dist/core/result.js.map +1 -0
  286. package/dist/core/schema/AnnotationAggregator.d.ts +11 -0
  287. package/dist/core/schema/AnnotationAggregator.d.ts.map +1 -0
  288. package/dist/core/schema/AnnotationAggregator.js +40 -0
  289. package/dist/core/schema/AnnotationAggregator.js.map +1 -0
  290. package/dist/core/schema/DescriptionGenerator.d.ts +12 -0
  291. package/dist/core/schema/DescriptionGenerator.d.ts.map +1 -0
  292. package/dist/core/schema/DescriptionGenerator.js +81 -0
  293. package/dist/core/schema/DescriptionGenerator.js.map +1 -0
  294. package/dist/core/schema/SchemaGenerator.d.ts +15 -0
  295. package/dist/core/schema/SchemaGenerator.d.ts.map +1 -0
  296. package/dist/core/schema/SchemaGenerator.js +192 -0
  297. package/dist/core/schema/SchemaGenerator.js.map +1 -0
  298. package/dist/core/schema/SchemaUtils.d.ts +26 -0
  299. package/dist/core/schema/SchemaUtils.d.ts.map +1 -0
  300. package/dist/core/schema/SchemaUtils.js +85 -0
  301. package/dist/core/schema/SchemaUtils.js.map +1 -0
  302. package/dist/core/schema/ToonDescriptionGenerator.d.ts +3 -0
  303. package/dist/core/schema/ToonDescriptionGenerator.d.ts.map +1 -0
  304. package/dist/core/schema/ToonDescriptionGenerator.js +65 -0
  305. package/dist/core/schema/ToonDescriptionGenerator.js.map +1 -0
  306. package/dist/core/schema/index.d.ts +7 -0
  307. package/dist/core/schema/index.d.ts.map +1 -0
  308. package/dist/core/schema/index.js +7 -0
  309. package/dist/core/schema/index.js.map +1 -0
  310. package/dist/core/serialization/JsonSerializer.d.ts +71 -0
  311. package/dist/core/serialization/JsonSerializer.d.ts.map +1 -0
  312. package/dist/core/serialization/JsonSerializer.js +192 -0
  313. package/dist/core/serialization/JsonSerializer.js.map +1 -0
  314. package/dist/core/serialization/index.d.ts +7 -0
  315. package/dist/core/serialization/index.d.ts.map +1 -0
  316. package/dist/core/serialization/index.js +7 -0
  317. package/dist/core/serialization/index.js.map +1 -0
  318. package/dist/core/types.d.ts +303 -0
  319. package/dist/core/types.d.ts.map +1 -0
  320. package/dist/core/types.js +17 -0
  321. package/dist/core/types.js.map +1 -0
  322. package/dist/domain/Annotations.d.ts +42 -0
  323. package/dist/domain/Annotations.d.ts.map +1 -0
  324. package/dist/domain/Annotations.js +16 -0
  325. package/dist/domain/Annotations.js.map +1 -0
  326. package/dist/domain/BaseModel.d.ts +50 -0
  327. package/dist/domain/BaseModel.d.ts.map +1 -0
  328. package/dist/domain/BaseModel.js +41 -0
  329. package/dist/domain/BaseModel.js.map +1 -0
  330. package/dist/domain/Group.d.ts +99 -0
  331. package/dist/domain/Group.d.ts.map +1 -0
  332. package/dist/domain/Group.js +172 -0
  333. package/dist/domain/Group.js.map +1 -0
  334. package/dist/domain/GroupItem.d.ts +46 -0
  335. package/dist/domain/GroupItem.d.ts.map +1 -0
  336. package/dist/domain/GroupItem.js +58 -0
  337. package/dist/domain/GroupItem.js.map +1 -0
  338. package/dist/domain/Icon.d.ts +41 -0
  339. package/dist/domain/Icon.d.ts.map +1 -0
  340. package/dist/domain/Icon.js +15 -0
  341. package/dist/domain/Icon.js.map +1 -0
  342. package/dist/domain/Prompt.d.ts +49 -0
  343. package/dist/domain/Prompt.d.ts.map +1 -0
  344. package/dist/domain/Prompt.js +59 -0
  345. package/dist/domain/Prompt.js.map +1 -0
  346. package/dist/domain/PromptArgument.d.ts +23 -0
  347. package/dist/domain/PromptArgument.d.ts.map +1 -0
  348. package/dist/domain/PromptArgument.js +27 -0
  349. package/dist/domain/PromptArgument.js.map +1 -0
  350. package/dist/domain/Resource.d.ts +37 -0
  351. package/dist/domain/Resource.d.ts.map +1 -0
  352. package/dist/domain/Resource.js +39 -0
  353. package/dist/domain/Resource.js.map +1 -0
  354. package/dist/domain/Role.d.ts +23 -0
  355. package/dist/domain/Role.d.ts.map +1 -0
  356. package/dist/domain/Role.js +24 -0
  357. package/dist/domain/Role.js.map +1 -0
  358. package/dist/domain/Tool.d.ts +39 -0
  359. package/dist/domain/Tool.d.ts.map +1 -0
  360. package/dist/domain/Tool.js +41 -0
  361. package/dist/domain/Tool.js.map +1 -0
  362. package/dist/domain/ToolAnnotations.d.ts +48 -0
  363. package/dist/domain/ToolAnnotations.d.ts.map +1 -0
  364. package/dist/domain/ToolAnnotations.js +15 -0
  365. package/dist/domain/ToolAnnotations.js.map +1 -0
  366. package/dist/domain/index.d.ts +16 -0
  367. package/dist/domain/index.d.ts.map +1 -0
  368. package/dist/domain/index.js +13 -0
  369. package/dist/domain/index.js.map +1 -0
  370. package/dist/domain/utils.d.ts +6 -0
  371. package/dist/domain/utils.d.ts.map +1 -0
  372. package/dist/domain/utils.js +12 -0
  373. package/dist/domain/utils.js.map +1 -0
  374. package/dist/edge-stub.d.ts +73 -0
  375. package/dist/edge-stub.d.ts.map +1 -0
  376. package/dist/edge-stub.js +83 -0
  377. package/dist/edge-stub.js.map +1 -0
  378. package/dist/exposition/ExpositionCompiler.d.ts +66 -0
  379. package/dist/exposition/ExpositionCompiler.d.ts.map +1 -0
  380. package/dist/exposition/ExpositionCompiler.js +279 -0
  381. package/dist/exposition/ExpositionCompiler.js.map +1 -0
  382. package/dist/exposition/index.d.ts +4 -0
  383. package/dist/exposition/index.d.ts.map +1 -0
  384. package/dist/exposition/index.js +2 -0
  385. package/dist/exposition/index.js.map +1 -0
  386. package/dist/exposition/types.d.ts +58 -0
  387. package/dist/exposition/types.d.ts.map +1 -0
  388. package/dist/exposition/types.js +11 -0
  389. package/dist/exposition/types.js.map +1 -0
  390. package/dist/fsm/StateMachineGate.d.ts +294 -0
  391. package/dist/fsm/StateMachineGate.d.ts.map +1 -0
  392. package/dist/fsm/StateMachineGate.js +400 -0
  393. package/dist/fsm/StateMachineGate.js.map +1 -0
  394. package/dist/index.d.ts +148 -0
  395. package/dist/index.d.ts.map +1 -0
  396. package/dist/index.js +112 -0
  397. package/dist/index.js.map +1 -0
  398. package/dist/introspection/BehaviorDigest.d.ts +112 -0
  399. package/dist/introspection/BehaviorDigest.d.ts.map +1 -0
  400. package/dist/introspection/BehaviorDigest.js +149 -0
  401. package/dist/introspection/BehaviorDigest.js.map +1 -0
  402. package/dist/introspection/CapabilityLockfile.d.ts +261 -0
  403. package/dist/introspection/CapabilityLockfile.d.ts.map +1 -0
  404. package/dist/introspection/CapabilityLockfile.js +395 -0
  405. package/dist/introspection/CapabilityLockfile.js.map +1 -0
  406. package/dist/introspection/ContractAwareSelfHealing.d.ts +90 -0
  407. package/dist/introspection/ContractAwareSelfHealing.d.ts.map +1 -0
  408. package/dist/introspection/ContractAwareSelfHealing.js +132 -0
  409. package/dist/introspection/ContractAwareSelfHealing.js.map +1 -0
  410. package/dist/introspection/ContractDiff.d.ts +91 -0
  411. package/dist/introspection/ContractDiff.d.ts.map +1 -0
  412. package/dist/introspection/ContractDiff.js +466 -0
  413. package/dist/introspection/ContractDiff.js.map +1 -0
  414. package/dist/introspection/CryptoAttestation.d.ts +143 -0
  415. package/dist/introspection/CryptoAttestation.d.ts.map +1 -0
  416. package/dist/introspection/CryptoAttestation.js +192 -0
  417. package/dist/introspection/CryptoAttestation.js.map +1 -0
  418. package/dist/introspection/EntitlementScanner.d.ts +177 -0
  419. package/dist/introspection/EntitlementScanner.d.ts.map +1 -0
  420. package/dist/introspection/EntitlementScanner.js +459 -0
  421. package/dist/introspection/EntitlementScanner.js.map +1 -0
  422. package/dist/introspection/GovernanceObserver.d.ts +88 -0
  423. package/dist/introspection/GovernanceObserver.d.ts.map +1 -0
  424. package/dist/introspection/GovernanceObserver.js +136 -0
  425. package/dist/introspection/GovernanceObserver.js.map +1 -0
  426. package/dist/introspection/IntrospectionResource.d.ts +20 -0
  427. package/dist/introspection/IntrospectionResource.d.ts.map +1 -0
  428. package/dist/introspection/IntrospectionResource.js +112 -0
  429. package/dist/introspection/IntrospectionResource.js.map +1 -0
  430. package/dist/introspection/ManifestCompiler.d.ts +33 -0
  431. package/dist/introspection/ManifestCompiler.d.ts.map +1 -0
  432. package/dist/introspection/ManifestCompiler.js +88 -0
  433. package/dist/introspection/ManifestCompiler.js.map +1 -0
  434. package/dist/introspection/SemanticProbe.d.ts +207 -0
  435. package/dist/introspection/SemanticProbe.d.ts.map +1 -0
  436. package/dist/introspection/SemanticProbe.js +274 -0
  437. package/dist/introspection/SemanticProbe.js.map +1 -0
  438. package/dist/introspection/TokenEconomics.d.ts +210 -0
  439. package/dist/introspection/TokenEconomics.d.ts.map +1 -0
  440. package/dist/introspection/TokenEconomics.js +292 -0
  441. package/dist/introspection/TokenEconomics.js.map +1 -0
  442. package/dist/introspection/ToolContract.d.ts +161 -0
  443. package/dist/introspection/ToolContract.d.ts.map +1 -0
  444. package/dist/introspection/ToolContract.js +218 -0
  445. package/dist/introspection/ToolContract.js.map +1 -0
  446. package/dist/introspection/canonicalize.d.ts +35 -0
  447. package/dist/introspection/canonicalize.d.ts.map +1 -0
  448. package/dist/introspection/canonicalize.js +72 -0
  449. package/dist/introspection/canonicalize.js.map +1 -0
  450. package/dist/introspection/index.d.ts +26 -0
  451. package/dist/introspection/index.d.ts.map +1 -0
  452. package/dist/introspection/index.js +24 -0
  453. package/dist/introspection/index.js.map +1 -0
  454. package/dist/introspection/types.d.ts +120 -0
  455. package/dist/introspection/types.d.ts.map +1 -0
  456. package/dist/introspection/types.js +13 -0
  457. package/dist/introspection/types.js.map +1 -0
  458. package/dist/observability/DebugObserver.d.ts +185 -0
  459. package/dist/observability/DebugObserver.d.ts.map +1 -0
  460. package/dist/observability/DebugObserver.js +102 -0
  461. package/dist/observability/DebugObserver.js.map +1 -0
  462. package/dist/observability/TelemetryBus.d.ts +88 -0
  463. package/dist/observability/TelemetryBus.d.ts.map +1 -0
  464. package/dist/observability/TelemetryBus.js +463 -0
  465. package/dist/observability/TelemetryBus.js.map +1 -0
  466. package/dist/observability/TelemetryEvent.d.ts +177 -0
  467. package/dist/observability/TelemetryEvent.d.ts.map +1 -0
  468. package/dist/observability/TelemetryEvent.js +2 -0
  469. package/dist/observability/TelemetryEvent.js.map +1 -0
  470. package/dist/observability/Tracing.d.ts +155 -0
  471. package/dist/observability/Tracing.d.ts.map +1 -0
  472. package/dist/observability/Tracing.js +67 -0
  473. package/dist/observability/Tracing.js.map +1 -0
  474. package/dist/observability/index.d.ts +13 -0
  475. package/dist/observability/index.d.ts.map +1 -0
  476. package/dist/observability/index.js +12 -0
  477. package/dist/observability/index.js.map +1 -0
  478. package/dist/presenter/PostProcessor.d.ts +52 -0
  479. package/dist/presenter/PostProcessor.d.ts.map +1 -0
  480. package/dist/presenter/PostProcessor.js +148 -0
  481. package/dist/presenter/PostProcessor.js.map +1 -0
  482. package/dist/presenter/Presenter.d.ts +575 -0
  483. package/dist/presenter/Presenter.d.ts.map +1 -0
  484. package/dist/presenter/Presenter.js +768 -0
  485. package/dist/presenter/Presenter.js.map +1 -0
  486. package/dist/presenter/PresenterValidationError.d.ts +42 -0
  487. package/dist/presenter/PresenterValidationError.d.ts.map +1 -0
  488. package/dist/presenter/PresenterValidationError.js +55 -0
  489. package/dist/presenter/PresenterValidationError.js.map +1 -0
  490. package/dist/presenter/RedactEngine.d.ts +110 -0
  491. package/dist/presenter/RedactEngine.d.ts.map +1 -0
  492. package/dist/presenter/RedactEngine.js +128 -0
  493. package/dist/presenter/RedactEngine.js.map +1 -0
  494. package/dist/presenter/ResponseBuilder.d.ts +262 -0
  495. package/dist/presenter/ResponseBuilder.d.ts.map +1 -0
  496. package/dist/presenter/ResponseBuilder.js +374 -0
  497. package/dist/presenter/ResponseBuilder.js.map +1 -0
  498. package/dist/presenter/SelectUtils.d.ts +78 -0
  499. package/dist/presenter/SelectUtils.d.ts.map +1 -0
  500. package/dist/presenter/SelectUtils.js +141 -0
  501. package/dist/presenter/SelectUtils.js.map +1 -0
  502. package/dist/presenter/ZodDescriptionExtractor.d.ts +54 -0
  503. package/dist/presenter/ZodDescriptionExtractor.d.ts.map +1 -0
  504. package/dist/presenter/ZodDescriptionExtractor.js +131 -0
  505. package/dist/presenter/ZodDescriptionExtractor.js.map +1 -0
  506. package/dist/presenter/definePresenter.d.ts +193 -0
  507. package/dist/presenter/definePresenter.d.ts.map +1 -0
  508. package/dist/presenter/definePresenter.js +99 -0
  509. package/dist/presenter/definePresenter.js.map +1 -0
  510. package/dist/presenter/index.d.ts +21 -0
  511. package/dist/presenter/index.d.ts.map +1 -0
  512. package/dist/presenter/index.js +28 -0
  513. package/dist/presenter/index.js.map +1 -0
  514. package/dist/presenter/suggest.d.ts +39 -0
  515. package/dist/presenter/suggest.d.ts.map +1 -0
  516. package/dist/presenter/suggest.js +41 -0
  517. package/dist/presenter/suggest.js.map +1 -0
  518. package/dist/presenter/typeHelpers.d.ts +147 -0
  519. package/dist/presenter/typeHelpers.d.ts.map +1 -0
  520. package/dist/presenter/typeHelpers.js +152 -0
  521. package/dist/presenter/typeHelpers.js.map +1 -0
  522. package/dist/presenter/ui.d.ts +205 -0
  523. package/dist/presenter/ui.d.ts.map +1 -0
  524. package/dist/presenter/ui.js +222 -0
  525. package/dist/presenter/ui.js.map +1 -0
  526. package/dist/prompt/CursorCodec.d.ts +43 -0
  527. package/dist/prompt/CursorCodec.d.ts.map +1 -0
  528. package/dist/prompt/CursorCodec.js +171 -0
  529. package/dist/prompt/CursorCodec.js.map +1 -0
  530. package/dist/prompt/FluentPromptBuilder.d.ts +155 -0
  531. package/dist/prompt/FluentPromptBuilder.d.ts.map +1 -0
  532. package/dist/prompt/FluentPromptBuilder.js +195 -0
  533. package/dist/prompt/FluentPromptBuilder.js.map +1 -0
  534. package/dist/prompt/HydrationSandbox.d.ts +55 -0
  535. package/dist/prompt/HydrationSandbox.d.ts.map +1 -0
  536. package/dist/prompt/HydrationSandbox.js +122 -0
  537. package/dist/prompt/HydrationSandbox.js.map +1 -0
  538. package/dist/prompt/PromptExecutionPipeline.d.ts +61 -0
  539. package/dist/prompt/PromptExecutionPipeline.d.ts.map +1 -0
  540. package/dist/prompt/PromptExecutionPipeline.js +177 -0
  541. package/dist/prompt/PromptExecutionPipeline.js.map +1 -0
  542. package/dist/prompt/PromptMessage.d.ts +133 -0
  543. package/dist/prompt/PromptMessage.d.ts.map +1 -0
  544. package/dist/prompt/PromptMessage.js +182 -0
  545. package/dist/prompt/PromptMessage.js.map +1 -0
  546. package/dist/prompt/PromptRegistry.d.ts +236 -0
  547. package/dist/prompt/PromptRegistry.d.ts.map +1 -0
  548. package/dist/prompt/PromptRegistry.js +399 -0
  549. package/dist/prompt/PromptRegistry.js.map +1 -0
  550. package/dist/prompt/definePrompt.d.ts +111 -0
  551. package/dist/prompt/definePrompt.d.ts.map +1 -0
  552. package/dist/prompt/definePrompt.js +130 -0
  553. package/dist/prompt/definePrompt.js.map +1 -0
  554. package/dist/prompt/index.d.ts +12 -0
  555. package/dist/prompt/index.d.ts.map +1 -0
  556. package/dist/prompt/index.js +13 -0
  557. package/dist/prompt/index.js.map +1 -0
  558. package/dist/prompt/types.d.ts +425 -0
  559. package/dist/prompt/types.d.ts.map +1 -0
  560. package/dist/prompt/types.js +19 -0
  561. package/dist/prompt/types.js.map +1 -0
  562. package/dist/sandbox/SandboxEngine.d.ts +225 -0
  563. package/dist/sandbox/SandboxEngine.d.ts.map +1 -0
  564. package/dist/sandbox/SandboxEngine.js +437 -0
  565. package/dist/sandbox/SandboxEngine.js.map +1 -0
  566. package/dist/sandbox/SandboxGuard.d.ts +47 -0
  567. package/dist/sandbox/SandboxGuard.d.ts.map +1 -0
  568. package/dist/sandbox/SandboxGuard.js +127 -0
  569. package/dist/sandbox/SandboxGuard.js.map +1 -0
  570. package/dist/sandbox/index.d.ts +23 -0
  571. package/dist/sandbox/index.d.ts.map +1 -0
  572. package/dist/sandbox/index.js +26 -0
  573. package/dist/sandbox/index.js.map +1 -0
  574. package/dist/server/DevServer.d.ts +120 -0
  575. package/dist/server/DevServer.d.ts.map +1 -0
  576. package/dist/server/DevServer.js +252 -0
  577. package/dist/server/DevServer.js.map +1 -0
  578. package/dist/server/ServerAttachment.d.ts +354 -0
  579. package/dist/server/ServerAttachment.d.ts.map +1 -0
  580. package/dist/server/ServerAttachment.js +709 -0
  581. package/dist/server/ServerAttachment.js.map +1 -0
  582. package/dist/server/ServerResolver.d.ts +24 -0
  583. package/dist/server/ServerResolver.d.ts.map +1 -0
  584. package/dist/server/ServerResolver.js +50 -0
  585. package/dist/server/ServerResolver.js.map +1 -0
  586. package/dist/server/autoDiscover.d.ts +75 -0
  587. package/dist/server/autoDiscover.d.ts.map +1 -0
  588. package/dist/server/autoDiscover.js +164 -0
  589. package/dist/server/autoDiscover.js.map +1 -0
  590. package/dist/server/index.d.ts +12 -0
  591. package/dist/server/index.d.ts.map +1 -0
  592. package/dist/server/index.js +11 -0
  593. package/dist/server/index.js.map +1 -0
  594. package/dist/server/startServer.d.ts +81 -0
  595. package/dist/server/startServer.d.ts.map +1 -0
  596. package/dist/server/startServer.js +143 -0
  597. package/dist/server/startServer.js.map +1 -0
  598. package/dist/state-sync/CausalEngine.d.ts +28 -0
  599. package/dist/state-sync/CausalEngine.d.ts.map +1 -0
  600. package/dist/state-sync/CausalEngine.js +17 -0
  601. package/dist/state-sync/CausalEngine.js.map +1 -0
  602. package/dist/state-sync/DescriptionDecorator.d.ts +31 -0
  603. package/dist/state-sync/DescriptionDecorator.d.ts.map +1 -0
  604. package/dist/state-sync/DescriptionDecorator.js +38 -0
  605. package/dist/state-sync/DescriptionDecorator.js.map +1 -0
  606. package/dist/state-sync/GlobMatcher.d.ts +29 -0
  607. package/dist/state-sync/GlobMatcher.d.ts.map +1 -0
  608. package/dist/state-sync/GlobMatcher.js +79 -0
  609. package/dist/state-sync/GlobMatcher.js.map +1 -0
  610. package/dist/state-sync/PolicyEngine.d.ts +75 -0
  611. package/dist/state-sync/PolicyEngine.d.ts.map +1 -0
  612. package/dist/state-sync/PolicyEngine.js +107 -0
  613. package/dist/state-sync/PolicyEngine.js.map +1 -0
  614. package/dist/state-sync/PolicyValidator.d.ts +67 -0
  615. package/dist/state-sync/PolicyValidator.d.ts.map +1 -0
  616. package/dist/state-sync/PolicyValidator.js +122 -0
  617. package/dist/state-sync/PolicyValidator.js.map +1 -0
  618. package/dist/state-sync/ResponseDecorator.d.ts +33 -0
  619. package/dist/state-sync/ResponseDecorator.d.ts.map +1 -0
  620. package/dist/state-sync/ResponseDecorator.js +20 -0
  621. package/dist/state-sync/ResponseDecorator.js.map +1 -0
  622. package/dist/state-sync/StateSyncBuilder.d.ts +77 -0
  623. package/dist/state-sync/StateSyncBuilder.d.ts.map +1 -0
  624. package/dist/state-sync/StateSyncBuilder.js +129 -0
  625. package/dist/state-sync/StateSyncBuilder.js.map +1 -0
  626. package/dist/state-sync/StateSyncLayer.d.ts +107 -0
  627. package/dist/state-sync/StateSyncLayer.d.ts.map +1 -0
  628. package/dist/state-sync/StateSyncLayer.js +158 -0
  629. package/dist/state-sync/StateSyncLayer.js.map +1 -0
  630. package/dist/state-sync/index.d.ts +27 -0
  631. package/dist/state-sync/index.d.ts.map +1 -0
  632. package/dist/state-sync/index.js +27 -0
  633. package/dist/state-sync/index.js.map +1 -0
  634. package/dist/state-sync/types.d.ts +174 -0
  635. package/dist/state-sync/types.d.ts.map +1 -0
  636. package/dist/state-sync/types.js +17 -0
  637. package/dist/state-sync/types.js.map +1 -0
  638. package/dist/testing/MvaMetaSymbol.d.ts +45 -0
  639. package/dist/testing/MvaMetaSymbol.d.ts.map +1 -0
  640. package/dist/testing/MvaMetaSymbol.js +34 -0
  641. package/dist/testing/MvaMetaSymbol.js.map +1 -0
  642. package/package.json +153 -0
@@ -0,0 +1,47 @@
1
+ /**
2
+ * SandboxGuard — Fail-Fast Syntax Checker for LLM-Provided Code
3
+ *
4
+ * Provides quick feedback BEFORE sending code to the isolated-vm engine.
5
+ * This is NOT a security boundary — security comes from the empty V8
6
+ * Context (no `process`, `require`, `fs`, or `globalThis` injected).
7
+ *
8
+ * Purpose:
9
+ * - Validate that the code is syntactically valid JavaScript
10
+ * - Check that it looks like a function expression / arrow function
11
+ * - Provide fast, descriptive error messages to the LLM
12
+ *
13
+ * Properties:
14
+ * - Zero runtime dependencies (pure string analysis)
15
+ * - Fail-fast: rejects obviously broken code before V8 boot
16
+ * - NOT a security gate (LLMs can obfuscate; the Isolate is the real wall)
17
+ *
18
+ * @module
19
+ * @internal
20
+ */
21
+ export interface GuardResult {
22
+ /** Whether the code passed the fail-fast check */
23
+ readonly ok: boolean;
24
+ /** Human-readable reason for rejection (present when `ok` is false) */
25
+ readonly violation?: string;
26
+ }
27
+ /**
28
+ * Validate LLM-provided code before sending it to the sandbox.
29
+ *
30
+ * Performs two checks:
31
+ * 1. **Shape check**: The code must look like a function expression
32
+ * 2. **Suspicious pattern check**: Fail-fast for obviously unsandboxable patterns
33
+ *
34
+ * @param code - The JavaScript code string from the LLM
35
+ * @returns A `GuardResult` indicating whether the code passed
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * const result = validateSandboxCode('(data) => data.filter(d => d.x > 5)');
40
+ * // { ok: true }
41
+ *
42
+ * const bad = validateSandboxCode('require("fs").readFileSync("/etc/passwd")');
43
+ * // { ok: false, violation: 'Code must be a function expression...' }
44
+ * ```
45
+ */
46
+ export declare function validateSandboxCode(code: string): GuardResult;
47
+ //# sourceMappingURL=SandboxGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SandboxGuard.d.ts","sourceRoot":"","sources":["../../src/sandbox/SandboxGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,MAAM,WAAW,WAAW;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,uEAAuE;IACvE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC/B;AAqCD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CA2C7D"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * SandboxGuard — Fail-Fast Syntax Checker for LLM-Provided Code
3
+ *
4
+ * Provides quick feedback BEFORE sending code to the isolated-vm engine.
5
+ * This is NOT a security boundary — security comes from the empty V8
6
+ * Context (no `process`, `require`, `fs`, or `globalThis` injected).
7
+ *
8
+ * Purpose:
9
+ * - Validate that the code is syntactically valid JavaScript
10
+ * - Check that it looks like a function expression / arrow function
11
+ * - Provide fast, descriptive error messages to the LLM
12
+ *
13
+ * Properties:
14
+ * - Zero runtime dependencies (pure string analysis)
15
+ * - Fail-fast: rejects obviously broken code before V8 boot
16
+ * - NOT a security gate (LLMs can obfuscate; the Isolate is the real wall)
17
+ *
18
+ * @module
19
+ * @internal
20
+ */
21
+ // ── Constants ────────────────────────────────────────────
22
+ /**
23
+ * Patterns that indicate the code is NOT a pure function.
24
+ * These are fail-fast hints, not security barriers.
25
+ * The V8 Isolate with an empty Context is the real security wall.
26
+ */
27
+ const SUSPICIOUS_PATTERNS = [
28
+ { pattern: /\bimport\s*\(/, reason: 'Dynamic import() is not available in the sandbox.' },
29
+ { pattern: /\bimport\s+/, reason: 'ES module imports are not available in the sandbox.' },
30
+ { pattern: /\brequire\s*\(/, reason: 'require() is not available in the sandbox.' },
31
+ // Bug #139: fail-fast for eval()/Function() — no security risk (empty Context),
32
+ // but provides immediate, actionable feedback to the LLM.
33
+ { pattern: /\beval\s*\(/, reason: 'eval() has no effect in the sandbox — use direct expressions instead.' },
34
+ { pattern: /\bnew\s+Function\s*\(/, reason: 'new Function() has no effect in the sandbox — use direct expressions instead.' },
35
+ ];
36
+ /**
37
+ * The code must start with one of these patterns to be recognized
38
+ * as a function expression or arrow function.
39
+ */
40
+ const FUNCTION_PATTERNS = [
41
+ /^\s*\(.*\)\s*=>/s, // (x) => ...
42
+ /^\s*[a-zA-Z_$]\w*\s*=>/, // x => ...
43
+ /^\s*function\s*\(/, // function(x) { ... }
44
+ /^\s*function\s+\w+\s*\(/, // function name(x) { ... }
45
+ // Async patterns kept for shape recognition — SUSPICIOUS_PATTERNS
46
+ // will reject them before they reach execution (Bug #16)
47
+ /^\s*async\s+\(.*\)\s*=>/s, // async (x) => ...
48
+ /^\s*async\s+function\s*\(/, // async function(x) { ... }
49
+ /^\s*async\s+[a-zA-Z_$]\w*\s*=>/, // async x => ...
50
+ ];
51
+ // ── Guard Implementation ─────────────────────────────────
52
+ /**
53
+ * Validate LLM-provided code before sending it to the sandbox.
54
+ *
55
+ * Performs two checks:
56
+ * 1. **Shape check**: The code must look like a function expression
57
+ * 2. **Suspicious pattern check**: Fail-fast for obviously unsandboxable patterns
58
+ *
59
+ * @param code - The JavaScript code string from the LLM
60
+ * @returns A `GuardResult` indicating whether the code passed
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * const result = validateSandboxCode('(data) => data.filter(d => d.x > 5)');
65
+ * // { ok: true }
66
+ *
67
+ * const bad = validateSandboxCode('require("fs").readFileSync("/etc/passwd")');
68
+ * // { ok: false, violation: 'Code must be a function expression...' }
69
+ * ```
70
+ */
71
+ export function validateSandboxCode(code) {
72
+ if (!code || typeof code !== 'string') {
73
+ return { ok: false, violation: 'Code must be a non-empty string.' };
74
+ }
75
+ const trimmed = code.trim();
76
+ if (trimmed.length === 0) {
77
+ return { ok: false, violation: 'Code must be a non-empty string.' };
78
+ }
79
+ // Shape check: must look like a function
80
+ const looksLikeFunction = FUNCTION_PATTERNS.some(p => p.test(trimmed));
81
+ if (!looksLikeFunction) {
82
+ return {
83
+ ok: false,
84
+ violation: 'Code must be a function expression or arrow function. ' +
85
+ 'Example: (data) => data.filter(d => d.value > 10)',
86
+ };
87
+ }
88
+ // Suspicious pattern check (fail-fast hints, not security)
89
+ for (const { pattern, reason } of SUSPICIOUS_PATTERNS) {
90
+ if (pattern.test(trimmed)) {
91
+ return { ok: false, violation: reason };
92
+ }
93
+ }
94
+ // Bug #136: detect `async` anywhere in the code (not just at the start).
95
+ // Strip string literals first to avoid false positives on e.g. "async".
96
+ if (containsAsyncKeyword(trimmed)) {
97
+ return {
98
+ ok: false,
99
+ violation: 'Async functions are not supported in the sandbox. ' +
100
+ 'The sandbox uses synchronous JSON.stringify(fn(input)) — ' +
101
+ 'an async function would serialize to \'{}\'. ' +
102
+ 'Use a synchronous function instead.',
103
+ };
104
+ }
105
+ return { ok: true };
106
+ }
107
+ // ── Helpers ──────────────────────────────────────────────
108
+ /**
109
+ * Strip string literals (single, double, template) to avoid
110
+ * false positives when scanning for keywords like `async`.
111
+ * Replaces each string literal with empty quotes of the same kind.
112
+ * @internal
113
+ */
114
+ function stripStringLiterals(code) {
115
+ // Match single-quoted, double-quoted, and back-tick strings
116
+ // (respects escape sequences: \' \" \` don't close the string)
117
+ return code.replace(/(?:'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*`)/gs, '""');
118
+ }
119
+ /**
120
+ * Check if `async` appears as a keyword anywhere in the code,
121
+ * ignoring occurrences inside string literals (Bug #136).
122
+ * @internal
123
+ */
124
+ function containsAsyncKeyword(code) {
125
+ return /\basync\b/.test(stripStringLiterals(code));
126
+ }
127
+ //# sourceMappingURL=SandboxGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SandboxGuard.js","sourceRoot":"","sources":["../../src/sandbox/SandboxGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAWH,4DAA4D;AAE5D;;;;GAIG;AACH,MAAM,mBAAmB,GAAuD;IAC5E,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,mDAAmD,EAAE;IACzF,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,qDAAqD,EAAE;IACzF,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,4CAA4C,EAAE;IACnF,gFAAgF;IAChF,0DAA0D;IAC1D,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,uEAAuE,EAAE;IAC3G,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,+EAA+E,EAAE;CAChI,CAAC;AAEF;;;GAGG;AACH,MAAM,iBAAiB,GAA0B;IAC7C,kBAAkB,EAAe,aAAa;IAC9C,wBAAwB,EAAQ,WAAW;IAC3C,mBAAmB,EAAc,sBAAsB;IACvD,yBAAyB,EAAQ,2BAA2B;IAC5D,kEAAkE;IAClE,yDAAyD;IACzD,0BAA0B,EAAO,mBAAmB;IACpD,2BAA2B,EAAM,4BAA4B;IAC7D,gCAAgC,EAAE,iBAAiB;CACtD,CAAC;AAEF,4DAA4D;AAE5D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC5C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,kCAAkC,EAAE,CAAC;IACxE,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,kCAAkC,EAAE,CAAC;IACxE,CAAC;IAED,yCAAyC;IACzC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACvE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrB,OAAO;YACH,EAAE,EAAE,KAAK;YACT,SAAS,EACL,wDAAwD;gBACxD,mDAAmD;SAC1D,CAAC;IACN,CAAC;IAED,2DAA2D;IAC3D,KAAK,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,mBAAmB,EAAE,CAAC;QACpD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAC5C,CAAC;IACL,CAAC;IAED,yEAAyE;IACzE,wEAAwE;IACxE,IAAI,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO;YACH,EAAE,EAAE,KAAK;YACT,SAAS,EACL,oDAAoD;gBACpD,2DAA2D;gBAC3D,+CAA+C;gBAC/C,qCAAqC;SAC5C,CAAC;IACN,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,4DAA4D;AAE5D;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACrC,4DAA4D;IAC5D,+DAA+D;IAC/D,OAAO,IAAI,CAAC,OAAO,CAAC,6DAA6D,EAAE,IAAI,CAAC,CAAC;AAC7F,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,IAAY;IACtC,OAAO,WAAW,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Sandbox — Barrel Export
3
+ *
4
+ * Zero-Trust Computation Delegation via isolated-vm.
5
+ * Allows LLMs to send JavaScript functions to be executed
6
+ * in a sealed V8 isolate on the client's machine.
7
+ *
8
+ * The `isolated-vm` package is an optional peerDependency.
9
+ * The framework works fully without it — sandbox is a power add-on.
10
+ */
11
+ export { SandboxEngine, resetIvmCache } from './SandboxEngine.js';
12
+ export type { SandboxConfig, SandboxResult, SandboxErrorCode } from './SandboxEngine.js';
13
+ export { validateSandboxCode } from './SandboxGuard.js';
14
+ export type { GuardResult } from './SandboxGuard.js';
15
+ /**
16
+ * System instruction auto-injected into the tool description
17
+ * when `.sandboxed()` is used. Teaches the LLM how to send
18
+ * JavaScript functions for server-side computation delegation.
19
+ *
20
+ * @internal
21
+ */
22
+ export declare const SANDBOX_SYSTEM_INSTRUCTION: string;
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sandbox/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,QAKiC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Sandbox — Barrel Export
3
+ *
4
+ * Zero-Trust Computation Delegation via isolated-vm.
5
+ * Allows LLMs to send JavaScript functions to be executed
6
+ * in a sealed V8 isolate on the client's machine.
7
+ *
8
+ * The `isolated-vm` package is an optional peerDependency.
9
+ * The framework works fully without it — sandbox is a power add-on.
10
+ */
11
+ export { SandboxEngine, resetIvmCache } from './SandboxEngine.js';
12
+ export { validateSandboxCode } from './SandboxGuard.js';
13
+ // ── HATEOAS Auto-Prompting Instruction ───────────────────
14
+ /**
15
+ * System instruction auto-injected into the tool description
16
+ * when `.sandboxed()` is used. Teaches the LLM how to send
17
+ * JavaScript functions for server-side computation delegation.
18
+ *
19
+ * @internal
20
+ */
21
+ export const SANDBOX_SYSTEM_INSTRUCTION = '\n\n[SYSTEM: This tool supports Zero-Trust Compute. ' +
22
+ 'You MUST pass a valid, pure, synchronous JavaScript arrow function as a string ' +
23
+ 'to filter/map the data on the server before receiving it. ' +
24
+ 'E.g.: (data) => data.filter(d => d.value > 10). ' +
25
+ 'Do not use markdown formatting, async/await, or external imports.]';
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sandbox/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGxD,4DAA4D;AAE5D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,0BAA0B,GACnC,sDAAsD;IACtD,iFAAiF;IACjF,4DAA4D;IAC5D,kDAAkD;IAClD,oEAAoE,CAAC"}
@@ -0,0 +1,120 @@
1
+ /** Duck-typed MCP server that supports notifications */
2
+ interface McpServerLike {
3
+ notification(notification: {
4
+ method: string;
5
+ }): Promise<void>;
6
+ sendNotification?(notification: {
7
+ method: string;
8
+ }): Promise<void>;
9
+ }
10
+ /** Duck-typed ToolRegistry */
11
+ interface ToolRegistryLike {
12
+ register(builder: unknown): void;
13
+ getBuilders?(): unknown[];
14
+ /** Optional: clear all builders before re-registering (for hot-reload) */
15
+ clear?(): void;
16
+ }
17
+ /**
18
+ * Configuration for the development server.
19
+ */
20
+ export interface DevServerConfig {
21
+ /**
22
+ * Directory to watch for file changes.
23
+ * Relative paths are resolved from the current working directory.
24
+ */
25
+ readonly dir: string;
26
+ /**
27
+ * File extension filter for watched files.
28
+ * @default ['.ts', '.js', '.mjs', '.mts']
29
+ */
30
+ readonly extensions?: string[];
31
+ /**
32
+ * Debounce interval in milliseconds.
33
+ * Prevents rapid-fire reloads when editors save multiple files.
34
+ * @default 300
35
+ */
36
+ readonly debounce?: number;
37
+ /**
38
+ * Setup callback invoked on every reload.
39
+ *
40
+ * Receives a fresh ToolRegistry. The callback should:
41
+ * 1. Import/define all tools
42
+ * 2. Register them on the registry
43
+ *
44
+ * This is called on initial startup and on every file change.
45
+ */
46
+ readonly setup: (registry: ToolRegistryLike) => void | Promise<void>;
47
+ /**
48
+ * Optional callback when a reload occurs.
49
+ * Useful for logging or triggering downstream updates.
50
+ */
51
+ readonly onReload?: (changedFile: string) => void;
52
+ /**
53
+ * Optional MCP server reference for sending tool list change notifications.
54
+ * When provided, the dev server sends `notifications/tools/list_changed`
55
+ * on every reload, so the LLM client picks up changes automatically.
56
+ */
57
+ readonly server?: McpServerLike;
58
+ /**
59
+ * Optional real ToolRegistry reference for hot-reload.
60
+ *
61
+ * When provided, builders collected during `setup()` are automatically
62
+ * transferred to this registry after each reload, making hot-reload
63
+ * effective. Without this, the user must close over their own registry
64
+ * in the setup callback (fragile and undocumented pattern).
65
+ *
66
+ * If the registry implements `clear()`, old builders are removed
67
+ * before re-registration to avoid duplicates.
68
+ */
69
+ readonly registry?: ToolRegistryLike;
70
+ }
71
+ /**
72
+ * Interface for a running dev server instance.
73
+ */
74
+ export interface DevServer {
75
+ /** Start watching and perform initial load */
76
+ start(): Promise<void>;
77
+ /** Stop the watcher and clean up */
78
+ stop(): void;
79
+ /** Force a manual reload (useful from CLI) */
80
+ reload(reason?: string): Promise<void>;
81
+ }
82
+ /**
83
+ * Create a cache-busting import URL for ESM modules.
84
+ * Appends a timestamp query to force the module to be re-evaluated.
85
+ *
86
+ * Use this inside a DevServer `setup` callback to re-import ESM modules:
87
+ * ```ts
88
+ * const mod = await import(cacheBustUrl('./src/tools.ts'));
89
+ * ```
90
+ */
91
+ export declare function cacheBustUrl(filePath: string): string;
92
+ /**
93
+ * Create an HMR-enabled MCP development server.
94
+ *
95
+ * Watches a directory for file changes and automatically reloads
96
+ * tools, then notifies the connected MCP client via the native
97
+ * `notifications/tools/list_changed` notification.
98
+ *
99
+ * @param config - Dev server configuration
100
+ * @returns A {@link DevServer} instance with start/stop/reload controls
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * import { createDevServer, autoDiscover, ToolRegistry } from 'vurb';
105
+ *
106
+ * const devServer = createDevServer({
107
+ * dir: './src/tools',
108
+ * setup: async (registry) => {
109
+ * await autoDiscover(registry, './src/tools');
110
+ * },
111
+ * onReload: (file) => console.log(`[HMR] Reloaded: ${file}`),
112
+ * });
113
+ *
114
+ * await devServer.start();
115
+ * // File changes → auto-reload → LLM client gets notification
116
+ * ```
117
+ */
118
+ export declare function createDevServer(config: DevServerConfig): DevServer;
119
+ export {};
120
+ //# sourceMappingURL=DevServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevServer.d.ts","sourceRoot":"","sources":["../../src/server/DevServer.ts"],"names":[],"mappings":"AAkDA,wDAAwD;AACxD,UAAU,aAAa;IACnB,YAAY,CAAC,YAAY,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,gBAAgB,CAAC,CAAC,YAAY,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAED,8BAA8B;AAC9B,UAAU,gBAAgB;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAEjC,WAAW,CAAC,IAAI,OAAO,EAAE,CAAC;IAC1B,0EAA0E;IAC1E,KAAK,CAAC,IAAI,IAAI,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAE/B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErE;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAElD;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;IAEhC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,8CAA8C;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,oCAAoC;IACpC,IAAI,IAAI,IAAI,CAAC;IACb,8CAA8C;IAC9C,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAgED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIrD;AAID;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CA6HlE"}
@@ -0,0 +1,252 @@
1
+ /**
2
+ * DevServer — HMR-enabled MCP Development Server
3
+ *
4
+ * The "killer feature" for MCP DX: `vurb dev` starts a
5
+ * development server that watches for file changes and performs
6
+ * automatic Hot Module Replacement without requiring the LLM client
7
+ * (Claude Desktop, Cursor, etc.) to be restarted.
8
+ *
9
+ * ## How It Works
10
+ *
11
+ * 1. The dev server starts an MCP stdio server with your tools
12
+ * 2. When a `.ts`/`.js` file changes, the module cache is invalidated
13
+ * 3. Tools are re-registered from the updated modules
14
+ * 4. The MCP `notifications/tools/list_changed` notification is sent
15
+ * 5. The LLM client picks up the new tool definitions transparently
16
+ *
17
+ * ## Usage
18
+ *
19
+ * ```bash
20
+ * # Auto-detects src/server.ts
21
+ * vurb dev
22
+ *
23
+ * # Explicit entrypoint + custom watch dir
24
+ * vurb dev --server ./src/server.ts --dir ./src/tools
25
+ * ```
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * // Using the programmatic API
30
+ * import { createDevServer } from 'vurb/dev';
31
+ *
32
+ * const devServer = createDevServer({
33
+ * dir: './src/tools',
34
+ * setup: async (registry) => {
35
+ * // Your setup logic — called on every reload
36
+ * await autoDiscover(registry, './src/tools');
37
+ * },
38
+ * });
39
+ *
40
+ * await devServer.start();
41
+ * ```
42
+ *
43
+ * @module
44
+ */
45
+ import { watch } from 'node:fs';
46
+ import { resolve, join, relative } from 'node:path';
47
+ import { pathToFileURL } from 'node:url';
48
+ // ── Module Cache Invalidation ────────────────────────────
49
+ /**
50
+ * Invalidate Node.js ESM module cache for a given file.
51
+ *
52
+ * ESM modules are cached by URL. We use an import timestamp trick
53
+ * to force re-evaluation on next import.
54
+ *
55
+ * For CJS, we clear `require.cache` if available.
56
+ *
57
+ * @internal
58
+ */
59
+ function invalidateModule(filePath) {
60
+ const absolutePath = resolve(filePath);
61
+ // CJS cache invalidation (when running in CJS mode)
62
+ if (typeof require !== 'undefined' && require.cache) {
63
+ invalidateCjsTree(absolutePath);
64
+ }
65
+ // ESM modules can't be uncached directly — use a cache-busting
66
+ // query parameter so the next dynamic import() re-evaluates the module.
67
+ lastCacheBustUrl = cacheBustUrl(absolutePath);
68
+ }
69
+ /**
70
+ * The last cache-busted URL produced by `invalidateModule()`.
71
+ * The setup callback can use this to re-import an ESM module that was invalidated.
72
+ * @internal
73
+ */
74
+ let lastCacheBustUrl;
75
+ /**
76
+ * Recursively invalidate a CJS module and all modules that depend on it.
77
+ *
78
+ * Walks `require.cache` to find modules whose `children` include the
79
+ * changed module (i.e., importers / dependents), and removes them so
80
+ * the next `require()` re-evaluates the entire dependency chain.
81
+ *
82
+ * @internal
83
+ */
84
+ function invalidateCjsTree(entryPath) {
85
+ const visited = new Set();
86
+ const queue = [entryPath];
87
+ while (queue.length > 0) {
88
+ const current = queue.pop();
89
+ if (visited.has(current))
90
+ continue;
91
+ visited.add(current);
92
+ delete require.cache[current];
93
+ // Find all cached modules that imported `current`
94
+ for (const [key, mod] of Object.entries(require.cache)) {
95
+ if (!mod)
96
+ continue;
97
+ const children = mod.children ?? [];
98
+ if (children.some(c => c.id === current)) {
99
+ queue.push(key);
100
+ }
101
+ }
102
+ }
103
+ }
104
+ /**
105
+ * Create a cache-busting import URL for ESM modules.
106
+ * Appends a timestamp query to force the module to be re-evaluated.
107
+ *
108
+ * Use this inside a DevServer `setup` callback to re-import ESM modules:
109
+ * ```ts
110
+ * const mod = await import(cacheBustUrl('./src/tools.ts'));
111
+ * ```
112
+ */
113
+ export function cacheBustUrl(filePath) {
114
+ const url = pathToFileURL(resolve(filePath));
115
+ url.searchParams.set('t', String(Date.now()));
116
+ return url.href;
117
+ }
118
+ // ── Dev Server Factory ───────────────────────────────────
119
+ /**
120
+ * Create an HMR-enabled MCP development server.
121
+ *
122
+ * Watches a directory for file changes and automatically reloads
123
+ * tools, then notifies the connected MCP client via the native
124
+ * `notifications/tools/list_changed` notification.
125
+ *
126
+ * @param config - Dev server configuration
127
+ * @returns A {@link DevServer} instance with start/stop/reload controls
128
+ *
129
+ * @example
130
+ * ```typescript
131
+ * import { createDevServer, autoDiscover, ToolRegistry } from 'vurb';
132
+ *
133
+ * const devServer = createDevServer({
134
+ * dir: './src/tools',
135
+ * setup: async (registry) => {
136
+ * await autoDiscover(registry, './src/tools');
137
+ * },
138
+ * onReload: (file) => console.log(`[HMR] Reloaded: ${file}`),
139
+ * });
140
+ *
141
+ * await devServer.start();
142
+ * // File changes → auto-reload → LLM client gets notification
143
+ * ```
144
+ */
145
+ export function createDevServer(config) {
146
+ const { dir, extensions = ['.ts', '.js', '.mjs', '.mts'], debounce = 300, setup, onReload, server, } = config;
147
+ const absoluteDir = resolve(dir);
148
+ let watcher;
149
+ let debounceTimer;
150
+ let reloadCount = 0;
151
+ /**
152
+ * Perform a full reload: clear caches, re-run setup, notify MCP client.
153
+ */
154
+ async function performReload(changedFile) {
155
+ reloadCount++;
156
+ // Invalidate CJS cache for all watched files
157
+ invalidateModule(changedFile);
158
+ // Re-run the user's setup callback
159
+ // Provide a duck-typed registry that satisfies the interface.
160
+ // The user's setup may use this or close over their own registry.
161
+ const builders = [];
162
+ const reloadRegistry = {
163
+ register(builder) { builders.push(builder); },
164
+ getBuilders() { return builders; },
165
+ };
166
+ try {
167
+ await setup(reloadRegistry);
168
+ }
169
+ catch (err) {
170
+ const message = err instanceof Error ? err.message : String(err);
171
+ // eslint-disable-next-line no-console
172
+ console.error(`[vurb dev] Reload failed: ${message}`);
173
+ return;
174
+ }
175
+ // Transfer collected builders to the real registry (Bug #42 fix)
176
+ if (builders.length > 0 && config.registry) {
177
+ if (typeof config.registry.clear === 'function') {
178
+ config.registry.clear();
179
+ }
180
+ for (const b of builders) {
181
+ config.registry.register(b);
182
+ }
183
+ }
184
+ // Notify MCP client about tool list changes
185
+ if (server) {
186
+ const notification = { method: 'notifications/tools/list_changed' };
187
+ try {
188
+ if (typeof server.sendNotification === 'function') {
189
+ await server.sendNotification(notification);
190
+ }
191
+ else if (typeof server.notification === 'function') {
192
+ await server.notification(notification);
193
+ }
194
+ }
195
+ catch {
196
+ // Connection might not be established yet — ignore
197
+ }
198
+ }
199
+ // User callback
200
+ onReload?.(changedFile);
201
+ }
202
+ return {
203
+ async start() {
204
+ // Perform initial load
205
+ await performReload('(initial)');
206
+ // Start watching
207
+ const watchOptions = { recursive: true };
208
+ // Bug #128: warn on Linux with Node.js < 20 where recursive watch is unsupported
209
+ if (process.platform === 'linux' && parseInt(process.versions.node, 10) < 20) {
210
+ // eslint-disable-next-line no-console
211
+ console.warn('[vurb dev] Warning: recursive fs.watch() is not fully supported on Linux with Node.js < 20. ' +
212
+ 'File changes in subdirectories may not be detected. Consider upgrading to Node.js 20+.');
213
+ }
214
+ watcher = watch(absoluteDir, watchOptions, (_eventType, filename) => {
215
+ if (!filename)
216
+ return;
217
+ // Filter by extension
218
+ const ext = '.' + filename.split('.').pop();
219
+ if (!extensions.includes(ext))
220
+ return;
221
+ // Skip test/spec files
222
+ if (/\.(test|spec|d)\./.test(filename))
223
+ return;
224
+ // Debounce rapid changes
225
+ if (debounceTimer)
226
+ clearTimeout(debounceTimer);
227
+ debounceTimer = setTimeout(() => {
228
+ const fullPath = join(absoluteDir, filename);
229
+ void performReload(relative(process.cwd(), fullPath));
230
+ }, debounce);
231
+ });
232
+ watcher.on('error', (err) => {
233
+ // eslint-disable-next-line no-console
234
+ console.error(`[vurb dev] Watcher error: ${err instanceof Error ? err.message : String(err)}`);
235
+ });
236
+ // eslint-disable-next-line no-console
237
+ console.log(`[vurb dev] Watching ${relative(process.cwd(), absoluteDir)} for changes...`);
238
+ },
239
+ stop() {
240
+ if (debounceTimer)
241
+ clearTimeout(debounceTimer);
242
+ watcher?.close();
243
+ watcher = undefined;
244
+ // eslint-disable-next-line no-console
245
+ console.log(`[vurb dev] Stopped. ${reloadCount} reload(s) performed.`);
246
+ },
247
+ async reload(reason) {
248
+ await performReload(reason ?? '(manual)');
249
+ },
250
+ };
251
+ }
252
+ //# sourceMappingURL=DevServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevServer.js","sourceRoot":"","sources":["../../src/server/DevServer.ts"],"names":[],"mappings":"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"}