@pikku/core 0.11.2 → 0.12.1

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 (436) hide show
  1. package/CHANGELOG.md +57 -2
  2. package/dist/crypto-utils.d.ts +2 -0
  3. package/dist/crypto-utils.js +78 -0
  4. package/dist/errors/errors.d.ts +14 -0
  5. package/dist/errors/errors.js +26 -0
  6. package/dist/errors/index.d.ts +1 -1
  7. package/dist/errors/index.js +1 -1
  8. package/dist/function/function-runner.d.ts +10 -4
  9. package/dist/function/function-runner.js +126 -45
  10. package/dist/function/functions.types.d.ts +32 -87
  11. package/dist/function/functions.types.js +16 -46
  12. package/dist/function/index.d.ts +2 -2
  13. package/dist/function/index.js +1 -2
  14. package/dist/handle-error.d.ts +2 -2
  15. package/dist/handle-error.js +3 -12
  16. package/dist/index.d.ts +30 -26
  17. package/dist/index.js +19 -29
  18. package/dist/internal.d.ts +3 -0
  19. package/dist/internal.js +2 -0
  20. package/dist/middleware/auth-apikey.d.ts +2 -2
  21. package/dist/middleware/auth-apikey.js +3 -3
  22. package/dist/middleware/auth-bearer.d.ts +3 -3
  23. package/dist/middleware/auth-bearer.js +4 -7
  24. package/dist/middleware/auth-cookie.d.ts +4 -4
  25. package/dist/middleware/auth-cookie.js +7 -9
  26. package/dist/middleware/cors.d.ts +46 -0
  27. package/dist/middleware/cors.js +81 -0
  28. package/dist/middleware/index.d.ts +5 -3
  29. package/dist/middleware/index.js +5 -3
  30. package/dist/middleware/remote-auth.d.ts +5 -0
  31. package/dist/middleware/remote-auth.js +55 -0
  32. package/dist/middleware/timeout.d.ts +2 -2
  33. package/dist/middleware-runner.d.ts +1 -1
  34. package/dist/middleware-runner.js +8 -10
  35. package/dist/permissions.d.ts +2 -2
  36. package/dist/permissions.js +11 -15
  37. package/dist/pikku-state.d.ts +10 -8
  38. package/dist/pikku-state.js +48 -25
  39. package/dist/schema.d.ts +4 -4
  40. package/dist/schema.js +20 -15
  41. package/dist/services/ai-agent-runner-service.d.ts +43 -0
  42. package/dist/services/ai-agent-runner-service.js +1 -0
  43. package/dist/services/ai-run-state-service.d.ts +13 -0
  44. package/dist/services/ai-run-state-service.js +1 -0
  45. package/dist/services/ai-storage-service.d.ts +18 -0
  46. package/dist/services/ai-storage-service.js +1 -0
  47. package/dist/services/content-service.d.ts +6 -0
  48. package/dist/services/deployment-service.d.ts +19 -0
  49. package/dist/services/deployment-service.js +1 -0
  50. package/dist/services/gopass-secrets.d.ts +47 -0
  51. package/dist/services/gopass-secrets.js +97 -0
  52. package/dist/services/in-memory-ai-run-state-service.d.ts +15 -0
  53. package/dist/services/in-memory-ai-run-state-service.js +44 -0
  54. package/dist/services/in-memory-trigger-service.d.ts +22 -0
  55. package/dist/services/in-memory-trigger-service.js +48 -0
  56. package/dist/services/in-memory-workflow-service.d.ts +59 -0
  57. package/dist/services/in-memory-workflow-service.js +287 -0
  58. package/dist/services/index.d.ts +26 -11
  59. package/dist/services/index.js +11 -13
  60. package/dist/services/local-content.d.ts +2 -1
  61. package/dist/services/local-content.js +6 -1
  62. package/dist/services/local-secrets.d.ts +25 -2
  63. package/dist/services/local-secrets.js +45 -0
  64. package/dist/services/local-variables.d.ts +6 -1
  65. package/dist/services/local-variables.js +18 -0
  66. package/dist/services/logger-console.d.ts +2 -1
  67. package/dist/services/scheduler-service.d.ts +9 -1
  68. package/dist/services/scheduler-service.js +8 -0
  69. package/dist/services/schema-service.d.ts +6 -0
  70. package/dist/services/scoped-secret-service.d.ts +16 -0
  71. package/dist/services/scoped-secret-service.js +35 -0
  72. package/dist/services/secret-service.d.ts +25 -4
  73. package/dist/services/trigger-service.d.ts +16 -0
  74. package/dist/services/trigger-service.js +1 -0
  75. package/dist/services/typed-secret-service.d.ts +30 -0
  76. package/dist/services/typed-secret-service.js +40 -0
  77. package/dist/services/typed-variables-service.d.ts +27 -0
  78. package/dist/services/typed-variables-service.js +46 -0
  79. package/dist/services/user-session-service.d.ts +15 -2
  80. package/dist/services/user-session-service.js +17 -0
  81. package/dist/services/variables-service.d.ts +5 -0
  82. package/dist/services/workflow-service.d.ts +9 -5
  83. package/dist/types/core.types.d.ts +67 -25
  84. package/dist/types/core.types.js +8 -1
  85. package/dist/types/state.types.d.ts +53 -59
  86. package/dist/utils.d.ts +7 -6
  87. package/dist/utils.js +27 -12
  88. package/dist/version.d.ts +6 -0
  89. package/dist/version.js +19 -0
  90. package/dist/wirings/ai-agent/ai-agent-assistant-ui.d.ts +5 -0
  91. package/dist/wirings/ai-agent/ai-agent-assistant-ui.js +146 -0
  92. package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +28 -0
  93. package/dist/wirings/ai-agent/ai-agent-helpers.js +40 -0
  94. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +29 -0
  95. package/dist/wirings/ai-agent/ai-agent-memory.js +199 -0
  96. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +9 -0
  97. package/dist/wirings/ai-agent/ai-agent-model-config.js +36 -0
  98. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +59 -0
  99. package/dist/wirings/ai-agent/ai-agent-prepare.js +348 -0
  100. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +15 -0
  101. package/dist/wirings/ai-agent/ai-agent-registry.js +47 -0
  102. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +3 -0
  103. package/dist/wirings/ai-agent/ai-agent-runner.js +195 -0
  104. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +12 -0
  105. package/dist/wirings/ai-agent/ai-agent-stream.js +662 -0
  106. package/dist/wirings/ai-agent/ai-agent.types.d.ts +313 -0
  107. package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
  108. package/dist/wirings/ai-agent/index.d.ts +7 -0
  109. package/dist/wirings/ai-agent/index.js +6 -0
  110. package/dist/wirings/channel/channel-common.d.ts +8 -5
  111. package/dist/wirings/channel/channel-common.js +15 -8
  112. package/dist/wirings/channel/channel-handler.d.ts +3 -3
  113. package/dist/wirings/channel/channel-handler.js +15 -6
  114. package/dist/wirings/channel/channel-middleware-runner.d.ts +9 -0
  115. package/dist/wirings/channel/channel-middleware-runner.js +73 -0
  116. package/dist/wirings/channel/channel-runner.d.ts +5 -5
  117. package/dist/wirings/channel/channel-runner.js +10 -9
  118. package/dist/wirings/channel/channel-store.d.ts +1 -1
  119. package/dist/wirings/channel/channel.types.d.ts +9 -7
  120. package/dist/wirings/channel/define-channel-routes.d.ts +21 -0
  121. package/dist/wirings/channel/define-channel-routes.js +23 -0
  122. package/dist/wirings/channel/index.d.ts +10 -8
  123. package/dist/wirings/channel/index.js +7 -8
  124. package/dist/wirings/channel/local/index.d.ts +3 -3
  125. package/dist/wirings/channel/local/index.js +3 -3
  126. package/dist/wirings/channel/local/local-channel-runner.d.ts +7 -2
  127. package/dist/wirings/channel/local/local-channel-runner.js +22 -9
  128. package/dist/wirings/channel/local/local-eventhub-service.d.ts +2 -2
  129. package/dist/wirings/channel/log-channels.d.ts +1 -1
  130. package/dist/wirings/channel/pikku-abstract-channel-handler.d.ts +1 -1
  131. package/dist/wirings/channel/serverless/index.d.ts +1 -1
  132. package/dist/wirings/channel/serverless/index.js +1 -1
  133. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +4 -4
  134. package/dist/wirings/channel/serverless/serverless-channel-runner.js +40 -23
  135. package/dist/wirings/cli/channel/cli-channel-runner.d.ts +1 -1
  136. package/dist/wirings/cli/channel/index.d.ts +1 -1
  137. package/dist/wirings/cli/channel/index.js +1 -1
  138. package/dist/wirings/cli/cli-runner.d.ts +3 -3
  139. package/dist/wirings/cli/cli-runner.js +12 -8
  140. package/dist/wirings/cli/cli.types.d.ts +9 -9
  141. package/dist/wirings/cli/command-parser.d.ts +1 -1
  142. package/dist/wirings/cli/define-cli-commands.d.ts +19 -0
  143. package/dist/wirings/cli/define-cli-commands.js +20 -0
  144. package/dist/wirings/cli/index.d.ts +2 -3
  145. package/dist/wirings/cli/index.js +1 -3
  146. package/dist/wirings/http/http-routes.d.ts +69 -0
  147. package/dist/wirings/http/http-routes.js +139 -0
  148. package/dist/wirings/http/http-runner.d.ts +9 -9
  149. package/dist/wirings/http/http-runner.js +79 -34
  150. package/dist/wirings/http/http.types.d.ts +77 -41
  151. package/dist/wirings/http/index.d.ts +5 -4
  152. package/dist/wirings/http/index.js +4 -3
  153. package/dist/wirings/http/log-http-routes.d.ts +1 -1
  154. package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -1
  155. package/dist/wirings/http/pikku-fetch-http-response.d.ts +2 -2
  156. package/dist/wirings/http/pikku-fetch-http-response.js +6 -1
  157. package/dist/wirings/http/routers/http-router.d.ts +1 -1
  158. package/dist/wirings/http/routers/path-to-regex.d.ts +2 -2
  159. package/dist/wirings/mcp/index.d.ts +4 -3
  160. package/dist/wirings/mcp/index.js +3 -3
  161. package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +1 -1
  162. package/dist/wirings/mcp/mcp-runner.d.ts +1 -6
  163. package/dist/wirings/mcp/mcp-runner.js +28 -40
  164. package/dist/wirings/mcp/mcp.types.d.ts +5 -5
  165. package/dist/wirings/node/index.d.ts +2 -0
  166. package/dist/wirings/node/index.js +1 -0
  167. package/dist/wirings/node/node.types.d.ts +20 -0
  168. package/dist/wirings/node/node.types.js +1 -0
  169. package/dist/wirings/oauth2/index.d.ts +3 -0
  170. package/dist/wirings/oauth2/index.js +2 -0
  171. package/dist/wirings/oauth2/oauth2-client.d.ts +47 -0
  172. package/dist/wirings/oauth2/oauth2-client.js +267 -0
  173. package/dist/wirings/oauth2/oauth2.types.d.ts +65 -0
  174. package/dist/wirings/oauth2/oauth2.types.js +4 -0
  175. package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +20 -0
  176. package/dist/wirings/oauth2/wire-oauth2-credential.js +21 -0
  177. package/dist/wirings/queue/index.d.ts +1 -1
  178. package/dist/wirings/queue/queue-runner.d.ts +1 -5
  179. package/dist/wirings/queue/queue-runner.js +11 -8
  180. package/dist/wirings/queue/queue.types.d.ts +5 -5
  181. package/dist/wirings/queue/register-queue-helper.d.ts +2 -2
  182. package/dist/wirings/queue/register-queue-helper.js +1 -1
  183. package/dist/wirings/queue/validate-worker-config.d.ts +1 -1
  184. package/dist/wirings/rpc/index.d.ts +3 -1
  185. package/dist/wirings/rpc/index.js +2 -1
  186. package/dist/wirings/rpc/rpc-runner.d.ts +58 -8
  187. package/dist/wirings/rpc/rpc-runner.js +177 -31
  188. package/dist/wirings/rpc/rpc-types.d.ts +20 -4
  189. package/dist/wirings/rpc/wire-addon.d.ts +10 -0
  190. package/dist/wirings/rpc/wire-addon.js +9 -0
  191. package/dist/wirings/scheduler/index.d.ts +2 -2
  192. package/dist/wirings/scheduler/index.js +1 -2
  193. package/dist/wirings/scheduler/log-schedulers.d.ts +1 -1
  194. package/dist/wirings/scheduler/scheduler-runner.d.ts +3 -5
  195. package/dist/wirings/scheduler/scheduler-runner.js +11 -14
  196. package/dist/wirings/scheduler/scheduler.types.d.ts +2 -2
  197. package/dist/wirings/secret/index.d.ts +3 -0
  198. package/dist/wirings/secret/index.js +2 -0
  199. package/dist/wirings/secret/secret.types.d.ts +27 -0
  200. package/dist/wirings/secret/secret.types.js +1 -0
  201. package/dist/wirings/secret/validate-secret-definitions.d.ts +6 -0
  202. package/dist/wirings/secret/validate-secret-definitions.js +55 -0
  203. package/dist/wirings/trigger/index.d.ts +3 -2
  204. package/dist/wirings/trigger/index.js +2 -2
  205. package/dist/wirings/trigger/pikku-trigger-service.d.ts +22 -0
  206. package/dist/wirings/trigger/pikku-trigger-service.js +70 -0
  207. package/dist/wirings/trigger/trigger-runner.d.ts +18 -9
  208. package/dist/wirings/trigger/trigger-runner.js +48 -19
  209. package/dist/wirings/trigger/trigger.types.d.ts +99 -11
  210. package/dist/wirings/trigger/trigger.types.js +40 -1
  211. package/dist/wirings/variable/index.d.ts +3 -0
  212. package/dist/wirings/variable/index.js +2 -0
  213. package/dist/wirings/variable/validate-variable-definitions.d.ts +6 -0
  214. package/dist/wirings/variable/validate-variable-definitions.js +45 -0
  215. package/dist/wirings/variable/variable.types.d.ts +18 -0
  216. package/dist/wirings/variable/variable.types.js +1 -0
  217. package/dist/wirings/workflow/dsl/index.d.ts +1 -1
  218. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +7 -1
  219. package/dist/wirings/workflow/dsl/workflow-runner.js +3 -2
  220. package/dist/wirings/workflow/graph/graph-node.d.ts +1 -6
  221. package/dist/wirings/workflow/graph/graph-runner.d.ts +5 -31
  222. package/dist/wirings/workflow/graph/graph-runner.js +384 -296
  223. package/dist/wirings/workflow/graph/index.d.ts +4 -3
  224. package/dist/wirings/workflow/graph/index.js +3 -3
  225. package/dist/wirings/workflow/graph/template.d.ts +15 -0
  226. package/dist/wirings/workflow/graph/template.js +27 -0
  227. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +15 -0
  228. package/dist/wirings/workflow/graph/wire-workflow-graph.js +8 -0
  229. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -13
  230. package/dist/wirings/workflow/index.d.ts +6 -6
  231. package/dist/wirings/workflow/index.js +6 -4
  232. package/dist/wirings/workflow/pikku-workflow-service.d.ts +29 -19
  233. package/dist/wirings/workflow/pikku-workflow-service.js +217 -82
  234. package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
  235. package/dist/wirings/workflow/workflow-helpers.js +38 -0
  236. package/dist/wirings/workflow/workflow.types.d.ts +42 -95
  237. package/package.json +14 -15
  238. package/run-tests.sh +4 -1
  239. package/src/crypto-utils.test.ts +116 -0
  240. package/src/crypto-utils.ts +99 -0
  241. package/src/errors/error.test.ts +143 -2
  242. package/src/errors/errors.ts +27 -0
  243. package/src/errors/index.ts +1 -1
  244. package/src/factory-functions.test.ts +42 -2
  245. package/src/function/function-runner.test.ts +6 -13
  246. package/src/function/function-runner.ts +161 -53
  247. package/src/function/functions.types.ts +63 -132
  248. package/src/function/index.ts +5 -2
  249. package/src/handle-error.test.ts +361 -0
  250. package/src/handle-error.ts +6 -14
  251. package/src/index.ts +97 -30
  252. package/src/internal.ts +6 -0
  253. package/src/middleware/auth-apikey.test.ts +16 -13
  254. package/src/middleware/auth-apikey.ts +3 -3
  255. package/src/middleware/auth-bearer.test.ts +18 -15
  256. package/src/middleware/auth-bearer.ts +27 -32
  257. package/src/middleware/auth-cookie.test.ts +17 -14
  258. package/src/middleware/auth-cookie.ts +9 -13
  259. package/src/middleware/cors.test.ts +424 -0
  260. package/src/middleware/cors.ts +104 -0
  261. package/src/middleware/index.ts +5 -3
  262. package/src/middleware/remote-auth.test.ts +488 -0
  263. package/src/middleware/remote-auth.ts +68 -0
  264. package/src/middleware-runner.test.ts +123 -1
  265. package/src/middleware-runner.ts +13 -13
  266. package/src/permissions.test.ts +83 -9
  267. package/src/permissions.ts +17 -19
  268. package/src/pikku-state.test.ts +224 -0
  269. package/src/pikku-state.ts +59 -35
  270. package/src/run-tests-script.test.ts +49 -0
  271. package/src/schema.test.ts +198 -6
  272. package/src/schema.ts +28 -21
  273. package/src/services/ai-agent-runner-service.ts +41 -0
  274. package/src/services/ai-run-state-service.ts +20 -0
  275. package/src/services/ai-storage-service.ts +39 -0
  276. package/src/services/content-service.ts +7 -0
  277. package/src/services/deployment-service.ts +22 -0
  278. package/src/services/gopass-secrets.ts +98 -0
  279. package/src/services/in-memory-ai-run-state-service.ts +73 -0
  280. package/src/services/in-memory-trigger-service.ts +64 -0
  281. package/src/services/in-memory-workflow-service.test.ts +351 -0
  282. package/src/services/in-memory-workflow-service.ts +395 -0
  283. package/src/services/index.ts +50 -14
  284. package/src/services/local-content.ts +9 -3
  285. package/src/services/local-secrets.test.ts +80 -0
  286. package/src/services/local-secrets.ts +53 -2
  287. package/src/services/local-variables.test.ts +61 -0
  288. package/src/services/local-variables.ts +23 -1
  289. package/src/services/logger-console.test.ts +118 -0
  290. package/src/services/logger-console.ts +2 -1
  291. package/src/services/scheduler-service.ts +11 -1
  292. package/src/services/schema-service.ts +7 -0
  293. package/src/services/scoped-secret-service.test.ts +74 -0
  294. package/src/services/scoped-secret-service.ts +41 -0
  295. package/src/services/secret-service.ts +25 -4
  296. package/src/services/trigger-service.ts +17 -0
  297. package/src/services/typed-secret-service.test.ts +93 -0
  298. package/src/services/typed-secret-service.ts +70 -0
  299. package/src/services/typed-variables-service.test.ts +73 -0
  300. package/src/services/typed-variables-service.ts +81 -0
  301. package/src/services/user-session-service.test.ts +113 -0
  302. package/src/services/user-session-service.ts +25 -2
  303. package/src/services/variables-service.ts +5 -0
  304. package/src/services/workflow-service.ts +23 -13
  305. package/src/time-utils.test.ts +1 -1
  306. package/src/types/core.types.ts +95 -24
  307. package/src/types/state.types.ts +56 -73
  308. package/src/utils.test.ts +350 -0
  309. package/src/utils.ts +33 -18
  310. package/src/version.test.ts +80 -0
  311. package/src/version.ts +25 -0
  312. package/src/wirings/ai-agent/ai-agent-assistant-ui.test.ts +363 -0
  313. package/src/wirings/ai-agent/ai-agent-assistant-ui.ts +214 -0
  314. package/src/wirings/ai-agent/ai-agent-helpers.test.ts +152 -0
  315. package/src/wirings/ai-agent/ai-agent-helpers.ts +76 -0
  316. package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
  317. package/src/wirings/ai-agent/ai-agent-model-config.test.ts +115 -0
  318. package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
  319. package/src/wirings/ai-agent/ai-agent-prepare.ts +504 -0
  320. package/src/wirings/ai-agent/ai-agent-registry.test.ts +37 -0
  321. package/src/wirings/ai-agent/ai-agent-registry.ts +82 -0
  322. package/src/wirings/ai-agent/ai-agent-runner.test.ts +317 -0
  323. package/src/wirings/ai-agent/ai-agent-runner.ts +251 -0
  324. package/src/wirings/ai-agent/ai-agent-stream.test.ts +652 -0
  325. package/src/wirings/ai-agent/ai-agent-stream.ts +1049 -0
  326. package/src/wirings/ai-agent/ai-agent.types.ts +328 -0
  327. package/src/wirings/ai-agent/index.ts +39 -0
  328. package/src/wirings/channel/channel-common.ts +33 -20
  329. package/src/wirings/channel/channel-handler.ts +26 -9
  330. package/src/wirings/channel/channel-middleware-runner.ts +119 -0
  331. package/src/wirings/channel/channel-runner.ts +15 -16
  332. package/src/wirings/channel/channel-store.ts +1 -1
  333. package/src/wirings/channel/channel.types.ts +21 -9
  334. package/src/wirings/channel/define-channel-routes.ts +25 -0
  335. package/src/wirings/channel/index.ts +23 -8
  336. package/src/wirings/channel/local/index.ts +3 -3
  337. package/src/wirings/channel/local/local-channel-runner.test.ts +57 -7
  338. package/src/wirings/channel/local/local-channel-runner.ts +40 -19
  339. package/src/wirings/channel/local/local-eventhub-service.test.ts +2 -2
  340. package/src/wirings/channel/local/local-eventhub-service.ts +2 -2
  341. package/src/wirings/channel/log-channels.ts +1 -1
  342. package/src/wirings/channel/pikku-abstract-channel-handler.ts +1 -1
  343. package/src/wirings/channel/serverless/index.ts +5 -1
  344. package/src/wirings/channel/serverless/serverless-channel-runner.ts +57 -36
  345. package/src/wirings/cli/channel/cli-channel-runner.ts +1 -1
  346. package/src/wirings/cli/channel/index.ts +1 -1
  347. package/src/wirings/cli/cli-runner.test.ts +10 -10
  348. package/src/wirings/cli/cli-runner.ts +28 -14
  349. package/src/wirings/cli/cli.types.ts +14 -14
  350. package/src/wirings/cli/command-parser.test.ts +9 -9
  351. package/src/wirings/cli/command-parser.ts +1 -1
  352. package/src/wirings/cli/define-cli-commands.ts +24 -0
  353. package/src/wirings/cli/index.ts +10 -4
  354. package/src/wirings/http/http-routes.test.ts +322 -0
  355. package/src/wirings/http/http-routes.ts +198 -0
  356. package/src/wirings/http/http-runner.test.ts +12 -20
  357. package/src/wirings/http/http-runner.ts +101 -51
  358. package/src/wirings/http/http.types.ts +119 -48
  359. package/src/wirings/http/index.ts +16 -4
  360. package/src/wirings/http/log-http-routes.ts +1 -1
  361. package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
  362. package/src/wirings/http/pikku-fetch-http-response.ts +12 -5
  363. package/src/wirings/http/routers/http-router.ts +1 -1
  364. package/src/wirings/http/routers/path-to-regex.test.ts +1 -1
  365. package/src/wirings/http/routers/path-to-regex.ts +4 -3
  366. package/src/wirings/mcp/index.ts +27 -3
  367. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
  368. package/src/wirings/mcp/mcp-endpoint-registry.ts +5 -1
  369. package/src/wirings/mcp/mcp-runner.ts +48 -65
  370. package/src/wirings/mcp/mcp.types.ts +5 -5
  371. package/src/wirings/node/index.ts +2 -0
  372. package/src/wirings/node/node.types.ts +23 -0
  373. package/src/wirings/oauth2/index.ts +3 -0
  374. package/src/wirings/oauth2/oauth2-client.test.ts +929 -0
  375. package/src/wirings/oauth2/oauth2-client.ts +335 -0
  376. package/src/wirings/oauth2/oauth2.types.ts +69 -0
  377. package/src/wirings/oauth2/wire-oauth2-credential.ts +23 -0
  378. package/src/wirings/queue/index.ts +13 -2
  379. package/src/wirings/queue/queue-runner.test.ts +142 -73
  380. package/src/wirings/queue/queue-runner.ts +18 -14
  381. package/src/wirings/queue/queue.types.ts +5 -5
  382. package/src/wirings/queue/register-queue-helper.ts +3 -5
  383. package/src/wirings/queue/validate-worker-config.test.ts +108 -0
  384. package/src/wirings/queue/validate-worker-config.ts +4 -1
  385. package/src/wirings/rpc/index.ts +3 -1
  386. package/src/wirings/rpc/rpc-runner.ts +254 -41
  387. package/src/wirings/rpc/rpc-types.ts +28 -4
  388. package/src/wirings/rpc/wire-addon.ts +20 -0
  389. package/src/wirings/scheduler/index.ts +6 -4
  390. package/src/wirings/scheduler/log-schedulers.ts +1 -1
  391. package/src/wirings/scheduler/scheduler-runner.test.ts +78 -45
  392. package/src/wirings/scheduler/scheduler-runner.ts +20 -27
  393. package/src/wirings/scheduler/scheduler.types.ts +2 -2
  394. package/src/wirings/secret/index.ts +9 -0
  395. package/src/wirings/secret/secret.types.ts +32 -0
  396. package/src/wirings/secret/validate-secret-definitions.test.ts +140 -0
  397. package/src/wirings/secret/validate-secret-definitions.ts +82 -0
  398. package/src/wirings/trigger/index.ts +10 -2
  399. package/src/wirings/trigger/pikku-trigger-service.ts +112 -0
  400. package/src/wirings/trigger/trigger-runner.test.ts +79 -0
  401. package/src/wirings/trigger/trigger-runner.ts +80 -41
  402. package/src/wirings/trigger/trigger.types.ts +144 -22
  403. package/src/wirings/variable/index.ts +8 -0
  404. package/src/wirings/variable/validate-variable-definitions.test.ts +91 -0
  405. package/src/wirings/variable/validate-variable-definitions.ts +69 -0
  406. package/src/wirings/variable/variable.types.ts +22 -0
  407. package/src/wirings/workflow/dsl/index.ts +1 -0
  408. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +9 -1
  409. package/src/wirings/workflow/dsl/workflow-runner.ts +4 -3
  410. package/src/wirings/workflow/graph/graph-node.ts +1 -6
  411. package/src/wirings/workflow/graph/graph-runner.test.ts +487 -0
  412. package/src/wirings/workflow/graph/graph-runner.ts +496 -374
  413. package/src/wirings/workflow/graph/index.ts +14 -3
  414. package/src/wirings/workflow/graph/template.test.ts +49 -0
  415. package/src/wirings/workflow/graph/template.ts +42 -0
  416. package/src/wirings/workflow/graph/wire-workflow-graph.ts +29 -0
  417. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -22
  418. package/src/wirings/workflow/index.ts +21 -10
  419. package/src/wirings/workflow/pikku-workflow-service.test.ts +200 -0
  420. package/src/wirings/workflow/pikku-workflow-service.ts +308 -105
  421. package/src/wirings/workflow/workflow-helpers.test.ts +129 -0
  422. package/src/wirings/workflow/workflow-helpers.ts +79 -0
  423. package/src/wirings/workflow/workflow.types.ts +47 -92
  424. package/tsconfig.tsbuildinfo +1 -1
  425. package/dist/wirings/forge-node/forge-node.types.d.ts +0 -120
  426. package/dist/wirings/forge-node/forge-node.types.js +0 -38
  427. package/dist/wirings/forge-node/index.d.ts +0 -1
  428. package/dist/wirings/forge-node/index.js +0 -1
  429. package/dist/wirings/workflow/wire-workflow.d.ts +0 -42
  430. package/dist/wirings/workflow/wire-workflow.js +0 -53
  431. package/dist/wirings/workflow/workflow-utils.d.ts +0 -23
  432. package/dist/wirings/workflow/workflow-utils.js +0 -66
  433. package/src/wirings/forge-node/forge-node.types.ts +0 -135
  434. package/src/wirings/forge-node/index.ts +0 -1
  435. package/src/wirings/workflow/wire-workflow.ts +0 -94
  436. package/src/wirings/workflow/workflow-utils.ts +0 -120
@@ -1,20 +1,19 @@
1
- import {
1
+ import type {
2
2
  CoreHTTPFunctionWiring,
3
3
  RunHTTPWiringOptions,
4
- RunHTTPWiringParams,
5
4
  PikkuHTTP,
6
5
  PikkuHTTPRequest,
7
6
  PikkuHTTPResponse,
8
7
  HTTPWiringMeta,
9
8
  HTTPMethod,
10
9
  } from './http.types.js'
11
- import {
10
+ import type {
12
11
  CorePikkuFunction,
13
12
  CorePikkuFunctionSessionless,
14
13
  CorePikkuPermission,
15
14
  CorePermissionGroup,
16
15
  } from '../../function/functions.types.js'
17
- import {
16
+ import type {
18
17
  CoreUserSession,
19
18
  CorePikkuMiddleware,
20
19
  CorePikkuMiddlewareGroup,
@@ -22,21 +21,43 @@ import {
22
21
  PikkuWire,
23
22
  PikkuWiringTypes,
24
23
  } from '../../types/core.types.js'
25
- import { NotFoundError } from '../../errors/errors.js'
24
+ import { NotFoundError, PikkuMissingMetaError } from '../../errors/errors.js'
26
25
  import {
27
26
  closeWireServices,
28
27
  createWeakUID,
29
28
  isSerializable,
30
29
  } from '../../utils.js'
30
+ import {
31
+ getSingletonServices,
32
+ getCreateWireServices,
33
+ } from '../../pikku-state.js'
31
34
  import { PikkuSessionService } from '../../services/user-session-service.js'
32
35
  import { handleHTTPError } from '../../handle-error.js'
33
36
  import { pikkuState } from '../../pikku-state.js'
34
37
  import { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js'
35
38
  import { PikkuFetchHTTPRequest } from './pikku-fetch-http-request.js'
36
- import { PikkuChannel } from '../channel/channel.types.js'
39
+ import type { PikkuChannel } from '../channel/channel.types.js'
37
40
  import { addFunction, runPikkuFunc } from '../../function/function-runner.js'
38
41
  import { httpRouter } from './routers/http-router.js'
39
- import { startWorkflowByHttpWire } from '../workflow/workflow-utils.js'
42
+ import { validateSchema } from '../../schema.js'
43
+ import { runMiddleware } from '../../middleware-runner.js'
44
+
45
+ /**
46
+ * Extract headers from a PikkuHTTPRequest based on the schema keys
47
+ */
48
+ function extractHeadersFromRequest(
49
+ request: PikkuHTTPRequest,
50
+ headerKeys: string[]
51
+ ): Record<string, string | string[] | undefined> {
52
+ const headers: Record<string, string | string[] | undefined> = {}
53
+ for (const headerName of headerKeys) {
54
+ const value = request.header(headerName)
55
+ if (value !== null) {
56
+ headers[headerName] = value
57
+ }
58
+ }
59
+ return headers
60
+ }
40
61
 
41
62
  /**
42
63
  * Registers HTTP middleware for a specific route pattern.
@@ -157,10 +178,12 @@ export const wireHTTP = <
157
178
  const httpMeta = pikkuState(null, 'http', 'meta')
158
179
  const routeMeta = httpMeta[httpWiring.method][httpWiring.route]
159
180
  if (!routeMeta) {
160
- throw new Error('Route metadata not found')
181
+ throw new PikkuMissingMetaError(
182
+ `Missing generated metadata for HTTP route '${httpWiring.method.toUpperCase()} ${httpWiring.route}'`
183
+ )
161
184
  }
162
185
  if (httpWiring.func) {
163
- addFunction(routeMeta.pikkuFuncName, httpWiring.func)
186
+ addFunction(routeMeta.pikkuFuncId, httpWiring.func)
164
187
  }
165
188
  const routes = pikkuState(null, 'http', 'routes')
166
189
  if (!routes.has(httpWiring.method)) {
@@ -281,6 +304,20 @@ const executeRoute = async (
281
304
  // Attach URL parameters to the request object
282
305
  http?.request?.setParams(params)
283
306
 
307
+ // Validate request headers if schema is defined
308
+ if (meta.headersSchemaName && http.request && singletonServices.schema) {
309
+ const headerKeys = singletonServices.schema.getSchemaKeys(
310
+ meta.headersSchemaName
311
+ )
312
+ const rawHeaders = extractHeadersFromRequest(http.request, headerKeys)
313
+ await validateSchema(
314
+ singletonServices.logger,
315
+ singletonServices.schema,
316
+ meta.headersSchemaName,
317
+ rawHeaders
318
+ )
319
+ }
320
+
284
321
  const requiresSession = route.auth !== false
285
322
  let wireServices: any
286
323
  let result: any
@@ -294,7 +331,13 @@ const executeRoute = async (
294
331
  throw new Error("Can't skip trying to get user session if auth is required")
295
332
  }
296
333
 
297
- const data = () => http.request!.data()
334
+ let cachedData: unknown | undefined
335
+ const data = async () => {
336
+ if (cachedData === undefined) {
337
+ cachedData = await http.request!.data()
338
+ }
339
+ return cachedData
340
+ }
298
341
  let channel: PikkuChannel<unknown, unknown> | undefined
299
342
 
300
343
  if (matchedRoute.route.sse) {
@@ -324,24 +367,19 @@ const executeRoute = async (
324
367
  }
325
368
  }
326
369
 
327
- const wire: PikkuWire = { http, channel, session: userSession }
328
-
329
- if (matchedRoute.meta.workflow === true) {
330
- await startWorkflowByHttpWire(
331
- singletonServices,
332
- createWireServices,
333
- matchedRoute,
334
- wire
335
- )
336
- return wireServices
337
- ? { wireServices, result: http.response }
338
- : { result: http.response }
370
+ const wire: PikkuWire = {
371
+ http,
372
+ channel,
373
+ session: userSession.get() as CoreUserSession | undefined,
374
+ setSession: (s: any) => userSession.setInitial(s),
375
+ getSession: () => userSession.get(),
376
+ hasSessionChanged: () => userSession.sessionChanged,
339
377
  }
340
378
 
341
379
  result = await runPikkuFunc(
342
380
  'http',
343
381
  `${meta.method}:${meta.route}`,
344
- meta.pikkuFuncName,
382
+ meta.pikkuFuncId,
345
383
  {
346
384
  singletonServices,
347
385
  createWireServices,
@@ -354,20 +392,20 @@ const executeRoute = async (
354
392
  coerceDataFromSchema: options.coerceDataFromSchema,
355
393
  tags: route.tags,
356
394
  wire,
395
+ sessionService: userSession,
357
396
  }
358
397
  )
359
-
360
- // Respond with either a binary or JSON response based on configuration
361
- if (route.returnsJSON === false) {
362
- http?.response?.arrayBuffer(result)
363
- } else {
364
- http?.response?.json(result)
398
+ if (!matchedRoute.route.sse) {
399
+ if (result === undefined || result === null) {
400
+ http?.response?.status(204)
401
+ } else if (route.returnsJSON === false) {
402
+ http?.response?.arrayBuffer(result)
403
+ } else {
404
+ http?.response?.status(200)
405
+ http?.response?.json(result)
406
+ }
365
407
  }
366
408
 
367
- http?.response?.status(200)
368
- // TODO: Evaluate if the response stream should be explicitly ended.
369
- // http?.response?.end()
370
-
371
409
  return wireServices ? { result, wireServices } : { result }
372
410
  }
373
411
 
@@ -383,12 +421,12 @@ const executeRoute = async (
383
421
  * @template In Expected input data type.
384
422
  * @template Out Expected output data type.
385
423
  * @param {Request} request - The native Fetch API Request object.
386
- * @param {RunHTTPWiringOptions & RunHTTPWiringParams} params - Additional options including services and session management.
424
+ * @param {RunHTTPWiringOptions} params - Additional options including services and session management.
387
425
  * @returns {Promise<Response>} A promise that resolves to a Fetch API Response object.
388
426
  */
389
427
  export const fetch = async <In, Out>(
390
428
  request: Request,
391
- params: RunHTTPWiringOptions & RunHTTPWiringParams
429
+ params: RunHTTPWiringOptions = {}
392
430
  ): Promise<Response> => {
393
431
  const pikkuResponse = new PikkuFetchHTTPResponse()
394
432
  await fetchData<In, Out>(request, pikkuResponse, params)
@@ -404,12 +442,12 @@ export const fetch = async <In, Out>(
404
442
  * @template In Expected input data type.
405
443
  * @template Out Expected output data type.
406
444
  * @param {Request | PikkuHTTPRequest} request - The request object.
407
- * @param {RunHTTPWiringOptions & RunHTTPWiringParams} params - Execution options including services and session configuration.
445
+ * @param {RunHTTPWiringOptions} params - Execution options including services and session configuration.
408
446
  * @returns {Promise<PikkuFetchHTTPResponse>} A promise that resolves to a PikkuFetchHTTPResponse object.
409
447
  */
410
448
  export const pikkuFetch = async <In, Out>(
411
449
  request: Request | PikkuHTTPRequest,
412
- params: RunHTTPWiringOptions & RunHTTPWiringParams
450
+ params: RunHTTPWiringOptions = {}
413
451
  ): Promise<PikkuFetchHTTPResponse> => {
414
452
  const pikkuResponse = new PikkuFetchHTTPResponse()
415
453
  await fetchData<In, Out>(request, pikkuResponse, params)
@@ -431,43 +469,56 @@ export const pikkuFetch = async <In, Out>(
431
469
  * @template Out Expected output data type.
432
470
  * @param {Request | PikkuHTTPRequest} request - The incoming HTTP request.
433
471
  * @param {PikkuHTTPResponse} response - The response object to be populated.
434
- * @param {RunHTTPWiringOptions & RunHTTPWiringParams} options - Options such as singleton services, session handling, and error configuration.
472
+ * @param {RunHTTPWiringOptions} options - Options such as singleton services, session handling, and error configuration.
435
473
  * @returns {Promise<Out | void>} The output from the route handler or void if an error occurred.
436
474
  */
437
475
  export const fetchData = async <In, Out>(
438
476
  request: Request | PikkuHTTPRequest,
439
477
  response: PikkuHTTPResponse,
440
478
  {
441
- singletonServices,
442
- createWireServices,
443
479
  skipUserSession = false,
444
480
  respondWith404 = true,
445
481
  logWarningsForStatusCodes = [],
446
482
  coerceDataFromSchema = true,
447
483
  bubbleErrors = false,
448
484
  generateRequestId,
449
- }: RunHTTPWiringOptions & RunHTTPWiringParams
485
+ }: RunHTTPWiringOptions = {}
450
486
  ): Promise<Out | void> => {
451
- const requestId =
452
- (request as any).getHeader?.('x-request-id') ||
453
- generateRequestId?.() ||
454
- createWeakUID()
487
+ const singletonServices = getSingletonServices()
488
+ const createWireServices = getCreateWireServices()
455
489
  let wireServices: WireServices<typeof singletonServices> | undefined
456
490
  let result: Out
457
491
 
458
492
  // Combine the request and response into one wire object
459
- const http = createHTTPWire(
460
- request instanceof Request ? new PikkuFetchHTTPRequest(request) : request,
461
- response
462
- )
493
+ const pikkuRequest =
494
+ request instanceof Request ? new PikkuFetchHTTPRequest(request) : request
495
+ let requestId: string | null = null
496
+ try {
497
+ requestId = pikkuRequest.header('x-request-id')
498
+ } catch {}
499
+ requestId = requestId || generateRequestId?.() || createWeakUID()
500
+ const http = createHTTPWire(pikkuRequest, response)
463
501
  const apiType = http!.request!.method()
464
502
  const apiRoute = http!.request!.path()
465
503
 
466
504
  // Locate the matching route based on the HTTP method and path
467
505
  const matchedRoute = getMatchingRoute(apiType, apiRoute)
468
506
  try {
469
- // If no route matches, log the occurrence and throw a NotFoundError
470
507
  if (!matchedRoute) {
508
+ if (apiType.toLowerCase() === 'options') {
509
+ const httpGroups = pikkuState(null, 'middleware', 'httpGroup')
510
+ const globalMiddleware = httpGroups['*']
511
+ const wire: PikkuWire = { http: http! }
512
+ if (globalMiddleware) {
513
+ await runMiddleware(
514
+ singletonServices,
515
+ wire,
516
+ globalMiddleware as CorePikkuMiddleware[]
517
+ )
518
+ }
519
+ response.status(204).json(undefined as any)
520
+ return
521
+ }
471
522
  singletonServices.logger.info({
472
523
  message: 'Route not found',
473
524
  apiRoute,
@@ -491,7 +542,6 @@ export const fetchData = async <In, Out>(
491
542
 
492
543
  return result
493
544
  } catch (e: any) {
494
- // Handle errors and, depending on configuration, bubble them up or respond with an error
495
545
  handleHTTPError(
496
546
  e,
497
547
  http,
@@ -1,10 +1,7 @@
1
1
  import type { SerializeOptions } from 'cookie'
2
+ import type { StandardSchemaV1 } from '@standard-schema/spec'
2
3
  import type { PikkuError } from '../../errors/error-handler.js'
3
4
  import type {
4
- CoreServices,
5
- CoreSingletonServices,
6
- CoreUserSession,
7
- CreateWireServices,
8
5
  CorePikkuMiddleware,
9
6
  CommonWireMeta,
10
7
  } from '../../types/core.types.js'
@@ -42,18 +39,9 @@ export type RunHTTPWiringOptions = Partial<{
42
39
  generateRequestId: () => string
43
40
  }>
44
41
 
45
- export type RunHTTPWiringParams = {
46
- singletonServices: CoreSingletonServices
47
- createWireServices: CreateWireServices<
48
- CoreSingletonServices,
49
- CoreServices<CoreSingletonServices>,
50
- CoreUserSession
51
- >
52
- }
53
-
54
42
  /**
55
43
  * Represents the HTTP methods supported for API HTTP wirings.
56
- t */
44
+ */
57
45
  export type HTTPMethod =
58
46
  | 'post'
59
47
  | 'get'
@@ -64,21 +52,41 @@ export type HTTPMethod =
64
52
  | 'options'
65
53
 
66
54
  /**
67
- * Represents an API HTTP wiring without a function, including metadata such as content type, route, and timeout settings.
55
+ * Header schema type for request header validation.
56
+ * Uses Standard Schema interface - works with Zod, Valibot, ArkType, Effect Schema, etc.
57
+ */
58
+ export type HTTPHeadersSchema = StandardSchemaV1<
59
+ Record<string, string | string[] | undefined>
60
+ >
61
+
62
+ /**
63
+ * Documentation config for OpenAPI generation
68
64
  */
69
- export type CoreHTTPFunction = {
65
+ export type HTTPRouteDocsConfig = {
66
+ description?: string
67
+ response?: string
68
+ errors?: Array<typeof PikkuError>
69
+ tags?: string[]
70
+ }
71
+
72
+ /**
73
+ * Common HTTP route configuration shared between wireHTTP and wireHTTPRoutes
74
+ */
75
+ export type HTTPRouteBaseConfig = {
70
76
  contentType?: 'xml' | 'json'
77
+ timeout?: number
78
+ tags?: string[]
79
+ headers?: HTTPHeadersSchema
80
+ docs?: HTTPRouteDocsConfig
81
+ }
82
+
83
+ /**
84
+ * Represents an API HTTP wiring without a function, including metadata such as content type, route, and timeout settings.
85
+ */
86
+ export type CoreHTTPFunction = HTTPRouteBaseConfig & {
71
87
  route: string
72
88
  eventChannel?: false
73
89
  returnsJSON?: false
74
- timeout?: number
75
- tags?: string[]
76
- docs?: Partial<{
77
- description: string
78
- response: string
79
- errors: Array<typeof PikkuError>
80
- tags: string[]
81
- }>
82
90
  }
83
91
  /**
84
92
  * Represents a http wire within Pikku, including a request and response.
@@ -121,12 +129,14 @@ export type CoreHTTPFunctionWiring<
121
129
  In,
122
130
  Out,
123
131
  any,
132
+ any,
124
133
  any
125
134
  > = CorePikkuFunction<In, Out>,
126
135
  PikkuFunctionSessionless extends CorePikkuFunctionSessionless<
127
136
  In,
128
137
  Out,
129
138
  any,
139
+ any,
130
140
  any
131
141
  > = CorePikkuFunctionSessionless<In, Out>,
132
142
  PikkuPermission extends CorePikkuPermission<
@@ -149,7 +159,6 @@ export type CoreHTTPFunctionWiring<
149
159
  >
150
160
  permissions?: CorePermissionGroup<PikkuPermission>
151
161
  auth?: true
152
- tags?: string[]
153
162
  middleware?: PikkuMiddleware[]
154
163
  sse?: undefined
155
164
  })
@@ -163,7 +172,6 @@ export type CoreHTTPFunctionWiring<
163
172
  >
164
173
  permissions?: undefined
165
174
  auth?: false
166
- tags?: string[]
167
175
  middleware?: PikkuMiddleware[]
168
176
  sse?: undefined
169
177
  })
@@ -177,9 +185,8 @@ export type CoreHTTPFunctionWiring<
177
185
  >
178
186
  permissions?: CorePermissionGroup<PikkuPermission>
179
187
  auth?: true
180
- sse?: boolean
181
- tags?: string[]
182
188
  middleware?: PikkuMiddleware[]
189
+ sse?: boolean
183
190
  })
184
191
  | (CoreHTTPFunction & {
185
192
  route: R
@@ -191,9 +198,8 @@ export type CoreHTTPFunctionWiring<
191
198
  >
192
199
  permissions?: undefined
193
200
  auth?: false
194
- sse?: boolean
195
- tags?: string[]
196
201
  middleware?: PikkuMiddleware[]
202
+ sse?: boolean
197
203
  })
198
204
  | (CoreHTTPFunction & {
199
205
  route: R
@@ -205,9 +211,8 @@ export type CoreHTTPFunctionWiring<
205
211
  >
206
212
  permissions?: CorePermissionGroup<PikkuPermission>
207
213
  auth?: true
208
- query?: Array<keyof In>
209
- tags?: string[]
210
214
  middleware?: PikkuMiddleware[]
215
+ query?: Array<keyof In>
211
216
  sse?: undefined
212
217
  })
213
218
  | (CoreHTTPFunction & {
@@ -220,24 +225,10 @@ export type CoreHTTPFunctionWiring<
220
225
  >
221
226
  permissions?: undefined
222
227
  auth?: false
223
- query?: Array<keyof In>
224
- tags?: string[]
225
228
  middleware?: PikkuMiddleware[]
229
+ query?: Array<keyof In>
226
230
  sse?: undefined
227
231
  })
228
- | {
229
- /** Route triggers a workflow matched by route/method from workflow wires.http */
230
- route: R
231
- method: HTTPMethod
232
- workflow: true
233
- func?: undefined
234
- permissions?: undefined
235
- auth?: undefined
236
- tags?: undefined
237
- middleware?: undefined
238
- returnsJSON?: undefined
239
- sse?: boolean
240
- }
241
232
 
242
233
  /**
243
234
  * Represents the input types for HTTP wiring metadata, including parameters, query, and body types.
@@ -257,8 +248,9 @@ export type HTTPWiringMeta = CommonWireMeta & {
257
248
  params?: string[]
258
249
  query?: string[]
259
250
  inputTypes?: HTTPFunctionMetaInputTypes
251
+ headersSchemaName?: string
260
252
  sse?: true
261
- workflow?: true
253
+ groupBasePath?: string
262
254
  }
263
255
  export type HTTPWiringsMeta = Record<HTTPMethod, Record<string, HTTPWiringMeta>>
264
256
 
@@ -305,3 +297,82 @@ export interface PikkuHTTPResponse<Out = unknown> {
305
297
  close?: () => void
306
298
  setMode?: (mode: 'stream') => void
307
299
  }
300
+
301
+ /**
302
+ * Single route configuration - supports all wireHTTP options
303
+ */
304
+ export type HTTPRouteConfig<
305
+ PikkuFunction extends
306
+ | CorePikkuFunction<any, any, any, any, any>
307
+ | CorePikkuFunctionSessionless<any, any, any, any, any> =
308
+ | CorePikkuFunction<any, any, any, any, any>
309
+ | CorePikkuFunctionSessionless<any, any, any, any, any>,
310
+ PikkuPermission extends CorePikkuPermission<
311
+ any,
312
+ any,
313
+ any
314
+ > = CorePikkuPermission<any>,
315
+ PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<
316
+ any,
317
+ any
318
+ >,
319
+ > = HTTPRouteBaseConfig & {
320
+ // Required
321
+ method: HTTPMethod
322
+ route: string
323
+ func: CorePikkuFunctionConfig<PikkuFunction, PikkuPermission, PikkuMiddleware>
324
+
325
+ // Auth & permissions
326
+ auth?: boolean
327
+ permissions?: CorePermissionGroup<PikkuPermission>
328
+
329
+ // Middleware
330
+ middleware?: PikkuMiddleware[]
331
+
332
+ // SSE support
333
+ sse?: boolean
334
+ }
335
+
336
+ /**
337
+ * Group-level configuration applied to all routes
338
+ */
339
+ export type HTTPRoutesGroupConfig<
340
+ PikkuPermission extends CorePikkuPermission<
341
+ any,
342
+ any,
343
+ any
344
+ > = CorePikkuPermission<any>,
345
+ PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<
346
+ any,
347
+ any
348
+ >,
349
+ > = {
350
+ basePath?: string
351
+ tags?: string[]
352
+ auth?: boolean
353
+ middleware?: PikkuMiddleware[]
354
+ permissions?: CorePermissionGroup<PikkuPermission>
355
+ }
356
+
357
+ /**
358
+ * Nested route map - allows hierarchical organization
359
+ * Can contain individual routes, nested maps, or contracts with config
360
+ */
361
+ export type HTTPRouteMap = {
362
+ [key: string]: HTTPRouteConfig | HTTPRouteMap | HTTPRouteContract
363
+ }
364
+
365
+ /**
366
+ * A route contract with optional group config (returned by defineRoutes)
367
+ */
368
+ export type HTTPRouteContract<T extends HTTPRouteMap = HTTPRouteMap> =
369
+ HTTPRoutesGroupConfig & {
370
+ routes: T
371
+ }
372
+
373
+ /**
374
+ * Full configuration for wireHTTPRoutes
375
+ */
376
+ export type WireHTTPRoutesConfig = HTTPRoutesGroupConfig & {
377
+ routes: HTTPRouteMap | HTTPRouteConfig[]
378
+ }
@@ -1,6 +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
 
5
5
  export {
6
6
  fetch,
@@ -10,4 +10,16 @@ export {
10
10
  addHTTPPermission,
11
11
  } from './http-runner.js'
12
12
 
13
- export type * from './http.types.js'
13
+ export { wireHTTPRoutes, defineHTTPRoutes } from './http-routes.js'
14
+
15
+ export type {
16
+ AssertHTTPWiringParams,
17
+ CoreHTTPFunctionWiring,
18
+ HTTPMethod,
19
+ HTTPRouteBaseConfig,
20
+ HTTPWiringsMeta,
21
+ PikkuHTTPRequest,
22
+ PikkuHTTPResponse,
23
+ PikkuQuery,
24
+ RunHTTPWiringOptions,
25
+ } from './http.types.js'
@@ -1,5 +1,5 @@
1
1
  import { pikkuState } from '../../pikku-state.js'
2
- import { Logger } from '../../services/index.js'
2
+ import type { Logger } from '../../services/index.js'
3
3
 
4
4
  /**
5
5
  * Logs all the loaded routes.
@@ -1,6 +1,6 @@
1
1
  import { parse as parseQuery } from 'picoquery'
2
2
  import { parse as parseCookie } from 'cookie'
3
- import { HTTPMethod, PikkuHTTPRequest, PikkuQuery } from './http.types.js'
3
+ import type { HTTPMethod, PikkuHTTPRequest, PikkuQuery } from './http.types.js'
4
4
  import { UnprocessableContentError } from '../../errors/errors.js'
5
5
 
6
6
  /**
@@ -1,8 +1,6 @@
1
- import { PikkuHTTPResponse } from './http.types.js'
2
- import {
3
- SerializeOptions as CookieSerializeOptions,
4
- serialize as serializeCookie,
5
- } from 'cookie'
1
+ import type { PikkuHTTPResponse } from './http.types.js'
2
+ import type { SerializeOptions as CookieSerializeOptions } from 'cookie'
3
+ import { serialize as serializeCookie } from 'cookie'
6
4
 
7
5
  export class PikkuFetchHTTPResponse implements PikkuHTTPResponse {
8
6
  #statusCode: number = 200
@@ -91,6 +89,15 @@ export class PikkuFetchHTTPResponse implements PikkuHTTPResponse {
91
89
  // }
92
90
 
93
91
  public redirect(location: string, status: number = 302): this {
92
+ if (
93
+ !location.startsWith('/') &&
94
+ !location.startsWith('https://') &&
95
+ !location.startsWith('http://')
96
+ ) {
97
+ throw new Error(
98
+ 'Invalid redirect location: must be a relative path or absolute URL'
99
+ )
100
+ }
94
101
  this.#statusCode = status
95
102
  this.header('Location', location)
96
103
  return this
@@ -1,4 +1,4 @@
1
- import { HTTPMethod } from '../http.types.js'
1
+ import type { HTTPMethod } from '../http.types.js'
2
2
  import { PathToRegexRouter } from './path-to-regex.js'
3
3
 
4
4
  export type MatchResult = {
@@ -2,7 +2,7 @@ import { test, describe, beforeEach } from 'node:test'
2
2
  import * as assert from 'node:assert/strict'
3
3
  import { PathToRegexRouter } from './path-to-regex.js'
4
4
  import { resetPikkuState, pikkuState } from '../../../pikku-state.js'
5
- import { HTTPMethod } from '../http.types.js'
5
+ import type { HTTPMethod } from '../http.types.js'
6
6
 
7
7
  describe('PathToRegexRouter', () => {
8
8
  let router: PathToRegexRouter
@@ -1,6 +1,7 @@
1
- import { match, MatchFunction } from 'path-to-regexp'
2
- import { MatchResult, Router } from './http-router.js'
3
- import { HTTPMethod } from '../http.types.js'
1
+ import type { MatchFunction } from 'path-to-regexp'
2
+ import { match } from 'path-to-regexp'
3
+ import type { MatchResult, Router } from './http-router.js'
4
+ import type { HTTPMethod } from '../http.types.js'
4
5
  import { pikkuState } from '../../../pikku-state.js'
5
6
 
6
7
  interface CompiledRoute {
@@ -1,3 +1,27 @@
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 {
3
+ MCPError,
4
+ wireMCPResource,
5
+ wireMCPPrompt,
6
+ runMCPResource,
7
+ runMCPTool,
8
+ runMCPPrompt,
9
+ } from './mcp-runner.js'
10
+ export {
11
+ getMCPResourcesMeta,
12
+ getMCPToolsMeta,
13
+ getMCPPromptsMeta,
14
+ } from './mcp-runner.js'
15
+ export type {
16
+ AssertMCPResourceURIParams,
17
+ CoreMCPPrompt,
18
+ CoreMCPResource,
19
+ CoreMCPTool,
20
+ MCPPromptResponse,
21
+ MCPResourceMeta,
22
+ MCPResourceResponse,
23
+ MCPToolMeta,
24
+ MCPToolResponse,
25
+ MCPPromptMeta,
26
+ PikkuMCP,
27
+ } from './mcp.types.js'