@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,55 +0,0 @@
1
- ---
2
- type: decision
3
- title: A scaffolded surface is authenticated unless the config opts out in writing
4
- description: scaffold.<feature> became boolean | { auth, path }, where true means authenticated — going public requires typing { auth: false }, and the legacy 'auth' | 'no-auth' strings are refused rather than coerced
5
- tags: config, authorization, codegen, scaffold
6
- ---
7
-
8
- # A scaffolded surface is authenticated unless the config opts out in writing
9
-
10
- **Superseded by
11
- [[a-scaffold-flag-says-a-surface-exists-not-who-may-call-it]]**: the `auth`
12
- field is gone entirely, because the function runner already enforces each
13
- generated function's own auth. The reasoning below still explains why the
14
- legacy `'auth' | 'no-auth'` strings are refused rather than coerced.
15
-
16
- `scaffold.<feature>` was `'auth' | 'no-auth' | false`. Two things were wrong
17
- with it, and they compounded.
18
-
19
- The auth dimension asked the wrong question of some features and the right one
20
- of others. For `rpc` it is a blanket "no anonymous RPC in this app", set on a
21
- dispatcher that cannot know what it dispatches to — wrong the moment one
22
- legitimately public sessionless function exists. For `userAdmin` it was
23
- redundant: the generated functions are `pikkuFunc` with `scopes:
24
- ['admin:users:list']`, gated twice over already. But for `agent`, `workflow`,
25
- `events` and `scenarios` it was the _only_ gate, because those generate real
26
- endpoints the app never authors and has nowhere else to declare a gate for.
27
- A uniform collapse to boolean would have silently opened four surfaces.
28
-
29
- And the value read like a preference. `"rpc": "no-auth"` looks like a
30
- starter-file setting; it was a live authorization decision, three directories
31
- from the functions it governed. That is the shape the console incident took.
32
-
33
- The type is now `boolean | { auth?: boolean; path?: string }`. `true` means
34
- enabled **and authenticated**; a surface becomes public only by writing
35
- `{ auth: false }`. Omitting a field can then never open anything — the failure
36
- mode of a forgotten flag is a locked door. Features with no auth dimension
37
- (`webhook`, `remoteRpc`, whose generator hardcodes `auth: false`) simply ignore
38
- it.
39
-
40
- The object form is also what makes the legacy strings safe to remove. An
41
- earlier design used `string` for the output path, under which `"no-auth"` would
42
- have parsed as _a file named `no-auth`_ — every unmigrated config silently
43
- producing nonsense instead of failing. With `boolean | object`, a string is
44
- never valid, so `resolveScaffoldFeature` refuses `'auth'` and `'no-auth'` by
45
- name and prints the replacement. Coercing them was rejected outright: the value
46
- it would coerce to is the one that caused the incident.
47
-
48
- Reading happens once, in `pikku-cli-config.ts`, so a legacy value fails at load
49
- with the migration named rather than downstream where it has already become
50
- something plausible.
51
-
52
- **What this rules out:** a bare `true` that means "public"; inferring a
53
- feature's auth posture from its default; using `string` for the output path
54
- while the legacy string values still exist in the wild; and collapsing the auth
55
- dimension uniformly across features that do not all have one.
@@ -1,30 +0,0 @@
1
- ---
2
- type: decision
3
- title: Scenario-step functions are never externally invocable over RPC
4
- description: rpcExposed requires expose and rejects scenarioStep, so test steps stay reachable only from inside a scenario run
5
- tags: rpc
6
- ---
7
-
8
- # Scenario-step functions are never externally invocable over RPC
9
-
10
- `ContextAwareRPCService.rpcExposed` in
11
- `packages/core/src/wirings/rpc/rpc-runner.ts` is the entry point for RPCs that
12
- arrive from outside the process. It resolves the function's meta and throws
13
- `RPCNotFoundError` unless `functionMeta.expose` is set **and**
14
- `functionMeta.scenarioStep` is falsy — the same 404 an unknown name gets, so the
15
- existence of a hidden function is not disclosed.
16
-
17
- A scenario step is a piece of a test scenario: it may drive a browser, assert
18
- against fixtures, or reach for privileged setup helpers. Steps are dispatched by
19
- name from inside a scenario run through the internal `rpc` path, which does not
20
- consult `expose`. If a step were also reachable from the outside, any caller who
21
- guessed its name would get an unauthenticated handle on test tooling in whatever
22
- environment the scenario code shipped to.
23
-
24
- The two conditions are independent and both required: `expose` opts a function
25
- into the external surface, `scenarioStep` opts it back out regardless.
26
-
27
- **What this rules out:** collapsing the check to `!functionMeta.expose`,
28
- returning a distinct "forbidden" error that confirms the name exists, and routing
29
- external traffic through `rpc` instead of `rpcExposed` for convenience — `rpc`
30
- performs no exposure check at all.
@@ -1,28 +0,0 @@
1
- ---
2
- type: decision
3
- title: Scope resolution happens at the session boundary and scope sync never deletes
4
- description: ScopeService is called when a session is built, never by the function runner, and syncScopes only ever adds — revoking is an explicit operation
5
- tags: services
6
- ---
7
-
8
- # Scope resolution happens at the session boundary and scope sync never deletes
9
-
10
- Implementations of `ScopeService` (`packages/core/src/services/scope-service.ts`)
11
- are called at the session boundary — better-auth's `mapSession`, for instance —
12
- and never by the function runner. The runner reads `session.scopes` and performs
13
- no I/O of its own, which is what keeps it viable on Workers and Lambda. Because
14
- the session is rebuilt per request, a scope change takes effect on the next call:
15
- nothing is cached and there is nothing to invalidate.
16
-
17
- `syncScopes` is additive and never deletes. Scopes are declared in code, so a
18
- declaration removed in a deploy would otherwise revoke a live grant the moment
19
- the new build boots — silently, mid-rollout, for everyone holding it. Instead the
20
- row stays and goes inert: `listScopes` reports it as `declared: false`, no
21
- function can require it, `findStaleScopes` surfaces it for `pikku scopes audit`,
22
- and `pikku scopes prune` is the explicit act that removes it.
23
-
24
- **What this rules out:** having the function runner resolve scopes per call (it
25
- would put a store round-trip in every request path and break the Workers/Lambda
26
- story), caching resolved scopes anywhere, and making `syncScopes` reconcile —
27
- diffing declared against stored and deleting the difference. A deploy must never
28
- be able to revoke a grant as a side effect.
@@ -1,31 +0,0 @@
1
- ---
2
- type: decision
3
- title: Scoped content access is confined to a root folder, with longest-prefix grants outside it
4
- description: ScopedContentService keeps an addon inside its root folder, lets it reach the wider store only through read or write grants matched by longest prefix, and refuses signURL and copyFile
5
- tags: core, content, scoping, paths
6
- ---
7
-
8
- # Scoped content access is confined to a root folder, with longest-prefix grants outside it
9
-
10
- `packages/core/src/services/scoped-content-service.ts` narrows a `ContentService`
11
- to one folder. The doc comment describes the rule (`scoped-content-service.ts:57-67`).
12
-
13
- Paths are normalised first (`scoped-content-service.ts:39-49`). Each value is
14
- decoded up to four times (`scoped-content-service.ts:16`, `25-35`). A null byte,
15
- a leading `/` or `\`, or a `.` or `..` segment in any pass is refused
16
- (`scoped-content-service.ts:40-46`).
17
-
18
- A bucket that does not start with `@` is placed under the root
19
- (`scoped-content-service.ts:105-109`). A bucket that starts with `@` names a path
20
- from the store root. It is allowed if it sits under the root
21
- (`scoped-content-service.ts:113`). Otherwise the grants are checked, sorted
22
- longest prefix first (`scoped-content-service.ts:79-88`), and the first match
23
- decides (`scoped-content-service.ts:114-117`). A write needs a `write` grant
24
- (`scoped-content-service.ts:115`).
25
-
26
- `signURL` and `copyFile` throw unconditionally (`scoped-content-service.ts:126-128`,
27
- `145-147`). The doc comment says both take a finished URL or a local path, "so
28
- neither can be narrowed to a folder" (`scoped-content-service.ts:64-66`).
29
-
30
- **What this rules out:** traversal, including encoded traversal, out of the root,
31
- signed URLs for content outside the root, and copies that name arbitrary paths.
@@ -1,34 +0,0 @@
1
- ---
2
- type: decision
3
- title: Self-authentication is declared, not detected
4
- description: A function that authorizes callers in its own body says so with selfAuthenticated; codegen never tries to infer it
5
- tags: permissions, codegen
6
- ---
7
-
8
- # Self-authentication is declared, not detected
9
-
10
- Some functions are genuinely closed while carrying no session, scope or
11
- permission: a webhook receiver that verifies a signature, a handler that
12
- redeems a signed invite, an exchange endpoint that validates a token before it
13
- does anything. Nothing in meta distinguishes those from a function nobody
14
- remembered to gate, so `validateExposedFunctionsGated` (PKU574) would warn about
15
- them on every build.
16
-
17
- The fix is a declaration — `selfAuthenticated: true` on the function config —
18
- not analysis of the body. Detection would have to recognise an open-ended set of
19
- authorization idioms, and it fails in the expensive direction: a body that
20
- _looks_ like it checks something silences the warning for a function that
21
- checks nothing. A declaration cannot be wrong by accident. Someone typed it,
22
- it is greppable, and it survives into meta where an audit reads it as what it
23
- is — a claim by a named author, not an inference.
24
-
25
- It carries no runtime effect and grants nothing. Its entire job is to move a
26
- gate that codegen cannot see into a place where a human can, and to keep PKU574
27
- worth reading: a warning that is usually wrong stops being read, which costs
28
- more than the warning ever saved.
29
-
30
- **What this rules out:** inferring self-authentication from the function body or
31
- from what it imports; giving `selfAuthenticated` any runtime meaning (it must
32
- never be a way to skip a check the runtime would otherwise run); and dropping
33
- the PKU574 warning instead, which was the alternative that would have left every
34
- genuinely ungated function silent too.
@@ -1,22 +0,0 @@
1
- ---
2
- type: decision
3
- title: Contexts that must not hold secrets get a services bag whose secrets accessor throws
4
- description: withoutSecrets replaces the secrets entry with a non-enumerable getter that throws, so code outside the permitted contexts cannot reach the secret service
5
- tags: core, secrets, services
6
- ---
7
-
8
- # Contexts that must not hold secrets get a services bag whose secrets accessor throws
9
-
10
- `packages/core/src/services/secretless.ts` exports `withoutSecrets`. If the
11
- services object has no `secrets` key, it is returned unchanged
12
- (`secretless.ts:17-19`). Otherwise a shallow copy is made, and `secrets` is
13
- redefined as a getter that throws `SecretAccessDeniedError`
14
- (`secretless.ts:20-27`). The property is non-enumerable and configurable
15
- (`secretless.ts:25-26`), so a spread of the object does not copy it.
16
-
17
- The error message says `secrets` is confined to `pikkuServices`,
18
- `pikkuWireServices`, addon service factories and middleware, and tells the caller
19
- to give the service the secret at construction time instead (`secretless.ts:6`).
20
-
21
- **What this rules out:** reading `services.secrets` from a context that is not on
22
- that list, and a secret leaking through a copy of the services object.
@@ -1,34 +0,0 @@
1
- ---
2
- type: decision
3
- title: Shared guards refuse to mutate or shadow a system role, in every store
4
- description: system-role-guard holds the guards every ScopeService must call before changing a role, and roleLockReason gives the console a reason to show for a locked role
5
- tags: core, roles, scopes, guards
6
- ---
7
-
8
- # Shared guards refuse to mutate or shadow a system role, in every store
9
-
10
- `packages/core/src/services/system-role-guard.ts` is the shared guard that a
11
- `ScopeService` implementation must apply before it mutates a role. The doc
12
- comment says the rule is "a contract, not a policy", because a store that lets
13
- the console delete a declared role makes virtual user and scenario checks stop testing
14
- what they claim to (`system-role-guard.ts:7-15`).
15
-
16
- - `assertRoleIsMutable` throws `SystemRoleImmutableError` when the name is a
17
- system role (`system-role-guard.ts:27-35`). The caller names the operation in
18
- the message.
19
- - `assertRoleNameAvailable` throws `SystemRoleShadowedError` when a new custom
20
- role would take a declared name (`system-role-guard.ts:40-47`).
21
- - `isSystemRole` is passed in, so an implementation can answer from a column, a
22
- cache or a query (`system-role-guard.ts:17-18`, `20`).
23
-
24
- `roleLockReason` (`system-role-guard.ts:56-71`) returns a reason string for a
25
- system role, or `null` when it is editable. A role whose declaration was removed
26
- gets a message that says it is inert and points to `pikku roles prune`
27
- (`system-role-guard.ts:60-66`). The doc comment says a reason is shown "instead
28
- of a disabled button with no explanation" (`system-role-guard.ts:52-54`).
29
-
30
- Sibling note: [system roles are synced additively and cannot be deleted or
31
- rewritten](system-roles-are-additive-and-immutable.md).
32
-
33
- **What this rules out:** a store deleting, re-scoping or shadowing a declared
34
- role, and a locked role shown without a reason.
@@ -1,37 +0,0 @@
1
- ---
2
- type: decision
3
- title: Signed content URLs bind the request path and verify fail-closed
4
- description: A signature that only carries timestamps authorizes every asset, and a verifier with no key must refuse rather than allow
5
- tags: content
6
- ---
7
-
8
- # Signed content URLs bind the request path and verify fail-closed
9
-
10
- `LocalContent` signs a payload containing the decoded request path, and the
11
- verifier in `pikku-node-http-server.ts` compares it against the path actually
12
- requested. `LocalContent` requires a `JWTService` and throws without one; a
13
- verifier with no key available rejects with 403 rather than allowing the
14
- request, logging once per process so an attacker-triggerable path cannot flood.
15
-
16
- A signature over `{signedAt, expiresAt, notBefore}` alone proves only _when_ a
17
- URL was issued, never _what_ it was issued for. Any valid token was a skeleton
18
- key: swap the pathname from a public thumbnail to a private document and the
19
- signature still verifies. Timestamps bound the window; only the path binds the
20
- asset.
21
-
22
- The path is the representation both signing entry points can produce and the
23
- verifier can reconstruct — it sees a request line, and cannot recover the
24
- bucket/key split from it. `signedContentPath` normalizes both sides identically
25
- (pathname only, origin and query dropped, `decodeURIComponent` falling back to
26
- the raw pathname on a malformed escape) so a difference in encoding cannot
27
- become a difference in verdict.
28
-
29
- `pikku serve` and `pikku dev` mint an ephemeral per-process signing key, so
30
- local content serving works with no configuration without shipping a fail-open
31
- path. URLs signed by one dev-server process are meaningless to the next, which
32
- is the correct lifetime for a dev secret.
33
-
34
- **What this rules out:** signing a URL without binding it to what it grants;
35
- returning "valid" from a verifier that could not check anything; normalizing the
36
- path differently on the two sides; and constructing `LocalContent` without a
37
- JWT service.
@@ -1,26 +0,0 @@
1
- ---
2
- type: decision
3
- title: Signed uploads are verified by the same check as signed reads
4
- description: The local content handler refuses an upload whose presigned URL does not verify, using the same exported verifier that signed reads use
5
- tags: core, content, security
6
- ---
7
-
8
- # Signed uploads are verified by the same check as signed reads
9
-
10
- `verifySignedContentRequest` in
11
- `packages/core/src/services/local-content-request-handler.ts:60-72` is the one
12
- function that decides whether a signed read or a signed upload is genuine. It is
13
- exported so every runtime that serves content verifies the same way.
14
-
15
- The handler's `validateSignedAssetRequest` wraps it (`:146-149`).
16
- `handleUpload` calls that wrapper before writing anything and returns the failure
17
- response when the check does not pass (`:157-169`). The comment at `:162-165`
18
- gives the reason: without the check, an unauthenticated PUT could write to any
19
- key under the content root.
20
-
21
- The existing note `signed-content-urls-bind-the-request-path.md` covers the read
22
- side and the node server verifier; this note covers the upload path in the core
23
- handler.
24
-
25
- **What this rules out:** writing an upload key before its signed URL has verified,
26
- and a separate upload check that could drift from the read check.
@@ -1,24 +0,0 @@
1
- ---
2
- type: decision
3
- title: System role scopes must be declared with defineScope, or the build fails
4
- description: A system role may grant only scope ids that defineScope declares, and the bare wildcard is refused; both are critical inspector diagnostics, so a role cannot grant a scope no function checks
5
- tags: core, roles, scopes, inspector
6
- ---
7
-
8
- # System role scopes must be declared with defineScope, or the build fails
9
-
10
- The type doc on `CoreSystemRole.scopes` says every id a role grants "must be declared with `defineScope` — the inspector fails the build otherwise, so a role cannot quietly grant a scope that no function checks" (`packages/core/src/wirings/role/role.types.ts:15-19`).
11
-
12
- The check is `validateSystemRoleScopes` in `packages/inspector/src/utils/post-process.ts:1745-1775`. It walks every `state.systemRoles.definitions` entry and each of its scopes:
13
-
14
- - The bare `*` is reported as critical and skipped (`post-process.ts:1757-1763`).
15
- - A trailing `:*` is stripped before the lookup (`post-process.ts:1765`), so `admin:*` needs `admin` to be declared.
16
- - Any other scope missing from the set built from `state.scopes.definitions` is reported as critical, with the list of available scopes (`post-process.ts:1766-1771`).
17
-
18
- It runs from the validation pass in `packages/inspector/src/inspector.ts:580-581`, straight after `applyDeclaredScopes` and `validateScopeReferences`.
19
-
20
- Critical diagnostics are what block the build by default. The `diagnostic` doc in `packages/inspector/src/types.ts:400-403` says `error` and `warn` block only under `--fail-on-error` / `--fail-on-warn`, with the default at critical only.
21
-
22
- The literal-array and unqualified-name rules for `defineSystemRole` are a separate check, covered in [System roles must declare literal, unqualified scopes](../../../../inspector/knowledge/decisions/system-roles-declare-literal-unqualified-scopes.md). The runtime side, where a synced role can only add grants, is in [System roles are synced additively and cannot be deleted or rewritten](system-roles-are-additive-and-immutable.md).
23
-
24
- **What this rules out:** a system role that grants a scope no `defineScope` declares, which no function would ever check. It also rules out a role granting bare `*`, which would hide what the role confers. Neither is a warning to tolerate; both stop the build.
@@ -1,16 +0,0 @@
1
- ---
2
- type: decision
3
- title: System roles are never deleted by a deploy, but their scope set follows the declaration, and the admin API cannot change them
4
- description: syncSystemRoles keeps a role row whose declaration has gone (marked declared false) but replaces a declared role's scope set; deleteRole and setRoleScopes refuse system roles
5
- tags: core, scopes, roles
6
- ---
7
-
8
- # System roles are never deleted by a deploy, but their scope set follows the declaration, and the admin API cannot change them
9
-
10
- `syncSystemRoles` is documented in `packages/core/src/services/scope-service.ts:36-47`. It is additive for the **role row**: a role whose `defineSystemRole` declaration has gone is left in place and marked `declared: false`, so a rollback or a rolling deploy cannot strip everyone's grant.
11
-
12
- It is **not** additive for the role's **scopes**. The same comment says "A role's scope set *is* re-synced, because that is the declaration's whole content" (`scope-service.ts:41-43`). The Kysely implementation does this by deleting the role's `pikkuRoleScopes` rows and inserting the declared ones inside one transaction (`packages/services/kysely/src/kysely-scope-service.ts:136-145`). A deploy that stops declaring a scope therefore removes it from that role. Only system rows are marked stale (`kysely-scope-service.ts:148-160`).
13
-
14
- `deleteRole` and `setRoleScopes` throw `SystemRoleImmutableError` for a system role. Changing a system role's grants is therefore a code change plus a deploy, not an admin action at runtime. Scope sync itself (`syncScopes`) never deletes; see [scope resolution](scope-resolution-happens-at-the-session-boundary-and-sync-never-deletes.md).
15
-
16
- **What this rules out:** an admin editing or deleting a system role through the normal role API, and a deploy deleting a system role row. It does not rule out a deploy removing a scope from a declared role. That is how a role's meaning is changed.
@@ -1,21 +0,0 @@
1
- ---
2
- type: decision
3
- title: The channel RPC does not put the caller's session on the wire
4
- description: ChannelDeploymentService.invoke accepts a session only to satisfy the DeploymentService shape and never sends it, so the peer runs the capability as itself
5
- tags: core, channel, rpc, security
6
- ---
7
-
8
- # The channel RPC does not put the caller's session on the wire
9
-
10
- The doc comment on `ChannelDeploymentService.invoke` in
11
- `packages/core/src/wirings/channel/channel-rpc-service.ts:55-60` says `session`
12
- is accepted to satisfy `DeploymentService` and is deliberately not sent. The peer
13
- runs the capability as itself, on its own machine, and a session on the wire
14
- would carry the caller's credentials while authorising nothing.
15
-
16
- The signature takes the value as `_session?: unknown` (`:61-65`). The request
17
- sent on the channel carries `action`, `id`, `funcName`, `data` and `traceId` (`:88-94`), and
18
- the file does not refer to the session elsewhere in `invoke`.
19
-
20
- **What this rules out:** forwarding the caller's session to a channel peer, and
21
- treating a session on this path as an authorisation the peer will honour.
@@ -1,24 +0,0 @@
1
- ---
2
- type: decision
3
- title: The remote jobs inbox rejects every caller when its secret is unset
4
- description: remoteJobsSecret refuses all requests when the dispatch secret variable is empty, and compares the header in constant time when it is set
5
- tags: core, remote-jobs, secrets, middleware
6
- ---
7
-
8
- # The remote jobs inbox rejects every caller when its secret is unset
9
-
10
- `packages/core/src/middleware/remote-jobs-secret.ts` guards the remote job inbox.
11
- The doc comment says it "fails closed: an unset secret rejects every caller, so
12
- the routes are never open just because the deployment forgot to configure one"
13
- (`remote-jobs-secret.ts:18-21`).
14
-
15
- The check rejects when any of three things is true (`remote-jobs-secret.ts:26-31`):
16
- the expected value is empty, the provided header is not a string, or the two
17
- values differ. All three throw `UnauthorizedError` (`remote-jobs-secret.ts:31`).
18
-
19
- The comparison is `constantTimeEqual` (`remote-jobs-secret.ts:8-15`), which XORs
20
- each character code and accumulates the result. It returns early on a length
21
- mismatch (`remote-jobs-secret.ts:9`), so the length of the secret is not hidden.
22
-
23
- **What this rules out:** an open inbox on a deployment that has not set the
24
- secret, and a plain `===` comparison of the secret.
@@ -1,34 +0,0 @@
1
- ---
2
- type: decision
3
- title: The remote RPC gate fails closed and binds a token to one function
4
- description: pikkuRemoteAuthMiddleware refuses a remote-RPC request unless the mesh token is audience pikku-remote, names the requested function, and carries a session that decrypts under the mesh secret
5
- tags: core, auth, remote
6
- ---
7
-
8
- # The remote RPC gate fails closed and binds a token to one function
9
-
10
- `pikkuRemoteAuthMiddleware` (`packages/core/src/middleware/remote-auth.ts`)
11
- guards the receiving end of a mesh call, which `buildRemoteHeaders`
12
- (`packages/core/src/remote.ts`) signs from the caller side. Where the code and
13
- its tests state a rule:
14
-
15
- - With no `PIKKU_REMOTE_SECRET`, a request whose path is under `/remote/rpc/` is
16
- refused. The path check is case-insensitive, and the test
17
- "requires authorization for a case-varied remote path when no secret is set"
18
- says why.
19
- - With the secret set but no JWT service, the middleware throws rather than
20
- passing the request on.
21
- - A missing header, a scheme other than `Bearer`, a token that fails to decode,
22
- or an audience other than `pikku-remote` is `UnauthorizedError`.
23
- - A token carrying `fn` is only accepted for the function it names on a remote
24
- path. The test "should skip fn check for non-RPC paths even if fn in token"
25
- confirms the binding is about the RPC surface.
26
- - The session claim is decrypted under `PIKKU_REMOTE_SECRET` with
27
- `REMOTE_SESSION_INFO`, which `buildRemoteHeaders` encrypts. A decryption
28
- failure is `UnauthorizedError`, so a session is never read as plain claims.
29
-
30
- **What this rules out:** accepting a mesh token with the wrong audience, reusing
31
- a token minted for one function on another RPC path, and reading the session
32
- claim without decrypting it. The gap for requests outside `/remote/rpc/` once the
33
- secret is set is recorded in
34
- [Does a non-remote request need a remote token once the secret is set?](../../questions/remote-secret-refuses-requests-without-a-remote-token-on-every-path.md).
@@ -1,16 +0,0 @@
1
- ---
2
- type: decision
3
- title: The workflow status stream re-checks run ownership on every poll and closes when access is lost
4
- description: streamWorkflowRunStatus asserts the run owner on each poll rather than once when the stream opens, and closes the channel when that check throws
5
- tags: core, workflow, security, streaming
6
- ---
7
-
8
- # The workflow status stream re-checks run ownership on every poll and closes when access is lost
9
-
10
- `streamWorkflowRunStatus` defines `poll`, which reads the run and calls `assertWorkflowRunOwner(run.wire, session)` on every read (`packages/core/src/wirings/workflow/workflow-status-stream.ts:63-72`). The comment says ownership is read from the run itself, so a stream that outlives its session should stop rather than keep reporting (`:69-71`).
11
-
12
- The polling loop runs inside a `try` (`:142`). A throw from any poll, including the ownership refusal, runs `channel.close()` and rethrows (`:159-161`). The comment at `:139-141` names this case.
13
-
14
- `assertWorkflowRunOwner` is in `packages/core/src/wirings/workflow/workflow-run-ownership.ts:26-36`. It returns when the run has no recorded owner, and throws `WorkflowRunForbiddenError` when the session's `userId` does not match the owner (`:26-35`).
15
-
16
- **What this rules out:** checking ownership only when the stream opens, and leaving a stream open after its ownership check throws.
@@ -1,29 +0,0 @@
1
- ---
2
- type: decision
3
- title: Two credentials resolving to one key must agree on whether they are per-user or singleton
4
- description: buildCredentialResolutions throws when two credentials resolve to the same stored key but would be read in different modes, so one cannot silently serve the other's value
5
- tags: core, credentials, overrides, wire
6
- ---
7
-
8
- # Two credentials resolving to one key must agree on whether they are per-user or singleton
9
-
10
- `packages/core/src/wirings/credential/credential-overrides.ts` decides, for each
11
- credential the package declares, where its value is read from.
12
-
13
- An override is either a string, which renames the credential, or an object with a
14
- `name` and a `mode` (`credential-overrides.ts:9-16`). The doc comment says the
15
- object form "decides where its value is read from", so one addon can serve a
16
- per-user product and a team account (`credential-overrides.ts:5-7`).
17
-
18
- For each name, the resolved key is the override's name or the name itself
19
- (`credential-overrides.ts:56-57`). The mode is the override's `mode`, or else the
20
- type the author declared (`credential-overrides.ts:59-63`). A credential with no
21
- override keeps its declared type (`credential-overrides.ts:38-40`).
22
-
23
- If a key is already claimed with a different mode, the function throws
24
- (`credential-overrides.ts:65-74`). The message says the loser "would silently read
25
- the other's value — a per-user credential served from the deployment's own account,
26
- or the reverse" (`credential-overrides.ts:70-72`).
27
-
28
- **What this rules out:** a per-user credential and a deployment credential sharing
29
- one stored key, with one quietly serving the other.
@@ -1,23 +0,0 @@
1
- ---
2
- type: decision
3
- title: Verified bearer claims are pass-through data that core never fills
4
- description: PikkuHTTP.authInfo is a typed slot for claims a host has already verified; core declares it and no core source assigns it from request headers
5
- tags: core, http, auth
6
- ---
7
-
8
- # Verified bearer claims are pass-through data that core never fills
9
-
10
- The doc comment on `PikkuHTTPAuthInfo` in `packages/core/src/wirings/http/http.types.ts:67-74`
11
- says the claims are strictly pass-through: nothing in pikku derives them from a
12
- request's headers, because verifying a token is the host's job. The field carries
13
- what the raw `Authorization` header cannot: the scopes and client the token was
14
- issued for.
15
-
16
- The interface is at `http.types.ts:79-88`, and `authInfo?: PikkuHTTPAuthInfo` is on
17
- `PikkuHTTP` at `:94`. A search of `packages/core/src` finds only the type and its
18
- re-export (`packages/core/src/wirings/http/index.ts:23`). The comment at `:76-77`
19
- says the MCP SDK is the one caller that populates it, and that is outside this
20
- package.
21
-
22
- **What this rules out:** deriving `scopes`, `clientId` or `token` from the
23
- `Authorization` header inside core.
@@ -1,25 +0,0 @@
1
- ---
2
- type: decision
3
- title: The virtual user catalogue excludes any RPC scoped under virtualUser
4
- description: deriveCatalogue drops every function whose scope begins with virtualUser, so a virtual user holding those scopes cannot start runs, read findings or set schedules through the catalogue
5
- tags: core, virtual-users, catalogue, scopes
6
- ---
7
-
8
- # The virtual user catalogue excludes any RPC scoped under virtualUser
9
-
10
- `packages/core/src/wirings/virtual-user/virtual-user-derive.ts` builds the catalogue of
11
- RPCs a virtual user could reach. It skips a function whose scope list contains any
12
- scope whose first segment is `virtualUser` (`virtual-user-derive.ts:38-46`, the
13
- test at line 44).
14
-
15
- The comment gives the reasons. A virtual user whose role carries `virtualUser:*` could
16
- otherwise start more runs, read every run's findings (an adversarial run's
17
- transcript is "working exploits against this same app"), and put a virtual user on a
18
- schedule "that outlives it" (`virtual-user-derive.ts:39-43`).
19
-
20
- The same function also skips scenario steps (`virtual-user-derive.ts:35`) and
21
- functions that are not exposed (`virtual-user-derive.ts:37`). Those rules are
22
- recorded in other notes.
23
-
24
- **What this rules out:** a virtual user reaching the run-control or schedule RPCs
25
- through its own catalogue, and an adversarial run reading its own findings.
@@ -1,22 +0,0 @@
1
- ---
2
- type: decision
3
- title: A virtual user's missing approval decision defaults to denied
4
- description: Every pending tool call gets an explicit decision; an id the virtual user LLM omitted is denied, so a dropped field can never read as consent
5
- tags: virtual-user-conversation
6
- ---
7
-
8
- # A virtual user's missing approval decision defaults to denied
9
-
10
- `decideApprovals` in
11
- `packages/core/src/wirings/virtual-user/conversation/run-conversation.ts` maps over the
12
- target agent's `pendingApprovals`, not over the decisions the virtual user LLM
13
- returned. Any `toolCallId` the model omitted, hallucinated, or renamed resolves
14
- to `approved: false`.
15
-
16
- The virtual user's decision comes from a structured LLM call, and structured output
17
- is not guaranteed to be complete. Iterating the model's array instead would make
18
- an omission indistinguishable from silence — and silence would let a scenario
19
- approve a destructive tool call nobody decided on, then pass.
20
-
21
- **What this rules out:** building the decision list from the LLM's `decisions`
22
- array, and defaulting an unmatched call to `true` to keep a conversation moving.
@@ -1,18 +0,0 @@
1
- ---
2
- type: decision
3
- title: Virtual user run records are privileged, and reads are gated behind their own scope
4
- description: The generated read RPCs carry virtualUser:read while starting a run carries virtualUser:run, because adversarial findings are working exploits with live ids
5
- tags: core, cli, virtual-users, scopes, security
6
- ---
7
-
8
- # Virtual user run records are privileged, and reads sit behind a scope
9
-
10
- `packages/core/src/wirings/virtual-user/virtual-user-run-store.ts` defines where runs and their findings are kept. Its SECURITY note says findings from an `adversarial` run are "working exploits carrying live ids", so the store is "a privileged store". The scaffold "gates every read behind a scope for that reason", and a host that exposes these records more widely "is publishing its own exploits" (`virtual-user-run-store.ts:101-105`).
11
-
12
- The gate is generated by the CLI, not written in core. `packages/cli/src/functions/wirings/virtual-user/serialize-virtual-user-functions.ts` emits `scopes: ['virtualUser:read']` on `getVirtualUserRun` (line 393), `listVirtualUserRuns` (line 414), `getVirtualUserRunSteps` (line 435) and `listVirtualUserSchedules` (line 477). Starting a run is `scopes: ['virtualUser:run']` (line 328). The three scopes are declared by `defineScope` in the same file (lines 308-320), and `virtual-user-functions.test.ts` asserts each one (lines 53, 66, 149, 150).
13
-
14
- The disposition that makes findings sensitive is defined in `virtual-user.types.ts`, where `adversarial` "probes authorization and tenancy; a 2xx can be the finding" (`virtual-user.types.ts:15`).
15
-
16
- A virtual user cannot reach these RPCs through the catalogue, because the catalogue excludes any function whose scope starts with `virtualUser` (`virtual-user-derive.ts:38-46`).
17
-
18
- **What this rules out:** exposing run records, and their transcripts, to any caller who holds the virtual user's scopes but not `virtualUser:read`, and a virtual user starting or reading runs through its own catalogue.
@@ -1,25 +0,0 @@
1
- ---
2
- type: decision
3
- title: Virtual user sign-in endpoints do not exist in production
4
- description: The plugin registers the statement, in-process and switcher endpoints only when the sign-in gate is open at construction, and creating a row is dev-only
5
- tags: services
6
- ---
7
-
8
- # Virtual user sign-in endpoints do not exist in production
9
-
10
- Virtual users never run in production, and the disposition and environment refusals
11
- enforce that at request time. On top of them, the plugin resolves
12
- `resolveVirtualUserSignIn()` once, at construction, and registers the statement
13
- endpoint, `signInVirtualUserInternal` and the switcher only when the gate is open —
14
- `pikku dev`, or the explicit stage opt-in. In production none of them is registered:
15
- there is no route to refuse and no handler to reach through `auth.api`.
16
-
17
- This replaces "always registered, refused per request" because a refusal is code that
18
- has to be right on every request, while an endpoint that was never built cannot be
19
- reached by a bug in it.
20
-
21
- Creating a row stays under `pikku dev`. A stage signs in only to virtual users
22
- provisioned at startup.
23
-
24
- **What this rules out:** deciding at request time whether the endpoint exists, and
25
- letting a stage create virtual user rows by signing in.