@pikku/core 0.12.71 → 0.12.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (819) hide show
  1. package/CHANGELOG.md +848 -0
  2. package/dist/crypto-utils.d.ts +30 -5
  3. package/dist/crypto-utils.js +146 -41
  4. package/dist/dev/hot-reload.js +11 -30
  5. package/dist/dev/module-runner.d.ts +3 -7
  6. package/dist/dev/module-runner.js +4 -10
  7. package/dist/dev/reload-meta.d.ts +8 -20
  8. package/dist/dev/reload-meta.js +9 -29
  9. package/dist/errors/error-handler.d.ts +5 -30
  10. package/dist/errors/error-handler.js +16 -32
  11. package/dist/errors/errors.d.ts +32 -151
  12. package/dist/errors/errors.js +55 -157
  13. package/dist/function/abort-scope.d.ts +47 -0
  14. package/dist/function/abort-scope.js +63 -0
  15. package/dist/function/function-runner.js +40 -30
  16. package/dist/function/functions.types.d.ts +44 -136
  17. package/dist/function/functions.types.js +0 -58
  18. package/dist/function/list.types.d.ts +12 -62
  19. package/dist/function/list.types.js +4 -25
  20. package/dist/handle-error.d.ts +0 -11
  21. package/dist/handle-error.js +6 -18
  22. package/dist/index.d.ts +5 -2
  23. package/dist/index.js +4 -1
  24. package/dist/middleware/auth-apikey.d.ts +3 -18
  25. package/dist/middleware/auth-apikey.js +0 -17
  26. package/dist/middleware/auth-bearer.d.ts +6 -41
  27. package/dist/middleware/auth-bearer.js +3 -40
  28. package/dist/middleware/auth-cookie.d.ts +5 -27
  29. package/dist/middleware/auth-cookie.js +2 -26
  30. package/dist/middleware/cors.d.ts +7 -34
  31. package/dist/middleware/cors.js +7 -34
  32. package/dist/middleware/remote-auth.d.ts +3 -1
  33. package/dist/middleware/remote-auth.js +3 -2
  34. package/dist/middleware/telemetry.d.ts +8 -33
  35. package/dist/middleware/telemetry.js +2 -31
  36. package/dist/middleware-runner.d.ts +4 -55
  37. package/dist/middleware-runner.js +5 -74
  38. package/dist/permissions.d.ts +3 -44
  39. package/dist/permissions.js +19 -71
  40. package/dist/pikku-request.d.ts +0 -6
  41. package/dist/pikku-request.js +0 -6
  42. package/dist/pikku-state.d.ts +0 -26
  43. package/dist/pikku-state.js +2 -30
  44. package/dist/remote.d.ts +3 -5
  45. package/dist/remote.js +8 -7
  46. package/dist/schema.d.ts +7 -17
  47. package/dist/schema.js +30 -18
  48. package/dist/scopes.d.ts +4 -23
  49. package/dist/scopes.js +7 -48
  50. package/dist/services/ai-agent-runner-service.d.ts +20 -0
  51. package/dist/services/ai-embedding-service.d.ts +2 -25
  52. package/dist/services/audit-service.js +1 -2
  53. package/dist/services/content-service.d.ts +1 -46
  54. package/dist/services/credential-service.d.ts +3 -40
  55. package/dist/services/deployment-service.d.ts +3 -9
  56. package/dist/services/gateway-service.d.ts +0 -15
  57. package/dist/services/http-personas.d.ts +80 -0
  58. package/dist/services/http-personas.js +233 -0
  59. package/dist/services/in-memory-queue-service.d.ts +0 -14
  60. package/dist/services/in-memory-queue-service.js +1 -15
  61. package/dist/services/in-memory-trigger-service.d.ts +0 -18
  62. package/dist/services/in-memory-trigger-service.js +1 -18
  63. package/dist/services/in-memory-workflow-service.d.ts +0 -16
  64. package/dist/services/in-memory-workflow-service.js +4 -33
  65. package/dist/services/index.d.ts +5 -6
  66. package/dist/services/index.js +2 -5
  67. package/dist/services/istanbul-coverage-service.d.ts +1 -5
  68. package/dist/services/istanbul-coverage-service.js +2 -8
  69. package/dist/services/jwt-service.d.ts +1 -16
  70. package/dist/services/local-content.d.ts +13 -2
  71. package/dist/services/local-content.js +40 -13
  72. package/dist/services/local-gateway-service.d.ts +0 -16
  73. package/dist/services/local-gateway-service.js +2 -17
  74. package/dist/services/local-secrets.d.ts +0 -4
  75. package/dist/services/local-secrets.js +0 -4
  76. package/dist/services/logger-console.d.ts +3 -7
  77. package/dist/services/logger-console.js +3 -7
  78. package/dist/services/logger.d.ts +2 -37
  79. package/dist/services/meta-service.d.ts +23 -26
  80. package/dist/services/meta-service.js +22 -36
  81. package/dist/services/personas-service.d.ts +134 -0
  82. package/dist/services/personas-service.js +40 -0
  83. package/dist/services/pikku-user-id.js +0 -4
  84. package/dist/services/queue-webhook-service.d.ts +2 -36
  85. package/dist/services/queue-webhook-service.js +9 -41
  86. package/dist/services/scheduler-service.d.ts +1 -50
  87. package/dist/services/scheduler-service.js +0 -10
  88. package/dist/services/schema-service.d.ts +1 -24
  89. package/dist/services/scope-service.d.ts +49 -34
  90. package/dist/services/scoped-secret-service.d.ts +0 -4
  91. package/dist/services/scoped-secret-service.js +0 -4
  92. package/dist/services/secret-host-binding.d.ts +8 -0
  93. package/dist/services/secret-host-binding.js +36 -0
  94. package/dist/services/secret-service.d.ts +5 -33
  95. package/dist/services/secretless.d.ts +6 -0
  96. package/dist/services/secretless.js +21 -0
  97. package/dist/services/stub-tracker.d.ts +7 -18
  98. package/dist/services/stub-tracker.js +8 -18
  99. package/dist/services/system-role-guard.d.ts +33 -0
  100. package/dist/services/system-role-guard.js +38 -0
  101. package/dist/services/trigger-service.d.ts +0 -12
  102. package/dist/services/typed-secret-service.d.ts +0 -7
  103. package/dist/services/typed-secret-service.js +1 -7
  104. package/dist/services/v8-coverage-service.d.ts +2 -3
  105. package/dist/services/v8-coverage-service.js +1 -2
  106. package/dist/services/variables-service.d.ts +1 -8
  107. package/dist/services/webhook-service.d.ts +19 -63
  108. package/dist/services/webhook-service.js +6 -20
  109. package/dist/services/workflow-service.d.ts +3 -15
  110. package/dist/testing/service-tests.js +0 -17
  111. package/dist/time-utils.d.ts +0 -16
  112. package/dist/time-utils.js +1 -19
  113. package/dist/types/core.types.d.ts +99 -219
  114. package/dist/types/core.types.js +0 -42
  115. package/dist/types/state.types.d.ts +4 -9
  116. package/dist/utils/hmac.d.ts +4 -10
  117. package/dist/utils/hmac.js +4 -10
  118. package/dist/utils/safe-fetch.d.ts +7 -35
  119. package/dist/utils/safe-fetch.js +13 -53
  120. package/dist/utils.d.ts +1 -6
  121. package/dist/utils.js +6 -15
  122. package/dist/wirings/actor-flow/actor-flow.types.d.ts +1 -34
  123. package/dist/wirings/actor-flow/index.d.ts +0 -9
  124. package/dist/wirings/actor-flow/run-conversation.d.ts +5 -5
  125. package/dist/wirings/actor-flow/run-conversation.js +14 -7
  126. package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -5
  127. package/dist/wirings/ai-agent/ai-agent-agui.js +34 -12
  128. package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +7 -0
  129. package/dist/wirings/ai-agent/ai-agent-helpers.js +7 -0
  130. package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +153 -0
  131. package/dist/wirings/ai-agent/ai-agent-interrupt.js +256 -0
  132. package/dist/wirings/ai-agent/ai-agent-memory.js +0 -2
  133. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -9
  134. package/dist/wirings/ai-agent/ai-agent-model-config.js +1 -9
  135. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +10 -99
  136. package/dist/wirings/ai-agent/ai-agent-prepare.js +58 -131
  137. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +2 -1
  138. package/dist/wirings/ai-agent/ai-agent-registry.js +5 -1
  139. package/dist/wirings/ai-agent/ai-agent-runner.js +49 -20
  140. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +25 -2
  141. package/dist/wirings/ai-agent/ai-agent-stream.js +153 -63
  142. package/dist/wirings/ai-agent/ai-agent.types.d.ts +84 -4
  143. package/dist/wirings/ai-agent/index.d.ts +6 -4
  144. package/dist/wirings/ai-agent/index.js +5 -4
  145. package/dist/wirings/ai-agent/voice-input.d.ts +39 -1
  146. package/dist/wirings/ai-agent/voice-input.js +46 -3
  147. package/dist/wirings/ai-agent/voice-output.d.ts +54 -1
  148. package/dist/wirings/ai-agent/voice-output.js +153 -50
  149. package/dist/wirings/channel/channel-common.d.ts +7 -20
  150. package/dist/wirings/channel/channel-common.js +7 -21
  151. package/dist/wirings/channel/channel-handler.js +25 -6
  152. package/dist/wirings/channel/channel-host-rpc.d.ts +25 -0
  153. package/dist/wirings/channel/channel-host-rpc.js +38 -0
  154. package/dist/wirings/channel/channel-middleware-runner.d.ts +0 -12
  155. package/dist/wirings/channel/channel-middleware-runner.js +0 -12
  156. package/dist/wirings/channel/channel-rpc-registry.d.ts +31 -0
  157. package/dist/wirings/channel/channel-rpc-registry.js +89 -0
  158. package/dist/wirings/channel/channel-rpc-responder.d.ts +15 -0
  159. package/dist/wirings/channel/channel-rpc-responder.js +71 -0
  160. package/dist/wirings/channel/channel-rpc-service.d.ts +40 -0
  161. package/dist/wirings/channel/channel-rpc-service.js +106 -0
  162. package/dist/wirings/channel/channel-rpc-validators.d.ts +14 -0
  163. package/dist/wirings/channel/channel-rpc-validators.js +30 -0
  164. package/dist/wirings/channel/channel-rpc.d.ts +5 -0
  165. package/dist/wirings/channel/channel-rpc.js +5 -0
  166. package/dist/wirings/channel/channel-rpc.types.d.ts +90 -0
  167. package/dist/wirings/channel/channel-rpc.types.js +50 -0
  168. package/dist/wirings/channel/channel-runner.d.ts +0 -4
  169. package/dist/wirings/channel/channel-runner.js +0 -14
  170. package/dist/wirings/channel/channel-store.d.ts +0 -10
  171. package/dist/wirings/channel/channel.types.d.ts +12 -1
  172. package/dist/wirings/channel/define-channel-routes.d.ts +0 -20
  173. package/dist/wirings/channel/define-channel-routes.js +0 -20
  174. package/dist/wirings/channel/eventhub-service.d.ts +0 -18
  175. package/dist/wirings/channel/index.d.ts +4 -1
  176. package/dist/wirings/channel/index.js +2 -0
  177. package/dist/wirings/channel/local/local-channel-runner.js +3 -1
  178. package/dist/wirings/channel/local/local-eventhub-service.d.ts +0 -33
  179. package/dist/wirings/channel/local/local-eventhub-service.js +2 -36
  180. package/dist/wirings/channel/log-channels.d.ts +0 -4
  181. package/dist/wirings/channel/log-channels.js +0 -4
  182. package/dist/wirings/channel/pikku-abstract-channel-handler.js +6 -0
  183. package/dist/wirings/channel/serverless/serverless-channel-runner.js +2 -5
  184. package/dist/wirings/cli/channel/cli-approval.d.ts +41 -0
  185. package/dist/wirings/cli/channel/cli-approval.js +81 -0
  186. package/dist/wirings/cli/channel/cli-channel-runner.d.ts +0 -4
  187. package/dist/wirings/cli/channel/cli-channel-runner.js +3 -25
  188. package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +47 -9
  189. package/dist/wirings/cli/channel/cli-raw-channel-runner.js +24 -16
  190. package/dist/wirings/cli/channel/cli-raw-client-runner.d.ts +20 -0
  191. package/dist/wirings/cli/channel/cli-raw-client-runner.js +121 -0
  192. package/dist/wirings/cli/channel/index.d.ts +4 -0
  193. package/dist/wirings/cli/channel/index.js +2 -0
  194. package/dist/wirings/cli/cli-runner.d.ts +20 -20
  195. package/dist/wirings/cli/cli-runner.js +28 -89
  196. package/dist/wirings/cli/cli.types.d.ts +14 -3
  197. package/dist/wirings/cli/command-parser.d.ts +1 -10
  198. package/dist/wirings/cli/command-parser.js +10 -87
  199. package/dist/wirings/cli/define-cli-commands.d.ts +1 -17
  200. package/dist/wirings/cli/define-cli-commands.js +1 -17
  201. package/dist/wirings/credential/credential.types.d.ts +0 -12
  202. package/dist/wirings/credential/define-credential.d.ts +48 -0
  203. package/dist/wirings/credential/define-credential.js +47 -0
  204. package/dist/wirings/credential/index.d.ts +1 -1
  205. package/dist/wirings/credential/index.js +1 -1
  206. package/dist/wirings/credential/validate-credential-definitions.d.ts +2 -4
  207. package/dist/wirings/gateway/gateway-runner.d.ts +1 -20
  208. package/dist/wirings/gateway/gateway-runner.js +8 -105
  209. package/dist/wirings/gateway/gateway.types.d.ts +7 -80
  210. package/dist/wirings/http/http-routes.d.ts +0 -63
  211. package/dist/wirings/http/http-routes.js +0 -63
  212. package/dist/wirings/http/http-runner.d.ts +1 -100
  213. package/dist/wirings/http/http-runner.js +12 -166
  214. package/dist/wirings/http/http.types.d.ts +16 -55
  215. package/dist/wirings/http/index.d.ts +2 -1
  216. package/dist/wirings/http/index.js +1 -1
  217. package/dist/wirings/http/log-http-routes.d.ts +0 -4
  218. package/dist/wirings/http/log-http-routes.js +0 -4
  219. package/dist/wirings/http/pikku-fetch-http-request.d.ts +6 -36
  220. package/dist/wirings/http/pikku-fetch-http-request.js +56 -50
  221. package/dist/wirings/http/pikku-fetch-http-response.js +0 -3
  222. package/dist/wirings/http/routers/path-to-regex.js +2 -13
  223. package/dist/wirings/http/web-request.d.ts +0 -8
  224. package/dist/wirings/http/web-request.js +25 -17
  225. package/dist/wirings/mcp/mcp-runner.d.ts +2 -0
  226. package/dist/wirings/mcp/mcp-runner.js +6 -16
  227. package/dist/wirings/mcp/mcp.types.d.ts +2 -35
  228. package/dist/wirings/oauth2/oauth2.types.d.ts +0 -28
  229. package/dist/wirings/oauth2/oauth2.types.js +0 -3
  230. package/dist/wirings/persona/define-personas.d.ts +28 -0
  231. package/dist/wirings/persona/define-personas.js +27 -0
  232. package/dist/wirings/persona/index.d.ts +21 -0
  233. package/dist/wirings/persona/index.js +17 -0
  234. package/dist/wirings/persona/persona-email.d.ts +37 -0
  235. package/dist/wirings/persona/persona-email.js +69 -0
  236. package/dist/wirings/persona/persona-environments.d.ts +45 -0
  237. package/dist/wirings/persona/persona-environments.js +81 -0
  238. package/dist/wirings/persona/persona-mailbox.d.ts +101 -0
  239. package/dist/wirings/persona/persona-mailbox.js +53 -0
  240. package/dist/wirings/persona/persona.types.d.ts +125 -0
  241. package/dist/wirings/persona/persona.types.js +1 -0
  242. package/dist/wirings/persona/validate-personas.d.ts +53 -0
  243. package/dist/wirings/persona/validate-personas.js +94 -0
  244. package/dist/wirings/queue/index.d.ts +3 -0
  245. package/dist/wirings/queue/index.js +2 -3
  246. package/dist/wirings/queue/queue-identity.d.ts +28 -0
  247. package/dist/wirings/queue/queue-identity.js +102 -0
  248. package/dist/wirings/queue/queue-runner.d.ts +0 -19
  249. package/dist/wirings/queue/queue-runner.js +9 -30
  250. package/dist/wirings/queue/queue.types.d.ts +18 -89
  251. package/dist/wirings/queue/register-queue-helper.d.ts +0 -12
  252. package/dist/wirings/queue/register-queue-helper.js +0 -11
  253. package/dist/wirings/queue/signed-queue-service.d.ts +16 -0
  254. package/dist/wirings/queue/signed-queue-service.js +42 -0
  255. package/dist/wirings/queue/validate-worker-config.d.ts +2 -23
  256. package/dist/wirings/queue/validate-worker-config.js +0 -14
  257. package/dist/wirings/role/define-system-role.d.ts +32 -0
  258. package/dist/wirings/role/define-system-role.js +31 -0
  259. package/dist/wirings/role/index.d.ts +3 -0
  260. package/dist/wirings/role/index.js +2 -0
  261. package/dist/wirings/role/role.types.d.ts +43 -0
  262. package/dist/wirings/role/role.types.js +1 -0
  263. package/dist/wirings/role/validate-role-definitions.d.ts +21 -0
  264. package/dist/wirings/role/validate-role-definitions.js +71 -0
  265. package/dist/wirings/rpc/addon-runner.d.ts +0 -19
  266. package/dist/wirings/rpc/addon-runner.js +0 -51
  267. package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -12
  268. package/dist/wirings/rpc/remote-addon-auth.js +1 -9
  269. package/dist/wirings/rpc/rpc-runner.d.ts +11 -18
  270. package/dist/wirings/rpc/rpc-runner.js +88 -105
  271. package/dist/wirings/rpc/rpc-types.d.ts +7 -6
  272. package/dist/wirings/rpc/wire-addon.d.ts +25 -0
  273. package/dist/wirings/rpc/wire-addon.js +62 -0
  274. package/dist/wirings/rpc/wire-remote-addon.d.ts +3 -28
  275. package/dist/wirings/rpc/wire-remote-addon.js +0 -8
  276. package/dist/wirings/scheduler/log-schedulers.d.ts +0 -4
  277. package/dist/wirings/scheduler/log-schedulers.js +0 -4
  278. package/dist/wirings/scheduler/scheduler-runner.d.ts +0 -1
  279. package/dist/wirings/scheduler/scheduler-runner.js +0 -1
  280. package/dist/wirings/scheduler/scheduler.types.d.ts +1 -14
  281. package/dist/wirings/scope/define-scope.d.ts +32 -0
  282. package/dist/wirings/scope/define-scope.js +31 -0
  283. package/dist/wirings/scope/index.d.ts +1 -1
  284. package/dist/wirings/scope/index.js +1 -1
  285. package/dist/wirings/scope/scope.types.d.ts +7 -9
  286. package/dist/wirings/scope/validate-scope-definitions.d.ts +2 -21
  287. package/dist/wirings/scope/validate-scope-definitions.js +3 -21
  288. package/dist/wirings/secret/index.d.ts +1 -1
  289. package/dist/wirings/secret/index.js +1 -1
  290. package/dist/wirings/secret/secret.types.d.ts +19 -15
  291. package/dist/wirings/secret/secret.types.js +1 -1
  292. package/dist/wirings/secret/validate-secret-definitions.d.ts +2 -4
  293. package/dist/wirings/trigger/trigger-runner.d.ts +0 -27
  294. package/dist/wirings/trigger/trigger-runner.js +1 -24
  295. package/dist/wirings/trigger/trigger.types.d.ts +1 -82
  296. package/dist/wirings/trigger/trigger.types.js +0 -34
  297. package/dist/wirings/variable/index.d.ts +1 -1
  298. package/dist/wirings/variable/index.js +1 -1
  299. package/dist/wirings/variable/validate-variable-definitions.d.ts +2 -4
  300. package/dist/wirings/variable/variable.types.d.ts +1 -13
  301. package/dist/wirings/variable/variable.types.js +1 -1
  302. package/dist/wirings/virtual-user/index.d.ts +27 -0
  303. package/dist/wirings/virtual-user/index.js +8 -0
  304. package/dist/wirings/virtual-user/run-virtual-user.d.ts +92 -0
  305. package/dist/wirings/virtual-user/run-virtual-user.js +478 -0
  306. package/dist/wirings/virtual-user/virtual-user-agents.d.ts +38 -0
  307. package/dist/wirings/virtual-user/virtual-user-agents.js +24 -0
  308. package/dist/wirings/virtual-user/virtual-user-catalogue.d.ts +92 -0
  309. package/dist/wirings/virtual-user/virtual-user-catalogue.js +134 -0
  310. package/dist/wirings/virtual-user/virtual-user-derive.d.ts +26 -0
  311. package/dist/wirings/virtual-user/virtual-user-derive.js +137 -0
  312. package/dist/wirings/virtual-user/virtual-user-dispositions.d.ts +79 -0
  313. package/dist/wirings/virtual-user/virtual-user-dispositions.js +128 -0
  314. package/dist/wirings/virtual-user/virtual-user-intents.d.ts +78 -0
  315. package/dist/wirings/virtual-user/virtual-user-intents.js +142 -0
  316. package/dist/wirings/virtual-user/virtual-user-rng.d.ts +24 -0
  317. package/dist/wirings/virtual-user/virtual-user-rng.js +44 -0
  318. package/dist/wirings/virtual-user/virtual-user-target.d.ts +21 -0
  319. package/dist/wirings/virtual-user/virtual-user-target.js +34 -0
  320. package/dist/wirings/virtual-user/virtual-user.types.d.ts +199 -0
  321. package/dist/wirings/virtual-user/virtual-user.types.js +8 -0
  322. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +5 -5
  323. package/dist/wirings/workflow/dsl/workflow-runner.d.ts +0 -4
  324. package/dist/wirings/workflow/dsl/workflow-runner.js +0 -4
  325. package/dist/wirings/workflow/feature.d.ts +0 -19
  326. package/dist/wirings/workflow/feature.js +0 -19
  327. package/dist/wirings/workflow/graph/graph-node.d.ts +0 -98
  328. package/dist/wirings/workflow/graph/graph-node.js +0 -34
  329. package/dist/wirings/workflow/graph/graph-runner.js +6 -41
  330. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +0 -4
  331. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -58
  332. package/dist/wirings/workflow/graph/workflow-graph.types.js +0 -6
  333. package/dist/wirings/workflow/index.d.ts +5 -7
  334. package/dist/wirings/workflow/index.js +3 -17
  335. package/dist/wirings/workflow/pikku-scenario-service.d.ts +87 -5
  336. package/dist/wirings/workflow/pikku-scenario-service.js +204 -42
  337. package/dist/wirings/workflow/pikku-workflow-service.d.ts +7 -459
  338. package/dist/wirings/workflow/pikku-workflow-service.js +58 -551
  339. package/dist/wirings/workflow/run-timeline.d.ts +0 -47
  340. package/dist/wirings/workflow/run-timeline.js +0 -22
  341. package/dist/wirings/workflow/scenario-cookie-jar.d.ts +0 -23
  342. package/dist/wirings/workflow/scenario-cookie-jar.js +0 -16
  343. package/dist/wirings/workflow/scenario-poll.d.ts +0 -15
  344. package/dist/wirings/workflow/scenario-poll.js +0 -12
  345. package/dist/wirings/workflow/scenario-prose.d.ts +0 -28
  346. package/dist/wirings/workflow/scenario-prose.js +0 -18
  347. package/dist/wirings/workflow/scenario-step-guards.d.ts +0 -13
  348. package/dist/wirings/workflow/scenario-step-guards.js +1 -14
  349. package/dist/wirings/workflow/scenario-step.types.d.ts +72 -6
  350. package/dist/wirings/workflow/scenario-step.types.js +5 -1
  351. package/dist/wirings/workflow/scenario-surface.d.ts +16 -0
  352. package/dist/wirings/workflow/scenario-surface.js +56 -0
  353. package/dist/wirings/workflow/workflow-invocation-id.d.ts +0 -18
  354. package/dist/wirings/workflow/workflow-invocation-id.js +2 -22
  355. package/dist/wirings/workflow/workflow-queue-workers.d.ts +0 -20
  356. package/dist/wirings/workflow/workflow-queue-workers.js +0 -19
  357. package/dist/wirings/workflow/workflow.types.d.ts +0 -197
  358. package/knowledge/decisions/index.md +19 -0
  359. package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +49 -0
  360. package/knowledge/decisions/internals/actor-flow-conversations-seed-a-hidden-kickoff-message.md +23 -0
  361. package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +24 -0
  362. package/knowledge/decisions/internals/actor-flow-verdicts-are-llm-self-evaluations.md +25 -0
  363. package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +26 -0
  364. package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +33 -0
  365. package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +28 -0
  366. package/knowledge/decisions/internals/ai-agent-agui-bridge-obeys-the-client-ordering-contract.md +29 -0
  367. package/knowledge/decisions/internals/ai-agent-audio-chunks-carry-the-format-the-provider-returned.md +20 -0
  368. package/knowledge/decisions/internals/ai-agent-credential-suspensions-hide-the-tool-result.md +26 -0
  369. package/knowledge/decisions/internals/ai-agent-delegate-and-supervise-hide-different-text.md +26 -0
  370. package/knowledge/decisions/internals/ai-agent-llm-tool-arguments-have-nulls-stripped.md +23 -0
  371. package/knowledge/decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md +25 -0
  372. package/knowledge/decisions/internals/ai-agent-onerror-hooks-cannot-change-the-failure.md +22 -0
  373. package/knowledge/decisions/internals/ai-agent-runner-methods-must-keep-their-receiver.md +22 -0
  374. package/knowledge/decisions/internals/ai-agent-stream-persistence-is-best-effort.md +27 -0
  375. package/knowledge/decisions/internals/ai-agent-sub-agents-inherit-the-parent-context-block.md +26 -0
  376. package/knowledge/decisions/internals/ai-agent-tool-execute-failures-are-logged-unconditionally.md +25 -0
  377. package/knowledge/decisions/internals/ai-agent-voice-input-transcribes-audio-parts-in-place.md +22 -0
  378. package/knowledge/decisions/internals/ai-agent-working-memory-is-persisted-only-when-valid.md +25 -0
  379. package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +30 -0
  380. package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +31 -0
  381. package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +29 -0
  382. package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +28 -0
  383. package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +27 -0
  384. package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +28 -0
  385. package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +34 -0
  386. package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +29 -0
  387. package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +34 -0
  388. package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +44 -0
  389. package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +39 -0
  390. package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +42 -0
  391. package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +39 -0
  392. package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +43 -0
  393. package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +38 -0
  394. package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +44 -0
  395. package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +27 -0
  396. package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +32 -0
  397. package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +28 -0
  398. package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +31 -0
  399. package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +26 -0
  400. package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +32 -0
  401. package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +28 -0
  402. package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +30 -0
  403. package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +26 -0
  404. package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +28 -0
  405. package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +32 -0
  406. package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +26 -0
  407. package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +25 -0
  408. package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +26 -0
  409. package/knowledge/decisions/internals/index.md +113 -0
  410. package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +25 -0
  411. package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +26 -0
  412. package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +24 -0
  413. package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +28 -0
  414. package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +27 -0
  415. package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +31 -0
  416. package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +32 -0
  417. package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +27 -0
  418. package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +26 -0
  419. package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +27 -0
  420. package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +30 -0
  421. package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +28 -0
  422. package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +30 -0
  423. package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +29 -0
  424. package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +27 -0
  425. package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +40 -0
  426. package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +26 -0
  427. package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +33 -0
  428. package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +26 -0
  429. package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +26 -0
  430. package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +25 -0
  431. package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +58 -0
  432. package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +34 -0
  433. package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +42 -0
  434. package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +38 -0
  435. package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +29 -0
  436. package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +42 -0
  437. package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +25 -0
  438. package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +29 -0
  439. package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +43 -0
  440. package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +29 -0
  441. package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +42 -0
  442. package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +33 -0
  443. package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +32 -0
  444. package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +31 -0
  445. package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +39 -0
  446. package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +29 -0
  447. package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +33 -0
  448. package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +37 -0
  449. package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +50 -0
  450. package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +43 -0
  451. package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +32 -0
  452. package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +18 -0
  453. package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +34 -0
  454. package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +26 -0
  455. package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +33 -0
  456. package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +27 -0
  457. package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +34 -0
  458. package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +38 -0
  459. package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +30 -0
  460. package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +26 -0
  461. package/knowledge/decisions/security/actor-flow-missing-approval-decisions-default-to-denied.md +22 -0
  462. package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +27 -0
  463. package/knowledge/decisions/security/actor-sign-in-only-works-for-actor-flagged-users.md +27 -0
  464. package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +43 -0
  465. package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +52 -0
  466. package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +46 -0
  467. package/knowledge/decisions/security/ai-agent-approval-forwarding-requires-a-symbol-brand.md +27 -0
  468. package/knowledge/decisions/security/ai-agent-credential-requests-are-symbol-branded.md +37 -0
  469. package/knowledge/decisions/security/ai-agent-gate-requires-a-session-only-when-auth-is-true.md +31 -0
  470. package/knowledge/decisions/security/ai-agent-ownership-failures-never-echo-the-resource.md +23 -0
  471. package/knowledge/decisions/security/ai-agent-resume-re-runs-the-authorization-gate.md +22 -0
  472. package/knowledge/decisions/security/ai-agent-sessionless-deployments-have-no-thread-ownership.md +39 -0
  473. package/knowledge/decisions/security/ai-agent-thread-ownership-composes-the-session-principal.md +30 -0
  474. package/knowledge/decisions/security/ai-agent-tool-filtering-reads-the-live-function-config.md +24 -0
  475. package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +30 -0
  476. package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +49 -0
  477. package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +76 -0
  478. package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +39 -0
  479. package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +37 -0
  480. package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +31 -0
  481. package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +30 -0
  482. package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +40 -0
  483. package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +33 -0
  484. package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +46 -0
  485. package/knowledge/decisions/security/index.md +55 -0
  486. package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +27 -0
  487. package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +40 -0
  488. package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +31 -0
  489. package/knowledge/decisions/security/pikku-carries-actor-scopes-as-data-and-the-app-grants-them.md +26 -0
  490. package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +69 -0
  491. package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +39 -0
  492. package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +34 -0
  493. package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +49 -0
  494. package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +30 -0
  495. package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +28 -0
  496. package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +34 -0
  497. package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +37 -0
  498. package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +25 -0
  499. package/knowledge/decisions/security/workflow-actor-steps-always-use-the-real-transport.md +34 -0
  500. package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +40 -0
  501. package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +32 -0
  502. package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-actor-and-per-scenario.md +32 -0
  503. package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +31 -0
  504. package/knowledge/index.md +24 -0
  505. package/knowledge/questions/index.md +15 -0
  506. package/package.json +4 -2
  507. package/run-tests.sh +0 -0
  508. package/src/crypto-utils.test.ts +460 -19
  509. package/src/crypto-utils.ts +283 -55
  510. package/src/data-classification.ts +1 -7
  511. package/src/dev/hot-reload.test.ts +0 -4
  512. package/src/dev/hot-reload.ts +11 -30
  513. package/src/dev/module-runner.ts +7 -32
  514. package/src/dev/reload-meta.ts +9 -29
  515. package/src/errors/error-handler.ts +20 -35
  516. package/src/errors/error.test.ts +30 -1
  517. package/src/errors/errors.ts +73 -157
  518. package/src/function/abort-scope.test.ts +97 -0
  519. package/src/function/abort-scope.ts +80 -0
  520. package/src/function/function-runner.test.ts +75 -7
  521. package/src/function/function-runner.ts +73 -30
  522. package/src/function/functions.types.ts +56 -136
  523. package/src/function/list.types.test.ts +3 -25
  524. package/src/function/list.types.ts +12 -62
  525. package/src/gopass-secrets-removed.test.ts +51 -0
  526. package/src/handle-error.test.ts +108 -1
  527. package/src/handle-error.ts +8 -18
  528. package/src/index.ts +60 -1
  529. package/src/middleware/auth-apikey.test.ts +0 -1
  530. package/src/middleware/auth-apikey.ts +0 -17
  531. package/src/middleware/auth-bearer.test.ts +0 -3
  532. package/src/middleware/auth-bearer.ts +3 -40
  533. package/src/middleware/auth-cookie.test.ts +0 -6
  534. package/src/middleware/auth-cookie.ts +2 -26
  535. package/src/middleware/cors.test.ts +34 -0
  536. package/src/middleware/cors.ts +12 -33
  537. package/src/middleware/remote-auth.test.ts +24 -9
  538. package/src/middleware/remote-auth.ts +10 -2
  539. package/src/middleware/telemetry.ts +2 -31
  540. package/src/middleware-runner.test.ts +0 -2
  541. package/src/middleware-runner.ts +5 -74
  542. package/src/permissions.test.ts +30 -0
  543. package/src/permissions.ts +24 -74
  544. package/src/pikku-request.ts +0 -6
  545. package/src/pikku-state.ts +2 -30
  546. package/src/production-barrels-stay-lean.test.ts +110 -0
  547. package/src/remote.test.ts +172 -0
  548. package/src/remote.ts +17 -7
  549. package/src/schema.test.ts +103 -0
  550. package/src/schema.ts +35 -18
  551. package/src/scopes.ts +7 -48
  552. package/src/services/ai-agent-runner-service.ts +20 -0
  553. package/src/services/ai-embedding-service.ts +3 -25
  554. package/src/services/audit-service.ts +1 -2
  555. package/src/services/content-service.ts +1 -46
  556. package/src/services/credential-service.ts +3 -40
  557. package/src/services/credential-wire-service.test.ts +0 -2
  558. package/src/services/deployment-service.ts +3 -9
  559. package/src/services/gateway-service.ts +0 -15
  560. package/src/services/{http-scenario-actors-converse.test.ts → http-personas-converse.test.ts} +38 -9
  561. package/src/services/{http-scenario-actors.test.ts → http-personas.test.ts} +39 -22
  562. package/src/services/{http-scenario-actors.ts → http-personas.ts} +85 -45
  563. package/src/services/in-memory-queue-service.ts +1 -15
  564. package/src/services/in-memory-trigger-service.ts +1 -18
  565. package/src/services/in-memory-workflow-service.test.ts +0 -13
  566. package/src/services/in-memory-workflow-service.ts +4 -38
  567. package/src/services/index.ts +20 -15
  568. package/src/services/istanbul-coverage-service.ts +2 -8
  569. package/src/services/jwt-service.ts +1 -16
  570. package/src/services/local-content.test.ts +159 -27
  571. package/src/services/local-content.ts +55 -23
  572. package/src/services/local-gateway-service.ts +2 -17
  573. package/src/services/local-secrets.ts +0 -4
  574. package/src/services/logger-console.test.ts +0 -1
  575. package/src/services/logger-console.ts +3 -7
  576. package/src/services/logger.ts +2 -37
  577. package/src/services/meta-service.test.ts +1 -5
  578. package/src/services/meta-service.ts +41 -61
  579. package/src/services/{scenario-actors-service.ts → personas-service.ts} +48 -43
  580. package/src/services/pikku-user-id.ts +0 -4
  581. package/src/services/queue-webhook-service.ts +9 -41
  582. package/src/services/scheduler-service.ts +1 -50
  583. package/src/services/schema-service.ts +1 -24
  584. package/src/services/scope-service.ts +50 -34
  585. package/src/services/scoped-secret-service.ts +0 -4
  586. package/src/services/secret-host-binding.test.ts +138 -0
  587. package/src/services/secret-host-binding.ts +51 -0
  588. package/src/services/secret-service.ts +5 -33
  589. package/src/services/secretless.test.ts +54 -0
  590. package/src/services/secretless.ts +29 -0
  591. package/src/services/stub-tracker.ts +8 -18
  592. package/src/services/system-role-guard.test.ts +93 -0
  593. package/src/services/system-role-guard.ts +71 -0
  594. package/src/services/trigger-service.ts +0 -12
  595. package/src/services/typed-secret-service.ts +1 -7
  596. package/src/services/v8-coverage-service.ts +3 -6
  597. package/src/services/variables-service.ts +1 -8
  598. package/src/services/webhook-service.ts +19 -63
  599. package/src/services/workflow-service.ts +3 -20
  600. package/src/testing/service-tests.ts +0 -26
  601. package/src/time-utils.ts +1 -19
  602. package/src/types/core.types.ts +116 -229
  603. package/src/types/state.types.ts +7 -9
  604. package/src/utils/hmac.ts +4 -10
  605. package/src/utils/safe-fetch.ts +13 -54
  606. package/src/utils.test.ts +11 -2
  607. package/src/utils.ts +6 -15
  608. package/src/wirings/actor-flow/actor-flow.types.ts +1 -34
  609. package/src/wirings/actor-flow/index.ts +0 -9
  610. package/src/wirings/actor-flow/run-conversation.test.ts +11 -6
  611. package/src/wirings/actor-flow/run-conversation.ts +19 -12
  612. package/src/wirings/ai-agent/ai-agent-agui.test.ts +75 -10
  613. package/src/wirings/ai-agent/ai-agent-agui.ts +36 -17
  614. package/src/wirings/ai-agent/ai-agent-helpers.ts +20 -0
  615. package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +842 -0
  616. package/src/wirings/ai-agent/ai-agent-interrupt.ts +399 -0
  617. package/src/wirings/ai-agent/ai-agent-memory.ts +0 -2
  618. package/src/wirings/ai-agent/ai-agent-model-config.ts +1 -9
  619. package/src/wirings/ai-agent/ai-agent-prepare.test.ts +202 -31
  620. package/src/wirings/ai-agent/ai-agent-prepare.ts +82 -138
  621. package/src/wirings/ai-agent/ai-agent-registry.test.ts +191 -6
  622. package/src/wirings/ai-agent/ai-agent-registry.ts +18 -1
  623. package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +0 -2
  624. package/src/wirings/ai-agent/ai-agent-runner.test.ts +11 -9
  625. package/src/wirings/ai-agent/ai-agent-runner.ts +67 -33
  626. package/src/wirings/ai-agent/ai-agent-stream.test.ts +205 -103
  627. package/src/wirings/ai-agent/ai-agent-stream.ts +192 -75
  628. package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +301 -0
  629. package/src/wirings/ai-agent/ai-agent.types.ts +85 -4
  630. package/src/wirings/ai-agent/index.ts +35 -3
  631. package/src/wirings/ai-agent/voice-input.test.ts +72 -7
  632. package/src/wirings/ai-agent/voice-input.ts +48 -3
  633. package/src/wirings/ai-agent/voice-output.test.ts +422 -0
  634. package/src/wirings/ai-agent/voice-output.ts +216 -56
  635. package/src/wirings/channel/channel-common.ts +15 -20
  636. package/src/wirings/channel/channel-handler.test.ts +50 -0
  637. package/src/wirings/channel/channel-handler.ts +32 -11
  638. package/src/wirings/channel/channel-host-rpc.test.ts +150 -0
  639. package/src/wirings/channel/channel-host-rpc.ts +69 -0
  640. package/src/wirings/channel/channel-middleware-runner.test.ts +0 -1
  641. package/src/wirings/channel/channel-middleware-runner.ts +0 -12
  642. package/src/wirings/channel/channel-rpc-registry.ts +116 -0
  643. package/src/wirings/channel/channel-rpc-responder.ts +117 -0
  644. package/src/wirings/channel/channel-rpc-service.ts +146 -0
  645. package/src/wirings/channel/channel-rpc-validators.ts +65 -0
  646. package/src/wirings/channel/channel-rpc.test.ts +820 -0
  647. package/src/wirings/channel/channel-rpc.ts +5 -0
  648. package/src/wirings/channel/channel-rpc.types.ts +150 -0
  649. package/src/wirings/channel/channel-runner.ts +0 -14
  650. package/src/wirings/channel/channel-store.ts +0 -10
  651. package/src/wirings/channel/channel.types.ts +19 -8
  652. package/src/wirings/channel/define-channel-routes.ts +0 -20
  653. package/src/wirings/channel/eventhub-service.ts +0 -18
  654. package/src/wirings/channel/index.ts +35 -0
  655. package/src/wirings/channel/local/local-channel-handler.ts +3 -1
  656. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -10
  657. package/src/wirings/channel/local/local-channel-runner.ts +3 -1
  658. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -13
  659. package/src/wirings/channel/local/local-eventhub-service.ts +2 -37
  660. package/src/wirings/channel/log-channels.ts +0 -4
  661. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +83 -2
  662. package/src/wirings/channel/pikku-abstract-channel-handler.ts +7 -0
  663. package/src/wirings/channel/serverless/serverless-channel-runner.ts +2 -5
  664. package/src/wirings/cli/channel/cli-approval.test.ts +177 -0
  665. package/src/wirings/cli/channel/cli-approval.ts +135 -0
  666. package/src/wirings/cli/channel/cli-channel-runner.ts +4 -26
  667. package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +169 -0
  668. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +59 -16
  669. package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +480 -0
  670. package/src/wirings/cli/channel/cli-raw-client-runner.ts +155 -0
  671. package/src/wirings/cli/channel/index.ts +9 -0
  672. package/src/wirings/cli/cli-runner.test.ts +0 -1
  673. package/src/wirings/cli/cli-runner.ts +46 -88
  674. package/src/wirings/cli/cli.types.ts +14 -3
  675. package/src/wirings/cli/command-parser.test.ts +0 -4
  676. package/src/wirings/cli/command-parser.ts +11 -91
  677. package/src/wirings/cli/define-cli-commands.ts +1 -17
  678. package/src/wirings/credential/credential.types.ts +0 -12
  679. package/src/wirings/credential/{wire-credential.ts → define-credential.ts} +7 -7
  680. package/src/wirings/credential/index.ts +1 -1
  681. package/src/wirings/credential/validate-credential-definitions.ts +2 -4
  682. package/src/wirings/gateway/gateway-runner.test.ts +1 -21
  683. package/src/wirings/gateway/gateway-runner.ts +8 -110
  684. package/src/wirings/gateway/gateway.types.ts +7 -80
  685. package/src/wirings/http/http-routes.test.ts +0 -3
  686. package/src/wirings/http/http-routes.ts +0 -86
  687. package/src/wirings/http/http-runner.test.ts +0 -1
  688. package/src/wirings/http/http-runner.ts +12 -168
  689. package/src/wirings/http/http.types.ts +17 -62
  690. package/src/wirings/http/index.ts +5 -1
  691. package/src/wirings/http/log-http-routes.ts +0 -4
  692. package/src/wirings/http/pikku-fetch-http-request.test.ts +88 -7
  693. package/src/wirings/http/pikku-fetch-http-request.ts +74 -50
  694. package/src/wirings/http/pikku-fetch-http-response.test.ts +1 -1
  695. package/src/wirings/http/pikku-fetch-http-response.ts +0 -3
  696. package/src/wirings/http/routers/path-to-regex.test.ts +4 -17
  697. package/src/wirings/http/routers/path-to-regex.ts +2 -13
  698. package/src/wirings/http/web-request.test.ts +33 -2
  699. package/src/wirings/http/web-request.ts +30 -17
  700. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -1
  701. package/src/wirings/mcp/mcp-runner.test.ts +40 -0
  702. package/src/wirings/mcp/mcp-runner.ts +9 -15
  703. package/src/wirings/mcp/mcp.types.ts +7 -42
  704. package/src/wirings/oauth2/oauth2.types.ts +0 -30
  705. package/src/wirings/persona/define-personas.ts +29 -0
  706. package/src/wirings/persona/index.ts +62 -0
  707. package/src/wirings/persona/persona-email.ts +87 -0
  708. package/src/wirings/persona/persona-environments.test.ts +183 -0
  709. package/src/wirings/persona/persona-environments.ts +138 -0
  710. package/src/wirings/persona/persona-mailbox.ts +156 -0
  711. package/src/wirings/persona/persona.test.ts +220 -0
  712. package/src/wirings/persona/persona.types.ts +131 -0
  713. package/src/wirings/persona/validate-personas.ts +133 -0
  714. package/src/wirings/queue/index.ts +13 -3
  715. package/src/wirings/queue/queue-identity.test.ts +453 -0
  716. package/src/wirings/queue/queue-identity.ts +173 -0
  717. package/src/wirings/queue/queue-runner.ts +12 -31
  718. package/src/wirings/queue/queue.types.ts +19 -89
  719. package/src/wirings/queue/register-queue-helper.ts +0 -14
  720. package/src/wirings/queue/signed-queue-service.ts +59 -0
  721. package/src/wirings/queue/validate-worker-config.ts +2 -28
  722. package/src/wirings/role/define-system-role.ts +33 -0
  723. package/src/wirings/role/index.ts +13 -0
  724. package/src/wirings/role/role.test.ts +104 -0
  725. package/src/wirings/role/role.types.ts +47 -0
  726. package/src/wirings/role/validate-role-definitions.ts +93 -0
  727. package/src/wirings/rpc/addon-auth-tags.test.ts +223 -0
  728. package/src/wirings/rpc/addon-runner.ts +0 -56
  729. package/src/wirings/rpc/addon-scopes.test.ts +225 -0
  730. package/src/wirings/rpc/remote-addon-auth.ts +1 -13
  731. package/src/wirings/rpc/rpc-runner.test.ts +186 -2
  732. package/src/wirings/rpc/rpc-runner.ts +145 -127
  733. package/src/wirings/rpc/rpc-types.ts +11 -6
  734. package/src/wirings/rpc/wire-addon.test.ts +43 -1
  735. package/src/wirings/rpc/wire-addon.ts +99 -0
  736. package/src/wirings/rpc/wire-remote-addon.ts +9 -29
  737. package/src/wirings/scheduler/log-schedulers.ts +0 -4
  738. package/src/wirings/scheduler/scheduler-runner.test.ts +1 -8
  739. package/src/wirings/scheduler/scheduler-runner.ts +0 -2
  740. package/src/wirings/scheduler/scheduler.types.ts +1 -14
  741. package/src/wirings/scope/{wire-scope.ts → define-scope.ts} +5 -6
  742. package/src/wirings/scope/index.ts +1 -1
  743. package/src/wirings/scope/scope.test.ts +1 -2
  744. package/src/wirings/scope/scope.types.ts +7 -9
  745. package/src/wirings/scope/validate-scope-definitions.ts +3 -21
  746. package/src/wirings/secret/index.ts +1 -1
  747. package/src/wirings/secret/secret.types.ts +19 -15
  748. package/src/wirings/secret/validate-secret-definitions.ts +2 -4
  749. package/src/wirings/trigger/trigger-runner.ts +1 -27
  750. package/src/wirings/trigger/trigger.types.ts +1 -82
  751. package/src/wirings/variable/index.ts +1 -1
  752. package/src/wirings/variable/validate-variable-definitions.ts +2 -4
  753. package/src/wirings/variable/variable.types.ts +1 -13
  754. package/src/wirings/virtual-user/index.ts +76 -0
  755. package/src/wirings/virtual-user/run-virtual-user.test.ts +765 -0
  756. package/src/wirings/virtual-user/run-virtual-user.ts +671 -0
  757. package/src/wirings/virtual-user/virtual-user-agents.test.ts +65 -0
  758. package/src/wirings/virtual-user/virtual-user-agents.ts +57 -0
  759. package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +215 -0
  760. package/src/wirings/virtual-user/virtual-user-catalogue.ts +184 -0
  761. package/src/wirings/virtual-user/virtual-user-derive.test.ts +398 -0
  762. package/src/wirings/virtual-user/virtual-user-derive.ts +173 -0
  763. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +63 -0
  764. package/src/wirings/virtual-user/virtual-user-dispositions.ts +213 -0
  765. package/src/wirings/virtual-user/virtual-user-intents.test.ts +208 -0
  766. package/src/wirings/virtual-user/virtual-user-intents.ts +185 -0
  767. package/src/wirings/virtual-user/virtual-user-rng.test.ts +72 -0
  768. package/src/wirings/virtual-user/virtual-user-rng.ts +50 -0
  769. package/src/wirings/virtual-user/virtual-user-target.ts +47 -0
  770. package/src/wirings/virtual-user/virtual-user.types.ts +219 -0
  771. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +5 -4
  772. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -4
  773. package/src/wirings/workflow/feature.ts +0 -19
  774. package/src/wirings/workflow/graph/graph-node.ts +0 -136
  775. package/src/wirings/workflow/graph/graph-runner.test.ts +20 -19
  776. package/src/wirings/workflow/graph/graph-runner.ts +6 -41
  777. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -4
  778. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -58
  779. package/src/wirings/workflow/index.ts +10 -44
  780. package/src/wirings/workflow/pikku-scenario-service.ts +235 -52
  781. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -39
  782. package/src/wirings/workflow/pikku-workflow-service.ts +77 -674
  783. package/src/wirings/workflow/run-timeline.test.ts +7 -19
  784. package/src/wirings/workflow/run-timeline.ts +0 -56
  785. package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -1
  786. package/src/wirings/workflow/scenario-cookie-jar.ts +0 -25
  787. package/src/wirings/workflow/scenario-expectations.test.ts +2 -7
  788. package/src/wirings/workflow/scenario-hooks.test.ts +2 -7
  789. package/src/wirings/workflow/scenario-poll.test.ts +0 -2
  790. package/src/wirings/workflow/scenario-poll.ts +0 -15
  791. package/src/wirings/workflow/scenario-prose.ts +0 -28
  792. package/src/wirings/workflow/scenario-service.test.ts +2 -9
  793. package/src/wirings/workflow/scenario-step-guards.ts +1 -14
  794. package/src/wirings/workflow/scenario-step.test.ts +159 -14
  795. package/src/wirings/workflow/scenario-step.types.ts +82 -6
  796. package/src/wirings/workflow/scenario-surface.test.ts +145 -0
  797. package/src/wirings/workflow/scenario-surface.ts +71 -0
  798. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +14 -15
  799. package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -4
  800. package/src/wirings/workflow/workflow-inline-authority.test.ts +169 -0
  801. package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -2
  802. package/src/wirings/workflow/workflow-invocation-id.ts +2 -22
  803. package/src/wirings/workflow/workflow-mirror.test.ts +0 -7
  804. package/src/wirings/workflow/workflow-on-error.test.ts +0 -9
  805. package/src/wirings/workflow/workflow-queue-workers.ts +0 -21
  806. package/src/wirings/workflow/workflow-replay-snapshot.test.ts +8 -7
  807. package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -5
  808. package/src/wirings/workflow/workflow-run-context.test.ts +5 -10
  809. package/src/wirings/workflow/workflow-run-polling.test.ts +0 -5
  810. package/src/wirings/workflow/workflow-step-ordinal.test.ts +19 -4
  811. package/src/wirings/workflow/workflow-step-session.test.ts +0 -7
  812. package/src/wirings/workflow/workflow.types.ts +0 -203
  813. package/tsconfig.tsbuildinfo +1 -1
  814. package/src/middleware/timeout.ts +0 -22
  815. package/src/pikku-response.ts +0 -5
  816. package/src/services/gopass-secrets.ts +0 -78
  817. package/src/wirings/mcp/mcp-endpoint-registry.test.d.ts +0 -1
  818. package/src/wirings/workflow/dsl/index.ts +0 -36
  819. package/src/wirings/workflow/graph/index.ts +0 -15
@@ -16,7 +16,6 @@ addError(RPCNotFoundError, {
16
16
  mcpCode: -32601,
17
17
  message: 'RPC function not found.',
18
18
  });
19
- /** A `wireRemoteAddon` namespace is missing a usable `serverUrl`. */
20
19
  export class RemoteAddonConfigError extends PikkuError {
21
20
  constructor(namespace, detail) {
22
21
  super(`Remote addon '${namespace}' is misconfigured: ${detail}`);
@@ -26,7 +25,6 @@ addError(RemoteAddonConfigError, {
26
25
  status: 500,
27
26
  message: 'Remote addon is misconfigured.',
28
27
  });
29
- /** The hosted addon returned a non-2xx response for a remote RPC. */
30
28
  export class RemoteAddonRequestError extends PikkuError {
31
29
  httpStatus;
32
30
  constructor(namespace, fnName, status, detail) {
@@ -39,12 +37,8 @@ addError(RemoteAddonRequestError, {
39
37
  message: 'Remote addon request failed.',
40
38
  });
41
39
  import { runAIAgent, resumeAIAgentSync } from '../ai-agent/ai-agent-runner.js';
42
- import { streamAIAgent, resumeAIAgent } from '../ai-agent/ai-agent-stream.js';
40
+ import { streamAIAgent, resumeAIAgent, interruptAIAgent, } from '../ai-agent/ai-agent-stream.js';
43
41
  import { wrapChannelWithAGUI } from '../ai-agent/ai-agent-agui.js';
44
- /**
45
- * Resolve a namespaced function reference to package and function names
46
- * Uses pikkuState to look up the namespace -> package mapping
47
- */
48
42
  export const resolveNamespace = (namespacedFunction) => {
49
43
  const colonIndex = namespacedFunction.indexOf(':');
50
44
  if (colonIndex === -1) {
@@ -63,15 +57,7 @@ export const resolveNamespace = (namespacedFunction) => {
63
57
  addonConfig: pkgConfig,
64
58
  };
65
59
  };
66
- /**
67
- * Resolve a bare (non-namespaced) RPC name to its pikkuFuncId, preferring
68
- * the caller's addon package when provided. Returns the function name plus
69
- * the package scope that resolved it (null = root), so callers can thread
70
- * the scope into runPikkuFunc without a second lookup.
71
- */
72
60
  const resolvePikkuFunction = (rpcName, packageName = null) => {
73
- // Addon-scoped calls: try the caller's package function meta first.
74
- // (RPC meta only lives in root; addon functions are registered under their package.)
75
61
  if (packageName) {
76
62
  const pkgFunctions = pikkuState(packageName, 'function', 'meta');
77
63
  const pkgMeta = pkgFunctions?.[rpcName];
@@ -102,7 +88,12 @@ const resolvePikkuFunction = (rpcName, packageName = null) => {
102
88
  }
103
89
  return { pikkuFuncId: rpcMeta, packageName: null };
104
90
  };
105
- // Context-aware RPC client for use within services
91
+ /**
92
+ * Marks an addon RPC name that could not be resolved. Module-private on purpose:
93
+ * resolution failure must never be conflated with an `RPCNotFoundError` thrown by
94
+ * a function that already started executing, and it must never escape to callers.
95
+ */
96
+ const NOT_RESOLVED = Symbol('pikku:rpc-not-resolved');
106
97
  export class ContextAwareRPCService {
107
98
  services;
108
99
  wire;
@@ -138,38 +129,18 @@ export class ContextAwareRPCService {
138
129
  const updatedWire = {
139
130
  ...this.wire,
140
131
  };
141
- // Check addon namespace first (e.g. 'stripe:createCharge')
142
132
  if (funcName.includes(':')) {
143
- try {
144
- return await this.invokeAddonFunction(funcName, data, updatedWire);
145
- }
146
- catch (addonErr) {
147
- if (!(addonErr instanceof RPCNotFoundError))
148
- throw addonErr;
149
- // Not an addon — fall through to local lookup
133
+ const addonCall = this.resolveAddonFunction(funcName);
134
+ if (addonCall !== NOT_RESOLVED) {
135
+ return await this.executeAddonFunction(addonCall, data, updatedWire);
150
136
  }
151
137
  }
152
- // Bare name: resolve via caller's package scope first (if any), then root.
153
- // Note: intra-addon bare calls do NOT re-apply the addon's external
154
- // addonConfig.auth/tags — those gates are only applied on the external
155
- // 'namespace:func' boundary via invokeAddonFunction.
138
+ let resolved;
156
139
  try {
157
- const resolved = resolvePikkuFunction(funcName, this.packageName);
158
- const addonInstance = resolved.packageName
159
- ? addonInstanceForNamespace(this.wire.addonNamespace, resolved.packageName)
160
- : undefined;
161
- return await runPikkuFunc('rpc', funcName, resolved.pikkuFuncId, {
162
- auth: this.options.requiresAuth,
163
- singletonServices: this.services,
164
- data: () => data,
165
- wire: updatedWire,
166
- packageName: resolved.packageName,
167
- addonInstance,
168
- });
140
+ resolved = resolvePikkuFunction(funcName, this.packageName);
169
141
  }
170
142
  catch (e) {
171
143
  if (e instanceof RPCNotFoundError) {
172
- // Fall back to deployment service (e.g. CF service binding, Lambda Invoke)
173
144
  if (this.services.deploymentService) {
174
145
  const session = this.wire.getSession && typeof this.wire.getSession === 'function'
175
146
  ? await this.wire.getSession()
@@ -179,72 +150,80 @@ export class ContextAwareRPCService {
179
150
  }
180
151
  throw e;
181
152
  }
153
+ const addonInstance = resolved.packageName
154
+ ? addonInstanceForNamespace(this.wire.addonNamespace, resolved.packageName)
155
+ : undefined;
156
+ return await runPikkuFunc('rpc', funcName, resolved.pikkuFuncId, {
157
+ auth: this.options.requiresAuth,
158
+ singletonServices: this.services,
159
+ data: () => data,
160
+ wire: updatedWire,
161
+ packageName: resolved.packageName,
162
+ addonInstance,
163
+ });
182
164
  }
183
165
  /**
184
- * Invoke a function from an addon package
185
- * Addon packages register their functions in pikkuState under their package name.
186
- * The function is executed using the parent services (shared singleton services).
187
- * @private
166
+ * Resolution half of an addon RPC call: never executes anything, so an
167
+ * `RPCNotFoundError` thrown by the function itself can never be mistaken for
168
+ * an unresolvable name.
188
169
  */
189
- async invokeAddonFunction(namespacedFunction, data, wire) {
190
- // Resolve namespace to package name
170
+ resolveAddonFunction(namespacedFunction) {
191
171
  const resolved = resolveNamespace(namespacedFunction);
192
172
  if (!resolved) {
193
- throw new RPCNotFoundError(namespacedFunction);
173
+ return NOT_RESOLVED;
194
174
  }
195
175
  const namespace = namespacedFunction.slice(0, namespacedFunction.indexOf(':'));
196
- // wireRemoteAddon: the addon ships as a devDependency (types only) and its
197
- // handlers run on the host — dispatch over HTTP, not through local meta.
198
176
  if (resolved.addonConfig?.remote) {
199
- return this.invokeRemoteAddonFunction(namespace, resolved.function, data);
177
+ const addonConfig = pikkuState(null, 'addons', 'packages').get(namespace);
178
+ if (!addonConfig?.remote) {
179
+ return NOT_RESOLVED;
180
+ }
181
+ return {
182
+ kind: 'remote',
183
+ namespace,
184
+ fnName: resolved.function,
185
+ addonConfig,
186
+ };
200
187
  }
201
- // Get the function meta from the addon package
202
- // Addon packages use function meta, not RPC meta
203
188
  const addonFunctionMeta = pikkuState(resolved.package, 'function', 'meta');
204
189
  const funcMeta = addonFunctionMeta[resolved.function];
205
190
  if (!funcMeta) {
206
- throw new RPCNotFoundError(namespacedFunction);
191
+ return NOT_RESOLVED;
207
192
  }
208
- const funcName = funcMeta.pikkuFuncId || resolved.function;
209
- const auth = resolved.addonConfig?.auth ?? this.options.requiresAuth;
210
- const tags = [
211
- ...(resolved.addonConfig?.tags ?? []),
212
- ...(funcMeta.tags ?? []),
213
- ];
214
- // The namespace is the consumer-facing wireAddon name; it selects the
215
- // per-instance singleton services and secret/variable/credential overrides.
216
- const addonInstance = {
217
- namespace,
218
- secretOverrides: resolved.addonConfig?.secretOverrides,
219
- variableOverrides: resolved.addonConfig?.variableOverrides,
220
- credentialOverrides: resolved.addonConfig?.credentialOverrides,
193
+ return {
194
+ kind: 'local',
195
+ namespacedFunction,
196
+ packageName: resolved.package,
197
+ pikkuFuncId: funcMeta.pikkuFuncId || resolved.function,
198
+ auth: resolved.addonConfig?.auth ?? this.options.requiresAuth,
199
+ tags: [...(resolved.addonConfig?.tags ?? []), ...(funcMeta.tags ?? [])],
200
+ addonInstance: {
201
+ namespace,
202
+ secretOverrides: resolved.addonConfig?.secretOverrides,
203
+ variableOverrides: resolved.addonConfig?.variableOverrides,
204
+ credentialOverrides: resolved.addonConfig?.credentialOverrides,
205
+ },
221
206
  };
222
- // Execute the function using runPikkuFunc with the addon package's state
223
- // We use the parent services (this.services) since addon packages share services
224
- // Pass the function's tags so tag-based middleware/permissions are applied
225
- return runPikkuFunc('rpc', namespacedFunction, funcName, {
226
- auth,
207
+ }
208
+ /**
209
+ * Execution half of an addon RPC call. Must never be called from inside a
210
+ * `try` that catches `RPCNotFoundError`.
211
+ */
212
+ async executeAddonFunction(addonCall, data, wire) {
213
+ if (addonCall.kind === 'remote') {
214
+ return this.invokeRemoteAddonFunction(addonCall.namespace, addonCall.fnName, data, addonCall.addonConfig);
215
+ }
216
+ return runPikkuFunc('rpc', addonCall.namespacedFunction, addonCall.pikkuFuncId, {
217
+ auth: addonCall.auth,
227
218
  singletonServices: this.services,
228
219
  data: () => data,
229
220
  wire,
230
- packageName: resolved.package,
231
- tags,
232
- addonInstance,
221
+ packageName: addonCall.packageName,
222
+ tags: addonCall.tags,
223
+ addonInstance: addonCall.addonInstance,
233
224
  });
234
225
  }
235
- /**
236
- * Dispatch a `wireRemoteAddon` RPC over HTTP to the hosting service.
237
- *
238
- * The consumer sends the addon's own function name (not the namespaced form)
239
- * to the host's `/remote/rpc/:rpcName` endpoint, authenticating as a client
240
- * with the token bound in `wireRemoteAddon({ auth })`. The addon's handlers
241
- * live on the host, so there is no local function meta to resolve.
242
- */
243
- async invokeRemoteAddonFunction(namespace, fnName, data) {
244
- const cfg = pikkuState(null, 'addons', 'packages').get(namespace);
245
- if (!cfg?.remote) {
246
- throw new RPCNotFoundError(`${namespace}:${fnName}`);
247
- }
226
+ async invokeRemoteAddonFunction(namespace, fnName, data, cfg) {
248
227
  const serverUrl = typeof cfg.serverUrl === 'function'
249
228
  ? await cfg.serverUrl(this.services)
250
229
  : cfg.serverUrl;
@@ -270,7 +249,6 @@ export class ContextAwareRPCService {
270
249
  body: JSON.stringify({ rpcName: remoteFn, data }),
271
250
  });
272
251
  if (!res.ok) {
273
- // Best-effort body read to enrich the thrown error (mirrors postRpc).
274
252
  const detail = (await res.text().catch(() => '')).slice(0, 300);
275
253
  throw new RemoteAddonRequestError(namespace, remoteFn, res.status, detail);
276
254
  }
@@ -286,21 +264,15 @@ export class ContextAwareRPCService {
286
264
  ...wire,
287
265
  };
288
266
  if (rpcName.includes(':')) {
289
- return this.invokeAddonFunction(rpcName, data, mergedWire);
267
+ const addonCall = this.resolveAddonFunction(rpcName);
268
+ if (addonCall === NOT_RESOLVED) {
269
+ throw new RPCNotFoundError(rpcName);
270
+ }
271
+ return this.executeAddonFunction(addonCall, data, mergedWire);
290
272
  }
273
+ let resolved;
291
274
  try {
292
- const resolved = resolvePikkuFunction(rpcName, this.packageName);
293
- const addonInstance = resolved.packageName
294
- ? addonInstanceForNamespace(this.wire.addonNamespace, resolved.packageName)
295
- : undefined;
296
- return await runPikkuFunc('rpc', rpcName, resolved.pikkuFuncId, {
297
- auth: this.options.requiresAuth,
298
- singletonServices: this.services,
299
- data: () => data,
300
- wire: mergedWire,
301
- packageName: resolved.packageName,
302
- addonInstance,
303
- });
275
+ resolved = resolvePikkuFunction(rpcName, this.packageName);
304
276
  }
305
277
  catch (e) {
306
278
  if (e instanceof RPCNotFoundError && this.services.deploymentService) {
@@ -311,6 +283,17 @@ export class ContextAwareRPCService {
311
283
  }
312
284
  throw e;
313
285
  }
286
+ const addonInstance = resolved.packageName
287
+ ? addonInstanceForNamespace(this.wire.addonNamespace, resolved.packageName)
288
+ : undefined;
289
+ return await runPikkuFunc('rpc', rpcName, resolved.pikkuFuncId, {
290
+ auth: this.options.requiresAuth,
291
+ singletonServices: this.services,
292
+ data: () => data,
293
+ wire: mergedWire,
294
+ packageName: resolved.packageName,
295
+ addonInstance,
296
+ });
314
297
  }
315
298
  async startWorkflow(workflowName, input, options) {
316
299
  if (!this.services.workflowService) {
@@ -370,6 +353,9 @@ export class ContextAwareRPCService {
370
353
  getCredential: this.wire.getCredential?.bind(this.wire),
371
354
  }, options);
372
355
  },
356
+ interrupt: async (runId, reason) => {
357
+ return interruptAIAgent({ runId, ...(reason ? { reason } : {}) }, { sessionService: this.options.sessionService });
358
+ },
373
359
  approve: async (runId, approvals, expectedAgentName) => {
374
360
  const result = await resumeAIAgentSync(runId, approvals, {
375
361
  sessionService: this.options.sessionService,
@@ -397,9 +383,7 @@ export class ContextAwareRPCService {
397
383
  return this.services.deploymentService.invoke(funcName, data, session, this.wire.traceId);
398
384
  }
399
385
  }
400
- // RPC Service class for the global interface
401
386
  export class PikkuRPCService {
402
- // Convenience function for initializing
403
387
  getContextRPCService(services, wire, requiresAuthOrOptions, depth = 0, packageName = null) {
404
388
  const options = typeof requiresAuthOrOptions === 'object' &&
405
389
  requiresAuthOrOptions !== null
@@ -420,5 +404,4 @@ export class PikkuRPCService {
420
404
  };
421
405
  }
422
406
  }
423
- // Create a singleton instance
424
407
  export const rpcService = new PikkuRPCService();
@@ -1,3 +1,4 @@
1
+ import type { AgentInterruptResult } from '../ai-agent/ai-agent-interrupt.js';
1
2
  export type PikkuRPC<Invoke extends (...args: any[]) => any = (...args: any[]) => any, Remote extends (...args: any[]) => any = (...args: any[]) => any, startWorkflow extends (...args: any[]) => any = (...args: any[]) => any, AgentRun extends (...args: any[]) => any = (...args: any[]) => any, AgentStream extends (...args: any[]) => any = (...args: any[]) => any> = {
2
3
  depth: number;
3
4
  global: boolean;
@@ -16,6 +17,12 @@ export type PikkuRPC<Invoke extends (...args: any[]) => any = (...args: any[]) =
16
17
  toolCallId: string;
17
18
  approved: boolean;
18
19
  }[], expectedAgentName?: string) => Promise<any>;
20
+ /** Stop an in-flight run. Needs no channel — it ends a stream rather than
21
+ * continuing one — so it is reachable over a plain RPC while the stream
22
+ * itself is held open elsewhere. Resolves `stopped: false` when there was
23
+ * nothing left to stop, and names any tools still executing — their side
24
+ * effects have already happened and are not undone by interrupting. */
25
+ interrupt: (runId: string, reason?: 'speech' | 'user' | 'timeout') => Promise<AgentInterruptResult>;
19
26
  };
20
27
  };
21
28
  export type RPCMeta = {
@@ -23,16 +30,10 @@ export type RPCMeta = {
23
30
  expose: boolean;
24
31
  remote?: boolean;
25
32
  };
26
- /**
27
- * Type for RPC handlers
28
- */
29
33
  export interface RPCHandler<Input, Output> {
30
34
  input: Input;
31
35
  output: Output;
32
36
  }
33
- /**
34
- * Resolved function reference from namespace
35
- */
36
37
  export interface ResolvedFunction {
37
38
  package: string;
38
39
  function: string;
@@ -1,3 +1,4 @@
1
+ import type { CorePikkuMiddleware } from '../../types/core.types.js';
1
2
  export type WireAddonConfig = {
2
3
  name: string;
3
4
  package: string;
@@ -5,8 +6,32 @@ export type WireAddonConfig = {
5
6
  auth?: boolean;
6
7
  mcp?: boolean;
7
8
  tags?: string[];
9
+ /** Required of every function in the addon, on top of the function's own. */
10
+ scopes?: string[];
8
11
  secretOverrides?: Record<string, string>;
9
12
  variableOverrides?: Record<string, string>;
10
13
  credentialOverrides?: Record<string, string>;
11
14
  };
12
15
  export declare const wireAddon: (config: WireAddonConfig) => void;
16
+ /**
17
+ * knowledge: decisions/security/addon-scopes-are-resolved-where-the-function-runs.md
18
+ */
19
+ export declare const resolveAddonScopes: (packageName: string | null, namespace?: string) => string[];
20
+ /**
21
+ * knowledge: decisions/security/addon-auth-and-tags-only-tighten.md
22
+ */
23
+ export declare const resolveAddonTags: (packageName: string | null, namespace?: string) => string[];
24
+ /**
25
+ * True when any governing instance requires a session. `auth: false` is not
26
+ * honoured here — on a direct wiring it would weaken the wiring's own gate.
27
+ *
28
+ * knowledge: decisions/security/addon-auth-and-tags-only-tighten.md
29
+ */
30
+ export declare const resolveAddonAuth: (packageName: string | null, namespace?: string) => boolean;
31
+ /**
32
+ * Addon tags name middleware the *consuming app* registered, so they resolve
33
+ * against the root tag groups rather than the addon package's own.
34
+ *
35
+ * knowledge: decisions/security/addon-auth-and-tags-only-tighten.md
36
+ */
37
+ export declare const resolveAddonTagMiddleware: (packageName: string | null, namespace?: string) => CorePikkuMiddleware[];
@@ -1,10 +1,12 @@
1
1
  import { pikkuState } from '../../pikku-state.js';
2
+ import { getTagGroups } from '../../utils.js';
2
3
  export const wireAddon = (config) => {
3
4
  pikkuState(null, 'addons', 'packages').set(config.name, {
4
5
  package: config.package,
5
6
  rpcEndpoint: config.rpcEndpoint,
6
7
  auth: config.auth,
7
8
  tags: config.tags,
9
+ ...(config.scopes ? { scopes: config.scopes } : {}),
8
10
  ...(config.secretOverrides
9
11
  ? { secretOverrides: config.secretOverrides }
10
12
  : {}),
@@ -16,3 +18,63 @@ export const wireAddon = (config) => {
16
18
  : {}),
17
19
  });
18
20
  };
21
+ /**
22
+ * The addon configs a running function is governed by: the named instance when
23
+ * the caller resolved one, every instance of the package otherwise.
24
+ *
25
+ * knowledge: decisions/security/addon-scopes-are-resolved-where-the-function-runs.md
26
+ */
27
+ const governingAddonConfigs = (packageName, namespace) => {
28
+ if (!packageName) {
29
+ return [];
30
+ }
31
+ const addons = pikkuState(null, 'addons', 'packages');
32
+ if (!addons) {
33
+ return [];
34
+ }
35
+ if (namespace) {
36
+ const config = addons.get(namespace);
37
+ if (config?.package === packageName) {
38
+ return [config];
39
+ }
40
+ }
41
+ return [...addons.values()].filter((config) => config?.package === packageName);
42
+ };
43
+ const unionOf = (packageName, namespace, field) => {
44
+ const values = new Set();
45
+ for (const config of governingAddonConfigs(packageName, namespace)) {
46
+ for (const value of config[field] ?? []) {
47
+ values.add(value);
48
+ }
49
+ }
50
+ return [...values];
51
+ };
52
+ /**
53
+ * knowledge: decisions/security/addon-scopes-are-resolved-where-the-function-runs.md
54
+ */
55
+ export const resolveAddonScopes = (packageName, namespace) => unionOf(packageName, namespace, 'scopes');
56
+ /**
57
+ * knowledge: decisions/security/addon-auth-and-tags-only-tighten.md
58
+ */
59
+ export const resolveAddonTags = (packageName, namespace) => unionOf(packageName, namespace, 'tags');
60
+ /**
61
+ * True when any governing instance requires a session. `auth: false` is not
62
+ * honoured here — on a direct wiring it would weaken the wiring's own gate.
63
+ *
64
+ * knowledge: decisions/security/addon-auth-and-tags-only-tighten.md
65
+ */
66
+ export const resolveAddonAuth = (packageName, namespace) => governingAddonConfigs(packageName, namespace).some((config) => config.auth === true);
67
+ /**
68
+ * Addon tags name middleware the *consuming app* registered, so they resolve
69
+ * against the root tag groups rather than the addon package's own.
70
+ *
71
+ * knowledge: decisions/security/addon-auth-and-tags-only-tighten.md
72
+ */
73
+ export const resolveAddonTagMiddleware = (packageName, namespace) => {
74
+ const tags = resolveAddonTags(packageName, namespace);
75
+ if (tags.length === 0) {
76
+ return [];
77
+ }
78
+ const tagGroups = pikkuState(null, 'middleware', 'tagGroup');
79
+ return tags.flatMap((tag) => getTagGroups(tagGroups, tag).flat());
80
+ };
@@ -1,18 +1,5 @@
1
1
  import type { CoreServices, PikkuWire } from '../../types/core.types.js';
2
- /**
3
- * How the consumer supplies the token the hosted addon's auth expects.
4
- *
5
- * This is a CLIENT authenticating to a hosted library — NOT pikku's trusted
6
- * machine-to-machine mesh (which uses `PIKKU_REMOTE_SECRET`). The consumer binds
7
- * the addon's declared auth requirement to a local source:
8
- * - `credentialId` — per-user credential, resolved via `wire.getCredential(id)`
9
- * - `secretId` — platform key, resolved via the secrets service
10
- * - `resolve` — custom escape hatch
11
- * Omit entirely when the addon declares its remote surface is public.
12
- *
13
- * The value is sent `Authorization: Bearer <token>` by default; a non-default
14
- * header is declared once by the addon (its meta), never chosen here.
15
- */
2
+ /** Sent as `Authorization: Bearer <token>`; a non-default header is declared by the addon. */
16
3
  export type RemoteAddonAuth = {
17
4
  credentialId: string;
18
5
  } | {
@@ -23,25 +10,13 @@ export type RemoteAddonAuth = {
23
10
  export type WireRemoteAddonConfig = {
24
11
  /** Consumer-facing namespace, e.g. `registry` → `rpc('registry:getOpenApi')` */
25
12
  name: string;
26
- /**
27
- * The addon package. Installed as a **devDependency** (types only — its
28
- * handlers run on the host); `pikku verify` enforces this.
29
- */
13
+ /** Must be installed as a devDependency — `pikku verify` enforces this. */
30
14
  package: string;
31
- /** Base URL of the host serving the addon's remote surface. */
32
15
  serverUrl: string | ((services: CoreServices) => string | Promise<string>);
33
- /** Bind the addon's declared auth to a local source. Omit if the surface is public. */
16
+ /** Omit when the addon declares its remote surface public. */
34
17
  auth?: RemoteAddonAuth;
35
18
  /** Map a consumer-facing fn name → the remote fn name, when they differ (rare). */
36
19
  remoteName?: (fn: string) => string;
37
20
  tags?: string[];
38
21
  };
39
- /**
40
- * Consume a hosted addon's `remote: true` RPCs transparently over HTTP.
41
- *
42
- * Unlike `wireAddon` (which bundles the addon's functions in-process, a
43
- * production dependency), `wireRemoteAddon` dispatches `rpc('name:fn')` to the
44
- * host at `serverUrl`, fully typed — the addon ships as a devDependency (types
45
- * only). See {@link RemoteAddonAuth} for how auth is bound.
46
- */
47
22
  export declare const wireRemoteAddon: (config: WireRemoteAddonConfig) => void;
@@ -1,12 +1,4 @@
1
1
  import { pikkuState } from '../../pikku-state.js';
2
- /**
3
- * Consume a hosted addon's `remote: true` RPCs transparently over HTTP.
4
- *
5
- * Unlike `wireAddon` (which bundles the addon's functions in-process, a
6
- * production dependency), `wireRemoteAddon` dispatches `rpc('name:fn')` to the
7
- * host at `serverUrl`, fully typed — the addon ships as a devDependency (types
8
- * only). See {@link RemoteAddonAuth} for how auth is bound.
9
- */
10
2
  export const wireRemoteAddon = (config) => {
11
3
  pikkuState(null, 'addons', 'packages').set(config.name, {
12
4
  package: config.package,
@@ -1,6 +1,2 @@
1
1
  import type { Logger } from '../../services/index.js';
2
- /**
3
- * Logs all the loaded scheduled tasks.
4
- * @param logger - A logger for logging information.
5
- */
6
2
  export declare const logSchedulers: (logger: Logger) => void;
@@ -1,8 +1,4 @@
1
1
  import { pikkuState } from '../../pikku-state.js';
2
- /**
3
- * Logs all the loaded scheduled tasks.
4
- * @param logger - A logger for logging information.
5
- */
6
2
  export const logSchedulers = (logger) => {
7
3
  const scheduledTasks = pikkuState(null, 'scheduler', 'tasks');
8
4
  if (scheduledTasks.size === 0) {
@@ -4,7 +4,6 @@ import type { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../.
4
4
  export type RunScheduledTasksParams = {
5
5
  name: string;
6
6
  session?: CoreUserSession;
7
- /** Pre-resolved trace ID */
8
7
  traceId?: string;
9
8
  };
10
9
  export declare const wireScheduler: <PikkuFunctionConfig extends CorePikkuFunctionConfig<CorePikkuFunctionSessionless<void, void>>>(scheduledTask: CoreScheduledTask<PikkuFunctionConfig>) => void;
@@ -51,7 +51,6 @@ export async function runScheduledTask({ name, session, traceId, }) {
51
51
  if (!meta) {
52
52
  throw new ScheduledTaskNotFoundError(`Scheduled task meta not found: ${name}`);
53
53
  }
54
- // Create the scheduled task wire object
55
54
  const wire = {
56
55
  traceId: resolvedTraceId,
57
56
  scheduledTask: {
@@ -1,16 +1,10 @@
1
1
  import type { CoreUserSession, CorePikkuMiddleware, CommonWireMeta } from '../../types/core.types.js';
2
2
  import type { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
3
- /**
4
- * Represents metadata for scheduled tasks, including title, schedule, and documentation.
5
- */
6
3
  export type ScheduledTasksMeta<UserSession extends CoreUserSession = any> = Record<string, CommonWireMeta & {
7
4
  name: string;
8
5
  schedule: string;
9
6
  session?: UserSession;
10
7
  }>;
11
- /**
12
- * Represents a core scheduled task.
13
- */
14
8
  export type CoreScheduledTask<PikkuFunctionConfig = CorePikkuFunctionConfig<CorePikkuFunctionSessionless<void, void>>, PikkuMiddleware = CorePikkuMiddleware<any>> = {
15
9
  name: string;
16
10
  schedule: string;
@@ -18,17 +12,10 @@ export type CoreScheduledTask<PikkuFunctionConfig = CorePikkuFunctionConfig<Core
18
12
  tags?: string[];
19
13
  middleware?: PikkuMiddleware[];
20
14
  };
21
- /**
22
- * Represents a scheduled task wire object for middleware
23
- * Provides information about the current scheduled task execution
24
- */
25
15
  export interface PikkuScheduledTask {
26
- /** The name of the scheduled task being executed */
27
16
  name: string;
28
- /** The cron schedule expression */
29
17
  schedule: string;
30
- /** Current execution timestamp */
31
18
  executionTime: Date;
32
- /** Skip the current task execution */
19
+ /** Never returns throws to abort the run. */
33
20
  skip: (reason?: string) => void;
34
21
  }
@@ -0,0 +1,32 @@
1
+ import type { CoreScopes } from './scope.types.js';
2
+ /**
3
+ * Declares scopes. The body is a no-op that tree-shakes away — the CLI reads
4
+ * the call by AST and generates a `ScopeId` union, so a function referencing an
5
+ * undeclared scope fails the build.
6
+ *
7
+ * Scopes are keyed by segment at every level: a scope is named by its key, and
8
+ * its value describes it. Every node is grantable — the declaration below
9
+ * yields `admin`, `admin:invoices`, `admin:invoices:create`,
10
+ * `admin:invoices:void` and `billing`.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * defineScope({
15
+ * admin: {
16
+ * displayName: 'Administration',
17
+ * description: 'Administrative access',
18
+ * scopes: {
19
+ * invoices: {
20
+ * description: 'Invoice management',
21
+ * scopes: {
22
+ * create: { description: 'Create invoices' },
23
+ * void: { description: 'Void invoices' },
24
+ * },
25
+ * },
26
+ * },
27
+ * },
28
+ * billing: {},
29
+ * })
30
+ * ```
31
+ */
32
+ export declare const defineScope: (_config: CoreScopes) => void;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Declares scopes. The body is a no-op that tree-shakes away — the CLI reads
3
+ * the call by AST and generates a `ScopeId` union, so a function referencing an
4
+ * undeclared scope fails the build.
5
+ *
6
+ * Scopes are keyed by segment at every level: a scope is named by its key, and
7
+ * its value describes it. Every node is grantable — the declaration below
8
+ * yields `admin`, `admin:invoices`, `admin:invoices:create`,
9
+ * `admin:invoices:void` and `billing`.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * defineScope({
14
+ * admin: {
15
+ * displayName: 'Administration',
16
+ * description: 'Administrative access',
17
+ * scopes: {
18
+ * invoices: {
19
+ * description: 'Invoice management',
20
+ * scopes: {
21
+ * create: { description: 'Create invoices' },
22
+ * void: { description: 'Void invoices' },
23
+ * },
24
+ * },
25
+ * },
26
+ * },
27
+ * billing: {},
28
+ * })
29
+ * ```
30
+ */
31
+ export const defineScope = (_config) => { };
@@ -1,3 +1,3 @@
1
- export { wireScope } from './wire-scope.js';
1
+ export { defineScope } from './define-scope.js';
2
2
  export { flattenScopeDefinitions, validateAndBuildScopeDefinitionsMeta, } from './validate-scope-definitions.js';
3
3
  export type { CoreScopes, CoreScopeNode, FlatScope, ScopeDefinitionMeta, ScopeDefinitionsMeta, ScopeDefinitions, ScopeNodeMeta, } from './scope.types.js';