@pikku/core 0.12.0 → 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 (262) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/errors/errors.d.ts +6 -0
  3. package/dist/errors/errors.js +10 -0
  4. package/dist/errors/index.d.ts +1 -0
  5. package/dist/errors/index.js +1 -0
  6. package/dist/function/function-runner.d.ts +3 -3
  7. package/dist/function/function-runner.js +66 -44
  8. package/dist/function/functions.types.d.ts +1 -0
  9. package/dist/handle-error.d.ts +2 -2
  10. package/dist/handle-error.js +2 -2
  11. package/dist/index.d.ts +5 -3
  12. package/dist/index.js +2 -1
  13. package/dist/internal.d.ts +3 -0
  14. package/dist/internal.js +2 -0
  15. package/dist/middleware/auth-bearer.d.ts +1 -1
  16. package/dist/middleware/auth-bearer.js +1 -1
  17. package/dist/middleware/auth-cookie.d.ts +2 -2
  18. package/dist/middleware/auth-cookie.js +1 -1
  19. package/dist/middleware/cors.d.ts +2 -2
  20. package/dist/middleware/cors.js +45 -37
  21. package/dist/middleware-runner.d.ts +1 -1
  22. package/dist/permissions.d.ts +2 -2
  23. package/dist/pikku-state.d.ts +9 -8
  24. package/dist/pikku-state.js +30 -17
  25. package/dist/schema.d.ts +4 -4
  26. package/dist/schema.js +9 -5
  27. package/dist/services/ai-agent-runner-service.d.ts +22 -3
  28. package/dist/services/ai-run-state-service.d.ts +1 -1
  29. package/dist/services/ai-storage-service.d.ts +1 -1
  30. package/dist/services/content-service.d.ts +6 -0
  31. package/dist/services/gopass-secrets.d.ts +1 -1
  32. package/dist/services/gopass-secrets.js +3 -0
  33. package/dist/services/in-memory-ai-run-state-service.d.ts +15 -0
  34. package/dist/services/in-memory-ai-run-state-service.js +44 -0
  35. package/dist/services/in-memory-trigger-service.d.ts +0 -1
  36. package/dist/services/in-memory-trigger-service.js +6 -8
  37. package/dist/services/index.d.ts +3 -2
  38. package/dist/services/index.js +1 -0
  39. package/dist/services/local-content.d.ts +2 -1
  40. package/dist/services/local-content.js +6 -1
  41. package/dist/services/local-secrets.d.ts +2 -2
  42. package/dist/services/local-variables.d.ts +1 -1
  43. package/dist/services/logger-console.d.ts +2 -1
  44. package/dist/services/scheduler-service.d.ts +0 -12
  45. package/dist/services/scheduler-service.js +0 -6
  46. package/dist/services/scoped-secret-service.d.ts +1 -1
  47. package/dist/services/trigger-service.d.ts +0 -7
  48. package/dist/services/user-session-service.d.ts +3 -3
  49. package/dist/services/workflow-service.d.ts +2 -3
  50. package/dist/types/core.types.d.ts +24 -18
  51. package/dist/types/state.types.d.ts +17 -15
  52. package/dist/utils.d.ts +5 -5
  53. package/dist/utils.js +12 -9
  54. package/dist/wirings/ai-agent/ai-agent-assistant-ui.d.ts +5 -0
  55. package/dist/wirings/ai-agent/ai-agent-assistant-ui.js +146 -0
  56. package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +28 -0
  57. package/dist/wirings/ai-agent/ai-agent-helpers.js +40 -0
  58. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +4 -5
  59. package/dist/wirings/ai-agent/ai-agent-prepare.js +66 -30
  60. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +1 -1
  61. package/dist/wirings/ai-agent/ai-agent-runner.js +107 -8
  62. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +2 -1
  63. package/dist/wirings/ai-agent/ai-agent-stream.js +246 -87
  64. package/dist/wirings/ai-agent/ai-agent.types.d.ts +61 -2
  65. package/dist/wirings/ai-agent/index.d.ts +3 -1
  66. package/dist/wirings/ai-agent/index.js +2 -0
  67. package/dist/wirings/channel/channel-common.d.ts +2 -2
  68. package/dist/wirings/channel/channel-handler.d.ts +3 -3
  69. package/dist/wirings/channel/channel-handler.js +4 -4
  70. package/dist/wirings/channel/channel-runner.d.ts +5 -5
  71. package/dist/wirings/channel/channel-runner.js +3 -2
  72. package/dist/wirings/channel/channel-store.d.ts +1 -1
  73. package/dist/wirings/channel/channel.types.d.ts +4 -6
  74. package/dist/wirings/channel/local/local-channel-runner.d.ts +7 -2
  75. package/dist/wirings/channel/local/local-channel-runner.js +4 -3
  76. package/dist/wirings/channel/local/local-eventhub-service.d.ts +2 -2
  77. package/dist/wirings/channel/log-channels.d.ts +1 -1
  78. package/dist/wirings/channel/pikku-abstract-channel-handler.d.ts +1 -1
  79. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +4 -4
  80. package/dist/wirings/channel/serverless/serverless-channel-runner.js +25 -19
  81. package/dist/wirings/cli/channel/cli-channel-runner.d.ts +1 -1
  82. package/dist/wirings/cli/cli-runner.d.ts +2 -2
  83. package/dist/wirings/cli/cli.types.d.ts +3 -3
  84. package/dist/wirings/cli/command-parser.d.ts +1 -1
  85. package/dist/wirings/http/http-runner.d.ts +9 -9
  86. package/dist/wirings/http/http-runner.js +33 -14
  87. package/dist/wirings/http/http.types.d.ts +2 -6
  88. package/dist/wirings/http/log-http-routes.d.ts +1 -1
  89. package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -1
  90. package/dist/wirings/http/pikku-fetch-http-response.d.ts +2 -2
  91. package/dist/wirings/http/pikku-fetch-http-response.js +6 -1
  92. package/dist/wirings/http/routers/http-router.d.ts +1 -1
  93. package/dist/wirings/http/routers/path-to-regex.d.ts +2 -2
  94. package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +1 -1
  95. package/dist/wirings/mcp/mcp-runner.d.ts +0 -3
  96. package/dist/wirings/mcp/mcp-runner.js +4 -2
  97. package/dist/wirings/mcp/mcp.types.d.ts +2 -2
  98. package/dist/wirings/oauth2/oauth2-client.d.ts +3 -3
  99. package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +1 -1
  100. package/dist/wirings/queue/index.d.ts +1 -1
  101. package/dist/wirings/queue/index.js +1 -1
  102. package/dist/wirings/queue/queue-runner.d.ts +1 -12
  103. package/dist/wirings/queue/queue-runner.js +4 -12
  104. package/dist/wirings/queue/queue.types.d.ts +3 -9
  105. package/dist/wirings/queue/register-queue-helper.d.ts +2 -2
  106. package/dist/wirings/queue/register-queue-helper.js +1 -1
  107. package/dist/wirings/queue/validate-worker-config.d.ts +1 -1
  108. package/dist/wirings/rpc/index.d.ts +2 -0
  109. package/dist/wirings/rpc/index.js +1 -0
  110. package/dist/wirings/rpc/rpc-runner.d.ts +36 -14
  111. package/dist/wirings/rpc/rpc-runner.js +56 -28
  112. package/dist/wirings/rpc/rpc-types.d.ts +14 -2
  113. package/dist/wirings/rpc/wire-addon.d.ts +10 -0
  114. package/dist/wirings/rpc/wire-addon.js +9 -0
  115. package/dist/wirings/scheduler/index.d.ts +1 -1
  116. package/dist/wirings/scheduler/index.js +1 -1
  117. package/dist/wirings/scheduler/log-schedulers.d.ts +1 -1
  118. package/dist/wirings/scheduler/scheduler-runner.d.ts +3 -10
  119. package/dist/wirings/scheduler/scheduler-runner.js +4 -25
  120. package/dist/wirings/scheduler/scheduler.types.d.ts +2 -2
  121. package/dist/wirings/trigger/pikku-trigger-service.d.ts +2 -6
  122. package/dist/wirings/trigger/pikku-trigger-service.js +11 -16
  123. package/dist/wirings/trigger/trigger-runner.d.ts +1 -5
  124. package/dist/wirings/trigger/trigger-runner.js +4 -3
  125. package/dist/wirings/workflow/pikku-workflow-service.d.ts +2 -6
  126. package/dist/wirings/workflow/pikku-workflow-service.js +20 -29
  127. package/dist/wirings/workflow/workflow.types.d.ts +2 -2
  128. package/package.json +2 -1
  129. package/src/crypto-utils.test.ts +116 -0
  130. package/src/errors/error.test.ts +143 -2
  131. package/src/errors/errors.ts +10 -0
  132. package/src/errors/index.ts +1 -0
  133. package/src/function/function-runner.test.ts +2 -2
  134. package/src/function/function-runner.ts +72 -49
  135. package/src/function/functions.types.ts +1 -0
  136. package/src/handle-error.test.ts +361 -0
  137. package/src/handle-error.ts +4 -4
  138. package/src/index.ts +3 -10
  139. package/src/internal.ts +6 -0
  140. package/src/middleware/auth-apikey.test.ts +1 -1
  141. package/src/middleware/auth-bearer.test.ts +1 -1
  142. package/src/middleware/auth-bearer.ts +2 -5
  143. package/src/middleware/auth-cookie.test.ts +1 -1
  144. package/src/middleware/auth-cookie.ts +3 -5
  145. package/src/middleware/cors.test.ts +424 -0
  146. package/src/middleware/cors.ts +14 -6
  147. package/src/middleware/remote-auth.test.ts +488 -0
  148. package/src/middleware-runner.test.ts +1 -1
  149. package/src/middleware-runner.ts +1 -1
  150. package/src/permissions.test.ts +2 -2
  151. package/src/permissions.ts +2 -2
  152. package/src/pikku-state.test.ts +224 -0
  153. package/src/pikku-state.ts +40 -28
  154. package/src/schema.test.ts +198 -6
  155. package/src/schema.ts +11 -7
  156. package/src/services/ai-agent-runner-service.ts +15 -3
  157. package/src/services/ai-run-state-service.ts +1 -1
  158. package/src/services/ai-storage-service.ts +1 -1
  159. package/src/services/content-service.ts +7 -0
  160. package/src/services/gopass-secrets.ts +4 -1
  161. package/src/services/in-memory-ai-run-state-service.ts +73 -0
  162. package/src/services/in-memory-trigger-service.ts +6 -10
  163. package/src/services/in-memory-workflow-service.test.ts +351 -0
  164. package/src/services/index.ts +2 -1
  165. package/src/services/local-content.ts +9 -3
  166. package/src/services/local-secrets.test.ts +80 -0
  167. package/src/services/local-secrets.ts +2 -2
  168. package/src/services/local-variables.test.ts +61 -0
  169. package/src/services/local-variables.ts +1 -1
  170. package/src/services/logger-console.test.ts +118 -0
  171. package/src/services/logger-console.ts +2 -1
  172. package/src/services/scheduler-service.ts +0 -18
  173. package/src/services/scoped-secret-service.test.ts +74 -0
  174. package/src/services/scoped-secret-service.ts +1 -1
  175. package/src/services/trigger-service.ts +0 -21
  176. package/src/services/typed-secret-service.test.ts +93 -0
  177. package/src/services/typed-variables-service.test.ts +73 -0
  178. package/src/services/user-session-service.test.ts +113 -0
  179. package/src/services/user-session-service.ts +3 -3
  180. package/src/services/workflow-service.ts +2 -12
  181. package/src/time-utils.test.ts +1 -1
  182. package/src/types/core.types.ts +25 -19
  183. package/src/types/state.types.ts +24 -15
  184. package/src/utils.test.ts +350 -0
  185. package/src/utils.ts +14 -13
  186. package/src/wirings/ai-agent/ai-agent-assistant-ui.test.ts +363 -0
  187. package/src/wirings/ai-agent/ai-agent-assistant-ui.ts +214 -0
  188. package/src/wirings/ai-agent/ai-agent-helpers.test.ts +152 -0
  189. package/src/wirings/ai-agent/ai-agent-helpers.ts +76 -0
  190. package/src/wirings/ai-agent/ai-agent-model-config.test.ts +115 -0
  191. package/src/wirings/ai-agent/ai-agent-prepare.ts +79 -45
  192. package/src/wirings/ai-agent/ai-agent-registry.ts +1 -1
  193. package/src/wirings/ai-agent/ai-agent-runner.test.ts +245 -3
  194. package/src/wirings/ai-agent/ai-agent-runner.ts +121 -7
  195. package/src/wirings/ai-agent/ai-agent-stream.test.ts +430 -24
  196. package/src/wirings/ai-agent/ai-agent-stream.ts +377 -102
  197. package/src/wirings/ai-agent/ai-agent.types.ts +57 -2
  198. package/src/wirings/ai-agent/index.ts +11 -0
  199. package/src/wirings/channel/channel-common.ts +2 -2
  200. package/src/wirings/channel/channel-handler.ts +13 -9
  201. package/src/wirings/channel/channel-runner.ts +6 -6
  202. package/src/wirings/channel/channel-store.ts +1 -1
  203. package/src/wirings/channel/channel.types.ts +4 -8
  204. package/src/wirings/channel/local/local-channel-runner.test.ts +19 -12
  205. package/src/wirings/channel/local/local-channel-runner.ts +18 -13
  206. package/src/wirings/channel/local/local-eventhub-service.test.ts +2 -2
  207. package/src/wirings/channel/local/local-eventhub-service.ts +2 -2
  208. package/src/wirings/channel/log-channels.ts +1 -1
  209. package/src/wirings/channel/pikku-abstract-channel-handler.ts +1 -1
  210. package/src/wirings/channel/serverless/serverless-channel-runner.ts +37 -32
  211. package/src/wirings/cli/channel/cli-channel-runner.ts +1 -1
  212. package/src/wirings/cli/cli-runner.test.ts +1 -1
  213. package/src/wirings/cli/cli-runner.ts +11 -4
  214. package/src/wirings/cli/cli.types.ts +3 -3
  215. package/src/wirings/cli/command-parser.test.ts +1 -1
  216. package/src/wirings/cli/command-parser.ts +1 -1
  217. package/src/wirings/http/http-routes.test.ts +1 -1
  218. package/src/wirings/http/http-runner.test.ts +9 -17
  219. package/src/wirings/http/http-runner.ts +43 -27
  220. package/src/wirings/http/http.types.ts +1 -14
  221. package/src/wirings/http/log-http-routes.ts +1 -1
  222. package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
  223. package/src/wirings/http/pikku-fetch-http-response.ts +12 -5
  224. package/src/wirings/http/routers/http-router.ts +1 -1
  225. package/src/wirings/http/routers/path-to-regex.test.ts +1 -1
  226. package/src/wirings/http/routers/path-to-regex.ts +4 -3
  227. package/src/wirings/mcp/mcp-endpoint-registry.ts +5 -1
  228. package/src/wirings/mcp/mcp-runner.ts +9 -15
  229. package/src/wirings/mcp/mcp.types.ts +2 -2
  230. package/src/wirings/oauth2/oauth2-client.ts +3 -3
  231. package/src/wirings/oauth2/wire-oauth2-credential.ts +1 -1
  232. package/src/wirings/queue/index.ts +0 -1
  233. package/src/wirings/queue/queue-runner.test.ts +52 -25
  234. package/src/wirings/queue/queue-runner.ts +8 -30
  235. package/src/wirings/queue/queue.types.ts +3 -13
  236. package/src/wirings/queue/register-queue-helper.ts +3 -5
  237. package/src/wirings/queue/validate-worker-config.test.ts +108 -0
  238. package/src/wirings/queue/validate-worker-config.ts +4 -1
  239. package/src/wirings/rpc/index.ts +2 -0
  240. package/src/wirings/rpc/rpc-runner.ts +92 -49
  241. package/src/wirings/rpc/rpc-types.ts +17 -2
  242. package/src/wirings/rpc/wire-addon.ts +20 -0
  243. package/src/wirings/scheduler/index.ts +0 -1
  244. package/src/wirings/scheduler/log-schedulers.ts +1 -1
  245. package/src/wirings/scheduler/scheduler-runner.test.ts +49 -60
  246. package/src/wirings/scheduler/scheduler-runner.ts +9 -56
  247. package/src/wirings/scheduler/scheduler.types.ts +2 -2
  248. package/src/wirings/secret/validate-secret-definitions.test.ts +140 -0
  249. package/src/wirings/trigger/pikku-trigger-service.ts +17 -39
  250. package/src/wirings/trigger/trigger-runner.test.ts +79 -0
  251. package/src/wirings/trigger/trigger-runner.ts +8 -11
  252. package/src/wirings/variable/validate-variable-definitions.test.ts +91 -0
  253. package/src/wirings/workflow/graph/graph-runner.test.ts +14 -22
  254. package/src/wirings/workflow/graph/template.test.ts +49 -0
  255. package/src/wirings/workflow/pikku-workflow-service.test.ts +15 -27
  256. package/src/wirings/workflow/pikku-workflow-service.ts +29 -45
  257. package/src/wirings/workflow/workflow-helpers.test.ts +129 -0
  258. package/src/wirings/workflow/workflow.types.ts +2 -2
  259. package/tsconfig.tsbuildinfo +1 -1
  260. package/dist/wirings/workflow/workflow-utils.d.ts +0 -1
  261. package/dist/wirings/workflow/workflow-utils.js +0 -1
  262. package/src/wirings/workflow/workflow-utils.ts +0 -0
@@ -5,12 +5,11 @@ import {
5
5
  getQueueWorkers,
6
6
  removeQueueWorker,
7
7
  runQueueJob,
8
- createQueueJobRunner,
9
8
  QueueJobFailedError,
10
9
  QueueJobDiscardedError,
11
10
  } from './queue-runner.js'
12
11
  import { resetPikkuState, pikkuState } from '../../pikku-state.js'
13
- import { CoreQueueWorker, QueueJob } from './queue.types.js'
12
+ import type { CoreQueueWorker, QueueJob } from './queue.types.js'
14
13
 
15
14
  beforeEach(() => {
16
15
  resetPikkuState()
@@ -219,12 +218,14 @@ describe('runQueueJob', () => {
219
218
  wireQueueWorker(mockWorker)
220
219
 
221
220
  const mockLogger = createMockLogger()
221
+ pikkuState(null, 'package', 'singletonServices', {
222
+ logger: mockLogger,
223
+ } as any)
222
224
  const job = createMockJob('simple-queue', 'job-123', {
223
225
  message: 'test data',
224
226
  })
225
227
 
226
228
  const result = await runQueueJob({
227
- singletonServices: { logger: mockLogger } as any,
228
229
  job,
229
230
  })
230
231
 
@@ -257,12 +258,14 @@ describe('runQueueJob', () => {
257
258
  wireQueueWorker(mockWorker)
258
259
 
259
260
  const mockLogger = createMockLogger()
261
+ pikkuState(null, 'package', 'singletonServices', {
262
+ logger: mockLogger,
263
+ } as any)
260
264
  const job = createMockJob('fail-queue', 'job-fail-123')
261
265
 
262
266
  await assert.rejects(
263
267
  async () => {
264
268
  await runQueueJob({
265
- singletonServices: { logger: mockLogger } as any,
266
269
  job,
267
270
  })
268
271
  },
@@ -295,12 +298,14 @@ describe('runQueueJob', () => {
295
298
  wireQueueWorker(mockWorker)
296
299
 
297
300
  const mockLogger = createMockLogger()
301
+ pikkuState(null, 'package', 'singletonServices', {
302
+ logger: mockLogger,
303
+ } as any)
298
304
  const job = createMockJob('fail-no-reason-queue', 'job-456')
299
305
 
300
306
  await assert.rejects(
301
307
  async () => {
302
308
  await runQueueJob({
303
- singletonServices: { logger: mockLogger } as any,
304
309
  job,
305
310
  })
306
311
  },
@@ -331,12 +336,14 @@ describe('runQueueJob', () => {
331
336
  wireQueueWorker(mockWorker)
332
337
 
333
338
  const mockLogger = createMockLogger()
339
+ pikkuState(null, 'package', 'singletonServices', {
340
+ logger: mockLogger,
341
+ } as any)
334
342
  const job = createMockJob('discard-queue', 'job-discard-789')
335
343
 
336
344
  await assert.rejects(
337
345
  async () => {
338
346
  await runQueueJob({
339
- singletonServices: { logger: mockLogger } as any,
340
347
  job,
341
348
  })
342
349
  },
@@ -374,10 +381,12 @@ describe('runQueueJob', () => {
374
381
  wireQueueWorker(mockWorker)
375
382
 
376
383
  const mockLogger = createMockLogger()
384
+ pikkuState(null, 'package', 'singletonServices', {
385
+ logger: mockLogger,
386
+ } as any)
377
387
  const job = createMockJob('progress-queue', 'job-progress-999')
378
388
 
379
389
  await runQueueJob({
380
- singletonServices: { logger: mockLogger } as any,
381
390
  job,
382
391
  updateProgress: async (progress) => {
383
392
  progressUpdates.push(progress)
@@ -407,10 +416,12 @@ describe('runQueueJob', () => {
407
416
  wireQueueWorker(mockWorker)
408
417
 
409
418
  const mockLogger = createMockLogger()
419
+ pikkuState(null, 'package', 'singletonServices', {
420
+ logger: mockLogger,
421
+ } as any)
410
422
  const job = createMockJob('default-progress-queue', 'job-111')
411
423
 
412
424
  await runQueueJob({
413
- singletonServices: { logger: mockLogger } as any,
414
425
  job,
415
426
  })
416
427
 
@@ -441,10 +452,12 @@ describe('runQueueJob', () => {
441
452
  wireQueueWorker(mockWorker)
442
453
 
443
454
  const mockLogger = createMockLogger()
455
+ pikkuState(null, 'package', 'singletonServices', {
456
+ logger: mockLogger,
457
+ } as any)
444
458
  const job = createMockJob('wire-queue', 'job-int-123')
445
459
 
446
460
  await runQueueJob({
447
- singletonServices: { logger: mockLogger } as any,
448
461
  job,
449
462
  })
450
463
 
@@ -457,12 +470,14 @@ describe('runQueueJob', () => {
457
470
 
458
471
  test('should throw error when processor metadata not found', async () => {
459
472
  const mockLogger = createMockLogger()
473
+ pikkuState(null, 'package', 'singletonServices', {
474
+ logger: mockLogger,
475
+ } as any)
460
476
  const job = createMockJob('missing-meta-queue', 'job-222')
461
477
 
462
478
  await assert.rejects(
463
479
  async () => {
464
480
  await runQueueJob({
465
- singletonServices: { logger: mockLogger } as any,
466
481
  job,
467
482
  })
468
483
  },
@@ -483,12 +498,14 @@ describe('runQueueJob', () => {
483
498
  }
484
499
 
485
500
  const mockLogger = createMockLogger()
501
+ pikkuState(null, 'package', 'singletonServices', {
502
+ logger: mockLogger,
503
+ } as any)
486
504
  const job = createMockJob('no-registration-queue', 'job-333')
487
505
 
488
506
  await assert.rejects(
489
507
  async () => {
490
508
  await runQueueJob({
491
- singletonServices: { logger: mockLogger } as any,
492
509
  job,
493
510
  })
494
511
  },
@@ -520,15 +537,19 @@ describe('runQueueJob', () => {
520
537
  wireQueueWorker(mockWorker)
521
538
 
522
539
  const mockLogger = createMockLogger()
523
- const job = createMockJob('session-services-queue', 'job-444')
524
-
525
- await runQueueJob({
526
- singletonServices: { logger: mockLogger } as any,
527
- job,
540
+ pikkuState(null, 'package', 'singletonServices', {
541
+ logger: mockLogger,
542
+ } as any)
543
+ pikkuState(null, 'package', 'factories', {
528
544
  createWireServices: async () => {
529
545
  createWireServicesCalled = true
530
546
  return mockWireService as any
531
547
  },
548
+ } as any)
549
+ const job = createMockJob('session-services-queue', 'job-444')
550
+
551
+ await runQueueJob({
552
+ job,
532
553
  })
533
554
 
534
555
  assert.equal(createWireServicesCalled, true)
@@ -553,12 +574,14 @@ describe('runQueueJob', () => {
553
574
  wireQueueWorker(mockWorker)
554
575
 
555
576
  const mockLogger = createMockLogger()
577
+ pikkuState(null, 'package', 'singletonServices', {
578
+ logger: mockLogger,
579
+ } as any)
556
580
  const job = createMockJob('error-queue', 'job-555')
557
581
 
558
582
  await assert.rejects(
559
583
  async () => {
560
584
  await runQueueJob({
561
- singletonServices: { logger: mockLogger } as any,
562
585
  job,
563
586
  })
564
587
  },
@@ -602,10 +625,12 @@ describe('runQueueJob', () => {
602
625
  wireQueueWorker(mockWorker)
603
626
 
604
627
  const mockLogger = createMockLogger()
628
+ pikkuState(null, 'package', 'singletonServices', {
629
+ logger: mockLogger,
630
+ } as any)
605
631
  const job = createMockJob('middleware-queue', 'job-666')
606
632
 
607
633
  await runQueueJob({
608
- singletonServices: { logger: mockLogger } as any,
609
634
  job,
610
635
  })
611
636
 
@@ -629,10 +654,12 @@ describe('runQueueJob', () => {
629
654
  wireQueueWorker(mockWorker)
630
655
 
631
656
  const mockLogger = createMockLogger()
657
+ pikkuState(null, 'package', 'singletonServices', {
658
+ logger: mockLogger,
659
+ } as any)
632
660
  const job = createMockJob('debug-queue', 'job-777')
633
661
 
634
662
  await runQueueJob({
635
- singletonServices: { logger: mockLogger } as any,
636
663
  job,
637
664
  })
638
665
 
@@ -643,8 +670,8 @@ describe('runQueueJob', () => {
643
670
  })
644
671
  })
645
672
 
646
- describe('createQueueJobRunner', () => {
647
- test('delegates queue job execution using bound services', async () => {
673
+ describe('runQueueJob with pikkuState services', () => {
674
+ test('delegates queue job execution using pikkuState services', async () => {
648
675
  const mockWorker: CoreQueueWorker = {
649
676
  name: 'bound-runner-queue',
650
677
  func: {
@@ -663,11 +690,11 @@ describe('createQueueJobRunner', () => {
663
690
  wireQueueWorker(mockWorker)
664
691
 
665
692
  const mockLogger = createMockLogger()
666
- const runJob = createQueueJobRunner({
667
- singletonServices: { logger: mockLogger } as any,
668
- })
693
+ pikkuState(null, 'package', 'singletonServices', {
694
+ logger: mockLogger,
695
+ } as any)
669
696
 
670
- await runJob({
697
+ await runQueueJob({
671
698
  job: createMockJob('bound-runner-queue', 'job-888', { value: 41 }),
672
699
  })
673
700
 
@@ -1,4 +1,4 @@
1
- import type { CoreServices, PikkuWire } from '../../types/core.types.js'
1
+ import type { PikkuWire } from '../../types/core.types.js'
2
2
  import type { CoreQueueWorker, QueueJob, PikkuQueue } from './queue.types.js'
3
3
  import type {
4
4
  CorePikkuFunctionConfig,
@@ -6,9 +6,12 @@ import type {
6
6
  } from '../../function/functions.types.js'
7
7
  import { getErrorResponse, PikkuError } from '../../errors/error-handler.js'
8
8
  import { PikkuMissingMetaError } from '../../errors/errors.js'
9
- import { pikkuState } from '../../pikku-state.js'
9
+ import {
10
+ getSingletonServices,
11
+ getCreateWireServices,
12
+ pikkuState,
13
+ } from '../../pikku-state.js'
10
14
  import { addFunction, runPikkuFunc } from '../../function/function-runner.js'
11
- import { CreateWireServices } from '../../types/core.types.js'
12
15
 
13
16
  /**
14
17
  * Error class for queue processor not found
@@ -100,16 +103,14 @@ export async function removeQueueWorker(name: string): Promise<void> {
100
103
  * Process a single queue job - this function is called by queue consumers
101
104
  */
102
105
  export async function runQueueJob({
103
- singletonServices,
104
- createWireServices,
105
106
  job,
106
107
  updateProgress,
107
108
  }: {
108
- singletonServices: CoreServices
109
- createWireServices?: CreateWireServices
110
109
  job: QueueJob
111
110
  updateProgress?: (progress: number | string | object) => Promise<void>
112
111
  }): Promise<void> {
112
+ const singletonServices = getSingletonServices()
113
+ const createWireServices = getCreateWireServices()
113
114
  const logger = singletonServices.logger
114
115
 
115
116
  const meta = pikkuState(null, 'queue', 'meta')
@@ -189,26 +190,3 @@ export async function runQueueJob({
189
190
  throw error
190
191
  }
191
192
  }
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,7 +1,6 @@
1
- import { CommonWireMeta } from '../../types/core.types.js'
2
- import { CorePikkuFunctionConfig } from '../../function/functions.types.js'
3
- import { QueueConfigMapping } from './validate-worker-config.js'
4
- import { Logger } from '../../services/logger.js'
1
+ import type { CommonWireMeta } from '../../types/core.types.js'
2
+ import type { CorePikkuFunctionConfig } from '../../function/functions.types.js'
3
+ import type { QueueConfigMapping } from './validate-worker-config.js'
5
4
 
6
5
  /**
7
6
  * Configuration for queue workers - how jobs are processed
@@ -139,15 +138,6 @@ export interface QueueWorkers {
139
138
  /** Configuration mapping for validation */
140
139
  configMappings: QueueConfigMapping
141
140
 
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
-
151
141
  /** Scan state and register all compatible processors */
152
142
  registerQueues(): Promise<Record<string, ConfigValidationResult[]>>
153
143
  }
@@ -1,10 +1,8 @@
1
1
  import type { ConfigValidationResult, CoreQueueWorker } from './queue.types.js'
2
2
  import { getQueueWorkers } from './queue-runner.js'
3
- import {
4
- QueueConfigMapping,
5
- validateWorkerConfig,
6
- } from './validate-worker-config.js'
7
- import { Logger } from '../../services/logger.js'
3
+ import type { QueueConfigMapping } from './validate-worker-config.js'
4
+ import { validateWorkerConfig } from './validate-worker-config.js'
5
+ import type { Logger } from '../../services/logger.js'
8
6
 
9
7
  /**
10
8
  * Queue processor registration callback
@@ -0,0 +1,108 @@
1
+ import { describe, test } from 'node:test'
2
+ import assert from 'node:assert'
3
+ import { validateWorkerConfig } from './validate-worker-config.js'
4
+ import type { QueueConfigMapping } from './validate-worker-config.js'
5
+
6
+ const createTestMapping = (): QueueConfigMapping => ({
7
+ supported: {
8
+ concurrency: {
9
+ queueProperty: 'concurrency',
10
+ description: 'Number of concurrent workers',
11
+ },
12
+ maxRetries: {
13
+ queueProperty: 'maxRetries',
14
+ description: 'Maximum retry attempts',
15
+ },
16
+ },
17
+ unsupported: {
18
+ rateLimitMax: {
19
+ reason: 'Not supported',
20
+ explanation: 'This queue does not support rate limiting',
21
+ },
22
+ },
23
+ fallbacks: {
24
+ retryDelay: {
25
+ reason: 'Partial support',
26
+ explanation: 'Uses fixed delay instead of exponential',
27
+ fallbackValue: '1000ms fixed',
28
+ },
29
+ },
30
+ })
31
+
32
+ describe('validateWorkerConfig', () => {
33
+ test('should return empty results for empty config', () => {
34
+ const mapping = createTestMapping()
35
+ const result = validateWorkerConfig(mapping, {})
36
+ assert.deepStrictEqual(result.applied, {})
37
+ assert.deepStrictEqual(result.ignored, {})
38
+ assert.deepStrictEqual(result.warnings, [])
39
+ assert.deepStrictEqual(result.fallbacks, {})
40
+ })
41
+
42
+ test('should return empty results for undefined config', () => {
43
+ const mapping = createTestMapping()
44
+ const result = validateWorkerConfig(mapping)
45
+ assert.deepStrictEqual(result.applied, {})
46
+ assert.deepStrictEqual(result.ignored, {})
47
+ })
48
+
49
+ test('should apply supported configurations', () => {
50
+ const mapping = createTestMapping()
51
+ const result = validateWorkerConfig(mapping, { concurrency: 5 } as any)
52
+ assert.deepStrictEqual(result.applied, { concurrency: 5 })
53
+ assert.deepStrictEqual(result.ignored, {})
54
+ assert.strictEqual(result.warnings.length, 0)
55
+ })
56
+
57
+ test('should ignore unsupported configurations with warning', () => {
58
+ const mapping = createTestMapping()
59
+ const result = validateWorkerConfig(mapping, { rateLimitMax: 100 } as any)
60
+ assert.deepStrictEqual(result.ignored, { rateLimitMax: 100 })
61
+ assert.strictEqual(result.warnings.length, 1)
62
+ assert.ok(result.warnings[0].includes('Not supported'))
63
+ })
64
+
65
+ test('should handle fallback configurations', () => {
66
+ const mapping = createTestMapping()
67
+ const result = validateWorkerConfig(mapping, { retryDelay: 2000 } as any)
68
+ assert.deepStrictEqual(result.applied, { retryDelay: 2000 })
69
+ assert.deepStrictEqual(result.fallbacks, { retryDelay: '1000ms fixed' })
70
+ assert.strictEqual(result.warnings.length, 1)
71
+ assert.ok(result.warnings[0].includes('Partial support'))
72
+ })
73
+
74
+ test('should warn about unknown configurations', () => {
75
+ const mapping = createTestMapping()
76
+ const result = validateWorkerConfig(mapping, {
77
+ unknownOption: 'val',
78
+ } as any)
79
+ assert.deepStrictEqual(result.ignored, { unknownOption: 'val' })
80
+ assert.strictEqual(result.warnings.length, 1)
81
+ assert.ok(result.warnings[0].includes('Unknown configuration'))
82
+ })
83
+
84
+ test('should skip undefined values', () => {
85
+ const mapping = createTestMapping()
86
+ const result = validateWorkerConfig(mapping, {
87
+ concurrency: undefined,
88
+ } as any)
89
+ assert.deepStrictEqual(result.applied, {})
90
+ })
91
+
92
+ test('should handle mixed supported and unsupported configs', () => {
93
+ const mapping = createTestMapping()
94
+ const result = validateWorkerConfig(mapping, {
95
+ concurrency: 3,
96
+ maxRetries: 5,
97
+ rateLimitMax: 100,
98
+ retryDelay: 1000,
99
+ } as any)
100
+ assert.deepStrictEqual(result.applied, {
101
+ concurrency: 3,
102
+ maxRetries: 5,
103
+ retryDelay: 1000,
104
+ })
105
+ assert.deepStrictEqual(result.ignored, { rateLimitMax: 100 })
106
+ assert.strictEqual(result.warnings.length, 2)
107
+ })
108
+ })
@@ -1,4 +1,7 @@
1
- import { PikkuWorkerConfig, ConfigValidationResult } from './queue.types.js'
1
+ import type {
2
+ PikkuWorkerConfig,
3
+ ConfigValidationResult,
4
+ } from './queue.types.js'
2
5
 
3
6
  /**
4
7
  * Configuration mapping structure for queue implementations
@@ -1,2 +1,4 @@
1
1
  export { PikkuRPCService, rpcService, RPCNotFoundError } from './rpc-runner.js'
2
2
  export type { PikkuRPC, RPCMeta } from './rpc-types.js'
3
+ export { wireAddon } from './wire-addon.js'
4
+ export type { WireAddonConfig } from './wire-addon.js'