@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
@@ -0,0 +1,399 @@
1
+ import { randomUUID } from './ai-agent-utils.js'
2
+ import {
3
+ AbandonedError,
4
+ runInAbortScope,
5
+ type AbortScope,
6
+ } from '../../function/abort-scope.js'
7
+ import type { AIStorageService } from '../../services/ai-storage-service.js'
8
+
9
+ /**
10
+ * Why an in-flight agent run was cut short.
11
+ *
12
+ * Deliberately carries no interjection text. A voice interruption is not a
13
+ * cancel button — it is the user starting to talk — but what they said arrives
14
+ * a second later as an ordinary next turn on the same thread, and that turn
15
+ * already has a working path through `streamAIAgent`. The model then sees its
16
+ * own truncated message (marked `interrupted`) followed by the interjection and
17
+ * decides for itself whether to resume, correct itself or drop the thread.
18
+ * Nothing here classifies the interjection; a second delivery path for the same
19
+ * text would only give the two ways to disagree about ordering.
20
+ */
21
+ export interface AgentInterruption {
22
+ /** `'speech'` — the user started talking over the agent (voice barge-in).
23
+ * `'user'` — an explicit stop (a button). `'timeout'` — a caller-side deadline. */
24
+ reason: 'speech' | 'user' | 'timeout'
25
+ }
26
+
27
+ /**
28
+ * Thrown out of the step loop when a run is interrupted, so an interruption is
29
+ * distinguishable from a genuine failure at the one `catch` that would
30
+ * otherwise mark the run `failed`.
31
+ */
32
+ export class AgentInterruptedError extends Error {
33
+ constructor(
34
+ public readonly runId: string,
35
+ public readonly interruption: AgentInterruption
36
+ ) {
37
+ super(`Agent run ${runId} interrupted (${interruption.reason})`)
38
+ this.name = 'AgentInterruptedError'
39
+ }
40
+ }
41
+
42
+ /**
43
+ * A tool call that settled after its run was interrupted, so its result never
44
+ * reached the model.
45
+ *
46
+ * These are not failures, and they are only ever mutations. The tool ran, its
47
+ * side effect happened, and the only thing the interrupt cost was the reply
48
+ * describing it — so the result is worth mentioning on the next turn. Reads are
49
+ * excluded at the call site: nothing changed, so there is nothing to account
50
+ * for, and a stale answer is worse than re-reading.
51
+ */
52
+ export interface OrphanedToolResult {
53
+ toolCallId: string
54
+ toolName: string
55
+ result: unknown
56
+ /** Set instead of `result` when the tool threw after the interrupt. */
57
+ error?: string
58
+ }
59
+
60
+ /** What an authorized interrupt actually achieved. */
61
+ export interface AgentInterruptResult {
62
+ /**
63
+ * Whether a generating run was stopped. `false` is routine, not an error:
64
+ * racing a run that finishes on its own is the normal case in voice.
65
+ */
66
+ stopped: boolean
67
+ /**
68
+ * Tools that were still executing when the interrupt landed. Their side
69
+ * effects have already happened and cannot be undone from here — this is for
70
+ * saying something true ("the deploy is still going"), not for offering to
71
+ * roll it back. Each will surface as an `undelivered` tool message on the
72
+ * thread once it settles.
73
+ */
74
+ inFlightTools: string[]
75
+ }
76
+
77
+ export interface InterruptibleRunHandle {
78
+ readonly signal: AbortSignal
79
+ /** Set at the moment the run is interrupted; `undefined` on a clean run. */
80
+ readonly interruption: AgentInterruption | undefined
81
+ /** Names of tools executing right now — what an interrupt would talk over. */
82
+ readonly inFlightTools: string[]
83
+ /**
84
+ * Wrap a tool execution so it survives an interrupt. Before the interrupt
85
+ * this is a pass-through; after one, the settled value is collected as an
86
+ * {@link OrphanedToolResult} rather than vanishing with the aborted stream.
87
+ */
88
+ trackTool<T>(
89
+ toolName: string,
90
+ toolCallId: string,
91
+ exec: () => Promise<T>,
92
+ opts?: { collectResult?: boolean }
93
+ ): Promise<T>
94
+ /**
95
+ * Resolves once every tool still running at the moment of the interrupt has
96
+ * settled, with the results the model never got to see.
97
+ *
98
+ * Deliberately not awaited before the stream closes: barge-in has to stop the
99
+ * agent talking immediately, and a tool holding that up for its own duration
100
+ * is the one thing voice cannot tolerate.
101
+ */
102
+ settle(timeoutMs?: number): Promise<OrphanedToolResult[]>
103
+ release(): void
104
+ }
105
+
106
+ type Entry = {
107
+ controller: AbortController
108
+ interruption?: AgentInterruption
109
+ inFlight: Map<string, string>
110
+ orphaned: OrphanedToolResult[]
111
+ pending: Set<Promise<void>>
112
+ }
113
+
114
+ /**
115
+ * Live runs, keyed by runId.
116
+ *
117
+ * Module-level rather than `pikkuState` because the value is an
118
+ * `AbortController` — a process-local object that cannot be serialised or
119
+ * shared. That is also this registry's limit: an interrupt only reaches a run
120
+ * executing in the same process. Single-process and channel-attached callers
121
+ * (where the interrupt arrives on the socket already carrying the run) are
122
+ * covered; a horizontally-scaled deployment interrupting over a *separate* HTTP
123
+ * request needs the interrupt fanned out over `eventHub` to every instance
124
+ * first, with each instance calling `signalRunInterrupt` locally.
125
+ */
126
+ const runs = new Map<string, Entry>()
127
+
128
+ /**
129
+ * Make a run interruptible for the duration of its stream. The returned signal
130
+ * is threaded into the model call, so an interrupt cancels the upstream HTTP
131
+ * request rather than merely stopping delivery of tokens we are still paying
132
+ * for.
133
+ */
134
+ export const registerInterruptibleRun = (
135
+ runId: string
136
+ ): InterruptibleRunHandle => {
137
+ const entry: Entry = {
138
+ controller: new AbortController(),
139
+ inFlight: new Map(),
140
+ orphaned: [],
141
+ pending: new Set(),
142
+ }
143
+ runs.set(runId, entry)
144
+ return {
145
+ signal: entry.controller.signal,
146
+ get interruption() {
147
+ return entry.interruption
148
+ },
149
+ get inFlightTools() {
150
+ return [...entry.inFlight.values()]
151
+ },
152
+ trackTool: async <T>(
153
+ toolName: string,
154
+ toolCallId: string,
155
+ exec: () => Promise<T>,
156
+ opts?: { collectResult?: boolean }
157
+ ): Promise<T> => {
158
+ entry.inFlight.set(toolCallId, toolName)
159
+ const call = exec()
160
+ // Tracked separately from the returned promise so an interrupt can wait
161
+ // on the tool without the caller's rejection becoming an unhandled one.
162
+ const tracked = call.then(
163
+ (result) => {
164
+ entry.inFlight.delete(toolCallId)
165
+ // Read now rather than at call time: a tool that uses
166
+ // `beginChanges()` only reveals partway through whether it mutated.
167
+ if (
168
+ (opts?.collectResult ?? true) &&
169
+ entry.controller.signal.aborted
170
+ ) {
171
+ entry.orphaned.push({ toolCallId, toolName, result })
172
+ }
173
+ },
174
+ (err: unknown) => {
175
+ entry.inFlight.delete(toolCallId)
176
+ // A tool that stopped *at* its own checkpoint changed nothing by
177
+ // construction, so it never files a note — reporting "it aborted"
178
+ // is exactly the noise `beginChanges()` exists to remove.
179
+ if (err instanceof AbandonedError) return
180
+ if (
181
+ (opts?.collectResult ?? true) &&
182
+ entry.controller.signal.aborted
183
+ ) {
184
+ entry.orphaned.push({
185
+ toolCallId,
186
+ toolName,
187
+ result: undefined,
188
+ error: err instanceof Error ? err.message : String(err),
189
+ })
190
+ }
191
+ }
192
+ )
193
+ entry.pending.add(tracked)
194
+ void tracked.finally(() => entry.pending.delete(tracked))
195
+ return call
196
+ },
197
+ settle: async (timeoutMs = 30_000): Promise<OrphanedToolResult[]> => {
198
+ if (entry.pending.size > 0) {
199
+ // A tool that never settles must not strand the note forever; whatever
200
+ // has landed by the deadline is what gets reported.
201
+ let timer: ReturnType<typeof setTimeout> | undefined
202
+ await Promise.race([
203
+ Promise.all([...entry.pending]),
204
+ new Promise<void>((resolve) => {
205
+ timer = setTimeout(resolve, timeoutMs)
206
+ }),
207
+ ])
208
+ if (timer) clearTimeout(timer)
209
+ }
210
+ return entry.orphaned
211
+ },
212
+ release: () => {
213
+ if (runs.get(runId) === entry) runs.delete(runId)
214
+ },
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Stop a run that is generating right now.
220
+ *
221
+ * Plumbing: this performs NO authorization, so anyone holding a runId can stop
222
+ * it. Reach for {@link interruptAIAgent} instead unless the caller has already
223
+ * established that the run belongs to the session — which in practice means
224
+ * only the runner itself and code already inside an authorized run.
225
+ *
226
+ * Returns `false` when the run is not in flight in this process — already
227
+ * finished, never started, or running elsewhere — which callers should treat as
228
+ * "nothing to interrupt", not as an error: racing a run that finishes on its own
229
+ * is the normal case in voice.
230
+ */
231
+ export const signalRunInterrupt = (
232
+ runId: string,
233
+ interruption: AgentInterruption = { reason: 'user' }
234
+ ): boolean => {
235
+ const entry = runs.get(runId)
236
+ if (!entry || entry.controller.signal.aborted) return false
237
+ entry.interruption = interruption
238
+ entry.controller.abort()
239
+ return true
240
+ }
241
+
242
+ /** Whether a run is currently interruptible in this process. */
243
+ export const isRunInterruptible = (runId: string): boolean => runs.has(runId)
244
+
245
+ /**
246
+ * Tools executing in a run right now. Empty for a run that is merely
247
+ * generating, or one this process does not hold.
248
+ *
249
+ * Callers use this to say something true about work that outlives the reply —
250
+ * "that deploy is still going" — rather than to offer to stop it. By the time a
251
+ * tool is executing its side effect has already happened, and pikku functions
252
+ * receive no abort signal, so there is nothing left to cancel.
253
+ */
254
+ export const getInFlightTools = (runId: string): string[] => {
255
+ const entry = runs.get(runId)
256
+ return entry ? [...entry.inFlight.values()] : []
257
+ }
258
+
259
+ /**
260
+ * Wrap tool definitions so their results survive an interrupt.
261
+ *
262
+ * Applied by the runner after the handle exists rather than in `buildToolDefs`,
263
+ * which builds tools before there is a runId to attach them to.
264
+ */
265
+ export const trackToolExecution = <
266
+ T extends {
267
+ name: string
268
+ readonly?: boolean
269
+ execute: (input: any) => Promise<any>
270
+ },
271
+ >(
272
+ tools: T[],
273
+ handle: InterruptibleRunHandle
274
+ ): T[] =>
275
+ tools.map((tool) => {
276
+ // Reads run outside the scope entirely: they never produce a note and have
277
+ // nothing to declare, so `beginChanges()` inside one is a no-op rather than
278
+ // a contradiction to resolve.
279
+ if (tool.readonly) {
280
+ return {
281
+ ...tool,
282
+ execute: (input: unknown) =>
283
+ handle.trackTool(tool.name, randomUUID(), () => tool.execute(input), {
284
+ collectResult: false,
285
+ }),
286
+ }
287
+ }
288
+
289
+ return {
290
+ ...tool,
291
+ execute: (input: unknown) => {
292
+ // Assumed to have changed something unless it says otherwise — the tool
293
+ // that never declares its checkpoint is the one that cannot be assumed
294
+ // harmless. `beginChanges()` can only ever make this more precise.
295
+ const call = { mutating: true }
296
+ const scope: AbortScope = {
297
+ get abandoned() {
298
+ return handle.signal.aborted
299
+ },
300
+ get reason() {
301
+ return handle.interruption?.reason
302
+ },
303
+ onBeginChanges: () => {
304
+ call.mutating = true
305
+ },
306
+ }
307
+ return handle.trackTool(
308
+ tool.name,
309
+ randomUUID(),
310
+ () => runInAbortScope(scope, () => tool.execute(input)),
311
+ {
312
+ get collectResult() {
313
+ return call.mutating
314
+ },
315
+ }
316
+ )
317
+ },
318
+ }
319
+ })
320
+
321
+ /**
322
+ * Threads with an interrupted tool call still settling.
323
+ *
324
+ * The note describing that result has to be in the thread before the turn that
325
+ * ought to mention it loads its context, and the user's next sentence usually
326
+ * arrives well inside a slow tool. Runs await this for their own thread first,
327
+ * so the ordering holds without the interrupt itself blocking on anything.
328
+ */
329
+ const pendingNotes = new Map<string, Promise<void>>()
330
+
331
+ export const trackInterruptNote = (
332
+ threadId: string,
333
+ write: Promise<void>
334
+ ): void => {
335
+ const done = write.finally(() => {
336
+ if (pendingNotes.get(threadId) === done) pendingNotes.delete(threadId)
337
+ })
338
+ pendingNotes.set(threadId, done)
339
+ }
340
+
341
+ /** Await an interrupted tool result still being written to this thread. */
342
+ export const awaitPendingInterruptNote = async (
343
+ threadId: string
344
+ ): Promise<void> => {
345
+ await pendingNotes.get(threadId)
346
+ }
347
+
348
+ /**
349
+ * Write the results of tools that were still running when a run was cut off.
350
+ *
351
+ * Saved as an ordinary tool message so it reaches the model through the same
352
+ * context load as everything else — there is no separate "notes" channel to
353
+ * keep in sync, and storage that drops the `undelivered` flag still keeps the
354
+ * result itself.
355
+ *
356
+ * Callers should hand this to {@link trackInterruptNote} rather than awaiting
357
+ * it: an interrupt has to end the reply immediately, and a slow tool must not
358
+ * hold that up.
359
+ */
360
+ export const persistOrphanedToolResults = async (
361
+ handle: InterruptibleRunHandle,
362
+ storage: AIStorageService,
363
+ threadId: string
364
+ ): Promise<void> => {
365
+ let orphaned: OrphanedToolResult[]
366
+ try {
367
+ orphaned = await handle.settle()
368
+ } finally {
369
+ handle.release()
370
+ }
371
+ if (orphaned.length === 0) return
372
+ await storage.saveMessages(threadId, [
373
+ {
374
+ id: randomUUID(),
375
+ role: 'tool',
376
+ toolResults: orphaned.map((entry) => ({
377
+ id: entry.toolCallId,
378
+ name: entry.toolName,
379
+ result: entry.error
380
+ ? `Error: ${entry.error}`
381
+ : typeof entry.result === 'string'
382
+ ? entry.result
383
+ : JSON.stringify(entry.result),
384
+ })),
385
+ undelivered: true,
386
+ createdAt: new Date(),
387
+ },
388
+ ])
389
+ }
390
+
391
+ /**
392
+ * Whether a thrown value is an abort rather than a failure. The AI SDK
393
+ * surfaces cancellation as a DOMException/Error named `AbortError`, so the
394
+ * name is the only portable signal — there is no shared error class to
395
+ * `instanceof` against across fetch, undici and the provider SDKs.
396
+ */
397
+ export const isAbortError = (err: unknown): boolean =>
398
+ err instanceof Error &&
399
+ (err.name === 'AbortError' || err.name === 'TimeoutError')
@@ -418,8 +418,6 @@ export function createWorkingMemoryMiddleware(options: {
418
418
  }
419
419
  }
420
420
 
421
- // Only persist when the merged value passes schema validation —
422
- // saving invalid data would poison subsequent getWorkingMemory reads.
423
421
  if (valid) {
424
422
  await options.storage.saveWorkingMemory(
425
423
  options.threadId,
@@ -1,12 +1,4 @@
1
- /**
2
- * Resolves the effective model/temperature/maxSteps for an agent at runtime.
3
- *
4
- * Models are declared per-agent using the provider-qualified `provider/model`
5
- * form (e.g. `openai/gpt-5-mini`); there is no config-level alias map. This
6
- * function remains the single merge point for request-time overrides (see
7
- * ai-agent-prepare's `input.model`), so callers stay decoupled from how the
8
- * effective config is assembled.
9
- */
1
+ // knowledge: decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md
10
2
  export function resolveModelConfig(
11
3
  _agentName: string,
12
4
  agent: { model: string; temperature?: number; maxSteps?: number }