@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
package/dist/schema.d.ts CHANGED
@@ -1,48 +1,14 @@
1
1
  import type { Logger } from './services/logger.js';
2
2
  import type { SchemaService } from './services/schema-service.js';
3
- /**
4
- * Adds a schema to the schemas map for a specific package.
5
- * @param name - The name of the schema.
6
- * @param value - The schema value.
7
- * @param packageName - The package name (null for main package, '@scope/package' for addon packages).
8
- * @ignore
9
- */
10
3
  export declare const addSchema: (name: string, value: any, packageName?: string | null) => void;
11
- /**
12
- * Retrieves a schema from the schemas map for a specific package.
13
- * @param name - The name of the schema.
14
- * @param packageName - The package name (null for main package, '@scope/package' for addon packages).
15
- * @returns The schema value or undefined if not found.
16
- * @ignore
17
- */
18
4
  export declare const getSchema: (name: string, packageName?: string | null) => Record<string, unknown> | undefined;
19
- /**
20
- * Loads a schema and compiles it into a validator.
21
- * @param logger - A logger for logging information.
22
- */
23
5
  export declare const compileAllSchemas: (logger: Logger, schemaService?: SchemaService) => void;
24
6
  /**
25
- * Fill in absent top-level properties from their schema `default`.
26
- *
27
- * A `default` reaches the generated JSON Schema and keeps the property out of
28
- * `required`, so omitting it validates but nothing was ever filling it in.
29
- * JSON Schema validators are pure by specification and none of the ones Pikku
30
- * ships with (`@cfworker/json-schema`, and Ajv unless `useDefaults` is set)
31
- * annotate the instance, so the function received `undefined` for a property
32
- * its generated type declares as present. That is the worst shape a mismatch
33
- * can take: validation permits the omission, the type says the value is there,
34
- * and the body reads `undefined`.
35
- *
36
- * Applied unconditionally rather than alongside `coerceTopLevelDataFromSchema`,
37
- * whose `coerceDataFromSchema` flag is about decoding transport-encoded values
38
- * (a query string's `"1,2"` into an array). Defaults are a property of the
39
- * schema, not of how the call arrived, so gating them on that flag would apply
40
- * them over HTTP and skip them on a direct RPC invocation.
41
- *
42
- * Returns the data to use, which is a new object only when defaults had to be
43
- * added to a nullish input — a call made with no arguments at all still gets
44
- * them. Values are cloned so an object or array default (`[]`, `{}`) is never
45
- * shared as one mutable instance across every request.
7
+ * Fills in absent top-level properties from their schema `default`. Applied
8
+ * unconditionally: a default belongs to the schema, not to the transport the
9
+ * call arrived on, and runs before coercion so a defaulted and a supplied
10
+ * value are treated identically from here on. Values are cloned so an object
11
+ * or array default is never shared as one mutable instance across requests.
46
12
  */
47
13
  export declare const applyDefaultsFromSchema: (schemaName: string, data: any, packageName?: string | null) => any;
48
14
  export declare const coerceTopLevelDataFromSchema: (schemaName: string, data: any, packageName?: string | null) => void;
package/dist/schema.js CHANGED
@@ -1,31 +1,13 @@
1
1
  import { MissingSchemaError, UnprocessableContentError, } from './errors/errors.js';
2
2
  import { pikkuState, getAllPackageStates } from './pikku-state.js';
3
3
  const schemaKey = (name, packageName) => packageName ? `${packageName}:${name}` : name;
4
- /**
5
- * Adds a schema to the schemas map for a specific package.
6
- * @param name - The name of the schema.
7
- * @param value - The schema value.
8
- * @param packageName - The package name (null for main package, '@scope/package' for addon packages).
9
- * @ignore
10
- */
11
4
  export const addSchema = (name, value, packageName = null) => {
12
5
  const schema = value?.default ?? value;
13
6
  pikkuState(packageName, 'misc', 'schemas').set(name, schema);
14
7
  };
15
- /**
16
- * Retrieves a schema from the schemas map for a specific package.
17
- * @param name - The name of the schema.
18
- * @param packageName - The package name (null for main package, '@scope/package' for addon packages).
19
- * @returns The schema value or undefined if not found.
20
- * @ignore
21
- */
22
8
  export const getSchema = (name, packageName = null) => {
23
9
  return pikkuState(packageName, 'misc', 'schemas').get(name);
24
10
  };
25
- /**
26
- * Loads a schema and compiles it into a validator.
27
- * @param logger - A logger for logging information.
28
- */
29
11
  export const compileAllSchemas = (logger, schemaService) => {
30
12
  if (!schemaService) {
31
13
  schemaService = pikkuState(null, 'package', 'singletonServices')?.schema;
@@ -66,27 +48,11 @@ const validateAllSchemasLoaded = (logger, schemaService) => {
66
48
  }
67
49
  };
68
50
  /**
69
- * Fill in absent top-level properties from their schema `default`.
70
- *
71
- * A `default` reaches the generated JSON Schema and keeps the property out of
72
- * `required`, so omitting it validates but nothing was ever filling it in.
73
- * JSON Schema validators are pure by specification and none of the ones Pikku
74
- * ships with (`@cfworker/json-schema`, and Ajv unless `useDefaults` is set)
75
- * annotate the instance, so the function received `undefined` for a property
76
- * its generated type declares as present. That is the worst shape a mismatch
77
- * can take: validation permits the omission, the type says the value is there,
78
- * and the body reads `undefined`.
79
- *
80
- * Applied unconditionally rather than alongside `coerceTopLevelDataFromSchema`,
81
- * whose `coerceDataFromSchema` flag is about decoding transport-encoded values
82
- * (a query string's `"1,2"` into an array). Defaults are a property of the
83
- * schema, not of how the call arrived, so gating them on that flag would apply
84
- * them over HTTP and skip them on a direct RPC invocation.
85
- *
86
- * Returns the data to use, which is a new object only when defaults had to be
87
- * added to a nullish input — a call made with no arguments at all still gets
88
- * them. Values are cloned so an object or array default (`[]`, `{}`) is never
89
- * shared as one mutable instance across every request.
51
+ * Fills in absent top-level properties from their schema `default`. Applied
52
+ * unconditionally: a default belongs to the schema, not to the transport the
53
+ * call arrived on, and runs before coercion so a defaulted and a supplied
54
+ * value are treated identically from here on. Values are cloned so an object
55
+ * or array default is never shared as one mutable instance across requests.
90
56
  */
91
57
  export const applyDefaultsFromSchema = (schemaName, data, packageName = null) => {
92
58
  const schema = pikkuState(packageName, 'misc', 'schemas').get(schemaName);
package/dist/scopes.d.ts CHANGED
@@ -1,31 +1,12 @@
1
1
  import type { CoreUserSession } from './types/core.types.js';
2
2
  /**
3
- * Whether a set of held grants satisfies every required scope.
4
- *
5
3
  * The non-throwing counterpart to {@link verifyScopes}, for deciding rather
6
- * than enforcing an authorization gate that falls back to another check when
7
- * it is not satisfied, rather than rejecting the request outright.
8
- *
9
- * Fails closed: an absent or empty `held` satisfies nothing. An empty
10
- * `required` is satisfied by anything.
11
- *
12
- * @param required - Scopes to check for. Empty means no gate.
13
- * @param held - The grants held, e.g. `session.scopes`. May be undefined.
4
+ * than enforcing. Fails closed; an empty `required` is satisfied by anything.
14
5
  */
15
6
  export declare const hasScopes: (required: readonly string[] | undefined, held: Iterable<string> | undefined) => boolean;
16
7
  /**
17
- * Verifies that a session holds every required scope, throwing on the first
18
- * one it does not.
19
- *
20
- * Scopes are an AND gate: every entry in `required` must be satisfied. This is
21
- * deliberately distinct from `permissions`, which OR together — a scope can
22
- * only ever narrow access, so adding one to a function can never widen it.
23
- *
24
- * Fails closed: a session without a `scopes` field, or no session at all,
25
- * satisfies nothing.
26
- *
27
- * @param required - Scopes the function declares. Empty means no gate.
28
- * @param session - The session to check. May be undefined.
29
- * @throws {MissingScopeError} Naming the first unsatisfied scope.
8
+ * Throws {@link MissingScopeError} naming the first scope the session does not
9
+ * hold. Fails closed: no session, or a session without `scopes`, satisfies
10
+ * nothing.
30
11
  */
31
12
  export declare const verifyScopes: (required: readonly string[] | undefined, session: CoreUserSession | undefined) => void;
package/dist/scopes.js CHANGED
@@ -2,13 +2,9 @@ import { MissingScopeError } from './errors/errors.js';
2
2
  const SEPARATOR = ':';
3
3
  const WILDCARD = '*';
4
4
  /**
5
- * Builds every grant that would satisfy `scope`: the scope itself, a wildcard
5
+ * Every grant that would satisfy `scope`: the scope itself, a wildcard
6
6
  * directly beneath it, a wildcard at each ancestor level, and each plain
7
- * ancestor id — holding a parent scope grants everything nested beneath it.
8
- *
9
- * For `admin:invoices:create` that is:
10
- * admin:invoices:create, admin:invoices:create:*, *, admin:*, admin:invoices:*,
11
- * admin, admin:invoices
7
+ * ancestor id.
12
8
  */
13
9
  const satisfyingGrants = (scope) => {
14
10
  const segments = scope.split(SEPARATOR);
@@ -21,26 +17,8 @@ const satisfyingGrants = (scope) => {
21
17
  }
22
18
  return grants;
23
19
  };
24
- /**
25
- * Checks whether `held` satisfies a single required scope.
26
- *
27
- * A grant satisfies a requirement when it is the scope itself, a plain ancestor
28
- * (`admin` covers `admin:invoices:create`), a wildcard at or above it (`admin:*`
29
- * covers `admin` and `admin:invoices:create`), or the bare `*`. A narrower grant
30
- * never satisfies a broader requirement — `admin:invoices` does not grant
31
- * `admin`.
32
- */
33
20
  const holds = (held, scope) => satisfyingGrants(scope).some((grant) => held.has(grant));
34
- /**
35
- * The first required scope a set of held grants does not satisfy, or `null`
36
- * when every one is satisfied.
37
- *
38
- * Scopes are an AND gate: every entry in `required` must be satisfied. This is
39
- * deliberately distinct from `permissions`, which OR together — a scope can
40
- * only ever narrow access, so adding one to a function can never widen it.
41
- *
42
- * Fails closed: an absent `held` satisfies nothing.
43
- */
21
+ /** The first required scope `held` does not satisfy, or `null`. Fails closed. */
44
22
  const firstUnsatisfied = (required, held) => {
45
23
  if (!required || required.length === 0) {
46
24
  return null;
@@ -54,33 +32,14 @@ const firstUnsatisfied = (required, held) => {
54
32
  return null;
55
33
  };
56
34
  /**
57
- * Whether a set of held grants satisfies every required scope.
58
- *
59
35
  * The non-throwing counterpart to {@link verifyScopes}, for deciding rather
60
- * than enforcing an authorization gate that falls back to another check when
61
- * it is not satisfied, rather than rejecting the request outright.
62
- *
63
- * Fails closed: an absent or empty `held` satisfies nothing. An empty
64
- * `required` is satisfied by anything.
65
- *
66
- * @param required - Scopes to check for. Empty means no gate.
67
- * @param held - The grants held, e.g. `session.scopes`. May be undefined.
36
+ * than enforcing. Fails closed; an empty `required` is satisfied by anything.
68
37
  */
69
38
  export const hasScopes = (required, held) => firstUnsatisfied(required, held) === null;
70
39
  /**
71
- * Verifies that a session holds every required scope, throwing on the first
72
- * one it does not.
73
- *
74
- * Scopes are an AND gate: every entry in `required` must be satisfied. This is
75
- * deliberately distinct from `permissions`, which OR together — a scope can
76
- * only ever narrow access, so adding one to a function can never widen it.
77
- *
78
- * Fails closed: a session without a `scopes` field, or no session at all,
79
- * satisfies nothing.
80
- *
81
- * @param required - Scopes the function declares. Empty means no gate.
82
- * @param session - The session to check. May be undefined.
83
- * @throws {MissingScopeError} Naming the first unsatisfied scope.
40
+ * Throws {@link MissingScopeError} naming the first scope the session does not
41
+ * hold. Fails closed: no session, or a session without `scopes`, satisfies
42
+ * nothing.
84
43
  */
85
44
  export const verifyScopes = (required, session) => {
86
45
  const missing = firstUnsatisfied(required, session?.scopes);
@@ -0,0 +1,56 @@
1
+ import type { Secret } from './data-classification.js';
2
+ declare const secretValueBrand: unique symbol;
3
+ export declare const REDACTED = "[secret]";
4
+ /** Runtime marker, resilient to duplicate copies of core. */
5
+ declare const SECRET_VALUE: unique symbol;
6
+ declare const NODE_INSPECT: unique symbol;
7
+ export declare class SecretCoercionError extends Error {
8
+ constructor();
9
+ }
10
+ /**
11
+ * A vault secret. Nominal, so it is not assignable to `string` and every
12
+ * concretely-typed sink rejects it; `.reveal()` is the one way out, and every
13
+ * call is a deliberate, greppable disclosure.
14
+ *
15
+ * The revealed value carries the erasable `Secret<T>` classification brand, so
16
+ * the inspector can still follow it one hop past the call.
17
+ *
18
+ * Structured serialization redacts to `[secret]` — an audit or log write must
19
+ * stay honest about the field without crashing the request. String coercion
20
+ * throws, because a template literal or concatenation is always a leak.
21
+ */
22
+ export declare class SecretValue<T = string> {
23
+ #private;
24
+ readonly [secretValueBrand]: true;
25
+ readonly [SECRET_VALUE] = true;
26
+ constructor(value: T);
27
+ reveal(): Secret<T>;
28
+ toJSON(): string;
29
+ [NODE_INSPECT](): string;
30
+ toString(): never;
31
+ [Symbol.toPrimitive](): never;
32
+ }
33
+ export declare const createSecretValue: <T>(value: T) => SecretValue<T>;
34
+ export declare const isSecretValue: (value: unknown) => value is SecretValue<unknown>;
35
+ type IsAny<T> = 0 extends 1 & T ? true : false;
36
+ type Passthrough = Function | Date | RegExp | Error | ArrayBuffer | ArrayBufferView;
37
+ /**
38
+ * Rejects a `SecretValue` anywhere in `T`, however deeply nested, by collapsing
39
+ * it to `never`.
40
+ *
41
+ * For sinks whose parameters are `any`, `unknown` or a free generic — loggers,
42
+ * queue payloads, channel messages — where nominality alone cannot help.
43
+ * `any` is passed through untouched: it cannot be guarded, and collapsing it
44
+ * would reject every legitimate call.
45
+ *
46
+ * `Promise`, `Map` and `Set` are recursed into rather than passed through. A
47
+ * mapped type cannot reach what they hold — mapping their keys yields their
48
+ * methods, not their contents — so treating them as opaque let a secret ride
49
+ * through inside one. `Promise` is the case that bites: `getSecret()` returns
50
+ * `Promise<SecretValue<T>>`, so a forgotten `await` would otherwise log a
51
+ * secret.
52
+ */
53
+ export type Safe<T> = IsAny<T> extends true ? T : [Extract<T, SecretValue<any>>] extends [never] ? T extends Promise<infer V> ? Promise<Safe<V>> : T extends Map<infer K, infer V> ? Map<Safe<K>, Safe<V>> : T extends Set<infer V> ? Set<Safe<V>> : T extends Passthrough ? T : T extends object ? {
54
+ [K in keyof T]: Safe<T[K]>;
55
+ } : T : never;
56
+ export {};
@@ -0,0 +1,46 @@
1
+ export const REDACTED = '[secret]';
2
+ /** Runtime marker, resilient to duplicate copies of core. */
3
+ const SECRET_VALUE = Symbol.for('pikku.secretValue');
4
+ const NODE_INSPECT = Symbol.for('nodejs.util.inspect.custom');
5
+ export class SecretCoercionError extends Error {
6
+ constructor() {
7
+ super(`A secret was coerced to a string, which would write it out in the clear. Unwrap it deliberately with .reveal() at the point it reaches the wire.`);
8
+ this.name = 'SecretCoercionError';
9
+ }
10
+ }
11
+ /**
12
+ * A vault secret. Nominal, so it is not assignable to `string` and every
13
+ * concretely-typed sink rejects it; `.reveal()` is the one way out, and every
14
+ * call is a deliberate, greppable disclosure.
15
+ *
16
+ * The revealed value carries the erasable `Secret<T>` classification brand, so
17
+ * the inspector can still follow it one hop past the call.
18
+ *
19
+ * Structured serialization redacts to `[secret]` — an audit or log write must
20
+ * stay honest about the field without crashing the request. String coercion
21
+ * throws, because a template literal or concatenation is always a leak.
22
+ */
23
+ export class SecretValue {
24
+ [SECRET_VALUE] = true;
25
+ #value;
26
+ constructor(value) {
27
+ this.#value = value;
28
+ }
29
+ reveal() {
30
+ return this.#value;
31
+ }
32
+ toJSON() {
33
+ return REDACTED;
34
+ }
35
+ [NODE_INSPECT]() {
36
+ return REDACTED;
37
+ }
38
+ toString() {
39
+ throw new SecretCoercionError();
40
+ }
41
+ [Symbol.toPrimitive]() {
42
+ throw new SecretCoercionError();
43
+ }
44
+ }
45
+ export const createSecretValue = (value) => new SecretValue(value);
46
+ export const isSecretValue = (value) => typeof value === 'object' && value !== null && SECRET_VALUE in value;
@@ -12,6 +12,26 @@ export type AIAgentRunnerParams = {
12
12
  /** Pikku agent function name — forwarded to the LLM proxy (LiteLLM) as
13
13
  * request-level metadata so usage can be broken down per agent. */
14
14
  agentId?: string;
15
+ /**
16
+ * Cancels the model call itself, not just delivery of its output. Set by
17
+ * `streamAIAgent` from the run's interrupt handle so a voice barge-in stops
18
+ * generation upstream rather than leaving tokens being billed into a stream
19
+ * nobody reads. A runner that ignores it degrades to "the caller stops
20
+ * listening", which is the behaviour before this field existed.
21
+ */
22
+ abortSignal?: AbortSignal;
23
+ /**
24
+ * Per-provider settings passed to the model untouched — the escape hatch for
25
+ * anything the shared params above cannot express because only one vendor
26
+ * has it.
27
+ *
28
+ * The setting that motivated it is `reasoningEffort`. A voice turn is heard
29
+ * rather than read, so the wait before the first word is most of the
30
+ * experience: `{ openai: { reasoningEffort: 'minimal' } }` on gpt-5-mini
31
+ * measured 0.9s to first token against 2.5s at the default, and 1.6s of
32
+ * silence is a long time to sit through having just finished speaking.
33
+ */
34
+ providerOptions?: AIProviderOptions;
15
35
  };
16
36
  export type AIAgentRunnerResult = {
17
37
  text: string;
@@ -1,31 +1,8 @@
1
- /**
2
- * A narrow, dedicated embedding service.
3
- *
4
- * Vector stores (Qdrant, Pinecone, Supabase/pgvector, …) depend on this to turn
5
- * text into vectors, at BOTH index time (ingest) and query time (search). The
6
- * embedding model is fixed at construction so those two moments cannot drift
7
- * into different vector spaces — a mismatch would silently break similarity
8
- * search. Provider addons (e.g. `@pikku/addon-openai`) implement it; the app
9
- * wires a single instance into `singletonServices.aiEmbedding`.
10
- *
11
- * This is deliberately smaller than {@link AIAgentRunnerService} (whose optional
12
- * `embed`/`embedMany` take a per-call model): a vector store should not have to
13
- * pull in the whole agent-runner tool loop just to embed, and pinning the model
14
- * to the service is what guarantees index/query consistency.
15
- *
16
- * Documents (ingested corpus) and queries (search text) are embedded through
17
- * separate methods because some models are asymmetric — Cohere's `input_type`,
18
- * E5's `query:`/`passage:` prefixes, BGE's query instruction — and must know
19
- * which side they are embedding to produce comparable vectors. Symmetric
20
- * providers (e.g. OpenAI) point both methods at the same call.
21
- */
22
1
  export interface AIEmbeddingService {
23
- /** The embedding model backing this service. Index and query share it. */
24
2
  readonly model: string;
25
- /** The vector dimensionality this model produces, when known. */
26
3
  readonly dimensions?: number;
27
- /** Embed corpus documents (index time), preserving input order. */
4
+ /** Index time. Preserves input order. */
28
5
  embedDocuments(values: string[]): Promise<number[][]>;
29
- /** Embed a search query (query time) into a vector. */
6
+ /** Query time. */
30
7
  embedQuery(value: string): Promise<number[]>;
31
8
  }
@@ -1,5 +1,6 @@
1
1
  import type { CoreUserSession, PikkuWire, PikkuWiringTypes } from '../types/core.types.js';
2
2
  import type { Logger } from './logger.js';
3
+ import type { Safe } from '../secret-value.js';
3
4
  export type AuditDurability = 'best-effort' | 'transactional';
4
5
  export type AuditOutcome = 'success' | 'failed' | 'denied';
5
6
  export type AuditSource = 'auto' | 'explicit';
@@ -9,7 +10,19 @@ export type AuditConfig = boolean | {
9
10
  export type ResolvedAuditConfig = {
10
11
  durability: AuditDurability;
11
12
  };
12
- export type AuditActor = {
13
+ /**
14
+ * Who an event happened under.
15
+ *
16
+ * A user, not an "actor": in pikku an actor is a synthetic person a scenario
17
+ * drives, flagged `actor` on the user row, and the overwhelming majority of
18
+ * audited events are caused by ordinary customers. Naming this `actor` made the
19
+ * synthetic case unsayable — `actor.actor === true` — and implied every
20
+ * recorded action was a test.
21
+ *
22
+ * `pikkuUserId` is the identity pikku resolves for every wire, so it is the one
23
+ * field a signed-out caller still leaves behind.
24
+ */
25
+ export type AuditUserIdentity = {
13
26
  userId?: string;
14
27
  orgId?: string;
15
28
  pikkuUserId?: string;
@@ -26,26 +39,83 @@ export type AuditEvent = {
26
39
  traceId?: string;
27
40
  transactionId?: string | null;
28
41
  queryId?: string | null;
29
- actor?: AuditActor;
42
+ userIdentity?: AuditUserIdentity;
30
43
  input?: unknown;
31
44
  metadata?: Record<string, unknown>;
32
45
  };
33
46
  export type AuditEventBatch = AuditEvent[];
47
+ /**
48
+ * A page of the trail, newest first, narrowed by the filters a reader picked.
49
+ *
50
+ * Every field is a conjunction, and an empty array is not a filter — it is
51
+ * "match nothing", which would otherwise read as "match everything" and quietly
52
+ * widen a scoped query.
53
+ */
54
+ export type AuditQuery = {
55
+ /** Restrict to these users. */
56
+ userIds?: string[];
57
+ /** Restrict to these `AuditEvent['type']` values. */
58
+ types?: string[];
59
+ /** Restrict to one organisation. */
60
+ orgId?: string;
61
+ /** Inclusive lower bound on `occurredAt` (ISO 8601). */
62
+ from?: string;
63
+ /** Exclusive upper bound on `occurredAt` (ISO 8601). */
64
+ to?: string;
65
+ limit?: number;
66
+ offset?: number;
67
+ };
68
+ /**
69
+ * The distinct values present in the trail, for populating filter controls.
70
+ *
71
+ * Computed over the whole trail rather than the current page — a filter list
72
+ * that only offered what the current page happens to show could never be used
73
+ * to reach anything else.
74
+ */
75
+ export type AuditFacets = {
76
+ userIds: string[];
77
+ types: string[];
78
+ };
79
+ export type AuditQueryResult = {
80
+ events: AuditEvent[];
81
+ /** Offset of the next page, or `null` at the end. */
82
+ nextCursor: number | null;
83
+ /** Present only when the caller asked for it — it costs two extra scans. */
84
+ facets?: AuditFacets;
85
+ };
34
86
  export interface AuditService {
35
87
  audit(event: AuditEvent): Promise<void>;
36
88
  write?(batch: AuditEventBatch): Promise<void>;
89
+ /**
90
+ * The read side. Optional because a sink can legitimately be write-only — a
91
+ * queue producer that hands events to another system has nothing to read
92
+ * back. A reader that finds this absent should say the trail is not readable
93
+ * here rather than that it is empty; the two are very different answers.
94
+ */
95
+ query?(query: AuditQuery): Promise<AuditQueryResult>;
96
+ /** Distinct users and types across the whole trail. Paired with {@link query}. */
97
+ facets?(): Promise<AuditFacets>;
37
98
  }
38
99
  export declare class NoopAuditService implements AuditService {
39
100
  audit(_event: AuditEvent): Promise<void>;
40
101
  write(_batch: AuditEventBatch): Promise<void>;
41
102
  }
42
103
  export type AuditLogWriteInput = Omit<AuditEvent, 'occurredAt'>;
104
+ /**
105
+ * The audit an invocation writes to. `write` is `Safe<>`-guarded like the
106
+ * logger: an audit event carries `input` and `metadata` as `unknown`, so
107
+ * nominality alone cannot stop a `SecretValue` landing in one. A secret
108
+ * anywhere in the event, however deeply nested, collapses to `never`.
109
+ *
110
+ * An unrevealed `SecretValue` would serialize as `[secret]` anyway; the guard
111
+ * is what makes that an explicit choice rather than a near miss.
112
+ */
43
113
  export interface AuditLog {
44
114
  readonly config: ResolvedAuditConfig | undefined;
45
- write(event: AuditLogWriteInput): Promise<void>;
115
+ write<E extends AuditLogWriteInput>(event: Safe<E>): Promise<void>;
46
116
  flush(): Promise<void>;
47
117
  close(): Promise<void>;
48
118
  }
49
119
  export declare const resolveAuditConfig: (config?: AuditConfig) => ResolvedAuditConfig | undefined;
50
120
  export declare const createInvocationAudit: (service: AuditService, wire: PikkuWire<any, any, any, CoreUserSession>, logger?: Logger) => AuditLog;
51
- export declare const resolveAuditActorFromWire: (wire: PikkuWire<any, any, any, CoreUserSession>) => AuditActor | undefined;
121
+ export declare const resolveAuditUserIdentityFromWire: (wire: PikkuWire<any, any, any, CoreUserSession>) => AuditUserIdentity | undefined;
@@ -14,8 +14,7 @@ class DisabledInvocationAudit {
14
14
  async write(_event) {
15
15
  if (!this.warned) {
16
16
  this.warned = true;
17
- // Fall back to the singleton logger — wires rarely carry their own, and
18
- // a dropped audit write must never be invisible.
17
+ // knowledge: decisions/security/a-dropped-audit-write-is-always-logged.md
19
18
  const logger = this.wire.logger ?? this.logger;
20
19
  logger?.warn?.(`audit.write() dropped for '${this.wire.functionId ?? 'unknown function'}' — the function has no audit config (set audit: true on it)`);
21
20
  }
@@ -76,7 +75,7 @@ class InvocationAuditLog {
76
75
  wireType: this.wire.wireType,
77
76
  wireId: this.wire.wireId,
78
77
  traceId: this.wire.traceId,
79
- actor: event.actor ?? resolveAuditActorFromWire(this.wire),
78
+ userIdentity: event.userIdentity ?? resolveAuditUserIdentityFromWire(this.wire),
80
79
  ...event,
81
80
  occurredAt: new Date().toISOString(),
82
81
  };
@@ -99,15 +98,17 @@ export const createInvocationAudit = (service, wire, logger) => {
99
98
  }
100
99
  return new InvocationAuditLog(wire.audit, service, wire, logger);
101
100
  };
102
- export const resolveAuditActorFromWire = (wire) => {
101
+ export const resolveAuditUserIdentityFromWire = (wire) => {
103
102
  const session = wire.session;
104
- const actor = {
103
+ const userIdentity = {
105
104
  userId: session?.userId,
106
105
  orgId: session?.orgId,
107
106
  pikkuUserId: wire.pikkuUserId,
108
107
  };
109
- if (!actor.userId && !actor.orgId && !actor.pikkuUserId) {
108
+ if (!userIdentity.userId &&
109
+ !userIdentity.orgId &&
110
+ !userIdentity.pikkuUserId) {
110
111
  return undefined;
111
112
  }
112
- return actor;
113
+ return userIdentity;
113
114
  };
@@ -1,23 +1,14 @@
1
- /**
2
- * Arguments for signing a content key into a time-limited URL.
3
- */
4
1
  export interface SignContentKeyArgs<TBucket extends string = string> {
5
2
  bucket: TBucket;
6
3
  contentKey: string;
7
4
  dateLessThan: Date;
8
5
  dateGreaterThan?: Date;
9
6
  }
10
- /**
11
- * Arguments for signing an arbitrary URL.
12
- */
13
7
  export interface SignURLArgs {
14
8
  url: string;
15
9
  dateLessThan: Date;
16
10
  dateGreaterThan?: Date;
17
11
  }
18
- /**
19
- * Arguments for minting a presigned upload URL.
20
- */
21
12
  export interface GetUploadURLArgs<TBucket extends string = string> {
22
13
  bucket: TBucket;
23
14
  fileKey: string;
@@ -25,66 +16,30 @@ export interface GetUploadURLArgs<TBucket extends string = string> {
25
16
  size?: number;
26
17
  visibility?: 'private' | 'public';
27
18
  }
28
- /**
29
- * Result of minting a presigned upload URL.
30
- */
31
19
  export interface UploadURLResult {
32
20
  uploadUrl: string;
33
21
  assetKey: string;
34
22
  uploadHeaders?: Record<string, string>;
35
23
  uploadMethod?: 'PUT' | 'POST';
36
24
  }
37
- /**
38
- * Arguments for an operation that targets a single object by key.
39
- */
40
25
  export interface BucketKeyArgs<TBucket extends string = string> {
41
26
  bucket: TBucket;
42
27
  key: string;
43
28
  }
44
- /**
45
- * Arguments for writing a stream to storage.
46
- */
47
29
  export interface WriteFileArgs<TBucket extends string = string> extends BucketKeyArgs<TBucket> {
48
30
  stream: ReadableStream | NodeJS.ReadableStream;
49
31
  }
50
- /**
51
- * Arguments for copying a local file into storage.
52
- */
53
32
  export interface CopyFileArgs<TBucket extends string = string> extends BucketKeyArgs<TBucket> {
54
33
  fromAbsolutePath: string;
55
34
  }
56
35
  export interface ContentService<TBucket extends string = string> {
57
- /**
58
- * Signs a content key to generate a secure, time-limited access URL.
59
- */
60
36
  signContentKey(args: SignContentKeyArgs<TBucket>): Promise<string>;
61
- /**
62
- * Signs an arbitrary URL to generate a secure, time-limited access URL.
63
- */
64
37
  signURL(args: SignURLArgs): Promise<string>;
65
- /**
66
- * Generates a signed URL for uploading a file directly to storage.
67
- * Bucket policy (size limits, MIME allowlist) is enforced by the implementation.
68
- */
38
+ /** Bucket policy (size limits, MIME allowlist) is enforced by the implementation, not the caller. */
69
39
  getUploadURL(args: GetUploadURLArgs<TBucket>): Promise<UploadURLResult>;
70
- /**
71
- * Deletes a file from the storage backend.
72
- */
73
40
  deleteFile(args: BucketKeyArgs<TBucket>): Promise<boolean>;
74
- /**
75
- * Uploads a file stream to storage under the specified bucket + key.
76
- */
77
41
  writeFile(args: WriteFileArgs<TBucket>): Promise<boolean>;
78
- /**
79
- * Copies a file from a local absolute path into storage.
80
- */
81
42
  copyFile(args: CopyFileArgs<TBucket>): Promise<boolean>;
82
- /**
83
- * Reads a file from storage as a readable stream.
84
- */
85
43
  readFile(args: BucketKeyArgs<TBucket>): Promise<ReadableStream | NodeJS.ReadableStream>;
86
- /**
87
- * Reads an entire file from storage into a Buffer.
88
- */
89
44
  readFileAsBuffer(args: BucketKeyArgs<TBucket>): Promise<Buffer>;
90
45
  }