@pikku/core 0.12.72 → 0.12.77

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 (848) hide show
  1. package/CHANGELOG.md +1171 -0
  2. package/dist/column-form.d.ts +32 -0
  3. package/dist/column-form.js +42 -0
  4. package/dist/crypto-utils.d.ts +43 -7
  5. package/dist/crypto-utils.js +163 -42
  6. package/dist/data-classification.d.ts +44 -0
  7. package/dist/dev/hot-reload.js +11 -30
  8. package/dist/dev/module-runner.d.ts +3 -7
  9. package/dist/dev/module-runner.js +4 -10
  10. package/dist/dev/reload-meta.d.ts +8 -20
  11. package/dist/dev/reload-meta.js +9 -29
  12. package/dist/errors/error-handler.d.ts +5 -30
  13. package/dist/errors/error-handler.js +16 -32
  14. package/dist/errors/errors.d.ts +32 -151
  15. package/dist/errors/errors.js +55 -157
  16. package/dist/function/abort-scope.d.ts +47 -0
  17. package/dist/function/abort-scope.js +63 -0
  18. package/dist/function/function-runner.js +37 -32
  19. package/dist/function/functions.types.d.ts +57 -136
  20. package/dist/function/functions.types.js +0 -58
  21. package/dist/function/index.d.ts +1 -1
  22. package/dist/function/list.types.d.ts +12 -62
  23. package/dist/function/list.types.js +4 -25
  24. package/dist/handle-error.d.ts +0 -13
  25. package/dist/handle-error.js +0 -18
  26. package/dist/index.d.ts +11 -5
  27. package/dist/index.js +7 -2
  28. package/dist/middleware/auth-apikey.d.ts +3 -18
  29. package/dist/middleware/auth-apikey.js +0 -17
  30. package/dist/middleware/auth-bearer.d.ts +6 -41
  31. package/dist/middleware/auth-bearer.js +5 -41
  32. package/dist/middleware/auth-cookie.d.ts +5 -27
  33. package/dist/middleware/auth-cookie.js +2 -26
  34. package/dist/middleware/cors.d.ts +7 -34
  35. package/dist/middleware/cors.js +7 -34
  36. package/dist/middleware/remote-auth.d.ts +3 -1
  37. package/dist/middleware/remote-auth.js +4 -3
  38. package/dist/middleware/telemetry.d.ts +8 -33
  39. package/dist/middleware/telemetry.js +2 -31
  40. package/dist/middleware-runner.d.ts +4 -55
  41. package/dist/middleware-runner.js +5 -74
  42. package/dist/permissions.d.ts +3 -44
  43. package/dist/permissions.js +19 -71
  44. package/dist/pikku-request.d.ts +0 -6
  45. package/dist/pikku-request.js +0 -6
  46. package/dist/pikku-state.d.ts +0 -26
  47. package/dist/pikku-state.js +2 -30
  48. package/dist/remote.d.ts +3 -5
  49. package/dist/remote.js +9 -8
  50. package/dist/schema.d.ts +5 -39
  51. package/dist/schema.js +5 -39
  52. package/dist/scopes.d.ts +4 -23
  53. package/dist/scopes.js +7 -48
  54. package/dist/secret-value.d.ts +56 -0
  55. package/dist/secret-value.js +46 -0
  56. package/dist/services/ai-agent-runner-service.d.ts +20 -0
  57. package/dist/services/ai-embedding-service.d.ts +2 -25
  58. package/dist/services/audit-service.d.ts +74 -4
  59. package/dist/services/audit-service.js +8 -7
  60. package/dist/services/content-service.d.ts +1 -46
  61. package/dist/services/credential-service.d.ts +3 -40
  62. package/dist/services/credential-wire-service.d.ts +5 -0
  63. package/dist/services/credential-wire-service.js +9 -1
  64. package/dist/services/deployment-service.d.ts +3 -9
  65. package/dist/services/email-service.d.ts +2 -1
  66. package/dist/services/gateway-service.d.ts +0 -15
  67. package/dist/services/http-personas.d.ts +80 -0
  68. package/dist/services/http-personas.js +233 -0
  69. package/dist/services/in-memory-queue-service.d.ts +0 -14
  70. package/dist/services/in-memory-queue-service.js +1 -15
  71. package/dist/services/in-memory-trigger-service.d.ts +0 -18
  72. package/dist/services/in-memory-trigger-service.js +1 -18
  73. package/dist/services/in-memory-workflow-service.d.ts +0 -16
  74. package/dist/services/in-memory-workflow-service.js +4 -33
  75. package/dist/services/index.d.ts +8 -9
  76. package/dist/services/index.js +3 -6
  77. package/dist/services/istanbul-coverage-service.d.ts +1 -5
  78. package/dist/services/istanbul-coverage-service.js +2 -8
  79. package/dist/services/jwt-service.d.ts +1 -16
  80. package/dist/services/local-content-request-handler.d.ts +29 -0
  81. package/dist/services/local-content-request-handler.js +176 -0
  82. package/dist/services/local-content.d.ts +13 -2
  83. package/dist/services/local-content.js +40 -13
  84. package/dist/services/local-gateway-service.d.ts +0 -16
  85. package/dist/services/local-gateway-service.js +2 -17
  86. package/dist/services/local-secrets.d.ts +4 -7
  87. package/dist/services/local-secrets.js +7 -7
  88. package/dist/services/logger-console.d.ts +3 -7
  89. package/dist/services/logger-console.js +3 -7
  90. package/dist/services/logger.d.ts +22 -40
  91. package/dist/services/meta-service.d.ts +23 -26
  92. package/dist/services/meta-service.js +22 -36
  93. package/dist/services/personas-service.d.ts +134 -0
  94. package/dist/services/personas-service.js +40 -0
  95. package/dist/services/pikku-user-id.js +0 -4
  96. package/dist/services/queue-webhook-service.d.ts +2 -36
  97. package/dist/services/queue-webhook-service.js +10 -42
  98. package/dist/services/scheduler-service.d.ts +1 -50
  99. package/dist/services/scheduler-service.js +0 -10
  100. package/dist/services/schema-service.d.ts +1 -24
  101. package/dist/services/scope-service.d.ts +49 -34
  102. package/dist/services/scoped-secret-service.d.ts +4 -7
  103. package/dist/services/scoped-secret-service.js +0 -4
  104. package/dist/services/secret-host-binding.d.ts +8 -0
  105. package/dist/services/secret-host-binding.js +36 -0
  106. package/dist/services/secret-service.d.ts +12 -35
  107. package/dist/services/secretless.d.ts +6 -0
  108. package/dist/services/secretless.js +21 -0
  109. package/dist/services/stub-tracker.d.ts +7 -18
  110. package/dist/services/stub-tracker.js +8 -18
  111. package/dist/services/system-role-guard.d.ts +33 -0
  112. package/dist/services/system-role-guard.js +38 -0
  113. package/dist/services/trigger-service.d.ts +0 -12
  114. package/dist/services/typed-secret-service.d.ts +5 -11
  115. package/dist/services/typed-secret-service.js +1 -7
  116. package/dist/services/v8-coverage-service.d.ts +2 -3
  117. package/dist/services/v8-coverage-service.js +1 -2
  118. package/dist/services/variables-service.d.ts +1 -8
  119. package/dist/services/webhook-service.d.ts +21 -64
  120. package/dist/services/webhook-service.js +6 -20
  121. package/dist/services/workflow-service.d.ts +3 -15
  122. package/dist/testing/service-tests.js +6 -23
  123. package/dist/time-utils.d.ts +0 -16
  124. package/dist/time-utils.js +1 -19
  125. package/dist/types/core.types.d.ts +120 -219
  126. package/dist/types/core.types.js +0 -42
  127. package/dist/types/state.types.d.ts +4 -9
  128. package/dist/utils/hmac.d.ts +4 -10
  129. package/dist/utils/hmac.js +4 -10
  130. package/dist/utils/safe-fetch.d.ts +7 -35
  131. package/dist/utils/safe-fetch.js +13 -53
  132. package/dist/utils.d.ts +1 -6
  133. package/dist/utils.js +6 -15
  134. package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
  135. package/dist/wirings/actor-flow/index.d.ts +0 -9
  136. package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
  137. package/dist/wirings/actor-flow/run-conversation.js +14 -7
  138. package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
  139. package/dist/wirings/ai-agent/ai-agent-agui.js +46 -12
  140. package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
  141. package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
  142. package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
  143. package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
  144. package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
  145. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
  146. package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
  147. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
  148. package/dist/wirings/ai-agent/ai-agent-prepare.js +65 -132
  149. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
  150. package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
  151. package/dist/wirings/ai-agent/ai-agent-runner.js +63 -22
  152. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
  153. package/dist/wirings/ai-agent/ai-agent-stream.js +180 -64
  154. package/dist/wirings/ai-agent/ai-agent.types.d.ts +124 -4
  155. package/dist/wirings/ai-agent/index.d.ts +6 -4
  156. package/dist/wirings/ai-agent/index.js +5 -4
  157. package/dist/wirings/ai-agent/voice-input.d.ts +59 -1
  158. package/dist/wirings/ai-agent/voice-input.js +90 -12
  159. package/dist/wirings/ai-agent/voice-output.d.ts +69 -1
  160. package/dist/wirings/ai-agent/voice-output.js +162 -50
  161. package/dist/wirings/channel/channel-common.d.ts +7 -20
  162. package/dist/wirings/channel/channel-common.js +7 -21
  163. package/dist/wirings/channel/channel-handler.js +25 -6
  164. package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
  165. package/dist/wirings/channel/channel-host-rpc.js +38 -0
  166. package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
  167. package/dist/wirings/channel/channel-middleware-runner.js +0 -12
  168. package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
  169. package/dist/wirings/channel/channel-rpc-registry.js +89 -0
  170. package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
  171. package/dist/wirings/channel/channel-rpc-responder.js +71 -0
  172. package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
  173. package/dist/wirings/channel/channel-rpc-service.js +106 -0
  174. package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
  175. package/dist/wirings/channel/channel-rpc-validators.js +30 -0
  176. package/dist/wirings/channel/channel-rpc.d.ts +5 -0
  177. package/dist/wirings/channel/channel-rpc.js +5 -0
  178. package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
  179. package/dist/wirings/channel/channel-rpc.types.js +50 -0
  180. package/dist/wirings/channel/channel-runner.d.ts +0 -4
  181. package/dist/wirings/channel/channel-runner.js +0 -14
  182. package/dist/wirings/channel/channel-store.d.ts +0 -10
  183. package/dist/wirings/channel/channel.types.d.ts +12 -1
  184. package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
  185. package/dist/wirings/channel/define-channel-routes.js +0 -20
  186. package/dist/wirings/channel/eventhub-service.d.ts +0 -18
  187. package/dist/wirings/channel/index.d.ts +4 -1
  188. package/dist/wirings/channel/index.js +2 -0
  189. package/dist/wirings/channel/local/local-channel-runner.js +3 -1
  190. package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
  191. package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
  192. package/dist/wirings/channel/log-channels.d.ts +0 -4
  193. package/dist/wirings/channel/log-channels.js +0 -4
  194. package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
  195. package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
  196. package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
  197. package/dist/wirings/cli/channel/cli-approval.js +81 -0
  198. package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
  199. package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
  200. package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
  201. package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
  202. package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +38 -0
  203. package/dist/wirings/cli/channel/cli-raw-client-runner.js +129 -0
  204. package/dist/wirings/cli/channel/index.d.ts +5 -0
  205. package/dist/wirings/cli/channel/index.js +2 -0
  206. package/dist/wirings/cli/cli-runner.d.ts +20 -20
  207. package/dist/wirings/cli/cli-runner.js +28 -89
  208. package/dist/wirings/cli/cli.types.d.ts +14 -3
  209. package/dist/wirings/cli/command-parser.d.ts +1 -10
  210. package/dist/wirings/cli/command-parser.js +10 -87
  211. package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
  212. package/dist/wirings/cli/define-cli-commands.js +1 -17
  213. package/dist/wirings/credential/credential.types.d.ts +0 -12
  214. package/dist/wirings/credential/define-credential.d.ts +48 -0
  215. package/dist/wirings/credential/define-credential.js +47 -0
  216. package/dist/wirings/credential/index.d.ts +1 -1
  217. package/dist/wirings/credential/index.js +1 -1
  218. package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
  219. package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
  220. package/dist/wirings/gateway/gateway-runner.js +8 -105
  221. package/dist/wirings/gateway/gateway.types.d.ts +7 -80
  222. package/dist/wirings/http/http-routes.d.ts +0 -63
  223. package/dist/wirings/http/http-routes.js +0 -63
  224. package/dist/wirings/http/http-runner.d.ts +0 -99
  225. package/dist/wirings/http/http-runner.js +9 -165
  226. package/dist/wirings/http/http.types.d.ts +14 -55
  227. package/dist/wirings/http/log-http-routes.d.ts +0 -4
  228. package/dist/wirings/http/log-http-routes.js +0 -4
  229. package/dist/wirings/http/pikku-fetch-http-request.d.ts +0 -40
  230. package/dist/wirings/http/pikku-fetch-http-request.js +0 -58
  231. package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
  232. package/dist/wirings/http/routers/path-to-regex.js +2 -13
  233. package/dist/wirings/http/web-request.d.ts +0 -8
  234. package/dist/wirings/http/web-request.js +25 -17
  235. package/dist/wirings/mcp/mcp-runner.d.ts +1 -4
  236. package/dist/wirings/mcp/mcp-runner.js +1 -14
  237. package/dist/wirings/mcp/mcp.types.d.ts +2 -35
  238. package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
  239. package/dist/wirings/oauth2/oauth2.types.js +0 -3
  240. package/dist/wirings/persona/define-personas.d.ts +32 -0
  241. package/dist/wirings/persona/define-personas.js +31 -0
  242. package/dist/wirings/persona/index.d.ts +21 -0
  243. package/dist/wirings/persona/index.js +17 -0
  244. package/dist/wirings/persona/persona-email.d.ts +37 -0
  245. package/dist/wirings/persona/persona-email.js +69 -0
  246. package/dist/wirings/persona/persona-environments.d.ts +45 -0
  247. package/dist/wirings/persona/persona-environments.js +81 -0
  248. package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
  249. package/dist/wirings/persona/persona-mailbox.js +53 -0
  250. package/dist/wirings/persona/persona.types.d.ts +136 -0
  251. package/dist/wirings/persona/persona.types.js +1 -0
  252. package/dist/wirings/persona/validate-personas.d.ts +53 -0
  253. package/dist/wirings/persona/validate-personas.js +94 -0
  254. package/dist/wirings/queue/index.d.ts +3 -0
  255. package/dist/wirings/queue/index.js +2 -3
  256. package/dist/wirings/queue/queue-identity.d.ts +28 -0
  257. package/dist/wirings/queue/queue-identity.js +103 -0
  258. package/dist/wirings/queue/queue-runner.d.ts +0 -19
  259. package/dist/wirings/queue/queue-runner.js +9 -30
  260. package/dist/wirings/queue/queue.types.d.ts +20 -90
  261. package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
  262. package/dist/wirings/queue/register-queue-helper.js +0 -11
  263. package/dist/wirings/queue/signed-queue-service.d.ts +17 -0
  264. package/dist/wirings/queue/signed-queue-service.js +42 -0
  265. package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
  266. package/dist/wirings/queue/validate-worker-config.js +0 -14
  267. package/dist/wirings/role/define-system-role.d.ts +32 -0
  268. package/dist/wirings/role/define-system-role.js +31 -0
  269. package/dist/wirings/role/index.d.ts +3 -0
  270. package/dist/wirings/role/index.js +2 -0
  271. package/dist/wirings/role/role.types.d.ts +43 -0
  272. package/dist/wirings/role/role.types.js +1 -0
  273. package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
  274. package/dist/wirings/role/validate-role-definitions.js +71 -0
  275. package/dist/wirings/rpc/addon-runner.d.ts +0 -19
  276. package/dist/wirings/rpc/addon-runner.js +0 -51
  277. package/dist/wirings/rpc/remote-addon-auth.d.ts +3 -13
  278. package/dist/wirings/rpc/remote-addon-auth.js +7 -11
  279. package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
  280. package/dist/wirings/rpc/rpc-runner.js +88 -105
  281. package/dist/wirings/rpc/rpc-types.d.ts +7 -6
  282. package/dist/wirings/rpc/wire-addon.d.ts +25 -0
  283. package/dist/wirings/rpc/wire-addon.js +62 -0
  284. package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
  285. package/dist/wirings/rpc/wire-remote-addon.js +0 -8
  286. package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
  287. package/dist/wirings/scheduler/log-schedulers.js +0 -4
  288. package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
  289. package/dist/wirings/scheduler/scheduler-runner.js +0 -1
  290. package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
  291. package/dist/wirings/scope/define-scope.d.ts +32 -0
  292. package/dist/wirings/scope/define-scope.js +31 -0
  293. package/dist/wirings/scope/index.d.ts +1 -1
  294. package/dist/wirings/scope/index.js +1 -1
  295. package/dist/wirings/scope/scope.types.d.ts +7 -9
  296. package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
  297. package/dist/wirings/scope/validate-scope-definitions.js +3 -21
  298. package/dist/wirings/secret/index.d.ts +1 -1
  299. package/dist/wirings/secret/index.js +1 -1
  300. package/dist/wirings/secret/secret.types.d.ts +19 -15
  301. package/dist/wirings/secret/secret.types.js +1 -1
  302. package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
  303. package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
  304. package/dist/wirings/trigger/trigger-runner.js +1 -24
  305. package/dist/wirings/trigger/trigger.types.d.ts +1 -82
  306. package/dist/wirings/trigger/trigger.types.js +0 -34
  307. package/dist/wirings/variable/index.d.ts +1 -1
  308. package/dist/wirings/variable/index.js +1 -1
  309. package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
  310. package/dist/wirings/variable/variable.types.d.ts +1 -13
  311. package/dist/wirings/variable/variable.types.js +1 -1
  312. package/dist/wirings/virtual-user/index.d.ts +30 -0
  313. package/dist/wirings/virtual-user/index.js +10 -0
  314. package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +54 -0
  315. package/dist/wirings/virtual-user/prepare-virtual-user-run.js +49 -0
  316. package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
  317. package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
  318. package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
  319. package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
  320. package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
  321. package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
  322. package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
  323. package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
  324. package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
  325. package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
  326. package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
  327. package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
  328. package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
  329. package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
  330. package/dist/wirings/virtual-user/virtual-user-run-store.d.ts +90 -0
  331. package/dist/wirings/virtual-user/virtual-user-run-store.js +1 -0
  332. package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
  333. package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
  334. package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
  335. package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
  336. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +19 -15
  337. package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
  338. package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
  339. package/dist/wirings/workflow/feature.d.ts +0 -19
  340. package/dist/wirings/workflow/feature.js +0 -19
  341. package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
  342. package/dist/wirings/workflow/graph/graph-node.js +0 -34
  343. package/dist/wirings/workflow/graph/graph-runner.js +6 -41
  344. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
  345. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
  346. package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
  347. package/dist/wirings/workflow/index.d.ts +5 -7
  348. package/dist/wirings/workflow/index.js +3 -17
  349. package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
  350. package/dist/wirings/workflow/pikku-scenario-service.js +204 -43
  351. package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
  352. package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
  353. package/dist/wirings/workflow/run-timeline.d.ts +0 -47
  354. package/dist/wirings/workflow/run-timeline.js +0 -22
  355. package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
  356. package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
  357. package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
  358. package/dist/wirings/workflow/scenario-poll.js +0 -12
  359. package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
  360. package/dist/wirings/workflow/scenario-prose.js +1 -19
  361. package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
  362. package/dist/wirings/workflow/scenario-step-guards.js +1 -14
  363. package/dist/wirings/workflow/scenario-step.types.d.ts +84 -12
  364. package/dist/wirings/workflow/scenario-step.types.js +5 -1
  365. package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
  366. package/dist/wirings/workflow/scenario-surface.js +56 -0
  367. package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
  368. package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
  369. package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
  370. package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
  371. package/dist/wirings/workflow/workflow.types.d.ts +5 -195
  372. package/knowledge/decisions/index.md +19 -0
  373. package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
  374. package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +48 -0
  375. package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
  376. package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
  377. package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
  378. package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
  379. package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
  380. package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
  381. package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
  382. package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
  383. package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
  384. package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
  385. package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
  386. package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
  387. package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
  388. package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
  389. package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
  390. package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
  391. package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
  392. package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
  393. package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
  394. package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
  395. package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
  396. package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
  397. package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
  398. package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
  399. package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
  400. package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
  401. package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
  402. package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +84 -0
  403. package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +41 -0
  404. package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
  405. package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
  406. package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
  407. package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
  408. package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
  409. package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
  410. package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
  411. package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
  412. package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
  413. package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
  414. package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
  415. package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
  416. package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
  417. package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
  418. package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
  419. package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
  420. package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
  421. package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
  422. package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
  423. package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
  424. package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
  425. package/knowledge/decisions/internals/index.md +117 -0
  426. package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
  427. package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
  428. package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
  429. package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +53 -0
  430. package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
  431. package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
  432. package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
  433. package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
  434. package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
  435. package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
  436. package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
  437. package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +48 -0
  438. package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
  439. package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
  440. package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
  441. package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
  442. package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
  443. package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
  444. package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
  445. package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
  446. package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
  447. package/knowledge/decisions/internals/validate-checks-personas-through-a-shared-module.md +43 -0
  448. package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
  449. package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
  450. package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
  451. package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
  452. package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
  453. package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
  454. package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
  455. package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
  456. package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
  457. package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
  458. package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
  459. package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
  460. package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
  461. package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
  462. package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
  463. package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
  464. package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
  465. package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
  466. package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
  467. package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
  468. package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
  469. package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
  470. package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
  471. package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
  472. package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
  473. package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
  474. package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
  475. package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
  476. package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
  477. package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
  478. package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
  479. package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
  480. package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
  481. package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
  482. package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
  483. package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
  484. package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
  485. package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
  486. package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
  487. package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
  488. package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
  489. package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
  490. package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
  491. package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
  492. package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
  493. package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
  494. package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
  495. package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
  496. package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
  497. package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
  498. package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
  499. package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
  500. package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
  501. package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
  502. package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
  503. package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
  504. package/knowledge/decisions/security/index.md +55 -0
  505. package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
  506. package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
  507. package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
  508. package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
  509. package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
  510. package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
  511. package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
  512. package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
  513. package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
  514. package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
  515. package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
  516. package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
  517. package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
  518. package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
  519. package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
  520. package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
  521. package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
  522. package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
  523. package/knowledge/index.md +24 -0
  524. package/knowledge/questions/index.md +15 -0
  525. package/package.json +6 -2
  526. package/run-tests.sh +0 -0
  527. package/src/column-form.test.ts +97 -0
  528. package/src/column-form.ts +58 -0
  529. package/src/crypto-utils.test.ts +460 -19
  530. package/src/crypto-utils.ts +306 -59
  531. package/src/data-classification.ts +45 -7
  532. package/src/dev/hot-reload.test.ts +0 -4
  533. package/src/dev/hot-reload.ts +11 -30
  534. package/src/dev/module-runner.ts +7 -32
  535. package/src/dev/reload-meta.ts +9 -29
  536. package/src/errors/error-handler.ts +20 -35
  537. package/src/errors/error.test.ts +30 -1
  538. package/src/errors/errors.ts +73 -157
  539. package/src/function/abort-scope.test.ts +97 -0
  540. package/src/function/abort-scope.ts +80 -0
  541. package/src/function/function-runner.test.ts +0 -7
  542. package/src/function/function-runner.ts +62 -32
  543. package/src/function/functions.types.ts +95 -138
  544. package/src/function/index.ts +1 -0
  545. package/src/function/list.types.test.ts +3 -25
  546. package/src/function/list.types.ts +12 -62
  547. package/src/handle-error.ts +0 -18
  548. package/src/index.ts +84 -3
  549. package/src/middleware/auth-apikey.test.ts +0 -1
  550. package/src/middleware/auth-apikey.ts +0 -17
  551. package/src/middleware/auth-bearer.test.ts +3 -5
  552. package/src/middleware/auth-bearer.ts +5 -41
  553. package/src/middleware/auth-cookie.test.ts +0 -6
  554. package/src/middleware/auth-cookie.ts +2 -26
  555. package/src/middleware/cors.test.ts +34 -0
  556. package/src/middleware/cors.ts +12 -33
  557. package/src/middleware/remote-auth.test.ts +26 -10
  558. package/src/middleware/remote-auth.ts +11 -3
  559. package/src/middleware/telemetry.ts +2 -31
  560. package/src/middleware-runner.test.ts +0 -2
  561. package/src/middleware-runner.ts +5 -74
  562. package/src/permissions.test.ts +30 -0
  563. package/src/permissions.ts +24 -74
  564. package/src/pikku-request.ts +0 -6
  565. package/src/pikku-state.ts +2 -30
  566. package/src/production-barrels-stay-lean.test.ts +110 -0
  567. package/src/remote.test.ts +173 -0
  568. package/src/remote.ts +18 -8
  569. package/src/schema.ts +5 -39
  570. package/src/scopes.ts +7 -48
  571. package/src/secret-value.test.ts +204 -0
  572. package/src/secret-value.ts +111 -0
  573. package/src/services/ai-agent-runner-service.ts +20 -0
  574. package/src/services/ai-embedding-service.ts +3 -25
  575. package/src/services/audit-service.ts +88 -11
  576. package/src/services/content-service.ts +1 -46
  577. package/src/services/credential-service.ts +3 -40
  578. package/src/services/credential-wire-service.test.ts +0 -2
  579. package/src/services/credential-wire-service.ts +9 -1
  580. package/src/services/deployment-service.ts +3 -9
  581. package/src/services/email-service.ts +3 -1
  582. package/src/services/gateway-service.ts +0 -15
  583. package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
  584. package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
  585. package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
  586. package/src/services/in-memory-queue-service.ts +1 -15
  587. package/src/services/in-memory-trigger-service.ts +1 -18
  588. package/src/services/in-memory-workflow-service.test.ts +0 -13
  589. package/src/services/in-memory-workflow-service.ts +4 -38
  590. package/src/services/index.ts +23 -18
  591. package/src/services/istanbul-coverage-service.ts +2 -8
  592. package/src/services/jwt-service.ts +1 -16
  593. package/src/services/local-content-request-handler.test.ts +202 -0
  594. package/src/services/local-content-request-handler.ts +267 -0
  595. package/src/services/local-content.test.ts +159 -27
  596. package/src/services/local-content.ts +55 -23
  597. package/src/services/local-gateway-service.ts +2 -17
  598. package/src/services/local-secrets.test.ts +20 -5
  599. package/src/services/local-secrets.ts +15 -11
  600. package/src/services/logger-console.test.ts +0 -1
  601. package/src/services/logger-console.ts +3 -7
  602. package/src/services/logger.ts +31 -46
  603. package/src/services/meta-service.test.ts +1 -5
  604. package/src/services/meta-service.ts +41 -61
  605. package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
  606. package/src/services/pikku-user-id.ts +0 -4
  607. package/src/services/queue-webhook-service.test.ts +2 -1
  608. package/src/services/queue-webhook-service.ts +10 -42
  609. package/src/services/scheduler-service.ts +1 -50
  610. package/src/services/schema-service.ts +1 -24
  611. package/src/services/scope-service.ts +50 -34
  612. package/src/services/scoped-secret-service.ts +4 -7
  613. package/src/services/secret-host-binding.test.ts +138 -0
  614. package/src/services/secret-host-binding.ts +51 -0
  615. package/src/services/secret-service.ts +12 -35
  616. package/src/services/secretless.test.ts +54 -0
  617. package/src/services/secretless.ts +29 -0
  618. package/src/services/stub-tracker.ts +8 -18
  619. package/src/services/system-role-guard.test.ts +93 -0
  620. package/src/services/system-role-guard.ts +71 -0
  621. package/src/services/trigger-service.ts +0 -12
  622. package/src/services/typed-secret-service.ts +12 -14
  623. package/src/services/v8-coverage-service.ts +3 -6
  624. package/src/services/variables-service.ts +1 -8
  625. package/src/services/webhook-service.ts +23 -64
  626. package/src/services/workflow-service.ts +3 -20
  627. package/src/testing/service-tests.ts +6 -32
  628. package/src/time-utils.ts +1 -19
  629. package/src/types/core.types.ts +137 -229
  630. package/src/types/state.types.ts +7 -9
  631. package/src/utils/hmac.ts +4 -10
  632. package/src/utils/safe-fetch.ts +13 -54
  633. package/src/utils.test.ts +11 -2
  634. package/src/utils.ts +6 -15
  635. package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
  636. package/src/wirings/actor-flow/index.ts +0 -9
  637. package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
  638. package/src/wirings/actor-flow/run-conversation.ts +19 -12
  639. package/src/wirings/ai-agent/ai-agent-agui.test.ts +91 -10
  640. package/src/wirings/ai-agent/ai-agent-agui.ts +49 -17
  641. package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
  642. package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
  643. package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
  644. package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
  645. package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
  646. package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
  647. package/src/wirings/ai-agent/ai-agent-prepare.ts +89 -139
  648. package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
  649. package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
  650. package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
  651. package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
  652. package/src/wirings/ai-agent/ai-agent-runner.ts +85 -35
  653. package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
  654. package/src/wirings/ai-agent/ai-agent-stream.ts +224 -76
  655. package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
  656. package/src/wirings/ai-agent/ai-agent.types.ts +130 -5
  657. package/src/wirings/ai-agent/index.ts +37 -3
  658. package/src/wirings/ai-agent/voice-input.test.ts +137 -7
  659. package/src/wirings/ai-agent/voice-input.ts +96 -12
  660. package/src/wirings/ai-agent/voice-output.test.ts +512 -0
  661. package/src/wirings/ai-agent/voice-output.ts +243 -56
  662. package/src/wirings/channel/channel-common.ts +15 -20
  663. package/src/wirings/channel/channel-handler.test.ts +50 -0
  664. package/src/wirings/channel/channel-handler.ts +32 -11
  665. package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
  666. package/src/wirings/channel/channel-host-rpc.ts +69 -0
  667. package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
  668. package/src/wirings/channel/channel-middleware-runner.ts +0 -12
  669. package/src/wirings/channel/channel-rpc-registry.ts +116 -0
  670. package/src/wirings/channel/channel-rpc-responder.ts +117 -0
  671. package/src/wirings/channel/channel-rpc-service.ts +146 -0
  672. package/src/wirings/channel/channel-rpc-validators.ts +65 -0
  673. package/src/wirings/channel/channel-rpc.test.ts +820 -0
  674. package/src/wirings/channel/channel-rpc.ts +5 -0
  675. package/src/wirings/channel/channel-rpc.types.ts +150 -0
  676. package/src/wirings/channel/channel-runner.ts +0 -14
  677. package/src/wirings/channel/channel-store.ts +0 -10
  678. package/src/wirings/channel/channel.types.ts +19 -8
  679. package/src/wirings/channel/define-channel-routes.ts +0 -20
  680. package/src/wirings/channel/eventhub-service.ts +0 -18
  681. package/src/wirings/channel/index.ts +35 -0
  682. package/src/wirings/channel/local/local-channel-handler.ts +3 -1
  683. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
  684. package/src/wirings/channel/local/local-channel-runner.ts +3 -1
  685. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
  686. package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
  687. package/src/wirings/channel/log-channels.ts +0 -4
  688. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
  689. package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
  690. package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
  691. package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
  692. package/src/wirings/cli/channel/cli-approval.ts +135 -0
  693. package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
  694. package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
  695. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
  696. package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
  697. package/src/wirings/cli/channel/cli-raw-client-runner.ts +185 -0
  698. package/src/wirings/cli/channel/index.ts +13 -0
  699. package/src/wirings/cli/cli-runner.test.ts +0 -1
  700. package/src/wirings/cli/cli-runner.ts +46 -88
  701. package/src/wirings/cli/cli.types.ts +14 -3
  702. package/src/wirings/cli/command-parser.test.ts +0 -4
  703. package/src/wirings/cli/command-parser.ts +11 -91
  704. package/src/wirings/cli/define-cli-commands.ts +1 -17
  705. package/src/wirings/credential/credential.types.ts +0 -12
  706. package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
  707. package/src/wirings/credential/index.ts +1 -1
  708. package/src/wirings/credential/validate-credential-definitions.ts +2 -4
  709. package/src/wirings/gateway/gateway-runner.test.ts +1 -21
  710. package/src/wirings/gateway/gateway-runner.ts +8 -110
  711. package/src/wirings/gateway/gateway.types.ts +7 -80
  712. package/src/wirings/http/http-routes.test.ts +0 -3
  713. package/src/wirings/http/http-routes.ts +0 -86
  714. package/src/wirings/http/http-runner.test.ts +0 -1
  715. package/src/wirings/http/http-runner.ts +8 -167
  716. package/src/wirings/http/http.types.ts +15 -62
  717. package/src/wirings/http/log-http-routes.ts +0 -4
  718. package/src/wirings/http/pikku-fetch-http-request.test.ts +2 -10
  719. package/src/wirings/http/pikku-fetch-http-request.ts +0 -58
  720. package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
  721. package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
  722. package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
  723. package/src/wirings/http/routers/path-to-regex.ts +2 -13
  724. package/src/wirings/http/web-request.test.ts +33 -2
  725. package/src/wirings/http/web-request.ts +30 -17
  726. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
  727. package/src/wirings/mcp/mcp-runner.ts +2 -17
  728. package/src/wirings/mcp/mcp.types.ts +7 -42
  729. package/src/wirings/oauth2/oauth2.types.ts +0 -30
  730. package/src/wirings/persona/define-personas.ts +33 -0
  731. package/src/wirings/persona/index.ts +62 -0
  732. package/src/wirings/persona/persona-email.ts +87 -0
  733. package/src/wirings/persona/persona-environments.test.ts +183 -0
  734. package/src/wirings/persona/persona-environments.ts +138 -0
  735. package/src/wirings/persona/persona-mailbox.ts +156 -0
  736. package/src/wirings/persona/persona.test.ts +220 -0
  737. package/src/wirings/persona/persona.types.ts +142 -0
  738. package/src/wirings/persona/validate-personas.ts +133 -0
  739. package/src/wirings/queue/index.ts +13 -3
  740. package/src/wirings/queue/queue-identity.test.ts +454 -0
  741. package/src/wirings/queue/queue-identity.ts +176 -0
  742. package/src/wirings/queue/queue-runner.ts +12 -31
  743. package/src/wirings/queue/queue.types.ts +25 -90
  744. package/src/wirings/queue/register-queue-helper.ts +0 -14
  745. package/src/wirings/queue/signed-queue-service.ts +60 -0
  746. package/src/wirings/queue/validate-worker-config.ts +2 -28
  747. package/src/wirings/role/define-system-role.ts +33 -0
  748. package/src/wirings/role/index.ts +13 -0
  749. package/src/wirings/role/role.test.ts +104 -0
  750. package/src/wirings/role/role.types.ts +47 -0
  751. package/src/wirings/role/validate-role-definitions.ts +93 -0
  752. package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
  753. package/src/wirings/rpc/addon-runner.ts +0 -56
  754. package/src/wirings/rpc/addon-scopes.test.ts +225 -0
  755. package/src/wirings/rpc/remote-addon-auth.ts +9 -16
  756. package/src/wirings/rpc/rpc-runner.test.ts +192 -6
  757. package/src/wirings/rpc/rpc-runner.ts +145 -127
  758. package/src/wirings/rpc/rpc-types.ts +11 -6
  759. package/src/wirings/rpc/wire-addon.test.ts +43 -1
  760. package/src/wirings/rpc/wire-addon.ts +99 -0
  761. package/src/wirings/rpc/wire-remote-addon.ts +9 -29
  762. package/src/wirings/scheduler/log-schedulers.ts +0 -4
  763. package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
  764. package/src/wirings/scheduler/scheduler-runner.ts +0 -2
  765. package/src/wirings/scheduler/scheduler.types.ts +1 -14
  766. package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
  767. package/src/wirings/scope/index.ts +1 -1
  768. package/src/wirings/scope/scope.test.ts +1 -2
  769. package/src/wirings/scope/scope.types.ts +7 -9
  770. package/src/wirings/scope/validate-scope-definitions.ts +3 -21
  771. package/src/wirings/secret/index.ts +1 -1
  772. package/src/wirings/secret/secret.types.ts +19 -15
  773. package/src/wirings/secret/validate-secret-definitions.ts +2 -4
  774. package/src/wirings/trigger/trigger-runner.ts +1 -27
  775. package/src/wirings/trigger/trigger.types.ts +1 -82
  776. package/src/wirings/variable/index.ts +1 -1
  777. package/src/wirings/variable/validate-variable-definitions.ts +2 -4
  778. package/src/wirings/variable/variable.types.ts +1 -13
  779. package/src/wirings/virtual-user/index.ts +88 -0
  780. package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +115 -0
  781. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +95 -0
  782. package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
  783. package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
  784. package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
  785. package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
  786. package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
  787. package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
  788. package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
  789. package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
  790. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
  791. package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
  792. package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
  793. package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
  794. package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
  795. package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
  796. package/src/wirings/virtual-user/virtual-user-run-store.ts +98 -0
  797. package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
  798. package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
  799. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +19 -20
  800. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
  801. package/src/wirings/workflow/feature.ts +0 -19
  802. package/src/wirings/workflow/graph/graph-node.ts +0 -136
  803. package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
  804. package/src/wirings/workflow/graph/graph-runner.ts +6 -41
  805. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
  806. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
  807. package/src/wirings/workflow/index.ts +10 -44
  808. package/src/wirings/workflow/pikku-scenario-service.ts +235 -61
  809. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
  810. package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
  811. package/src/wirings/workflow/run-timeline.test.ts +7 -19
  812. package/src/wirings/workflow/run-timeline.ts +0 -56
  813. package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
  814. package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
  815. package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
  816. package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
  817. package/src/wirings/workflow/scenario-poll.test.ts +0 -2
  818. package/src/wirings/workflow/scenario-poll.ts +0 -15
  819. package/src/wirings/workflow/scenario-prose.test.ts +5 -7
  820. package/src/wirings/workflow/scenario-prose.ts +1 -29
  821. package/src/wirings/workflow/scenario-service.test.ts +2 -10
  822. package/src/wirings/workflow/scenario-step-guards.ts +1 -14
  823. package/src/wirings/workflow/scenario-step.test.ts +163 -19
  824. package/src/wirings/workflow/scenario-step.types.ts +94 -12
  825. package/src/wirings/workflow/scenario-surface.test.ts +146 -0
  826. package/src/wirings/workflow/scenario-surface.ts +71 -0
  827. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
  828. package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
  829. package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
  830. package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
  831. package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
  832. package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
  833. package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
  834. package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
  835. package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
  836. package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
  837. package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
  838. package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
  839. package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
  840. package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
  841. package/src/wirings/workflow/workflow.types.ts +5 -201
  842. package/tsconfig.tsbuildinfo +1 -1
  843. package/tsconfig.type-tests.json +12 -0
  844. package/src/middleware/timeout.ts +0 -22
  845. package/src/pikku-response.ts +0 -5
  846. package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
  847. package/src/wirings/workflow/dsl/index.ts +0 -36
  848. package/src/wirings/workflow/graph/index.ts +0 -15
@@ -17,7 +17,8 @@ import type {
17
17
  FeaturesMeta,
18
18
  WorkflowsMeta,
19
19
  } from '../wirings/workflow/workflow.types.js'
20
- import type { ScenarioActorConfig } from './scenario-actors-service.js'
20
+ import type { ResolvedPersona } from './personas-service.js'
21
+ import type { SystemRoleDefinitionsMeta } from '../wirings/role/role.types.js'
21
22
  import type {
22
23
  TriggerMeta,
23
24
  TriggerSourceMeta,
@@ -34,7 +35,6 @@ import type {
34
35
  import type { AIAgentMeta } from '../wirings/ai-agent/ai-agent.types.js'
35
36
  import type { GatewaysMeta } from '../wirings/gateway/gateway.types.js'
36
37
 
37
- // Re-export core types for consumers
38
38
  export type {
39
39
  FunctionMeta,
40
40
  FunctionsMeta,
@@ -146,39 +146,26 @@ export interface EmailTemplateAssets {
146
146
  missing: string[]
147
147
  }
148
148
 
149
- /**
150
- * Abstraction over .pikku metadata file access.
151
- * All paths are relative to the .pikku root directory.
152
- *
153
- * Node.js uses LocalMetaService (filesystem).
154
- * Cloudflare uses an R2/KV implementation.
155
- */
149
+ /** Every `relativePath` below is relative to the `.pikku` root directory. */
156
150
  export interface MetaService {
157
- /** Base path for local filesystem implementations. Undefined for remote/non-local implementations. */
151
+ /** Undefined for remote/non-local implementations. */
158
152
  readonly basePath?: string
159
- /** Read a file's content by relative path. Returns null if not found. */
160
153
  readFile(relativePath: string): Promise<string | null>
161
- /** List files in a directory by relative path. Returns empty array if not found. */
162
154
  readDir(relativePath: string): Promise<string[]>
163
- /** Read a project source file relative to the project root (one level above .pikku). */
155
+ /** Relative to the project root, one level above `.pikku`. */
164
156
  readProjectFile(relativePath: string): Promise<string | null>
165
157
  /**
166
- * Read a file from an *installed addon package's* own `.pikku` directory
167
- * (resolved from node_modules), NOT the app's `.pikku`. `relativePath` is
168
- * relative to that package's `.pikku` root (use `../` to reach the package
169
- * root itself, e.g. `../README.md`). Returns null if the package or file is
170
- * absent. Only local/Node implementations resolve packages; remote impls omit
171
- * this and callers guard with `?.`.
158
+ * Reads an *installed addon package's* own `.pikku`, not the app's, with
159
+ * `relativePath` rooted there (`../README.md` reaches the package root).
160
+ * Optional because only local/Node implementations resolve packages remote
161
+ * ones omit it and callers guard with `?.`.
172
162
  */
173
163
  readPackageFile?(
174
164
  packageName: string,
175
165
  relativePath: string
176
166
  ): Promise<string | null>
177
- /** List a directory inside an installed addon package's `.pikku`. */
178
167
  readPackageDir?(packageName: string, relativePath: string): Promise<string[]>
179
168
 
180
- // -- Typed metadata accessors --
181
-
182
169
  getHttpMeta(): Promise<HTTPWiringsMeta>
183
170
  getChannelsMeta(): Promise<ChannelsMeta>
184
171
  getSchedulerMeta(): Promise<ScheduledTasksMeta>
@@ -188,7 +175,16 @@ export interface MetaService {
188
175
  getGatewayMeta(): Promise<GatewaysMeta>
189
176
  getRpcMeta(): Promise<RPCMetaRecord>
190
177
  getWorkflowMeta(): Promise<WorkflowsMeta>
191
- getScenarioActorsMeta(): Promise<Record<string, ScenarioActorConfig>>
178
+ getPersonasMeta(): Promise<Record<string, ResolvedPersona>>
179
+ /**
180
+ * The roles declared with `defineSystemRole`, keyed by name.
181
+ *
182
+ * A persona declares roles; a function checks scopes. Anything showing what a
183
+ * persona can reach — the console's persona page, a run's catalogue — needs
184
+ * this to get from one to the other, and needs it to be the same expansion the
185
+ * seed granted from rather than a second one.
186
+ */
187
+ getSystemRolesMeta(): Promise<SystemRoleDefinitionsMeta>
192
188
  getFeaturesMeta(): Promise<FeaturesMeta>
193
189
  getTriggerMeta(): Promise<TriggerMeta>
194
190
  getTriggerSourceMeta(): Promise<TriggerSourceMeta>
@@ -212,10 +208,6 @@ export interface MetaService {
212
208
  clearCache(): void
213
209
  }
214
210
 
215
- /**
216
- * Node.js filesystem implementation of MetaService.
217
- * Reads .gen.json files from a local .pikku directory.
218
- */
219
211
  export class LocalMetaService implements MetaService {
220
212
  public readonly basePath: string
221
213
 
@@ -228,8 +220,8 @@ export class LocalMetaService implements MetaService {
228
220
  private gatewayMetaCache: GatewaysMeta | null = null
229
221
  private rpcMetaCache: RPCMetaRecord | null = null
230
222
  private workflowMetaCache: WorkflowsMeta | null = null
231
- private scenarioActorsMetaCache: Record<string, ScenarioActorConfig> | null =
232
- null
223
+ private personasMetaCache: Record<string, ResolvedPersona> | null = null
224
+ private systemRolesMetaCache: SystemRoleDefinitionsMeta | null = null
233
225
  private featuresMetaCache: FeaturesMeta | null = null
234
226
  private triggerMetaCache: TriggerMeta | null = null
235
227
  private triggerSourceMetaCache: TriggerSourceMeta | null = null
@@ -271,10 +263,7 @@ export class LocalMetaService implements MetaService {
271
263
  }
272
264
  }
273
265
 
274
- // Resolve an installed addon package's root dir from the app's node_modules.
275
- // The addon packages have no main `exports` entry, so `require.resolve(pkg)`
276
- // throws; instead we walk the node_modules search paths (anchored at the app
277
- // root, one level above `.pikku`) and pick the first that contains the package.
266
+ // knowledge: decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md
278
267
  private packageRootCache = new Map<string, string | null>()
279
268
  private resolvePackageRoot(packageName: string): string | null {
280
269
  const cached = this.packageRootCache.get(packageName)
@@ -332,7 +321,8 @@ export class LocalMetaService implements MetaService {
332
321
  this.gatewayMetaCache = null
333
322
  this.rpcMetaCache = null
334
323
  this.workflowMetaCache = null
335
- this.scenarioActorsMetaCache = null
324
+ this.personasMetaCache = null
325
+ this.systemRolesMetaCache = null
336
326
  this.featuresMetaCache = null
337
327
  this.triggerMetaCache = null
338
328
  this.triggerSourceMetaCache = null
@@ -347,8 +337,6 @@ export class LocalMetaService implements MetaService {
347
337
  this.schemaCache.clear()
348
338
  }
349
339
 
350
- // -- Private helpers --
351
-
352
340
  private async readMetaJson<T>(
353
341
  dir: string,
354
342
  baseName: string
@@ -360,8 +348,6 @@ export class LocalMetaService implements MetaService {
360
348
  return null
361
349
  }
362
350
 
363
- // -- Typed metadata accessors --
364
-
365
351
  async getHttpMeta(): Promise<HTTPWiringsMeta> {
366
352
  if (this.httpMetaCache) return this.httpMetaCache
367
353
 
@@ -496,9 +482,7 @@ export class LocalMetaService implements MetaService {
496
482
 
497
483
  try {
498
484
  const result: WorkflowsMeta = {}
499
- // Scenarios keep their meta in `scenarios/meta` so nothing app-facing
500
- // imports them, but they are still workflows to anything reading meta off
501
- // disk — the console's scenario list among them.
485
+ // knowledge: decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md
502
486
  await Promise.all([
503
487
  this.readWorkflowMetaDir('workflow/meta', result),
504
488
  this.readWorkflowMetaDir('scenarios/meta', result),
@@ -513,12 +497,21 @@ export class LocalMetaService implements MetaService {
513
497
  }
514
498
  }
515
499
 
516
- async getScenarioActorsMeta(): Promise<Record<string, ScenarioActorConfig>> {
517
- if (this.scenarioActorsMetaCache) return this.scenarioActorsMetaCache
500
+ async getPersonasMeta(): Promise<Record<string, ResolvedPersona>> {
501
+ if (this.personasMetaCache) return this.personasMetaCache
502
+
503
+ const content = await this.readFile('workflow/personas.gen.json')
504
+ this.personasMetaCache = content ? JSON.parse(content) : {}
505
+ return this.personasMetaCache!
506
+ }
507
+
508
+ async getSystemRolesMeta(): Promise<SystemRoleDefinitionsMeta> {
509
+ if (this.systemRolesMetaCache) return this.systemRolesMetaCache
518
510
 
519
- const content = await this.readFile('workflow/scenario-actors.gen.json')
520
- this.scenarioActorsMetaCache = content ? JSON.parse(content) : {}
521
- return this.scenarioActorsMetaCache!
511
+ // Beside the scopes it is composed from, which is where codegen writes it.
512
+ const content = await this.readFile('scopes/pikku-roles-meta.gen.json')
513
+ this.systemRolesMetaCache = content ? JSON.parse(content) : {}
514
+ return this.systemRolesMetaCache!
522
515
  }
523
516
 
524
517
  async getFeaturesMeta(): Promise<FeaturesMeta> {
@@ -556,8 +549,6 @@ export class LocalMetaService implements MetaService {
556
549
 
557
550
  const [content, scenarioContent] = await Promise.all([
558
551
  this.readMetaJson('function', 'pikku-functions-meta'),
559
- // Scenario steps register only into the scenario bootstrap, but they are
560
- // still functions to anything reading meta off disk.
561
552
  this.readMetaJson('scenarios', 'pikku-scenario-functions-meta'),
562
553
  ])
563
554
  this.functionsMetaCache = {
@@ -635,12 +626,7 @@ export class LocalMetaService implements MetaService {
635
626
  }
636
627
 
637
628
  async getEmailMeta(): Promise<EmailsMeta> {
638
- // Read fresh every call — never cache. The email meta file is generated by
639
- // `pikku all`/`pikku emails generate` and is regenerated DURING a long-lived
640
- // session (sandbox boots the orchestrator before the user project's codegen
641
- // has written it). Caching here once returned an empty {templates:{}} that
642
- // then stuck for the whole session, leaving the console emails screen blank
643
- // even after the file appeared. A local JSON read is essentially free.
629
+ // knowledge: decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md
644
630
  const content = await this.readFile('email/pikku-emails-meta.gen.json')
645
631
  return content
646
632
  ? JSON.parse(content)
@@ -662,9 +648,7 @@ export class LocalMetaService implements MetaService {
662
648
  )
663
649
  }
664
650
 
665
- // emailsMeta.src is an absolute path resolved by the CLI at generation time.
666
- // Read directly rather than through readProjectFile (which prepends the project
667
- // root and produces a wrong compound path when baseDir is absolute).
651
+ // knowledge: decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md
668
652
  const baseDir = emailsMeta.src
669
653
  const readEmailFile = async (rel: string): Promise<string | null> => {
670
654
  try {
@@ -700,10 +684,6 @@ export class LocalMetaService implements MetaService {
700
684
  ]
701
685
 
702
686
  if (missing.length > 0) {
703
- // Diagnostic for the intermittent "Missing source files" report: logs which
704
- // process and which resolved baseDir saw the gap. Different pids across
705
- // failures => multiple runtime workers with divergent cached `src`; same pid
706
- // + transient absence => files being rewritten under us (e.g. regeneration).
707
687
  console.warn(
708
688
  `[email-assets] pid=${process.pid} template=${templateName} locale=${locale} baseDir=${baseDir} missing=${missing.join(',')}`
709
689
  )
@@ -2,6 +2,7 @@ import type {
2
2
  ConverseOptions,
3
3
  ActorFlowVerdict,
4
4
  } from '../wirings/actor-flow/actor-flow.types.js'
5
+ import type { PersonaMeta } from '../wirings/persona/persona.types.js'
5
6
 
6
7
  /**
7
8
  * What the transport answered, for a step that treats the status as data.
@@ -34,8 +35,8 @@ export interface ScenarioHttpResponse<T = unknown> {
34
35
  * Drain a response into the shape a step can carry: the parsed body (an empty
35
36
  * one counting as no body at all) alongside the text it was parsed from.
36
37
  *
37
- * `invokeRaw` returns this, and a step that has to reach past an actor — a
38
- * route with no RPC, an identity no actor can hold — reaches for this rather
38
+ * `invokeRaw` returns this, and a step that has to reach past a persona — a
39
+ * route with no RPC, an identity no persona can hold — reaches for this rather
39
40
  * than writing the same record by hand.
40
41
  */
41
42
  export const readScenarioHttpResponse = async <T = unknown>(
@@ -77,7 +78,7 @@ export interface ScenarioJsonRequest {
77
78
  /**
78
79
  * POST JSON somewhere and report what came back, without throwing on a 4xx/5xx.
79
80
  *
80
- * Every scenario that reaches past an actor was writing this by hand — the same
81
+ * Every scenario that reaches past a persona was writing this by hand — the same
81
82
  * `content-type`, the same `JSON.stringify`, the same drain — and the copies had
82
83
  * drifted: some returned `res.json()`, which loses the status and throws
83
84
  * outright when the target answers an empty body or an HTML error page. A
@@ -104,39 +105,45 @@ export const postScenarioJson = async <T = unknown>(
104
105
  /** Per-call transport options. */
105
106
  export interface ScenarioInvokeOptions {
106
107
  /**
107
- * Headers to send alongside the actor's own session. This is how a step
108
- * expresses an identity the actor registry cannot — an impersonation header,
109
- * or one of the header-shim principals a credential scenario invents.
108
+ * Headers to send alongside the persona's own session. This is how a step
109
+ * expresses an identity no declared persona can — an impersonation header, or
110
+ * one of the header-shim principals a credential scenario invents.
110
111
  */
111
112
  headers?: Record<string, string>
112
113
  }
113
114
 
114
115
  /**
115
- * The RPC surface an actor can reach, as name → input/output. A project binds
116
+ * The RPC surface a persona can reach, as name → input/output. A project binds
116
117
  * its generated exposed RPC map here; the default leaves every name open, which
117
- * is what an actor built by hand (or by a third-party driver) gets.
118
+ * is what a persona built by hand (or by a third-party driver) gets.
118
119
  */
119
120
  export type ScenarioRpcMap = Record<string, { input: any; output: any }>
120
121
 
121
122
  /**
122
- * The actor a step wire carries, for a project whose actor registry is known.
123
- * An empty registry keeps the open actor type rather than collapsing to
124
- * `never` — a project may still build actors itself.
123
+ * The persona a step's `actor` slot carries, for a project whose personas are
124
+ * known. No declared personas keeps the open type rather than collapsing to
125
+ * `never` — a project may still build one itself.
125
126
  */
126
- export type ScenarioActorOf<TActors> = [keyof TActors] extends [never]
127
- ? ScenarioActor
128
- : TActors[keyof TActors]
127
+ export type ScenarioPersonaOf<TPersonas> = [keyof TPersonas] extends [never]
128
+ ? ScenarioPersona
129
+ : TPersonas[keyof TPersonas]
129
130
 
130
- /** A synthetic user (a user row flagged `actor`) that workflow steps run as over the real transport */
131
- export interface ScenarioActor<
131
+ /**
132
+ * A declared person, signed in and acting over the real transport.
133
+ *
134
+ * The runtime half of `definePersonas()`: sign-in materialises a user row
135
+ * flagged `actor: true`, and everything a step or a virtual user does goes
136
+ * through here.
137
+ */
138
+ export interface ScenarioPersona<
132
139
  TAgentName extends string = string,
133
140
  TRpcMap extends ScenarioRpcMap = ScenarioRpcMap,
134
141
  > {
135
- /** Stable actor name (the key in pikku.config.json's actor registry). */
142
+ /** The id it was declared under — what a step's `actor` slot names. */
136
143
  readonly name: string
137
- /** The actor's user email flows use it for invites/lookups. */
144
+ /** Their address, computed from the id. Flows use it for invites/lookups. */
138
145
  readonly email: string
139
- /** Invoke an exposed RPC as this actor over the real transport. */
146
+ /** Invoke an exposed RPC as this person over the real transport. */
140
147
  invoke<TName extends keyof TRpcMap & string>(
141
148
  rpcName: TName,
142
149
  data: TRpcMap[TName]['input']
@@ -151,32 +158,30 @@ export interface ScenarioActor<
151
158
  data: TRpcMap[TName]['input'],
152
159
  options?: ScenarioInvokeOptions
153
160
  ): Promise<ScenarioHttpResponse>
154
- /** Converse with a Pikku AI agent in this actor's persona and return its verdict */
161
+ /** Converse with a Pikku AI agent in character and return its verdict. */
155
162
  converse(options: ConverseOptions<TAgentName>): Promise<ActorFlowVerdict>
156
- }
157
-
158
- /** Display/config metadata for an actor (from pikku.config.json) */
159
- export interface ScenarioActorConfig {
160
- email: string
161
- name?: string
162
- jobTitle?: string
163
- personality?: string
164
- /**
165
- * The persona this body is one of — the KIND of person, declared in
166
- * `scenarios.personas`. Most personas have exactly one actor and it is
167
- * materialised for them; a second body of the same persona is what tenant
168
- * isolation and peer-sharing scenarios are made of.
169
- */
170
- persona?: string
171
163
  /**
172
- * Scopes this actor holds, granted directly rather than through a role, and
173
- * the roles it belongs to. Pikku carries them; it never applies them — which
174
- * scope store exists and which roles have been created is the app's own, so
175
- * the app's seed reads these back off `scenarioActorConfigs` and grants them.
164
+ * The roles this person actually holds on the stage, read back after signing
165
+ * in what a run compares against the declaration before its first step.
166
+ *
167
+ * `null` when the target does not say. That is not the same as "no roles": a
168
+ * run that treats silence as an empty list refuses to start against every
169
+ * stage whose auth reports roles somewhere else, so the caller must decide
170
+ * whether it can verify at all.
176
171
  */
177
- scopes?: readonly string[]
178
- roles?: readonly string[]
172
+ sessionRoles(): Promise<string[] | null>
179
173
  }
180
174
 
181
- /** The injected `actors` service: actor name → actor. */
182
- export type ScenarioActors = Record<string, ScenarioActor>
175
+ /**
176
+ * A declared persona with its address filled in — what codegen writes and what
177
+ * a seed, a scenario run and a virtual-user run all read.
178
+ *
179
+ * The address is not declared. It is derived from the persona's id and the
180
+ * project's persona domain, so two people can never accidentally share one and
181
+ * sign in as the same user row — which would silently collapse exactly the
182
+ * isolation scenarios a second person exists for.
183
+ */
184
+ export type ResolvedPersona = PersonaMeta & { email: string }
185
+
186
+ /** The injected `personas` service: persona id → persona. */
187
+ export type ScenarioPersonas = Record<string, ScenarioPersona>
@@ -3,15 +3,11 @@ import type { PikkuRawWire } from '../types/core.types.js'
3
3
  export type PikkuUserIdResolver = (wire: PikkuRawWire) => string | undefined
4
4
 
5
5
  export const defaultPikkuUserIdResolver: PikkuUserIdResolver = (wire) => {
6
- // Explicit pikkuUserId on wire (set by earlier middleware or runner)
7
6
  if (wire.pikkuUserId) return wire.pikkuUserId
8
- // Session userId (from auth middleware — user-defined session shape)
9
7
  const session = wire.session as Record<string, unknown> | undefined
10
8
  if (session?.userId && typeof session.userId === 'string')
11
9
  return session.userId
12
- // Queue job: carried in job metadata
13
10
  if (wire.queue?.pikkuUserId) return wire.queue.pikkuUserId
14
- // Workflow: carried in run wire metadata
15
11
  if (wire.workflow?.pikkuUserId) return wire.workflow.pikkuUserId
16
12
  return undefined
17
13
  }
@@ -14,6 +14,7 @@ import { InMemoryQueueService } from './in-memory-queue-service.js'
14
14
  import { wireQueueWorker } from '../wirings/queue/queue-runner.js'
15
15
  import { resetPikkuState, pikkuState } from '../pikku-state.js'
16
16
  import type { JobOptions } from '../wirings/queue/queue.types.js'
17
+ import { createSecretValue } from '../secret-value.js'
17
18
 
18
19
  const noopLogger = { error() {}, info() {}, warn() {}, debug() {} }
19
20
 
@@ -132,7 +133,7 @@ describe('QueueWebhookService.send', () => {
132
133
  secrets: {
133
134
  getSecret: async (key: string) => {
134
135
  assert.equal(key, 'WEBHOOK_SIGNING_KEY')
135
- return 'resolved-key'
136
+ return createSecretValue('resolved-key')
136
137
  },
137
138
  },
138
139
  })
@@ -13,23 +13,11 @@ import {
13
13
  WebhookService,
14
14
  } from './webhook-service.js'
15
15
 
16
- /** Cap on the response body captured on a failed attempt. */
17
16
  const MAX_CAPTURED_RESPONSE_BODY = 2_000
18
17
 
19
- /**
20
- * Default {@link WebhookService} implementation: serializes and signs the
21
- * payload, then enqueues a delivery job onto the `pikku-outgoing-webhooks`
22
- * queue. The signature is computed at enqueue time so the signing key never
23
- * enters the queue payload; the actual HTTP POST happens in
24
- * {@link pikkuWebhookWorkerFunc}, and the queue's `attempts`/`backoff`
25
- * options drive retries.
26
- */
18
+ // knowledge: decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md
27
19
  export class QueueWebhookService extends WebhookService {
28
- /**
29
- * The queue is a constructor dependency rather than a `getSingletonServices()`
30
- * lookup so that a project wiring up outgoing webhooks without a queue fails
31
- * to compile, instead of throwing on the first `send()`.
32
- */
20
+ // knowledge: decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md
33
21
  constructor(protected queueService: QueueService) {
34
22
  super()
35
23
  }
@@ -45,10 +33,8 @@ export class QueueWebhookService extends WebhookService {
45
33
  }
46
34
 
47
35
  /**
48
- * Build the signed job payload and its retry options the shared work a
49
- * `send()` does before enqueueing. Factored out (and `protected`) so a
50
- * store-backed subclass can persist a delivery row and attach its
51
- * `deliveryId` without re-implementing signing or the retry policy.
36
+ * `protected` so a store-backed subclass can persist a delivery row and attach
37
+ * its `deliveryId` without re-implementing signing or the retry policy.
52
38
  */
53
39
  protected async prepareDelivery(
54
40
  input: SendWebhookInput
@@ -65,8 +51,8 @@ export class QueueWebhookService extends WebhookService {
65
51
 
66
52
  let secret = input.secret
67
53
  if (secret === undefined && webhookConfig?.secret) {
68
- // Naive read — any caching is the secret service's concern, not ours.
69
- secret = await services.secrets.getSecret(webhookConfig.secret)
54
+ // Naive read: caching is the secret service's concern, not ours.
55
+ secret = (await services.secrets.getSecret(webhookConfig.secret)).reveal()
70
56
  if (!secret) {
71
57
  services.logger.error(
72
58
  `Webhook signing secret '${webhookConfig.secret}' (config.webhook.secret) resolved to nothing — outgoing webhooks will be sent UNSIGNED.`
@@ -89,13 +75,7 @@ export class QueueWebhookService extends WebhookService {
89
75
  return { jobData, options: this.resolveJobOptions(input) }
90
76
  }
91
77
 
92
- /**
93
- * Resolve a delivery's retry policy into queue job options, mirroring the
94
- * workflow service: per-call values win over `config.webhook` defaults, an
95
- * explicitly-set `retries` (including 0) is always honored, and `attempts`
96
- * is ALWAYS passed so the queue can never fall back to its own default.
97
- * Backoff is exponential unless a concrete `retryDelay` selects a fixed one.
98
- */
78
+ // knowledge: decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md
99
79
  private resolveJobOptions(input: SendWebhookInput): JobOptions {
100
80
  const webhookConfig = getSingletonServices().config?.webhook
101
81
  const retries =
@@ -111,18 +91,7 @@ export class QueueWebhookService extends WebhookService {
111
91
  }
112
92
  }
113
93
 
114
- /**
115
- * Queue worker for the `pikku-outgoing-webhooks` queue: POSTs the delivery to its
116
- * target URL. Any non-2xx response (or network error) throws so the queue
117
- * retries the job according to the `attempts`/`backoff` set at enqueue time;
118
- * the queue runner logs each failed attempt.
119
- *
120
- * A `deliveryId` is only present when a store-backed `webhookService` (e.g.
121
- * `KyselyWebhookService`) enqueued the job, so each attempt (success or failure)
122
- * is persisted via `webhookService.recordAttempt` before the throw — the console
123
- * delivery history reflects every try, not just the outcome. The queue-only
124
- * default never sets a `deliveryId`, so its base `recordAttempt` is never hit.
125
- */
94
+ // knowledge: decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md
126
95
  export async function pikkuWebhookWorkerFunc(
127
96
  services: { logger: Logger; webhookService?: WebhookService },
128
97
  { url, body, headers, deliveryId }: WebhookJobData
@@ -136,8 +105,8 @@ export async function pikkuWebhookWorkerFunc(
136
105
  try {
137
106
  allowedHosts = getSingletonServices().config?.webhook?.allowedHosts
138
107
  } catch {
139
- // Singleton services not initialised (e.g. a bare worker invocation) fall
140
- // back to the default private-host block with no allowlist.
108
+ // Uninitialised singletons (a bare worker invocation): fall back to the
109
+ // default private-host block rather than failing the delivery.
141
110
  }
142
111
 
143
112
  try {
@@ -165,7 +134,6 @@ export async function pikkuWebhookWorkerFunc(
165
134
  }
166
135
 
167
136
  if (deliveryId && services.webhookService) {
168
- // Best-effort history: a store failure must not mask the delivery result.
169
137
  await services.webhookService
170
138
  .recordAttempt(deliveryId, { statusCode, responseBody, error, delivered })
171
139
  .catch((storeError) =>
@@ -1,47 +1,21 @@
1
1
  import type { CoreUserSession } from '../types/core.types.js'
2
2
 
3
- /**
4
- * Minimal metadata for listing scheduled tasks
5
- */
6
3
  export interface ScheduledTaskSummary {
7
- /** Unique task ID */
8
4
  taskId: string
9
- /** RPC function name to invoke */
10
5
  rpcName: string
11
- /** Scheduled execution time */
12
6
  scheduledFor: Date
13
7
  }
14
8
 
15
- /**
16
- * Full metadata for a scheduled task retrieved from the queue
17
- */
18
9
  export interface ScheduledTaskInfo extends ScheduledTaskSummary {
19
- /** Data to pass to the RPC function */
20
10
  data?: any
21
- /** User session */
22
11
  session?: CoreUserSession
23
- /** Task status */
24
12
  status?: 'scheduled' | 'active' | 'completed' | 'failed'
25
13
  }
26
14
 
27
- /**
28
- * Abstract scheduler service for persistent scheduled task management
29
- * Implementations use queue backends (pg-boss, BullMQ) for distributed scheduling
30
- */
31
15
  export abstract class SchedulerService {
32
- /**
33
- * Initialize the scheduler service
34
- */
35
16
  abstract init(): Promise<void>
36
17
 
37
- /**
38
- * Schedule a one-off delayed RPC call
39
- * @param delay - Delay before execution (number in milliseconds or duration string like "5h", "30m")
40
- * @param rpcName - RPC function name to invoke
41
- * @param data - Data to pass to the RPC function
42
- * @param session - Optional user session
43
- * @returns Task ID
44
- */
18
+ /** `delay` is milliseconds as a number, or a duration string such as `"5h"` / `"30m"`. */
45
19
  abstract scheduleRPC(
46
20
  delay: number | string,
47
21
  rpcName: string,
@@ -49,38 +23,15 @@ export abstract class SchedulerService {
49
23
  session?: CoreUserSession
50
24
  ): Promise<string>
51
25
 
52
- /**
53
- * Unschedule a task by ID
54
- * @param taskId - Task ID
55
- * @returns Success status
56
- */
57
26
  abstract unschedule(taskId: string): Promise<boolean>
58
27
 
59
- /**
60
- * Get a scheduled task by ID with full details
61
- * @param taskId - Task ID
62
- * @returns Task info or null if not found
63
- */
64
28
  abstract getTask(taskId: string): Promise<ScheduledTaskInfo | null>
65
29
 
66
- /**
67
- * Get all scheduled tasks with minimal info
68
- * @returns Array of task summaries with taskId, rpcName, and schedule
69
- */
70
30
  abstract getAllTasks(): Promise<ScheduledTaskSummary[]>
71
31
 
72
- /**
73
- * Close any open connections
74
- */
75
32
  abstract close(): Promise<void>
76
33
 
77
- /**
78
- * Start recurring scheduled tasks
79
- */
80
34
  async start(): Promise<void> {}
81
35
 
82
- /**
83
- * Stop recurring scheduled tasks
84
- */
85
36
  async stop(): Promise<void> {}
86
37
  }
@@ -1,33 +1,10 @@
1
- /**
2
- * Interface for a schema service that handles schema compilation, validation, and management.
3
- */
4
1
  export interface SchemaService {
5
- /**
6
- * Compiles a schema with the provided name and value, making it available for use.
7
- * @param {string} name - The unique name for the schema.
8
- * @param {any} value - The schema definition or configuration to be compiled.
9
- * @returns {Promise<void> | void} A promise if asynchronous, or void if synchronous.
10
- */
11
2
  compileSchema: (name: string, value: any) => Promise<void> | void
12
3
 
13
- /**
14
- * Validates data against a specified schema.
15
- * @param {string} schema - The name of the schema to validate against.
16
- * @param {any} data - The data to validate against the schema.
17
- * @returns {Promise<void> | void} A promise if asynchronous, or void if synchronous.
18
- */
19
4
  validateSchema: (schema: string, data: any) => Promise<void> | void
20
5
 
21
- /**
22
- * Retrieves a set of all registered schema names.
23
- * @returns {Set<string>} A set containing the names of all available schemas.
24
- */
25
6
  getSchemaNames: () => Set<string>
26
7
 
27
- /**
28
- * Retrieves the property keys from a compiled JSON schema.
29
- * @param {string} schemaName - The name of the schema.
30
- * @returns {string[]} An array of property keys, or empty array if schema not found.
31
- */
8
+ /** Empty when the schema is not registered. */
32
9
  getSchemaKeys: (schemaName: string) => string[]
33
10
  }