@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,6 +1,7 @@
1
1
  import { test } from 'node:test'
2
2
  import assert from 'node:assert'
3
3
  import {
4
+ pikkuAuth,
4
5
  pikkuPermission,
5
6
  pikkuMiddleware,
6
7
  pikkuPermissionFactory,
@@ -21,8 +22,8 @@ test('pikkuMiddleware returns the same function', async () => {
21
22
 
22
23
  test('pikkuPermissionFactory creates a factory function', async () => {
23
24
  const factory = pikkuPermissionFactory<{ role: string }>(({ role }) => {
24
- return pikkuPermission(async ({ logger }, data, { initialSession }) => {
25
- return (initialSession as any)?.role === role
25
+ return pikkuPermission(async ({ logger }, data, { session }) => {
26
+ return (session as any)?.role === role
26
27
  })
27
28
  })
28
29
 
@@ -67,3 +68,42 @@ test('pikkuMiddlewareFactory returns the same factory', async () => {
67
68
  const wrappedFactory = pikkuMiddlewareFactory(originalFactory)
68
69
  assert.strictEqual(wrappedFactory, originalFactory)
69
70
  })
71
+
72
+ test('pikkuAuth returns a 3-arg wrapper function', async () => {
73
+ const authFn = async (_services, session) => !!session
74
+ const wrapped = pikkuAuth(authFn)
75
+ assert.strictEqual(typeof wrapped, 'function')
76
+ assert.strictEqual(wrapped.length, 3)
77
+ })
78
+
79
+ test('pikkuAuth wrapper extracts session from wire and calls auth function', async () => {
80
+ let receivedSession = null
81
+ const authFn = async (_services, session) => {
82
+ receivedSession = session
83
+ return session.role === 'admin'
84
+ }
85
+ const wrapped = pikkuAuth(authFn)
86
+ const result = await wrapped({}, null, { session: { role: 'admin' } })
87
+ assert.strictEqual(result, true)
88
+ assert.deepStrictEqual(receivedSession, { role: 'admin' })
89
+ })
90
+
91
+ test('pikkuAuth wrapper returns false when no session', async () => {
92
+ const authFn = async (_services, session) => !!session
93
+ const wrapped = pikkuAuth(authFn)
94
+ const result = await wrapped({}, null, { session: null })
95
+ assert.strictEqual(result, false)
96
+ })
97
+
98
+ test('pikkuAuth config object syntax works', async () => {
99
+ const authFn = async (_services, session) => !!session
100
+ const wrapped = pikkuAuth({
101
+ func: authFn,
102
+ name: 'Is Authenticated',
103
+ description: 'Checks if user has a session',
104
+ })
105
+ assert.strictEqual(typeof wrapped, 'function')
106
+ assert.strictEqual(wrapped.length, 3)
107
+ const result = await wrapped({}, null, { session: { id: '1' } })
108
+ assert.strictEqual(result, true)
109
+ })
@@ -3,8 +3,8 @@ import * as assert from 'node:assert'
3
3
  import { addFunction, runPikkuFunc } from './function-runner.js'
4
4
  import { addMiddleware, addPermission } from '../index.js'
5
5
  import { resetPikkuState, pikkuState } from '../pikku-state.js'
6
- import { CoreServices, CorePikkuMiddleware } from '../types/core.types.js'
7
- import { CorePermissionGroup } from './functions.types.js'
6
+ import type { CoreServices, CorePikkuMiddleware } from '../types/core.types.js'
7
+ import type { CorePermissionGroup } from './functions.types.js'
8
8
 
9
9
  beforeEach(() => {
10
10
  resetPikkuState()
@@ -22,7 +22,7 @@ const addTestFunction = (funcName: string, funcConfig: any) => {
22
22
  ? funcConfig.tags.map((tag: string) => ({ type: 'tag' as const, tag }))
23
23
  : undefined
24
24
  pikkuState(null, 'function', 'meta')[funcName] = {
25
- pikkuFuncName: funcName,
25
+ pikkuFuncId: funcName,
26
26
  inputSchemaName: null,
27
27
  outputSchemaName: null,
28
28
  middleware,
@@ -152,14 +152,8 @@ describe('runPikkuFunc - Integration Tests', () => {
152
152
  )
153
153
 
154
154
  assert.equal(result, 'success')
155
- // Order: wiringTags → wiringPermissions funcTags funcPermissions
156
- assert.deepEqual(executionOrder, [
157
- 'wiringTag',
158
- 'wiringPermission',
159
- 'funcTag',
160
- 'funcPermission',
161
- 'main',
162
- ])
155
+ // Order: wiringTags → main (short-circuit on first passing group)
156
+ assert.deepEqual(executionOrder, ['wiringTag', 'main'])
163
157
  })
164
158
 
165
159
  test('should throw specific error for wiring tag permission failures', async () => {
@@ -340,11 +334,10 @@ describe('runPikkuFunc - Integration Tests', () => {
340
334
  )
341
335
 
342
336
  assert.equal(result, 'success')
343
- // Should execute tag permissions first, then function permissions
337
+ // Should execute tag permissions and short-circuit before function permissions
344
338
  assert.deepEqual(executionOrder, [
345
339
  'arrayPermission1',
346
340
  'arrayPermission2',
347
- 'objectPermission',
348
341
  'main',
349
342
  ])
350
343
  })
@@ -1,8 +1,12 @@
1
1
  import { runMiddleware, combineMiddleware } from '../middleware-runner.js'
2
+ import {
3
+ combineChannelMiddleware,
4
+ wrapChannelWithMiddleware,
5
+ } from '../wirings/channel/channel-middleware-runner.js'
2
6
  import { runPermissions } from '../permissions.js'
3
7
  import { pikkuState } from '../pikku-state.js'
4
8
  import { coerceTopLevelDataFromSchema, validateSchema } from '../schema.js'
5
- import {
9
+ import type {
6
10
  CoreServices,
7
11
  CoreUserSession,
8
12
  CorePikkuMiddleware,
@@ -14,21 +18,24 @@ import {
14
18
  CreateWireServices,
15
19
  CoreConfig,
16
20
  } from '../types/core.types.js'
17
- import {
21
+ import type { CorePikkuChannelMiddleware } from '../wirings/channel/channel.types.js'
22
+ import type {
18
23
  CorePermissionGroup,
19
24
  CorePikkuFunctionConfig,
20
25
  CorePikkuPermission,
21
26
  } from './functions.types.js'
22
- import { SessionService } from '../services/user-session-service.js'
23
- import { ForbiddenError } from '../errors/errors.js'
27
+ import { parseVersionedId } from '../version.js'
28
+ import type { SessionService } from '../services/user-session-service.js'
29
+ import { createFunctionSessionWireProps } from '../services/user-session-service.js'
30
+ import { ForbiddenError, ReadonlySessionError } from '../errors/errors.js'
24
31
  import { rpcService } from '../wirings/rpc/rpc-runner.js'
25
32
  import { closeWireServices } from '../utils.js'
26
33
 
27
34
  /**
28
- * Get or create singleton services for an external package.
35
+ * Get or create singleton services for an addon package.
29
36
  * Services are cached in pikkuState to avoid recreation on each call.
30
37
  *
31
- * @param packageName - The external package name
38
+ * @param packageName - The addon package name
32
39
  * @param parentServices - The parent/caller's singleton services (used as base)
33
40
  * @returns The package's singleton services
34
41
  */
@@ -75,6 +82,30 @@ export const addFunction = (
75
82
  pikkuState(packageName, 'function', 'functions').set(funcName, funcConfig)
76
83
  }
77
84
 
85
+ export const getFunctionNames = (
86
+ packageName: string | null = null
87
+ ): string[] => {
88
+ const functionsMeta = pikkuState(packageName, 'function', 'meta')
89
+ return Object.keys(functionsMeta)
90
+ }
91
+
92
+ export const getAllFunctionNames = (): string[] => {
93
+ const functions: string[] = []
94
+
95
+ const mainFunctionsMeta = pikkuState(null, 'function', 'meta')
96
+ functions.push(...Object.keys(mainFunctionsMeta))
97
+
98
+ const addons = pikkuState(null, 'rpc', 'addons')
99
+ for (const [namespace, config] of addons) {
100
+ const packageFunctionsMeta = pikkuState(config.package, 'function', 'meta')
101
+ for (const funcName of Object.keys(packageFunctionsMeta)) {
102
+ functions.push(`${namespace}:${funcName}`)
103
+ }
104
+ }
105
+
106
+ return functions
107
+ }
108
+
78
109
  export const runPikkuFuncDirectly = async <In, Out>(
79
110
  funcName: string,
80
111
  allServices: CoreServices,
@@ -89,10 +120,9 @@ export const runPikkuFuncDirectly = async <In, Out>(
89
120
  if (!funcConfig) {
90
121
  throw new Error(`Function not found: ${funcName}`)
91
122
  }
92
- // Inject session into wire
93
123
  const wireWithSession = {
94
124
  ...wire,
95
- session: userSession,
125
+ ...(userSession && createFunctionSessionWireProps(userSession)),
96
126
  }
97
127
  return (await funcConfig.func(allServices, data, wireWithSession)) as Out
98
128
  }
@@ -108,11 +138,14 @@ export const runPikkuFunc = async <In = any, Out = any>(
108
138
  auth: wiringAuth,
109
139
  inheritedMiddleware,
110
140
  wireMiddleware,
141
+ inheritedChannelMiddleware,
142
+ wireChannelMiddleware,
111
143
  inheritedPermissions,
112
144
  wirePermissions,
113
145
  coerceDataFromSchema,
114
146
  tags = [],
115
147
  wire,
148
+ sessionService,
116
149
  packageName = null,
117
150
  }: {
118
151
  singletonServices: CoreSingletonServices
@@ -121,27 +154,46 @@ export const runPikkuFunc = async <In = any, Out = any>(
121
154
  auth?: boolean
122
155
  inheritedMiddleware?: MiddlewareMetadata[]
123
156
  wireMiddleware?: CorePikkuMiddleware[]
157
+ inheritedChannelMiddleware?: MiddlewareMetadata[]
158
+ wireChannelMiddleware?: CorePikkuChannelMiddleware[]
124
159
  inheritedPermissions?: PermissionMetadata[]
125
160
  wirePermissions?: CorePermissionGroup | CorePikkuPermission[]
126
161
  coerceDataFromSchema?: boolean
127
162
  tags?: string[]
128
163
  wire: PikkuWire
164
+ sessionService?: SessionService<CoreUserSession>
129
165
  packageName?: string | null
130
166
  }
131
167
  ): Promise<Out> => {
132
- const funcConfig = pikkuState(packageName, 'function', 'functions').get(
133
- funcName
134
- )
168
+ wire.wireType ??= wireType
169
+ wire.wireId ??= wireId
170
+
171
+ const funcMap = pikkuState(packageName, 'function', 'functions')
172
+ let funcConfig = funcMap.get(funcName)
173
+ const allMeta = pikkuState(packageName, 'function', 'meta')
174
+ let funcMeta = allMeta[funcName]
175
+
176
+ if (!funcConfig || !funcMeta) {
177
+ const { baseName, version } = parseVersionedId(funcName)
178
+ if (version !== null) {
179
+ funcConfig = funcConfig || funcMap.get(baseName)
180
+ funcMeta = funcMeta || allMeta[baseName]
181
+ if (funcConfig && funcMeta) {
182
+ singletonServices.logger.warn(
183
+ `Version '${funcName}' not registered, resolved to '${baseName}'`
184
+ )
185
+ }
186
+ }
187
+ }
188
+
135
189
  if (!funcConfig) {
136
190
  throw new Error(`Function not found: ${funcName}`)
137
191
  }
138
- const allMeta = pikkuState(packageName, 'function', 'meta')
139
- const funcMeta = allMeta[funcName]
140
192
  if (!funcMeta) {
141
193
  throw new Error(`Function meta not found: ${funcName}`)
142
194
  }
143
195
 
144
- // For external packages, get or create their singleton services
196
+ // For addon packages, get or create their singleton services
145
197
  const resolvedSingletonServices = packageName
146
198
  ? await getOrCreatePackageSingletonServices(packageName, singletonServices)
147
199
  : singletonServices
@@ -155,35 +207,73 @@ export const runPikkuFunc = async <In = any, Out = any>(
155
207
  }
156
208
  }
157
209
 
210
+ const allChannelMiddleware = combineChannelMiddleware(wireType, wireId, {
211
+ wireInheritedChannelMiddleware: inheritedChannelMiddleware,
212
+ wireChannelMiddleware,
213
+ packageName,
214
+ })
215
+
216
+ const resolvedWire =
217
+ allChannelMiddleware.length > 0 && wire.channel
218
+ ? wrapChannelWithMiddleware(
219
+ wire,
220
+ resolvedSingletonServices,
221
+ allChannelMiddleware
222
+ )
223
+ : wire
224
+
158
225
  // Convert tags to PermissionMetadata and merge with inheritedPermissions
159
- const mergedInheritedPermissions: PermissionMetadata[] = [
160
- ...(inheritedPermissions || []),
161
- ...(tags?.map((tag) => ({ type: 'tag' as const, tag })) || []),
162
- ]
226
+ let mergedInheritedPermissions: PermissionMetadata[]
227
+ if (tags && tags.length > 0) {
228
+ mergedInheritedPermissions = [
229
+ ...(inheritedPermissions || []),
230
+ ...tags.map((tag) => ({ type: 'tag' as const, tag })),
231
+ ]
232
+ } else {
233
+ mergedInheritedPermissions = inheritedPermissions || []
234
+ }
163
235
 
164
236
  // Helper function to run permissions and execute the function
165
237
  const executeFunction = async () => {
166
- const initialSession = wire.session?.freezeInitial()
167
-
168
- const wireWithInitialSession: PikkuWire = {
169
- ...wire,
170
- initialSession,
238
+ if (sessionService) {
239
+ resolvedWire.session = sessionService.freezeInitial()
240
+ resolvedWire.setSession = (s: any) => sessionService.set(s)
241
+ resolvedWire.clearSession = () => sessionService.clear()
242
+ resolvedWire.getSession = () => sessionService.get()
243
+ resolvedWire.hasSessionChanged = () => sessionService.sessionChanged
171
244
  }
172
245
 
173
- if (wiringAuth === true || funcConfig.auth === true) {
174
- // This means it was explicitly enabled in either wiring or function and has to be respected
175
- if (!initialSession) {
246
+ const session = resolvedWire.session
247
+
248
+ if (funcMeta.sessionless) {
249
+ if (wiringAuth === true || funcConfig.auth === true) {
250
+ if (!session) {
251
+ throw new ForbiddenError('Authentication required')
252
+ }
253
+ }
254
+ } else if (funcMeta.sessionless === false) {
255
+ if (wiringAuth === false || funcConfig.auth === false) {
256
+ resolvedSingletonServices.logger.warn(
257
+ `Function '${funcName}' requires a session but auth was explicitly disabled — use pikkuSessionlessFunc instead.`
258
+ )
259
+ }
260
+ if (!session) {
176
261
  throw new ForbiddenError('Authentication required')
177
262
  }
178
- }
179
- if (wiringAuth === undefined && funcConfig.auth === undefined) {
180
- // We always default to requiring auth unless explicitly disabled
181
- if (!initialSession) {
182
- // TODO: Critical, we need to figure out how to make this work with different wirings
183
- // throw new ForbiddenError('Authentication required')
263
+ } else {
264
+ // TODO: Remove after a couple of releases — backward compat for
265
+ // generated metadata that doesn't include the `sessionless` field yet.
266
+ if (wiringAuth === true || funcConfig.auth === true) {
267
+ if (!session) {
268
+ throw new ForbiddenError('Authentication required')
269
+ }
184
270
  }
185
271
  }
186
272
 
273
+ if ((session as any)?.readonly && !funcMeta.readonly) {
274
+ throw new ReadonlySessionError()
275
+ }
276
+
187
277
  // Evaluate the data from the lazy function
188
278
  const actualData = await data()
189
279
 
@@ -204,33 +294,51 @@ export const runPikkuFunc = async <In = any, Out = any>(
204
294
  }
205
295
  }
206
296
 
207
- await runPermissions(wireType, wireId, {
208
- wireInheritedPermissions: mergedInheritedPermissions,
209
- wirePermissions: wirePermissions,
210
- funcInheritedPermissions: funcMeta.permissions,
211
- funcPermissions: funcConfig.permissions,
212
- services: resolvedSingletonServices,
213
- wire: { ...wireWithInitialSession, rpc: undefined } as any,
214
- data: actualData,
215
- packageName,
216
- })
297
+ if (
298
+ mergedInheritedPermissions.length > 0 ||
299
+ wirePermissions ||
300
+ funcMeta.permissions ||
301
+ funcConfig.permissions
302
+ ) {
303
+ await runPermissions(wireType, wireId, {
304
+ wireInheritedPermissions: mergedInheritedPermissions,
305
+ wirePermissions: wirePermissions,
306
+ funcInheritedPermissions: funcMeta.permissions,
307
+ funcPermissions: funcConfig.permissions,
308
+ services: resolvedSingletonServices,
309
+ wire: resolvedWire as any,
310
+ data: actualData,
311
+ packageName,
312
+ })
313
+ }
217
314
 
218
315
  const wireServices = await resolvedCreateWireServices?.(
219
316
  resolvedSingletonServices,
220
- wireWithInitialSession
317
+ resolvedWire
221
318
  )
222
319
  try {
223
- const services = { ...resolvedSingletonServices, ...wireServices }
224
- const rpc = rpcService.getContextRPCService(
225
- services,
226
- wireWithInitialSession
227
- )
228
- return await funcConfig.func(services, actualData, {
229
- ...wireWithInitialSession,
230
- rpc,
320
+ const services =
321
+ wireServices && Object.keys(wireServices).length > 0
322
+ ? { ...resolvedSingletonServices, ...wireServices }
323
+ : resolvedSingletonServices
324
+ Object.defineProperty(resolvedWire, 'rpc', {
325
+ get() {
326
+ const rpc = rpcService.getContextRPCService(services, resolvedWire, {
327
+ sessionService,
328
+ })
329
+ Object.defineProperty(resolvedWire, 'rpc', {
330
+ value: rpc,
331
+ writable: true,
332
+ configurable: true,
333
+ })
334
+ return rpc
335
+ },
336
+ configurable: true,
337
+ enumerable: true,
231
338
  })
339
+ return await funcConfig.func(services, actualData, resolvedWire)
232
340
  } finally {
233
- if (wireServices) {
341
+ if (wireServices && Object.keys(wireServices).length > 0) {
234
342
  await closeWireServices(resolvedSingletonServices.logger, wireServices)
235
343
  }
236
344
  }
@@ -247,7 +355,7 @@ export const runPikkuFunc = async <In = any, Out = any>(
247
355
  if (allMiddleware.length > 0) {
248
356
  return (await runMiddleware<CorePikkuMiddleware>(
249
357
  resolvedSingletonServices,
250
- wire,
358
+ resolvedWire,
251
359
  allMiddleware,
252
360
  executeFunction
253
361
  )) as Out