@pikku/core 0.12.71 → 0.12.74

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 (819) hide show
  1. package/CHANGELOG.md +848 -0
  2. package/dist/crypto-utils.d.ts +30 -5
  3. package/dist/crypto-utils.js +146 -41
  4. package/dist/dev/hot-reload.js +11 -30
  5. package/dist/dev/module-runner.d.ts +3 -7
  6. package/dist/dev/module-runner.js +4 -10
  7. package/dist/dev/reload-meta.d.ts +8 -20
  8. package/dist/dev/reload-meta.js +9 -29
  9. package/dist/errors/error-handler.d.ts +5 -30
  10. package/dist/errors/error-handler.js +16 -32
  11. package/dist/errors/errors.d.ts +32 -151
  12. package/dist/errors/errors.js +55 -157
  13. package/dist/function/abort-scope.d.ts +47 -0
  14. package/dist/function/abort-scope.js +63 -0
  15. package/dist/function/function-runner.js +40 -30
  16. package/dist/function/functions.types.d.ts +44 -136
  17. package/dist/function/functions.types.js +0 -58
  18. package/dist/function/list.types.d.ts +12 -62
  19. package/dist/function/list.types.js +4 -25
  20. package/dist/handle-error.d.ts +0 -11
  21. package/dist/handle-error.js +6 -18
  22. package/dist/index.d.ts +5 -2
  23. package/dist/index.js +4 -1
  24. package/dist/middleware/auth-apikey.d.ts +3 -18
  25. package/dist/middleware/auth-apikey.js +0 -17
  26. package/dist/middleware/auth-bearer.d.ts +6 -41
  27. package/dist/middleware/auth-bearer.js +3 -40
  28. package/dist/middleware/auth-cookie.d.ts +5 -27
  29. package/dist/middleware/auth-cookie.js +2 -26
  30. package/dist/middleware/cors.d.ts +7 -34
  31. package/dist/middleware/cors.js +7 -34
  32. package/dist/middleware/remote-auth.d.ts +3 -1
  33. package/dist/middleware/remote-auth.js +3 -2
  34. package/dist/middleware/telemetry.d.ts +8 -33
  35. package/dist/middleware/telemetry.js +2 -31
  36. package/dist/middleware-runner.d.ts +4 -55
  37. package/dist/middleware-runner.js +5 -74
  38. package/dist/permissions.d.ts +3 -44
  39. package/dist/permissions.js +19 -71
  40. package/dist/pikku-request.d.ts +0 -6
  41. package/dist/pikku-request.js +0 -6
  42. package/dist/pikku-state.d.ts +0 -26
  43. package/dist/pikku-state.js +2 -30
  44. package/dist/remote.d.ts +3 -5
  45. package/dist/remote.js +8 -7
  46. package/dist/schema.d.ts +7 -17
  47. package/dist/schema.js +30 -18
  48. package/dist/scopes.d.ts +4 -23
  49. package/dist/scopes.js +7 -48
  50. package/dist/services/ai-agent-runner-service.d.ts +20 -0
  51. package/dist/services/ai-embedding-service.d.ts +2 -25
  52. package/dist/services/audit-service.js +1 -2
  53. package/dist/services/content-service.d.ts +1 -46
  54. package/dist/services/credential-service.d.ts +3 -40
  55. package/dist/services/deployment-service.d.ts +3 -9
  56. package/dist/services/gateway-service.d.ts +0 -15
  57. package/dist/services/http-personas.d.ts +80 -0
  58. package/dist/services/http-personas.js +233 -0
  59. package/dist/services/in-memory-queue-service.d.ts +0 -14
  60. package/dist/services/in-memory-queue-service.js +1 -15
  61. package/dist/services/in-memory-trigger-service.d.ts +0 -18
  62. package/dist/services/in-memory-trigger-service.js +1 -18
  63. package/dist/services/in-memory-workflow-service.d.ts +0 -16
  64. package/dist/services/in-memory-workflow-service.js +4 -33
  65. package/dist/services/index.d.ts +5 -6
  66. package/dist/services/index.js +2 -5
  67. package/dist/services/istanbul-coverage-service.d.ts +1 -5
  68. package/dist/services/istanbul-coverage-service.js +2 -8
  69. package/dist/services/jwt-service.d.ts +1 -16
  70. package/dist/services/local-content.d.ts +13 -2
  71. package/dist/services/local-content.js +40 -13
  72. package/dist/services/local-gateway-service.d.ts +0 -16
  73. package/dist/services/local-gateway-service.js +2 -17
  74. package/dist/services/local-secrets.d.ts +0 -4
  75. package/dist/services/local-secrets.js +0 -4
  76. package/dist/services/logger-console.d.ts +3 -7
  77. package/dist/services/logger-console.js +3 -7
  78. package/dist/services/logger.d.ts +2 -37
  79. package/dist/services/meta-service.d.ts +23 -26
  80. package/dist/services/meta-service.js +22 -36
  81. package/dist/services/personas-service.d.ts +134 -0
  82. package/dist/services/personas-service.js +40 -0
  83. package/dist/services/pikku-user-id.js +0 -4
  84. package/dist/services/queue-webhook-service.d.ts +2 -36
  85. package/dist/services/queue-webhook-service.js +9 -41
  86. package/dist/services/scheduler-service.d.ts +1 -50
  87. package/dist/services/scheduler-service.js +0 -10
  88. package/dist/services/schema-service.d.ts +1 -24
  89. package/dist/services/scope-service.d.ts +49 -34
  90. package/dist/services/scoped-secret-service.d.ts +0 -4
  91. package/dist/services/scoped-secret-service.js +0 -4
  92. package/dist/services/secret-host-binding.d.ts +8 -0
  93. package/dist/services/secret-host-binding.js +36 -0
  94. package/dist/services/secret-service.d.ts +5 -33
  95. package/dist/services/secretless.d.ts +6 -0
  96. package/dist/services/secretless.js +21 -0
  97. package/dist/services/stub-tracker.d.ts +7 -18
  98. package/dist/services/stub-tracker.js +8 -18
  99. package/dist/services/system-role-guard.d.ts +33 -0
  100. package/dist/services/system-role-guard.js +38 -0
  101. package/dist/services/trigger-service.d.ts +0 -12
  102. package/dist/services/typed-secret-service.d.ts +0 -7
  103. package/dist/services/typed-secret-service.js +1 -7
  104. package/dist/services/v8-coverage-service.d.ts +2 -3
  105. package/dist/services/v8-coverage-service.js +1 -2
  106. package/dist/services/variables-service.d.ts +1 -8
  107. package/dist/services/webhook-service.d.ts +19 -63
  108. package/dist/services/webhook-service.js +6 -20
  109. package/dist/services/workflow-service.d.ts +3 -15
  110. package/dist/testing/service-tests.js +0 -17
  111. package/dist/time-utils.d.ts +0 -16
  112. package/dist/time-utils.js +1 -19
  113. package/dist/types/core.types.d.ts +99 -219
  114. package/dist/types/core.types.js +0 -42
  115. package/dist/types/state.types.d.ts +4 -9
  116. package/dist/utils/hmac.d.ts +4 -10
  117. package/dist/utils/hmac.js +4 -10
  118. package/dist/utils/safe-fetch.d.ts +7 -35
  119. package/dist/utils/safe-fetch.js +13 -53
  120. package/dist/utils.d.ts +1 -6
  121. package/dist/utils.js +6 -15
  122. package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
  123. package/dist/wirings/actor-flow/index.d.ts +0 -9
  124. package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
  125. package/dist/wirings/actor-flow/run-conversation.js +14 -7
  126. package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
  127. package/dist/wirings/ai-agent/ai-agent-agui.js +34 -12
  128. package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
  129. package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
  130. package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
  131. package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
  132. package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
  133. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
  134. package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
  135. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
  136. package/dist/wirings/ai-agent/ai-agent-prepare.js +58 -131
  137. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
  138. package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
  139. package/dist/wirings/ai-agent/ai-agent-runner.js +49 -20
  140. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
  141. package/dist/wirings/ai-agent/ai-agent-stream.js +153 -63
  142. package/dist/wirings/ai-agent/ai-agent.types.d.ts +84 -4
  143. package/dist/wirings/ai-agent/index.d.ts +6 -4
  144. package/dist/wirings/ai-agent/index.js +5 -4
  145. package/dist/wirings/ai-agent/voice-input.d.ts +39 -1
  146. package/dist/wirings/ai-agent/voice-input.js +46 -3
  147. package/dist/wirings/ai-agent/voice-output.d.ts +54 -1
  148. package/dist/wirings/ai-agent/voice-output.js +153 -50
  149. package/dist/wirings/channel/channel-common.d.ts +7 -20
  150. package/dist/wirings/channel/channel-common.js +7 -21
  151. package/dist/wirings/channel/channel-handler.js +25 -6
  152. package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
  153. package/dist/wirings/channel/channel-host-rpc.js +38 -0
  154. package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
  155. package/dist/wirings/channel/channel-middleware-runner.js +0 -12
  156. package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
  157. package/dist/wirings/channel/channel-rpc-registry.js +89 -0
  158. package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
  159. package/dist/wirings/channel/channel-rpc-responder.js +71 -0
  160. package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
  161. package/dist/wirings/channel/channel-rpc-service.js +106 -0
  162. package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
  163. package/dist/wirings/channel/channel-rpc-validators.js +30 -0
  164. package/dist/wirings/channel/channel-rpc.d.ts +5 -0
  165. package/dist/wirings/channel/channel-rpc.js +5 -0
  166. package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
  167. package/dist/wirings/channel/channel-rpc.types.js +50 -0
  168. package/dist/wirings/channel/channel-runner.d.ts +0 -4
  169. package/dist/wirings/channel/channel-runner.js +0 -14
  170. package/dist/wirings/channel/channel-store.d.ts +0 -10
  171. package/dist/wirings/channel/channel.types.d.ts +12 -1
  172. package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
  173. package/dist/wirings/channel/define-channel-routes.js +0 -20
  174. package/dist/wirings/channel/eventhub-service.d.ts +0 -18
  175. package/dist/wirings/channel/index.d.ts +4 -1
  176. package/dist/wirings/channel/index.js +2 -0
  177. package/dist/wirings/channel/local/local-channel-runner.js +3 -1
  178. package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
  179. package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
  180. package/dist/wirings/channel/log-channels.d.ts +0 -4
  181. package/dist/wirings/channel/log-channels.js +0 -4
  182. package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
  183. package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
  184. package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
  185. package/dist/wirings/cli/channel/cli-approval.js +81 -0
  186. package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
  187. package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
  188. package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
  189. package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
  190. package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +20 -0
  191. package/dist/wirings/cli/channel/cli-raw-client-runner.js +121 -0
  192. package/dist/wirings/cli/channel/index.d.ts +4 -0
  193. package/dist/wirings/cli/channel/index.js +2 -0
  194. package/dist/wirings/cli/cli-runner.d.ts +20 -20
  195. package/dist/wirings/cli/cli-runner.js +28 -89
  196. package/dist/wirings/cli/cli.types.d.ts +14 -3
  197. package/dist/wirings/cli/command-parser.d.ts +1 -10
  198. package/dist/wirings/cli/command-parser.js +10 -87
  199. package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
  200. package/dist/wirings/cli/define-cli-commands.js +1 -17
  201. package/dist/wirings/credential/credential.types.d.ts +0 -12
  202. package/dist/wirings/credential/define-credential.d.ts +48 -0
  203. package/dist/wirings/credential/define-credential.js +47 -0
  204. package/dist/wirings/credential/index.d.ts +1 -1
  205. package/dist/wirings/credential/index.js +1 -1
  206. package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
  207. package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
  208. package/dist/wirings/gateway/gateway-runner.js +8 -105
  209. package/dist/wirings/gateway/gateway.types.d.ts +7 -80
  210. package/dist/wirings/http/http-routes.d.ts +0 -63
  211. package/dist/wirings/http/http-routes.js +0 -63
  212. package/dist/wirings/http/http-runner.d.ts +1 -100
  213. package/dist/wirings/http/http-runner.js +12 -166
  214. package/dist/wirings/http/http.types.d.ts +16 -55
  215. package/dist/wirings/http/index.d.ts +2 -1
  216. package/dist/wirings/http/index.js +1 -1
  217. package/dist/wirings/http/log-http-routes.d.ts +0 -4
  218. package/dist/wirings/http/log-http-routes.js +0 -4
  219. package/dist/wirings/http/pikku-fetch-http-request.d.ts +6 -36
  220. package/dist/wirings/http/pikku-fetch-http-request.js +56 -50
  221. package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
  222. package/dist/wirings/http/routers/path-to-regex.js +2 -13
  223. package/dist/wirings/http/web-request.d.ts +0 -8
  224. package/dist/wirings/http/web-request.js +25 -17
  225. package/dist/wirings/mcp/mcp-runner.d.ts +2 -0
  226. package/dist/wirings/mcp/mcp-runner.js +6 -16
  227. package/dist/wirings/mcp/mcp.types.d.ts +2 -35
  228. package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
  229. package/dist/wirings/oauth2/oauth2.types.js +0 -3
  230. package/dist/wirings/persona/define-personas.d.ts +28 -0
  231. package/dist/wirings/persona/define-personas.js +27 -0
  232. package/dist/wirings/persona/index.d.ts +21 -0
  233. package/dist/wirings/persona/index.js +17 -0
  234. package/dist/wirings/persona/persona-email.d.ts +37 -0
  235. package/dist/wirings/persona/persona-email.js +69 -0
  236. package/dist/wirings/persona/persona-environments.d.ts +45 -0
  237. package/dist/wirings/persona/persona-environments.js +81 -0
  238. package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
  239. package/dist/wirings/persona/persona-mailbox.js +53 -0
  240. package/dist/wirings/persona/persona.types.d.ts +125 -0
  241. package/dist/wirings/persona/persona.types.js +1 -0
  242. package/dist/wirings/persona/validate-personas.d.ts +53 -0
  243. package/dist/wirings/persona/validate-personas.js +94 -0
  244. package/dist/wirings/queue/index.d.ts +3 -0
  245. package/dist/wirings/queue/index.js +2 -3
  246. package/dist/wirings/queue/queue-identity.d.ts +28 -0
  247. package/dist/wirings/queue/queue-identity.js +102 -0
  248. package/dist/wirings/queue/queue-runner.d.ts +0 -19
  249. package/dist/wirings/queue/queue-runner.js +9 -30
  250. package/dist/wirings/queue/queue.types.d.ts +18 -89
  251. package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
  252. package/dist/wirings/queue/register-queue-helper.js +0 -11
  253. package/dist/wirings/queue/signed-queue-service.d.ts +16 -0
  254. package/dist/wirings/queue/signed-queue-service.js +42 -0
  255. package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
  256. package/dist/wirings/queue/validate-worker-config.js +0 -14
  257. package/dist/wirings/role/define-system-role.d.ts +32 -0
  258. package/dist/wirings/role/define-system-role.js +31 -0
  259. package/dist/wirings/role/index.d.ts +3 -0
  260. package/dist/wirings/role/index.js +2 -0
  261. package/dist/wirings/role/role.types.d.ts +43 -0
  262. package/dist/wirings/role/role.types.js +1 -0
  263. package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
  264. package/dist/wirings/role/validate-role-definitions.js +71 -0
  265. package/dist/wirings/rpc/addon-runner.d.ts +0 -19
  266. package/dist/wirings/rpc/addon-runner.js +0 -51
  267. package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -12
  268. package/dist/wirings/rpc/remote-addon-auth.js +1 -9
  269. package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
  270. package/dist/wirings/rpc/rpc-runner.js +88 -105
  271. package/dist/wirings/rpc/rpc-types.d.ts +7 -6
  272. package/dist/wirings/rpc/wire-addon.d.ts +25 -0
  273. package/dist/wirings/rpc/wire-addon.js +62 -0
  274. package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
  275. package/dist/wirings/rpc/wire-remote-addon.js +0 -8
  276. package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
  277. package/dist/wirings/scheduler/log-schedulers.js +0 -4
  278. package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
  279. package/dist/wirings/scheduler/scheduler-runner.js +0 -1
  280. package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
  281. package/dist/wirings/scope/define-scope.d.ts +32 -0
  282. package/dist/wirings/scope/define-scope.js +31 -0
  283. package/dist/wirings/scope/index.d.ts +1 -1
  284. package/dist/wirings/scope/index.js +1 -1
  285. package/dist/wirings/scope/scope.types.d.ts +7 -9
  286. package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
  287. package/dist/wirings/scope/validate-scope-definitions.js +3 -21
  288. package/dist/wirings/secret/index.d.ts +1 -1
  289. package/dist/wirings/secret/index.js +1 -1
  290. package/dist/wirings/secret/secret.types.d.ts +19 -15
  291. package/dist/wirings/secret/secret.types.js +1 -1
  292. package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
  293. package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
  294. package/dist/wirings/trigger/trigger-runner.js +1 -24
  295. package/dist/wirings/trigger/trigger.types.d.ts +1 -82
  296. package/dist/wirings/trigger/trigger.types.js +0 -34
  297. package/dist/wirings/variable/index.d.ts +1 -1
  298. package/dist/wirings/variable/index.js +1 -1
  299. package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
  300. package/dist/wirings/variable/variable.types.d.ts +1 -13
  301. package/dist/wirings/variable/variable.types.js +1 -1
  302. package/dist/wirings/virtual-user/index.d.ts +27 -0
  303. package/dist/wirings/virtual-user/index.js +8 -0
  304. package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
  305. package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
  306. package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
  307. package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
  308. package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
  309. package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
  310. package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
  311. package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
  312. package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
  313. package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
  314. package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
  315. package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
  316. package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
  317. package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
  318. package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
  319. package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
  320. package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
  321. package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
  322. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +5 -5
  323. package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
  324. package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
  325. package/dist/wirings/workflow/feature.d.ts +0 -19
  326. package/dist/wirings/workflow/feature.js +0 -19
  327. package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
  328. package/dist/wirings/workflow/graph/graph-node.js +0 -34
  329. package/dist/wirings/workflow/graph/graph-runner.js +6 -41
  330. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
  331. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
  332. package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
  333. package/dist/wirings/workflow/index.d.ts +5 -7
  334. package/dist/wirings/workflow/index.js +3 -17
  335. package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
  336. package/dist/wirings/workflow/pikku-scenario-service.js +204 -42
  337. package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
  338. package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
  339. package/dist/wirings/workflow/run-timeline.d.ts +0 -47
  340. package/dist/wirings/workflow/run-timeline.js +0 -22
  341. package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
  342. package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
  343. package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
  344. package/dist/wirings/workflow/scenario-poll.js +0 -12
  345. package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
  346. package/dist/wirings/workflow/scenario-prose.js +0 -18
  347. package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
  348. package/dist/wirings/workflow/scenario-step-guards.js +1 -14
  349. package/dist/wirings/workflow/scenario-step.types.d.ts +72 -6
  350. package/dist/wirings/workflow/scenario-step.types.js +5 -1
  351. package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
  352. package/dist/wirings/workflow/scenario-surface.js +56 -0
  353. package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
  354. package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
  355. package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
  356. package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
  357. package/dist/wirings/workflow/workflow.types.d.ts +0 -197
  358. package/knowledge/decisions/index.md +19 -0
  359. package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
  360. package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
  361. package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
  362. package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
  363. package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
  364. package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
  365. package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
  366. package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
  367. package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
  368. package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
  369. package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
  370. package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
  371. package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
  372. package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
  373. package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
  374. package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
  375. package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
  376. package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
  377. package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
  378. package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
  379. package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
  380. package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
  381. package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
  382. package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
  383. package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
  384. package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
  385. package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
  386. package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
  387. package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +34 -0
  388. package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
  389. package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
  390. package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
  391. package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
  392. package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
  393. package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
  394. package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
  395. package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
  396. package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
  397. package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
  398. package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
  399. package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
  400. package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
  401. package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
  402. package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
  403. package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
  404. package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
  405. package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
  406. package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
  407. package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
  408. package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
  409. package/knowledge/decisions/internals/index.md +113 -0
  410. package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
  411. package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
  412. package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
  413. package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
  414. package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
  415. package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
  416. package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
  417. package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
  418. package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
  419. package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
  420. package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
  421. package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
  422. package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
  423. package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
  424. package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
  425. package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
  426. package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
  427. package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
  428. package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
  429. package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
  430. package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
  431. package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
  432. package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
  433. package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
  434. package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
  435. package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
  436. package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
  437. package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
  438. package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
  439. package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
  440. package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
  441. package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
  442. package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
  443. package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
  444. package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
  445. package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
  446. package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
  447. package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
  448. package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
  449. package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
  450. package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
  451. package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
  452. package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
  453. package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
  454. package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
  455. package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
  456. package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
  457. package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
  458. package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
  459. package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
  460. package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
  461. package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
  462. package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
  463. package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
  464. package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
  465. package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
  466. package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
  467. package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
  468. package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
  469. package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
  470. package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
  471. package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
  472. package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
  473. package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
  474. package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
  475. package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
  476. package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
  477. package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
  478. package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
  479. package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
  480. package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
  481. package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
  482. package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
  483. package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
  484. package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
  485. package/knowledge/decisions/security/index.md +55 -0
  486. package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
  487. package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
  488. package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
  489. package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
  490. package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
  491. package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
  492. package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
  493. package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
  494. package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
  495. package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
  496. package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
  497. package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
  498. package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
  499. package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
  500. package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
  501. package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
  502. package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
  503. package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
  504. package/knowledge/index.md +24 -0
  505. package/knowledge/questions/index.md +15 -0
  506. package/package.json +4 -2
  507. package/run-tests.sh +0 -0
  508. package/src/crypto-utils.test.ts +460 -19
  509. package/src/crypto-utils.ts +283 -55
  510. package/src/data-classification.ts +1 -7
  511. package/src/dev/hot-reload.test.ts +0 -4
  512. package/src/dev/hot-reload.ts +11 -30
  513. package/src/dev/module-runner.ts +7 -32
  514. package/src/dev/reload-meta.ts +9 -29
  515. package/src/errors/error-handler.ts +20 -35
  516. package/src/errors/error.test.ts +30 -1
  517. package/src/errors/errors.ts +73 -157
  518. package/src/function/abort-scope.test.ts +97 -0
  519. package/src/function/abort-scope.ts +80 -0
  520. package/src/function/function-runner.test.ts +75 -7
  521. package/src/function/function-runner.ts +73 -30
  522. package/src/function/functions.types.ts +56 -136
  523. package/src/function/list.types.test.ts +3 -25
  524. package/src/function/list.types.ts +12 -62
  525. package/src/gopass-secrets-removed.test.ts +51 -0
  526. package/src/handle-error.test.ts +108 -1
  527. package/src/handle-error.ts +8 -18
  528. package/src/index.ts +60 -1
  529. package/src/middleware/auth-apikey.test.ts +0 -1
  530. package/src/middleware/auth-apikey.ts +0 -17
  531. package/src/middleware/auth-bearer.test.ts +0 -3
  532. package/src/middleware/auth-bearer.ts +3 -40
  533. package/src/middleware/auth-cookie.test.ts +0 -6
  534. package/src/middleware/auth-cookie.ts +2 -26
  535. package/src/middleware/cors.test.ts +34 -0
  536. package/src/middleware/cors.ts +12 -33
  537. package/src/middleware/remote-auth.test.ts +24 -9
  538. package/src/middleware/remote-auth.ts +10 -2
  539. package/src/middleware/telemetry.ts +2 -31
  540. package/src/middleware-runner.test.ts +0 -2
  541. package/src/middleware-runner.ts +5 -74
  542. package/src/permissions.test.ts +30 -0
  543. package/src/permissions.ts +24 -74
  544. package/src/pikku-request.ts +0 -6
  545. package/src/pikku-state.ts +2 -30
  546. package/src/production-barrels-stay-lean.test.ts +110 -0
  547. package/src/remote.test.ts +172 -0
  548. package/src/remote.ts +17 -7
  549. package/src/schema.test.ts +103 -0
  550. package/src/schema.ts +35 -18
  551. package/src/scopes.ts +7 -48
  552. package/src/services/ai-agent-runner-service.ts +20 -0
  553. package/src/services/ai-embedding-service.ts +3 -25
  554. package/src/services/audit-service.ts +1 -2
  555. package/src/services/content-service.ts +1 -46
  556. package/src/services/credential-service.ts +3 -40
  557. package/src/services/credential-wire-service.test.ts +0 -2
  558. package/src/services/deployment-service.ts +3 -9
  559. package/src/services/gateway-service.ts +0 -15
  560. package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
  561. package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
  562. package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
  563. package/src/services/in-memory-queue-service.ts +1 -15
  564. package/src/services/in-memory-trigger-service.ts +1 -18
  565. package/src/services/in-memory-workflow-service.test.ts +0 -13
  566. package/src/services/in-memory-workflow-service.ts +4 -38
  567. package/src/services/index.ts +20 -15
  568. package/src/services/istanbul-coverage-service.ts +2 -8
  569. package/src/services/jwt-service.ts +1 -16
  570. package/src/services/local-content.test.ts +159 -27
  571. package/src/services/local-content.ts +55 -23
  572. package/src/services/local-gateway-service.ts +2 -17
  573. package/src/services/local-secrets.ts +0 -4
  574. package/src/services/logger-console.test.ts +0 -1
  575. package/src/services/logger-console.ts +3 -7
  576. package/src/services/logger.ts +2 -37
  577. package/src/services/meta-service.test.ts +1 -5
  578. package/src/services/meta-service.ts +41 -61
  579. package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
  580. package/src/services/pikku-user-id.ts +0 -4
  581. package/src/services/queue-webhook-service.ts +9 -41
  582. package/src/services/scheduler-service.ts +1 -50
  583. package/src/services/schema-service.ts +1 -24
  584. package/src/services/scope-service.ts +50 -34
  585. package/src/services/scoped-secret-service.ts +0 -4
  586. package/src/services/secret-host-binding.test.ts +138 -0
  587. package/src/services/secret-host-binding.ts +51 -0
  588. package/src/services/secret-service.ts +5 -33
  589. package/src/services/secretless.test.ts +54 -0
  590. package/src/services/secretless.ts +29 -0
  591. package/src/services/stub-tracker.ts +8 -18
  592. package/src/services/system-role-guard.test.ts +93 -0
  593. package/src/services/system-role-guard.ts +71 -0
  594. package/src/services/trigger-service.ts +0 -12
  595. package/src/services/typed-secret-service.ts +1 -7
  596. package/src/services/v8-coverage-service.ts +3 -6
  597. package/src/services/variables-service.ts +1 -8
  598. package/src/services/webhook-service.ts +19 -63
  599. package/src/services/workflow-service.ts +3 -20
  600. package/src/testing/service-tests.ts +0 -26
  601. package/src/time-utils.ts +1 -19
  602. package/src/types/core.types.ts +116 -229
  603. package/src/types/state.types.ts +7 -9
  604. package/src/utils/hmac.ts +4 -10
  605. package/src/utils/safe-fetch.ts +13 -54
  606. package/src/utils.test.ts +11 -2
  607. package/src/utils.ts +6 -15
  608. package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
  609. package/src/wirings/actor-flow/index.ts +0 -9
  610. package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
  611. package/src/wirings/actor-flow/run-conversation.ts +19 -12
  612. package/src/wirings/ai-agent/ai-agent-agui.test.ts +75 -10
  613. package/src/wirings/ai-agent/ai-agent-agui.ts +36 -17
  614. package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
  615. package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
  616. package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
  617. package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
  618. package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
  619. package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
  620. package/src/wirings/ai-agent/ai-agent-prepare.ts +82 -138
  621. package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
  622. package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
  623. package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
  624. package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
  625. package/src/wirings/ai-agent/ai-agent-runner.ts +67 -33
  626. package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
  627. package/src/wirings/ai-agent/ai-agent-stream.ts +192 -75
  628. package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
  629. package/src/wirings/ai-agent/ai-agent.types.ts +85 -4
  630. package/src/wirings/ai-agent/index.ts +35 -3
  631. package/src/wirings/ai-agent/voice-input.test.ts +72 -7
  632. package/src/wirings/ai-agent/voice-input.ts +48 -3
  633. package/src/wirings/ai-agent/voice-output.test.ts +422 -0
  634. package/src/wirings/ai-agent/voice-output.ts +216 -56
  635. package/src/wirings/channel/channel-common.ts +15 -20
  636. package/src/wirings/channel/channel-handler.test.ts +50 -0
  637. package/src/wirings/channel/channel-handler.ts +32 -11
  638. package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
  639. package/src/wirings/channel/channel-host-rpc.ts +69 -0
  640. package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
  641. package/src/wirings/channel/channel-middleware-runner.ts +0 -12
  642. package/src/wirings/channel/channel-rpc-registry.ts +116 -0
  643. package/src/wirings/channel/channel-rpc-responder.ts +117 -0
  644. package/src/wirings/channel/channel-rpc-service.ts +146 -0
  645. package/src/wirings/channel/channel-rpc-validators.ts +65 -0
  646. package/src/wirings/channel/channel-rpc.test.ts +820 -0
  647. package/src/wirings/channel/channel-rpc.ts +5 -0
  648. package/src/wirings/channel/channel-rpc.types.ts +150 -0
  649. package/src/wirings/channel/channel-runner.ts +0 -14
  650. package/src/wirings/channel/channel-store.ts +0 -10
  651. package/src/wirings/channel/channel.types.ts +19 -8
  652. package/src/wirings/channel/define-channel-routes.ts +0 -20
  653. package/src/wirings/channel/eventhub-service.ts +0 -18
  654. package/src/wirings/channel/index.ts +35 -0
  655. package/src/wirings/channel/local/local-channel-handler.ts +3 -1
  656. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
  657. package/src/wirings/channel/local/local-channel-runner.ts +3 -1
  658. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
  659. package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
  660. package/src/wirings/channel/log-channels.ts +0 -4
  661. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
  662. package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
  663. package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
  664. package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
  665. package/src/wirings/cli/channel/cli-approval.ts +135 -0
  666. package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
  667. package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
  668. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
  669. package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
  670. package/src/wirings/cli/channel/cli-raw-client-runner.ts +155 -0
  671. package/src/wirings/cli/channel/index.ts +9 -0
  672. package/src/wirings/cli/cli-runner.test.ts +0 -1
  673. package/src/wirings/cli/cli-runner.ts +46 -88
  674. package/src/wirings/cli/cli.types.ts +14 -3
  675. package/src/wirings/cli/command-parser.test.ts +0 -4
  676. package/src/wirings/cli/command-parser.ts +11 -91
  677. package/src/wirings/cli/define-cli-commands.ts +1 -17
  678. package/src/wirings/credential/credential.types.ts +0 -12
  679. package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
  680. package/src/wirings/credential/index.ts +1 -1
  681. package/src/wirings/credential/validate-credential-definitions.ts +2 -4
  682. package/src/wirings/gateway/gateway-runner.test.ts +1 -21
  683. package/src/wirings/gateway/gateway-runner.ts +8 -110
  684. package/src/wirings/gateway/gateway.types.ts +7 -80
  685. package/src/wirings/http/http-routes.test.ts +0 -3
  686. package/src/wirings/http/http-routes.ts +0 -86
  687. package/src/wirings/http/http-runner.test.ts +0 -1
  688. package/src/wirings/http/http-runner.ts +12 -168
  689. package/src/wirings/http/http.types.ts +17 -62
  690. package/src/wirings/http/index.ts +5 -1
  691. package/src/wirings/http/log-http-routes.ts +0 -4
  692. package/src/wirings/http/pikku-fetch-http-request.test.ts +88 -7
  693. package/src/wirings/http/pikku-fetch-http-request.ts +74 -50
  694. package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
  695. package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
  696. package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
  697. package/src/wirings/http/routers/path-to-regex.ts +2 -13
  698. package/src/wirings/http/web-request.test.ts +33 -2
  699. package/src/wirings/http/web-request.ts +30 -17
  700. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
  701. package/src/wirings/mcp/mcp-runner.test.ts +40 -0
  702. package/src/wirings/mcp/mcp-runner.ts +9 -15
  703. package/src/wirings/mcp/mcp.types.ts +7 -42
  704. package/src/wirings/oauth2/oauth2.types.ts +0 -30
  705. package/src/wirings/persona/define-personas.ts +29 -0
  706. package/src/wirings/persona/index.ts +62 -0
  707. package/src/wirings/persona/persona-email.ts +87 -0
  708. package/src/wirings/persona/persona-environments.test.ts +183 -0
  709. package/src/wirings/persona/persona-environments.ts +138 -0
  710. package/src/wirings/persona/persona-mailbox.ts +156 -0
  711. package/src/wirings/persona/persona.test.ts +220 -0
  712. package/src/wirings/persona/persona.types.ts +131 -0
  713. package/src/wirings/persona/validate-personas.ts +133 -0
  714. package/src/wirings/queue/index.ts +13 -3
  715. package/src/wirings/queue/queue-identity.test.ts +453 -0
  716. package/src/wirings/queue/queue-identity.ts +173 -0
  717. package/src/wirings/queue/queue-runner.ts +12 -31
  718. package/src/wirings/queue/queue.types.ts +19 -89
  719. package/src/wirings/queue/register-queue-helper.ts +0 -14
  720. package/src/wirings/queue/signed-queue-service.ts +59 -0
  721. package/src/wirings/queue/validate-worker-config.ts +2 -28
  722. package/src/wirings/role/define-system-role.ts +33 -0
  723. package/src/wirings/role/index.ts +13 -0
  724. package/src/wirings/role/role.test.ts +104 -0
  725. package/src/wirings/role/role.types.ts +47 -0
  726. package/src/wirings/role/validate-role-definitions.ts +93 -0
  727. package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
  728. package/src/wirings/rpc/addon-runner.ts +0 -56
  729. package/src/wirings/rpc/addon-scopes.test.ts +225 -0
  730. package/src/wirings/rpc/remote-addon-auth.ts +1 -13
  731. package/src/wirings/rpc/rpc-runner.test.ts +186 -2
  732. package/src/wirings/rpc/rpc-runner.ts +145 -127
  733. package/src/wirings/rpc/rpc-types.ts +11 -6
  734. package/src/wirings/rpc/wire-addon.test.ts +43 -1
  735. package/src/wirings/rpc/wire-addon.ts +99 -0
  736. package/src/wirings/rpc/wire-remote-addon.ts +9 -29
  737. package/src/wirings/scheduler/log-schedulers.ts +0 -4
  738. package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
  739. package/src/wirings/scheduler/scheduler-runner.ts +0 -2
  740. package/src/wirings/scheduler/scheduler.types.ts +1 -14
  741. package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
  742. package/src/wirings/scope/index.ts +1 -1
  743. package/src/wirings/scope/scope.test.ts +1 -2
  744. package/src/wirings/scope/scope.types.ts +7 -9
  745. package/src/wirings/scope/validate-scope-definitions.ts +3 -21
  746. package/src/wirings/secret/index.ts +1 -1
  747. package/src/wirings/secret/secret.types.ts +19 -15
  748. package/src/wirings/secret/validate-secret-definitions.ts +2 -4
  749. package/src/wirings/trigger/trigger-runner.ts +1 -27
  750. package/src/wirings/trigger/trigger.types.ts +1 -82
  751. package/src/wirings/variable/index.ts +1 -1
  752. package/src/wirings/variable/validate-variable-definitions.ts +2 -4
  753. package/src/wirings/variable/variable.types.ts +1 -13
  754. package/src/wirings/virtual-user/index.ts +76 -0
  755. package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
  756. package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
  757. package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
  758. package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
  759. package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
  760. package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
  761. package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
  762. package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
  763. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
  764. package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
  765. package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
  766. package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
  767. package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
  768. package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
  769. package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
  770. package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
  771. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +5 -4
  772. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
  773. package/src/wirings/workflow/feature.ts +0 -19
  774. package/src/wirings/workflow/graph/graph-node.ts +0 -136
  775. package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
  776. package/src/wirings/workflow/graph/graph-runner.ts +6 -41
  777. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
  778. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
  779. package/src/wirings/workflow/index.ts +10 -44
  780. package/src/wirings/workflow/pikku-scenario-service.ts +235 -52
  781. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
  782. package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
  783. package/src/wirings/workflow/run-timeline.test.ts +7 -19
  784. package/src/wirings/workflow/run-timeline.ts +0 -56
  785. package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
  786. package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
  787. package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
  788. package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
  789. package/src/wirings/workflow/scenario-poll.test.ts +0 -2
  790. package/src/wirings/workflow/scenario-poll.ts +0 -15
  791. package/src/wirings/workflow/scenario-prose.ts +0 -28
  792. package/src/wirings/workflow/scenario-service.test.ts +2 -9
  793. package/src/wirings/workflow/scenario-step-guards.ts +1 -14
  794. package/src/wirings/workflow/scenario-step.test.ts +159 -14
  795. package/src/wirings/workflow/scenario-step.types.ts +82 -6
  796. package/src/wirings/workflow/scenario-surface.test.ts +145 -0
  797. package/src/wirings/workflow/scenario-surface.ts +71 -0
  798. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
  799. package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
  800. package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
  801. package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
  802. package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
  803. package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
  804. package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
  805. package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
  806. package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
  807. package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
  808. package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
  809. package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
  810. package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
  811. package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
  812. package/src/wirings/workflow/workflow.types.ts +0 -203
  813. package/tsconfig.tsbuildinfo +1 -1
  814. package/src/middleware/timeout.ts +0 -22
  815. package/src/pikku-response.ts +0 -5
  816. package/src/services/gopass-secrets.ts +0 -78
  817. package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
  818. package/src/wirings/workflow/dsl/index.ts +0 -36
  819. package/src/wirings/workflow/graph/index.ts +0 -15
@@ -1,17 +1,9 @@
1
- /**
2
- * Queue worker functions for workflow orchestration.
3
- *
4
- * These are registered as queue consumers by the codegen pipeline
5
- * (injected into queue meta when workflows exist). They provide
6
- * the runtime implementations that process queued workflow jobs.
7
- */
8
1
  import type { PikkuRPC } from '../rpc/rpc-types.js';
9
2
  export interface WorkflowStepInput {
10
3
  runId: string;
11
4
  stepName: string;
12
5
  rpcName: string;
13
6
  data: unknown;
14
- /** Predecessor step name (the walked transition); undefined for entry steps. */
15
7
  fromStepName?: string;
16
8
  }
17
9
  export interface PikkuWorkflowOrchestratorInput {
@@ -21,22 +13,10 @@ export interface PikkuWorkflowSleeperInput {
21
13
  runId: string;
22
14
  stepId: string;
23
15
  }
24
- /**
25
- * Step worker — executes individual workflow steps dispatched via queue.
26
- * The orchestrator queues steps here when they're async (not inline).
27
- */
28
16
  export declare function pikkuWorkflowWorkerFunc(_services: Record<string, unknown>, { runId, stepName, rpcName, data }: WorkflowStepInput, { rpc }: {
29
17
  rpc: PikkuRPC;
30
18
  }): Promise<void>;
31
- /**
32
- * Orchestrator — resumes workflow execution after an async step completes.
33
- * Called when a step worker finishes and the workflow needs to continue.
34
- */
35
19
  export declare function pikkuWorkflowOrchestratorFunc(_services: Record<string, unknown>, { runId }: PikkuWorkflowOrchestratorInput, { rpc }: {
36
20
  rpc: PikkuRPC;
37
21
  }): Promise<void>;
38
- /**
39
- * Sleeper — wakes a workflow after a workflow.sleep() duration expires.
40
- * Triggered by a delayed queue message or scheduler callback.
41
- */
42
22
  export declare function pikkuWorkflowSleeperFunc(_services: Record<string, unknown>, { runId, stepId }: PikkuWorkflowSleeperInput): Promise<void>;
@@ -1,15 +1,4 @@
1
- /**
2
- * Queue worker functions for workflow orchestration.
3
- *
4
- * These are registered as queue consumers by the codegen pipeline
5
- * (injected into queue meta when workflows exist). They provide
6
- * the runtime implementations that process queued workflow jobs.
7
- */
8
1
  import { getSingletonServices } from '../../pikku-state.js';
9
- /**
10
- * Step worker — executes individual workflow steps dispatched via queue.
11
- * The orchestrator queues steps here when they're async (not inline).
12
- */
13
2
  export async function pikkuWorkflowWorkerFunc(_services, { runId, stepName, rpcName, data }, { rpc }) {
14
3
  const services = getSingletonServices();
15
4
  if (!services?.workflowService) {
@@ -17,10 +6,6 @@ export async function pikkuWorkflowWorkerFunc(_services, { runId, stepName, rpcN
17
6
  }
18
7
  await services.workflowService.executeWorkflowStep(runId, stepName, rpcName, data, rpc);
19
8
  }
20
- /**
21
- * Orchestrator — resumes workflow execution after an async step completes.
22
- * Called when a step worker finishes and the workflow needs to continue.
23
- */
24
9
  export async function pikkuWorkflowOrchestratorFunc(_services, { runId }, { rpc }) {
25
10
  const services = getSingletonServices();
26
11
  if (!services?.workflowService) {
@@ -28,10 +13,6 @@ export async function pikkuWorkflowOrchestratorFunc(_services, { runId }, { rpc
28
13
  }
29
14
  await services.workflowService.orchestrateWorkflow(runId, rpc);
30
15
  }
31
- /**
32
- * Sleeper — wakes a workflow after a workflow.sleep() duration expires.
33
- * Triggered by a delayed queue message or scheduler callback.
34
- */
35
16
  export async function pikkuWorkflowSleeperFunc(_services, { runId, stepId }) {
36
17
  const services = getSingletonServices();
37
18
  if (!services?.workflowService) {
@@ -10,7 +10,6 @@ export interface WorkflowRunWire {
10
10
  id?: string;
11
11
  parentRunId?: string;
12
12
  parentStepId?: string;
13
- /** Pikku user ID propagated from the originating request for credential resolution */
14
13
  pikkuUserId?: string;
15
14
  }
16
15
  export interface WorkflowServiceConfig {
@@ -20,126 +19,48 @@ export interface WorkflowServiceConfig {
20
19
  stepWorkerQueueName: string;
21
20
  sleeperRPCName: string;
22
21
  }
23
- /**
24
- * How a workflow service spreads its jobs across queues.
25
- *
26
- * Passed to the service constructor rather than read from `config.workflow`:
27
- * the queues are wired during construction, before singleton services (and so
28
- * before `config`) exist.
29
- */
30
22
  export interface WorkflowQueueOptions {
31
- /**
32
- * - `'per-workflow'` (default) — each workflow gets its own
33
- * `wf-orchestrator-*` / `wf-step-*` queue. Complete isolation, and it's
34
- * what lets serverless providers deploy one unit per workflow. Costs one
35
- * set of pollers per queue, which adds up on pull-based backends.
36
- * - `'shared-groups'` — every workflow shares the orchestrator/step-worker
37
- * queues and stays isolated via {@link queueGroupConcurrency}, so no
38
- * workflow can occupy more than its share. One set of pollers total.
39
- * Only for single-process (monolith) runtimes; a per-unit serverless
40
- * deploy needs the per-workflow queues to route to its units.
41
- */
42
23
  queueStrategy?: 'per-workflow' | 'shared-groups';
43
- /**
44
- * Total concurrent workflow jobs per node under `'shared-groups'`.
45
- * Defaults to 20.
46
- */
47
24
  queueConcurrency?: number;
48
- /**
49
- * How many jobs of one workflow may run at once under `'shared-groups'`.
50
- * Defaults to 2. Tiers are keyed by workflow name, so a specific workflow
51
- * can be given its own limit without any extra wiring.
52
- *
53
- * Note tiers can only lower a workflow's limit, not raise it above
54
- * `default`: the backend's pre-fetch exclusion is applied per group using
55
- * `default` alone. To give one workflow more room, raise `default` and
56
- * restrict the others by tier.
57
- */
58
25
  queueGroupConcurrency?: number | GroupConcurrencyConfig;
59
26
  }
60
27
  export interface WorkflowPlannedStep {
61
- /** Durable step key — matches the runtime step name stored in the DB */
62
28
  stepName: string;
63
- /** Optional human-readable label for the UI timeline (falls back to stepName) */
64
29
  displayName?: string;
65
30
  }
66
- /**
67
- * Workflow run status
68
- */
69
31
  export type WorkflowStatus = 'running' | 'suspended' | 'completed' | 'failed' | 'cancelled';
70
- /**
71
- * Workflow version status (for AI-generated workflows)
72
- */
73
32
  export type WorkflowVersionStatus = 'draft' | 'active' | 'declined';
74
- /**
75
- * Workflow step status
76
- */
77
33
  export type StepStatus = 'pending' | 'running' | 'scheduled' | 'succeeded' | 'failed' | 'suspended';
78
- /**
79
- * Workflow run representation
80
- */
81
34
  export interface WorkflowRun {
82
- /** Unique run ID */
83
35
  id: string;
84
- /** Workflow name */
85
36
  workflow: string;
86
- /** Current status */
87
37
  status: WorkflowStatus;
88
- /** Input data */
89
38
  input: any;
90
- /** Output data (if completed) */
91
39
  output?: any;
92
- /** Error (if failed) */
93
40
  error?: SerializedError;
94
- /** If true, workflow executes inline without queues */
95
41
  inline?: boolean;
96
- /** Graph hash of the workflow definition at run creation time */
97
42
  graphHash?: string;
98
- /** True when the workflow has a static, pre-computable step timeline */
99
43
  deterministic?: boolean;
100
- /** Static planned steps snapshot captured at run start */
101
44
  plannedSteps?: WorkflowPlannedStep[];
102
- /** Wire origin info (how this run was started) */
103
45
  wire: WorkflowRunWire;
104
- /** Creation timestamp */
105
46
  createdAt: Date;
106
- /** Last update timestamp */
107
47
  updatedAt: Date;
108
48
  }
109
- /**
110
- * Step state representation
111
- */
112
49
  export interface StepState {
113
- /** Unique step ID */
114
50
  stepId: string;
115
- /** Step status */
116
51
  status: StepStatus;
117
- /** Step result (if done) */
118
52
  result?: any;
119
- /** Step error (if error) */
120
53
  error?: SerializedError;
121
- /** Number of attempts made (starts at 1) */
122
54
  attemptCount: number;
123
- /** Maximum retry attempts allowed */
124
55
  retries?: number;
125
- /** Delay between retries */
126
56
  retryDelay?: string | number;
127
- /** Step name of the predecessor that scheduled this step (the transition/edge
128
- * walked to reach it); undefined for entry steps. Reconstructs the path. */
129
57
  fromStepName?: string;
130
- /** Creation timestamp */
131
58
  createdAt: Date;
132
- /** Last update timestamp */
133
59
  updatedAt: Date;
134
- /** Child workflow run ID (if this step spawned a sub-workflow) */
135
60
  childRunId?: string;
136
- /** Timestamp when step started running */
137
61
  runningAt?: Date;
138
- /** Timestamp when step was scheduled */
139
62
  scheduledAt?: Date;
140
- /** Timestamp when step succeeded */
141
63
  succeededAt?: Date;
142
- /** Timestamp when step failed */
143
64
  failedAt?: Date;
144
65
  }
145
66
  export interface WorkflowRunStatus {
@@ -153,7 +74,6 @@ export interface WorkflowRunStatus {
153
74
  name: string;
154
75
  status: StepStatus;
155
76
  duration?: number;
156
- /** Number of attempts for this step (1 = first try; > 1 means it retried). */
157
77
  attempts?: number;
158
78
  }>;
159
79
  output?: unknown;
@@ -184,16 +104,6 @@ export interface WorkflowRunService {
184
104
  } | null>;
185
105
  deleteRun(id: string): Promise<boolean>;
186
106
  }
187
- /**
188
- * Write-only companion to `WorkflowRunService`. An executor (a
189
- * `PikkuWorkflowService` subclass) can be given a mirror; every write
190
- * the executor makes to its own canonical store is then forwarded here,
191
- * so an external read store (e.g. a DB queried by the console UI) stays
192
- * in sync with DO/Redis/etc-driven runs.
193
- *
194
- * Mirror failures are logged but never fail the workflow — the mirror is
195
- * an index, not the source of truth.
196
- */
197
107
  export interface WorkflowRunMirror {
198
108
  createRun(runId: string, workflowName: string, input: any, inline: boolean, graphHash: string, wire: WorkflowRunWire, options?: {
199
109
  deterministic?: boolean;
@@ -218,187 +128,80 @@ export interface WorkflowRunMirror {
218
128
  upsertWorkflowVersion(name: string, graphHash: string, graph: any, source: string, status?: WorkflowVersionStatus): Promise<void>;
219
129
  updateWorkflowVersionStatus(name: string, graphHash: string, status: WorkflowVersionStatus): Promise<void>;
220
130
  }
221
- /**
222
- * Core workflow definition
223
- */
224
131
  export type CoreWorkflow<PikkuFunctionConfig extends CorePikkuFunctionConfig<any, any, any> = CorePikkuFunctionConfig<any, any, any>> = {
225
- /** Unique workflow name */
226
132
  name: string;
227
- /** The workflow function */
228
133
  func: PikkuFunctionConfig;
229
- /** Middleware chain for this workflow */
230
134
  middleware?: PikkuFunctionConfig['middleware'];
231
- /** Tags for organization and filtering */
232
135
  tags?: string[];
233
136
  };
234
- /**
235
- * A scenario as a feature references it: either the scenario itself, or the
236
- * scenario paired with the input to run it with. The paired form is gherkin's
237
- * `Examples:` — the same scenario run once per row, written as an ordinary
238
- * loop rather than a table.
239
- */
240
137
  export type CoreFeatureScenario = CorePikkuFunctionConfig<any, any, any> | {
241
138
  scenario: CorePikkuFunctionConfig<any, any, any>;
242
139
  data: unknown;
243
140
  };
244
- /**
245
- * A feature: an ordered group of scenarios, mirroring gherkin's Feature ↔
246
- * Scenario structure. Scenarios are referenced by imported identifier, so a
247
- * renamed or deleted scenario is a compile error rather than a silent skip.
248
- *
249
- * Hooks run **once around the whole group** (`before → a → b → c → after`),
250
- * not per scenario — per-scenario setup is the scenario's own `before`. That
251
- * is the one thing a feature deliberately cannot express: gherkin's
252
- * `Background:` runs per scenario.
253
- */
254
141
  export type CoreFeature = {
255
- /** Human-readable name. The export identifier is the id. */
256
142
  name: string;
257
143
  description?: string;
258
144
  tags?: string[];
259
- /** Readonly because `pikkuFeature`'s `const` generic infers a readonly tuple. */
260
145
  scenarios: readonly CoreFeatureScenario[];
261
146
  before?: CorePikkuFunctionHook;
262
147
  after?: CorePikkuFunctionHook;
263
148
  };
264
- /** One entry of a feature's scenario list, as extracted from the source. */
265
149
  export type FeatureMetaEntry = {
266
- /** The scenario's declared export name — its key in `WorkflowsMeta`. */
267
150
  scenario: string;
268
- /** The input this entry runs the scenario with — gherkin's `Examples:`. */
269
151
  data?: unknown;
270
152
  };
271
- /**
272
- * A feature as the console reads it: the document structure around a group of
273
- * scenarios. Generated to `scenarios/features.gen.json` and read off disk, so
274
- * nothing app-facing has to import the scenario bootstrap to describe one.
275
- */
276
153
  export type FeatureMeta = {
277
- /** The export identifier. */
278
154
  id: string;
279
155
  name: string;
280
156
  description?: string;
281
157
  tags: string[];
282
- /** In declared order — a feature's reading order is its declaration order. */
283
158
  entries: FeatureMetaEntry[];
284
- /**
285
- * Entries that could not be read statically (a spread, a `.map()`). Their
286
- * membership is only known once the scenario bootstrap has been evaluated,
287
- * so a non-zero count means this listing is partial.
288
- */
289
159
  unresolvedEntries: number;
290
- /** Hooks are runtime-only; only their presence is knowable from meta. */
291
160
  hasBefore: boolean;
292
161
  hasAfter: boolean;
293
162
  };
294
163
  export type FeaturesMeta = Record<string, FeatureMeta>;
295
- /** One planned scenario run, resolved from a feature's scenario list. */
296
164
  export type FeaturePlanEntry = {
297
165
  featureId: string;
298
166
  featureName: string;
299
167
  scenarioName: string;
300
- /** The input this entry runs the scenario with, if the feature supplied one. */
301
168
  data?: unknown;
302
- /** The scenario's own tags unioned with the containing feature's. */
303
169
  tags: string[];
304
170
  };
305
- /**
306
- * Workflow client interface
307
- */
308
171
  export interface PikkuWorkflow {
309
- /** Start a new workflow run */
310
172
  start: <I>(input: I) => Promise<{
311
173
  runId: string;
312
174
  }>;
313
- /** Get a workflow run by ID */
314
175
  getRun: (runId: string) => Promise<WorkflowRun>;
315
- /** Cancel a running workflow */
316
176
  cancelRun: (runId: string) => Promise<void>;
317
177
  }
318
- /**
319
- * Context variable definition (serialized from Zod schema or type inference)
320
- */
321
178
  export interface ContextVariable {
322
- /** Variable type */
323
179
  type: 'string' | 'number' | 'boolean' | 'object' | 'array';
324
- /** Default value */
325
180
  default?: unknown;
326
- /** Description for UI/docs */
327
181
  description?: string;
328
182
  }
329
- /**
330
- * Workflow context - state variables with defaults and types
331
- */
332
183
  export type WorkflowContext = Record<string, ContextVariable>;
333
- /**
334
- * Workflows metadata for inspector/CLI (DSL step-based format)
335
- */
336
184
  export type WorkflowsMeta = Record<string, CommonWireMeta & {
337
185
  name: string;
338
186
  steps: WorkflowStepMeta[];
339
187
  context?: WorkflowContext;
340
188
  dsl?: boolean;
341
189
  expose?: boolean;
342
- /** True for pikkuScenario workflows (complex + actor steps). */
343
190
  scenario?: boolean;
344
- /**
345
- * Why a scenario is held out of a default run. Stating the reason in code
346
- * keeps the quarantine next to the scenario it applies to, rather than in
347
- * a CI invocation nobody reads. Naming the scenario with `--flows` runs it
348
- * regardless.
349
- */
350
191
  skip?: string;
351
- /** Actor names a scenario declares (personas it runs steps as). */
352
192
  actors?: string[];
353
193
  }>;
354
- /**
355
- * Unified workflow runtime meta (used by runtime to execute workflows)
356
- * This is the format stored in pikkuState('workflows', 'meta')
357
- * Both DSL and graph-based workflows are converted to this format
358
- */
359
194
  export interface WorkflowRuntimeMeta {
360
- /** Workflow name (used as key in registrations) */
361
195
  name: string;
362
- /** Pikku function name (for execution) */
363
196
  pikkuFuncId: string;
364
- /** Source type: 'dsl' (serializable), 'complex' (has inline steps), 'graph', 'scenario' (complex + actor steps) */
365
197
  source: 'dsl' | 'complex' | 'graph' | 'scenario';
366
- /** Optional description */
367
198
  description?: string;
368
- /** Tags for organization */
369
199
  tags?: string[];
370
- /** Actor names a scenario declares (personas it runs steps as). */
371
200
  actors?: string[];
372
- /** Serialized nodes */
373
201
  nodes?: Record<string, any>;
374
- /** Entry node IDs for graph workflows (computed at build time) */
375
202
  entryNodeIds?: string[];
376
- /** Hash of graph topology (nodes, edges, input mappings) */
377
203
  graphHash?: string;
378
- /** True when the workflow has a static, pre-computable step timeline */
379
204
  deterministic?: boolean;
380
- /** Static planned steps metadata for deterministic workflows */
381
205
  plannedSteps?: WorkflowPlannedStep[];
382
206
  }
383
- /**
384
- * Unified workflow runtime metadata map
385
- */
386
207
  export type WorkflowsRuntimeMeta = Record<string, WorkflowRuntimeMeta>;
387
- /**
388
- * Worker input types for generated queue workers
389
- */
390
- export type WorkflowStepInput = {
391
- runId: string;
392
- stepName: string;
393
- rpcName: string;
394
- data: any;
395
- /** Predecessor step name (the walked transition); undefined for entry steps. */
396
- fromStepName?: string;
397
- };
398
- export type WorkflowOrchestratorInput = {
399
- runId: string;
400
- };
401
- export type WorkflowSleeperInput = {
402
- runId: string;
403
- stepId: string;
404
- };
@@ -0,0 +1,19 @@
1
+ ---
2
+ type: overview
3
+ title: Decisions
4
+ description: Rules chosen in @pikku/core, and what each one rules out
5
+ ---
6
+
7
+ # Decisions
8
+
9
+ A rule that was chosen, and what it rules out.
10
+
11
+ Each note here replaces a comment that was carrying reasoning inside the source.
12
+ If you are about to "clean up" something in core that looks pointless, search
13
+ here first — several of these exist because the obvious simplification was tried
14
+ and broke something.
15
+
16
+ <!-- pikku:knowledge-index -->
17
+ - [internals](internals/index.md) — a rule about how it works under the hood, and why
18
+ - [security](security/index.md) — a rule about who may do what
19
+ <!-- /pikku:knowledge-index -->
@@ -0,0 +1,49 @@
1
+ ---
2
+ type: decision
3
+ title: A secret that fails to decrypt fails the whole read
4
+ description: getSecrets throws naming the key and its key_version rather than omitting the row, because a silent omission surfaces as an unrelated failure much later
5
+ tags: crypto, storage
6
+ ---
7
+
8
+ # A secret that fails to decrypt fails the whole read
9
+
10
+ Every store's bulk read — `getSecrets` in the kysely, mongodb and redis secret
11
+ services — wraps the `getKEK` + `envelopeDecrypt` pair in a try/catch that
12
+ rethrows:
13
+
14
+ ```
15
+ Failed to decrypt secret "<key>" (key_version <n>): the configured KEK does not
16
+ match the key it was wrapped under
17
+ ```
18
+
19
+ with the original crypto error as `cause`. A key that has no row at all is still
20
+ simply absent from the returned object; only a row that exists and will not
21
+ decrypt is fatal.
22
+
23
+ Those two cases look similar and are not. A missing key is an ordinary, callable
24
+ state — the caller asked for something that was never stored, and the typed
25
+ secret layer above already decides what to do about an absent value. A stored
26
+ row that will not decrypt means the service is holding ciphertext it cannot
27
+ read: a `PIKKU_SECRET_KEK` that does not match what the value was wrapped under,
28
+ a `previousKey` missing for an older `keyVersion`, or a change to the derivation
29
+ itself. Nothing the caller can do downstream makes that better.
30
+
31
+ Dropping the row instead hands back a partial map, and the failure re-emerges
32
+ somewhere with no connection to secrets — an auth middleware reading an
33
+ undefined signing key and answering "server configuration error", a provider
34
+ client constructed with `undefined` credentials and 401-ing. The name of the
35
+ secret and the `key_version` it was wrapped under are precisely the two facts
36
+ that turn that into a one-line fix, and they are known at the catch site and
37
+ nowhere after it.
38
+
39
+ This matters most at exactly the moment it is least convenient: a change to
40
+ `deriveKEK` makes *every* previously stored secret undecryptable at once. Loud
41
+ failure names the first one; silence produces an empty map and a support ticket.
42
+
43
+ **What this rules out:** a `getSecrets` that skips unreadable rows; returning
44
+ `undefined` for a row that exists; collecting failures and returning them
45
+ alongside the successes, which just moves the ignoring one level up; and
46
+ treating a missing key as an error, which would break callers that legitimately
47
+ probe for optional secrets.
48
+
49
+ See [[the-kek-salt-is-scoped-to-the-key-version]].
@@ -0,0 +1,23 @@
1
+ ---
2
+ type: decision
3
+ title: An actor conversation starts from a seeded kickoff message
4
+ description: The actor's first turn needs a non-empty message list because providers reject an empty prompt; the seed is an instruction and stays out of the transcript
5
+ tags: actor-flow
6
+ ---
7
+
8
+ # An actor conversation starts from a seeded kickoff message
9
+
10
+ `runConversation` in
11
+ `packages/core/src/wirings/actor-flow/run-conversation.ts` primes
12
+ `actorMessages` with a single user message telling the persona to begin, before
13
+ the first turn is generated.
14
+
15
+ The actor speaks first, so at that point there is nothing for it to reply to —
16
+ and LLM providers reject a completion request with no messages. The seed is
17
+ addressed to the actor rather than to the target agent, which is why it is never
18
+ pushed onto `transcript`: it is scaffolding, not something the simulated user
19
+ said, and including it would corrupt the transcript the final evaluation reads.
20
+
21
+ **What this rules out:** starting from an empty `actorMessages` array, folding
22
+ the kickoff into the persona instructions where a provider may weight it
23
+ differently, and pushing the seed into the transcript for symmetry.
@@ -0,0 +1,24 @@
1
+ ---
2
+ type: decision
3
+ title: The actor-flow conversation engine only sees a transport-agnostic target driver
4
+ description: The engine never imports the agent runner; the target is injected as run/approve, so scenarios exercise the real wire path
5
+ tags: actor-flow
6
+ ---
7
+
8
+ # The actor-flow conversation engine only sees a transport-agnostic target driver
9
+
10
+ `runConversation` reaches the target agent exclusively through the injected
11
+ `TargetAgentDriver` — `run(message)` and `approve(runId, decisions)` — declared
12
+ in `packages/core/src/wirings/actor-flow/actor-flow.types.ts`. In production that
13
+ driver is HTTP-backed, issuing the actor's `agentRun` and `agentApprove` calls as
14
+ the signed-in actor.
15
+
16
+ Keeping the seam transport-agnostic is what makes the conversation a real test:
17
+ the agent is exercised through the same authenticated wire path a user takes,
18
+ including middleware, permissions and session handling, rather than through an
19
+ in-process call that skips all of it. It also lets the engine be unit-tested
20
+ against scripted targets with no server at all.
21
+
22
+ **What this rules out:** calling `runAIAgent` / `streamAIAgent` directly from the
23
+ conversation engine, and widening `TargetAgentDriver` with transport details
24
+ (headers, cookies, channels) that would tie the engine to HTTP.
@@ -0,0 +1,25 @@
1
+ ---
2
+ type: decision
3
+ title: An actor-flow verdict is the persona's self-evaluation, not an assertion
4
+ description: The engine returns what the actor judged plus the transcript; deterministic checks stay with the caller
5
+ tags: actor-flow
6
+ ---
7
+
8
+ # An actor-flow verdict is the persona's self-evaluation, not an assertion
9
+
10
+ `runConversation` ends by asking the persona LLM whether the `evaluate`
11
+ criterion was met and returns that as `ActorFlowVerdict` — `passed`, `reasoning`
12
+ and the full `transcript`
13
+ (`packages/core/src/wirings/actor-flow/`). Nothing in the engine inspects the
14
+ system the agent acted on.
15
+
16
+ The verdict is deliberately soft because the thing it judges is soft: whether a
17
+ conversation accomplished a natural-language task. Deterministic checks — that a
18
+ row was written, that an email went out — belong to the caller, which already
19
+ holds the actor and can `actor.invoke(...)` after the conversation returns. The
20
+ `reasoning` and `transcript` fields exist so a soft failure is debuggable rather
21
+ than merely red.
22
+
23
+ **What this rules out:** having `runConversation` assert or throw on a failed
24
+ verdict, and adding deterministic post-conditions to `ConverseOptions` instead of
25
+ running them at the call site.
@@ -0,0 +1,26 @@
1
+ ---
2
+ type: decision
3
+ title: Addon package roots resolve by walking node module search paths
4
+ description: LocalMetaService finds an addon's directory by scanning resolve.paths, not by require.resolve, because addon packages expose no main entry
5
+ tags: services
6
+ ---
7
+
8
+ # Addon package roots resolve by walking node module search paths
9
+
10
+ `LocalMetaService.resolvePackageRoot` (`packages/core/src/services/meta-service.ts`)
11
+ builds a `createRequire` anchored one level above `.pikku` — the app root — then
12
+ walks `require.resolve.paths(packageName)` and takes the first candidate
13
+ directory that contains a `package.json`. The result is memoised in
14
+ `packageRootCache`.
15
+
16
+ The obvious call, `require.resolve(packageName)`, throws for these packages:
17
+ Pikku addon packages ship a `.pikku` directory and subpath exports but no main
18
+ `exports` entry, so there is nothing for Node to resolve to. Walking the search
19
+ paths asks the same question Node would ask — where would this package be
20
+ found from the app root — without requiring the package to be importable.
21
+
22
+ **What this rules out:** replacing the loop with `require.resolve(pkg)`,
23
+ `import.meta.resolve`, or `createRequire(import.meta.url)`. The first two fail on
24
+ every addon; the third anchors resolution at `@pikku/core`'s own location rather
25
+ than the app's, so an addon installed only in the app's `node_modules` becomes
26
+ invisible.
@@ -0,0 +1,33 @@
1
+ ---
2
+ type: decision
3
+ title: Addon singleton services are cached per namespace, not per package
4
+ description: Each wireAddon instance gets its own services built from its own overrides, at the cost of one service graph per wired instance
5
+ tags: rpc
6
+ ---
7
+
8
+ # Addon singleton services are cached per namespace, not per package
9
+
10
+ `getOrCreatePackageSingletonServices` in
11
+ `packages/core/src/wirings/rpc/addon-runner.ts` keys its `pikkuState` cache on
12
+ `addonInstance?.namespace ?? packageName`. The namespace is the consumer-facing
13
+ name given to `wireAddon`/`wireRemoteAddon`, and it is what selects the
14
+ instance's `secretOverrides`, `variableOverrides` and `credentialOverrides`.
15
+
16
+ One package may be wired twice — the same payments addon against a live and a
17
+ sandbox account, say — with different secret and variable names. Caching by
18
+ package name would build the service graph once, from whichever instance called
19
+ first, and silently hand the other instance the wrong credentials. Because the
20
+ overrides have to be visible to the addon's *own* `createSingletonServices`, they
21
+ are applied by wrapping the parent `secrets` and `variables` services
22
+ (`aliasSecretService`, `aliasVariablesService`) so that every logical name the
23
+ addon reads is remapped to the real project name before resolution. A call with
24
+ no instance attached still falls back to per-package caching.
25
+
26
+ `addonInstanceForNamespace` rebuilds this descriptor for bare intra-addon calls
27
+ from the namespace currently executing on the wire, and returns `undefined`
28
+ unless that namespace maps to the package being resolved — so a bare call cannot
29
+ pick up another instance's overrides.
30
+
31
+ **What this rules out:** simplifying the cache key to `packageName`, resolving
32
+ overrides at the call site instead of aliasing the resolver services, and
33
+ assuming two `wireAddon` entries for one package share a service instance.
@@ -0,0 +1,28 @@
1
+ ---
2
+ type: decision
3
+ title: Bare workflow names from inside an addon are prefixed with the consumer's namespace
4
+ description: The addon's workflowService is proxied so an addon never has to hardcode the name its consumer chose
5
+ tags: rpc
6
+ ---
7
+
8
+ # Bare workflow names from inside an addon are prefixed with the consumer's namespace
9
+
10
+ `wrapWorkflowServiceForPackage` in
11
+ `packages/core/src/wirings/rpc/addon-runner.ts` proxies an addon package's
12
+ `workflowService`, intercepting `startWorkflow` and `runToCompletion`. A bare
13
+ name — one with no `:` — is rewritten to `${namespace}:${name}`, using the
14
+ instance namespace when known and otherwise the package's sole namespace via
15
+ `findAddonNamespaceForPackage`.
16
+
17
+ Workflows declared by an addon are registered under the addon's package scope,
18
+ but the namespace they answer to is chosen by the *consumer* in `wireAddon`.
19
+ Without the proxy, `runToCompletion('myWorkflow')` written inside the addon
20
+ resolves against root meta, misses, and throws `WorkflowNotFoundError` — leaving
21
+ the addon author no option but to hardcode the consumer-defined namespace, which
22
+ couples a reusable package to one particular caller. Explicit `'ns:name'` calls
23
+ and bare names that already resolve in root are untouched; only bare names that
24
+ would otherwise miss get prefixed.
25
+
26
+ **What this rules out:** dropping the proxy and requiring addons to namespace
27
+ their own workflow calls, and widening the rewrite to names that already contain
28
+ a `:` or already exist at root — either turns a working call into a lookup miss.