@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,18 +16,6 @@ export const clearChannelMiddlewareCache = () => {
16
16
  delete channelMiddlewareCache[key];
17
17
  }
18
18
  };
19
- /**
20
- * Combine the inherited (tag/named) channel middleware with any per-run
21
- * middleware for a wiring.
22
- *
23
- * Only the statically-resolved inherited middleware is deterministic per `uid`
24
- * and safe to cache. `wireChannelMiddleware` is a per-run set of closures (e.g.
25
- * an AI agent's per-invocation stream middleware holding that run's
26
- * thread/session state) and MUST NOT be cached — caching it lets a later run of
27
- * the same `uid` reuse an earlier run's closures, leaking that run's state (and
28
- * growing memory) across invocations. It is therefore appended fresh on every
29
- * call after the cached inherited slice.
30
- */
31
19
  export const combineChannelMiddleware = (wireType, uid, { wireInheritedChannelMiddleware, wireChannelMiddleware, packageName = null, } = {}) => {
32
20
  const cacheKey = `${wireType}:${uid}`;
33
21
  let inherited = channelMiddlewareCache[cacheKey];
@@ -0,0 +1,31 @@
1
+ import { type ChannelRPCResponse } from './channel-rpc.types.js';
2
+ /**
3
+ * Tracks in-flight reverse RPC calls for one channel. One registry per
4
+ * connection: ids are only unique within a socket, and a dropped socket must
5
+ * reject exactly the calls that were riding on it.
6
+ */
7
+ export declare class ChannelRPCRegistry {
8
+ private readonly timeoutMs;
9
+ private pending;
10
+ private nextId;
11
+ private closed;
12
+ constructor(timeoutMs?: number);
13
+ get inFlight(): number;
14
+ register(): {
15
+ id: string;
16
+ promise: Promise<unknown>;
17
+ };
18
+ /**
19
+ * Stops the clock on a call whose peer is asking a human. The timeout exists
20
+ * to bound a peer that has gone away, and a person reading a prompt is not
21
+ * that; `rejectAll` still fails the call the moment the socket drops.
22
+ *
23
+ * Returns false for an unknown id — a pending frame for a call that already
24
+ * timed out is stale, not an error.
25
+ */
26
+ hold(id: string): boolean;
27
+ /** Returns false for an unknown id, so a late reply is dropped. */
28
+ settle(response: ChannelRPCResponse): boolean;
29
+ /** Without this a caller awaits the full timeout on a connection that is gone. */
30
+ rejectAll(reason?: string): void;
31
+ }
@@ -0,0 +1,89 @@
1
+ import { ChannelRPCError, } from './channel-rpc.types.js';
2
+ /**
3
+ * Tracks in-flight reverse RPC calls for one channel. One registry per
4
+ * connection: ids are only unique within a socket, and a dropped socket must
5
+ * reject exactly the calls that were riding on it.
6
+ */
7
+ export class ChannelRPCRegistry {
8
+ timeoutMs;
9
+ pending = new Map();
10
+ nextId = 0;
11
+ closed = false;
12
+ constructor(timeoutMs = 30_000) {
13
+ this.timeoutMs = timeoutMs;
14
+ }
15
+ get inFlight() {
16
+ return this.pending.size;
17
+ }
18
+ register() {
19
+ if (this.closed) {
20
+ return {
21
+ id: '',
22
+ promise: Promise.reject(new ChannelRPCError('Channel is closed', 'closed')),
23
+ };
24
+ }
25
+ const id = `${++this.nextId}`;
26
+ const promise = new Promise((resolve, reject) => {
27
+ const timer = this.timeoutMs > 0
28
+ ? setTimeout(() => {
29
+ this.pending.delete(id);
30
+ reject(new ChannelRPCError(`Channel RPC ${id} timed out after ${this.timeoutMs}ms`, 'timeout'));
31
+ }, this.timeoutMs)
32
+ : undefined;
33
+ // Never hold the process open waiting on a peer that may not answer.
34
+ timer?.unref?.();
35
+ this.pending.set(id, { resolve, reject, timer });
36
+ });
37
+ return { id, promise };
38
+ }
39
+ /**
40
+ * Stops the clock on a call whose peer is asking a human. The timeout exists
41
+ * to bound a peer that has gone away, and a person reading a prompt is not
42
+ * that; `rejectAll` still fails the call the moment the socket drops.
43
+ *
44
+ * Returns false for an unknown id — a pending frame for a call that already
45
+ * timed out is stale, not an error.
46
+ */
47
+ hold(id) {
48
+ const call = this.pending.get(id);
49
+ if (!call || call.awaitingHuman) {
50
+ return false;
51
+ }
52
+ clearTimeout(call.timer);
53
+ call.timer = undefined;
54
+ call.awaitingHuman = true;
55
+ return true;
56
+ }
57
+ /** Returns false for an unknown id, so a late reply is dropped. */
58
+ settle(response) {
59
+ const call = this.pending.get(response.id);
60
+ if (!call) {
61
+ return false;
62
+ }
63
+ this.pending.delete(response.id);
64
+ clearTimeout(call.timer);
65
+ if (response.ok) {
66
+ call.resolve(response.result);
67
+ }
68
+ else {
69
+ // Peer input: a non-string name or message falls back rather than being
70
+ // attached to an Error, where it would surface as `[object Object]`.
71
+ const { name, message } = response.error ?? {};
72
+ const error = new ChannelRPCError(typeof message === 'string' ? message : 'Remote channel RPC failed', 'remote');
73
+ if (typeof name === 'string' && name.length > 0) {
74
+ error.name = name;
75
+ }
76
+ call.reject(error);
77
+ }
78
+ return true;
79
+ }
80
+ /** Without this a caller awaits the full timeout on a connection that is gone. */
81
+ rejectAll(reason = 'Channel closed') {
82
+ this.closed = true;
83
+ for (const [, call] of this.pending) {
84
+ clearTimeout(call.timer);
85
+ call.reject(new ChannelRPCError(reason, 'closed'));
86
+ }
87
+ this.pending.clear();
88
+ }
89
+ }
@@ -0,0 +1,15 @@
1
+ import { type ApprovalRequester, type Capabilities } from './channel-rpc.types.js';
2
+ /**
3
+ * Answers reverse RPC requests arriving on a channel.
4
+ *
5
+ * `capabilities` is the authorisation boundary, not a convenience: the peer is
6
+ * asking this process to execute code, so only listed names run. An absent
7
+ * name is refused exactly like an unknown one, so the caller cannot probe for
8
+ * what this end can do.
9
+ */
10
+ export declare const createChannelRPCResponder: ({ capabilities, send, approve, }: {
11
+ capabilities: Capabilities;
12
+ send: (data: unknown) => Promise<void> | void;
13
+ /** Omitted means there is nobody to ask, which refuses rather than runs. */
14
+ approve?: ApprovalRequester;
15
+ }) => (message: unknown) => Promise<boolean>;
@@ -0,0 +1,71 @@
1
+ import { CHANNEL_RPC_PENDING, CHANNEL_RPC_RESPONSE, isCapabilityDef, isChannelRPCRequest, resolveCapability, } from './channel-rpc.types.js';
2
+ /**
3
+ * Answers reverse RPC requests arriving on a channel.
4
+ *
5
+ * `capabilities` is the authorisation boundary, not a convenience: the peer is
6
+ * asking this process to execute code, so only listed names run. An absent
7
+ * name is refused exactly like an unknown one, so the caller cannot probe for
8
+ * what this end can do.
9
+ */
10
+ export const createChannelRPCResponder = ({ capabilities, send, approve, }) => {
11
+ return async (message) => {
12
+ if (!isChannelRPCRequest(message)) {
13
+ return false;
14
+ }
15
+ const refuse = (name, why) => ({
16
+ action: CHANNEL_RPC_RESPONSE,
17
+ id: message.id,
18
+ ok: false,
19
+ error: { name, message: why },
20
+ });
21
+ // Own properties only: an object literal inherits from `Object.prototype`,
22
+ // so a peer asking for `toString` would otherwise resolve a real function.
23
+ const entry = Object.prototype.hasOwnProperty.call(capabilities, message.funcName)
24
+ ? capabilities[message.funcName]
25
+ : undefined;
26
+ if (entry === undefined ||
27
+ (typeof entry !== 'function' && !isCapabilityDef(entry))) {
28
+ await send(refuse('RPCNotFoundError', `Capability not exposed: ${message.funcName}`));
29
+ return true;
30
+ }
31
+ const { execute, needsApproval, approvalDescriptionFn } = resolveCapability(entry);
32
+ let response;
33
+ try {
34
+ if (needsApproval) {
35
+ if (!approve) {
36
+ await send(refuse('RPCNotApprovedError', `"${message.funcName}" needs approval and there is nobody to ask`));
37
+ return true;
38
+ }
39
+ // Before the asking, not after: an answer arriving past the caller's
40
+ // timeout is dropped, silently discarding the human's decision.
41
+ const description = await approvalDescriptionFn?.(message.data);
42
+ await send({
43
+ action: CHANNEL_RPC_PENDING,
44
+ id: message.id,
45
+ reason: description ?? `approval for ${message.funcName}`,
46
+ });
47
+ const approved = await approve({
48
+ funcName: message.funcName,
49
+ data: message.data,
50
+ description,
51
+ });
52
+ if (!approved) {
53
+ await send(refuse('RPCDeniedError', `"${message.funcName}" was not approved`));
54
+ return true;
55
+ }
56
+ }
57
+ response = {
58
+ action: CHANNEL_RPC_RESPONSE,
59
+ id: message.id,
60
+ ok: true,
61
+ result: await execute(message.data),
62
+ };
63
+ }
64
+ catch (e) {
65
+ const error = e;
66
+ response = refuse(error?.name ?? 'Error', error?.message ?? String(e));
67
+ }
68
+ await send(response);
69
+ return true;
70
+ };
71
+ };
@@ -0,0 +1,40 @@
1
+ import type { DeploymentService } from '../../services/deployment-service.js';
2
+ import { ChannelRPCRegistry } from './channel-rpc-registry.js';
3
+ import { type ChannelRPCValidator } from './channel-rpc.types.js';
4
+ /**
5
+ * `remote` for channels that only ever flow one way — a server-sent stream, an
6
+ * agent's output, a local CLI. Nothing is listening for a request on them, so
7
+ * the call is refused rather than waiting out a timeout.
8
+ */
9
+ export declare const unsupportedChannelRemote: (funcName: string) => Promise<never>;
10
+ /**
11
+ * A `DeploymentService` whose transport is an open channel rather than an
12
+ * address, so a server-side function can call back into a peer that has no
13
+ * inbound route of its own.
14
+ *
15
+ * It slots into the existing `services.deploymentService` hole, leaving
16
+ * `rpc.remote` resolution, session propagation and traceId plumbing unchanged.
17
+ */
18
+ export declare class ChannelDeploymentService implements DeploymentService {
19
+ private readonly send;
20
+ readonly registry: ChannelRPCRegistry;
21
+ private readonly validateInput?;
22
+ private readonly validateResult?;
23
+ constructor(send: (data: unknown) => Promise<void> | void, options?: {
24
+ timeoutMs?: number;
25
+ validateInput?: ChannelRPCValidator;
26
+ validateResult?: ChannelRPCValidator;
27
+ });
28
+ init(): Promise<void>;
29
+ start(): Promise<void>;
30
+ stop(): Promise<void>;
31
+ /** The channel owner must call this — the service has no read side. */
32
+ handleResponse(message: unknown): boolean;
33
+ /**
34
+ * `session` is accepted to satisfy `DeploymentService` and deliberately not
35
+ * sent: the peer runs the capability as itself, on its own machine, so a
36
+ * session on the wire would carry the caller's credentials while authorising
37
+ * nothing.
38
+ */
39
+ invoke(funcName: string, data: unknown, _session?: unknown, traceId?: string): Promise<unknown>;
40
+ }
@@ -0,0 +1,106 @@
1
+ import { ChannelRPCRegistry } from './channel-rpc-registry.js';
2
+ import { CHANNEL_RPC_REQUEST, CHANNEL_RPC_RESPONSE, ChannelRPCError, isChannelRPCPending, isChannelRPCResponse, } from './channel-rpc.types.js';
3
+ /**
4
+ * `remote` for channels that only ever flow one way — a server-sent stream, an
5
+ * agent's output, a local CLI. Nothing is listening for a request on them, so
6
+ * the call is refused rather than waiting out a timeout.
7
+ */
8
+ export const unsupportedChannelRemote = async (funcName) => {
9
+ throw new ChannelRPCError(`Cannot call "${funcName}" remotely: this channel has no peer that answers`, 'unsupported');
10
+ };
11
+ /**
12
+ * A `DeploymentService` whose transport is an open channel rather than an
13
+ * address, so a server-side function can call back into a peer that has no
14
+ * inbound route of its own.
15
+ *
16
+ * It slots into the existing `services.deploymentService` hole, leaving
17
+ * `rpc.remote` resolution, session propagation and traceId plumbing unchanged.
18
+ */
19
+ export class ChannelDeploymentService {
20
+ send;
21
+ registry;
22
+ validateInput;
23
+ validateResult;
24
+ constructor(send, options = {}) {
25
+ this.send = send;
26
+ this.registry = new ChannelRPCRegistry(options.timeoutMs);
27
+ this.validateInput = options.validateInput;
28
+ this.validateResult = options.validateResult;
29
+ }
30
+ async init() { }
31
+ async start() { }
32
+ async stop() {
33
+ this.registry.rejectAll('Deployment service stopped');
34
+ }
35
+ /** The channel owner must call this — the service has no read side. */
36
+ handleResponse(message) {
37
+ if (isChannelRPCPending(message)) {
38
+ return this.registry.hold(message.id);
39
+ }
40
+ return isChannelRPCResponse(message) ? this.registry.settle(message) : false;
41
+ }
42
+ /**
43
+ * `session` is accepted to satisfy `DeploymentService` and deliberately not
44
+ * sent: the peer runs the capability as itself, on its own machine, so a
45
+ * session on the wire would carry the caller's credentials while authorising
46
+ * nothing.
47
+ */
48
+ async invoke(funcName, data, _session, traceId) {
49
+ // Not a security control — the peer must check what it is handed, and a
50
+ // hostile caller would send arguments that pass. It catches version drift
51
+ // and fails it here rather than inside the peer's process.
52
+ if (this.validateInput) {
53
+ try {
54
+ await this.validateInput(funcName, data);
55
+ }
56
+ catch (e) {
57
+ throw new ChannelRPCError(`Invalid arguments for "${funcName}": ${e?.message ?? String(e)}`, 'invalid');
58
+ }
59
+ }
60
+ const { id, promise } = this.registry.register();
61
+ // A closed registry answers with an already-rejected promise and no id.
62
+ // Returning it before the send keeps that rejection from sitting unobserved.
63
+ if (!id) {
64
+ return promise;
65
+ }
66
+ const request = {
67
+ action: CHANNEL_RPC_REQUEST,
68
+ id,
69
+ funcName,
70
+ data,
71
+ traceId,
72
+ };
73
+ try {
74
+ await this.send(request);
75
+ }
76
+ catch (e) {
77
+ // The call is registered before the request goes out, so a failed send
78
+ // would otherwise leave an entry whose timeout rejects into an unhandled
79
+ // rejection with nobody waiting on it.
80
+ this.registry.settle({
81
+ action: CHANNEL_RPC_RESPONSE,
82
+ id,
83
+ ok: false,
84
+ error: {
85
+ name: e?.name ?? 'Error',
86
+ message: e?.message ?? String(e),
87
+ },
88
+ });
89
+ promise.catch(() => { });
90
+ throw e;
91
+ }
92
+ const result = await promise;
93
+ if (!this.validateResult) {
94
+ return result;
95
+ }
96
+ // The peer answers with whatever it likes, so this is where a value that
97
+ // has been through nothing enters a server-side command.
98
+ try {
99
+ await this.validateResult(funcName, result);
100
+ }
101
+ catch (e) {
102
+ throw new ChannelRPCError(`Invalid result from "${funcName}": ${e?.message ?? String(e)}`, 'invalid');
103
+ }
104
+ return result;
105
+ }
106
+ }
@@ -0,0 +1,14 @@
1
+ import type { CoreSingletonServices } from '../../types/core.types.js';
2
+ import type { ChannelRPCValidator } from './channel-rpc.types.js';
3
+ /**
4
+ * Checks a capability's answer against the schema codegen generated from its
5
+ * declared return type — the same one an agent tool or an HTTP response is
6
+ * checked against.
7
+ */
8
+ export declare const createChannelRPCResultValidator: (singletonServices: Pick<CoreSingletonServices, "logger" | "schema">, packageName?: string | null) => ChannelRPCValidator;
9
+ /**
10
+ * Checks outbound arguments against the declared input type. Unlike the result
11
+ * check this is not a boundary — it catches version drift, where a server built
12
+ * against a newer capability signature calls a client that predates it.
13
+ */
14
+ export declare const createChannelRPCInputValidator: (singletonServices: Pick<CoreSingletonServices, "logger" | "schema">, packageName?: string | null) => ChannelRPCValidator;
@@ -0,0 +1,30 @@
1
+ import { pikkuState } from '../../pikku-state.js';
2
+ import { validateSchema } from '../../schema.js';
3
+ /**
4
+ * A name with no function metadata is left alone: it is a capability this app
5
+ * never declared a contract for, and failing it would break callers that
6
+ * deliberately treat the value as opaque.
7
+ */
8
+ const createChannelRPCSchemaValidator = (key, singletonServices, packageName = null) => async (funcName, value) => {
9
+ const pikkuFuncId = pikkuState(packageName, 'rpc', 'meta')[funcName];
10
+ if (!pikkuFuncId) {
11
+ return;
12
+ }
13
+ const schemaName = pikkuState(packageName, 'function', 'meta')[pikkuFuncId]?.[key];
14
+ if (!schemaName) {
15
+ return;
16
+ }
17
+ await validateSchema(singletonServices.logger, singletonServices.schema, schemaName, value, packageName);
18
+ };
19
+ /**
20
+ * Checks a capability's answer against the schema codegen generated from its
21
+ * declared return type — the same one an agent tool or an HTTP response is
22
+ * checked against.
23
+ */
24
+ export const createChannelRPCResultValidator = (singletonServices, packageName = null) => createChannelRPCSchemaValidator('outputSchemaName', singletonServices, packageName);
25
+ /**
26
+ * Checks outbound arguments against the declared input type. Unlike the result
27
+ * check this is not a boundary — it catches version drift, where a server built
28
+ * against a newer capability signature calls a client that predates it.
29
+ */
30
+ export const createChannelRPCInputValidator = (singletonServices, packageName = null) => createChannelRPCSchemaValidator('inputSchemaName', singletonServices, packageName);
@@ -0,0 +1,5 @@
1
+ export * from './channel-rpc.types.js';
2
+ export * from './channel-rpc-registry.js';
3
+ export * from './channel-rpc-service.js';
4
+ export * from './channel-rpc-responder.js';
5
+ export * from './channel-rpc-validators.js';
@@ -0,0 +1,5 @@
1
+ export * from './channel-rpc.types.js';
2
+ export * from './channel-rpc-registry.js';
3
+ export * from './channel-rpc-service.js';
4
+ export * from './channel-rpc-responder.js';
5
+ export * from './channel-rpc-validators.js';
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Envelope actions for request/response RPC carried over an already-open
3
+ * channel. Both directions share one socket, so every frame is tagged and
4
+ * correlated by `id`.
5
+ */
6
+ export declare const CHANNEL_RPC_REQUEST = "pikku-rpc-request";
7
+ export declare const CHANNEL_RPC_RESPONSE = "pikku-rpc-response";
8
+ export declare const CHANNEL_RPC_PENDING = "pikku-rpc-pending";
9
+ export interface ChannelRPCRequest {
10
+ action: typeof CHANNEL_RPC_REQUEST;
11
+ id: string;
12
+ funcName: string;
13
+ data: unknown;
14
+ traceId?: string;
15
+ }
16
+ export interface ChannelRPCResponse {
17
+ action: typeof CHANNEL_RPC_RESPONSE;
18
+ id: string;
19
+ ok: boolean;
20
+ result?: unknown;
21
+ error?: {
22
+ name: string;
23
+ message: string;
24
+ };
25
+ }
26
+ /**
27
+ * "Still working on it — a human is being asked." Stops the caller's timeout,
28
+ * which otherwise fails any approval slower than it and then discards the
29
+ * answer when it arrives. Grants nothing: a peer that sends it dishonestly can
30
+ * only keep its own call waiting.
31
+ */
32
+ export interface ChannelRPCPending {
33
+ action: typeof CHANNEL_RPC_PENDING;
34
+ id: string;
35
+ reason?: string;
36
+ }
37
+ /**
38
+ * The guards check the whole envelope, not just the action tag: `id` is peer
39
+ * input and is used as a map key, so a frame carrying one of the wrong type
40
+ * must not reach `settle`.
41
+ */
42
+ export declare const isChannelRPCRequest: (message: unknown) => message is ChannelRPCRequest;
43
+ export declare const isChannelRPCResponse: (message: unknown) => message is ChannelRPCResponse;
44
+ export declare const isChannelRPCPending: (message: unknown) => message is ChannelRPCPending;
45
+ /** `reason` exists so a dropped socket cannot look like a resolved call. */
46
+ export declare class ChannelRPCError extends Error {
47
+ readonly reason: 'timeout' | 'closed' | 'remote' | 'invalid' | 'unsupported';
48
+ constructor(message: string, reason: 'timeout' | 'closed' | 'remote' | 'invalid' | 'unsupported');
49
+ }
50
+ /**
51
+ * Whether a callable exposed to a remote decider needs a human to agree before
52
+ * it runs, and how to describe the invocation while asking.
53
+ *
54
+ * Shared with `AIAgentToolDef`: both are an allowlist of named callables
55
+ * invoked by something other than the code that wrote them. The runtime around
56
+ * them is not shared — an agent suspends and resumes, a reverse call is a live
57
+ * await.
58
+ */
59
+ export interface ApprovalPolicy {
60
+ needsApproval: boolean;
61
+ approvalDescriptionFn?: (input: unknown) => Promise<string> | string;
62
+ }
63
+ export type CapabilityHandler = (data: any) => Promise<unknown> | unknown;
64
+ /**
65
+ * `needsApproval` is required here on purpose. On `AIAgentToolDef` the same
66
+ * field is optional and absence means "do not ask"; here absence means the
67
+ * opposite, so it must not be expressible — a bare function is the
68
+ * unclassified form.
69
+ */
70
+ export interface CapabilityDef extends ApprovalPolicy {
71
+ execute: CapabilityHandler;
72
+ }
73
+ export type Capability = CapabilityHandler | CapabilityDef;
74
+ export type Capabilities = Record<string, Capability>;
75
+ export declare const isCapabilityDef: (capability: Capability) => capability is CapabilityDef;
76
+ /**
77
+ * A bare function is unclassified, which resolves to needing approval:
78
+ * forgetting the annotation costs a prompt rather than costing a key.
79
+ */
80
+ export declare const resolveCapability: (capability: Capability) => {
81
+ execute: CapabilityHandler;
82
+ } & ApprovalPolicy;
83
+ /** Returning false refuses the call, and the peer is told so. */
84
+ export type ApprovalRequester = (request: {
85
+ funcName: string;
86
+ data: unknown;
87
+ description?: string;
88
+ }) => Promise<boolean> | boolean;
89
+ /** Checks one end of a call — arguments going out, or the answer coming back. */
90
+ export type ChannelRPCValidator = (funcName: string, value: unknown) => Promise<void> | void;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Envelope actions for request/response RPC carried over an already-open
3
+ * channel. Both directions share one socket, so every frame is tagged and
4
+ * correlated by `id`.
5
+ */
6
+ export const CHANNEL_RPC_REQUEST = 'pikku-rpc-request';
7
+ export const CHANNEL_RPC_RESPONSE = 'pikku-rpc-response';
8
+ export const CHANNEL_RPC_PENDING = 'pikku-rpc-pending';
9
+ const isRecord = (message) => typeof message === 'object' && message !== null;
10
+ /**
11
+ * The guards check the whole envelope, not just the action tag: `id` is peer
12
+ * input and is used as a map key, so a frame carrying one of the wrong type
13
+ * must not reach `settle`.
14
+ */
15
+ export const isChannelRPCRequest = (message) => isRecord(message) &&
16
+ message.action === CHANNEL_RPC_REQUEST &&
17
+ typeof message.id === 'string' &&
18
+ message.id.length > 0 &&
19
+ typeof message.funcName === 'string' &&
20
+ message.funcName.length > 0 &&
21
+ (message.traceId === undefined || typeof message.traceId === 'string');
22
+ export const isChannelRPCResponse = (message) => isRecord(message) &&
23
+ message.action === CHANNEL_RPC_RESPONSE &&
24
+ typeof message.id === 'string' &&
25
+ message.id.length > 0 &&
26
+ typeof message.ok === 'boolean';
27
+ export const isChannelRPCPending = (message) => isRecord(message) &&
28
+ message.action === CHANNEL_RPC_PENDING &&
29
+ typeof message.id === 'string' &&
30
+ message.id.length > 0 &&
31
+ (message.reason === undefined || typeof message.reason === 'string');
32
+ /** `reason` exists so a dropped socket cannot look like a resolved call. */
33
+ export class ChannelRPCError extends Error {
34
+ reason;
35
+ constructor(message, reason) {
36
+ super(message);
37
+ this.reason = reason;
38
+ this.name = 'ChannelRPCError';
39
+ }
40
+ }
41
+ export const isCapabilityDef = (capability) => typeof capability === 'object' &&
42
+ capability !== null &&
43
+ typeof capability.execute === 'function';
44
+ /**
45
+ * A bare function is unclassified, which resolves to needing approval:
46
+ * forgetting the annotation costs a prompt rather than costing a key.
47
+ */
48
+ export const resolveCapability = (capability) => isCapabilityDef(capability)
49
+ ? capability
50
+ : { execute: capability, needsApproval: true };
@@ -2,10 +2,6 @@ import type { CorePikkuPermission } from '../../function/functions.types.js';
2
2
  import type { SessionService } from '../../services/user-session-service.js';
3
3
  import type { CorePikkuMiddleware } from '../../types/core.types.js';
4
4
  import type { ChannelMeta, CoreChannel, RunChannelOptions, RunChannelParams } from './channel.types.js';
5
- /**
6
- * Adds a channel and registers all functions referenced in it using the
7
- * function names already stored in the channel metadata
8
- */
9
5
  export declare const wireChannel: <In, Channel extends string, PikkuPermission extends CorePikkuPermission<In>, PikkuMiddleware extends CorePikkuMiddleware, ChannelFunction>(channel: CoreChannel<In, Channel, PikkuPermission, PikkuMiddleware, ChannelFunction>) => void;
10
6
  export declare const openChannel: ({ route, coerceDataFromSchema, request, }: Pick<CoreChannel<unknown, string>, "route"> & RunChannelParams<unknown> & {
11
7
  userSession: SessionService<any>;
@@ -3,53 +3,39 @@ import { addFunction } from '../../function/function-runner.js';
3
3
  import { pikkuState, getSingletonServices } from '../../pikku-state.js';
4
4
  import { coerceTopLevelDataFromSchema, validateSchema } from '../../schema.js';
5
5
  import { httpRouter } from '../http/routers/http-router.js';
6
- /**
7
- * Adds a channel and registers all functions referenced in it using the
8
- * function names already stored in the channel metadata
9
- */
10
6
  export const wireChannel = (channel) => {
11
- // Get the channel metadata
12
7
  const channelsMeta = pikkuState(null, 'channel', 'meta');
13
8
  const channelMeta = channelsMeta[channel.name];
14
9
  if (!channelMeta) {
15
10
  console.warn(`[pikku] Skipping channel '${channel.name}' — metadata not found. Consider moving this wiring to its own file.`);
16
11
  return;
17
12
  }
18
- // Register onConnect function if provided
19
13
  if (channel.onConnect && channelMeta.connect) {
20
14
  addFunction(channelMeta.connect.pikkuFuncId, channel.onConnect);
21
15
  }
22
- // Register onDisconnect function if provided
23
16
  if (channel.onDisconnect && channelMeta.disconnect) {
24
17
  addFunction(channelMeta.disconnect.pikkuFuncId, channel.onDisconnect);
25
18
  }
26
- // Register onMessage function if provided
27
19
  if (channel.onMessage && channelMeta.message?.pikkuFuncId) {
28
20
  addFunction(channelMeta.message.pikkuFuncId, channel.onMessage.func instanceof Function
29
21
  ? channel.onMessage
30
22
  : channel.onMessage.func);
31
23
  }
32
- // Register functions in onMessageWiring
33
24
  if (channel.onMessageWiring && channelMeta.messageWirings) {
34
- // Iterate through each channel in onMessageWiring
35
25
  Object.entries(channel.onMessageWiring).forEach(([channelKey, wirings]) => {
36
26
  const channelWirings = channelMeta.messageWirings[channelKey];
37
27
  if (!channelWirings)
38
28
  return;
39
- // Iterate through each wiring in the channel
40
29
  Object.entries(wirings).forEach(([wiringKey, handler]) => {
41
30
  const wiringMeta = channelWirings[wiringKey];
42
31
  if (!wiringMeta)
43
32
  return;
44
- // Register the function using the pikku name from metadata
45
- // It could be a FuncConfig or a wiring override with a funcConfig
46
33
  addFunction(wiringMeta.pikkuFuncId, handler.func instanceof Function
47
34
  ? handler
48
35
  : handler.func);
49
36
  });
50
37
  });
51
38
  }
52
- // Store the channel configuration
53
39
  pikkuState(null, 'channel', 'channels').set(channel.name, channel);
54
40
  };
55
41
  const getMatchingChannelConfig = (path) => {
@@ -13,16 +13,6 @@ export declare abstract class ChannelStore<ChannelType = unknown, OpeningData =
13
13
  }> | (TypedChannel & {
14
14
  pikkuUserId?: string;
15
15
  });
16
- /**
17
- * Persist per-socket scratch state scoped to a single channel (keyed by
18
- * channelId). This is intentionally separate from `SessionStore` (which is
19
- * keyed by `pikkuUserId` and holds the user session — shared across HTTP
20
- * and channel transports).
21
- *
22
- * Use this for ephemeral, channel-local data: a per-socket subscription
23
- * filter, a step in a connection-bound state machine, the last command sent
24
- * on this socket, etc. It is cleared when the channel is removed.
25
- */
26
16
  abstract setState(channelId: string, state: unknown): Promise<void> | void;
27
17
  abstract getState(channelId: string): Promise<unknown | undefined> | unknown | undefined;
28
18
  abstract clearState(channelId: string): Promise<void> | void;