@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
package/CHANGELOG.md CHANGED
@@ -1,3 +1,60 @@
1
+ ## 0.12.0
2
+
3
+ ## 0.12.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 62a8725: Rename 'external' to 'addon' throughout the codebase. All types, functions, config keys, and CLI options previously named `external` or `External` are now named `addon` or `Addon` (e.g. `ExternalPackageConfig` → `AddonConfig`, `externalPackages` → `addons`, `function-external` → `function-addon`).
8
+ - a3bdb0d: Add AI middleware hooks for per-tool-call lifecycle and post-step observability:
9
+
10
+ - `beforeToolCall` / `afterToolCall`: per-tool-call hooks for logging, caching, input sanitization, and result transformation
11
+ - `afterStep`: post-step observation hook with full step context (text, toolCalls, toolResults, usage, finishReason)
12
+ - `onError`: error-specific hook for alerting and diagnostics (non-throwing, won't affect error flow)
13
+
14
+ - e0349ff: Fix critical security vulnerability in channel message handler: `validateAuth` was being called with `channelHandler` (always truthy) instead of the actual user session, meaning auth checks always passed and unauthenticated clients could send messages to protected channels. Also fix an information disclosure issue where the full channel config object was being logged on unhandled messages.
15
+ - 62a8725: Internalize singleton services management in the serverless channel runner, consistent with how other runners handle it. `createWireServices` and `singletonServices` no longer need to be passed explicitly to serverless channel runner calls.
16
+ - e04531f: Security hardening: improve CORS handling, redirect validation, and error logging in the HTTP runner. Export additional internal utilities needed by native runtime adapters.
17
+ - 62a8725: Fix security issue in `function-runner`: functions declared with `pikkuFunc` (which always require a session) now always throw `ForbiddenError` when called without a session, even if the wiring has `auth: false`. Previously a misconfigured wiring could bypass authentication entirely — the runner only logged a warning instead of blocking the call.
18
+ - a83efb8: Handle OPTIONS preflight requests automatically in fetchData when no explicit OPTIONS route is matched. Runs global HTTP middleware (e.g. CORS) and returns 204. Remove redundant startWorkflowRun and streamAgentRun pass-through functions from addon-console.
19
+ - 8eed717: Add `readonly` flag to function config and runtime enforcement. Functions can be marked `readonly: true` in their config. At runtime, if a session has `readonly: true`, only functions marked as readonly can be called — otherwise a `ReadonlySessionError` (403) is thrown.
20
+ - 62a8725: `pikku versions check` now prints rich, human-readable output for all contract version errors instead of raw error codes. Each error type (PKU861–PKU865) shows the function name, separate input/output schema hashes with a `prev → current` arrow, and clear next-step instructions.
21
+
22
+ The version manifest now stores separate `inputHash` and `outputHash` per version entry (backward-compatible — old string-hash manifests still load and validate correctly). `VersionValidateError` gains optional detail fields (`functionKey`, `version`, `previousInputHash`, `currentInputHash`, `previousOutputHash`, `currentOutputHash`, `nextVersion`, `latestVersion`, `expectedNextVersion`) for use by tooling.
23
+
24
+ - 62a8725: Replace config-based addon declarations with the new `wireAddon()` code-based API. Addons are now declared directly in wiring files using `wireAddon({ name, package, rpcEndpoint?, auth?, tags? })` instead of the `addons` field in `pikku.config.json`. The inspector reads these declarations from the TypeScript AST at build time.
25
+ - 62a8725: Add `secretOverrides` and `variableOverrides` support to `wireAddon()`. These optional maps allow an app to remap an addon's secret/variable keys to its own names (e.g. `secretOverrides: { SENDGRID_API_KEY: 'MY_EMAIL_API_KEY' }`). The inspector validates that all override keys exist in the app's own secrets/variables definitions.
26
+
27
+ ### New Features
28
+
29
+ - AI agents with `pikkuAIAgent()` — define agents with tools, sub-agents, memory, structured output, and streaming via SSE
30
+ - AI middleware hooks (`pikkuAIMiddleware`) for input, stream, and output transformation
31
+ - Tool approval flow — suspend agent execution pending human approval
32
+ - Channel middleware (`pikkuChannelMiddleware`) for intercepting and transforming channel events
33
+ - Remote RPC — call functions across servers with `rpc.remote()` and `DeploymentService`
34
+ - HTTP route groups with `wireHTTPRoutes` for shared basePath, tags, and auth
35
+ - Workflow graph engine with `createGraph()` type-safe builder
36
+ - Workflow HTTP helpers: `workflow()`, `workflowStart()`, `workflowStatus()`, `graphStart()`
37
+ - Workflow DSL with rich step types (branch, parallel, fanout, switch, filter)
38
+ - Trigger system with `wireTrigger()` and `wireTriggerSource()`
39
+ - OAuth2 support with `wireOAuth2Credential` and `OAuth2Client`
40
+ - Secret and variable declarations with `wireSecret()` and `wireVariable()`
41
+ - `TypedSecretService` and `TypedVariablesService` for compile-time validated access
42
+ - `defineCLICommands` and `defineChannelRoutes` for external composition
43
+ - Built-in CORS middleware
44
+ - `disabled: true` support on all wirings and functions
45
+ - `createWireServices` and `createConfig` are now optional
46
+ - `InMemoryWorkflowService` and `InMemoryTriggerService` for testing
47
+
48
+ ### Breaking Changes
49
+
50
+ - `PikkuInteraction` → `PikkuWire`, `CreateSessionServices` → `CreateWireServices`
51
+ - `wireForgeCredential` → `wireCredential`
52
+ - `startWorkflowByWire` → `startWorkflowByHTTPWire`
53
+ - Renamed all `forge` → `node` naming
54
+ - Renamed `credential` → `secret` across core types
55
+ - `WorkflowService.createRun` signature changed (new `inline`, `graphHash` params)
56
+ - Auth enforced by default for `pikkuFunc`
57
+
1
58
  ## 0.11.0
2
59
 
3
60
  ## 0.11.2
@@ -6,8 +63,6 @@
6
63
 
7
64
  - db9c7bf: Add workflow graph system with type-safe builder
8
65
 
9
- ## 0.11.2
10
-
11
66
  ### Features
12
67
 
13
68
  - f35e89da: Add workflow graph system with type-safe builder
@@ -0,0 +1,2 @@
1
+ export declare const encryptJSON: (secret: string, value: unknown) => Promise<string>;
2
+ export declare const decryptJSON: <T>(secret: string, token: string) => Promise<T>;
@@ -0,0 +1,78 @@
1
+ const encoder = new TextEncoder();
2
+ const decoder = new TextDecoder();
3
+ const getSubtle = () => {
4
+ const crypto = globalThis.crypto;
5
+ if (!crypto?.subtle) {
6
+ throw new Error('WebCrypto not available');
7
+ }
8
+ return crypto.subtle;
9
+ };
10
+ const base64Encode = (bytes) => {
11
+ if (typeof Buffer !== 'undefined') {
12
+ return Buffer.from(bytes).toString('base64');
13
+ }
14
+ let binary = '';
15
+ for (let i = 0; i < bytes.length; i++) {
16
+ binary += String.fromCharCode(bytes[i]);
17
+ }
18
+ return btoa(binary);
19
+ };
20
+ const base64Decode = (input) => {
21
+ if (typeof Buffer !== 'undefined') {
22
+ return new Uint8Array(Buffer.from(input, 'base64'));
23
+ }
24
+ const binary = atob(input);
25
+ const bytes = new Uint8Array(binary.length);
26
+ for (let i = 0; i < binary.length; i++) {
27
+ bytes[i] = binary.charCodeAt(i);
28
+ }
29
+ return bytes;
30
+ };
31
+ const toBase64Url = (bytes) => {
32
+ return base64Encode(bytes)
33
+ .replace(/\+/g, '-')
34
+ .replace(/\//g, '_')
35
+ .replace(/=+$/g, '');
36
+ };
37
+ const fromBase64Url = (input) => {
38
+ let base64 = input.replace(/-/g, '+').replace(/_/g, '/');
39
+ while (base64.length % 4 !== 0)
40
+ base64 += '=';
41
+ return base64Decode(base64);
42
+ };
43
+ const deriveKey = async (secret) => {
44
+ const subtle = getSubtle();
45
+ const hash = await subtle.digest('SHA-256', encoder.encode(secret));
46
+ return subtle.importKey('raw', hash, { name: 'AES-GCM' }, false, [
47
+ 'encrypt',
48
+ 'decrypt',
49
+ ]);
50
+ };
51
+ export const encryptJSON = async (secret, value) => {
52
+ const crypto = globalThis.crypto;
53
+ if (!crypto?.getRandomValues) {
54
+ throw new Error('WebCrypto not available');
55
+ }
56
+ const subtle = getSubtle();
57
+ const iv = crypto.getRandomValues(new Uint8Array(12));
58
+ const key = await deriveKey(secret);
59
+ const plaintext = encoder.encode(JSON.stringify(value));
60
+ const encrypted = await subtle.encrypt({ name: 'AES-GCM', iv }, key, plaintext);
61
+ const cipherBytes = new Uint8Array(encrypted);
62
+ const out = new Uint8Array(iv.length + cipherBytes.length);
63
+ out.set(iv, 0);
64
+ out.set(cipherBytes, iv.length);
65
+ return toBase64Url(out);
66
+ };
67
+ export const decryptJSON = async (secret, token) => {
68
+ const subtle = getSubtle();
69
+ const data = fromBase64Url(token);
70
+ if (data.length < 13) {
71
+ throw new Error('Invalid encrypted payload');
72
+ }
73
+ const iv = data.slice(0, 12);
74
+ const ciphertext = data.slice(12);
75
+ const key = await deriveKey(secret);
76
+ const decrypted = await subtle.decrypt({ name: 'AES-GCM', iv }, key, ciphertext);
77
+ return JSON.parse(decoder.decode(new Uint8Array(decrypted)));
78
+ };
@@ -4,6 +4,8 @@
4
4
  import { PikkuError } from './error-handler.js';
5
5
  export declare class InvalidMiddlewareWireError extends PikkuError {
6
6
  }
7
+ export declare class PikkuMissingMetaError extends PikkuError {
8
+ }
7
9
  /**
8
10
  * The server cannot or will not process the request due to client error (e.g., malformed request syntax).
9
11
  * @group Error
@@ -40,6 +42,12 @@ export declare class PaymentRequiredError extends PikkuError {
40
42
  */
41
43
  export declare class ForbiddenError extends PikkuError {
42
44
  }
45
+ /**
46
+ * The session is readonly and cannot access a non-readonly function.
47
+ * @group Error
48
+ */
49
+ export declare class ReadonlySessionError extends PikkuError {
50
+ }
43
51
  /**
44
52
  * The request was made from an origin that is not permitted to access this resource.
45
53
  * @group Error
@@ -190,3 +198,9 @@ export declare class HTTPVersionNotSupportedError extends PikkuError {
190
198
  */
191
199
  export declare class MaxComputeTimeReachedError extends PikkuError {
192
200
  }
201
+ /**
202
+ * A required schema was not found during validation.
203
+ * @group Error
204
+ */
205
+ export declare class MissingSchemaError extends PikkuError {
206
+ }
@@ -8,6 +8,12 @@ addError(InvalidMiddlewareWireError, {
8
8
  status: 500,
9
9
  message: 'The middleware wire is invalid for the current wiring type.',
10
10
  });
11
+ export class PikkuMissingMetaError extends PikkuError {
12
+ }
13
+ addError(PikkuMissingMetaError, {
14
+ status: 500,
15
+ message: 'Required metadata is missing',
16
+ });
11
17
  /**
12
18
  * The server cannot or will not process the request due to client error (e.g., malformed request syntax).
13
19
  * @group Error
@@ -66,6 +72,16 @@ addError(ForbiddenError, {
66
72
  status: 403,
67
73
  message: 'The client does not have permission to access the requested resource.',
68
74
  });
75
+ /**
76
+ * The session is readonly and cannot access a non-readonly function.
77
+ * @group Error
78
+ */
79
+ export class ReadonlySessionError extends PikkuError {
80
+ }
81
+ addError(ReadonlySessionError, {
82
+ status: 403,
83
+ message: 'The session is readonly and cannot access this function.',
84
+ });
69
85
  /**
70
86
  * The request was made from an origin that is not permitted to access this resource.
71
87
  * @group Error
@@ -321,3 +337,13 @@ addError(MaxComputeTimeReachedError, {
321
337
  status: 524,
322
338
  message: 'The server took too long to complete the request, reaching the maximum compute time allowed.',
323
339
  });
340
+ /**
341
+ * A required schema was not found during validation.
342
+ * @group Error
343
+ */
344
+ export class MissingSchemaError extends PikkuError {
345
+ }
346
+ addError(MissingSchemaError, {
347
+ status: 500,
348
+ message: 'A required schema was not found. Ensure schema generation has been run.',
349
+ });
@@ -1,2 +1,2 @@
1
- export * from './error-handler.js';
2
1
  export * from './errors.js';
2
+ export { PikkuError, addError, addErrors } from './error-handler.js';
@@ -1,2 +1,2 @@
1
- export * from './error-handler.js';
2
1
  export * from './errors.js';
2
+ export { PikkuError, addError, addErrors } from './error-handler.js';
@@ -1,19 +1,25 @@
1
- import { CoreServices, CoreUserSession, CorePikkuMiddleware, PikkuWiringTypes, PikkuWire, MiddlewareMetadata, PermissionMetadata, CoreSingletonServices, CreateWireServices } from '../types/core.types.js';
2
- import { CorePermissionGroup, CorePikkuFunctionConfig, CorePikkuPermission } from './functions.types.js';
3
- import { SessionService } from '../services/user-session-service.js';
1
+ import type { CoreServices, CoreUserSession, CorePikkuMiddleware, PikkuWiringTypes, PikkuWire, MiddlewareMetadata, PermissionMetadata, CoreSingletonServices, CreateWireServices } from '../types/core.types.js';
2
+ import type { CorePikkuChannelMiddleware } from '../wirings/channel/channel.types.js';
3
+ import type { CorePermissionGroup, CorePikkuFunctionConfig, CorePikkuPermission } from './functions.types.js';
4
+ import type { SessionService } from '../services/user-session-service.js';
4
5
  export declare const addFunction: (funcName: string, funcConfig: CorePikkuFunctionConfig<any, any>, packageName?: string | null) => void;
6
+ export declare const getFunctionNames: (packageName?: string | null) => string[];
7
+ export declare const getAllFunctionNames: () => string[];
5
8
  export declare const runPikkuFuncDirectly: <In, Out>(funcName: string, allServices: CoreServices, wire: PikkuWire, data: In, userSession?: SessionService<CoreUserSession>, packageName?: string | null) => Promise<Out>;
6
- export declare const runPikkuFunc: <In = any, Out = any>(wireType: PikkuWiringTypes, wireId: string, funcName: string, { singletonServices, createWireServices, data, auth: wiringAuth, inheritedMiddleware, wireMiddleware, inheritedPermissions, wirePermissions, coerceDataFromSchema, tags, wire, packageName, }: {
9
+ export declare const runPikkuFunc: <In = any, Out = any>(wireType: PikkuWiringTypes, wireId: string, funcName: string, { singletonServices, createWireServices, data, auth: wiringAuth, inheritedMiddleware, wireMiddleware, inheritedChannelMiddleware, wireChannelMiddleware, inheritedPermissions, wirePermissions, coerceDataFromSchema, tags, wire, sessionService, packageName, }: {
7
10
  singletonServices: CoreSingletonServices;
8
11
  createWireServices?: CreateWireServices;
9
12
  data: () => Promise<In> | In;
10
13
  auth?: boolean;
11
14
  inheritedMiddleware?: MiddlewareMetadata[];
12
15
  wireMiddleware?: CorePikkuMiddleware[];
16
+ inheritedChannelMiddleware?: MiddlewareMetadata[];
17
+ wireChannelMiddleware?: CorePikkuChannelMiddleware[];
13
18
  inheritedPermissions?: PermissionMetadata[];
14
19
  wirePermissions?: CorePermissionGroup | CorePikkuPermission[];
15
20
  coerceDataFromSchema?: boolean;
16
21
  tags?: string[];
17
22
  wire: PikkuWire;
23
+ sessionService?: SessionService<CoreUserSession>;
18
24
  packageName?: string | null;
19
25
  }) => Promise<Out>;
@@ -1,15 +1,18 @@
1
1
  import { runMiddleware, combineMiddleware } from '../middleware-runner.js';
2
+ import { combineChannelMiddleware, wrapChannelWithMiddleware, } from '../wirings/channel/channel-middleware-runner.js';
2
3
  import { runPermissions } from '../permissions.js';
3
4
  import { pikkuState } from '../pikku-state.js';
4
5
  import { coerceTopLevelDataFromSchema, validateSchema } from '../schema.js';
5
- import { ForbiddenError } from '../errors/errors.js';
6
+ import { parseVersionedId } from '../version.js';
7
+ import { createFunctionSessionWireProps } from '../services/user-session-service.js';
8
+ import { ForbiddenError, ReadonlySessionError } from '../errors/errors.js';
6
9
  import { rpcService } from '../wirings/rpc/rpc-runner.js';
7
10
  import { closeWireServices } from '../utils.js';
8
11
  /**
9
- * Get or create singleton services for an external package.
12
+ * Get or create singleton services for an addon package.
10
13
  * Services are cached in pikkuState to avoid recreation on each call.
11
14
  *
12
- * @param packageName - The external package name
15
+ * @param packageName - The addon package name
13
16
  * @param parentServices - The parent/caller's singleton services (used as base)
14
17
  * @returns The package's singleton services
15
18
  */
@@ -39,29 +42,58 @@ const getOrCreatePackageSingletonServices = async (packageName, parentServices)
39
42
  export const addFunction = (funcName, funcConfig, packageName = null) => {
40
43
  pikkuState(packageName, 'function', 'functions').set(funcName, funcConfig);
41
44
  };
45
+ export const getFunctionNames = (packageName = null) => {
46
+ const functionsMeta = pikkuState(packageName, 'function', 'meta');
47
+ return Object.keys(functionsMeta);
48
+ };
49
+ export const getAllFunctionNames = () => {
50
+ const functions = [];
51
+ const mainFunctionsMeta = pikkuState(null, 'function', 'meta');
52
+ functions.push(...Object.keys(mainFunctionsMeta));
53
+ const addons = pikkuState(null, 'rpc', 'addons');
54
+ for (const [namespace, config] of addons) {
55
+ const packageFunctionsMeta = pikkuState(config.package, 'function', 'meta');
56
+ for (const funcName of Object.keys(packageFunctionsMeta)) {
57
+ functions.push(`${namespace}:${funcName}`);
58
+ }
59
+ }
60
+ return functions;
61
+ };
42
62
  export const runPikkuFuncDirectly = async (funcName, allServices, wire, data, userSession, packageName = null) => {
43
63
  const funcConfig = pikkuState(packageName, 'function', 'functions').get(funcName);
44
64
  if (!funcConfig) {
45
65
  throw new Error(`Function not found: ${funcName}`);
46
66
  }
47
- // Inject session into wire
48
67
  const wireWithSession = {
49
68
  ...wire,
50
- session: userSession,
69
+ ...(userSession && createFunctionSessionWireProps(userSession)),
51
70
  };
52
71
  return (await funcConfig.func(allServices, data, wireWithSession));
53
72
  };
54
- export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServices, createWireServices, data, auth: wiringAuth, inheritedMiddleware, wireMiddleware, inheritedPermissions, wirePermissions, coerceDataFromSchema, tags = [], wire, packageName = null, }) => {
55
- const funcConfig = pikkuState(packageName, 'function', 'functions').get(funcName);
73
+ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServices, createWireServices, data, auth: wiringAuth, inheritedMiddleware, wireMiddleware, inheritedChannelMiddleware, wireChannelMiddleware, inheritedPermissions, wirePermissions, coerceDataFromSchema, tags = [], wire, sessionService, packageName = null, }) => {
74
+ wire.wireType ??= wireType;
75
+ wire.wireId ??= wireId;
76
+ const funcMap = pikkuState(packageName, 'function', 'functions');
77
+ let funcConfig = funcMap.get(funcName);
78
+ const allMeta = pikkuState(packageName, 'function', 'meta');
79
+ let funcMeta = allMeta[funcName];
80
+ if (!funcConfig || !funcMeta) {
81
+ const { baseName, version } = parseVersionedId(funcName);
82
+ if (version !== null) {
83
+ funcConfig = funcConfig || funcMap.get(baseName);
84
+ funcMeta = funcMeta || allMeta[baseName];
85
+ if (funcConfig && funcMeta) {
86
+ singletonServices.logger.warn(`Version '${funcName}' not registered, resolved to '${baseName}'`);
87
+ }
88
+ }
89
+ }
56
90
  if (!funcConfig) {
57
91
  throw new Error(`Function not found: ${funcName}`);
58
92
  }
59
- const allMeta = pikkuState(packageName, 'function', 'meta');
60
- const funcMeta = allMeta[funcName];
61
93
  if (!funcMeta) {
62
94
  throw new Error(`Function meta not found: ${funcName}`);
63
95
  }
64
- // For external packages, get or create their singleton services
96
+ // For addon packages, get or create their singleton services
65
97
  const resolvedSingletonServices = packageName
66
98
  ? await getOrCreatePackageSingletonServices(packageName, singletonServices)
67
99
  : singletonServices;
@@ -73,31 +105,62 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
73
105
  resolvedCreateWireServices = factories.createWireServices;
74
106
  }
75
107
  }
108
+ const allChannelMiddleware = combineChannelMiddleware(wireType, wireId, {
109
+ wireInheritedChannelMiddleware: inheritedChannelMiddleware,
110
+ wireChannelMiddleware,
111
+ packageName,
112
+ });
113
+ const resolvedWire = allChannelMiddleware.length > 0 && wire.channel
114
+ ? wrapChannelWithMiddleware(wire, resolvedSingletonServices, allChannelMiddleware)
115
+ : wire;
76
116
  // Convert tags to PermissionMetadata and merge with inheritedPermissions
77
- const mergedInheritedPermissions = [
78
- ...(inheritedPermissions || []),
79
- ...(tags?.map((tag) => ({ type: 'tag', tag })) || []),
80
- ];
117
+ let mergedInheritedPermissions;
118
+ if (tags && tags.length > 0) {
119
+ mergedInheritedPermissions = [
120
+ ...(inheritedPermissions || []),
121
+ ...tags.map((tag) => ({ type: 'tag', tag })),
122
+ ];
123
+ }
124
+ else {
125
+ mergedInheritedPermissions = inheritedPermissions || [];
126
+ }
81
127
  // Helper function to run permissions and execute the function
82
128
  const executeFunction = async () => {
83
- const initialSession = wire.session?.freezeInitial();
84
- const wireWithInitialSession = {
85
- ...wire,
86
- initialSession,
87
- };
88
- if (wiringAuth === true || funcConfig.auth === true) {
89
- // This means it was explicitly enabled in either wiring or function and has to be respected
90
- if (!initialSession) {
129
+ if (sessionService) {
130
+ resolvedWire.session = sessionService.freezeInitial();
131
+ resolvedWire.setSession = (s) => sessionService.set(s);
132
+ resolvedWire.clearSession = () => sessionService.clear();
133
+ resolvedWire.getSession = () => sessionService.get();
134
+ resolvedWire.hasSessionChanged = () => sessionService.sessionChanged;
135
+ }
136
+ const session = resolvedWire.session;
137
+ if (funcMeta.sessionless) {
138
+ if (wiringAuth === true || funcConfig.auth === true) {
139
+ if (!session) {
140
+ throw new ForbiddenError('Authentication required');
141
+ }
142
+ }
143
+ }
144
+ else if (funcMeta.sessionless === false) {
145
+ if (wiringAuth === false || funcConfig.auth === false) {
146
+ resolvedSingletonServices.logger.warn(`Function '${funcName}' requires a session but auth was explicitly disabled — use pikkuSessionlessFunc instead.`);
147
+ }
148
+ if (!session) {
91
149
  throw new ForbiddenError('Authentication required');
92
150
  }
93
151
  }
94
- if (wiringAuth === undefined && funcConfig.auth === undefined) {
95
- // We always default to requiring auth unless explicitly disabled
96
- if (!initialSession) {
97
- // TODO: Critical, we need to figure out how to make this work with different wirings
98
- // throw new ForbiddenError('Authentication required')
152
+ else {
153
+ // TODO: Remove after a couple of releases backward compat for
154
+ // generated metadata that doesn't include the `sessionless` field yet.
155
+ if (wiringAuth === true || funcConfig.auth === true) {
156
+ if (!session) {
157
+ throw new ForbiddenError('Authentication required');
158
+ }
99
159
  }
100
160
  }
161
+ if (session?.readonly && !funcMeta.readonly) {
162
+ throw new ReadonlySessionError();
163
+ }
101
164
  // Evaluate the data from the lazy function
102
165
  const actualData = await data();
103
166
  // Validate and coerce data if schema is defined
@@ -110,27 +173,45 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
110
173
  coerceTopLevelDataFromSchema(inputSchemaName, actualData, packageName);
111
174
  }
112
175
  }
113
- await runPermissions(wireType, wireId, {
114
- wireInheritedPermissions: mergedInheritedPermissions,
115
- wirePermissions: wirePermissions,
116
- funcInheritedPermissions: funcMeta.permissions,
117
- funcPermissions: funcConfig.permissions,
118
- services: resolvedSingletonServices,
119
- wire: { ...wireWithInitialSession, rpc: undefined },
120
- data: actualData,
121
- packageName,
122
- });
123
- const wireServices = await resolvedCreateWireServices?.(resolvedSingletonServices, wireWithInitialSession);
176
+ if (mergedInheritedPermissions.length > 0 ||
177
+ wirePermissions ||
178
+ funcMeta.permissions ||
179
+ funcConfig.permissions) {
180
+ await runPermissions(wireType, wireId, {
181
+ wireInheritedPermissions: mergedInheritedPermissions,
182
+ wirePermissions: wirePermissions,
183
+ funcInheritedPermissions: funcMeta.permissions,
184
+ funcPermissions: funcConfig.permissions,
185
+ services: resolvedSingletonServices,
186
+ wire: resolvedWire,
187
+ data: actualData,
188
+ packageName,
189
+ });
190
+ }
191
+ const wireServices = await resolvedCreateWireServices?.(resolvedSingletonServices, resolvedWire);
124
192
  try {
125
- const services = { ...resolvedSingletonServices, ...wireServices };
126
- const rpc = rpcService.getContextRPCService(services, wireWithInitialSession);
127
- return await funcConfig.func(services, actualData, {
128
- ...wireWithInitialSession,
129
- rpc,
193
+ const services = wireServices && Object.keys(wireServices).length > 0
194
+ ? { ...resolvedSingletonServices, ...wireServices }
195
+ : resolvedSingletonServices;
196
+ Object.defineProperty(resolvedWire, 'rpc', {
197
+ get() {
198
+ const rpc = rpcService.getContextRPCService(services, resolvedWire, {
199
+ sessionService,
200
+ });
201
+ Object.defineProperty(resolvedWire, 'rpc', {
202
+ value: rpc,
203
+ writable: true,
204
+ configurable: true,
205
+ });
206
+ return rpc;
207
+ },
208
+ configurable: true,
209
+ enumerable: true,
130
210
  });
211
+ return await funcConfig.func(services, actualData, resolvedWire);
131
212
  }
132
213
  finally {
133
- if (wireServices) {
214
+ if (wireServices && Object.keys(wireServices).length > 0) {
134
215
  await closeWireServices(resolvedSingletonServices.logger, wireServices);
135
216
  }
136
217
  }
@@ -143,7 +224,7 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
143
224
  packageName,
144
225
  });
145
226
  if (allMiddleware.length > 0) {
146
- return (await runMiddleware(resolvedSingletonServices, wire, allMiddleware, executeFunction));
227
+ return (await runMiddleware(resolvedSingletonServices, resolvedWire, allMiddleware, executeFunction));
147
228
  }
148
229
  return (await executeFunction());
149
230
  };