@pikku/core 0.12.143 → 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 (700) 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 +9 -1
  77. package/dist/services/incoming-webhook-service.js +1 -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 +13 -0
  105. package/dist/services/scheduler-service.js +8 -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/{services → wirings/queue}/in-memory-queue-service.d.ts +9 -1
  255. package/dist/{services → wirings/queue}/in-memory-queue-service.js +9 -1
  256. package/dist/wirings/queue/index.d.ts +1 -0
  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 +35 -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/validate-worker-config.d.ts +1 -0
  267. package/dist/wirings/role/role.types.d.ts +3 -0
  268. package/dist/wirings/rpc/rpc-runner.d.ts +24 -0
  269. package/dist/wirings/rpc/rpc-runner.js +37 -2
  270. package/dist/wirings/rpc/rpc-types.d.ts +2 -0
  271. package/dist/wirings/scheduler/index.d.ts +1 -0
  272. package/dist/wirings/scheduler/index.js +1 -0
  273. package/dist/wirings/scheduler/log-schedulers.d.ts +1 -0
  274. package/dist/wirings/scheduler/log-schedulers.js +1 -0
  275. package/dist/wirings/scheduler/remote-scheduled-job.d.ts +11 -0
  276. package/dist/wirings/scheduler/remote-scheduled-job.js +20 -0
  277. package/dist/wirings/scheduler/scheduler-runner.d.ts +29 -0
  278. package/dist/wirings/scheduler/scheduler-runner.js +28 -0
  279. package/dist/wirings/scheduler/scheduler.types.d.ts +3 -0
  280. package/dist/wirings/scope/scope.types.d.ts +5 -0
  281. package/dist/wirings/secret/index.d.ts +2 -2
  282. package/dist/wirings/secret/index.js +1 -1
  283. package/dist/wirings/secret/secret.types.d.ts +26 -1
  284. package/dist/wirings/secret/secret.types.js +1 -0
  285. package/dist/wirings/secret/validate-secret-definitions.d.ts +8 -0
  286. package/dist/wirings/secret/validate-secret-definitions.js +15 -0
  287. package/dist/wirings/trigger/in-memory-trigger-service.d.ts +11 -0
  288. package/dist/{services → wirings/trigger}/in-memory-trigger-service.js +10 -3
  289. package/dist/wirings/trigger/index.d.ts +1 -1
  290. package/dist/wirings/trigger/pikku-trigger-service.d.ts +8 -3
  291. package/dist/wirings/trigger/pikku-trigger-service.js +14 -3
  292. package/dist/wirings/trigger/trigger-runner.d.ts +27 -2
  293. package/dist/wirings/trigger/trigger-runner.js +35 -2
  294. package/dist/wirings/trigger/trigger.types.d.ts +26 -4
  295. package/dist/wirings/trigger/webhook-source-runner.d.ts +24 -0
  296. package/dist/wirings/trigger/webhook-source-runner.js +19 -0
  297. package/dist/wirings/trigger/webhook-source.types.d.ts +12 -2
  298. package/dist/wirings/trigger/webhook-source.types.js +1 -1
  299. package/dist/wirings/variable/validate-variable-definitions.d.ts +7 -0
  300. package/dist/wirings/variable/validate-variable-definitions.js +7 -0
  301. package/dist/wirings/variable/variable.types.d.ts +7 -0
  302. package/dist/wirings/virtual-user/conversation/conversation.types.d.ts +5 -0
  303. package/dist/wirings/virtual-user/conversation/run-conversation.d.ts +6 -0
  304. package/dist/wirings/virtual-user/conversation/run-conversation.js +1 -1
  305. package/dist/{services → wirings/virtual-user}/http-virtual-users.d.ts +4 -3
  306. package/dist/{services → wirings/virtual-user}/http-virtual-users.js +6 -6
  307. package/dist/wirings/virtual-user/index.d.ts +1 -1
  308. package/dist/wirings/virtual-user/index.js +1 -1
  309. package/dist/wirings/virtual-user/run-virtual-user.d.ts +2 -1
  310. package/dist/wirings/virtual-user/run-virtual-user.js +1 -14
  311. package/dist/wirings/virtual-user/virtual-user-declaration.types.d.ts +4 -0
  312. package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +10 -1
  313. package/dist/wirings/virtual-user/virtual-user-scaffold.js +5 -0
  314. package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +5 -0
  315. package/dist/wirings/virtual-user/virtual-user-schedule.js +1 -0
  316. package/dist/wirings/virtual-user/virtual-user-target.d.ts +1 -0
  317. package/dist/wirings/webhook/define-outgoing-webhook.d.ts +20 -0
  318. package/dist/wirings/webhook/define-outgoing-webhook.js +9 -0
  319. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +8 -4
  320. package/dist/wirings/workflow/dsl/workflow-runner.d.ts +7 -0
  321. package/dist/wirings/workflow/dsl/workflow-runner.js +7 -0
  322. package/dist/wirings/workflow/feature.d.ts +12 -0
  323. package/dist/wirings/workflow/feature.js +12 -0
  324. package/dist/wirings/workflow/graph/graph-node.d.ts +5 -0
  325. package/dist/wirings/workflow/graph/graph-node.js +5 -0
  326. package/dist/wirings/workflow/graph/template.d.ts +6 -0
  327. package/dist/wirings/workflow/graph/template.js +5 -0
  328. package/dist/wirings/workflow/graph/wire-workflow-graph.d.ts +12 -0
  329. package/dist/wirings/workflow/graph/wire-workflow-graph.js +10 -0
  330. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +11 -0
  331. package/dist/wirings/workflow/graph/workflow-graph.types.js +1 -0
  332. package/dist/{services → wirings/workflow}/in-memory-workflow-service.d.ts +8 -3
  333. package/dist/{services → wirings/workflow}/in-memory-workflow-service.js +9 -4
  334. package/dist/wirings/workflow/pikku-scenario-service.d.ts +1 -1
  335. package/dist/wirings/workflow/pikku-scenario-service.js +2 -2
  336. package/dist/wirings/workflow/pikku-workflow-service.d.ts +1 -0
  337. package/dist/wirings/workflow/pikku-workflow-service.js +1 -0
  338. package/dist/wirings/workflow/run-timeline.d.ts +21 -0
  339. package/dist/wirings/workflow/run-timeline.js +15 -7
  340. package/dist/wirings/workflow/scenario-coverage.d.ts +1 -0
  341. package/dist/wirings/workflow/scenario-poll.d.ts +1 -0
  342. package/dist/wirings/workflow/scenario-prose.d.ts +6 -0
  343. package/dist/wirings/workflow/scenario-prose.js +6 -0
  344. package/dist/wirings/workflow/scenario-run.types.d.ts +3 -0
  345. package/dist/wirings/workflow/scenario-step.types.d.ts +1 -0
  346. package/dist/wirings/workflow/scenario-step.types.js +1 -0
  347. package/dist/wirings/workflow/scenario-surface.js +1 -13
  348. package/dist/wirings/workflow/scenario.types.d.ts +6 -0
  349. package/dist/wirings/workflow/workflow-approval-policy.d.ts +6 -0
  350. package/dist/wirings/workflow/workflow-approval-policy.js +6 -0
  351. package/dist/wirings/workflow/workflow-constants.d.ts +7 -1
  352. package/dist/wirings/workflow/workflow-constants.js +10 -1
  353. package/dist/wirings/workflow/workflow-errors.d.ts +13 -0
  354. package/dist/wirings/workflow/workflow-errors.js +13 -0
  355. package/dist/wirings/workflow/workflow-invocation-id.d.ts +4 -0
  356. package/dist/wirings/workflow/workflow-invocation-id.js +4 -0
  357. package/dist/wirings/workflow/workflow-queue-workers.d.ts +3 -0
  358. package/dist/wirings/workflow/workflow-run-ownership.d.ts +1 -0
  359. package/dist/wirings/workflow/workflow-run-ownership.js +1 -0
  360. package/dist/wirings/workflow/workflow-status-stream.d.ts +1 -0
  361. package/dist/wirings/workflow/workflow-unwind-plan.js +2 -7
  362. package/dist/wirings/workflow/workflow.types.d.ts +40 -0
  363. package/package.json +26 -9
  364. package/CHANGELOG.md +0 -6978
  365. package/dist/services/in-memory-trigger-service.d.ts +0 -4
  366. package/dist/services/local-gateway-service.d.ts +0 -6
  367. package/dist/utils/hash.d.ts +0 -2
  368. package/dist/utils/hash.js +0 -23
  369. package/knowledge/decisions/index.md +0 -19
  370. package/knowledge/decisions/internals/a-credential-name-declared-twice-must-agree-on-schema-and-type.md +0 -29
  371. package/knowledge/decisions/internals/a-grant-can-name-a-scope-declared-without-its-addon.md +0 -29
  372. package/knowledge/decisions/internals/a-held-run-is-woken-later-not-retried.md +0 -28
  373. package/knowledge/decisions/internals/a-latency-budget-is-asserted-by-its-cause.md +0 -32
  374. package/knowledge/decisions/internals/a-non-streaming-agent-run-registers-with-agentrunstate-too.md +0 -22
  375. package/knowledge/decisions/internals/a-reset-suite-makes-the-dev-seed-the-fixture.md +0 -50
  376. package/knowledge/decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md +0 -20
  377. package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +0 -21
  378. package/knowledge/decisions/internals/a-scheduled-task-writes-its-caller-session-before-it-runs.md +0 -22
  379. package/knowledge/decisions/internals/a-secret-set-in-memory-shadows-the-variable-of-the-same-name.md +0 -28
  380. package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +0 -49
  381. package/knowledge/decisions/internals/a-virtual-user-acts-through-invokeraw-so-a-refusal-is-data.md +0 -32
  382. package/knowledge/decisions/internals/a-virtual-user-cadence-is-a-row-not-a-timer.md +0 -66
  383. package/knowledge/decisions/internals/a-virtual-user-converse-signs-in-before-its-first-turn.md +0 -24
  384. package/knowledge/decisions/internals/a-virtual-user-decides-whether-to-trust-memory-once-per-turn.md +0 -21
  385. package/knowledge/decisions/internals/a-virtual-user-email-is-computed-with-the-run-id-as-a-sub-address.md +0 -34
  386. package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-but-it-needs-a-trigger.md +0 -65
  387. package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +0 -49
  388. package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +0 -45
  389. package/knowledge/decisions/internals/addon-package-roots-resolve-by-walking-node-module-search-paths.md +0 -26
  390. package/knowledge/decisions/internals/addon-pikku-meta-ships-at-the-package-root-or-under-dist.md +0 -32
  391. package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +0 -33
  392. package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +0 -28
  393. package/knowledge/decisions/internals/agent-agui-bridge-obeys-the-client-ordering-contract.md +0 -29
  394. package/knowledge/decisions/internals/agent-audio-chunks-carry-the-format-the-provider-returned.md +0 -20
  395. package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md +0 -21
  396. package/knowledge/decisions/internals/agent-credential-suspensions-hide-the-tool-result.md +0 -26
  397. package/knowledge/decisions/internals/agent-delegate-and-supervise-hide-different-text.md +0 -26
  398. package/knowledge/decisions/internals/agent-llm-tool-arguments-have-nulls-stripped.md +0 -23
  399. package/knowledge/decisions/internals/agent-model-config-stays-a-single-resolution-seam.md +0 -25
  400. package/knowledge/decisions/internals/agent-onerror-hooks-cannot-change-the-failure.md +0 -22
  401. package/knowledge/decisions/internals/agent-runner-methods-must-keep-their-receiver.md +0 -22
  402. package/knowledge/decisions/internals/agent-speech-travels-as-a-custom-agui-event.md +0 -22
  403. package/knowledge/decisions/internals/agent-stream-persistence-is-best-effort.md +0 -27
  404. package/knowledge/decisions/internals/agent-sub-agents-inherit-the-parent-context-block.md +0 -26
  405. package/knowledge/decisions/internals/agent-tool-execute-failures-are-logged-unconditionally.md +0 -25
  406. package/knowledge/decisions/internals/agent-voice-input-transcribes-audio-parts-in-place.md +0 -22
  407. package/knowledge/decisions/internals/agent-working-memory-is-persisted-only-when-valid.md +0 -25
  408. package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +0 -39
  409. package/knowledge/decisions/internals/an-agent-interrupt-is-not-a-failure.md +0 -23
  410. package/knowledge/decisions/internals/an-agent-is-offered-under-its-registry-key-and-only-within-the-virtual-users-scopes.md +0 -27
  411. package/knowledge/decisions/internals/an-agent-run-owned-by-another-instance-says-so.md +0 -25
  412. package/knowledge/decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md +0 -22
  413. package/knowledge/decisions/internals/an-empty-text-part-is-omitted-from-an-agent-message.md +0 -20
  414. package/knowledge/decisions/internals/an-empty-transcript-is-not-recorded.md +0 -22
  415. package/knowledge/decisions/internals/an-oauth2-credential-implies-an-optional-app-secret.md +0 -26
  416. package/knowledge/decisions/internals/an-unref-d-timer-cannot-be-awaited-under-node-test.md +0 -66
  417. package/knowledge/decisions/internals/analytics-identity-resolvers-run-in-declared-order.md +0 -22
  418. package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +0 -30
  419. package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +0 -31
  420. package/knowledge/decisions/internals/channel-state-accessors-are-unsound-generics-that-every-implementation-asserts.md +0 -33
  421. package/knowledge/decisions/internals/channel-state-is-per-socket-session-state-is-per-user.md +0 -29
  422. package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +0 -28
  423. package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +0 -27
  424. package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +0 -28
  425. package/knowledge/decisions/internals/cli-stdout-is-reserved-for-machine-readable-output.md +0 -34
  426. package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +0 -29
  427. package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +0 -84
  428. package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +0 -41
  429. package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +0 -44
  430. package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +0 -39
  431. package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +0 -42
  432. package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +0 -39
  433. package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +0 -43
  434. package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +0 -38
  435. package/knowledge/decisions/internals/core-state-is-a-global-map-written-only-at-registration-time.md +0 -44
  436. package/knowledge/decisions/internals/email-meta-is-read-uncached-because-codegen-rewrites-it-mid-session.md +0 -27
  437. package/knowledge/decisions/internals/feature-flag-declarations-refuse-an-empty-anyof-and-conflicting-scopes.md +0 -22
  438. package/knowledge/decisions/internals/feature-flags-fail-open-and-never-enforce-access.md +0 -28
  439. package/knowledge/decisions/internals/flag-sync-rewrites-only-the-declared-text.md +0 -24
  440. package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +0 -32
  441. package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +0 -43
  442. package/knowledge/decisions/internals/gateway-webhook-challenges-echo-bytes-not-json.md +0 -28
  443. package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +0 -31
  444. package/knowledge/decisions/internals/generated-src-paths-in-pikku-meta-are-absolute.md +0 -26
  445. package/knowledge/decisions/internals/global-middleware-resolves-from-the-root-namespace-too.md +0 -32
  446. package/knowledge/decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md +0 -38
  447. package/knowledge/decisions/internals/hot-reload-writes-into-the-function-map-captured-at-startup.md +0 -26
  448. package/knowledge/decisions/internals/http-request-bodies-are-read-once-and-shared.md +0 -32
  449. package/knowledge/decisions/internals/http-route-groups-cascade-config-in-a-fixed-order.md +0 -28
  450. package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +0 -30
  451. package/knowledge/decisions/internals/http-runner-logs-through-a-trace-scoped-logger-functions-do-not.md +0 -26
  452. package/knowledge/decisions/internals/http-set-cookie-headers-are-appended-never-joined.md +0 -28
  453. package/knowledge/decisions/internals/http-sse-streams-flush-headers-only-after-middleware.md +0 -32
  454. package/knowledge/decisions/internals/http-wiring-without-metadata-is-skipped-not-fatal.md +0 -26
  455. package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +0 -25
  456. package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +0 -26
  457. package/knowledge/decisions/internals/index.md +0 -182
  458. package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +0 -25
  459. package/knowledge/decisions/internals/local-trigger-and-gateway-services-assume-a-single-process.md +0 -26
  460. package/knowledge/decisions/internals/mcp-wire-names-are-assigned-over-the-whole-registry.md +0 -39
  461. package/knowledge/decisions/internals/node-only-builtins-are-imported-dynamically.md +0 -24
  462. package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +0 -53
  463. package/knowledge/decisions/internals/only-exposed-functions-enter-a-virtual-user-catalogue.md +0 -21
  464. package/knowledge/decisions/internals/queue-group-concurrency-keeps-one-shared-queue-fair.md +0 -28
  465. package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +0 -27
  466. package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +0 -31
  467. package/knowledge/decisions/internals/role-names-cannot-contain-the-scope-separator.md +0 -30
  468. package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +0 -32
  469. package/knowledge/decisions/internals/scenario-agent-calls-sign-in-on-401-only.md +0 -31
  470. package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +0 -24
  471. package/knowledge/decisions/internals/scenario-meta-lives-apart-from-app-meta-but-merges-when-read-off-disk.md +0 -26
  472. package/knowledge/decisions/internals/scenario-steps-return-drained-response-records.md +0 -27
  473. package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +0 -48
  474. package/knowledge/decisions/internals/scope-roots-may-be-co-declared-by-an-addon-and-its-host-app.md +0 -30
  475. package/knowledge/decisions/internals/serverless-channel-disconnect-must-tolerate-a-missing-channel.md +0 -28
  476. package/knowledge/decisions/internals/side-effects-are-an-allowlist-not-a-boolean.md +0 -34
  477. package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md +0 -24
  478. package/knowledge/decisions/internals/the-agent-done-event-goes-through-the-middleware-and-is-awaited.md +0 -26
  479. package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +0 -43
  480. package/knowledge/decisions/internals/the-core-scope-validator-refuses-separator-wildcard-and-empty-segments.md +0 -22
  481. package/knowledge/decisions/internals/the-dev-queue-copies-prod-timing-and-serialization-semantics.md +0 -30
  482. package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +0 -83
  483. package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +0 -29
  484. package/knowledge/decisions/internals/the-in-memory-workflow-service-is-inline-only-and-single-process.md +0 -27
  485. package/knowledge/decisions/internals/the-kek-salt-is-scoped-to-the-key-version.md +0 -40
  486. package/knowledge/decisions/internals/the-mcp-handshake-is-challenged-only-when-every-target-is-gated.md +0 -29
  487. package/knowledge/decisions/internals/the-middleware-resolution-cache-is-deliberately-unbounded.md +0 -40
  488. package/knowledge/decisions/internals/the-per-invocation-rpc-view-is-a-class.md +0 -40
  489. package/knowledge/decisions/internals/the-pikku-user-id-resolves-in-a-fixed-order.md +0 -24
  490. package/knowledge/decisions/internals/the-runner-resolves-wire-services-itself.md +0 -31
  491. package/knowledge/decisions/internals/the-schema-service-is-never-stubbed.md +0 -26
  492. package/knowledge/decisions/internals/the-transcript-event-is-sent-ahead-of-the-run.md +0 -25
  493. package/knowledge/decisions/internals/the-virtual-user-catalogue-is-the-only-gate-on-what-may-be-called.md +0 -21
  494. package/knowledge/decisions/internals/the-virtual-user-prompt-says-json-because-of-json-object-mode.md +0 -22
  495. package/knowledge/decisions/internals/the-virtual-user-runtime-is-exported-from-the-virtual-user-entry-point.md +0 -28
  496. package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +0 -22
  497. package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +0 -25
  498. package/knowledge/decisions/internals/trigger-declaration-is-split-from-trigger-source.md +0 -33
  499. package/knowledge/decisions/internals/typed-secret-service-caches-for-the-process-lifetime.md +0 -26
  500. package/knowledge/decisions/internals/validate-checks-virtual-users-through-a-shared-module.md +0 -43
  501. package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +0 -115
  502. package/knowledge/decisions/internals/virtual-user-conversation-drives-the-target-through-a-transport-seam.md +0 -24
  503. package/knowledge/decisions/internals/virtual-user-conversation-verdicts-are-llm-self-evaluations.md +0 -25
  504. package/knowledge/decisions/internals/virtual-user-conversations-seed-a-hidden-kickoff-message.md +0 -23
  505. package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +0 -21
  506. package/knowledge/decisions/internals/virtual-users-are-declared-in-one-definevirtualusers-call-per-codebase.md +0 -30
  507. package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md +0 -24
  508. package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +0 -26
  509. package/knowledge/decisions/internals/webhook-service-collaborators-are-constructor-args-not-locator-lookups.md +0 -25
  510. package/knowledge/decisions/internals/whether-a-run-is-inline-is-read-from-the-run-record.md +0 -58
  511. package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +0 -35
  512. package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +0 -34
  513. package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +0 -42
  514. package/knowledge/decisions/internals/workflow-dsl-meta-separates-runtime-expressions-from-literals.md +0 -38
  515. package/knowledge/decisions/internals/workflow-features-resolve-scenarios-by-object-identity.md +0 -29
  516. package/knowledge/decisions/internals/workflow-graph-inline-and-queued-runs-share-one-planner.md +0 -42
  517. package/knowledge/decisions/internals/workflow-graph-node-notes-are-excluded-from-the-graph-hash.md +0 -25
  518. package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +0 -29
  519. package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +0 -43
  520. package/knowledge/decisions/internals/workflow-queued-step-dispatch-requires-an-explicit-opt-in.md +0 -29
  521. package/knowledge/decisions/internals/workflow-queues-are-per-workflow-by-default.md +0 -42
  522. package/knowledge/decisions/internals/workflow-repeated-step-names-get-an-ordinal-suffix.md +0 -33
  523. package/knowledge/decisions/internals/workflow-replay-reads-its-steps-once-and-caches-only-the-immutable-half.md +0 -32
  524. package/knowledge/decisions/internals/workflow-retries-are-owned-by-the-workflow-not-the-queue.md +0 -31
  525. package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +0 -39
  526. package/knowledge/decisions/internals/workflow-run-mirror-is-never-a-source-of-truth.md +0 -29
  527. package/knowledge/decisions/internals/workflow-run-polling-backs-off-to-the-callers-ceiling.md +0 -33
  528. package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +0 -37
  529. package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +0 -54
  530. package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +0 -43
  531. package/knowledge/decisions/internals/workflow-scenario-prose-is-rendered-from-typed-calls-not-parsed-from-english.md +0 -32
  532. package/knowledge/decisions/internals/workflow-scenario-quarantine-reason-lives-in-code.md +0 -18
  533. package/knowledge/decisions/internals/workflow-scenario-step-targets-are-string-literals-for-the-inspector.md +0 -34
  534. package/knowledge/decisions/internals/workflow-step-compensation-runs-as-its-own-durable-step.md +0 -29
  535. package/knowledge/decisions/internals/workflow-step-dispatch-failure-is-transient-not-a-run-failure.md +0 -33
  536. package/knowledge/decisions/internals/workflow-step-lock-is-held-only-to-claim-the-step.md +0 -34
  537. package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +0 -34
  538. package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +0 -38
  539. package/knowledge/decisions/internals/workflow-suspended-runs-keep-their-in-process-context.md +0 -30
  540. package/knowledge/decisions/security/a-bearer-token-checked-against-a-secret-reads-it-per-request.md +0 -26
  541. package/knowledge/decisions/security/a-call-without-a-session-raises-missing-session-not-forbidden.md +0 -20
  542. package/knowledge/decisions/security/a-caller-cookie-wins-over-the-jar-for-the-same-name.md +0 -23
  543. package/knowledge/decisions/security/a-channel-lifecycle-acts-as-the-socket-upgrade-session.md +0 -16
  544. package/knowledge/decisions/security/a-channel-requires-a-session-unless-it-says-auth-false.md +0 -26
  545. package/knowledge/decisions/security/a-credential-read-path-follows-its-declared-type-not-absence.md +0 -32
  546. package/knowledge/decisions/security/a-credential-type-is-a-literal-the-inspector-checks-at-declaration.md +0 -27
  547. package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +0 -28
  548. package/knowledge/decisions/security/a-first-party-cookie-is-written-only-after-its-purposes-consent.md +0 -33
  549. package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +0 -37
  550. package/knowledge/decisions/security/a-graph-run-starts-at-an-entry-node-the-graph-declared.md +0 -33
  551. package/knowledge/decisions/security/a-permission-gets-a-wire-it-cannot-reply-on.md +0 -33
  552. package/knowledge/decisions/security/a-public-function-says-so-with-auth-false.md +0 -34
  553. package/knowledge/decisions/security/a-readonly-session-reaches-only-readonly-functions.md +0 -25
  554. package/knowledge/decisions/security/a-scaffold-flag-says-a-surface-exists-not-who-may-call-it.md +0 -52
  555. package/knowledge/decisions/security/a-scheduled-virtual-user-run-needs-no-admin-at-run-time.md +0 -27
  556. package/knowledge/decisions/security/a-scoped-credential-view-is-limited-to-declared-names.md +0 -26
  557. package/knowledge/decisions/security/a-scoped-secret-view-reads-only-declared-keys-and-never-writes.md +0 -25
  558. package/knowledge/decisions/security/a-secret-is-sent-only-to-the-hosts-it-declares.md +0 -29
  559. package/knowledge/decisions/security/a-step-can-name-an-identity-no-virtual-user-holds-through-per-call-headers.md +0 -25
  560. package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +0 -37
  561. package/knowledge/decisions/security/a-stopped-run-by-id-skips-the-ownership-check.md +0 -24
  562. package/knowledge/decisions/security/a-vault-secret-redacts-on-serialization-and-throws-on-coercion.md +0 -29
  563. package/knowledge/decisions/security/a-virtual-user-catalogue-entry-is-filtered-by-scope-and-approval-is-denied-by-default.md +0 -30
  564. package/knowledge/decisions/security/a-virtual-user-environment-fails-closed.md +0 -38
  565. package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +0 -27
  566. package/knowledge/decisions/security/a-virtual-user-never-runs-against-production.md +0 -23
  567. package/knowledge/decisions/security/a-virtual-user-reads-its-roles-from-the-apps-own-rpc-before-better-auth.md +0 -27
  568. package/knowledge/decisions/security/a-virtual-user-run-treats-an-unresolved-environment-as-production.md +0 -41
  569. package/knowledge/decisions/security/a-virtual-user-scopes-are-expanded-from-its-roles-once-at-run-preparation.md +0 -25
  570. package/knowledge/decisions/security/a-virtual-user-whose-roles-drift-from-the-declaration-refuses-to-run.md +0 -32
  571. package/knowledge/decisions/security/a-workflow-run-is-read-and-approved-by-its-owner.md +0 -50
  572. package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +0 -43
  573. package/knowledge/decisions/security/addon-config-gates-apply-only-at-the-namespaced-rpc-boundary.md +0 -52
  574. package/knowledge/decisions/security/addon-scopes-are-resolved-where-the-function-runs.md +0 -46
  575. package/knowledge/decisions/security/addon-screen-scopes-hide-and-do-not-enforce.md +0 -20
  576. package/knowledge/decisions/security/agent-approval-forwarding-requires-a-symbol-brand.md +0 -27
  577. package/knowledge/decisions/security/agent-credential-requests-are-symbol-branded.md +0 -37
  578. package/knowledge/decisions/security/agent-gate-requires-a-session-only-when-auth-is-true.md +0 -31
  579. package/knowledge/decisions/security/agent-ownership-failures-never-echo-the-resource.md +0 -23
  580. package/knowledge/decisions/security/agent-resume-re-runs-the-authorization-gate.md +0 -22
  581. package/knowledge/decisions/security/agent-sessionless-deployments-have-no-thread-ownership.md +0 -39
  582. package/knowledge/decisions/security/agent-thread-ownership-composes-the-session-principal.md +0 -30
  583. package/knowledge/decisions/security/agent-tool-filtering-reads-the-live-function-config.md +0 -24
  584. package/knowledge/decisions/security/an-addon-header-can-only-narrow-the-session.md +0 -26
  585. package/knowledge/decisions/security/an-addon-instance-reads-only-the-secrets-and-credentials-it-is-named.md +0 -33
  586. package/knowledge/decisions/security/an-addon-may-reach-only-itself-and-the-addons-it-uses.md +0 -16
  587. package/knowledge/decisions/security/an-agent-approval-is-claimed-before-the-tool-runs.md +0 -33
  588. package/knowledge/decisions/security/an-api-key-is-jwt-decoded-into-the-session.md +0 -26
  589. package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +0 -59
  590. package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +0 -30
  591. package/knowledge/decisions/security/an-exposed-ungated-function-is-a-codegen-warning.md +0 -52
  592. package/knowledge/decisions/security/an-external-virtual-user-caller-presents-one-signed-statement.md +0 -38
  593. package/knowledge/decisions/security/an-inbound-webhook-source-dispatches-only-verified-requests.md +0 -31
  594. package/knowledge/decisions/security/an-mcp-call-with-no-http-request-stays-anonymous.md +0 -18
  595. package/knowledge/decisions/security/an-mcp-refusal-is-decided-before-dispatch.md +0 -48
  596. package/knowledge/decisions/security/an-oauth2-credential-is-read-by-its-account-row.md +0 -40
  597. package/knowledge/decisions/security/an-omitted-user-id-addresses-the-platform-credential.md +0 -32
  598. package/knowledge/decisions/security/an-upload-is-counted-as-it-arrives-not-buffered-then-measured.md +0 -24
  599. package/knowledge/decisions/security/analytics-identity-is-stamped-from-the-session-not-the-event.md +0 -24
  600. package/knowledge/decisions/security/app-access-is-a-scope-tree-synthesised-from-virtual-users.md +0 -26
  601. package/knowledge/decisions/security/approval-policy-decides-who-answers-a-tool-call.md +0 -27
  602. package/knowledge/decisions/security/auth-false-on-a-session-function-warns-and-still-requires-one.md +0 -25
  603. package/knowledge/decisions/security/bearer-token-hashes-are-unpeppered-sha256.md +0 -18
  604. package/knowledge/decisions/security/consent-is-read-from-a-cookie-and-a-recognised-denial-counts-as-refusal.md +0 -29
  605. package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +0 -84
  606. package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +0 -39
  607. package/knowledge/decisions/security/core-secrets-use-a-per-secret-dek-wrapped-by-a-kek.md +0 -37
  608. package/knowledge/decisions/security/cors-defaults-to-any-origin-and-refuses-the-wildcard-with-credentials.md +0 -22
  609. package/knowledge/decisions/security/credential-backends-share-one-conformance-suite-for-per-user-isolation.md +0 -29
  610. package/knowledge/decisions/security/each-stage-has-one-virtual-user-key-pair.md +0 -27
  611. package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +0 -41
  612. package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +0 -30
  613. package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +0 -40
  614. package/knowledge/decisions/security/hmac-verification-fails-closed-on-empty-inputs.md +0 -25
  615. package/knowledge/decisions/security/http-error-detail-is-withheld-from-clients-in-production.md +0 -33
  616. package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +0 -46
  617. package/knowledge/decisions/security/index.md +0 -135
  618. package/knowledge/decisions/security/local-content-refuses-private-buckets-under-the-public-segment.md +0 -21
  619. package/knowledge/decisions/security/mail-is-allowlisted-before-a-virtual-user-run-sees-it.md +0 -38
  620. package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +0 -27
  621. package/knowledge/decisions/security/mcp-resources-tools-and-prompts-take-sessionless-functions.md +0 -18
  622. package/knowledge/decisions/security/origin-locked-routes-match-the-origin-exactly.md +0 -22
  623. package/knowledge/decisions/security/oss-auth-works-without-pikku-studio-cloud.md +0 -26
  624. package/knowledge/decisions/security/outbound-webhooks-use-an-allowlist-when-configured.md +0 -24
  625. package/knowledge/decisions/security/passphrases-are-stretched-key-material-is-expanded.md +0 -40
  626. package/knowledge/decisions/security/permission-auth-filtering-requires-live-permission-functions.md +0 -31
  627. package/knowledge/decisions/security/pikku-carries-virtual-user-scopes-as-data-and-the-app-grants-them.md +0 -35
  628. package/knowledge/decisions/security/queue-job-identities-are-signed-at-enqueue.md +0 -69
  629. package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +0 -39
  630. package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +0 -34
  631. package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +0 -55
  632. package/knowledge/decisions/security/scenario-step-functions-are-never-externally-invocable.md +0 -30
  633. package/knowledge/decisions/security/scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md +0 -28
  634. package/knowledge/decisions/security/scoped-content-access-is-a-root-folder-with-longest-prefix-grants.md +0 -31
  635. package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +0 -34
  636. package/knowledge/decisions/security/services-without-secrets-get-a-throwing-secrets-accessor.md +0 -22
  637. package/knowledge/decisions/security/shared-guards-refuse-to-mutate-or-shadow-a-system-role.md +0 -34
  638. package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +0 -37
  639. package/knowledge/decisions/security/signed-uploads-are-verified-by-the-same-check-as-signed-reads.md +0 -26
  640. package/knowledge/decisions/security/system-role-scopes-must-be-declared-with-define-scope.md +0 -24
  641. package/knowledge/decisions/security/system-roles-are-additive-and-immutable.md +0 -16
  642. package/knowledge/decisions/security/the-channel-rpc-does-not-send-the-callers-session.md +0 -21
  643. package/knowledge/decisions/security/the-remote-jobs-inbox-fails-closed-without-a-secret.md +0 -24
  644. package/knowledge/decisions/security/the-remote-rpc-gate-fails-closed-and-binds-the-token-to-its-function.md +0 -34
  645. package/knowledge/decisions/security/the-workflow-status-stream-rechecks-ownership-on-every-poll.md +0 -16
  646. package/knowledge/decisions/security/two-credentials-on-one-key-must-share-a-read-mode.md +0 -29
  647. package/knowledge/decisions/security/verified-bearer-claims-are-pass-through-data-that-core-never-fills.md +0 -23
  648. package/knowledge/decisions/security/virtual-user-catalogue-excludes-the-machinery-that-runs-virtual-users.md +0 -25
  649. package/knowledge/decisions/security/virtual-user-conversation-missing-approval-decisions-default-to-denied.md +0 -22
  650. package/knowledge/decisions/security/virtual-user-run-records-are-gated-behind-a-read-scope.md +0 -18
  651. package/knowledge/decisions/security/virtual-user-sign-in-does-not-exist-in-production.md +0 -25
  652. package/knowledge/decisions/security/virtual-user-sign-in-has-one-door.md +0 -42
  653. package/knowledge/decisions/security/virtual-user-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +0 -29
  654. package/knowledge/decisions/security/virtual-user-sign-in-only-works-for-virtual-user-flagged-users.md +0 -29
  655. package/knowledge/decisions/security/webhook-bodies-are-signed-before-they-are-enqueued.md +0 -25
  656. package/knowledge/decisions/security/wire-addon-expose-selects-the-rpc-surface.md +0 -51
  657. package/knowledge/decisions/security/workflow-approval-payloads-are-validated-on-replay-inside-the-workflow.md +0 -40
  658. package/knowledge/decisions/security/workflow-helper-functions-are-sessionless-by-declaration.md +0 -18
  659. package/knowledge/decisions/security/workflow-queued-steps-rehydrate-their-session-from-the-run-wire.md +0 -32
  660. package/knowledge/decisions/security/workflow-scenario-sessions-are-isolated-per-virtual-user-and-per-scenario.md +0 -32
  661. package/knowledge/decisions/security/workflow-scenario-steps-are-never-network-invocable.md +0 -31
  662. package/knowledge/decisions/security/workflow-virtual-user-steps-always-use-the-real-transport.md +0 -34
  663. package/knowledge/decisions/security/writing-a-virtual-user-schedule-is-gated-by-its-own-scope.md +0 -18
  664. package/knowledge/index.md +0 -24
  665. package/knowledge/questions/a-bearer-jwt-with-no-identity-becomes-a-session.md +0 -24
  666. package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +0 -35
  667. package/knowledge/questions/dev-quick-login-as-impersonation.md +0 -25
  668. package/knowledge/questions/does-a-delayed-rpc-run-as-the-session-it-was-scheduled-with.md +0 -26
  669. package/knowledge/questions/does-a-user-id-with-a-colon-read-another-users-credentials.md +0 -27
  670. package/knowledge/questions/does-a-wirecli-command-need-a-session-by-default.md +0 -26
  671. package/knowledge/questions/does-an-adversarial-in-scope-success-count-as-a-finding.md +0 -26
  672. package/knowledge/questions/does-approve-step-need-the-run-owners-session-or-the-gates-approvers.md +0 -34
  673. package/knowledge/questions/does-cors-origin-true-reflect-any-origin-with-credentials.md +0 -20
  674. package/knowledge/questions/does-skip-user-session-do-anything-on-a-channel.md +0 -24
  675. package/knowledge/questions/does-the-store-session-match-the-other-two.md +0 -19
  676. package/knowledge/questions/index.md +0 -41
  677. package/knowledge/questions/is-the-agent-score-worker-reachable-without-a-session.md +0 -21
  678. package/knowledge/questions/live-scheduled-tests-may-write.md +0 -19
  679. package/knowledge/questions/provision-virtual-users-has-no-caller-in-this-repo.md +0 -23
  680. package/knowledge/questions/remote-secret-refuses-requests-without-a-remote-token-on-every-path.md +0 -32
  681. package/knowledge/questions/should-a-middleware-set-session-persist-to-the-store.md +0 -25
  682. package/knowledge/questions/should-a-scoped-secret-view-throw-from-has-secret-for-a-disallowed-key.md +0 -23
  683. package/knowledge/questions/should-a-wrong-bearer-token-be-anonymous-or-refused.md +0 -35
  684. package/knowledge/questions/should-an-empty-webhook-signing-secret-send-unsigned.md +0 -23
  685. package/knowledge/questions/should-http-virtual-user-sessions-reset-between-scenarios-in-one-run.md +0 -27
  686. package/knowledge/questions/should-the-cookie-jar-scope-cookies-to-the-api-origin.md +0 -26
  687. package/knowledge/questions/should-voice-input-fetch-audio-urls-without-a-host-allowlist.md +0 -20
  688. package/knowledge/questions/staging-impersonation-rules.md +0 -27
  689. package/knowledge/questions/unauthorized-channel-replies-escape-the-declared-out-type.md +0 -44
  690. package/knowledge/questions/virtual-user-keys-on-cloud-stages-are-pikku-studios-to-build.md +0 -33
  691. package/knowledge/questions/virtual-user-statement-replay-is-per-process.md +0 -20
  692. package/knowledge/questions/what-an-impersonated-session-carries.md +0 -22
  693. package/run-tests.sh +0 -68
  694. package/scripts/generate-api-report.d.mts +0 -1
  695. package/scripts/generate-api-report.mjs +0 -96
  696. package/scripts/generate-api-report.mts +0 -333
  697. package/src/public-surface.json +0 -637
  698. package/src/public-surface.json.README +0 -43
  699. /package/dist/{function/compensation-name.d.ts → compensation-name.d.ts} +0 -0
  700. /package/dist/{function/compensation-name.js → compensation-name.js} +0 -0
@@ -1,65 +0,0 @@
1
- ---
2
- type: decision
3
- title: A virtual user run is not a workflow, but it needs a trigger
4
- description: runVirtualUser writes its record and dispatches the run onto a queue at one attempt — an exploratory run has nothing to replay, but a deployment that puts each function in its own unit has nothing to fire it either
5
- tags: virtual-user, storage, deploy
6
- ---
7
-
8
- # A virtual user run is not a workflow, but it needs a trigger
9
-
10
- `runVirtualUser` — the RPC `scaffold.virtualUser` generates — does three things
11
- in order: writes a `VirtualUserRunStore` record, dispatches
12
- `executeVirtualUserRun`, and returns the `runId`. The request never waits for
13
- the run; a run takes minutes and survives neither a rollout nor a proxy timeout.
14
-
15
- **A workflow** is still the wrong shape, for the reason it always was. Its value
16
- is that a run can be resumed at the step it died on, and that the same input
17
- reaches the same step. A virtual user is the opposite by construction — it is an
18
- LLM deciding what to try next, so no two attempts take the same steps, and there
19
- is no step to resume _to_. Recording a run as a workflow puts entries in the
20
- workflow store that can never be replayed, and gives every operator reading that
21
- store a row that lies about what it is. The seed makes a run _reproducible_ —
22
- run it again and it explores the same way — which is a different property from
23
- resumable, and one the record already carries.
24
-
25
- **A queue was rejected once, on durability, and that was the wrong question.**
26
- The original reasoning weighed a broker dependency against a retry nobody wants,
27
- and concluded the in-process dispatch was enough. It is enough in one process.
28
- It is not a dispatch at all under a deployment that puts each function in its own
29
- unit: there is no in-process promise to leave running, and `executeVirtualUserRun`
30
- — sessionless, unexposed, wired to nothing — is not a function any unit can be
31
- reached at. The RPC resolves to nothing, the rejection is swallowed by the
32
- `catch` that exists to stop it taking the process down, and the run parks at
33
- `running` with zero steps and no error anywhere. That is what a cloud stage did.
34
-
35
- So the queue is not bought for durability. It is bought because **a trigger is
36
- what makes a function deployable**: `wireQueueWorker` puts `executeVirtualUserRun`
37
- in the manifest, which gives it a unit and gives the platform somewhere to
38
- deliver to. The job is dispatched at `attempts: 1`, because a redelivery is a
39
- second different outing writing into a record that already has an outcome — the
40
- retry the queue offers is precisely the part that stays unused.
41
-
42
- A project with no queue service keeps the in-process dispatch. That is not a
43
- fallback that hides a failure: a project without a broker runs in one process,
44
- where an unawaited promise is a real dispatch and the only correct one.
45
-
46
- The record remains the run's only trace, and that is what `VirtualUserRunStore`
47
- exists for. It is also why `fail()` is a method rather than an absence: a run
48
- that crashed and a run that found nothing are different answers, and a record
49
- left at `running` is neither.
50
-
51
- The cost is smaller than it was but has not gone: **a restart mid-run strands a
52
- record at `running` with nothing left to finish it**, since nothing retries. A
53
- run older than its budget window and still `running` is dead, not working — a
54
- read-side rule. A stranded run is started again, with its seed if the caller
55
- wants the same exploration.
56
-
57
- Where that rule is actually applied is
58
- [the schedule tick](a-virtual-user-cadence-is-a-row-not-a-timer.md), which has
59
- to: a record stuck at `running` would otherwise block its virtual user's cadence
60
- forever.
61
-
62
- **What this rules out:** dispatching the run through `startWorkflow`; awaiting
63
- the engine inside the request; retrying a run that failed; storing the operator
64
- token on the record rather than on the dispatch; and inferring `status` from
65
- `finishedAt` being unset, which cannot separate a crash from a run still going.
@@ -1,49 +0,0 @@
1
- ---
2
- type: decision
3
- title: A wall-clock threshold is a load test in disguise
4
- description: The KEK derivation test asserted a fixed 50ms budget for work that took 10ms, which went red about one run in five once the suite was large enough to compete for the machine
5
- tags: core, testing, crypto
6
- ---
7
-
8
- # A wall-clock threshold is a load test in disguise
9
-
10
- `crypto-utils.test.ts` guards a real property: unwrapping N secrets must not
11
- cost N KEK derivations. Deriving a KEK is a deliberately slow KDF, so doing it
12
- per secret turns a 10ms operation into a 4-second one.
13
-
14
- It guarded it with `assert.ok(elapsed < 50)`. Measured on this machine:
15
-
16
- | | |
17
- | ----------------------------- | ------------------------------- |
18
- | one `deriveKEK` | ~86ms |
19
- | 50 `envelopeDecrypt` | 10.8ms |
20
- | the old 50ms threshold | 4.6x headroom |
21
- | the failure it guards against | ~4281ms — a **396x** separation |
22
-
23
- So the assertion had 4.6x of margin to detect a 396x regression. Everything
24
- between those two numbers was noise, and once core's suite reached ~2000 tests
25
- competing for the same cores, a 10ms window drifting past 50ms became routine:
26
- roughly one run in five went red, always on a machine where nothing was wrong.
27
-
28
- **Calibrate against a measurement taken in the same run.** The test already
29
- derives a KEK, so timing that call is free, and the assertion becomes
30
- `elapsed < oneDerivation` — unwrapping all fifty must cost less than deriving
31
- once. Under load both sides slow down together, so the ratio holds.
32
-
33
- **What this rules out:** raising the constant. 100ms or 200ms buys a smaller
34
- flake rate and the same class of bug, and it drifts again the next time the
35
- suite grows or CI moves to a noisier runner. Any assertion of the form
36
- "operation X takes less than N milliseconds" has this problem; express it as a
37
- ratio against something measured alongside it.
38
-
39
- Worth knowing: `envelopeDecrypt(kek: CryptoKey, …)` takes the derived key as a
40
- parameter, so it _cannot_ derive one — the property is already enforced by the
41
- signature, and [[the-api-report-pins-members-not-just-names]] would catch a
42
- change to it. The test is defence in depth, which is a reason to make it cheap
43
- and quiet rather than to delete it.
44
-
45
- Related: [[an-unref-d-timer-cannot-be-awaited-under-node-test]], the other
46
- source of nondeterminism found in the same pass.
47
-
48
- Where the cause is observable, prefer asserting it outright:
49
- [[a-latency-budget-is-asserted-by-its-cause]].
@@ -1,45 +0,0 @@
1
- ---
2
- type: decision
3
- title: A workflow's wire is built from the run record, not from the RPC service
4
- description: The RPC service exposes no wire, so every rpcService.wire read was undefined; the run record is the only thing that carries the caller across a step boundary
5
- tags: core, workflow
6
- ---
7
-
8
- # A workflow's wire is built from the run record, not from the RPC service
9
-
10
- `PikkuWorkflowService` builds a fresh wire each time it runs a workflow body or
11
- starts a child. For a while it filled parts of that wire from the RPC service it
12
- had been handed:
13
-
14
- ```ts
15
- session: rpcService?.wire?.session,
16
- rpc: rpcService?.wire?.rpc,
17
- pikkuUserId: rpcService.wire?.pikkuUserId,
18
- ```
19
-
20
- `PikkuRPC` has no `wire`. Neither does the object `getContextRPCService`
21
- actually returns — `ContextAwareRPCService` holds its wire _privately_ and
22
- exposes `invoke`, `remote`, `exposed`, `startWorkflow`, `agent` and
23
- `rpcWithWire`, and nothing else. Every one of those reads was `undefined`, and
24
- the `rpcService: any` parameter type is what kept the compiler quiet about it.
25
-
26
- The consequence was silent and one-directional: a child workflow started from a
27
- step never inherited the `pikkuUserId` its parent was running as, so a queued
28
- child ran as nobody. Nothing failed — the field was simply absent, and the run
29
- proceeded.
30
-
31
- **The run record is the carrier.** `WorkflowRun.wire` is durable, is written
32
- when the run is created, and survives the process boundary a queued step
33
- crosses, which is exactly what a live service reference cannot do. Both the
34
- run-body wire and the child-run wire now read `run.wire?.pikkuUserId`.
35
-
36
- `session` and `rpc` are not copied at all. `runPikkuFunc` attaches `rpc` lazily
37
- for the duration of an invocation and restores the previous descriptor
38
- afterwards, and it resolves the session from the session store using
39
- `pikkuUserId` — so both were being overwritten moments later anyway. The wire
40
- these paths construct is a `PikkuRawWire` for that reason: it genuinely has no
41
- `rpc` yet, and saying so is what let the dead reads be found.
42
-
43
- **What this rules out:** reaching for the RPC service to answer "who is this
44
- running as". It cannot answer, and the shape of the question hides that.
45
- Anything a step needs to know about its caller has to be on the run.
@@ -1,26 +0,0 @@
1
- ---
2
- type: decision
3
- title: Addon package roots resolve by walking node module search paths
4
- description: LocalMetaService finds an addon's directory by scanning resolve.paths, not by require.resolve, because addon packages expose no main entry
5
- tags: services
6
- ---
7
-
8
- # Addon package roots resolve by walking node module search paths
9
-
10
- `LocalMetaService.resolvePackageRoot` (`packages/core/src/services/meta-service.ts`)
11
- builds a `createRequire` anchored one level above `.pikku` — the app root — then
12
- walks `require.resolve.paths(packageName)` and takes the first candidate
13
- directory that contains a `package.json`. The result is memoised in
14
- `packageRootCache`.
15
-
16
- The obvious call, `require.resolve(packageName)`, throws for these packages:
17
- Pikku addon packages ship a `.pikku` directory and subpath exports but no main
18
- `exports` entry, so there is nothing for Node to resolve to. Walking the search
19
- paths asks the same question Node would ask — where would this package be
20
- found from the app root — without requiring the package to be importable.
21
-
22
- **What this rules out:** replacing the loop with `require.resolve(pkg)`,
23
- `import.meta.resolve`, or `createRequire(import.meta.url)`. The first two fail on
24
- every addon; the third anchors resolution at `@pikku/core`'s own location rather
25
- than the app's, so an addon installed only in the app's `node_modules` becomes
26
- invisible.
@@ -1,32 +0,0 @@
1
- ---
2
- type: decision
3
- title: An addon's .pikku meta ships at the package root or under dist, and readers probe both
4
- description: The layout depends on the addon's build and files field, so a consumer resolving the directory by path must try `<pkg>/.pikku` and `<pkg>/dist/.pikku` before concluding an addon declares nothing
5
- tags: services
6
- ---
7
-
8
- # An addon's .pikku meta ships at the package root or under dist, and readers probe both
9
-
10
- An addon generates `.pikku/` at its project root, and whether that directory
11
- reaches the published tarball at the root or inside `dist/` depends on the
12
- addon's own `tsconfig` and `files` — both layouts are in the wild and both are
13
- supported. The published `exports` map hides the difference for anyone
14
- resolving by specifier: `"./.pikku/*"` points at wherever it landed, so
15
- `require.resolve('<pkg>/.pikku/scopes/pikku-scopes-meta.gen.json')` works for
16
- either shape, and that is the resolution every consumer should prefer.
17
-
18
- Code that builds the path itself must probe both. `addonPikkuDir`
19
- (`packages/addon/pikku-console/src/lib/derive-instance-overrides.ts`) tries
20
- `<pkg>/.pikku` then `<pkg>/dist/.pikku` and returns `null` when neither exists.
21
- The reason to say so out loud is the failure mode: a reader that assumes the
22
- root finds nothing under a `dist`-shipping addon and cannot distinguish that
23
- from an addon that declares no secrets, variables or scopes at all. Both answers
24
- are "empty", and the wrong one is indistinguishable from a correct one until
25
- something downstream reports an addon as ready when its secrets were never
26
- checked.
27
-
28
- **What this rules out:** hardcoding either path in a consumer, and treating a
29
- missing directory as evidence an addon declares nothing without having tried
30
- both. It also rules out normalising the layout by making the CLI move the
31
- directory at publish time — the export map already makes the layout private to
32
- the package, and the addons shipping each shape are already published.
@@ -1,33 +0,0 @@
1
- ---
2
- type: decision
3
- title: Addon singleton services are cached per namespace, not per package
4
- description: Each wireAddon instance gets its own services built from its own overrides, at the cost of one service graph per wired instance
5
- tags: rpc
6
- ---
7
-
8
- # Addon singleton services are cached per namespace, not per package
9
-
10
- `getOrCreatePackageSingletonServices` in
11
- `packages/core/src/wirings/rpc/addon-runner.ts` keys its `pikkuState` cache on
12
- `addonInstance?.namespace ?? packageName`. The namespace is the consumer-facing
13
- name given to `wireAddon`/`wireRemoteAddon`, and it is what selects the
14
- instance's `secretOverrides`, `variableOverrides` and `credentialOverrides`.
15
-
16
- One package may be wired twice — the same payments addon against a live and a
17
- sandbox account, say — with different secret and variable names. Caching by
18
- package name would build the service graph once, from whichever instance called
19
- first, and silently hand the other instance the wrong credentials. Because the
20
- overrides have to be visible to the addon's _own_ `createSingletonServices`, they
21
- are applied by wrapping the parent `secrets` and `variables` services
22
- (`aliasSecretService`, `aliasVariablesService`) so that every logical name the
23
- addon reads is remapped to the real project name before resolution. A call with
24
- no instance attached still falls back to per-package caching.
25
-
26
- `addonInstanceForNamespace` rebuilds this descriptor for bare intra-addon calls
27
- from the namespace currently executing on the wire, and returns `undefined`
28
- unless that namespace maps to the package being resolved — so a bare call cannot
29
- pick up another instance's overrides.
30
-
31
- **What this rules out:** simplifying the cache key to `packageName`, resolving
32
- overrides at the call site instead of aliasing the resolver services, and
33
- assuming two `wireAddon` entries for one package share a service instance.
@@ -1,28 +0,0 @@
1
- ---
2
- type: decision
3
- title: Bare workflow names from inside an addon are prefixed with the consumer's namespace
4
- description: The addon's workflowService is proxied so an addon never has to hardcode the name its consumer chose
5
- tags: rpc
6
- ---
7
-
8
- # Bare workflow names from inside an addon are prefixed with the consumer's namespace
9
-
10
- `wrapWorkflowServiceForPackage` in
11
- `packages/core/src/wirings/rpc/addon-runner.ts` proxies an addon package's
12
- `workflowService`, intercepting `startWorkflow` and `runToCompletion`. A bare
13
- name — one with no `:` — is rewritten to `${namespace}:${name}`, using the
14
- instance namespace when known and otherwise the package's sole namespace via
15
- `findAddonNamespaceForPackage`.
16
-
17
- Workflows declared by an addon are registered under the addon's package scope,
18
- but the namespace they answer to is chosen by the _consumer_ in `wireAddon`.
19
- Without the proxy, `runToCompletion('myWorkflow')` written inside the addon
20
- resolves against root meta, misses, and throws `WorkflowNotFoundError` — leaving
21
- the addon author no option but to hardcode the consumer-defined namespace, which
22
- couples a reusable package to one particular caller. Explicit `'ns:name'` calls
23
- and bare names that already resolve in root are untouched; only bare names that
24
- would otherwise miss get prefixed.
25
-
26
- **What this rules out:** dropping the proxy and requiring addons to namespace
27
- their own workflow calls, and widening the rewrite to names that already contain
28
- a `:` or already exist at root — either turns a working call into a lookup miss.
@@ -1,29 +0,0 @@
1
- ---
2
- type: decision
3
- title: The AG-UI bridge obeys the client's event-ordering contract exactly
4
- description: RUN_STARTED opens lazily, RUN_FINISHED fires once on done, and step names are globally sequential — a violation makes the client drop the whole stream
5
- tags: agent
6
- ---
7
-
8
- # The AG-UI bridge obeys the client's event-ordering contract exactly
9
-
10
- `wrapChannelWithAGUI` in `packages/core/src/wirings/agent/agent-agui.ts`
11
- translates pikku stream events into AG-UI events under three rules that
12
- `@ag-ui/client`'s `verifyEvents` enforces on the browser side:
13
-
14
- `RUN_STARTED` is emitted lazily, from the first translated event, because the
15
- client rejects anything that arrives before it — and because the real
16
- `AgentRunStateService` run id only exists after the channel has been wrapped, which
17
- is why `AGUIChannelOptions.getRunId` and `StreamAgentOptions.onRunCreated`
18
- exist as late-bound sources. `RUN_FINISHED` is terminal for the client, so it is
19
- sent exactly once, on `done`, carrying usage accumulated across all steps; per-step
20
- `usage` events must not finish the run, or a multi-step tool run would emit later
21
- steps after the terminal event and the client would drop the whole stream.
22
- Step names must be unique among active steps, and sub-agents reuse step numbers
23
- on the shared channel, so each `step-start` closes the previous step and takes a
24
- sequential name. `agent-agui.test.ts` re-implements those ordering rules so
25
- the bridge is checked against the same contract the browser applies.
26
-
27
- **What this rules out:** emitting `RUN_STARTED` eagerly at wrap time; finishing
28
- the run on the `usage` event so token counts arrive earlier; and naming AG-UI
29
- steps after `event.stepNumber`.
@@ -1,20 +0,0 @@
1
- ---
2
- type: decision
3
- title: Audio chunks are labelled with the format the provider actually returned
4
- description: The configured format is only a request, so the response's own format wins with the request and pcm16 as fallbacks
5
- tags: agent
6
- ---
7
-
8
- # Audio chunks are labelled with the format the provider actually returned
9
-
10
- `synthesizeAudio` in `packages/core/src/wirings/agent/voice-output.ts` labels
11
- each `audio-delta` event with `result.audio.format` first, falling back to the
12
- requested `config.format` and finally to `pcm16`.
13
-
14
- Speech providers treat the output format as a preference: an unsupported or
15
- omitted value silently yields whatever the provider defaults to. Stamping the
16
- requested format on the chunk would tell the client to decode bytes it did not
17
- receive, producing noise rather than an error.
18
-
19
- **What this rules out:** labelling chunks from `config.format` because "we asked
20
- for it", and dropping the fallback chain to a single source.
@@ -1,21 +0,0 @@
1
- ---
2
- type: decision
3
- title: Loading agent context waits for a tool result that may still be landing
4
- description: An interrupted run's tool can still be writing to the thread, and in voice the next turn arrives within seconds — soon enough to load context missing what it is about to be asked about
5
- tags: core, agent
6
- ---
7
-
8
- # Loading agent context waits for a tool result that may still be landing
9
-
10
- Before a turn loads its thread, it settles any tool whose run was interrupted
11
- but whose result is still being written to that thread.
12
-
13
- The window is small and, on a typed interface, usually irrelevant — a person
14
- takes seconds to write the next message. In voice it is not: the next turn lands
15
- within a second or two of the last one. Without the wait, the model loads a
16
- thread that is missing the very result the user is about to ask about, and
17
- answers as though the tool never ran.
18
-
19
- **What this rules out:** treating the settle as belt-and-braces and dropping it
20
- to save a round trip. The failure it prevents is a confidently wrong answer, not
21
- an error, and it only appears on the fastest transport.
@@ -1,26 +0,0 @@
1
- ---
2
- type: decision
3
- title: A credential-required tool result never reaches the client or the transcript
4
- description: The run suspends with credential-request events instead, leaving the tool call unresulted so it can be resumed after connecting
5
- tags: agent
6
- ---
7
-
8
- # A credential-required tool result never reaches the client or the transcript
9
-
10
- When a tool returns the `__credentialRequired` marker,
11
- `streamAgent` in `packages/core/src/wirings/agent/agent-stream.ts`
12
- filters that `tool-result` out of the channel before it can be streamed or
13
- persisted, and `handleCredentialRequests` suspends the run and emits
14
- `credential-request` events carrying the `runId` instead. Those events — not the
15
- tool result — are what tells a client to show Connect/Ignore, mirroring how
16
- approval suspensions work.
17
-
18
- Leaving the tool call unresulted in the persisted history is what makes the
19
- resume possible: once the credential is connected, `/resume` re-executes the call
20
- against a history that does not already contain a bogus answer. `runStreamStepLoop`
21
- still appends the step messages before returning the credential outcome, so the
22
- assistant's tool call itself survives into the resume.
23
-
24
- **What this rules out:** streaming the marker result as a normal tool result and
25
- filtering it client-side; persisting it as the tool's answer; and skipping
26
- `appendStepMessages` on the credential path because the run is about to suspend.
@@ -1,26 +0,0 @@
1
- ---
2
- type: decision
3
- title: Delegate mode hides the parent's later text, supervise mode hides the sub-agent's
4
- description: Exactly one voice reaches the client per agent-mode; approvals and tool events always flow through either way
5
- tags: agent
6
- ---
7
-
8
- # Delegate mode hides the parent's later text, supervise mode hides the sub-agent's
9
-
10
- An agent with sub-agents runs in one of two modes. In `'delegate'` (the default,
11
- handled in `streamAgent` in `agent-stream.ts`) the parent's `text-delta` and
12
- `reasoning-delta` events are suppressed _after_ the first sub-agent call —
13
- `delegateState.delegated` is the latch — so a parent that answers directly still
14
- streams normally, while a parent that hands off does not narrate over its
15
- sub-agent. In `'supervise'` (handled where the sub-agent channel is built in
16
- `buildToolDefs` in `agent-prepare.ts`) the inverse holds: the sub-agent's text
17
- and reasoning are dropped and only the supervisor speaks.
18
-
19
- Suppression is confined to text and reasoning. Approval requests, tool calls,
20
- tool results, usage and errors flow through in both modes, because a suppressed
21
- approval would deadlock the run.
22
-
23
- **What this rules out:** filtering sub-agent events at the transport instead of
24
- at the scoped channel; suppressing parent text unconditionally in delegate mode
25
- (direct answers would vanish); and adding new event types to either filter
26
- without checking they are not part of the approval handshake.
@@ -1,23 +0,0 @@
1
- ---
2
- type: decision
3
- title: Nulls are stripped from approved tool arguments before execution
4
- description: LLMs emit null for optional fields where the schema layer expects undefined, so a resumed tool call is cleaned recursively first
5
- tags: agent
6
- ---
7
-
8
- # Nulls are stripped from approved tool arguments before execution
9
-
10
- `resumeAgentSync` in
11
- `packages/core/src/wirings/agent/agent-runner.ts` runs `stripNulls` over
12
- the persisted arguments of an approved tool call before invoking the tool.
13
-
14
- Models routinely fill every property in a JSON schema, using `null` to mean "not
15
- provided". Pikku's validation layer models an absent optional field as
16
- `undefined`, and a `null` fails the check outright. The value is stored as the
17
- model produced it — the approval prompt should show what the model actually asked
18
- for — so the cleanup happens at execution time, recursively, including inside
19
- arrays and nested objects.
20
-
21
- **What this rules out:** normalizing the arguments at approval-capture time
22
- (the approval UI would no longer reflect the model's real request), and a
23
- shallow single-level null strip.
@@ -1,25 +0,0 @@
1
- ---
2
- type: decision
3
- title: Model resolution stays a single seam even though it is currently a passthrough
4
- description: resolveModelConfig looks removable but is the one merge point for per-request model overrides
5
- tags: agent
6
- ---
7
-
8
- # Model resolution stays a single seam even though it is currently a passthrough
9
-
10
- `resolveModelConfig` in
11
- `packages/core/src/wirings/agent/agent-model-config.ts` returns the
12
- agent's `model`, `temperature` and `maxSteps` unchanged, and ignores its
13
- `_agentName` argument. It reads as dead indirection and is not.
14
-
15
- Models are declared per agent in the provider-qualified `provider/model` form
16
- (`openai/gpt-5-mini`); there is no config-level alias map to consult, which is
17
- why the current body is a copy. The function exists so that every caller —
18
- `prepareAgentRun`, both resume paths, and the per-request `input.model` /
19
- `input.temperature` overrides applied in `agent-prepare.ts` — assembles the
20
- effective config the same way, through one place that can grow an alias map,
21
- per-tenant defaults or provider fallbacks without touching them.
22
-
23
- **What this rules out:** inlining `agent.model` / `agent.temperature` at the four
24
- call sites and deleting the function, and dropping the unused `_agentName`
25
- parameter from the signature.
@@ -1,22 +0,0 @@
1
- ---
2
- type: decision
3
- title: An agentMiddleware onError hook cannot change how a run fails
4
- description: Hook throws are swallowed so observability code can never convert, mask, or replace the original error
5
- tags: agent
6
- ---
7
-
8
- # An agentMiddleware onError hook cannot change how a run fails
9
-
10
- Every `onError` invocation on the agent failure paths — in `streamAgent` and
11
- `continueAfterToolResult` (`agent-stream.ts`) and in `runAgent` and
12
- `continueAfterToolResultSync` (`agent-runner.ts`) — is wrapped in its own
13
- `try/catch` that discards whatever the hook throws. The run is then marked
14
- `failed` with the original error message, and the original error propagates.
15
-
16
- `onError` is an observability hook: logging, metrics, alerting. A logger that is
17
- itself broken must not turn a diagnosable agent failure into a confusing one, and
18
- must not stop the remaining hooks from running or the run state from being
19
- updated.
20
-
21
- **What this rules out:** awaiting the hooks without a guard, and using `onError`
22
- as an error-transformation hook whose throw replaces the original failure.
@@ -1,22 +0,0 @@
1
- ---
2
- type: decision
3
- title: AI runner methods must be called on the runner, never as detached references
4
- description: Implementations use this internally, so grabbing transcribe or generateSpeech as a bare function loses the receiver and throws at runtime
5
- tags: agent
6
- ---
7
-
8
- # AI runner methods must be called on the runner, never as detached references
9
-
10
- The voice middlewares in `voice-input.ts` and `voice-output.ts` invoke
11
- `agentRunner.transcribe(...)` and `agentRunner.generateSpeech?.(...)` as
12
- method calls on the service object, and only ever test them for presence.
13
-
14
- `AgentRunnerService` is an interface implemented by classes — the reference
15
- implementation's `transcribe` calls `this.getModel(...)`. Extracting the method
16
- into a local (`const { transcribe } = services.agentRunner`) type-checks
17
- cleanly and then fails at runtime with `this` undefined. The regression is
18
- pinned by a runner in `voice-input.test.ts` whose `transcribe` deliberately reads
19
- instance state through `this`.
20
-
21
- **What this rules out:** destructuring runner methods for brevity, and passing
22
- `runner.transcribe` as a callback without binding it.
@@ -1,22 +0,0 @@
1
- ---
2
- type: decision
3
- title: Agent speech travels as a CUSTOM AG-UI event rather than being dropped
4
- description: AG-UI has no speech event, and dropping it makes a voice agent reached over HTTP silently inaudible while the provider still bills for the audio
5
- tags: core, agent
6
- ---
7
-
8
- # Agent speech travels as a CUSTOM AG-UI event
9
-
10
- The AG-UI protocol has no event type for synthesized speech, so the bridge
11
- forwards it as `CUSTOM`, the same way it forwards the other pikku-specific
12
- events.
13
-
14
- The alternative was tried: the mapper dropped the event, on the reasoning that a
15
- protocol without a speech event has no way to carry one. The result is a voice
16
- agent reached over HTTP that is completely silent — `voiceOutput` synthesizes
17
- every sentence, the provider bills for every one of them, and none of it gets
18
- past the mapper. Nothing errors, so there is nothing to find.
19
-
20
- **What this rules out:** filtering unknown event types at the AG-UI boundary as
21
- a tidiness measure. `CUSTOM` exists precisely so a protocol gap degrades to
22
- "the client ignores it" rather than "the server threw the work away".
@@ -1,27 +0,0 @@
1
- ---
2
- type: decision
3
- title: Persisting an agent stream from send is best-effort and must never reject
4
- description: The persisting channel flushes fire-and-forget because send is synchronous; a storage failure degrades the transcript instead of killing the process
5
- tags: agent
6
- ---
7
-
8
- # Persisting an agent stream from send is best-effort and must never reject
9
-
10
- `createPersistingChannel` in
11
- `packages/core/src/wirings/agent/agent-stream.ts` accumulates step text,
12
- tool calls and tool results, and writes them via `flushDetached` on the `usage`
13
- and `done` events. `AgentStreamChannel.send` is synchronous, so it cannot await the
14
- write. An unawaited rejection has nothing to propagate to and surfaces as an
15
- `unhandledRejection`, which takes the whole server process down — a model
16
- reusing a `toolCallId`, which is a primary key in AI storage, is enough to
17
- trigger it. `flushDetached` therefore catches and logs, and the run carries on.
18
-
19
- The awaited `flush()` on the suspend paths (`handleApprovals`,
20
- `handleCredentialRequests`) is the seam that still surfaces persistence failures
21
- to a caller. The regression test lives in `agent-stream.test.ts`; because the
22
- floating promise settles on a later macrotask, the assertion has to wait a real
23
- timer before checking that no `unhandledRejection` fired.
24
-
25
- **What this rules out:** letting `flushStep()` be called bare from `send`,
26
- rethrowing from the catch to "not hide" storage errors, and asserting on
27
- unhandled rejections synchronously after the last event.
@@ -1,26 +0,0 @@
1
- ---
2
- type: decision
3
- title: A delegated sub-agent inherits the parent run's context block
4
- description: The sub-agent tool schema carries only message and session, so the parent's identifier block is forwarded rather than re-typed by the model
5
- tags: agent
6
- ---
7
-
8
- # A delegated sub-agent inherits the parent run's context block
9
-
10
- `buildSubAgentRunInput` in
11
- `packages/core/src/wirings/agent/agent-prepare.ts` forwards the parent
12
- run's `AgentInput.context` — the "Current context" identifier block with
13
- organization, project and stage ids — into every delegated sub-agent run, on
14
- both the streaming and non-streaming paths. `buildToolDefs` threads it down as
15
- `parentContext` for the same reason.
16
-
17
- A sub-agent is exposed to the parent model as a tool whose input schema is only
18
- `{ message, session }`. Without inheritance the sub-agent never sees the
19
- authoritative ids and has to rely on the parent model re-typing them into
20
- `message`. Weaker models mangle that, and the result is schema and permission
21
- rejections followed by retry loops rather than a clean failure.
22
-
23
- **What this rules out:** constructing the sub-agent run input inline from
24
- `{ message, threadId, resourceId }`, widening the sub-agent tool schema so the
25
- model supplies the ids itself, and dropping `parentContext` from `buildToolDefs`
26
- because "nothing reads it here".
@@ -1,25 +0,0 @@
1
- ---
2
- type: decision
3
- title: A tool's execute() failure is logged before the AI SDK swallows it
4
- description: Every agent tool is wrapped in a logging try/catch, because a thrown tool error otherwise becomes a conversational reply and is invisible server-side
5
- tags: agent
6
- ---
7
-
8
- # A tool's execute() failure is logged before the AI SDK swallows it
9
-
10
- `buildToolDefs` in `packages/core/src/wirings/agent/agent-prepare.ts`
11
- wraps every tool it builds — RPC tools, sub-agent delegations and workflow tools
12
- alike — in a `try/catch` that logs through `singletonServices.logger` and
13
- rethrows.
14
-
15
- A tool's `execute()` can throw for ordinary reasons: bad model-supplied input, an
16
- RPC failure, a database error. The AI SDK catches that at the tool-call boundary
17
- and turns it into a conversational "tool error" reply to the model. The exception
18
- never reaches pikku's own logger, so without this wrapper a consistently failing
19
- tool is undiagnosable from the server side — the only symptom is an agent that
20
- keeps apologising. The wrapper is applied unconditionally, not only when an
21
- `agentMiddleware` `afterToolCall` hook happens to be registered.
22
-
23
- **What this rules out:** folding the logging into the optional middleware
24
- wrapper below it, and relying on the AI SDK's own error reporting for tool
25
- failures.
@@ -1,22 +0,0 @@
1
- ---
2
- type: decision
3
- title: Voice input transcribes audio parts sequentially and in place
4
- description: Each audio part is replaced by its text where it sat, one at a time, bounding concurrent downloads and preserving content order
5
- tags: agent
6
- ---
7
-
8
- # Voice input transcribes audio parts sequentially and in place
9
-
10
- The `voiceInput` middleware in
11
- `packages/core/src/wirings/agent/voice-input.ts` walks the last user
12
- message's content parts in order and swaps each audio part for a text part at the
13
- same index, awaiting one transcription before starting the next.
14
-
15
- Order matters because the surrounding text parts are the user's own framing of
16
- the audio; hoisting transcripts to the end would reorder the prompt. Sequencing
17
- matters because a message can carry many attachments: a `Promise.all` would fan
18
- out an unbounded number of concurrent multi-megabyte downloads and provider
19
- transcription calls from a single request.
20
-
21
- **What this rules out:** parallelizing the loop with `Promise.all`, and
22
- collecting transcripts into a separate block appended to the message.