@pikku/core 0.12.84 → 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 (564) hide show
  1. package/CHANGELOG.md +424 -0
  2. package/dist/bootstrap-compat/root.d.ts +20 -0
  3. package/dist/classification/column-form.d.ts +32 -0
  4. package/dist/classification/column-form.js +42 -0
  5. package/dist/classification/data-classification.d.ts +64 -0
  6. package/dist/classification/index.d.ts +13 -0
  7. package/dist/classification/index.js +2 -0
  8. package/dist/classification/secret-value.d.ts +56 -0
  9. package/dist/classification/secret-value.js +46 -0
  10. package/dist/crypto-utils.d.ts +1 -1
  11. package/dist/ecosystem/agent-scorer.d.ts +1 -1
  12. package/dist/ecosystem/agent.d.ts +4 -1
  13. package/dist/ecosystem/channel/local.d.ts +2 -0
  14. package/dist/ecosystem/channel/local.js +2 -0
  15. package/dist/ecosystem/channel/serverless.d.ts +9 -0
  16. package/dist/ecosystem/channel/serverless.js +1 -0
  17. package/dist/ecosystem/channel.d.ts +3 -0
  18. package/dist/ecosystem/channel.js +1 -0
  19. package/dist/ecosystem/cli.d.ts +1 -1
  20. package/dist/ecosystem/cli.js +1 -1
  21. package/dist/ecosystem/credential.d.ts +1 -0
  22. package/dist/ecosystem/crypto-utils.d.ts +8 -0
  23. package/dist/ecosystem/crypto-utils.js +1 -0
  24. package/dist/ecosystem/dev.d.ts +1 -0
  25. package/dist/ecosystem/dev.js +1 -0
  26. package/{src/ecosystem/testing.ts → dist/ecosystem/errors.d.ts} +3 -3
  27. package/dist/ecosystem/errors.js +2 -0
  28. package/dist/ecosystem/function.d.ts +1 -1
  29. package/dist/ecosystem/function.js +1 -1
  30. package/dist/ecosystem/http.d.ts +3 -1
  31. package/dist/ecosystem/http.js +3 -1
  32. package/dist/ecosystem/mcp.d.ts +1 -1
  33. package/dist/ecosystem/mcp.js +1 -1
  34. package/dist/ecosystem/middleware.d.ts +2 -1
  35. package/dist/ecosystem/middleware.js +2 -1
  36. package/dist/ecosystem/persona.d.ts +4 -2
  37. package/dist/ecosystem/persona.js +2 -1
  38. package/dist/ecosystem/queue.d.ts +4 -2
  39. package/dist/ecosystem/queue.js +3 -1
  40. package/dist/ecosystem/role.d.ts +1 -0
  41. package/dist/ecosystem/rpc.d.ts +2 -0
  42. package/dist/ecosystem/rpc.js +1 -0
  43. package/dist/ecosystem/scenario.d.ts +8 -2
  44. package/dist/ecosystem/scenario.js +5 -1
  45. package/dist/ecosystem/scheduler.d.ts +2 -1
  46. package/dist/ecosystem/scheduler.js +2 -1
  47. package/dist/ecosystem/schema.d.ts +2 -1
  48. package/dist/ecosystem/schema.js +1 -1
  49. package/dist/ecosystem/scope.d.ts +2 -0
  50. package/dist/ecosystem/scope.js +1 -0
  51. package/dist/ecosystem/secret.d.ts +2 -0
  52. package/dist/ecosystem/secret.js +1 -0
  53. package/dist/ecosystem/services/local-content.d.ts +2 -1
  54. package/dist/ecosystem/services/local-content.js +1 -1
  55. package/dist/ecosystem/services/local-meta.d.ts +1 -0
  56. package/dist/ecosystem/services/local-meta.js +1 -0
  57. package/dist/ecosystem/services.d.ts +11 -3
  58. package/dist/ecosystem/services.js +7 -1
  59. package/dist/ecosystem/trigger.d.ts +1 -0
  60. package/dist/ecosystem/trigger.js +1 -1
  61. package/dist/ecosystem/types.d.ts +6 -3
  62. package/dist/ecosystem/types.js +3 -2
  63. package/dist/ecosystem/variable.d.ts +1 -0
  64. package/dist/ecosystem/virtual-user.d.ts +3 -0
  65. package/dist/ecosystem/virtual-user.js +3 -0
  66. package/dist/ecosystem/workflow.d.ts +2 -0
  67. package/dist/ecosystem/workflow.js +2 -0
  68. package/dist/errors/index.d.ts +8 -0
  69. package/dist/errors/index.js +1 -0
  70. package/dist/errors/serialized-error.d.ts +7 -0
  71. package/dist/function/function-meta.types.d.ts +139 -0
  72. package/dist/function/function-runner.d.ts +3 -2
  73. package/dist/function/function-runner.js +31 -11
  74. package/dist/function/functions.types.d.ts +10 -2
  75. package/dist/function/index.d.ts +8 -2
  76. package/dist/function/index.js +4 -1
  77. package/dist/function/pikku-request.d.ts +8 -0
  78. package/dist/function/pikku-request.js +15 -0
  79. package/dist/middleware/auth-apikey.d.ts +2 -10
  80. package/dist/middleware/auth-apikey.js +1 -1
  81. package/dist/middleware/auth-bearer.d.ts +2 -10
  82. package/dist/middleware/auth-bearer.js +1 -1
  83. package/dist/middleware/auth-cookie.d.ts +2 -10
  84. package/dist/middleware/auth-cookie.js +1 -1
  85. package/dist/middleware/cors.d.ts +5 -11
  86. package/dist/middleware/cors.js +13 -6
  87. package/dist/middleware/index.d.ts +3 -0
  88. package/dist/middleware/index.js +1 -0
  89. package/dist/middleware/middleware-factories.d.ts +9 -0
  90. package/dist/middleware/middleware-factories.js +19 -0
  91. package/dist/middleware/middleware.types.d.ts +27 -0
  92. package/dist/middleware/middleware.types.js +1 -0
  93. package/dist/middleware/remote-auth.d.ts +2 -2
  94. package/dist/middleware/remote-auth.js +1 -1
  95. package/dist/middleware/telemetry.d.ts +4 -20
  96. package/dist/middleware/telemetry.js +1 -1
  97. package/dist/middleware-runner.d.ts +2 -1
  98. package/dist/pikku-state.d.ts +2 -1
  99. package/dist/services/audit-service.d.ts +1 -1
  100. package/dist/services/credential-wire-service.js +1 -1
  101. package/dist/services/email-service.d.ts +1 -1
  102. package/dist/services/file-scenario-run-store.d.ts +58 -0
  103. package/dist/services/file-scenario-run-store.js +214 -0
  104. package/dist/services/in-memory-workflow-service.d.ts +1 -1
  105. package/dist/services/index.d.ts +5 -1
  106. package/dist/services/index.js +3 -0
  107. package/dist/services/local-secrets.d.ts +1 -1
  108. package/dist/services/local-secrets.js +1 -1
  109. package/dist/services/logger.d.ts +7 -7
  110. package/dist/services/meta-service.d.ts +2 -1
  111. package/dist/services/scoped-secret-service.d.ts +1 -1
  112. package/dist/services/secret-service.d.ts +1 -1
  113. package/dist/services/typed-secret-service.d.ts +16 -2
  114. package/dist/services/typed-secret-service.js +5 -0
  115. package/dist/services/webhook-service.d.ts +1 -1
  116. package/dist/services/workflow-service.d.ts +2 -1
  117. package/dist/testing/index.d.ts +1 -0
  118. package/dist/testing/index.js +1 -0
  119. package/dist/types/core.types.d.ts +30 -180
  120. package/dist/types/core.types.js +1 -19
  121. package/dist/types/index.d.ts +2 -0
  122. package/dist/types/index.js +1 -0
  123. package/dist/types/state.types.d.ts +3 -1
  124. package/dist/utils.d.ts +13 -0
  125. package/dist/utils.js +2 -0
  126. package/dist/wirings/addon/addon-runner.d.ts +17 -0
  127. package/dist/wirings/addon/addon-runner.js +150 -0
  128. package/dist/wirings/addon/index.d.ts +6 -0
  129. package/dist/wirings/addon/index.js +3 -0
  130. package/dist/wirings/addon/remote-addon-auth.d.ts +16 -0
  131. package/dist/wirings/addon/remote-addon-auth.js +39 -0
  132. package/dist/wirings/addon/wire-addon.d.ts +80 -0
  133. package/dist/wirings/addon/wire-addon.js +120 -0
  134. package/dist/wirings/addon/wire-remote-addon.d.ts +22 -0
  135. package/dist/wirings/addon/wire-remote-addon.js +11 -0
  136. package/dist/wirings/agent/agent-prepare.d.ts +3 -3
  137. package/dist/wirings/agent/agent-prepare.js +1 -1
  138. package/dist/wirings/agent/agent-runner.js +2 -3
  139. package/dist/wirings/agent/agent-stream.js +2 -2
  140. package/dist/wirings/agent/agent-utils.d.ts +13 -0
  141. package/dist/wirings/agent/agent-utils.js +16 -0
  142. package/dist/wirings/agent/agent.types.d.ts +3 -2
  143. package/dist/wirings/agent/index.d.ts +1 -1
  144. package/dist/wirings/agent/voice-input.js +1 -1
  145. package/dist/wirings/agent/voice-output.js +1 -1
  146. package/dist/wirings/agent-scorer/agent-scorer-judge.d.ts +13 -0
  147. package/dist/wirings/agent-scorer/agent-scorer-judge.js +52 -0
  148. package/dist/wirings/agent-scorer/agent-scorer.d.ts +7 -1
  149. package/dist/wirings/agent-scorer/agent-scorer.js +1 -0
  150. package/dist/wirings/agent-scorer/agent-scorer.types.d.ts +20 -0
  151. package/dist/wirings/agent-scorer/index.d.ts +1 -1
  152. package/dist/wirings/channel/channel-common.d.ts +2 -1
  153. package/dist/wirings/channel/channel-middleware-runner.d.ts +2 -1
  154. package/dist/wirings/channel/channel.types.d.ts +1 -1
  155. package/dist/wirings/channel/serverless/index.d.ts +1 -0
  156. package/dist/wirings/cli/channel/index.d.ts +1 -1
  157. package/dist/wirings/cli/cli-runner.d.ts +2 -1
  158. package/dist/wirings/cli/cli-runner.js +4 -1
  159. package/dist/wirings/cli/cli.types.d.ts +21 -2
  160. package/dist/wirings/cli/command-parser.js +157 -23
  161. package/dist/wirings/gateway/gateway.types.d.ts +2 -1
  162. package/dist/wirings/http/http-runner.d.ts +1 -1
  163. package/dist/wirings/http/http-runner.js +1 -1
  164. package/dist/wirings/http/http.types.d.ts +2 -2
  165. package/dist/wirings/http/index.d.ts +1 -0
  166. package/dist/wirings/http/index.js +1 -0
  167. package/dist/wirings/http/pikku-fetch-http-request.js +1 -1
  168. package/dist/wirings/http/pikku-fetch-http-response.js +2 -2
  169. package/dist/wirings/mcp/mcp.types.d.ts +1 -1
  170. package/dist/wirings/persona/index.d.ts +1 -1
  171. package/dist/wirings/persona/index.js +1 -1
  172. package/dist/wirings/persona/persona.types.d.ts +14 -0
  173. package/dist/wirings/queue/queue.types.d.ts +1 -1
  174. package/dist/wirings/queue/signed-queue-service.d.ts +1 -1
  175. package/dist/wirings/rpc/index.d.ts +0 -6
  176. package/dist/wirings/rpc/index.js +0 -3
  177. package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -1
  178. package/dist/wirings/rpc/remote-addon-auth.js +1 -1
  179. package/dist/wirings/rpc/rpc-runner.js +2 -2
  180. package/dist/wirings/rpc/wire-addon.d.ts +1 -1
  181. package/dist/wirings/scheduler/scheduler.types.d.ts +2 -1
  182. package/dist/wirings/scope/index.d.ts +1 -0
  183. package/dist/wirings/scope/index.js +1 -0
  184. package/dist/wirings/secret/secret.types.d.ts +10 -0
  185. package/dist/wirings/secret/validate-secret-definitions.js +2 -0
  186. package/dist/wirings/variable/validate-variable-definitions.js +2 -0
  187. package/dist/wirings/variable/variable.types.d.ts +9 -0
  188. package/dist/wirings/virtual-user/index.d.ts +1 -1
  189. package/dist/wirings/virtual-user/index.js +1 -1
  190. package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +1 -1
  191. package/dist/wirings/virtual-user/virtual-user-derive.d.ts +1 -1
  192. package/dist/wirings/workflow/graph/graph-node.d.ts +9 -2
  193. package/dist/wirings/workflow/graph/graph-node.js +2 -0
  194. package/dist/wirings/workflow/graph/graph-runner.d.ts +1 -0
  195. package/dist/wirings/workflow/graph/graph-runner.js +283 -31
  196. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +16 -1
  197. package/dist/wirings/workflow/index.d.ts +2 -0
  198. package/dist/wirings/workflow/index.js +1 -0
  199. package/dist/wirings/workflow/pikku-scenario-service.d.ts +14 -4
  200. package/dist/wirings/workflow/pikku-scenario-service.js +44 -16
  201. package/dist/wirings/workflow/pikku-workflow-service.d.ts +2 -1
  202. package/dist/wirings/workflow/pikku-workflow-service.js +3 -4
  203. package/dist/wirings/workflow/run-timeline.d.ts +1 -1
  204. package/dist/wirings/workflow/scenario-run.types.d.ts +171 -0
  205. package/dist/wirings/workflow/scenario-run.types.js +1 -0
  206. package/dist/wirings/workflow/scenario-step-guards.d.ts +1 -2
  207. package/dist/wirings/workflow/scenario-step-guards.js +0 -8
  208. package/dist/wirings/workflow/scenario-step.types.d.ts +27 -12
  209. package/dist/wirings/workflow/workflow-approval.js +2 -1
  210. package/dist/wirings/workflow/workflow-run-engine.types.d.ts +2 -1
  211. package/dist/wirings/workflow/workflow.types.d.ts +2 -1
  212. package/knowledge/decisions/index.md +2 -0
  213. package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +1 -1
  214. package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +1 -1
  215. package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +2 -2
  216. package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +6 -6
  217. package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +1 -1
  218. package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +1 -1
  219. package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +1 -1
  220. package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +1 -1
  221. package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +1 -1
  222. package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +1 -1
  223. package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +1 -1
  224. package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +1 -1
  225. package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +1 -1
  226. package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +1 -1
  227. package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +4 -4
  228. package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +1 -1
  229. package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +3 -3
  230. package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +2 -2
  231. package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +2 -2
  232. package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +1 -1
  233. package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +1 -1
  234. package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +3 -3
  235. package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +1 -1
  236. package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +4 -4
  237. package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +1 -1
  238. package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +1 -1
  239. package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +1 -1
  240. package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +1 -1
  241. package/knowledge/decisions/internals/index.md +4 -2
  242. package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +1 -1
  243. package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +1 -1
  244. package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +1 -1
  245. package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +1 -1
  246. package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +1 -1
  247. package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +2 -2
  248. package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +5 -5
  249. package/knowledge/decisions/internals/the-actor-prompt-says-json-because-of-json-object-mode.md +1 -1
  250. package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +1 -1
  251. package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +43 -19
  252. package/knowledge/decisions/internals/the-persona-runtime-is-exported-from-the-persona-entry-point.md +1 -1
  253. package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +1 -1
  254. package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +3 -3
  255. package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +1 -1
  256. package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +1 -1
  257. package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +1 -1
  258. package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +1 -1
  259. package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +1 -1
  260. package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +1 -1
  261. package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +1 -1
  262. package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +1 -1
  263. package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +1 -1
  264. package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +9 -5
  265. package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +1 -1
  266. package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +2 -2
  267. package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +1 -1
  268. package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +1 -1
  269. package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +1 -1
  270. package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +2 -3
  271. package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +1 -1
  272. package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +1 -1
  273. package/knowledge/decisions/security/agent-gate-requires-a-session-only-when-auth-is-true.md +1 -1
  274. package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +3 -3
  275. package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +4 -3
  276. package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +1 -1
  277. package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +2 -2
  278. package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +1 -1
  279. package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +2 -2
  280. package/knowledge/decisions/security/index.md +2 -0
  281. package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +1 -1
  282. package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +3 -3
  283. package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +1 -1
  284. package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +2 -2
  285. package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +1 -1
  286. package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +2 -2
  287. package/knowledge/index.md +3 -1
  288. package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +1 -1
  289. package/knowledge/questions/index.md +2 -0
  290. package/package.json +14 -13
  291. package/run-tests.sh +0 -0
  292. package/scripts/generate-api-report.d.mts +1 -1
  293. package/scripts/generate-api-report.mjs +67 -60
  294. package/scripts/generate-api-report.mts +11 -45
  295. package/src/api-report.test.ts +70 -1
  296. package/src/app-alias-surface.test.ts +179 -0
  297. package/src/app-leaf-surface.test.ts +217 -0
  298. package/src/bootstrap-compat/root.ts +20 -0
  299. package/src/{column-form.test.ts → classification/column-form.test.ts} +2 -2
  300. package/src/{data-classification.ts → classification/data-classification.ts} +1 -5
  301. package/src/classification/index.ts +38 -0
  302. package/src/{secret-value.test.ts → classification/secret-value.test.ts} +2 -2
  303. package/src/{secret-value.ts → classification/secret-value.ts} +1 -6
  304. package/src/crypto-utils.ts +1 -1
  305. package/src/dev/reload-meta.test.ts +1 -1
  306. package/src/errors/index.ts +9 -0
  307. package/src/errors/serialized-error.ts +9 -0
  308. package/src/factory-functions.test.ts +4 -2
  309. package/src/function/function-meta.types.ts +151 -0
  310. package/src/function/function-runner.test.ts +4 -2
  311. package/src/function/function-runner.ts +47 -14
  312. package/src/function/functions.types.ts +11 -7
  313. package/src/function/index.ts +24 -5
  314. package/src/function/list.types.ts +1 -3
  315. package/src/middleware/auth-apikey.ts +4 -2
  316. package/src/middleware/auth-bearer.test.ts +1 -1
  317. package/src/middleware/auth-bearer.ts +4 -2
  318. package/src/middleware/auth-cookie.ts +4 -1
  319. package/src/middleware/cors.test.ts +126 -5
  320. package/src/middleware/cors.ts +19 -8
  321. package/src/middleware/index.ts +16 -0
  322. package/src/middleware/middleware-factories.ts +62 -0
  323. package/src/middleware/middleware.types.ts +61 -0
  324. package/src/middleware/remote-auth.test.ts +1 -1
  325. package/src/middleware/remote-auth.ts +1 -1
  326. package/src/middleware/telemetry.ts +4 -2
  327. package/src/middleware-runner.test.ts +2 -3
  328. package/src/middleware-runner.ts +2 -2
  329. package/src/no-root-barrel.test.ts +114 -0
  330. package/src/permissions.ts +2 -4
  331. package/src/pikku-state.ts +3 -1
  332. package/src/public-surface.json +56 -241
  333. package/src/public-surface.json.README +3 -3
  334. package/src/public-surface.test.ts +5 -5
  335. package/src/remote.test.ts +1 -1
  336. package/src/removed-legacy-exports.test.ts +5 -1
  337. package/src/services/audit-service.ts +1 -1
  338. package/src/services/credential-wire-service.ts +1 -1
  339. package/src/services/email-service.ts +2 -4
  340. package/src/services/file-scenario-run-store.test.ts +349 -0
  341. package/src/services/file-scenario-run-store.ts +282 -0
  342. package/src/services/in-memory-workflow-service.ts +1 -1
  343. package/src/services/index.ts +13 -1
  344. package/src/services/local-content-request-handler.ts +1 -2
  345. package/src/services/local-secrets.ts +1 -1
  346. package/src/services/logger.ts +7 -7
  347. package/src/services/meta-service.ts +2 -2
  348. package/src/services/queue-webhook-service.test.ts +1 -1
  349. package/src/services/scoped-secret-service.ts +1 -1
  350. package/src/services/secret-service.ts +1 -1
  351. package/src/services/typed-secret-service.test.ts +52 -0
  352. package/src/services/typed-secret-service.ts +26 -2
  353. package/src/services/webhook-service.ts +1 -1
  354. package/src/services/workflow-service.ts +2 -1
  355. package/src/template-alias-surface.test.ts +240 -0
  356. package/src/testing/index.ts +1 -0
  357. package/src/types/core.types.ts +33 -285
  358. package/src/types/index.ts +2 -0
  359. package/src/types/state.types.ts +6 -5
  360. package/src/types/typed-credentials.test.ts +72 -0
  361. package/src/utils.ts +34 -0
  362. package/src/wirings/{rpc → addon}/addon-scopes.test.ts +1 -1
  363. package/src/wirings/addon/index.ts +12 -0
  364. package/src/wirings/{rpc → addon}/remote-addon-auth.ts +4 -1
  365. package/src/wirings/{rpc → addon}/wire-addon.ts +37 -2
  366. package/src/wirings/agent/agent-prepare.ts +8 -5
  367. package/src/wirings/agent/agent-runner.ts +2 -3
  368. package/src/wirings/agent/agent-stream.ts +2 -3
  369. package/src/wirings/agent/agent-utils.ts +19 -0
  370. package/src/wirings/agent/agent.types.ts +3 -3
  371. package/src/wirings/agent/index.ts +1 -0
  372. package/src/wirings/agent/voice-input.ts +1 -1
  373. package/src/wirings/agent/voice-output.test.ts +2 -4
  374. package/src/wirings/agent/voice-output.ts +1 -1
  375. package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +145 -0
  376. package/src/wirings/agent-scorer/agent-scorer-judge.ts +60 -0
  377. package/src/wirings/agent-scorer/agent-scorer.ts +8 -0
  378. package/src/wirings/agent-scorer/agent-scorer.types.ts +21 -0
  379. package/src/wirings/agent-scorer/index.ts +1 -0
  380. package/src/wirings/channel/channel-common.ts +4 -2
  381. package/src/wirings/channel/channel-handler.ts +2 -5
  382. package/src/wirings/channel/channel-middleware-runner.ts +1 -1
  383. package/src/wirings/channel/channel-rpc.types.ts +1 -5
  384. package/src/wirings/channel/channel.types.ts +1 -2
  385. package/src/wirings/channel/local/local-channel-runner.test.ts +1 -2
  386. package/src/wirings/channel/serverless/index.ts +1 -0
  387. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +2 -2
  388. package/src/wirings/cli/channel/index.ts +1 -3
  389. package/src/wirings/cli/cli-runner.test.ts +1 -1
  390. package/src/wirings/cli/cli-runner.ts +11 -7
  391. package/src/wirings/cli/cli.types.ts +24 -3
  392. package/src/wirings/cli/command-parser.test.ts +388 -1
  393. package/src/wirings/cli/command-parser.ts +189 -29
  394. package/src/wirings/gateway/gateway-runner.test.ts +1 -2
  395. package/src/wirings/gateway/gateway-runner.ts +3 -6
  396. package/src/wirings/gateway/gateway.types.ts +5 -4
  397. package/src/wirings/http/http-routes.test.ts +1 -2
  398. package/src/wirings/http/http-runner-addon-ref.test.ts +238 -0
  399. package/src/wirings/http/http-runner.test.ts +3 -8
  400. package/src/wirings/http/http-runner.ts +9 -3
  401. package/src/wirings/http/http.types.ts +3 -12
  402. package/src/wirings/http/index.ts +1 -0
  403. package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
  404. package/src/wirings/http/pikku-fetch-http-response.ts +3 -2
  405. package/src/wirings/mcp/mcp-runner.test.ts +1 -1
  406. package/src/wirings/mcp/mcp.types.ts +1 -2
  407. package/src/wirings/persona/index.ts +1 -4
  408. package/src/wirings/persona/persona.types.ts +14 -0
  409. package/src/wirings/queue/queue-identity.test.ts +1 -1
  410. package/src/wirings/queue/queue.types.ts +2 -6
  411. package/src/wirings/queue/signed-queue-service.ts +1 -1
  412. package/src/wirings/rpc/index.ts +0 -12
  413. package/src/wirings/rpc/rpc-runner.test.ts +4 -4
  414. package/src/wirings/rpc/rpc-runner.ts +3 -3
  415. package/src/wirings/scheduler/scheduler.types.ts +2 -5
  416. package/src/wirings/scope/index.ts +1 -0
  417. package/src/wirings/secret/secret.types.ts +10 -0
  418. package/src/wirings/secret/validate-secret-definitions.test.ts +23 -0
  419. package/src/wirings/secret/validate-secret-definitions.ts +2 -0
  420. package/src/wirings/variable/validate-variable-definitions.test.ts +23 -0
  421. package/src/wirings/variable/validate-variable-definitions.ts +2 -0
  422. package/src/wirings/variable/variable.types.ts +9 -0
  423. package/src/wirings/virtual-user/index.ts +1 -4
  424. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +1 -1
  425. package/src/wirings/virtual-user/virtual-user-derive.test.ts +1 -1
  426. package/src/wirings/virtual-user/virtual-user-derive.ts +1 -1
  427. package/src/wirings/virtual-user/virtual-user.types.ts +1 -5
  428. package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +569 -0
  429. package/src/wirings/workflow/graph/graph-foreach.test.ts +626 -0
  430. package/src/wirings/workflow/graph/graph-node.ts +16 -1
  431. package/src/wirings/workflow/graph/graph-runner.ts +387 -61
  432. package/src/wirings/workflow/graph/workflow-graph.types.ts +28 -3
  433. package/src/wirings/workflow/index.ts +8 -0
  434. package/src/wirings/workflow/pikku-scenario-service.ts +59 -19
  435. package/src/wirings/workflow/pikku-workflow-service.ts +6 -8
  436. package/src/wirings/workflow/run-timeline.ts +1 -1
  437. package/src/wirings/workflow/scenario-expectations.test.ts +28 -13
  438. package/src/wirings/workflow/scenario-run.types.ts +186 -0
  439. package/src/wirings/workflow/scenario-step-guards.ts +1 -14
  440. package/src/wirings/workflow/scenario-step.test.ts +32 -7
  441. package/src/wirings/workflow/scenario-step.types.ts +27 -12
  442. package/src/wirings/workflow/workflow-approval-policy.test.ts +117 -47
  443. package/src/wirings/workflow/workflow-approval.ts +2 -1
  444. package/src/wirings/workflow/workflow-run-engine.types.ts +2 -1
  445. package/src/wirings/workflow/workflow.types.ts +4 -12
  446. package/src/wirings-stay-decoupled.test.ts +6 -3
  447. package/tsconfig.tsbuildinfo +1 -1
  448. package/tsconfig.type-tests.json +3 -2
  449. package/dist/ecosystem/ai-agent.d.ts +0 -18
  450. package/dist/ecosystem/ai-agent.js +0 -6
  451. package/dist/ecosystem/ai-scorer.d.ts +0 -12
  452. package/dist/ecosystem/ai-scorer.js +0 -5
  453. package/dist/services/ai-agent-runner-service.d.ts +0 -220
  454. package/dist/services/ai-run-state-service.d.ts +0 -29
  455. package/dist/services/ai-storage-service.d.ts +0 -18
  456. package/dist/services/in-memory-ai-run-state-service.d.ts +0 -19
  457. package/dist/services/in-memory-ai-run-state-service.js +0 -54
  458. package/dist/testing/service-tests/ai-storage-service-tests.d.ts +0 -3
  459. package/dist/testing/service-tests/ai-storage-service-tests.js +0 -302
  460. package/dist/wirings/ai-agent/agent-rpc.d.ts +0 -15
  461. package/dist/wirings/ai-agent/agent-rpc.js +0 -53
  462. package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -79
  463. package/dist/wirings/ai-agent/ai-agent-agui.js +0 -327
  464. package/dist/wirings/ai-agent/ai-agent-finalize.d.ts +0 -58
  465. package/dist/wirings/ai-agent/ai-agent-finalize.js +0 -138
  466. package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +0 -35
  467. package/dist/wirings/ai-agent/ai-agent-helpers.js +0 -47
  468. package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +0 -153
  469. package/dist/wirings/ai-agent/ai-agent-interrupt.js +0 -257
  470. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +0 -42
  471. package/dist/wirings/ai-agent/ai-agent-memory.js +0 -333
  472. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -16
  473. package/dist/wirings/ai-agent/ai-agent-model-config.js +0 -51
  474. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +0 -117
  475. package/dist/wirings/ai-agent/ai-agent-prepare.js +0 -728
  476. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +0 -16
  477. package/dist/wirings/ai-agent/ai-agent-registry.js +0 -51
  478. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +0 -7
  479. package/dist/wirings/ai-agent/ai-agent-runner.js +0 -580
  480. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +0 -41
  481. package/dist/wirings/ai-agent/ai-agent-stream.js +0 -1029
  482. package/dist/wirings/ai-agent/ai-agent-turn.d.ts +0 -57
  483. package/dist/wirings/ai-agent/ai-agent-turn.js +0 -82
  484. package/dist/wirings/ai-agent/ai-agent-utils.d.ts +0 -1
  485. package/dist/wirings/ai-agent/ai-agent-utils.js +0 -1
  486. package/dist/wirings/ai-agent/ai-agent.types.d.ts +0 -625
  487. package/dist/wirings/ai-agent/index.d.ts +0 -12
  488. package/dist/wirings/ai-agent/index.js +0 -10
  489. package/dist/wirings/ai-agent/voice-input.d.ts +0 -69
  490. package/dist/wirings/ai-agent/voice-input.js +0 -150
  491. package/dist/wirings/ai-agent/voice-output.d.ts +0 -85
  492. package/dist/wirings/ai-agent/voice-output.js +0 -196
  493. package/dist/wirings/ai-scorer/ai-scorer-grade.d.ts +0 -26
  494. package/dist/wirings/ai-scorer/ai-scorer-grade.js +0 -33
  495. package/dist/wirings/ai-scorer/ai-scorer-judge.d.ts +0 -17
  496. package/dist/wirings/ai-scorer/ai-scorer-judge.js +0 -92
  497. package/dist/wirings/ai-scorer/ai-scorer-live.d.ts +0 -15
  498. package/dist/wirings/ai-scorer/ai-scorer-live.js +0 -38
  499. package/dist/wirings/ai-scorer/ai-scorer-registry.d.ts +0 -18
  500. package/dist/wirings/ai-scorer/ai-scorer-registry.js +0 -46
  501. package/dist/wirings/ai-scorer/ai-scorer-sampling.d.ts +0 -8
  502. package/dist/wirings/ai-scorer/ai-scorer-sampling.js +0 -31
  503. package/dist/wirings/ai-scorer/ai-scorer-snapshots.d.ts +0 -10
  504. package/dist/wirings/ai-scorer/ai-scorer-snapshots.js +0 -40
  505. package/dist/wirings/ai-scorer/ai-scorer-worker.d.ts +0 -15
  506. package/dist/wirings/ai-scorer/ai-scorer-worker.js +0 -58
  507. package/dist/wirings/ai-scorer/ai-scorer.d.ts +0 -39
  508. package/dist/wirings/ai-scorer/ai-scorer.js +0 -40
  509. package/dist/wirings/ai-scorer/ai-scorer.types.d.ts +0 -90
  510. package/dist/wirings/ai-scorer/ai-scorer.types.js +0 -4
  511. package/dist/wirings/ai-scorer/index.d.ts +0 -6
  512. package/dist/wirings/ai-scorer/index.js +0 -5
  513. package/src/ecosystem/agent-scorer.ts +0 -24
  514. package/src/ecosystem/agent.ts +0 -42
  515. package/src/ecosystem/channel/local.ts +0 -1
  516. package/src/ecosystem/channel.ts +0 -22
  517. package/src/ecosystem/cli/channel.ts +0 -25
  518. package/src/ecosystem/cli.ts +0 -21
  519. package/src/ecosystem/credential.ts +0 -10
  520. package/src/ecosystem/dev.ts +0 -12
  521. package/src/ecosystem/function.ts +0 -28
  522. package/src/ecosystem/gateway.ts +0 -4
  523. package/src/ecosystem/hmac.ts +0 -1
  524. package/src/ecosystem/http.ts +0 -22
  525. package/src/ecosystem/mcp.ts +0 -17
  526. package/src/ecosystem/middleware.ts +0 -27
  527. package/src/ecosystem/node-host-resolver.ts +0 -1
  528. package/src/ecosystem/node.ts +0 -5
  529. package/src/ecosystem/oauth2.ts +0 -4
  530. package/src/ecosystem/persona.ts +0 -30
  531. package/src/ecosystem/queue.ts +0 -23
  532. package/src/ecosystem/remote.ts +0 -9
  533. package/src/ecosystem/role.ts +0 -13
  534. package/src/ecosystem/rpc.ts +0 -7
  535. package/src/ecosystem/safe-fetch.ts +0 -8
  536. package/src/ecosystem/scenario.ts +0 -32
  537. package/src/ecosystem/scheduler.ts +0 -5
  538. package/src/ecosystem/schema.ts +0 -1
  539. package/src/ecosystem/scope.ts +0 -14
  540. package/src/ecosystem/secret.ts +0 -15
  541. package/src/ecosystem/services/istanbul-coverage.ts +0 -1
  542. package/src/ecosystem/services/local-content-request-handler.ts +0 -16
  543. package/src/ecosystem/services/local-content.ts +0 -1
  544. package/src/ecosystem/services/v8-coverage.ts +0 -1
  545. package/src/ecosystem/services.ts +0 -82
  546. package/src/ecosystem/trigger.ts +0 -7
  547. package/src/ecosystem/types.ts +0 -34
  548. package/src/ecosystem/variable.ts +0 -14
  549. package/src/ecosystem/virtual-user.ts +0 -48
  550. package/src/ecosystem/workflow.ts +0 -68
  551. package/src/ecosystem.ts +0 -40
  552. package/src/index.ts +0 -244
  553. /package/dist/{services/ai-agent-runner-service.js → bootstrap-compat/root.js} +0 -0
  554. /package/dist/{services/ai-run-state-service.js → classification/data-classification.js} +0 -0
  555. /package/dist/{services/ai-storage-service.js → errors/serialized-error.js} +0 -0
  556. /package/dist/{wirings/ai-agent/ai-agent.types.js → function/function-meta.types.js} +0 -0
  557. /package/src/{column-form.ts → classification/column-form.ts} +0 -0
  558. /package/src/{pikku-request.test.ts → function/pikku-request.test.ts} +0 -0
  559. /package/src/{pikku-request.ts → function/pikku-request.ts} +0 -0
  560. /package/src/wirings/{rpc → addon}/addon-auth-tags.test.ts +0 -0
  561. /package/src/wirings/{rpc → addon}/addon-runner.ts +0 -0
  562. /package/src/wirings/{rpc → addon}/addon-secrets.test.ts +0 -0
  563. /package/src/wirings/{rpc → addon}/wire-addon.test.ts +0 -0
  564. /package/src/wirings/{rpc → addon}/wire-remote-addon.ts +0 -0
@@ -81,10 +81,9 @@ export const resolveGatewayAdapter = (
81
81
  import type {
82
82
  PikkuWire,
83
83
  PikkuRawWire,
84
- CorePikkuMiddleware,
85
84
  CoreSingletonServices,
86
85
  } from '../../types/core.types.js'
87
-
86
+ import type { CorePikkuMiddleware } from '../../middleware/middleware.types.js'
88
87
  export const wireGateway = (config: CoreGateway): void => {
89
88
  pikkuState(null, 'gateway', 'gateways').set(config.name, config)
90
89
 
@@ -206,8 +205,7 @@ const createWebhookPostHandler = (config: CoreGateway) => {
206
205
  }
207
206
 
208
207
  const gatewayMiddleware = userMiddleware as
209
- | CorePikkuMiddleware[]
210
- | undefined
208
+ CorePikkuMiddleware[] | undefined
211
209
  const result: any = gatewayMiddleware?.length
212
210
  ? await runMiddleware(services, wire, gatewayMiddleware, invoke)
213
211
  : await invoke()
@@ -334,8 +332,7 @@ const wireWebsocketGateway = (config: CoreGateway): void => {
334
332
  }
335
333
 
336
334
  const gatewayMiddleware = userMiddleware as
337
- | CorePikkuMiddleware[]
338
- | undefined
335
+ CorePikkuMiddleware[] | undefined
339
336
  const result: any = gatewayMiddleware?.length
340
337
  ? await runMiddleware(services, wire, gatewayMiddleware, invoke)
341
338
  : await invoke()
@@ -1,9 +1,11 @@
1
1
  import type {
2
2
  CommonWireMeta,
3
- CorePikkuMiddleware,
4
- CorePikkuMiddlewareGroup,
5
3
  CoreSingletonServices,
6
4
  } from '../../types/core.types.js'
5
+ import type {
6
+ CorePikkuMiddleware,
7
+ CorePikkuMiddlewareGroup,
8
+ } from '../../middleware/middleware.types.js'
7
9
  import type { CorePikkuFunctionConfig } from '../../function/functions.types.js'
8
10
  import type { PikkuHTTPRequest } from '../http/http.types.js'
9
11
 
@@ -31,8 +33,7 @@ export interface GatewayOutboundMessage {
31
33
  }
32
34
 
33
35
  export type WebhookVerificationResult =
34
- | { verified: true; response: unknown }
35
- | { verified: false }
36
+ { verified: true; response: unknown } | { verified: false }
36
37
 
37
38
  export interface GatewayAdapter {
38
39
  name: string
@@ -4,8 +4,7 @@ import { wireHTTPRoutes, defineHTTPRoutes } from './http-routes.js'
4
4
  import { pikkuState, resetPikkuState } from '../../pikku-state.js'
5
5
  import { addFunction } from '../../function/function-runner.js'
6
6
  import { httpRouter } from './routers/http-router.js'
7
- import type { CorePikkuMiddleware } from '../../types/core.types.js'
8
-
7
+ import type { CorePikkuMiddleware } from '../../middleware/middleware.types.js'
9
8
  const mockFunc = async () => ({ success: true })
10
9
 
11
10
  const mockMiddleware: CorePikkuMiddleware = async (_services, _wire, next) => {
@@ -0,0 +1,238 @@
1
+ import { test, describe, beforeEach } from 'node:test'
2
+ import * as assert from 'assert'
3
+ import { addHTTPMiddleware, fetch, wireHTTP } from './http-runner.js'
4
+ import { pikkuState, resetPikkuState } from '../../pikku-state.js'
5
+ import { addSchema } from '../../schema.js'
6
+ import { PikkuMockRequest } from '../channel/local/local-channel-runner.test.js'
7
+ import { httpRouter } from './routers/http-router.js'
8
+ import type { CoreHTTPFunctionWiring, HTTPMethod } from './http.types.js'
9
+
10
+ const ADDON_PACKAGE = '@acme/addon'
11
+ const ADDON_NAMESPACE = 'ext'
12
+ const TARGET = `${ADDON_NAMESPACE}:greet`
13
+
14
+ class ParamsRequest extends PikkuMockRequest {
15
+ override async data() {
16
+ return this.params()
17
+ }
18
+ override header(): string | null {
19
+ return null
20
+ }
21
+ }
22
+
23
+ const registerAddon = (
24
+ sessionless = true,
25
+ inputSchemaName: string | null = null
26
+ ) => {
27
+ pikkuState(null, 'addons', 'packages').set(ADDON_NAMESPACE, {
28
+ package: ADDON_PACKAGE,
29
+ } as never)
30
+ pikkuState(ADDON_PACKAGE, 'function', 'meta', {
31
+ greet: {
32
+ pikkuFuncId: 'greet',
33
+ name: 'greet',
34
+ sessionless,
35
+ inputSchemaName,
36
+ outputSchemaName: null,
37
+ inputs: [],
38
+ outputs: [],
39
+ services: { optimized: false, services: [] },
40
+ },
41
+ } as never)
42
+ }
43
+
44
+ const emptyHTTPMeta = () => ({
45
+ get: {},
46
+ post: {},
47
+ delete: {},
48
+ patch: {},
49
+ head: {},
50
+ put: {},
51
+ options: {},
52
+ })
53
+
54
+ const setRouteMeta = (
55
+ route: string,
56
+ method: HTTPMethod,
57
+ extra: Record<string, unknown> = {}
58
+ ) => {
59
+ const meta = pikkuState(null, 'http', 'meta')
60
+ meta[method][route] = {
61
+ pikkuFuncId: TARGET,
62
+ route,
63
+ method,
64
+ ...extra,
65
+ }
66
+ }
67
+
68
+ describe('http routes wired with ref() to an addon function', () => {
69
+ beforeEach(() => {
70
+ resetPikkuState()
71
+ httpRouter.reset()
72
+ pikkuState(null, 'package', 'singletonServices', {
73
+ logger: { info: () => {}, warn: () => {}, error: () => {} },
74
+ } as never)
75
+ pikkuState(null, 'package', 'factories', {
76
+ createWireServices: async () => ({}),
77
+ } as never)
78
+ pikkuState(null, 'http', 'meta', emptyHTTPMeta() as never)
79
+ })
80
+
81
+ test('resolves the namespaced target through the addon package', async () => {
82
+ registerAddon()
83
+ setRouteMeta('/addon/greet', 'get', { auth: false })
84
+
85
+ wireHTTP({
86
+ route: '/addon/greet',
87
+ method: 'get',
88
+ auth: false,
89
+ func: { func: async () => ({ message: 'hello' }) },
90
+ } as CoreHTTPFunctionWiring<unknown, unknown, string>)
91
+ httpRouter.initialize()
92
+
93
+ const response = await fetch(new ParamsRequest('/addon/greet', 'get'))
94
+
95
+ assert.strictEqual(response.status, 200)
96
+ assert.deepStrictEqual(await response.json(), { message: 'hello' })
97
+ })
98
+
99
+ test('serves the same addon function at two routes with different params', async () => {
100
+ registerAddon()
101
+ setRouteMeta('/addon/greet/:id', 'get', { auth: false, params: ['id'] })
102
+ setRouteMeta('/addon/greet-all', 'get', { auth: false })
103
+
104
+ const seen: unknown[] = []
105
+ const proxy = {
106
+ func: async (_services: never, data: unknown) => {
107
+ seen.push(data)
108
+ return data
109
+ },
110
+ }
111
+
112
+ wireHTTP({
113
+ route: '/addon/greet/:id',
114
+ method: 'get',
115
+ auth: false,
116
+ func: proxy,
117
+ } as unknown as CoreHTTPFunctionWiring<unknown, unknown, string>)
118
+ wireHTTP({
119
+ route: '/addon/greet-all',
120
+ method: 'get',
121
+ auth: false,
122
+ func: proxy,
123
+ } as unknown as CoreHTTPFunctionWiring<unknown, unknown, string>)
124
+ httpRouter.initialize()
125
+
126
+ const withParam = await fetch(new ParamsRequest('/addon/greet/42', 'get'))
127
+ const withoutParam = await fetch(
128
+ new ParamsRequest('/addon/greet-all', 'get')
129
+ )
130
+
131
+ assert.deepStrictEqual(await withParam.json(), { id: '42' })
132
+ assert.deepStrictEqual(await withoutParam.json(), {})
133
+ assert.deepEqual(seen, [{ id: '42' }, {}])
134
+ })
135
+
136
+ /**
137
+ * The addon registers its schemas in its own package state, and the name the
138
+ * runner validates against comes from the addon's metadata. Resolving the
139
+ * target's metadata by namespace while still reading the schema registry of
140
+ * the wire's package looks the name up under 'main', where the addon never
141
+ * put it — the route then answers 500 for every input it was given.
142
+ */
143
+ test("validates input against the addon package's schema registry", async () => {
144
+ registerAddon(true, 'GreetInput')
145
+ addSchema(
146
+ 'GreetInput',
147
+ { type: 'object', properties: { id: { type: 'string' } } },
148
+ ADDON_PACKAGE
149
+ )
150
+ setRouteMeta('/addon/greet-schema/:id', 'get', {
151
+ auth: false,
152
+ params: ['id'],
153
+ })
154
+
155
+ const compiled: string[] = []
156
+ pikkuState(null, 'package', 'singletonServices', {
157
+ logger: { info: () => {}, warn: () => {}, error: () => {} },
158
+ schema: {
159
+ compileSchema: (key: string) => {
160
+ compiled.push(key)
161
+ },
162
+ validateSchema: () => {},
163
+ getSchemaKeys: () => [],
164
+ },
165
+ } as never)
166
+
167
+ wireHTTP({
168
+ route: '/addon/greet-schema/:id',
169
+ method: 'get',
170
+ auth: false,
171
+ func: { func: async (_s: never, data: unknown) => data },
172
+ } as unknown as CoreHTTPFunctionWiring<unknown, unknown, string>)
173
+ httpRouter.initialize()
174
+
175
+ const response = await fetch(
176
+ new ParamsRequest('/addon/greet-schema/42', 'get')
177
+ )
178
+
179
+ assert.strictEqual(response.status, 200)
180
+ assert.deepStrictEqual(await response.json(), { id: '42' })
181
+ assert.deepStrictEqual(compiled.length > 0, true)
182
+ })
183
+
184
+ test("runs the consuming app's middleware, not the addon package's", async () => {
185
+ registerAddon()
186
+ setRouteMeta('/addon/greet-mw', 'get', {
187
+ auth: false,
188
+ middleware: [{ type: 'http', route: '*' }],
189
+ })
190
+
191
+ const ran: string[] = []
192
+ addHTTPMiddleware('*', [
193
+ async (_services, _wire, next) => {
194
+ ran.push('app')
195
+ await next()
196
+ },
197
+ ] as never)
198
+ addHTTPMiddleware(
199
+ '*',
200
+ [
201
+ async (_services: never, _wire: never, next: () => Promise<void>) => {
202
+ ran.push('addon')
203
+ await next()
204
+ },
205
+ ] as never,
206
+ ADDON_PACKAGE
207
+ )
208
+
209
+ wireHTTP({
210
+ route: '/addon/greet-mw',
211
+ method: 'get',
212
+ auth: false,
213
+ func: { func: async () => ({ message: 'hello' }) },
214
+ } as CoreHTTPFunctionWiring<unknown, unknown, string>)
215
+ httpRouter.initialize()
216
+
217
+ const response = await fetch(new ParamsRequest('/addon/greet-mw', 'get'))
218
+
219
+ assert.strictEqual(response.status, 200)
220
+ assert.deepStrictEqual(ran, ['app'])
221
+ })
222
+
223
+ test('honours the addon function metadata when a session is required', async () => {
224
+ registerAddon(false)
225
+ setRouteMeta('/addon/greet', 'get')
226
+
227
+ wireHTTP({
228
+ route: '/addon/greet',
229
+ method: 'get',
230
+ func: { func: async () => ({ message: 'hello' }) },
231
+ } as CoreHTTPFunctionWiring<unknown, unknown, string>)
232
+ httpRouter.initialize()
233
+
234
+ const response = await fetch(new ParamsRequest('/addon/greet', 'get'))
235
+
236
+ assert.strictEqual(response.status, 403)
237
+ })
238
+ })
@@ -1,7 +1,8 @@
1
1
  import { test, describe, beforeEach, afterEach } from 'node:test'
2
2
  import * as assert from 'assert'
3
3
  import { NotFoundError } from '../../errors/errors.js'
4
- import type { JSONValue, CorePikkuMiddleware } from '../../types/core.types.js'
4
+ import type { JSONValue } from '../../utils.js'
5
+ import type { CorePikkuMiddleware } from '../../middleware/middleware.types.js'
5
6
  import {
6
7
  addHTTPMiddleware,
7
8
  createHTTPWire,
@@ -112,13 +113,7 @@ const setHTTPFunctionMap = (func: any) => {
112
113
  const setRouteMeta = (
113
114
  route: string,
114
115
  method:
115
- | 'get'
116
- | 'post'
117
- | 'put'
118
- | 'delete'
119
- | 'patch'
120
- | 'head'
121
- | 'options' = 'get',
116
+ 'get' | 'post' | 'put' | 'delete' | 'patch' | 'head' | 'options' = 'get',
122
117
  overrides: Record<string, unknown> = {}
123
118
  ) => {
124
119
  const meta = pikkuState(null, 'http', 'meta')
@@ -14,12 +14,14 @@ import type {
14
14
  } from '../../function/functions.types.js'
15
15
  import type {
16
16
  CoreUserSession,
17
- CorePikkuMiddleware,
18
- CorePikkuMiddlewareGroup,
19
17
  PikkuRawWire,
20
18
  PikkuWire,
21
19
  PikkuWiringTypes,
22
20
  } from '../../types/core.types.js'
21
+ import type {
22
+ CorePikkuMiddleware,
23
+ CorePikkuMiddlewareGroup,
24
+ } from '../../middleware/middleware.types.js'
23
25
  import { NotFoundError } from '../../errors/errors.js'
24
26
  import { createWeakUID, isSerializable } from '../../utils.js'
25
27
  import {
@@ -100,7 +102,11 @@ export const wireHTTP = <
100
102
  return
101
103
  }
102
104
  if (httpWiring.func) {
103
- addFunction(routeMeta.pikkuFuncId, httpWiring.func)
105
+ addFunction(
106
+ routeMeta.pikkuFuncId,
107
+ httpWiring.func,
108
+ routeMeta.packageName ?? null
109
+ )
104
110
  }
105
111
  const routes = pikkuState(null, 'http', 'routes')
106
112
  if (!routes.has(httpWiring.method)) {
@@ -1,9 +1,7 @@
1
1
  import type { SerializeOptions } from 'cookie'
2
2
  import type { StandardSchemaV1 } from '@standard-schema/spec'
3
- import type {
4
- CorePikkuMiddleware,
5
- CommonWireMeta,
6
- } from '../../types/core.types.js'
3
+ import type { CommonWireMeta } from '../../types/core.types.js'
4
+ import type { CorePikkuMiddleware } from '../../middleware/middleware.types.js'
7
5
  import type {
8
6
  CorePikkuFunction,
9
7
  CorePikkuFunctionSessionless,
@@ -43,13 +41,7 @@ export type RunHTTPWiringOptions = Partial<{
43
41
  }>
44
42
 
45
43
  export type HTTPMethod =
46
- | 'post'
47
- | 'get'
48
- | 'delete'
49
- | 'patch'
50
- | 'head'
51
- | 'put'
52
- | 'options'
44
+ 'post' | 'get' | 'delete' | 'patch' | 'head' | 'put' | 'options'
53
45
 
54
46
  export type HTTPHeadersSchema = StandardSchemaV1<
55
47
  Record<string, string | string[] | undefined>
@@ -193,7 +185,6 @@ export type HTTPWiringMeta = CommonWireMeta & {
193
185
  * join wrong reads an open route as a closed one.
194
186
  */
195
187
  requiresSession?: boolean
196
- refTarget?: string
197
188
  params?: string[]
198
189
  query?: string[]
199
190
  inputTypes?: HTTPFunctionMetaInputTypes
@@ -9,6 +9,7 @@ export { fetch, fetchData, wireHTTP, addHTTPMiddleware } from './http-runner.js'
9
9
 
10
10
  export { wireHTTPRoutes, defineHTTPRoutes } from './http-routes.js'
11
11
  export { toWebRequest, applyWebResponse } from './web-request.js'
12
+ export { httpRouter } from './routers/http-router.js'
12
13
 
13
14
  export type {
14
15
  AssertHTTPWiringParams,
@@ -1,5 +1,5 @@
1
1
  import { parse as parseQuery } from 'picoquery'
2
- import { parse as parseCookie } from 'cookie'
2
+ import { parseCookie } from 'cookie'
3
3
  import type { HTTPMethod, PikkuHTTPRequest, PikkuQuery } from './http.types.js'
4
4
  import {
5
5
  PayloadTooLargeError,
@@ -1,6 +1,6 @@
1
1
  import type { PikkuHTTPResponse } from './http.types.js'
2
2
  import type { SerializeOptions as CookieSerializeOptions } from 'cookie'
3
- import { serialize as serializeCookie } from 'cookie'
3
+ import { stringifySetCookie } from 'cookie'
4
4
 
5
5
  export class PikkuFetchHTTPResponse implements PikkuHTTPResponse {
6
6
  #statusCode: number = 200
@@ -116,7 +116,8 @@ export class PikkuFetchHTTPResponse implements PikkuHTTPResponse {
116
116
 
117
117
  public toResponse(args?: Record<string, any>): Response {
118
118
  const cookieHeader = Array.from(this.#cookies.entries()).map(
119
- ([name, { value, flags }]) => serializeCookie(name, value, flags)
119
+ ([name, { value, flags }]) =>
120
+ stringifySetCookie({ name, value, ...flags }, flags)
120
121
  )
121
122
  cookieHeader.forEach((cookie) => this.#headers.append('Set-Cookie', cookie))
122
123
  return new Response(this.#body, {
@@ -12,7 +12,7 @@ import {
12
12
  import { addGlobalMiddleware } from '../../middleware-runner.js'
13
13
  import { addFunction } from '../../function/function-runner.js'
14
14
  import { pikkuState, resetPikkuState } from '../../pikku-state.js'
15
- import { pikkuMiddleware } from '../../types/core.types.js'
15
+ import { pikkuMiddleware } from '../../middleware/middleware-factories.js'
16
16
  import { addTagMiddleware } from '../../middleware-runner.js'
17
17
 
18
18
  const logger = {
@@ -6,8 +6,7 @@ import type {
6
6
  import type {
7
7
  CorePikkuMiddleware,
8
8
  MiddlewareMetadata,
9
- } from '../../types/core.types.js'
10
-
9
+ } from '../../middleware/middleware.types.js'
11
10
  /** "user/{userId}/post/{postId}" => "userId" | "postId" */
12
11
  type ExtractMCPURIParams<S extends string> =
13
12
  S extends `${string}{${infer Param}}/${infer Rest}`
@@ -15,10 +15,7 @@ export type {
15
15
  PersonaEnvironment,
16
16
  PersonaEnvironmentSubject,
17
17
  } from './persona-environments.js'
18
- export {
19
- personaEmail,
20
- personaEmails,
21
- } from './persona-email.js'
18
+ export { personaEmail, personaEmails } from './persona-email.js'
22
19
  export type {
23
20
  MailboxAllowlist,
24
21
  PersonaMailbox,
@@ -107,6 +107,18 @@ export type CorePersona = {
107
107
  * into a flaky suite.
108
108
  */
109
109
  runnable?: boolean
110
+ /**
111
+ * The app this person signs into, when the product is more than one frontend.
112
+ *
113
+ * A person uses one of them — staff their app, customers theirs — and that is
114
+ * what decides where a browser step navigates: `/dashboard` is a different
115
+ * page in each, so the actor settles which one without the scenario saying.
116
+ * The runner takes the base url per app (`--app-url <app>=<url>`, or
117
+ * `appUrls` on the environment) and each actor browses against its own.
118
+ *
119
+ * Omitted is the normal case: one app, one url, nothing to say.
120
+ */
121
+ app?: string
110
122
  }
111
123
 
112
124
  /** Personas to declare, keyed by id. */
@@ -135,6 +147,8 @@ export type PersonaMeta = {
135
147
  /** Absent means "everywhere but production", which is resolved, not stored. */
136
148
  environments?: string[]
137
149
  runnable: boolean
150
+ /** The app this person signs into; picks their base url on a browser run. */
151
+ app?: string
138
152
  sourceFile?: string
139
153
  }
140
154
 
@@ -21,7 +21,7 @@ import type {
21
21
  QueueJob,
22
22
  QueueService,
23
23
  } from './queue.types.js'
24
- import { createSecretValue } from '../../secret-value.js'
24
+ import { createSecretValue } from '../../classification/secret-value.js'
25
25
 
26
26
  const QUEUE_NAME = 'identity-queue'
27
27
  const SECRET = 'a'.repeat(48)
@@ -1,7 +1,7 @@
1
1
  import type { CommonWireMeta } from '../../types/core.types.js'
2
2
  import type { CorePikkuFunctionConfig } from '../../function/functions.types.js'
3
3
  import type { QueueConfigMapping } from './validate-worker-config.js'
4
- import type { Safe } from '../../secret-value.js'
4
+ import type { Safe } from '../../classification/secret-value.js'
5
5
 
6
6
  export interface PikkuWorkerConfig {
7
7
  name?: string
@@ -63,11 +63,7 @@ export interface ConfigValidationResult {
63
63
  }
64
64
 
65
65
  export type QueueJobStatus =
66
- | 'waiting'
67
- | 'active'
68
- | 'completed'
69
- | 'failed'
70
- | 'delayed'
66
+ 'waiting' | 'active' | 'completed' | 'failed' | 'delayed'
71
67
 
72
68
  export type QueueJobMetadata = {
73
69
  progress?: number | string | object | undefined | boolean
@@ -1,4 +1,4 @@
1
- import type { Safe } from '../../secret-value.js'
1
+ import type { Safe } from '../../classification/secret-value.js'
2
2
  import type { Logger } from '../../services/logger.js'
3
3
  import type { SecretService } from '../../services/secret-service.js'
4
4
  import {
@@ -5,16 +5,4 @@ export {
5
5
  RemoteAddonConfigError,
6
6
  RemoteAddonRequestError,
7
7
  } from './rpc-runner.js'
8
- export {
9
- resolveRemoteAddonToken,
10
- RemoteAddonAuthError,
11
- } from './remote-addon-auth.js'
12
- export type { RemoteAddonAuthBinding } from './remote-addon-auth.js'
13
8
  export type { PikkuRPC, RPCMeta } from './rpc-types.js'
14
- export { wireAddon } from './wire-addon.js'
15
- export type { WireAddonConfig } from './wire-addon.js'
16
- export { wireRemoteAddon } from './wire-remote-addon.js'
17
- export type {
18
- WireRemoteAddonConfig,
19
- RemoteAddonAuth,
20
- } from './wire-remote-addon.js'
@@ -10,10 +10,10 @@ import {
10
10
  resolveNamespace,
11
11
  rpcService,
12
12
  } from './rpc-runner.js'
13
- import { RemoteAddonAuthError } from './remote-addon-auth.js'
14
- import { wireAddon } from './wire-addon.js'
15
- import { wireRemoteAddon } from './wire-remote-addon.js'
16
- import { createSecretValue } from '../../secret-value.js'
13
+ import { RemoteAddonAuthError } from '../addon/remote-addon-auth.js'
14
+ import { wireAddon } from '../addon/wire-addon.js'
15
+ import { wireRemoteAddon } from '../addon/wire-remote-addon.js'
16
+ import { createSecretValue } from '../../classification/secret-value.js'
17
17
 
18
18
  const createLogger = () => ({
19
19
  debug: () => {},
@@ -6,13 +6,13 @@ import type {
6
6
  import type { SessionService } from '../../services/user-session-service.js'
7
7
  import type { CoreUserSession } from '../../types/core.types.js'
8
8
  import { runPikkuFunc } from '../../function/function-runner.js'
9
- import type { AddonInstance } from './addon-runner.js'
10
- import { addonInstanceForNamespace } from './addon-runner.js'
9
+ import type { AddonInstance } from '../addon/addon-runner.js'
10
+ import { addonInstanceForNamespace } from '../addon/addon-runner.js'
11
11
  import { pikkuState } from '../../pikku-state.js'
12
12
  import { PikkuError, addError } from '../../errors/error-handler.js'
13
13
  import type { PikkuRPC, ResolvedFunction } from './rpc-types.js'
14
14
  import { parseVersionedId } from '../../version.js'
15
- import { resolveRemoteAddonToken } from './remote-addon-auth.js'
15
+ import { resolveRemoteAddonToken } from '../addon/remote-addon-auth.js'
16
16
  import { createAgentRPC } from '../agent/agent-rpc.js'
17
17
 
18
18
  /**
@@ -1,8 +1,5 @@
1
- import type {
2
- CoreUserSession,
3
- CorePikkuMiddleware,
4
- CommonWireMeta,
5
- } from '../../types/core.types.js'
1
+ import type { CoreUserSession, CommonWireMeta } from '../../types/core.types.js'
2
+ import type { CorePikkuMiddleware } from '../../middleware/middleware.types.js'
6
3
  import type {
7
4
  CorePikkuFunctionConfig,
8
5
  CorePikkuFunctionSessionless,
@@ -12,3 +12,4 @@ export type {
12
12
  ScopeDefinitions,
13
13
  ScopeNodeMeta,
14
14
  } from './scope.types.js'
15
+ export { hasScopes, verifyScopes } from '../../scopes.js'
@@ -4,6 +4,15 @@ export type CoreSecret<T = unknown> = {
4
4
  description?: string
5
5
  secretId: string
6
6
  schema: T
7
+ /**
8
+ * A secret is REQUIRED by default because `getSecret` throws when the value is
9
+ * missing — a deploy without it is a runtime failure waiting to happen, so the
10
+ * deploy gate refuses it. Mark a secret `optional` when absence is a supported
11
+ * state the app handles (a feature that simply stays off): the generated map
12
+ * emits it as an optional property and `getSecret` resolves `undefined`
13
+ * instead of throwing.
14
+ */
15
+ optional?: boolean
7
16
  /**
8
17
  * Where a user goes to obtain this value — a provider's API-key page, a setup
9
18
  * guide, an internal runbook. Consoles and deploy UIs surface it beside a
@@ -38,6 +47,7 @@ export type SecretDefinitionMeta = {
38
47
  description?: string
39
48
  secretId: string
40
49
  schema?: Record<string, unknown> | string
50
+ optional?: boolean
41
51
  docsUrl?: string
42
52
  oauth2?: OAuth2CredentialConfig
43
53
  rotationPeriod?: string
@@ -206,4 +206,27 @@ describe('validateAndBuildSecretDefinitionsMeta', () => {
206
206
  assert.ok(result['same'])
207
207
  assert.strictEqual(result['same'].secretId, 'KEY1')
208
208
  })
209
+
210
+ test('carries optional into the meta so the deploy gate can stop blocking on it', () => {
211
+ const result = validateAndBuildSecretDefinitionsMeta(
212
+ [
213
+ {
214
+ name: 'scenarioActor',
215
+ displayName: 'Scenario Actor Secret',
216
+ secretId: 'SCENARIO_ACTOR_SECRET',
217
+ optional: true,
218
+ sourceFile: 'a.ts',
219
+ },
220
+ {
221
+ name: 'stripe',
222
+ displayName: 'Stripe',
223
+ secretId: 'STRIPE_KEY',
224
+ sourceFile: 'a.ts',
225
+ },
226
+ ] as any,
227
+ new Map()
228
+ )
229
+ assert.strictEqual(result['scenarioActor']!.optional, true)
230
+ assert.strictEqual(result['stripe']!.optional, undefined)
231
+ })
209
232
  })