@pikku/core 0.12.83 → 0.12.86

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 (661) hide show
  1. package/CHANGELOG.md +492 -0
  2. package/README.md +1 -1
  3. package/dist/bootstrap-compat/root.d.ts +20 -0
  4. package/dist/classification/column-form.d.ts +32 -0
  5. package/dist/classification/column-form.js +42 -0
  6. package/dist/classification/data-classification.d.ts +64 -0
  7. package/dist/classification/index.d.ts +13 -0
  8. package/dist/classification/index.js +2 -0
  9. package/dist/classification/secret-value.d.ts +56 -0
  10. package/dist/classification/secret-value.js +46 -0
  11. package/dist/crypto-utils.d.ts +1 -1
  12. package/dist/ecosystem/agent-scorer.d.ts +12 -0
  13. package/dist/ecosystem/agent-scorer.js +5 -0
  14. package/dist/ecosystem/agent.d.ts +21 -0
  15. package/dist/ecosystem/agent.js +6 -0
  16. package/dist/ecosystem/channel/local.d.ts +3 -0
  17. package/dist/ecosystem/channel/local.js +3 -0
  18. package/dist/ecosystem/channel/serverless.d.ts +9 -0
  19. package/dist/ecosystem/channel/serverless.js +1 -0
  20. package/dist/ecosystem/channel.d.ts +15 -0
  21. package/dist/ecosystem/channel.js +5 -0
  22. package/dist/ecosystem/cli/channel.d.ts +16 -0
  23. package/dist/ecosystem/cli/channel.js +2 -0
  24. package/dist/ecosystem/cli.d.ts +9 -0
  25. package/dist/ecosystem/cli.js +2 -0
  26. package/dist/ecosystem/credential.d.ts +10 -0
  27. package/dist/ecosystem/credential.js +1 -0
  28. package/dist/ecosystem/crypto-utils.d.ts +8 -0
  29. package/dist/ecosystem/crypto-utils.js +1 -0
  30. package/dist/ecosystem/dev.d.ts +9 -0
  31. package/dist/ecosystem/dev.js +2 -0
  32. package/dist/ecosystem/errors.d.ts +8 -0
  33. package/dist/ecosystem/errors.js +2 -0
  34. package/dist/ecosystem/function.d.ts +13 -0
  35. package/dist/ecosystem/function.js +2 -0
  36. package/dist/ecosystem/gateway.d.ts +1 -0
  37. package/dist/ecosystem/hmac.d.ts +1 -0
  38. package/dist/ecosystem/hmac.js +1 -0
  39. package/dist/ecosystem/http.d.ts +13 -0
  40. package/dist/ecosystem/http.js +5 -0
  41. package/dist/ecosystem/mcp.d.ts +3 -0
  42. package/dist/ecosystem/mcp.js +2 -0
  43. package/dist/ecosystem/middleware.d.ts +18 -0
  44. package/dist/ecosystem/middleware.js +7 -0
  45. package/dist/ecosystem/node-host-resolver.d.ts +1 -0
  46. package/dist/ecosystem/node-host-resolver.js +1 -0
  47. package/dist/ecosystem/node.d.ts +1 -0
  48. package/dist/ecosystem/oauth2.d.ts +1 -0
  49. package/dist/ecosystem/oauth2.js +1 -0
  50. package/dist/ecosystem/persona.d.ts +17 -0
  51. package/dist/ecosystem/persona.js +5 -0
  52. package/dist/ecosystem/queue.d.ts +13 -0
  53. package/dist/ecosystem/queue.js +4 -0
  54. package/dist/ecosystem/remote.d.ts +8 -0
  55. package/dist/ecosystem/remote.js +1 -0
  56. package/dist/ecosystem/role.d.ts +4 -0
  57. package/dist/ecosystem/role.js +2 -0
  58. package/dist/ecosystem/rpc.d.ts +6 -0
  59. package/dist/ecosystem/rpc.js +3 -0
  60. package/dist/ecosystem/safe-fetch.d.ts +7 -0
  61. package/dist/ecosystem/safe-fetch.js +1 -0
  62. package/dist/ecosystem/scenario.d.ts +21 -0
  63. package/dist/ecosystem/scenario.js +8 -0
  64. package/dist/ecosystem/scheduler.d.ts +3 -0
  65. package/dist/ecosystem/scheduler.js +2 -0
  66. package/dist/ecosystem/schema.d.ts +2 -0
  67. package/dist/ecosystem/schema.js +1 -0
  68. package/dist/ecosystem/scope.d.ts +5 -0
  69. package/dist/ecosystem/scope.js +3 -0
  70. package/dist/ecosystem/secret.d.ts +11 -0
  71. package/dist/ecosystem/secret.js +2 -0
  72. package/dist/ecosystem/services/istanbul-coverage.d.ts +1 -0
  73. package/dist/ecosystem/services/istanbul-coverage.js +1 -0
  74. package/dist/ecosystem/services/local-content-request-handler.d.ts +9 -0
  75. package/dist/ecosystem/services/local-content-request-handler.js +1 -0
  76. package/dist/ecosystem/services/local-content.d.ts +2 -0
  77. package/dist/ecosystem/services/local-content.js +1 -0
  78. package/dist/ecosystem/services/local-meta.d.ts +1 -0
  79. package/dist/ecosystem/services/local-meta.js +1 -0
  80. package/dist/ecosystem/services/v8-coverage.d.ts +1 -0
  81. package/dist/ecosystem/services/v8-coverage.js +1 -0
  82. package/dist/ecosystem/services.d.ts +36 -0
  83. package/dist/ecosystem/services.js +12 -0
  84. package/dist/ecosystem/testing.d.ts +7 -0
  85. package/dist/ecosystem/testing.js +1 -0
  86. package/dist/ecosystem/trigger.d.ts +2 -0
  87. package/dist/ecosystem/trigger.js +1 -0
  88. package/dist/ecosystem/types.d.ts +12 -0
  89. package/dist/ecosystem/types.js +6 -0
  90. package/dist/ecosystem/variable.d.ts +9 -0
  91. package/dist/ecosystem/variable.js +1 -0
  92. package/dist/ecosystem/virtual-user.d.ts +24 -0
  93. package/dist/ecosystem/virtual-user.js +8 -0
  94. package/dist/ecosystem/workflow.d.ts +20 -0
  95. package/dist/ecosystem/workflow.js +6 -0
  96. package/dist/errors/index.d.ts +8 -0
  97. package/dist/errors/index.js +1 -0
  98. package/dist/errors/serialized-error.d.ts +7 -0
  99. package/dist/errors/serialized-error.js +1 -0
  100. package/dist/function/function-meta.types.d.ts +139 -0
  101. package/dist/function/function-meta.types.js +1 -0
  102. package/dist/function/function-runner.d.ts +3 -2
  103. package/dist/function/function-runner.js +31 -11
  104. package/dist/function/functions.types.d.ts +10 -2
  105. package/dist/function/index.d.ts +8 -2
  106. package/dist/function/index.js +4 -1
  107. package/dist/function/pikku-request.d.ts +8 -0
  108. package/dist/function/pikku-request.js +15 -0
  109. package/dist/index.d.ts +8 -8
  110. package/dist/index.js +3 -3
  111. package/dist/middleware/auth-apikey.d.ts +2 -10
  112. package/dist/middleware/auth-apikey.js +1 -1
  113. package/dist/middleware/auth-bearer.d.ts +2 -10
  114. package/dist/middleware/auth-bearer.js +1 -1
  115. package/dist/middleware/auth-cookie.d.ts +2 -10
  116. package/dist/middleware/auth-cookie.js +1 -1
  117. package/dist/middleware/cors.d.ts +5 -11
  118. package/dist/middleware/cors.js +13 -6
  119. package/dist/middleware/index.d.ts +3 -0
  120. package/dist/middleware/index.js +1 -0
  121. package/dist/middleware/middleware-factories.d.ts +9 -0
  122. package/dist/middleware/middleware-factories.js +19 -0
  123. package/dist/middleware/middleware.types.d.ts +27 -0
  124. package/dist/middleware/middleware.types.js +1 -0
  125. package/dist/middleware/remote-auth.d.ts +1 -1
  126. package/dist/middleware/remote-auth.js +1 -1
  127. package/dist/middleware/telemetry.d.ts +4 -20
  128. package/dist/middleware/telemetry.js +1 -1
  129. package/dist/middleware-runner.d.ts +2 -1
  130. package/dist/pikku-state.d.ts +2 -1
  131. package/dist/services/{ai-run-state-service.d.ts → agent-run-state-service.d.ts} +5 -5
  132. package/dist/services/agent-run-state-service.js +1 -0
  133. package/dist/services/{ai-agent-runner-service.d.ts → agent-runner-service.d.ts} +12 -12
  134. package/dist/services/agent-runner-service.js +1 -0
  135. package/dist/services/{ai-storage-service.d.ts → agent-storage-service.d.ts} +7 -7
  136. package/dist/services/agent-storage-service.js +1 -0
  137. package/dist/services/audit-service.d.ts +1 -1
  138. package/dist/services/credential-wire-service.js +1 -1
  139. package/dist/services/email-service.d.ts +1 -1
  140. package/dist/services/file-scenario-run-store.d.ts +58 -0
  141. package/dist/services/file-scenario-run-store.js +214 -0
  142. package/dist/services/http-personas.d.ts +1 -1
  143. package/dist/services/http-personas.js +3 -3
  144. package/dist/services/{in-memory-ai-run-state-service.d.ts → in-memory-agent-run-state-service.d.ts} +5 -5
  145. package/dist/services/{in-memory-ai-run-state-service.js → in-memory-agent-run-state-service.js} +1 -1
  146. package/dist/services/in-memory-workflow-service.d.ts +1 -1
  147. package/dist/services/index.d.ts +9 -5
  148. package/dist/services/index.js +4 -1
  149. package/dist/services/local-secrets.d.ts +1 -1
  150. package/dist/services/local-secrets.js +1 -1
  151. package/dist/services/logger.d.ts +7 -7
  152. package/dist/services/meta-service.d.ts +5 -4
  153. package/dist/services/scoped-secret-service.d.ts +1 -1
  154. package/dist/services/secret-service.d.ts +1 -1
  155. package/dist/services/typed-secret-service.d.ts +16 -2
  156. package/dist/services/typed-secret-service.js +5 -0
  157. package/dist/services/webhook-service.d.ts +1 -1
  158. package/dist/services/workflow-service.d.ts +2 -1
  159. package/dist/testing/index.d.ts +1 -0
  160. package/dist/testing/index.js +1 -0
  161. package/dist/testing/service-tests/agent-run-service-tests.d.ts +1 -1
  162. package/dist/testing/service-tests/agent-run-service-tests.js +3 -3
  163. package/dist/testing/service-tests/agent-storage-service-tests.d.ts +3 -0
  164. package/dist/testing/service-tests/{ai-storage-service-tests.js → agent-storage-service-tests.js} +4 -4
  165. package/dist/testing/service-tests.d.ts +4 -4
  166. package/dist/testing/service-tests.js +4 -4
  167. package/dist/types/core.types.d.ts +37 -187
  168. package/dist/types/core.types.js +1 -19
  169. package/dist/types/index.d.ts +2 -0
  170. package/dist/types/index.js +1 -0
  171. package/dist/types/state.types.d.ts +8 -6
  172. package/dist/utils.d.ts +13 -0
  173. package/dist/utils.js +2 -0
  174. package/dist/wirings/actor-flow/run-conversation.d.ts +2 -2
  175. package/dist/wirings/addon/addon-runner.d.ts +17 -0
  176. package/dist/wirings/addon/addon-runner.js +150 -0
  177. package/dist/wirings/addon/index.d.ts +6 -0
  178. package/dist/wirings/addon/index.js +3 -0
  179. package/dist/wirings/addon/remote-addon-auth.d.ts +16 -0
  180. package/dist/wirings/addon/remote-addon-auth.js +39 -0
  181. package/dist/wirings/addon/wire-addon.d.ts +80 -0
  182. package/dist/wirings/addon/wire-addon.js +120 -0
  183. package/dist/wirings/addon/wire-remote-addon.d.ts +22 -0
  184. package/dist/wirings/addon/wire-remote-addon.js +11 -0
  185. package/dist/wirings/{ai-agent/ai-agent-agui.d.ts → agent/agent-agui.d.ts} +2 -2
  186. package/dist/wirings/{ai-agent/ai-agent-agui.js → agent/agent-agui.js} +1 -1
  187. package/dist/wirings/{ai-agent/ai-agent-finalize.d.ts → agent/agent-finalize.d.ts} +10 -10
  188. package/dist/wirings/{ai-agent/ai-agent-finalize.js → agent/agent-finalize.js} +7 -7
  189. package/dist/wirings/{ai-agent/ai-agent-helpers.d.ts → agent/agent-helpers.d.ts} +1 -1
  190. package/dist/wirings/{ai-agent/ai-agent-interrupt.d.ts → agent/agent-interrupt.d.ts} +4 -4
  191. package/dist/wirings/{ai-agent/ai-agent-interrupt.js → agent/agent-interrupt.js} +2 -2
  192. package/dist/wirings/{ai-agent/ai-agent-memory.d.ts → agent/agent-memory.d.ts} +14 -14
  193. package/dist/wirings/{ai-agent/ai-agent-memory.js → agent/agent-memory.js} +1 -1
  194. package/dist/wirings/{ai-agent/ai-agent-model-config.js → agent/agent-model-config.js} +1 -1
  195. package/dist/wirings/{ai-agent/ai-agent-prepare.d.ts → agent/agent-prepare.d.ts} +24 -24
  196. package/dist/wirings/{ai-agent/ai-agent-prepare.js → agent/agent-prepare.js} +17 -17
  197. package/dist/wirings/agent/agent-registry.d.ts +16 -0
  198. package/dist/wirings/{ai-agent/ai-agent-registry.js → agent/agent-registry.js} +9 -9
  199. package/dist/wirings/{ai-agent → agent}/agent-rpc.js +8 -8
  200. package/dist/wirings/agent/agent-runner.d.ts +7 -0
  201. package/dist/wirings/{ai-agent/ai-agent-runner.js → agent/agent-runner.js} +49 -50
  202. package/dist/wirings/{ai-agent/ai-agent-stream.d.ts → agent/agent-stream.d.ts} +15 -15
  203. package/dist/wirings/{ai-agent/ai-agent-stream.js → agent/agent-stream.js} +78 -78
  204. package/dist/wirings/{ai-agent/ai-agent-turn.d.ts → agent/agent-turn.d.ts} +5 -5
  205. package/dist/wirings/{ai-agent/ai-agent-turn.js → agent/agent-turn.js} +4 -4
  206. package/dist/wirings/agent/agent-utils.d.ts +14 -0
  207. package/dist/wirings/agent/agent-utils.js +17 -0
  208. package/dist/wirings/{ai-agent/ai-agent.types.d.ts → agent/agent.types.d.ts} +47 -46
  209. package/dist/wirings/agent/agent.types.js +1 -0
  210. package/dist/wirings/agent/index.d.ts +12 -0
  211. package/dist/wirings/agent/index.js +10 -0
  212. package/dist/wirings/{ai-agent → agent}/voice-input.d.ts +1 -1
  213. package/dist/wirings/{ai-agent → agent}/voice-input.js +5 -5
  214. package/dist/wirings/{ai-agent → agent}/voice-output.d.ts +2 -3
  215. package/dist/wirings/{ai-agent → agent}/voice-output.js +8 -8
  216. package/dist/wirings/{ai-scorer/ai-scorer-grade.d.ts → agent-scorer/agent-scorer-grade.d.ts} +3 -3
  217. package/dist/wirings/{ai-scorer/ai-scorer-grade.js → agent-scorer/agent-scorer-grade.js} +6 -6
  218. package/dist/wirings/agent-scorer/agent-scorer-judge.d.ts +30 -0
  219. package/dist/wirings/{ai-scorer/ai-scorer-judge.js → agent-scorer/agent-scorer-judge.js} +57 -5
  220. package/dist/wirings/{ai-scorer/ai-scorer-live.d.ts → agent-scorer/agent-scorer-live.d.ts} +1 -1
  221. package/dist/wirings/{ai-scorer/ai-scorer-live.js → agent-scorer/agent-scorer-live.js} +3 -3
  222. package/dist/wirings/{ai-scorer/ai-scorer-registry.d.ts → agent-scorer/agent-scorer-registry.d.ts} +6 -6
  223. package/dist/wirings/{ai-scorer/ai-scorer-registry.js → agent-scorer/agent-scorer-registry.js} +4 -4
  224. package/dist/wirings/{ai-scorer/ai-scorer-snapshots.d.ts → agent-scorer/agent-scorer-snapshots.d.ts} +1 -1
  225. package/dist/wirings/{ai-scorer/ai-scorer-worker.d.ts → agent-scorer/agent-scorer-worker.d.ts} +3 -3
  226. package/dist/wirings/{ai-scorer/ai-scorer-worker.js → agent-scorer/agent-scorer-worker.js} +9 -7
  227. package/dist/wirings/{ai-scorer/ai-scorer.d.ts → agent-scorer/agent-scorer.d.ts} +12 -6
  228. package/dist/wirings/{ai-scorer/ai-scorer.js → agent-scorer/agent-scorer.js} +4 -3
  229. package/dist/wirings/{ai-scorer/ai-scorer.types.d.ts → agent-scorer/agent-scorer.types.d.ts} +24 -4
  230. package/dist/wirings/agent-scorer/agent-scorer.types.js +4 -0
  231. package/dist/wirings/agent-scorer/index.d.ts +6 -0
  232. package/dist/wirings/agent-scorer/index.js +5 -0
  233. package/dist/wirings/channel/channel-common.d.ts +2 -1
  234. package/dist/wirings/channel/channel-middleware-runner.d.ts +2 -1
  235. package/dist/wirings/channel/channel-rpc.types.d.ts +2 -2
  236. package/dist/wirings/channel/channel.types.d.ts +1 -1
  237. package/dist/wirings/channel/serverless/index.d.ts +1 -0
  238. package/dist/wirings/cli/channel/index.d.ts +1 -1
  239. package/dist/wirings/cli/cli-runner.d.ts +2 -1
  240. package/dist/wirings/cli/cli-runner.js +4 -1
  241. package/dist/wirings/cli/cli.types.d.ts +21 -2
  242. package/dist/wirings/cli/command-parser.js +157 -23
  243. package/dist/wirings/gateway/gateway.types.d.ts +2 -1
  244. package/dist/wirings/http/http-runner.d.ts +1 -1
  245. package/dist/wirings/http/http-runner.js +1 -1
  246. package/dist/wirings/http/http.types.d.ts +2 -2
  247. package/dist/wirings/http/index.d.ts +1 -0
  248. package/dist/wirings/http/index.js +1 -0
  249. package/dist/wirings/http/pikku-fetch-http-request.js +1 -1
  250. package/dist/wirings/http/pikku-fetch-http-response.js +2 -2
  251. package/dist/wirings/mcp/mcp.types.d.ts +1 -1
  252. package/dist/wirings/persona/index.d.ts +1 -1
  253. package/dist/wirings/persona/index.js +1 -1
  254. package/dist/wirings/persona/persona.types.d.ts +14 -0
  255. package/dist/wirings/queue/queue.types.d.ts +1 -1
  256. package/dist/wirings/queue/signed-queue-service.d.ts +1 -1
  257. package/dist/wirings/rpc/index.d.ts +0 -6
  258. package/dist/wirings/rpc/index.js +0 -3
  259. package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -1
  260. package/dist/wirings/rpc/remote-addon-auth.js +1 -1
  261. package/dist/wirings/rpc/rpc-runner.d.ts +1 -1
  262. package/dist/wirings/rpc/rpc-runner.js +4 -4
  263. package/dist/wirings/rpc/rpc-types.d.ts +1 -1
  264. package/dist/wirings/rpc/wire-addon.d.ts +1 -1
  265. package/dist/wirings/scheduler/scheduler.types.d.ts +2 -1
  266. package/dist/wirings/scope/index.d.ts +1 -0
  267. package/dist/wirings/scope/index.js +1 -0
  268. package/dist/wirings/secret/secret.types.d.ts +10 -0
  269. package/dist/wirings/secret/validate-secret-definitions.js +2 -0
  270. package/dist/wirings/variable/validate-variable-definitions.js +2 -0
  271. package/dist/wirings/variable/variable.types.d.ts +9 -0
  272. package/dist/wirings/virtual-user/index.d.ts +1 -1
  273. package/dist/wirings/virtual-user/index.js +1 -1
  274. package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +1 -1
  275. package/dist/wirings/virtual-user/prepare-virtual-user-run.js +1 -1
  276. package/dist/wirings/virtual-user/virtual-user-agents.d.ts +1 -1
  277. package/dist/wirings/virtual-user/virtual-user-derive.d.ts +1 -1
  278. package/dist/wirings/workflow/graph/graph-node.d.ts +9 -2
  279. package/dist/wirings/workflow/graph/graph-node.js +2 -0
  280. package/dist/wirings/workflow/graph/graph-runner.d.ts +1 -0
  281. package/dist/wirings/workflow/graph/graph-runner.js +283 -31
  282. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +16 -1
  283. package/dist/wirings/workflow/index.d.ts +2 -0
  284. package/dist/wirings/workflow/index.js +1 -0
  285. package/dist/wirings/workflow/pikku-scenario-service.d.ts +14 -4
  286. package/dist/wirings/workflow/pikku-scenario-service.js +44 -16
  287. package/dist/wirings/workflow/pikku-workflow-service.d.ts +2 -1
  288. package/dist/wirings/workflow/pikku-workflow-service.js +3 -4
  289. package/dist/wirings/workflow/run-timeline.d.ts +2 -3
  290. package/dist/wirings/workflow/scenario-run.types.d.ts +171 -0
  291. package/dist/wirings/workflow/scenario-run.types.js +1 -0
  292. package/dist/wirings/workflow/scenario-step-guards.d.ts +1 -2
  293. package/dist/wirings/workflow/scenario-step-guards.js +0 -8
  294. package/dist/wirings/workflow/scenario-step.types.d.ts +27 -12
  295. package/dist/wirings/workflow/workflow-approval.js +2 -1
  296. package/dist/wirings/workflow/workflow-run-engine.types.d.ts +2 -1
  297. package/dist/wirings/workflow/workflow.types.d.ts +2 -1
  298. package/knowledge/decisions/index.md +2 -0
  299. package/knowledge/decisions/internals/{a-non-streaming-agent-run-registers-with-airunstate-too.md → a-non-streaming-agent-run-registers-with-agentrunstate-too.md} +6 -6
  300. package/knowledge/decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md +1 -1
  301. package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +1 -1
  302. package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +1 -1
  303. package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +2 -2
  304. package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +6 -6
  305. package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +1 -1
  306. package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +1 -1
  307. package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +1 -1
  308. package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +1 -1
  309. package/knowledge/decisions/internals/{ai-agent-agui-bridge-obeys-the-client-ordering-contract.md → agent-agui-bridge-obeys-the-client-ordering-contract.md} +5 -5
  310. package/knowledge/decisions/internals/{ai-agent-audio-chunks-carry-the-format-the-provider-returned.md → agent-audio-chunks-carry-the-format-the-provider-returned.md} +2 -2
  311. package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md +1 -1
  312. package/knowledge/decisions/internals/{ai-agent-credential-suspensions-hide-the-tool-result.md → agent-credential-suspensions-hide-the-tool-result.md} +2 -2
  313. package/knowledge/decisions/internals/{ai-agent-delegate-and-supervise-hide-different-text.md → agent-delegate-and-supervise-hide-different-text.md} +4 -4
  314. package/knowledge/decisions/internals/{ai-agent-llm-tool-arguments-have-nulls-stripped.md → agent-llm-tool-arguments-have-nulls-stripped.md} +3 -3
  315. package/knowledge/decisions/internals/{ai-agent-model-config-stays-a-single-resolution-seam.md → agent-model-config-stays-a-single-resolution-seam.md} +3 -3
  316. package/knowledge/decisions/internals/{ai-agent-onerror-hooks-cannot-change-the-failure.md → agent-onerror-hooks-cannot-change-the-failure.md} +6 -6
  317. package/knowledge/decisions/internals/{ai-agent-runner-methods-must-keep-their-receiver.md → agent-runner-methods-must-keep-their-receiver.md} +4 -4
  318. package/knowledge/decisions/internals/agent-speech-travels-as-a-custom-agui-event.md +1 -1
  319. package/knowledge/decisions/internals/{ai-agent-stream-persistence-is-best-effort.md → agent-stream-persistence-is-best-effort.md} +4 -4
  320. package/knowledge/decisions/internals/{ai-agent-sub-agents-inherit-the-parent-context-block.md → agent-sub-agents-inherit-the-parent-context-block.md} +3 -3
  321. package/knowledge/decisions/internals/{ai-agent-tool-execute-failures-are-logged-unconditionally.md → agent-tool-execute-failures-are-logged-unconditionally.md} +3 -3
  322. package/knowledge/decisions/internals/{ai-agent-voice-input-transcribes-audio-parts-in-place.md → agent-voice-input-transcribes-audio-parts-in-place.md} +2 -2
  323. package/knowledge/decisions/internals/{ai-agent-working-memory-is-persisted-only-when-valid.md → agent-working-memory-is-persisted-only-when-valid.md} +2 -2
  324. package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +1 -1
  325. package/knowledge/decisions/internals/an-agent-interrupt-is-not-a-failure.md +2 -2
  326. package/knowledge/decisions/internals/an-agent-run-owned-by-another-instance-says-so.md +3 -3
  327. package/knowledge/decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md +2 -2
  328. package/knowledge/decisions/internals/an-empty-text-part-is-omitted-from-an-agent-message.md +1 -1
  329. package/knowledge/decisions/internals/an-empty-transcript-is-not-recorded.md +1 -1
  330. package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +1 -1
  331. package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +1 -1
  332. package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +1 -1
  333. package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +1 -1
  334. package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +1 -1
  335. package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +1 -1
  336. package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +4 -4
  337. package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +1 -1
  338. package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +3 -3
  339. package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +2 -2
  340. package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +2 -2
  341. package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +1 -1
  342. package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +1 -1
  343. package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +3 -3
  344. package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +1 -1
  345. package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +4 -4
  346. package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +1 -1
  347. package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +1 -1
  348. package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +1 -1
  349. package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +1 -1
  350. package/knowledge/decisions/internals/index.md +4 -2
  351. package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +1 -1
  352. package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +1 -1
  353. package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +1 -1
  354. package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +1 -1
  355. package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +1 -1
  356. package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +2 -2
  357. package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +5 -5
  358. package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md +1 -1
  359. package/knowledge/decisions/internals/the-actor-prompt-says-json-because-of-json-object-mode.md +1 -1
  360. package/knowledge/decisions/internals/the-agent-done-event-goes-through-the-middleware-and-is-awaited.md +1 -1
  361. package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +1 -1
  362. package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +43 -19
  363. package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +1 -1
  364. package/knowledge/decisions/internals/the-per-invocation-rpc-view-is-a-class.md +5 -5
  365. package/knowledge/decisions/internals/the-persona-runtime-is-exported-from-the-persona-entry-point.md +1 -1
  366. package/knowledge/decisions/internals/the-transcript-event-is-sent-ahead-of-the-run.md +2 -2
  367. package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +1 -1
  368. package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +2 -2
  369. package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +3 -3
  370. package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +1 -1
  371. package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md +1 -1
  372. package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +1 -1
  373. package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +1 -1
  374. package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +1 -1
  375. package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +1 -1
  376. package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +1 -1
  377. package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +1 -1
  378. package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +1 -1
  379. package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +1 -1
  380. package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +9 -5
  381. package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +1 -1
  382. package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +2 -2
  383. package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +1 -1
  384. package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +1 -1
  385. package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +1 -1
  386. package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +2 -3
  387. package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +1 -1
  388. package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +1 -1
  389. package/knowledge/decisions/security/{ai-agent-approval-forwarding-requires-a-symbol-brand.md → agent-approval-forwarding-requires-a-symbol-brand.md} +3 -3
  390. package/knowledge/decisions/security/{ai-agent-credential-requests-are-symbol-branded.md → agent-credential-requests-are-symbol-branded.md} +4 -4
  391. package/knowledge/decisions/security/{ai-agent-gate-requires-a-session-only-when-auth-is-true.md → agent-gate-requires-a-session-only-when-auth-is-true.md} +4 -4
  392. package/knowledge/decisions/security/{ai-agent-ownership-failures-never-echo-the-resource.md → agent-ownership-failures-never-echo-the-resource.md} +2 -2
  393. package/knowledge/decisions/security/{ai-agent-resume-re-runs-the-authorization-gate.md → agent-resume-re-runs-the-authorization-gate.md} +4 -4
  394. package/knowledge/decisions/security/{ai-agent-sessionless-deployments-have-no-thread-ownership.md → agent-sessionless-deployments-have-no-thread-ownership.md} +5 -5
  395. package/knowledge/decisions/security/{ai-agent-thread-ownership-composes-the-session-principal.md → agent-thread-ownership-composes-the-session-principal.md} +2 -2
  396. package/knowledge/decisions/security/{ai-agent-tool-filtering-reads-the-live-function-config.md → agent-tool-filtering-reads-the-live-function-config.md} +2 -2
  397. package/knowledge/decisions/security/an-agent-approval-is-claimed-before-the-tool-runs.md +3 -3
  398. package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +3 -3
  399. package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +3 -3
  400. package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +21 -13
  401. package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +1 -1
  402. package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +2 -2
  403. package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +1 -1
  404. package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +2 -2
  405. package/knowledge/decisions/security/index.md +3 -2
  406. package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +1 -1
  407. package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +3 -3
  408. package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +1 -1
  409. package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +2 -2
  410. package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +1 -1
  411. package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +2 -2
  412. package/knowledge/index.md +3 -1
  413. package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +1 -1
  414. package/knowledge/questions/index.md +2 -0
  415. package/package.json +16 -14
  416. package/run-tests.sh +0 -0
  417. package/scripts/generate-api-report.d.mts +1 -1
  418. package/scripts/generate-api-report.mjs +67 -60
  419. package/scripts/generate-api-report.mts +37 -47
  420. package/src/agent-naming.test.ts +68 -0
  421. package/src/api-report.test.ts +70 -1
  422. package/src/app-alias-surface.test.ts +179 -0
  423. package/src/app-leaf-surface.test.ts +217 -0
  424. package/src/bootstrap-compat/root.ts +20 -0
  425. package/src/{column-form.test.ts → classification/column-form.test.ts} +2 -2
  426. package/src/{data-classification.ts → classification/data-classification.ts} +1 -5
  427. package/src/classification/index.ts +38 -0
  428. package/src/{secret-value.test.ts → classification/secret-value.test.ts} +2 -2
  429. package/src/{secret-value.ts → classification/secret-value.ts} +1 -6
  430. package/src/crypto-utils.ts +1 -1
  431. package/src/dev/reload-meta.test.ts +1 -1
  432. package/src/errors/index.ts +9 -0
  433. package/src/errors/serialized-error.ts +9 -0
  434. package/src/factory-functions.test.ts +4 -2
  435. package/src/function/function-meta.types.ts +151 -0
  436. package/src/function/function-runner.test.ts +4 -2
  437. package/src/function/function-runner.ts +47 -14
  438. package/src/function/functions.types.ts +11 -7
  439. package/src/function/index.ts +24 -5
  440. package/src/function/list.types.ts +1 -3
  441. package/src/middleware/auth-apikey.ts +4 -2
  442. package/src/middleware/auth-bearer.test.ts +1 -1
  443. package/src/middleware/auth-bearer.ts +4 -2
  444. package/src/middleware/auth-cookie.ts +4 -1
  445. package/src/middleware/cors.test.ts +126 -5
  446. package/src/middleware/cors.ts +19 -8
  447. package/src/middleware/index.ts +16 -0
  448. package/src/middleware/middleware-factories.ts +62 -0
  449. package/src/middleware/middleware.types.ts +61 -0
  450. package/src/middleware/remote-auth.test.ts +1 -1
  451. package/src/middleware/remote-auth.ts +1 -1
  452. package/src/middleware/telemetry.ts +4 -2
  453. package/src/middleware-runner.test.ts +2 -3
  454. package/src/middleware-runner.ts +2 -2
  455. package/src/no-root-barrel.test.ts +114 -0
  456. package/src/permissions.ts +2 -4
  457. package/src/pikku-state.ts +6 -4
  458. package/src/public-surface.json +90 -170
  459. package/src/public-surface.json.README +20 -2
  460. package/src/public-surface.test.ts +31 -3
  461. package/src/remote.test.ts +1 -1
  462. package/src/removed-legacy-exports.test.ts +5 -1
  463. package/src/services/{ai-run-state-service.ts → agent-run-state-service.ts} +5 -5
  464. package/src/services/{ai-agent-runner-service.ts → agent-runner-service.ts} +18 -18
  465. package/src/services/{ai-storage-service.ts → agent-storage-service.ts} +7 -7
  466. package/src/services/audit-service.ts +1 -1
  467. package/src/services/credential-wire-service.ts +1 -1
  468. package/src/services/email-service.ts +2 -4
  469. package/src/services/file-scenario-run-store.test.ts +349 -0
  470. package/src/services/file-scenario-run-store.ts +282 -0
  471. package/src/services/http-personas-converse.test.ts +3 -3
  472. package/src/services/http-personas.ts +4 -4
  473. package/src/services/{in-memory-ai-run-state-service.ts → in-memory-agent-run-state-service.ts} +7 -7
  474. package/src/services/in-memory-workflow-service.ts +1 -1
  475. package/src/services/index.ts +22 -10
  476. package/src/services/local-content-request-handler.ts +1 -2
  477. package/src/services/local-secrets.ts +1 -1
  478. package/src/services/logger.ts +7 -7
  479. package/src/services/meta-service.ts +5 -5
  480. package/src/services/queue-webhook-service.test.ts +1 -1
  481. package/src/services/scoped-secret-service.ts +1 -1
  482. package/src/services/secret-service.ts +1 -1
  483. package/src/services/typed-secret-service.test.ts +52 -0
  484. package/src/services/typed-secret-service.ts +26 -2
  485. package/src/services/webhook-service.ts +1 -1
  486. package/src/services/workflow-service.ts +2 -1
  487. package/src/template-alias-surface.test.ts +240 -0
  488. package/src/testing/index.ts +1 -0
  489. package/src/testing/service-tests/agent-run-service-tests.ts +4 -4
  490. package/src/testing/service-tests/{ai-storage-service-tests.ts → agent-storage-service-tests.ts} +8 -8
  491. package/src/testing/service-tests.ts +10 -8
  492. package/src/types/core.types.ts +40 -292
  493. package/src/types/index.ts +2 -0
  494. package/src/types/state.types.ts +12 -14
  495. package/src/types/typed-credentials.test.ts +72 -0
  496. package/src/utils.ts +34 -0
  497. package/src/wirings/actor-flow/run-conversation.test.ts +2 -2
  498. package/src/wirings/actor-flow/run-conversation.ts +7 -9
  499. package/src/wirings/{rpc → addon}/addon-scopes.test.ts +1 -1
  500. package/src/wirings/addon/index.ts +12 -0
  501. package/src/wirings/{rpc → addon}/remote-addon-auth.ts +4 -1
  502. package/src/wirings/{rpc → addon}/wire-addon.ts +37 -2
  503. package/src/wirings/{ai-agent/ai-agent-agui.test.ts → agent/agent-agui.test.ts} +126 -105
  504. package/src/wirings/{ai-agent/ai-agent-agui.ts → agent/agent-agui.ts} +7 -7
  505. package/src/wirings/{ai-agent/ai-agent-authorization.test.ts → agent/agent-authorization.test.ts} +6 -6
  506. package/src/wirings/{ai-agent/ai-agent-finalize.test.ts → agent/agent-finalize.test.ts} +17 -16
  507. package/src/wirings/{ai-agent/ai-agent-finalize.ts → agent/agent-finalize.ts} +22 -22
  508. package/src/wirings/{ai-agent/ai-agent-helpers.test.ts → agent/agent-helpers.test.ts} +1 -1
  509. package/src/wirings/{ai-agent/ai-agent-helpers.ts → agent/agent-helpers.ts} +1 -1
  510. package/src/wirings/{ai-agent/ai-agent-interrupt.test.ts → agent/agent-interrupt.test.ts} +67 -77
  511. package/src/wirings/{ai-agent/ai-agent-interrupt.ts → agent/agent-interrupt.ts} +5 -5
  512. package/src/wirings/{ai-agent/ai-agent-memory.test.ts → agent/agent-memory.test.ts} +12 -12
  513. package/src/wirings/{ai-agent/ai-agent-memory.ts → agent/agent-memory.ts} +36 -36
  514. package/src/wirings/{ai-agent/ai-agent-model-config.test.ts → agent/agent-model-config.test.ts} +2 -5
  515. package/src/wirings/{ai-agent/ai-agent-model-config.ts → agent/agent-model-config.ts} +1 -1
  516. package/src/wirings/{ai-agent/ai-agent-prepare.test.ts → agent/agent-prepare.test.ts} +18 -18
  517. package/src/wirings/{ai-agent/ai-agent-prepare.ts → agent/agent-prepare.ts} +60 -56
  518. package/src/wirings/{ai-agent/ai-agent-registry.test.ts → agent/agent-registry.test.ts} +49 -43
  519. package/src/wirings/{ai-agent/ai-agent-registry.ts → agent/agent-registry.ts} +14 -14
  520. package/src/wirings/{ai-agent/ai-agent-resume-authorization.test.ts → agent/agent-resume-authorization.test.ts} +18 -18
  521. package/src/wirings/{ai-agent → agent}/agent-rpc.ts +16 -20
  522. package/src/wirings/{ai-agent/ai-agent-runner.test.ts → agent/agent-runner.test.ts} +105 -106
  523. package/src/wirings/{ai-agent/ai-agent-runner.ts → agent/agent-runner.ts} +91 -82
  524. package/src/wirings/{ai-agent/ai-agent-stream-output-hooks.test.ts → agent/agent-stream-output-hooks.test.ts} +25 -25
  525. package/src/wirings/{ai-agent/ai-agent-stream.test.ts → agent/agent-stream.test.ts} +147 -143
  526. package/src/wirings/{ai-agent/ai-agent-stream.ts → agent/agent-stream.ts} +148 -148
  527. package/src/wirings/{ai-agent/ai-agent-thread-ownership.test.ts → agent/agent-thread-ownership.test.ts} +24 -28
  528. package/src/wirings/{ai-agent/ai-agent-turn.test.ts → agent/agent-turn.test.ts} +3 -5
  529. package/src/wirings/{ai-agent/ai-agent-turn.ts → agent/agent-turn.ts} +7 -7
  530. package/src/wirings/agent/agent-utils.ts +20 -0
  531. package/src/wirings/{ai-agent/ai-agent.types.ts → agent/agent.types.ts} +54 -51
  532. package/src/wirings/agent/index.ts +57 -0
  533. package/src/wirings/{ai-agent → agent}/voice-input.test.ts +15 -15
  534. package/src/wirings/{ai-agent → agent}/voice-input.ts +11 -11
  535. package/src/wirings/{ai-agent → agent}/voice-output.test.ts +25 -27
  536. package/src/wirings/{ai-agent → agent}/voice-output.ts +11 -11
  537. package/src/wirings/{ai-scorer/ai-scorer-grade.test.ts → agent-scorer/agent-scorer-grade.test.ts} +8 -8
  538. package/src/wirings/{ai-scorer/ai-scorer-grade.ts → agent-scorer/agent-scorer-grade.ts} +9 -9
  539. package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +285 -0
  540. package/src/wirings/agent-scorer/agent-scorer-judge.ts +180 -0
  541. package/src/wirings/{ai-scorer/ai-scorer-live.test.ts → agent-scorer/agent-scorer-live.test.ts} +11 -11
  542. package/src/wirings/{ai-scorer/ai-scorer-live.ts → agent-scorer/agent-scorer-live.ts} +3 -3
  543. package/src/wirings/{ai-scorer/ai-scorer-registry.ts → agent-scorer/agent-scorer-registry.ts} +11 -8
  544. package/src/wirings/{ai-scorer/ai-scorer-sampling.test.ts → agent-scorer/agent-scorer-sampling.test.ts} +1 -1
  545. package/src/wirings/{ai-scorer/ai-scorer-snapshots.test.ts → agent-scorer/agent-scorer-snapshots.test.ts} +2 -2
  546. package/src/wirings/{ai-scorer/ai-scorer-snapshots.ts → agent-scorer/agent-scorer-snapshots.ts} +1 -1
  547. package/src/wirings/{ai-scorer/ai-scorer-worker.test.ts → agent-scorer/agent-scorer-worker.test.ts} +15 -15
  548. package/src/wirings/{ai-scorer/ai-scorer-worker.ts → agent-scorer/agent-scorer-worker.ts} +9 -7
  549. package/src/wirings/{ai-scorer/ai-scorer.ts → agent-scorer/agent-scorer.ts} +15 -7
  550. package/src/wirings/{ai-scorer/ai-scorer.types.ts → agent-scorer/agent-scorer.types.ts} +27 -6
  551. package/src/wirings/agent-scorer/index.ts +23 -0
  552. package/src/wirings/channel/channel-common.ts +4 -2
  553. package/src/wirings/channel/channel-handler.ts +2 -5
  554. package/src/wirings/channel/channel-middleware-runner.ts +1 -1
  555. package/src/wirings/channel/channel-rpc.types.ts +3 -7
  556. package/src/wirings/channel/channel.types.ts +1 -2
  557. package/src/wirings/channel/local/local-channel-runner.test.ts +1 -2
  558. package/src/wirings/channel/serverless/index.ts +1 -0
  559. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +2 -2
  560. package/src/wirings/cli/channel/index.ts +1 -3
  561. package/src/wirings/cli/cli-runner.test.ts +1 -1
  562. package/src/wirings/cli/cli-runner.ts +11 -7
  563. package/src/wirings/cli/cli.types.ts +24 -3
  564. package/src/wirings/cli/command-parser.test.ts +388 -1
  565. package/src/wirings/cli/command-parser.ts +189 -29
  566. package/src/wirings/gateway/gateway-runner.test.ts +1 -2
  567. package/src/wirings/gateway/gateway-runner.ts +3 -6
  568. package/src/wirings/gateway/gateway.types.ts +5 -4
  569. package/src/wirings/http/http-routes.test.ts +1 -2
  570. package/src/wirings/http/http-runner-addon-ref.test.ts +238 -0
  571. package/src/wirings/http/http-runner.test.ts +3 -8
  572. package/src/wirings/http/http-runner.ts +9 -3
  573. package/src/wirings/http/http.types.ts +3 -12
  574. package/src/wirings/http/index.ts +1 -0
  575. package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
  576. package/src/wirings/http/pikku-fetch-http-response.ts +3 -2
  577. package/src/wirings/mcp/mcp-runner.test.ts +1 -1
  578. package/src/wirings/mcp/mcp.types.ts +1 -2
  579. package/src/wirings/persona/index.ts +1 -4
  580. package/src/wirings/persona/persona.types.ts +14 -0
  581. package/src/wirings/queue/queue-identity.test.ts +1 -1
  582. package/src/wirings/queue/queue.types.ts +2 -6
  583. package/src/wirings/queue/signed-queue-service.ts +1 -1
  584. package/src/wirings/rpc/index.ts +0 -12
  585. package/src/wirings/rpc/rpc-runner.test.ts +4 -4
  586. package/src/wirings/rpc/rpc-runner.ts +5 -5
  587. package/src/wirings/rpc/rpc-types.ts +1 -1
  588. package/src/wirings/scheduler/scheduler.types.ts +2 -5
  589. package/src/wirings/scope/index.ts +1 -0
  590. package/src/wirings/secret/secret.types.ts +10 -0
  591. package/src/wirings/secret/validate-secret-definitions.test.ts +23 -0
  592. package/src/wirings/secret/validate-secret-definitions.ts +2 -0
  593. package/src/wirings/variable/validate-variable-definitions.test.ts +23 -0
  594. package/src/wirings/variable/validate-variable-definitions.ts +2 -0
  595. package/src/wirings/variable/variable.types.ts +9 -0
  596. package/src/wirings/virtual-user/index.ts +1 -4
  597. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +2 -2
  598. package/src/wirings/virtual-user/run-virtual-user.test.ts +2 -2
  599. package/src/wirings/virtual-user/run-virtual-user.ts +3 -3
  600. package/src/wirings/virtual-user/virtual-user-agents.ts +1 -1
  601. package/src/wirings/virtual-user/virtual-user-derive.test.ts +1 -1
  602. package/src/wirings/virtual-user/virtual-user-derive.ts +1 -1
  603. package/src/wirings/virtual-user/virtual-user.types.ts +1 -5
  604. package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +569 -0
  605. package/src/wirings/workflow/graph/graph-foreach.test.ts +626 -0
  606. package/src/wirings/workflow/graph/graph-node.ts +16 -1
  607. package/src/wirings/workflow/graph/graph-runner.ts +387 -61
  608. package/src/wirings/workflow/graph/workflow-graph.types.ts +28 -3
  609. package/src/wirings/workflow/index.ts +8 -0
  610. package/src/wirings/workflow/pikku-scenario-service.ts +59 -19
  611. package/src/wirings/workflow/pikku-workflow-service.ts +6 -8
  612. package/src/wirings/workflow/run-timeline.ts +2 -2
  613. package/src/wirings/workflow/scenario-expectations.test.ts +28 -13
  614. package/src/wirings/workflow/scenario-run.types.ts +186 -0
  615. package/src/wirings/workflow/scenario-step-guards.ts +1 -14
  616. package/src/wirings/workflow/scenario-step.test.ts +32 -7
  617. package/src/wirings/workflow/scenario-step.types.ts +27 -12
  618. package/src/wirings/workflow/workflow-approval-policy.test.ts +117 -47
  619. package/src/wirings/workflow/workflow-approval.ts +2 -1
  620. package/src/wirings/workflow/workflow-run-engine.types.ts +2 -1
  621. package/src/wirings/workflow/workflow.types.ts +4 -12
  622. package/src/wirings-stay-decoupled.test.ts +7 -4
  623. package/tsconfig.tsbuildinfo +1 -1
  624. package/tsconfig.type-tests.json +3 -2
  625. package/dist/testing/service-tests/ai-storage-service-tests.d.ts +0 -3
  626. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +0 -16
  627. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +0 -7
  628. package/dist/wirings/ai-agent/ai-agent-utils.d.ts +0 -1
  629. package/dist/wirings/ai-agent/ai-agent-utils.js +0 -1
  630. package/dist/wirings/ai-agent/index.d.ts +0 -12
  631. package/dist/wirings/ai-agent/index.js +0 -10
  632. package/dist/wirings/ai-scorer/ai-scorer-judge.d.ts +0 -17
  633. package/dist/wirings/ai-scorer/ai-scorer.types.js +0 -4
  634. package/dist/wirings/ai-scorer/index.d.ts +0 -6
  635. package/dist/wirings/ai-scorer/index.js +0 -5
  636. package/src/ecosystem.ts +0 -40
  637. package/src/index.ts +0 -255
  638. package/src/wirings/ai-agent/ai-agent-utils.ts +0 -1
  639. package/src/wirings/ai-agent/index.ts +0 -65
  640. package/src/wirings/ai-scorer/ai-scorer-judge.test.ts +0 -143
  641. package/src/wirings/ai-scorer/ai-scorer-judge.ts +0 -120
  642. package/src/wirings/ai-scorer/index.ts +0 -24
  643. /package/dist/{services/ai-agent-runner-service.js → bootstrap-compat/root.js} +0 -0
  644. /package/dist/{services/ai-run-state-service.js → classification/data-classification.js} +0 -0
  645. /package/dist/{services/ai-storage-service.js → ecosystem/gateway.js} +0 -0
  646. /package/dist/{wirings/ai-agent/ai-agent.types.js → ecosystem/node.js} +0 -0
  647. /package/dist/wirings/{ai-agent/ai-agent-helpers.js → agent/agent-helpers.js} +0 -0
  648. /package/dist/wirings/{ai-agent/ai-agent-model-config.d.ts → agent/agent-model-config.d.ts} +0 -0
  649. /package/dist/wirings/{ai-agent → agent}/agent-rpc.d.ts +0 -0
  650. /package/dist/wirings/{ai-scorer/ai-scorer-sampling.d.ts → agent-scorer/agent-scorer-sampling.d.ts} +0 -0
  651. /package/dist/wirings/{ai-scorer/ai-scorer-sampling.js → agent-scorer/agent-scorer-sampling.js} +0 -0
  652. /package/dist/wirings/{ai-scorer/ai-scorer-snapshots.js → agent-scorer/agent-scorer-snapshots.js} +0 -0
  653. /package/src/{column-form.ts → classification/column-form.ts} +0 -0
  654. /package/src/{pikku-request.test.ts → function/pikku-request.test.ts} +0 -0
  655. /package/src/{pikku-request.ts → function/pikku-request.ts} +0 -0
  656. /package/src/wirings/{rpc → addon}/addon-auth-tags.test.ts +0 -0
  657. /package/src/wirings/{rpc → addon}/addon-runner.ts +0 -0
  658. /package/src/wirings/{rpc → addon}/addon-secrets.test.ts +0 -0
  659. /package/src/wirings/{rpc → addon}/wire-addon.test.ts +0 -0
  660. /package/src/wirings/{rpc → addon}/wire-remote-addon.ts +0 -0
  661. /package/src/wirings/{ai-scorer/ai-scorer-sampling.ts → agent-scorer/agent-scorer-sampling.ts} +0 -0
@@ -14,14 +14,16 @@ import {
14
14
  } from '../schema.js'
15
15
  import type {
16
16
  CoreUserSession,
17
- CorePikkuMiddleware,
18
17
  PikkuWiringTypes,
19
18
  PikkuWire,
20
19
  PikkuRawWire,
21
- MiddlewareMetadata,
22
20
  CoreSingletonServices,
23
21
  CreateWireServices,
24
22
  } from '../types/core.types.js'
23
+ import type {
24
+ CorePikkuMiddleware,
25
+ MiddlewareMetadata,
26
+ } from '../middleware/middleware.types.js'
25
27
  import type { CorePikkuChannelMiddleware } from '../wirings/channel/channel.types.js'
26
28
  import type { CorePikkuFunctionConfig } from './functions.types.js'
27
29
  import { parseVersionedId } from '../version.js'
@@ -40,13 +42,14 @@ import {
40
42
  type AuditLog,
41
43
  } from '../services/audit-service.js'
42
44
  import { rpcService } from '../wirings/rpc/rpc-runner.js'
43
- import { getOrCreatePackageSingletonServices } from '../wirings/rpc/addon-runner.js'
45
+ import { getOrCreatePackageSingletonServices } from '../wirings/addon/addon-runner.js'
44
46
  import {
45
47
  resolveAddonAuth,
48
+ resolveAddonFunctionTarget,
46
49
  resolveAddonScopes,
47
50
  resolveAddonTagMiddleware,
48
- } from '../wirings/rpc/wire-addon.js'
49
- import type { AddonInstance } from '../wirings/rpc/addon-runner.js'
51
+ } from '../wirings/addon/wire-addon.js'
52
+ import type { AddonInstance } from '../wirings/addon/addon-runner.js'
50
53
  import { closeWireServices } from '../utils.js'
51
54
 
52
55
  async function resolveSession(
@@ -168,6 +171,32 @@ export const runPikkuFunc = async <In = any, Out = any>(
168
171
  }
169
172
  }
170
173
 
174
+ /**
175
+ * The package the *function* belongs to, which is the wire's own until a
176
+ * `ref()` resolves the target into an addon. The wiring stays the consuming
177
+ * app's — that is what keeps the app's middleware running rather than the
178
+ * addon's — but everything the function is declared with lives in the addon's
179
+ * package state, so its schemas, services and permissions are read from here.
180
+ */
181
+ let funcPackageName = packageName
182
+
183
+ if (!funcMeta) {
184
+ const addonTarget = resolveAddonFunctionTarget(funcName, packageName)
185
+ if (addonTarget) {
186
+ funcConfig =
187
+ funcConfig ||
188
+ pikkuState(addonTarget.packageName, 'function', 'functions').get(
189
+ addonTarget.localName
190
+ )
191
+ funcMeta = pikkuState(addonTarget.packageName, 'function', 'meta')[
192
+ addonTarget.localName
193
+ ]
194
+ if (funcMeta) {
195
+ funcPackageName = addonTarget.packageName
196
+ }
197
+ }
198
+ }
199
+
171
200
  if (!funcConfig) {
172
201
  throw new Error(`Function not found: ${funcName}`)
173
202
  }
@@ -177,17 +206,17 @@ export const runPikkuFunc = async <In = any, Out = any>(
177
206
 
178
207
  const resolvedFunctionId = funcMeta.pikkuFuncId ?? funcName
179
208
 
180
- const resolvedSingletonServices = packageName
209
+ const resolvedSingletonServices = funcPackageName
181
210
  ? await getOrCreatePackageSingletonServices(
182
- packageName,
211
+ funcPackageName,
183
212
  singletonServices,
184
213
  addonInstance
185
214
  )
186
215
  : singletonServices
187
216
 
188
217
  let resolvedCreateWireServices = createWireServices
189
- if (packageName) {
190
- const factories = pikkuState(packageName, 'package', 'factories')
218
+ if (funcPackageName) {
219
+ const factories = pikkuState(funcPackageName, 'package', 'factories')
191
220
  if (factories?.createWireServices) {
192
221
  resolvedCreateWireServices = factories.createWireServices
193
222
  }
@@ -345,17 +374,21 @@ export const runPikkuFunc = async <In = any, Out = any>(
345
374
  actualData = applyDefaultsFromSchema(
346
375
  inputSchemaName,
347
376
  actualData,
348
- packageName
377
+ funcPackageName
349
378
  )
350
379
  if (coerceDataFromSchema) {
351
- coerceTopLevelDataFromSchema(inputSchemaName, actualData, packageName)
380
+ coerceTopLevelDataFromSchema(
381
+ inputSchemaName,
382
+ actualData,
383
+ funcPackageName
384
+ )
352
385
  }
353
386
  await validateSchema(
354
387
  resolvedSingletonServices.logger,
355
388
  resolvedSingletonServices.schema,
356
389
  inputSchemaName,
357
390
  actualData,
358
- packageName
391
+ funcPackageName
359
392
  )
360
393
  }
361
394
 
@@ -368,7 +401,7 @@ export const runPikkuFunc = async <In = any, Out = any>(
368
401
  // knowledge: decisions/security/a-permission-gets-a-wire-it-cannot-reply-on.md
369
402
  wire: invocationWire as PermissionWire,
370
403
  data: actualData,
371
- packageName,
404
+ packageName: funcPackageName,
372
405
  })
373
406
 
374
407
  let wireServices: Record<string, unknown> | undefined
@@ -395,7 +428,7 @@ export const runPikkuFunc = async <In = any, Out = any>(
395
428
  )
396
429
  services = { ...services, auditLog: invocationAuditLog }
397
430
  }
398
- const callerPackageName = packageName
431
+ const callerPackageName = funcPackageName
399
432
  Object.defineProperty(invocationWire, 'rpc', {
400
433
  get() {
401
434
  const rpc = rpcService.getContextRPCService(
@@ -2,17 +2,17 @@ import type {
2
2
  CoreServices,
3
3
  CoreSecretlessSingletonServices,
4
4
  CoreUserSession,
5
- CorePikkuMiddleware,
6
5
  PikkuWire,
7
- PickRequired,
8
6
  SecretlessServices,
9
7
  } from '../types/core.types.js'
8
+ import type { CorePikkuMiddleware } from '../middleware/middleware.types.js'
9
+ import type { PickRequired } from '../utils.js'
10
10
  import type { PikkuRPC } from '../wirings/rpc/rpc-types.js'
11
11
  import type { StandardSchemaV1 } from '@standard-schema/spec'
12
12
  import type { PikkuError } from '../errors/error-handler.js'
13
13
  import type { CoreNodeConfig } from '../wirings/node/node.types.js'
14
14
  import type { ScenarioSurface } from '../wirings/workflow/scenario-step.types.js'
15
- import type { Safe } from '../secret-value.js'
15
+ import type { Safe } from '../classification/secret-value.js'
16
16
 
17
17
  export type CorePikkuFunction<
18
18
  In,
@@ -149,8 +149,7 @@ export const pikkuAuth = <
149
149
  Session extends CoreUserSession = CoreUserSession,
150
150
  >(
151
151
  auth:
152
- | CorePikkuAuth<Services, Session>
153
- | CorePikkuAuthConfig<Services, Session>
152
+ CorePikkuAuth<Services, Session> | CorePikkuAuthConfig<Services, Session>
154
153
  ): CorePikkuPermission<any, Services, any> => {
155
154
  const fn = typeof auth === 'function' ? auth : auth.func
156
155
  const wrapper: CorePikkuPermission<any, Services, any> & AuthBranded = async (
@@ -167,8 +166,7 @@ export const pikkuAuth = <
167
166
  }
168
167
 
169
168
  export type CorePermissionGroup<PikkuPermission = CorePikkuPermission<any>> =
170
- | Record<string, PikkuPermission | PikkuPermission[]>
171
- | undefined
169
+ Record<string, PikkuPermission | PikkuPermission[]> | undefined
172
170
 
173
171
  /**
174
172
  * A lifecycle hook: same call signature as the function it hangs off, return
@@ -232,6 +230,12 @@ export type CorePikkuFunctionConfig<
232
230
  * and report how much of the flow each surface actually covers.
233
231
  */
234
232
  surfaces?: ScenarioSurface[]
233
+ /**
234
+ * Scenario steps only: this step is driven by a persona, so the runner injects
235
+ * `wire.actor` and refuses to dispatch it without one. Set by the definer from
236
+ * a `browser` binding or an explicit `actor: true`, never written by hand.
237
+ */
238
+ requiresActor?: boolean
235
239
  audit?:
236
240
  | boolean
237
241
  | {
@@ -1,4 +1,8 @@
1
- export { addFunction, getAllFunctionNames } from './function-runner.js'
1
+ export {
2
+ addFunction,
3
+ getAllFunctionNames,
4
+ runPikkuFunc,
5
+ } from './function-runner.js'
2
6
  export {
3
7
  pikkuAuth,
4
8
  pikkuPermission,
@@ -14,8 +18,23 @@ export type {
14
18
  CorePikkuAuthConfig,
15
19
  CorePikkuPermission,
16
20
  } from './functions.types.js'
21
+ export type { ListInput, ListOutput, Filter } from './list.types.js'
22
+ export { AbandonedError } from './abort-scope.js'
23
+ export type { AbortScope } from './abort-scope.js'
24
+ export { checkAuthPermissions } from '../permissions.js'
25
+ export type {
26
+ CorePermissionGroup,
27
+ CorePikkuApprovalDescription,
28
+ CorePikkuPermissionConfig,
29
+ CorePikkuPermissionFactory,
30
+ } from './functions.types.js'
17
31
  export type {
18
- ListInput,
19
- ListOutput,
20
- Filter,
21
- } from './list.types.js'
32
+ FunctionMeta,
33
+ FunctionRuntimeMeta,
34
+ FunctionServicesMeta,
35
+ FunctionWiresMeta,
36
+ FunctionsMeta,
37
+ FunctionsRuntimeMeta,
38
+ PermissionMetadata,
39
+ } from './function-meta.types.js'
40
+ export { PikkuRequest } from './pikku-request.js'
@@ -66,6 +66,4 @@ export type LeafFilter<F extends Record<string, unknown>> = {
66
66
  * evaluation time; a single-key object is a leaf predicate.
67
67
  */
68
68
  export type Filter<F extends Record<string, unknown>> =
69
- | LeafFilter<F>
70
- | Filter<F>[]
71
- | { [label: string]: Filter<F> }
69
+ LeafFilter<F> | Filter<F>[] | { [label: string]: Filter<F> }
@@ -1,5 +1,7 @@
1
- import { pikkuMiddleware, pikkuMiddlewareFactory } from '../types/core.types.js'
2
-
1
+ import {
2
+ pikkuMiddleware,
3
+ pikkuMiddlewareFactory,
4
+ } from './middleware-factories.js'
3
5
  export const authAPIKey = pikkuMiddlewareFactory<{
4
6
  source: 'header' | 'query' | 'all'
5
7
  }>(({ source }) =>
@@ -8,7 +8,7 @@ import {
8
8
  createMiddlewareSessionWireProps,
9
9
  } from '../services/user-session-service.js'
10
10
  import { InvalidSessionError } from '../errors/errors.js'
11
- import { createSecretValue } from '../secret-value.js'
11
+ import { createSecretValue } from '../classification/secret-value.js'
12
12
 
13
13
  beforeEach(() => {
14
14
  resetPikkuState()
@@ -1,7 +1,9 @@
1
1
  import { InvalidSessionError } from '../errors/errors.js'
2
2
  import type { CoreUserSession } from '../types/core.types.js'
3
- import { pikkuMiddleware, pikkuMiddlewareFactory } from '../types/core.types.js'
4
-
3
+ import {
4
+ pikkuMiddleware,
5
+ pikkuMiddlewareFactory,
6
+ } from './middleware-factories.js'
5
7
  const constantTimeEqual = (a: string, b: string): boolean => {
6
8
  if (a.length !== b.length) return false
7
9
  let result = 0
@@ -1,5 +1,8 @@
1
1
  import type { SerializeOptions } from 'cookie'
2
- import { pikkuMiddleware, pikkuMiddlewareFactory } from '../types/core.types.js'
2
+ import {
3
+ pikkuMiddleware,
4
+ pikkuMiddlewareFactory,
5
+ } from './middleware-factories.js'
3
6
  import type { RelativeTimeInput } from '../time-utils.js'
4
7
  import { getRelativeTimeOffsetFromNow } from '../time-utils.js'
5
8
 
@@ -15,6 +15,21 @@ const createMockRequest = (method = 'get', origin?: string) => ({
15
15
  },
16
16
  })
17
17
 
18
+ const createMockServices = () => {
19
+ const debugMessages: string[] = []
20
+ return {
21
+ logger: {
22
+ debug: (message: string) => {
23
+ debugMessages.push(message)
24
+ },
25
+ info: () => {},
26
+ warn: () => {},
27
+ error: () => {},
28
+ },
29
+ _debugMessages: debugMessages,
30
+ }
31
+ }
32
+
18
33
  const createMockResponse = () => {
19
34
  const headers: Record<string, string> = {}
20
35
  let statusCode: number | undefined
@@ -125,30 +140,113 @@ describe('cors', () => {
125
140
  )
126
141
  })
127
142
 
128
- test('should use first origin when request origin not in array', async () => {
143
+ test('should omit Access-Control-Allow-Origin when request origin not in array', async () => {
129
144
  const middleware = cors({ origin: ['https://a.com', 'https://b.com'] })
130
145
  const request = createMockRequest('get', 'https://unknown.com')
131
146
  const response = createMockResponse()
147
+ const services = createMockServices()
132
148
 
133
149
  await middleware(
134
- {} as any,
150
+ services as any,
135
151
  { http: { request, response } } as any,
136
152
  async () => {}
137
153
  )
138
154
 
139
155
  assert.strictEqual(
140
156
  response._headers['Access-Control-Allow-Origin'],
141
- 'https://a.com'
157
+ undefined
142
158
  )
143
159
  })
144
160
 
145
- test('should use first origin when no request origin header', async () => {
161
+ test('should log the rejected origin at debug level', async () => {
162
+ const middleware = cors({ origin: ['https://a.com', 'https://b.com'] })
163
+ const request = createMockRequest('get', 'https://unknown.com')
164
+ const response = createMockResponse()
165
+ const services = createMockServices()
166
+
167
+ await middleware(
168
+ services as any,
169
+ { http: { request, response } } as any,
170
+ async () => {}
171
+ )
172
+
173
+ assert.strictEqual(services._debugMessages.length, 1)
174
+ assert.match(services._debugMessages[0]!, /https:\/\/unknown\.com/)
175
+ })
176
+
177
+ test('should omit Access-Control-Allow-Origin when no request origin header', async () => {
146
178
  const middleware = cors({ origin: ['https://a.com', 'https://b.com'] })
147
179
  const request = createMockRequest('get')
148
180
  const response = createMockResponse()
181
+ const services = createMockServices()
149
182
 
150
183
  await middleware(
151
- {} as any,
184
+ services as any,
185
+ { http: { request, response } } as any,
186
+ async () => {}
187
+ )
188
+
189
+ assert.strictEqual(
190
+ response._headers['Access-Control-Allow-Origin'],
191
+ undefined
192
+ )
193
+ assert.strictEqual(services._debugMessages.length, 0)
194
+ })
195
+
196
+ test('should still call next for a disallowed origin', async () => {
197
+ const middleware = cors({ origin: ['https://a.com'] })
198
+ const request = createMockRequest('get', 'https://unknown.com')
199
+ const response = createMockResponse()
200
+ const services = createMockServices()
201
+ let nextCalled = false
202
+
203
+ await middleware(
204
+ services as any,
205
+ { http: { request, response } } as any,
206
+ async () => {
207
+ nextCalled = true
208
+ }
209
+ )
210
+
211
+ assert.strictEqual(nextCalled, true)
212
+ })
213
+
214
+ test('should omit Access-Control-Allow-Credentials for a disallowed origin', async () => {
215
+ const middleware = cors({
216
+ origin: ['https://a.com'],
217
+ credentials: true,
218
+ })
219
+ const request = createMockRequest('get', 'https://unknown.com')
220
+ const response = createMockResponse()
221
+ const services = createMockServices()
222
+
223
+ await middleware(
224
+ services as any,
225
+ { http: { request, response } } as any,
226
+ async () => {}
227
+ )
228
+
229
+ assert.strictEqual(
230
+ response._headers['Access-Control-Allow-Origin'],
231
+ undefined
232
+ )
233
+ assert.strictEqual(
234
+ response._headers['Access-Control-Allow-Credentials'],
235
+ undefined
236
+ )
237
+ })
238
+
239
+ test('should set credentials header for an allowed array origin', async () => {
240
+ const middleware = cors({
241
+ origin: ['https://a.com'],
242
+ credentials: true,
243
+ })
244
+ const request = createMockRequest('get', 'https://a.com')
245
+ const response = createMockResponse()
246
+ const services = createMockServices()
247
+
248
+ await middleware(
249
+ services as any,
152
250
  { http: { request, response } } as any,
153
251
  async () => {}
154
252
  )
@@ -157,6 +255,29 @@ describe('cors', () => {
157
255
  response._headers['Access-Control-Allow-Origin'],
158
256
  'https://a.com'
159
257
  )
258
+ assert.strictEqual(
259
+ response._headers['Access-Control-Allow-Credentials'],
260
+ 'true'
261
+ )
262
+ })
263
+
264
+ test('should omit Access-Control-Allow-Origin on a disallowed preflight but still return 204', async () => {
265
+ const middleware = cors({ origin: ['https://a.com'] })
266
+ const request = createMockRequest('options', 'https://unknown.com')
267
+ const response = createMockResponse()
268
+ const services = createMockServices()
269
+
270
+ await middleware(
271
+ services as any,
272
+ { http: { request, response } } as any,
273
+ async () => {}
274
+ )
275
+
276
+ assert.strictEqual(
277
+ response._headers['Access-Control-Allow-Origin'],
278
+ undefined
279
+ )
280
+ assert.strictEqual(response._getStatus(), 204)
160
281
  })
161
282
 
162
283
  test('should set Vary: Origin header when origin is array', async () => {
@@ -1,9 +1,13 @@
1
- import { pikkuMiddleware, pikkuMiddlewareFactory } from '../types/core.types.js'
2
-
1
+ import {
2
+ pikkuMiddleware,
3
+ pikkuMiddlewareFactory,
4
+ } from './middleware-factories.js'
3
5
  /**
4
6
  * Sets CORS headers on every response and short-circuits OPTIONS preflight
5
7
  * with a 204. `origin: true` reflects the request origin; an array reflects a
6
- * matching origin and otherwise falls back to its first entry.
8
+ * matching origin and otherwise sends no `Access-Control-Allow-Origin` at all,
9
+ * so the browser reports "origin not allowed" rather than an origin mismatch
10
+ * against whichever entry happened to be first.
7
11
  */
8
12
  export const cors = pikkuMiddlewareFactory<{
9
13
  origin?: string | string[] | true
@@ -29,7 +33,7 @@ export const cors = pikkuMiddlewareFactory<{
29
33
  return pikkuMiddleware({
30
34
  name: 'CORS',
31
35
  description: 'Handles cross-origin requests including OPTIONS preflight',
32
- func: async (_services, wires, next) => {
36
+ func: async (services, wires, next) => {
33
37
  const request = wires.http?.request
34
38
  const response = wires.http?.response
35
39
 
@@ -39,19 +43,26 @@ export const cors = pikkuMiddlewareFactory<{
39
43
 
40
44
  const requestOrigin = request.header('origin')
41
45
 
42
- let allowedOrigin: string
46
+ let allowedOrigin: string | undefined
43
47
  if (origin === true) {
44
48
  allowedOrigin = requestOrigin || '*'
45
49
  } else if (Array.isArray(origin)) {
46
50
  allowedOrigin =
47
51
  requestOrigin && origin.includes(requestOrigin)
48
52
  ? requestOrigin
49
- : origin[0]
53
+ : undefined
54
+ if (requestOrigin && !allowedOrigin) {
55
+ services.logger.debug(
56
+ `CORS: origin '${requestOrigin}' is not in the allowed list, omitting Access-Control-Allow-Origin`
57
+ )
58
+ }
50
59
  } else {
51
60
  allowedOrigin = origin
52
61
  }
53
62
 
54
- response.header('Access-Control-Allow-Origin', allowedOrigin)
63
+ if (allowedOrigin) {
64
+ response.header('Access-Control-Allow-Origin', allowedOrigin)
65
+ }
55
66
  response.header('Access-Control-Allow-Methods', methods.join(', '))
56
67
  response.header('Access-Control-Allow-Headers', headers.join(', '))
57
68
 
@@ -62,7 +73,7 @@ export const cors = pikkuMiddlewareFactory<{
62
73
  )
63
74
  }
64
75
 
65
- if (credentials) {
76
+ if (credentials && allowedOrigin) {
66
77
  response.header('Access-Control-Allow-Credentials', 'true')
67
78
  }
68
79
 
@@ -11,3 +11,19 @@ export {
11
11
  runMiddleware,
12
12
  } from '../middleware-runner.js'
13
13
  export { addGlobalPermission } from '../permissions.js'
14
+ export type {
15
+ CorePikkuMiddleware,
16
+ CorePikkuMiddlewareConfig,
17
+ CorePikkuMiddlewareFactory,
18
+ CorePikkuMiddlewareGroup,
19
+ MiddlewareMetadata,
20
+ MiddlewarePriority,
21
+ } from './middleware.types.js'
22
+ export {
23
+ pikkuAgentMiddleware,
24
+ pikkuChannelMiddleware,
25
+ pikkuChannelMiddlewareFactory,
26
+ pikkuMiddleware,
27
+ pikkuMiddlewareFactory,
28
+ } from './middleware-factories.js'
29
+ export type { PikkuAgentMiddlewareHooks } from '../wirings/agent/agent.types.js'
@@ -0,0 +1,62 @@
1
+ import type {
2
+ CoreSingletonServices,
3
+ CoreUserSession,
4
+ } from '../types/core.types.js'
5
+ import type {
6
+ CorePikkuChannelMiddleware,
7
+ CorePikkuChannelMiddlewareFactory,
8
+ } from '../wirings/channel/channel.types.js'
9
+ import type { PikkuAgentMiddlewareHooks } from '../wirings/agent/agent.types.js'
10
+ import type {
11
+ CorePikkuMiddleware,
12
+ CorePikkuMiddlewareConfig,
13
+ CorePikkuMiddlewareFactory,
14
+ MiddlewarePriority,
15
+ } from './middleware.types.js'
16
+
17
+ export const pikkuMiddleware = <
18
+ SingletonServices extends CoreSingletonServices = CoreSingletonServices,
19
+ UserSession extends CoreUserSession = CoreUserSession,
20
+ >(
21
+ middleware:
22
+ | CorePikkuMiddleware<SingletonServices, UserSession>
23
+ | CorePikkuMiddlewareConfig<SingletonServices, UserSession>
24
+ ): CorePikkuMiddleware<SingletonServices, UserSession> => {
25
+ if (typeof middleware === 'function') return middleware
26
+ const func = middleware.func as CorePikkuMiddleware<
27
+ SingletonServices,
28
+ UserSession
29
+ > & { __priority?: MiddlewarePriority }
30
+ if (middleware.priority) {
31
+ func.__priority = middleware.priority
32
+ }
33
+ return func
34
+ }
35
+
36
+ export const pikkuMiddlewareFactory = <In = any>(
37
+ factory: CorePikkuMiddlewareFactory<In>
38
+ ): CorePikkuMiddlewareFactory<In> => {
39
+ return factory
40
+ }
41
+
42
+ export const pikkuChannelMiddleware = <
43
+ SingletonServices extends CoreSingletonServices = CoreSingletonServices,
44
+ Event = unknown,
45
+ >(
46
+ middleware: CorePikkuChannelMiddleware<SingletonServices, Event>
47
+ ): CorePikkuChannelMiddleware<SingletonServices, Event> => {
48
+ return middleware
49
+ }
50
+
51
+ export const pikkuChannelMiddlewareFactory = <In = any>(
52
+ factory: CorePikkuChannelMiddlewareFactory<In>
53
+ ): CorePikkuChannelMiddlewareFactory<In> => {
54
+ return factory
55
+ }
56
+
57
+ export const pikkuAgentMiddleware = <
58
+ State extends Record<string, unknown> = Record<string, unknown>,
59
+ SingletonServices extends CoreSingletonServices = CoreSingletonServices,
60
+ >(
61
+ hooks: PikkuAgentMiddlewareHooks<State, SingletonServices>
62
+ ): PikkuAgentMiddlewareHooks<State, SingletonServices> => hooks
@@ -0,0 +1,61 @@
1
+ import type {
2
+ CoreSingletonServices,
3
+ CoreUserSession,
4
+ PikkuWire,
5
+ } from '../types/core.types.js'
6
+
7
+ export type CorePikkuMiddleware<
8
+ SingletonServices extends CoreSingletonServices = CoreSingletonServices,
9
+ UserSession extends CoreUserSession = CoreUserSession,
10
+ > = (
11
+ services: SingletonServices,
12
+ wires: PikkuWire,
13
+ next: () => Promise<void>
14
+ ) => Promise<void>
15
+
16
+ /**
17
+ * Execution order: `highest` runs first (outermost in the onion), `lowest`
18
+ * runs last, closest to the function.
19
+ */
20
+ export type MiddlewarePriority =
21
+ 'highest' | 'high' | 'medium' | 'low' | 'lowest'
22
+
23
+ export type CorePikkuMiddlewareConfig<
24
+ SingletonServices extends CoreSingletonServices = CoreSingletonServices,
25
+ UserSession extends CoreUserSession = CoreUserSession,
26
+ > = {
27
+ func: CorePikkuMiddleware<SingletonServices, UserSession>
28
+ name?: string
29
+ description?: string
30
+ /** Execution priority. Lower runs first (outermost). Defaults to 'medium'. */
31
+ priority?: MiddlewarePriority
32
+ }
33
+
34
+ export type CorePikkuMiddlewareFactory<
35
+ In = any,
36
+ SingletonServices extends CoreSingletonServices = CoreSingletonServices,
37
+ UserSession extends CoreUserSession = CoreUserSession,
38
+ > = (input: In) => CorePikkuMiddleware<SingletonServices, UserSession>
39
+
40
+ export type CorePikkuMiddlewareGroup<
41
+ SingletonServices extends CoreSingletonServices = CoreSingletonServices,
42
+ UserSession extends CoreUserSession = CoreUserSession,
43
+ > = Array<
44
+ | CorePikkuMiddleware<SingletonServices, UserSession>
45
+ | CorePikkuMiddlewareFactory<any, SingletonServices, UserSession>
46
+ >
47
+
48
+ export type MiddlewareMetadata =
49
+ | {
50
+ type: 'http'
51
+ route: string // Route pattern (e.g., '*' for all, '/api/*' for specific)
52
+ }
53
+ | {
54
+ type: 'tag'
55
+ tag: string
56
+ }
57
+ | {
58
+ type: 'wire'
59
+ name: string
60
+ inline?: boolean
61
+ }
@@ -4,7 +4,7 @@ import { pikkuRemoteAuthMiddleware } from './remote-auth.js'
4
4
  import { UnauthorizedError } from '../errors/errors.js'
5
5
  import { resetPikkuState } from '../pikku-state.js'
6
6
  import { encryptWithKeyMaterial, REMOTE_SESSION_INFO } from '../crypto-utils.js'
7
- import { createSecretValue } from '../secret-value.js'
7
+ import { createSecretValue } from '../classification/secret-value.js'
8
8
 
9
9
  beforeEach(() => {
10
10
  resetPikkuState()
@@ -1,5 +1,5 @@
1
1
  import { UnauthorizedError } from '../errors/errors.js'
2
- import { pikkuMiddleware } from '../types/core.types.js'
2
+ import { pikkuMiddleware } from './middleware-factories.js'
3
3
  import {
4
4
  assertStrongKeyMaterial,
5
5
  decryptWithKeyMaterial,