@pikku/core 0.11.1 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/crypto-utils.d.ts +2 -0
  3. package/dist/crypto-utils.js +78 -0
  4. package/dist/errors/error-handler.js +3 -3
  5. package/dist/errors/errors.d.ts +8 -0
  6. package/dist/errors/errors.js +16 -0
  7. package/dist/errors/index.d.ts +0 -1
  8. package/dist/errors/index.js +0 -1
  9. package/dist/function/function-runner.d.ts +10 -3
  10. package/dist/function/function-runner.js +136 -31
  11. package/dist/function/functions.types.d.ts +35 -12
  12. package/dist/function/functions.types.js +16 -6
  13. package/dist/function/index.d.ts +2 -2
  14. package/dist/function/index.js +1 -2
  15. package/dist/handle-error.js +1 -10
  16. package/dist/index.d.ts +30 -24
  17. package/dist/index.js +19 -27
  18. package/dist/middleware/auth-apikey.d.ts +1 -1
  19. package/dist/middleware/auth-apikey.js +3 -3
  20. package/dist/middleware/auth-bearer.d.ts +1 -1
  21. package/dist/middleware/auth-bearer.js +3 -6
  22. package/dist/middleware/auth-cookie.d.ts +1 -1
  23. package/dist/middleware/auth-cookie.js +6 -8
  24. package/dist/middleware/cors.d.ts +46 -0
  25. package/dist/middleware/cors.js +73 -0
  26. package/dist/middleware/index.d.ts +5 -3
  27. package/dist/middleware/index.js +5 -3
  28. package/dist/middleware/remote-auth.d.ts +5 -0
  29. package/dist/middleware/remote-auth.js +55 -0
  30. package/dist/middleware/timeout.d.ts +1 -1
  31. package/dist/middleware-runner.d.ts +3 -14
  32. package/dist/middleware-runner.js +14 -16
  33. package/dist/permissions.d.ts +3 -86
  34. package/dist/permissions.js +20 -80
  35. package/dist/pikku-state.d.ts +33 -104
  36. package/dist/pikku-state.js +150 -66
  37. package/dist/schema.d.ts +8 -6
  38. package/dist/schema.js +31 -18
  39. package/dist/services/ai-agent-runner-service.d.ts +24 -0
  40. package/dist/services/ai-agent-runner-service.js +1 -0
  41. package/dist/services/ai-run-state-service.d.ts +13 -0
  42. package/dist/services/ai-run-state-service.js +1 -0
  43. package/dist/services/ai-storage-service.d.ts +18 -0
  44. package/dist/services/ai-storage-service.js +1 -0
  45. package/dist/services/deployment-service.d.ts +19 -0
  46. package/dist/services/deployment-service.js +1 -0
  47. package/dist/services/gopass-secrets.d.ts +47 -0
  48. package/dist/services/gopass-secrets.js +94 -0
  49. package/dist/services/in-memory-trigger-service.d.ts +23 -0
  50. package/dist/services/in-memory-trigger-service.js +50 -0
  51. package/dist/services/in-memory-workflow-service.d.ts +59 -0
  52. package/dist/services/in-memory-workflow-service.js +287 -0
  53. package/dist/services/index.d.ts +25 -11
  54. package/dist/services/index.js +10 -13
  55. package/dist/services/local-secrets.d.ts +23 -0
  56. package/dist/services/local-secrets.js +45 -0
  57. package/dist/services/local-variables.d.ts +5 -0
  58. package/dist/services/local-variables.js +18 -0
  59. package/dist/services/scheduler-service.d.ts +21 -1
  60. package/dist/services/scheduler-service.js +14 -0
  61. package/dist/services/schema-service.d.ts +6 -0
  62. package/dist/services/scoped-secret-service.d.ts +16 -0
  63. package/dist/services/scoped-secret-service.js +35 -0
  64. package/dist/services/secret-service.d.ts +25 -4
  65. package/dist/services/trigger-service.d.ts +23 -0
  66. package/dist/services/trigger-service.js +1 -0
  67. package/dist/services/typed-secret-service.d.ts +30 -0
  68. package/dist/services/typed-secret-service.js +40 -0
  69. package/dist/services/typed-variables-service.d.ts +27 -0
  70. package/dist/services/typed-variables-service.js +46 -0
  71. package/dist/services/user-session-service.d.ts +13 -0
  72. package/dist/services/user-session-service.js +17 -0
  73. package/dist/services/variables-service.d.ts +5 -0
  74. package/dist/services/workflow-service.d.ts +43 -0
  75. package/dist/services/workflow-service.js +1 -0
  76. package/dist/types/core.types.d.ts +54 -10
  77. package/dist/types/core.types.js +7 -0
  78. package/dist/types/state.types.d.ts +127 -0
  79. package/dist/types/state.types.js +1 -0
  80. package/dist/utils.d.ts +10 -1
  81. package/dist/utils.js +60 -3
  82. package/dist/version.d.ts +6 -0
  83. package/dist/version.js +19 -0
  84. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +29 -0
  85. package/dist/wirings/ai-agent/ai-agent-memory.js +199 -0
  86. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +9 -0
  87. package/dist/wirings/ai-agent/ai-agent-model-config.js +36 -0
  88. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +60 -0
  89. package/dist/wirings/ai-agent/ai-agent-prepare.js +312 -0
  90. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +15 -0
  91. package/dist/wirings/ai-agent/ai-agent-registry.js +47 -0
  92. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +3 -0
  93. package/dist/wirings/ai-agent/ai-agent-runner.js +96 -0
  94. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +11 -0
  95. package/dist/wirings/ai-agent/ai-agent-stream.js +503 -0
  96. package/dist/wirings/ai-agent/ai-agent.types.d.ts +254 -0
  97. package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
  98. package/dist/wirings/ai-agent/index.d.ts +5 -0
  99. package/dist/wirings/ai-agent/index.js +4 -0
  100. package/dist/wirings/channel/channel-common.d.ts +7 -4
  101. package/dist/wirings/channel/channel-common.js +15 -8
  102. package/dist/wirings/channel/channel-handler.js +13 -4
  103. package/dist/wirings/channel/channel-middleware-runner.d.ts +9 -0
  104. package/dist/wirings/channel/channel-middleware-runner.js +73 -0
  105. package/dist/wirings/channel/channel-runner.js +12 -12
  106. package/dist/wirings/channel/channel.types.d.ts +5 -1
  107. package/dist/wirings/channel/define-channel-routes.d.ts +21 -0
  108. package/dist/wirings/channel/define-channel-routes.js +23 -0
  109. package/dist/wirings/channel/index.d.ts +10 -8
  110. package/dist/wirings/channel/index.js +7 -8
  111. package/dist/wirings/channel/local/index.d.ts +3 -3
  112. package/dist/wirings/channel/local/index.js +3 -3
  113. package/dist/wirings/channel/local/local-channel-runner.js +18 -6
  114. package/dist/wirings/channel/log-channels.js +1 -1
  115. package/dist/wirings/channel/serverless/index.d.ts +1 -1
  116. package/dist/wirings/channel/serverless/index.js +1 -1
  117. package/dist/wirings/channel/serverless/serverless-channel-runner.js +17 -6
  118. package/dist/wirings/cli/channel/cli-channel-runner.js +3 -2
  119. package/dist/wirings/cli/channel/index.d.ts +1 -1
  120. package/dist/wirings/cli/channel/index.js +1 -1
  121. package/dist/wirings/cli/cli-runner.d.ts +1 -1
  122. package/dist/wirings/cli/cli-runner.js +22 -18
  123. package/dist/wirings/cli/cli.types.d.ts +7 -6
  124. package/dist/wirings/cli/define-cli-commands.d.ts +19 -0
  125. package/dist/wirings/cli/define-cli-commands.js +20 -0
  126. package/dist/wirings/cli/index.d.ts +2 -3
  127. package/dist/wirings/cli/index.js +1 -3
  128. package/dist/wirings/http/http-routes.d.ts +69 -0
  129. package/dist/wirings/http/http-routes.js +139 -0
  130. package/dist/wirings/http/http-runner.d.ts +2 -2
  131. package/dist/wirings/http/http-runner.js +62 -27
  132. package/dist/wirings/http/http.types.d.ts +77 -24
  133. package/dist/wirings/http/index.d.ts +5 -4
  134. package/dist/wirings/http/index.js +4 -3
  135. package/dist/wirings/http/log-http-routes.js +1 -1
  136. package/dist/wirings/http/routers/path-to-regex.js +2 -2
  137. package/dist/wirings/mcp/index.d.ts +4 -3
  138. package/dist/wirings/mcp/index.js +3 -3
  139. package/dist/wirings/mcp/mcp-runner.d.ts +1 -3
  140. package/dist/wirings/mcp/mcp-runner.js +42 -56
  141. package/dist/wirings/mcp/mcp.types.d.ts +3 -3
  142. package/dist/wirings/node/index.d.ts +2 -0
  143. package/dist/wirings/node/index.js +1 -0
  144. package/dist/wirings/node/node.types.d.ts +20 -0
  145. package/dist/wirings/node/node.types.js +1 -0
  146. package/dist/wirings/oauth2/index.d.ts +3 -0
  147. package/dist/wirings/oauth2/index.js +2 -0
  148. package/dist/wirings/oauth2/oauth2-client.d.ts +47 -0
  149. package/dist/wirings/oauth2/oauth2-client.js +267 -0
  150. package/dist/wirings/oauth2/oauth2.types.d.ts +65 -0
  151. package/dist/wirings/oauth2/oauth2.types.js +4 -0
  152. package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +20 -0
  153. package/dist/wirings/oauth2/wire-oauth2-credential.js +21 -0
  154. package/dist/wirings/queue/index.d.ts +2 -2
  155. package/dist/wirings/queue/index.js +1 -1
  156. package/dist/wirings/queue/queue-runner.d.ts +7 -0
  157. package/dist/wirings/queue/queue-runner.js +23 -12
  158. package/dist/wirings/queue/queue.types.d.ts +8 -2
  159. package/dist/wirings/rpc/index.d.ts +1 -1
  160. package/dist/wirings/rpc/index.js +1 -1
  161. package/dist/wirings/rpc/rpc-runner.d.ts +40 -13
  162. package/dist/wirings/rpc/rpc-runner.js +191 -25
  163. package/dist/wirings/rpc/rpc-types.d.ts +15 -4
  164. package/dist/wirings/scheduler/index.d.ts +3 -3
  165. package/dist/wirings/scheduler/index.js +2 -3
  166. package/dist/wirings/scheduler/log-schedulers.js +1 -1
  167. package/dist/wirings/scheduler/scheduler-runner.d.ts +5 -0
  168. package/dist/wirings/scheduler/scheduler-runner.js +28 -10
  169. package/dist/wirings/secret/index.d.ts +3 -0
  170. package/dist/wirings/secret/index.js +2 -0
  171. package/dist/wirings/secret/secret.types.d.ts +27 -0
  172. package/dist/wirings/secret/secret.types.js +1 -0
  173. package/dist/wirings/secret/validate-secret-definitions.d.ts +6 -0
  174. package/dist/wirings/secret/validate-secret-definitions.js +55 -0
  175. package/dist/wirings/trigger/index.d.ts +3 -0
  176. package/dist/wirings/trigger/index.js +2 -0
  177. package/dist/wirings/trigger/pikku-trigger-service.d.ts +26 -0
  178. package/dist/wirings/trigger/pikku-trigger-service.js +75 -0
  179. package/dist/wirings/trigger/trigger-runner.d.ts +42 -0
  180. package/dist/wirings/trigger/trigger-runner.js +85 -0
  181. package/dist/wirings/trigger/trigger.types.d.ts +130 -0
  182. package/dist/wirings/trigger/trigger.types.js +40 -0
  183. package/dist/wirings/variable/index.d.ts +3 -0
  184. package/dist/wirings/variable/index.js +2 -0
  185. package/dist/wirings/variable/validate-variable-definitions.d.ts +6 -0
  186. package/dist/wirings/variable/validate-variable-definitions.js +45 -0
  187. package/dist/wirings/variable/variable.types.d.ts +18 -0
  188. package/dist/wirings/variable/variable.types.js +1 -0
  189. package/dist/wirings/workflow/dsl/index.d.ts +5 -0
  190. package/dist/wirings/workflow/dsl/index.js +4 -0
  191. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +292 -0
  192. package/dist/wirings/workflow/dsl/workflow-dsl.types.js +5 -0
  193. package/dist/wirings/workflow/dsl/workflow-runner.d.ts +5 -0
  194. package/dist/wirings/workflow/dsl/workflow-runner.js +23 -0
  195. package/dist/wirings/workflow/graph/graph-node.d.ts +117 -0
  196. package/dist/wirings/workflow/graph/graph-node.js +58 -0
  197. package/dist/wirings/workflow/graph/graph-runner.d.ts +9 -0
  198. package/dist/wirings/workflow/graph/graph-runner.js +540 -0
  199. package/dist/wirings/workflow/graph/index.d.ts +4 -0
  200. package/dist/wirings/workflow/graph/index.js +3 -0
  201. package/dist/wirings/workflow/graph/template.d.ts +15 -0
  202. package/dist/wirings/workflow/graph/template.js +27 -0
  203. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +15 -0
  204. package/dist/wirings/workflow/graph/wire-workflow-graph.js +8 -0
  205. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +82 -0
  206. package/dist/wirings/workflow/graph/workflow-graph.types.js +15 -0
  207. package/dist/wirings/workflow/index.d.ts +7 -12
  208. package/dist/wirings/workflow/index.js +8 -11
  209. package/dist/wirings/workflow/pikku-workflow-service.d.ts +114 -10
  210. package/dist/wirings/workflow/pikku-workflow-service.js +386 -115
  211. package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
  212. package/dist/wirings/workflow/workflow-helpers.js +38 -0
  213. package/dist/wirings/workflow/workflow-utils.d.ts +1 -0
  214. package/dist/wirings/workflow/workflow-utils.js +1 -0
  215. package/dist/wirings/workflow/workflow.types.d.ts +83 -214
  216. package/package.json +13 -6
  217. package/run-tests.sh +4 -1
  218. package/src/crypto-utils.ts +99 -0
  219. package/src/errors/error-handler.ts +3 -3
  220. package/src/errors/errors.ts +17 -0
  221. package/src/errors/index.ts +0 -1
  222. package/src/factory-functions.test.ts +42 -2
  223. package/src/function/function-runner.test.ts +5 -12
  224. package/src/function/function-runner.ts +195 -40
  225. package/src/function/functions.types.ts +66 -14
  226. package/src/function/index.ts +5 -2
  227. package/src/handle-error.ts +2 -10
  228. package/src/index.ts +106 -27
  229. package/src/middleware/auth-apikey.test.ts +15 -12
  230. package/src/middleware/auth-apikey.ts +3 -3
  231. package/src/middleware/auth-bearer.test.ts +17 -14
  232. package/src/middleware/auth-bearer.ts +25 -27
  233. package/src/middleware/auth-cookie.test.ts +16 -13
  234. package/src/middleware/auth-cookie.ts +6 -8
  235. package/src/middleware/cors.ts +96 -0
  236. package/src/middleware/index.ts +5 -3
  237. package/src/middleware/remote-auth.ts +68 -0
  238. package/src/middleware-runner.test.ts +122 -0
  239. package/src/middleware-runner.ts +24 -17
  240. package/src/permissions.test.ts +102 -86
  241. package/src/permissions.ts +32 -93
  242. package/src/pikku-state.ts +168 -201
  243. package/src/run-tests-script.test.ts +49 -0
  244. package/src/schema.ts +50 -18
  245. package/src/services/ai-agent-runner-service.ts +29 -0
  246. package/src/services/ai-run-state-service.ts +20 -0
  247. package/src/services/ai-storage-service.ts +39 -0
  248. package/src/services/deployment-service.ts +22 -0
  249. package/src/services/gopass-secrets.ts +95 -0
  250. package/src/services/in-memory-trigger-service.ts +68 -0
  251. package/src/services/in-memory-workflow-service.ts +395 -0
  252. package/src/services/index.ts +49 -14
  253. package/src/services/local-secrets.ts +51 -0
  254. package/src/services/local-variables.ts +22 -0
  255. package/src/services/scheduler-service.ts +29 -1
  256. package/src/services/schema-service.ts +7 -0
  257. package/src/services/scoped-secret-service.ts +41 -0
  258. package/src/services/secret-service.ts +25 -4
  259. package/src/services/trigger-service.ts +38 -0
  260. package/src/services/typed-secret-service.ts +70 -0
  261. package/src/services/typed-variables-service.ts +81 -0
  262. package/src/services/user-session-service.ts +23 -0
  263. package/src/services/variables-service.ts +5 -0
  264. package/src/services/workflow-service.ts +94 -0
  265. package/src/types/core.types.ts +82 -8
  266. package/src/types/state.types.ts +169 -0
  267. package/src/utils.ts +74 -5
  268. package/src/version.test.ts +80 -0
  269. package/src/version.ts +25 -0
  270. package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
  271. package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
  272. package/src/wirings/ai-agent/ai-agent-prepare.ts +470 -0
  273. package/src/wirings/ai-agent/ai-agent-registry.test.ts +37 -0
  274. package/src/wirings/ai-agent/ai-agent-registry.ts +82 -0
  275. package/src/wirings/ai-agent/ai-agent-runner.test.ts +75 -0
  276. package/src/wirings/ai-agent/ai-agent-runner.ts +137 -0
  277. package/src/wirings/ai-agent/ai-agent-stream.test.ts +246 -0
  278. package/src/wirings/ai-agent/ai-agent-stream.ts +774 -0
  279. package/src/wirings/ai-agent/ai-agent.types.ts +273 -0
  280. package/src/wirings/ai-agent/index.ts +28 -0
  281. package/src/wirings/channel/channel-common.ts +32 -19
  282. package/src/wirings/channel/channel-handler.ts +18 -5
  283. package/src/wirings/channel/channel-middleware-runner.ts +119 -0
  284. package/src/wirings/channel/channel-runner.ts +14 -15
  285. package/src/wirings/channel/channel.types.ts +17 -1
  286. package/src/wirings/channel/define-channel-routes.ts +25 -0
  287. package/src/wirings/channel/index.ts +23 -8
  288. package/src/wirings/channel/local/index.ts +3 -3
  289. package/src/wirings/channel/local/local-channel-runner.test.ts +47 -2
  290. package/src/wirings/channel/local/local-channel-runner.ts +22 -6
  291. package/src/wirings/channel/log-channels.ts +1 -1
  292. package/src/wirings/channel/serverless/index.ts +5 -1
  293. package/src/wirings/channel/serverless/serverless-channel-runner.ts +22 -6
  294. package/src/wirings/cli/channel/cli-channel-runner.ts +4 -3
  295. package/src/wirings/cli/channel/index.ts +1 -1
  296. package/src/wirings/cli/cli-runner.test.ts +28 -28
  297. package/src/wirings/cli/cli-runner.ts +27 -19
  298. package/src/wirings/cli/cli.types.ts +12 -11
  299. package/src/wirings/cli/command-parser.test.ts +8 -8
  300. package/src/wirings/cli/define-cli-commands.ts +24 -0
  301. package/src/wirings/cli/index.ts +10 -4
  302. package/src/wirings/http/http-routes.test.ts +322 -0
  303. package/src/wirings/http/http-routes.ts +198 -0
  304. package/src/wirings/http/http-runner.test.ts +5 -5
  305. package/src/wirings/http/http-runner.ts +80 -29
  306. package/src/wirings/http/http.types.ts +121 -23
  307. package/src/wirings/http/index.ts +16 -4
  308. package/src/wirings/http/log-http-routes.ts +1 -1
  309. package/src/wirings/http/routers/path-to-regex.test.ts +30 -19
  310. package/src/wirings/http/routers/path-to-regex.ts +2 -2
  311. package/src/wirings/mcp/index.ts +27 -3
  312. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
  313. package/src/wirings/mcp/mcp-runner.ts +56 -67
  314. package/src/wirings/mcp/mcp.types.ts +3 -3
  315. package/src/wirings/node/index.ts +2 -0
  316. package/src/wirings/node/node.types.ts +23 -0
  317. package/src/wirings/oauth2/index.ts +3 -0
  318. package/src/wirings/oauth2/oauth2-client.test.ts +929 -0
  319. package/src/wirings/oauth2/oauth2-client.ts +335 -0
  320. package/src/wirings/oauth2/oauth2.types.ts +69 -0
  321. package/src/wirings/oauth2/wire-oauth2-credential.ts +23 -0
  322. package/src/wirings/queue/index.ts +14 -2
  323. package/src/wirings/queue/queue-runner.test.ts +115 -73
  324. package/src/wirings/queue/queue-runner.ts +39 -13
  325. package/src/wirings/queue/queue.types.ts +12 -2
  326. package/src/wirings/rpc/index.ts +1 -1
  327. package/src/wirings/rpc/rpc-runner.ts +270 -34
  328. package/src/wirings/rpc/rpc-types.ts +21 -4
  329. package/src/wirings/scheduler/index.ts +7 -4
  330. package/src/wirings/scheduler/log-schedulers.ts +1 -1
  331. package/src/wirings/scheduler/scheduler-runner.test.ts +97 -53
  332. package/src/wirings/scheduler/scheduler-runner.ts +50 -10
  333. package/src/wirings/secret/index.ts +9 -0
  334. package/src/wirings/secret/secret.types.ts +32 -0
  335. package/src/wirings/secret/validate-secret-definitions.ts +82 -0
  336. package/src/wirings/trigger/index.ts +10 -0
  337. package/src/wirings/trigger/pikku-trigger-service.ts +134 -0
  338. package/src/wirings/trigger/trigger-runner.ts +138 -0
  339. package/src/wirings/trigger/trigger.types.ts +178 -0
  340. package/src/wirings/variable/index.ts +8 -0
  341. package/src/wirings/variable/validate-variable-definitions.ts +69 -0
  342. package/src/wirings/variable/variable.types.ts +22 -0
  343. package/src/wirings/workflow/dsl/index.ts +31 -0
  344. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +320 -0
  345. package/src/wirings/workflow/dsl/workflow-runner.ts +28 -0
  346. package/src/wirings/workflow/graph/graph-node.ts +222 -0
  347. package/src/wirings/workflow/graph/graph-runner.test.ts +495 -0
  348. package/src/wirings/workflow/graph/graph-runner.ts +816 -0
  349. package/src/wirings/workflow/graph/index.ts +14 -0
  350. package/src/wirings/workflow/graph/template.ts +42 -0
  351. package/src/wirings/workflow/graph/wire-workflow-graph.ts +29 -0
  352. package/src/wirings/workflow/graph/workflow-graph.types.ts +104 -0
  353. package/src/wirings/workflow/index.ts +64 -26
  354. package/src/wirings/workflow/pikku-workflow-service.test.ts +212 -0
  355. package/src/wirings/workflow/pikku-workflow-service.ts +571 -136
  356. package/src/wirings/workflow/workflow-helpers.ts +79 -0
  357. package/src/wirings/workflow/workflow-utils.ts +0 -0
  358. package/src/wirings/workflow/workflow.types.ts +123 -279
  359. package/tsconfig.tsbuildinfo +1 -1
  360. package/dist/wirings/workflow/workflow-runner.d.ts +0 -34
  361. package/dist/wirings/workflow/workflow-runner.js +0 -65
  362. package/src/function/function-runner.ts.bak +0 -188
  363. package/src/wirings/workflow/workflow-runner.ts +0 -72
@@ -0,0 +1,273 @@
1
+ import {
2
+ CorePermissionGroup,
3
+ CorePikkuPermission,
4
+ } from '../../function/functions.types.js'
5
+ import {
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
+ }
69
+
70
+ export interface PikkuAIMiddlewareHooks<
71
+ State extends Record<string, unknown> = Record<string, unknown>,
72
+ Services = any,
73
+ > {
74
+ modifyInput?: (
75
+ services: Services,
76
+ ctx: { messages: AIMessage[]; instructions: string }
77
+ ) =>
78
+ | Promise<{ messages: AIMessage[]; instructions: string }>
79
+ | { messages: AIMessage[]; instructions: string }
80
+
81
+ modifyOutputStream?: (
82
+ services: Services,
83
+ ctx: {
84
+ event: AIStreamEvent
85
+ allEvents: readonly AIStreamEvent[]
86
+ state: State
87
+ }
88
+ ) => Promise<AIStreamEvent | null> | AIStreamEvent | null
89
+
90
+ modifyOutput?: (
91
+ services: Services,
92
+ ctx: {
93
+ text: string
94
+ messages: AIMessage[]
95
+ usage: { inputTokens: number; outputTokens: number }
96
+ }
97
+ ) =>
98
+ | Promise<{ text: string; messages: AIMessage[] }>
99
+ | { text: string; messages: AIMessage[] }
100
+ }
101
+
102
+ export type AIAgentMemoryConfig = {
103
+ storage?: string
104
+ vector?: string
105
+ embedder?: string
106
+ lastMessages?: number
107
+ workingMemory?: unknown
108
+ }
109
+
110
+ export type CoreAIAgent<
111
+ PikkuPermission = CorePikkuPermission<any, any>,
112
+ PikkuMiddleware = CorePikkuMiddleware<any>,
113
+ > = {
114
+ name: string
115
+ description: string
116
+ summary?: string
117
+ errors?: string[]
118
+ instructions: string | string[]
119
+ model: string
120
+ temperature?: number
121
+ tools?: unknown[]
122
+ agents?: unknown[]
123
+ memory?: AIAgentMemoryConfig
124
+ maxSteps?: number
125
+ toolChoice?: 'auto' | 'required' | 'none'
126
+ input?: unknown
127
+ output?: unknown
128
+ tags?: string[]
129
+ middleware?: PikkuMiddleware[]
130
+ channelMiddleware?: CorePikkuChannelMiddleware<any, any>[]
131
+ aiMiddleware?: PikkuAIMiddlewareHooks<any, any>[]
132
+ permissions?: CorePermissionGroup<PikkuPermission>
133
+ }
134
+
135
+ export type AIStreamEvent =
136
+ | { type: 'text-delta'; text: string; agent?: string; session?: string }
137
+ | { type: 'reasoning-delta'; text: string; agent?: string; session?: string }
138
+ | {
139
+ type: 'tool-call'
140
+ toolCallId: string
141
+ toolName: string
142
+ args: unknown
143
+ agent?: string
144
+ session?: string
145
+ }
146
+ | {
147
+ type: 'tool-result'
148
+ toolCallId: string
149
+ toolName: string
150
+ result: unknown
151
+ agent?: string
152
+ session?: string
153
+ }
154
+ | {
155
+ type: 'agent-call'
156
+ agentName: string
157
+ session: string
158
+ input: unknown
159
+ }
160
+ | {
161
+ type: 'agent-result'
162
+ agentName: string
163
+ session: string
164
+ result: unknown
165
+ }
166
+ | {
167
+ type: 'approval-request'
168
+ toolCallId: string
169
+ toolName: string
170
+ args: unknown
171
+ reason?: string
172
+ agent?: string
173
+ session?: string
174
+ }
175
+ | {
176
+ type: 'usage'
177
+ tokens: { input: number; output: number }
178
+ model: string
179
+ agent?: string
180
+ session?: string
181
+ }
182
+ | { type: 'error'; message: string; agent?: string; session?: string }
183
+ | {
184
+ type: 'suspended'
185
+ reason: 'rpc-missing'
186
+ missingRpcs: string[]
187
+ }
188
+ | { type: 'done' }
189
+
190
+ export interface AIStreamChannel extends PikkuChannel<unknown, AIStreamEvent> {}
191
+
192
+ export type PendingApproval =
193
+ | {
194
+ type: 'tool-call'
195
+ toolCallId: string
196
+ toolName: string
197
+ args: unknown
198
+ }
199
+ | {
200
+ type: 'agent-call'
201
+ toolCallId: string
202
+ agentName: string
203
+ agentRunId: string
204
+ displayToolName: string
205
+ displayArgs: unknown
206
+ }
207
+
208
+ export interface AgentRunState {
209
+ runId: string
210
+ agentName: string
211
+ threadId: string
212
+ resourceId: string
213
+ status: 'running' | 'suspended' | 'completed' | 'failed'
214
+ suspendReason?: 'approval' | 'rpc-missing'
215
+ missingRpcs?: string[]
216
+ pendingApprovals?: PendingApproval[]
217
+ usage: { inputTokens: number; outputTokens: number; model: string }
218
+ createdAt: Date
219
+ updatedAt: Date
220
+ }
221
+
222
+ export interface AgentRunRow {
223
+ runId: string
224
+ agentName: string
225
+ threadId: string
226
+ resourceId: string
227
+ status: string
228
+ suspendReason?: string
229
+ missingRpcs?: string[]
230
+ usageInputTokens: number
231
+ usageOutputTokens: number
232
+ usageModel: string
233
+ createdAt: Date
234
+ updatedAt: Date
235
+ }
236
+
237
+ export interface AgentRunService {
238
+ listThreads(options?: {
239
+ agentName?: string
240
+ limit?: number
241
+ offset?: number
242
+ }): Promise<AIThread[]>
243
+ getThread(threadId: string): Promise<AIThread | null>
244
+ getThreadMessages(threadId: string): Promise<AIMessage[]>
245
+ getThreadRuns(threadId: string): Promise<AgentRunRow[]>
246
+ deleteThread(threadId: string): Promise<boolean>
247
+ getDistinctAgentNames(): Promise<string[]>
248
+ }
249
+
250
+ export type AIAgentMeta = Record<
251
+ string,
252
+ Omit<
253
+ CoreAIAgent,
254
+ | 'input'
255
+ | 'output'
256
+ | 'tools'
257
+ | 'agents'
258
+ | 'middleware'
259
+ | 'channelMiddleware'
260
+ | 'aiMiddleware'
261
+ | 'permissions'
262
+ > & {
263
+ tools?: string[]
264
+ agents?: string[]
265
+ inputSchema: string | null
266
+ outputSchema: string | null
267
+ workingMemorySchema: string | null
268
+ middleware?: MiddlewareMetadata[]
269
+ channelMiddleware?: MiddlewareMetadata[]
270
+ aiMiddleware?: MiddlewareMetadata[]
271
+ permissions?: PermissionMetadata[]
272
+ }
273
+ >
@@ -0,0 +1,28 @@
1
+ export { runAIAgent } from './ai-agent-runner.js'
2
+ export { streamAIAgent, resumeAIAgent } from './ai-agent-stream.js'
3
+ export {
4
+ type RunAIAgentParams,
5
+ type StreamAIAgentOptions,
6
+ ToolApprovalRequired,
7
+ } from './ai-agent-prepare.js'
8
+ export {
9
+ addAIAgent,
10
+ approveAIAgent,
11
+ getAIAgents,
12
+ getAIAgentsMeta,
13
+ } from './ai-agent-registry.js'
14
+ export type {
15
+ AIAgentMeta,
16
+ AIAgentMemoryConfig,
17
+ AIAgentStep,
18
+ AgentRunRow,
19
+ AgentRunService,
20
+ AgentRunState,
21
+ AIMessage,
22
+ AIStreamChannel,
23
+ AIStreamEvent,
24
+ AIThread,
25
+ CoreAIAgent,
26
+ PendingApproval,
27
+ PikkuAIMiddlewareHooks,
28
+ } from './ai-agent.types.js'
@@ -1,7 +1,16 @@
1
- import { CoreServices, CorePikkuMiddleware } from '../../types/core.types.js'
1
+ import {
2
+ CoreSingletonServices,
3
+ CorePikkuMiddleware,
4
+ PikkuWire,
5
+ MiddlewareMetadata,
6
+ } from '../../types/core.types.js'
2
7
  import { 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
  }
@@ -10,14 +10,21 @@ import {
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 {
14
+ SessionService,
15
+ createMiddlewareSessionWireProps,
16
+ } from '../../services/user-session-service.js'
17
+
18
+ const getChannelMeta = (channelName: string) => {
19
+ return pikkuState(null, 'channel', 'meta')[channelName]
20
+ }
14
21
 
15
22
  const getRouteMeta = (
16
23
  channelName: string,
17
24
  routingProperty?: string,
18
25
  routerValue?: string
19
26
  ): ChannelMessageMeta => {
20
- const channelMeta = pikkuState('channel', 'meta')[channelName]
27
+ const channelMeta = pikkuState(null, 'channel', 'meta')[channelName]
21
28
  if (!channelMeta) {
22
29
  throw new Error(`Channel ${channelName} not found`)
23
30
  }
@@ -87,7 +94,7 @@ export const processMessageHandlers = (
87
94
  }
88
95
 
89
96
  const {
90
- pikkuFuncName,
97
+ pikkuFuncId,
91
98
  middleware: routeInheritedMiddleware,
92
99
  permissions: inheritedPermissions,
93
100
  } = getRouteMeta(channelConfig.name, routingProperty, routerValue)
@@ -122,17 +129,23 @@ export const processMessageHandlers = (
122
129
  ? `${channelConfig.name}:${routingProperty}:${routerValue}`
123
130
  : `${channelConfig.name}:default`
124
131
 
125
- return await runPikkuFunc('channel', cacheKey, pikkuFuncName, {
132
+ const channelMeta = getChannelMeta(channelConfig.name)
133
+ const wireChannelMiddleware = channelConfig.channelMiddleware || []
134
+
135
+ return await runPikkuFunc('channel', cacheKey, pikkuFuncId, {
126
136
  singletonServices: services,
127
137
  data: () => data,
128
138
  inheritedMiddleware,
129
139
  wireMiddleware,
140
+ inheritedChannelMiddleware: channelMeta?.channelMiddleware,
141
+ wireChannelMiddleware: wireChannelMiddleware as any,
130
142
  inheritedPermissions,
131
143
  wirePermissions,
132
144
  tags: channelConfig.tags,
145
+ sessionService: userSession,
133
146
  wire: {
134
147
  channel: channelHandler.getChannel(),
135
- session: userSession,
148
+ ...(userSession && createMiddlewareSessionWireProps(userSession)),
136
149
  },
137
150
  })
138
151
  }
@@ -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
+ }
@@ -1,4 +1,4 @@
1
- import { NotFoundError } from '../../errors/errors.js'
1
+ import { NotFoundError, PikkuMissingMetaError } from '../../errors/errors.js'
2
2
  import { addFunction } from '../../function/function-runner.js'
3
3
  import { CorePikkuPermission } from '../../function/functions.types.js'
4
4
  import { pikkuState } from '../../pikku-state.js'
@@ -33,31 +33,30 @@ export const wireChannel = <
33
33
  >
34
34
  ) => {
35
35
  // Get the channel metadata
36
- const channelsMeta = pikkuState('channel', 'meta')
36
+ const channelsMeta = pikkuState(null, 'channel', 'meta')
37
37
  const channelMeta = channelsMeta[channel.name]
38
38
  if (!channelMeta) {
39
- throw new Error(`Channel metadata not found for channel: ${channel.name}`)
39
+ throw new PikkuMissingMetaError(
40
+ `Missing generated metadata for channel '${channel.name}'`
41
+ )
40
42
  }
41
43
 
42
- pikkuState('channel', 'channels').set(channel.name, channel as any)
44
+ pikkuState(null, 'channel', 'channels').set(channel.name, channel as any)
43
45
 
44
46
  // Register onConnect function if provided
45
47
  if (channel.onConnect && channelMeta.connect) {
46
- addFunction(channelMeta.connect.pikkuFuncName, channel.onConnect as any)
48
+ addFunction(channelMeta.connect.pikkuFuncId, channel.onConnect as any)
47
49
  }
48
50
 
49
51
  // Register onDisconnect function if provided
50
52
  if (channel.onDisconnect && channelMeta.disconnect) {
51
- addFunction(
52
- channelMeta.disconnect.pikkuFuncName,
53
- channel.onDisconnect as any
54
- )
53
+ addFunction(channelMeta.disconnect.pikkuFuncId, channel.onDisconnect as any)
55
54
  }
56
55
 
57
56
  // Register onMessage function if provided
58
- if (channel.onMessage && channelMeta.message?.pikkuFuncName) {
57
+ if (channel.onMessage && channelMeta.message?.pikkuFuncId) {
59
58
  addFunction(
60
- channelMeta.message.pikkuFuncName,
59
+ channelMeta.message.pikkuFuncId,
61
60
  (channel.onMessage as any).func instanceof Function
62
61
  ? channel.onMessage
63
62
  : (channel.onMessage as any).func
@@ -79,7 +78,7 @@ export const wireChannel = <
79
78
  // Register the function using the pikku name from metadata
80
79
  // It could be a FuncConfig or a wiring override with a funcConfig
81
80
  addFunction(
82
- wiringMeta.pikkuFuncName,
81
+ wiringMeta.pikkuFuncId,
83
82
  (handler as any).func instanceof Function
84
83
  ? handler
85
84
  : (handler as any).func
@@ -89,7 +88,7 @@ export const wireChannel = <
89
88
  }
90
89
 
91
90
  // Store the channel configuration
92
- pikkuState('channel', 'channels').set(channel.name, channel as any)
91
+ pikkuState(null, 'channel', 'channels').set(channel.name, channel as any)
93
92
  }
94
93
 
95
94
  const getMatchingChannelConfig = (path: string) => {
@@ -98,7 +97,7 @@ const getMatchingChannelConfig = (path: string) => {
98
97
  return null
99
98
  }
100
99
 
101
- const meta = pikkuState('channel', 'meta')
100
+ const meta = pikkuState(null, 'channel', 'meta')
102
101
  const channelMeta = Object.values(meta).find(
103
102
  (channelConfig) => channelConfig.route === matchedPath.route
104
103
  )
@@ -106,7 +105,7 @@ const getMatchingChannelConfig = (path: string) => {
106
105
  return null
107
106
  }
108
107
 
109
- const channels = pikkuState('channel', 'channels')
108
+ const channels = pikkuState(null, 'channel', 'channels')
110
109
  const channelConfig = channels.get(channelMeta.name)
111
110
  if (!channelConfig) {
112
111
  return null
@@ -11,6 +11,18 @@ import {
11
11
  MiddlewareMetadata,
12
12
  PermissionMetadata,
13
13
  } from '../../types/core.types.js'
14
+
15
+ export type CorePikkuChannelMiddleware<Services = any, Event = unknown> = (
16
+ services: Services,
17
+ event: Event,
18
+ next: (event: Event | Event[] | null) => Promise<void> | void
19
+ ) => Promise<void> | void
20
+
21
+ export type CorePikkuChannelMiddlewareFactory<
22
+ In = any,
23
+ Services = any,
24
+ Event = unknown,
25
+ > = (input: In) => CorePikkuChannelMiddleware<Services, Event>
14
26
  import {
15
27
  CorePermissionGroup,
16
28
  CorePikkuFunction,
@@ -36,7 +48,7 @@ export type RunChannelParams<ChannelData> = {
36
48
  }
37
49
 
38
50
  export interface ChannelMessageMeta {
39
- pikkuFuncName: string
51
+ pikkuFuncId: string
40
52
  summary?: string
41
53
  description?: string
42
54
  errors?: string[]
@@ -62,6 +74,7 @@ export interface ChannelMeta {
62
74
  tags?: string[]
63
75
  middleware?: MiddlewareMetadata[] // Pre-resolved middleware chain (tag + explicit)
64
76
  permissions?: PermissionMetadata[] // Pre-resolved permission chain (tag + explicit)
77
+ channelMiddleware?: MiddlewareMetadata[]
65
78
  }
66
79
 
67
80
  export type ChannelsMeta = Record<string, ChannelMeta>
@@ -118,6 +131,9 @@ export type CoreChannel<
118
131
  >
119
132
  >
120
133
  middleware?: PikkuMiddleware[]
134
+ channelMiddleware?: Array<
135
+ CorePikkuChannelMiddleware | CorePikkuChannelMiddlewareFactory
136
+ >
121
137
  permissions?: CorePermissionGroup<PikkuPermission>
122
138
  auth?: boolean
123
139
  docs?: Partial<{