@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
@@ -69,7 +69,12 @@ export type CoreChannel<ChannelData, Channel extends string, ChannelConnect = Co
69
69
  onBinaryMessage?: (services: any, data: BinaryData, channel: PikkuChannel<ChannelData, any>) => Promise<BinaryData | void> | BinaryData | void;
70
70
  tags?: string[];
71
71
  };
72
- export interface PikkuChannel<OpeningData, out Out> {
72
+ /**
73
+ * The shape of `channel.remote` before generated types narrow it to the app's
74
+ * own functions. Loose on purpose: core cannot know the names.
75
+ */
76
+ export type ChannelRemote = (funcName: string, data?: any) => Promise<any>;
77
+ export interface PikkuChannel<OpeningData, out Out, Remote extends (...args: any[]) => any = ChannelRemote> {
73
78
  channelId: string;
74
79
  openingData: OpeningData;
75
80
  send(data: Out, isBinary?: boolean): Promise<void> | void;
@@ -79,6 +84,12 @@ export interface PikkuChannel<OpeningData, out Out> {
79
84
  setState<T>(state: T): Promise<void> | void;
80
85
  getState<T>(): Promise<T | undefined> | T | undefined;
81
86
  clearState(): Promise<void> | void;
87
+ /**
88
+ * Calls a function on the peer at the other end of this connection and waits
89
+ * for its answer — the only way to reach a peer with no address of its own.
90
+ * The peer decides what it answers to; an unregistered name is refused.
91
+ */
92
+ remote: Remote;
82
93
  }
83
94
  export interface PikkuChannelHandler<OpeningData = unknown, Out = unknown> {
84
95
  send(message: Out, isBinary?: boolean): Promise<void> | void;
@@ -1,21 +1 @@
1
- /**
2
- * Type-safe helper for defining channel message routes that can be composed.
3
- * Returns the routes record as-is (identity function) for use with `wireChannel`.
4
- *
5
- * @example
6
- * ```typescript
7
- * export const chatRoutes = defineChannelRoutes({
8
- * greet: pikkuChannelFunc({ func: greetFunc }),
9
- * farewell: pikkuChannelFunc({ func: farewellFunc }),
10
- * })
11
- *
12
- * wireChannel({
13
- * name: 'chat',
14
- * route: '/ws/chat',
15
- * onMessageWiring: {
16
- * command: chatRoutes,
17
- * }
18
- * })
19
- * ```
20
- */
21
1
  export declare function defineChannelRoutes<T extends Record<string, any>>(routes: T): T;
@@ -1,23 +1,3 @@
1
- /**
2
- * Type-safe helper for defining channel message routes that can be composed.
3
- * Returns the routes record as-is (identity function) for use with `wireChannel`.
4
- *
5
- * @example
6
- * ```typescript
7
- * export const chatRoutes = defineChannelRoutes({
8
- * greet: pikkuChannelFunc({ func: greetFunc }),
9
- * farewell: pikkuChannelFunc({ func: farewellFunc }),
10
- * })
11
- *
12
- * wireChannel({
13
- * name: 'chat',
14
- * route: '/ws/chat',
15
- * onMessageWiring: {
16
- * command: chatRoutes,
17
- * }
18
- * })
19
- * ```
20
- */
21
1
  export function defineChannelRoutes(routes) {
22
2
  return routes;
23
3
  }
@@ -1,23 +1,5 @@
1
- /**
2
- * Interface defining the methods of a EventHub Service.
3
- */
4
1
  export interface EventHubService<Topics extends Record<string, any>> {
5
- /**
6
- * Subscribes a connection to a specific topic.
7
- * @param topic - The topic to subscribe to.
8
- * @param channelId - The unique ID of the connection to subscribe.
9
- */
10
2
  subscribe<T extends keyof Topics>(topic: T, channelId: string): Promise<void> | void;
11
- /**
12
- * Unsubscribes a connection from a specific topic.
13
- * @param topic - The topic to unsubscribe from.
14
- * @param channelId - The unique ID of the connection to unsubscribe.
15
- */
16
3
  unsubscribe<T extends keyof Topics>(topic: T, channelId: string): Promise<void> | void;
17
- /**
18
- * Sends data to all connections subscribed to a topic.
19
- * @param topic - The topic to send data to.
20
- * @param data - The data to send to the subscribers.
21
- */
22
4
  publish<T extends keyof Topics>(topic: T, channelId: string | null, data: Topics[T], isBinary?: boolean): Promise<void> | void;
23
5
  }
@@ -6,5 +6,8 @@ export type { EventHubService } from './eventhub-service.js';
6
6
  export { ChannelStore } from './channel-store.js';
7
7
  export type { Channel } from './channel-store.js';
8
8
  export { EventHubStore } from './eventhub-store.js';
9
- export type { BinaryData, ChannelsMeta, CoreChannel, CorePikkuChannelMiddleware, CorePikkuChannelMiddlewareFactory, ChannelMessageMeta, ChannelMeta, PikkuChannel, PikkuChannelHandlerFactory, } from './channel.types.js';
9
+ export type { BinaryData, ChannelsMeta, CoreChannel, CorePikkuChannelMiddleware, CorePikkuChannelMiddlewareFactory, ChannelMessageMeta, ChannelMeta, ChannelRemote, PikkuChannel, PikkuChannelHandlerFactory, } from './channel.types.js';
10
10
  export { defineChannelRoutes } from './define-channel-routes.js';
11
+ export { CHANNEL_RPC_PENDING, CHANNEL_RPC_REQUEST, CHANNEL_RPC_RESPONSE, ChannelDeploymentService, ChannelRPCError, ChannelRPCRegistry, createChannelRPCResponder, createChannelRPCInputValidator, createChannelRPCResultValidator, isChannelRPCPending, isChannelRPCRequest, isChannelRPCResponse, resolveCapability, unsupportedChannelRemote, } from './channel-rpc.js';
12
+ export type { ApprovalPolicy, ApprovalRequester, Capabilities, Capability, CapabilityDef, CapabilityHandler, ChannelRPCPending, ChannelRPCRequest, ChannelRPCResponse, ChannelRPCValidator, } from './channel-rpc.js';
13
+ export { channelRemote, getChannelHostRPC, handleChannelRPCResponse, releaseChannelHostRPC, } from './channel-host-rpc.js';
@@ -5,3 +5,5 @@ export { PikkuAbstractChannelHandler } from './pikku-abstract-channel-handler.js
5
5
  export { ChannelStore } from './channel-store.js';
6
6
  export { EventHubStore } from './eventhub-store.js';
7
7
  export { defineChannelRoutes } from './define-channel-routes.js';
8
+ export { CHANNEL_RPC_PENDING, CHANNEL_RPC_REQUEST, CHANNEL_RPC_RESPONSE, ChannelDeploymentService, ChannelRPCError, ChannelRPCRegistry, createChannelRPCResponder, createChannelRPCInputValidator, createChannelRPCResultValidator, isChannelRPCPending, isChannelRPCRequest, isChannelRPCResponse, resolveCapability, unsupportedChannelRemote, } from './channel-rpc.js';
9
+ export { channelRemote, getChannelHostRPC, handleChannelRPCResponse, releaseChannelHostRPC, } from './channel-host-rpc.js';
@@ -16,7 +16,7 @@ const runUpgradeMiddleware = async (singletonServices, request, response, userSe
16
16
  const wireInheritedMiddleware = httpGroups['*']
17
17
  ? [{ type: 'http', route: '*' }]
18
18
  : undefined;
19
- const middleware = combineMiddleware('channel', `upgrade:${request.path()}`, {
19
+ const middleware = combineMiddleware('channel', 'upgrade', {
20
20
  wireInheritedMiddleware,
21
21
  });
22
22
  if (middleware.length > 0) {
@@ -88,6 +88,7 @@ export const runLocalChannel = async ({ channelId, request, response, route, ski
88
88
  channel,
89
89
  data: openingData,
90
90
  channelMiddlewareMeta: meta.channelMiddleware,
91
+ userSession,
91
92
  });
92
93
  if (result !== undefined) {
93
94
  await channel.send(result);
@@ -115,6 +116,7 @@ export const runLocalChannel = async ({ channelId, request, response, route, ski
115
116
  services,
116
117
  channel,
117
118
  channelMiddlewareMeta: meta.channelMiddleware,
119
+ userSession,
118
120
  });
119
121
  }
120
122
  catch (e) {
@@ -1,44 +1,11 @@
1
1
  import type { PikkuChannelHandler } from '../channel.types.js';
2
2
  import type { EventHubService } from '../eventhub-service.js';
3
- /**
4
- * Implementation of the SubscriptionService interface.
5
- * Manages subscriptions and publishes messages to subscribers.
6
- */
7
3
  export declare class LocalEventHubService<Data extends Record<string, any> = {}> implements EventHubService<Data> {
8
4
  private channels;
9
- /**
10
- * A map storing topics and their associated connection IDs.
11
- */
12
5
  private subscriptions;
13
- /**
14
- * Subscribes a connection to a specific topic.
15
- * Creates the topic if it does not already exist.
16
- * @param topic - The topic to subscribe to.
17
- * @param channelId - The unique ID of the connection to subscribe.
18
- */
19
6
  subscribe<T extends keyof Data>(topic: T, channelId: string): void | Promise<void>;
20
- /**
21
- * Unsubscribes a connection from a specific topic.
22
- * Removes the topic if it has no more subscribers.
23
- * @param topic - The topic to unsubscribe from.
24
- * @param channelId - The unique ID of the connection to unsubscribe.
25
- */
26
7
  unsubscribe<T extends keyof Data>(topic: T, channelId: string): void | Promise<void>;
27
- /**
28
- * Sends data to all connections subscribed to a topic.
29
- * @param topic - The topic to send data to.
30
- * @param data - The data to send to the subscribers.
31
- */
32
8
  publish<T extends keyof Data>(topic: T, channelId: string | null, data: Data[T], isBinary?: boolean): void | Promise<void>;
33
- /**
34
- * Registers a channel on open
35
- */
36
9
  onChannelOpened(channelHandler: PikkuChannelHandler): void;
37
- /**
38
- * Handles cleanup when a channel is closed.
39
- * Removes the channel from all topics it is subscribed to.
40
- * Deletes the topic if no more channels are subscribed to it.
41
- * @param channelId - The ID of the channel that was closed.
42
- */
43
10
  onChannelClosed(channelId: string): void;
44
11
  }
@@ -1,31 +1,12 @@
1
- /**
2
- * Implementation of the SubscriptionService interface.
3
- * Manages subscriptions and publishes messages to subscribers.
4
- */
5
1
  export class LocalEventHubService {
6
2
  channels = new Map();
7
- /**
8
- * A map storing topics and their associated connection IDs.
9
- */
10
3
  subscriptions = new Map();
11
- /**
12
- * Subscribes a connection to a specific topic.
13
- * Creates the topic if it does not already exist.
14
- * @param topic - The topic to subscribe to.
15
- * @param channelId - The unique ID of the connection to subscribe.
16
- */
17
4
  subscribe(topic, channelId) {
18
5
  if (!this.subscriptions.has(topic)) {
19
6
  this.subscriptions.set(topic, new Set());
20
7
  }
21
8
  this.subscriptions.get(topic).add(channelId);
22
9
  }
23
- /**
24
- * Unsubscribes a connection from a specific topic.
25
- * Removes the topic if it has no more subscribers.
26
- * @param topic - The topic to unsubscribe from.
27
- * @param channelId - The unique ID of the connection to unsubscribe.
28
- */
29
10
  unsubscribe(topic, channelId) {
30
11
  const topicSubscriptions = this.subscriptions.get(topic);
31
12
  if (topicSubscriptions) {
@@ -35,11 +16,6 @@ export class LocalEventHubService {
35
16
  }
36
17
  }
37
18
  }
38
- /**
39
- * Sends data to all connections subscribed to a topic.
40
- * @param topic - The topic to send data to.
41
- * @param data - The data to send to the subscribers.
42
- */
43
19
  publish(topic, channelId, data, isBinary) {
44
20
  const subscribedChannelIds = this.subscriptions.get(topic);
45
21
  if (!subscribedChannelIds) {
@@ -47,36 +23,26 @@ export class LocalEventHubService {
47
23
  }
48
24
  for (const toChannelId of subscribedChannelIds) {
49
25
  if (channelId === toChannelId)
50
- continue; // Skip sending to the sender
26
+ continue;
51
27
  const channel = this.channels.get(toChannelId);
52
28
  if (channel) {
53
29
  try {
54
30
  channel.send(data, isBinary);
55
31
  }
56
32
  catch {
57
- // Channel closed (e.g. SSE ReadableStream controller already closed on browser disconnect) — clean up
58
33
  this.onChannelClosed(toChannelId);
59
34
  }
60
35
  }
61
36
  }
62
37
  }
63
- /**
64
- * Registers a channel on open
65
- */
66
38
  onChannelOpened(channelHandler) {
67
39
  this.channels.set(channelHandler.getChannel().channelId, channelHandler);
68
40
  }
69
- /**
70
- * Handles cleanup when a channel is closed.
71
- * Removes the channel from all topics it is subscribed to.
72
- * Deletes the topic if no more channels are subscribed to it.
73
- * @param channelId - The ID of the channel that was closed.
74
- */
75
41
  onChannelClosed(channelId) {
76
42
  for (const [topic, channelIds] of this.subscriptions.entries()) {
77
43
  channelIds.delete(channelId);
78
44
  if (channelIds.size === 0) {
79
- this.subscriptions.delete(topic); // Cleanup empty topics
45
+ this.subscriptions.delete(topic);
80
46
  }
81
47
  }
82
48
  this.channels.delete(channelId);
@@ -1,6 +1,2 @@
1
1
  import type { Logger } from '../../services/index.js';
2
- /**
3
- * Logs all the loaded channels.
4
- * @param logger - A logger for logging information.
5
- */
6
2
  export declare const logChannels: (logger: Logger) => void;
@@ -1,8 +1,4 @@
1
1
  import { pikkuState } from '../../pikku-state.js';
2
- /**
3
- * Logs all the loaded channels.
4
- * @param logger - A logger for logging information.
5
- */
6
2
  export const logChannels = (logger) => {
7
3
  const channels = pikkuState(null, 'channel', 'channels');
8
4
  if (channels.size === 0) {
@@ -1,3 +1,4 @@
1
+ import { channelRemote, releaseChannelHostRPC } from './channel-host-rpc.js';
1
2
  export class PikkuAbstractChannelHandler {
2
3
  channelId;
3
4
  channelName;
@@ -25,6 +26,7 @@ export class PikkuAbstractChannelHandler {
25
26
  clearState: () => {
26
27
  channelState = undefined;
27
28
  },
29
+ remote: (funcName, data) => channelRemote(this.getChannel(), funcName, data),
28
30
  };
29
31
  }
30
32
  return this.channel;
@@ -34,5 +36,9 @@ export class PikkuAbstractChannelHandler {
34
36
  }
35
37
  close() {
36
38
  this.getChannel().state = 'closed';
39
+ // Fails anything the departing peer still owed an answer to. Not awaited:
40
+ // `close` is on every runtime's synchronous path, and nothing here can fail
41
+ // in a way a closing channel could act on.
42
+ void releaseChannelHostRPC(this.channelId);
37
43
  }
38
44
  }
@@ -78,9 +78,9 @@ export const runChannelConnect = async ({ channelId, channelObject, request, res
78
78
  channel,
79
79
  data: openingData,
80
80
  channelMiddlewareMeta: meta.channelMiddleware,
81
+ userSession,
81
82
  });
82
83
  }
83
- // Store the pikkuUserId mapping after auth middleware has run
84
84
  const pikkuUserId = userSession.getPikkuUserId();
85
85
  if (pikkuUserId) {
86
86
  await channelStore.setPikkuUserId(channelId, pikkuUserId);
@@ -100,10 +100,6 @@ export const runChannelDisconnect = async ({ channelId, channelStore, channelHan
100
100
  const singletonServices = getSingletonServices();
101
101
  const createWireServices = getCreateWireServices();
102
102
  let wireServices;
103
- // Try to get channel from store. In serverless environments (especially with
104
- // serverless-offline or worker threads), disconnect can be called multiple times
105
- // or after the channel has already been cleaned up. If channel doesn't exist,
106
- // there's nothing to disconnect, so we can return early.
107
103
  let channelData;
108
104
  try {
109
105
  channelData = await channelStore.getChannel(channelId);
@@ -151,6 +147,7 @@ export const runChannelDisconnect = async ({ channelId, channelStore, channelHan
151
147
  services,
152
148
  channel,
153
149
  channelMiddlewareMeta: meta.channelMiddleware,
150
+ userSession,
154
151
  });
155
152
  }
156
153
  catch (e) {
@@ -0,0 +1,41 @@
1
+ import type { ApprovalRequester } from '../../channel/channel-rpc.js';
2
+ /**
3
+ * - `prompt` — ask about anything not classified `needsApproval: false`.
4
+ * - `auto` — run the classified-safe set, refuse the rest without asking.
5
+ * - `dangerous`— run everything.
6
+ */
7
+ export type ApprovalMode = 'prompt' | 'auto' | 'dangerous';
8
+ export declare const APPROVAL_FLAGS: {
9
+ readonly auto: "--auto-approve";
10
+ readonly dangerous: "--dangerously-auto-approve";
11
+ };
12
+ /**
13
+ * Stripped from argv, not just read: the server owns the command tree and has
14
+ * never heard of these, and a flag the server can see is one it could act on.
15
+ */
16
+ export declare const takeApprovalFlags: (args: string[], env?: Record<string, string | undefined>) => {
17
+ mode: ApprovalMode;
18
+ args: string[];
19
+ };
20
+ /**
21
+ * `a` is scoped to the one capability and to this run: widening it to every
22
+ * capability would quietly turn an interactive run into
23
+ * `--dangerously-auto-approve`, and persisting it would outlive anyone's memory
24
+ * of agreeing.
25
+ */
26
+ export declare const createTerminalApprover: ({ input, output, signal, }?: {
27
+ input?: NodeJS.ReadStream;
28
+ output?: NodeJS.WritableStream;
29
+ /** Aborted when the run ends, so a prompt nobody can answer stops waiting. */
30
+ signal?: AbortSignal;
31
+ }) => ApprovalRequester;
32
+ /**
33
+ * Undefined reads as "nobody to ask", which refuses rather than runs. That is
34
+ * what a non-interactive run gets: CI is exactly where an unattended push would
35
+ * otherwise happen.
36
+ */
37
+ export declare const approverForMode: (mode: ApprovalMode, { isTTY, warn, signal, }?: {
38
+ isTTY?: boolean;
39
+ warn?: (message: string) => void;
40
+ signal?: AbortSignal;
41
+ }) => ApprovalRequester | undefined;
@@ -0,0 +1,81 @@
1
+ export const APPROVAL_FLAGS = {
2
+ auto: '--auto-approve',
3
+ dangerous: '--dangerously-auto-approve',
4
+ };
5
+ /**
6
+ * Stripped from argv, not just read: the server owns the command tree and has
7
+ * never heard of these, and a flag the server can see is one it could act on.
8
+ */
9
+ export const takeApprovalFlags = (args, env = process.env) => {
10
+ const remaining = args.filter((arg) => arg !== APPROVAL_FLAGS.auto && arg !== APPROVAL_FLAGS.dangerous);
11
+ const dangerous = args.includes(APPROVAL_FLAGS.dangerous) ||
12
+ env.PIKKU_DANGEROUSLY_AUTO_APPROVE === '1';
13
+ const auto = args.includes(APPROVAL_FLAGS.auto) || env.PIKKU_AUTO_APPROVE === '1';
14
+ return {
15
+ mode: dangerous ? 'dangerous' : auto ? 'auto' : 'prompt',
16
+ args: remaining,
17
+ };
18
+ };
19
+ /**
20
+ * `a` is scoped to the one capability and to this run: widening it to every
21
+ * capability would quietly turn an interactive run into
22
+ * `--dangerously-auto-approve`, and persisting it would outlive anyone's memory
23
+ * of agreeing.
24
+ */
25
+ export const createTerminalApprover = ({ input = process.stdin, output = process.stderr, signal, } = {}) => {
26
+ const allowed = new Set();
27
+ const ask = async ({ funcName, description }) => {
28
+ if (allowed.has(funcName) || signal?.aborted) {
29
+ return allowed.has(funcName);
30
+ }
31
+ // stderr, so a command whose stdout is piped still shows the prompt rather
32
+ // than corrupting the stream it is asking about.
33
+ output.write(`\nThe server is asking to run "${funcName}" on this machine.\n` +
34
+ (description ? ` ${description}\n` : '') +
35
+ `Allow? [y]es / [n]o / [a]lways for "${funcName}": `);
36
+ const answer = await new Promise((resolve) => {
37
+ const done = (value) => {
38
+ input.off('data', onData);
39
+ signal?.removeEventListener('abort', onAbort);
40
+ // Reading resumed stdin, which holds the event loop open.
41
+ input.pause?.();
42
+ resolve(value);
43
+ };
44
+ const onData = (chunk) => done(String(chunk).trim().toLowerCase());
45
+ // An aborted prompt is a refusal: its command is already over.
46
+ const onAbort = () => done('n');
47
+ input.on('data', onData);
48
+ signal?.addEventListener('abort', onAbort, { once: true });
49
+ });
50
+ if (answer === 'a' || answer === 'always') {
51
+ allowed.add(funcName);
52
+ return true;
53
+ }
54
+ return answer === 'y' || answer === 'yes';
55
+ };
56
+ // Requests are dispatched without awaiting, so two can be in flight at once.
57
+ // Unserialized, both prompts print interleaved and the first keystroke
58
+ // answers both — approving something the user never read.
59
+ let queue = Promise.resolve();
60
+ return (request) => {
61
+ const answered = queue.then(() => ask(request));
62
+ queue = answered.catch(() => { });
63
+ return answered;
64
+ };
65
+ };
66
+ /**
67
+ * Undefined reads as "nobody to ask", which refuses rather than runs. That is
68
+ * what a non-interactive run gets: CI is exactly where an unattended push would
69
+ * otherwise happen.
70
+ */
71
+ export const approverForMode = (mode, { isTTY = process.stdin.isTTY, warn = console.error, signal, } = {}) => {
72
+ if (mode === 'dangerous') {
73
+ // Once, on stderr, so the log of a run that went wrong records it.
74
+ warn(`${APPROVAL_FLAGS.dangerous}: every capability this client exposes will run without asking.`);
75
+ return () => true;
76
+ }
77
+ if (mode === 'auto' || !isTTY) {
78
+ return undefined;
79
+ }
80
+ return createTerminalApprover({ signal });
81
+ };
@@ -1,8 +1,4 @@
1
1
  import type { CorePikkuCLIRender } from '../cli.types.js';
2
- /**
3
- * Execute a CLI program via WebSocket channel
4
- * This is the main entry point for CLI-over-Channel clients
5
- */
6
2
  export declare function executeCLIViaChannel({ programName, pikkuWS, args, renderers, defaultRenderer, }: {
7
3
  programName: string;
8
4
  pikkuWS: any;
@@ -1,19 +1,10 @@
1
1
  import { pikkuState } from '../../../pikku-state.js';
2
2
  import { generateCommandHelp, parseCLIArguments } from '../command-parser.js';
3
- /**
4
- * Default JSON renderer for CLI output. Emits single-line NDJSON so
5
- * the output stays machine-parseable when the CLI is run with
6
- * `--output json`; pretty-printing here would break NDJSON consumers.
7
- */
3
+ // knowledge: decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md
8
4
  const defaultJSONRenderer = (_services, data) => {
9
5
  console.log(JSON.stringify(data));
10
6
  };
11
- /**
12
- * Execute a CLI program via WebSocket channel
13
- * This is the main entry point for CLI-over-Channel clients
14
- */
15
7
  export async function executeCLIViaChannel({ programName, pikkuWS, args = process.argv.slice(2), renderers = {}, defaultRenderer, }) {
16
- // Get CLI metadata from state
17
8
  const cliMeta = pikkuState(null, 'cli', 'meta');
18
9
  if (!cliMeta || !('programs' in cliMeta)) {
19
10
  throw new Error('[PKU342] CLI metadata not found. No CLI wirings were registered. See https://pikku.dev/docs/pikku-cli/errors/pku342 for more information.');
@@ -24,54 +15,44 @@ export async function executeCLIViaChannel({ programName, pikkuWS, args = proces
24
15
  console.error(`Error: CLI program "${programName}" not found`);
25
16
  process.exit(1);
26
17
  }
27
- // Parse arguments for this specific program
28
18
  const parsed = parseCLIArguments(args, programName, allCLIMeta);
29
- // Handle help (check after parsing to support subcommand help)
19
+ // Parsed first so that `<command> --help` resolves to that command's help.
30
20
  if (args.includes('--help') || args.includes('-h') || args.length === 0) {
31
21
  const helpText = generateCommandHelp(programName, allCLIMeta, parsed.commandPath);
32
22
  console.log(helpText);
33
23
  return;
34
24
  }
35
25
  if (parsed.errors.length > 0) {
36
- // Check if any error is about an unknown command
26
+ // knowledge: decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md
37
27
  const hasUnknownCommand = parsed.errors.some((error) => error.startsWith('Unknown command:') ||
38
28
  error.startsWith('Command not found:'));
39
29
  if (hasUnknownCommand) {
40
- // Show help instead of error for unknown commands
41
30
  const helpText = generateCommandHelp(programName, allCLIMeta, parsed.commandPath);
42
31
  console.log(helpText);
43
32
  process.exit(1);
44
33
  }
45
34
  else {
46
- // Show errors for other types of errors
47
35
  console.error('Errors:');
48
36
  parsed.errors.forEach((error) => console.error(` ${error}`));
49
37
  process.exit(1);
50
38
  }
51
39
  }
52
- // Merge positionals and options into single data object
53
40
  const data = { ...parsed.positionals, ...parsed.options };
54
- // Get the renderer for this command
55
41
  const commandId = parsed.commandPath.join('.');
56
42
  const renderer = renderers[commandId] || defaultRenderer || defaultJSONRenderer;
57
43
  return new Promise((resolve, reject) => {
58
- // Subscribe to responses for this command
59
44
  const commandRoute = pikkuWS.getRoute('command');
60
45
  const responseHandler = (response) => {
61
- // Check if this is a control message
62
46
  if (response?.action === 'cli-control' &&
63
47
  response?.event === 'complete') {
64
- // Server signals command is complete, close the connection client-side
65
48
  commandRoute.unsubscribe(commandId, responseHandler);
66
49
  pikkuWS.ws.close();
67
50
  resolve(undefined);
68
51
  return;
69
52
  }
70
- // Call renderer for any output
71
53
  renderer(null, response, undefined);
72
54
  };
73
55
  commandRoute.subscribe(commandId, responseHandler);
74
- // Handle connection close
75
56
  pikkuWS.ws.addEventListener('close', () => {
76
57
  commandRoute.unsubscribe(commandId, responseHandler);
77
58
  resolve(undefined);
@@ -80,13 +61,10 @@ export async function executeCLIViaChannel({ programName, pikkuWS, args = proces
80
61
  commandRoute.unsubscribe(commandId, responseHandler);
81
62
  reject(error);
82
63
  });
83
- // Send the command once connected
84
64
  if (pikkuWS.ws.readyState === 1) {
85
- // Already open
86
65
  commandRoute.send(commandId, data);
87
66
  }
88
67
  else {
89
- // Wait for open
90
68
  pikkuWS.ws.addEventListener('open', () => {
91
69
  commandRoute.send(commandId, data);
92
70
  });
@@ -1,15 +1,53 @@
1
- import type { CoreSingletonServices, CreateWireServices } from '../../../types/core.types.js';
1
+ import type { CoreSingletonServices, CoreUserSession, CreateWireServices } from '../../../types/core.types.js';
2
+ import type { PikkuChannel } from '../../channel/channel.types.js';
2
3
  /**
3
- * Handles raw CLI input from a WebSocket channel.
4
- * Parses the args, resolves the command, and either returns help or executes it.
4
+ * A frame sent from the server to a raw CLI client. `output` carries command
5
+ * data to render; `complete` terminates the command and carries the exit code
6
+ * so the client process can exit non-zero on failure.
5
7
  */
6
- export declare function handleRawCLI({ programName, args, singletonServices, createWireServices, }: {
8
+ export type RawCLIFrame = {
9
+ action: 'cli-output';
10
+ commandId?: string;
11
+ data: unknown;
12
+ } | {
13
+ action: 'cli-result';
14
+ commandId?: string;
15
+ result: unknown;
16
+ } | {
17
+ action: 'cli-help';
18
+ help: string;
19
+ } | {
20
+ action: 'cli-error';
21
+ error: string;
22
+ } | {
23
+ action: 'cli-control';
24
+ event: 'complete';
25
+ exitCode: number;
26
+ };
27
+ export interface RawCLIResult {
28
+ help?: string;
29
+ result?: unknown;
30
+ error?: string;
31
+ /** 0 on success, 1 on any parse or execution failure. */
32
+ exitCode: number;
33
+ /** The command the server resolved, so a client can pick a renderer. */
34
+ commandId?: string;
35
+ }
36
+ /**
37
+ * The client sends argv untouched and this side owns parsing, so the command
38
+ * tree lives with the server and a client binary never needs to know it.
39
+ */
40
+ export declare function handleRawCLI({ programName, args, singletonServices, createWireServices, onOutput, session, transport, }: {
7
41
  programName: string;
8
42
  args: string[];
9
43
  singletonServices: CoreSingletonServices;
10
44
  createWireServices?: CreateWireServices;
11
- }): Promise<{
12
- help?: string;
13
- result?: unknown;
14
- error?: string;
15
- }>;
45
+ /** Established during the upgrade; commands run as that user. */
46
+ session?: CoreUserSession;
47
+ onOutput?: (data: unknown, commandId: string) => Promise<void> | void;
48
+ /**
49
+ * The channel the command arrived on, so `channel.remote(...)` reaches the
50
+ * calling client rather than being refused as a one-way stream.
51
+ */
52
+ transport?: PikkuChannel<unknown, any, any>;
53
+ }): Promise<RawCLIResult>;