@pikku/core 0.12.107 → 0.12.111

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 (588) hide show
  1. package/CHANGELOG.md +344 -0
  2. package/dist/analytics/analytics.d.ts +6 -0
  3. package/dist/analytics/analytics.js +58 -0
  4. package/dist/analytics/analytics.types.d.ts +156 -0
  5. package/dist/analytics/analytics.types.js +1 -0
  6. package/dist/analytics/anonymous-analytics-identity.d.ts +23 -0
  7. package/dist/analytics/anonymous-analytics-identity.js +27 -0
  8. package/dist/analytics/compose-analytics-identity.d.ts +14 -0
  9. package/dist/analytics/compose-analytics-identity.js +33 -0
  10. package/dist/analytics/cookie-analytics-identity.d.ts +24 -0
  11. package/dist/analytics/cookie-analytics-identity.js +37 -0
  12. package/dist/analytics/define-analytics-events.d.ts +22 -0
  13. package/dist/analytics/define-analytics-events.js +9 -0
  14. package/dist/analytics/fan-out-analytics.d.ts +15 -0
  15. package/dist/analytics/fan-out-analytics.js +36 -0
  16. package/dist/analytics/index.d.ts +13 -0
  17. package/dist/analytics/index.js +8 -0
  18. package/dist/analytics/logger-analytics-service.d.ts +14 -0
  19. package/dist/analytics/logger-analytics-service.js +23 -0
  20. package/dist/analytics/mint-cookie.d.ts +44 -0
  21. package/dist/analytics/mint-cookie.js +55 -0
  22. package/dist/errors/errors.d.ts +7 -0
  23. package/dist/errors/errors.js +17 -0
  24. package/dist/function/function-meta.types.d.ts +2 -0
  25. package/dist/function/function-runner.js +29 -0
  26. package/dist/function/functions.types.d.ts +22 -3
  27. package/dist/middleware/auth-apikey.d.ts +1 -1
  28. package/dist/pikku-state.d.ts +1 -1
  29. package/dist/scopes.d.ts +11 -0
  30. package/dist/scopes.js +17 -0
  31. package/dist/services/credential-wire-service.d.ts +1 -1
  32. package/dist/services/feature-flag-service.d.ts +100 -0
  33. package/dist/services/feature-flag-service.js +1 -0
  34. package/dist/services/index.d.ts +1 -0
  35. package/dist/services/meta-service.d.ts +16 -0
  36. package/dist/services/meta-service.js +19 -0
  37. package/dist/services/webhook-service.d.ts +7 -2
  38. package/dist/services/webhook-service.js +11 -6
  39. package/dist/testing/service-tests/agent-run-service-tests.d.ts +2 -2
  40. package/dist/testing/service-tests/agent-storage-service-tests.d.ts +1 -1
  41. package/dist/testing/service-tests/channel-store-tests.d.ts +1 -1
  42. package/dist/testing/service-tests/credential-service-tests.d.ts +1 -1
  43. package/dist/testing/service-tests/deployment-service-tests.d.ts +1 -1
  44. package/dist/testing/service-tests/event-hub-store-tests.d.ts +1 -1
  45. package/dist/testing/service-tests/secret-service-tests.d.ts +1 -1
  46. package/dist/testing/service-tests/session-store-tests.d.ts +1 -1
  47. package/dist/testing/service-tests/workflow-run-service-tests.d.ts +1 -1
  48. package/dist/testing/service-tests/workflow-service-tests.d.ts +1 -1
  49. package/dist/types/core.types.d.ts +23 -0
  50. package/dist/wirings/agent/agent-rpc.d.ts +1 -1
  51. package/dist/wirings/agent/agent-turn.d.ts +1 -1
  52. package/dist/wirings/agent-scorer/agent-scorer-live.d.ts +1 -1
  53. package/dist/wirings/channel/channel-common.d.ts +1 -1
  54. package/dist/wirings/channel/channel-rpc-validators.d.ts +2 -2
  55. package/dist/wirings/channel/channel-runner.d.ts +1 -1
  56. package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
  57. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
  58. package/dist/wirings/cli/channel/cli-approval.d.ts +2 -2
  59. package/dist/wirings/flag/assert-feature-available.d.ts +15 -0
  60. package/dist/wirings/flag/assert-feature-available.js +23 -0
  61. package/dist/wirings/flag/cached-flag-source.d.ts +73 -0
  62. package/dist/wirings/flag/cached-flag-source.js +96 -0
  63. package/dist/wirings/flag/define-feature-flags.d.ts +33 -0
  64. package/dist/wirings/flag/define-feature-flags.js +32 -0
  65. package/dist/wirings/flag/flag.types.d.ts +97 -0
  66. package/dist/wirings/flag/flag.types.js +1 -0
  67. package/dist/wirings/flag/index.d.ts +7 -0
  68. package/dist/wirings/flag/index.js +5 -0
  69. package/dist/wirings/flag/resolve-flag.d.ts +52 -0
  70. package/dist/wirings/flag/resolve-flag.js +90 -0
  71. package/dist/wirings/flag/validate-flag-definitions.d.ts +26 -0
  72. package/dist/wirings/flag/validate-flag-definitions.js +103 -0
  73. package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +8 -8
  74. package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +1 -1
  75. package/dist/wirings/workflow/workflow-queue-routing.d.ts +1 -1
  76. package/package.json +11 -5
  77. package/run-tests.sh +17 -9
  78. package/src/public-surface.json +26 -0
  79. package/src/agent-naming.test.ts +0 -68
  80. package/src/api-report.test.ts +0 -138
  81. package/src/app-alias-surface.test.ts +0 -179
  82. package/src/app-leaf-surface.test.ts +0 -222
  83. package/src/bootstrap-compat/root.ts +0 -20
  84. package/src/classification/column-form.test.ts +0 -97
  85. package/src/classification/column-form.ts +0 -55
  86. package/src/classification/data-classification.ts +0 -73
  87. package/src/classification/index.ts +0 -40
  88. package/src/classification/key-ids.ts +0 -2
  89. package/src/classification/secret-value.test.ts +0 -204
  90. package/src/classification/secret-value.ts +0 -106
  91. package/src/crypto-utils.test.ts +0 -668
  92. package/src/crypto-utils.ts +0 -460
  93. package/src/dev/hot-reload.test.ts +0 -587
  94. package/src/dev/hot-reload.ts +0 -225
  95. package/src/dev/module-runner.test.ts +0 -235
  96. package/src/dev/module-runner.ts +0 -138
  97. package/src/dev/reload-meta.test.ts +0 -183
  98. package/src/dev/reload-meta.ts +0 -144
  99. package/src/ecosystem-tier-removed.test.ts +0 -72
  100. package/src/env.ts +0 -1
  101. package/src/errors/error-handler.ts +0 -77
  102. package/src/errors/error.test.ts +0 -229
  103. package/src/errors/errors.ts +0 -393
  104. package/src/errors/index.ts +0 -11
  105. package/src/errors/serialized-error.ts +0 -12
  106. package/src/factory-functions.test.ts +0 -111
  107. package/src/function/abort-scope.test.ts +0 -97
  108. package/src/function/abort-scope.ts +0 -80
  109. package/src/function/function-meta.types.ts +0 -151
  110. package/src/function/function-runner.test.ts +0 -1619
  111. package/src/function/function-runner.ts +0 -499
  112. package/src/function/functions.types.ts +0 -319
  113. package/src/function/index.ts +0 -40
  114. package/src/function/list.types.test.ts +0 -100
  115. package/src/function/list.types.ts +0 -69
  116. package/src/function/pikku-request.test.ts +0 -35
  117. package/src/function/pikku-request.ts +0 -17
  118. package/src/gopass-secrets-removed.test.ts +0 -51
  119. package/src/handle-error.test.ts +0 -532
  120. package/src/handle-error.ts +0 -64
  121. package/src/middleware/auth-apikey.test.ts +0 -362
  122. package/src/middleware/auth-apikey.ts +0 -39
  123. package/src/middleware/auth-bearer.test.ts +0 -566
  124. package/src/middleware/auth-bearer.ts +0 -83
  125. package/src/middleware/auth-cookie.test.ts +0 -572
  126. package/src/middleware/auth-cookie.ts +0 -107
  127. package/src/middleware/cors.test.ts +0 -579
  128. package/src/middleware/cors.ts +0 -103
  129. package/src/middleware/index.ts +0 -30
  130. package/src/middleware/middleware-factories.ts +0 -76
  131. package/src/middleware/middleware.types.ts +0 -61
  132. package/src/middleware/remote-auth.test.ts +0 -547
  133. package/src/middleware/remote-auth.ts +0 -95
  134. package/src/middleware/remote-jobs-secret.ts +0 -35
  135. package/src/middleware/require-origin.test.ts +0 -115
  136. package/src/middleware/require-origin.ts +0 -79
  137. package/src/middleware/telemetry.ts +0 -83
  138. package/src/middleware-runner.test.ts +0 -578
  139. package/src/middleware-runner.ts +0 -232
  140. package/src/no-any-casts.test.ts +0 -57
  141. package/src/no-root-barrel.test.ts +0 -122
  142. package/src/permissions.test.ts +0 -256
  143. package/src/permissions.ts +0 -217
  144. package/src/pikku-state.test.ts +0 -198
  145. package/src/pikku-state.ts +0 -206
  146. package/src/production-barrels-stay-lean.test.ts +0 -110
  147. package/src/public-surface.test.ts +0 -133
  148. package/src/remote.test.ts +0 -173
  149. package/src/remote.ts +0 -56
  150. package/src/removed-legacy-exports.test.ts +0 -66
  151. package/src/run-tests-script.test.ts +0 -67
  152. package/src/schema.test.ts +0 -430
  153. package/src/schema.ts +0 -204
  154. package/src/scopes.test.ts +0 -203
  155. package/src/scopes.ts +0 -67
  156. package/src/services/agent-run-state-service.ts +0 -37
  157. package/src/services/agent-runner-service.ts +0 -238
  158. package/src/services/agent-storage-service.ts +0 -39
  159. package/src/services/ai-embedding-service.ts +0 -9
  160. package/src/services/audit-service.test.ts +0 -44
  161. package/src/services/audit-service.ts +0 -280
  162. package/src/services/content-service.ts +0 -65
  163. package/src/services/credential-service.ts +0 -20
  164. package/src/services/credential-wire-service.test.ts +0 -235
  165. package/src/services/credential-wire-service.ts +0 -120
  166. package/src/services/deployment-service.ts +0 -32
  167. package/src/services/email-service.test.ts +0 -100
  168. package/src/services/email-service.ts +0 -60
  169. package/src/services/email-template.test.ts +0 -311
  170. package/src/services/email-template.ts +0 -254
  171. package/src/services/file-scenario-run-store.test.ts +0 -349
  172. package/src/services/file-scenario-run-store.ts +0 -282
  173. package/src/services/gateway-service.ts +0 -5
  174. package/src/services/http-personas-converse.test.ts +0 -274
  175. package/src/services/http-personas.test.ts +0 -379
  176. package/src/services/http-personas.ts +0 -508
  177. package/src/services/in-memory-agent-run-state-service.ts +0 -87
  178. package/src/services/in-memory-queue-service.test.ts +0 -162
  179. package/src/services/in-memory-queue-service.ts +0 -78
  180. package/src/services/in-memory-session-store.test.ts +0 -58
  181. package/src/services/in-memory-session-store.ts +0 -20
  182. package/src/services/in-memory-trigger-service.ts +0 -47
  183. package/src/services/in-memory-workflow-service.test.ts +0 -430
  184. package/src/services/in-memory-workflow-service.ts +0 -595
  185. package/src/services/index.ts +0 -192
  186. package/src/services/istanbul-coverage-service.test.ts +0 -66
  187. package/src/services/istanbul-coverage-service.ts +0 -59
  188. package/src/services/jwt-service.ts +0 -15
  189. package/src/services/local-content-request-handler.test.ts +0 -240
  190. package/src/services/local-content-request-handler.ts +0 -295
  191. package/src/services/local-content.test.ts +0 -186
  192. package/src/services/local-content.ts +0 -242
  193. package/src/services/local-credential-service.ts +0 -63
  194. package/src/services/local-email-service.test.ts +0 -182
  195. package/src/services/local-email-service.ts +0 -43
  196. package/src/services/local-gateway-service.ts +0 -51
  197. package/src/services/local-secrets.test.ts +0 -95
  198. package/src/services/local-secrets.ts +0 -71
  199. package/src/services/local-variables.test.ts +0 -61
  200. package/src/services/local-variables.ts +0 -45
  201. package/src/services/logger-console.test.ts +0 -117
  202. package/src/services/logger-console.ts +0 -174
  203. package/src/services/logger.ts +0 -48
  204. package/src/services/meta-service.test.ts +0 -75
  205. package/src/services/meta-service.ts +0 -767
  206. package/src/services/persona-actor-secret.test.ts +0 -68
  207. package/src/services/persona-actor-secret.ts +0 -70
  208. package/src/services/persona-sign-in.test.ts +0 -219
  209. package/src/services/persona-sign-in.ts +0 -238
  210. package/src/services/personas-service.ts +0 -191
  211. package/src/services/pikku-user-id.test.ts +0 -62
  212. package/src/services/pikku-user-id.ts +0 -13
  213. package/src/services/queue-webhook-service.test.ts +0 -409
  214. package/src/services/queue-webhook-service.ts +0 -150
  215. package/src/services/remote-jobs.test.ts +0 -106
  216. package/src/services/remote-jobs.ts +0 -92
  217. package/src/services/scheduler-service.ts +0 -37
  218. package/src/services/schema-service.ts +0 -10
  219. package/src/services/scope-service.ts +0 -91
  220. package/src/services/scoped-credential-service.test.ts +0 -86
  221. package/src/services/scoped-credential-service.ts +0 -63
  222. package/src/services/scoped-secret-service.test.ts +0 -93
  223. package/src/services/scoped-secret-service.ts +0 -40
  224. package/src/services/secret-host-binding.test.ts +0 -138
  225. package/src/services/secret-host-binding.ts +0 -51
  226. package/src/services/secret-service.ts +0 -25
  227. package/src/services/secretless.test.ts +0 -54
  228. package/src/services/secretless.ts +0 -29
  229. package/src/services/session-store.ts +0 -9
  230. package/src/services/stub-tracker.test.ts +0 -104
  231. package/src/services/stub-tracker.ts +0 -175
  232. package/src/services/system-role-guard.test.ts +0 -96
  233. package/src/services/system-role-guard.ts +0 -71
  234. package/src/services/temporary-file-service.ts +0 -76
  235. package/src/services/trigger-service.ts +0 -5
  236. package/src/services/typed-credential-service.ts +0 -83
  237. package/src/services/typed-secret-service.test.ts +0 -204
  238. package/src/services/typed-secret-service.ts +0 -132
  239. package/src/services/typed-variables-service.test.ts +0 -166
  240. package/src/services/typed-variables-service.ts +0 -166
  241. package/src/services/user-session-service.test.ts +0 -147
  242. package/src/services/user-session-service.ts +0 -85
  243. package/src/services/v8-coverage-service.test.ts +0 -69
  244. package/src/services/v8-coverage-service.ts +0 -163
  245. package/src/services/variables-service.ts +0 -13
  246. package/src/services/webhook-service.ts +0 -147
  247. package/src/services/workflow-service.ts +0 -120
  248. package/src/side-effects-are-declared.test.ts +0 -84
  249. package/src/source-files-stay-composable.test.ts +0 -41
  250. package/src/template-alias-surface.test.ts +0 -240
  251. package/src/test-utils.ts +0 -38
  252. package/src/testing/index.ts +0 -3
  253. package/src/testing/service-tests/agent-run-service-tests.ts +0 -98
  254. package/src/testing/service-tests/agent-storage-service-tests.ts +0 -379
  255. package/src/testing/service-tests/channel-store-tests.ts +0 -98
  256. package/src/testing/service-tests/credential-service-tests.ts +0 -143
  257. package/src/testing/service-tests/deployment-service-tests.ts +0 -33
  258. package/src/testing/service-tests/event-hub-store-tests.ts +0 -48
  259. package/src/testing/service-tests/secret-service-tests.ts +0 -105
  260. package/src/testing/service-tests/session-store-tests.ts +0 -62
  261. package/src/testing/service-tests/workflow-run-service-tests.ts +0 -59
  262. package/src/testing/service-tests/workflow-service-tests.ts +0 -308
  263. package/src/testing/service-tests.ts +0 -95
  264. package/src/time-utils.test.ts +0 -56
  265. package/src/time-utils.ts +0 -89
  266. package/src/types/core.types.ts +0 -446
  267. package/src/types/index.ts +0 -25
  268. package/src/types/state.types.ts +0 -226
  269. package/src/types/typed-credentials.test.ts +0 -72
  270. package/src/utils/hash.test.ts +0 -68
  271. package/src/utils/hash.ts +0 -26
  272. package/src/utils/hmac.ts +0 -21
  273. package/src/utils/node-host-resolver.ts +0 -20
  274. package/src/utils/safe-fetch.test.ts +0 -515
  275. package/src/utils/safe-fetch.ts +0 -347
  276. package/src/utils.test.ts +0 -359
  277. package/src/utils.ts +0 -165
  278. package/src/version.test.ts +0 -80
  279. package/src/version.ts +0 -25
  280. package/src/wirings/actor-flow/actor-flow.types.ts +0 -40
  281. package/src/wirings/actor-flow/index.ts +0 -10
  282. package/src/wirings/actor-flow/run-conversation.test.ts +0 -187
  283. package/src/wirings/actor-flow/run-conversation.ts +0 -280
  284. package/src/wirings/addon/addon-auth-tags.test.ts +0 -219
  285. package/src/wirings/addon/addon-runner.ts +0 -236
  286. package/src/wirings/addon/addon-scopes.test.ts +0 -225
  287. package/src/wirings/addon/addon-secrets.test.ts +0 -391
  288. package/src/wirings/addon/index.ts +0 -12
  289. package/src/wirings/addon/remote-addon-auth.ts +0 -65
  290. package/src/wirings/addon/wire-addon.test.ts +0 -102
  291. package/src/wirings/addon/wire-addon.ts +0 -202
  292. package/src/wirings/addon/wire-remote-addon.ts +0 -41
  293. package/src/wirings/agent/agent-agui.test.ts +0 -1213
  294. package/src/wirings/agent/agent-agui.ts +0 -405
  295. package/src/wirings/agent/agent-authorization.test.ts +0 -208
  296. package/src/wirings/agent/agent-finalize.test.ts +0 -187
  297. package/src/wirings/agent/agent-finalize.ts +0 -197
  298. package/src/wirings/agent/agent-helpers.test.ts +0 -215
  299. package/src/wirings/agent/agent-helpers.ts +0 -96
  300. package/src/wirings/agent/agent-interrupt.test.ts +0 -833
  301. package/src/wirings/agent/agent-interrupt.ts +0 -400
  302. package/src/wirings/agent/agent-memory.test.ts +0 -397
  303. package/src/wirings/agent/agent-memory.ts +0 -496
  304. package/src/wirings/agent/agent-middleware.types.test.ts +0 -41
  305. package/src/wirings/agent/agent-model-config.test.ts +0 -103
  306. package/src/wirings/agent/agent-model-config.ts +0 -59
  307. package/src/wirings/agent/agent-prepare.test.ts +0 -977
  308. package/src/wirings/agent/agent-prepare.ts +0 -1083
  309. package/src/wirings/agent/agent-registry.test.ts +0 -455
  310. package/src/wirings/agent/agent-registry.ts +0 -99
  311. package/src/wirings/agent/agent-resume-authorization.test.ts +0 -206
  312. package/src/wirings/agent/agent-rpc.ts +0 -116
  313. package/src/wirings/agent/agent-runner.test.ts +0 -1229
  314. package/src/wirings/agent/agent-runner.ts +0 -858
  315. package/src/wirings/agent/agent-stream-delegate.test.ts +0 -381
  316. package/src/wirings/agent/agent-stream-output-hooks.test.ts +0 -353
  317. package/src/wirings/agent/agent-stream.test.ts +0 -1800
  318. package/src/wirings/agent/agent-stream.ts +0 -1639
  319. package/src/wirings/agent/agent-thread-ownership.test.ts +0 -297
  320. package/src/wirings/agent/agent-turn.test.ts +0 -65
  321. package/src/wirings/agent/agent-turn.ts +0 -122
  322. package/src/wirings/agent/agent-utils.ts +0 -20
  323. package/src/wirings/agent/agent.types.ts +0 -676
  324. package/src/wirings/agent/index.ts +0 -58
  325. package/src/wirings/agent/voice-input.test.ts +0 -220
  326. package/src/wirings/agent/voice-input.ts +0 -180
  327. package/src/wirings/agent/voice-output.test.ts +0 -510
  328. package/src/wirings/agent/voice-output.ts +0 -311
  329. package/src/wirings/agent-scorer/agent-scorer-grade.test.ts +0 -106
  330. package/src/wirings/agent-scorer/agent-scorer-grade.ts +0 -55
  331. package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +0 -285
  332. package/src/wirings/agent-scorer/agent-scorer-judge.ts +0 -180
  333. package/src/wirings/agent-scorer/agent-scorer-live.test.ts +0 -174
  334. package/src/wirings/agent-scorer/agent-scorer-live.ts +0 -56
  335. package/src/wirings/agent-scorer/agent-scorer-registry.ts +0 -66
  336. package/src/wirings/agent-scorer/agent-scorer-sampling.test.ts +0 -34
  337. package/src/wirings/agent-scorer/agent-scorer-sampling.ts +0 -36
  338. package/src/wirings/agent-scorer/agent-scorer-snapshots.test.ts +0 -49
  339. package/src/wirings/agent-scorer/agent-scorer-snapshots.ts +0 -46
  340. package/src/wirings/agent-scorer/agent-scorer-worker.test.ts +0 -122
  341. package/src/wirings/agent-scorer/agent-scorer-worker.ts +0 -71
  342. package/src/wirings/agent-scorer/agent-scorer.ts +0 -102
  343. package/src/wirings/agent-scorer/agent-scorer.types.ts +0 -128
  344. package/src/wirings/agent-scorer/index.ts +0 -23
  345. package/src/wirings/channel/channel-common.ts +0 -102
  346. package/src/wirings/channel/channel-handler-shapes.test.ts +0 -72
  347. package/src/wirings/channel/channel-handler.test.ts +0 -322
  348. package/src/wirings/channel/channel-handler.ts +0 -259
  349. package/src/wirings/channel/channel-host-rpc.test.ts +0 -150
  350. package/src/wirings/channel/channel-host-rpc.ts +0 -69
  351. package/src/wirings/channel/channel-middleware-runner.test.ts +0 -188
  352. package/src/wirings/channel/channel-middleware-runner.ts +0 -126
  353. package/src/wirings/channel/channel-rpc-registry.ts +0 -116
  354. package/src/wirings/channel/channel-rpc-responder.ts +0 -117
  355. package/src/wirings/channel/channel-rpc-service.ts +0 -132
  356. package/src/wirings/channel/channel-rpc-validators.ts +0 -65
  357. package/src/wirings/channel/channel-rpc.test.ts +0 -841
  358. package/src/wirings/channel/channel-rpc.ts +0 -5
  359. package/src/wirings/channel/channel-rpc.types.ts +0 -160
  360. package/src/wirings/channel/channel-runner.ts +0 -164
  361. package/src/wirings/channel/channel-store.ts +0 -35
  362. package/src/wirings/channel/channel.types.ts +0 -193
  363. package/src/wirings/channel/define-channel-routes.ts +0 -5
  364. package/src/wirings/channel/eventhub-service.ts +0 -16
  365. package/src/wirings/channel/eventhub-store.ts +0 -13
  366. package/src/wirings/channel/index.ts +0 -40
  367. package/src/wirings/channel/local/index.ts +0 -3
  368. package/src/wirings/channel/local/local-channel-handler.ts +0 -98
  369. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -339
  370. package/src/wirings/channel/local/local-channel-runner.ts +0 -271
  371. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -77
  372. package/src/wirings/channel/local/local-eventhub-service.ts +0 -69
  373. package/src/wirings/channel/log-channels.ts +0 -16
  374. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -135
  375. package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -60
  376. package/src/wirings/channel/serverless/index.ts +0 -6
  377. package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -328
  378. package/src/wirings/cli/channel/cli-approval.test.ts +0 -177
  379. package/src/wirings/cli/channel/cli-approval.ts +0 -135
  380. package/src/wirings/cli/channel/cli-channel-runner.ts +0 -118
  381. package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +0 -192
  382. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +0 -148
  383. package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +0 -480
  384. package/src/wirings/cli/channel/cli-raw-client-runner.ts +0 -188
  385. package/src/wirings/cli/channel/index.ts +0 -6
  386. package/src/wirings/cli/cli-runner.test.ts +0 -969
  387. package/src/wirings/cli/cli-runner.ts +0 -538
  388. package/src/wirings/cli/cli.types.ts +0 -388
  389. package/src/wirings/cli/command-parser.test.ts +0 -1120
  390. package/src/wirings/cli/command-parser.ts +0 -713
  391. package/src/wirings/cli/define-cli-commands.ts +0 -13
  392. package/src/wirings/cli/format-cli-error.test.ts +0 -91
  393. package/src/wirings/cli/format-cli-error.ts +0 -96
  394. package/src/wirings/cli/index.ts +0 -19
  395. package/src/wirings/credential/credential.types.ts +0 -37
  396. package/src/wirings/credential/define-credential.ts +0 -49
  397. package/src/wirings/credential/index.ts +0 -7
  398. package/src/wirings/credential/validate-credential-definitions.ts +0 -63
  399. package/src/wirings/gateway/gateway-authorization.test.ts +0 -575
  400. package/src/wirings/gateway/gateway-channel-meta.test.ts +0 -44
  401. package/src/wirings/gateway/gateway-runner.test.ts +0 -581
  402. package/src/wirings/gateway/gateway-runner.ts +0 -411
  403. package/src/wirings/gateway/gateway.types.ts +0 -137
  404. package/src/wirings/gateway/index.ts +0 -15
  405. package/src/wirings/http/http-routes.test.ts +0 -318
  406. package/src/wirings/http/http-routes.ts +0 -111
  407. package/src/wirings/http/http-runner-addon-ref.test.ts +0 -238
  408. package/src/wirings/http/http-runner.test.ts +0 -503
  409. package/src/wirings/http/http-runner.ts +0 -462
  410. package/src/wirings/http/http.types.ts +0 -307
  411. package/src/wirings/http/index.ts +0 -27
  412. package/src/wirings/http/log-http-routes.ts +0 -18
  413. package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -318
  414. package/src/wirings/http/pikku-fetch-http-request.ts +0 -260
  415. package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -123
  416. package/src/wirings/http/pikku-fetch-http-response.ts +0 -149
  417. package/src/wirings/http/routers/http-router.ts +0 -13
  418. package/src/wirings/http/routers/path-to-regex.test.ts +0 -306
  419. package/src/wirings/http/routers/path-to-regex.ts +0 -115
  420. package/src/wirings/http/web-request.test.ts +0 -382
  421. package/src/wirings/http/web-request.ts +0 -162
  422. package/src/wirings/mcp/index.ts +0 -26
  423. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -388
  424. package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
  425. package/src/wirings/mcp/mcp-runner.test.ts +0 -588
  426. package/src/wirings/mcp/mcp-runner.ts +0 -330
  427. package/src/wirings/mcp/mcp.types.ts +0 -199
  428. package/src/wirings/node/index.ts +0 -2
  429. package/src/wirings/node/node.types.ts +0 -23
  430. package/src/wirings/oauth2/index.ts +0 -1
  431. package/src/wirings/oauth2/oauth2.types.ts +0 -12
  432. package/src/wirings/persona/define-personas.ts +0 -33
  433. package/src/wirings/persona/index.ts +0 -75
  434. package/src/wirings/persona/persona-app-scopes.test.ts +0 -47
  435. package/src/wirings/persona/persona-app-scopes.ts +0 -74
  436. package/src/wirings/persona/persona-email.ts +0 -87
  437. package/src/wirings/persona/persona-environments.test.ts +0 -194
  438. package/src/wirings/persona/persona-environments.ts +0 -138
  439. package/src/wirings/persona/persona-mailbox.ts +0 -156
  440. package/src/wirings/persona/persona.test.ts +0 -230
  441. package/src/wirings/persona/persona.types.ts +0 -156
  442. package/src/wirings/persona/validate-personas.ts +0 -137
  443. package/src/wirings/queue/index.ts +0 -29
  444. package/src/wirings/queue/queue-identity.test.ts +0 -454
  445. package/src/wirings/queue/queue-identity.ts +0 -176
  446. package/src/wirings/queue/queue-runner.test.ts +0 -705
  447. package/src/wirings/queue/queue-runner.ts +0 -181
  448. package/src/wirings/queue/queue.types.ts +0 -161
  449. package/src/wirings/queue/register-queue-helper.ts +0 -46
  450. package/src/wirings/queue/signed-queue-service.ts +0 -60
  451. package/src/wirings/queue/validate-worker-config.test.ts +0 -108
  452. package/src/wirings/queue/validate-worker-config.ts +0 -90
  453. package/src/wirings/role/define-system-role.ts +0 -33
  454. package/src/wirings/role/index.ts +0 -13
  455. package/src/wirings/role/role.test.ts +0 -104
  456. package/src/wirings/role/role.types.ts +0 -47
  457. package/src/wirings/role/validate-role-definitions.ts +0 -93
  458. package/src/wirings/rpc/index.ts +0 -8
  459. package/src/wirings/rpc/rpc-runner.test.ts +0 -1130
  460. package/src/wirings/rpc/rpc-runner.ts +0 -569
  461. package/src/wirings/rpc/rpc-types.ts +0 -87
  462. package/src/wirings/scheduler/index.ts +0 -11
  463. package/src/wirings/scheduler/log-schedulers.ts +0 -16
  464. package/src/wirings/scheduler/scheduler-runner.test.ts +0 -835
  465. package/src/wirings/scheduler/scheduler-runner.ts +0 -138
  466. package/src/wirings/scheduler/scheduler.types.ts +0 -42
  467. package/src/wirings/scope/define-scope.ts +0 -33
  468. package/src/wirings/scope/index.ts +0 -15
  469. package/src/wirings/scope/scope.test.ts +0 -159
  470. package/src/wirings/scope/scope.types.ts +0 -42
  471. package/src/wirings/scope/validate-scope-definitions.ts +0 -107
  472. package/src/wirings/secret/index.ts +0 -9
  473. package/src/wirings/secret/secret.types.ts +0 -70
  474. package/src/wirings/secret/validate-secret-definitions.test.ts +0 -232
  475. package/src/wirings/secret/validate-secret-definitions.ts +0 -88
  476. package/src/wirings/trigger/index.ts +0 -9
  477. package/src/wirings/trigger/pikku-trigger-service.ts +0 -107
  478. package/src/wirings/trigger/trigger-runner.test.ts +0 -78
  479. package/src/wirings/trigger/trigger-runner.ts +0 -113
  480. package/src/wirings/trigger/trigger.types.ts +0 -100
  481. package/src/wirings/variable/index.ts +0 -8
  482. package/src/wirings/variable/validate-variable-definitions.test.ts +0 -115
  483. package/src/wirings/variable/validate-variable-definitions.ts +0 -71
  484. package/src/wirings/variable/variable.types.ts +0 -40
  485. package/src/wirings/virtual-user/index.ts +0 -107
  486. package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +0 -115
  487. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +0 -95
  488. package/src/wirings/virtual-user/run-virtual-user.test.ts +0 -774
  489. package/src/wirings/virtual-user/run-virtual-user.ts +0 -684
  490. package/src/wirings/virtual-user/virtual-user-agents.test.ts +0 -72
  491. package/src/wirings/virtual-user/virtual-user-agents.ts +0 -62
  492. package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +0 -215
  493. package/src/wirings/virtual-user/virtual-user-catalogue.ts +0 -184
  494. package/src/wirings/virtual-user/virtual-user-derive.test.ts +0 -426
  495. package/src/wirings/virtual-user/virtual-user-derive.ts +0 -161
  496. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +0 -68
  497. package/src/wirings/virtual-user/virtual-user-dispositions.ts +0 -210
  498. package/src/wirings/virtual-user/virtual-user-intents.test.ts +0 -218
  499. package/src/wirings/virtual-user/virtual-user-intents.ts +0 -185
  500. package/src/wirings/virtual-user/virtual-user-rng.test.ts +0 -72
  501. package/src/wirings/virtual-user/virtual-user-rng.ts +0 -50
  502. package/src/wirings/virtual-user/virtual-user-run-store.ts +0 -131
  503. package/src/wirings/virtual-user/virtual-user-scaffold.test.ts +0 -854
  504. package/src/wirings/virtual-user/virtual-user-scaffold.ts +0 -664
  505. package/src/wirings/virtual-user/virtual-user-schedule-store.ts +0 -93
  506. package/src/wirings/virtual-user/virtual-user-schedule.test.ts +0 -280
  507. package/src/wirings/virtual-user/virtual-user-schedule.ts +0 -156
  508. package/src/wirings/virtual-user/virtual-user-target.ts +0 -47
  509. package/src/wirings/virtual-user/virtual-user.types.ts +0 -215
  510. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -709
  511. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -25
  512. package/src/wirings/workflow/feature.test.ts +0 -131
  513. package/src/wirings/workflow/feature.ts +0 -59
  514. package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +0 -569
  515. package/src/wirings/workflow/graph/graph-foreach.test.ts +0 -626
  516. package/src/wirings/workflow/graph/graph-node.ts +0 -115
  517. package/src/wirings/workflow/graph/graph-runner.test.ts +0 -1049
  518. package/src/wirings/workflow/graph/graph-runner.ts +0 -1376
  519. package/src/wirings/workflow/graph/graph-validation.test.ts +0 -27
  520. package/src/wirings/workflow/graph/graph-validation.ts +0 -41
  521. package/src/wirings/workflow/graph/template.test.ts +0 -49
  522. package/src/wirings/workflow/graph/template.ts +0 -42
  523. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -39
  524. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -75
  525. package/src/wirings/workflow/index.ts +0 -107
  526. package/src/wirings/workflow/pikku-scenario-service.ts +0 -1013
  527. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -963
  528. package/src/wirings/workflow/pikku-workflow-service.ts +0 -1993
  529. package/src/wirings/workflow/run-timeline.test.ts +0 -199
  530. package/src/wirings/workflow/run-timeline.ts +0 -185
  531. package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -107
  532. package/src/wirings/workflow/scenario-cookie-jar.ts +0 -57
  533. package/src/wirings/workflow/scenario-expectations.test.ts +0 -238
  534. package/src/wirings/workflow/scenario-hooks.test.ts +0 -259
  535. package/src/wirings/workflow/scenario-poll.test.ts +0 -64
  536. package/src/wirings/workflow/scenario-poll.ts +0 -27
  537. package/src/wirings/workflow/scenario-prose.test.ts +0 -275
  538. package/src/wirings/workflow/scenario-prose.ts +0 -86
  539. package/src/wirings/workflow/scenario-run.types.ts +0 -193
  540. package/src/wirings/workflow/scenario-service.test.ts +0 -147
  541. package/src/wirings/workflow/scenario-step-guards.ts +0 -23
  542. package/src/wirings/workflow/scenario-step.test.ts +0 -800
  543. package/src/wirings/workflow/scenario-step.types.ts +0 -262
  544. package/src/wirings/workflow/scenario-surface.test.ts +0 -146
  545. package/src/wirings/workflow/scenario-surface.ts +0 -71
  546. package/src/wirings/workflow/scenario.types.ts +0 -63
  547. package/src/wirings/workflow/workflow-approval-audit.ts +0 -47
  548. package/src/wirings/workflow/workflow-approval-policy.test.ts +0 -594
  549. package/src/wirings/workflow/workflow-approval-policy.ts +0 -68
  550. package/src/wirings/workflow/workflow-approval.ts +0 -290
  551. package/src/wirings/workflow/workflow-child-run-session.test.ts +0 -168
  552. package/src/wirings/workflow/workflow-constants.ts +0 -66
  553. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +0 -116
  554. package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -55
  555. package/src/wirings/workflow/workflow-dispatch-relay.test.ts +0 -128
  556. package/src/wirings/workflow/workflow-errors.ts +0 -132
  557. package/src/wirings/workflow/workflow-inline-authority.test.ts +0 -175
  558. package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -51
  559. package/src/wirings/workflow/workflow-invocation-id.ts +0 -28
  560. package/src/wirings/workflow/workflow-meta-resolver.ts +0 -45
  561. package/src/wirings/workflow/workflow-mirror.test.ts +0 -171
  562. package/src/wirings/workflow/workflow-missing-meta.test.ts +0 -92
  563. package/src/wirings/workflow/workflow-on-error.test.ts +0 -145
  564. package/src/wirings/workflow/workflow-queue-routing.ts +0 -129
  565. package/src/wirings/workflow/workflow-queue-wiring.ts +0 -149
  566. package/src/wirings/workflow/workflow-queue-workers.test.ts +0 -131
  567. package/src/wirings/workflow/workflow-queue-workers.ts +0 -66
  568. package/src/wirings/workflow/workflow-recovery.ts +0 -192
  569. package/src/wirings/workflow/workflow-replay-snapshot.test.ts +0 -140
  570. package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -113
  571. package/src/wirings/workflow/workflow-run-authority.test.ts +0 -212
  572. package/src/wirings/workflow/workflow-run-context.test.ts +0 -172
  573. package/src/wirings/workflow/workflow-run-engine.types.ts +0 -92
  574. package/src/wirings/workflow/workflow-run-ownership.ts +0 -37
  575. package/src/wirings/workflow/workflow-run-polling.test.ts +0 -127
  576. package/src/wirings/workflow/workflow-stalled-recovery.test.ts +0 -152
  577. package/src/wirings/workflow/workflow-status-stream.test.ts +0 -354
  578. package/src/wirings/workflow/workflow-status-stream.ts +0 -144
  579. package/src/wirings/workflow/workflow-step-claim.ts +0 -46
  580. package/src/wirings/workflow/workflow-step-ordinal.test.ts +0 -94
  581. package/src/wirings/workflow/workflow-step-session.test.ts +0 -87
  582. package/src/wirings/workflow/workflow-suspend.ts +0 -61
  583. package/src/wirings/workflow/workflow-terminal-run-guard.test.ts +0 -105
  584. package/src/wirings/workflow/workflow.types.ts +0 -268
  585. package/src/wirings-stay-decoupled.test.ts +0 -130
  586. package/tsconfig.json +0 -14
  587. package/tsconfig.tsbuildinfo +0 -1
  588. package/tsconfig.type-tests.json +0 -15
@@ -1,290 +0,0 @@
1
- import { getDurationInMilliseconds } from '../../time-utils.js'
2
- import {
3
- WorkflowApprovalResolvedError,
4
- WorkflowSuspendedException,
5
- } from './workflow-errors.js'
6
- import type {
7
- ApprovalOutcome,
8
- StepState,
9
- WorkflowApprovalOptions,
10
- } from './workflow.types.js'
11
- import type {
12
- ApprovalDecider,
13
- WorkflowApprovalPolicy,
14
- } from './dsl/workflow-dsl.types.js'
15
- import {
16
- approvalPolicyRefusal,
17
- WorkflowApprovalForbiddenError,
18
- } from './workflow-approval-policy.js'
19
-
20
- /** The durable step name an approval point is recorded under. */
21
- export const approvalStepNameFor = (reason: string): string =>
22
- `__workflow_approval:${reason}`
23
-
24
- /**
25
- * The run-state key holding an approval's decision.
26
- *
27
- * Hex-encoded because the key is composed from a caller-supplied reason, and
28
- * run state is a flat record — an unescaped reason could collide with, or
29
- * shadow, another key.
30
- */
31
- export const approvalStateKey = (stepName: string): string => {
32
- let hex = ''
33
- for (const byte of new TextEncoder().encode(stepName)) {
34
- hex += byte.toString(16).padStart(2, '0')
35
- }
36
- return `__approval_${hex}`
37
- }
38
-
39
- /**
40
- * An answer to an approval gate, as the audit trail sees it.
41
- *
42
- * `denied` covers both a submission refused at the door and a decision cleared
43
- * on replay — from the trail's point of view they are the same event, someone
44
- * tried to answer a gate they could not.
45
- */
46
- export type ApprovalAuditEvent = {
47
- runId: string
48
- reason: string
49
- outcome: 'success' | 'denied'
50
- decidedBy?: ApprovalDecider
51
- refusal?: string
52
- }
53
-
54
- /** What the approval gate needs from the workflow service. */
55
- export type ApprovalStore = {
56
- getStepState: (runId: string, stepName: string) => Promise<StepState>
57
- insertStepState: (
58
- runId: string,
59
- stepName: string,
60
- rpcName: string,
61
- input: unknown,
62
- output: undefined,
63
- fromStepName?: string
64
- ) => Promise<StepState>
65
- setStepRunning: (stepId: string) => Promise<void>
66
- setStepResult: (stepId: string, result: unknown) => Promise<void>
67
- getRunState: (runId: string) => Promise<Record<string, unknown>>
68
- updateRunState: (runId: string, key: string, value: unknown) => Promise<void>
69
- resumeWorkflow: (runId: string) => Promise<void>
70
- scheduleRunWake: (runId: string, delay: number) => Promise<void>
71
- getRunOwner: (runId: string) => Promise<string | undefined>
72
- auditApproval: (event: ApprovalAuditEvent) => Promise<void>
73
- }
74
-
75
- /** What run state holds for an approval point between suspension and replay. */
76
- type ApprovalRecord = {
77
- decision?: unknown
78
- decidedAt?: string
79
- decidedBy?: ApprovalDecider
80
- policy?: WorkflowApprovalPolicy
81
- expiresAt?: string
82
- error?: unknown
83
- }
84
-
85
- /**
86
- * Record a decision against an approval point and wake the run.
87
- *
88
- * A decision arriving for an already-settled approval is refused rather than
89
- * overwriting it: the run has moved on, and a second answer would be recorded
90
- * against a gate nobody is waiting at.
91
- *
92
- * The decider is recorded rather than judged here, for the same reason the
93
- * payload is: the gate's policy is a value on the workflow, and a decision can
94
- * legitimately arrive before the run has ever reached the gate. Where the run
95
- * has already published its policy, it is applied eagerly so a caller who
96
- * cannot answer is told so rather than left waiting.
97
- */
98
- export const recordApprovalDecision = async (
99
- store: ApprovalStore,
100
- runId: string,
101
- reason: string,
102
- decision: unknown,
103
- decidedBy?: ApprovalDecider
104
- ): Promise<void> => {
105
- const stepName = approvalStepNameFor(reason)
106
- const stateKey = approvalStateKey(stepName)
107
-
108
- let resolved: StepState | undefined
109
- try {
110
- resolved = await store.getStepState(runId, stepName)
111
- } catch {
112
- // knowledge: decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md
113
- }
114
- if (resolved?.stepId && resolved.status === 'succeeded') {
115
- const outcome = resolved.result as ApprovalOutcome<unknown> | undefined
116
- throw new WorkflowApprovalResolvedError(
117
- reason,
118
- outcome?.status ?? 'decided'
119
- )
120
- }
121
-
122
- const state = await store.getRunState(runId)
123
- const record = (state[stateKey] ?? {}) as ApprovalRecord
124
-
125
- if (record.policy) {
126
- const refusal = approvalPolicyRefusal(
127
- record.policy,
128
- await store.getRunOwner(runId),
129
- decidedBy
130
- )
131
- if (refusal) {
132
- await store.auditApproval({
133
- runId,
134
- reason,
135
- outcome: 'denied',
136
- decidedBy,
137
- refusal,
138
- })
139
- throw new WorkflowApprovalForbiddenError(reason, refusal)
140
- }
141
- }
142
-
143
- await store.updateRunState(runId, stateKey, {
144
- ...record,
145
- decision,
146
- decidedAt: new Date().toISOString(),
147
- decidedBy,
148
- error: undefined,
149
- } satisfies ApprovalRecord)
150
- await store.auditApproval({ runId, reason, outcome: 'success', decidedBy })
151
- await store.resumeWorkflow(runId)
152
- }
153
-
154
- /**
155
- * Evaluate an approval gate on replay.
156
- *
157
- * The payload is validated here rather than where it was submitted, because the
158
- * schema is a value on the workflow and only the workflow has it. A payload
159
- * that fails validation is cleared and the run suspends again, so a bad
160
- * submission cannot settle the gate.
161
- *
162
- * The decider is judged here for the same reason, and for one more: a decision
163
- * can be recorded before the run has ever reached the gate, so submission time
164
- * is not a point at which the policy is reliably knowable. Judging on replay is
165
- * what makes the policy hold in every ordering.
166
- */
167
- export const evaluateApprovalStep = async (
168
- store: ApprovalStore,
169
- runId: string,
170
- reason: string,
171
- approvalStepName: string,
172
- fromStepName: string | undefined,
173
- options: WorkflowApprovalOptions
174
- ): Promise<ApprovalOutcome<unknown>> => {
175
- const insert = () =>
176
- store.insertStepState(
177
- runId,
178
- approvalStepName,
179
- 'pikkuWorkflowApproval',
180
- {
181
- reason,
182
- expiry: options.expiry,
183
- approvers: options.approvers,
184
- approverScope: options.approverScope,
185
- },
186
- undefined,
187
- fromStepName
188
- )
189
-
190
- let stepState: StepState
191
- try {
192
- stepState = await store.getStepState(runId, approvalStepName)
193
- } catch {
194
- stepState = await insert()
195
- }
196
- if (!stepState.stepId) {
197
- stepState = await insert()
198
- }
199
-
200
- if (stepState.status === 'succeeded') {
201
- return stepState.result as ApprovalOutcome<unknown>
202
- }
203
-
204
- const stateKey = approvalStateKey(approvalStepName)
205
- let record = ((await store.getRunState(runId))[stateKey] ??
206
- {}) as ApprovalRecord
207
-
208
- const policy: WorkflowApprovalPolicy = {
209
- approvers: options.approvers,
210
- approverScope: options.approverScope,
211
- }
212
-
213
- if (stepState.status === 'pending') {
214
- await store.setStepRunning(stepState.stepId)
215
- record = { ...record, policy }
216
- if (options.expiry !== undefined && !record.expiresAt) {
217
- const expiry = getDurationInMilliseconds(options.expiry)
218
- record = {
219
- ...record,
220
- expiresAt: new Date(Date.now() + expiry).toISOString(),
221
- }
222
- await store.updateRunState(runId, stateKey, record)
223
- await store.scheduleRunWake(runId, expiry)
224
- } else {
225
- await store.updateRunState(runId, stateKey, record)
226
- }
227
- }
228
-
229
- if (record.decision !== undefined) {
230
- const refusal = approvalPolicyRefusal(
231
- policy,
232
- await store.getRunOwner(runId),
233
- record.decidedBy
234
- )
235
- if (refusal) {
236
- await store.updateRunState(runId, stateKey, {
237
- ...record,
238
- decision: undefined,
239
- decidedAt: undefined,
240
- decidedBy: undefined,
241
- error: [{ message: refusal }],
242
- } satisfies ApprovalRecord)
243
- await store.auditApproval({
244
- runId,
245
- reason,
246
- outcome: 'denied',
247
- decidedBy: record.decidedBy,
248
- refusal,
249
- })
250
- throw new WorkflowSuspendedException(runId, reason)
251
- }
252
-
253
- const validation = await options.schema['~standard'].validate(
254
- record.decision
255
- )
256
- if (validation.issues) {
257
- await store.updateRunState(runId, stateKey, {
258
- ...record,
259
- decision: undefined,
260
- decidedAt: undefined,
261
- decidedBy: undefined,
262
- error: validation.issues.map((issue) => ({
263
- message: issue.message,
264
- path: issue.path?.map((segment) =>
265
- typeof segment === 'object' ? segment.key : segment
266
- ),
267
- })),
268
- })
269
- throw new WorkflowSuspendedException(runId, reason)
270
- }
271
- // Spread rather than assigned, so a gate answered without a session keeps
272
- // the shape it had before there was anything to record.
273
- const outcome: ApprovalOutcome<unknown> = {
274
- status: 'decided',
275
- data: validation.value,
276
- ...(record.decidedBy ? { decidedBy: record.decidedBy } : {}),
277
- ...(record.decidedAt ? { decidedAt: record.decidedAt } : {}),
278
- }
279
- await store.setStepResult(stepState.stepId, outcome)
280
- return outcome
281
- }
282
-
283
- if (record.expiresAt && Date.now() >= Date.parse(record.expiresAt)) {
284
- const outcome: ApprovalOutcome<unknown> = { status: 'expired' }
285
- await store.setStepResult(stepState.stepId, outcome)
286
- return outcome
287
- }
288
-
289
- throw new WorkflowSuspendedException(runId, reason)
290
- }
@@ -1,168 +0,0 @@
1
- import { describe, test } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { InMemoryWorkflowService } from '../../services/in-memory-workflow-service.js'
5
- import { pikkuState, resetPikkuState } from '../../pikku-state.js'
6
-
7
- const silentLogger = { error() {}, info() {}, warn() {}, debug() {} }
8
-
9
- const registerChildWorkflow = (name: string) => {
10
- pikkuState(null, 'workflows', 'meta', {
11
- [name]: { name, pikkuFuncId: name, source: 'dsl', graphHash: 'h' },
12
- } as any)
13
- pikkuState(null, 'workflows', 'registrations').set(name, {
14
- name,
15
- func: async () => undefined,
16
- } as any)
17
- pikkuState(null, 'function', 'meta', {
18
- [name]: {
19
- pikkuFuncId: name,
20
- inputSchemaName: null,
21
- outputSchemaName: null,
22
- sessionless: true,
23
- },
24
- } as any)
25
- pikkuState(null, 'function', 'functions').set(name, {
26
- func: async () => undefined,
27
- } as any)
28
- }
29
-
30
- /**
31
- * A step whose rpcName names a workflow starts that workflow as a child. The
32
- * child's wire is built by the parent, so whatever identifies the caller has to
33
- * be copied across explicitly — nothing else carries it.
34
- */
35
- describe('a child workflow inherits the parent run wire pikkuUserId', () => {
36
- const startParentWithChildStep = async (pikkuUserId?: string) => {
37
- resetPikkuState()
38
- pikkuState(null, 'package', 'singletonServices', {
39
- logger: silentLogger,
40
- } as any)
41
- registerChildWorkflow('childFlow')
42
-
43
- const ws = new InMemoryWorkflowService()
44
- const runId = await ws.createRun('parentFlow', {}, true, '', {
45
- type: 'test',
46
- ...(pikkuUserId ? { pikkuUserId } : {}),
47
- })
48
- ws.registerInlineRun(runId)
49
- await ws.insertStepState(runId, 'callChild', 'childFlow', {})
50
-
51
- await (ws as any).rpcStep(runId, 'callChild', 'childFlow', {}, {})
52
- return ws
53
- }
54
-
55
- const childRunWire = async (ws: InMemoryWorkflowService) => {
56
- const runs: any[] = []
57
- for (const id of (ws as any).runs?.keys?.() ?? []) {
58
- const run = await ws.getRun(id)
59
- if (run?.workflow === 'childFlow') runs.push(run)
60
- }
61
- assert.equal(runs.length, 1, 'exactly one child run should have started')
62
- return runs[0]!.wire
63
- }
64
-
65
- test('the child run wire carries the parent pikkuUserId', async () => {
66
- const ws = await startParentWithChildStep('user-abc')
67
-
68
- assert.equal(
69
- (await childRunWire(ws)).pikkuUserId,
70
- 'user-abc',
71
- 'a child started from a step must inherit who the parent was running as'
72
- )
73
- })
74
-
75
- test('no pikkuUserId is invented when the parent has none', async () => {
76
- const ws = await startParentWithChildStep()
77
-
78
- assert.equal((await childRunWire(ws)).pikkuUserId, undefined)
79
- })
80
-
81
- test('the child records its parent', async () => {
82
- const ws = await startParentWithChildStep('user-abc')
83
- const wire = await childRunWire(ws)
84
-
85
- assert.equal(wire.type, 'workflow')
86
- assert.equal(wire.id, 'childFlow')
87
- assert.ok(wire.parentRunId, 'the child must name the run that started it')
88
- })
89
- })
90
-
91
- /**
92
- * Queuing a child workflow is only worth anything if the parent comes back with
93
- * the child's output. The routing tests assert which way a step goes; this
94
- * asserts what the parent is left holding once the child it queued has ended.
95
- */
96
- describe('a queued child workflow hands its output back to the parent step', () => {
97
- const CHILD_OUTPUT = { invoiceId: 'inv-42' }
98
-
99
- const setup = async () => {
100
- resetPikkuState()
101
- pikkuState(null, 'package', 'singletonServices', {
102
- logger: silentLogger,
103
- queueService: { add: async () => {} },
104
- } as any)
105
- registerChildWorkflow('childFlow')
106
- pikkuState(null, 'function', 'functions').set('childFlow', {
107
- func: async () => CHILD_OUTPUT,
108
- } as any)
109
-
110
- const ws = new InMemoryWorkflowService()
111
- const parentRunId = await ws.createRun('parentFlow', {}, false, '', {
112
- type: 'test',
113
- })
114
- const step = await ws.insertStepState(
115
- parentRunId,
116
- 'callChild',
117
- 'childFlow',
118
- {}
119
- )
120
- const stepId = (step as any).stepId ?? (step as any).id
121
- assert.ok(stepId, 'the parent step must have an id to hand back to')
122
- return { ws, parentRunId, stepId }
123
- }
124
-
125
- const childRunIdOf = async (ws: InMemoryWorkflowService) => {
126
- for (const id of (ws as any).runs?.keys?.() ?? []) {
127
- const run = await ws.getRun(id)
128
- if (run?.workflow === 'childFlow') return run.id
129
- }
130
- throw new Error('no child run was started')
131
- }
132
-
133
- test('the parent step carries the child output once the child completes', async () => {
134
- const { ws, parentRunId, stepId } = await setup()
135
-
136
- // The step worker that picked the queued job off runs this; it starts the
137
- // child and unwinds the parent rather than waiting on it.
138
- await (ws as any).executeWorkflowStepInner(
139
- parentRunId,
140
- 'callChild',
141
- 'childFlow',
142
- {},
143
- {}
144
- )
145
-
146
- const childRunId = await childRunIdOf(ws)
147
- const childRun = await ws.getRun(childRunId)
148
- assert.equal(
149
- childRun?.wire?.parentStepId,
150
- stepId,
151
- 'the child must name the step it has to hand its output back to'
152
- )
153
-
154
- await ws.updateRunStatus(childRunId, 'completed', CHILD_OUTPUT)
155
- await (ws as any).onChildWorkflowCompleted(
156
- await ws.getRun(childRunId),
157
- CHILD_OUTPUT
158
- )
159
-
160
- const steps = await ws.getRunSteps(parentRunId)
161
- const callChild = steps.find((s: any) => s.stepName === 'callChild')
162
- assert.deepEqual(
163
- callChild?.result,
164
- CHILD_OUTPUT,
165
- 'the parent step must end up holding what the child returned'
166
- )
167
- })
168
- })
@@ -1,66 +0,0 @@
1
- export const DEFAULT_STEP_RETRIES = 5
2
-
3
- /** Statuses from which a run never advances again on its own. */
4
- export const WORKFLOW_END_STATES: ReadonlySet<string> = new Set([
5
- 'completed',
6
- 'failed',
7
- 'cancelled',
8
- 'suspended',
9
- ])
10
-
11
- /** Statuses a run cannot leave at all. */
12
- export const WORKFLOW_TERMINAL_STATES: ReadonlySet<string> = new Set([
13
- 'completed',
14
- 'failed',
15
- 'cancelled',
16
- ])
17
-
18
- /**
19
- * True for a run that will never move again, whatever arrives for it.
20
- *
21
- * Worth checking before doing anything with an orchestrator message, because
22
- * such a message is routine rather than exceptional: the queue is
23
- * at-least-once, the relay re-dispatches on purpose, and a run can settle
24
- * while a message for it is still in flight. Replaying one is not free —
25
- * `runWorkflowJob` takes the run lock and re-enters the workflow body, and a
26
- * body re-entered after its run failed can park on a wait that nothing will
27
- * ever satisfy, holding the lock and the connection under it until something
28
- * external gives up. Every leaked advisory lock seen in production traced back
29
- * to that: a granted lock, an idle session, and a run already `failed`.
30
- *
31
- * Note `suspended` is deliberately absent. It ends a run's *current* pass but
32
- * not the run, which resumes when its approval or signal arrives.
33
- */
34
- export const isRunSettled = (status: string): boolean =>
35
- WORKFLOW_TERMINAL_STATES.has(status)
36
-
37
- export const WORKFLOW_POLL_MIN_MS = 10
38
-
39
- export const WORKFLOW_POLL_FACTOR = 1.6
40
-
41
- export const WORKFLOW_CHILD_POLL_MAX_MS = 500
42
-
43
- /** Idle window before a `running` run with nothing in flight is treated as stalled. */
44
- export const DEFAULT_STALLED_RUN_MS = 5 * 60_000
45
-
46
- /** Runs re-driven per `recoverStalledRuns` call, so one sweep is bounded. */
47
- export const DEFAULT_STALLED_RUN_LIMIT = 100
48
-
49
- /**
50
- * How long a step may sit `pending` before the relay assumes its dispatch was
51
- * lost. This is a bet that no healthy queue takes this long to move a job from
52
- * `pending` to `running`; set it above the observed p99 of that latency.
53
- */
54
- export const DEFAULT_UNDISPATCHED_STEP_MS = 30_000
55
-
56
- /** Steps re-driven per `relayUndispatchedSteps` call, so one tick is bounded. */
57
- export const DEFAULT_UNDISPATCHED_STEP_LIMIT = 100
58
-
59
- /** First wait before a step already re-dispatched once is re-dispatched again. */
60
- export const REDISPATCH_BACKOFF_MS = 30_000
61
-
62
- /** Ceiling on the doubling backoff, so a permanently stuck step still gets swept. */
63
- export const REDISPATCH_BACKOFF_MAX_MS = 10 * 60_000
64
-
65
- /** Bound on the in-process backoff map, so a long-lived process cannot grow it without bound. */
66
- export const REDISPATCH_BACKOFF_MAX_ENTRIES = 10_000
@@ -1,116 +0,0 @@
1
- import { describe, test } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { InMemoryWorkflowService } from '../../services/in-memory-workflow-service.js'
5
- import { pikkuState } from '../../pikku-state.js'
6
- import { WorkflowDispatchException } from './workflow-errors.js'
7
-
8
- function registerDispatchedFn(rpcName: string): void {
9
- const funcId = `fn:${rpcName}`
10
- pikkuState(null, 'rpc', 'meta', { [rpcName]: funcId } as any)
11
- pikkuState(null, 'function', 'meta', {
12
- [funcId]: { workflowQueued: true },
13
- } as any)
14
- }
15
-
16
- const silentLogger = { error() {}, info() {}, warn() {}, debug() {} }
17
-
18
- describe('dispatch durability: a transient queue failure is recoverable', () => {
19
- test('failed dispatch leaves the step PENDING and the run un-failed, then re-dispatches on replay', async () => {
20
- registerDispatchedFn('doThing')
21
- let queueUp = false
22
- pikkuState(null, 'package', 'singletonServices', {
23
- queueService: {
24
- add: async () => {
25
- if (!queueUp) throw new Error('pg-boss is down')
26
- },
27
- },
28
- logger: silentLogger,
29
- } as any)
30
-
31
- const ws = new InMemoryWorkflowService()
32
- const runId = await ws.createRun('flow', {}, false, 'hash', {
33
- type: 'test',
34
- })
35
- await ws.insertStepState(runId, 'thing', 'doThing', {})
36
-
37
- await assert.rejects(
38
- (ws as any).rpcStep(runId, 'thing', 'doThing', {}, {}),
39
- (err: any) => err instanceof WorkflowDispatchException,
40
- 'a queue outage surfaces as WorkflowDispatchException'
41
- )
42
-
43
- const afterFail = await ws.getStepState(runId, 'thing')
44
- assert.equal(
45
- afterFail.status,
46
- 'pending',
47
- 'step stays pending after a failed dispatch'
48
- )
49
-
50
- const runAfterFail = await ws.getRun(runId)
51
- assert.notEqual(
52
- runAfterFail?.status,
53
- 'failed',
54
- 'run is not failed by a queue blip'
55
- )
56
-
57
- await (ws as any).beginReplay(runId)
58
- queueUp = true
59
- await assert.rejects(
60
- (ws as any).rpcStep(runId, 'thing', 'doThing', {}, {}),
61
- (err: any) => err.name === 'WorkflowAsyncException',
62
- 'recovered dispatch pauses the workflow as normal'
63
- )
64
- const afterRecover = await ws.getStepState(runId, 'thing')
65
- assert.equal(
66
- afterRecover.status,
67
- 'scheduled',
68
- 'step is scheduled only after a successful dispatch'
69
- )
70
- })
71
- })
72
-
73
- describe('orchestrateWorkflow treats a dispatch failure as non-terminal', () => {
74
- function makeService(throwIt: () => never) {
75
- pikkuState(null, 'package', 'singletonServices', {
76
- queueService: { add: async () => {} },
77
- logger: silentLogger,
78
- } as any)
79
- const ws = new InMemoryWorkflowService()
80
- ;(ws as any).runWorkflowJob = async () => throwIt()
81
- return ws
82
- }
83
-
84
- test('WorkflowDispatchException → run NOT marked failed, error rethrown for queue retry', async () => {
85
- const ws = makeService(() => {
86
- throw new WorkflowDispatchException('r', 's')
87
- })
88
- const runId = await ws.createRun('flow', {}, false, 'hash', {
89
- type: 'test',
90
- })
91
-
92
- await assert.rejects(
93
- ws.orchestrateWorkflow(runId, {}),
94
- (err: any) => err instanceof WorkflowDispatchException
95
- )
96
- const run = await ws.getRun(runId)
97
- assert.notEqual(
98
- run?.status,
99
- 'failed',
100
- 'a transient dispatch failure must leave the run resumable'
101
- )
102
- })
103
-
104
- test('a genuine step error still fails the run (unchanged behavior)', async () => {
105
- const ws = makeService(() => {
106
- throw new Error('business logic blew up')
107
- })
108
- const runId = await ws.createRun('flow', {}, false, 'hash', {
109
- type: 'test',
110
- })
111
-
112
- await assert.rejects(ws.orchestrateWorkflow(runId, {}))
113
- const run = await ws.getRun(runId)
114
- assert.equal(run?.status, 'failed', 'real errors still fail the run')
115
- })
116
- })
@@ -1,55 +0,0 @@
1
- import { describe, test } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { InMemoryWorkflowService } from '../../services/in-memory-workflow-service.js'
5
- import { pikkuState } from '../../pikku-state.js'
6
-
7
- const silentLogger = { error() {}, info() {}, warn() {}, debug() {} }
8
-
9
- function serviceWithCapturingQueue() {
10
- const added: Array<{ queueName: string; data: any }> = []
11
- pikkuState(null, 'package', 'singletonServices', {
12
- queueService: {
13
- add: async (queueName: string, data: any) => {
14
- added.push({ queueName, data })
15
- return 'job-1'
16
- },
17
- },
18
- logger: silentLogger,
19
- } as any)
20
- return { ws: new InMemoryWorkflowService() as any, added }
21
- }
22
-
23
- describe('dispatching a step does not serialise the payload twice', () => {
24
- test('the queue receives the payload core was given', async () => {
25
- const { ws, added } = serviceWithCapturingQueue()
26
- const runId = await ws.createRun('flow', {}, false, 'hash', {
27
- type: 'test',
28
- })
29
- const payload = { when: new Date('2020-01-01T00:00:00.000Z'), n: 1 }
30
-
31
- await ws.queueStepWorker(runId, 'step-1', 'rpc.fn', payload)
32
-
33
- assert.equal(added.length, 1)
34
- assert.ok(
35
- added[0]!.data.data.when instanceof Date,
36
- 'core round-tripped the payload through JSON before handing it to a queue that serialises it anyway'
37
- )
38
- assert.equal(added[0]!.data.data.n, 1)
39
- assert.equal(added[0]!.data.runId, runId)
40
- assert.equal(added[0]!.data.stepName, 'step-1')
41
- })
42
-
43
- test('a payload the queue cannot serialise is still the queue’s problem, not a silent drop', async () => {
44
- const { ws, added } = serviceWithCapturingQueue()
45
- const runId = await ws.createRun('flow', {}, false, 'hash', {
46
- type: 'test',
47
- })
48
- const circular: any = { name: 'loop' }
49
- circular.self = circular
50
-
51
- await ws.queueStepWorker(runId, 'step-1', 'rpc.fn', circular)
52
-
53
- assert.equal(added[0]!.data.data.self, added[0]!.data.data)
54
- })
55
- })