@pikku/core 0.12.71 → 0.12.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (819) hide show
  1. package/CHANGELOG.md +848 -0
  2. package/dist/crypto-utils.d.ts +30 -5
  3. package/dist/crypto-utils.js +146 -41
  4. package/dist/dev/hot-reload.js +11 -30
  5. package/dist/dev/module-runner.d.ts +3 -7
  6. package/dist/dev/module-runner.js +4 -10
  7. package/dist/dev/reload-meta.d.ts +8 -20
  8. package/dist/dev/reload-meta.js +9 -29
  9. package/dist/errors/error-handler.d.ts +5 -30
  10. package/dist/errors/error-handler.js +16 -32
  11. package/dist/errors/errors.d.ts +32 -151
  12. package/dist/errors/errors.js +55 -157
  13. package/dist/function/abort-scope.d.ts +47 -0
  14. package/dist/function/abort-scope.js +63 -0
  15. package/dist/function/function-runner.js +40 -30
  16. package/dist/function/functions.types.d.ts +44 -136
  17. package/dist/function/functions.types.js +0 -58
  18. package/dist/function/list.types.d.ts +12 -62
  19. package/dist/function/list.types.js +4 -25
  20. package/dist/handle-error.d.ts +0 -11
  21. package/dist/handle-error.js +6 -18
  22. package/dist/index.d.ts +5 -2
  23. package/dist/index.js +4 -1
  24. package/dist/middleware/auth-apikey.d.ts +3 -18
  25. package/dist/middleware/auth-apikey.js +0 -17
  26. package/dist/middleware/auth-bearer.d.ts +6 -41
  27. package/dist/middleware/auth-bearer.js +3 -40
  28. package/dist/middleware/auth-cookie.d.ts +5 -27
  29. package/dist/middleware/auth-cookie.js +2 -26
  30. package/dist/middleware/cors.d.ts +7 -34
  31. package/dist/middleware/cors.js +7 -34
  32. package/dist/middleware/remote-auth.d.ts +3 -1
  33. package/dist/middleware/remote-auth.js +3 -2
  34. package/dist/middleware/telemetry.d.ts +8 -33
  35. package/dist/middleware/telemetry.js +2 -31
  36. package/dist/middleware-runner.d.ts +4 -55
  37. package/dist/middleware-runner.js +5 -74
  38. package/dist/permissions.d.ts +3 -44
  39. package/dist/permissions.js +19 -71
  40. package/dist/pikku-request.d.ts +0 -6
  41. package/dist/pikku-request.js +0 -6
  42. package/dist/pikku-state.d.ts +0 -26
  43. package/dist/pikku-state.js +2 -30
  44. package/dist/remote.d.ts +3 -5
  45. package/dist/remote.js +8 -7
  46. package/dist/schema.d.ts +7 -17
  47. package/dist/schema.js +30 -18
  48. package/dist/scopes.d.ts +4 -23
  49. package/dist/scopes.js +7 -48
  50. package/dist/services/ai-agent-runner-service.d.ts +20 -0
  51. package/dist/services/ai-embedding-service.d.ts +2 -25
  52. package/dist/services/audit-service.js +1 -2
  53. package/dist/services/content-service.d.ts +1 -46
  54. package/dist/services/credential-service.d.ts +3 -40
  55. package/dist/services/deployment-service.d.ts +3 -9
  56. package/dist/services/gateway-service.d.ts +0 -15
  57. package/dist/services/http-personas.d.ts +80 -0
  58. package/dist/services/http-personas.js +233 -0
  59. package/dist/services/in-memory-queue-service.d.ts +0 -14
  60. package/dist/services/in-memory-queue-service.js +1 -15
  61. package/dist/services/in-memory-trigger-service.d.ts +0 -18
  62. package/dist/services/in-memory-trigger-service.js +1 -18
  63. package/dist/services/in-memory-workflow-service.d.ts +0 -16
  64. package/dist/services/in-memory-workflow-service.js +4 -33
  65. package/dist/services/index.d.ts +5 -6
  66. package/dist/services/index.js +2 -5
  67. package/dist/services/istanbul-coverage-service.d.ts +1 -5
  68. package/dist/services/istanbul-coverage-service.js +2 -8
  69. package/dist/services/jwt-service.d.ts +1 -16
  70. package/dist/services/local-content.d.ts +13 -2
  71. package/dist/services/local-content.js +40 -13
  72. package/dist/services/local-gateway-service.d.ts +0 -16
  73. package/dist/services/local-gateway-service.js +2 -17
  74. package/dist/services/local-secrets.d.ts +0 -4
  75. package/dist/services/local-secrets.js +0 -4
  76. package/dist/services/logger-console.d.ts +3 -7
  77. package/dist/services/logger-console.js +3 -7
  78. package/dist/services/logger.d.ts +2 -37
  79. package/dist/services/meta-service.d.ts +23 -26
  80. package/dist/services/meta-service.js +22 -36
  81. package/dist/services/personas-service.d.ts +134 -0
  82. package/dist/services/personas-service.js +40 -0
  83. package/dist/services/pikku-user-id.js +0 -4
  84. package/dist/services/queue-webhook-service.d.ts +2 -36
  85. package/dist/services/queue-webhook-service.js +9 -41
  86. package/dist/services/scheduler-service.d.ts +1 -50
  87. package/dist/services/scheduler-service.js +0 -10
  88. package/dist/services/schema-service.d.ts +1 -24
  89. package/dist/services/scope-service.d.ts +49 -34
  90. package/dist/services/scoped-secret-service.d.ts +0 -4
  91. package/dist/services/scoped-secret-service.js +0 -4
  92. package/dist/services/secret-host-binding.d.ts +8 -0
  93. package/dist/services/secret-host-binding.js +36 -0
  94. package/dist/services/secret-service.d.ts +5 -33
  95. package/dist/services/secretless.d.ts +6 -0
  96. package/dist/services/secretless.js +21 -0
  97. package/dist/services/stub-tracker.d.ts +7 -18
  98. package/dist/services/stub-tracker.js +8 -18
  99. package/dist/services/system-role-guard.d.ts +33 -0
  100. package/dist/services/system-role-guard.js +38 -0
  101. package/dist/services/trigger-service.d.ts +0 -12
  102. package/dist/services/typed-secret-service.d.ts +0 -7
  103. package/dist/services/typed-secret-service.js +1 -7
  104. package/dist/services/v8-coverage-service.d.ts +2 -3
  105. package/dist/services/v8-coverage-service.js +1 -2
  106. package/dist/services/variables-service.d.ts +1 -8
  107. package/dist/services/webhook-service.d.ts +19 -63
  108. package/dist/services/webhook-service.js +6 -20
  109. package/dist/services/workflow-service.d.ts +3 -15
  110. package/dist/testing/service-tests.js +0 -17
  111. package/dist/time-utils.d.ts +0 -16
  112. package/dist/time-utils.js +1 -19
  113. package/dist/types/core.types.d.ts +99 -219
  114. package/dist/types/core.types.js +0 -42
  115. package/dist/types/state.types.d.ts +4 -9
  116. package/dist/utils/hmac.d.ts +4 -10
  117. package/dist/utils/hmac.js +4 -10
  118. package/dist/utils/safe-fetch.d.ts +7 -35
  119. package/dist/utils/safe-fetch.js +13 -53
  120. package/dist/utils.d.ts +1 -6
  121. package/dist/utils.js +6 -15
  122. package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
  123. package/dist/wirings/actor-flow/index.d.ts +0 -9
  124. package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
  125. package/dist/wirings/actor-flow/run-conversation.js +14 -7
  126. package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
  127. package/dist/wirings/ai-agent/ai-agent-agui.js +34 -12
  128. package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
  129. package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
  130. package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
  131. package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
  132. package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
  133. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
  134. package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
  135. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
  136. package/dist/wirings/ai-agent/ai-agent-prepare.js +58 -131
  137. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
  138. package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
  139. package/dist/wirings/ai-agent/ai-agent-runner.js +49 -20
  140. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
  141. package/dist/wirings/ai-agent/ai-agent-stream.js +153 -63
  142. package/dist/wirings/ai-agent/ai-agent.types.d.ts +84 -4
  143. package/dist/wirings/ai-agent/index.d.ts +6 -4
  144. package/dist/wirings/ai-agent/index.js +5 -4
  145. package/dist/wirings/ai-agent/voice-input.d.ts +39 -1
  146. package/dist/wirings/ai-agent/voice-input.js +46 -3
  147. package/dist/wirings/ai-agent/voice-output.d.ts +54 -1
  148. package/dist/wirings/ai-agent/voice-output.js +153 -50
  149. package/dist/wirings/channel/channel-common.d.ts +7 -20
  150. package/dist/wirings/channel/channel-common.js +7 -21
  151. package/dist/wirings/channel/channel-handler.js +25 -6
  152. package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
  153. package/dist/wirings/channel/channel-host-rpc.js +38 -0
  154. package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
  155. package/dist/wirings/channel/channel-middleware-runner.js +0 -12
  156. package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
  157. package/dist/wirings/channel/channel-rpc-registry.js +89 -0
  158. package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
  159. package/dist/wirings/channel/channel-rpc-responder.js +71 -0
  160. package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
  161. package/dist/wirings/channel/channel-rpc-service.js +106 -0
  162. package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
  163. package/dist/wirings/channel/channel-rpc-validators.js +30 -0
  164. package/dist/wirings/channel/channel-rpc.d.ts +5 -0
  165. package/dist/wirings/channel/channel-rpc.js +5 -0
  166. package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
  167. package/dist/wirings/channel/channel-rpc.types.js +50 -0
  168. package/dist/wirings/channel/channel-runner.d.ts +0 -4
  169. package/dist/wirings/channel/channel-runner.js +0 -14
  170. package/dist/wirings/channel/channel-store.d.ts +0 -10
  171. package/dist/wirings/channel/channel.types.d.ts +12 -1
  172. package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
  173. package/dist/wirings/channel/define-channel-routes.js +0 -20
  174. package/dist/wirings/channel/eventhub-service.d.ts +0 -18
  175. package/dist/wirings/channel/index.d.ts +4 -1
  176. package/dist/wirings/channel/index.js +2 -0
  177. package/dist/wirings/channel/local/local-channel-runner.js +3 -1
  178. package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
  179. package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
  180. package/dist/wirings/channel/log-channels.d.ts +0 -4
  181. package/dist/wirings/channel/log-channels.js +0 -4
  182. package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
  183. package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
  184. package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
  185. package/dist/wirings/cli/channel/cli-approval.js +81 -0
  186. package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
  187. package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
  188. package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
  189. package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
  190. package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +20 -0
  191. package/dist/wirings/cli/channel/cli-raw-client-runner.js +121 -0
  192. package/dist/wirings/cli/channel/index.d.ts +4 -0
  193. package/dist/wirings/cli/channel/index.js +2 -0
  194. package/dist/wirings/cli/cli-runner.d.ts +20 -20
  195. package/dist/wirings/cli/cli-runner.js +28 -89
  196. package/dist/wirings/cli/cli.types.d.ts +14 -3
  197. package/dist/wirings/cli/command-parser.d.ts +1 -10
  198. package/dist/wirings/cli/command-parser.js +10 -87
  199. package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
  200. package/dist/wirings/cli/define-cli-commands.js +1 -17
  201. package/dist/wirings/credential/credential.types.d.ts +0 -12
  202. package/dist/wirings/credential/define-credential.d.ts +48 -0
  203. package/dist/wirings/credential/define-credential.js +47 -0
  204. package/dist/wirings/credential/index.d.ts +1 -1
  205. package/dist/wirings/credential/index.js +1 -1
  206. package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
  207. package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
  208. package/dist/wirings/gateway/gateway-runner.js +8 -105
  209. package/dist/wirings/gateway/gateway.types.d.ts +7 -80
  210. package/dist/wirings/http/http-routes.d.ts +0 -63
  211. package/dist/wirings/http/http-routes.js +0 -63
  212. package/dist/wirings/http/http-runner.d.ts +1 -100
  213. package/dist/wirings/http/http-runner.js +12 -166
  214. package/dist/wirings/http/http.types.d.ts +16 -55
  215. package/dist/wirings/http/index.d.ts +2 -1
  216. package/dist/wirings/http/index.js +1 -1
  217. package/dist/wirings/http/log-http-routes.d.ts +0 -4
  218. package/dist/wirings/http/log-http-routes.js +0 -4
  219. package/dist/wirings/http/pikku-fetch-http-request.d.ts +6 -36
  220. package/dist/wirings/http/pikku-fetch-http-request.js +56 -50
  221. package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
  222. package/dist/wirings/http/routers/path-to-regex.js +2 -13
  223. package/dist/wirings/http/web-request.d.ts +0 -8
  224. package/dist/wirings/http/web-request.js +25 -17
  225. package/dist/wirings/mcp/mcp-runner.d.ts +2 -0
  226. package/dist/wirings/mcp/mcp-runner.js +6 -16
  227. package/dist/wirings/mcp/mcp.types.d.ts +2 -35
  228. package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
  229. package/dist/wirings/oauth2/oauth2.types.js +0 -3
  230. package/dist/wirings/persona/define-personas.d.ts +28 -0
  231. package/dist/wirings/persona/define-personas.js +27 -0
  232. package/dist/wirings/persona/index.d.ts +21 -0
  233. package/dist/wirings/persona/index.js +17 -0
  234. package/dist/wirings/persona/persona-email.d.ts +37 -0
  235. package/dist/wirings/persona/persona-email.js +69 -0
  236. package/dist/wirings/persona/persona-environments.d.ts +45 -0
  237. package/dist/wirings/persona/persona-environments.js +81 -0
  238. package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
  239. package/dist/wirings/persona/persona-mailbox.js +53 -0
  240. package/dist/wirings/persona/persona.types.d.ts +125 -0
  241. package/dist/wirings/persona/persona.types.js +1 -0
  242. package/dist/wirings/persona/validate-personas.d.ts +53 -0
  243. package/dist/wirings/persona/validate-personas.js +94 -0
  244. package/dist/wirings/queue/index.d.ts +3 -0
  245. package/dist/wirings/queue/index.js +2 -3
  246. package/dist/wirings/queue/queue-identity.d.ts +28 -0
  247. package/dist/wirings/queue/queue-identity.js +102 -0
  248. package/dist/wirings/queue/queue-runner.d.ts +0 -19
  249. package/dist/wirings/queue/queue-runner.js +9 -30
  250. package/dist/wirings/queue/queue.types.d.ts +18 -89
  251. package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
  252. package/dist/wirings/queue/register-queue-helper.js +0 -11
  253. package/dist/wirings/queue/signed-queue-service.d.ts +16 -0
  254. package/dist/wirings/queue/signed-queue-service.js +42 -0
  255. package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
  256. package/dist/wirings/queue/validate-worker-config.js +0 -14
  257. package/dist/wirings/role/define-system-role.d.ts +32 -0
  258. package/dist/wirings/role/define-system-role.js +31 -0
  259. package/dist/wirings/role/index.d.ts +3 -0
  260. package/dist/wirings/role/index.js +2 -0
  261. package/dist/wirings/role/role.types.d.ts +43 -0
  262. package/dist/wirings/role/role.types.js +1 -0
  263. package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
  264. package/dist/wirings/role/validate-role-definitions.js +71 -0
  265. package/dist/wirings/rpc/addon-runner.d.ts +0 -19
  266. package/dist/wirings/rpc/addon-runner.js +0 -51
  267. package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -12
  268. package/dist/wirings/rpc/remote-addon-auth.js +1 -9
  269. package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
  270. package/dist/wirings/rpc/rpc-runner.js +88 -105
  271. package/dist/wirings/rpc/rpc-types.d.ts +7 -6
  272. package/dist/wirings/rpc/wire-addon.d.ts +25 -0
  273. package/dist/wirings/rpc/wire-addon.js +62 -0
  274. package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
  275. package/dist/wirings/rpc/wire-remote-addon.js +0 -8
  276. package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
  277. package/dist/wirings/scheduler/log-schedulers.js +0 -4
  278. package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
  279. package/dist/wirings/scheduler/scheduler-runner.js +0 -1
  280. package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
  281. package/dist/wirings/scope/define-scope.d.ts +32 -0
  282. package/dist/wirings/scope/define-scope.js +31 -0
  283. package/dist/wirings/scope/index.d.ts +1 -1
  284. package/dist/wirings/scope/index.js +1 -1
  285. package/dist/wirings/scope/scope.types.d.ts +7 -9
  286. package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
  287. package/dist/wirings/scope/validate-scope-definitions.js +3 -21
  288. package/dist/wirings/secret/index.d.ts +1 -1
  289. package/dist/wirings/secret/index.js +1 -1
  290. package/dist/wirings/secret/secret.types.d.ts +19 -15
  291. package/dist/wirings/secret/secret.types.js +1 -1
  292. package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
  293. package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
  294. package/dist/wirings/trigger/trigger-runner.js +1 -24
  295. package/dist/wirings/trigger/trigger.types.d.ts +1 -82
  296. package/dist/wirings/trigger/trigger.types.js +0 -34
  297. package/dist/wirings/variable/index.d.ts +1 -1
  298. package/dist/wirings/variable/index.js +1 -1
  299. package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
  300. package/dist/wirings/variable/variable.types.d.ts +1 -13
  301. package/dist/wirings/variable/variable.types.js +1 -1
  302. package/dist/wirings/virtual-user/index.d.ts +27 -0
  303. package/dist/wirings/virtual-user/index.js +8 -0
  304. package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
  305. package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
  306. package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
  307. package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
  308. package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
  309. package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
  310. package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
  311. package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
  312. package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
  313. package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
  314. package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
  315. package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
  316. package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
  317. package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
  318. package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
  319. package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
  320. package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
  321. package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
  322. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +5 -5
  323. package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
  324. package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
  325. package/dist/wirings/workflow/feature.d.ts +0 -19
  326. package/dist/wirings/workflow/feature.js +0 -19
  327. package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
  328. package/dist/wirings/workflow/graph/graph-node.js +0 -34
  329. package/dist/wirings/workflow/graph/graph-runner.js +6 -41
  330. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
  331. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
  332. package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
  333. package/dist/wirings/workflow/index.d.ts +5 -7
  334. package/dist/wirings/workflow/index.js +3 -17
  335. package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
  336. package/dist/wirings/workflow/pikku-scenario-service.js +204 -42
  337. package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
  338. package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
  339. package/dist/wirings/workflow/run-timeline.d.ts +0 -47
  340. package/dist/wirings/workflow/run-timeline.js +0 -22
  341. package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
  342. package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
  343. package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
  344. package/dist/wirings/workflow/scenario-poll.js +0 -12
  345. package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
  346. package/dist/wirings/workflow/scenario-prose.js +0 -18
  347. package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
  348. package/dist/wirings/workflow/scenario-step-guards.js +1 -14
  349. package/dist/wirings/workflow/scenario-step.types.d.ts +72 -6
  350. package/dist/wirings/workflow/scenario-step.types.js +5 -1
  351. package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
  352. package/dist/wirings/workflow/scenario-surface.js +56 -0
  353. package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
  354. package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
  355. package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
  356. package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
  357. package/dist/wirings/workflow/workflow.types.d.ts +0 -197
  358. package/knowledge/decisions/index.md +19 -0
  359. package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
  360. package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
  361. package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
  362. package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
  363. package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
  364. package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
  365. package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
  366. package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
  367. package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
  368. package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
  369. package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
  370. package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
  371. package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
  372. package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
  373. package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
  374. package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
  375. package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
  376. package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
  377. package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
  378. package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
  379. package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
  380. package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
  381. package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
  382. package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
  383. package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
  384. package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
  385. package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
  386. package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
  387. package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +34 -0
  388. package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
  389. package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
  390. package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
  391. package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
  392. package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
  393. package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
  394. package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
  395. package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
  396. package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
  397. package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
  398. package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
  399. package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
  400. package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
  401. package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
  402. package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
  403. package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
  404. package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
  405. package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
  406. package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
  407. package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
  408. package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
  409. package/knowledge/decisions/internals/index.md +113 -0
  410. package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
  411. package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
  412. package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
  413. package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
  414. package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
  415. package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
  416. package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
  417. package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
  418. package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
  419. package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
  420. package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
  421. package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
  422. package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
  423. package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
  424. package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
  425. package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
  426. package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
  427. package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
  428. package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
  429. package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
  430. package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
  431. package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
  432. package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
  433. package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
  434. package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
  435. package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
  436. package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
  437. package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
  438. package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
  439. package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
  440. package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
  441. package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
  442. package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
  443. package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
  444. package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
  445. package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
  446. package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
  447. package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
  448. package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
  449. package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
  450. package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
  451. package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
  452. package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
  453. package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
  454. package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
  455. package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
  456. package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
  457. package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
  458. package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
  459. package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
  460. package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
  461. package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
  462. package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
  463. package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
  464. package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
  465. package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
  466. package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
  467. package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
  468. package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
  469. package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
  470. package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
  471. package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
  472. package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
  473. package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
  474. package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
  475. package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
  476. package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
  477. package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
  478. package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
  479. package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
  480. package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
  481. package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
  482. package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
  483. package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
  484. package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
  485. package/knowledge/decisions/security/index.md +55 -0
  486. package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
  487. package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
  488. package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
  489. package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
  490. package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
  491. package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
  492. package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
  493. package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
  494. package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
  495. package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
  496. package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
  497. package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
  498. package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
  499. package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
  500. package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
  501. package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
  502. package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
  503. package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
  504. package/knowledge/index.md +24 -0
  505. package/knowledge/questions/index.md +15 -0
  506. package/package.json +4 -2
  507. package/run-tests.sh +0 -0
  508. package/src/crypto-utils.test.ts +460 -19
  509. package/src/crypto-utils.ts +283 -55
  510. package/src/data-classification.ts +1 -7
  511. package/src/dev/hot-reload.test.ts +0 -4
  512. package/src/dev/hot-reload.ts +11 -30
  513. package/src/dev/module-runner.ts +7 -32
  514. package/src/dev/reload-meta.ts +9 -29
  515. package/src/errors/error-handler.ts +20 -35
  516. package/src/errors/error.test.ts +30 -1
  517. package/src/errors/errors.ts +73 -157
  518. package/src/function/abort-scope.test.ts +97 -0
  519. package/src/function/abort-scope.ts +80 -0
  520. package/src/function/function-runner.test.ts +75 -7
  521. package/src/function/function-runner.ts +73 -30
  522. package/src/function/functions.types.ts +56 -136
  523. package/src/function/list.types.test.ts +3 -25
  524. package/src/function/list.types.ts +12 -62
  525. package/src/gopass-secrets-removed.test.ts +51 -0
  526. package/src/handle-error.test.ts +108 -1
  527. package/src/handle-error.ts +8 -18
  528. package/src/index.ts +60 -1
  529. package/src/middleware/auth-apikey.test.ts +0 -1
  530. package/src/middleware/auth-apikey.ts +0 -17
  531. package/src/middleware/auth-bearer.test.ts +0 -3
  532. package/src/middleware/auth-bearer.ts +3 -40
  533. package/src/middleware/auth-cookie.test.ts +0 -6
  534. package/src/middleware/auth-cookie.ts +2 -26
  535. package/src/middleware/cors.test.ts +34 -0
  536. package/src/middleware/cors.ts +12 -33
  537. package/src/middleware/remote-auth.test.ts +24 -9
  538. package/src/middleware/remote-auth.ts +10 -2
  539. package/src/middleware/telemetry.ts +2 -31
  540. package/src/middleware-runner.test.ts +0 -2
  541. package/src/middleware-runner.ts +5 -74
  542. package/src/permissions.test.ts +30 -0
  543. package/src/permissions.ts +24 -74
  544. package/src/pikku-request.ts +0 -6
  545. package/src/pikku-state.ts +2 -30
  546. package/src/production-barrels-stay-lean.test.ts +110 -0
  547. package/src/remote.test.ts +172 -0
  548. package/src/remote.ts +17 -7
  549. package/src/schema.test.ts +103 -0
  550. package/src/schema.ts +35 -18
  551. package/src/scopes.ts +7 -48
  552. package/src/services/ai-agent-runner-service.ts +20 -0
  553. package/src/services/ai-embedding-service.ts +3 -25
  554. package/src/services/audit-service.ts +1 -2
  555. package/src/services/content-service.ts +1 -46
  556. package/src/services/credential-service.ts +3 -40
  557. package/src/services/credential-wire-service.test.ts +0 -2
  558. package/src/services/deployment-service.ts +3 -9
  559. package/src/services/gateway-service.ts +0 -15
  560. package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
  561. package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
  562. package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
  563. package/src/services/in-memory-queue-service.ts +1 -15
  564. package/src/services/in-memory-trigger-service.ts +1 -18
  565. package/src/services/in-memory-workflow-service.test.ts +0 -13
  566. package/src/services/in-memory-workflow-service.ts +4 -38
  567. package/src/services/index.ts +20 -15
  568. package/src/services/istanbul-coverage-service.ts +2 -8
  569. package/src/services/jwt-service.ts +1 -16
  570. package/src/services/local-content.test.ts +159 -27
  571. package/src/services/local-content.ts +55 -23
  572. package/src/services/local-gateway-service.ts +2 -17
  573. package/src/services/local-secrets.ts +0 -4
  574. package/src/services/logger-console.test.ts +0 -1
  575. package/src/services/logger-console.ts +3 -7
  576. package/src/services/logger.ts +2 -37
  577. package/src/services/meta-service.test.ts +1 -5
  578. package/src/services/meta-service.ts +41 -61
  579. package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
  580. package/src/services/pikku-user-id.ts +0 -4
  581. package/src/services/queue-webhook-service.ts +9 -41
  582. package/src/services/scheduler-service.ts +1 -50
  583. package/src/services/schema-service.ts +1 -24
  584. package/src/services/scope-service.ts +50 -34
  585. package/src/services/scoped-secret-service.ts +0 -4
  586. package/src/services/secret-host-binding.test.ts +138 -0
  587. package/src/services/secret-host-binding.ts +51 -0
  588. package/src/services/secret-service.ts +5 -33
  589. package/src/services/secretless.test.ts +54 -0
  590. package/src/services/secretless.ts +29 -0
  591. package/src/services/stub-tracker.ts +8 -18
  592. package/src/services/system-role-guard.test.ts +93 -0
  593. package/src/services/system-role-guard.ts +71 -0
  594. package/src/services/trigger-service.ts +0 -12
  595. package/src/services/typed-secret-service.ts +1 -7
  596. package/src/services/v8-coverage-service.ts +3 -6
  597. package/src/services/variables-service.ts +1 -8
  598. package/src/services/webhook-service.ts +19 -63
  599. package/src/services/workflow-service.ts +3 -20
  600. package/src/testing/service-tests.ts +0 -26
  601. package/src/time-utils.ts +1 -19
  602. package/src/types/core.types.ts +116 -229
  603. package/src/types/state.types.ts +7 -9
  604. package/src/utils/hmac.ts +4 -10
  605. package/src/utils/safe-fetch.ts +13 -54
  606. package/src/utils.test.ts +11 -2
  607. package/src/utils.ts +6 -15
  608. package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
  609. package/src/wirings/actor-flow/index.ts +0 -9
  610. package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
  611. package/src/wirings/actor-flow/run-conversation.ts +19 -12
  612. package/src/wirings/ai-agent/ai-agent-agui.test.ts +75 -10
  613. package/src/wirings/ai-agent/ai-agent-agui.ts +36 -17
  614. package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
  615. package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
  616. package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
  617. package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
  618. package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
  619. package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
  620. package/src/wirings/ai-agent/ai-agent-prepare.ts +82 -138
  621. package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
  622. package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
  623. package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
  624. package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
  625. package/src/wirings/ai-agent/ai-agent-runner.ts +67 -33
  626. package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
  627. package/src/wirings/ai-agent/ai-agent-stream.ts +192 -75
  628. package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
  629. package/src/wirings/ai-agent/ai-agent.types.ts +85 -4
  630. package/src/wirings/ai-agent/index.ts +35 -3
  631. package/src/wirings/ai-agent/voice-input.test.ts +72 -7
  632. package/src/wirings/ai-agent/voice-input.ts +48 -3
  633. package/src/wirings/ai-agent/voice-output.test.ts +422 -0
  634. package/src/wirings/ai-agent/voice-output.ts +216 -56
  635. package/src/wirings/channel/channel-common.ts +15 -20
  636. package/src/wirings/channel/channel-handler.test.ts +50 -0
  637. package/src/wirings/channel/channel-handler.ts +32 -11
  638. package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
  639. package/src/wirings/channel/channel-host-rpc.ts +69 -0
  640. package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
  641. package/src/wirings/channel/channel-middleware-runner.ts +0 -12
  642. package/src/wirings/channel/channel-rpc-registry.ts +116 -0
  643. package/src/wirings/channel/channel-rpc-responder.ts +117 -0
  644. package/src/wirings/channel/channel-rpc-service.ts +146 -0
  645. package/src/wirings/channel/channel-rpc-validators.ts +65 -0
  646. package/src/wirings/channel/channel-rpc.test.ts +820 -0
  647. package/src/wirings/channel/channel-rpc.ts +5 -0
  648. package/src/wirings/channel/channel-rpc.types.ts +150 -0
  649. package/src/wirings/channel/channel-runner.ts +0 -14
  650. package/src/wirings/channel/channel-store.ts +0 -10
  651. package/src/wirings/channel/channel.types.ts +19 -8
  652. package/src/wirings/channel/define-channel-routes.ts +0 -20
  653. package/src/wirings/channel/eventhub-service.ts +0 -18
  654. package/src/wirings/channel/index.ts +35 -0
  655. package/src/wirings/channel/local/local-channel-handler.ts +3 -1
  656. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
  657. package/src/wirings/channel/local/local-channel-runner.ts +3 -1
  658. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
  659. package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
  660. package/src/wirings/channel/log-channels.ts +0 -4
  661. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
  662. package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
  663. package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
  664. package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
  665. package/src/wirings/cli/channel/cli-approval.ts +135 -0
  666. package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
  667. package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
  668. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
  669. package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
  670. package/src/wirings/cli/channel/cli-raw-client-runner.ts +155 -0
  671. package/src/wirings/cli/channel/index.ts +9 -0
  672. package/src/wirings/cli/cli-runner.test.ts +0 -1
  673. package/src/wirings/cli/cli-runner.ts +46 -88
  674. package/src/wirings/cli/cli.types.ts +14 -3
  675. package/src/wirings/cli/command-parser.test.ts +0 -4
  676. package/src/wirings/cli/command-parser.ts +11 -91
  677. package/src/wirings/cli/define-cli-commands.ts +1 -17
  678. package/src/wirings/credential/credential.types.ts +0 -12
  679. package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
  680. package/src/wirings/credential/index.ts +1 -1
  681. package/src/wirings/credential/validate-credential-definitions.ts +2 -4
  682. package/src/wirings/gateway/gateway-runner.test.ts +1 -21
  683. package/src/wirings/gateway/gateway-runner.ts +8 -110
  684. package/src/wirings/gateway/gateway.types.ts +7 -80
  685. package/src/wirings/http/http-routes.test.ts +0 -3
  686. package/src/wirings/http/http-routes.ts +0 -86
  687. package/src/wirings/http/http-runner.test.ts +0 -1
  688. package/src/wirings/http/http-runner.ts +12 -168
  689. package/src/wirings/http/http.types.ts +17 -62
  690. package/src/wirings/http/index.ts +5 -1
  691. package/src/wirings/http/log-http-routes.ts +0 -4
  692. package/src/wirings/http/pikku-fetch-http-request.test.ts +88 -7
  693. package/src/wirings/http/pikku-fetch-http-request.ts +74 -50
  694. package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
  695. package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
  696. package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
  697. package/src/wirings/http/routers/path-to-regex.ts +2 -13
  698. package/src/wirings/http/web-request.test.ts +33 -2
  699. package/src/wirings/http/web-request.ts +30 -17
  700. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
  701. package/src/wirings/mcp/mcp-runner.test.ts +40 -0
  702. package/src/wirings/mcp/mcp-runner.ts +9 -15
  703. package/src/wirings/mcp/mcp.types.ts +7 -42
  704. package/src/wirings/oauth2/oauth2.types.ts +0 -30
  705. package/src/wirings/persona/define-personas.ts +29 -0
  706. package/src/wirings/persona/index.ts +62 -0
  707. package/src/wirings/persona/persona-email.ts +87 -0
  708. package/src/wirings/persona/persona-environments.test.ts +183 -0
  709. package/src/wirings/persona/persona-environments.ts +138 -0
  710. package/src/wirings/persona/persona-mailbox.ts +156 -0
  711. package/src/wirings/persona/persona.test.ts +220 -0
  712. package/src/wirings/persona/persona.types.ts +131 -0
  713. package/src/wirings/persona/validate-personas.ts +133 -0
  714. package/src/wirings/queue/index.ts +13 -3
  715. package/src/wirings/queue/queue-identity.test.ts +453 -0
  716. package/src/wirings/queue/queue-identity.ts +173 -0
  717. package/src/wirings/queue/queue-runner.ts +12 -31
  718. package/src/wirings/queue/queue.types.ts +19 -89
  719. package/src/wirings/queue/register-queue-helper.ts +0 -14
  720. package/src/wirings/queue/signed-queue-service.ts +59 -0
  721. package/src/wirings/queue/validate-worker-config.ts +2 -28
  722. package/src/wirings/role/define-system-role.ts +33 -0
  723. package/src/wirings/role/index.ts +13 -0
  724. package/src/wirings/role/role.test.ts +104 -0
  725. package/src/wirings/role/role.types.ts +47 -0
  726. package/src/wirings/role/validate-role-definitions.ts +93 -0
  727. package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
  728. package/src/wirings/rpc/addon-runner.ts +0 -56
  729. package/src/wirings/rpc/addon-scopes.test.ts +225 -0
  730. package/src/wirings/rpc/remote-addon-auth.ts +1 -13
  731. package/src/wirings/rpc/rpc-runner.test.ts +186 -2
  732. package/src/wirings/rpc/rpc-runner.ts +145 -127
  733. package/src/wirings/rpc/rpc-types.ts +11 -6
  734. package/src/wirings/rpc/wire-addon.test.ts +43 -1
  735. package/src/wirings/rpc/wire-addon.ts +99 -0
  736. package/src/wirings/rpc/wire-remote-addon.ts +9 -29
  737. package/src/wirings/scheduler/log-schedulers.ts +0 -4
  738. package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
  739. package/src/wirings/scheduler/scheduler-runner.ts +0 -2
  740. package/src/wirings/scheduler/scheduler.types.ts +1 -14
  741. package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
  742. package/src/wirings/scope/index.ts +1 -1
  743. package/src/wirings/scope/scope.test.ts +1 -2
  744. package/src/wirings/scope/scope.types.ts +7 -9
  745. package/src/wirings/scope/validate-scope-definitions.ts +3 -21
  746. package/src/wirings/secret/index.ts +1 -1
  747. package/src/wirings/secret/secret.types.ts +19 -15
  748. package/src/wirings/secret/validate-secret-definitions.ts +2 -4
  749. package/src/wirings/trigger/trigger-runner.ts +1 -27
  750. package/src/wirings/trigger/trigger.types.ts +1 -82
  751. package/src/wirings/variable/index.ts +1 -1
  752. package/src/wirings/variable/validate-variable-definitions.ts +2 -4
  753. package/src/wirings/variable/variable.types.ts +1 -13
  754. package/src/wirings/virtual-user/index.ts +76 -0
  755. package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
  756. package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
  757. package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
  758. package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
  759. package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
  760. package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
  761. package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
  762. package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
  763. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
  764. package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
  765. package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
  766. package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
  767. package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
  768. package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
  769. package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
  770. package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
  771. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +5 -4
  772. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
  773. package/src/wirings/workflow/feature.ts +0 -19
  774. package/src/wirings/workflow/graph/graph-node.ts +0 -136
  775. package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
  776. package/src/wirings/workflow/graph/graph-runner.ts +6 -41
  777. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
  778. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
  779. package/src/wirings/workflow/index.ts +10 -44
  780. package/src/wirings/workflow/pikku-scenario-service.ts +235 -52
  781. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
  782. package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
  783. package/src/wirings/workflow/run-timeline.test.ts +7 -19
  784. package/src/wirings/workflow/run-timeline.ts +0 -56
  785. package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
  786. package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
  787. package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
  788. package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
  789. package/src/wirings/workflow/scenario-poll.test.ts +0 -2
  790. package/src/wirings/workflow/scenario-poll.ts +0 -15
  791. package/src/wirings/workflow/scenario-prose.ts +0 -28
  792. package/src/wirings/workflow/scenario-service.test.ts +2 -9
  793. package/src/wirings/workflow/scenario-step-guards.ts +1 -14
  794. package/src/wirings/workflow/scenario-step.test.ts +159 -14
  795. package/src/wirings/workflow/scenario-step.types.ts +82 -6
  796. package/src/wirings/workflow/scenario-surface.test.ts +145 -0
  797. package/src/wirings/workflow/scenario-surface.ts +71 -0
  798. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
  799. package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
  800. package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
  801. package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
  802. package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
  803. package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
  804. package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
  805. package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
  806. package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
  807. package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
  808. package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
  809. package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
  810. package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
  811. package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
  812. package/src/wirings/workflow/workflow.types.ts +0 -203
  813. package/tsconfig.tsbuildinfo +1 -1
  814. package/src/middleware/timeout.ts +0 -22
  815. package/src/pikku-response.ts +0 -5
  816. package/src/services/gopass-secrets.ts +0 -78
  817. package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
  818. package/src/wirings/workflow/dsl/index.ts +0 -36
  819. package/src/wirings/workflow/graph/index.ts +0 -15
@@ -1,12 +1,37 @@
1
1
  export declare const encryptJSON: (secret: string, value: unknown) => Promise<string>;
2
2
  export declare const decryptJSON: <T>(secret: string, token: string) => Promise<T>;
3
+ /**
4
+ * Namespaces the remote-RPC session key so the same deployment secret used for
5
+ * another purpose derives a different key. See knowledge/crypto.md.
6
+ */
7
+ export declare const REMOTE_SESSION_INFO = "pikku:remote-session";
8
+ export declare const MIN_KEY_MATERIAL_LENGTH = 32;
9
+ export declare const assertStrongKeyMaterial: (name: string, keyMaterial: string) => void;
10
+ export declare const encryptWithKeyMaterial: (name: string, keyMaterial: string, info: string, value: unknown) => Promise<string>;
11
+ export declare const decryptWithKeyMaterial: <T>(name: string, keyMaterial: string, info: string, token: string) => Promise<T>;
12
+ export declare const encodeBase64UrlText: (value: string) => string;
13
+ export declare const decodeBase64UrlText: (value: string) => string;
14
+ /**
15
+ * HMAC-SHA256 over `payload` under a key expanded from high-entropy key
16
+ * material, base64url-encoded. The salt is empty by design so the verifier can
17
+ * re-derive the key from `keyMaterial` and `info` alone.
18
+ */
19
+ export declare const signWithKeyMaterial: (name: string, keyMaterial: string, info: string, payload: string) => Promise<string>;
20
+ /** False — never throws — for a malformed, truncated or mismatched signature. */
21
+ export declare const verifyWithKeyMaterial: (name: string, keyMaterial: string, info: string, payload: string, signature: string) => Promise<boolean>;
3
22
  export declare const generateDEK: () => Promise<string>;
4
- export declare const wrapDEK: (kek: string, plaintextDEK: string) => Promise<string>;
5
- export declare const unwrapDEK: (kek: string, wrappedDEK: string) => Promise<string>;
23
+ /**
24
+ * One salt per (deployment, key version), stored beside the wrapped DEKs.
25
+ * See knowledge/crypto.md.
26
+ */
27
+ export declare const generateKEKSalt: () => string;
28
+ export declare const deriveKEK: (passphrase: string, salt: string) => Promise<CryptoKey>;
29
+ export declare const wrapDEK: (kek: CryptoKey, plaintextDEK: string) => Promise<string>;
30
+ export declare const unwrapDEK: (kek: CryptoKey, wrappedDEK: string) => Promise<string>;
6
31
  export interface EnvelopeEncryptResult {
7
32
  ciphertext: string;
8
33
  wrappedDEK: string;
9
34
  }
10
- export declare const envelopeEncrypt: (kek: string, value: unknown) => Promise<EnvelopeEncryptResult>;
11
- export declare const envelopeDecrypt: <T>(kek: string, ciphertext: string, wrappedDEK: string) => Promise<T>;
12
- export declare const envelopeRewrap: (oldKEK: string, newKEK: string, wrappedDEK: string) => Promise<string>;
35
+ export declare const envelopeEncrypt: (kek: CryptoKey, value: unknown) => Promise<EnvelopeEncryptResult>;
36
+ export declare const envelopeDecrypt: <T>(kek: CryptoKey, ciphertext: string, wrappedDEK: string) => Promise<T>;
37
+ export declare const envelopeRewrap: (oldKEK: CryptoKey, newKEK: CryptoKey, wrappedDEK: string) => Promise<string>;
@@ -1,3 +1,4 @@
1
+ import { WeakKeyMaterialError } from './errors/errors.js';
1
2
  const encoder = new TextEncoder();
2
3
  const decoder = new TextDecoder();
3
4
  const getSubtle = () => {
@@ -40,13 +41,19 @@ const fromBase64Url = (input) => {
40
41
  base64 += '=';
41
42
  return base64Decode(base64);
42
43
  };
43
- const deriveKey = async (secret) => {
44
+ const SALT_BYTES = 16;
45
+ const IV_BYTES = 12;
46
+ const TAG_BYTES = 16;
47
+ const PBKDF2_ITERATIONS = 600_000;
48
+ const deriveKey = async (secret, salt) => {
44
49
  const subtle = getSubtle();
45
- const hash = await subtle.digest('SHA-256', encoder.encode(secret));
46
- return subtle.importKey('raw', hash, { name: 'AES-GCM' }, false, [
47
- 'encrypt',
48
- 'decrypt',
49
- ]);
50
+ const material = await subtle.importKey('raw', encoder.encode(secret), { name: 'PBKDF2' }, false, ['deriveKey']);
51
+ return subtle.deriveKey({
52
+ name: 'PBKDF2',
53
+ salt: salt,
54
+ iterations: PBKDF2_ITERATIONS,
55
+ hash: 'SHA-256',
56
+ }, material, { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt']);
50
57
  };
51
58
  export const encryptJSON = async (secret, value) => {
52
59
  const crypto = globalThis.crypto;
@@ -54,76 +61,174 @@ export const encryptJSON = async (secret, value) => {
54
61
  throw new Error('WebCrypto not available');
55
62
  }
56
63
  const subtle = getSubtle();
57
- const iv = crypto.getRandomValues(new Uint8Array(12));
58
- const key = await deriveKey(secret);
64
+ const salt = crypto.getRandomValues(new Uint8Array(SALT_BYTES));
65
+ const iv = crypto.getRandomValues(new Uint8Array(IV_BYTES));
66
+ const key = await deriveKey(secret, salt);
59
67
  const plaintext = encoder.encode(JSON.stringify(value));
60
68
  const encrypted = await subtle.encrypt({ name: 'AES-GCM', iv }, key, plaintext);
61
69
  const cipherBytes = new Uint8Array(encrypted);
62
- const out = new Uint8Array(iv.length + cipherBytes.length);
63
- out.set(iv, 0);
64
- out.set(cipherBytes, iv.length);
70
+ const out = new Uint8Array(salt.length + iv.length + cipherBytes.length);
71
+ out.set(salt, 0);
72
+ out.set(iv, salt.length);
73
+ out.set(cipherBytes, salt.length + iv.length);
65
74
  return toBase64Url(out);
66
75
  };
67
76
  export const decryptJSON = async (secret, token) => {
68
77
  const subtle = getSubtle();
69
78
  const data = fromBase64Url(token);
70
- if (data.length < 13) {
79
+ if (data.length <= SALT_BYTES + IV_BYTES + TAG_BYTES) {
71
80
  throw new Error('Invalid encrypted payload');
72
81
  }
73
- const iv = data.slice(0, 12);
74
- const ciphertext = data.slice(12);
75
- const key = await deriveKey(secret);
82
+ const salt = data.slice(0, SALT_BYTES);
83
+ const iv = data.slice(SALT_BYTES, SALT_BYTES + IV_BYTES);
84
+ const ciphertext = data.slice(SALT_BYTES + IV_BYTES);
85
+ const key = await deriveKey(secret, salt);
76
86
  const decrypted = await subtle.decrypt({ name: 'AES-GCM', iv }, key, ciphertext);
77
87
  return JSON.parse(decoder.decode(new Uint8Array(decrypted)));
78
88
  };
79
89
  /**
80
- * Envelope encryption utilities.
81
- *
82
- * Each secret gets its own random DEK (data encryption key).
83
- * The DEK is wrapped (encrypted) by a KEK (key encryption key) — typically an env var.
84
- * The actual secret is encrypted with the DEK.
85
- *
86
- * KEK rotation only re-wraps the DEK, never touches the ciphertext.
90
+ * Namespaces the remote-RPC session key so the same deployment secret used for
91
+ * another purpose derives a different key. See knowledge/crypto.md.
87
92
  */
88
- const importRawKey = async (rawBytes) => {
93
+ export const REMOTE_SESSION_INFO = 'pikku:remote-session';
94
+ export const MIN_KEY_MATERIAL_LENGTH = 32;
95
+ export const assertStrongKeyMaterial = (name, keyMaterial) => {
96
+ if (keyMaterial.length < MIN_KEY_MATERIAL_LENGTH) {
97
+ throw new WeakKeyMaterialError(name, MIN_KEY_MATERIAL_LENGTH, keyMaterial.length);
98
+ }
99
+ };
100
+ const expandKeyMaterial = async (keyMaterial, info, salt) => {
89
101
  const subtle = getSubtle();
90
- return subtle.importKey('raw', rawBytes.buffer, { name: 'AES-GCM' }, true, ['encrypt', 'decrypt']);
102
+ const material = await subtle.importKey('raw', encoder.encode(keyMaterial), 'HKDF', false, ['deriveKey']);
103
+ return subtle.deriveKey({
104
+ name: 'HKDF',
105
+ hash: 'SHA-256',
106
+ salt: salt,
107
+ info: encoder.encode(info),
108
+ }, material, { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt']);
109
+ };
110
+ export const encryptWithKeyMaterial = async (name, keyMaterial, info, value) => {
111
+ assertStrongKeyMaterial(name, keyMaterial);
112
+ const crypto = globalThis.crypto;
113
+ if (!crypto?.getRandomValues) {
114
+ throw new Error('WebCrypto not available');
115
+ }
116
+ const subtle = getSubtle();
117
+ const salt = crypto.getRandomValues(new Uint8Array(SALT_BYTES));
118
+ const iv = crypto.getRandomValues(new Uint8Array(IV_BYTES));
119
+ const key = await expandKeyMaterial(keyMaterial, info, salt);
120
+ const encrypted = await subtle.encrypt({ name: 'AES-GCM', iv }, key, encoder.encode(JSON.stringify(value)));
121
+ const cipherBytes = new Uint8Array(encrypted);
122
+ const out = new Uint8Array(salt.length + iv.length + cipherBytes.length);
123
+ out.set(salt, 0);
124
+ out.set(iv, salt.length);
125
+ out.set(cipherBytes, salt.length + iv.length);
126
+ return toBase64Url(out);
91
127
  };
92
- export const generateDEK = async () => {
93
- const raw = globalThis.crypto.getRandomValues(new Uint8Array(32));
94
- return toBase64Url(raw);
128
+ export const decryptWithKeyMaterial = async (name, keyMaterial, info, token) => {
129
+ assertStrongKeyMaterial(name, keyMaterial);
130
+ const subtle = getSubtle();
131
+ const data = fromBase64Url(token);
132
+ if (data.length <= SALT_BYTES + IV_BYTES + TAG_BYTES) {
133
+ throw new Error('Invalid encrypted payload');
134
+ }
135
+ const salt = data.slice(0, SALT_BYTES);
136
+ const iv = data.slice(SALT_BYTES, SALT_BYTES + IV_BYTES);
137
+ const ciphertext = data.slice(SALT_BYTES + IV_BYTES);
138
+ const key = await expandKeyMaterial(keyMaterial, info, salt);
139
+ const decrypted = await subtle.decrypt({ name: 'AES-GCM', iv }, key, ciphertext);
140
+ return JSON.parse(decoder.decode(new Uint8Array(decrypted)));
95
141
  };
96
- export const wrapDEK = async (kek, plaintextDEK) => {
97
- return encryptJSON(kek, plaintextDEK);
142
+ export const encodeBase64UrlText = (value) => toBase64Url(encoder.encode(value));
143
+ export const decodeBase64UrlText = (value) => decoder.decode(fromBase64Url(value));
144
+ const expandSigningKeyMaterial = async (keyMaterial, info) => {
145
+ const subtle = getSubtle();
146
+ const material = await subtle.importKey('raw', encoder.encode(keyMaterial), 'HKDF', false, ['deriveKey']);
147
+ return subtle.deriveKey({
148
+ name: 'HKDF',
149
+ hash: 'SHA-256',
150
+ salt: new Uint8Array(0),
151
+ info: encoder.encode(info),
152
+ }, material, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign', 'verify']);
98
153
  };
99
- export const unwrapDEK = async (kek, wrappedDEK) => {
100
- return decryptJSON(kek, wrappedDEK);
154
+ /**
155
+ * HMAC-SHA256 over `payload` under a key expanded from high-entropy key
156
+ * material, base64url-encoded. The salt is empty by design so the verifier can
157
+ * re-derive the key from `keyMaterial` and `info` alone.
158
+ */
159
+ export const signWithKeyMaterial = async (name, keyMaterial, info, payload) => {
160
+ assertStrongKeyMaterial(name, keyMaterial);
161
+ const key = await expandSigningKeyMaterial(keyMaterial, info);
162
+ const signature = await getSubtle().sign('HMAC', key, encoder.encode(payload));
163
+ return toBase64Url(new Uint8Array(signature));
164
+ };
165
+ /** False — never throws — for a malformed, truncated or mismatched signature. */
166
+ export const verifyWithKeyMaterial = async (name, keyMaterial, info, payload, signature) => {
167
+ assertStrongKeyMaterial(name, keyMaterial);
168
+ const key = await expandSigningKeyMaterial(keyMaterial, info);
169
+ try {
170
+ return await getSubtle().verify('HMAC', key, fromBase64Url(signature), encoder.encode(payload));
171
+ }
172
+ catch {
173
+ return false;
174
+ }
101
175
  };
102
- const encryptWithDEK = async (dekBase64, value) => {
176
+ const importRawKey = async (rawBytes) => {
177
+ const subtle = getSubtle();
178
+ return subtle.importKey('raw', rawBytes.buffer, { name: 'AES-GCM' }, true, ['encrypt', 'decrypt']);
179
+ };
180
+ const encryptWithCryptoKey = async (key, value) => {
103
181
  const crypto = globalThis.crypto;
104
182
  const subtle = getSubtle();
105
- const iv = crypto.getRandomValues(new Uint8Array(12));
106
- const key = await importRawKey(fromBase64Url(dekBase64));
107
- const plaintext = encoder.encode(JSON.stringify(value));
108
- const encrypted = await subtle.encrypt({ name: 'AES-GCM', iv }, key, plaintext);
183
+ const iv = crypto.getRandomValues(new Uint8Array(IV_BYTES));
184
+ const encrypted = await subtle.encrypt({ name: 'AES-GCM', iv }, key, encoder.encode(JSON.stringify(value)));
109
185
  const cipherBytes = new Uint8Array(encrypted);
110
186
  const out = new Uint8Array(iv.length + cipherBytes.length);
111
187
  out.set(iv, 0);
112
188
  out.set(cipherBytes, iv.length);
113
189
  return toBase64Url(out);
114
190
  };
115
- const decryptWithDEK = async (dekBase64, token) => {
191
+ const decryptWithCryptoKey = async (key, token) => {
116
192
  const subtle = getSubtle();
117
193
  const data = fromBase64Url(token);
118
- if (data.length < 13) {
194
+ if (data.length < IV_BYTES + TAG_BYTES) {
119
195
  throw new Error('Invalid encrypted payload');
120
196
  }
121
- const iv = data.slice(0, 12);
122
- const ciphertext = data.slice(12);
123
- const key = await importRawKey(fromBase64Url(dekBase64));
197
+ const iv = data.slice(0, IV_BYTES);
198
+ const ciphertext = data.slice(IV_BYTES);
124
199
  const decrypted = await subtle.decrypt({ name: 'AES-GCM', iv }, key, ciphertext);
125
200
  return JSON.parse(decoder.decode(new Uint8Array(decrypted)));
126
201
  };
202
+ export const generateDEK = async () => {
203
+ const raw = globalThis.crypto.getRandomValues(new Uint8Array(32));
204
+ return toBase64Url(raw);
205
+ };
206
+ /**
207
+ * One salt per (deployment, key version), stored beside the wrapped DEKs.
208
+ * See knowledge/crypto.md.
209
+ */
210
+ export const generateKEKSalt = () => {
211
+ const crypto = globalThis.crypto;
212
+ if (!crypto?.getRandomValues) {
213
+ throw new Error('WebCrypto not available');
214
+ }
215
+ return toBase64Url(crypto.getRandomValues(new Uint8Array(SALT_BYTES)));
216
+ };
217
+ export const deriveKEK = async (passphrase, salt) => {
218
+ return deriveKey(passphrase, fromBase64Url(salt));
219
+ };
220
+ export const wrapDEK = async (kek, plaintextDEK) => {
221
+ return encryptWithCryptoKey(kek, plaintextDEK);
222
+ };
223
+ export const unwrapDEK = async (kek, wrappedDEK) => {
224
+ return decryptWithCryptoKey(kek, wrappedDEK);
225
+ };
226
+ const encryptWithDEK = async (dekBase64, value) => {
227
+ return encryptWithCryptoKey(await importRawKey(fromBase64Url(dekBase64)), value);
228
+ };
229
+ const decryptWithDEK = async (dekBase64, token) => {
230
+ return decryptWithCryptoKey(await importRawKey(fromBase64Url(dekBase64)), token);
231
+ };
127
232
  export const envelopeEncrypt = async (kek, value) => {
128
233
  const dek = await generateDEK();
129
234
  const ciphertext = await encryptWithDEK(dek, value);
@@ -32,12 +32,6 @@ const findCompiledFile = async (tsFile, srcDir, pikkuDir) => {
32
32
  }
33
33
  return null;
34
34
  };
35
- // Changed user files are re-run through an evictable module runner keyed by a
36
- // stable path (createModuleRunner), NOT re-imported under a fresh URL. A
37
- // fresh-URL import (a `data:` URL on Node, a uniquely-named temp sibling on
38
- // Bun) permanently leaks a record in the native ESM loader map on every
39
- // reload, OOMing long editing sessions; the runner overwrites a single slot so
40
- // the previous module is collected. See ./module-runner.ts.
41
35
  const isWatchedTsFile = (filename) => {
42
36
  return (filename.endsWith('.ts') &&
43
37
  !filename.endsWith('.test.ts') &&
@@ -67,17 +61,12 @@ export async function pikkuDevReloader(options) {
67
61
  logger.error(`Failed to import: ${relative(process.cwd(), importPath)} (keeping old code)`);
68
62
  return;
69
63
  }
70
- // Register every function-config export replacing known functions AND
71
- // adding new ones (a brand-new function becomes callable as soon as its
72
- // meta lands via reloadGeneratedMeta after the next codegen pass).
73
- // Write into the map captured at startup, NOT pikkuState's current one:
74
- // a dev-server watcher may have temporarily swapped in a codegen-scoped
75
- // map for the same file event (runAllWithCommandState), and a write to
76
- // that map is silently discarded when it restores the original.
77
- // Schemas are NOT touched here: `input`/`output` hold raw zod schemas,
78
- // while the schema map carries codegen-generated JSON schemas — mixing the
79
- // two crashed every reload. Fresh JSON schemas arrive via
80
- // reloadGeneratedMeta once codegen has re-emitted them.
64
+ // Register every function-config export, replacing known functions and
65
+ // adding new ones. Write into the map captured at startup, NOT pikkuState's
66
+ // current one: a dev-server watcher may have temporarily swapped in a
67
+ // codegen-scoped map, whose writes are discarded when it restores.
68
+ // Schemas are NOT touched here: `input`/`output` hold raw zod schemas while
69
+ // the schema map carries codegen JSON schemas; mixing them crashed reloads.
81
70
  for (const [exportName, exportValue] of Object.entries(mod)) {
82
71
  if (!isFunctionConfig(exportValue))
83
72
  continue;
@@ -88,10 +77,9 @@ export async function pikkuDevReloader(options) {
88
77
  else
89
78
  reloadedNames.push(exportName);
90
79
  }
91
- // Re-importing the module re-ran its wire* side effects (wireHTTP et al
92
- // are keyed map-sets, so re-registration replaces/adds)reset the
93
- // router and caches even when no function export changed, so a
94
- // wiring-only file edit rebuilds the route matchers too.
80
+ // Re-importing re-ran the module’s wire* side effects, so reset the router
81
+ // and caches even when no function export changed a wiring-only edit has
82
+ // to rebuild the route matchers too.
95
83
  clearMiddlewareCache();
96
84
  clearPermissionsCache();
97
85
  clearChannelMiddlewareCache();
@@ -108,9 +96,8 @@ export async function pikkuDevReloader(options) {
108
96
  };
109
97
  let debounceTimer;
110
98
  const pendingChanges = new Set();
111
- // Files re-imported since the last reimportPending() drain. A dev-server
112
- // watcher drains this after its codegen pass so wire* registrations that
113
- // were skipped for missing meta (a NEW route) run again with fresh meta.
99
+ // Files re-imported since the last reimportPending() drain, re-run after the
100
+ // dev server's codegen pass so registrations skipped for missing meta retry.
114
101
  const postCodegenQueue = new Set();
115
102
  const safeHandleFileChange = async (file) => {
116
103
  try {
@@ -156,12 +143,6 @@ export async function pikkuDevReloader(options) {
156
143
  }
157
144
  moduleRunner.clear();
158
145
  },
159
- // Drain the queue of recently re-imported files and import them again.
160
- // A dev-server watcher calls this AFTER its codegen pass has refreshed
161
- // the generated meta (reloadGeneratedMeta): wire* registrations skip
162
- // routes whose meta doesn't exist yet, so a wiring file changed
163
- // alongside a NEW function only registers its new route when
164
- // re-imported after the fresh meta has landed.
165
146
  reimportPending: async () => {
166
147
  const files = [...postCodegenQueue];
167
148
  postCodegenQueue.clear();
@@ -1,14 +1,10 @@
1
1
  export interface PikkuModuleRunner {
2
- /** Run a user module by absolute path, returning its exports. Repeated runs
3
- * of the same path overwrite a single registry slot (the previous module is
4
- * collected). Returns `null` if transpile/compile/evaluation fails, so the
5
- * caller can keep the previously-loaded code. */
2
+ /** Run a user module by absolute path. Repeated runs of one path overwrite a
3
+ * single registry slot. Returns `null` on failure so the caller can keep the
4
+ * previously-loaded code. */
6
5
  run: (absPath: string) => Promise<Record<string, unknown> | null>;
7
- /** Drop a single module from the registry. */
8
6
  evict: (absPath: string) => void;
9
- /** Drop every module from the registry. */
10
7
  clear: () => void;
11
- /** Number of modules currently held. */
12
8
  readonly size: number;
13
9
  }
14
10
  export declare const createModuleRunner: () => PikkuModuleRunner;
@@ -7,9 +7,8 @@ let transformSync;
7
7
  const loadTransform = async () => {
8
8
  if (transformSync)
9
9
  return transformSync;
10
- // esbuild is a dev-only dependency, hoisted from @pikku/cli at runtime the
11
- // same lazy pattern the reloader previously used for tsx. It is never loaded
12
- // in production runtimes (the `./dev` export is dev-only).
10
+ // esbuild is a dev-only dependency hoisted from @pikku/cli at runtime; the
11
+ // `./dev` export is dev-only so it is never loaded in production runtimes.
13
12
  const esbuild = await import('esbuild');
14
13
  transformSync = esbuild.transformSync;
15
14
  return transformSync;
@@ -21,10 +20,6 @@ export const createModuleRunner = () => {
21
20
  try {
22
21
  const transform = await loadTransform();
23
22
  const source = await readFile(absPath, 'utf-8');
24
- // No sourcemap: an inline sourcemap embeds a base64 copy of the source
25
- // that the engine retains per compile, reintroducing linear growth on
26
- // Node — the exact leak this runner exists to remove. `filename` still
27
- // anchors stack traces to the user file.
28
23
  const { code } = transform(source, {
29
24
  loader: absPath.endsWith('.ts') ? 'ts' : 'js',
30
25
  format: 'cjs',
@@ -38,9 +33,8 @@ export const createModuleRunner = () => {
38
33
  return moduleObj.exports;
39
34
  }
40
35
  catch {
41
- // Transpile/compile/evaluate failure (a bad edit, or the one known
42
- // limitation — a file using top-level `await`, which can't be emitted in
43
- // `cjs` form). Return null so the caller keeps the previously-loaded code.
36
+ // A bad edit, or the one known limitation: a file using top-level
37
+ // `await`, which cannot be emitted in `cjs` form.
44
38
  return null;
45
39
  }
46
40
  };
@@ -9,29 +9,17 @@ export interface ReloadGeneratedMetaOptions {
9
9
  schemaService?: SchemaService;
10
10
  }
11
11
  /**
12
- * Re-reads the codegen output (wiring meta + JSON schemas) into the running
13
- * process so new and changed functions become callable without a server
14
- * restart. The generated `*-meta.gen.ts` files are plain
15
- * `pikkuState(area, key, <json>)` side effects, but they cannot be
16
- * re-imported after a dev-time codegen — the ESM cache pins both the wrapper
17
- * and its JSON import — so this reads the JSON sources directly and applies
18
- * the same state.
19
- *
20
- * Meant to be called by a dev-server watcher after each codegen pass. Routes
21
- * registered by NEW `wireHTTP` files are not picked up (their modules were
22
- * never imported); those still need a restart.
12
+ * Re-reads codegen output (wiring meta + JSON schemas) into the running
13
+ * process, so new and changed functions become callable without a restart.
14
+ * Called by a dev-server watcher after each codegen pass. Routes registered by
15
+ * NEW `wireHTTP` files are not picked up their modules were never imported.
23
16
  */
24
17
  export declare function reloadGeneratedMeta(options: ReloadGeneratedMetaOptions): Promise<void>;
25
18
  /**
26
- * Prunes the live addon registry down to what the current source still declares.
27
- *
28
- * Dev hot-reload re-imports only changed/added files, so a deleted `*.addon.ts`
29
- * leaves its `wireAddon` entry stranded in `pikkuState(null,'addons','packages')`
30
- * until a full restart — the reason `getInstalledAddons` reports removed addons.
31
- * The Map holds definitions (namespace → package config), not runtime state, so
32
- * dropping any namespace the fresh inspection no longer declares is safe.
19
+ * Prunes the live addon registry to the namespaces the current source still
20
+ * declares. Hot reload only re-imports files that exist, so a deleted
21
+ * `*.addon.ts` otherwise leaves its `wireAddon` entry stranded until a restart.
33
22
  *
34
- * `declaredNamespaces` is the set of `wireAddon` names from the just-regenerated
35
- * inspection (`inspectorState.rpc.wireAddonDeclarations.keys()`).
23
+ * `declaredNamespaces` is `inspectorState.rpc.wireAddonDeclarations.keys()`.
36
24
  */
37
25
  export declare function reconcileAddonRegistry(declaredNamespaces: Iterable<string>, logger?: Logger): void;
@@ -24,27 +24,16 @@ const readJson = async (logger, file) => {
24
24
  }
25
25
  };
26
26
  /**
27
- * Re-reads the codegen output (wiring meta + JSON schemas) into the running
28
- * process so new and changed functions become callable without a server
29
- * restart. The generated `*-meta.gen.ts` files are plain
30
- * `pikkuState(area, key, <json>)` side effects, but they cannot be
31
- * re-imported after a dev-time codegen — the ESM cache pins both the wrapper
32
- * and its JSON import — so this reads the JSON sources directly and applies
33
- * the same state.
34
- *
35
- * Meant to be called by a dev-server watcher after each codegen pass. Routes
36
- * registered by NEW `wireHTTP` files are not picked up (their modules were
37
- * never imported); those still need a restart.
27
+ * Re-reads codegen output (wiring meta + JSON schemas) into the running
28
+ * process, so new and changed functions become callable without a restart.
29
+ * Called by a dev-server watcher after each codegen pass. Routes registered by
30
+ * NEW `wireHTTP` files are not picked up their modules were never imported.
38
31
  */
39
32
  export async function reloadGeneratedMeta(options) {
40
33
  const { pikkuDir, logger, schemaService } = options;
41
34
  const dir = resolve(pikkuDir);
42
35
  const functionsMeta = await readJson(logger, join(dir, 'function/pikku-functions-meta.gen.json'));
43
- // Merge over the existing map, don't replace it: framework internals like
44
- // pikkuWorkflowOrchestrator / the per-workflow queue workers are registered
45
- // at service-init (pikku-workflow-service.ts), never in the generated JSON —
46
- // a wholesale replace drops them and workflow jobs then fail with
47
- // "Function meta not found: pikkuWorkflowOrchestrator".
36
+ // knowledge: decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md
48
37
  if (functionsMeta) {
49
38
  const existing = pikkuState(null, 'function', 'meta') ?? {};
50
39
  pikkuState(null, 'function', 'meta', { ...existing, ...functionsMeta });
@@ -56,9 +45,6 @@ export async function reloadGeneratedMeta(options) {
56
45
  if (rpcMeta)
57
46
  pikkuState(null, 'rpc', 'meta', rpcMeta);
58
47
  const queueMeta = await readJson(logger, join(dir, 'queue/pikku-queue-workers-wirings-meta.gen.json'));
59
- // Same reason as function meta: the workflow service adds its orchestrator /
60
- // step queues (and wf-orchestrator-* / wf-step-* per-workflow queues) here at
61
- // init, absent from the generated JSON — merge so they survive the reload.
62
48
  if (queueMeta) {
63
49
  const existing = pikkuState(null, 'queue', 'meta') ?? {};
64
50
  pikkuState(null, 'queue', 'meta', { ...existing, ...queueMeta });
@@ -67,7 +53,6 @@ export async function reloadGeneratedMeta(options) {
67
53
  if (agentMeta?.agentsMeta) {
68
54
  pikkuState(null, 'agent', 'agentsMeta', agentMeta.agentsMeta);
69
55
  }
70
- // Generated JSON schemas: <outDir>/schemas/schemas/<Name>.schema.json.
71
56
  // Re-adding replaces the map entry; the schema service recompiles any
72
57
  // validator whose stored schema value no longer matches.
73
58
  const schemasDir = join(dir, 'schemas', 'schemas');
@@ -98,16 +83,11 @@ export async function reloadGeneratedMeta(options) {
98
83
  }
99
84
  }
100
85
  /**
101
- * Prunes the live addon registry down to what the current source still declares.
102
- *
103
- * Dev hot-reload re-imports only changed/added files, so a deleted `*.addon.ts`
104
- * leaves its `wireAddon` entry stranded in `pikkuState(null,'addons','packages')`
105
- * until a full restart — the reason `getInstalledAddons` reports removed addons.
106
- * The Map holds definitions (namespace → package config), not runtime state, so
107
- * dropping any namespace the fresh inspection no longer declares is safe.
86
+ * Prunes the live addon registry to the namespaces the current source still
87
+ * declares. Hot reload only re-imports files that exist, so a deleted
88
+ * `*.addon.ts` otherwise leaves its `wireAddon` entry stranded until a restart.
108
89
  *
109
- * `declaredNamespaces` is the set of `wireAddon` names from the just-regenerated
110
- * inspection (`inspectorState.rpc.wireAddonDeclarations.keys()`).
90
+ * `declaredNamespaces` is `inspectorState.rpc.wireAddonDeclarations.keys()`.
111
91
  */
112
92
  export function reconcileAddonRegistry(declaredNamespaces, logger) {
113
93
  const declared = new Set(declaredNamespaces);
@@ -1,46 +1,21 @@
1
- /**
2
- * Base class for custom errors.
3
- * @extends {Error}
4
- */
5
1
  export declare class PikkuError extends Error {
6
- /**
7
- * Creates an instance of PikkuError.
8
- * @param message - The error message.
9
- */
10
2
  constructor(message?: string);
11
3
  }
12
4
  /**
13
- * Whether an error is a deliberate, expected failure rather than an uncaught
14
- * bug. A `PikkuError` always counts; so does any error carrying `expected:
15
- * true` used to keep the marker alive when an error is serialized across a
16
- * workflow step boundary and rehydrated as a plain `Error`. Callers log the
17
- * message alone for expected errors and the full stack for everything else.
5
+ * A `PikkuError`, or any error carrying `expected: true` the marker that
6
+ * survives serialization across a workflow step boundary and rehydration as a
7
+ * plain `Error`. Callers log the message alone for these, the full stack for
8
+ * everything else.
18
9
  */
19
10
  export declare const isExpectedError: (error: unknown) => boolean;
20
- /**
21
- * Interface for error details.
22
- */
23
11
  export interface ErrorDetails {
24
12
  status: number;
25
13
  message: string;
26
14
  mcpCode?: number;
27
15
  }
28
- /**
29
- * Adds an error to the API errors map.
30
- * @param error - The error to add.
31
- * @param details - The details of the error.
32
- */
16
+ export type PikkuErrorConstructor = new (...args: any[]) => Error;
33
17
  export declare const addError: (error: any, { status, message, mcpCode }: ErrorDetails) => void;
34
- /**
35
- * Adds multiple errors to the API errors map.
36
- * @param errors - An array of errors and their details.
37
- */
38
18
  export declare const addErrors: (errors: Array<[error: any, details: ErrorDetails]>) => void;
39
- /**
40
- * Retrieves the error response for a given error.
41
- * @param error - The error to get the response for.
42
- * @returns An object containing the status and message, or undefined if the error is not found.
43
- */
44
19
  export declare const getErrorResponse: (error: Error) => {
45
20
  status: number;
46
21
  message: string;