@pikku/core 0.12.142 → 0.12.144

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 (703) hide show
  1. package/dist/analytics/analytics.d.ts +14 -0
  2. package/dist/analytics/analytics.js +14 -0
  3. package/dist/analytics/analytics.types.d.ts +1 -0
  4. package/dist/analytics/anonymous-analytics-identity.d.ts +1 -0
  5. package/dist/analytics/cookie-analytics-identity.d.ts +1 -0
  6. package/dist/analytics/mint-cookie.d.ts +1 -0
  7. package/dist/{wirings/channel/channel-middleware-runner.d.ts → channel-middleware-runner.d.ts} +17 -3
  8. package/dist/{wirings/channel/channel-middleware-runner.js → channel-middleware-runner.js} +24 -8
  9. package/dist/classification/data-classification.d.ts +13 -0
  10. package/dist/classification/secret-value.d.ts +7 -0
  11. package/dist/classification/secret-value.js +7 -0
  12. package/dist/crypto-utils.d.ts +93 -0
  13. package/dist/crypto-utils.js +92 -0
  14. package/dist/dev/hot-reload.d.ts +16 -0
  15. package/dist/dev/hot-reload.js +16 -1
  16. package/dist/dev/module-runner.js +7 -3
  17. package/dist/dev/reload-meta.js +1 -1
  18. package/dist/errors/error-handler.d.ts +9 -0
  19. package/dist/errors/error-handler.js +8 -0
  20. package/dist/errors/errors.d.ts +219 -0
  21. package/dist/errors/errors.js +227 -0
  22. package/dist/errors/serialized-error.d.ts +4 -0
  23. package/dist/function/abort-scope.d.ts +5 -0
  24. package/dist/function/function-meta.types.d.ts +20 -0
  25. package/dist/function/function-runner.d.ts +41 -0
  26. package/dist/function/function-runner.js +57 -11
  27. package/dist/function/functions.types.d.ts +59 -0
  28. package/dist/function/functions.types.js +23 -0
  29. package/dist/function/list.types.d.ts +4 -0
  30. package/dist/lifecycle.d.ts +12 -1
  31. package/dist/lifecycle.js +12 -1
  32. package/dist/middleware/addon-scope-cap.d.ts +4 -0
  33. package/dist/middleware/addon-scope-cap.js +7 -3
  34. package/dist/middleware/auth-apikey.js +3 -3
  35. package/dist/middleware/auth-bearer.js +5 -13
  36. package/dist/middleware/auth-cookie.js +3 -3
  37. package/dist/middleware/middleware-factories.d.ts +17 -0
  38. package/dist/middleware/middleware-factories.js +17 -0
  39. package/dist/middleware/middleware.types.d.ts +23 -0
  40. package/dist/middleware/remote-auth.d.ts +15 -0
  41. package/dist/middleware/remote-auth.js +18 -3
  42. package/dist/middleware/remote-jobs-secret.js +2 -10
  43. package/dist/middleware-runner.d.ts +7 -0
  44. package/dist/middleware-runner.js +23 -7
  45. package/dist/permissions.d.ts +13 -0
  46. package/dist/permissions.js +13 -0
  47. package/dist/pikku-state.d.ts +49 -0
  48. package/dist/pikku-state.js +49 -0
  49. package/dist/remote.js +20 -5
  50. package/dist/schema.d.ts +36 -0
  51. package/dist/schema.js +36 -0
  52. package/dist/services/agent-run-state-service.d.ts +8 -0
  53. package/dist/services/agent-runner-service.d.ts +24 -0
  54. package/dist/services/agent-storage-service.d.ts +8 -0
  55. package/dist/services/ai-embedding-service.d.ts +4 -0
  56. package/dist/services/audit-service.d.ts +48 -0
  57. package/dist/services/audit-service.js +22 -0
  58. package/dist/services/content-service.d.ts +34 -0
  59. package/dist/services/credential-wire-service.d.ts +9 -0
  60. package/dist/services/credential-wire-service.js +9 -0
  61. package/dist/services/deployment-service.d.ts +14 -0
  62. package/dist/services/email-service.d.ts +20 -0
  63. package/dist/services/email-template.d.ts +24 -0
  64. package/dist/services/email-template.js +12 -0
  65. package/dist/services/file-scenario-run-store.d.ts +5 -0
  66. package/dist/services/file-scenario-run-store.js +4 -0
  67. package/dist/services/gateway-service.d.ts +5 -0
  68. package/dist/services/in-memory-agent-run-state-service.d.ts +5 -0
  69. package/dist/services/in-memory-agent-run-state-service.js +5 -0
  70. package/dist/services/in-memory-lease-service.d.ts +5 -0
  71. package/dist/services/in-memory-lease-service.js +5 -0
  72. package/dist/services/in-memory-session-store.d.ts +4 -0
  73. package/dist/services/in-memory-session-store.js +4 -0
  74. package/dist/services/incoming-webhook-queue.d.ts +2 -0
  75. package/dist/services/incoming-webhook-queue.js +2 -0
  76. package/dist/services/incoming-webhook-service.d.ts +11 -1
  77. package/dist/services/incoming-webhook-service.js +5 -1
  78. package/dist/services/index.d.ts +1 -5
  79. package/dist/services/index.js +1 -5
  80. package/dist/services/jwt-service.d.ts +8 -0
  81. package/dist/services/lease-service.d.ts +5 -0
  82. package/dist/services/lease-service.js +1 -0
  83. package/dist/services/local-content-request-handler.d.ts +20 -0
  84. package/dist/services/local-content-request-handler.js +11 -0
  85. package/dist/services/local-content.d.ts +45 -0
  86. package/dist/services/local-content.js +35 -0
  87. package/dist/services/local-credential-service.d.ts +5 -0
  88. package/dist/services/local-credential-service.js +5 -0
  89. package/dist/services/local-email-service.d.ts +7 -0
  90. package/dist/services/local-email-service.js +7 -0
  91. package/dist/services/local-secrets.d.ts +8 -0
  92. package/dist/services/local-secrets.js +8 -0
  93. package/dist/services/local-variables.d.ts +6 -0
  94. package/dist/services/local-variables.js +6 -0
  95. package/dist/services/logger.d.ts +4 -0
  96. package/dist/services/logger.js +4 -0
  97. package/dist/services/meta-service.d.ts +38 -0
  98. package/dist/services/meta-service.js +6 -0
  99. package/dist/services/queue-webhook-service.d.ts +19 -0
  100. package/dist/services/queue-webhook-service.js +19 -0
  101. package/dist/services/remote-jobs.d.ts +8 -13
  102. package/dist/services/remote-jobs.js +3 -54
  103. package/dist/services/scenario-cookie-jar.d.ts +4 -0
  104. package/dist/services/scheduler-service.d.ts +16 -0
  105. package/dist/services/scheduler-service.js +12 -0
  106. package/dist/services/schema-service.d.ts +9 -0
  107. package/dist/services/scope-service.d.ts +10 -0
  108. package/dist/services/scoped-secret-service.d.ts +5 -0
  109. package/dist/services/scoped-secret-service.js +5 -0
  110. package/dist/services/secret-host-binding.d.ts +5 -0
  111. package/dist/services/secret-host-binding.js +5 -0
  112. package/dist/services/secret-service.d.ts +19 -1
  113. package/dist/services/secretless.d.ts +6 -0
  114. package/dist/services/secretless.js +6 -0
  115. package/dist/services/session-store.d.ts +5 -0
  116. package/dist/services/stub-tracker.d.ts +1 -0
  117. package/dist/services/temporary-file-service.d.ts +9 -0
  118. package/dist/services/temporary-file-service.js +9 -0
  119. package/dist/services/trigger-service.d.ts +4 -0
  120. package/dist/services/trigger-source-store.d.ts +13 -0
  121. package/dist/services/trigger-source-store.js +7 -0
  122. package/dist/services/typed-credential-service.d.ts +6 -0
  123. package/dist/services/typed-credential-service.js +5 -0
  124. package/dist/services/typed-secret-service.d.ts +12 -0
  125. package/dist/services/typed-secret-service.js +11 -0
  126. package/dist/services/typed-variables-service.d.ts +1 -0
  127. package/dist/services/user-session-service.d.ts +31 -1
  128. package/dist/services/user-session-service.js +29 -3
  129. package/dist/services/v8-coverage-service.d.ts +27 -0
  130. package/dist/services/v8-coverage-service.js +5 -0
  131. package/dist/services/variables-service.d.ts +8 -0
  132. package/dist/services/virtual-user-sign-in.d.ts +1 -0
  133. package/dist/services/virtual-user-statement.d.ts +8 -0
  134. package/dist/services/virtual-user-statement.js +4 -0
  135. package/dist/services/webhook-service.d.ts +25 -0
  136. package/dist/services/webhook-service.js +15 -0
  137. package/dist/services/workflow-service.d.ts +6 -0
  138. package/dist/test-utils.js +1 -1
  139. package/dist/testing/service-tests.d.ts +4 -0
  140. package/dist/time-utils.d.ts +15 -0
  141. package/dist/time-utils.js +14 -0
  142. package/dist/types/core.types.d.ts +80 -0
  143. package/dist/types/state.types.d.ts +4 -0
  144. package/dist/utils/hmac.d.ts +3 -0
  145. package/dist/utils/safe-fetch.d.ts +14 -0
  146. package/dist/utils/safe-fetch.js +13 -0
  147. package/dist/utils/stable-stringify.d.ts +11 -0
  148. package/dist/utils/stable-stringify.js +33 -0
  149. package/dist/utils.d.ts +28 -0
  150. package/dist/utils.js +22 -0
  151. package/dist/version.d.ts +7 -0
  152. package/dist/version.js +7 -0
  153. package/dist/wirings/addon/define-screens.d.ts +2 -0
  154. package/dist/wirings/addon/remote-addon-auth.d.ts +9 -0
  155. package/dist/wirings/addon/remote-addon-auth.js +5 -0
  156. package/dist/wirings/addon/wire-addon.d.ts +4 -0
  157. package/dist/wirings/addon/wire-remote-addon.d.ts +1 -0
  158. package/dist/wirings/agent/agent-agui.d.ts +14 -5
  159. package/dist/wirings/agent/agent-agui.js +17 -6
  160. package/dist/wirings/agent/agent-helpers.d.ts +61 -1
  161. package/dist/wirings/agent/agent-helpers.js +62 -2
  162. package/dist/wirings/agent/agent-interrupt.d.ts +5 -0
  163. package/dist/wirings/agent/agent-output.d.ts +20 -0
  164. package/dist/wirings/agent/agent-output.js +69 -0
  165. package/dist/wirings/agent/agent-prepare.d.ts +41 -0
  166. package/dist/wirings/agent/agent-prepare.js +38 -2
  167. package/dist/wirings/agent/agent-registry.d.ts +8 -0
  168. package/dist/wirings/agent/agent-registry.js +10 -4
  169. package/dist/wirings/agent/agent-runner.d.ts +33 -0
  170. package/dist/wirings/agent/agent-runner.js +40 -7
  171. package/dist/wirings/agent/agent-stream.d.ts +30 -0
  172. package/dist/wirings/agent/agent-stream.js +33 -11
  173. package/dist/wirings/agent/agent.types.d.ts +43 -0
  174. package/dist/wirings/agent/voice-input.d.ts +12 -0
  175. package/dist/wirings/agent/voice-input.js +12 -0
  176. package/dist/wirings/agent/voice-output.d.ts +14 -0
  177. package/dist/wirings/agent/voice-output.js +10 -0
  178. package/dist/wirings/agent-scorer/agent-scorer-judge.js +1 -2
  179. package/dist/wirings/agent-scorer/agent-scorer-registry.d.ts +10 -0
  180. package/dist/wirings/agent-scorer/agent-scorer-registry.js +10 -0
  181. package/dist/wirings/agent-scorer/agent-scorer-snapshots.d.ts +1 -0
  182. package/dist/wirings/agent-scorer/agent-scorer-snapshots.js +1 -0
  183. package/dist/wirings/agent-scorer/agent-scorer.types.d.ts +7 -0
  184. package/dist/wirings/channel/channel-common.js +1 -1
  185. package/dist/wirings/channel/channel-rpc.types.d.ts +5 -0
  186. package/dist/wirings/channel/channel-runner.d.ts +22 -0
  187. package/dist/wirings/channel/channel-runner.js +22 -0
  188. package/dist/wirings/channel/channel-store.d.ts +8 -0
  189. package/dist/wirings/channel/channel-store.js +7 -0
  190. package/dist/wirings/channel/channel.types.d.ts +18 -0
  191. package/dist/wirings/channel/define-channel-routes.d.ts +5 -0
  192. package/dist/wirings/channel/define-channel-routes.js +5 -0
  193. package/dist/wirings/channel/eventhub-service.d.ts +9 -0
  194. package/dist/wirings/channel/eventhub-store.d.ts +1 -0
  195. package/dist/wirings/channel/eventhub-store.js +1 -0
  196. package/dist/wirings/channel/index.d.ts +1 -1
  197. package/dist/wirings/channel/index.js +1 -1
  198. package/dist/wirings/channel/local/local-channel-handler.d.ts +1 -0
  199. package/dist/wirings/channel/local/local-channel-handler.js +1 -0
  200. package/dist/wirings/channel/local/local-channel-runner.d.ts +13 -0
  201. package/dist/wirings/channel/local/local-channel-runner.js +13 -0
  202. package/dist/wirings/channel/local/local-eventhub-service.d.ts +1 -0
  203. package/dist/wirings/channel/local/local-eventhub-service.js +1 -0
  204. package/dist/wirings/channel/log-channels.d.ts +1 -0
  205. package/dist/wirings/channel/log-channels.js +1 -0
  206. package/dist/wirings/channel/pikku-abstract-channel-handler.d.ts +5 -0
  207. package/dist/wirings/channel/pikku-abstract-channel-handler.js +5 -0
  208. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +32 -0
  209. package/dist/wirings/channel/serverless/serverless-channel-runner.js +31 -0
  210. package/dist/wirings/cli/channel/cli-channel-runner.d.ts +8 -0
  211. package/dist/wirings/cli/channel/cli-channel-runner.js +8 -0
  212. package/dist/wirings/cli/channel/cli-raw-channel-runner.d.ts +1 -0
  213. package/dist/wirings/cli/cli-runner.d.ts +43 -0
  214. package/dist/wirings/cli/cli-runner.js +43 -0
  215. package/dist/wirings/cli/command-parser.d.ts +13 -0
  216. package/dist/wirings/cli/command-parser.js +12 -0
  217. package/dist/wirings/credential/credential-overrides.d.ts +1 -0
  218. package/dist/wirings/credential/credential.types.d.ts +7 -0
  219. package/dist/wirings/credential/validate-credential-definitions.d.ts +7 -0
  220. package/dist/wirings/credential/validate-credential-definitions.js +7 -0
  221. package/dist/wirings/flag/cached-flag-source.d.ts +1 -0
  222. package/dist/wirings/flag/flag.types.d.ts +3 -0
  223. package/dist/wirings/gateway/gateway-runner.d.ts +23 -0
  224. package/dist/wirings/gateway/gateway-runner.js +23 -0
  225. package/dist/wirings/gateway/gateway.types.d.ts +3 -0
  226. package/dist/wirings/gateway/local-gateway-service.d.ts +10 -0
  227. package/dist/{services → wirings/gateway}/local-gateway-service.js +6 -2
  228. package/dist/wirings/http/http-routes.d.ts +21 -0
  229. package/dist/wirings/http/http-routes.js +11 -0
  230. package/dist/wirings/http/http-runner.d.ts +71 -0
  231. package/dist/wirings/http/http-runner.js +73 -5
  232. package/dist/wirings/http/http.types.d.ts +27 -0
  233. package/dist/wirings/http/index.d.ts +1 -0
  234. package/dist/wirings/http/index.js +1 -0
  235. package/dist/wirings/http/log-http-routes.d.ts +1 -0
  236. package/dist/wirings/http/log-http-routes.js +1 -0
  237. package/dist/wirings/http/merge-request-data.d.ts +12 -0
  238. package/dist/wirings/http/merge-request-data.js +42 -0
  239. package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -0
  240. package/dist/wirings/http/pikku-fetch-http-request.js +3 -32
  241. package/dist/wirings/http/pikku-fetch-http-response.d.ts +1 -0
  242. package/dist/wirings/http/pikku-fetch-http-response.js +1 -0
  243. package/dist/wirings/http/routers/http-router.d.ts +6 -0
  244. package/dist/wirings/http/routers/http-router.js +6 -0
  245. package/dist/wirings/http/web-request.d.ts +17 -0
  246. package/dist/wirings/http/web-request.js +17 -0
  247. package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +7 -0
  248. package/dist/wirings/mcp/mcp-endpoint-registry.js +7 -0
  249. package/dist/wirings/mcp/mcp-runner.d.ts +63 -0
  250. package/dist/wirings/mcp/mcp-runner.js +62 -0
  251. package/dist/wirings/mcp/mcp.types.d.ts +12 -0
  252. package/dist/wirings/node/node.types.d.ts +4 -0
  253. package/dist/wirings/oauth2/oauth2.types.d.ts +2 -0
  254. package/dist/wirings/queue/in-memory-queue-service.d.ts +23 -0
  255. package/dist/wirings/queue/in-memory-queue-service.js +129 -0
  256. package/dist/wirings/queue/index.d.ts +2 -1
  257. package/dist/wirings/queue/index.js +1 -0
  258. package/dist/wirings/queue/queue-identity.js +2 -14
  259. package/dist/wirings/queue/queue-runner.d.ts +37 -0
  260. package/dist/wirings/queue/queue-runner.js +37 -0
  261. package/dist/wirings/queue/queue.types.d.ts +56 -0
  262. package/dist/wirings/queue/register-queue-helper.d.ts +12 -0
  263. package/dist/wirings/queue/register-queue-helper.js +11 -0
  264. package/dist/wirings/queue/remote-queue-job.d.ts +11 -0
  265. package/dist/wirings/queue/remote-queue-job.js +41 -0
  266. package/dist/wirings/queue/signed-queue-service.d.ts +4 -1
  267. package/dist/wirings/queue/signed-queue-service.js +3 -0
  268. package/dist/wirings/queue/validate-worker-config.d.ts +1 -0
  269. package/dist/wirings/role/role.types.d.ts +3 -0
  270. package/dist/wirings/rpc/rpc-runner.d.ts +24 -0
  271. package/dist/wirings/rpc/rpc-runner.js +37 -2
  272. package/dist/wirings/rpc/rpc-types.d.ts +2 -0
  273. package/dist/wirings/scheduler/index.d.ts +2 -1
  274. package/dist/wirings/scheduler/index.js +1 -0
  275. package/dist/wirings/scheduler/log-schedulers.d.ts +1 -0
  276. package/dist/wirings/scheduler/log-schedulers.js +1 -0
  277. package/dist/wirings/scheduler/remote-scheduled-job.d.ts +11 -0
  278. package/dist/wirings/scheduler/remote-scheduled-job.js +20 -0
  279. package/dist/wirings/scheduler/scheduler-runner.d.ts +29 -0
  280. package/dist/wirings/scheduler/scheduler-runner.js +28 -0
  281. package/dist/wirings/scheduler/scheduler.types.d.ts +15 -0
  282. package/dist/wirings/scope/scope.types.d.ts +5 -0
  283. package/dist/wirings/secret/index.d.ts +2 -2
  284. package/dist/wirings/secret/index.js +1 -1
  285. package/dist/wirings/secret/secret.types.d.ts +26 -1
  286. package/dist/wirings/secret/secret.types.js +1 -0
  287. package/dist/wirings/secret/validate-secret-definitions.d.ts +8 -0
  288. package/dist/wirings/secret/validate-secret-definitions.js +15 -0
  289. package/dist/wirings/trigger/in-memory-trigger-service.d.ts +11 -0
  290. package/dist/{services → wirings/trigger}/in-memory-trigger-service.js +10 -3
  291. package/dist/wirings/trigger/index.d.ts +1 -1
  292. package/dist/wirings/trigger/pikku-trigger-service.d.ts +8 -3
  293. package/dist/wirings/trigger/pikku-trigger-service.js +14 -3
  294. package/dist/wirings/trigger/trigger-runner.d.ts +27 -2
  295. package/dist/wirings/trigger/trigger-runner.js +35 -2
  296. package/dist/wirings/trigger/trigger.types.d.ts +26 -4
  297. package/dist/wirings/trigger/webhook-source-runner.d.ts +24 -0
  298. package/dist/wirings/trigger/webhook-source-runner.js +19 -0
  299. package/dist/wirings/trigger/webhook-source.types.d.ts +12 -2
  300. package/dist/wirings/trigger/webhook-source.types.js +1 -1
  301. package/dist/wirings/variable/validate-variable-definitions.d.ts +7 -0
  302. package/dist/wirings/variable/validate-variable-definitions.js +7 -0
  303. package/dist/wirings/variable/variable.types.d.ts +7 -0
  304. package/dist/wirings/virtual-user/conversation/conversation.types.d.ts +5 -0
  305. package/dist/wirings/virtual-user/conversation/run-conversation.d.ts +6 -0
  306. package/dist/wirings/virtual-user/conversation/run-conversation.js +1 -1
  307. package/dist/{services → wirings/virtual-user}/http-virtual-users.d.ts +4 -3
  308. package/dist/{services → wirings/virtual-user}/http-virtual-users.js +6 -6
  309. package/dist/wirings/virtual-user/index.d.ts +1 -1
  310. package/dist/wirings/virtual-user/index.js +1 -1
  311. package/dist/wirings/virtual-user/run-virtual-user.d.ts +2 -1
  312. package/dist/wirings/virtual-user/run-virtual-user.js +1 -14
  313. package/dist/wirings/virtual-user/virtual-user-declaration.types.d.ts +4 -0
  314. package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +10 -1
  315. package/dist/wirings/virtual-user/virtual-user-scaffold.js +5 -0
  316. package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +5 -0
  317. package/dist/wirings/virtual-user/virtual-user-schedule.js +1 -0
  318. package/dist/wirings/virtual-user/virtual-user-target.d.ts +1 -0
  319. package/dist/wirings/webhook/define-outgoing-webhook.d.ts +20 -0
  320. package/dist/wirings/webhook/define-outgoing-webhook.js +9 -0
  321. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +8 -4
  322. package/dist/wirings/workflow/dsl/workflow-runner.d.ts +7 -0
  323. package/dist/wirings/workflow/dsl/workflow-runner.js +7 -0
  324. package/dist/wirings/workflow/feature.d.ts +12 -0
  325. package/dist/wirings/workflow/feature.js +12 -0
  326. package/dist/wirings/workflow/graph/graph-node.d.ts +5 -0
  327. package/dist/wirings/workflow/graph/graph-node.js +5 -0
  328. package/dist/wirings/workflow/graph/template.d.ts +6 -0
  329. package/dist/wirings/workflow/graph/template.js +5 -0
  330. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +12 -0
  331. package/dist/wirings/workflow/graph/wire-workflow-graph.js +10 -0
  332. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +11 -0
  333. package/dist/wirings/workflow/graph/workflow-graph.types.js +1 -0
  334. package/dist/{services → wirings/workflow}/in-memory-workflow-service.d.ts +8 -3
  335. package/dist/{services → wirings/workflow}/in-memory-workflow-service.js +9 -4
  336. package/dist/wirings/workflow/pikku-scenario-service.d.ts +1 -1
  337. package/dist/wirings/workflow/pikku-scenario-service.js +2 -2
  338. package/dist/wirings/workflow/pikku-workflow-service.d.ts +1 -0
  339. package/dist/wirings/workflow/pikku-workflow-service.js +1 -0
  340. package/dist/wirings/workflow/run-timeline.d.ts +21 -0
  341. package/dist/wirings/workflow/run-timeline.js +15 -7
  342. package/dist/wirings/workflow/scenario-coverage.d.ts +1 -0
  343. package/dist/wirings/workflow/scenario-poll.d.ts +1 -0
  344. package/dist/wirings/workflow/scenario-prose.d.ts +6 -0
  345. package/dist/wirings/workflow/scenario-prose.js +6 -0
  346. package/dist/wirings/workflow/scenario-run.types.d.ts +3 -0
  347. package/dist/wirings/workflow/scenario-step.types.d.ts +1 -0
  348. package/dist/wirings/workflow/scenario-step.types.js +1 -0
  349. package/dist/wirings/workflow/scenario-surface.js +1 -13
  350. package/dist/wirings/workflow/scenario.types.d.ts +6 -0
  351. package/dist/wirings/workflow/workflow-approval-policy.d.ts +6 -0
  352. package/dist/wirings/workflow/workflow-approval-policy.js +6 -0
  353. package/dist/wirings/workflow/workflow-constants.d.ts +7 -1
  354. package/dist/wirings/workflow/workflow-constants.js +10 -1
  355. package/dist/wirings/workflow/workflow-errors.d.ts +13 -0
  356. package/dist/wirings/workflow/workflow-errors.js +13 -0
  357. package/dist/wirings/workflow/workflow-invocation-id.d.ts +4 -0
  358. package/dist/wirings/workflow/workflow-invocation-id.js +4 -0
  359. package/dist/wirings/workflow/workflow-queue-workers.d.ts +3 -0
  360. package/dist/wirings/workflow/workflow-run-ownership.d.ts +1 -0
  361. package/dist/wirings/workflow/workflow-run-ownership.js +1 -0
  362. package/dist/wirings/workflow/workflow-status-stream.d.ts +1 -0
  363. package/dist/wirings/workflow/workflow-unwind-plan.js +2 -7
  364. package/dist/wirings/workflow/workflow.types.d.ts +40 -0
  365. package/package.json +26 -9
  366. package/CHANGELOG.md +0 -6961
  367. package/dist/services/in-memory-queue-service.d.ts +0 -8
  368. package/dist/services/in-memory-queue-service.js +0 -54
  369. package/dist/services/in-memory-trigger-service.d.ts +0 -4
  370. package/dist/services/local-gateway-service.d.ts +0 -6
  371. package/dist/utils/hash.d.ts +0 -2
  372. package/dist/utils/hash.js +0 -23
  373. package/knowledge/decisions/index.md +0 -19
  374. package/knowledge/decisions/internals/a-credential-name-declared-twice-must-agree-on-schema-and-type.md +0 -29
  375. package/knowledge/decisions/internals/a-grant-can-name-a-scope-declared-without-its-addon.md +0 -29
  376. package/knowledge/decisions/internals/a-held-run-is-woken-later-not-retried.md +0 -28
  377. package/knowledge/decisions/internals/a-non-streaming-agent-run-registers-with-agentrunstate-too.md +0 -22
  378. package/knowledge/decisions/internals/a-reset-suite-makes-the-dev-seed-the-fixture.md +0 -50
  379. package/knowledge/decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md +0 -20
  380. package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +0 -21
  381. package/knowledge/decisions/internals/a-scheduled-task-writes-its-caller-session-before-it-runs.md +0 -22
  382. package/knowledge/decisions/internals/a-secret-set-in-memory-shadows-the-variable-of-the-same-name.md +0 -28
  383. package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +0 -49
  384. package/knowledge/decisions/internals/a-virtual-user-acts-through-invokeraw-so-a-refusal-is-data.md +0 -32
  385. package/knowledge/decisions/internals/a-virtual-user-cadence-is-a-row-not-a-timer.md +0 -66
  386. package/knowledge/decisions/internals/a-virtual-user-converse-signs-in-before-its-first-turn.md +0 -24
  387. package/knowledge/decisions/internals/a-virtual-user-decides-whether-to-trust-memory-once-per-turn.md +0 -21
  388. package/knowledge/decisions/internals/a-virtual-user-email-is-computed-with-the-run-id-as-a-sub-address.md +0 -34
  389. package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-but-it-needs-a-trigger.md +0 -65
  390. package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +0 -46
  391. package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +0 -45
  392. package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +0 -26
  393. package/knowledge/decisions/internals/addon-pikku-meta-ships-at-the-package-root-or-under-dist.md +0 -32
  394. package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +0 -33
  395. package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +0 -28
  396. package/knowledge/decisions/internals/agent-agui-bridge-obeys-the-client-ordering-contract.md +0 -29
  397. package/knowledge/decisions/internals/agent-audio-chunks-carry-the-format-the-provider-returned.md +0 -20
  398. package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md +0 -21
  399. package/knowledge/decisions/internals/agent-credential-suspensions-hide-the-tool-result.md +0 -26
  400. package/knowledge/decisions/internals/agent-delegate-and-supervise-hide-different-text.md +0 -26
  401. package/knowledge/decisions/internals/agent-llm-tool-arguments-have-nulls-stripped.md +0 -23
  402. package/knowledge/decisions/internals/agent-model-config-stays-a-single-resolution-seam.md +0 -25
  403. package/knowledge/decisions/internals/agent-onerror-hooks-cannot-change-the-failure.md +0 -22
  404. package/knowledge/decisions/internals/agent-runner-methods-must-keep-their-receiver.md +0 -22
  405. package/knowledge/decisions/internals/agent-speech-travels-as-a-custom-agui-event.md +0 -22
  406. package/knowledge/decisions/internals/agent-stream-persistence-is-best-effort.md +0 -27
  407. package/knowledge/decisions/internals/agent-sub-agents-inherit-the-parent-context-block.md +0 -26
  408. package/knowledge/decisions/internals/agent-tool-execute-failures-are-logged-unconditionally.md +0 -25
  409. package/knowledge/decisions/internals/agent-voice-input-transcribes-audio-parts-in-place.md +0 -22
  410. package/knowledge/decisions/internals/agent-working-memory-is-persisted-only-when-valid.md +0 -25
  411. package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +0 -39
  412. package/knowledge/decisions/internals/an-agent-interrupt-is-not-a-failure.md +0 -23
  413. package/knowledge/decisions/internals/an-agent-is-offered-under-its-registry-key-and-only-within-the-virtual-users-scopes.md +0 -27
  414. package/knowledge/decisions/internals/an-agent-run-owned-by-another-instance-says-so.md +0 -25
  415. package/knowledge/decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md +0 -22
  416. package/knowledge/decisions/internals/an-empty-text-part-is-omitted-from-an-agent-message.md +0 -20
  417. package/knowledge/decisions/internals/an-empty-transcript-is-not-recorded.md +0 -22
  418. package/knowledge/decisions/internals/an-oauth2-credential-implies-an-optional-app-secret.md +0 -26
  419. package/knowledge/decisions/internals/an-unref-d-timer-cannot-be-awaited-under-node-test.md +0 -66
  420. package/knowledge/decisions/internals/analytics-identity-resolvers-run-in-declared-order.md +0 -22
  421. package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +0 -30
  422. package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +0 -31
  423. package/knowledge/decisions/internals/channel-state-accessors-are-unsound-generics-that-every-implementation-asserts.md +0 -33
  424. package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +0 -29
  425. package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +0 -28
  426. package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +0 -27
  427. package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +0 -28
  428. package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +0 -34
  429. package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +0 -29
  430. package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +0 -84
  431. package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +0 -41
  432. package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +0 -44
  433. package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +0 -39
  434. package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +0 -42
  435. package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +0 -39
  436. package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +0 -43
  437. package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +0 -38
  438. package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +0 -44
  439. package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +0 -27
  440. package/knowledge/decisions/internals/feature-flag-declarations-refuse-an-empty-anyof-and-conflicting-scopes.md +0 -22
  441. package/knowledge/decisions/internals/feature-flags-fail-open-and-never-enforce-access.md +0 -28
  442. package/knowledge/decisions/internals/flag-sync-rewrites-only-the-declared-text.md +0 -24
  443. package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +0 -32
  444. package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +0 -43
  445. package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +0 -28
  446. package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +0 -31
  447. package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +0 -26
  448. package/knowledge/decisions/internals/global-middleware-resolves-from-the-root-namespace-too.md +0 -32
  449. package/knowledge/decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md +0 -38
  450. package/knowledge/decisions/internals/hot-reload-writes-into-the-function-map-captured-at-startup.md +0 -26
  451. package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +0 -32
  452. package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +0 -28
  453. package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +0 -30
  454. package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +0 -26
  455. package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +0 -28
  456. package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +0 -32
  457. package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +0 -26
  458. package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +0 -25
  459. package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +0 -26
  460. package/knowledge/decisions/internals/index.md +0 -181
  461. package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +0 -25
  462. package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +0 -26
  463. package/knowledge/decisions/internals/mcp-wire-names-are-assigned-over-the-whole-registry.md +0 -39
  464. package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +0 -24
  465. package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +0 -53
  466. package/knowledge/decisions/internals/only-exposed-functions-enter-a-virtual-user-catalogue.md +0 -21
  467. package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +0 -28
  468. package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +0 -27
  469. package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +0 -31
  470. package/knowledge/decisions/internals/role-names-cannot-contain-the-scope-separator.md +0 -30
  471. package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +0 -32
  472. package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +0 -31
  473. package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +0 -24
  474. package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +0 -26
  475. package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +0 -27
  476. package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +0 -48
  477. package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +0 -30
  478. package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +0 -28
  479. package/knowledge/decisions/internals/side-effects-are-an-allowlist-not-a-boolean.md +0 -34
  480. package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md +0 -24
  481. package/knowledge/decisions/internals/the-agent-done-event-goes-through-the-middleware-and-is-awaited.md +0 -26
  482. package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +0 -43
  483. package/knowledge/decisions/internals/the-core-scope-validator-refuses-separator-wildcard-and-empty-segments.md +0 -22
  484. package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +0 -30
  485. package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +0 -83
  486. package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +0 -29
  487. package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +0 -27
  488. package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +0 -40
  489. package/knowledge/decisions/internals/the-mcp-handshake-is-challenged-only-when-every-target-is-gated.md +0 -29
  490. package/knowledge/decisions/internals/the-middleware-resolution-cache-is-deliberately-unbounded.md +0 -40
  491. package/knowledge/decisions/internals/the-per-invocation-rpc-view-is-a-class.md +0 -40
  492. package/knowledge/decisions/internals/the-pikku-user-id-resolves-in-a-fixed-order.md +0 -24
  493. package/knowledge/decisions/internals/the-runner-resolves-wire-services-itself.md +0 -31
  494. package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +0 -26
  495. package/knowledge/decisions/internals/the-transcript-event-is-sent-ahead-of-the-run.md +0 -25
  496. package/knowledge/decisions/internals/the-virtual-user-catalogue-is-the-only-gate-on-what-may-be-called.md +0 -21
  497. package/knowledge/decisions/internals/the-virtual-user-prompt-says-json-because-of-json-object-mode.md +0 -22
  498. package/knowledge/decisions/internals/the-virtual-user-runtime-is-exported-from-the-virtual-user-entry-point.md +0 -28
  499. package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +0 -22
  500. package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +0 -25
  501. package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +0 -33
  502. package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +0 -26
  503. package/knowledge/decisions/internals/validate-checks-virtual-users-through-a-shared-module.md +0 -43
  504. package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +0 -115
  505. package/knowledge/decisions/internals/virtual-user-conversation-drives-the-target-through-a-transport-seam.md +0 -24
  506. package/knowledge/decisions/internals/virtual-user-conversation-verdicts-are-llm-self-evaluations.md +0 -25
  507. package/knowledge/decisions/internals/virtual-user-conversations-seed-a-hidden-kickoff-message.md +0 -23
  508. package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +0 -21
  509. package/knowledge/decisions/internals/virtual-users-are-declared-in-one-definevirtualusers-call-per-codebase.md +0 -30
  510. package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md +0 -24
  511. package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +0 -26
  512. package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +0 -25
  513. package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +0 -58
  514. package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +0 -35
  515. package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +0 -34
  516. package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +0 -42
  517. package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +0 -38
  518. package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +0 -29
  519. package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +0 -42
  520. package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +0 -25
  521. package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +0 -29
  522. package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +0 -43
  523. package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +0 -29
  524. package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +0 -42
  525. package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +0 -33
  526. package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +0 -32
  527. package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +0 -31
  528. package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +0 -39
  529. package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +0 -29
  530. package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +0 -33
  531. package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +0 -37
  532. package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +0 -54
  533. package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +0 -43
  534. package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +0 -32
  535. package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +0 -18
  536. package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +0 -34
  537. package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +0 -29
  538. package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +0 -33
  539. package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +0 -34
  540. package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +0 -34
  541. package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +0 -38
  542. package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +0 -30
  543. package/knowledge/decisions/security/a-bearer-token-checked-against-a-secret-reads-it-per-request.md +0 -26
  544. package/knowledge/decisions/security/a-call-without-a-session-raises-missing-session-not-forbidden.md +0 -20
  545. package/knowledge/decisions/security/a-caller-cookie-wins-over-the-jar-for-the-same-name.md +0 -23
  546. package/knowledge/decisions/security/a-channel-lifecycle-acts-as-the-socket-upgrade-session.md +0 -16
  547. package/knowledge/decisions/security/a-channel-requires-a-session-unless-it-says-auth-false.md +0 -26
  548. package/knowledge/decisions/security/a-credential-read-path-follows-its-declared-type-not-absence.md +0 -32
  549. package/knowledge/decisions/security/a-credential-type-is-a-literal-the-inspector-checks-at-declaration.md +0 -27
  550. package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +0 -28
  551. package/knowledge/decisions/security/a-first-party-cookie-is-written-only-after-its-purposes-consent.md +0 -33
  552. package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +0 -37
  553. package/knowledge/decisions/security/a-graph-run-starts-at-an-entry-node-the-graph-declared.md +0 -33
  554. package/knowledge/decisions/security/a-permission-gets-a-wire-it-cannot-reply-on.md +0 -33
  555. package/knowledge/decisions/security/a-public-function-says-so-with-auth-false.md +0 -34
  556. package/knowledge/decisions/security/a-readonly-session-reaches-only-readonly-functions.md +0 -25
  557. package/knowledge/decisions/security/a-scaffold-flag-says-a-surface-exists-not-who-may-call-it.md +0 -52
  558. package/knowledge/decisions/security/a-scheduled-virtual-user-run-needs-no-admin-at-run-time.md +0 -27
  559. package/knowledge/decisions/security/a-scoped-credential-view-is-limited-to-declared-names.md +0 -26
  560. package/knowledge/decisions/security/a-scoped-secret-view-reads-only-declared-keys-and-never-writes.md +0 -25
  561. package/knowledge/decisions/security/a-secret-is-sent-only-to-the-hosts-it-declares.md +0 -29
  562. package/knowledge/decisions/security/a-step-can-name-an-identity-no-virtual-user-holds-through-per-call-headers.md +0 -25
  563. package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +0 -37
  564. package/knowledge/decisions/security/a-stopped-run-by-id-skips-the-ownership-check.md +0 -24
  565. package/knowledge/decisions/security/a-vault-secret-redacts-on-serialization-and-throws-on-coercion.md +0 -29
  566. package/knowledge/decisions/security/a-virtual-user-catalogue-entry-is-filtered-by-scope-and-approval-is-denied-by-default.md +0 -30
  567. package/knowledge/decisions/security/a-virtual-user-environment-fails-closed.md +0 -38
  568. package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +0 -27
  569. package/knowledge/decisions/security/a-virtual-user-never-runs-against-production.md +0 -23
  570. package/knowledge/decisions/security/a-virtual-user-reads-its-roles-from-the-apps-own-rpc-before-better-auth.md +0 -27
  571. package/knowledge/decisions/security/a-virtual-user-run-treats-an-unresolved-environment-as-production.md +0 -41
  572. package/knowledge/decisions/security/a-virtual-user-scopes-are-expanded-from-its-roles-once-at-run-preparation.md +0 -25
  573. package/knowledge/decisions/security/a-virtual-user-whose-roles-drift-from-the-declaration-refuses-to-run.md +0 -32
  574. package/knowledge/decisions/security/a-workflow-run-is-read-and-approved-by-its-owner.md +0 -50
  575. package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +0 -43
  576. package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +0 -52
  577. package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +0 -46
  578. package/knowledge/decisions/security/addon-screen-scopes-hide-and-do-not-enforce.md +0 -20
  579. package/knowledge/decisions/security/agent-approval-forwarding-requires-a-symbol-brand.md +0 -27
  580. package/knowledge/decisions/security/agent-credential-requests-are-symbol-branded.md +0 -37
  581. package/knowledge/decisions/security/agent-gate-requires-a-session-only-when-auth-is-true.md +0 -31
  582. package/knowledge/decisions/security/agent-ownership-failures-never-echo-the-resource.md +0 -23
  583. package/knowledge/decisions/security/agent-resume-re-runs-the-authorization-gate.md +0 -22
  584. package/knowledge/decisions/security/agent-sessionless-deployments-have-no-thread-ownership.md +0 -39
  585. package/knowledge/decisions/security/agent-thread-ownership-composes-the-session-principal.md +0 -30
  586. package/knowledge/decisions/security/agent-tool-filtering-reads-the-live-function-config.md +0 -24
  587. package/knowledge/decisions/security/an-addon-header-can-only-narrow-the-session.md +0 -26
  588. package/knowledge/decisions/security/an-addon-instance-reads-only-the-secrets-and-credentials-it-is-named.md +0 -33
  589. package/knowledge/decisions/security/an-addon-may-reach-only-itself-and-the-addons-it-uses.md +0 -16
  590. package/knowledge/decisions/security/an-agent-approval-is-claimed-before-the-tool-runs.md +0 -33
  591. package/knowledge/decisions/security/an-api-key-is-jwt-decoded-into-the-session.md +0 -26
  592. package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +0 -59
  593. package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +0 -30
  594. package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +0 -52
  595. package/knowledge/decisions/security/an-external-virtual-user-caller-presents-one-signed-statement.md +0 -38
  596. package/knowledge/decisions/security/an-inbound-webhook-source-dispatches-only-verified-requests.md +0 -31
  597. package/knowledge/decisions/security/an-mcp-call-with-no-http-request-stays-anonymous.md +0 -18
  598. package/knowledge/decisions/security/an-mcp-refusal-is-decided-before-dispatch.md +0 -48
  599. package/knowledge/decisions/security/an-oauth2-credential-is-read-by-its-account-row.md +0 -40
  600. package/knowledge/decisions/security/an-omitted-user-id-addresses-the-platform-credential.md +0 -32
  601. package/knowledge/decisions/security/an-upload-is-counted-as-it-arrives-not-buffered-then-measured.md +0 -24
  602. package/knowledge/decisions/security/analytics-identity-is-stamped-from-the-session-not-the-event.md +0 -24
  603. package/knowledge/decisions/security/app-access-is-a-scope-tree-synthesised-from-virtual-users.md +0 -26
  604. package/knowledge/decisions/security/approval-policy-decides-who-answers-a-tool-call.md +0 -27
  605. package/knowledge/decisions/security/auth-false-on-a-session-function-warns-and-still-requires-one.md +0 -25
  606. package/knowledge/decisions/security/bearer-token-hashes-are-unpeppered-sha256.md +0 -18
  607. package/knowledge/decisions/security/consent-is-read-from-a-cookie-and-a-recognised-denial-counts-as-refusal.md +0 -29
  608. package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +0 -84
  609. package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +0 -39
  610. package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +0 -37
  611. package/knowledge/decisions/security/cors-defaults-to-any-origin-and-refuses-the-wildcard-with-credentials.md +0 -22
  612. package/knowledge/decisions/security/credential-backends-share-one-conformance-suite-for-per-user-isolation.md +0 -29
  613. package/knowledge/decisions/security/each-stage-has-one-virtual-user-key-pair.md +0 -27
  614. package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +0 -41
  615. package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +0 -30
  616. package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +0 -40
  617. package/knowledge/decisions/security/hmac-verification-fails-closed-on-empty-inputs.md +0 -25
  618. package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +0 -33
  619. package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +0 -46
  620. package/knowledge/decisions/security/index.md +0 -135
  621. package/knowledge/decisions/security/local-content-refuses-private-buckets-under-the-public-segment.md +0 -21
  622. package/knowledge/decisions/security/mail-is-allowlisted-before-a-virtual-user-run-sees-it.md +0 -38
  623. package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +0 -27
  624. package/knowledge/decisions/security/mcp-resources-tools-and-prompts-take-sessionless-functions.md +0 -18
  625. package/knowledge/decisions/security/origin-locked-routes-match-the-origin-exactly.md +0 -22
  626. package/knowledge/decisions/security/oss-auth-works-without-pikku-studio-cloud.md +0 -26
  627. package/knowledge/decisions/security/outbound-webhooks-use-an-allowlist-when-configured.md +0 -24
  628. package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +0 -40
  629. package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +0 -31
  630. package/knowledge/decisions/security/pikku-carries-virtual-user-scopes-as-data-and-the-app-grants-them.md +0 -35
  631. package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +0 -69
  632. package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +0 -39
  633. package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +0 -34
  634. package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +0 -55
  635. package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +0 -30
  636. package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +0 -28
  637. package/knowledge/decisions/security/scoped-content-access-is-a-root-folder-with-longest-prefix-grants.md +0 -31
  638. package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +0 -34
  639. package/knowledge/decisions/security/services-without-secrets-get-a-throwing-secrets-accessor.md +0 -22
  640. package/knowledge/decisions/security/shared-guards-refuse-to-mutate-or-shadow-a-system-role.md +0 -34
  641. package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +0 -37
  642. package/knowledge/decisions/security/signed-uploads-are-verified-by-the-same-check-as-signed-reads.md +0 -26
  643. package/knowledge/decisions/security/system-role-scopes-must-be-declared-with-define-scope.md +0 -24
  644. package/knowledge/decisions/security/system-roles-are-additive-and-immutable.md +0 -16
  645. package/knowledge/decisions/security/the-channel-rpc-does-not-send-the-callers-session.md +0 -21
  646. package/knowledge/decisions/security/the-remote-jobs-inbox-fails-closed-without-a-secret.md +0 -24
  647. package/knowledge/decisions/security/the-remote-rpc-gate-fails-closed-and-binds-the-token-to-its-function.md +0 -34
  648. package/knowledge/decisions/security/the-workflow-status-stream-rechecks-ownership-on-every-poll.md +0 -16
  649. package/knowledge/decisions/security/two-credentials-on-one-key-must-share-a-read-mode.md +0 -29
  650. package/knowledge/decisions/security/verified-bearer-claims-are-pass-through-data-that-core-never-fills.md +0 -23
  651. package/knowledge/decisions/security/virtual-user-catalogue-excludes-the-machinery-that-runs-virtual-users.md +0 -25
  652. package/knowledge/decisions/security/virtual-user-conversation-missing-approval-decisions-default-to-denied.md +0 -22
  653. package/knowledge/decisions/security/virtual-user-run-records-are-gated-behind-a-read-scope.md +0 -18
  654. package/knowledge/decisions/security/virtual-user-sign-in-does-not-exist-in-production.md +0 -25
  655. package/knowledge/decisions/security/virtual-user-sign-in-has-one-door.md +0 -42
  656. package/knowledge/decisions/security/virtual-user-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +0 -29
  657. package/knowledge/decisions/security/virtual-user-sign-in-only-works-for-virtual-user-flagged-users.md +0 -29
  658. package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +0 -25
  659. package/knowledge/decisions/security/wire-addon-expose-selects-the-rpc-surface.md +0 -51
  660. package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +0 -40
  661. package/knowledge/decisions/security/workflow-helper-functions-are-sessionless-by-declaration.md +0 -18
  662. package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +0 -32
  663. package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-virtual-user-and-per-scenario.md +0 -32
  664. package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +0 -31
  665. package/knowledge/decisions/security/workflow-virtual-user-steps-always-use-the-real-transport.md +0 -34
  666. package/knowledge/decisions/security/writing-a-virtual-user-schedule-is-gated-by-its-own-scope.md +0 -18
  667. package/knowledge/index.md +0 -24
  668. package/knowledge/questions/a-bearer-jwt-with-no-identity-becomes-a-session.md +0 -24
  669. package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +0 -35
  670. package/knowledge/questions/dev-quick-login-as-impersonation.md +0 -25
  671. package/knowledge/questions/does-a-delayed-rpc-run-as-the-session-it-was-scheduled-with.md +0 -26
  672. package/knowledge/questions/does-a-user-id-with-a-colon-read-another-users-credentials.md +0 -27
  673. package/knowledge/questions/does-a-wirecli-command-need-a-session-by-default.md +0 -26
  674. package/knowledge/questions/does-an-adversarial-in-scope-success-count-as-a-finding.md +0 -26
  675. package/knowledge/questions/does-approve-step-need-the-run-owners-session-or-the-gates-approvers.md +0 -34
  676. package/knowledge/questions/does-cors-origin-true-reflect-any-origin-with-credentials.md +0 -20
  677. package/knowledge/questions/does-skip-user-session-do-anything-on-a-channel.md +0 -24
  678. package/knowledge/questions/does-the-store-session-match-the-other-two.md +0 -19
  679. package/knowledge/questions/index.md +0 -41
  680. package/knowledge/questions/is-the-agent-score-worker-reachable-without-a-session.md +0 -21
  681. package/knowledge/questions/live-scheduled-tests-may-write.md +0 -19
  682. package/knowledge/questions/provision-virtual-users-has-no-caller-in-this-repo.md +0 -23
  683. package/knowledge/questions/remote-secret-refuses-requests-without-a-remote-token-on-every-path.md +0 -32
  684. package/knowledge/questions/should-a-middleware-set-session-persist-to-the-store.md +0 -25
  685. package/knowledge/questions/should-a-scoped-secret-view-throw-from-has-secret-for-a-disallowed-key.md +0 -23
  686. package/knowledge/questions/should-a-wrong-bearer-token-be-anonymous-or-refused.md +0 -35
  687. package/knowledge/questions/should-an-empty-webhook-signing-secret-send-unsigned.md +0 -23
  688. package/knowledge/questions/should-http-virtual-user-sessions-reset-between-scenarios-in-one-run.md +0 -27
  689. package/knowledge/questions/should-the-cookie-jar-scope-cookies-to-the-api-origin.md +0 -26
  690. package/knowledge/questions/should-voice-input-fetch-audio-urls-without-a-host-allowlist.md +0 -20
  691. package/knowledge/questions/staging-impersonation-rules.md +0 -27
  692. package/knowledge/questions/unauthorized-channel-replies-escape-the-declared-out-type.md +0 -44
  693. package/knowledge/questions/virtual-user-keys-on-cloud-stages-are-pikku-studios-to-build.md +0 -34
  694. package/knowledge/questions/virtual-user-statement-replay-is-per-process.md +0 -20
  695. package/knowledge/questions/what-an-impersonated-session-carries.md +0 -22
  696. package/run-tests.sh +0 -68
  697. package/scripts/generate-api-report.d.mts +0 -1
  698. package/scripts/generate-api-report.mjs +0 -96
  699. package/scripts/generate-api-report.mts +0 -333
  700. package/src/public-surface.json +0 -637
  701. package/src/public-surface.json.README +0 -43
  702. /package/dist/{function/compensation-name.d.ts → compensation-name.d.ts} +0 -0
  703. /package/dist/{function/compensation-name.js → compensation-name.js} +0 -0
@@ -8,18 +8,37 @@ class QueueWorkerNotFoundError extends PikkuError {
8
8
  super(`Queue processor not found: ${name}`);
9
9
  }
10
10
  }
11
+ /** Thrown by `queue.fail()` inside a worker. Queue adapters treat it as a failed attempt, so the backend's retry policy applies. */
11
12
  export class QueueJobFailedError extends PikkuError {
12
13
  constructor(jobId, reason) {
13
14
  super(`Queue job ${jobId} failed${reason ? `: ${reason}` : ''}`);
14
15
  this.name = 'QueueJobFailedError';
15
16
  }
16
17
  }
18
+ /** Thrown by `queue.discard()` inside a worker. Queue adapters treat it as the end of the job: it is not retried and is not reported as a failure. */
17
19
  export class QueueJobDiscardedError extends PikkuError {
18
20
  constructor(jobId, reason) {
19
21
  super(`Queue job ${jobId} discarded${reason ? `: ${reason}` : ''}`);
20
22
  this.name = 'QueueJobDiscardedError';
21
23
  }
22
24
  }
25
+ /**
26
+ * Registers the function that processes jobs on a queue.
27
+ *
28
+ * The worker's function is sessionless: a job has no request to authenticate.
29
+ * The only identity it sees is `queue.pikkuUserId` on its wire, which is set
30
+ * only when the producer's identity claim verifies against the
31
+ * `PIKKU_QUEUE_IDENTITY_SECRET` secret, and is dropped otherwise.
32
+ *
33
+ * Registration needs the metadata `pikku` generates for the queue. When none is
34
+ * found the wiring is skipped with a warning rather than throwing. A queue
35
+ * adapter (BullMQ, pg-boss, SQS, …) picks up registered workers through
36
+ * {@link registerQueueWorkers}.
37
+ *
38
+ * @param queueWorker - The queue name, the function to run per job, and optional worker config and middleware.
39
+ *
40
+ * @example snippet: wireQueue
41
+ */
23
42
  export const wireQueueWorker = (queueWorker) => {
24
43
  const meta = pikkuState(null, 'queue', 'meta');
25
44
  const processorMeta = meta[queueWorker.name];
@@ -37,9 +56,11 @@ export const wireQueueWorker = (queueWorker) => {
37
56
  const registrations = pikkuState(null, 'queue', 'registrations');
38
57
  registrations.set(queueWorker.name, queueWorker);
39
58
  };
59
+ /** Every registered queue worker, keyed by queue name. */
40
60
  export function getQueueWorkers() {
41
61
  return pikkuState(null, 'queue', 'registrations');
42
62
  }
63
+ /** Unregisters the worker for `name`. Throws when no worker is registered under it. */
43
64
  export async function removeQueueWorker(name) {
44
65
  const registrations = pikkuState(null, 'queue', 'registrations');
45
66
  const registration = registrations.get(name);
@@ -48,6 +69,22 @@ export async function removeQueueWorker(name) {
48
69
  }
49
70
  registrations.delete(name);
50
71
  }
72
+ /**
73
+ * Runs one job through the worker registered for its queue. Queue adapters call this for every job they receive.
74
+ *
75
+ * The job's `pikkuUserId` claim is verified before the function runs; an
76
+ * unsigned or invalid claim is logged and the job runs without one. The function
77
+ * runs with `auth: false`, the worker's middleware, and a `queue` wire carrying
78
+ * `updateProgress`, `fail` and `discard`.
79
+ *
80
+ * @param params.job - The job as the adapter received it.
81
+ * @param params.updateProgress - Reports progress to the backend; defaults to logging it.
82
+ * @param params.traceId - Defaults to `q-<jobId>`.
83
+ * @returns What the worker's function returned.
84
+ * @throws {PikkuMissingMetaError} When no metadata was generated for the queue.
85
+ * @throws {QueueJobFailedError | QueueJobDiscardedError} When the worker called `fail` or `discard`.
86
+ * @throws Whatever the worker threw, after logging it, so the adapter can apply its retry policy.
87
+ */
51
88
  export async function runQueueJob({ job, updateProgress, traceId, }) {
52
89
  const singletonServices = getSingletonServices();
53
90
  const createWireServices = getCreateWireServices();
@@ -2,6 +2,7 @@ import type { CommonWireMeta } from '../../types/core.types.js';
2
2
  import type { CorePikkuFunctionConfig } from '../../function/functions.types.js';
3
3
  import type { QueueConfigMapping } from './validate-worker-config.js';
4
4
  import type { Safe } from '../../classification/secret-value.js';
5
+ /** Worker settings a queue adapter maps onto its backend. Each adapter supports a subset, reported through its {@link QueueConfigMapping}; the rest are ignored with a warning. */
5
6
  export interface PikkuWorkerConfig {
6
7
  name?: string;
7
8
  /** Total worker concurrency. */
@@ -24,16 +25,19 @@ export interface PikkuWorkerConfig {
24
25
  /** Must not exceed {@link batchSize}. */
25
26
  groupConcurrency?: number | GroupConcurrencyConfig;
26
27
  }
28
+ /** Per-group concurrency limits for a worker, with optional tiers that override the default. */
27
29
  export interface GroupConcurrencyConfig {
28
30
  /** Limit applied to any group without a matching tier. */
29
31
  default: number;
30
32
  /** Keyed by {@link JobGroup.tier}. */
31
33
  tiers?: Record<string, number>;
32
34
  }
35
+ /** The group a job counts against for {@link PikkuWorkerConfig.groupConcurrency}, such as a tenant. */
33
36
  export interface JobGroup {
34
37
  id: string;
35
38
  tier?: string;
36
39
  }
40
+ /** Per-job delivery settings: retries, backoff, dead-lettering, priority and timing. */
37
41
  export interface PikkuJobConfig {
38
42
  retryAttempts?: number;
39
43
  /** Milliseconds. */
@@ -50,6 +54,7 @@ export interface PikkuJobConfig {
50
54
  /** Milliseconds. */
51
55
  delay?: number;
52
56
  }
57
+ /** What {@link validateWorkerConfig} did with a worker's config: the settings the adapter applied, those it ignored, and why. */
53
58
  export interface ConfigValidationResult {
54
59
  applied: Partial<PikkuWorkerConfig>;
55
60
  ignored: Partial<PikkuWorkerConfig>;
@@ -58,7 +63,9 @@ export interface ConfigValidationResult {
58
63
  [key: string]: any;
59
64
  };
60
65
  }
66
+ /** The lifecycle state of a queue job. */
61
67
  export type QueueJobStatus = 'waiting' | 'active' | 'completed' | 'failed' | 'delayed';
68
+ /** Bookkeeping a backend keeps about a job: progress, attempts and timestamps. */
62
69
  export type QueueJobMetadata = {
63
70
  progress?: number | string | object | undefined | boolean;
64
71
  attemptsMade?: number;
@@ -69,6 +76,12 @@ export type QueueJobMetadata = {
69
76
  error?: string;
70
77
  createdAt: Date;
71
78
  };
79
+ /**
80
+ * A job as handed to {@link runQueueJob}, or returned by {@link QueueService.getJob}.
81
+ *
82
+ * `pikkuUserId` here is the producer's signed claim, not a verified id;
83
+ * {@link runQueueJob} verifies it before the worker sees it.
84
+ */
72
85
  export interface QueueJob<T = any, R = any> {
73
86
  id: string;
74
87
  queueName: string;
@@ -79,6 +92,14 @@ export interface QueueJob<T = any, R = any> {
79
92
  metadata?: () => Promise<QueueJobMetadata> | QueueJobMetadata;
80
93
  pikkuUserId?: string;
81
94
  }
95
+ /**
96
+ * Options for {@link QueueService.add}.
97
+ *
98
+ * `pikkuUserId` names the user the job runs on behalf of. It only reaches the
99
+ * worker when the queue service is wrapped in `SignedQueueService`, which
100
+ * signs it with `PIKKU_QUEUE_IDENTITY_SECRET`; an unsigned value is dropped
101
+ * by {@link runQueueJob}.
102
+ */
82
103
  export interface JobOptions {
83
104
  priority?: number;
84
105
  delay?: number;
@@ -94,21 +115,55 @@ export interface JobOptions {
94
115
  /** Counts against the worker's {@link PikkuWorkerConfig.groupConcurrency}. */
95
116
  group?: JobGroup;
96
117
  }
118
+ export type QueueJobCounts = Record<QueueJobStatus, number>;
119
+ export type QueueJobRecord = {
120
+ jobId: string;
121
+ status: QueueJobStatus;
122
+ attemptsMade: number;
123
+ maxAttempts: number;
124
+ createdAt: Date;
125
+ processedAt: Date | null;
126
+ finishedAt: Date | null;
127
+ durationMs: number | null;
128
+ error: string | null;
129
+ };
130
+ export type QueueInspection = {
131
+ counts: QueueJobCounts;
132
+ /** Newest first. */
133
+ recent: QueueJobRecord[];
134
+ };
135
+ /**
136
+ * The service functions use to enqueue jobs, available as `queueService` on singleton services.
137
+ *
138
+ * `add` resolves to the job id. `data` must be {@link Safe}: a payload with a
139
+ * `SecretValue` anywhere in it fails to compile, so a secret is not written to
140
+ * the queue by accident. `getJob` returns `null` on backends that do not keep jobs
141
+ * (`supportsResults` is then `false`).
142
+ *
143
+ * @example snippet: queuePublish
144
+ */
97
145
  export interface QueueService {
98
146
  readonly supportsResults: boolean;
147
+ /** Live counts and recent jobs for one queue. Absent on a queue service that cannot inspect its backlog. */
148
+ inspect?(queueName: string, opts?: {
149
+ limit?: number;
150
+ }): Promise<QueueInspection>;
99
151
  add<T>(queueName: string, data: Safe<T>, options?: JobOptions): Promise<string>;
100
152
  getJob<T, R>(queueName: string, jobId: string): Promise<QueueJob<T, R> | null>;
101
153
  }
154
+ /** A queue adapter's worker side: it registers every wired queue worker with its backend and reports how each worker's config was applied. */
102
155
  export interface QueueWorkers {
103
156
  name: string;
104
157
  supportsResults: boolean;
105
158
  configMappings: QueueConfigMapping;
106
159
  registerQueues(): Promise<Record<string, ConfigValidationResult[]>>;
107
160
  }
161
+ /** Generated metadata for every wired queue worker, keyed by queue name. */
108
162
  export type QueueWorkersMeta = Record<string, CommonWireMeta & {
109
163
  name: string;
110
164
  config?: PikkuWorkerConfig;
111
165
  }>;
166
+ /** The configuration {@link wireQueueWorker} takes. An app's generated `wireQueueWorker` narrows the function type to its own services. */
112
167
  export type CoreQueueWorker<PikkuFunctionConfig extends CorePikkuFunctionConfig<any, any, any> = CorePikkuFunctionConfig<any, any, any>> = {
113
168
  /** The queue this worker consumes. Whoever enqueues a job names the same string, so it is the contract between producer and consumer. */
114
169
  name: string;
@@ -123,6 +178,7 @@ export type CoreQueueWorker<PikkuFunctionConfig extends CorePikkuFunctionConfig<
123
178
  /** Wraps every job. There is no request to read from, so this is for tracing, locking and teardown rather than auth. */
124
179
  middleware?: PikkuFunctionConfig['middleware'];
125
180
  };
181
+ /** The `queue` part of a worker function's wire: which job is running, the verified `pikkuUserId` of whoever enqueued it (if any), and controls to report progress, fail or discard it. */
126
182
  export interface PikkuQueue {
127
183
  queueName: string;
128
184
  jobId: string;
@@ -1,5 +1,17 @@
1
1
  import type { ConfigValidationResult, CoreQueueWorker } from './queue.types.js';
2
2
  import type { QueueConfigMapping } from './validate-worker-config.js';
3
3
  import type { Logger } from '../../services/logger.js';
4
+ /** Called by {@link registerQueueWorkers} once per wired worker, to attach it to the adapter's backend. */
4
5
  export type QueueRegistrationCallback<T = any> = (queueName: string, processor: CoreQueueWorker) => Promise<T>;
6
+ /**
7
+ * Validates every wired queue worker's config against an adapter's mapping and registers each one through `registerCallback`.
8
+ *
9
+ * A worker whose registration throws is logged and skipped, so one bad worker
10
+ * does not stop the rest.
11
+ *
12
+ * @param configMappings - Which {@link PikkuWorkerConfig} keys the adapter supports and how they map.
13
+ * @param logger - Receives registration progress, config warnings and failures.
14
+ * @param registerCallback - Attaches one worker to the backend.
15
+ * @returns The config validation result for each queue.
16
+ */
5
17
  export declare function registerQueueWorkers<T = any>(configMappings: QueueConfigMapping, logger: Logger, registerCallback: QueueRegistrationCallback<T>): Promise<Record<string, ConfigValidationResult[]>>;
@@ -1,5 +1,16 @@
1
1
  import { getQueueWorkers } from './queue-runner.js';
2
2
  import { validateWorkerConfig } from './validate-worker-config.js';
3
+ /**
4
+ * Validates every wired queue worker's config against an adapter's mapping and registers each one through `registerCallback`.
5
+ *
6
+ * A worker whose registration throws is logged and skipped, so one bad worker
7
+ * does not stop the rest.
8
+ *
9
+ * @param configMappings - Which {@link PikkuWorkerConfig} keys the adapter supports and how they map.
10
+ * @param logger - Receives registration progress, config warnings and failures.
11
+ * @param registerCallback - Attaches one worker to the backend.
12
+ * @returns The config validation result for each queue.
13
+ */
3
14
  export async function registerQueueWorkers(configMappings, logger, registerCallback) {
4
15
  const configValidation = {};
5
16
  const queueWorkers = getQueueWorkers();
@@ -0,0 +1,11 @@
1
+ import type { Logger } from '../../services/logger.js';
2
+ import type { RemoteQueueJobData } from '../../services/remote-jobs.js';
3
+ /**
4
+ * A dispatched job is delivered, not owned: the sender retries, so a permanent
5
+ * failure has to read differently from a transient one. An unknown worker or a
6
+ * discarded job answers 4xx so the sender stops; anything else propagates and
7
+ * is delivered again.
8
+ */
9
+ export declare function pikkuRemoteQueueJobFunc({ logger }: {
10
+ logger: Logger;
11
+ }, { queueName, data, jobId, traceId }: RemoteQueueJobData): Promise<void>;
@@ -0,0 +1,41 @@
1
+ import { BadRequestError, PikkuMissingMetaError } from '../../errors/errors.js';
2
+ import { QueueJobDiscardedError, runQueueJob } from './queue-runner.js';
3
+ /**
4
+ * A dispatched job is delivered, not owned: the sender retries, so a permanent
5
+ * failure has to read differently from a transient one. An unknown worker or a
6
+ * discarded job answers 4xx so the sender stops; anything else propagates and
7
+ * is delivered again.
8
+ */
9
+ export async function pikkuRemoteQueueJobFunc({ logger }, { queueName, data, jobId, traceId }) {
10
+ const job = {
11
+ queueName,
12
+ data,
13
+ id: jobId ?? traceId ?? `remote-${Date.now()}`,
14
+ status: async () => 'active',
15
+ metadata: () => ({
16
+ processedAt: new Date(),
17
+ attemptsMade: 0,
18
+ maxAttempts: undefined,
19
+ result: undefined,
20
+ progress: 0,
21
+ createdAt: new Date(),
22
+ completedAt: undefined,
23
+ failedAt: undefined,
24
+ error: undefined,
25
+ }),
26
+ waitForCompletion: async () => {
27
+ throw new Error('remote jobs do not support waitForCompletion');
28
+ },
29
+ };
30
+ try {
31
+ await runQueueJob({ job, traceId });
32
+ }
33
+ catch (error) {
34
+ if (error instanceof PikkuMissingMetaError ||
35
+ error instanceof QueueJobDiscardedError) {
36
+ throw new BadRequestError(error.message);
37
+ }
38
+ logger.error(`remote-jobs: queue '${queueName}' failed: ${error instanceof Error ? error.message : String(error)}`);
39
+ throw error;
40
+ }
41
+ }
@@ -1,7 +1,7 @@
1
1
  import type { Safe } from '../../classification/secret-value.js';
2
2
  import type { Logger } from '../../services/logger.js';
3
3
  import type { SecretService } from '../../services/secret-service.js';
4
- import type { JobOptions, QueueJob, QueueService } from './queue.types.js';
4
+ import type { JobOptions, QueueInspection, QueueJob, QueueService } from './queue.types.js';
5
5
  /**
6
6
  * Wraps any {@link QueueService} so `JobOptions.pikkuUserId` leaves the process
7
7
  * as a signed claim that `runQueueJob` can verify.
@@ -14,4 +14,7 @@ export declare class SignedQueueService implements QueueService {
14
14
  get supportsResults(): boolean;
15
15
  add<T>(queueName: string, data: Safe<T>, options?: JobOptions): Promise<string>;
16
16
  getJob<T, R>(queueName: string, jobId: string): Promise<QueueJob<T, R> | null>;
17
+ get inspect(): ((queueName: string, opts?: {
18
+ limit?: number;
19
+ }) => Promise<QueueInspection>) | undefined;
17
20
  }
@@ -39,4 +39,7 @@ export class SignedQueueService {
39
39
  async getJob(queueName, jobId) {
40
40
  return this.queueService.getJob(queueName, jobId);
41
41
  }
42
+ get inspect() {
43
+ return this.queueService.inspect?.bind(this.queueService);
44
+ }
42
45
  }
@@ -1,4 +1,5 @@
1
1
  import type { PikkuWorkerConfig, ConfigValidationResult } from './queue.types.js';
2
+ /** How a queue adapter supports {@link PikkuWorkerConfig}: the keys it maps (and to what), the keys it cannot honour, and the fallbacks it uses instead. */
2
3
  export interface QueueConfigMapping {
3
4
  supported: Partial<Record<keyof PikkuWorkerConfig, {
4
5
  queueProperty?: string;
@@ -25,6 +25,7 @@ export type CoreSystemRole = {
25
25
  * scope id is a role nobody reads correctly.
26
26
  */
27
27
  export type CoreSystemRoles = Record<string, CoreSystemRole>;
28
+ /** A system role declaration as recorded in generated meta. */
28
29
  export type SystemRoleDefinitionMeta = {
29
30
  name: string;
30
31
  displayName?: string;
@@ -32,7 +33,9 @@ export type SystemRoleDefinitionMeta = {
32
33
  scopes: string[];
33
34
  sourceFile?: string;
34
35
  };
36
+ /** System role declarations as the inspector found them. */
35
37
  export type SystemRoleDefinitions = SystemRoleDefinitionMeta[];
38
+ /** System role declarations collected by the CLI, keyed by name. */
36
39
  export type SystemRoleDefinitionsMeta = Record<string, SystemRoleDefinitionMeta>;
37
40
  /** A declared system role, ready to sync into a scope store. */
38
41
  export type SystemRole = {
@@ -3,13 +3,21 @@ import type { SessionService } from '../../services/user-session-service.js';
3
3
  import type { CoreUserSession } from '../../types/core.types.js';
4
4
  import { PikkuError } from '../../errors/error-handler.js';
5
5
  import type { PikkuRPC, ResolvedFunction } from './rpc-types.js';
6
+ /**
7
+ * Thrown when an RPC name resolves to no function, or to one that `rpc.exposed` may not call. Maps to HTTP 404 and MCP `-32601`.
8
+ *
9
+ * An unexposed function is reported as not found rather than forbidden, so the
10
+ * response does not reveal whether an internal function by that name exists.
11
+ */
6
12
  export declare class RPCNotFoundError extends PikkuError {
7
13
  readonly rpcName: string;
8
14
  constructor(rpcName: string);
9
15
  }
16
+ /** Thrown when a remote addon's configuration cannot be used, for example when its `serverUrl` resolves empty. Maps to HTTP 500. */
10
17
  export declare class RemoteAddonConfigError extends PikkuError {
11
18
  constructor(namespace: string, detail: string);
12
19
  }
20
+ /** Thrown when a remote addon answers an RPC with a non-2xx status. Maps to HTTP 502; the upstream status is kept on `httpStatus` and the first 300 characters of its body in the message. */
13
21
  export declare class RemoteAddonRequestError extends PikkuError {
14
22
  readonly httpStatus: number;
15
23
  constructor(namespace: string, fnName: string, status: number, detail: string);
@@ -66,12 +74,28 @@ export declare class ContextAwareRPCService {
66
74
  get agent(): PikkuRPC['agent'];
67
75
  remote<In = any, Out = any>(funcName: string, data: In): Promise<Out>;
68
76
  }
77
+ /**
78
+ * Builds the `rpc` object handed to every function on its wire.
79
+ *
80
+ * `rpc.invoke(name, data)` calls another function in-process, or through the
81
+ * `DeploymentService` when the function lives in another deployment unit.
82
+ * `rpc.exposed` does the same but only reaches functions marked `expose: true`
83
+ * (and, for addons, those the consuming app exposes), which is what the public
84
+ * RPC endpoint uses. `rpc.remote` always goes through the `DeploymentService`.
85
+ * Calls carry the caller's wire, so the session and trace ID propagate. An addon
86
+ * can only call the addons it lists in `uses`.
87
+ *
88
+ * Runtimes create this through {@link rpcService}; apps reach it as `rpc` on the wire.
89
+ *
90
+ * @example snippet: rpcInternalCall
91
+ */
69
92
  export declare class PikkuRPCService<Services extends CoreServices, TypedRPC = PikkuRPC> {
70
93
  getContextRPCService(services: Services, wire: PikkuRawWire, requiresAuthOrOptions?: boolean | {
71
94
  requiresAuth?: boolean;
72
95
  sessionService?: SessionService<CoreUserSession>;
73
96
  } | undefined, depth?: number, packageName?: string | null): TypedRPC;
74
97
  }
98
+ /** The shared {@link PikkuRPCService}. Function runners call `getContextRPCService` on it to give each invocation its own `rpc`. */
75
99
  export declare const rpcService: PikkuRPCService<import("../../types/core.types.js").CoreSingletonServices<{
76
100
  logLevel?: import("../../services/logger.js").LogLevel;
77
101
  secrets?: {
@@ -1,17 +1,34 @@
1
1
  import { addonCallerOf, addonMayReach } from '../addon/addon-reach.js';
2
- import { forwardStepName, isCompensationStepName, } from '../../function/compensation-name.js';
3
- import { runPikkuFunc } from '../../function/function-runner.js';
2
+ import { forwardStepName, isCompensationStepName, } from '../../compensation-name.js';
4
3
  import { addonInstanceForNamespace } from '../addon/addon-runner.js';
5
4
  import { isAddonFunctionExposed } from '../addon/wire-addon.js';
6
5
  import { pikkuState } from '../../pikku-state.js';
7
6
  import { PikkuError, addError } from '../../errors/error-handler.js';
8
7
  import { parseVersionedId } from '../../version.js';
9
8
  import { resolveRemoteAddonToken } from '../addon/remote-addon-auth.js';
9
+ /**
10
+ * The function runner, reached lazily. `function-runner` builds every
11
+ * invocation's `wire.rpc` from this module, so a static import back would be a
12
+ * module cycle. By the time an rpc call runs the runner is loaded, and the
13
+ * import resolves from the module cache once.
14
+ */
15
+ let functionRunner;
16
+ const runPikkuFunc = async (...args) => {
17
+ functionRunner ??= (await import('../../function/function-runner.js'))
18
+ .runPikkuFunc;
19
+ return functionRunner(...args);
20
+ };
10
21
  /**
11
22
  * The session for a wire: read through `getSession` when a runner attached one,
12
23
  * otherwise whatever was placed on the wire directly.
13
24
  */
14
25
  const resolveWireSession = async (wire) => typeof wire.getSession === 'function' ? await wire.getSession() : wire.session;
26
+ /**
27
+ * Thrown when an RPC name resolves to no function, or to one that `rpc.exposed` may not call. Maps to HTTP 404 and MCP `-32601`.
28
+ *
29
+ * An unexposed function is reported as not found rather than forbidden, so the
30
+ * response does not reveal whether an internal function by that name exists.
31
+ */
15
32
  export class RPCNotFoundError extends PikkuError {
16
33
  rpcName;
17
34
  constructor(rpcName) {
@@ -24,6 +41,7 @@ addError(RPCNotFoundError, {
24
41
  mcpCode: -32601,
25
42
  message: 'RPC function not found.',
26
43
  });
44
+ /** Thrown when a remote addon's configuration cannot be used, for example when its `serverUrl` resolves empty. Maps to HTTP 500. */
27
45
  export class RemoteAddonConfigError extends PikkuError {
28
46
  constructor(namespace, detail) {
29
47
  super(`Remote addon '${namespace}' is misconfigured: ${detail}`);
@@ -33,6 +51,7 @@ addError(RemoteAddonConfigError, {
33
51
  status: 500,
34
52
  message: 'Remote addon is misconfigured.',
35
53
  });
54
+ /** Thrown when a remote addon answers an RPC with a non-2xx status. Maps to HTTP 502; the upstream status is kept on `httpStatus` and the first 300 characters of its body in the message. */
36
55
  export class RemoteAddonRequestError extends PikkuError {
37
56
  httpStatus;
38
57
  constructor(namespace, fnName, status, detail) {
@@ -411,6 +430,21 @@ export class ContextAwareRPCService {
411
430
  return this.services.deploymentService.invoke(funcName, data, session, this.wire.traceId);
412
431
  }
413
432
  }
433
+ /**
434
+ * Builds the `rpc` object handed to every function on its wire.
435
+ *
436
+ * `rpc.invoke(name, data)` calls another function in-process, or through the
437
+ * `DeploymentService` when the function lives in another deployment unit.
438
+ * `rpc.exposed` does the same but only reaches functions marked `expose: true`
439
+ * (and, for addons, those the consuming app exposes), which is what the public
440
+ * RPC endpoint uses. `rpc.remote` always goes through the `DeploymentService`.
441
+ * Calls carry the caller's wire, so the session and trace ID propagate. An addon
442
+ * can only call the addons it lists in `uses`.
443
+ *
444
+ * Runtimes create this through {@link rpcService}; apps reach it as `rpc` on the wire.
445
+ *
446
+ * @example snippet: rpcInternalCall
447
+ */
414
448
  export class PikkuRPCService {
415
449
  getContextRPCService(services, wire, requiresAuthOrOptions, depth = 0, packageName = null) {
416
450
  const options = typeof requiresAuthOrOptions === 'object' &&
@@ -456,4 +490,5 @@ class ContextRPCView {
456
490
  return this.serviceRPC.agent;
457
491
  }
458
492
  }
493
+ /** The shared {@link PikkuRPCService}. Function runners call `getContextRPCService` on it to give each invocation its own `rpc`. */
459
494
  export const rpcService = new PikkuRPCService();
@@ -1,6 +1,7 @@
1
1
  import type { CredentialOverrides } from '../credential/credential-overrides.js';
2
2
  import type { PikkuRawWire } from '../../types/core.types.js';
3
3
  import type { AgentInterruptResult } from '../agent/agent-interrupt.js';
4
+ /** The `rpc` object on a function's wire. An app's generated types narrow `invoke`, `remote`, `startWorkflow` and `agent` to its own functions, workflows and agents; see {@link PikkuRPCService} for how each call is routed. */
4
5
  export type PikkuRPC<Invoke extends (...args: any[]) => any = (...args: any[]) => any, Remote extends (...args: any[]) => any = (...args: any[]) => any, startWorkflow extends (...args: any[]) => any = (...args: any[]) => any, AgentRun extends (...args: any[]) => any = (...args: any[]) => any, AgentStream extends (...args: any[]) => any = (...args: any[]) => any> = {
5
6
  depth: number;
6
7
  global: boolean;
@@ -29,6 +30,7 @@ export type PikkuRPC<Invoke extends (...args: any[]) => any = (...args: any[]) =
29
30
  interrupt: (runId: string, reason?: 'speech' | 'user' | 'timeout') => Promise<AgentInterruptResult>;
30
31
  };
31
32
  };
33
+ /** Generated metadata for one RPC name: the function it resolves to, whether `rpc.exposed` may call it, and whether it is reachable remotely. */
32
34
  export type RPCMeta = {
33
35
  pikkuFuncId: string;
34
36
  expose: boolean;
@@ -1,3 +1,4 @@
1
1
  export { ScheduledTaskNotFoundError, runScheduledTask, wireScheduler, getScheduledTasks, } from './scheduler-runner.js';
2
2
  export { logSchedulers } from './log-schedulers.js';
3
- export type { CoreScheduledTask, ScheduledTasksMeta, } from './scheduler.types.js';
3
+ export type { CoreScheduledTask, ScheduledTasksMeta, ScheduledTaskRun, ScheduledTaskRuns, } from './scheduler.types.js';
4
+ export { pikkuRemoteScheduledJobFunc } from './remote-scheduled-job.js';
@@ -1,2 +1,3 @@
1
1
  export { ScheduledTaskNotFoundError, runScheduledTask, wireScheduler, getScheduledTasks, } from './scheduler-runner.js';
2
2
  export { logSchedulers } from './log-schedulers.js';
3
+ export { pikkuRemoteScheduledJobFunc } from './remote-scheduled-job.js';
@@ -1,2 +1,3 @@
1
1
  import type { Logger } from '../../services/index.js';
2
+ /** Logs every wired scheduled task and its schedule at info level, typically once at startup. */
2
3
  export declare const logSchedulers: (logger: Logger) => void;
@@ -1,4 +1,5 @@
1
1
  import { pikkuState } from '../../pikku-state.js';
2
+ /** Logs every wired scheduled task and its schedule at info level, typically once at startup. */
2
3
  export const logSchedulers = (logger) => {
3
4
  const scheduledTasks = pikkuState(null, 'scheduler', 'tasks');
4
5
  if (scheduledTasks.size === 0) {
@@ -0,0 +1,11 @@
1
+ import type { Logger } from '../../services/logger.js';
2
+ import type { RemoteScheduledJobData } from '../../services/remote-jobs.js';
3
+ /**
4
+ * Runs a scheduled task on behalf of a remote job runner, so a task can be triggered in a deployment unit other than the one that scheduled it.
5
+ * Generated remote-job wiring calls this; apps do not call it directly.
6
+ *
7
+ * @throws {BadRequestError} When the named task is not wired in this unit.
8
+ */
9
+ export declare function pikkuRemoteScheduledJobFunc({ logger }: {
10
+ logger: Logger;
11
+ }, { taskName }: RemoteScheduledJobData): Promise<void>;
@@ -0,0 +1,20 @@
1
+ import { BadRequestError } from '../../errors/errors.js';
2
+ import { ScheduledTaskNotFoundError, runScheduledTask, } from './scheduler-runner.js';
3
+ /**
4
+ * Runs a scheduled task on behalf of a remote job runner, so a task can be triggered in a deployment unit other than the one that scheduled it.
5
+ * Generated remote-job wiring calls this; apps do not call it directly.
6
+ *
7
+ * @throws {BadRequestError} When the named task is not wired in this unit.
8
+ */
9
+ export async function pikkuRemoteScheduledJobFunc({ logger }, { taskName }) {
10
+ try {
11
+ await runScheduledTask({ name: taskName, traceId: `cron-${taskName}` });
12
+ }
13
+ catch (error) {
14
+ if (error instanceof ScheduledTaskNotFoundError) {
15
+ throw new BadRequestError(error.message);
16
+ }
17
+ logger.error(`remote-jobs: task '${taskName}' failed: ${error instanceof Error ? error.message : String(error)}`);
18
+ throw error;
19
+ }
20
+ }
@@ -2,14 +2,43 @@ import type { CoreUserSession } from '../../types/core.types.js';
2
2
  import type { CoreScheduledTask } from './scheduler.types.js';
3
3
  import { PikkuError } from '../../errors/error-handler.js';
4
4
  import type { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
5
+ /** Parameters for {@link runScheduledTask}: the task's name, an optional session to run it with, and an optional trace ID. */
5
6
  export type RunScheduledTasksParams = {
6
7
  name: string;
7
8
  session?: CoreUserSession;
8
9
  traceId?: string;
9
10
  };
11
+ /**
12
+ * Registers a sessionless function to run on a cron schedule.
13
+ *
14
+ * The task only runs once a scheduler service (or a platform cron trigger
15
+ * calling {@link runScheduledTask}) drives it; wiring alone schedules nothing.
16
+ * The function receives no input, and can call `scheduledTask.skip()` on its
17
+ * wire to end the run early.
18
+ *
19
+ * Registration needs the metadata `pikku` generates for the task. When none is
20
+ * found the wiring is skipped with a warning rather than throwing.
21
+ *
22
+ * @param scheduledTask - The task's unique name, cron `schedule`, function, and optional middleware.
23
+ * @throws {Error} When a task with the same name is already wired.
24
+ *
25
+ * @example snippet: wireScheduler
26
+ */
10
27
  export declare const wireScheduler: <PikkuFunctionConfig extends CorePikkuFunctionConfig<CorePikkuFunctionSessionless<void, void>>>(scheduledTask: CoreScheduledTask<PikkuFunctionConfig>) => void;
28
+ /** Thrown by {@link runScheduledTask} when no task, or no generated metadata, exists for the requested name. */
11
29
  export declare class ScheduledTaskNotFoundError extends PikkuError {
12
30
  constructor(title: string);
13
31
  }
32
+ /**
33
+ * Runs one wired scheduled task now. Scheduler services and platform cron handlers call this on each tick.
34
+ *
35
+ * When `session` is given it is placed on the wire, so the function and its
36
+ * middleware see that user; otherwise the task runs without one.
37
+ *
38
+ * @param params - See {@link RunScheduledTasksParams}. `traceId` defaults to `cron-<name>-<timestamp>`.
39
+ * @throws {ScheduledTaskNotFoundError} When the task or its metadata is missing.
40
+ * @throws The error the function threw, including the one `scheduledTask.skip()` raises, so the caller can tell a skip from a failure.
41
+ */
14
42
  export declare function runScheduledTask({ name, session, traceId, }: RunScheduledTasksParams): Promise<void>;
43
+ /** Every wired scheduled task, keyed by name. Scheduler services read this to know what to schedule. */
15
44
  export declare const getScheduledTasks: () => Map<string, CoreScheduledTask>;