@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
@@ -1,4 +1,6 @@
1
+ export { InMemoryWorkflowService } from '../services/in-memory-workflow-service.js';
1
2
  export { template } from '../wirings/workflow/graph/template.js';
2
3
  export { isRef } from '../wirings/workflow/graph/workflow-graph.types.js';
4
+ export { PikkuWorkflowService } from '../wirings/workflow/pikku-workflow-service.js';
3
5
  export { buildRunTimeline, reconstructFinalState, reconstructStateAt, } from '../wirings/workflow/run-timeline.js';
4
6
  export { assertWorkflowRunOwner } from '../wirings/workflow/workflow-run-ownership.js';
@@ -1,2 +1,10 @@
1
1
  export * from './errors.js';
2
2
  export { PikkuError, addError } from './error-handler.js';
3
+ /**
4
+ * Types the exports above mention but do not themselves export. Without
5
+ * them a consumer's declaration emit has no name for the type it infers,
6
+ * and fails with TS2883 rather than reaching for the original entry point.
7
+ */
8
+ export type { ErrorDetails } from './error-handler.js';
9
+ export { isExpectedError } from './error-handler.js';
10
+ export type { SerializedError } from './serialized-error.js';
@@ -1,2 +1,3 @@
1
1
  export * from './errors.js';
2
2
  export { PikkuError, addError } from './error-handler.js';
3
+ export { isExpectedError } from './error-handler.js';
@@ -0,0 +1,7 @@
1
+ export interface SerializedError {
2
+ message: string;
3
+ stack?: string;
4
+ code?: string;
5
+ expected?: boolean;
6
+ [key: string]: any;
7
+ }
@@ -0,0 +1,139 @@
1
+ import type { MiddlewareMetadata } from '../middleware/middleware.types.js';
2
+ import type { AuditDurability } from '../services/audit-service.js';
3
+ import type { ScenarioStepKind, ScenarioSurface } from '../wirings/workflow/scenario-step.types.js';
4
+ import type { CommonWireMeta } from '../types/core.types.js';
5
+ export interface FunctionServicesMeta {
6
+ optimized: boolean;
7
+ services: string[];
8
+ }
9
+ export interface FunctionWiresMeta {
10
+ optimized: boolean;
11
+ wires: string[];
12
+ }
13
+ /**
14
+ * A reference to a permission function, resolved by name. Function-scoped
15
+ * only: there are no wire- or tag-level permission references.
16
+ */
17
+ export type PermissionMetadata = {
18
+ type: 'wire';
19
+ name: string;
20
+ inline?: boolean;
21
+ };
22
+ export type FunctionRuntimeMeta = {
23
+ pikkuFuncId: string;
24
+ inputSchemaName: string | null;
25
+ outputSchemaName: string | null;
26
+ /** Scopes the session must hold to run this function. All are required (AND). */
27
+ scopes?: string[];
28
+ expose?: boolean;
29
+ /**
30
+ * A sessionless function's own `auth: true`. `sessionless` carries the
31
+ * baseline — a `pikkuFunc` always requires a session — and this carries the
32
+ * tightening a `pikkuSessionlessFunc` applies to itself. Both are needed to
33
+ * know whether a function is gated without running it.
34
+ */
35
+ auth?: boolean;
36
+ /**
37
+ * The author's declaration that this function's permission check lives in its
38
+ * own body. Carries no runtime effect — it records a gate codegen cannot see,
39
+ * so an audit is not left to guess whether a sessionless function is open.
40
+ * Refused unless `allow.permissionsInBody` is set in `pikku.config.json`.
41
+ */
42
+ permissionsInBody?: boolean;
43
+ remote?: boolean;
44
+ /**
45
+ * A step RPC: invoked by name only from a scenario run and refused
46
+ * everywhere else, so it is never network-callable.
47
+ */
48
+ scenarioStep?: boolean;
49
+ /**
50
+ * The body of a `pikkuScenario(...)`. Only ever run by `pikku scenario run`,
51
+ * so it is held back from the app bootstrap and from every deployed unit.
52
+ */
53
+ scenario?: boolean;
54
+ mcp?: boolean;
55
+ readonly?: boolean;
56
+ deploy?: 'serverless' | 'server' | 'auto';
57
+ sessionless?: boolean;
58
+ /** When true, workflow steps calling this function are dispatched via the queue. No queue service configured is a hard error. */
59
+ workflowQueued?: boolean;
60
+ /** Retry count when this function is used as a workflow step. */
61
+ workflowRetries?: number;
62
+ /** Timeout when this function is used as a workflow step (e.g. '30s', '5m'). */
63
+ workflowTimeout?: string;
64
+ /**
65
+ * Scenario steps only: which surfaces this step declares a binding for.
66
+ *
67
+ * The reporter derives coverage from this — a `then` with no binding for the
68
+ * surface the run targeted was never actually witnessed there, which is a gap
69
+ * worth counting rather than excusing.
70
+ */
71
+ scenarioStepSurfaces?: ScenarioSurface[];
72
+ /**
73
+ * Scenario steps only: this step runs as a persona, so every call site must
74
+ * pass one and the runner injects it as `wire.actor`.
75
+ *
76
+ * Declared by `actor: true`, or implied by a `browser` binding — a window is
77
+ * opened as somebody. Absent on a step with nobody to be: an assertion over
78
+ * what an earlier step returned, or one posting credentials precisely because
79
+ * it must not reuse an actor's session.
80
+ */
81
+ scenarioStepRequiresActor?: boolean;
82
+ /**
83
+ * Scenario steps only: who acts. Absent means `persona` — the ordinary step,
84
+ * and the only kind that existed before the other two.
85
+ *
86
+ * A `platform` or `addon` step is the app or a third-party system acting, and
87
+ * it must never reach a virtual user's catalogue. That is not tidiness: a
88
+ * virtual user that can invoke "Stripe's webhook arrives" can forge its own
89
+ * payment success, and every finding downstream of that is worthless.
90
+ */
91
+ scenarioStepKind?: ScenarioStepKind;
92
+ /** Addon steps only: the addon whose system acts — `wireAddon`'s `name`. */
93
+ scenarioStepAddon?: string;
94
+ /** Scenario steps only: the prose a reporter renders, with `{placeholders}` filled from the step's recorded input. */
95
+ scenarioStepTemplate?: string;
96
+ /**
97
+ * The function's `audit` config, resolved — `audit: true` reads as
98
+ * `{ durability: 'best-effort' }`. Absent means the function records nothing:
99
+ * `auditLog.write()` from an unmarked function is dropped with a warning, so
100
+ * this is the only place a reader can see which functions have a trail at all
101
+ * without running them.
102
+ *
103
+ * Informational. The runner resolves audit from the live function config, not
104
+ * from here, so meta and runtime cannot disagree about whether audit is on.
105
+ */
106
+ audit?: {
107
+ durability: AuditDurability;
108
+ };
109
+ version?: number;
110
+ approvalRequired?: boolean;
111
+ approvalDescription?: string;
112
+ implementationHash?: string;
113
+ contractHash?: string;
114
+ inputHash?: string;
115
+ outputHash?: string;
116
+ };
117
+ export type FunctionMeta = FunctionRuntimeMeta & Partial<{
118
+ name: string;
119
+ /** `remote`: a contract with no local body, answered by a connected client. */
120
+ functionType: 'user' | 'inline' | 'helper' | 'remote';
121
+ funcWrapper: string;
122
+ services: FunctionServicesMeta;
123
+ wires: FunctionWiresMeta;
124
+ inputs: string[] | null;
125
+ outputs: string[] | null;
126
+ middleware: MiddlewareMetadata[];
127
+ permissions: PermissionMetadata[];
128
+ isDirectFunction: boolean;
129
+ sourceFile: string;
130
+ exportedName: string;
131
+ /** File containing the handler body when it differs from sourceFile (imported handlers) */
132
+ bodySourceFile?: string;
133
+ /** 1-indexed first line of the handler body (verbose meta; coverage mapping) */
134
+ bodyStart: number;
135
+ /** 1-indexed last line of the handler body (verbose meta; coverage mapping) */
136
+ bodyEnd: number;
137
+ } & CommonWireMeta>;
138
+ export type FunctionsRuntimeMeta = Record<string, FunctionRuntimeMeta>;
139
+ export type FunctionsMeta = Record<string, FunctionMeta>;
@@ -1,9 +1,10 @@
1
- import type { CoreUserSession, CorePikkuMiddleware, PikkuWiringTypes, PikkuRawWire, MiddlewareMetadata, CoreSingletonServices, CreateWireServices } from '../types/core.types.js';
1
+ import type { CoreUserSession, PikkuWiringTypes, PikkuRawWire, CoreSingletonServices, CreateWireServices } from '../types/core.types.js';
2
+ import type { CorePikkuMiddleware, MiddlewareMetadata } from '../middleware/middleware.types.js';
2
3
  import type { CorePikkuChannelMiddleware } from '../wirings/channel/channel.types.js';
3
4
  import type { CorePikkuFunctionConfig } from './functions.types.js';
4
5
  import type { SessionService } from '../services/user-session-service.js';
5
6
  import { PikkuCredentialWireService } from '../services/credential-wire-service.js';
6
- import type { AddonInstance } from '../wirings/rpc/addon-runner.js';
7
+ import type { AddonInstance } from '../wirings/addon/addon-runner.js';
7
8
  export declare const addFunction: (funcName: string, funcConfig: CorePikkuFunctionConfig<any, any>, packageName?: string | null) => void;
8
9
  export declare const getFunctionNames: (packageName?: string | null) => string[];
9
10
  export declare const getAllFunctionNames: () => string[];
@@ -13,8 +13,8 @@ import { PikkuCredentialWireService, createWireServicesCredentialWireProps, } fr
13
13
  import { defaultPikkuUserIdResolver } from '../services/pikku-user-id.js';
14
14
  import { createInvocationAudit, resolveAuditConfig, } from '../services/audit-service.js';
15
15
  import { rpcService } from '../wirings/rpc/rpc-runner.js';
16
- import { getOrCreatePackageSingletonServices } from '../wirings/rpc/addon-runner.js';
17
- import { resolveAddonAuth, resolveAddonScopes, resolveAddonTagMiddleware, } from '../wirings/rpc/wire-addon.js';
16
+ import { getOrCreatePackageSingletonServices } from '../wirings/addon/addon-runner.js';
17
+ import { resolveAddonAuth, resolveAddonFunctionTarget, resolveAddonScopes, resolveAddonTagMiddleware, } from '../wirings/addon/wire-addon.js';
18
18
  import { closeWireServices } from '../utils.js';
19
19
  async function resolveSession(wire, singletonServices, sessionService) {
20
20
  const pikkuUserId = defaultPikkuUserIdResolver(wire);
@@ -77,6 +77,26 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
77
77
  }
78
78
  }
79
79
  }
80
+ /**
81
+ * The package the *function* belongs to, which is the wire's own until a
82
+ * `ref()` resolves the target into an addon. The wiring stays the consuming
83
+ * app's — that is what keeps the app's middleware running rather than the
84
+ * addon's — but everything the function is declared with lives in the addon's
85
+ * package state, so its schemas, services and permissions are read from here.
86
+ */
87
+ let funcPackageName = packageName;
88
+ if (!funcMeta) {
89
+ const addonTarget = resolveAddonFunctionTarget(funcName, packageName);
90
+ if (addonTarget) {
91
+ funcConfig =
92
+ funcConfig ||
93
+ pikkuState(addonTarget.packageName, 'function', 'functions').get(addonTarget.localName);
94
+ funcMeta = pikkuState(addonTarget.packageName, 'function', 'meta')[addonTarget.localName];
95
+ if (funcMeta) {
96
+ funcPackageName = addonTarget.packageName;
97
+ }
98
+ }
99
+ }
80
100
  if (!funcConfig) {
81
101
  throw new Error(`Function not found: ${funcName}`);
82
102
  }
@@ -84,12 +104,12 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
84
104
  throw new Error(`Function meta not found: ${funcName}`);
85
105
  }
86
106
  const resolvedFunctionId = funcMeta.pikkuFuncId ?? funcName;
87
- const resolvedSingletonServices = packageName
88
- ? await getOrCreatePackageSingletonServices(packageName, singletonServices, addonInstance)
107
+ const resolvedSingletonServices = funcPackageName
108
+ ? await getOrCreatePackageSingletonServices(funcPackageName, singletonServices, addonInstance)
89
109
  : singletonServices;
90
110
  let resolvedCreateWireServices = createWireServices;
91
- if (packageName) {
92
- const factories = pikkuState(packageName, 'package', 'factories');
111
+ if (funcPackageName) {
112
+ const factories = pikkuState(funcPackageName, 'package', 'factories');
93
113
  if (factories?.createWireServices) {
94
114
  resolvedCreateWireServices = factories.createWireServices;
95
115
  }
@@ -192,11 +212,11 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
192
212
  let actualData = await data();
193
213
  const inputSchemaName = funcMeta.inputSchemaName;
194
214
  if (inputSchemaName) {
195
- actualData = applyDefaultsFromSchema(inputSchemaName, actualData, packageName);
215
+ actualData = applyDefaultsFromSchema(inputSchemaName, actualData, funcPackageName);
196
216
  if (coerceDataFromSchema) {
197
- coerceTopLevelDataFromSchema(inputSchemaName, actualData, packageName);
217
+ coerceTopLevelDataFromSchema(inputSchemaName, actualData, funcPackageName);
198
218
  }
199
- await validateSchema(resolvedSingletonServices.logger, resolvedSingletonServices.schema, inputSchemaName, actualData, packageName);
219
+ await validateSchema(resolvedSingletonServices.logger, resolvedSingletonServices.schema, inputSchemaName, actualData, funcPackageName);
200
220
  }
201
221
  await runPermissions({
202
222
  funcPermissions: funcConfig.permissions,
@@ -204,7 +224,7 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
204
224
  // knowledge: decisions/security/a-permission-gets-a-wire-it-cannot-reply-on.md
205
225
  wire: invocationWire,
206
226
  data: actualData,
207
- packageName,
227
+ packageName: funcPackageName,
208
228
  });
209
229
  let wireServices;
210
230
  let invocationAuditLog;
@@ -220,7 +240,7 @@ export const runPikkuFunc = async (wireType, wireId, funcName, { singletonServic
220
240
  invocationAuditLog = createInvocationAudit(resolvedSingletonServices.audit, invocationWire, resolvedSingletonServices.logger);
221
241
  services = { ...services, auditLog: invocationAuditLog };
222
242
  }
223
- const callerPackageName = packageName;
243
+ const callerPackageName = funcPackageName;
224
244
  Object.defineProperty(invocationWire, 'rpc', {
225
245
  get() {
226
246
  const rpc = rpcService.getContextRPCService(services, invocationWire, { sessionService }, 0, callerPackageName);
@@ -1,10 +1,12 @@
1
- import type { CoreServices, CoreSecretlessSingletonServices, CoreUserSession, CorePikkuMiddleware, PikkuWire, PickRequired, SecretlessServices } from '../types/core.types.js';
1
+ import type { CoreServices, CoreSecretlessSingletonServices, CoreUserSession, PikkuWire, SecretlessServices } from '../types/core.types.js';
2
+ import type { CorePikkuMiddleware } from '../middleware/middleware.types.js';
3
+ import type { PickRequired } from '../utils.js';
2
4
  import type { PikkuRPC } from '../wirings/rpc/rpc-types.js';
3
5
  import type { StandardSchemaV1 } from '@standard-schema/spec';
4
6
  import type { PikkuError } from '../errors/error-handler.js';
5
7
  import type { CoreNodeConfig } from '../wirings/node/node.types.js';
6
8
  import type { ScenarioSurface } from '../wirings/workflow/scenario-step.types.js';
7
- import type { Safe } from '../secret-value.js';
9
+ import type { Safe } from '../classification/secret-value.js';
8
10
  export type CorePikkuFunction<In, Out, Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Session extends CoreUserSession = CoreUserSession, Wire extends PikkuWire<In, Out, true, Session, PikkuRPC, null, string> = PikkuWire<In, Out, true, Session>> = (services: Services, data: In, wire: Wire) => Wire['channel'] extends null ? Promise<Safe<Out>> : Promise<Safe<Out>> | Promise<void>;
9
11
  export type CorePikkuFunctionSessionless<In, Out, Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Session extends CoreUserSession = CoreUserSession, Wire extends PikkuWire<In, Out, false, Session, PikkuRPC, null, string> = PikkuWire<In, Out, false, Session>> = (services: Services, data: In, wire: Wire) => Wire['channel'] extends null ? Promise<Safe<Out>> : Promise<Safe<Out>> | Promise<void>;
10
12
  export type CorePikkuPermission<In = any, Services extends CoreSecretlessSingletonServices = SecretlessServices<CoreServices>, Wire extends PikkuWire<In, never, false, any, PikkuRPC, never, never> = PikkuWire<In, never, false, any, PikkuRPC, never, never>> = (services: Services, data: In, wire: Wire) => Promise<boolean>;
@@ -83,6 +85,12 @@ export type CorePikkuFunctionConfig<PikkuFunction extends CorePikkuFunction<any,
83
85
  * and report how much of the flow each surface actually covers.
84
86
  */
85
87
  surfaces?: ScenarioSurface[];
88
+ /**
89
+ * Scenario steps only: this step is driven by a persona, so the runner injects
90
+ * `wire.actor` and refuses to dispatch it without one. Set by the definer from
91
+ * a `browser` binding or an explicit `actor: true`, never written by hand.
92
+ */
93
+ requiresActor?: boolean;
86
94
  audit?: boolean | {
87
95
  durability?: 'best-effort' | 'transactional';
88
96
  };
@@ -1,4 +1,10 @@
1
- export { addFunction, getAllFunctionNames } from './function-runner.js';
1
+ export { addFunction, getAllFunctionNames, runPikkuFunc, } from './function-runner.js';
2
2
  export { pikkuAuth, pikkuPermission, pikkuPermissionFactory, pikkuApprovalDescription, } from './functions.types.js';
3
3
  export type { CorePikkuFunction, CorePikkuFunctionSessionless, CorePikkuFunctionConfig, CorePikkuSessionlessFunctionConfig, CorePikkuAuth, CorePikkuAuthConfig, CorePikkuPermission, } from './functions.types.js';
4
- export type { ListInput, ListOutput, Filter, } from './list.types.js';
4
+ export type { ListInput, ListOutput, Filter } from './list.types.js';
5
+ export { AbandonedError } from './abort-scope.js';
6
+ export type { AbortScope } from './abort-scope.js';
7
+ export { checkAuthPermissions } from '../permissions.js';
8
+ export type { CorePermissionGroup, CorePikkuApprovalDescription, CorePikkuPermissionConfig, CorePikkuPermissionFactory, } from './functions.types.js';
9
+ export type { FunctionMeta, FunctionRuntimeMeta, FunctionServicesMeta, FunctionWiresMeta, FunctionsMeta, FunctionsRuntimeMeta, PermissionMetadata, } from './function-meta.types.js';
10
+ export { PikkuRequest } from './pikku-request.js';
@@ -1,2 +1,5 @@
1
- export { addFunction, getAllFunctionNames } from './function-runner.js';
1
+ export { addFunction, getAllFunctionNames, runPikkuFunc, } from './function-runner.js';
2
2
  export { pikkuAuth, pikkuPermission, pikkuPermissionFactory, pikkuApprovalDescription, } from './functions.types.js';
3
+ export { AbandonedError } from './abort-scope.js';
4
+ export { checkAuthPermissions } from '../permissions.js';
5
+ export { PikkuRequest } from './pikku-request.js';
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @group RequestResponse
3
+ */
4
+ export declare abstract class PikkuRequest<In = any> {
5
+ #private;
6
+ constructor(data: In);
7
+ data(): Promise<In>;
8
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @group RequestResponse
3
+ */
4
+ export class PikkuRequest {
5
+ #data;
6
+ constructor(data) {
7
+ this.#data = data;
8
+ }
9
+ async data() {
10
+ if (this.#data === undefined) {
11
+ throw new Error('Data not found');
12
+ }
13
+ return this.#data;
14
+ }
15
+ }
@@ -1,11 +1,3 @@
1
- export declare const authAPIKey: import("../types/core.types.js").CorePikkuMiddlewareFactory<{
1
+ export declare const authAPIKey: import("./middleware.types.js").CorePikkuMiddlewareFactory<{
2
2
  source: "header" | "query" | "all";
3
- }, import("../types/core.types.js").CoreSingletonServices<{
4
- logLevel?: import("../services/logger.js").LogLevel;
5
- secrets?: {
6
- requireAllowedHosts?: boolean;
7
- };
8
- workflow?: import("../ecosystem/agent.js").WorkflowServiceConfig;
9
- webhook?: import("../services/webhook-service.js").WebhookServiceConfig;
10
- postgres?: import("../types/core.types.js").PostgresConfig;
11
- }>, import("../types/core.types.js").CoreUserSession>;
3
+ }>;
@@ -1,4 +1,4 @@
1
- import { pikkuMiddleware, pikkuMiddlewareFactory } from '../types/core.types.js';
1
+ import { pikkuMiddleware, pikkuMiddlewareFactory, } from './middleware-factories.js';
2
2
  export const authAPIKey = pikkuMiddlewareFactory(({ source }) => pikkuMiddleware(async ({ jwt: jwtService }, { http, setSession, session }, next) => {
3
3
  if (!http?.request || !setSession || session) {
4
4
  return next();
@@ -4,7 +4,7 @@ import type { CoreUserSession } from '../types/core.types.js';
4
4
  * time against a static `value` or a `secretId` resolved through the secrets
5
5
  * service per request.
6
6
  */
7
- export declare const authBearer: import("../types/core.types.js").CorePikkuMiddlewareFactory<{
7
+ export declare const authBearer: import("./middleware.types.js").CorePikkuMiddlewareFactory<{
8
8
  token?: {
9
9
  value: string;
10
10
  userSession: CoreUserSession;
@@ -12,12 +12,4 @@ export declare const authBearer: import("../types/core.types.js").CorePikkuMiddl
12
12
  secretId: string;
13
13
  userSession: CoreUserSession;
14
14
  };
15
- }, import("../types/core.types.js").CoreSingletonServices<{
16
- logLevel?: import("../services/logger.js").LogLevel;
17
- secrets?: {
18
- requireAllowedHosts?: boolean;
19
- };
20
- workflow?: import("../ecosystem/agent.js").WorkflowServiceConfig;
21
- webhook?: import("../services/webhook-service.js").WebhookServiceConfig;
22
- postgres?: import("../types/core.types.js").PostgresConfig;
23
- }>, CoreUserSession>;
15
+ }>;
@@ -1,5 +1,5 @@
1
1
  import { InvalidSessionError } from '../errors/errors.js';
2
- import { pikkuMiddleware, pikkuMiddlewareFactory } from '../types/core.types.js';
2
+ import { pikkuMiddleware, pikkuMiddlewareFactory, } from './middleware-factories.js';
3
3
  const constantTimeEqual = (a, b) => {
4
4
  if (a.length !== b.length)
5
5
  return false;
@@ -1,15 +1,7 @@
1
1
  import type { SerializeOptions } from 'cookie';
2
2
  import type { RelativeTimeInput } from '../time-utils.js';
3
- export declare const authCookie: import("../types/core.types.js").CorePikkuMiddlewareFactory<{
3
+ export declare const authCookie: import("./middleware.types.js").CorePikkuMiddlewareFactory<{
4
4
  name: string;
5
5
  options: SerializeOptions;
6
6
  expiresIn: RelativeTimeInput;
7
- }, import("../types/core.types.js").CoreSingletonServices<{
8
- logLevel?: import("../services/logger.js").LogLevel;
9
- secrets?: {
10
- requireAllowedHosts?: boolean;
11
- };
12
- workflow?: import("../ecosystem/agent.js").WorkflowServiceConfig;
13
- webhook?: import("../services/webhook-service.js").WebhookServiceConfig;
14
- postgres?: import("../types/core.types.js").PostgresConfig;
15
- }>, import("../types/core.types.js").CoreUserSession>;
7
+ }>;
@@ -1,4 +1,4 @@
1
- import { pikkuMiddleware, pikkuMiddlewareFactory } from '../types/core.types.js';
1
+ import { pikkuMiddleware, pikkuMiddlewareFactory, } from './middleware-factories.js';
2
2
  import { getRelativeTimeOffsetFromNow } from '../time-utils.js';
3
3
  /**
4
4
  * Reads a JWT session from a cookie, and re-issues the cookie after the
@@ -1,21 +1,15 @@
1
1
  /**
2
2
  * Sets CORS headers on every response and short-circuits OPTIONS preflight
3
3
  * with a 204. `origin: true` reflects the request origin; an array reflects a
4
- * matching origin and otherwise falls back to its first entry.
4
+ * matching origin and otherwise sends no `Access-Control-Allow-Origin` at all,
5
+ * so the browser reports "origin not allowed" rather than an origin mismatch
6
+ * against whichever entry happened to be first.
5
7
  */
6
- export declare const cors: import("../types/core.types.js").CorePikkuMiddlewareFactory<{
8
+ export declare const cors: import("./middleware.types.js").CorePikkuMiddlewareFactory<{
7
9
  origin?: string | string[] | true;
8
10
  methods?: string[];
9
11
  headers?: string[];
10
12
  exposeHeaders?: string[];
11
13
  credentials?: boolean;
12
14
  maxAge?: number;
13
- }, import("../types/core.types.js").CoreSingletonServices<{
14
- logLevel?: import("../services/logger.js").LogLevel;
15
- secrets?: {
16
- requireAllowedHosts?: boolean;
17
- };
18
- workflow?: import("../ecosystem/agent.js").WorkflowServiceConfig;
19
- webhook?: import("../services/webhook-service.js").WebhookServiceConfig;
20
- postgres?: import("../types/core.types.js").PostgresConfig;
21
- }>, import("../types/core.types.js").CoreUserSession>;
15
+ }>;
@@ -1,8 +1,10 @@
1
- import { pikkuMiddleware, pikkuMiddlewareFactory } from '../types/core.types.js';
1
+ import { pikkuMiddleware, pikkuMiddlewareFactory, } from './middleware-factories.js';
2
2
  /**
3
3
  * Sets CORS headers on every response and short-circuits OPTIONS preflight
4
4
  * with a 204. `origin: true` reflects the request origin; an array reflects a
5
- * matching origin and otherwise falls back to its first entry.
5
+ * matching origin and otherwise sends no `Access-Control-Allow-Origin` at all,
6
+ * so the browser reports "origin not allowed" rather than an origin mismatch
7
+ * against whichever entry happened to be first.
6
8
  */
7
9
  export const cors = pikkuMiddlewareFactory(({ origin = '*', methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], headers = ['Content-Type', 'Authorization', 'x-api-key'], exposeHeaders = [], credentials = false, maxAge = 86400, } = {}) => {
8
10
  if (origin === '*' && credentials) {
@@ -11,7 +13,7 @@ export const cors = pikkuMiddlewareFactory(({ origin = '*', methods = ['GET', 'P
11
13
  return pikkuMiddleware({
12
14
  name: 'CORS',
13
15
  description: 'Handles cross-origin requests including OPTIONS preflight',
14
- func: async (_services, wires, next) => {
16
+ func: async (services, wires, next) => {
15
17
  const request = wires.http?.request;
16
18
  const response = wires.http?.response;
17
19
  if (!request || !response) {
@@ -26,18 +28,23 @@ export const cors = pikkuMiddlewareFactory(({ origin = '*', methods = ['GET', 'P
26
28
  allowedOrigin =
27
29
  requestOrigin && origin.includes(requestOrigin)
28
30
  ? requestOrigin
29
- : origin[0];
31
+ : undefined;
32
+ if (requestOrigin && !allowedOrigin) {
33
+ services.logger.debug(`CORS: origin '${requestOrigin}' is not in the allowed list, omitting Access-Control-Allow-Origin`);
34
+ }
30
35
  }
31
36
  else {
32
37
  allowedOrigin = origin;
33
38
  }
34
- response.header('Access-Control-Allow-Origin', allowedOrigin);
39
+ if (allowedOrigin) {
40
+ response.header('Access-Control-Allow-Origin', allowedOrigin);
41
+ }
35
42
  response.header('Access-Control-Allow-Methods', methods.join(', '));
36
43
  response.header('Access-Control-Allow-Headers', headers.join(', '));
37
44
  if (exposeHeaders.length > 0) {
38
45
  response.header('Access-Control-Expose-Headers', exposeHeaders.join(', '));
39
46
  }
40
- if (credentials) {
47
+ if (credentials && allowedOrigin) {
41
48
  response.header('Access-Control-Allow-Credentials', 'true');
42
49
  }
43
50
  if (origin === true || Array.isArray(origin)) {
@@ -6,3 +6,6 @@ export { cors } from './cors.js';
6
6
  export { telemetryOuter, telemetryInner } from './telemetry.js';
7
7
  export { addTagMiddleware, addTagMiddleware as addMiddleware, addGlobalMiddleware, runMiddleware, } from '../middleware-runner.js';
8
8
  export { addGlobalPermission } from '../permissions.js';
9
+ export type { CorePikkuMiddleware, CorePikkuMiddlewareConfig, CorePikkuMiddlewareFactory, CorePikkuMiddlewareGroup, MiddlewareMetadata, MiddlewarePriority, } from './middleware.types.js';
10
+ export { pikkuAgentMiddleware, pikkuChannelMiddleware, pikkuChannelMiddlewareFactory, pikkuMiddleware, pikkuMiddlewareFactory, } from './middleware-factories.js';
11
+ export type { PikkuAgentMiddlewareHooks } from '../wirings/agent/agent.types.js';
@@ -6,3 +6,4 @@ export { cors } from './cors.js';
6
6
  export { telemetryOuter, telemetryInner } from './telemetry.js';
7
7
  export { addTagMiddleware, addTagMiddleware as addMiddleware, addGlobalMiddleware, runMiddleware, } from '../middleware-runner.js';
8
8
  export { addGlobalPermission } from '../permissions.js';
9
+ export { pikkuAgentMiddleware, pikkuChannelMiddleware, pikkuChannelMiddlewareFactory, pikkuMiddleware, pikkuMiddlewareFactory, } from './middleware-factories.js';
@@ -0,0 +1,9 @@
1
+ import type { CoreSingletonServices, CoreUserSession } from '../types/core.types.js';
2
+ import type { CorePikkuChannelMiddleware, CorePikkuChannelMiddlewareFactory } from '../wirings/channel/channel.types.js';
3
+ import type { PikkuAgentMiddlewareHooks } from '../wirings/agent/agent.types.js';
4
+ import type { CorePikkuMiddleware, CorePikkuMiddlewareConfig, CorePikkuMiddlewareFactory } from './middleware.types.js';
5
+ export declare const pikkuMiddleware: <SingletonServices extends CoreSingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession>(middleware: CorePikkuMiddleware<SingletonServices, UserSession> | CorePikkuMiddlewareConfig<SingletonServices, UserSession>) => CorePikkuMiddleware<SingletonServices, UserSession>;
6
+ export declare const pikkuMiddlewareFactory: <In = any>(factory: CorePikkuMiddlewareFactory<In>) => CorePikkuMiddlewareFactory<In>;
7
+ export declare const pikkuChannelMiddleware: <SingletonServices extends CoreSingletonServices = CoreSingletonServices, Event = unknown>(middleware: CorePikkuChannelMiddleware<SingletonServices, Event>) => CorePikkuChannelMiddleware<SingletonServices, Event>;
8
+ export declare const pikkuChannelMiddlewareFactory: <In = any>(factory: CorePikkuChannelMiddlewareFactory<In>) => CorePikkuChannelMiddlewareFactory<In>;
9
+ export declare const pikkuAgentMiddleware: <State extends Record<string, unknown> = Record<string, unknown>, SingletonServices extends CoreSingletonServices = CoreSingletonServices>(hooks: PikkuAgentMiddlewareHooks<State, SingletonServices>) => PikkuAgentMiddlewareHooks<State, SingletonServices>;
@@ -0,0 +1,19 @@
1
+ export const pikkuMiddleware = (middleware) => {
2
+ if (typeof middleware === 'function')
3
+ return middleware;
4
+ const func = middleware.func;
5
+ if (middleware.priority) {
6
+ func.__priority = middleware.priority;
7
+ }
8
+ return func;
9
+ };
10
+ export const pikkuMiddlewareFactory = (factory) => {
11
+ return factory;
12
+ };
13
+ export const pikkuChannelMiddleware = (middleware) => {
14
+ return middleware;
15
+ };
16
+ export const pikkuChannelMiddlewareFactory = (factory) => {
17
+ return factory;
18
+ };
19
+ export const pikkuAgentMiddleware = (hooks) => hooks;
@@ -0,0 +1,27 @@
1
+ import type { CoreSingletonServices, CoreUserSession, PikkuWire } from '../types/core.types.js';
2
+ export type CorePikkuMiddleware<SingletonServices extends CoreSingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession> = (services: SingletonServices, wires: PikkuWire, next: () => Promise<void>) => Promise<void>;
3
+ /**
4
+ * Execution order: `highest` runs first (outermost in the onion), `lowest`
5
+ * runs last, closest to the function.
6
+ */
7
+ export type MiddlewarePriority = 'highest' | 'high' | 'medium' | 'low' | 'lowest';
8
+ export type CorePikkuMiddlewareConfig<SingletonServices extends CoreSingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession> = {
9
+ func: CorePikkuMiddleware<SingletonServices, UserSession>;
10
+ name?: string;
11
+ description?: string;
12
+ /** Execution priority. Lower runs first (outermost). Defaults to 'medium'. */
13
+ priority?: MiddlewarePriority;
14
+ };
15
+ export type CorePikkuMiddlewareFactory<In = any, SingletonServices extends CoreSingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession> = (input: In) => CorePikkuMiddleware<SingletonServices, UserSession>;
16
+ export type CorePikkuMiddlewareGroup<SingletonServices extends CoreSingletonServices = CoreSingletonServices, UserSession extends CoreUserSession = CoreUserSession> = Array<CorePikkuMiddleware<SingletonServices, UserSession> | CorePikkuMiddlewareFactory<any, SingletonServices, UserSession>>;
17
+ export type MiddlewareMetadata = {
18
+ type: 'http';
19
+ route: string;
20
+ } | {
21
+ type: 'tag';
22
+ tag: string;
23
+ } | {
24
+ type: 'wire';
25
+ name: string;
26
+ inline?: boolean;
27
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,9 +1,9 @@
1
- export declare const pikkuRemoteAuthMiddleware: import("../types/core.types.js").CorePikkuMiddleware<import("../types/core.types.js").CoreSingletonServices<{
1
+ export declare const pikkuRemoteAuthMiddleware: import("./middleware.types.js").CorePikkuMiddleware<import("../types/core.types.js").CoreSingletonServices<{
2
2
  logLevel?: import("../services/logger.js").LogLevel;
3
3
  secrets?: {
4
4
  requireAllowedHosts?: boolean;
5
5
  };
6
- workflow?: import("../ecosystem/agent.js").WorkflowServiceConfig;
6
+ workflow?: import("../wirings/workflow/workflow.types.js").WorkflowServiceConfig;
7
7
  webhook?: import("../services/webhook-service.js").WebhookServiceConfig;
8
8
  postgres?: import("../types/core.types.js").PostgresConfig;
9
9
  }>, import("../types/core.types.js").CoreUserSession>;
@@ -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 { assertStrongKeyMaterial, decryptWithKeyMaterial, REMOTE_SESSION_INFO, } from '../crypto-utils.js';
4
4
  const REMOTE_RPC_PREFIX = '/remote/rpc/';
5
5
  /**