@pikku/core 0.11.2 → 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 (344) hide show
  1. package/CHANGELOG.md +33 -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 +8 -0
  5. package/dist/errors/errors.js +16 -0
  6. package/dist/errors/index.d.ts +0 -1
  7. package/dist/errors/index.js +0 -1
  8. package/dist/function/function-runner.d.ts +7 -1
  9. package/dist/function/function-runner.js +82 -23
  10. package/dist/function/functions.types.d.ts +31 -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.js +1 -10
  15. package/dist/index.d.ts +28 -26
  16. package/dist/index.js +18 -29
  17. package/dist/middleware/auth-apikey.d.ts +2 -2
  18. package/dist/middleware/auth-apikey.js +3 -3
  19. package/dist/middleware/auth-bearer.d.ts +2 -2
  20. package/dist/middleware/auth-bearer.js +3 -6
  21. package/dist/middleware/auth-cookie.d.ts +2 -2
  22. package/dist/middleware/auth-cookie.js +6 -8
  23. package/dist/middleware/cors.d.ts +46 -0
  24. package/dist/middleware/cors.js +73 -0
  25. package/dist/middleware/index.d.ts +5 -3
  26. package/dist/middleware/index.js +5 -3
  27. package/dist/middleware/remote-auth.d.ts +5 -0
  28. package/dist/middleware/remote-auth.js +55 -0
  29. package/dist/middleware/timeout.d.ts +2 -2
  30. package/dist/middleware-runner.js +8 -10
  31. package/dist/permissions.js +11 -15
  32. package/dist/pikku-state.d.ts +1 -0
  33. package/dist/pikku-state.js +18 -8
  34. package/dist/schema.js +12 -11
  35. package/dist/services/ai-agent-runner-service.d.ts +24 -0
  36. package/dist/services/ai-agent-runner-service.js +1 -0
  37. package/dist/services/ai-run-state-service.d.ts +13 -0
  38. package/dist/services/ai-run-state-service.js +1 -0
  39. package/dist/services/ai-storage-service.d.ts +18 -0
  40. package/dist/services/ai-storage-service.js +1 -0
  41. package/dist/services/deployment-service.d.ts +19 -0
  42. package/dist/services/deployment-service.js +1 -0
  43. package/dist/services/gopass-secrets.d.ts +47 -0
  44. package/dist/services/gopass-secrets.js +94 -0
  45. package/dist/services/in-memory-trigger-service.d.ts +23 -0
  46. package/dist/services/in-memory-trigger-service.js +50 -0
  47. package/dist/services/in-memory-workflow-service.d.ts +59 -0
  48. package/dist/services/in-memory-workflow-service.js +287 -0
  49. package/dist/services/index.d.ts +25 -11
  50. package/dist/services/index.js +10 -13
  51. package/dist/services/local-secrets.d.ts +23 -0
  52. package/dist/services/local-secrets.js +45 -0
  53. package/dist/services/local-variables.d.ts +5 -0
  54. package/dist/services/local-variables.js +18 -0
  55. package/dist/services/scheduler-service.d.ts +21 -1
  56. package/dist/services/scheduler-service.js +14 -0
  57. package/dist/services/schema-service.d.ts +6 -0
  58. package/dist/services/scoped-secret-service.d.ts +16 -0
  59. package/dist/services/scoped-secret-service.js +35 -0
  60. package/dist/services/secret-service.d.ts +25 -4
  61. package/dist/services/trigger-service.d.ts +23 -0
  62. package/dist/services/trigger-service.js +1 -0
  63. package/dist/services/typed-secret-service.d.ts +30 -0
  64. package/dist/services/typed-secret-service.js +40 -0
  65. package/dist/services/typed-variables-service.d.ts +27 -0
  66. package/dist/services/typed-variables-service.js +46 -0
  67. package/dist/services/user-session-service.d.ts +13 -0
  68. package/dist/services/user-session-service.js +17 -0
  69. package/dist/services/variables-service.d.ts +5 -0
  70. package/dist/services/workflow-service.d.ts +9 -4
  71. package/dist/types/core.types.d.ts +48 -12
  72. package/dist/types/core.types.js +8 -1
  73. package/dist/types/state.types.d.ts +43 -51
  74. package/dist/utils.d.ts +3 -2
  75. package/dist/utils.js +15 -3
  76. package/dist/version.d.ts +6 -0
  77. package/dist/version.js +19 -0
  78. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +29 -0
  79. package/dist/wirings/ai-agent/ai-agent-memory.js +199 -0
  80. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +9 -0
  81. package/dist/wirings/ai-agent/ai-agent-model-config.js +36 -0
  82. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +60 -0
  83. package/dist/wirings/ai-agent/ai-agent-prepare.js +312 -0
  84. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +15 -0
  85. package/dist/wirings/ai-agent/ai-agent-registry.js +47 -0
  86. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +3 -0
  87. package/dist/wirings/ai-agent/ai-agent-runner.js +96 -0
  88. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +11 -0
  89. package/dist/wirings/ai-agent/ai-agent-stream.js +503 -0
  90. package/dist/wirings/ai-agent/ai-agent.types.d.ts +254 -0
  91. package/dist/wirings/ai-agent/ai-agent.types.js +1 -0
  92. package/dist/wirings/ai-agent/index.d.ts +5 -0
  93. package/dist/wirings/ai-agent/index.js +4 -0
  94. package/dist/wirings/channel/channel-common.d.ts +7 -4
  95. package/dist/wirings/channel/channel-common.js +15 -8
  96. package/dist/wirings/channel/channel-handler.js +12 -3
  97. package/dist/wirings/channel/channel-middleware-runner.d.ts +9 -0
  98. package/dist/wirings/channel/channel-middleware-runner.js +73 -0
  99. package/dist/wirings/channel/channel-runner.js +7 -7
  100. package/dist/wirings/channel/channel.types.d.ts +5 -1
  101. package/dist/wirings/channel/define-channel-routes.d.ts +21 -0
  102. package/dist/wirings/channel/define-channel-routes.js +23 -0
  103. package/dist/wirings/channel/index.d.ts +10 -8
  104. package/dist/wirings/channel/index.js +7 -8
  105. package/dist/wirings/channel/local/index.d.ts +3 -3
  106. package/dist/wirings/channel/local/index.js +3 -3
  107. package/dist/wirings/channel/local/local-channel-runner.js +18 -6
  108. package/dist/wirings/channel/serverless/index.d.ts +1 -1
  109. package/dist/wirings/channel/serverless/index.js +1 -1
  110. package/dist/wirings/channel/serverless/serverless-channel-runner.js +15 -4
  111. package/dist/wirings/cli/channel/index.d.ts +1 -1
  112. package/dist/wirings/cli/channel/index.js +1 -1
  113. package/dist/wirings/cli/cli-runner.d.ts +1 -1
  114. package/dist/wirings/cli/cli-runner.js +12 -8
  115. package/dist/wirings/cli/cli.types.d.ts +6 -6
  116. package/dist/wirings/cli/define-cli-commands.d.ts +19 -0
  117. package/dist/wirings/cli/define-cli-commands.js +20 -0
  118. package/dist/wirings/cli/index.d.ts +2 -3
  119. package/dist/wirings/cli/index.js +1 -3
  120. package/dist/wirings/http/http-routes.d.ts +69 -0
  121. package/dist/wirings/http/http-routes.js +139 -0
  122. package/dist/wirings/http/http-runner.js +49 -23
  123. package/dist/wirings/http/http.types.d.ts +78 -38
  124. package/dist/wirings/http/index.d.ts +5 -4
  125. package/dist/wirings/http/index.js +4 -3
  126. package/dist/wirings/mcp/index.d.ts +4 -3
  127. package/dist/wirings/mcp/index.js +3 -3
  128. package/dist/wirings/mcp/mcp-runner.d.ts +1 -3
  129. package/dist/wirings/mcp/mcp-runner.js +25 -39
  130. package/dist/wirings/mcp/mcp.types.d.ts +3 -3
  131. package/dist/wirings/node/index.d.ts +2 -0
  132. package/dist/wirings/node/index.js +1 -0
  133. package/dist/wirings/node/node.types.d.ts +20 -0
  134. package/dist/wirings/node/node.types.js +1 -0
  135. package/dist/wirings/oauth2/index.d.ts +3 -0
  136. package/dist/wirings/oauth2/index.js +2 -0
  137. package/dist/wirings/oauth2/oauth2-client.d.ts +47 -0
  138. package/dist/wirings/oauth2/oauth2-client.js +267 -0
  139. package/dist/wirings/oauth2/oauth2.types.d.ts +65 -0
  140. package/dist/wirings/oauth2/oauth2.types.js +4 -0
  141. package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +20 -0
  142. package/dist/wirings/oauth2/wire-oauth2-credential.js +21 -0
  143. package/dist/wirings/queue/index.d.ts +2 -2
  144. package/dist/wirings/queue/index.js +1 -1
  145. package/dist/wirings/queue/queue-runner.d.ts +7 -0
  146. package/dist/wirings/queue/queue-runner.js +17 -6
  147. package/dist/wirings/queue/queue.types.d.ts +8 -2
  148. package/dist/wirings/rpc/index.d.ts +1 -1
  149. package/dist/wirings/rpc/index.js +1 -1
  150. package/dist/wirings/rpc/rpc-runner.d.ts +33 -5
  151. package/dist/wirings/rpc/rpc-runner.js +134 -16
  152. package/dist/wirings/rpc/rpc-types.d.ts +8 -4
  153. package/dist/wirings/scheduler/index.d.ts +3 -3
  154. package/dist/wirings/scheduler/index.js +2 -3
  155. package/dist/wirings/scheduler/scheduler-runner.d.ts +5 -0
  156. package/dist/wirings/scheduler/scheduler-runner.js +23 -5
  157. package/dist/wirings/secret/index.d.ts +3 -0
  158. package/dist/wirings/secret/index.js +2 -0
  159. package/dist/wirings/secret/secret.types.d.ts +27 -0
  160. package/dist/wirings/secret/secret.types.js +1 -0
  161. package/dist/wirings/secret/validate-secret-definitions.d.ts +6 -0
  162. package/dist/wirings/secret/validate-secret-definitions.js +55 -0
  163. package/dist/wirings/trigger/index.d.ts +3 -2
  164. package/dist/wirings/trigger/index.js +2 -2
  165. package/dist/wirings/trigger/pikku-trigger-service.d.ts +26 -0
  166. package/dist/wirings/trigger/pikku-trigger-service.js +75 -0
  167. package/dist/wirings/trigger/trigger-runner.d.ts +21 -8
  168. package/dist/wirings/trigger/trigger-runner.js +46 -18
  169. package/dist/wirings/trigger/trigger.types.d.ts +99 -11
  170. package/dist/wirings/trigger/trigger.types.js +40 -1
  171. package/dist/wirings/variable/index.d.ts +3 -0
  172. package/dist/wirings/variable/index.js +2 -0
  173. package/dist/wirings/variable/validate-variable-definitions.d.ts +6 -0
  174. package/dist/wirings/variable/validate-variable-definitions.js +45 -0
  175. package/dist/wirings/variable/variable.types.d.ts +18 -0
  176. package/dist/wirings/variable/variable.types.js +1 -0
  177. package/dist/wirings/workflow/dsl/index.d.ts +1 -1
  178. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +7 -1
  179. package/dist/wirings/workflow/dsl/workflow-runner.js +3 -2
  180. package/dist/wirings/workflow/graph/graph-node.d.ts +1 -6
  181. package/dist/wirings/workflow/graph/graph-runner.d.ts +5 -31
  182. package/dist/wirings/workflow/graph/graph-runner.js +384 -296
  183. package/dist/wirings/workflow/graph/index.d.ts +4 -3
  184. package/dist/wirings/workflow/graph/index.js +3 -3
  185. package/dist/wirings/workflow/graph/template.d.ts +15 -0
  186. package/dist/wirings/workflow/graph/template.js +27 -0
  187. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +15 -0
  188. package/dist/wirings/workflow/graph/wire-workflow-graph.js +8 -0
  189. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -13
  190. package/dist/wirings/workflow/index.d.ts +6 -6
  191. package/dist/wirings/workflow/index.js +6 -4
  192. package/dist/wirings/workflow/pikku-workflow-service.d.ts +28 -14
  193. package/dist/wirings/workflow/pikku-workflow-service.js +200 -56
  194. package/dist/wirings/workflow/workflow-helpers.d.ts +36 -0
  195. package/dist/wirings/workflow/workflow-helpers.js +38 -0
  196. package/dist/wirings/workflow/workflow-utils.d.ts +1 -23
  197. package/dist/wirings/workflow/workflow-utils.js +1 -66
  198. package/dist/wirings/workflow/workflow.types.d.ts +40 -93
  199. package/package.json +13 -15
  200. package/run-tests.sh +4 -1
  201. package/src/crypto-utils.ts +99 -0
  202. package/src/errors/errors.ts +17 -0
  203. package/src/errors/index.ts +0 -1
  204. package/src/factory-functions.test.ts +42 -2
  205. package/src/function/function-runner.test.ts +4 -11
  206. package/src/function/function-runner.ts +114 -29
  207. package/src/function/functions.types.ts +62 -132
  208. package/src/function/index.ts +5 -2
  209. package/src/handle-error.ts +2 -10
  210. package/src/index.ts +99 -25
  211. package/src/middleware/auth-apikey.test.ts +15 -12
  212. package/src/middleware/auth-apikey.ts +3 -3
  213. package/src/middleware/auth-bearer.test.ts +17 -14
  214. package/src/middleware/auth-bearer.ts +25 -27
  215. package/src/middleware/auth-cookie.test.ts +16 -13
  216. package/src/middleware/auth-cookie.ts +6 -8
  217. package/src/middleware/cors.ts +96 -0
  218. package/src/middleware/index.ts +5 -3
  219. package/src/middleware/remote-auth.ts +68 -0
  220. package/src/middleware-runner.test.ts +122 -0
  221. package/src/middleware-runner.ts +12 -12
  222. package/src/permissions.test.ts +81 -7
  223. package/src/permissions.ts +15 -17
  224. package/src/pikku-state.ts +20 -8
  225. package/src/run-tests-script.test.ts +49 -0
  226. package/src/schema.ts +18 -15
  227. package/src/services/ai-agent-runner-service.ts +29 -0
  228. package/src/services/ai-run-state-service.ts +20 -0
  229. package/src/services/ai-storage-service.ts +39 -0
  230. package/src/services/deployment-service.ts +22 -0
  231. package/src/services/gopass-secrets.ts +95 -0
  232. package/src/services/in-memory-trigger-service.ts +68 -0
  233. package/src/services/in-memory-workflow-service.ts +395 -0
  234. package/src/services/index.ts +49 -14
  235. package/src/services/local-secrets.ts +51 -0
  236. package/src/services/local-variables.ts +22 -0
  237. package/src/services/scheduler-service.ts +29 -1
  238. package/src/services/schema-service.ts +7 -0
  239. package/src/services/scoped-secret-service.ts +41 -0
  240. package/src/services/secret-service.ts +25 -4
  241. package/src/services/trigger-service.ts +38 -0
  242. package/src/services/typed-secret-service.ts +70 -0
  243. package/src/services/typed-variables-service.ts +81 -0
  244. package/src/services/user-session-service.ts +23 -0
  245. package/src/services/variables-service.ts +5 -0
  246. package/src/services/workflow-service.ts +22 -2
  247. package/src/types/core.types.ts +76 -11
  248. package/src/types/state.types.ts +37 -63
  249. package/src/utils.ts +20 -6
  250. package/src/version.test.ts +80 -0
  251. package/src/version.ts +25 -0
  252. package/src/wirings/ai-agent/ai-agent-memory.ts +300 -0
  253. package/src/wirings/ai-agent/ai-agent-model-config.ts +43 -0
  254. package/src/wirings/ai-agent/ai-agent-prepare.ts +470 -0
  255. package/src/wirings/ai-agent/ai-agent-registry.test.ts +37 -0
  256. package/src/wirings/ai-agent/ai-agent-registry.ts +82 -0
  257. package/src/wirings/ai-agent/ai-agent-runner.test.ts +75 -0
  258. package/src/wirings/ai-agent/ai-agent-runner.ts +137 -0
  259. package/src/wirings/ai-agent/ai-agent-stream.test.ts +246 -0
  260. package/src/wirings/ai-agent/ai-agent-stream.ts +774 -0
  261. package/src/wirings/ai-agent/ai-agent.types.ts +273 -0
  262. package/src/wirings/ai-agent/index.ts +28 -0
  263. package/src/wirings/channel/channel-common.ts +32 -19
  264. package/src/wirings/channel/channel-handler.ts +17 -4
  265. package/src/wirings/channel/channel-middleware-runner.ts +119 -0
  266. package/src/wirings/channel/channel-runner.ts +9 -10
  267. package/src/wirings/channel/channel.types.ts +17 -1
  268. package/src/wirings/channel/define-channel-routes.ts +25 -0
  269. package/src/wirings/channel/index.ts +23 -8
  270. package/src/wirings/channel/local/index.ts +3 -3
  271. package/src/wirings/channel/local/local-channel-runner.test.ts +44 -1
  272. package/src/wirings/channel/local/local-channel-runner.ts +22 -6
  273. package/src/wirings/channel/serverless/index.ts +5 -1
  274. package/src/wirings/channel/serverless/serverless-channel-runner.ts +20 -4
  275. package/src/wirings/cli/channel/index.ts +1 -1
  276. package/src/wirings/cli/cli-runner.test.ts +9 -9
  277. package/src/wirings/cli/cli-runner.ts +17 -10
  278. package/src/wirings/cli/cli.types.ts +11 -11
  279. package/src/wirings/cli/command-parser.test.ts +8 -8
  280. package/src/wirings/cli/define-cli-commands.ts +24 -0
  281. package/src/wirings/cli/index.ts +10 -4
  282. package/src/wirings/http/http-routes.test.ts +322 -0
  283. package/src/wirings/http/http-routes.ts +198 -0
  284. package/src/wirings/http/http-runner.test.ts +3 -3
  285. package/src/wirings/http/http-runner.ts +63 -29
  286. package/src/wirings/http/http.types.ts +121 -37
  287. package/src/wirings/http/index.ts +16 -4
  288. package/src/wirings/mcp/index.ts +27 -3
  289. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +3 -3
  290. package/src/wirings/mcp/mcp-runner.ts +39 -50
  291. package/src/wirings/mcp/mcp.types.ts +3 -3
  292. package/src/wirings/node/index.ts +2 -0
  293. package/src/wirings/node/node.types.ts +23 -0
  294. package/src/wirings/oauth2/index.ts +3 -0
  295. package/src/wirings/oauth2/oauth2-client.test.ts +929 -0
  296. package/src/wirings/oauth2/oauth2-client.ts +335 -0
  297. package/src/wirings/oauth2/oauth2.types.ts +69 -0
  298. package/src/wirings/oauth2/wire-oauth2-credential.ts +23 -0
  299. package/src/wirings/queue/index.ts +14 -2
  300. package/src/wirings/queue/queue-runner.test.ts +97 -55
  301. package/src/wirings/queue/queue-runner.ts +33 -7
  302. package/src/wirings/queue/queue.types.ts +12 -2
  303. package/src/wirings/rpc/index.ts +1 -1
  304. package/src/wirings/rpc/rpc-runner.ts +187 -17
  305. package/src/wirings/rpc/rpc-types.ts +13 -4
  306. package/src/wirings/scheduler/index.ts +7 -4
  307. package/src/wirings/scheduler/scheduler-runner.test.ts +70 -26
  308. package/src/wirings/scheduler/scheduler-runner.ts +45 -5
  309. package/src/wirings/secret/index.ts +9 -0
  310. package/src/wirings/secret/secret.types.ts +32 -0
  311. package/src/wirings/secret/validate-secret-definitions.ts +82 -0
  312. package/src/wirings/trigger/index.ts +10 -2
  313. package/src/wirings/trigger/pikku-trigger-service.ts +134 -0
  314. package/src/wirings/trigger/trigger-runner.ts +80 -38
  315. package/src/wirings/trigger/trigger.types.ts +144 -22
  316. package/src/wirings/variable/index.ts +8 -0
  317. package/src/wirings/variable/validate-variable-definitions.ts +69 -0
  318. package/src/wirings/variable/variable.types.ts +22 -0
  319. package/src/wirings/workflow/dsl/index.ts +1 -0
  320. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +9 -1
  321. package/src/wirings/workflow/dsl/workflow-runner.ts +4 -3
  322. package/src/wirings/workflow/graph/graph-node.ts +1 -6
  323. package/src/wirings/workflow/graph/graph-runner.test.ts +495 -0
  324. package/src/wirings/workflow/graph/graph-runner.ts +496 -374
  325. package/src/wirings/workflow/graph/index.ts +14 -3
  326. package/src/wirings/workflow/graph/template.ts +42 -0
  327. package/src/wirings/workflow/graph/wire-workflow-graph.ts +29 -0
  328. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -22
  329. package/src/wirings/workflow/index.ts +21 -10
  330. package/src/wirings/workflow/pikku-workflow-service.test.ts +212 -0
  331. package/src/wirings/workflow/pikku-workflow-service.ts +285 -66
  332. package/src/wirings/workflow/workflow-helpers.ts +79 -0
  333. package/src/wirings/workflow/workflow-utils.ts +0 -120
  334. package/src/wirings/workflow/workflow.types.ts +45 -90
  335. package/tsconfig.tsbuildinfo +1 -1
  336. package/dist/wirings/forge-node/forge-node.types.d.ts +0 -120
  337. package/dist/wirings/forge-node/forge-node.types.js +0 -38
  338. package/dist/wirings/forge-node/index.d.ts +0 -1
  339. package/dist/wirings/forge-node/index.js +0 -1
  340. package/dist/wirings/workflow/wire-workflow.d.ts +0 -42
  341. package/dist/wirings/workflow/wire-workflow.js +0 -53
  342. package/src/wirings/forge-node/forge-node.types.ts +0 -135
  343. package/src/wirings/forge-node/index.ts +0 -1
  344. package/src/wirings/workflow/wire-workflow.ts +0 -94
@@ -5,6 +5,7 @@ import {
5
5
  getQueueWorkers,
6
6
  removeQueueWorker,
7
7
  runQueueJob,
8
+ createQueueJobRunner,
8
9
  QueueJobFailedError,
9
10
  QueueJobDiscardedError,
10
11
  } from './queue-runner.js'
@@ -38,9 +39,9 @@ const createMockJob = (
38
39
  data,
39
40
  })
40
41
 
41
- const addTestQueueFunction = (pikkuFuncName: string) => {
42
- pikkuState(null, 'function', 'meta')[pikkuFuncName] = {
43
- pikkuFuncName,
42
+ const addTestQueueFunction = (pikkuFuncId: string) => {
43
+ pikkuState(null, 'function', 'meta')[pikkuFuncId] = {
44
+ pikkuFuncId,
44
45
  inputSchemaName: null,
45
46
  outputSchemaName: null,
46
47
  middleware: undefined,
@@ -51,7 +52,7 @@ const addTestQueueFunction = (pikkuFuncName: string) => {
51
52
  describe('wireQueueWorker', () => {
52
53
  test('should successfully wire a queue worker', () => {
53
54
  const mockWorker: CoreQueueWorker = {
54
- queueName: 'test-queue',
55
+ name: 'test-queue',
55
56
  func: {
56
57
  func: async (services: any, data: any, wire: any) => {
57
58
  return { processed: true }
@@ -60,10 +61,9 @@ describe('wireQueueWorker', () => {
60
61
  },
61
62
  }
62
63
 
63
- // Set up metadata first
64
64
  pikkuState(null, 'queue', 'meta')['test-queue'] = {
65
- pikkuFuncName: 'queue_test-queue',
66
- queueName: 'test-queue',
65
+ pikkuFuncId: 'queue_test-queue',
66
+ name: 'test-queue',
67
67
  }
68
68
  addTestQueueFunction('queue_test-queue')
69
69
  wireQueueWorker(mockWorker)
@@ -75,7 +75,7 @@ describe('wireQueueWorker', () => {
75
75
 
76
76
  test('should throw error when processor metadata not found', () => {
77
77
  const mockWorker: CoreQueueWorker = {
78
- queueName: 'missing-meta-queue',
78
+ name: 'missing-meta-queue',
79
79
  func: {
80
80
  func: async () => {},
81
81
  auth: false,
@@ -85,7 +85,9 @@ describe('wireQueueWorker', () => {
85
85
  assert.throws(
86
86
  () => wireQueueWorker(mockWorker),
87
87
  (error: any) => {
88
- assert(error.message.includes('Queue processor metadata not found'))
88
+ assert(
89
+ error.message.includes('Missing generated metadata for queue worker')
90
+ )
89
91
  assert(error.message.includes('missing-meta-queue'))
90
92
  return true
91
93
  }
@@ -98,7 +100,7 @@ describe('wireQueueWorker', () => {
98
100
  }
99
101
 
100
102
  const mockWorker: CoreQueueWorker = {
101
- queueName: 'worker-with-middleware',
103
+ name: 'worker-with-middleware',
102
104
  func: {
103
105
  func: async () => {},
104
106
  auth: false,
@@ -110,8 +112,8 @@ describe('wireQueueWorker', () => {
110
112
  }
111
113
 
112
114
  pikkuState(null, 'queue', 'meta')['worker-with-middleware'] = {
113
- pikkuFuncName: 'queue_worker-with-middleware',
114
- queueName: 'worker-with-middleware',
115
+ pikkuFuncId: 'queue_worker-with-middleware',
116
+ name: 'worker-with-middleware',
115
117
  }
116
118
  addTestQueueFunction('queue_worker-with-middleware')
117
119
  wireQueueWorker(mockWorker)
@@ -126,7 +128,7 @@ describe('wireQueueWorker', () => {
126
128
  describe('getQueueWorkers', () => {
127
129
  test('should return the registrations map', () => {
128
130
  const mockWorker: CoreQueueWorker = {
129
- queueName: 'test-queue',
131
+ name: 'test-queue',
130
132
  func: {
131
133
  func: async () => {},
132
134
  auth: false,
@@ -134,8 +136,8 @@ describe('getQueueWorkers', () => {
134
136
  }
135
137
 
136
138
  pikkuState(null, 'queue', 'meta')['test-queue'] = {
137
- pikkuFuncName: 'queue_test-queue',
138
- queueName: 'test-queue',
139
+ pikkuFuncId: 'queue_test-queue',
140
+ name: 'test-queue',
139
141
  }
140
142
  addTestQueueFunction('queue_test-queue')
141
143
  wireQueueWorker(mockWorker)
@@ -155,7 +157,7 @@ describe('getQueueWorkers', () => {
155
157
  describe('removeQueueWorker', () => {
156
158
  test('should successfully remove a queue worker', async () => {
157
159
  const mockWorker: CoreQueueWorker = {
158
- queueName: 'removable-queue',
160
+ name: 'removable-queue',
159
161
  func: {
160
162
  func: async () => {},
161
163
  auth: false,
@@ -163,8 +165,8 @@ describe('removeQueueWorker', () => {
163
165
  }
164
166
 
165
167
  pikkuState(null, 'queue', 'meta')['removable-queue'] = {
166
- pikkuFuncName: 'queue_removable-queue',
167
- queueName: 'removable-queue',
168
+ pikkuFuncId: 'queue_removable-queue',
169
+ name: 'removable-queue',
168
170
  }
169
171
  addTestQueueFunction('queue_removable-queue')
170
172
  wireQueueWorker(mockWorker)
@@ -198,7 +200,7 @@ describe('runQueueJob', () => {
198
200
  let receivedData: any
199
201
 
200
202
  const mockWorker: CoreQueueWorker = {
201
- queueName: 'simple-queue',
203
+ name: 'simple-queue',
202
204
  func: {
203
205
  func: async (services: any, data: any, wire: any) => {
204
206
  jobProcessed = true
@@ -210,8 +212,8 @@ describe('runQueueJob', () => {
210
212
  }
211
213
 
212
214
  pikkuState(null, 'queue', 'meta')['simple-queue'] = {
213
- pikkuFuncName: 'queue_simple-queue',
214
- queueName: 'simple-queue',
215
+ pikkuFuncId: 'queue_simple-queue',
216
+ name: 'simple-queue',
215
217
  }
216
218
  addTestQueueFunction('queue_simple-queue')
217
219
  wireQueueWorker(mockWorker)
@@ -238,7 +240,7 @@ describe('runQueueJob', () => {
238
240
 
239
241
  test('should handle job.fail() by throwing QueueJobFailedError', async () => {
240
242
  const mockWorker: CoreQueueWorker = {
241
- queueName: 'fail-queue',
243
+ name: 'fail-queue',
242
244
  func: {
243
245
  func: async (services: any, data: any, wire: any) => {
244
246
  await wire.queue.fail('Processing failed')
@@ -248,8 +250,8 @@ describe('runQueueJob', () => {
248
250
  }
249
251
 
250
252
  pikkuState(null, 'queue', 'meta')['fail-queue'] = {
251
- pikkuFuncName: 'queue_fail-queue',
252
- queueName: 'fail-queue',
253
+ pikkuFuncId: 'queue_fail-queue',
254
+ name: 'fail-queue',
253
255
  }
254
256
  addTestQueueFunction('queue_fail-queue')
255
257
  wireQueueWorker(mockWorker)
@@ -276,7 +278,7 @@ describe('runQueueJob', () => {
276
278
 
277
279
  test('should handle job.fail() without reason', async () => {
278
280
  const mockWorker: CoreQueueWorker = {
279
- queueName: 'fail-no-reason-queue',
281
+ name: 'fail-no-reason-queue',
280
282
  func: {
281
283
  func: async (services: any, data: any, wire: any) => {
282
284
  await wire.queue.fail()
@@ -286,8 +288,8 @@ describe('runQueueJob', () => {
286
288
  }
287
289
 
288
290
  pikkuState(null, 'queue', 'meta')['fail-no-reason-queue'] = {
289
- pikkuFuncName: 'queue_fail-no-reason-queue',
290
- queueName: 'fail-no-reason-queue',
291
+ pikkuFuncId: 'queue_fail-no-reason-queue',
292
+ name: 'fail-no-reason-queue',
291
293
  }
292
294
  addTestQueueFunction('queue_fail-no-reason-queue')
293
295
  wireQueueWorker(mockWorker)
@@ -312,7 +314,7 @@ describe('runQueueJob', () => {
312
314
 
313
315
  test('should handle job.discard() by throwing QueueJobDiscardedError', async () => {
314
316
  const mockWorker: CoreQueueWorker = {
315
- queueName: 'discard-queue',
317
+ name: 'discard-queue',
316
318
  func: {
317
319
  func: async (services: any, data: any, wire: any) => {
318
320
  await wire.queue.discard('Invalid data')
@@ -322,8 +324,8 @@ describe('runQueueJob', () => {
322
324
  }
323
325
 
324
326
  pikkuState(null, 'queue', 'meta')['discard-queue'] = {
325
- pikkuFuncName: 'queue_discard-queue',
326
- queueName: 'discard-queue',
327
+ pikkuFuncId: 'queue_discard-queue',
328
+ name: 'discard-queue',
327
329
  }
328
330
  addTestQueueFunction('queue_discard-queue')
329
331
  wireQueueWorker(mockWorker)
@@ -352,7 +354,7 @@ describe('runQueueJob', () => {
352
354
  const progressUpdates: Array<number | string | object> = []
353
355
 
354
356
  const mockWorker: CoreQueueWorker = {
355
- queueName: 'progress-queue',
357
+ name: 'progress-queue',
356
358
  func: {
357
359
  func: async (services: any, data: any, wire: any) => {
358
360
  await wire.queue.updateProgress(25)
@@ -365,8 +367,8 @@ describe('runQueueJob', () => {
365
367
  }
366
368
 
367
369
  pikkuState(null, 'queue', 'meta')['progress-queue'] = {
368
- pikkuFuncName: 'queue_progress-queue',
369
- queueName: 'progress-queue',
370
+ pikkuFuncId: 'queue_progress-queue',
371
+ name: 'progress-queue',
370
372
  }
371
373
  addTestQueueFunction('queue_progress-queue')
372
374
  wireQueueWorker(mockWorker)
@@ -387,7 +389,7 @@ describe('runQueueJob', () => {
387
389
 
388
390
  test('should use default updateProgress when not provided', async () => {
389
391
  const mockWorker: CoreQueueWorker = {
390
- queueName: 'default-progress-queue',
392
+ name: 'default-progress-queue',
391
393
  func: {
392
394
  func: async (services: any, data: any, wire: any) => {
393
395
  await wire.queue.updateProgress(50)
@@ -398,8 +400,8 @@ describe('runQueueJob', () => {
398
400
  }
399
401
 
400
402
  pikkuState(null, 'queue', 'meta')['default-progress-queue'] = {
401
- pikkuFuncName: 'queue_default-progress-queue',
402
- queueName: 'default-progress-queue',
403
+ pikkuFuncId: 'queue_default-progress-queue',
404
+ name: 'default-progress-queue',
403
405
  }
404
406
  addTestQueueFunction('queue_default-progress-queue')
405
407
  wireQueueWorker(mockWorker)
@@ -421,7 +423,7 @@ describe('runQueueJob', () => {
421
423
  let capturedWire: any
422
424
 
423
425
  const mockWorker: CoreQueueWorker = {
424
- queueName: 'wire-queue',
426
+ name: 'wire-queue',
425
427
  func: {
426
428
  func: async (services: any, data: any, wire: any) => {
427
429
  capturedWire = wire
@@ -432,8 +434,8 @@ describe('runQueueJob', () => {
432
434
  }
433
435
 
434
436
  pikkuState(null, 'queue', 'meta')['wire-queue'] = {
435
- pikkuFuncName: 'queue_wire-queue',
436
- queueName: 'wire-queue',
437
+ pikkuFuncId: 'queue_wire-queue',
438
+ name: 'wire-queue',
437
439
  }
438
440
  addTestQueueFunction('queue_wire-queue')
439
441
  wireQueueWorker(mockWorker)
@@ -465,7 +467,9 @@ describe('runQueueJob', () => {
465
467
  })
466
468
  },
467
469
  (error: any) => {
468
- assert(error.message.includes('Processor metadata not found'))
470
+ assert(
471
+ error.message.includes('Missing generated metadata for queue worker')
472
+ )
469
473
  assert(error.message.includes('missing-meta-queue'))
470
474
  return true
471
475
  }
@@ -473,10 +477,9 @@ describe('runQueueJob', () => {
473
477
  })
474
478
 
475
479
  test('should throw error when queue worker registration not found', async () => {
476
- // Add metadata but not registration
477
480
  pikkuState(null, 'queue', 'meta')['no-registration-queue'] = {
478
- pikkuFuncName: 'queue_no-registration-queue',
479
- queueName: 'no-registration-queue',
481
+ pikkuFuncId: 'queue_no-registration-queue',
482
+ name: 'no-registration-queue',
480
483
  }
481
484
 
482
485
  const mockLogger = createMockLogger()
@@ -502,7 +505,7 @@ describe('runQueueJob', () => {
502
505
  const mockWireService = { custom: 'service' }
503
506
 
504
507
  const mockWorker: CoreQueueWorker = {
505
- queueName: 'session-services-queue',
508
+ name: 'session-services-queue',
506
509
  func: {
507
510
  func: async () => 'ok',
508
511
  auth: false,
@@ -510,8 +513,8 @@ describe('runQueueJob', () => {
510
513
  }
511
514
 
512
515
  pikkuState(null, 'queue', 'meta')['session-services-queue'] = {
513
- pikkuFuncName: 'queue_session-services-queue',
514
- queueName: 'session-services-queue',
516
+ pikkuFuncId: 'queue_session-services-queue',
517
+ name: 'session-services-queue',
515
518
  }
516
519
  addTestQueueFunction('queue_session-services-queue')
517
520
  wireQueueWorker(mockWorker)
@@ -533,7 +536,7 @@ describe('runQueueJob', () => {
533
536
 
534
537
  test('should log errors when job processing fails', async () => {
535
538
  const mockWorker: CoreQueueWorker = {
536
- queueName: 'error-queue',
539
+ name: 'error-queue',
537
540
  func: {
538
541
  func: async () => {
539
542
  throw new Error('Processing error')
@@ -543,8 +546,8 @@ describe('runQueueJob', () => {
543
546
  }
544
547
 
545
548
  pikkuState(null, 'queue', 'meta')['error-queue'] = {
546
- pikkuFuncName: 'queue_error-queue',
547
- queueName: 'error-queue',
549
+ pikkuFuncId: 'queue_error-queue',
550
+ name: 'error-queue',
548
551
  }
549
552
  addTestQueueFunction('queue_error-queue')
550
553
  wireQueueWorker(mockWorker)
@@ -580,7 +583,7 @@ describe('runQueueJob', () => {
580
583
  }
581
584
 
582
585
  const mockWorker: CoreQueueWorker = {
583
- queueName: 'middleware-queue',
586
+ name: 'middleware-queue',
584
587
  func: {
585
588
  func: async () => {
586
589
  executionOrder.push('job')
@@ -592,8 +595,8 @@ describe('runQueueJob', () => {
592
595
  }
593
596
 
594
597
  pikkuState(null, 'queue', 'meta')['middleware-queue'] = {
595
- pikkuFuncName: 'queue_middleware-queue',
596
- queueName: 'middleware-queue',
598
+ pikkuFuncId: 'queue_middleware-queue',
599
+ name: 'middleware-queue',
597
600
  }
598
601
  addTestQueueFunction('queue_middleware-queue')
599
602
  wireQueueWorker(mockWorker)
@@ -611,7 +614,7 @@ describe('runQueueJob', () => {
611
614
 
612
615
  test('should log debug message on successful job completion', async () => {
613
616
  const mockWorker: CoreQueueWorker = {
614
- queueName: 'debug-queue',
617
+ name: 'debug-queue',
615
618
  func: {
616
619
  func: async () => 'success',
617
620
  auth: false,
@@ -619,8 +622,8 @@ describe('runQueueJob', () => {
619
622
  }
620
623
 
621
624
  pikkuState(null, 'queue', 'meta')['debug-queue'] = {
622
- pikkuFuncName: 'queue_debug-queue',
623
- queueName: 'debug-queue',
625
+ pikkuFuncId: 'queue_debug-queue',
626
+ name: 'debug-queue',
624
627
  }
625
628
  addTestQueueFunction('queue_debug-queue')
626
629
  wireQueueWorker(mockWorker)
@@ -639,3 +642,42 @@ describe('runQueueJob', () => {
639
642
  assert(debugLogs[0].message.includes('Successfully processed job job-777'))
640
643
  })
641
644
  })
645
+
646
+ describe('createQueueJobRunner', () => {
647
+ test('delegates queue job execution using bound services', async () => {
648
+ const mockWorker: CoreQueueWorker = {
649
+ name: 'bound-runner-queue',
650
+ func: {
651
+ func: async (_services: any, data: any) => {
652
+ return data.value + 1
653
+ },
654
+ auth: false,
655
+ },
656
+ }
657
+
658
+ pikkuState(null, 'queue', 'meta')['bound-runner-queue'] = {
659
+ pikkuFuncId: 'queue_bound-runner-queue',
660
+ name: 'bound-runner-queue',
661
+ }
662
+ addTestQueueFunction('queue_bound-runner-queue')
663
+ wireQueueWorker(mockWorker)
664
+
665
+ const mockLogger = createMockLogger()
666
+ const runJob = createQueueJobRunner({
667
+ singletonServices: { logger: mockLogger } as any,
668
+ })
669
+
670
+ await runJob({
671
+ job: createMockJob('bound-runner-queue', 'job-888', { value: 41 }),
672
+ })
673
+
674
+ const logs = mockLogger.getLogs()
675
+ assert(
676
+ logs.some(
677
+ (log) =>
678
+ log.level === 'debug' &&
679
+ String(log.message).includes('Successfully processed job job-888')
680
+ )
681
+ )
682
+ })
683
+ })
@@ -5,6 +5,7 @@ import type {
5
5
  CorePikkuFunctionSessionless,
6
6
  } from '../../function/functions.types.js'
7
7
  import { getErrorResponse, PikkuError } from '../../errors/error-handler.js'
8
+ import { PikkuMissingMetaError } from '../../errors/errors.js'
8
9
  import { pikkuState } from '../../pikku-state.js'
9
10
  import { addFunction, runPikkuFunc } from '../../function/function-runner.js'
10
11
  import { CreateWireServices } from '../../types/core.types.js'
@@ -53,15 +54,15 @@ export const wireQueueWorker = <
53
54
  ) => {
54
55
  // Get processor metadata
55
56
  const meta = pikkuState(null, 'queue', 'meta')
56
- const processorMeta = meta[queueWorker.queueName]
57
+ const processorMeta = meta[queueWorker.name]
57
58
  if (!processorMeta) {
58
- throw new Error(
59
- `Queue processor metadata not found for '${queueWorker.queueName}'. Make sure to run the CLI to generate metadata.`
59
+ throw new PikkuMissingMetaError(
60
+ `Missing generated metadata for queue worker '${queueWorker.name}'`
60
61
  )
61
62
  }
62
63
 
63
64
  // Register the function with pikku
64
- addFunction(processorMeta.pikkuFuncName, {
65
+ addFunction(processorMeta.pikkuFuncId, {
65
66
  func: queueWorker.func.func,
66
67
  auth: queueWorker.func.auth,
67
68
  permissions: queueWorker.func.permissions,
@@ -71,7 +72,7 @@ export const wireQueueWorker = <
71
72
 
72
73
  // Store processor definition in state - runtime adapters will pick this up
73
74
  const registrations = pikkuState(null, 'queue', 'registrations')
74
- registrations.set(queueWorker.queueName, queueWorker)
75
+ registrations.set(queueWorker.name, queueWorker)
75
76
  }
76
77
 
77
78
  /**
@@ -114,7 +115,9 @@ export async function runQueueJob({
114
115
  const meta = pikkuState(null, 'queue', 'meta')
115
116
  const processorMeta = meta[job.queueName]
116
117
  if (!processorMeta) {
117
- throw new Error(`Processor metadata not found for: ${job.queueName}`)
118
+ throw new PikkuMissingMetaError(
119
+ `Missing generated metadata for queue worker '${job.queueName}'`
120
+ )
118
121
  }
119
122
 
120
123
  // Get the queue worker registration to access middleware
@@ -153,7 +156,7 @@ export async function runQueueJob({
153
156
  const result = await runPikkuFunc(
154
157
  'queue',
155
158
  job.queueName,
156
- processorMeta.pikkuFuncName,
159
+ processorMeta.pikkuFuncId,
157
160
  {
158
161
  singletonServices,
159
162
  createWireServices,
@@ -186,3 +189,26 @@ export async function runQueueJob({
186
189
  throw error
187
190
  }
188
191
  }
192
+
193
+ export const createQueueJobRunner = ({
194
+ singletonServices,
195
+ createWireServices,
196
+ }: {
197
+ singletonServices: CoreServices
198
+ createWireServices?: CreateWireServices
199
+ }) => {
200
+ return async ({
201
+ job,
202
+ updateProgress,
203
+ }: {
204
+ job: QueueJob
205
+ updateProgress?: (progress: number | string | object) => Promise<void>
206
+ }) => {
207
+ await runQueueJob({
208
+ singletonServices,
209
+ createWireServices,
210
+ job,
211
+ updateProgress,
212
+ })
213
+ }
214
+ }
@@ -1,6 +1,7 @@
1
1
  import { CommonWireMeta } from '../../types/core.types.js'
2
2
  import { CorePikkuFunctionConfig } from '../../function/functions.types.js'
3
3
  import { QueueConfigMapping } from './validate-worker-config.js'
4
+ import { Logger } from '../../services/logger.js'
4
5
 
5
6
  /**
6
7
  * Configuration for queue workers - how jobs are processed
@@ -138,6 +139,15 @@ export interface QueueWorkers {
138
139
  /** Configuration mapping for validation */
139
140
  configMappings: QueueConfigMapping
140
141
 
142
+ /** Set runtime queue job runner callback and logger */
143
+ setJobRunner(
144
+ runJob: (params: {
145
+ job: QueueJob
146
+ updateProgress?: (progress: number | string | object) => Promise<void>
147
+ }) => Promise<void>,
148
+ logger: Logger
149
+ ): void
150
+
141
151
  /** Scan state and register all compatible processors */
142
152
  registerQueues(): Promise<Record<string, ConfigValidationResult[]>>
143
153
  }
@@ -148,7 +158,7 @@ export interface QueueWorkers {
148
158
  export type QueueWorkersMeta = Record<
149
159
  string,
150
160
  CommonWireMeta & {
151
- queueName: string
161
+ name: string
152
162
  config?: PikkuWorkerConfig
153
163
  }
154
164
  >
@@ -163,7 +173,7 @@ export type CoreQueueWorker<
163
173
  any
164
174
  > = CorePikkuFunctionConfig<any, any, any>,
165
175
  > = {
166
- queueName: string
176
+ name: string
167
177
  func: PikkuFunctionConfig
168
178
  config?: PikkuWorkerConfig
169
179
  errors?: string[]
@@ -1,2 +1,2 @@
1
- export { PikkuRPCService, rpcService } from './rpc-runner.js'
1
+ export { PikkuRPCService, rpcService, RPCNotFoundError } from './rpc-runner.js'
2
2
  export type { PikkuRPC, RPCMeta } from './rpc-types.js'