@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,1024 @@
1
+ /**
2
+ * Array Procedures
3
+ *
4
+ * Array manipulation operations for procedure aggregation.
5
+ * All procedures are namespaced under "client" (e.g., client.first, client.filter).
6
+ */
7
+
8
+ import { z } from "zod";
9
+ import { anyOutput, arrayOutput, booleanOutput, numberOutput } from "./outputs.js";
10
+ import { defineProcedure, namespace } from "../define.js";
11
+ import type { AnyProcedure, Procedure } from "../types.js";
12
+
13
+ // =============================================================================
14
+ // First Procedure
15
+ // =============================================================================
16
+
17
+ interface FirstInput {
18
+ items: unknown[];
19
+ }
20
+
21
+ const FirstInputSchema = z.object({
22
+ items: z.array(z.unknown()).describe("The array"),
23
+ });
24
+
25
+ type FirstProcedure = Procedure<FirstInput, unknown, { description: string; tags: string[] }>;
26
+
27
+ const firstProcedure: FirstProcedure = defineProcedure({
28
+ path: ["first"],
29
+ input: FirstInputSchema,
30
+ output: anyOutput("The first item, or undefined for an empty array"),
31
+ metadata: {
32
+ description: "Get first element of array",
33
+ tags: ["core", "array"],
34
+ },
35
+ handler: async (input: FirstInput): Promise<unknown> => {
36
+ return input.items[0];
37
+ },
38
+ });
39
+
40
+ // =============================================================================
41
+ // Last Procedure
42
+ // =============================================================================
43
+
44
+ interface LastInput {
45
+ items: unknown[];
46
+ }
47
+
48
+ const LastInputSchema = z.object({
49
+ items: z.array(z.unknown()).describe("The array"),
50
+ });
51
+
52
+ type LastProcedure = Procedure<LastInput, unknown, { description: string; tags: string[] }>;
53
+
54
+ const lastProcedure: LastProcedure = defineProcedure({
55
+ path: ["last"],
56
+ input: LastInputSchema,
57
+ output: anyOutput("The last item, or undefined for an empty array"),
58
+ metadata: {
59
+ description: "Get last element of array",
60
+ tags: ["core", "array"],
61
+ },
62
+ handler: async (input: LastInput): Promise<unknown> => {
63
+ return input.items[input.items.length - 1];
64
+ },
65
+ });
66
+
67
+ // =============================================================================
68
+ // Nth Procedure
69
+ // =============================================================================
70
+
71
+ interface NthInput {
72
+ items: unknown[];
73
+ index: number;
74
+ }
75
+
76
+ const NthInputSchema = z.object({
77
+ items: z.array(z.unknown()).describe("The array"),
78
+ index: z.number().describe("The position"),
79
+ });
80
+
81
+ type NthProcedure = Procedure<NthInput, unknown, { description: string; tags: string[] }>;
82
+
83
+ const nthProcedure: NthProcedure = defineProcedure({
84
+ path: ["nth"],
85
+ input: NthInputSchema,
86
+ output: anyOutput("The item at the index, or undefined"),
87
+ metadata: {
88
+ description: "Get element at index (supports negative indexing)",
89
+ tags: ["core", "array"],
90
+ },
91
+ handler: async (input: NthInput): Promise<unknown> => {
92
+ const index = input.index < 0 ? input.items.length + input.index : input.index;
93
+ return input.items[index];
94
+ },
95
+ });
96
+
97
+ // =============================================================================
98
+ // ArrLength Procedure
99
+ // =============================================================================
100
+
101
+ interface ArrLengthInput {
102
+ items: unknown[];
103
+ }
104
+
105
+ const ArrLengthInputSchema = z.object({
106
+ items: z.array(z.unknown()).describe("The array"),
107
+ });
108
+
109
+ type ArrLengthProcedure = Procedure<ArrLengthInput, number, { description: string; tags: string[] }>;
110
+
111
+ const arrLengthProcedure: ArrLengthProcedure = defineProcedure({
112
+ path: ["arrLength"],
113
+ input: ArrLengthInputSchema,
114
+ output: numberOutput("The number of items"),
115
+ metadata: {
116
+ description: "Get array length",
117
+ tags: ["core", "array"],
118
+ },
119
+ handler: async (input: ArrLengthInput): Promise<number> => {
120
+ return input.items.length;
121
+ },
122
+ });
123
+
124
+ // =============================================================================
125
+ // Flatten Procedure
126
+ // =============================================================================
127
+
128
+ interface FlattenInput {
129
+ items: unknown[];
130
+ depth?: number | undefined;
131
+ }
132
+
133
+ const FlattenInputSchema = z.object({
134
+ items: z.array(z.unknown()).describe("The array"),
135
+ depth: z.number().optional().describe("How many levels to flatten (default: 1)"),
136
+ });
137
+
138
+ type FlattenProcedure = Procedure<FlattenInput, unknown[], { description: string; tags: string[] }>;
139
+
140
+ const flattenProcedure: FlattenProcedure = defineProcedure({
141
+ path: ["flatten"],
142
+ input: FlattenInputSchema,
143
+ output: arrayOutput("The flattened items"),
144
+ metadata: {
145
+ description: "Flatten nested arrays to specified depth",
146
+ tags: ["core", "array"],
147
+ },
148
+ handler: async (input: FlattenInput): Promise<unknown[]> => {
149
+ return (input.items as unknown[]).flat(input.depth ?? 1);
150
+ },
151
+ });
152
+
153
+ // =============================================================================
154
+ // Reverse Procedure
155
+ // =============================================================================
156
+
157
+ interface ReverseInput {
158
+ items: unknown[];
159
+ }
160
+
161
+ const ReverseInputSchema = z.object({
162
+ items: z.array(z.unknown()).describe("The array"),
163
+ });
164
+
165
+ type ReverseProcedure = Procedure<ReverseInput, unknown[], { description: string; tags: string[] }>;
166
+
167
+ const reverseProcedure: ReverseProcedure = defineProcedure({
168
+ path: ["reverse"],
169
+ input: ReverseInputSchema,
170
+ output: arrayOutput("The items in reverse order"),
171
+ metadata: {
172
+ description: "Reverse array order",
173
+ tags: ["core", "array"],
174
+ },
175
+ handler: async (input: ReverseInput): Promise<unknown[]> => {
176
+ return [...input.items].reverse();
177
+ },
178
+ });
179
+
180
+ // =============================================================================
181
+ // Sort Procedure
182
+ // =============================================================================
183
+
184
+ interface SortInput {
185
+ items: unknown[];
186
+ key?: string | undefined;
187
+ desc?: boolean | undefined;
188
+ }
189
+
190
+ const SortInputSchema = z.object({
191
+ items: z.array(z.unknown()).describe("The array"),
192
+ key: z.string().optional().describe("The key (a field name of the items)"),
193
+ desc: z.boolean().optional().describe("Sort in descending order"),
194
+ });
195
+
196
+ type SortProcedure = Procedure<SortInput, unknown[], { description: string; tags: string[] }>;
197
+
198
+ const sortProcedure: SortProcedure = defineProcedure({
199
+ path: ["sort"],
200
+ input: SortInputSchema,
201
+ output: arrayOutput("The sorted items"),
202
+ metadata: {
203
+ description: "Sort array (optionally by key, optionally descending)",
204
+ tags: ["core", "array"],
205
+ },
206
+ handler: async (input: SortInput): Promise<unknown[]> => {
207
+ const items = [...input.items];
208
+ const direction = input.desc ? -1 : 1;
209
+
210
+ return items.sort((a, b) => {
211
+ let aVal = input.key ? (a as Record<string, unknown>)[input.key] : a;
212
+ let bVal = input.key ? (b as Record<string, unknown>)[input.key] : b;
213
+
214
+ if (typeof aVal === "string" && typeof bVal === "string") {
215
+ return aVal.localeCompare(bVal) * direction;
216
+ }
217
+ if (typeof aVal === "number" && typeof bVal === "number") {
218
+ return (aVal - bVal) * direction;
219
+ }
220
+ return 0;
221
+ });
222
+ },
223
+ });
224
+
225
+ // =============================================================================
226
+ // Slice Procedure
227
+ // =============================================================================
228
+
229
+ interface SliceInput {
230
+ items: unknown[];
231
+ start: number;
232
+ end?: number | undefined;
233
+ }
234
+
235
+ const SliceInputSchema = z.object({
236
+ items: z.array(z.unknown()).describe("The array"),
237
+ start: z.number().describe("The start position (inclusive)"),
238
+ end: z.number().optional().describe("The end position (exclusive)"),
239
+ });
240
+
241
+ type SliceProcedure = Procedure<SliceInput, unknown[], { description: string; tags: string[] }>;
242
+
243
+ const sliceProcedure: SliceProcedure = defineProcedure({
244
+ path: ["slice"],
245
+ input: SliceInputSchema,
246
+ output: arrayOutput("The items of the range"),
247
+ metadata: {
248
+ description: "Extract portion of array",
249
+ tags: ["core", "array"],
250
+ },
251
+ handler: async (input: SliceInput): Promise<unknown[]> => {
252
+ return input.items.slice(input.start, input.end);
253
+ },
254
+ });
255
+
256
+ // =============================================================================
257
+ // ArrConcat Procedure
258
+ // =============================================================================
259
+
260
+ interface ArrConcatInput {
261
+ arrays: unknown[][];
262
+ }
263
+
264
+ const ArrConcatInputSchema = z.object({
265
+ arrays: z.array(z.array(z.unknown())).describe("The arrays"),
266
+ });
267
+
268
+ type ArrConcatProcedure = Procedure<ArrConcatInput, unknown[], { description: string; tags: string[] }>;
269
+
270
+ const arrConcatProcedure: ArrConcatProcedure = defineProcedure({
271
+ path: ["arrConcat"],
272
+ input: ArrConcatInputSchema,
273
+ output: arrayOutput("The items of all arrays, in order"),
274
+ metadata: {
275
+ description: "Concatenate multiple arrays",
276
+ tags: ["core", "array"],
277
+ },
278
+ handler: async (input: ArrConcatInput): Promise<unknown[]> => {
279
+ return ([] as unknown[]).concat(...input.arrays);
280
+ },
281
+ });
282
+
283
+ // =============================================================================
284
+ // Unique Procedure
285
+ // =============================================================================
286
+
287
+ interface UniqueInput {
288
+ items: unknown[];
289
+ key?: string | undefined;
290
+ }
291
+
292
+ const UniqueInputSchema = z.object({
293
+ items: z.array(z.unknown()).describe("The array"),
294
+ key: z.string().optional().describe("The key (a field name of the items)"),
295
+ });
296
+
297
+ type UniqueProcedure = Procedure<UniqueInput, unknown[], { description: string; tags: string[] }>;
298
+
299
+ const uniqueProcedure: UniqueProcedure = defineProcedure({
300
+ path: ["unique"],
301
+ input: UniqueInputSchema,
302
+ output: arrayOutput("The items without duplicates"),
303
+ metadata: {
304
+ description: "Remove duplicate values (optionally by key)",
305
+ tags: ["core", "array"],
306
+ },
307
+ handler: async (input: UniqueInput): Promise<unknown[]> => {
308
+ if (input.key) {
309
+ const seen = new Set<unknown>();
310
+ return input.items.filter((item) => {
311
+ const val = (item as Record<string, unknown>)[input.key!];
312
+ if (seen.has(val)) return false;
313
+ seen.add(val);
314
+ return true;
315
+ });
316
+ }
317
+ return [...new Set(input.items)];
318
+ },
319
+ });
320
+
321
+ // =============================================================================
322
+ // GroupBy Procedure
323
+ // =============================================================================
324
+
325
+ interface GroupByInput {
326
+ items: unknown[];
327
+ key: string;
328
+ }
329
+
330
+ const GroupByInputSchema = z.object({
331
+ items: z.array(z.unknown()).describe("The array"),
332
+ key: z.string().describe("The key (a field name of the items)"),
333
+ });
334
+
335
+ type GroupByProcedure = Procedure<GroupByInput, Record<string, unknown[]>, { description: string; tags: string[] }>;
336
+
337
+ const groupByProcedure: GroupByProcedure = defineProcedure({
338
+ path: ["groupBy"],
339
+ input: GroupByInputSchema,
340
+ output: z.record(z.string(), z.array(z.unknown())).describe("The items, grouped by the value of the key"),
341
+ metadata: {
342
+ description: "Group array items by key value",
343
+ tags: ["core", "array"],
344
+ },
345
+ handler: async (input: GroupByInput): Promise<Record<string, unknown[]>> => {
346
+ const result: Record<string, unknown[]> = {};
347
+ for (const item of input.items) {
348
+ const keyVal = String((item as Record<string, unknown>)[input.key]);
349
+ if (!result[keyVal]) {
350
+ result[keyVal] = [];
351
+ }
352
+ result[keyVal].push(item);
353
+ }
354
+ return result;
355
+ },
356
+ });
357
+
358
+ // =============================================================================
359
+ // Zip Procedure
360
+ // =============================================================================
361
+
362
+ interface ZipInput {
363
+ arrays: unknown[][];
364
+ }
365
+
366
+ const ZipInputSchema = z.object({
367
+ arrays: z.array(z.array(z.unknown())).describe("The arrays"),
368
+ });
369
+
370
+ type ZipProcedure = Procedure<ZipInput, unknown[][], { description: string; tags: string[] }>;
371
+
372
+ const zipProcedure: ZipProcedure = defineProcedure({
373
+ path: ["zip"],
374
+ input: ZipInputSchema,
375
+ output: z.array(z.array(z.unknown())).describe("One tuple for each index"),
376
+ metadata: {
377
+ description: "Zip multiple arrays into array of tuples",
378
+ tags: ["core", "array"],
379
+ },
380
+ handler: async (input: ZipInput): Promise<unknown[][]> => {
381
+ if (input.arrays.length === 0) return [];
382
+ const maxLen = Math.max(...input.arrays.map((a) => a.length));
383
+ const result: unknown[][] = [];
384
+ for (let i = 0; i < maxLen; i++) {
385
+ result.push(input.arrays.map((a) => a[i]));
386
+ }
387
+ return result;
388
+ },
389
+ });
390
+
391
+ // =============================================================================
392
+ // Unzip Procedure
393
+ // =============================================================================
394
+
395
+ interface UnzipInput {
396
+ tuples: unknown[][];
397
+ }
398
+
399
+ const UnzipInputSchema = z.object({
400
+ tuples: z.array(z.array(z.unknown())).describe("The tuples"),
401
+ });
402
+
403
+ type UnzipProcedure = Procedure<UnzipInput, unknown[][], { description: string; tags: string[] }>;
404
+
405
+ const unzipProcedure: UnzipProcedure = defineProcedure({
406
+ path: ["unzip"],
407
+ input: UnzipInputSchema,
408
+ output: z.array(z.array(z.unknown())).describe("One array for each position of the tuples"),
409
+ metadata: {
410
+ description: "Unzip array of tuples into multiple arrays",
411
+ tags: ["core", "array"],
412
+ },
413
+ handler: async (input: UnzipInput): Promise<unknown[][]> => {
414
+ if (input.tuples.length === 0) return [];
415
+ const numArrays = input.tuples[0]?.length ?? 0;
416
+ const result: unknown[][] = Array.from({ length: numArrays }, () => []);
417
+ for (const tuple of input.tuples) {
418
+ for (let i = 0; i < numArrays; i++) {
419
+ result[i]!.push(tuple[i]);
420
+ }
421
+ }
422
+ return result;
423
+ },
424
+ });
425
+
426
+ // =============================================================================
427
+ // IndexOf Procedure
428
+ // =============================================================================
429
+
430
+ interface IndexOfInput {
431
+ items: unknown[];
432
+ value?: unknown;
433
+ fromIndex?: number | undefined;
434
+ }
435
+
436
+ const IndexOfInputSchema = z.object({
437
+ items: z.array(z.unknown()).describe("The array"),
438
+ value: z.unknown().optional().describe("The value"),
439
+ fromIndex: z.number().optional().describe("The position to start the search from"),
440
+ });
441
+
442
+ type IndexOfProcedure = Procedure<IndexOfInput, number, { description: string; tags: string[] }>;
443
+
444
+ const indexOfProcedure: IndexOfProcedure = defineProcedure({
445
+ path: ["indexOf"],
446
+ input: IndexOfInputSchema,
447
+ output: numberOutput("The index of the item, or -1"),
448
+ metadata: {
449
+ description: "Find index of value in array (-1 if not found)",
450
+ tags: ["core", "array"],
451
+ },
452
+ handler: async (input: IndexOfInput): Promise<number> => {
453
+ return input.items.indexOf(input.value, input.fromIndex);
454
+ },
455
+ });
456
+
457
+ // =============================================================================
458
+ // Contains Procedure
459
+ // =============================================================================
460
+
461
+ interface ContainsInput {
462
+ items: unknown[];
463
+ value?: unknown;
464
+ }
465
+
466
+ const ContainsInputSchema = z.object({
467
+ items: z.array(z.unknown()).describe("The array"),
468
+ value: z.unknown().optional().describe("The value"),
469
+ });
470
+
471
+ type ContainsProcedure = Procedure<ContainsInput, boolean, { description: string; tags: string[] }>;
472
+
473
+ const containsProcedure: ContainsProcedure = defineProcedure({
474
+ path: ["contains"],
475
+ input: ContainsInputSchema,
476
+ output: booleanOutput("True when the array contains the item"),
477
+ metadata: {
478
+ description: "Check if array contains value",
479
+ tags: ["core", "array"],
480
+ },
481
+ handler: async (input: ContainsInput): Promise<boolean> => {
482
+ return input.items.includes(input.value);
483
+ },
484
+ });
485
+
486
+ // =============================================================================
487
+ // Push Procedure (Immutable)
488
+ // =============================================================================
489
+
490
+ interface PushInput {
491
+ items: unknown[];
492
+ value?: unknown;
493
+ }
494
+
495
+ const PushInputSchema = z.object({
496
+ items: z.array(z.unknown()).describe("The array"),
497
+ value: z.unknown().optional().describe("The value"),
498
+ });
499
+
500
+ type PushProcedure = Procedure<PushInput, unknown[], { description: string; tags: string[] }>;
501
+
502
+ const pushProcedure: PushProcedure = defineProcedure({
503
+ path: ["push"],
504
+ input: PushInputSchema,
505
+ output: arrayOutput("The items with the new items at the end"),
506
+ metadata: {
507
+ description: "Add value to end of array (immutable)",
508
+ tags: ["core", "array"],
509
+ },
510
+ handler: async (input: PushInput): Promise<unknown[]> => {
511
+ return [...input.items, input.value];
512
+ },
513
+ });
514
+
515
+ // =============================================================================
516
+ // Unshift Procedure (Immutable)
517
+ // =============================================================================
518
+
519
+ interface UnshiftInput {
520
+ items: unknown[];
521
+ value?: unknown;
522
+ }
523
+
524
+ const UnshiftInputSchema = z.object({
525
+ items: z.array(z.unknown()).describe("The array"),
526
+ value: z.unknown().optional().describe("The value"),
527
+ });
528
+
529
+ type UnshiftProcedure = Procedure<UnshiftInput, unknown[], { description: string; tags: string[] }>;
530
+
531
+ const unshiftProcedure: UnshiftProcedure = defineProcedure({
532
+ path: ["unshift"],
533
+ input: UnshiftInputSchema,
534
+ output: arrayOutput("The items with the new items at the start"),
535
+ metadata: {
536
+ description: "Add value to beginning of array (immutable)",
537
+ tags: ["core", "array"],
538
+ },
539
+ handler: async (input: UnshiftInput): Promise<unknown[]> => {
540
+ return [input.value, ...input.items];
541
+ },
542
+ });
543
+
544
+ // =============================================================================
545
+ // Range Procedure
546
+ // =============================================================================
547
+
548
+ interface RangeInput {
549
+ start: number;
550
+ end: number;
551
+ step?: number | undefined;
552
+ }
553
+
554
+ const RangeInputSchema = z.object({
555
+ start: z.number().describe("The start position (inclusive)"),
556
+ end: z.number().describe("The end position (exclusive)"),
557
+ step: z.number().optional().describe("The step (default: 1)"),
558
+ });
559
+
560
+ type RangeProcedure = Procedure<RangeInput, number[], { description: string; tags: string[] }>;
561
+
562
+ /** The maximum number of items of `client.range`. */
563
+ export const MAX_RANGE_LENGTH = 1_000_000;
564
+
565
+ const rangeProcedure: RangeProcedure = defineProcedure({
566
+ path: ["range"],
567
+ input: RangeInputSchema,
568
+ output: z.array(numberOutput("A number of the range")).describe("The numbers from start to end"),
569
+ metadata: {
570
+ description: "Generate array of numbers from start to end (exclusive)",
571
+ tags: ["core", "array"],
572
+ },
573
+ handler: async (input: RangeInput): Promise<number[]> => {
574
+ const step = input.step ?? 1;
575
+ for (const [name, value] of [["start", input.start], ["end", input.end], ["step", step]] as const) {
576
+ if (typeof value !== "number" || !Number.isFinite(value)) {
577
+ throw new Error(`range: ${name} must be a finite number, got ${String(value)}`);
578
+ }
579
+ }
580
+ if (step === 0) {
581
+ return [];
582
+ }
583
+ // The length comes first, and item k is start + k * step. (Deep dive SITE-6: before, the loop
584
+ // added step to the last value. At 1e17, start + 1 is start, so the loop never ended.)
585
+ const length = Math.max(0, Math.ceil((input.end - input.start) / step));
586
+ if (length > MAX_RANGE_LENGTH) {
587
+ throw new Error(`range: ${length} items is more than the limit of ${MAX_RANGE_LENGTH}`);
588
+ }
589
+ const result: number[] = [];
590
+ for (let k = 0; k < length; k++) {
591
+ const value = input.start + k * step;
592
+ // A rounding error can make the last value reach end: it is not in the range
593
+ if (step > 0 ? value >= input.end : value <= input.end) break;
594
+ result.push(value);
595
+ }
596
+ return result;
597
+ },
598
+ });
599
+
600
+ // =============================================================================
601
+ // Filter Procedure (Core Logic + Filtering Separation)
602
+ // =============================================================================
603
+
604
+ interface FilterInput {
605
+ /** Array to filter */
606
+ items: unknown[];
607
+ /** Property to match against */
608
+ key?: string | undefined;
609
+ /** Value to match (equality check) */
610
+ value?: unknown | undefined;
611
+ /** Values to match (any of these) */
612
+ values?: unknown[] | undefined;
613
+ /** Match mode: 'equals', 'not', 'in', 'notIn', 'contains', 'startsWith', 'endsWith' */
614
+ match?: 'equals' | 'not' | 'in' | 'notIn' | 'contains' | 'startsWith' | 'endsWith' | 'gt' | 'gte' | 'lt' | 'lte' | undefined;
615
+ /** Invert the filter */
616
+ invert?: boolean | undefined;
617
+ }
618
+
619
+ const FilterInputSchema = z.object({
620
+ items: z.array(z.unknown()).describe("Array to filter"),
621
+ key: z.string().optional().describe("Property to match against"),
622
+ value: z.unknown().optional().describe("Value to match (equality check)"),
623
+ values: z.array(z.unknown()).optional().describe("Values to match (any of these)"),
624
+ match: z.enum(["equals", "not", "in", "notIn", "contains", "startsWith", "endsWith", "gt", "gte", "lt", "lte"]).optional().describe("Match mode: 'equals', 'not', 'in', 'notIn', 'contains', 'startsWith', 'endsWith'"),
625
+ invert: z.boolean().optional().describe("Invert the filter"),
626
+ });
627
+
628
+ type FilterProcedure = Procedure<FilterInput, unknown[], { description: string; tags: string[] }>;
629
+
630
+ const filterProcedure: FilterProcedure = defineProcedure({
631
+ path: ["filter"],
632
+ input: FilterInputSchema,
633
+ output: arrayOutput("The items that pass the condition"),
634
+ metadata: {
635
+ description: "Filter array by property value or predicate",
636
+ tags: ["core", "array", "filter"],
637
+ },
638
+ handler: async (input: FilterInput): Promise<unknown[]> => {
639
+ const { items, key, value, values, match = 'equals', invert = false } = input;
640
+
641
+ const predicate = (item: unknown): boolean => {
642
+ const itemValue = key ? (item as Record<string, unknown>)[key] : item;
643
+
644
+ let result: boolean;
645
+ switch (match) {
646
+ case 'equals':
647
+ result = itemValue === value;
648
+ break;
649
+ case 'not':
650
+ result = itemValue !== value;
651
+ break;
652
+ case 'in':
653
+ result = (values ?? []).includes(itemValue);
654
+ break;
655
+ case 'notIn':
656
+ result = !(values ?? []).includes(itemValue);
657
+ break;
658
+ case 'contains':
659
+ result = typeof itemValue === 'string' && typeof value === 'string' && itemValue.includes(value);
660
+ break;
661
+ case 'startsWith':
662
+ result = typeof itemValue === 'string' && typeof value === 'string' && itemValue.startsWith(value);
663
+ break;
664
+ case 'endsWith':
665
+ result = typeof itemValue === 'string' && typeof value === 'string' && itemValue.endsWith(value);
666
+ break;
667
+ case 'gt':
668
+ result = typeof itemValue === 'number' && typeof value === 'number' && itemValue > value;
669
+ break;
670
+ case 'gte':
671
+ result = typeof itemValue === 'number' && typeof value === 'number' && itemValue >= value;
672
+ break;
673
+ case 'lt':
674
+ result = typeof itemValue === 'number' && typeof value === 'number' && itemValue < value;
675
+ break;
676
+ case 'lte':
677
+ result = typeof itemValue === 'number' && typeof value === 'number' && itemValue <= value;
678
+ break;
679
+ default:
680
+ result = Boolean(itemValue);
681
+ }
682
+
683
+ return invert ? !result : result;
684
+ };
685
+
686
+ return items.filter(predicate);
687
+ },
688
+ });
689
+
690
+ // =============================================================================
691
+ // Where Procedure (Filter shorthand)
692
+ // =============================================================================
693
+
694
+ interface WhereInput {
695
+ /** Array to filter */
696
+ items: unknown[];
697
+ /** Object with key-value pairs to match */
698
+ where: Record<string, unknown>;
699
+ }
700
+
701
+ const WhereInputSchema = z.object({
702
+ items: z.array(z.unknown()).describe("Array to filter"),
703
+ where: z.record(z.string(), z.unknown()).describe("Object with key-value pairs to match"),
704
+ });
705
+
706
+ type WhereProcedure = Procedure<WhereInput, unknown[], { description: string; tags: string[] }>;
707
+
708
+ const whereProcedure: WhereProcedure = defineProcedure({
709
+ path: ["where"],
710
+ input: WhereInputSchema,
711
+ output: arrayOutput("The items whose fields match"),
712
+ metadata: {
713
+ description: "Filter array where all key-value pairs match",
714
+ tags: ["core", "array", "filter"],
715
+ },
716
+ handler: async (input: WhereInput): Promise<unknown[]> => {
717
+ const { items, where } = input;
718
+ return items.filter((item) => {
719
+ const obj = item as Record<string, unknown>;
720
+ return Object.entries(where).every(([key, value]) => obj[key] === value);
721
+ });
722
+ },
723
+ });
724
+
725
+ // =============================================================================
726
+ // Pluck Procedure (Extract single property)
727
+ // =============================================================================
728
+
729
+ interface PluckInput {
730
+ /** Array of objects */
731
+ items: unknown[];
732
+ /** Property to extract */
733
+ key: string;
734
+ }
735
+
736
+ const PluckInputSchema = z.object({
737
+ items: z.array(z.unknown()).describe("Array of objects"),
738
+ key: z.string().describe("Property to extract"),
739
+ });
740
+
741
+ type PluckProcedure = Procedure<PluckInput, unknown[], { description: string; tags: string[] }>;
742
+
743
+ const pluckProcedure: PluckProcedure = defineProcedure({
744
+ path: ["pluck"],
745
+ input: PluckInputSchema,
746
+ output: arrayOutput("The value of the field of each item"),
747
+ metadata: {
748
+ description: "Extract single property from all items",
749
+ tags: ["core", "array", "transform"],
750
+ },
751
+ handler: async (input: PluckInput): Promise<unknown[]> => {
752
+ return input.items.map((item) => (item as Record<string, unknown>)[input.key]);
753
+ },
754
+ });
755
+
756
+ // =============================================================================
757
+ // ArrPick Procedure (Select multiple properties from array items)
758
+ // =============================================================================
759
+
760
+ interface ArrPickInput {
761
+ /** Array of objects */
762
+ items: unknown[];
763
+ /** Properties to keep */
764
+ keys: string[];
765
+ }
766
+
767
+ const ArrPickInputSchema = z.object({
768
+ items: z.array(z.unknown()).describe("Array of objects"),
769
+ keys: z.array(z.string()).describe("Properties to keep"),
770
+ });
771
+
772
+ type ArrPickProcedure = Procedure<ArrPickInput, unknown[], { description: string; tags: string[] }>;
773
+
774
+ const arrPickProcedure: ArrPickProcedure = defineProcedure({
775
+ path: ["arrPick"],
776
+ input: ArrPickInputSchema,
777
+ output: z.array(z.record(z.string(), z.unknown())).describe("Each item with only the given fields"),
778
+ metadata: {
779
+ description: "Keep only specified properties from all items",
780
+ tags: ["core", "array", "transform"],
781
+ },
782
+ handler: async (input: ArrPickInput): Promise<unknown[]> => {
783
+ return input.items.map((item) => {
784
+ const obj = item as Record<string, unknown>;
785
+ const result: Record<string, unknown> = {};
786
+ for (const key of input.keys) {
787
+ if (key in obj) {
788
+ result[key] = obj[key];
789
+ }
790
+ }
791
+ return result;
792
+ });
793
+ },
794
+ });
795
+
796
+ // =============================================================================
797
+ // ArrOmit Procedure (Remove properties from array items)
798
+ // =============================================================================
799
+
800
+ interface ArrOmitInput {
801
+ /** Array of objects */
802
+ items: unknown[];
803
+ /** Properties to remove */
804
+ keys: string[];
805
+ }
806
+
807
+ const ArrOmitInputSchema = z.object({
808
+ items: z.array(z.unknown()).describe("Array of objects"),
809
+ keys: z.array(z.string()).describe("Properties to remove"),
810
+ });
811
+
812
+ type ArrOmitProcedure = Procedure<ArrOmitInput, unknown[], { description: string; tags: string[] }>;
813
+
814
+ const arrOmitProcedure: ArrOmitProcedure = defineProcedure({
815
+ path: ["arrOmit"],
816
+ input: ArrOmitInputSchema,
817
+ output: z.array(z.record(z.string(), z.unknown())).describe("Each item without the given fields"),
818
+ metadata: {
819
+ description: "Remove specified properties from all array items",
820
+ tags: ["core", "array", "transform"],
821
+ },
822
+ handler: async (input: ArrOmitInput): Promise<unknown[]> => {
823
+ const keysToOmit = new Set(input.keys);
824
+ return input.items.map((item) => {
825
+ const obj = item as Record<string, unknown>;
826
+ const result: Record<string, unknown> = {};
827
+ for (const [key, value] of Object.entries(obj)) {
828
+ if (!keysToOmit.has(key)) {
829
+ result[key] = value;
830
+ }
831
+ }
832
+ return result;
833
+ });
834
+ },
835
+ });
836
+
837
+ // =============================================================================
838
+ // Partition Procedure (Split by predicate)
839
+ // =============================================================================
840
+
841
+ interface PartitionInput {
842
+ /** Array to partition */
843
+ items: unknown[];
844
+ /** Property to check for truthiness */
845
+ key: string;
846
+ /** Value to match for truthy partition */
847
+ value?: unknown | undefined;
848
+ }
849
+
850
+ const PartitionInputSchema = z.object({
851
+ items: z.array(z.unknown()).describe("Array to partition"),
852
+ key: z.string().describe("Property to check for truthiness"),
853
+ value: z.unknown().optional().describe("Value to match for truthy partition"),
854
+ });
855
+
856
+ interface PartitionOutput {
857
+ /** Items that matched */
858
+ truthy: unknown[];
859
+ /** Items that didn't match */
860
+ falsy: unknown[];
861
+ }
862
+
863
+ const PartitionOutputSchema = z.looseObject({
864
+ truthy: z.array(z.unknown()).describe("The items that pass the condition"),
865
+ falsy: z.array(z.unknown()).describe("The items that do not pass the condition"),
866
+ }) as z.ZodType<PartitionOutput>;
867
+
868
+ type PartitionProcedure = Procedure<PartitionInput, PartitionOutput, { description: string; tags: string[] }>;
869
+
870
+ const partitionProcedure: PartitionProcedure = defineProcedure({
871
+ path: ["partition"],
872
+ input: PartitionInputSchema,
873
+ output: PartitionOutputSchema,
874
+ metadata: {
875
+ description: "Split array into two arrays based on predicate",
876
+ tags: ["core", "array", "filter"],
877
+ },
878
+ handler: async (input: PartitionInput): Promise<PartitionOutput> => {
879
+ const truthy: unknown[] = [];
880
+ const falsy: unknown[] = [];
881
+
882
+ for (const item of input.items) {
883
+ const itemValue = (item as Record<string, unknown>)[input.key];
884
+ const matches = input.value !== undefined ? itemValue === input.value : Boolean(itemValue);
885
+ if (matches) {
886
+ truthy.push(item);
887
+ } else {
888
+ falsy.push(item);
889
+ }
890
+ }
891
+
892
+ return { truthy, falsy };
893
+ },
894
+ });
895
+
896
+ // =============================================================================
897
+ // Count Procedure (Count matching items)
898
+ // =============================================================================
899
+
900
+ interface CountInput {
901
+ /** Array to count */
902
+ items: unknown[];
903
+ /** Optional property to check for truthiness */
904
+ key?: string | undefined;
905
+ /** Optional value to match */
906
+ value?: unknown | undefined;
907
+ }
908
+
909
+ const CountInputSchema = z.object({
910
+ items: z.array(z.unknown()).describe("Array to count"),
911
+ key: z.string().optional().describe("Optional property to check for truthiness"),
912
+ value: z.unknown().optional().describe("Optional value to match"),
913
+ });
914
+
915
+ type CountProcedure = Procedure<CountInput, number, { description: string; tags: string[] }>;
916
+
917
+ const countProcedure: CountProcedure = defineProcedure({
918
+ path: ["count"],
919
+ input: CountInputSchema,
920
+ output: numberOutput("The number of matching items"),
921
+ metadata: {
922
+ description: "Count items matching criteria (or total if no criteria)",
923
+ tags: ["core", "array", "filter"],
924
+ },
925
+ handler: async (input: CountInput): Promise<number> => {
926
+ if (!input.key) {
927
+ return input.items.length;
928
+ }
929
+
930
+ return input.items.filter((item) => {
931
+ const itemValue = (item as Record<string, unknown>)[input.key!];
932
+ return input.value !== undefined ? itemValue === input.value : Boolean(itemValue);
933
+ }).length;
934
+ },
935
+ });
936
+
937
+ // =============================================================================
938
+ // Export Array Procedures
939
+ // =============================================================================
940
+
941
+ /**
942
+ * All array procedures (before namespacing).
943
+ */
944
+ const arrayProceduresRaw: AnyProcedure[] = [
945
+ // Access
946
+ firstProcedure as AnyProcedure,
947
+ lastProcedure as AnyProcedure,
948
+ nthProcedure as AnyProcedure,
949
+ arrLengthProcedure as AnyProcedure,
950
+ // Transform
951
+ flattenProcedure as AnyProcedure,
952
+ reverseProcedure as AnyProcedure,
953
+ sortProcedure as AnyProcedure,
954
+ sliceProcedure as AnyProcedure,
955
+ arrConcatProcedure as AnyProcedure,
956
+ uniqueProcedure as AnyProcedure,
957
+ groupByProcedure as AnyProcedure,
958
+ zipProcedure as AnyProcedure,
959
+ unzipProcedure as AnyProcedure,
960
+ // Search
961
+ indexOfProcedure as AnyProcedure,
962
+ containsProcedure as AnyProcedure,
963
+ // Mutation (immutable)
964
+ pushProcedure as AnyProcedure,
965
+ unshiftProcedure as AnyProcedure,
966
+ // Generation
967
+ rangeProcedure as AnyProcedure,
968
+ // Filtering (Core Logic + Filtering Separation)
969
+ filterProcedure as AnyProcedure,
970
+ whereProcedure as AnyProcedure,
971
+ pluckProcedure as AnyProcedure,
972
+ arrPickProcedure as AnyProcedure,
973
+ arrOmitProcedure as AnyProcedure,
974
+ partitionProcedure as AnyProcedure,
975
+ countProcedure as AnyProcedure,
976
+ ];
977
+
978
+ /**
979
+ * All array procedures namespaced under "client".
980
+ */
981
+ export const arrayProcedures: AnyProcedure[] = namespace(["client"], arrayProceduresRaw);
982
+
983
+ /**
984
+ * Array procedures module for registration.
985
+ */
986
+ export const arrayModule: { name: string; procedures: AnyProcedure[] } = {
987
+ name: "client-array",
988
+ procedures: arrayProcedures,
989
+ };
990
+
991
+ // Re-export individual procedures for direct access
992
+ export {
993
+ // Access
994
+ firstProcedure,
995
+ lastProcedure,
996
+ nthProcedure,
997
+ arrLengthProcedure,
998
+ // Transform
999
+ flattenProcedure,
1000
+ reverseProcedure,
1001
+ sortProcedure,
1002
+ sliceProcedure,
1003
+ arrConcatProcedure,
1004
+ uniqueProcedure,
1005
+ groupByProcedure,
1006
+ zipProcedure,
1007
+ unzipProcedure,
1008
+ // Search
1009
+ indexOfProcedure,
1010
+ containsProcedure,
1011
+ // Mutation (immutable)
1012
+ pushProcedure,
1013
+ unshiftProcedure,
1014
+ // Generation
1015
+ rangeProcedure,
1016
+ // Filtering (Core Logic + Filtering Separation)
1017
+ filterProcedure,
1018
+ whereProcedure,
1019
+ pluckProcedure,
1020
+ arrPickProcedure,
1021
+ arrOmitProcedure,
1022
+ partitionProcedure,
1023
+ countProcedure,
1024
+ };