@pikku/core 0.12.71 → 0.12.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (819) hide show
  1. package/CHANGELOG.md +848 -0
  2. package/dist/crypto-utils.d.ts +30 -5
  3. package/dist/crypto-utils.js +146 -41
  4. package/dist/dev/hot-reload.js +11 -30
  5. package/dist/dev/module-runner.d.ts +3 -7
  6. package/dist/dev/module-runner.js +4 -10
  7. package/dist/dev/reload-meta.d.ts +8 -20
  8. package/dist/dev/reload-meta.js +9 -29
  9. package/dist/errors/error-handler.d.ts +5 -30
  10. package/dist/errors/error-handler.js +16 -32
  11. package/dist/errors/errors.d.ts +32 -151
  12. package/dist/errors/errors.js +55 -157
  13. package/dist/function/abort-scope.d.ts +47 -0
  14. package/dist/function/abort-scope.js +63 -0
  15. package/dist/function/function-runner.js +40 -30
  16. package/dist/function/functions.types.d.ts +44 -136
  17. package/dist/function/functions.types.js +0 -58
  18. package/dist/function/list.types.d.ts +12 -62
  19. package/dist/function/list.types.js +4 -25
  20. package/dist/handle-error.d.ts +0 -11
  21. package/dist/handle-error.js +6 -18
  22. package/dist/index.d.ts +5 -2
  23. package/dist/index.js +4 -1
  24. package/dist/middleware/auth-apikey.d.ts +3 -18
  25. package/dist/middleware/auth-apikey.js +0 -17
  26. package/dist/middleware/auth-bearer.d.ts +6 -41
  27. package/dist/middleware/auth-bearer.js +3 -40
  28. package/dist/middleware/auth-cookie.d.ts +5 -27
  29. package/dist/middleware/auth-cookie.js +2 -26
  30. package/dist/middleware/cors.d.ts +7 -34
  31. package/dist/middleware/cors.js +7 -34
  32. package/dist/middleware/remote-auth.d.ts +3 -1
  33. package/dist/middleware/remote-auth.js +3 -2
  34. package/dist/middleware/telemetry.d.ts +8 -33
  35. package/dist/middleware/telemetry.js +2 -31
  36. package/dist/middleware-runner.d.ts +4 -55
  37. package/dist/middleware-runner.js +5 -74
  38. package/dist/permissions.d.ts +3 -44
  39. package/dist/permissions.js +19 -71
  40. package/dist/pikku-request.d.ts +0 -6
  41. package/dist/pikku-request.js +0 -6
  42. package/dist/pikku-state.d.ts +0 -26
  43. package/dist/pikku-state.js +2 -30
  44. package/dist/remote.d.ts +3 -5
  45. package/dist/remote.js +8 -7
  46. package/dist/schema.d.ts +7 -17
  47. package/dist/schema.js +30 -18
  48. package/dist/scopes.d.ts +4 -23
  49. package/dist/scopes.js +7 -48
  50. package/dist/services/ai-agent-runner-service.d.ts +20 -0
  51. package/dist/services/ai-embedding-service.d.ts +2 -25
  52. package/dist/services/audit-service.js +1 -2
  53. package/dist/services/content-service.d.ts +1 -46
  54. package/dist/services/credential-service.d.ts +3 -40
  55. package/dist/services/deployment-service.d.ts +3 -9
  56. package/dist/services/gateway-service.d.ts +0 -15
  57. package/dist/services/http-personas.d.ts +80 -0
  58. package/dist/services/http-personas.js +233 -0
  59. package/dist/services/in-memory-queue-service.d.ts +0 -14
  60. package/dist/services/in-memory-queue-service.js +1 -15
  61. package/dist/services/in-memory-trigger-service.d.ts +0 -18
  62. package/dist/services/in-memory-trigger-service.js +1 -18
  63. package/dist/services/in-memory-workflow-service.d.ts +0 -16
  64. package/dist/services/in-memory-workflow-service.js +4 -33
  65. package/dist/services/index.d.ts +5 -6
  66. package/dist/services/index.js +2 -5
  67. package/dist/services/istanbul-coverage-service.d.ts +1 -5
  68. package/dist/services/istanbul-coverage-service.js +2 -8
  69. package/dist/services/jwt-service.d.ts +1 -16
  70. package/dist/services/local-content.d.ts +13 -2
  71. package/dist/services/local-content.js +40 -13
  72. package/dist/services/local-gateway-service.d.ts +0 -16
  73. package/dist/services/local-gateway-service.js +2 -17
  74. package/dist/services/local-secrets.d.ts +0 -4
  75. package/dist/services/local-secrets.js +0 -4
  76. package/dist/services/logger-console.d.ts +3 -7
  77. package/dist/services/logger-console.js +3 -7
  78. package/dist/services/logger.d.ts +2 -37
  79. package/dist/services/meta-service.d.ts +23 -26
  80. package/dist/services/meta-service.js +22 -36
  81. package/dist/services/personas-service.d.ts +134 -0
  82. package/dist/services/personas-service.js +40 -0
  83. package/dist/services/pikku-user-id.js +0 -4
  84. package/dist/services/queue-webhook-service.d.ts +2 -36
  85. package/dist/services/queue-webhook-service.js +9 -41
  86. package/dist/services/scheduler-service.d.ts +1 -50
  87. package/dist/services/scheduler-service.js +0 -10
  88. package/dist/services/schema-service.d.ts +1 -24
  89. package/dist/services/scope-service.d.ts +49 -34
  90. package/dist/services/scoped-secret-service.d.ts +0 -4
  91. package/dist/services/scoped-secret-service.js +0 -4
  92. package/dist/services/secret-host-binding.d.ts +8 -0
  93. package/dist/services/secret-host-binding.js +36 -0
  94. package/dist/services/secret-service.d.ts +5 -33
  95. package/dist/services/secretless.d.ts +6 -0
  96. package/dist/services/secretless.js +21 -0
  97. package/dist/services/stub-tracker.d.ts +7 -18
  98. package/dist/services/stub-tracker.js +8 -18
  99. package/dist/services/system-role-guard.d.ts +33 -0
  100. package/dist/services/system-role-guard.js +38 -0
  101. package/dist/services/trigger-service.d.ts +0 -12
  102. package/dist/services/typed-secret-service.d.ts +0 -7
  103. package/dist/services/typed-secret-service.js +1 -7
  104. package/dist/services/v8-coverage-service.d.ts +2 -3
  105. package/dist/services/v8-coverage-service.js +1 -2
  106. package/dist/services/variables-service.d.ts +1 -8
  107. package/dist/services/webhook-service.d.ts +19 -63
  108. package/dist/services/webhook-service.js +6 -20
  109. package/dist/services/workflow-service.d.ts +3 -15
  110. package/dist/testing/service-tests.js +0 -17
  111. package/dist/time-utils.d.ts +0 -16
  112. package/dist/time-utils.js +1 -19
  113. package/dist/types/core.types.d.ts +99 -219
  114. package/dist/types/core.types.js +0 -42
  115. package/dist/types/state.types.d.ts +4 -9
  116. package/dist/utils/hmac.d.ts +4 -10
  117. package/dist/utils/hmac.js +4 -10
  118. package/dist/utils/safe-fetch.d.ts +7 -35
  119. package/dist/utils/safe-fetch.js +13 -53
  120. package/dist/utils.d.ts +1 -6
  121. package/dist/utils.js +6 -15
  122. package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
  123. package/dist/wirings/actor-flow/index.d.ts +0 -9
  124. package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
  125. package/dist/wirings/actor-flow/run-conversation.js +14 -7
  126. package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
  127. package/dist/wirings/ai-agent/ai-agent-agui.js +34 -12
  128. package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
  129. package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
  130. package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
  131. package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
  132. package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
  133. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
  134. package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
  135. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
  136. package/dist/wirings/ai-agent/ai-agent-prepare.js +58 -131
  137. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
  138. package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
  139. package/dist/wirings/ai-agent/ai-agent-runner.js +49 -20
  140. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
  141. package/dist/wirings/ai-agent/ai-agent-stream.js +153 -63
  142. package/dist/wirings/ai-agent/ai-agent.types.d.ts +84 -4
  143. package/dist/wirings/ai-agent/index.d.ts +6 -4
  144. package/dist/wirings/ai-agent/index.js +5 -4
  145. package/dist/wirings/ai-agent/voice-input.d.ts +39 -1
  146. package/dist/wirings/ai-agent/voice-input.js +46 -3
  147. package/dist/wirings/ai-agent/voice-output.d.ts +54 -1
  148. package/dist/wirings/ai-agent/voice-output.js +153 -50
  149. package/dist/wirings/channel/channel-common.d.ts +7 -20
  150. package/dist/wirings/channel/channel-common.js +7 -21
  151. package/dist/wirings/channel/channel-handler.js +25 -6
  152. package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
  153. package/dist/wirings/channel/channel-host-rpc.js +38 -0
  154. package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
  155. package/dist/wirings/channel/channel-middleware-runner.js +0 -12
  156. package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
  157. package/dist/wirings/channel/channel-rpc-registry.js +89 -0
  158. package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
  159. package/dist/wirings/channel/channel-rpc-responder.js +71 -0
  160. package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
  161. package/dist/wirings/channel/channel-rpc-service.js +106 -0
  162. package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
  163. package/dist/wirings/channel/channel-rpc-validators.js +30 -0
  164. package/dist/wirings/channel/channel-rpc.d.ts +5 -0
  165. package/dist/wirings/channel/channel-rpc.js +5 -0
  166. package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
  167. package/dist/wirings/channel/channel-rpc.types.js +50 -0
  168. package/dist/wirings/channel/channel-runner.d.ts +0 -4
  169. package/dist/wirings/channel/channel-runner.js +0 -14
  170. package/dist/wirings/channel/channel-store.d.ts +0 -10
  171. package/dist/wirings/channel/channel.types.d.ts +12 -1
  172. package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
  173. package/dist/wirings/channel/define-channel-routes.js +0 -20
  174. package/dist/wirings/channel/eventhub-service.d.ts +0 -18
  175. package/dist/wirings/channel/index.d.ts +4 -1
  176. package/dist/wirings/channel/index.js +2 -0
  177. package/dist/wirings/channel/local/local-channel-runner.js +3 -1
  178. package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
  179. package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
  180. package/dist/wirings/channel/log-channels.d.ts +0 -4
  181. package/dist/wirings/channel/log-channels.js +0 -4
  182. package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
  183. package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
  184. package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
  185. package/dist/wirings/cli/channel/cli-approval.js +81 -0
  186. package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
  187. package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
  188. package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
  189. package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
  190. package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +20 -0
  191. package/dist/wirings/cli/channel/cli-raw-client-runner.js +121 -0
  192. package/dist/wirings/cli/channel/index.d.ts +4 -0
  193. package/dist/wirings/cli/channel/index.js +2 -0
  194. package/dist/wirings/cli/cli-runner.d.ts +20 -20
  195. package/dist/wirings/cli/cli-runner.js +28 -89
  196. package/dist/wirings/cli/cli.types.d.ts +14 -3
  197. package/dist/wirings/cli/command-parser.d.ts +1 -10
  198. package/dist/wirings/cli/command-parser.js +10 -87
  199. package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
  200. package/dist/wirings/cli/define-cli-commands.js +1 -17
  201. package/dist/wirings/credential/credential.types.d.ts +0 -12
  202. package/dist/wirings/credential/define-credential.d.ts +48 -0
  203. package/dist/wirings/credential/define-credential.js +47 -0
  204. package/dist/wirings/credential/index.d.ts +1 -1
  205. package/dist/wirings/credential/index.js +1 -1
  206. package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
  207. package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
  208. package/dist/wirings/gateway/gateway-runner.js +8 -105
  209. package/dist/wirings/gateway/gateway.types.d.ts +7 -80
  210. package/dist/wirings/http/http-routes.d.ts +0 -63
  211. package/dist/wirings/http/http-routes.js +0 -63
  212. package/dist/wirings/http/http-runner.d.ts +1 -100
  213. package/dist/wirings/http/http-runner.js +12 -166
  214. package/dist/wirings/http/http.types.d.ts +16 -55
  215. package/dist/wirings/http/index.d.ts +2 -1
  216. package/dist/wirings/http/index.js +1 -1
  217. package/dist/wirings/http/log-http-routes.d.ts +0 -4
  218. package/dist/wirings/http/log-http-routes.js +0 -4
  219. package/dist/wirings/http/pikku-fetch-http-request.d.ts +6 -36
  220. package/dist/wirings/http/pikku-fetch-http-request.js +56 -50
  221. package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
  222. package/dist/wirings/http/routers/path-to-regex.js +2 -13
  223. package/dist/wirings/http/web-request.d.ts +0 -8
  224. package/dist/wirings/http/web-request.js +25 -17
  225. package/dist/wirings/mcp/mcp-runner.d.ts +2 -0
  226. package/dist/wirings/mcp/mcp-runner.js +6 -16
  227. package/dist/wirings/mcp/mcp.types.d.ts +2 -35
  228. package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
  229. package/dist/wirings/oauth2/oauth2.types.js +0 -3
  230. package/dist/wirings/persona/define-personas.d.ts +28 -0
  231. package/dist/wirings/persona/define-personas.js +27 -0
  232. package/dist/wirings/persona/index.d.ts +21 -0
  233. package/dist/wirings/persona/index.js +17 -0
  234. package/dist/wirings/persona/persona-email.d.ts +37 -0
  235. package/dist/wirings/persona/persona-email.js +69 -0
  236. package/dist/wirings/persona/persona-environments.d.ts +45 -0
  237. package/dist/wirings/persona/persona-environments.js +81 -0
  238. package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
  239. package/dist/wirings/persona/persona-mailbox.js +53 -0
  240. package/dist/wirings/persona/persona.types.d.ts +125 -0
  241. package/dist/wirings/persona/persona.types.js +1 -0
  242. package/dist/wirings/persona/validate-personas.d.ts +53 -0
  243. package/dist/wirings/persona/validate-personas.js +94 -0
  244. package/dist/wirings/queue/index.d.ts +3 -0
  245. package/dist/wirings/queue/index.js +2 -3
  246. package/dist/wirings/queue/queue-identity.d.ts +28 -0
  247. package/dist/wirings/queue/queue-identity.js +102 -0
  248. package/dist/wirings/queue/queue-runner.d.ts +0 -19
  249. package/dist/wirings/queue/queue-runner.js +9 -30
  250. package/dist/wirings/queue/queue.types.d.ts +18 -89
  251. package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
  252. package/dist/wirings/queue/register-queue-helper.js +0 -11
  253. package/dist/wirings/queue/signed-queue-service.d.ts +16 -0
  254. package/dist/wirings/queue/signed-queue-service.js +42 -0
  255. package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
  256. package/dist/wirings/queue/validate-worker-config.js +0 -14
  257. package/dist/wirings/role/define-system-role.d.ts +32 -0
  258. package/dist/wirings/role/define-system-role.js +31 -0
  259. package/dist/wirings/role/index.d.ts +3 -0
  260. package/dist/wirings/role/index.js +2 -0
  261. package/dist/wirings/role/role.types.d.ts +43 -0
  262. package/dist/wirings/role/role.types.js +1 -0
  263. package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
  264. package/dist/wirings/role/validate-role-definitions.js +71 -0
  265. package/dist/wirings/rpc/addon-runner.d.ts +0 -19
  266. package/dist/wirings/rpc/addon-runner.js +0 -51
  267. package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -12
  268. package/dist/wirings/rpc/remote-addon-auth.js +1 -9
  269. package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
  270. package/dist/wirings/rpc/rpc-runner.js +88 -105
  271. package/dist/wirings/rpc/rpc-types.d.ts +7 -6
  272. package/dist/wirings/rpc/wire-addon.d.ts +25 -0
  273. package/dist/wirings/rpc/wire-addon.js +62 -0
  274. package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
  275. package/dist/wirings/rpc/wire-remote-addon.js +0 -8
  276. package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
  277. package/dist/wirings/scheduler/log-schedulers.js +0 -4
  278. package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
  279. package/dist/wirings/scheduler/scheduler-runner.js +0 -1
  280. package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
  281. package/dist/wirings/scope/define-scope.d.ts +32 -0
  282. package/dist/wirings/scope/define-scope.js +31 -0
  283. package/dist/wirings/scope/index.d.ts +1 -1
  284. package/dist/wirings/scope/index.js +1 -1
  285. package/dist/wirings/scope/scope.types.d.ts +7 -9
  286. package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
  287. package/dist/wirings/scope/validate-scope-definitions.js +3 -21
  288. package/dist/wirings/secret/index.d.ts +1 -1
  289. package/dist/wirings/secret/index.js +1 -1
  290. package/dist/wirings/secret/secret.types.d.ts +19 -15
  291. package/dist/wirings/secret/secret.types.js +1 -1
  292. package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
  293. package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
  294. package/dist/wirings/trigger/trigger-runner.js +1 -24
  295. package/dist/wirings/trigger/trigger.types.d.ts +1 -82
  296. package/dist/wirings/trigger/trigger.types.js +0 -34
  297. package/dist/wirings/variable/index.d.ts +1 -1
  298. package/dist/wirings/variable/index.js +1 -1
  299. package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
  300. package/dist/wirings/variable/variable.types.d.ts +1 -13
  301. package/dist/wirings/variable/variable.types.js +1 -1
  302. package/dist/wirings/virtual-user/index.d.ts +27 -0
  303. package/dist/wirings/virtual-user/index.js +8 -0
  304. package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
  305. package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
  306. package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
  307. package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
  308. package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
  309. package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
  310. package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
  311. package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
  312. package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
  313. package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
  314. package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
  315. package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
  316. package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
  317. package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
  318. package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
  319. package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
  320. package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
  321. package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
  322. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +5 -5
  323. package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
  324. package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
  325. package/dist/wirings/workflow/feature.d.ts +0 -19
  326. package/dist/wirings/workflow/feature.js +0 -19
  327. package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
  328. package/dist/wirings/workflow/graph/graph-node.js +0 -34
  329. package/dist/wirings/workflow/graph/graph-runner.js +6 -41
  330. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
  331. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
  332. package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
  333. package/dist/wirings/workflow/index.d.ts +5 -7
  334. package/dist/wirings/workflow/index.js +3 -17
  335. package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
  336. package/dist/wirings/workflow/pikku-scenario-service.js +204 -42
  337. package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
  338. package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
  339. package/dist/wirings/workflow/run-timeline.d.ts +0 -47
  340. package/dist/wirings/workflow/run-timeline.js +0 -22
  341. package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
  342. package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
  343. package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
  344. package/dist/wirings/workflow/scenario-poll.js +0 -12
  345. package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
  346. package/dist/wirings/workflow/scenario-prose.js +0 -18
  347. package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
  348. package/dist/wirings/workflow/scenario-step-guards.js +1 -14
  349. package/dist/wirings/workflow/scenario-step.types.d.ts +72 -6
  350. package/dist/wirings/workflow/scenario-step.types.js +5 -1
  351. package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
  352. package/dist/wirings/workflow/scenario-surface.js +56 -0
  353. package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
  354. package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
  355. package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
  356. package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
  357. package/dist/wirings/workflow/workflow.types.d.ts +0 -197
  358. package/knowledge/decisions/index.md +19 -0
  359. package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
  360. package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
  361. package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
  362. package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
  363. package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
  364. package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
  365. package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
  366. package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
  367. package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
  368. package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
  369. package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
  370. package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
  371. package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
  372. package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
  373. package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
  374. package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
  375. package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
  376. package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
  377. package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
  378. package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
  379. package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
  380. package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
  381. package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
  382. package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
  383. package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
  384. package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
  385. package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
  386. package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
  387. package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +34 -0
  388. package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
  389. package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
  390. package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
  391. package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
  392. package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
  393. package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
  394. package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
  395. package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
  396. package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
  397. package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
  398. package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
  399. package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
  400. package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
  401. package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
  402. package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
  403. package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
  404. package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
  405. package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
  406. package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
  407. package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
  408. package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
  409. package/knowledge/decisions/internals/index.md +113 -0
  410. package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
  411. package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
  412. package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
  413. package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
  414. package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
  415. package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
  416. package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
  417. package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
  418. package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
  419. package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
  420. package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
  421. package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
  422. package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
  423. package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
  424. package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
  425. package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
  426. package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
  427. package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
  428. package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
  429. package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
  430. package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
  431. package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
  432. package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
  433. package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
  434. package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
  435. package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
  436. package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
  437. package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
  438. package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
  439. package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
  440. package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
  441. package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
  442. package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
  443. package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
  444. package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
  445. package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
  446. package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
  447. package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
  448. package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
  449. package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
  450. package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
  451. package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
  452. package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
  453. package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
  454. package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
  455. package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
  456. package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
  457. package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
  458. package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
  459. package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
  460. package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
  461. package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
  462. package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
  463. package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
  464. package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
  465. package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
  466. package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
  467. package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
  468. package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
  469. package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
  470. package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
  471. package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
  472. package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
  473. package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
  474. package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
  475. package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
  476. package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
  477. package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
  478. package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
  479. package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
  480. package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
  481. package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
  482. package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
  483. package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
  484. package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
  485. package/knowledge/decisions/security/index.md +55 -0
  486. package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
  487. package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
  488. package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
  489. package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
  490. package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
  491. package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
  492. package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
  493. package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
  494. package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
  495. package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
  496. package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
  497. package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
  498. package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
  499. package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
  500. package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
  501. package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
  502. package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
  503. package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
  504. package/knowledge/index.md +24 -0
  505. package/knowledge/questions/index.md +15 -0
  506. package/package.json +4 -2
  507. package/run-tests.sh +0 -0
  508. package/src/crypto-utils.test.ts +460 -19
  509. package/src/crypto-utils.ts +283 -55
  510. package/src/data-classification.ts +1 -7
  511. package/src/dev/hot-reload.test.ts +0 -4
  512. package/src/dev/hot-reload.ts +11 -30
  513. package/src/dev/module-runner.ts +7 -32
  514. package/src/dev/reload-meta.ts +9 -29
  515. package/src/errors/error-handler.ts +20 -35
  516. package/src/errors/error.test.ts +30 -1
  517. package/src/errors/errors.ts +73 -157
  518. package/src/function/abort-scope.test.ts +97 -0
  519. package/src/function/abort-scope.ts +80 -0
  520. package/src/function/function-runner.test.ts +75 -7
  521. package/src/function/function-runner.ts +73 -30
  522. package/src/function/functions.types.ts +56 -136
  523. package/src/function/list.types.test.ts +3 -25
  524. package/src/function/list.types.ts +12 -62
  525. package/src/gopass-secrets-removed.test.ts +51 -0
  526. package/src/handle-error.test.ts +108 -1
  527. package/src/handle-error.ts +8 -18
  528. package/src/index.ts +60 -1
  529. package/src/middleware/auth-apikey.test.ts +0 -1
  530. package/src/middleware/auth-apikey.ts +0 -17
  531. package/src/middleware/auth-bearer.test.ts +0 -3
  532. package/src/middleware/auth-bearer.ts +3 -40
  533. package/src/middleware/auth-cookie.test.ts +0 -6
  534. package/src/middleware/auth-cookie.ts +2 -26
  535. package/src/middleware/cors.test.ts +34 -0
  536. package/src/middleware/cors.ts +12 -33
  537. package/src/middleware/remote-auth.test.ts +24 -9
  538. package/src/middleware/remote-auth.ts +10 -2
  539. package/src/middleware/telemetry.ts +2 -31
  540. package/src/middleware-runner.test.ts +0 -2
  541. package/src/middleware-runner.ts +5 -74
  542. package/src/permissions.test.ts +30 -0
  543. package/src/permissions.ts +24 -74
  544. package/src/pikku-request.ts +0 -6
  545. package/src/pikku-state.ts +2 -30
  546. package/src/production-barrels-stay-lean.test.ts +110 -0
  547. package/src/remote.test.ts +172 -0
  548. package/src/remote.ts +17 -7
  549. package/src/schema.test.ts +103 -0
  550. package/src/schema.ts +35 -18
  551. package/src/scopes.ts +7 -48
  552. package/src/services/ai-agent-runner-service.ts +20 -0
  553. package/src/services/ai-embedding-service.ts +3 -25
  554. package/src/services/audit-service.ts +1 -2
  555. package/src/services/content-service.ts +1 -46
  556. package/src/services/credential-service.ts +3 -40
  557. package/src/services/credential-wire-service.test.ts +0 -2
  558. package/src/services/deployment-service.ts +3 -9
  559. package/src/services/gateway-service.ts +0 -15
  560. package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
  561. package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
  562. package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
  563. package/src/services/in-memory-queue-service.ts +1 -15
  564. package/src/services/in-memory-trigger-service.ts +1 -18
  565. package/src/services/in-memory-workflow-service.test.ts +0 -13
  566. package/src/services/in-memory-workflow-service.ts +4 -38
  567. package/src/services/index.ts +20 -15
  568. package/src/services/istanbul-coverage-service.ts +2 -8
  569. package/src/services/jwt-service.ts +1 -16
  570. package/src/services/local-content.test.ts +159 -27
  571. package/src/services/local-content.ts +55 -23
  572. package/src/services/local-gateway-service.ts +2 -17
  573. package/src/services/local-secrets.ts +0 -4
  574. package/src/services/logger-console.test.ts +0 -1
  575. package/src/services/logger-console.ts +3 -7
  576. package/src/services/logger.ts +2 -37
  577. package/src/services/meta-service.test.ts +1 -5
  578. package/src/services/meta-service.ts +41 -61
  579. package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
  580. package/src/services/pikku-user-id.ts +0 -4
  581. package/src/services/queue-webhook-service.ts +9 -41
  582. package/src/services/scheduler-service.ts +1 -50
  583. package/src/services/schema-service.ts +1 -24
  584. package/src/services/scope-service.ts +50 -34
  585. package/src/services/scoped-secret-service.ts +0 -4
  586. package/src/services/secret-host-binding.test.ts +138 -0
  587. package/src/services/secret-host-binding.ts +51 -0
  588. package/src/services/secret-service.ts +5 -33
  589. package/src/services/secretless.test.ts +54 -0
  590. package/src/services/secretless.ts +29 -0
  591. package/src/services/stub-tracker.ts +8 -18
  592. package/src/services/system-role-guard.test.ts +93 -0
  593. package/src/services/system-role-guard.ts +71 -0
  594. package/src/services/trigger-service.ts +0 -12
  595. package/src/services/typed-secret-service.ts +1 -7
  596. package/src/services/v8-coverage-service.ts +3 -6
  597. package/src/services/variables-service.ts +1 -8
  598. package/src/services/webhook-service.ts +19 -63
  599. package/src/services/workflow-service.ts +3 -20
  600. package/src/testing/service-tests.ts +0 -26
  601. package/src/time-utils.ts +1 -19
  602. package/src/types/core.types.ts +116 -229
  603. package/src/types/state.types.ts +7 -9
  604. package/src/utils/hmac.ts +4 -10
  605. package/src/utils/safe-fetch.ts +13 -54
  606. package/src/utils.test.ts +11 -2
  607. package/src/utils.ts +6 -15
  608. package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
  609. package/src/wirings/actor-flow/index.ts +0 -9
  610. package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
  611. package/src/wirings/actor-flow/run-conversation.ts +19 -12
  612. package/src/wirings/ai-agent/ai-agent-agui.test.ts +75 -10
  613. package/src/wirings/ai-agent/ai-agent-agui.ts +36 -17
  614. package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
  615. package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
  616. package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
  617. package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
  618. package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
  619. package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
  620. package/src/wirings/ai-agent/ai-agent-prepare.ts +82 -138
  621. package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
  622. package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
  623. package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
  624. package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
  625. package/src/wirings/ai-agent/ai-agent-runner.ts +67 -33
  626. package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
  627. package/src/wirings/ai-agent/ai-agent-stream.ts +192 -75
  628. package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
  629. package/src/wirings/ai-agent/ai-agent.types.ts +85 -4
  630. package/src/wirings/ai-agent/index.ts +35 -3
  631. package/src/wirings/ai-agent/voice-input.test.ts +72 -7
  632. package/src/wirings/ai-agent/voice-input.ts +48 -3
  633. package/src/wirings/ai-agent/voice-output.test.ts +422 -0
  634. package/src/wirings/ai-agent/voice-output.ts +216 -56
  635. package/src/wirings/channel/channel-common.ts +15 -20
  636. package/src/wirings/channel/channel-handler.test.ts +50 -0
  637. package/src/wirings/channel/channel-handler.ts +32 -11
  638. package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
  639. package/src/wirings/channel/channel-host-rpc.ts +69 -0
  640. package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
  641. package/src/wirings/channel/channel-middleware-runner.ts +0 -12
  642. package/src/wirings/channel/channel-rpc-registry.ts +116 -0
  643. package/src/wirings/channel/channel-rpc-responder.ts +117 -0
  644. package/src/wirings/channel/channel-rpc-service.ts +146 -0
  645. package/src/wirings/channel/channel-rpc-validators.ts +65 -0
  646. package/src/wirings/channel/channel-rpc.test.ts +820 -0
  647. package/src/wirings/channel/channel-rpc.ts +5 -0
  648. package/src/wirings/channel/channel-rpc.types.ts +150 -0
  649. package/src/wirings/channel/channel-runner.ts +0 -14
  650. package/src/wirings/channel/channel-store.ts +0 -10
  651. package/src/wirings/channel/channel.types.ts +19 -8
  652. package/src/wirings/channel/define-channel-routes.ts +0 -20
  653. package/src/wirings/channel/eventhub-service.ts +0 -18
  654. package/src/wirings/channel/index.ts +35 -0
  655. package/src/wirings/channel/local/local-channel-handler.ts +3 -1
  656. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
  657. package/src/wirings/channel/local/local-channel-runner.ts +3 -1
  658. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
  659. package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
  660. package/src/wirings/channel/log-channels.ts +0 -4
  661. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
  662. package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
  663. package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
  664. package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
  665. package/src/wirings/cli/channel/cli-approval.ts +135 -0
  666. package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
  667. package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
  668. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
  669. package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
  670. package/src/wirings/cli/channel/cli-raw-client-runner.ts +155 -0
  671. package/src/wirings/cli/channel/index.ts +9 -0
  672. package/src/wirings/cli/cli-runner.test.ts +0 -1
  673. package/src/wirings/cli/cli-runner.ts +46 -88
  674. package/src/wirings/cli/cli.types.ts +14 -3
  675. package/src/wirings/cli/command-parser.test.ts +0 -4
  676. package/src/wirings/cli/command-parser.ts +11 -91
  677. package/src/wirings/cli/define-cli-commands.ts +1 -17
  678. package/src/wirings/credential/credential.types.ts +0 -12
  679. package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
  680. package/src/wirings/credential/index.ts +1 -1
  681. package/src/wirings/credential/validate-credential-definitions.ts +2 -4
  682. package/src/wirings/gateway/gateway-runner.test.ts +1 -21
  683. package/src/wirings/gateway/gateway-runner.ts +8 -110
  684. package/src/wirings/gateway/gateway.types.ts +7 -80
  685. package/src/wirings/http/http-routes.test.ts +0 -3
  686. package/src/wirings/http/http-routes.ts +0 -86
  687. package/src/wirings/http/http-runner.test.ts +0 -1
  688. package/src/wirings/http/http-runner.ts +12 -168
  689. package/src/wirings/http/http.types.ts +17 -62
  690. package/src/wirings/http/index.ts +5 -1
  691. package/src/wirings/http/log-http-routes.ts +0 -4
  692. package/src/wirings/http/pikku-fetch-http-request.test.ts +88 -7
  693. package/src/wirings/http/pikku-fetch-http-request.ts +74 -50
  694. package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
  695. package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
  696. package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
  697. package/src/wirings/http/routers/path-to-regex.ts +2 -13
  698. package/src/wirings/http/web-request.test.ts +33 -2
  699. package/src/wirings/http/web-request.ts +30 -17
  700. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
  701. package/src/wirings/mcp/mcp-runner.test.ts +40 -0
  702. package/src/wirings/mcp/mcp-runner.ts +9 -15
  703. package/src/wirings/mcp/mcp.types.ts +7 -42
  704. package/src/wirings/oauth2/oauth2.types.ts +0 -30
  705. package/src/wirings/persona/define-personas.ts +29 -0
  706. package/src/wirings/persona/index.ts +62 -0
  707. package/src/wirings/persona/persona-email.ts +87 -0
  708. package/src/wirings/persona/persona-environments.test.ts +183 -0
  709. package/src/wirings/persona/persona-environments.ts +138 -0
  710. package/src/wirings/persona/persona-mailbox.ts +156 -0
  711. package/src/wirings/persona/persona.test.ts +220 -0
  712. package/src/wirings/persona/persona.types.ts +131 -0
  713. package/src/wirings/persona/validate-personas.ts +133 -0
  714. package/src/wirings/queue/index.ts +13 -3
  715. package/src/wirings/queue/queue-identity.test.ts +453 -0
  716. package/src/wirings/queue/queue-identity.ts +173 -0
  717. package/src/wirings/queue/queue-runner.ts +12 -31
  718. package/src/wirings/queue/queue.types.ts +19 -89
  719. package/src/wirings/queue/register-queue-helper.ts +0 -14
  720. package/src/wirings/queue/signed-queue-service.ts +59 -0
  721. package/src/wirings/queue/validate-worker-config.ts +2 -28
  722. package/src/wirings/role/define-system-role.ts +33 -0
  723. package/src/wirings/role/index.ts +13 -0
  724. package/src/wirings/role/role.test.ts +104 -0
  725. package/src/wirings/role/role.types.ts +47 -0
  726. package/src/wirings/role/validate-role-definitions.ts +93 -0
  727. package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
  728. package/src/wirings/rpc/addon-runner.ts +0 -56
  729. package/src/wirings/rpc/addon-scopes.test.ts +225 -0
  730. package/src/wirings/rpc/remote-addon-auth.ts +1 -13
  731. package/src/wirings/rpc/rpc-runner.test.ts +186 -2
  732. package/src/wirings/rpc/rpc-runner.ts +145 -127
  733. package/src/wirings/rpc/rpc-types.ts +11 -6
  734. package/src/wirings/rpc/wire-addon.test.ts +43 -1
  735. package/src/wirings/rpc/wire-addon.ts +99 -0
  736. package/src/wirings/rpc/wire-remote-addon.ts +9 -29
  737. package/src/wirings/scheduler/log-schedulers.ts +0 -4
  738. package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
  739. package/src/wirings/scheduler/scheduler-runner.ts +0 -2
  740. package/src/wirings/scheduler/scheduler.types.ts +1 -14
  741. package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
  742. package/src/wirings/scope/index.ts +1 -1
  743. package/src/wirings/scope/scope.test.ts +1 -2
  744. package/src/wirings/scope/scope.types.ts +7 -9
  745. package/src/wirings/scope/validate-scope-definitions.ts +3 -21
  746. package/src/wirings/secret/index.ts +1 -1
  747. package/src/wirings/secret/secret.types.ts +19 -15
  748. package/src/wirings/secret/validate-secret-definitions.ts +2 -4
  749. package/src/wirings/trigger/trigger-runner.ts +1 -27
  750. package/src/wirings/trigger/trigger.types.ts +1 -82
  751. package/src/wirings/variable/index.ts +1 -1
  752. package/src/wirings/variable/validate-variable-definitions.ts +2 -4
  753. package/src/wirings/variable/variable.types.ts +1 -13
  754. package/src/wirings/virtual-user/index.ts +76 -0
  755. package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
  756. package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
  757. package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
  758. package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
  759. package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
  760. package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
  761. package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
  762. package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
  763. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
  764. package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
  765. package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
  766. package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
  767. package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
  768. package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
  769. package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
  770. package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
  771. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +5 -4
  772. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
  773. package/src/wirings/workflow/feature.ts +0 -19
  774. package/src/wirings/workflow/graph/graph-node.ts +0 -136
  775. package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
  776. package/src/wirings/workflow/graph/graph-runner.ts +6 -41
  777. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
  778. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
  779. package/src/wirings/workflow/index.ts +10 -44
  780. package/src/wirings/workflow/pikku-scenario-service.ts +235 -52
  781. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
  782. package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
  783. package/src/wirings/workflow/run-timeline.test.ts +7 -19
  784. package/src/wirings/workflow/run-timeline.ts +0 -56
  785. package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
  786. package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
  787. package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
  788. package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
  789. package/src/wirings/workflow/scenario-poll.test.ts +0 -2
  790. package/src/wirings/workflow/scenario-poll.ts +0 -15
  791. package/src/wirings/workflow/scenario-prose.ts +0 -28
  792. package/src/wirings/workflow/scenario-service.test.ts +2 -9
  793. package/src/wirings/workflow/scenario-step-guards.ts +1 -14
  794. package/src/wirings/workflow/scenario-step.test.ts +159 -14
  795. package/src/wirings/workflow/scenario-step.types.ts +82 -6
  796. package/src/wirings/workflow/scenario-surface.test.ts +145 -0
  797. package/src/wirings/workflow/scenario-surface.ts +71 -0
  798. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
  799. package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
  800. package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
  801. package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
  802. package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
  803. package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
  804. package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
  805. package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
  806. package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
  807. package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
  808. package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
  809. package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
  810. package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
  811. package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
  812. package/src/wirings/workflow/workflow.types.ts +0 -203
  813. package/tsconfig.tsbuildinfo +1 -1
  814. package/src/middleware/timeout.ts +0 -22
  815. package/src/pikku-response.ts +0 -5
  816. package/src/services/gopass-secrets.ts +0 -78
  817. package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
  818. package/src/wirings/workflow/dsl/index.ts +0 -36
  819. package/src/wirings/workflow/graph/index.ts +0 -15
@@ -16,17 +16,12 @@ import type {
16
16
  CoreUserSession,
17
17
  CorePikkuMiddleware,
18
18
  CorePikkuMiddlewareGroup,
19
- WireServices,
20
19
  PikkuRawWire,
21
20
  PikkuWire,
22
21
  PikkuWiringTypes,
23
22
  } from '../../types/core.types.js'
24
23
  import { NotFoundError } from '../../errors/errors.js'
25
- import {
26
- closeWireServices,
27
- createWeakUID,
28
- isSerializable,
29
- } from '../../utils.js'
24
+ import { createWeakUID, isSerializable } from '../../utils.js'
30
25
  import {
31
26
  getSingletonServices,
32
27
  getCreateWireServices,
@@ -39,15 +34,13 @@ import { pikkuState } from '../../pikku-state.js'
39
34
  import { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js'
40
35
  import { PikkuFetchHTTPRequest } from './pikku-fetch-http-request.js'
41
36
  import type { PikkuChannel } from '../channel/channel.types.js'
37
+ import { unsupportedChannelRemote } from '../channel/channel-rpc.js'
42
38
  import { addFunction, runPikkuFunc } from '../../function/function-runner.js'
43
39
  import { applyWebResponse } from './web-request.js'
44
40
  import { httpRouter } from './routers/http-router.js'
45
41
  import { validateSchema } from '../../schema.js'
46
42
  import { runMiddleware } from '../../middleware-runner.js'
47
43
 
48
- /**
49
- * Extract headers from a PikkuHTTPRequest based on the schema keys
50
- */
51
44
  function extractHeadersFromRequest(
52
45
  request: PikkuHTTPRequest,
53
46
  headerKeys: string[]
@@ -62,35 +55,6 @@ function extractHeadersFromRequest(
62
55
  return headers
63
56
  }
64
57
 
65
- /**
66
- * Registers HTTP middleware for a specific route pattern.
67
- *
68
- * This function registers middleware at runtime that will be applied to
69
- * HTTP routes matching the specified pattern.
70
- *
71
- * For tree-shaking benefits, wrap in a factory function:
72
- * `export const x = () => addHTTPMiddleware('pattern', [...])`
73
- *
74
- * @template PikkuMiddleware The middleware type.
75
- * @param {string} pattern - Route pattern (e.g., '*' for all routes, '/api/*' for specific routes).
76
- * @param {CorePikkuMiddlewareGroup} middleware - Array of middleware for this route pattern.
77
- *
78
- * @returns {CorePikkuMiddlewareGroup} The middleware array (for chaining/wrapping).
79
- *
80
- * @example
81
- * ```typescript
82
- * // Recommended: tree-shakeable
83
- * export const httpGlobal = () => addHTTPMiddleware('*', [
84
- * corsMiddleware,
85
- * loggingMiddleware
86
- * ])
87
- *
88
- * // Also works: no tree-shaking
89
- * export const apiMiddleware = addHTTPMiddleware('/api/*', [
90
- * authMiddleware
91
- * ])
92
- * ```
93
- */
94
58
  export const addHTTPMiddleware = <PikkuMiddleware extends CorePikkuMiddleware>(
95
59
  pattern: string,
96
60
  middleware: CorePikkuMiddlewareGroup,
@@ -124,21 +88,6 @@ export const addHTTPPermission = (
124
88
  )
125
89
  }
126
90
 
127
- /**
128
- * Adds a new route to the global HTTP route registry.
129
- *
130
- * The route configuration includes the HTTP method, route path, permissions,
131
- * middleware, and the handler function that implements the route's logic.
132
- *
133
- * @template In Expected input type.
134
- * @template Out Expected output type.
135
- * @template Route Route pattern as a string.
136
- * @template PikkuFunction Type for the route handler function.
137
- * @template PikkuFunctionSessionless Type for a sessionless handler.
138
- * @template PikkuPermissionGroup Type representing required permissions.
139
- * @template PikkuMiddleware Middleware type to be used with the route.
140
- * @param {CoreHTTPFunctionWiring<In, Out, Route, PikkuFunction, PikkuFunctionSessionless, PikkuPermission, PikkuMiddleware>} httpWiring - The HTTP wiring configuration object.
141
- */
142
91
  export const wireHTTP = <
143
92
  In,
144
93
  Out,
@@ -163,10 +112,6 @@ export const wireHTTP = <
163
112
  const httpMeta = pikkuState(null, 'http', 'meta')
164
113
  const routeMeta = httpMeta[httpWiring.method][httpWiring.route]
165
114
  if (!routeMeta) {
166
- // In deploy units with filtered metadata, wiring files may include
167
- // routes for functions not in this unit. This happens when multiple
168
- // wirings share a file — split them into separate files for better
169
- // tree-shaking.
170
115
  console.warn(
171
116
  `[pikku] Skipping HTTP route '${httpWiring.method.toUpperCase()} ${httpWiring.route}' — metadata not found. Consider moving this wiring to its own file.`
172
117
  )
@@ -184,17 +129,6 @@ export const wireHTTP = <
184
129
  ?.set(httpWiring.route, httpWiring as any)
185
130
  }
186
131
 
187
- /**
188
- * Finds a matching route based on the HTTP method and URL path.
189
- *
190
- * Iterates over all registered routes, skipping those with a mismatched method.
191
- * When a route pattern matches the incoming request path, this function aggregates
192
- * any global middleware along with route-specific middleware and identifies any input schema.
193
- *
194
- * @param {string} requestType - The HTTP method (e.g., GET, POST).
195
- * @param {string} requestPath - The URL path of the incoming request.
196
- * @returns {Object | undefined} An object with matched route details or undefined if no match.
197
- */
198
132
  const getMatchingRoute = (requestType: string, requestPath: string) => {
199
133
  const matchedPath = httpRouter.match(
200
134
  requestType.toLowerCase() as HTTPMethod,
@@ -218,16 +152,6 @@ const getMatchingRoute = (requestType: string, requestPath: string) => {
218
152
  }
219
153
  }
220
154
 
221
- /**
222
- * Combines the request and response objects into a single HTTP wire object.
223
- *
224
- * This utility function creates an object that holds both the HTTP request and response,
225
- * which simplifies passing these around through middleware and route execution.
226
- *
227
- * @param {PikkuHTTPRequest | undefined} request - The HTTP request object.
228
- * @param {PikkuHTTPResponse | undefined} response - The HTTP response object.
229
- * @returns {PikkuHTTP | undefined} The combined HTTP wire object or undefined if none provided.
230
- */
231
155
  export const createHTTPWire = (
232
156
  request: PikkuHTTPRequest | undefined,
233
157
  response: PikkuHTTPResponse | undefined
@@ -247,26 +171,6 @@ export const createHTTPWire = (
247
171
  return http
248
172
  }
249
173
 
250
- /**
251
- * Validates the input data and executes the route handler
252
- *
253
- * This function performs these steps:
254
- * 1. Sets URL parameters on the request.
255
- * 2. Validates the user session if required.
256
- * 3. Creates session-specific services.
257
- * 4. Validates the incoming data against a schema.
258
- * 5. Optionally coerces query string values to arrays.
259
- * 6. Checks route-specific permissions.
260
- * 7. Executes the route handler.
261
- * 8. Sends the appropriate response.
262
- *
263
- * @param {Object} services - A collection of shared services and utilities.
264
- * @param {Object} matchedRoute - Contains route details, URL parameters, and optional schema.
265
- * @param {PikkuHTTP | undefined} http - The HTTP wire object.
266
- * @param {Object} options - Options for route execution (e.g., whether to coerce query strings to arrays).
267
- * @returns {Promise<any>} An object containing the route handler result and wire services (if any).
268
- * @throws Throws errors like MissingSessionError or ForbiddenError on validation failures.
269
- */
270
174
  const executeRoute = async (
271
175
  services: {
272
176
  singletonServices: any
@@ -292,10 +196,8 @@ const executeRoute = async (
292
196
  singletonServices.sessionStore
293
197
  )
294
198
 
295
- // Attach URL parameters to the request object
296
199
  http?.request?.setParams(params)
297
200
 
298
- // Validate request headers if schema is defined
299
201
  if (meta.headersSchemaName && http.request && singletonServices.schema) {
300
202
  const headerKeys = singletonServices.schema.getSchemaKeys(
301
203
  meta.headersSchemaName
@@ -310,14 +212,12 @@ const executeRoute = async (
310
212
  }
311
213
 
312
214
  const requiresSession = route.auth !== false
313
- let wireServices: any
314
215
  let result: any
315
216
 
316
217
  singletonServices.logger.info(
317
218
  `Matched route: ${route.route} | method: ${route.method.toUpperCase()} | auth: ${requiresSession.toString()}`
318
219
  )
319
220
 
320
- // Ensure session is available when required
321
221
  if (skipUserSession && requiresSession) {
322
222
  throw new Error("Can't skip trying to get user session if auth is required")
323
223
  }
@@ -365,11 +265,11 @@ const executeRoute = async (
365
265
  clearState: () => {
366
266
  sseState = undefined
367
267
  },
268
+ // SSE only flows server to client — the client has no way to answer on
269
+ // this channel, so a remote call could never be replied to.
270
+ remote: unsupportedChannelRemote,
368
271
  }
369
272
 
370
- // Register the SSE channel with the eventHub (if present) so that
371
- // eventHub.publish() can deliver messages to SSE subscribers.
372
- // The channel handler wraps the SSE channel to match PikkuChannelHandler.
373
273
  if (singletonServices.eventHub?.onChannelOpened) {
374
274
  const channelRef = channel
375
275
  const channelHandler = {
@@ -432,12 +332,11 @@ const executeRoute = async (
432
332
  http?.response?.arrayBuffer(JSON.stringify({ type: 'done' }))
433
333
  } catch {}
434
334
  channel?.close()
435
- return wireServices ? { result, wireServices } : { result }
335
+ return { result }
436
336
  }
437
337
  throw e
438
338
  }
439
339
  if (matchedRoute.route.sse) {
440
- // Flush headers after middleware has run so CORS/auth headers are included
441
340
  http?.response?.flushHeaders?.()
442
341
  } else {
443
342
  if (result instanceof Response) {
@@ -452,24 +351,9 @@ const executeRoute = async (
452
351
  }
453
352
  }
454
353
 
455
- return wireServices ? { result, wireServices } : { result }
354
+ return { result }
456
355
  }
457
356
 
458
- /**
459
- * Executes an HTTP route for a given Fetch API request.
460
- *
461
- * This function wraps the entire lifecycle of handling an HTTP request:
462
- * - Matching the request to a registered route.
463
- * - Validating input and session state.
464
- * - Running middleware and the route handler.
465
- * - Handling errors and forming the response.
466
- *
467
- * @template In Expected input data type.
468
- * @template Out Expected output data type.
469
- * @param {Request} request - The native Fetch API Request object.
470
- * @param {RunHTTPWiringOptions} params - Additional options including services and session management.
471
- * @returns {Promise<Response>} A promise that resolves to a Fetch API Response object.
472
- */
473
357
  export const fetch = async <In, Out>(
474
358
  request: Request,
475
359
  params: RunHTTPWiringOptions = {}
@@ -479,18 +363,6 @@ export const fetch = async <In, Out>(
479
363
  return pikkuResponse.toResponse()
480
364
  }
481
365
 
482
- /**
483
- * Executes an HTTP route using a Pikku-specific request wrapper.
484
- *
485
- * This variant accepts either a native Request or a PikkuHTTPRequest object and returns
486
- * a PikkuFetchHTTPResponse for further manipulation if needed.
487
- *
488
- * @template In Expected input data type.
489
- * @template Out Expected output data type.
490
- * @param {Request | PikkuHTTPRequest} request - The request object.
491
- * @param {RunHTTPWiringOptions} params - Execution options including services and session configuration.
492
- * @returns {Promise<PikkuFetchHTTPResponse>} A promise that resolves to a PikkuFetchHTTPResponse object.
493
- */
494
366
  export const pikkuFetch = async <In, Out>(
495
367
  request: Request | PikkuHTTPRequest,
496
368
  params: RunHTTPWiringOptions = {}
@@ -500,24 +372,6 @@ export const pikkuFetch = async <In, Out>(
500
372
  return pikkuResponse
501
373
  }
502
374
 
503
- /**
504
- * Core function to process an HTTP request through route matching, validation,
505
- * middleware execution, error handling, and session service cleanup.
506
- *
507
- * This function does the following:
508
- * - Wraps the incoming request and response into an HTTP wire object.
509
- * - Determines the correct route based on HTTP method and path.
510
- * - Executes middleware and the route handler.
511
- * - Catches and handles errors, optionally bubbling them if configured.
512
- * - Cleans up any wire services created during processing.
513
- *
514
- * @template In Expected input data type.
515
- * @template Out Expected output data type.
516
- * @param {Request | PikkuHTTPRequest} request - The incoming HTTP request.
517
- * @param {PikkuHTTPResponse} response - The response object to be populated.
518
- * @param {RunHTTPWiringOptions} options - Options such as singleton services, session handling, and error configuration.
519
- * @returns {Promise<Out | void>} The output from the route handler or void if an error occurred.
520
- */
521
375
  export const fetchData = async <In, Out>(
522
376
  request: Request | PikkuHTTPRequest,
523
377
  response: PikkuHTTPResponse,
@@ -527,22 +381,21 @@ export const fetchData = async <In, Out>(
527
381
  logWarningsForStatusCodes = [],
528
382
  coerceDataFromSchema = true,
529
383
  bubbleErrors = false,
530
- // Surface the error message + stack on unexpected 500s unless in production.
531
384
  exposeErrors = !isProduction(),
532
385
  generateRequestId,
533
386
  traceId: externalTraceId,
387
+ maxBodySize,
534
388
  }: RunHTTPWiringOptions = {}
535
389
  ): Promise<Out | void> => {
536
390
  const singletonServices = getSingletonServices()
537
391
  const createWireServices = getCreateWireServices()
538
- let wireServices: WireServices<typeof singletonServices> | undefined
539
392
  let result: Out
540
393
 
541
- // Combine the request and response into one wire object
542
394
  const pikkuRequest =
543
- request instanceof Request ? new PikkuFetchHTTPRequest(request) : request
395
+ request instanceof Request
396
+ ? new PikkuFetchHTTPRequest(request, { maxBodySize })
397
+ : request
544
398
 
545
- // Resolve traceId: external (e.g. CF-Ray) > x-request-id header > generated
546
399
  let requestId: string | null = externalTraceId ?? null
547
400
  if (!requestId) {
548
401
  try {
@@ -551,15 +404,12 @@ export const fetchData = async <In, Out>(
551
404
  }
552
405
  requestId = requestId || generateRequestId?.() || createWeakUID()
553
406
 
554
- // Scoped logger for HTTP runner internal logging (error handling, route matching)
555
- // Functions/middleware receive singletonServices.logger directly for compatibility
556
407
  const scopedLogger =
557
408
  singletonServices.logger.scope?.(requestId) ?? singletonServices.logger
558
409
  const http = createHTTPWire(pikkuRequest, response)
559
410
  const apiType = http!.request!.method()
560
411
  const apiRoute = http!.request!.path()
561
412
 
562
- // Locate the matching route based on the HTTP method and path
563
413
  const matchedRoute = getMatchingRoute(apiType, apiRoute)
564
414
  try {
565
415
  if (!matchedRoute) {
@@ -585,8 +435,7 @@ export const fetchData = async <In, Out>(
585
435
  throw new NotFoundError()
586
436
  }
587
437
 
588
- // Execute the matched route along with its middleware and session management
589
- ;({ result, wireServices } = await executeRoute(
438
+ ;({ result } = await executeRoute(
590
439
  {
591
440
  singletonServices,
592
441
  createWireServices,
@@ -610,10 +459,5 @@ export const fetchData = async <In, Out>(
610
459
  bubbleErrors,
611
460
  exposeErrors
612
461
  )
613
- } finally {
614
- // Clean up any session-specific services created during processing
615
- if (wireServices) {
616
- await closeWireServices(singletonServices.logger, wireServices)
617
- }
618
462
  }
619
463
  }
@@ -38,11 +38,10 @@ export type RunHTTPWiringOptions = Partial<{
38
38
  generateRequestId: () => string
39
39
  /** Pre-resolved trace ID (e.g. CF-Ray). Falls back to x-request-id header or generated ID. */
40
40
  traceId: string
41
+ /** Maximum request body size in bytes, applied when pikku wraps a fetch `Request`. */
42
+ maxBodySize: number
41
43
  }>
42
44
 
43
- /**
44
- * Represents the HTTP methods supported for API HTTP wirings.
45
- */
46
45
  export type HTTPMethod =
47
46
  | 'post'
48
47
  | 'get'
@@ -52,17 +51,10 @@ export type HTTPMethod =
52
51
  | 'put'
53
52
  | 'options'
54
53
 
55
- /**
56
- * Header schema type for request header validation.
57
- * Uses Standard Schema interface - works with Zod, Valibot, ArkType, Effect Schema, etc.
58
- */
59
54
  export type HTTPHeadersSchema = StandardSchemaV1<
60
55
  Record<string, string | string[] | undefined>
61
56
  >
62
57
 
63
- /**
64
- * Common HTTP route configuration shared between wireHTTP and wireHTTPRoutes
65
- */
66
58
  export type HTTPRouteBaseConfig = {
67
59
  contentType?: 'xml' | 'json'
68
60
  timeout?: number
@@ -70,47 +62,26 @@ export type HTTPRouteBaseConfig = {
70
62
  headers?: HTTPHeadersSchema
71
63
  }
72
64
 
73
- /**
74
- * Represents an API HTTP wiring without a function, including metadata such as content type, route, and timeout settings.
75
- */
76
65
  export type CoreHTTPFunction = HTTPRouteBaseConfig & {
77
66
  route: string
78
67
  eventChannel?: false
79
68
  returnsJSON?: false
80
69
  }
81
- /**
82
- * Represents a http wire within Pikku, including a request and response.
83
- */
70
+
84
71
  export interface PikkuHTTP<In = unknown> {
85
72
  request?: PikkuHTTPRequest<In>
86
73
  response?: PikkuHTTPResponse
87
74
  }
88
75
 
89
- /**
90
- * Represents request headers as either a record or a function to get headers by name.
91
- */
92
76
  export type RequestHeaders =
93
77
  | Record<string, string | string[] | undefined>
94
78
  | ((headerName: string) => string | string[] | undefined)
95
79
 
96
- /**
97
- * Represents a query object for Pikku, where each key can be a string, a value, or an array of values.
98
- */
99
80
  export type PikkuQuery<T = Record<string, string | undefined>> = Record<
100
81
  string,
101
82
  string | T | null | Array<T | null>
102
83
  >
103
84
 
104
- /**
105
- * Represents a core API HTTP wiring, which can have different configurations depending on whether it requires authentication and permissions.
106
- *
107
- * @template In - The input type.
108
- * @template Out - The output type.
109
- * @template R - The route string type.
110
- * @template PikkuFunction - The API function type, defaults to `CorePikkuFunction`.
111
- * @template PikkuFunctionSessionless - The sessionless API function type, defaults to `CorePikkuFunctionSessionless`.
112
- * @template PikkuPermission - The permission function type, defaults to `CorePikkuPermission`.
113
- */
114
85
  export type CoreHTTPFunctionWiring<
115
86
  In,
116
87
  Out,
@@ -206,21 +177,26 @@ export type CoreHTTPFunctionWiring<
206
177
  sse?: undefined
207
178
  })
208
179
 
209
- /**
210
- * Represents the input types for HTTP wiring metadata, including parameters, query, and body types.
211
- */
212
180
  export type HTTPFunctionMetaInputTypes = {
213
181
  params?: string
214
182
  query?: string
215
183
  body?: string
216
184
  }
217
185
 
218
- /**
219
- * Represents metadata for a set of HTTP wirings, including HTTP wiring details, methods, input/output types, and documentation.
220
- */
221
186
  export type HTTPWiringMeta = CommonWireMeta & {
222
187
  route: string
223
188
  method: HTTPMethod
189
+ /** The route's own `auth`, or the group's if the route did not set one. */
190
+ auth?: boolean
191
+ /**
192
+ * Whether reaching this route requires a session, resolved at codegen time
193
+ * across every layer that can demand one: the function's `sessionless`, its
194
+ * own `auth`, this route's `auth`, and the auth flag of the addon the
195
+ * function belongs to. Answering "which routes are open?" used to mean
196
+ * joining four separate places and knowing which of them wins; getting that
197
+ * join wrong reads an open route as a closed one.
198
+ */
199
+ requiresSession?: boolean
224
200
  refTarget?: string
225
201
  params?: string[]
226
202
  query?: string[]
@@ -272,16 +248,15 @@ export interface PikkuHTTPResponse<Out = unknown> {
272
248
  | ReadableStream
273
249
  ): this
274
250
  json(data: Out): this
275
- send?(data: string | ArrayBuffer | Buffer): this
251
+ /** `ArrayBufferView` covers `Buffer` and `Uint8Array`, which is how a body
252
+ * that is not text reaches here without being decoded on the way. */
253
+ send?(data: string | ArrayBuffer | ArrayBufferView): this
276
254
  redirect(location: string, status?: number): this
277
255
  close?: () => void
278
256
  setMode?: (mode: 'stream') => void
279
257
  flushHeaders?: () => void
280
258
  }
281
259
 
282
- /**
283
- * Single route configuration - supports all wireHTTP options
284
- */
285
260
  export type HTTPRouteConfig<
286
261
  PikkuFunction extends
287
262
  | CorePikkuFunction<any, any, any, any, any>
@@ -295,24 +270,14 @@ export type HTTPRouteConfig<
295
270
  any
296
271
  >,
297
272
  > = HTTPRouteBaseConfig & {
298
- // Required
299
273
  method: HTTPMethod
300
274
  route: string
301
275
  func: CorePikkuFunctionConfig<PikkuFunction, PikkuPermission, PikkuMiddleware>
302
-
303
- // Auth
304
276
  auth?: boolean
305
-
306
- // Middleware
307
277
  middleware?: PikkuMiddleware[]
308
-
309
- // SSE support
310
278
  sse?: boolean
311
279
  }
312
280
 
313
- /**
314
- * Group-level configuration applied to all routes
315
- */
316
281
  export type HTTPRoutesGroupConfig<
317
282
  PikkuPermission extends CorePikkuPermission<any, any, any> =
318
283
  CorePikkuPermission<any, any, any>,
@@ -327,25 +292,15 @@ export type HTTPRoutesGroupConfig<
327
292
  middleware?: PikkuMiddleware[]
328
293
  }
329
294
 
330
- /**
331
- * Nested route map - allows hierarchical organization
332
- * Can contain individual routes, nested maps, or contracts with config
333
- */
334
295
  export type HTTPRouteMap = {
335
296
  [key: string]: HTTPRouteConfig | HTTPRouteMap | HTTPRouteContract
336
297
  }
337
298
 
338
- /**
339
- * A route contract with optional group config (returned by defineRoutes)
340
- */
341
299
  export type HTTPRouteContract<T extends HTTPRouteMap = HTTPRouteMap> =
342
300
  HTTPRoutesGroupConfig & {
343
301
  routes: T
344
302
  }
345
303
 
346
- /**
347
- * Full configuration for wireHTTPRoutes
348
- */
349
304
  export type WireHTTPRoutesConfig = HTTPRoutesGroupConfig & {
350
305
  routes: HTTPRouteMap | HTTPRouteConfig[]
351
306
  }
@@ -1,4 +1,8 @@
1
- export { PikkuFetchHTTPRequest } from './pikku-fetch-http-request.js'
1
+ export {
2
+ PikkuFetchHTTPRequest,
3
+ DEFAULT_MAX_BODY_SIZE,
4
+ } from './pikku-fetch-http-request.js'
5
+ export type { PikkuFetchHTTPRequestOptions } from './pikku-fetch-http-request.js'
2
6
  export { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js'
3
7
  export { logRoutes } from './log-http-routes.js'
4
8
 
@@ -1,10 +1,6 @@
1
1
  import { pikkuState } from '../../pikku-state.js'
2
2
  import type { Logger } from '../../services/index.js'
3
3
 
4
- /**
5
- * Logs all the loaded routes.
6
- * @param logger - A logger for logging information.
7
- */
8
4
  export const logRoutes = (logger: Logger) => {
9
5
  const routesByType = pikkuState(null, 'http', 'routes')
10
6
  if (routesByType.size === 0) {
@@ -147,8 +147,6 @@ test('data() parses application/x-www-form-urlencoded correctly', async () => {
147
147
  })
148
148
  })
149
149
 
150
- // --- Compatible types
151
-
152
150
  test('data() treats "123" and 123 as equivalent', async () => {
153
151
  const req = createRequest(
154
152
  'POST',
@@ -160,7 +158,7 @@ test('data() treats "123" and 123 as equivalent', async () => {
160
158
  )
161
159
 
162
160
  const r = new PikkuFetchHTTPRequest(req)
163
- r.setParams({ id: '123' }) // All match
161
+ r.setParams({ id: '123' })
164
162
  const result = await r.data()
165
163
  assert.deepEqual(result, { id: '123' })
166
164
  })
@@ -176,13 +174,11 @@ test('data() treats "true" and true as equivalent', async () => {
176
174
  )
177
175
 
178
176
  const r = new PikkuFetchHTTPRequest(req)
179
- r.setParams({ flag: 'true' }) // All match
177
+ r.setParams({ flag: 'true' })
180
178
  const result = await r.data()
181
179
  assert.deepEqual(result, { flag: 'true' })
182
180
  })
183
181
 
184
- // --- Conflicts
185
-
186
182
  test('data() throws on conflicting values', async () => {
187
183
  const req = createRequest(
188
184
  'POST',
@@ -219,7 +215,92 @@ test('data() throws on boolean conflict', async () => {
219
215
  })
220
216
  })
221
217
 
222
- // --- Safe fallback: only one source
218
+ const streamedRequest = (chunks) =>
219
+ new Request('http://localhost', {
220
+ method: 'POST',
221
+ headers: { 'Content-Type': 'application/json' },
222
+ body: new ReadableStream({
223
+ start(controller) {
224
+ for (const chunk of chunks) {
225
+ controller.enqueue(new TextEncoder().encode(chunk))
226
+ }
227
+ controller.close()
228
+ },
229
+ }),
230
+ duplex: 'half',
231
+ })
232
+
233
+ test('arrayBuffer() rejects a body larger than the configured limit', async () => {
234
+ const req = new Request('http://localhost', {
235
+ method: 'POST',
236
+ headers: { 'Content-Type': 'application/octet-stream' },
237
+ body: 'x'.repeat(64),
238
+ })
239
+ const pikkuReq = new PikkuFetchHTTPRequest(req, { maxBodySize: 16 })
240
+ await assert.rejects(async () => await pikkuReq.arrayBuffer(), {
241
+ name: 'PayloadTooLargeError',
242
+ })
243
+ })
244
+
245
+ test('arrayBuffer() rejects an oversized body with no content-length header', async () => {
246
+ const req = streamedRequest(['x'.repeat(32), 'y'.repeat(32)])
247
+ assert.equal(req.headers.get('content-length'), null)
248
+ const pikkuReq = new PikkuFetchHTTPRequest(req, { maxBodySize: 16 })
249
+ await assert.rejects(async () => await pikkuReq.arrayBuffer(), {
250
+ name: 'PayloadTooLargeError',
251
+ })
252
+ })
253
+
254
+ test('arrayBuffer() rejects a body whose content-length under-reports its size', async () => {
255
+ const req = new Request('http://localhost', {
256
+ method: 'POST',
257
+ headers: {
258
+ 'Content-Type': 'application/json',
259
+ 'Content-Length': '4',
260
+ },
261
+ body: new ReadableStream({
262
+ start(controller) {
263
+ controller.enqueue(new TextEncoder().encode('z'.repeat(128)))
264
+ controller.close()
265
+ },
266
+ }),
267
+ duplex: 'half',
268
+ })
269
+ const pikkuReq = new PikkuFetchHTTPRequest(req, { maxBodySize: 16 })
270
+ await assert.rejects(async () => await pikkuReq.arrayBuffer(), {
271
+ name: 'PayloadTooLargeError',
272
+ })
273
+ })
274
+
275
+ test('data() surfaces PayloadTooLargeError rather than wrapping it', async () => {
276
+ const req = createRequest(
277
+ 'POST',
278
+ 'http://localhost',
279
+ { padding: 'x'.repeat(256) },
280
+ { 'Content-Type': 'application/json' }
281
+ )
282
+ const pikkuReq = new PikkuFetchHTTPRequest(req, { maxBodySize: 16 })
283
+ await assert.rejects(async () => await pikkuReq.data(), {
284
+ name: 'PayloadTooLargeError',
285
+ })
286
+ })
287
+
288
+ test('data() accepts a body within the configured limit', async () => {
289
+ const req = createRequest(
290
+ 'POST',
291
+ 'http://localhost',
292
+ { ok: true },
293
+ { 'Content-Type': 'application/json' }
294
+ )
295
+ const pikkuReq = new PikkuFetchHTTPRequest(req, { maxBodySize: 1024 })
296
+ assert.deepEqual(await pikkuReq.data(), { ok: true })
297
+ })
298
+
299
+ test('data() accepts a streamed body within the default limit', async () => {
300
+ const req = streamedRequest(['{"ok"', ':true}'])
301
+ const pikkuReq = new PikkuFetchHTTPRequest(req)
302
+ assert.deepEqual(await pikkuReq.data(), { ok: true })
303
+ })
223
304
 
224
305
  test('data() works when only body has values', async () => {
225
306
  const req = createRequest(