@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
@@ -0,0 +1,328 @@
1
+ import type {
2
+ CorePermissionGroup,
3
+ CorePikkuPermission,
4
+ } from '../../function/functions.types.js'
5
+ import type {
6
+ CorePikkuMiddleware,
7
+ MiddlewareMetadata,
8
+ PermissionMetadata,
9
+ } from '../../types/core.types.js'
10
+ import type { PikkuChannel } from '../channel/channel.types.js'
11
+ import type { CorePikkuChannelMiddleware } from '../channel/channel.types.js'
12
+
13
+ export interface AIThread {
14
+ id: string
15
+ resourceId: string
16
+ title?: string
17
+ metadata?: Record<string, unknown>
18
+ createdAt: Date
19
+ updatedAt: Date
20
+ }
21
+
22
+ export interface AIToolCall {
23
+ id: string
24
+ name: string
25
+ args: Record<string, unknown>
26
+ }
27
+
28
+ export interface AIToolResult {
29
+ id: string
30
+ name: string
31
+ result: string
32
+ }
33
+
34
+ export interface AIMessage {
35
+ id: string
36
+ role: 'system' | 'user' | 'assistant' | 'tool'
37
+ content?: string
38
+ toolCalls?: AIToolCall[]
39
+ toolResults?: AIToolResult[]
40
+ createdAt: Date
41
+ }
42
+
43
+ export interface AIAgentStep {
44
+ usage: { inputTokens: number; outputTokens: number }
45
+ toolCalls?: { name: string; args: Record<string, unknown>; result: string }[]
46
+ }
47
+
48
+ export interface AIAgentInput {
49
+ message: string
50
+ threadId: string
51
+ resourceId: string
52
+ }
53
+
54
+ export interface AIAgentOutput {
55
+ runId: string
56
+ text: string
57
+ object?: unknown
58
+ threadId: string
59
+ steps: AIAgentStep[]
60
+ usage: { inputTokens: number; outputTokens: number }
61
+ }
62
+
63
+ export interface AIAgentToolDef {
64
+ name: string
65
+ description: string
66
+ inputSchema: Record<string, unknown>
67
+ execute: (input: unknown) => Promise<unknown>
68
+ needsApproval?: boolean
69
+ }
70
+
71
+ export interface PikkuAIMiddlewareHooks<
72
+ State extends Record<string, unknown> = Record<string, unknown>,
73
+ Services = any,
74
+ > {
75
+ modifyInput?: (
76
+ services: Services,
77
+ ctx: { messages: AIMessage[]; instructions: string }
78
+ ) =>
79
+ | Promise<{ messages: AIMessage[]; instructions: string }>
80
+ | { messages: AIMessage[]; instructions: string }
81
+
82
+ modifyOutputStream?: (
83
+ services: Services,
84
+ ctx: {
85
+ event: AIStreamEvent
86
+ allEvents: readonly AIStreamEvent[]
87
+ state: State
88
+ }
89
+ ) => Promise<AIStreamEvent | null> | AIStreamEvent | null
90
+
91
+ modifyOutput?: (
92
+ services: Services,
93
+ ctx: {
94
+ text: string
95
+ messages: AIMessage[]
96
+ usage: { inputTokens: number; outputTokens: number }
97
+ }
98
+ ) =>
99
+ | Promise<{ text: string; messages: AIMessage[] }>
100
+ | { text: string; messages: AIMessage[] }
101
+
102
+ beforeToolCall?: (
103
+ services: Services,
104
+ ctx: {
105
+ toolName: string
106
+ toolCallId: string
107
+ args: Record<string, unknown>
108
+ }
109
+ ) =>
110
+ | Promise<{ args: Record<string, unknown> } | void>
111
+ | { args: Record<string, unknown> }
112
+ | void
113
+
114
+ afterToolCall?: (
115
+ services: Services,
116
+ ctx: {
117
+ toolName: string
118
+ toolCallId: string
119
+ args: Record<string, unknown>
120
+ result: unknown
121
+ durationMs: number
122
+ }
123
+ ) => Promise<{ result: unknown } | void> | { result: unknown } | void
124
+
125
+ afterStep?: (
126
+ services: Services,
127
+ ctx: {
128
+ stepNumber: number
129
+ text: string
130
+ toolCalls: { toolCallId: string; toolName: string; args: unknown }[]
131
+ toolResults: { toolCallId: string; toolName: string; result: unknown }[]
132
+ usage: { inputTokens: number; outputTokens: number }
133
+ finishReason: string
134
+ }
135
+ ) => Promise<void> | void
136
+
137
+ onError?: (
138
+ services: Services,
139
+ ctx: {
140
+ error: Error
141
+ stepNumber: number
142
+ messages: AIMessage[]
143
+ }
144
+ ) => Promise<void> | void
145
+ }
146
+
147
+ export type AIAgentMemoryConfig = {
148
+ storage?: string
149
+ vector?: string
150
+ embedder?: string
151
+ lastMessages?: number
152
+ workingMemory?: unknown
153
+ }
154
+
155
+ export type CoreAIAgent<
156
+ PikkuPermission = CorePikkuPermission<any, any>,
157
+ PikkuMiddleware = CorePikkuMiddleware<any>,
158
+ > = {
159
+ name: string
160
+ description: string
161
+ summary?: string
162
+ errors?: string[]
163
+ instructions: string | string[]
164
+ model: string
165
+ temperature?: number
166
+ tools?: unknown[]
167
+ agents?: unknown[]
168
+ memory?: AIAgentMemoryConfig
169
+ maxSteps?: number
170
+ toolChoice?: 'auto' | 'required' | 'none'
171
+ input?: unknown
172
+ output?: unknown
173
+ tags?: string[]
174
+ protocol?: 'ui-message-stream'
175
+ prepareStep?: (ctx: {
176
+ stepNumber: number
177
+ messages: AIMessage[]
178
+ tools: AIAgentToolDef[]
179
+ toolChoice: 'auto' | 'required' | 'none'
180
+ model: string
181
+ stop: () => void
182
+ }) => void | Promise<void>
183
+ middleware?: PikkuMiddleware[]
184
+ channelMiddleware?: CorePikkuChannelMiddleware<any, any>[]
185
+ aiMiddleware?: PikkuAIMiddlewareHooks<any, any>[]
186
+ permissions?: CorePermissionGroup<PikkuPermission>
187
+ }
188
+
189
+ export type AIStreamEvent =
190
+ | { type: 'step-start'; stepNumber: number; agent?: string; session?: string }
191
+ | { type: 'text-delta'; text: string; agent?: string; session?: string }
192
+ | { type: 'reasoning-delta'; text: string; agent?: string; session?: string }
193
+ | {
194
+ type: 'tool-call'
195
+ toolCallId: string
196
+ toolName: string
197
+ args: unknown
198
+ agent?: string
199
+ session?: string
200
+ }
201
+ | {
202
+ type: 'tool-result'
203
+ toolCallId: string
204
+ toolName: string
205
+ result: unknown
206
+ agent?: string
207
+ session?: string
208
+ }
209
+ | {
210
+ type: 'agent-call'
211
+ agentName: string
212
+ session: string
213
+ input: unknown
214
+ }
215
+ | {
216
+ type: 'agent-result'
217
+ agentName: string
218
+ session: string
219
+ result: unknown
220
+ }
221
+ | {
222
+ type: 'approval-request'
223
+ toolCallId: string
224
+ toolName: string
225
+ args: unknown
226
+ reason?: string
227
+ agent?: string
228
+ session?: string
229
+ }
230
+ | {
231
+ type: 'usage'
232
+ tokens: { input: number; output: number }
233
+ model: string
234
+ agent?: string
235
+ session?: string
236
+ }
237
+ | { type: 'error'; message: string; agent?: string; session?: string }
238
+ | {
239
+ type: 'suspended'
240
+ reason: 'rpc-missing'
241
+ missingRpcs: string[]
242
+ }
243
+ | { type: 'done' }
244
+
245
+ export interface AIStreamChannel extends PikkuChannel<unknown, AIStreamEvent> {}
246
+
247
+ export type PendingApproval =
248
+ | {
249
+ type: 'tool-call'
250
+ toolCallId: string
251
+ toolName: string
252
+ args: unknown
253
+ }
254
+ | {
255
+ type: 'agent-call'
256
+ toolCallId: string
257
+ agentName: string
258
+ agentRunId: string
259
+ displayToolName: string
260
+ displayArgs: unknown
261
+ }
262
+
263
+ export interface AgentRunState {
264
+ runId: string
265
+ agentName: string
266
+ threadId: string
267
+ resourceId: string
268
+ status: 'running' | 'suspended' | 'completed' | 'failed'
269
+ suspendReason?: 'approval' | 'rpc-missing'
270
+ missingRpcs?: string[]
271
+ pendingApprovals?: PendingApproval[]
272
+ usage: { inputTokens: number; outputTokens: number; model: string }
273
+ createdAt: Date
274
+ updatedAt: Date
275
+ }
276
+
277
+ export interface AgentRunRow {
278
+ runId: string
279
+ agentName: string
280
+ threadId: string
281
+ resourceId: string
282
+ status: string
283
+ suspendReason?: string
284
+ missingRpcs?: string[]
285
+ usageInputTokens: number
286
+ usageOutputTokens: number
287
+ usageModel: string
288
+ createdAt: Date
289
+ updatedAt: Date
290
+ }
291
+
292
+ export interface AgentRunService {
293
+ listThreads(options?: {
294
+ agentName?: string
295
+ limit?: number
296
+ offset?: number
297
+ }): Promise<AIThread[]>
298
+ getThread(threadId: string): Promise<AIThread | null>
299
+ getThreadMessages(threadId: string): Promise<AIMessage[]>
300
+ getThreadRuns(threadId: string): Promise<AgentRunRow[]>
301
+ deleteThread(threadId: string): Promise<boolean>
302
+ getDistinctAgentNames(): Promise<string[]>
303
+ }
304
+
305
+ export type AIAgentMeta = Record<
306
+ string,
307
+ Omit<
308
+ CoreAIAgent,
309
+ | 'input'
310
+ | 'output'
311
+ | 'tools'
312
+ | 'agents'
313
+ | 'middleware'
314
+ | 'channelMiddleware'
315
+ | 'aiMiddleware'
316
+ | 'permissions'
317
+ > & {
318
+ tools?: string[]
319
+ agents?: string[]
320
+ inputSchema: string | null
321
+ outputSchema: string | null
322
+ workingMemorySchema: string | null
323
+ middleware?: MiddlewareMetadata[]
324
+ channelMiddleware?: MiddlewareMetadata[]
325
+ aiMiddleware?: MiddlewareMetadata[]
326
+ permissions?: PermissionMetadata[]
327
+ }
328
+ >
@@ -0,0 +1,39 @@
1
+ export {
2
+ agent,
3
+ agentStream,
4
+ agentResume,
5
+ agentApprove,
6
+ } from './ai-agent-helpers.js'
7
+ export { runAIAgent } from './ai-agent-runner.js'
8
+ export { streamAIAgent, resumeAIAgent } from './ai-agent-stream.js'
9
+ export {
10
+ createAssistantUIChannel,
11
+ parseAssistantUIInput,
12
+ } from './ai-agent-assistant-ui.js'
13
+ export {
14
+ type RunAIAgentParams,
15
+ type StreamAIAgentOptions,
16
+ ToolApprovalRequired,
17
+ } from './ai-agent-prepare.js'
18
+ export {
19
+ addAIAgent,
20
+ approveAIAgent,
21
+ getAIAgents,
22
+ getAIAgentsMeta,
23
+ } from './ai-agent-registry.js'
24
+ export type {
25
+ AIAgentInput,
26
+ AIAgentMeta,
27
+ AIAgentMemoryConfig,
28
+ AIAgentStep,
29
+ AgentRunRow,
30
+ AgentRunService,
31
+ AgentRunState,
32
+ AIMessage,
33
+ AIStreamChannel,
34
+ AIStreamEvent,
35
+ AIThread,
36
+ CoreAIAgent,
37
+ PendingApproval,
38
+ PikkuAIMiddlewareHooks,
39
+ } from './ai-agent.types.js'
@@ -1,7 +1,16 @@
1
- import { CoreServices, CorePikkuMiddleware } from '../../types/core.types.js'
2
- import { CoreChannel, ChannelMessageMeta } from './channel.types.js'
1
+ import type {
2
+ CoreSingletonServices,
3
+ CorePikkuMiddleware,
4
+ PikkuWire,
5
+ MiddlewareMetadata,
6
+ } from '../../types/core.types.js'
7
+ import type { CoreChannel, ChannelMessageMeta } from './channel.types.js'
3
8
  import { combineMiddleware, runMiddleware } from '../../middleware-runner.js'
4
9
  import { runPikkuFuncDirectly } from '../../function/function-runner.js'
10
+ import {
11
+ combineChannelMiddleware,
12
+ wrapChannelWithMiddleware,
13
+ } from './channel-middleware-runner.js'
5
14
 
6
15
  /**
7
16
  * Runs a channel lifecycle function (onConnect or onDisconnect) with proper middleware handling.
@@ -9,7 +18,8 @@ import { runPikkuFuncDirectly } from '../../function/function-runner.js'
9
18
  * This function:
10
19
  * 1. Extracts inline middleware from the lifecycle config if present
11
20
  * 2. Combines metadata middleware with inline middleware using combineMiddleware()
12
- * 3. Runs the lifecycle function with middleware support
21
+ * 3. Wraps the channel with channel middleware if present
22
+ * 4. Runs the lifecycle function with middleware support
13
23
  *
14
24
  * @param channelConfig - The channel configuration
15
25
  * @param meta - Metadata for the lifecycle function (connect or disconnect)
@@ -18,6 +28,7 @@ import { runPikkuFuncDirectly } from '../../function/function-runner.js'
18
28
  * @param services - All services (singleton + session)
19
29
  * @param channel - The channel instance
20
30
  * @param data - Optional data to pass to the lifecycle function (for onConnect)
31
+ * @param channelMiddlewareMeta - Optional channel middleware metadata for wrapping channel.send()
21
32
  * @returns Promise<unknown> - Result from the lifecycle function (if any)
22
33
  */
23
34
  export const runChannelLifecycleWithMiddleware = async ({
@@ -28,22 +39,22 @@ export const runChannelLifecycleWithMiddleware = async ({
28
39
  services,
29
40
  channel,
30
41
  data,
42
+ channelMiddlewareMeta,
31
43
  }: {
32
44
  channelConfig: CoreChannel<unknown, any>
33
45
  meta: ChannelMessageMeta
34
46
  lifecycleConfig: any
35
47
  lifecycleType: 'connect' | 'disconnect'
36
- services: CoreServices
48
+ services: CoreSingletonServices
37
49
  channel: any
38
50
  data?: unknown
51
+ channelMiddlewareMeta?: MiddlewareMetadata[]
39
52
  }): Promise<unknown> => {
40
- // Extract middleware if lifecycle config is an object
41
53
  const lifecycleMiddleware =
42
54
  typeof lifecycleConfig === 'object' && 'middleware' in lifecycleConfig
43
55
  ? (lifecycleConfig.middleware as CorePikkuMiddleware[]) || []
44
56
  : []
45
57
 
46
- // Use combineMiddleware to properly resolve metadata + inline middleware
47
58
  const allMiddleware = combineMiddleware(
48
59
  'channel',
49
60
  `${channelConfig.name}:${lifecycleType}`,
@@ -53,24 +64,26 @@ export const runChannelLifecycleWithMiddleware = async ({
53
64
  }
54
65
  )
55
66
 
56
- // Run the lifecycle function
67
+ const allChannelMiddleware = combineChannelMiddleware(
68
+ 'channel',
69
+ `${channelConfig.name}:${lifecycleType}:cm`,
70
+ {
71
+ wireInheritedChannelMiddleware: channelMiddlewareMeta,
72
+ wireChannelMiddleware: channelConfig.channelMiddleware as any,
73
+ }
74
+ )
75
+
76
+ let wire: PikkuWire = { channel }
77
+ if (allChannelMiddleware.length > 0) {
78
+ wire = wrapChannelWithMiddleware(wire, services, allChannelMiddleware)
79
+ }
80
+
57
81
  const runLifecycle = async () => {
58
- return await runPikkuFuncDirectly(
59
- meta.pikkuFuncName,
60
- services,
61
- { channel },
62
- data
63
- )
82
+ return await runPikkuFuncDirectly(meta.pikkuFuncId, services, wire, data)
64
83
  }
65
84
 
66
- // Run with middleware if any
67
85
  if (allMiddleware.length > 0) {
68
- return await runMiddleware(
69
- services,
70
- { channel },
71
- allMiddleware,
72
- runLifecycle
73
- )
86
+ return await runMiddleware(services, wire, allMiddleware, runLifecycle)
74
87
  } else {
75
88
  return await runLifecycle()
76
89
  }
@@ -1,16 +1,21 @@
1
- import {
1
+ import type {
2
2
  CoreServices,
3
3
  JSONValue,
4
4
  CoreUserSession,
5
5
  } from '../../types/core.types.js'
6
- import {
6
+ import type {
7
7
  ChannelMessageMeta,
8
8
  CoreChannel,
9
9
  PikkuChannelHandler,
10
10
  } from './channel.types.js'
11
11
  import { pikkuState } from '../../pikku-state.js'
12
12
  import { runPikkuFunc } from '../../function/function-runner.js'
13
- import { SessionService } from '../../services/user-session-service.js'
13
+ import type { SessionService } from '../../services/user-session-service.js'
14
+ import { createMiddlewareSessionWireProps } from '../../services/user-session-service.js'
15
+
16
+ const getChannelMeta = (channelName: string) => {
17
+ return pikkuState(null, 'channel', 'meta')[channelName]
18
+ }
14
19
 
15
20
  const getRouteMeta = (
16
21
  channelName: string,
@@ -74,7 +79,13 @@ export const processMessageHandlers = (
74
79
  routingProperty?: string,
75
80
  routerValue?: string
76
81
  ): Promise<unknown> => {
77
- if (!validateAuth(requiresSession, channelHandler, onMessage)) {
82
+ if (
83
+ !validateAuth(
84
+ requiresSession,
85
+ userSession?.get() as CoreUserSession | undefined,
86
+ onMessage
87
+ )
88
+ ) {
78
89
  const routeMessage = routingProperty
79
90
  ? `route '${routingProperty}:${routerValue}'`
80
91
  : 'the default message route'
@@ -87,7 +98,7 @@ export const processMessageHandlers = (
87
98
  }
88
99
 
89
100
  const {
90
- pikkuFuncName,
101
+ pikkuFuncId,
91
102
  middleware: routeInheritedMiddleware,
92
103
  permissions: inheritedPermissions,
93
104
  } = getRouteMeta(channelConfig.name, routingProperty, routerValue)
@@ -122,17 +133,23 @@ export const processMessageHandlers = (
122
133
  ? `${channelConfig.name}:${routingProperty}:${routerValue}`
123
134
  : `${channelConfig.name}:default`
124
135
 
125
- return await runPikkuFunc('channel', cacheKey, pikkuFuncName, {
136
+ const channelMeta = getChannelMeta(channelConfig.name)
137
+ const wireChannelMiddleware = channelConfig.channelMiddleware || []
138
+
139
+ return await runPikkuFunc('channel', cacheKey, pikkuFuncId, {
126
140
  singletonServices: services,
127
141
  data: () => data,
128
142
  inheritedMiddleware,
129
143
  wireMiddleware,
144
+ inheritedChannelMiddleware: channelMeta?.channelMiddleware,
145
+ wireChannelMiddleware: wireChannelMiddleware as any,
130
146
  inheritedPermissions,
131
147
  wirePermissions,
132
148
  tags: channelConfig.tags,
149
+ sessionService: userSession,
133
150
  wire: {
134
151
  channel: channelHandler.getChannel(),
135
- session: userSession,
152
+ ...(userSession && createMiddlewareSessionWireProps(userSession)),
136
153
  },
137
154
  })
138
155
  }
@@ -146,7 +163,7 @@ export const processMessageHandlers = (
146
163
  let messageData: any
147
164
  try {
148
165
  messageData = JSON.parse(rawData)
149
- } catch (error) {
166
+ } catch {
150
167
  // Most likely a json error.. ignore
151
168
  }
152
169
 
@@ -188,7 +205,7 @@ export const processMessageHandlers = (
188
205
  logger.error(
189
206
  `No handler found for message in channel ${channelConfig.name} for ${JSON.stringify(rawData)}`
190
207
  )
191
- logger.error(`Channel ${JSON.stringify(channelConfig)}`)
208
+ logger.error(`Channel config name: ${channelConfig.name}`)
192
209
  }
193
210
 
194
211
  return result
@@ -0,0 +1,119 @@
1
+ import type {
2
+ CoreSingletonServices,
3
+ MiddlewareMetadata,
4
+ PikkuWire,
5
+ } from '../../types/core.types.js'
6
+ import type { CorePikkuChannelMiddleware } from './channel.types.js'
7
+ import { pikkuState } from '../../pikku-state.js'
8
+ import { freezeDedupe, getTagGroups } from '../../utils.js'
9
+
10
+ export const addChannelMiddleware = (
11
+ tag: string,
12
+ middleware: CorePikkuChannelMiddleware[],
13
+ packageName: string | null = null
14
+ ): CorePikkuChannelMiddleware[] => {
15
+ const tagGroups = pikkuState(packageName, 'channelMiddleware', 'tagGroup')
16
+ tagGroups[tag] = middleware
17
+ return middleware
18
+ }
19
+
20
+ const getChannelMiddlewareByName = (
21
+ name: string
22
+ ): CorePikkuChannelMiddleware | undefined => {
23
+ const store = pikkuState(null, 'misc', 'channelMiddleware')
24
+ const middleware = store[name]
25
+ return middleware?.[0]
26
+ }
27
+
28
+ const channelMiddlewareCache: Record<
29
+ string,
30
+ readonly CorePikkuChannelMiddleware[]
31
+ > = {}
32
+
33
+ export const combineChannelMiddleware = (
34
+ wireType: string,
35
+ uid: string,
36
+ {
37
+ wireInheritedChannelMiddleware,
38
+ wireChannelMiddleware,
39
+ packageName = null,
40
+ }: {
41
+ wireInheritedChannelMiddleware?: MiddlewareMetadata[]
42
+ wireChannelMiddleware?: CorePikkuChannelMiddleware[]
43
+ packageName?: string | null
44
+ } = {}
45
+ ): readonly CorePikkuChannelMiddleware[] => {
46
+ const cacheKey = `${wireType}:${uid}`
47
+ if (channelMiddlewareCache[cacheKey]) {
48
+ return channelMiddlewareCache[cacheKey]
49
+ }
50
+
51
+ const resolved: CorePikkuChannelMiddleware[] = []
52
+
53
+ if (wireInheritedChannelMiddleware) {
54
+ for (const meta of wireInheritedChannelMiddleware) {
55
+ if (meta.type === 'tag') {
56
+ const groups = getTagGroups(
57
+ pikkuState(packageName, 'channelMiddleware', 'tagGroup'),
58
+ meta.tag
59
+ )
60
+ for (const group of groups) {
61
+ resolved.push(...group)
62
+ }
63
+ } else if (meta.type === 'wire') {
64
+ const middleware = getChannelMiddlewareByName(meta.name)
65
+ if (middleware) {
66
+ resolved.push(middleware)
67
+ }
68
+ }
69
+ }
70
+ }
71
+
72
+ if (wireChannelMiddleware) {
73
+ resolved.push(...wireChannelMiddleware)
74
+ }
75
+
76
+ channelMiddlewareCache[cacheKey] = freezeDedupe(
77
+ resolved
78
+ ) as readonly CorePikkuChannelMiddleware[]
79
+
80
+ return channelMiddlewareCache[cacheKey]
81
+ }
82
+
83
+ export function wrapChannelWithMiddleware<Out>(
84
+ wire: PikkuWire,
85
+ services: CoreSingletonServices,
86
+ middlewares: readonly CorePikkuChannelMiddleware[]
87
+ ): PikkuWire {
88
+ if (middlewares.length === 0 || !wire.channel) return wire
89
+
90
+ const channel = wire.channel
91
+ const originalSend = channel.send.bind(channel)
92
+
93
+ const dispatch = async (index: number, event: Out): Promise<void> => {
94
+ if (index >= middlewares.length) {
95
+ await originalSend(event)
96
+ return
97
+ }
98
+
99
+ const middleware = middlewares[index]!
100
+ await middleware(services, event, async (result: any) => {
101
+ if (result === null || result === undefined) return
102
+ if (Array.isArray(result)) {
103
+ for (const item of result) {
104
+ await dispatch(index + 1, item)
105
+ }
106
+ } else {
107
+ await dispatch(index + 1, result)
108
+ }
109
+ })
110
+ }
111
+
112
+ return {
113
+ ...wire,
114
+ channel: {
115
+ ...channel,
116
+ send: ((data: Out) => dispatch(0, data)) as typeof channel.send,
117
+ },
118
+ }
119
+ }