@procedures/client 0.0.0-stage → 0.1.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 (762) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/LICENSE +21 -0
  3. package/README.md +832 -2
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/adapters/http/client/index.d.ts +11 -0
  6. package/dist/adapters/http/client/index.d.ts.map +1 -0
  7. package/dist/adapters/http/client/index.js +18 -0
  8. package/dist/adapters/http/client/index.js.map +1 -0
  9. package/dist/adapters/http/client/transport.d.ts +72 -0
  10. package/dist/adapters/http/client/transport.d.ts.map +1 -0
  11. package/dist/adapters/http/client/transport.js +282 -0
  12. package/dist/adapters/http/client/transport.js.map +1 -0
  13. package/dist/adapters/http/client/types.d.ts +27 -0
  14. package/dist/adapters/http/client/types.d.ts.map +1 -0
  15. package/dist/adapters/http/client/types.js +8 -0
  16. package/dist/adapters/http/client/types.js.map +1 -0
  17. package/dist/adapters/http/index.d.ts +7 -0
  18. package/dist/adapters/http/index.d.ts.map +1 -0
  19. package/dist/adapters/http/index.js +7 -0
  20. package/dist/adapters/http/index.js.map +1 -0
  21. package/dist/adapters/http/server/index.d.ts +9 -0
  22. package/dist/adapters/http/server/index.d.ts.map +1 -0
  23. package/dist/adapters/http/server/index.js +10 -0
  24. package/dist/adapters/http/server/index.js.map +1 -0
  25. package/dist/adapters/http/server/strategies.d.ts +39 -0
  26. package/dist/adapters/http/server/strategies.d.ts.map +1 -0
  27. package/dist/adapters/http/server/strategies.js +90 -0
  28. package/dist/adapters/http/server/strategies.js.map +1 -0
  29. package/dist/adapters/http/server/transport.d.ts +66 -0
  30. package/dist/adapters/http/server/transport.d.ts.map +1 -0
  31. package/dist/adapters/http/server/transport.js +561 -0
  32. package/dist/adapters/http/server/transport.js.map +1 -0
  33. package/dist/adapters/http/server/types.d.ts +71 -0
  34. package/dist/adapters/http/server/types.d.ts.map +1 -0
  35. package/dist/adapters/http/server/types.js +7 -0
  36. package/dist/adapters/http/server/types.js.map +1 -0
  37. package/dist/adapters/http/shared/constants.d.ts +95 -0
  38. package/dist/adapters/http/shared/constants.d.ts.map +1 -0
  39. package/dist/adapters/http/shared/constants.js +102 -0
  40. package/dist/adapters/http/shared/constants.js.map +1 -0
  41. package/dist/adapters/http/shared/errors.d.ts +78 -0
  42. package/dist/adapters/http/shared/errors.d.ts.map +1 -0
  43. package/dist/adapters/http/shared/errors.js +151 -0
  44. package/dist/adapters/http/shared/errors.js.map +1 -0
  45. package/dist/adapters/http/shared/headers.d.ts +122 -0
  46. package/dist/adapters/http/shared/headers.d.ts.map +1 -0
  47. package/dist/adapters/http/shared/headers.js +216 -0
  48. package/dist/adapters/http/shared/headers.js.map +1 -0
  49. package/dist/adapters/http/shared/index.d.ts +12 -0
  50. package/dist/adapters/http/shared/index.d.ts.map +1 -0
  51. package/dist/adapters/http/shared/index.js +17 -0
  52. package/dist/adapters/http/shared/index.js.map +1 -0
  53. package/dist/adapters/http/shared/status-codes.d.ts +92 -0
  54. package/dist/adapters/http/shared/status-codes.d.ts.map +1 -0
  55. package/dist/adapters/http/shared/status-codes.js +189 -0
  56. package/dist/adapters/http/shared/status-codes.js.map +1 -0
  57. package/dist/adapters/http/shared/strategies.d.ts +90 -0
  58. package/dist/adapters/http/shared/strategies.d.ts.map +1 -0
  59. package/dist/adapters/http/shared/strategies.js +180 -0
  60. package/dist/adapters/http/shared/strategies.js.map +1 -0
  61. package/dist/adapters/local/client/index.d.ts +8 -0
  62. package/dist/adapters/local/client/index.d.ts.map +1 -0
  63. package/dist/adapters/local/client/index.js +8 -0
  64. package/dist/adapters/local/client/index.js.map +1 -0
  65. package/dist/adapters/local/client/transport.d.ts +81 -0
  66. package/dist/adapters/local/client/transport.d.ts.map +1 -0
  67. package/dist/adapters/local/client/transport.js +172 -0
  68. package/dist/adapters/local/client/transport.js.map +1 -0
  69. package/dist/adapters/local/client/types.d.ts +39 -0
  70. package/dist/adapters/local/client/types.d.ts.map +1 -0
  71. package/dist/adapters/local/client/types.js +13 -0
  72. package/dist/adapters/local/client/types.js.map +1 -0
  73. package/dist/adapters/metadata.d.ts +10 -0
  74. package/dist/adapters/metadata.d.ts.map +1 -0
  75. package/dist/adapters/metadata.js +19 -0
  76. package/dist/adapters/metadata.js.map +1 -0
  77. package/dist/adapters/mock/client/builder.d.ts +35 -0
  78. package/dist/adapters/mock/client/builder.d.ts.map +1 -0
  79. package/dist/adapters/mock/client/builder.js +58 -0
  80. package/dist/adapters/mock/client/builder.js.map +1 -0
  81. package/dist/adapters/mock/client/index.d.ts +9 -0
  82. package/dist/adapters/mock/client/index.d.ts.map +1 -0
  83. package/dist/adapters/mock/client/index.js +10 -0
  84. package/dist/adapters/mock/client/index.js.map +1 -0
  85. package/dist/adapters/mock/client/transport.d.ts +149 -0
  86. package/dist/adapters/mock/client/transport.d.ts.map +1 -0
  87. package/dist/adapters/mock/client/transport.js +289 -0
  88. package/dist/adapters/mock/client/transport.js.map +1 -0
  89. package/dist/adapters/mock/client/types.d.ts +86 -0
  90. package/dist/adapters/mock/client/types.d.ts.map +1 -0
  91. package/dist/adapters/mock/client/types.js +7 -0
  92. package/dist/adapters/mock/client/types.js.map +1 -0
  93. package/dist/adapters/websocket/client/index.d.ts +9 -0
  94. package/dist/adapters/websocket/client/index.d.ts.map +1 -0
  95. package/dist/adapters/websocket/client/index.js +9 -0
  96. package/dist/adapters/websocket/client/index.js.map +1 -0
  97. package/dist/adapters/websocket/client/transport.d.ts +106 -0
  98. package/dist/adapters/websocket/client/transport.d.ts.map +1 -0
  99. package/dist/adapters/websocket/client/transport.js +647 -0
  100. package/dist/adapters/websocket/client/transport.js.map +1 -0
  101. package/dist/adapters/websocket/client/types.d.ts +192 -0
  102. package/dist/adapters/websocket/client/types.d.ts.map +1 -0
  103. package/dist/adapters/websocket/client/types.js +17 -0
  104. package/dist/adapters/websocket/client/types.js.map +1 -0
  105. package/dist/adapters/websocket/index.d.ts +8 -0
  106. package/dist/adapters/websocket/index.d.ts.map +1 -0
  107. package/dist/adapters/websocket/index.js +8 -0
  108. package/dist/adapters/websocket/index.js.map +1 -0
  109. package/dist/adapters/websocket/server/index.d.ts +8 -0
  110. package/dist/adapters/websocket/server/index.d.ts.map +1 -0
  111. package/dist/adapters/websocket/server/index.js +8 -0
  112. package/dist/adapters/websocket/server/index.js.map +1 -0
  113. package/dist/adapters/websocket/server/transport.d.ts +112 -0
  114. package/dist/adapters/websocket/server/transport.d.ts.map +1 -0
  115. package/dist/adapters/websocket/server/transport.js +619 -0
  116. package/dist/adapters/websocket/server/transport.js.map +1 -0
  117. package/dist/adapters/websocket/server/types.d.ts +140 -0
  118. package/dist/adapters/websocket/server/types.d.ts.map +1 -0
  119. package/dist/adapters/websocket/server/types.js +7 -0
  120. package/dist/adapters/websocket/server/types.js.map +1 -0
  121. package/dist/browser.d.ts +48 -0
  122. package/dist/browser.d.ts.map +1 -0
  123. package/dist/browser.js +86 -0
  124. package/dist/browser.js.map +1 -0
  125. package/dist/client/batch-executor.d.ts +160 -0
  126. package/dist/client/batch-executor.d.ts.map +1 -0
  127. package/dist/client/batch-executor.js +397 -0
  128. package/dist/client/batch-executor.js.map +1 -0
  129. package/dist/client/call-types.d.ts +271 -0
  130. package/dist/client/call-types.d.ts.map +1 -0
  131. package/dist/client/call-types.js +208 -0
  132. package/dist/client/call-types.js.map +1 -0
  133. package/dist/client/client.d.ts +517 -0
  134. package/dist/client/client.d.ts.map +1 -0
  135. package/dist/client/client.js +990 -0
  136. package/dist/client/client.js.map +1 -0
  137. package/dist/client/consumption.d.ts +191 -0
  138. package/dist/client/consumption.d.ts.map +1 -0
  139. package/dist/client/consumption.js +98 -0
  140. package/dist/client/consumption.js.map +1 -0
  141. package/dist/client/context.d.ts +116 -0
  142. package/dist/client/context.d.ts.map +1 -0
  143. package/dist/client/context.js +111 -0
  144. package/dist/client/context.js.map +1 -0
  145. package/dist/client/errors/codes.d.ts +71 -0
  146. package/dist/client/errors/codes.d.ts.map +1 -0
  147. package/dist/client/errors/codes.js +81 -0
  148. package/dist/client/errors/codes.js.map +1 -0
  149. package/dist/client/errors/factory.d.ts +102 -0
  150. package/dist/client/errors/factory.d.ts.map +1 -0
  151. package/dist/client/errors/factory.js +210 -0
  152. package/dist/client/errors/factory.js.map +1 -0
  153. package/dist/client/errors/http-errors.d.ts +47 -0
  154. package/dist/client/errors/http-errors.d.ts.map +1 -0
  155. package/dist/client/errors/http-errors.js +548 -0
  156. package/dist/client/errors/http-errors.js.map +1 -0
  157. package/dist/client/errors/http-status.d.ts +73 -0
  158. package/dist/client/errors/http-status.d.ts.map +1 -0
  159. package/dist/client/errors/http-status.js +79 -0
  160. package/dist/client/errors/http-status.js.map +1 -0
  161. package/dist/client/errors/index.d.ts +36 -0
  162. package/dist/client/errors/index.d.ts.map +1 -0
  163. package/dist/client/errors/index.js +40 -0
  164. package/dist/client/errors/index.js.map +1 -0
  165. package/dist/client/errors/registry.d.ts +38 -0
  166. package/dist/client/errors/registry.d.ts.map +1 -0
  167. package/dist/client/errors/registry.js +535 -0
  168. package/dist/client/errors/registry.js.map +1 -0
  169. package/dist/client/errors/types.d.ts +112 -0
  170. package/dist/client/errors/types.d.ts.map +1 -0
  171. package/dist/client/errors/types.js +45 -0
  172. package/dist/client/errors/types.js.map +1 -0
  173. package/dist/client/index.d.ts +44 -0
  174. package/dist/client/index.d.ts.map +1 -0
  175. package/dist/client/index.js +36 -0
  176. package/dist/client/index.js.map +1 -0
  177. package/dist/client/middleware/auth.d.ts +90 -0
  178. package/dist/client/middleware/auth.d.ts.map +1 -0
  179. package/dist/client/middleware/auth.js +98 -0
  180. package/dist/client/middleware/auth.js.map +1 -0
  181. package/dist/client/middleware/batching.d.ts +102 -0
  182. package/dist/client/middleware/batching.d.ts.map +1 -0
  183. package/dist/client/middleware/batching.js +245 -0
  184. package/dist/client/middleware/batching.js.map +1 -0
  185. package/dist/client/middleware/cache.d.ts +124 -0
  186. package/dist/client/middleware/cache.d.ts.map +1 -0
  187. package/dist/client/middleware/cache.js +208 -0
  188. package/dist/client/middleware/cache.js.map +1 -0
  189. package/dist/client/middleware/circuit-breaker.d.ts +113 -0
  190. package/dist/client/middleware/circuit-breaker.d.ts.map +1 -0
  191. package/dist/client/middleware/circuit-breaker.js +236 -0
  192. package/dist/client/middleware/circuit-breaker.js.map +1 -0
  193. package/dist/client/middleware/contexts.d.ts +199 -0
  194. package/dist/client/middleware/contexts.d.ts.map +1 -0
  195. package/dist/client/middleware/contexts.js +74 -0
  196. package/dist/client/middleware/contexts.js.map +1 -0
  197. package/dist/client/middleware/items.d.ts +37 -0
  198. package/dist/client/middleware/items.d.ts.map +1 -0
  199. package/dist/client/middleware/items.js +100 -0
  200. package/dist/client/middleware/items.js.map +1 -0
  201. package/dist/client/middleware/lru.d.ts +32 -0
  202. package/dist/client/middleware/lru.d.ts.map +1 -0
  203. package/dist/client/middleware/lru.js +62 -0
  204. package/dist/client/middleware/lru.js.map +1 -0
  205. package/dist/client/middleware/pagination.d.ts +114 -0
  206. package/dist/client/middleware/pagination.d.ts.map +1 -0
  207. package/dist/client/middleware/pagination.js +148 -0
  208. package/dist/client/middleware/pagination.js.map +1 -0
  209. package/dist/client/middleware/rate-limit.d.ts +105 -0
  210. package/dist/client/middleware/rate-limit.d.ts.map +1 -0
  211. package/dist/client/middleware/rate-limit.js +222 -0
  212. package/dist/client/middleware/rate-limit.js.map +1 -0
  213. package/dist/client/middleware/retry.d.ts +100 -0
  214. package/dist/client/middleware/retry.d.ts.map +1 -0
  215. package/dist/client/middleware/retry.js +150 -0
  216. package/dist/client/middleware/retry.js.map +1 -0
  217. package/dist/client/middleware/timeout.d.ts +91 -0
  218. package/dist/client/middleware/timeout.d.ts.map +1 -0
  219. package/dist/client/middleware/timeout.js +253 -0
  220. package/dist/client/middleware/timeout.js.map +1 -0
  221. package/dist/client/middleware/tracing.d.ts +118 -0
  222. package/dist/client/middleware/tracing.d.ts.map +1 -0
  223. package/dist/client/middleware/tracing.js +152 -0
  224. package/dist/client/middleware/tracing.js.map +1 -0
  225. package/dist/client/route-resolver.d.ts +181 -0
  226. package/dist/client/route-resolver.d.ts.map +1 -0
  227. package/dist/client/route-resolver.js +300 -0
  228. package/dist/client/route-resolver.js.map +1 -0
  229. package/dist/client/typed-method.d.ts +29 -0
  230. package/dist/client/typed-method.d.ts.map +1 -0
  231. package/dist/client/typed-method.js +36 -0
  232. package/dist/client/typed-method.js.map +1 -0
  233. package/dist/client/typed.d.ts +102 -0
  234. package/dist/client/typed.d.ts.map +1 -0
  235. package/dist/client/typed.js +52 -0
  236. package/dist/client/typed.js.map +1 -0
  237. package/dist/client/types.d.ts +296 -0
  238. package/dist/client/types.d.ts.map +1 -0
  239. package/dist/client/types.js +26 -0
  240. package/dist/client/types.js.map +1 -0
  241. package/dist/client/validation/index.d.ts +34 -0
  242. package/dist/client/validation/index.d.ts.map +1 -0
  243. package/dist/client/validation/index.js +36 -0
  244. package/dist/client/validation/index.js.map +1 -0
  245. package/dist/client/validation/middleware.d.ts +82 -0
  246. package/dist/client/validation/middleware.d.ts.map +1 -0
  247. package/dist/client/validation/middleware.js +138 -0
  248. package/dist/client/validation/middleware.js.map +1 -0
  249. package/dist/client/validation/types.d.ts +118 -0
  250. package/dist/client/validation/types.d.ts.map +1 -0
  251. package/dist/client/validation/types.js +59 -0
  252. package/dist/client/validation/types.js.map +1 -0
  253. package/dist/collections/async/async-queue.d.ts +144 -0
  254. package/dist/collections/async/async-queue.d.ts.map +1 -0
  255. package/dist/collections/async/async-queue.js +347 -0
  256. package/dist/collections/async/async-queue.js.map +1 -0
  257. package/dist/collections/async/channels.d.ts +188 -0
  258. package/dist/collections/async/channels.d.ts.map +1 -0
  259. package/dist/collections/async/channels.js +312 -0
  260. package/dist/collections/async/channels.js.map +1 -0
  261. package/dist/collections/behaviors/bounded.d.ts +79 -0
  262. package/dist/collections/behaviors/bounded.d.ts.map +1 -0
  263. package/dist/collections/behaviors/bounded.js +384 -0
  264. package/dist/collections/behaviors/bounded.js.map +1 -0
  265. package/dist/collections/behaviors/evented.d.ts +154 -0
  266. package/dist/collections/behaviors/evented.d.ts.map +1 -0
  267. package/dist/collections/behaviors/evented.js +299 -0
  268. package/dist/collections/behaviors/evented.js.map +1 -0
  269. package/dist/collections/behaviors/lru.d.ts +84 -0
  270. package/dist/collections/behaviors/lru.d.ts.map +1 -0
  271. package/dist/collections/behaviors/lru.js +330 -0
  272. package/dist/collections/behaviors/lru.js.map +1 -0
  273. package/dist/collections/behaviors/readonly.d.ts +73 -0
  274. package/dist/collections/behaviors/readonly.d.ts.map +1 -0
  275. package/dist/collections/behaviors/readonly.js +158 -0
  276. package/dist/collections/behaviors/readonly.js.map +1 -0
  277. package/dist/collections/behaviors/safe.d.ts +163 -0
  278. package/dist/collections/behaviors/safe.d.ts.map +1 -0
  279. package/dist/collections/behaviors/safe.js +172 -0
  280. package/dist/collections/behaviors/safe.js.map +1 -0
  281. package/dist/collections/behaviors/synchronized.d.ts +88 -0
  282. package/dist/collections/behaviors/synchronized.d.ts.map +1 -0
  283. package/dist/collections/behaviors/synchronized.js +294 -0
  284. package/dist/collections/behaviors/synchronized.js.map +1 -0
  285. package/dist/collections/behaviors/ttl.d.ts +118 -0
  286. package/dist/collections/behaviors/ttl.d.ts.map +1 -0
  287. package/dist/collections/behaviors/ttl.js +338 -0
  288. package/dist/collections/behaviors/ttl.js.map +1 -0
  289. package/dist/collections/core/effects.d.ts +176 -0
  290. package/dist/collections/core/effects.d.ts.map +1 -0
  291. package/dist/collections/core/effects.js +180 -0
  292. package/dist/collections/core/effects.js.map +1 -0
  293. package/dist/collections/core/events.d.ts +192 -0
  294. package/dist/collections/core/events.d.ts.map +1 -0
  295. package/dist/collections/core/events.js +291 -0
  296. package/dist/collections/core/events.js.map +1 -0
  297. package/dist/collections/core/middleware.d.ts +231 -0
  298. package/dist/collections/core/middleware.d.ts.map +1 -0
  299. package/dist/collections/core/middleware.js +161 -0
  300. package/dist/collections/core/middleware.js.map +1 -0
  301. package/dist/collections/core/policies.d.ts +220 -0
  302. package/dist/collections/core/policies.d.ts.map +1 -0
  303. package/dist/collections/core/policies.js +48 -0
  304. package/dist/collections/core/policies.js.map +1 -0
  305. package/dist/collections/core/traits.d.ts +142 -0
  306. package/dist/collections/core/traits.d.ts.map +1 -0
  307. package/dist/collections/core/traits.js +8 -0
  308. package/dist/collections/core/traits.js.map +1 -0
  309. package/dist/collections/examples.d.ts +13 -0
  310. package/dist/collections/examples.d.ts.map +1 -0
  311. package/dist/collections/examples.js +302 -0
  312. package/dist/collections/examples.js.map +1 -0
  313. package/dist/collections/fx/collectors.d.ts +190 -0
  314. package/dist/collections/fx/collectors.d.ts.map +1 -0
  315. package/dist/collections/fx/collectors.js +369 -0
  316. package/dist/collections/fx/collectors.js.map +1 -0
  317. package/dist/collections/fx/iter.d.ts +166 -0
  318. package/dist/collections/fx/iter.d.ts.map +1 -0
  319. package/dist/collections/fx/iter.js +421 -0
  320. package/dist/collections/fx/iter.js.map +1 -0
  321. package/dist/collections/impl/array-deque.d.ts +107 -0
  322. package/dist/collections/impl/array-deque.d.ts.map +1 -0
  323. package/dist/collections/impl/array-deque.js +381 -0
  324. package/dist/collections/impl/array-deque.js.map +1 -0
  325. package/dist/collections/impl/array-list.d.ts +101 -0
  326. package/dist/collections/impl/array-list.d.ts.map +1 -0
  327. package/dist/collections/impl/array-list.js +387 -0
  328. package/dist/collections/impl/array-list.js.map +1 -0
  329. package/dist/collections/impl/hash-map.d.ts +141 -0
  330. package/dist/collections/impl/hash-map.d.ts.map +1 -0
  331. package/dist/collections/impl/hash-map.js +450 -0
  332. package/dist/collections/impl/hash-map.js.map +1 -0
  333. package/dist/collections/impl/hash-set.d.ts +125 -0
  334. package/dist/collections/impl/hash-set.d.ts.map +1 -0
  335. package/dist/collections/impl/hash-set.js +264 -0
  336. package/dist/collections/impl/hash-set.js.map +1 -0
  337. package/dist/collections/impl/linked-hash-map.d.ts +141 -0
  338. package/dist/collections/impl/linked-hash-map.d.ts.map +1 -0
  339. package/dist/collections/impl/linked-hash-map.js +472 -0
  340. package/dist/collections/impl/linked-hash-map.js.map +1 -0
  341. package/dist/collections/impl/linked-list.d.ts +109 -0
  342. package/dist/collections/impl/linked-list.d.ts.map +1 -0
  343. package/dist/collections/impl/linked-list.js +491 -0
  344. package/dist/collections/impl/linked-list.js.map +1 -0
  345. package/dist/collections/impl/priority-queue.d.ts +134 -0
  346. package/dist/collections/impl/priority-queue.d.ts.map +1 -0
  347. package/dist/collections/impl/priority-queue.js +336 -0
  348. package/dist/collections/impl/priority-queue.js.map +1 -0
  349. package/dist/collections/impl/tree-map.d.ts +146 -0
  350. package/dist/collections/impl/tree-map.d.ts.map +1 -0
  351. package/dist/collections/impl/tree-map.js +781 -0
  352. package/dist/collections/impl/tree-map.js.map +1 -0
  353. package/dist/collections/impl/tree-set.d.ts +112 -0
  354. package/dist/collections/impl/tree-set.d.ts.map +1 -0
  355. package/dist/collections/impl/tree-set.js +374 -0
  356. package/dist/collections/impl/tree-set.js.map +1 -0
  357. package/dist/collections/index.d.ts +105 -0
  358. package/dist/collections/index.d.ts.map +1 -0
  359. package/dist/collections/index.js +135 -0
  360. package/dist/collections/index.js.map +1 -0
  361. package/dist/collections/interfaces/collection.d.ts +119 -0
  362. package/dist/collections/interfaces/collection.d.ts.map +1 -0
  363. package/dist/collections/interfaces/collection.js +8 -0
  364. package/dist/collections/interfaces/collection.js.map +1 -0
  365. package/dist/collections/interfaces/list.d.ts +247 -0
  366. package/dist/collections/interfaces/list.d.ts.map +1 -0
  367. package/dist/collections/interfaces/list.js +8 -0
  368. package/dist/collections/interfaces/list.js.map +1 -0
  369. package/dist/collections/interfaces/map.d.ts +344 -0
  370. package/dist/collections/interfaces/map.d.ts.map +1 -0
  371. package/dist/collections/interfaces/map.js +8 -0
  372. package/dist/collections/interfaces/map.js.map +1 -0
  373. package/dist/collections/interfaces/queue.d.ts +304 -0
  374. package/dist/collections/interfaces/queue.d.ts.map +1 -0
  375. package/dist/collections/interfaces/queue.js +8 -0
  376. package/dist/collections/interfaces/queue.js.map +1 -0
  377. package/dist/collections/interfaces/set.d.ts +137 -0
  378. package/dist/collections/interfaces/set.d.ts.map +1 -0
  379. package/dist/collections/interfaces/set.js +8 -0
  380. package/dist/collections/interfaces/set.js.map +1 -0
  381. package/dist/collections/storage/api.d.ts +109 -0
  382. package/dist/collections/storage/api.d.ts.map +1 -0
  383. package/dist/collections/storage/api.js +182 -0
  384. package/dist/collections/storage/api.js.map +1 -0
  385. package/dist/collections/storage/hybrid.d.ts +164 -0
  386. package/dist/collections/storage/hybrid.d.ts.map +1 -0
  387. package/dist/collections/storage/hybrid.js +416 -0
  388. package/dist/collections/storage/hybrid.js.map +1 -0
  389. package/dist/collections/storage/index.d.ts +16 -0
  390. package/dist/collections/storage/index.d.ts.map +1 -0
  391. package/dist/collections/storage/index.js +13 -0
  392. package/dist/collections/storage/index.js.map +1 -0
  393. package/dist/collections/storage/interface.d.ts +141 -0
  394. package/dist/collections/storage/interface.d.ts.map +1 -0
  395. package/dist/collections/storage/interface.js +23 -0
  396. package/dist/collections/storage/interface.js.map +1 -0
  397. package/dist/collections/storage/memory.d.ts +68 -0
  398. package/dist/collections/storage/memory.d.ts.map +1 -0
  399. package/dist/collections/storage/memory.js +154 -0
  400. package/dist/collections/storage/memory.js.map +1 -0
  401. package/dist/collections/utils/defaults.d.ts +135 -0
  402. package/dist/collections/utils/defaults.d.ts.map +1 -0
  403. package/dist/collections/utils/defaults.js +322 -0
  404. package/dist/collections/utils/defaults.js.map +1 -0
  405. package/dist/collections/utils/factories.d.ts +144 -0
  406. package/dist/collections/utils/factories.d.ts.map +1 -0
  407. package/dist/collections/utils/factories.js +293 -0
  408. package/dist/collections/utils/factories.js.map +1 -0
  409. package/dist/collections/utils/helpers.d.ts +137 -0
  410. package/dist/collections/utils/helpers.d.ts.map +1 -0
  411. package/dist/collections/utils/helpers.js +221 -0
  412. package/dist/collections/utils/helpers.js.map +1 -0
  413. package/dist/collections.d.ts +12 -0
  414. package/dist/collections.d.ts.map +1 -0
  415. package/dist/collections.js +10 -0
  416. package/dist/collections.js.map +1 -0
  417. package/dist/components/define.d.ts +134 -0
  418. package/dist/components/define.d.ts.map +1 -0
  419. package/dist/components/define.js +486 -0
  420. package/dist/components/define.js.map +1 -0
  421. package/dist/components/index.d.ts +39 -0
  422. package/dist/components/index.d.ts.map +1 -0
  423. package/dist/components/index.js +38 -0
  424. package/dist/components/index.js.map +1 -0
  425. package/dist/components/types.d.ts +264 -0
  426. package/dist/components/types.d.ts.map +1 -0
  427. package/dist/components/types.js +46 -0
  428. package/dist/components/types.js.map +1 -0
  429. package/dist/events/bus.d.ts +193 -0
  430. package/dist/events/bus.d.ts.map +1 -0
  431. package/dist/events/bus.js +511 -0
  432. package/dist/events/bus.js.map +1 -0
  433. package/dist/events/index.d.ts +34 -0
  434. package/dist/events/index.d.ts.map +1 -0
  435. package/dist/events/index.js +36 -0
  436. package/dist/events/index.js.map +1 -0
  437. package/dist/events/types.d.ts +242 -0
  438. package/dist/events/types.d.ts.map +1 -0
  439. package/dist/events/types.js +8 -0
  440. package/dist/events/types.js.map +1 -0
  441. package/dist/index.d.ts +17 -0
  442. package/dist/index.d.ts.map +1 -0
  443. package/dist/index.js +17 -0
  444. package/dist/index.js.map +1 -0
  445. package/dist/middleware/compose.d.ts +88 -0
  446. package/dist/middleware/compose.d.ts.map +1 -0
  447. package/dist/middleware/compose.js +108 -0
  448. package/dist/middleware/compose.js.map +1 -0
  449. package/dist/middleware/index.d.ts +12 -0
  450. package/dist/middleware/index.d.ts.map +1 -0
  451. package/dist/middleware/index.js +11 -0
  452. package/dist/middleware/index.js.map +1 -0
  453. package/dist/middleware/types.d.ts +112 -0
  454. package/dist/middleware/types.d.ts.map +1 -0
  455. package/dist/middleware/types.js +14 -0
  456. package/dist/middleware/types.js.map +1 -0
  457. package/dist/procedures/cli/announce.d.ts +67 -0
  458. package/dist/procedures/cli/announce.d.ts.map +1 -0
  459. package/dist/procedures/cli/announce.js +392 -0
  460. package/dist/procedures/cli/announce.js.map +1 -0
  461. package/dist/procedures/cli/discover.d.ts +66 -0
  462. package/dist/procedures/cli/discover.d.ts.map +1 -0
  463. package/dist/procedures/cli/discover.js +310 -0
  464. package/dist/procedures/cli/discover.js.map +1 -0
  465. package/dist/procedures/cli/index.d.ts +13 -0
  466. package/dist/procedures/cli/index.d.ts.map +1 -0
  467. package/dist/procedures/cli/index.js +201 -0
  468. package/dist/procedures/cli/index.js.map +1 -0
  469. package/dist/procedures/cli/init.d.ts +17 -0
  470. package/dist/procedures/cli/init.d.ts.map +1 -0
  471. package/dist/procedures/cli/init.js +336 -0
  472. package/dist/procedures/cli/init.js.map +1 -0
  473. package/dist/procedures/collection/index.d.ts +10 -0
  474. package/dist/procedures/collection/index.d.ts.map +1 -0
  475. package/dist/procedures/collection/index.js +10 -0
  476. package/dist/procedures/collection/index.js.map +1 -0
  477. package/dist/procedures/collection/procedures.d.ts +21 -0
  478. package/dist/procedures/collection/procedures.d.ts.map +1 -0
  479. package/dist/procedures/collection/procedures.js +198 -0
  480. package/dist/procedures/collection/procedures.js.map +1 -0
  481. package/dist/procedures/collection/schemas.d.ts +131 -0
  482. package/dist/procedures/collection/schemas.d.ts.map +1 -0
  483. package/dist/procedures/collection/schemas.js +422 -0
  484. package/dist/procedures/collection/schemas.js.map +1 -0
  485. package/dist/procedures/collection/storage.d.ts +53 -0
  486. package/dist/procedures/collection/storage.d.ts.map +1 -0
  487. package/dist/procedures/collection/storage.js +2 -0
  488. package/dist/procedures/collection/storage.js.map +1 -0
  489. package/dist/procedures/core/array.d.ts +276 -0
  490. package/dist/procedures/core/array.d.ts.map +1 -0
  491. package/dist/procedures/core/array.js +637 -0
  492. package/dist/procedures/core/array.js.map +1 -0
  493. package/dist/procedures/core/comparison.d.ts +85 -0
  494. package/dist/procedures/core/comparison.d.ts.map +1 -0
  495. package/dist/procedures/core/comparison.js +156 -0
  496. package/dist/procedures/core/comparison.js.map +1 -0
  497. package/dist/procedures/core/index.d.ts +261 -0
  498. package/dist/procedures/core/index.d.ts.map +1 -0
  499. package/dist/procedures/core/index.js +585 -0
  500. package/dist/procedures/core/index.js.map +1 -0
  501. package/dist/procedures/core/logic.d.ts +144 -0
  502. package/dist/procedures/core/logic.d.ts.map +1 -0
  503. package/dist/procedures/core/logic.js +169 -0
  504. package/dist/procedures/core/logic.js.map +1 -0
  505. package/dist/procedures/core/math.d.ts +139 -0
  506. package/dist/procedures/core/math.d.ts.map +1 -0
  507. package/dist/procedures/core/math.js +273 -0
  508. package/dist/procedures/core/math.js.map +1 -0
  509. package/dist/procedures/core/meta.d.ts +111 -0
  510. package/dist/procedures/core/meta.d.ts.map +1 -0
  511. package/dist/procedures/core/meta.js +239 -0
  512. package/dist/procedures/core/meta.js.map +1 -0
  513. package/dist/procedures/core/object.d.ts +109 -0
  514. package/dist/procedures/core/object.d.ts.map +1 -0
  515. package/dist/procedures/core/object.js +270 -0
  516. package/dist/procedures/core/object.js.map +1 -0
  517. package/dist/procedures/core/operands.d.ts +51 -0
  518. package/dist/procedures/core/operands.d.ts.map +1 -0
  519. package/dist/procedures/core/operands.js +90 -0
  520. package/dist/procedures/core/operands.js.map +1 -0
  521. package/dist/procedures/core/outputs.d.ts +28 -0
  522. package/dist/procedures/core/outputs.d.ts.map +1 -0
  523. package/dist/procedures/core/outputs.js +42 -0
  524. package/dist/procedures/core/outputs.js.map +1 -0
  525. package/dist/procedures/core/results.d.ts +202 -0
  526. package/dist/procedures/core/results.d.ts.map +1 -0
  527. package/dist/procedures/core/results.js +106 -0
  528. package/dist/procedures/core/results.js.map +1 -0
  529. package/dist/procedures/core/schemas.d.ts +48 -0
  530. package/dist/procedures/core/schemas.d.ts.map +1 -0
  531. package/dist/procedures/core/schemas.js +102 -0
  532. package/dist/procedures/core/schemas.js.map +1 -0
  533. package/dist/procedures/core/string.d.ts +138 -0
  534. package/dist/procedures/core/string.d.ts.map +1 -0
  535. package/dist/procedures/core/string.js +268 -0
  536. package/dist/procedures/core/string.js.map +1 -0
  537. package/dist/procedures/core/type.d.ts +101 -0
  538. package/dist/procedures/core/type.d.ts.map +1 -0
  539. package/dist/procedures/core/type.js +208 -0
  540. package/dist/procedures/core/type.js.map +1 -0
  541. package/dist/procedures/define-procedure.d.ts +187 -0
  542. package/dist/procedures/define-procedure.d.ts.map +1 -0
  543. package/dist/procedures/define-procedure.js +356 -0
  544. package/dist/procedures/define-procedure.js.map +1 -0
  545. package/dist/procedures/define.d.ts +228 -0
  546. package/dist/procedures/define.d.ts.map +1 -0
  547. package/dist/procedures/define.js +300 -0
  548. package/dist/procedures/define.js.map +1 -0
  549. package/dist/procedures/discovery.d.ts +57 -0
  550. package/dist/procedures/discovery.d.ts.map +1 -0
  551. package/dist/procedures/discovery.js +68 -0
  552. package/dist/procedures/discovery.js.map +1 -0
  553. package/dist/procedures/index.d.ts +24 -0
  554. package/dist/procedures/index.d.ts.map +1 -0
  555. package/dist/procedures/index.js +69 -0
  556. package/dist/procedures/index.js.map +1 -0
  557. package/dist/procedures/interceptors.d.ts +82 -0
  558. package/dist/procedures/interceptors.d.ts.map +1 -0
  559. package/dist/procedures/interceptors.js +193 -0
  560. package/dist/procedures/interceptors.js.map +1 -0
  561. package/dist/procedures/invoke.d.ts +127 -0
  562. package/dist/procedures/invoke.d.ts.map +1 -0
  563. package/dist/procedures/invoke.js +277 -0
  564. package/dist/procedures/invoke.js.map +1 -0
  565. package/dist/procedures/module.d.ts +49 -0
  566. package/dist/procedures/module.d.ts.map +1 -0
  567. package/dist/procedures/module.js +93 -0
  568. package/dist/procedures/module.js.map +1 -0
  569. package/dist/procedures/policy.d.ts +70 -0
  570. package/dist/procedures/policy.d.ts.map +1 -0
  571. package/dist/procedures/policy.js +138 -0
  572. package/dist/procedures/policy.js.map +1 -0
  573. package/dist/procedures/ref.d.ts +606 -0
  574. package/dist/procedures/ref.d.ts.map +1 -0
  575. package/dist/procedures/ref.js +895 -0
  576. package/dist/procedures/ref.js.map +1 -0
  577. package/dist/procedures/registry.d.ts +208 -0
  578. package/dist/procedures/registry.d.ts.map +1 -0
  579. package/dist/procedures/registry.js +402 -0
  580. package/dist/procedures/registry.js.map +1 -0
  581. package/dist/procedures/schema.d.ts +126 -0
  582. package/dist/procedures/schema.d.ts.map +1 -0
  583. package/dist/procedures/schema.js +108 -0
  584. package/dist/procedures/schema.js.map +1 -0
  585. package/dist/procedures/storage/adapter.d.ts +148 -0
  586. package/dist/procedures/storage/adapter.d.ts.map +1 -0
  587. package/dist/procedures/storage/adapter.js +214 -0
  588. package/dist/procedures/storage/adapter.js.map +1 -0
  589. package/dist/procedures/storage/api.d.ts +125 -0
  590. package/dist/procedures/storage/api.d.ts.map +1 -0
  591. package/dist/procedures/storage/api.js +220 -0
  592. package/dist/procedures/storage/api.js.map +1 -0
  593. package/dist/procedures/storage/factory.d.ts +134 -0
  594. package/dist/procedures/storage/factory.d.ts.map +1 -0
  595. package/dist/procedures/storage/factory.js +166 -0
  596. package/dist/procedures/storage/factory.js.map +1 -0
  597. package/dist/procedures/storage/hybrid.d.ts +193 -0
  598. package/dist/procedures/storage/hybrid.d.ts.map +1 -0
  599. package/dist/procedures/storage/hybrid.js +519 -0
  600. package/dist/procedures/storage/hybrid.js.map +1 -0
  601. package/dist/procedures/storage/index.d.ts +17 -0
  602. package/dist/procedures/storage/index.d.ts.map +1 -0
  603. package/dist/procedures/storage/index.js +17 -0
  604. package/dist/procedures/storage/index.js.map +1 -0
  605. package/dist/procedures/storage/procedures.d.ts +39 -0
  606. package/dist/procedures/storage/procedures.d.ts.map +1 -0
  607. package/dist/procedures/storage/procedures.js +261 -0
  608. package/dist/procedures/storage/procedures.js.map +1 -0
  609. package/dist/procedures/storage/serialization.d.ts +123 -0
  610. package/dist/procedures/storage/serialization.d.ts.map +1 -0
  611. package/dist/procedures/storage/serialization.js +216 -0
  612. package/dist/procedures/storage/serialization.js.map +1 -0
  613. package/dist/procedures/storage/synced-registry.d.ts +246 -0
  614. package/dist/procedures/storage/synced-registry.d.ts.map +1 -0
  615. package/dist/procedures/storage/synced-registry.js +575 -0
  616. package/dist/procedures/storage/synced-registry.js.map +1 -0
  617. package/dist/procedures/storage/types.d.ts +130 -0
  618. package/dist/procedures/storage/types.d.ts.map +1 -0
  619. package/dist/procedures/storage/types.js +8 -0
  620. package/dist/procedures/storage/types.js.map +1 -0
  621. package/dist/procedures/types.d.ts +370 -0
  622. package/dist/procedures/types.d.ts.map +1 -0
  623. package/dist/procedures/types.js +23 -0
  624. package/dist/procedures/types.js.map +1 -0
  625. package/dist/server/browser-guard.d.ts +69 -0
  626. package/dist/server/browser-guard.d.ts.map +1 -0
  627. package/dist/server/browser-guard.js +103 -0
  628. package/dist/server/browser-guard.js.map +1 -0
  629. package/dist/server/host-policy.d.ts +59 -0
  630. package/dist/server/host-policy.d.ts.map +1 -0
  631. package/dist/server/host-policy.js +82 -0
  632. package/dist/server/host-policy.js.map +1 -0
  633. package/dist/server/index.d.ts +46 -0
  634. package/dist/server/index.d.ts.map +1 -0
  635. package/dist/server/index.js +42 -0
  636. package/dist/server/index.js.map +1 -0
  637. package/dist/server/method.d.ts +24 -0
  638. package/dist/server/method.d.ts.map +1 -0
  639. package/dist/server/method.js +29 -0
  640. package/dist/server/method.js.map +1 -0
  641. package/dist/server/procedure-server.d.ts +212 -0
  642. package/dist/server/procedure-server.d.ts.map +1 -0
  643. package/dist/server/procedure-server.js +323 -0
  644. package/dist/server/procedure-server.js.map +1 -0
  645. package/dist/server/server.d.ts +161 -0
  646. package/dist/server/server.d.ts.map +1 -0
  647. package/dist/server/server.js +279 -0
  648. package/dist/server/server.js.map +1 -0
  649. package/dist/server/types.d.ts +106 -0
  650. package/dist/server/types.d.ts.map +1 -0
  651. package/dist/server/types.js +29 -0
  652. package/dist/server/types.js.map +1 -0
  653. package/package.json +115 -3
  654. package/src/adapters/http/client/index.ts +51 -0
  655. package/src/adapters/http/client/transport.ts +338 -0
  656. package/src/adapters/http/client/types.ts +33 -0
  657. package/src/adapters/http/index.ts +7 -0
  658. package/src/adapters/http/server/index.ts +14 -0
  659. package/src/adapters/http/server/strategies.ts +105 -0
  660. package/src/adapters/http/server/transport.ts +622 -0
  661. package/src/adapters/http/server/types.ts +81 -0
  662. package/src/adapters/http/shared/constants.ts +108 -0
  663. package/src/adapters/http/shared/errors.ts +199 -0
  664. package/src/adapters/http/shared/headers.ts +291 -0
  665. package/src/adapters/http/shared/index.ts +21 -0
  666. package/src/adapters/http/shared/status-codes.ts +212 -0
  667. package/src/adapters/http/shared/strategies.ts +255 -0
  668. package/src/adapters/local/client/index.ts +11 -0
  669. package/src/adapters/local/client/transport.ts +188 -0
  670. package/src/adapters/local/client/types.ts +50 -0
  671. package/src/adapters/metadata.ts +17 -0
  672. package/src/adapters/mock/client/builder.ts +64 -0
  673. package/src/adapters/mock/client/index.ts +19 -0
  674. package/src/adapters/mock/client/transport.ts +352 -0
  675. package/src/adapters/mock/client/types.ts +99 -0
  676. package/src/adapters/websocket/client/index.ts +18 -0
  677. package/src/adapters/websocket/client/transport.ts +733 -0
  678. package/src/adapters/websocket/client/types.ts +235 -0
  679. package/src/adapters/websocket/index.ts +24 -0
  680. package/src/adapters/websocket/server/index.ts +18 -0
  681. package/src/adapters/websocket/server/transport.ts +705 -0
  682. package/src/adapters/websocket/server/types.ts +169 -0
  683. package/src/browser.ts +373 -0
  684. package/src/client/batch-executor.ts +514 -0
  685. package/src/client/call-types.ts +491 -0
  686. package/src/client/client.ts +1202 -0
  687. package/src/client/consumption.ts +288 -0
  688. package/src/client/context.ts +228 -0
  689. package/src/client/errors/README.md +279 -0
  690. package/src/client/errors/codes.ts +88 -0
  691. package/src/client/errors/factory.ts +263 -0
  692. package/src/client/errors/http-errors.ts +601 -0
  693. package/src/client/errors/http-status.ts +82 -0
  694. package/src/client/errors/index.ts +72 -0
  695. package/src/client/errors/registry.ts +595 -0
  696. package/src/client/errors/types.ts +139 -0
  697. package/src/client/index.ts +124 -0
  698. package/src/client/middleware/auth.ts +132 -0
  699. package/src/client/middleware/cache.ts +316 -0
  700. package/src/client/middleware/circuit-breaker.ts +339 -0
  701. package/src/client/middleware/contexts.ts +319 -0
  702. package/src/client/middleware/items.ts +114 -0
  703. package/src/client/middleware/lru.ts +66 -0
  704. package/src/client/middleware/pagination.ts +213 -0
  705. package/src/client/middleware/rate-limit.ts +315 -0
  706. package/src/client/middleware/retry.ts +236 -0
  707. package/src/client/middleware/timeout.ts +308 -0
  708. package/src/client/middleware/tracing.ts +191 -0
  709. package/src/client/route-resolver.ts +407 -0
  710. package/src/client/typed-method.ts +65 -0
  711. package/src/client/typed.ts +140 -0
  712. package/src/client/types.ts +361 -0
  713. package/src/client/validation/index.ts +56 -0
  714. package/src/client/validation/middleware.ts +254 -0
  715. package/src/client/validation/types.ts +162 -0
  716. package/src/events/bus.ts +594 -0
  717. package/src/events/index.ts +67 -0
  718. package/src/events/types.ts +263 -0
  719. package/src/index.ts +33 -0
  720. package/src/middleware/compose.ts +159 -0
  721. package/src/middleware/index.ts +28 -0
  722. package/src/middleware/types.ts +166 -0
  723. package/src/procedures/cli/announce.ts +470 -0
  724. package/src/procedures/cli/discover.ts +390 -0
  725. package/src/procedures/cli/index.ts +229 -0
  726. package/src/procedures/cli/init.ts +370 -0
  727. package/src/procedures/collection/index.ts +51 -0
  728. package/src/procedures/collection/procedures.ts +245 -0
  729. package/src/procedures/collection/schemas.ts +550 -0
  730. package/src/procedures/collection/storage.ts +53 -0
  731. package/src/procedures/core/array.ts +1024 -0
  732. package/src/procedures/core/comparison.ts +263 -0
  733. package/src/procedures/core/index.ts +895 -0
  734. package/src/procedures/core/logic.ts +225 -0
  735. package/src/procedures/core/math.ts +469 -0
  736. package/src/procedures/core/meta.ts +384 -0
  737. package/src/procedures/core/object.ts +427 -0
  738. package/src/procedures/core/operands.ts +119 -0
  739. package/src/procedures/core/outputs.ts +48 -0
  740. package/src/procedures/core/results.ts +296 -0
  741. package/src/procedures/core/schemas.ts +123 -0
  742. package/src/procedures/core/string.ts +458 -0
  743. package/src/procedures/core/type.ts +344 -0
  744. package/src/procedures/define-procedure.ts +531 -0
  745. package/src/procedures/define.ts +387 -0
  746. package/src/procedures/discovery.ts +76 -0
  747. package/src/procedures/index.ts +228 -0
  748. package/src/procedures/interceptors.ts +272 -0
  749. package/src/procedures/invoke.ts +413 -0
  750. package/src/procedures/module.ts +107 -0
  751. package/src/procedures/policy.ts +171 -0
  752. package/src/procedures/ref.ts +1305 -0
  753. package/src/procedures/registry.ts +473 -0
  754. package/src/procedures/schema.ts +225 -0
  755. package/src/procedures/types.ts +485 -0
  756. package/src/server/browser-guard.ts +147 -0
  757. package/src/server/host-policy.ts +121 -0
  758. package/src/server/index.ts +70 -0
  759. package/src/server/method.ts +33 -0
  760. package/src/server/procedure-server.ts +417 -0
  761. package/src/server/server.ts +364 -0
  762. package/src/server/types.ts +147 -0
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Procedure invocation: the one way to run a procedure.
3
+ *
4
+ * `Client.exec()`, `Client.route()`, the local transport and `ProcedureServer` run each
5
+ * procedure through `invokeProcedure()`. The function validates the input, makes the context,
6
+ * runs the handler and validates each output. Thus every host applies the same rules
7
+ * (ARCHITECTURE-PROPOSALS-2026-10 P1).
8
+ *
9
+ * A handler gives one value, or it is a generator that yields values (a stream). The result
10
+ * tells which: `{ kind: "value" }` or `{ kind: "stream" }`. A caller that wants one value uses
11
+ * `outputValue()` (the last item of a stream). A caller that wants each value uses `outputItems()`.
12
+ *
13
+ * Interceptors run around each invocation, the nested calls too (roadmap 1.2): policy, tracing,
14
+ * timeouts and metrics for every host. `interceptors.ts` has a timeout, a tracing and a metrics
15
+ * interceptor.
16
+ */
17
+ import { pathToKey } from "./types.js";
18
+ import { validateSchema } from "./schema.js";
19
+ import { PROCEDURE_REGISTRY } from "./registry.js";
20
+ import { nestedCallRefusal } from "./policy.js";
21
+ import { scopeOf, withScope } from "./ref.js";
22
+ import { getGlobalEventBus, withEventBusSignal } from "../events/bus.js";
23
+ /** An error of the invocation itself. An error that the handler throws passes through unchanged. */
24
+ export class InvocationError extends Error {
25
+ name = "InvocationError";
26
+ code;
27
+ path;
28
+ retryable = false;
29
+ constructor(code, message, path) {
30
+ super(message);
31
+ this.code = code;
32
+ this.path = path;
33
+ }
34
+ }
35
+ function abortError(path) {
36
+ return new InvocationError("ABORTED", `Procedure was aborted: ${pathToKey(path)}`, path);
37
+ }
38
+ // =============================================================================
39
+ // Interceptors
40
+ // =============================================================================
41
+ let invocationCount = 0;
42
+ // =============================================================================
43
+ // Invocation
44
+ // =============================================================================
45
+ /** True for a value that `for await` can read: a generator, a stream. A string is not one. */
46
+ export function isAsyncIterable(value) {
47
+ return (value !== null &&
48
+ (typeof value === "object" || typeof value === "function") &&
49
+ typeof value[Symbol.asyncIterator] === "function");
50
+ }
51
+ /** The output (or one stream item), validated by the output schema of the procedure. */
52
+ async function validateOutput(procedure, output) {
53
+ const result = await validateSchema(procedure.output, output);
54
+ if (!result.ok) {
55
+ throw new InvocationError("OUTPUT_VALIDATION_ERROR", `Output validation failed for ${pathToKey(procedure.path)}: ${result.message}`, procedure.path);
56
+ }
57
+ return result.value;
58
+ }
59
+ /** The next item, or an abort error when the signal aborts first. */
60
+ function nextOrAbort(iterator, signal, path) {
61
+ if (signal.aborted)
62
+ return Promise.reject(abortError(path));
63
+ return new Promise((resolve, reject) => {
64
+ const onAbort = () => reject(abortError(path));
65
+ signal.addEventListener("abort", onAbort, { once: true });
66
+ iterator.next().then((result) => {
67
+ signal.removeEventListener("abort", onAbort);
68
+ resolve(result);
69
+ }, (error) => {
70
+ signal.removeEventListener("abort", onAbort);
71
+ reject(error);
72
+ });
73
+ });
74
+ }
75
+ /**
76
+ * The items of a handler's stream, each validated with the output schema. When the reader stops
77
+ * early or an item is not valid, the handler's generator gets `return()`, so its `finally` runs.
78
+ */
79
+ async function* validatedItems(procedure, source, signal) {
80
+ const iterator = source[Symbol.asyncIterator]();
81
+ let done = false;
82
+ let aborted = false;
83
+ try {
84
+ for (;;) {
85
+ let step;
86
+ try {
87
+ step = signal ? await nextOrAbort(iterator, signal, procedure.path) : await iterator.next();
88
+ }
89
+ catch (error) {
90
+ // The handler threw (its generator is done), or the signal aborted (it is not)
91
+ if (error instanceof InvocationError && error.code === "ABORTED")
92
+ aborted = true;
93
+ else
94
+ done = true;
95
+ throw error;
96
+ }
97
+ if (step.done) {
98
+ done = true;
99
+ return;
100
+ }
101
+ yield await validateOutput(procedure, step.value);
102
+ }
103
+ }
104
+ finally {
105
+ if (!done) {
106
+ // The generator of an aborted handler can wait on an await: do not wait for it
107
+ const closing = Promise.resolve(iterator.return?.()).catch(() => undefined);
108
+ if (!aborted)
109
+ await closing;
110
+ }
111
+ }
112
+ }
113
+ /**
114
+ * This function runs a procedure: it validates the input, makes the context, runs the handler
115
+ * and validates the output. It throws an `InvocationError` for an invocation that cannot run,
116
+ * and the handler's own error when the handler throws. The interceptors of the options run
117
+ * around these steps.
118
+ */
119
+ export async function invokeProcedure(procedure, input, options = {}) {
120
+ const { path } = procedure;
121
+ if (!procedure.handler) {
122
+ throw new InvocationError("NO_HANDLER", `Procedure has no handler: ${pathToKey(path)}`, path);
123
+ }
124
+ if (options.signal?.aborted)
125
+ throw abortError(path);
126
+ const invocation = {
127
+ id: ++invocationCount,
128
+ procedure,
129
+ path,
130
+ input,
131
+ metadata: options.metadata ?? {},
132
+ signal: options.signal,
133
+ parent: options.parent,
134
+ depth: options.parent ? options.parent.depth + 1 : 0,
135
+ };
136
+ const interceptors = options.interceptors ?? [];
137
+ if (interceptors.length === 0)
138
+ return runInvocation(invocation, options);
139
+ const dispatch = (index, current, currentOptions) => {
140
+ const interceptor = interceptors[index];
141
+ if (!interceptor)
142
+ return runInvocation(current, currentOptions);
143
+ return interceptor(current, (changes) => {
144
+ if (!changes)
145
+ return dispatch(index + 1, current, currentOptions);
146
+ const changed = {
147
+ ...current,
148
+ signal: changes.signal ?? current.signal,
149
+ metadata: changes.metadata ?? current.metadata,
150
+ };
151
+ return dispatch(index + 1, changed, { ...currentOptions, signal: changed.signal, metadata: changed.metadata });
152
+ });
153
+ };
154
+ return dispatch(0, invocation, options);
155
+ }
156
+ /** The end of the chain: the validation, the context, the handler and the output. */
157
+ async function runInvocation(invocation, options) {
158
+ const { procedure, path, input } = invocation;
159
+ const handler = procedure.handler;
160
+ if (options.signal?.aborted)
161
+ throw abortError(path);
162
+ let data = input;
163
+ if (!options.inputValidated) {
164
+ // A synchronous schema gives its result at once, so the handler starts before an await
165
+ let parsed = validateSchema(procedure.input, input);
166
+ if (parsed instanceof Promise)
167
+ parsed = await parsed;
168
+ if (!parsed.ok) {
169
+ throw new InvocationError("VALIDATION_ERROR", `Input validation failed for ${pathToKey(path)}: ${parsed.message}`, path);
170
+ }
171
+ // A parse makes a new object, without the hidden scope of a raw input (`withScope()`). The
172
+ // scope goes onto the parsed data, so a runner with a Zod schema can read the names of the
173
+ // caller (docs review DOC-10: before, each runner needed its own workaround).
174
+ data = parsed.value === input ? input : withScope(parsed.value, scopeOf(input));
175
+ }
176
+ // The handler starts here, before the first await (the site's trace depends on it)
177
+ const result = await handler(data, createProcedureContext(procedure, options, invocation));
178
+ if (isAsyncIterable(result)) {
179
+ return { kind: "stream", items: validatedItems(procedure, result, options.signal) };
180
+ }
181
+ return { kind: "value", value: (await validateOutput(procedure, result)) };
182
+ }
183
+ /** This function finds the procedure at a path in the registry of the options, then runs it. */
184
+ export async function invokePath(path, input, options = {}) {
185
+ const procedure = (options.registry ?? PROCEDURE_REGISTRY).get(path);
186
+ if (!procedure) {
187
+ throw new InvocationError("NOT_FOUND", `Procedure not found: ${pathToKey(path)}`, path);
188
+ }
189
+ return invokeProcedure(procedure, input, options);
190
+ }
191
+ // =============================================================================
192
+ // Consumption
193
+ // =============================================================================
194
+ /**
195
+ * One value of an output: the value, or the last item of a stream (the "sponge" mode). An
196
+ * empty stream is an error.
197
+ */
198
+ export async function outputValue(output, path = []) {
199
+ if (output.kind === "value")
200
+ return output.value;
201
+ let last;
202
+ for await (const item of output.items)
203
+ last = { value: item };
204
+ if (!last) {
205
+ throw new InvocationError("NO_OUTPUT", `Procedure gave no output: ${pathToKey(path)}`, path);
206
+ }
207
+ return last.value;
208
+ }
209
+ /** Each value of an output: the items of a stream, or the one value. */
210
+ export async function* outputItems(output) {
211
+ if (output.kind === "value") {
212
+ yield output.value;
213
+ return;
214
+ }
215
+ yield* output.items;
216
+ }
217
+ /** The items of an output that `start` gives. Nothing runs until the reader asks for the first item. */
218
+ export async function* streamOutput(start) {
219
+ yield* outputItems(await start());
220
+ }
221
+ // =============================================================================
222
+ // Context
223
+ // =============================================================================
224
+ /**
225
+ * The context of a procedure. Its `client` calls other procedures through `invokePath()` with
226
+ * the same options, so the nested calls get the same metadata, signal, rules and interceptors.
227
+ * With an invocation, the nested calls name it as their parent.
228
+ */
229
+ export function createProcedureContext(procedure, options = {}, invocation) {
230
+ const nestedOptions = invocation ? { ...options, parent: invocation } : options;
231
+ let client;
232
+ if (typeof options.client === "function") {
233
+ client = invocation ? options.client(invocation) : registryClient(procedure, nestedOptions);
234
+ }
235
+ else {
236
+ client = options.client ?? registryClient(procedure, nestedOptions);
237
+ }
238
+ const context = {
239
+ metadata: options.metadata ?? {},
240
+ path: procedure.path,
241
+ client,
242
+ registry: options.registry ?? PROCEDURE_REGISTRY,
243
+ };
244
+ if (options.signal)
245
+ context.signal = options.signal;
246
+ if (options.repository)
247
+ context.repository = options.repository;
248
+ if (options.onRef)
249
+ context.onRef = options.onRef;
250
+ // Every context has a bus. With a signal, the waits of the handler on the bus end when the
251
+ // invocation aborts, so a stream handler that waits on ctx.bus.stream() can finish. (Before,
252
+ // no host set ctx.bus: deep dive CORE-15.)
253
+ const bus = options.bus ?? getGlobalEventBus();
254
+ context.bus = options.signal ? withEventBusSignal(bus, options.signal) : bus;
255
+ return context;
256
+ }
257
+ /** The client of a procedure's context: it runs the nested calls from the registry. */
258
+ function registryClient(caller, options) {
259
+ const start = (path, input) => {
260
+ // The call policy of the host, with the immediate caller (BUGS-2026-07 H18, deep dive MCP-3).
261
+ // It runs before the lookup, so a refused path tells nothing about the procedure.
262
+ const refusal = nestedCallRefusal(caller, path, options);
263
+ if (refusal) {
264
+ return Promise.reject(new InvocationError(refusal.code, refusal.message, path));
265
+ }
266
+ return invokePath(path, input, options);
267
+ };
268
+ return {
269
+ async call(path, input) {
270
+ return outputValue(await start(path, input), path);
271
+ },
272
+ stream(path, input) {
273
+ return streamOutput(() => start(path, input));
274
+ },
275
+ };
276
+ }
277
+ //# sourceMappingURL=invoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/procedures/invoke.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Procedure modules and explicit registries (architecture review, roadmap 3.1).
3
+ *
4
+ * Importing a package root registers its procedures in the global `PROCEDURE_REGISTRY`
5
+ * (DECISIONS-2026-10, "Every package root registers its procedures"). That stays. A host that
6
+ * wants its own registry uses the module of each package instead: the `./module` entry of a
7
+ * package exports its procedures as data, and importing it registers nothing.
8
+ *
9
+ * ```ts
10
+ * import { createRegistry, Client, LocalTransport } from "@procedures/client";
11
+ * import gitModule from "@procedures/git/module";
12
+ *
13
+ * const registry = createRegistry(gitModule);
14
+ * const client = new Client(new LocalTransport({ registry })).useRegistry(registry);
15
+ * ```
16
+ *
17
+ * Two registries in one process stay apart: a nested call, `procedure.define` and the expose
18
+ * rule of a server all use the registry of the invocation (`ctx.registry`).
19
+ */
20
+ import { ProcedureRegistry } from "./registry.js";
21
+ import type { AnyProcedure, ProcedureModule, RegistrationOptions } from "./types.js";
22
+ /**
23
+ * The procedures that `@procedures/client` registers in the global registry when it is
24
+ * imported: the control flow (`client.chain`, `client.map` and the others) and
25
+ * `procedure.define`/`get`/`list`/`delete`. `createRegistry()` always registers this module, so an
26
+ * explicit registry has what the global registry has.
27
+ */
28
+ export declare const clientModule: ProcedureModule;
29
+ /** This function gives a module: its procedures, and the modules whose procedures it calls. */
30
+ export declare function defineModule(name: string, procedures: readonly AnyProcedure[], requires?: readonly ProcedureModule[]): ProcedureModule;
31
+ /**
32
+ * The modules and their required modules, each one time, with each required module before the
33
+ * module that requires it.
34
+ */
35
+ export declare function moduleClosure(modules: readonly ProcedureModule[]): ProcedureModule[];
36
+ /** One module, or a list of modules (a bundle can give a list). */
37
+ export type ModuleInput = ProcedureModule | readonly ProcedureModule[];
38
+ /**
39
+ * Register the procedures of a module and of its required modules in a registry. A procedure
40
+ * that the registry has already (the same handler, from a module that two modules require) is
41
+ * skipped. Another procedure at the same path is an error.
42
+ */
43
+ export declare function registerModules(registry: ProcedureRegistry, modules: readonly ModuleInput[], options?: RegistrationOptions): ProcedureRegistry;
44
+ /**
45
+ * A new registry with the procedures of `clientModule` (what the global registry has after
46
+ * `import "@procedures/client"`) and of each module, with their required modules.
47
+ */
48
+ export declare function createRegistry(...modules: ModuleInput[]): ProcedureRegistry;
49
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/procedures/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,iBAAiB,EAAiB,MAAM,eAAe,CAAC;AAGjE,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErF;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,eAG1B,CAAC;AAEF,+FAA+F;AAC/F,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,SAAS,YAAY,EAAE,EACnC,QAAQ,GAAE,SAAS,eAAe,EAAO,GACxC,eAAe,CAEjB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,GAAG,eAAe,EAAE,CAkBpF;AAED,mEAAmE;AACnE,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,SAAS,eAAe,EAAE,CAAC;AAEvE;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,iBAAiB,CAiBnB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,OAAO,EAAE,WAAW,EAAE,GAAG,iBAAiB,CAE3E"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Procedure modules and explicit registries (architecture review, roadmap 3.1).
3
+ *
4
+ * Importing a package root registers its procedures in the global `PROCEDURE_REGISTRY`
5
+ * (DECISIONS-2026-10, "Every package root registers its procedures"). That stays. A host that
6
+ * wants its own registry uses the module of each package instead: the `./module` entry of a
7
+ * package exports its procedures as data, and importing it registers nothing.
8
+ *
9
+ * ```ts
10
+ * import { createRegistry, Client, LocalTransport } from "@procedures/client";
11
+ * import gitModule from "@procedures/git/module";
12
+ *
13
+ * const registry = createRegistry(gitModule);
14
+ * const client = new Client(new LocalTransport({ registry })).useRegistry(registry);
15
+ * ```
16
+ *
17
+ * Two registries in one process stay apart: a nested call, `procedure.define` and the expose
18
+ * rule of a server all use the registry of the invocation (`ctx.registry`).
19
+ */
20
+ import { ProcedureRegistry, RegistryError } from "./registry.js";
21
+ import { coreProcedures } from "./core/index.js";
22
+ import { metaProcedures as definitionProcedures } from "./define-procedure.js";
23
+ /**
24
+ * The procedures that `@procedures/client` registers in the global registry when it is
25
+ * imported: the control flow (`client.chain`, `client.map` and the others) and
26
+ * `procedure.define`/`get`/`list`/`delete`. `createRegistry()` always registers this module, so an
27
+ * explicit registry has what the global registry has.
28
+ */
29
+ export const clientModule = {
30
+ name: "@procedures/client",
31
+ procedures: [...coreProcedures, ...definitionProcedures],
32
+ };
33
+ /** This function gives a module: its procedures, and the modules whose procedures it calls. */
34
+ export function defineModule(name, procedures, requires = []) {
35
+ return { name, procedures: [...procedures], requires };
36
+ }
37
+ /**
38
+ * The modules and their required modules, each one time, with each required module before the
39
+ * module that requires it.
40
+ */
41
+ export function moduleClosure(modules) {
42
+ const ordered = [];
43
+ const seen = new Set();
44
+ const names = new Set();
45
+ const visit = (module, trail) => {
46
+ if (seen.has(module))
47
+ return;
48
+ // Two copies of one package (two installs) have one name: the first one counts
49
+ if (module.name !== undefined && names.has(module.name))
50
+ return;
51
+ if (trail.includes(module)) {
52
+ throw new Error(`Modules require each other in a cycle: ${[...trail, module].map((m) => m.name ?? "?").join(" -> ")}`);
53
+ }
54
+ for (const required of module.requires ?? [])
55
+ visit(required, [...trail, module]);
56
+ seen.add(module);
57
+ if (module.name !== undefined)
58
+ names.add(module.name);
59
+ ordered.push(module);
60
+ };
61
+ for (const module of modules)
62
+ visit(module, []);
63
+ return ordered;
64
+ }
65
+ /**
66
+ * Register the procedures of a module and of its required modules in a registry. A procedure
67
+ * that the registry has already (the same handler, from a module that two modules require) is
68
+ * skipped. Another procedure at the same path is an error.
69
+ */
70
+ export function registerModules(registry, modules, options) {
71
+ const flat = modules.flatMap((input) => (Array.isArray(input) ? input : [input]));
72
+ for (const module of moduleClosure(flat)) {
73
+ for (const procedure of module.procedures) {
74
+ const path = options?.pathPrefix ? [...options.pathPrefix, ...procedure.path] : procedure.path;
75
+ const existing = registry.get(path);
76
+ if (existing && !options?.override) {
77
+ if (existing.handler === procedure.handler)
78
+ continue;
79
+ throw new RegistryError(`Two modules give the procedure ${path.join(".")}: the second one is ${module.name ?? "a module without a name"}`, path);
80
+ }
81
+ registry.register(procedure, options);
82
+ }
83
+ }
84
+ return registry;
85
+ }
86
+ /**
87
+ * A new registry with the procedures of `clientModule` (what the global registry has after
88
+ * `import "@procedures/client"`) and of each module, with their required modules.
89
+ */
90
+ export function createRegistry(...modules) {
91
+ return registerModules(new ProcedureRegistry(), [clientModule, ...modules]);
92
+ }
93
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/procedures/module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * The call policy of a host: which nested calls a procedure can make (deep dive MCP-3).
3
+ *
4
+ * A host that serves procedures to an outside caller (the MCP server, a network server) gives an
5
+ * `expose` rule: the procedures that its callers can reach. A procedure can call other
6
+ * procedures through `ctx.client`. The policy decides for each nested call, with the immediate
7
+ * caller:
8
+ *
9
+ * - A data-driven caller (control flow, `runs-refs`, a procedure that `procedure.define` made)
10
+ * runs refs that its caller chose. It can call only exposed procedures.
11
+ * - A code caller with `metadata.calls` can call the procedures that it declares, and the
12
+ * exposed procedures.
13
+ * - A code caller without `calls` can call any procedure, unless the host sets `strictCalls`.
14
+ * Then it can call only exposed procedures.
15
+ *
16
+ * Before, only the first rule existed. An exposed procedure of code could call any procedure, so
17
+ * a code procedure that turns its input into a call was a confused deputy. The declarations make
18
+ * the reach of each tool visible: a test of the MCP server pins it.
19
+ *
20
+ * A host without `expose` and without `strictCalls` (a library, the local CLI) checks nothing.
21
+ */
22
+ import type { AnyProcedure, ProcedurePath } from "./types.js";
23
+ /** The call policy of a host. */
24
+ export interface CallPolicy {
25
+ /** The procedures that the callers of the host can reach. Without it, every procedure is exposed. */
26
+ expose?: ((path: ProcedurePath) => boolean) | undefined;
27
+ /**
28
+ * True: a code procedure without `metadata.calls` can call only exposed procedures. The MCP
29
+ * server of the dev tools sets it.
30
+ */
31
+ strictCalls?: boolean | undefined;
32
+ }
33
+ /** The reason of a refused nested call. */
34
+ export interface CallRefusal {
35
+ readonly code: "NOT_EXPOSED" | "NOT_DECLARED";
36
+ readonly message: string;
37
+ }
38
+ /** True when a host has a policy: a nested call is examined only then. */
39
+ export declare function hasCallPolicy(policy: CallPolicy): boolean;
40
+ /**
41
+ * True when one entry of `calls` allows a procedure key: the same key, or `"ns.*"` for a key
42
+ * that starts with `"ns."` (at any depth: `"fs.*"` allows `fs.read.json`).
43
+ */
44
+ export declare function callMatches(entry: string, key: string): boolean;
45
+ /**
46
+ * This function checks the `calls` of a procedure's metadata and returns it, or undefined when
47
+ * there is none. It throws for an invalid list. `"*"` alone is refused: a procedure whose
48
+ * callees come from its input is data-driven and must have the `runs-refs` tag.
49
+ */
50
+ export declare function validateCalls(calls: unknown, path: ProcedurePath): readonly string[] | undefined;
51
+ /** The `calls` of a procedure, or undefined when it declares none. */
52
+ export declare function declaredCalls(procedure: Pick<AnyProcedure, "path" | "metadata">): readonly string[] | undefined;
53
+ /** One edge of the reach of the exposed procedures: a declared call to a procedure that is not exposed. */
54
+ export interface HiddenCall {
55
+ readonly from: string;
56
+ readonly to: string;
57
+ }
58
+ /**
59
+ * The procedures that are not exposed, but that the exposed procedures can reach through their
60
+ * `metadata.calls`, also through more than one step. A data-driven procedure reaches only
61
+ * exposed procedures, and under `strictCalls` a procedure without `calls` does too, so neither
62
+ * adds an edge. The edges are sorted. A test of the MCP server pins them.
63
+ */
64
+ export declare function hiddenReach(procedures: readonly AnyProcedure[], expose: (path: ProcedurePath) => boolean): HiddenCall[];
65
+ /**
66
+ * The refusal of a nested call from `caller` to `path` under `policy`, or undefined when the
67
+ * call is allowed.
68
+ */
69
+ export declare function nestedCallRefusal(caller: AnyProcedure, path: ProcedurePath, policy: CallPolicy): CallRefusal | undefined;
70
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/procedures/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI9D,iCAAiC;AACjC,MAAM,WAAW,UAAU;IACzB,qGAAqG;IACrG,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;IACxD;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACnC;AAED,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAEzD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAK/D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAsBhG;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,CAAC,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAE/G;AAED,2GAA2G;AAC3G,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,SAAS,YAAY,EAAE,EACnC,MAAM,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,GACvC,UAAU,EAAE,CAqBd;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,CAmCxH"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * The call policy of a host: which nested calls a procedure can make (deep dive MCP-3).
3
+ *
4
+ * A host that serves procedures to an outside caller (the MCP server, a network server) gives an
5
+ * `expose` rule: the procedures that its callers can reach. A procedure can call other
6
+ * procedures through `ctx.client`. The policy decides for each nested call, with the immediate
7
+ * caller:
8
+ *
9
+ * - A data-driven caller (control flow, `runs-refs`, a procedure that `procedure.define` made)
10
+ * runs refs that its caller chose. It can call only exposed procedures.
11
+ * - A code caller with `metadata.calls` can call the procedures that it declares, and the
12
+ * exposed procedures.
13
+ * - A code caller without `calls` can call any procedure, unless the host sets `strictCalls`.
14
+ * Then it can call only exposed procedures.
15
+ *
16
+ * Before, only the first rule existed. An exposed procedure of code could call any procedure, so
17
+ * a code procedure that turns its input into a call was a confused deputy. The declarations make
18
+ * the reach of each tool visible: a test of the MCP server pins it.
19
+ *
20
+ * A host without `expose` and without `strictCalls` (a library, the local CLI) checks nothing.
21
+ */
22
+ import { pathToKey } from "./types.js";
23
+ import { isDataDriven } from "./ref.js";
24
+ /** True when a host has a policy: a nested call is examined only then. */
25
+ export function hasCallPolicy(policy) {
26
+ return policy.expose !== undefined || policy.strictCalls === true;
27
+ }
28
+ /**
29
+ * True when one entry of `calls` allows a procedure key: the same key, or `"ns.*"` for a key
30
+ * that starts with `"ns."` (at any depth: `"fs.*"` allows `fs.read.json`).
31
+ */
32
+ export function callMatches(entry, key) {
33
+ if (entry.endsWith(".*")) {
34
+ return key.startsWith(entry.slice(0, -1));
35
+ }
36
+ return entry === key;
37
+ }
38
+ /**
39
+ * This function checks the `calls` of a procedure's metadata and returns it, or undefined when
40
+ * there is none. It throws for an invalid list. `"*"` alone is refused: a procedure whose
41
+ * callees come from its input is data-driven and must have the `runs-refs` tag.
42
+ */
43
+ export function validateCalls(calls, path) {
44
+ if (calls === undefined)
45
+ return undefined;
46
+ const where = pathToKey(path);
47
+ if (!Array.isArray(calls)) {
48
+ throw new TypeError(`metadata.calls of ${where} must be a list of procedure keys`);
49
+ }
50
+ for (const entry of calls) {
51
+ if (typeof entry !== "string" || entry.length === 0) {
52
+ throw new TypeError(`metadata.calls of ${where} has an entry that is not a procedure key: ${JSON.stringify(entry)}`);
53
+ }
54
+ if (entry === "*") {
55
+ throw new TypeError(`metadata.calls of ${where} is "*". A procedure whose callees come from its input is data-driven: ` +
56
+ `give it the "runs-refs" tag instead.`);
57
+ }
58
+ const body = entry.endsWith(".*") ? entry.slice(0, -2) : entry;
59
+ if (body.length === 0 || body.includes("*") || body.split(".").some((segment) => segment.length === 0)) {
60
+ throw new TypeError(`metadata.calls of ${where} has an invalid entry: "${entry}". Use "ns.name" or "ns.*".`);
61
+ }
62
+ }
63
+ return calls;
64
+ }
65
+ /** The `calls` of a procedure, or undefined when it declares none. */
66
+ export function declaredCalls(procedure) {
67
+ return validateCalls(procedure.metadata?.calls, procedure.path);
68
+ }
69
+ /**
70
+ * The procedures that are not exposed, but that the exposed procedures can reach through their
71
+ * `metadata.calls`, also through more than one step. A data-driven procedure reaches only
72
+ * exposed procedures, and under `strictCalls` a procedure without `calls` does too, so neither
73
+ * adds an edge. The edges are sorted. A test of the MCP server pins them.
74
+ */
75
+ export function hiddenReach(procedures, expose) {
76
+ const byKey = new Map(procedures.filter((procedure) => procedure.handler).map((procedure) => [pathToKey(procedure.path), procedure]));
77
+ const edges = new Map();
78
+ const visited = new Set();
79
+ const visit = (procedure) => {
80
+ const from = pathToKey(procedure.path);
81
+ if (visited.has(from))
82
+ return;
83
+ visited.add(from);
84
+ if (isDataDriven(procedure))
85
+ return;
86
+ for (const entry of declaredCalls(procedure) ?? []) {
87
+ for (const [key, callee] of byKey) {
88
+ if (!callMatches(entry, key) || expose(callee.path))
89
+ continue;
90
+ edges.set(`${from} -> ${key}`, { from, to: key });
91
+ visit(callee);
92
+ }
93
+ }
94
+ };
95
+ for (const procedure of byKey.values()) {
96
+ if (expose(procedure.path))
97
+ visit(procedure);
98
+ }
99
+ return [...edges.keys()].sort().map((key) => edges.get(key));
100
+ }
101
+ /**
102
+ * The refusal of a nested call from `caller` to `path` under `policy`, or undefined when the
103
+ * call is allowed.
104
+ */
105
+ export function nestedCallRefusal(caller, path, policy) {
106
+ if (!hasCallPolicy(policy))
107
+ return undefined;
108
+ const exposed = policy.expose ? policy.expose(path) : true;
109
+ const key = pathToKey(path);
110
+ const from = pathToKey(caller.path);
111
+ if (isDataDriven(caller)) {
112
+ return exposed
113
+ ? undefined
114
+ : {
115
+ code: "NOT_EXPOSED",
116
+ message: `Procedure not exposed: ${key}. ${from} runs procedure refs from its input, so it can call only ` +
117
+ `the procedures that this server exposes.`,
118
+ };
119
+ }
120
+ const calls = declaredCalls(caller);
121
+ if (calls !== undefined) {
122
+ if (exposed || calls.some((entry) => callMatches(entry, key)))
123
+ return undefined;
124
+ return {
125
+ code: "NOT_DECLARED",
126
+ message: `Procedure not declared: ${from} calls ${key}, but its metadata.calls does not name it.`,
127
+ };
128
+ }
129
+ if (policy.strictCalls && !exposed) {
130
+ return {
131
+ code: "NOT_EXPOSED",
132
+ message: `Procedure not exposed: ${key}. ${from} declares no metadata.calls, and this server lets such a ` +
133
+ `procedure call only the procedures that it exposes.`,
134
+ };
135
+ }
136
+ return undefined;
137
+ }
138
+ //# sourceMappingURL=policy.js.map