@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
@@ -1,9 +1,11 @@
1
+ import { beginChanges } from './abort-scope.js'
1
2
  import { runMiddleware, combineMiddleware } from '../middleware-runner.js'
2
3
  import {
3
4
  combineChannelMiddleware,
4
5
  wrapChannelWithMiddleware,
5
6
  } from '../wirings/channel/channel-middleware-runner.js'
6
7
  import { runPermissions } from '../permissions.js'
8
+ import { withoutSecrets } from '../services/secretless.js'
7
9
  import { pikkuState } from '../pikku-state.js'
8
10
  import {
9
11
  applyDefaultsFromSchema,
@@ -39,6 +41,11 @@ import {
39
41
  } from '../services/audit-service.js'
40
42
  import { rpcService } from '../wirings/rpc/rpc-runner.js'
41
43
  import { getOrCreatePackageSingletonServices } from '../wirings/rpc/addon-runner.js'
44
+ import {
45
+ resolveAddonAuth,
46
+ resolveAddonScopes,
47
+ resolveAddonTagMiddleware,
48
+ } from '../wirings/rpc/wire-addon.js'
42
49
  import type { AddonInstance } from '../wirings/rpc/addon-runner.js'
43
50
  import { closeWireServices } from '../utils.js'
44
51
 
@@ -170,7 +177,8 @@ export const runPikkuFunc = async <In = any, Out = any>(
170
177
 
171
178
  const resolvedFunctionId = funcMeta.pikkuFuncId ?? funcName
172
179
 
173
- // For addon packages, get or create their singleton services
180
+ const keepsSecrets = funcMeta.secretBroker === true
181
+
174
182
  const resolvedSingletonServices = packageName
175
183
  ? await getOrCreatePackageSingletonServices(
176
184
  packageName,
@@ -179,7 +187,6 @@ export const runPikkuFunc = async <In = any, Out = any>(
179
187
  )
180
188
  : singletonServices
181
189
 
182
- // Get the package's createWireServices if available
183
190
  let resolvedCreateWireServices = createWireServices
184
191
  if (packageName) {
185
192
  const factories = pikkuState(packageName, 'package', 'factories')
@@ -203,11 +210,9 @@ export const runPikkuFunc = async <In = any, Out = any>(
203
210
  )
204
211
  : wire
205
212
 
206
- // Set up credential wire service early so middleware can use setCredential.
207
- // An addon instance with credentialOverrides always gets a fresh alias-aware
208
- // service so its logical credential names resolve to instance-specific ones,
209
- // even when a parent credential service is already present on the wire.
210
- // Otherwise skip if already set up (e.g. addon functions reuse the parent wire).
213
+ // Set up early so middleware can use setCredential. An addon instance with
214
+ // credentialOverrides always gets a fresh alias-aware service, even when a
215
+ // parent credential service is already present on the wire.
211
216
  if (addonInstance?.credentialOverrides) {
212
217
  // Credentials belong to the consuming project, so resolve them via the
213
218
  // project's credentialService (the addon's own singletons may not carry it).
@@ -251,7 +256,6 @@ export const runPikkuFunc = async <In = any, Out = any>(
251
256
  invocationWire.addonNamespace = addonInstance.namespace
252
257
  }
253
258
 
254
- // Helper function to run permissions and execute the function
255
259
  const executeFunction = async () => {
256
260
  await resolveSession(
257
261
  invocationWire,
@@ -270,7 +274,11 @@ export const runPikkuFunc = async <In = any, Out = any>(
270
274
  const session = invocationWire.session
271
275
 
272
276
  if (funcMeta.sessionless) {
273
- if (wiringAuth === true || funcConfig.auth === true) {
277
+ if (
278
+ wiringAuth === true ||
279
+ funcConfig.auth === true ||
280
+ resolveAddonAuth(packageName, addonInstance?.namespace)
281
+ ) {
274
282
  if (!session) {
275
283
  throw new ForbiddenError('Authentication required')
276
284
  }
@@ -290,32 +298,38 @@ export const runPikkuFunc = async <In = any, Out = any>(
290
298
  throw new ReadonlySessionError()
291
299
  }
292
300
 
293
- // Scopes gate before the data is evaluated: they depend only on the
294
- // session, so a denied request never pays to parse or validate its body.
295
- // Scopes are an AND gate and stay separate from runPermissions, which
296
- // evaluates the function's own OR-groups against request data.
297
- verifyScopes(funcConfig.scopes ?? funcMeta.scopes, session)
301
+ // Only mutating functions get a checkpoint. A read has nothing to declare,
302
+ // and offering it there would invite the contradiction of a `readonly`
303
+ // function announcing where its changes begin.
304
+ if (!funcMeta.readonly) {
305
+ invocationWire.beginChanges = beginChanges
306
+ }
307
+
308
+ // knowledge: decisions/security/addon-scopes-are-resolved-where-the-function-runs.md
309
+ const addonScopes = resolveAddonScopes(
310
+ packageName,
311
+ addonInstance?.namespace
312
+ )
313
+ const functionScopes = funcConfig.scopes ?? funcMeta.scopes
314
+ verifyScopes(
315
+ addonScopes.length > 0
316
+ ? [...addonScopes, ...(functionScopes ?? [])]
317
+ : functionScopes,
318
+ session
319
+ )
298
320
 
299
- // Evaluate the data from the lazy function
300
321
  let actualData = await data()
301
322
 
302
- // Validate and coerce data if schema is defined
303
323
  const inputSchemaName = funcMeta.inputSchemaName
304
324
  if (inputSchemaName) {
305
- // Fill in schema defaults before anything reads the data. Unconditional:
306
- // a default belongs to the schema, not to the transport the call arrived
307
- // on. Runs before coercion so a defaulted value and a supplied one are
308
- // treated identically from here on.
309
325
  actualData = applyDefaultsFromSchema(
310
326
  inputSchemaName,
311
327
  actualData,
312
328
  packageName
313
329
  )
314
- // Coerce (top level) data types before validation (e.g. string→array, string→date)
315
330
  if (coerceDataFromSchema) {
316
331
  coerceTopLevelDataFromSchema(inputSchemaName, actualData, packageName)
317
332
  }
318
- // Validate request data against the defined schema, if any
319
333
  await validateSchema(
320
334
  resolvedSingletonServices.logger,
321
335
  resolvedSingletonServices.schema,
@@ -327,7 +341,12 @@ export const runPikkuFunc = async <In = any, Out = any>(
327
341
 
328
342
  await runPermissions({
329
343
  funcPermissions: funcConfig.permissions,
330
- services: resolvedSingletonServices,
344
+ services: keepsSecrets
345
+ ? resolvedSingletonServices
346
+ : (withoutSecrets(
347
+ resolvedSingletonServices,
348
+ 'a permission'
349
+ ) as CoreSingletonServices),
331
350
  wire: invocationWire as any,
332
351
  data: actualData,
333
352
  packageName,
@@ -344,13 +363,7 @@ export const runPikkuFunc = async <In = any, Out = any>(
344
363
  wireServices && Object.keys(wireServices).length > 0
345
364
  ? { ...resolvedSingletonServices, ...wireServices }
346
365
  : resolvedSingletonServices
347
- // The audit gate is per-function, but the auditLog wire service is
348
- // created per-transport-invocation — a nested/exposed-RPC call would
349
- // otherwise inherit an auditLog constructed while the OUTER wire's
350
- // audit was unset (e.g. the generated rpcCaller has no audit config),
351
- // silently dropping every write. Re-gate here: if this function
352
- // declares audit and the inherited auditLog wasn't built for this
353
- // invocation (config identity check), bind a fresh one to this wire.
366
+ // knowledge: decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md
354
367
  if (
355
368
  resolvedAuditConfig &&
356
369
  resolvedSingletonServices.audit &&
@@ -383,7 +396,11 @@ export const runPikkuFunc = async <In = any, Out = any>(
383
396
  configurable: true,
384
397
  enumerable: true,
385
398
  })
386
- return await funcConfig.func(services, actualData, invocationWire)
399
+ return await funcConfig.func(
400
+ keepsSecrets ? services : withoutSecrets(services, 'a pikku function'),
401
+ actualData,
402
+ invocationWire
403
+ )
387
404
  } finally {
388
405
  // Flush the runner-installed audit buffer before wire services close.
389
406
  await invocationAuditLog?.close()
@@ -393,9 +410,17 @@ export const runPikkuFunc = async <In = any, Out = any>(
393
410
  }
394
411
  }
395
412
 
413
+ const addonTagMiddleware = resolveAddonTagMiddleware(
414
+ packageName,
415
+ addonInstance?.namespace
416
+ )
417
+
396
418
  const allMiddleware = combineMiddleware(wireType, wireId, {
397
419
  wireInheritedMiddleware: inheritedMiddleware,
398
- wireMiddleware,
420
+ wireMiddleware:
421
+ addonTagMiddleware.length > 0
422
+ ? [...addonTagMiddleware, ...(wireMiddleware ?? [])]
423
+ : wireMiddleware,
399
424
  funcInheritedMiddleware: funcMeta.middleware,
400
425
  funcMiddleware: funcConfig.middleware,
401
426
  packageName,
@@ -447,5 +472,10 @@ export const runPikkuFunc = async <In = any, Out = any>(
447
472
  } else {
448
473
  invocationWire.audit = previousAudit
449
474
  }
475
+ if (previousAddonNamespace === undefined) {
476
+ delete (invocationWire as any).addonNamespace
477
+ } else {
478
+ invocationWire.addonNamespace = previousAddonNamespace
479
+ }
450
480
  }
451
481
  }
@@ -1,15 +1,18 @@
1
1
  import type {
2
2
  CoreServices,
3
- CoreSingletonServices,
3
+ CoreSecretlessSingletonServices,
4
4
  CoreUserSession,
5
5
  CorePikkuMiddleware,
6
6
  PikkuWire,
7
7
  PickRequired,
8
+ SecretlessServices,
8
9
  } from '../types/core.types.js'
9
10
  import type { PikkuRPC } from '../wirings/rpc/rpc-types.js'
10
11
  import type { StandardSchemaV1 } from '@standard-schema/spec'
11
12
  import type { PikkuError } from '../errors/error-handler.js'
12
13
  import type { CoreNodeConfig } from '../wirings/node/node.types.js'
14
+ import type { ScenarioSurface } from '../wirings/workflow/scenario-step.types.js'
15
+ import type { Safe } from '../secret-value.js'
13
16
 
14
17
  /**
15
18
  * @deprecated Use StandardSchemaV1 from @standard-schema/spec instead.
@@ -17,18 +20,11 @@ import type { CoreNodeConfig } from '../wirings/node/node.types.js'
17
20
  */
18
21
  export type ZodLike<T = any> = StandardSchemaV1<T, T>
19
22
 
20
- /**
21
- * Represents a core API function that performs an operation using core services and a user session.
22
- *
23
- * @template In - The input type.
24
- * @template Out - The output type.
25
- * @template Services - The services type, defaults to `CoreServices`.
26
- * @template Wire - The wire type, defaults to `PikkuWire<In, Out>`.
27
- */
28
23
  export type CorePikkuFunction<
29
24
  In,
30
25
  Out,
31
- Services extends CoreSingletonServices = CoreServices,
26
+ Services extends CoreSecretlessSingletonServices =
27
+ SecretlessServices<CoreServices>,
32
28
  Session extends CoreUserSession = CoreUserSession,
33
29
  Wire extends PikkuWire<In, Out, true, Session, PikkuRPC, null, string> =
34
30
  PikkuWire<In, Out, true, Session>,
@@ -36,20 +32,15 @@ export type CorePikkuFunction<
36
32
  services: Services,
37
33
  data: In,
38
34
  wire: Wire
39
- ) => Wire['channel'] extends null ? Promise<Out> : Promise<Out> | Promise<void>
35
+ ) => Wire['channel'] extends null
36
+ ? Promise<Safe<Out>>
37
+ : Promise<Safe<Out>> | Promise<void>
40
38
 
41
- /**
42
- * Represents a core API function that can be used without a session.
43
- *
44
- * @template In - The input type.
45
- * @template Out - The output type.
46
- * @template Services - The services type, defaults to `CoreServices`.
47
- * @template Wire - The wire type, defaults to `PikkuWire<In, Out>`.
48
- */
49
39
  export type CorePikkuFunctionSessionless<
50
40
  In,
51
41
  Out,
52
- Services extends CoreSingletonServices = CoreServices,
42
+ Services extends CoreSecretlessSingletonServices =
43
+ SecretlessServices<CoreServices>,
53
44
  Session extends CoreUserSession = CoreUserSession,
54
45
  Wire extends PikkuWire<In, Out, false, Session, PikkuRPC, null, string> =
55
46
  PikkuWire<In, Out, false, Session>,
@@ -57,71 +48,34 @@ export type CorePikkuFunctionSessionless<
57
48
  services: Services,
58
49
  data: In,
59
50
  wire: Wire
60
- ) => Wire['channel'] extends null ? Promise<Out> : Promise<Out> | Promise<void>
51
+ ) => Wire['channel'] extends null
52
+ ? Promise<Safe<Out>>
53
+ : Promise<Safe<Out>> | Promise<void>
61
54
 
62
- /**
63
- * Represents a function that checks permissions for a given operation.
64
- *
65
- * @template In - The input type.
66
- * @template Services - The services type, defaults to `CoreServices`.
67
- * @template Session - The session type, defaults to `CoreUserSession`.
68
- */
69
55
  export type CorePikkuPermission<
70
56
  In = any,
71
- Services extends CoreSingletonServices = CoreServices,
57
+ Services extends CoreSecretlessSingletonServices =
58
+ SecretlessServices<CoreServices>,
72
59
  Wire extends PikkuWire<In, never, false, any, PikkuRPC, never, never> =
73
60
  PikkuWire<In, never, false, any, PikkuRPC, never, never>,
74
61
  > = (services: Services, data: In, wire: Wire) => Promise<boolean>
75
62
 
76
- /**
77
- * Configuration object for creating a permission with metadata
78
- *
79
- * @template In - The input type.
80
- * @template Services - The services type, defaults to `CoreServices`.
81
- * @template Session - The session type, defaults to `CoreUserSession`.
82
- */
83
63
  export type CorePikkuPermissionConfig<
84
64
  In = any,
85
- Services extends CoreSingletonServices = CoreServices,
65
+ Services extends CoreSecretlessSingletonServices =
66
+ SecretlessServices<CoreServices>,
86
67
  Wire extends PikkuWire<In, never, false, any, PikkuRPC, never, never> =
87
68
  PikkuWire<In, never, false, any, PikkuRPC, never, never>,
88
69
  > = {
89
- /** The permission function */
90
70
  func: CorePikkuPermission<In, Services, Wire>
91
- /** Optional human-readable name for the permission */
92
71
  name?: string
93
- /** Optional description of what the permission checks */
94
72
  description?: string
95
73
  }
96
74
 
97
- /**
98
- * Factory function for creating permissions with tree-shaking support
99
- * Supports both direct function and configuration object syntax
100
- *
101
- * @example
102
- * ```typescript
103
- * // Direct function syntax
104
- * export const adminPermission = pikkuPermission(
105
- * async ({ logger }, _data, { getSession }) => {
106
- * const currentSession = await getSession()
107
- * return currentSession?.role === 'admin'
108
- * }
109
- * )
110
- *
111
- * // Configuration object syntax with metadata
112
- * export const adminPermission = pikkuPermission({
113
- * name: 'Admin Permission',
114
- * description: 'Checks if user has admin role',
115
- * func: async ({ logger }, _data, { getSession }) => {
116
- * const currentSession = await getSession()
117
- * return currentSession?.role === 'admin'
118
- * }
119
- * })
120
- * ```
121
- */
122
75
  export const pikkuPermission = <
123
76
  In = any,
124
- Services extends CoreSingletonServices = CoreServices,
77
+ Services extends CoreSecretlessSingletonServices =
78
+ SecretlessServices<CoreServices>,
125
79
  Wire extends PickRequired<
126
80
  PikkuWire<In, never, false, any, PikkuRPC, never, never>,
127
81
  'session'
@@ -137,41 +91,14 @@ export const pikkuPermission = <
137
91
  return typeof permission === 'function' ? permission : permission.func
138
92
  }
139
93
 
140
- /**
141
- * A factory function that takes input and returns a permission
142
- * Used when permissions need configuration/input parameters
143
- *
144
- * @template In - The input type for the factory.
145
- * @template Services - The services type, defaults to `CoreServices`.
146
- * @template Session - The session type, defaults to `CoreUserSession`.
147
- */
148
94
  export type CorePikkuPermissionFactory<
149
95
  In = any,
150
- Services extends CoreSingletonServices = CoreServices,
96
+ Services extends CoreSecretlessSingletonServices =
97
+ SecretlessServices<CoreServices>,
151
98
  Wire extends PikkuWire<In, never, false, any, PikkuRPC, never, never> =
152
99
  PikkuWire<In, never, false, any, PikkuRPC, never, never>,
153
100
  > = (input: In) => CorePikkuPermission<any, Services, Wire>
154
101
 
155
- /**
156
- * Factory function for creating permission factories
157
- * Use this when your permission needs configuration/input parameters
158
- *
159
- * @example
160
- * ```typescript
161
- * export const requireRole = pikkuPermissionFactory<{ role: string }>(({
162
- * role
163
- * }) => {
164
- * return pikkuPermission(async ({ logger }, data, { getSession }) => {
165
- * const currentSession = await getSession()
166
- * if (!currentSession || currentSession.role !== role) {
167
- * logger.warn(`Permission denied: required role '${role}'`)
168
- * return false
169
- * }
170
- * return true
171
- * })
172
- * })
173
- * ```
174
- */
175
102
  export const pikkuPermissionFactory = <In = any>(
176
103
  factory: CorePikkuPermissionFactory<In>
177
104
  ): CorePikkuPermissionFactory<In> => {
@@ -179,33 +106,19 @@ export const pikkuPermissionFactory = <In = any>(
179
106
  }
180
107
 
181
108
  /**
182
- * A function that generates a human-readable description of a pending approval action.
183
- * Used by AI agents to show meaningful approval prompts instead of raw tool arguments.
184
- *
185
- * @template In - The input type (same as the function it describes).
186
- * @template Services - The services type, defaults to `CoreSingletonServices`.
109
+ * Renders a human-readable approval prompt for an AI agent, in place of the
110
+ * raw tool arguments.
187
111
  */
188
112
  export type CorePikkuApprovalDescription<
189
113
  In = any,
190
- Services extends CoreSingletonServices = CoreSingletonServices,
114
+ Services extends CoreSecretlessSingletonServices =
115
+ CoreSecretlessSingletonServices,
191
116
  > = (services: Services, data: In) => Promise<string>
192
117
 
193
- /**
194
- * Factory function for creating approval description functions with tree-shaking support.
195
- *
196
- * @example
197
- * ```typescript
198
- * export const deleteTodoApproval = pikkuApprovalDescription(
199
- * async ({ todoStore }, { id }) => {
200
- * const todo = await todoStore.get(id)
201
- * return `Delete todo: "${todo.title}"`
202
- * }
203
- * )
204
- * ```
205
- */
206
118
  export const pikkuApprovalDescription = <
207
119
  In = any,
208
- Services extends CoreSingletonServices = CoreSingletonServices,
120
+ Services extends CoreSecretlessSingletonServices =
121
+ CoreSecretlessSingletonServices,
209
122
  >(
210
123
  fn: CorePikkuApprovalDescription<In, Services>
211
124
  ): CorePikkuApprovalDescription<In, Services> => {
@@ -213,12 +126,14 @@ export const pikkuApprovalDescription = <
213
126
  }
214
127
 
215
128
  export type CorePikkuAuth<
216
- Services extends CoreSingletonServices = CoreServices,
129
+ Services extends CoreSecretlessSingletonServices =
130
+ SecretlessServices<CoreServices>,
217
131
  Session extends CoreUserSession = CoreUserSession,
218
132
  > = (services: Services, session: Session) => Promise<boolean> | boolean
219
133
 
220
134
  export type CorePikkuAuthConfig<
221
- Services extends CoreSingletonServices = CoreServices,
135
+ Services extends CoreSecretlessSingletonServices =
136
+ SecretlessServices<CoreServices>,
222
137
  Session extends CoreUserSession = CoreUserSession,
223
138
  > = {
224
139
  func: CorePikkuAuth<Services, Session>
@@ -227,7 +142,8 @@ export type CorePikkuAuthConfig<
227
142
  }
228
143
 
229
144
  export const pikkuAuth = <
230
- Services extends CoreSingletonServices = CoreServices,
145
+ Services extends CoreSecretlessSingletonServices =
146
+ SecretlessServices<CoreServices>,
231
147
  Session extends CoreUserSession = CoreUserSession,
232
148
  >(
233
149
  auth:
@@ -249,9 +165,9 @@ export type CorePermissionGroup<PikkuPermission = CorePikkuPermission<any>> =
249
165
  | undefined
250
166
 
251
167
  /**
252
- * A lifecycle hook: the same call signature as the function it hangs off, but
253
- * its return value is discarded. A hook is setup/teardown, not a step — it has
254
- * no id, no meta and no schema, so it is never recorded and never replayed.
168
+ * A lifecycle hook: same call signature as the function it hangs off, return
169
+ * value discarded. Setup/teardown, not a step — no id, no meta, no schema, so
170
+ * it is never recorded and never replayed.
255
171
  */
256
172
  export type CorePikkuFunctionHook<Services = any, Data = any, Wire = any> = (
257
173
  services: Services,
@@ -273,15 +189,26 @@ export type CorePikkuFunctionConfig<
273
189
  OutputSchema extends StandardSchemaV1 | undefined = undefined,
274
190
  Scope extends string = string,
275
191
  > = {
276
- /** Short human-readable name (e.g. "Create Todo") */
277
192
  title?: string
278
- /** Longer-form description of what the function does */
279
193
  description?: string
280
194
  /** Explicit logical name override; lets multiple exports share a versioned base */
281
195
  override?: string
282
196
  version?: number
283
197
  tags?: string[]
284
198
  expose?: boolean
199
+ /**
200
+ * The permission check for this function lives in its body — verifying a
201
+ * signed token, checking a webhook signature, matching an invite code — so
202
+ * it is not open despite declaring no session, scope or permission.
203
+ *
204
+ * A last resort. Prefer `permissions`, which are declared, inspectable, and
205
+ * reusable; reach for this only when the check cannot be expressed as one.
206
+ *
207
+ * Purely declarative — it grants nothing, and asserting it falsely disables
208
+ * the audit that would have caught the mistake. Requires
209
+ * `allow.permissionsInBody` in `pikku.config.json`.
210
+ */
211
+ permissionsInBody?: boolean
285
212
  remote?: boolean
286
213
  mcp?: boolean
287
214
  readonly?: boolean
@@ -293,8 +220,12 @@ export type CorePikkuFunctionConfig<
293
220
  workflowRetries?: number
294
221
  /** Timeout for this function when used as a workflow step (e.g. '30s', '5m'). */
295
222
  workflowTimeout?: string
296
- /** Scenario steps only: this step drives a browser, so the runner must provision one before calling it. */
297
- browser?: boolean
223
+ /**
224
+ * Scenario steps only: which surfaces this step declares a binding for. The
225
+ * runner uses it to pick a binding, decide whether to provision a browser,
226
+ * and report how much of the flow each surface actually covers.
227
+ */
228
+ surfaces?: ScenarioSurface[]
298
229
  audit?:
299
230
  | boolean
300
231
  | {
@@ -309,26 +240,23 @@ export type CorePikkuFunctionConfig<
309
240
  */
310
241
  before?: CorePikkuFunctionHook
311
242
  /**
312
- * Scenarios only: always runs after the scenario body, in a `finally`.
313
- * Throwing fails a run that would otherwise have passed; on an
314
- * already-failed run it attaches as the `cause` and never replaces the
315
- * original error.
243
+ * Scenarios only: always runs after the body, in a `finally`. Throwing fails
244
+ * an otherwise-passing run; on an already-failed run it attaches as `cause`
245
+ * and never replaces the original error.
316
246
  */
317
247
  after?: CorePikkuFunctionHook
318
248
  /**
319
- * Scenarios only: why this scenario is held out of a default run. It is
320
- * reported as skipped rather than quietly omitted, and naming it directly
321
- * with `--flows` runs it anyway.
249
+ * Scenarios only: why this scenario is held out of a default run. Reported
250
+ * as skipped rather than quietly omitted; naming it in `--flows` runs it.
322
251
  */
323
252
  skip?: string
324
253
  auth?: boolean
325
254
  /**
326
- * Scopes the session must hold to run this function. All of them are
327
- * required (AND), and they are checked before `permissions` unlike
328
- * permissions, which OR together, a scope can only narrow access.
329
- *
330
- * Narrowed to the generated `ScopeId` union in a project's own
331
- * `pikku-types.gen.ts`, so an undeclared scope is a compile error.
255
+ * Scopes the session must hold; all are required (AND) and checked before
256
+ * `permissions`, which OR together a scope can only narrow access.
257
+ * Narrowed to the generated `ScopeId` union, so an undeclared scope is a
258
+ * compile error. Requires a session — see
259
+ * {@link CorePikkuSessionlessFunctionConfig}.
332
260
  */
333
261
  scopes?: Scope[]
334
262
  permissions?: CorePermissionGroup<PikkuPermission>
@@ -338,3 +266,32 @@ export type CorePikkuFunctionConfig<
338
266
  node?: CoreNodeConfig
339
267
  errors?: Array<typeof PikkuError>
340
268
  }
269
+
270
+ /**
271
+ * {@link CorePikkuFunctionConfig} for a function that runs without a session.
272
+ *
273
+ * Identical, minus `scopes`. Scopes are AND-ed and `verifyScopes` fails closed,
274
+ * so an anonymous caller holds none and satisfies none — a sessionless function
275
+ * with scopes rejects every caller it exists to serve. Gate it with
276
+ * `permissions`, which receive the optional session and may pass anonymous.
277
+ */
278
+ export type CorePikkuSessionlessFunctionConfig<
279
+ PikkuFunction extends CorePikkuFunctionSessionless<any, any, any, any, any>,
280
+ PikkuPermission extends CorePikkuPermission<any, any, any> =
281
+ CorePikkuPermission<any>,
282
+ PikkuMiddleware extends CorePikkuMiddleware<any, any> = CorePikkuMiddleware<
283
+ any,
284
+ any
285
+ >,
286
+ InputSchema extends StandardSchemaV1 | undefined = undefined,
287
+ OutputSchema extends StandardSchemaV1 | undefined = undefined,
288
+ > = Omit<
289
+ CorePikkuFunctionConfig<
290
+ PikkuFunction,
291
+ PikkuPermission,
292
+ PikkuMiddleware,
293
+ InputSchema,
294
+ OutputSchema
295
+ >,
296
+ 'scopes'
297
+ >
@@ -9,6 +9,7 @@ export type {
9
9
  CorePikkuFunction,
10
10
  CorePikkuFunctionSessionless,
11
11
  CorePikkuFunctionConfig,
12
+ CorePikkuSessionlessFunctionConfig,
12
13
  CorePikkuAuth,
13
14
  CorePikkuAuthConfig,
14
15
  CorePikkuPermission,
@@ -1,15 +1,11 @@
1
1
  /**
2
- * Type-level tests for list-function primitives.
3
- *
4
- * No runtime assertions — the point is that valid shapes compile and
5
- * invalid shapes fail with `@ts-expect-error`. The file is excluded
6
- * from `yarn build` via tsconfig's `**∕*.test.ts` pattern.
2
+ * Type-level tests: no runtime assertions — valid shapes must compile and
3
+ * invalid shapes must fail with `@ts-expect-error`. Excluded from `yarn build`
4
+ * via tsconfig's test-file pattern.
7
5
  */
8
6
 
9
7
  import type { ListInput, ListOutput, Filter } from './list.types.js'
10
8
 
11
- // -- ListInput ---------------------------------------------------------------
12
-
13
9
  type SessionFilter = {
14
10
  status?: string[]
15
11
  therapistId?: string
@@ -32,22 +28,18 @@ void _basic
32
28
  const _empty: ListInput = {}
33
29
  void _empty
34
30
 
35
- // sort.column must be from the declared union
36
31
  // @ts-expect-error — 'created_at' is not in SessionSort
37
32
  const _badSort: ListInput<SessionFilter, SessionSort> = {
38
33
  sort: [{ column: 'created_at', direction: 'asc' }],
39
34
  }
40
35
  void _badSort
41
36
 
42
- // sort.direction must be 'asc' or 'desc'
43
37
  // @ts-expect-error — 'descending' is not a valid direction
44
38
  const _badDirection: ListInput<SessionFilter, SessionSort> = {
45
39
  sort: [{ column: 'user', direction: 'descending' }],
46
40
  }
47
41
  void _badDirection
48
42
 
49
- // -- ListOutput --------------------------------------------------------------
50
-
51
43
  interface Session {
52
44
  id: string
53
45
  user: string
@@ -61,39 +53,29 @@ const _output: ListOutput<Session> = {
61
53
  }
62
54
  void _output
63
55
 
64
- // nextCursor is required (must be string or null, not undefined-only)
65
56
  // @ts-expect-error — missing nextCursor
66
57
  const _badOutput: ListOutput<Session> = {
67
58
  rows: [],
68
59
  }
69
60
  void _badOutput
70
61
 
71
- // -- Filter: leaves ----------------------------------------------------------
72
-
73
- // Simple equality
74
62
  const _leafEq: Filter<SessionFilter> = { therapistId: 'kim' }
75
63
  void _leafEq
76
64
 
77
- // Array = IN shorthand
78
65
  const _leafIn: Filter<SessionFilter> = { status: ['pending', 'processed'] }
79
66
  void _leafIn
80
67
 
81
- // Operator object
82
68
  const _leafOp: Filter<SessionFilter> = {
83
69
  uploadedAt: { gt: '2026-04-10', lte: '2026-04-17' },
84
70
  }
85
71
  void _leafOp
86
72
 
87
- // Null = IS NULL
88
73
  const _leafNull: Filter<SessionFilter> = { therapistId: null }
89
74
  void _leafNull
90
75
 
91
- // NOT on a value
92
76
  const _leafNot: Filter<SessionFilter> = { therapistId: { not: 'kim' } }
93
77
  void _leafNot
94
78
 
95
- // -- Filter: AND (array) -----------------------------------------------------
96
-
97
79
  const _and: Filter<SessionFilter> = [
98
80
  { status: ['pending'] },
99
81
  { therapistId: 'kim' },
@@ -101,16 +83,12 @@ const _and: Filter<SessionFilter> = [
101
83
  ]
102
84
  void _and
103
85
 
104
- // -- Filter: OR (object with arbitrary label keys) --------------------------
105
-
106
86
  const _or: Filter<SessionFilter> = {
107
87
  viaKim: { therapistId: 'kim' },
108
88
  viaPark: { therapistId: 'park' },
109
89
  }
110
90
  void _or
111
91
 
112
- // -- Filter: nested AND/OR ---------------------------------------------------
113
-
114
92
  const _nested: Filter<SessionFilter> = [
115
93
  { status: ['pending'] },
116
94
  {