@pikku/core 0.11.1 → 0.12.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 (363) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/crypto-utils.d.ts +2 -0
  3. package/dist/crypto-utils.js +78 -0
  4. package/dist/errors/error-handler.js +3 -3
  5. package/dist/errors/errors.d.ts +8 -0
  6. package/dist/errors/errors.js +16 -0
  7. package/dist/errors/index.d.ts +0 -1
  8. package/dist/errors/index.js +0 -1
  9. package/dist/function/function-runner.d.ts +10 -3
  10. package/dist/function/function-runner.js +136 -31
  11. package/dist/function/functions.types.d.ts +35 -12
  12. package/dist/function/functions.types.js +16 -6
  13. package/dist/function/index.d.ts +2 -2
  14. package/dist/function/index.js +1 -2
  15. package/dist/handle-error.js +1 -10
  16. package/dist/index.d.ts +30 -24
  17. package/dist/index.js +19 -27
  18. package/dist/middleware/auth-apikey.d.ts +1 -1
  19. package/dist/middleware/auth-apikey.js +3 -3
  20. package/dist/middleware/auth-bearer.d.ts +1 -1
  21. package/dist/middleware/auth-bearer.js +3 -6
  22. package/dist/middleware/auth-cookie.d.ts +1 -1
  23. package/dist/middleware/auth-cookie.js +6 -8
  24. package/dist/middleware/cors.d.ts +46 -0
  25. package/dist/middleware/cors.js +73 -0
  26. package/dist/middleware/index.d.ts +5 -3
  27. package/dist/middleware/index.js +5 -3
  28. package/dist/middleware/remote-auth.d.ts +5 -0
  29. package/dist/middleware/remote-auth.js +55 -0
  30. package/dist/middleware/timeout.d.ts +1 -1
  31. package/dist/middleware-runner.d.ts +3 -14
  32. package/dist/middleware-runner.js +14 -16
  33. package/dist/permissions.d.ts +3 -86
  34. package/dist/permissions.js +20 -80
  35. package/dist/pikku-state.d.ts +33 -104
  36. package/dist/pikku-state.js +150 -66
  37. package/dist/schema.d.ts +8 -6
  38. package/dist/schema.js +31 -18
  39. package/dist/services/ai-agent-runner-service.d.ts +24 -0
  40. package/dist/services/ai-agent-runner-service.js +1 -0
  41. package/dist/services/ai-run-state-service.d.ts +13 -0
  42. package/dist/services/ai-run-state-service.js +1 -0
  43. package/dist/services/ai-storage-service.d.ts +18 -0
  44. package/dist/services/ai-storage-service.js +1 -0
  45. package/dist/services/deployment-service.d.ts +19 -0
  46. package/dist/services/deployment-service.js +1 -0
  47. package/dist/services/gopass-secrets.d.ts +47 -0
  48. package/dist/services/gopass-secrets.js +94 -0
  49. package/dist/services/in-memory-trigger-service.d.ts +23 -0
  50. package/dist/services/in-memory-trigger-service.js +50 -0
  51. package/dist/services/in-memory-workflow-service.d.ts +59 -0
  52. package/dist/services/in-memory-workflow-service.js +287 -0
  53. package/dist/services/index.d.ts +25 -11
  54. package/dist/services/index.js +10 -13
  55. package/dist/services/local-secrets.d.ts +23 -0
  56. package/dist/services/local-secrets.js +45 -0
  57. package/dist/services/local-variables.d.ts +5 -0
  58. package/dist/services/local-variables.js +18 -0
  59. package/dist/services/scheduler-service.d.ts +21 -1
  60. package/dist/services/scheduler-service.js +14 -0
  61. package/dist/services/schema-service.d.ts +6 -0
  62. package/dist/services/scoped-secret-service.d.ts +16 -0
  63. package/dist/services/scoped-secret-service.js +35 -0
  64. package/dist/services/secret-service.d.ts +25 -4
  65. package/dist/services/trigger-service.d.ts +23 -0
  66. package/dist/services/trigger-service.js +1 -0
  67. package/dist/services/typed-secret-service.d.ts +30 -0
  68. package/dist/services/typed-secret-service.js +40 -0
  69. package/dist/services/typed-variables-service.d.ts +27 -0
  70. package/dist/services/typed-variables-service.js +46 -0
  71. package/dist/services/user-session-service.d.ts +13 -0
  72. package/dist/services/user-session-service.js +17 -0
  73. package/dist/services/variables-service.d.ts +5 -0
  74. package/dist/services/workflow-service.d.ts +43 -0
  75. package/dist/services/workflow-service.js +1 -0
  76. package/dist/types/core.types.d.ts +54 -10
  77. package/dist/types/core.types.js +7 -0
  78. package/dist/types/state.types.d.ts +127 -0
  79. package/dist/types/state.types.js +1 -0
  80. package/dist/utils.d.ts +10 -1
  81. package/dist/utils.js +60 -3
  82. package/dist/version.d.ts +6 -0
  83. package/dist/version.js +19 -0
  84. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +29 -0
  85. package/dist/wirings/ai-agent/ai-agent-memory.js +199 -0
  86. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +9 -0
  87. package/dist/wirings/ai-agent/ai-agent-model-config.js +36 -0
  88. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +60 -0
  89. package/dist/wirings/ai-agent/ai-agent-prepare.js +312 -0
  90. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +15 -0
  91. package/dist/wirings/ai-agent/ai-agent-registry.js +47 -0
  92. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +3 -0
  93. package/dist/wirings/ai-agent/ai-agent-runner.js +96 -0
  94. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +11 -0
  95. package/dist/wirings/ai-agent/ai-agent-stream.js +503 -0
  96. package/dist/wirings/ai-agent/ai-agent.types.d.ts +254 -0
  97. package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
  98. package/dist/wirings/ai-agent/index.d.ts +5 -0
  99. package/dist/wirings/ai-agent/index.js +4 -0
  100. package/dist/wirings/channel/channel-common.d.ts +7 -4
  101. package/dist/wirings/channel/channel-common.js +15 -8
  102. package/dist/wirings/channel/channel-handler.js +13 -4
  103. package/dist/wirings/channel/channel-middleware-runner.d.ts +9 -0
  104. package/dist/wirings/channel/channel-middleware-runner.js +73 -0
  105. package/dist/wirings/channel/channel-runner.js +12 -12
  106. package/dist/wirings/channel/channel.types.d.ts +5 -1
  107. package/dist/wirings/channel/define-channel-routes.d.ts +21 -0
  108. package/dist/wirings/channel/define-channel-routes.js +23 -0
  109. package/dist/wirings/channel/index.d.ts +10 -8
  110. package/dist/wirings/channel/index.js +7 -8
  111. package/dist/wirings/channel/local/index.d.ts +3 -3
  112. package/dist/wirings/channel/local/index.js +3 -3
  113. package/dist/wirings/channel/local/local-channel-runner.js +18 -6
  114. package/dist/wirings/channel/log-channels.js +1 -1
  115. package/dist/wirings/channel/serverless/index.d.ts +1 -1
  116. package/dist/wirings/channel/serverless/index.js +1 -1
  117. package/dist/wirings/channel/serverless/serverless-channel-runner.js +17 -6
  118. package/dist/wirings/cli/channel/cli-channel-runner.js +3 -2
  119. package/dist/wirings/cli/channel/index.d.ts +1 -1
  120. package/dist/wirings/cli/channel/index.js +1 -1
  121. package/dist/wirings/cli/cli-runner.d.ts +1 -1
  122. package/dist/wirings/cli/cli-runner.js +22 -18
  123. package/dist/wirings/cli/cli.types.d.ts +7 -6
  124. package/dist/wirings/cli/define-cli-commands.d.ts +19 -0
  125. package/dist/wirings/cli/define-cli-commands.js +20 -0
  126. package/dist/wirings/cli/index.d.ts +2 -3
  127. package/dist/wirings/cli/index.js +1 -3
  128. package/dist/wirings/http/http-routes.d.ts +69 -0
  129. package/dist/wirings/http/http-routes.js +139 -0
  130. package/dist/wirings/http/http-runner.d.ts +2 -2
  131. package/dist/wirings/http/http-runner.js +62 -27
  132. package/dist/wirings/http/http.types.d.ts +77 -24
  133. package/dist/wirings/http/index.d.ts +5 -4
  134. package/dist/wirings/http/index.js +4 -3
  135. package/dist/wirings/http/log-http-routes.js +1 -1
  136. package/dist/wirings/http/routers/path-to-regex.js +2 -2
  137. package/dist/wirings/mcp/index.d.ts +4 -3
  138. package/dist/wirings/mcp/index.js +3 -3
  139. package/dist/wirings/mcp/mcp-runner.d.ts +1 -3
  140. package/dist/wirings/mcp/mcp-runner.js +42 -56
  141. package/dist/wirings/mcp/mcp.types.d.ts +3 -3
  142. package/dist/wirings/node/index.d.ts +2 -0
  143. package/dist/wirings/node/index.js +1 -0
  144. package/dist/wirings/node/node.types.d.ts +20 -0
  145. package/dist/wirings/node/node.types.js +1 -0
  146. package/dist/wirings/oauth2/index.d.ts +3 -0
  147. package/dist/wirings/oauth2/index.js +2 -0
  148. package/dist/wirings/oauth2/oauth2-client.d.ts +47 -0
  149. package/dist/wirings/oauth2/oauth2-client.js +267 -0
  150. package/dist/wirings/oauth2/oauth2.types.d.ts +65 -0
  151. package/dist/wirings/oauth2/oauth2.types.js +4 -0
  152. package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +20 -0
  153. package/dist/wirings/oauth2/wire-oauth2-credential.js +21 -0
  154. package/dist/wirings/queue/index.d.ts +2 -2
  155. package/dist/wirings/queue/index.js +1 -1
  156. package/dist/wirings/queue/queue-runner.d.ts +7 -0
  157. package/dist/wirings/queue/queue-runner.js +23 -12
  158. package/dist/wirings/queue/queue.types.d.ts +8 -2
  159. package/dist/wirings/rpc/index.d.ts +1 -1
  160. package/dist/wirings/rpc/index.js +1 -1
  161. package/dist/wirings/rpc/rpc-runner.d.ts +40 -13
  162. package/dist/wirings/rpc/rpc-runner.js +191 -25
  163. package/dist/wirings/rpc/rpc-types.d.ts +15 -4
  164. package/dist/wirings/scheduler/index.d.ts +3 -3
  165. package/dist/wirings/scheduler/index.js +2 -3
  166. package/dist/wirings/scheduler/log-schedulers.js +1 -1
  167. package/dist/wirings/scheduler/scheduler-runner.d.ts +5 -0
  168. package/dist/wirings/scheduler/scheduler-runner.js +28 -10
  169. package/dist/wirings/secret/index.d.ts +3 -0
  170. package/dist/wirings/secret/index.js +2 -0
  171. package/dist/wirings/secret/secret.types.d.ts +27 -0
  172. package/dist/wirings/secret/secret.types.js +1 -0
  173. package/dist/wirings/secret/validate-secret-definitions.d.ts +6 -0
  174. package/dist/wirings/secret/validate-secret-definitions.js +55 -0
  175. package/dist/wirings/trigger/index.d.ts +3 -0
  176. package/dist/wirings/trigger/index.js +2 -0
  177. package/dist/wirings/trigger/pikku-trigger-service.d.ts +26 -0
  178. package/dist/wirings/trigger/pikku-trigger-service.js +75 -0
  179. package/dist/wirings/trigger/trigger-runner.d.ts +42 -0
  180. package/dist/wirings/trigger/trigger-runner.js +85 -0
  181. package/dist/wirings/trigger/trigger.types.d.ts +130 -0
  182. package/dist/wirings/trigger/trigger.types.js +40 -0
  183. package/dist/wirings/variable/index.d.ts +3 -0
  184. package/dist/wirings/variable/index.js +2 -0
  185. package/dist/wirings/variable/validate-variable-definitions.d.ts +6 -0
  186. package/dist/wirings/variable/validate-variable-definitions.js +45 -0
  187. package/dist/wirings/variable/variable.types.d.ts +18 -0
  188. package/dist/wirings/variable/variable.types.js +1 -0
  189. package/dist/wirings/workflow/dsl/index.d.ts +5 -0
  190. package/dist/wirings/workflow/dsl/index.js +4 -0
  191. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +292 -0
  192. package/dist/wirings/workflow/dsl/workflow-dsl.types.js +5 -0
  193. package/dist/wirings/workflow/dsl/workflow-runner.d.ts +5 -0
  194. package/dist/wirings/workflow/dsl/workflow-runner.js +23 -0
  195. package/dist/wirings/workflow/graph/graph-node.d.ts +117 -0
  196. package/dist/wirings/workflow/graph/graph-node.js +58 -0
  197. package/dist/wirings/workflow/graph/graph-runner.d.ts +9 -0
  198. package/dist/wirings/workflow/graph/graph-runner.js +540 -0
  199. package/dist/wirings/workflow/graph/index.d.ts +4 -0
  200. package/dist/wirings/workflow/graph/index.js +3 -0
  201. package/dist/wirings/workflow/graph/template.d.ts +15 -0
  202. package/dist/wirings/workflow/graph/template.js +27 -0
  203. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +15 -0
  204. package/dist/wirings/workflow/graph/wire-workflow-graph.js +8 -0
  205. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +82 -0
  206. package/dist/wirings/workflow/graph/workflow-graph.types.js +15 -0
  207. package/dist/wirings/workflow/index.d.ts +7 -12
  208. package/dist/wirings/workflow/index.js +8 -11
  209. package/dist/wirings/workflow/pikku-workflow-service.d.ts +114 -10
  210. package/dist/wirings/workflow/pikku-workflow-service.js +386 -115
  211. package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
  212. package/dist/wirings/workflow/workflow-helpers.js +38 -0
  213. package/dist/wirings/workflow/workflow-utils.d.ts +1 -0
  214. package/dist/wirings/workflow/workflow-utils.js +1 -0
  215. package/dist/wirings/workflow/workflow.types.d.ts +83 -214
  216. package/package.json +13 -6
  217. package/run-tests.sh +4 -1
  218. package/src/crypto-utils.ts +99 -0
  219. package/src/errors/error-handler.ts +3 -3
  220. package/src/errors/errors.ts +17 -0
  221. package/src/errors/index.ts +0 -1
  222. package/src/factory-functions.test.ts +42 -2
  223. package/src/function/function-runner.test.ts +5 -12
  224. package/src/function/function-runner.ts +195 -40
  225. package/src/function/functions.types.ts +66 -14
  226. package/src/function/index.ts +5 -2
  227. package/src/handle-error.ts +2 -10
  228. package/src/index.ts +106 -27
  229. package/src/middleware/auth-apikey.test.ts +15 -12
  230. package/src/middleware/auth-apikey.ts +3 -3
  231. package/src/middleware/auth-bearer.test.ts +17 -14
  232. package/src/middleware/auth-bearer.ts +25 -27
  233. package/src/middleware/auth-cookie.test.ts +16 -13
  234. package/src/middleware/auth-cookie.ts +6 -8
  235. package/src/middleware/cors.ts +96 -0
  236. package/src/middleware/index.ts +5 -3
  237. package/src/middleware/remote-auth.ts +68 -0
  238. package/src/middleware-runner.test.ts +122 -0
  239. package/src/middleware-runner.ts +24 -17
  240. package/src/permissions.test.ts +102 -86
  241. package/src/permissions.ts +32 -93
  242. package/src/pikku-state.ts +168 -201
  243. package/src/run-tests-script.test.ts +49 -0
  244. package/src/schema.ts +50 -18
  245. package/src/services/ai-agent-runner-service.ts +29 -0
  246. package/src/services/ai-run-state-service.ts +20 -0
  247. package/src/services/ai-storage-service.ts +39 -0
  248. package/src/services/deployment-service.ts +22 -0
  249. package/src/services/gopass-secrets.ts +95 -0
  250. package/src/services/in-memory-trigger-service.ts +68 -0
  251. package/src/services/in-memory-workflow-service.ts +395 -0
  252. package/src/services/index.ts +49 -14
  253. package/src/services/local-secrets.ts +51 -0
  254. package/src/services/local-variables.ts +22 -0
  255. package/src/services/scheduler-service.ts +29 -1
  256. package/src/services/schema-service.ts +7 -0
  257. package/src/services/scoped-secret-service.ts +41 -0
  258. package/src/services/secret-service.ts +25 -4
  259. package/src/services/trigger-service.ts +38 -0
  260. package/src/services/typed-secret-service.ts +70 -0
  261. package/src/services/typed-variables-service.ts +81 -0
  262. package/src/services/user-session-service.ts +23 -0
  263. package/src/services/variables-service.ts +5 -0
  264. package/src/services/workflow-service.ts +94 -0
  265. package/src/types/core.types.ts +82 -8
  266. package/src/types/state.types.ts +169 -0
  267. package/src/utils.ts +74 -5
  268. package/src/version.test.ts +80 -0
  269. package/src/version.ts +25 -0
  270. package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
  271. package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
  272. package/src/wirings/ai-agent/ai-agent-prepare.ts +470 -0
  273. package/src/wirings/ai-agent/ai-agent-registry.test.ts +37 -0
  274. package/src/wirings/ai-agent/ai-agent-registry.ts +82 -0
  275. package/src/wirings/ai-agent/ai-agent-runner.test.ts +75 -0
  276. package/src/wirings/ai-agent/ai-agent-runner.ts +137 -0
  277. package/src/wirings/ai-agent/ai-agent-stream.test.ts +246 -0
  278. package/src/wirings/ai-agent/ai-agent-stream.ts +774 -0
  279. package/src/wirings/ai-agent/ai-agent.types.ts +273 -0
  280. package/src/wirings/ai-agent/index.ts +28 -0
  281. package/src/wirings/channel/channel-common.ts +32 -19
  282. package/src/wirings/channel/channel-handler.ts +18 -5
  283. package/src/wirings/channel/channel-middleware-runner.ts +119 -0
  284. package/src/wirings/channel/channel-runner.ts +14 -15
  285. package/src/wirings/channel/channel.types.ts +17 -1
  286. package/src/wirings/channel/define-channel-routes.ts +25 -0
  287. package/src/wirings/channel/index.ts +23 -8
  288. package/src/wirings/channel/local/index.ts +3 -3
  289. package/src/wirings/channel/local/local-channel-runner.test.ts +47 -2
  290. package/src/wirings/channel/local/local-channel-runner.ts +22 -6
  291. package/src/wirings/channel/log-channels.ts +1 -1
  292. package/src/wirings/channel/serverless/index.ts +5 -1
  293. package/src/wirings/channel/serverless/serverless-channel-runner.ts +22 -6
  294. package/src/wirings/cli/channel/cli-channel-runner.ts +4 -3
  295. package/src/wirings/cli/channel/index.ts +1 -1
  296. package/src/wirings/cli/cli-runner.test.ts +28 -28
  297. package/src/wirings/cli/cli-runner.ts +27 -19
  298. package/src/wirings/cli/cli.types.ts +12 -11
  299. package/src/wirings/cli/command-parser.test.ts +8 -8
  300. package/src/wirings/cli/define-cli-commands.ts +24 -0
  301. package/src/wirings/cli/index.ts +10 -4
  302. package/src/wirings/http/http-routes.test.ts +322 -0
  303. package/src/wirings/http/http-routes.ts +198 -0
  304. package/src/wirings/http/http-runner.test.ts +5 -5
  305. package/src/wirings/http/http-runner.ts +80 -29
  306. package/src/wirings/http/http.types.ts +121 -23
  307. package/src/wirings/http/index.ts +16 -4
  308. package/src/wirings/http/log-http-routes.ts +1 -1
  309. package/src/wirings/http/routers/path-to-regex.test.ts +30 -19
  310. package/src/wirings/http/routers/path-to-regex.ts +2 -2
  311. package/src/wirings/mcp/index.ts +27 -3
  312. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
  313. package/src/wirings/mcp/mcp-runner.ts +56 -67
  314. package/src/wirings/mcp/mcp.types.ts +3 -3
  315. package/src/wirings/node/index.ts +2 -0
  316. package/src/wirings/node/node.types.ts +23 -0
  317. package/src/wirings/oauth2/index.ts +3 -0
  318. package/src/wirings/oauth2/oauth2-client.test.ts +929 -0
  319. package/src/wirings/oauth2/oauth2-client.ts +335 -0
  320. package/src/wirings/oauth2/oauth2.types.ts +69 -0
  321. package/src/wirings/oauth2/wire-oauth2-credential.ts +23 -0
  322. package/src/wirings/queue/index.ts +14 -2
  323. package/src/wirings/queue/queue-runner.test.ts +115 -73
  324. package/src/wirings/queue/queue-runner.ts +39 -13
  325. package/src/wirings/queue/queue.types.ts +12 -2
  326. package/src/wirings/rpc/index.ts +1 -1
  327. package/src/wirings/rpc/rpc-runner.ts +270 -34
  328. package/src/wirings/rpc/rpc-types.ts +21 -4
  329. package/src/wirings/scheduler/index.ts +7 -4
  330. package/src/wirings/scheduler/log-schedulers.ts +1 -1
  331. package/src/wirings/scheduler/scheduler-runner.test.ts +97 -53
  332. package/src/wirings/scheduler/scheduler-runner.ts +50 -10
  333. package/src/wirings/secret/index.ts +9 -0
  334. package/src/wirings/secret/secret.types.ts +32 -0
  335. package/src/wirings/secret/validate-secret-definitions.ts +82 -0
  336. package/src/wirings/trigger/index.ts +10 -0
  337. package/src/wirings/trigger/pikku-trigger-service.ts +134 -0
  338. package/src/wirings/trigger/trigger-runner.ts +138 -0
  339. package/src/wirings/trigger/trigger.types.ts +178 -0
  340. package/src/wirings/variable/index.ts +8 -0
  341. package/src/wirings/variable/validate-variable-definitions.ts +69 -0
  342. package/src/wirings/variable/variable.types.ts +22 -0
  343. package/src/wirings/workflow/dsl/index.ts +31 -0
  344. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +320 -0
  345. package/src/wirings/workflow/dsl/workflow-runner.ts +28 -0
  346. package/src/wirings/workflow/graph/graph-node.ts +222 -0
  347. package/src/wirings/workflow/graph/graph-runner.test.ts +495 -0
  348. package/src/wirings/workflow/graph/graph-runner.ts +816 -0
  349. package/src/wirings/workflow/graph/index.ts +14 -0
  350. package/src/wirings/workflow/graph/template.ts +42 -0
  351. package/src/wirings/workflow/graph/wire-workflow-graph.ts +29 -0
  352. package/src/wirings/workflow/graph/workflow-graph.types.ts +104 -0
  353. package/src/wirings/workflow/index.ts +64 -26
  354. package/src/wirings/workflow/pikku-workflow-service.test.ts +212 -0
  355. package/src/wirings/workflow/pikku-workflow-service.ts +571 -136
  356. package/src/wirings/workflow/workflow-helpers.ts +79 -0
  357. package/src/wirings/workflow/workflow-utils.ts +0 -0
  358. package/src/wirings/workflow/workflow.types.ts +123 -279
  359. package/tsconfig.tsbuildinfo +1 -1
  360. package/dist/wirings/workflow/workflow-runner.d.ts +0 -34
  361. package/dist/wirings/workflow/workflow-runner.js +0 -65
  362. package/src/function/function-runner.ts.bak +0 -188
  363. package/src/wirings/workflow/workflow-runner.ts +0 -72
@@ -0,0 +1,139 @@
1
+ import { wireHTTP } from './http-runner.js';
2
+ export function defineHTTPRoutes(configOrRoutes) {
3
+ // If it has a 'routes' property and contains a map (not a route config), it's config + routes
4
+ if ('routes' in configOrRoutes &&
5
+ typeof configOrRoutes.routes === 'object' &&
6
+ !isRouteConfig(configOrRoutes.routes)) {
7
+ return configOrRoutes;
8
+ }
9
+ // Otherwise it's just routes
10
+ return { routes: configOrRoutes };
11
+ }
12
+ /**
13
+ * Wires multiple HTTP routes from a nested map or array configuration.
14
+ * Inspired by ts-rest's contract pattern, provides a single place to wire an entire API.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * // Nested object format
19
+ * wireHTTPRoutes({
20
+ * basePath: '/api/v1',
21
+ * tags: ['api'],
22
+ * routes: {
23
+ * todos: {
24
+ * list: { method: 'get', route: '/todos', func: listTodos },
25
+ * get: { method: 'get', route: '/todos/:id', func: getTodo },
26
+ * },
27
+ * auth: {
28
+ * login: { method: 'post', route: '/auth/login', func: login, auth: false },
29
+ * },
30
+ * },
31
+ * })
32
+ *
33
+ * // Flat array format
34
+ * wireHTTPRoutes({
35
+ * basePath: '/api',
36
+ * routes: [
37
+ * { method: 'get', route: '/todos', func: listTodos },
38
+ * { method: 'post', route: '/todos', func: createTodo },
39
+ * ],
40
+ * })
41
+ *
42
+ * // Composing route contracts
43
+ * wireHTTPRoutes({
44
+ * basePath: '/api/v1',
45
+ * routes: {
46
+ * todos: todosRoutes, // from defineHTTPRoutes()
47
+ * auth: authRoutes, // from defineHTTPRoutes()
48
+ * },
49
+ * })
50
+ * ```
51
+ */
52
+ export const wireHTTPRoutes = (config) => {
53
+ const { routes, ...groupConfig } = config;
54
+ if (Array.isArray(routes)) {
55
+ routes.forEach((route) => registerRoute(route, groupConfig));
56
+ }
57
+ else {
58
+ processRouteMap(routes, groupConfig);
59
+ }
60
+ };
61
+ /**
62
+ * Recursively processes a route map, handling nested maps and contracts
63
+ */
64
+ function processRouteMap(map, parentConfig) {
65
+ for (const [_key, value] of Object.entries(map)) {
66
+ if (isRouteConfig(value)) {
67
+ registerRoute(value, parentConfig);
68
+ }
69
+ else if (isRouteContract(value)) {
70
+ // Merge parent config with contract config, then process routes
71
+ const mergedConfig = mergeGroupConfig(parentConfig, value);
72
+ processRouteMap(value.routes, mergedConfig);
73
+ }
74
+ else {
75
+ // Nested map without config
76
+ processRouteMap(value, parentConfig);
77
+ }
78
+ }
79
+ }
80
+ /**
81
+ * Merge group configs with proper cascading behavior:
82
+ * - basePath: Concatenates
83
+ * - tags: Merges (parent + child)
84
+ * - middleware: Merges (parent runs first)
85
+ * - auth: Inner overrides outer
86
+ * - permissions: Inner overrides outer
87
+ */
88
+ function mergeGroupConfig(parent, child) {
89
+ return {
90
+ basePath: (parent.basePath || '') + (child.basePath || ''),
91
+ tags: [...(parent.tags || []), ...(child.tags || [])],
92
+ middleware: [...(parent.middleware || []), ...(child.middleware || [])],
93
+ auth: child.auth ?? parent.auth,
94
+ permissions: child.permissions ?? parent.permissions,
95
+ };
96
+ }
97
+ /**
98
+ * Registers a single route by calling wireHTTP with merged configuration
99
+ */
100
+ function registerRoute(route, groupConfig) {
101
+ const fullRoute = (groupConfig.basePath || '') + route.route;
102
+ wireHTTP({
103
+ method: route.method,
104
+ route: fullRoute,
105
+ func: route.func,
106
+ auth: route.auth ?? groupConfig.auth,
107
+ tags: [...(groupConfig.tags || []), ...(route.tags || [])],
108
+ middleware: [
109
+ ...(groupConfig.middleware || []),
110
+ ...(route.middleware || []),
111
+ ],
112
+ permissions: route.permissions ?? groupConfig.permissions,
113
+ contentType: route.contentType,
114
+ timeout: route.timeout,
115
+ headers: route.headers,
116
+ docs: route.docs,
117
+ sse: route.sse,
118
+ });
119
+ }
120
+ /**
121
+ * Type guard to check if a value is an individual route config
122
+ */
123
+ function isRouteConfig(value) {
124
+ return (typeof value === 'object' &&
125
+ value !== null &&
126
+ 'method' in value &&
127
+ 'func' in value &&
128
+ 'route' in value);
129
+ }
130
+ /**
131
+ * Type guard to check if a value is a route contract (has routes property but is not a route config)
132
+ */
133
+ function isRouteContract(value) {
134
+ return (typeof value === 'object' &&
135
+ value !== null &&
136
+ 'routes' in value &&
137
+ !('method' in value) &&
138
+ !('func' in value));
139
+ }
@@ -31,7 +31,7 @@ import { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js';
31
31
  * ])
32
32
  * ```
33
33
  */
34
- export declare const addHTTPMiddleware: <PikkuMiddleware extends CorePikkuMiddleware>(pattern: string, middleware: CorePikkuMiddlewareGroup) => CorePikkuMiddlewareGroup;
34
+ export declare const addHTTPMiddleware: <PikkuMiddleware extends CorePikkuMiddleware>(pattern: string, middleware: CorePikkuMiddlewareGroup, packageName?: string | null) => CorePikkuMiddlewareGroup;
35
35
  /**
36
36
  * Registers HTTP permissions for a specific route pattern.
37
37
  *
@@ -61,7 +61,7 @@ export declare const addHTTPMiddleware: <PikkuMiddleware extends CorePikkuMiddle
61
61
  * ])
62
62
  * ```
63
63
  */
64
- export declare const addHTTPPermission: <PikkuPermission extends CorePikkuPermission>(pattern: string, permissions: CorePermissionGroup | CorePikkuPermission[]) => CorePermissionGroup | CorePikkuPermission[];
64
+ export declare const addHTTPPermission: <PikkuPermission extends CorePikkuPermission>(pattern: string, permissions: CorePermissionGroup | CorePikkuPermission[], packageName?: string | null) => CorePermissionGroup | CorePikkuPermission[];
65
65
  /**
66
66
  * Adds a new route to the global HTTP route registry.
67
67
  *
@@ -1,12 +1,26 @@
1
- import { NotFoundError } from '../../errors/errors.js';
1
+ import { NotFoundError, PikkuMissingMetaError } from '../../errors/errors.js';
2
2
  import { closeWireServices, createWeakUID, isSerializable, } from '../../utils.js';
3
- import { PikkuSessionService } from '../../services/user-session-service.js';
3
+ import { PikkuSessionService, createMiddlewareSessionWireProps, } from '../../services/user-session-service.js';
4
4
  import { handleHTTPError } from '../../handle-error.js';
5
5
  import { pikkuState } from '../../pikku-state.js';
6
6
  import { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js';
7
7
  import { PikkuFetchHTTPRequest } from './pikku-fetch-http-request.js';
8
8
  import { addFunction, runPikkuFunc } from '../../function/function-runner.js';
9
9
  import { httpRouter } from './routers/http-router.js';
10
+ import { validateSchema } from '../../schema.js';
11
+ /**
12
+ * Extract headers from a PikkuHTTPRequest based on the schema keys
13
+ */
14
+ function extractHeadersFromRequest(request, headerKeys) {
15
+ const headers = {};
16
+ for (const headerName of headerKeys) {
17
+ const value = request.header(headerName);
18
+ if (value !== null) {
19
+ headers[headerName] = value;
20
+ }
21
+ }
22
+ return headers;
23
+ }
10
24
  /**
11
25
  * Registers HTTP middleware for a specific route pattern.
12
26
  *
@@ -36,8 +50,8 @@ import { httpRouter } from './routers/http-router.js';
36
50
  * ])
37
51
  * ```
38
52
  */
39
- export const addHTTPMiddleware = (pattern, middleware) => {
40
- const httpGroups = pikkuState('middleware', 'httpGroup');
53
+ export const addHTTPMiddleware = (pattern, middleware, packageName = null) => {
54
+ const httpGroups = pikkuState(packageName, 'middleware', 'httpGroup');
41
55
  httpGroups[pattern] = middleware;
42
56
  return middleware;
43
57
  };
@@ -70,8 +84,8 @@ export const addHTTPMiddleware = (pattern, middleware) => {
70
84
  * ])
71
85
  * ```
72
86
  */
73
- export const addHTTPPermission = (pattern, permissions) => {
74
- const httpGroups = pikkuState('permissions', 'httpGroup');
87
+ export const addHTTPPermission = (pattern, permissions, packageName = null) => {
88
+ const httpGroups = pikkuState(packageName, 'permissions', 'httpGroup');
75
89
  httpGroups[pattern] = permissions;
76
90
  return permissions;
77
91
  };
@@ -91,17 +105,19 @@ export const addHTTPPermission = (pattern, permissions) => {
91
105
  * @param {CoreHTTPFunctionWiring<In, Out, Route, PikkuFunction, PikkuFunctionSessionless, PikkuPermission, PikkuMiddleware>} httpWiring - The HTTP wiring configuration object.
92
106
  */
93
107
  export const wireHTTP = (httpWiring) => {
94
- const httpMeta = pikkuState('http', 'meta');
108
+ const httpMeta = pikkuState(null, 'http', 'meta');
95
109
  const routeMeta = httpMeta[httpWiring.method][httpWiring.route];
96
110
  if (!routeMeta) {
97
- throw new Error('Route metadata not found');
111
+ throw new PikkuMissingMetaError(`Missing generated metadata for HTTP route '${httpWiring.method.toUpperCase()} ${httpWiring.route}'`);
98
112
  }
99
- addFunction(routeMeta.pikkuFuncName, httpWiring.func);
100
- const routes = pikkuState('http', 'routes');
113
+ if (httpWiring.func) {
114
+ addFunction(routeMeta.pikkuFuncId, httpWiring.func);
115
+ }
116
+ const routes = pikkuState(null, 'http', 'routes');
101
117
  if (!routes.has(httpWiring.method)) {
102
118
  routes.set(httpWiring.method, new Map());
103
119
  }
104
- pikkuState('http', 'routes')
120
+ pikkuState(null, 'http', 'routes')
105
121
  .get(httpWiring.method)
106
122
  ?.set(httpWiring.route, httpWiring);
107
123
  };
@@ -119,10 +135,10 @@ export const wireHTTP = (httpWiring) => {
119
135
  const getMatchingRoute = (requestType, requestPath) => {
120
136
  const matchedPath = httpRouter.match(requestType.toLowerCase(), requestPath);
121
137
  if (matchedPath) {
122
- const route = pikkuState('http', 'routes')
138
+ const route = pikkuState(null, 'http', 'routes')
123
139
  .get(requestType.toLowerCase())
124
140
  .get(matchedPath.route);
125
- const meta = pikkuState('http', 'meta')[requestType.toLowerCase()][route.route];
141
+ const meta = pikkuState(null, 'http', 'meta')[requestType.toLowerCase()][route.route];
126
142
  return {
127
143
  matchedPath,
128
144
  params: matchedPath.params,
@@ -179,17 +195,29 @@ const executeRoute = async (services, matchedRoute, http, options) => {
179
195
  const userSession = new PikkuSessionService();
180
196
  const { params, route, meta } = matchedRoute;
181
197
  const { singletonServices, createWireServices, skipUserSession, requestId } = services;
198
+ // Attach URL parameters to the request object
199
+ http?.request?.setParams(params);
200
+ // Validate request headers if schema is defined
201
+ if (meta.headersSchemaName && http.request && singletonServices.schema) {
202
+ const headerKeys = singletonServices.schema.getSchemaKeys(meta.headersSchemaName);
203
+ const rawHeaders = extractHeadersFromRequest(http.request, headerKeys);
204
+ await validateSchema(singletonServices.logger, singletonServices.schema, meta.headersSchemaName, rawHeaders);
205
+ }
182
206
  const requiresSession = route.auth !== false;
183
207
  let wireServices;
184
208
  let result;
185
- // Attach URL parameters to the request object
186
- http?.request?.setParams(params);
187
209
  singletonServices.logger.info(`Matched route: ${route.route} | method: ${route.method.toUpperCase()} | auth: ${requiresSession.toString()}`);
188
210
  // Ensure session is available when required
189
211
  if (skipUserSession && requiresSession) {
190
212
  throw new Error("Can't skip trying to get user session if auth is required");
191
213
  }
192
- const data = () => http.request.data();
214
+ let cachedData;
215
+ const data = async () => {
216
+ if (cachedData === undefined) {
217
+ cachedData = await http.request.data();
218
+ }
219
+ return cachedData;
220
+ };
193
221
  let channel;
194
222
  if (matchedRoute.route.sse) {
195
223
  const response = http?.response;
@@ -217,8 +245,12 @@ const executeRoute = async (services, matchedRoute, http, options) => {
217
245
  state: 'open',
218
246
  };
219
247
  }
220
- const wire = { http, channel, session: userSession };
221
- result = await runPikkuFunc('http', `${meta.method}:${meta.route}`, meta.pikkuFuncName, {
248
+ const wire = {
249
+ http,
250
+ channel,
251
+ ...createMiddlewareSessionWireProps(userSession),
252
+ };
253
+ result = await runPikkuFunc('http', `${meta.method}:${meta.route}`, meta.pikkuFuncId, {
222
254
  singletonServices,
223
255
  createWireServices,
224
256
  auth: route.auth !== false,
@@ -230,17 +262,20 @@ const executeRoute = async (services, matchedRoute, http, options) => {
230
262
  coerceDataFromSchema: options.coerceDataFromSchema,
231
263
  tags: route.tags,
232
264
  wire,
265
+ sessionService: userSession,
233
266
  });
234
- // Respond with either a binary or JSON response based on configuration
235
- if (route.returnsJSON === false) {
236
- http?.response?.arrayBuffer(result);
237
- }
238
- else {
239
- http?.response?.json(result);
267
+ if (!matchedRoute.route.sse) {
268
+ if (result === undefined || result === null) {
269
+ http?.response?.status(204);
270
+ }
271
+ else if (route.returnsJSON === false) {
272
+ http?.response?.arrayBuffer(result);
273
+ }
274
+ else {
275
+ http?.response?.status(200);
276
+ http?.response?.json(result);
277
+ }
240
278
  }
241
- http?.response?.status(200);
242
- // TODO: Evaluate if the response stream should be explicitly ended.
243
- // http?.response?.end()
244
279
  return wireServices ? { result, wireServices } : { result };
245
280
  };
246
281
  /**
@@ -1,5 +1,6 @@
1
1
  import type { SerializeOptions } from 'cookie';
2
- import type { PikkuError } from '../../errors/error-handler.js';
2
+ import type { StandardSchemaV1 } from '@standard-schema/spec';
3
+ import { PikkuError } from '../../errors/error-handler.js';
3
4
  import type { CoreServices, CoreSingletonServices, CoreUserSession, CreateWireServices, CorePikkuMiddleware, CommonWireMeta } from '../../types/core.types.js';
4
5
  import type { CorePikkuFunction, CorePikkuFunctionSessionless, CorePikkuPermission, CorePermissionGroup, CorePikkuFunctionConfig } from '../../function/functions.types.js';
5
6
  type ExtractHTTPWiringParams<S extends string> = S extends `${string}:${infer Param}/${infer Rest}` ? Param | ExtractHTTPWiringParams<`/${Rest}`> : S extends `${string}:${infer Param}` ? Param : never;
@@ -19,28 +20,43 @@ export type RunHTTPWiringOptions = Partial<{
19
20
  }>;
20
21
  export type RunHTTPWiringParams = {
21
22
  singletonServices: CoreSingletonServices;
22
- createWireServices: CreateWireServices<CoreSingletonServices, CoreServices<CoreSingletonServices>, CoreUserSession>;
23
+ createWireServices?: CreateWireServices<CoreSingletonServices, CoreServices<CoreSingletonServices>, CoreUserSession>;
23
24
  };
24
25
  /**
25
26
  * Represents the HTTP methods supported for API HTTP wirings.
26
- t */
27
+ */
27
28
  export type HTTPMethod = 'post' | 'get' | 'delete' | 'patch' | 'head' | 'put' | 'options';
28
29
  /**
29
- * Represents an API HTTP wiring without a function, including metadata such as content type, route, and timeout settings.
30
+ * Header schema type for request header validation.
31
+ * Uses Standard Schema interface - works with Zod, Valibot, ArkType, Effect Schema, etc.
32
+ */
33
+ export type HTTPHeadersSchema = StandardSchemaV1<Record<string, string | string[] | undefined>>;
34
+ /**
35
+ * Documentation config for OpenAPI generation
36
+ */
37
+ export type HTTPRouteDocsConfig = {
38
+ description?: string;
39
+ response?: string;
40
+ errors?: Array<typeof PikkuError>;
41
+ tags?: string[];
42
+ };
43
+ /**
44
+ * Common HTTP route configuration shared between wireHTTP and wireHTTPRoutes
30
45
  */
31
- export type CoreHTTPFunction = {
46
+ export type HTTPRouteBaseConfig = {
32
47
  contentType?: 'xml' | 'json';
48
+ timeout?: number;
49
+ tags?: string[];
50
+ headers?: HTTPHeadersSchema;
51
+ docs?: HTTPRouteDocsConfig;
52
+ };
53
+ /**
54
+ * Represents an API HTTP wiring without a function, including metadata such as content type, route, and timeout settings.
55
+ */
56
+ export type CoreHTTPFunction = HTTPRouteBaseConfig & {
33
57
  route: string;
34
58
  eventChannel?: false;
35
59
  returnsJSON?: false;
36
- timeout?: number;
37
- tags?: string[];
38
- docs?: Partial<{
39
- description: string;
40
- response: string;
41
- errors: Array<typeof PikkuError>;
42
- tags: string[];
43
- }>;
44
60
  };
45
61
  /**
46
62
  * Represents a http wire within Pikku, including a request and response.
@@ -67,13 +83,12 @@ export type PikkuQuery<T = Record<string, string | undefined>> = Record<string,
67
83
  * @template PikkuFunctionSessionless - The sessionless API function type, defaults to `CorePikkuFunctionSessionless`.
68
84
  * @template PikkuPermission - The permission function type, defaults to `CorePikkuPermission`.
69
85
  */
70
- export type CoreHTTPFunctionWiring<In, Out, R extends string, PikkuFunction extends CorePikkuFunction<In, Out, any, any> = CorePikkuFunction<In, Out>, PikkuFunctionSessionless extends CorePikkuFunctionSessionless<In, Out, any, any> = CorePikkuFunctionSessionless<In, Out>, PikkuPermission extends CorePikkuPermission<In, any, any> = CorePikkuPermission<In, any, any>, PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<any>> = (CoreHTTPFunction & {
86
+ export type CoreHTTPFunctionWiring<In, Out, R extends string, PikkuFunction extends CorePikkuFunction<In, Out, any, any, any> = CorePikkuFunction<In, Out>, PikkuFunctionSessionless extends CorePikkuFunctionSessionless<In, Out, any, any, any> = CorePikkuFunctionSessionless<In, Out>, PikkuPermission extends CorePikkuPermission<In, any, any> = CorePikkuPermission<In, any, any>, PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<any>> = (CoreHTTPFunction & {
71
87
  route: R;
72
88
  method: HTTPMethod;
73
89
  func: CorePikkuFunctionConfig<PikkuFunction, PikkuPermission, PikkuMiddleware>;
74
90
  permissions?: CorePermissionGroup<PikkuPermission>;
75
91
  auth?: true;
76
- tags?: string[];
77
92
  middleware?: PikkuMiddleware[];
78
93
  sse?: undefined;
79
94
  }) | (CoreHTTPFunction & {
@@ -82,7 +97,6 @@ export type CoreHTTPFunctionWiring<In, Out, R extends string, PikkuFunction exte
82
97
  func: CorePikkuFunctionConfig<PikkuFunctionSessionless, PikkuPermission, PikkuMiddleware>;
83
98
  permissions?: undefined;
84
99
  auth?: false;
85
- tags?: string[];
86
100
  middleware?: PikkuMiddleware[];
87
101
  sse?: undefined;
88
102
  }) | (CoreHTTPFunction & {
@@ -91,27 +105,24 @@ export type CoreHTTPFunctionWiring<In, Out, R extends string, PikkuFunction exte
91
105
  func: CorePikkuFunctionConfig<PikkuFunction, PikkuPermission, PikkuMiddleware>;
92
106
  permissions?: CorePermissionGroup<PikkuPermission>;
93
107
  auth?: true;
94
- sse?: boolean;
95
- tags?: string[];
96
108
  middleware?: PikkuMiddleware[];
109
+ sse?: boolean;
97
110
  }) | (CoreHTTPFunction & {
98
111
  route: R;
99
112
  method: 'get';
100
113
  func: CorePikkuFunctionConfig<PikkuFunctionSessionless, PikkuPermission, PikkuMiddleware>;
101
114
  permissions?: undefined;
102
115
  auth?: false;
103
- sse?: boolean;
104
- tags?: string[];
105
116
  middleware?: PikkuMiddleware[];
117
+ sse?: boolean;
106
118
  }) | (CoreHTTPFunction & {
107
119
  route: R;
108
120
  method: 'post';
109
121
  func: CorePikkuFunctionConfig<PikkuFunction, PikkuPermission, PikkuMiddleware>;
110
122
  permissions?: CorePermissionGroup<PikkuPermission>;
111
123
  auth?: true;
112
- query?: Array<keyof In>;
113
- tags?: string[];
114
124
  middleware?: PikkuMiddleware[];
125
+ query?: Array<keyof In>;
115
126
  sse?: undefined;
116
127
  }) | (CoreHTTPFunction & {
117
128
  route: R;
@@ -119,9 +130,8 @@ export type CoreHTTPFunctionWiring<In, Out, R extends string, PikkuFunction exte
119
130
  func: CorePikkuFunctionConfig<PikkuFunctionSessionless, PikkuPermission, PikkuMiddleware>;
120
131
  permissions?: undefined;
121
132
  auth?: false;
122
- query?: Array<keyof In>;
123
- tags?: string[];
124
133
  middleware?: PikkuMiddleware[];
134
+ query?: Array<keyof In>;
125
135
  sse?: undefined;
126
136
  });
127
137
  /**
@@ -141,7 +151,9 @@ export type HTTPWiringMeta = CommonWireMeta & {
141
151
  params?: string[];
142
152
  query?: string[];
143
153
  inputTypes?: HTTPFunctionMetaInputTypes;
154
+ headersSchemaName?: string;
144
155
  sse?: true;
156
+ groupBasePath?: string;
145
157
  };
146
158
  export type HTTPWiringsMeta = Record<HTTPMethod, Record<string, HTTPWiringMeta>>;
147
159
  export type HTTPFunctionsMeta = Array<{
@@ -175,4 +187,45 @@ export interface PikkuHTTPResponse<Out = unknown> {
175
187
  close?: () => void;
176
188
  setMode?: (mode: 'stream') => void;
177
189
  }
190
+ /**
191
+ * Single route configuration - supports all wireHTTP options
192
+ */
193
+ export type HTTPRouteConfig<PikkuFunction extends CorePikkuFunction<any, any, any, any, any> | CorePikkuFunctionSessionless<any, any, any, any, any> = CorePikkuFunction<any, any, any, any, any> | CorePikkuFunctionSessionless<any, any, any, any, any>, PikkuPermission extends CorePikkuPermission<any, any, any> = CorePikkuPermission<any>, PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<any, any>> = HTTPRouteBaseConfig & {
194
+ method: HTTPMethod;
195
+ route: string;
196
+ func: CorePikkuFunctionConfig<PikkuFunction, PikkuPermission, PikkuMiddleware>;
197
+ auth?: boolean;
198
+ permissions?: CorePermissionGroup<PikkuPermission>;
199
+ middleware?: PikkuMiddleware[];
200
+ sse?: boolean;
201
+ };
202
+ /**
203
+ * Group-level configuration applied to all routes
204
+ */
205
+ export type HTTPRoutesGroupConfig<PikkuPermission extends CorePikkuPermission<any, any, any> = CorePikkuPermission<any>, PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<any, any>> = {
206
+ basePath?: string;
207
+ tags?: string[];
208
+ auth?: boolean;
209
+ middleware?: PikkuMiddleware[];
210
+ permissions?: CorePermissionGroup<PikkuPermission>;
211
+ };
212
+ /**
213
+ * Nested route map - allows hierarchical organization
214
+ * Can contain individual routes, nested maps, or contracts with config
215
+ */
216
+ export type HTTPRouteMap = {
217
+ [key: string]: HTTPRouteConfig | HTTPRouteMap | HTTPRouteContract;
218
+ };
219
+ /**
220
+ * A route contract with optional group config (returned by defineRoutes)
221
+ */
222
+ export type HTTPRouteContract<T extends HTTPRouteMap = HTTPRouteMap> = HTTPRoutesGroupConfig & {
223
+ routes: T;
224
+ };
225
+ /**
226
+ * Full configuration for wireHTTPRoutes
227
+ */
228
+ export type WireHTTPRoutesConfig = HTTPRoutesGroupConfig & {
229
+ routes: HTTPRouteMap | HTTPRouteConfig[];
230
+ };
178
231
  export {};
@@ -1,5 +1,6 @@
1
- export * from './pikku-fetch-http-request.js';
2
- export * from './pikku-fetch-http-response.js';
3
- export * from './log-http-routes.js';
1
+ export { PikkuFetchHTTPRequest } from './pikku-fetch-http-request.js';
2
+ export { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js';
3
+ export { logRoutes } from './log-http-routes.js';
4
4
  export { fetch, fetchData, wireHTTP, addHTTPMiddleware, addHTTPPermission, } from './http-runner.js';
5
- export type * from './http.types.js';
5
+ export { wireHTTPRoutes, defineHTTPRoutes } from './http-routes.js';
6
+ export type { AssertHTTPWiringParams, CoreHTTPFunctionWiring, HTTPMethod, HTTPRouteBaseConfig, HTTPWiringsMeta, PikkuHTTPRequest, PikkuHTTPResponse, PikkuQuery, RunHTTPWiringOptions, } from './http.types.js';
@@ -1,4 +1,5 @@
1
- export * from './pikku-fetch-http-request.js';
2
- export * from './pikku-fetch-http-response.js';
3
- export * from './log-http-routes.js';
1
+ export { PikkuFetchHTTPRequest } from './pikku-fetch-http-request.js';
2
+ export { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js';
3
+ export { logRoutes } from './log-http-routes.js';
4
4
  export { fetch, fetchData, wireHTTP, addHTTPMiddleware, addHTTPPermission, } from './http-runner.js';
5
+ export { wireHTTPRoutes, defineHTTPRoutes } from './http-routes.js';
@@ -4,7 +4,7 @@ import { pikkuState } from '../../pikku-state.js';
4
4
  * @param logger - A logger for logging information.
5
5
  */
6
6
  export const logRoutes = (logger) => {
7
- const routesByType = pikkuState('http', 'routes');
7
+ const routesByType = pikkuState(null, 'http', 'routes');
8
8
  if (routesByType.size === 0) {
9
9
  logger.info('No routes added');
10
10
  return;
@@ -10,8 +10,8 @@ export class PathToRegexRouter {
10
10
  this.isInitialized = false;
11
11
  }
12
12
  initialize() {
13
- const routes = pikkuState('http', 'routes');
14
- const channelRoutes = pikkuState('channel', 'channels');
13
+ const routes = pikkuState(null, 'http', 'routes');
14
+ const channelRoutes = pikkuState(null, 'channel', 'channels');
15
15
  // Helper function to compile routes for a given method
16
16
  const compileRoutesForMethod = (method, routeEntries) => {
17
17
  const methodCompiledRoutes = this.compiledRoutes.get(method) || new Map();
@@ -1,3 +1,4 @@
1
- export * from './mcp.types.js';
2
- export * from './mcp-runner.js';
3
- export * from './mcp-endpoint-registry.js';
1
+ export { MCPEndpointRegistry } from './mcp-endpoint-registry.js';
2
+ export { MCPError, wireMCPResource, wireMCPPrompt, runMCPResource, runMCPTool, runMCPPrompt, } from './mcp-runner.js';
3
+ export { getMCPResourcesMeta, getMCPToolsMeta, getMCPPromptsMeta, } from './mcp-runner.js';
4
+ export type { AssertMCPResourceURIParams, CoreMCPPrompt, CoreMCPResource, CoreMCPTool, MCPPromptResponse, MCPResourceMeta, MCPResourceResponse, MCPToolMeta, MCPToolResponse, MCPPromptMeta, PikkuMCP, } from './mcp.types.js';
@@ -1,3 +1,3 @@
1
- export * from './mcp.types.js';
2
- export * from './mcp-runner.js';
3
- export * from './mcp-endpoint-registry.js';
1
+ export { MCPEndpointRegistry } from './mcp-endpoint-registry.js';
2
+ export { MCPError, wireMCPResource, wireMCPPrompt, runMCPResource, runMCPTool, runMCPPrompt, } from './mcp-runner.js';
3
+ export { getMCPResourcesMeta, getMCPToolsMeta, getMCPPromptsMeta, } from './mcp-runner.js';
@@ -1,5 +1,5 @@
1
1
  import { type CoreServices, type CoreSingletonServices, type CoreUserSession, type CreateWireServices } from '../../types/core.types.js';
2
- import type { CoreMCPResource, CoreMCPTool, CoreMCPPrompt, JsonRpcRequest, JsonRpcResponse, JsonRpcErrorResponse, PikkuMCP } from './mcp.types.js';
2
+ import type { CoreMCPResource, CoreMCPPrompt, JsonRpcRequest, JsonRpcResponse, JsonRpcErrorResponse, PikkuMCP } from './mcp.types.js';
3
3
  import type { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
4
4
  export declare class MCPError extends Error {
5
5
  readonly error: JsonRpcErrorResponse;
@@ -16,12 +16,10 @@ export type JsonRpcError = {
16
16
  data?: any;
17
17
  };
18
18
  export declare const wireMCPResource: <PikkuFunctionConfig extends CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>> = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>>>(mcpResource: CoreMCPResource<PikkuFunctionConfig>) => void;
19
- export declare const wireMCPTool: <PikkuFunctionConfig extends CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>> = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>>>(mcpTool: CoreMCPTool<PikkuFunctionConfig>) => void;
20
19
  export declare const wireMCPPrompt: <PikkuFunctionConfig extends CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>> = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<any, any>>>(mcpPrompt: CoreMCPPrompt<PikkuFunctionConfig>) => void;
21
20
  export declare function runMCPResource(request: JsonRpcRequest, params: RunMCPEndpointParams, uri: string): Promise<JsonRpcResponse>;
22
21
  export declare function runMCPTool(request: JsonRpcRequest, params: RunMCPEndpointParams, name: string): Promise<JsonRpcResponse>;
23
22
  export declare function runMCPPrompt(request: JsonRpcRequest, params: RunMCPEndpointParams, name: string): Promise<JsonRpcResponse>;
24
- export declare const getMCPTools: () => Map<string, CoreMCPTool>;
25
23
  export declare const getMCPResources: () => Map<string, CoreMCPResource>;
26
24
  export declare const getMCPResourcesMeta: () => import("./mcp.types.js").MCPResourceMeta;
27
25
  export declare const getMCPToolsMeta: () => import("./mcp.types.js").MCPToolMeta;