@pikku/core 0.12.84 → 0.12.88

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 (577) hide show
  1. package/CHANGELOG.md +503 -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/dev/hot-reload.d.ts +1 -1
  12. package/dist/dev/hot-reload.js +1 -1
  13. package/dist/ecosystem/agent-scorer.d.ts +1 -1
  14. package/dist/ecosystem/agent.d.ts +4 -1
  15. package/dist/ecosystem/channel/local.d.ts +2 -0
  16. package/dist/ecosystem/channel/local.js +2 -0
  17. package/dist/ecosystem/channel/serverless.d.ts +9 -0
  18. package/dist/ecosystem/channel/serverless.js +1 -0
  19. package/dist/ecosystem/channel.d.ts +3 -0
  20. package/dist/ecosystem/channel.js +1 -0
  21. package/dist/ecosystem/cli.d.ts +1 -1
  22. package/dist/ecosystem/cli.js +1 -1
  23. package/dist/ecosystem/credential.d.ts +1 -0
  24. package/dist/ecosystem/crypto-utils.d.ts +8 -0
  25. package/dist/ecosystem/crypto-utils.js +1 -0
  26. package/dist/ecosystem/dev.d.ts +1 -0
  27. package/dist/ecosystem/dev.js +1 -0
  28. package/{src/ecosystem/testing.ts → dist/ecosystem/errors.d.ts} +3 -3
  29. package/dist/ecosystem/errors.js +2 -0
  30. package/dist/ecosystem/function.d.ts +1 -1
  31. package/dist/ecosystem/function.js +1 -1
  32. package/dist/ecosystem/http.d.ts +3 -1
  33. package/dist/ecosystem/http.js +3 -1
  34. package/dist/ecosystem/mcp.d.ts +1 -1
  35. package/dist/ecosystem/mcp.js +1 -1
  36. package/dist/ecosystem/middleware.d.ts +2 -1
  37. package/dist/ecosystem/middleware.js +2 -1
  38. package/dist/ecosystem/persona.d.ts +4 -2
  39. package/dist/ecosystem/persona.js +2 -1
  40. package/dist/ecosystem/queue.d.ts +4 -2
  41. package/dist/ecosystem/queue.js +3 -1
  42. package/dist/ecosystem/role.d.ts +1 -0
  43. package/dist/ecosystem/rpc.d.ts +2 -0
  44. package/dist/ecosystem/rpc.js +1 -0
  45. package/dist/ecosystem/scenario.d.ts +8 -2
  46. package/dist/ecosystem/scenario.js +5 -1
  47. package/dist/ecosystem/scheduler.d.ts +2 -1
  48. package/dist/ecosystem/scheduler.js +2 -1
  49. package/dist/ecosystem/schema.d.ts +2 -1
  50. package/dist/ecosystem/schema.js +1 -1
  51. package/dist/ecosystem/scope.d.ts +2 -0
  52. package/dist/ecosystem/scope.js +1 -0
  53. package/dist/ecosystem/secret.d.ts +2 -0
  54. package/dist/ecosystem/secret.js +1 -0
  55. package/dist/ecosystem/services/local-content.d.ts +2 -1
  56. package/dist/ecosystem/services/local-content.js +1 -1
  57. package/dist/ecosystem/services/local-meta.d.ts +1 -0
  58. package/dist/ecosystem/services/local-meta.js +1 -0
  59. package/dist/ecosystem/services.d.ts +11 -3
  60. package/dist/ecosystem/services.js +7 -1
  61. package/dist/ecosystem/trigger.d.ts +1 -0
  62. package/dist/ecosystem/trigger.js +1 -1
  63. package/dist/ecosystem/types.d.ts +6 -3
  64. package/dist/ecosystem/types.js +3 -2
  65. package/dist/ecosystem/variable.d.ts +1 -0
  66. package/dist/ecosystem/virtual-user.d.ts +3 -0
  67. package/dist/ecosystem/virtual-user.js +3 -0
  68. package/dist/ecosystem/workflow.d.ts +2 -0
  69. package/dist/ecosystem/workflow.js +2 -0
  70. package/dist/errors/index.d.ts +8 -0
  71. package/dist/errors/index.js +1 -0
  72. package/dist/errors/serialized-error.d.ts +7 -0
  73. package/dist/function/function-meta.types.d.ts +139 -0
  74. package/dist/function/function-runner.d.ts +3 -2
  75. package/dist/function/function-runner.js +31 -11
  76. package/dist/function/functions.types.d.ts +10 -2
  77. package/dist/function/index.d.ts +8 -2
  78. package/dist/function/index.js +4 -1
  79. package/dist/function/pikku-request.d.ts +8 -0
  80. package/dist/function/pikku-request.js +15 -0
  81. package/dist/middleware/auth-apikey.d.ts +2 -10
  82. package/dist/middleware/auth-apikey.js +1 -1
  83. package/dist/middleware/auth-bearer.d.ts +2 -10
  84. package/dist/middleware/auth-bearer.js +1 -1
  85. package/dist/middleware/auth-cookie.d.ts +2 -10
  86. package/dist/middleware/auth-cookie.js +1 -1
  87. package/dist/middleware/cors.d.ts +5 -11
  88. package/dist/middleware/cors.js +13 -6
  89. package/dist/middleware/index.d.ts +3 -0
  90. package/dist/middleware/index.js +1 -0
  91. package/dist/middleware/middleware-factories.d.ts +9 -0
  92. package/dist/middleware/middleware-factories.js +19 -0
  93. package/dist/middleware/middleware.types.d.ts +27 -0
  94. package/dist/middleware/middleware.types.js +1 -0
  95. package/dist/middleware/remote-auth.d.ts +2 -2
  96. package/dist/middleware/remote-auth.js +1 -1
  97. package/dist/middleware/telemetry.d.ts +4 -20
  98. package/dist/middleware/telemetry.js +1 -1
  99. package/dist/middleware-runner.d.ts +2 -1
  100. package/dist/pikku-state.d.ts +2 -1
  101. package/dist/services/audit-service.d.ts +1 -1
  102. package/dist/services/credential-wire-service.js +1 -1
  103. package/dist/services/email-service.d.ts +1 -1
  104. package/dist/services/file-scenario-run-store.d.ts +58 -0
  105. package/dist/services/file-scenario-run-store.js +214 -0
  106. package/dist/services/in-memory-workflow-service.d.ts +1 -1
  107. package/dist/services/index.d.ts +5 -1
  108. package/dist/services/index.js +3 -0
  109. package/dist/services/local-secrets.d.ts +1 -1
  110. package/dist/services/local-secrets.js +1 -1
  111. package/dist/services/logger.d.ts +7 -7
  112. package/dist/services/meta-service.d.ts +2 -1
  113. package/dist/services/scoped-secret-service.d.ts +1 -1
  114. package/dist/services/secret-service.d.ts +1 -1
  115. package/dist/services/typed-secret-service.d.ts +16 -2
  116. package/dist/services/typed-secret-service.js +5 -0
  117. package/dist/services/webhook-service.d.ts +1 -1
  118. package/dist/services/workflow-service.d.ts +2 -1
  119. package/dist/testing/index.d.ts +1 -0
  120. package/dist/testing/index.js +1 -0
  121. package/dist/types/core.types.d.ts +30 -180
  122. package/dist/types/core.types.js +1 -19
  123. package/dist/types/index.d.ts +2 -0
  124. package/dist/types/index.js +1 -0
  125. package/dist/types/state.types.d.ts +3 -1
  126. package/dist/utils.d.ts +13 -0
  127. package/dist/utils.js +2 -0
  128. package/dist/wirings/addon/addon-runner.d.ts +17 -0
  129. package/dist/wirings/addon/addon-runner.js +150 -0
  130. package/dist/wirings/addon/index.d.ts +6 -0
  131. package/dist/wirings/addon/index.js +3 -0
  132. package/dist/wirings/addon/remote-addon-auth.d.ts +16 -0
  133. package/dist/wirings/addon/remote-addon-auth.js +39 -0
  134. package/dist/wirings/addon/wire-addon.d.ts +80 -0
  135. package/dist/wirings/addon/wire-addon.js +120 -0
  136. package/dist/wirings/addon/wire-remote-addon.d.ts +22 -0
  137. package/dist/wirings/addon/wire-remote-addon.js +11 -0
  138. package/dist/wirings/agent/agent-memory.d.ts +11 -0
  139. package/dist/wirings/agent/agent-memory.js +17 -2
  140. package/dist/wirings/agent/agent-prepare.d.ts +3 -3
  141. package/dist/wirings/agent/agent-prepare.js +1 -1
  142. package/dist/wirings/agent/agent-runner.js +2 -3
  143. package/dist/wirings/agent/agent-stream.js +117 -93
  144. package/dist/wirings/agent/agent-utils.d.ts +13 -0
  145. package/dist/wirings/agent/agent-utils.js +16 -0
  146. package/dist/wirings/agent/agent.types.d.ts +12 -10
  147. package/dist/wirings/agent/index.d.ts +1 -1
  148. package/dist/wirings/agent/voice-input.js +1 -1
  149. package/dist/wirings/agent/voice-output.js +1 -1
  150. package/dist/wirings/agent-scorer/agent-scorer-judge.d.ts +13 -0
  151. package/dist/wirings/agent-scorer/agent-scorer-judge.js +52 -0
  152. package/dist/wirings/agent-scorer/agent-scorer.d.ts +7 -1
  153. package/dist/wirings/agent-scorer/agent-scorer.js +1 -0
  154. package/dist/wirings/agent-scorer/agent-scorer.types.d.ts +20 -0
  155. package/dist/wirings/agent-scorer/index.d.ts +1 -1
  156. package/dist/wirings/channel/channel-common.d.ts +2 -1
  157. package/dist/wirings/channel/channel-middleware-runner.d.ts +2 -1
  158. package/dist/wirings/channel/channel.types.d.ts +1 -1
  159. package/dist/wirings/channel/serverless/index.d.ts +1 -0
  160. package/dist/wirings/cli/channel/index.d.ts +1 -1
  161. package/dist/wirings/cli/cli-runner.d.ts +2 -1
  162. package/dist/wirings/cli/cli-runner.js +4 -1
  163. package/dist/wirings/cli/cli.types.d.ts +21 -2
  164. package/dist/wirings/cli/command-parser.js +157 -23
  165. package/dist/wirings/gateway/gateway.types.d.ts +2 -1
  166. package/dist/wirings/http/http-runner.d.ts +1 -1
  167. package/dist/wirings/http/http-runner.js +1 -1
  168. package/dist/wirings/http/http.types.d.ts +2 -2
  169. package/dist/wirings/http/index.d.ts +1 -0
  170. package/dist/wirings/http/index.js +1 -0
  171. package/dist/wirings/http/pikku-fetch-http-request.js +1 -1
  172. package/dist/wirings/http/pikku-fetch-http-response.js +2 -2
  173. package/dist/wirings/mcp/mcp.types.d.ts +1 -1
  174. package/dist/wirings/persona/index.d.ts +1 -1
  175. package/dist/wirings/persona/index.js +1 -1
  176. package/dist/wirings/persona/persona.types.d.ts +14 -0
  177. package/dist/wirings/queue/queue.types.d.ts +1 -1
  178. package/dist/wirings/queue/signed-queue-service.d.ts +1 -1
  179. package/dist/wirings/rpc/index.d.ts +0 -6
  180. package/dist/wirings/rpc/index.js +0 -3
  181. package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -1
  182. package/dist/wirings/rpc/remote-addon-auth.js +1 -1
  183. package/dist/wirings/rpc/rpc-runner.js +2 -2
  184. package/dist/wirings/rpc/wire-addon.d.ts +1 -1
  185. package/dist/wirings/scheduler/scheduler.types.d.ts +2 -1
  186. package/dist/wirings/scope/index.d.ts +1 -0
  187. package/dist/wirings/scope/index.js +1 -0
  188. package/dist/wirings/secret/secret.types.d.ts +10 -0
  189. package/dist/wirings/secret/validate-secret-definitions.js +2 -0
  190. package/dist/wirings/variable/validate-variable-definitions.js +2 -0
  191. package/dist/wirings/variable/variable.types.d.ts +15 -0
  192. package/dist/wirings/virtual-user/index.d.ts +1 -1
  193. package/dist/wirings/virtual-user/index.js +1 -1
  194. package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +1 -1
  195. package/dist/wirings/virtual-user/virtual-user-derive.d.ts +1 -1
  196. package/dist/wirings/workflow/graph/graph-node.d.ts +9 -2
  197. package/dist/wirings/workflow/graph/graph-node.js +2 -0
  198. package/dist/wirings/workflow/graph/graph-runner.d.ts +1 -0
  199. package/dist/wirings/workflow/graph/graph-runner.js +283 -31
  200. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +16 -1
  201. package/dist/wirings/workflow/index.d.ts +2 -0
  202. package/dist/wirings/workflow/index.js +1 -0
  203. package/dist/wirings/workflow/pikku-scenario-service.d.ts +15 -5
  204. package/dist/wirings/workflow/pikku-scenario-service.js +44 -16
  205. package/dist/wirings/workflow/pikku-workflow-service.d.ts +22 -7
  206. package/dist/wirings/workflow/pikku-workflow-service.js +28 -29
  207. package/dist/wirings/workflow/run-timeline.d.ts +1 -1
  208. package/dist/wirings/workflow/scenario-run.types.d.ts +171 -0
  209. package/dist/wirings/workflow/scenario-run.types.js +1 -0
  210. package/dist/wirings/workflow/scenario-step-guards.d.ts +1 -2
  211. package/dist/wirings/workflow/scenario-step-guards.js +0 -8
  212. package/dist/wirings/workflow/scenario-step.types.d.ts +27 -12
  213. package/dist/wirings/workflow/workflow-approval.js +2 -1
  214. package/dist/wirings/workflow/workflow-run-engine.types.d.ts +2 -1
  215. package/dist/wirings/workflow/workflow-step-claim.d.ts +16 -0
  216. package/dist/wirings/workflow/workflow-step-claim.js +27 -0
  217. package/dist/wirings/workflow/workflow.types.d.ts +2 -1
  218. package/knowledge/decisions/index.md +2 -0
  219. package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +1 -1
  220. package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +1 -1
  221. package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +2 -2
  222. package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +6 -6
  223. package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +1 -1
  224. package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +1 -1
  225. package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +1 -1
  226. package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +1 -1
  227. package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +1 -1
  228. package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +1 -1
  229. package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +1 -1
  230. package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +1 -1
  231. package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +1 -1
  232. package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +1 -1
  233. package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +4 -4
  234. package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +1 -1
  235. package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +3 -3
  236. package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +2 -2
  237. package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +2 -2
  238. package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +1 -1
  239. package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +1 -1
  240. package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +3 -3
  241. package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +1 -1
  242. package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +4 -4
  243. package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +1 -1
  244. package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +1 -1
  245. package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +1 -1
  246. package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +1 -1
  247. package/knowledge/decisions/internals/index.md +4 -2
  248. package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +1 -1
  249. package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +1 -1
  250. package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +1 -1
  251. package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +1 -1
  252. package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +1 -1
  253. package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +2 -2
  254. package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +5 -5
  255. package/knowledge/decisions/internals/the-actor-prompt-says-json-because-of-json-object-mode.md +1 -1
  256. package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +1 -1
  257. package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +43 -19
  258. package/knowledge/decisions/internals/the-persona-runtime-is-exported-from-the-persona-entry-point.md +1 -1
  259. package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +1 -1
  260. package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +3 -3
  261. package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +1 -1
  262. package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +1 -1
  263. package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +1 -1
  264. package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +1 -1
  265. package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +1 -1
  266. package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +1 -1
  267. package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +1 -1
  268. package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +1 -1
  269. package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +1 -1
  270. package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +9 -5
  271. package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +1 -1
  272. package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +2 -2
  273. package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +1 -1
  274. package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +1 -1
  275. package/knowledge/decisions/security/a-scaffold-flag-says-a-surface-exists-not-who-may-call-it.md +47 -0
  276. package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +1 -1
  277. package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +2 -3
  278. package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +1 -1
  279. package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +1 -1
  280. package/knowledge/decisions/security/agent-gate-requires-a-session-only-when-auth-is-true.md +1 -1
  281. package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +3 -3
  282. package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +4 -3
  283. package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +1 -1
  284. package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +2 -2
  285. package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +1 -1
  286. package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +2 -2
  287. package/knowledge/decisions/security/index.md +4 -1
  288. package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +1 -1
  289. package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +3 -3
  290. package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +1 -1
  291. package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +8 -2
  292. package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +1 -1
  293. package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +2 -2
  294. package/knowledge/index.md +3 -1
  295. package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +1 -1
  296. package/knowledge/questions/index.md +2 -0
  297. package/package.json +14 -13
  298. package/run-tests.sh +0 -0
  299. package/scripts/generate-api-report.d.mts +1 -1
  300. package/scripts/generate-api-report.mjs +67 -60
  301. package/scripts/generate-api-report.mts +11 -45
  302. package/src/api-report.test.ts +70 -1
  303. package/src/app-alias-surface.test.ts +179 -0
  304. package/src/app-leaf-surface.test.ts +217 -0
  305. package/src/bootstrap-compat/root.ts +20 -0
  306. package/src/{column-form.test.ts → classification/column-form.test.ts} +2 -2
  307. package/src/{data-classification.ts → classification/data-classification.ts} +1 -5
  308. package/src/classification/index.ts +38 -0
  309. package/src/{secret-value.test.ts → classification/secret-value.test.ts} +2 -2
  310. package/src/{secret-value.ts → classification/secret-value.ts} +1 -6
  311. package/src/crypto-utils.ts +1 -1
  312. package/src/dev/hot-reload.ts +1 -1
  313. package/src/dev/reload-meta.test.ts +1 -1
  314. package/src/errors/index.ts +9 -0
  315. package/src/errors/serialized-error.ts +9 -0
  316. package/src/factory-functions.test.ts +4 -2
  317. package/src/function/function-meta.types.ts +151 -0
  318. package/src/function/function-runner.test.ts +4 -2
  319. package/src/function/function-runner.ts +47 -14
  320. package/src/function/functions.types.ts +11 -7
  321. package/src/function/index.ts +24 -5
  322. package/src/function/list.types.ts +1 -3
  323. package/src/middleware/auth-apikey.ts +4 -2
  324. package/src/middleware/auth-bearer.test.ts +1 -1
  325. package/src/middleware/auth-bearer.ts +4 -2
  326. package/src/middleware/auth-cookie.ts +4 -1
  327. package/src/middleware/cors.test.ts +126 -5
  328. package/src/middleware/cors.ts +19 -8
  329. package/src/middleware/index.ts +16 -0
  330. package/src/middleware/middleware-factories.ts +62 -0
  331. package/src/middleware/middleware.types.ts +61 -0
  332. package/src/middleware/remote-auth.test.ts +1 -1
  333. package/src/middleware/remote-auth.ts +1 -1
  334. package/src/middleware/telemetry.ts +4 -2
  335. package/src/middleware-runner.test.ts +2 -3
  336. package/src/middleware-runner.ts +2 -2
  337. package/src/no-root-barrel.test.ts +114 -0
  338. package/src/permissions.ts +2 -4
  339. package/src/pikku-state.ts +3 -1
  340. package/src/public-surface.json +56 -241
  341. package/src/public-surface.json.README +3 -3
  342. package/src/public-surface.test.ts +5 -5
  343. package/src/remote.test.ts +1 -1
  344. package/src/removed-legacy-exports.test.ts +5 -1
  345. package/src/services/audit-service.ts +1 -1
  346. package/src/services/credential-wire-service.ts +1 -1
  347. package/src/services/email-service.ts +2 -4
  348. package/src/services/file-scenario-run-store.test.ts +349 -0
  349. package/src/services/file-scenario-run-store.ts +282 -0
  350. package/src/services/in-memory-workflow-service.ts +1 -1
  351. package/src/services/index.ts +13 -1
  352. package/src/services/local-content-request-handler.ts +1 -2
  353. package/src/services/local-secrets.ts +1 -1
  354. package/src/services/logger.ts +7 -7
  355. package/src/services/meta-service.ts +2 -2
  356. package/src/services/queue-webhook-service.test.ts +1 -1
  357. package/src/services/scoped-secret-service.ts +1 -1
  358. package/src/services/secret-service.ts +1 -1
  359. package/src/services/typed-secret-service.test.ts +52 -0
  360. package/src/services/typed-secret-service.ts +26 -2
  361. package/src/services/webhook-service.ts +1 -1
  362. package/src/services/workflow-service.ts +2 -1
  363. package/src/template-alias-surface.test.ts +240 -0
  364. package/src/testing/index.ts +1 -0
  365. package/src/types/core.types.ts +33 -285
  366. package/src/types/index.ts +25 -0
  367. package/src/types/state.types.ts +6 -5
  368. package/src/types/typed-credentials.test.ts +72 -0
  369. package/src/utils.ts +34 -0
  370. package/src/wirings/{rpc → addon}/addon-scopes.test.ts +1 -1
  371. package/src/wirings/addon/index.ts +12 -0
  372. package/src/wirings/{rpc → addon}/remote-addon-auth.ts +4 -1
  373. package/src/wirings/{rpc → addon}/wire-addon.ts +37 -2
  374. package/src/wirings/agent/agent-memory.test.ts +73 -0
  375. package/src/wirings/agent/agent-memory.ts +16 -2
  376. package/src/wirings/agent/agent-middleware.types.test.ts +41 -0
  377. package/src/wirings/agent/agent-prepare.ts +8 -5
  378. package/src/wirings/agent/agent-runner.ts +2 -3
  379. package/src/wirings/agent/agent-stream-delegate.test.ts +381 -0
  380. package/src/wirings/agent/agent-stream.ts +160 -81
  381. package/src/wirings/agent/agent-utils.ts +19 -0
  382. package/src/wirings/agent/agent.types.ts +12 -11
  383. package/src/wirings/agent/index.ts +1 -0
  384. package/src/wirings/agent/voice-input.ts +1 -1
  385. package/src/wirings/agent/voice-output.test.ts +2 -4
  386. package/src/wirings/agent/voice-output.ts +1 -1
  387. package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +145 -0
  388. package/src/wirings/agent-scorer/agent-scorer-judge.ts +60 -0
  389. package/src/wirings/agent-scorer/agent-scorer.ts +8 -0
  390. package/src/wirings/agent-scorer/agent-scorer.types.ts +21 -0
  391. package/src/wirings/agent-scorer/index.ts +1 -0
  392. package/src/wirings/channel/channel-common.ts +4 -2
  393. package/src/wirings/channel/channel-handler.ts +2 -5
  394. package/src/wirings/channel/channel-middleware-runner.ts +1 -1
  395. package/src/wirings/channel/channel-rpc.types.ts +1 -5
  396. package/src/wirings/channel/channel.types.ts +1 -2
  397. package/src/wirings/channel/local/local-channel-runner.test.ts +1 -2
  398. package/src/wirings/channel/serverless/index.ts +1 -0
  399. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +2 -2
  400. package/src/wirings/cli/channel/index.ts +1 -3
  401. package/src/wirings/cli/cli-runner.test.ts +1 -1
  402. package/src/wirings/cli/cli-runner.ts +11 -7
  403. package/src/wirings/cli/cli.types.ts +24 -3
  404. package/src/wirings/cli/command-parser.test.ts +388 -1
  405. package/src/wirings/cli/command-parser.ts +189 -29
  406. package/src/wirings/gateway/gateway-runner.test.ts +1 -2
  407. package/src/wirings/gateway/gateway-runner.ts +3 -6
  408. package/src/wirings/gateway/gateway.types.ts +5 -4
  409. package/src/wirings/http/http-routes.test.ts +1 -2
  410. package/src/wirings/http/http-runner-addon-ref.test.ts +238 -0
  411. package/src/wirings/http/http-runner.test.ts +3 -8
  412. package/src/wirings/http/http-runner.ts +9 -3
  413. package/src/wirings/http/http.types.ts +3 -12
  414. package/src/wirings/http/index.ts +1 -0
  415. package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
  416. package/src/wirings/http/pikku-fetch-http-response.ts +3 -2
  417. package/src/wirings/mcp/mcp-runner.test.ts +1 -1
  418. package/src/wirings/mcp/mcp.types.ts +1 -2
  419. package/src/wirings/persona/index.ts +1 -4
  420. package/src/wirings/persona/persona.types.ts +14 -0
  421. package/src/wirings/queue/queue-identity.test.ts +1 -1
  422. package/src/wirings/queue/queue.types.ts +2 -6
  423. package/src/wirings/queue/signed-queue-service.ts +1 -1
  424. package/src/wirings/rpc/index.ts +0 -12
  425. package/src/wirings/rpc/rpc-runner.test.ts +4 -4
  426. package/src/wirings/rpc/rpc-runner.ts +3 -3
  427. package/src/wirings/scheduler/scheduler.types.ts +2 -5
  428. package/src/wirings/scope/index.ts +1 -0
  429. package/src/wirings/secret/secret.types.ts +10 -0
  430. package/src/wirings/secret/validate-secret-definitions.test.ts +23 -0
  431. package/src/wirings/secret/validate-secret-definitions.ts +2 -0
  432. package/src/wirings/variable/validate-variable-definitions.test.ts +24 -0
  433. package/src/wirings/variable/validate-variable-definitions.ts +2 -0
  434. package/src/wirings/variable/variable.types.ts +15 -0
  435. package/src/wirings/virtual-user/index.ts +1 -4
  436. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +1 -1
  437. package/src/wirings/virtual-user/virtual-user-derive.test.ts +1 -1
  438. package/src/wirings/virtual-user/virtual-user-derive.ts +1 -1
  439. package/src/wirings/virtual-user/virtual-user.types.ts +1 -5
  440. package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +569 -0
  441. package/src/wirings/workflow/graph/graph-foreach.test.ts +626 -0
  442. package/src/wirings/workflow/graph/graph-node.ts +16 -1
  443. package/src/wirings/workflow/graph/graph-runner.ts +387 -61
  444. package/src/wirings/workflow/graph/workflow-graph.types.ts +28 -3
  445. package/src/wirings/workflow/index.ts +8 -0
  446. package/src/wirings/workflow/pikku-scenario-service.ts +83 -20
  447. package/src/wirings/workflow/pikku-workflow-service.ts +37 -35
  448. package/src/wirings/workflow/run-timeline.ts +1 -1
  449. package/src/wirings/workflow/scenario-expectations.test.ts +28 -13
  450. package/src/wirings/workflow/scenario-run.types.ts +186 -0
  451. package/src/wirings/workflow/scenario-step-guards.ts +1 -14
  452. package/src/wirings/workflow/scenario-step.test.ts +32 -7
  453. package/src/wirings/workflow/scenario-step.types.ts +27 -12
  454. package/src/wirings/workflow/workflow-approval-policy.test.ts +117 -47
  455. package/src/wirings/workflow/workflow-approval.ts +2 -1
  456. package/src/wirings/workflow/workflow-run-engine.types.ts +2 -1
  457. package/src/wirings/workflow/workflow-step-claim.ts +46 -0
  458. package/src/wirings/workflow/workflow.types.ts +4 -12
  459. package/src/wirings-stay-decoupled.test.ts +6 -3
  460. package/tsconfig.tsbuildinfo +1 -1
  461. package/tsconfig.type-tests.json +4 -2
  462. package/dist/ecosystem/ai-agent.d.ts +0 -18
  463. package/dist/ecosystem/ai-agent.js +0 -6
  464. package/dist/ecosystem/ai-scorer.d.ts +0 -12
  465. package/dist/ecosystem/ai-scorer.js +0 -5
  466. package/dist/services/ai-agent-runner-service.d.ts +0 -220
  467. package/dist/services/ai-run-state-service.d.ts +0 -29
  468. package/dist/services/ai-storage-service.d.ts +0 -18
  469. package/dist/services/in-memory-ai-run-state-service.d.ts +0 -19
  470. package/dist/services/in-memory-ai-run-state-service.js +0 -54
  471. package/dist/testing/service-tests/ai-storage-service-tests.d.ts +0 -3
  472. package/dist/testing/service-tests/ai-storage-service-tests.js +0 -302
  473. package/dist/wirings/ai-agent/agent-rpc.d.ts +0 -15
  474. package/dist/wirings/ai-agent/agent-rpc.js +0 -53
  475. package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -79
  476. package/dist/wirings/ai-agent/ai-agent-agui.js +0 -327
  477. package/dist/wirings/ai-agent/ai-agent-finalize.d.ts +0 -58
  478. package/dist/wirings/ai-agent/ai-agent-finalize.js +0 -138
  479. package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +0 -35
  480. package/dist/wirings/ai-agent/ai-agent-helpers.js +0 -47
  481. package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +0 -153
  482. package/dist/wirings/ai-agent/ai-agent-interrupt.js +0 -257
  483. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +0 -42
  484. package/dist/wirings/ai-agent/ai-agent-memory.js +0 -333
  485. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -16
  486. package/dist/wirings/ai-agent/ai-agent-model-config.js +0 -51
  487. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +0 -117
  488. package/dist/wirings/ai-agent/ai-agent-prepare.js +0 -728
  489. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +0 -16
  490. package/dist/wirings/ai-agent/ai-agent-registry.js +0 -51
  491. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +0 -7
  492. package/dist/wirings/ai-agent/ai-agent-runner.js +0 -580
  493. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +0 -41
  494. package/dist/wirings/ai-agent/ai-agent-stream.js +0 -1029
  495. package/dist/wirings/ai-agent/ai-agent-turn.d.ts +0 -57
  496. package/dist/wirings/ai-agent/ai-agent-turn.js +0 -82
  497. package/dist/wirings/ai-agent/ai-agent-utils.d.ts +0 -1
  498. package/dist/wirings/ai-agent/ai-agent-utils.js +0 -1
  499. package/dist/wirings/ai-agent/ai-agent.types.d.ts +0 -625
  500. package/dist/wirings/ai-agent/index.d.ts +0 -12
  501. package/dist/wirings/ai-agent/index.js +0 -10
  502. package/dist/wirings/ai-agent/voice-input.d.ts +0 -69
  503. package/dist/wirings/ai-agent/voice-input.js +0 -150
  504. package/dist/wirings/ai-agent/voice-output.d.ts +0 -85
  505. package/dist/wirings/ai-agent/voice-output.js +0 -196
  506. package/dist/wirings/ai-scorer/ai-scorer-grade.d.ts +0 -26
  507. package/dist/wirings/ai-scorer/ai-scorer-grade.js +0 -33
  508. package/dist/wirings/ai-scorer/ai-scorer-judge.d.ts +0 -17
  509. package/dist/wirings/ai-scorer/ai-scorer-judge.js +0 -92
  510. package/dist/wirings/ai-scorer/ai-scorer-live.d.ts +0 -15
  511. package/dist/wirings/ai-scorer/ai-scorer-live.js +0 -38
  512. package/dist/wirings/ai-scorer/ai-scorer-registry.d.ts +0 -18
  513. package/dist/wirings/ai-scorer/ai-scorer-registry.js +0 -46
  514. package/dist/wirings/ai-scorer/ai-scorer-sampling.d.ts +0 -8
  515. package/dist/wirings/ai-scorer/ai-scorer-sampling.js +0 -31
  516. package/dist/wirings/ai-scorer/ai-scorer-snapshots.d.ts +0 -10
  517. package/dist/wirings/ai-scorer/ai-scorer-snapshots.js +0 -40
  518. package/dist/wirings/ai-scorer/ai-scorer-worker.d.ts +0 -15
  519. package/dist/wirings/ai-scorer/ai-scorer-worker.js +0 -58
  520. package/dist/wirings/ai-scorer/ai-scorer.d.ts +0 -39
  521. package/dist/wirings/ai-scorer/ai-scorer.js +0 -40
  522. package/dist/wirings/ai-scorer/ai-scorer.types.d.ts +0 -90
  523. package/dist/wirings/ai-scorer/ai-scorer.types.js +0 -4
  524. package/dist/wirings/ai-scorer/index.d.ts +0 -6
  525. package/dist/wirings/ai-scorer/index.js +0 -5
  526. package/src/ecosystem/agent-scorer.ts +0 -24
  527. package/src/ecosystem/agent.ts +0 -42
  528. package/src/ecosystem/channel/local.ts +0 -1
  529. package/src/ecosystem/channel.ts +0 -22
  530. package/src/ecosystem/cli/channel.ts +0 -25
  531. package/src/ecosystem/cli.ts +0 -21
  532. package/src/ecosystem/credential.ts +0 -10
  533. package/src/ecosystem/dev.ts +0 -12
  534. package/src/ecosystem/function.ts +0 -28
  535. package/src/ecosystem/gateway.ts +0 -4
  536. package/src/ecosystem/hmac.ts +0 -1
  537. package/src/ecosystem/http.ts +0 -22
  538. package/src/ecosystem/mcp.ts +0 -17
  539. package/src/ecosystem/middleware.ts +0 -27
  540. package/src/ecosystem/node-host-resolver.ts +0 -1
  541. package/src/ecosystem/node.ts +0 -5
  542. package/src/ecosystem/oauth2.ts +0 -4
  543. package/src/ecosystem/persona.ts +0 -30
  544. package/src/ecosystem/queue.ts +0 -23
  545. package/src/ecosystem/remote.ts +0 -9
  546. package/src/ecosystem/role.ts +0 -13
  547. package/src/ecosystem/rpc.ts +0 -7
  548. package/src/ecosystem/safe-fetch.ts +0 -8
  549. package/src/ecosystem/scenario.ts +0 -32
  550. package/src/ecosystem/scheduler.ts +0 -5
  551. package/src/ecosystem/schema.ts +0 -1
  552. package/src/ecosystem/scope.ts +0 -14
  553. package/src/ecosystem/secret.ts +0 -15
  554. package/src/ecosystem/services/istanbul-coverage.ts +0 -1
  555. package/src/ecosystem/services/local-content-request-handler.ts +0 -16
  556. package/src/ecosystem/services/local-content.ts +0 -1
  557. package/src/ecosystem/services/v8-coverage.ts +0 -1
  558. package/src/ecosystem/services.ts +0 -82
  559. package/src/ecosystem/trigger.ts +0 -7
  560. package/src/ecosystem/types.ts +0 -34
  561. package/src/ecosystem/variable.ts +0 -14
  562. package/src/ecosystem/virtual-user.ts +0 -48
  563. package/src/ecosystem/workflow.ts +0 -68
  564. package/src/ecosystem.ts +0 -40
  565. package/src/index.ts +0 -244
  566. /package/dist/{services/ai-agent-runner-service.js → bootstrap-compat/root.js} +0 -0
  567. /package/dist/{services/ai-run-state-service.js → classification/data-classification.js} +0 -0
  568. /package/dist/{services/ai-storage-service.js → errors/serialized-error.js} +0 -0
  569. /package/dist/{wirings/ai-agent/ai-agent.types.js → function/function-meta.types.js} +0 -0
  570. /package/src/{column-form.ts → classification/column-form.ts} +0 -0
  571. /package/src/{pikku-request.test.ts → function/pikku-request.test.ts} +0 -0
  572. /package/src/{pikku-request.ts → function/pikku-request.ts} +0 -0
  573. /package/src/wirings/{rpc → addon}/addon-auth-tags.test.ts +0 -0
  574. /package/src/wirings/{rpc → addon}/addon-runner.ts +0 -0
  575. /package/src/wirings/{rpc → addon}/addon-secrets.test.ts +0 -0
  576. /package/src/wirings/{rpc → addon}/wire-addon.test.ts +0 -0
  577. /package/src/wirings/{rpc → addon}/wire-remote-addon.ts +0 -0
@@ -4,11 +4,7 @@ import type { SecretService } from '../services/secret-service.js'
4
4
  import type { SchemaService } from '../services/schema-service.js'
5
5
  import type { JWTService } from '../services/jwt-service.js'
6
6
  import type { PikkuHTTP } from '../wirings/http/http.types.js'
7
- import type {
8
- PikkuChannel,
9
- CorePikkuChannelMiddleware,
10
- CorePikkuChannelMiddlewareFactory,
11
- } from '../wirings/channel/channel.types.js'
7
+ import type { PikkuChannel } from '../wirings/channel/channel.types.js'
12
8
  import type { EventHubService } from '../wirings/channel/eventhub-service.js'
13
9
  import type { PikkuRPC } from '../wirings/rpc/rpc-types.js'
14
10
  import type { PikkuMCP } from '../wirings/mcp/mcp.types.js'
@@ -25,8 +21,6 @@ import type { PikkuScenarioWire } from '../wirings/workflow/scenario.types.js'
25
21
  import type {
26
22
  PikkuBrowserWire,
27
23
  PikkuScenarioStepWire,
28
- ScenarioStepKind,
29
- ScenarioSurface,
30
24
  } from '../wirings/workflow/scenario-step.types.js'
31
25
  import type { PikkuGraphWire } from '../wirings/workflow/graph/workflow-graph.types.js'
32
26
  import type { PikkuTrigger } from '../wirings/trigger/trigger.types.js'
@@ -44,8 +38,9 @@ import type { AgentRunnerService } from '../services/agent-runner-service.js'
44
38
  import type { AIEmbeddingService } from '../services/ai-embedding-service.js'
45
39
  import type { AgentRunStateService } from '../services/agent-run-state-service.js'
46
40
  import type { AgentRunService } from '../wirings/agent/agent.types.js'
41
+ import type { MiddlewareMetadata } from '../middleware/middleware.types.js'
42
+ import type { PermissionMetadata } from '../function/function-meta.types.js'
47
43
  import type { VirtualUserRunStore } from '../wirings/virtual-user/virtual-user-run-store.js'
48
- import type { PikkuAgentMiddlewareHooks } from '../wirings/agent/agent.types.js'
49
44
  import type { WorkflowRunService } from '../wirings/workflow/workflow.types.js'
50
45
  import type { CredentialService } from '../services/credential-service.js'
51
46
  import type { EmailService } from '../services/email-service.js'
@@ -76,175 +71,6 @@ export type PikkuWiringTypes =
76
71
  | 'agent'
77
72
  | 'gateway'
78
73
 
79
- export interface FunctionServicesMeta {
80
- optimized: boolean
81
- services: string[]
82
- }
83
-
84
- export interface FunctionWiresMeta {
85
- optimized: boolean
86
- wires: string[]
87
- }
88
-
89
- export type MiddlewareMetadata =
90
- | {
91
- type: 'http'
92
- route: string // Route pattern (e.g., '*' for all, '/api/*' for specific)
93
- }
94
- | {
95
- type: 'tag'
96
- tag: string
97
- }
98
- | {
99
- type: 'wire'
100
- name: string
101
- inline?: boolean
102
- }
103
-
104
- /**
105
- * A reference to a permission function, resolved by name. Function-scoped
106
- * only: there are no wire- or tag-level permission references.
107
- */
108
- export type PermissionMetadata = {
109
- type: 'wire'
110
- name: string
111
- inline?: boolean
112
- }
113
-
114
- export type FunctionRuntimeMeta = {
115
- pikkuFuncId: string
116
- inputSchemaName: string | null
117
- outputSchemaName: string | null
118
- /** Scopes the session must hold to run this function. All are required (AND). */
119
- scopes?: string[]
120
- expose?: boolean
121
- /**
122
- * A sessionless function's own `auth: true`. `sessionless` carries the
123
- * baseline — a `pikkuFunc` always requires a session — and this carries the
124
- * tightening a `pikkuSessionlessFunc` applies to itself. Both are needed to
125
- * know whether a function is gated without running it.
126
- */
127
- auth?: boolean
128
- /**
129
- * The author's declaration that this function's permission check lives in its
130
- * own body. Carries no runtime effect — it records a gate codegen cannot see,
131
- * so an audit is not left to guess whether a sessionless function is open.
132
- * Refused unless `allow.permissionsInBody` is set in `pikku.config.json`.
133
- */
134
- permissionsInBody?: boolean
135
- remote?: boolean
136
- /**
137
- * A step RPC: invoked by name only from a scenario run and refused
138
- * everywhere else, so it is never network-callable.
139
- */
140
- scenarioStep?: boolean
141
- /**
142
- * The body of a `pikkuScenario(...)`. Only ever run by `pikku scenario run`,
143
- * so it is held back from the app bootstrap and from every deployed unit.
144
- */
145
- scenario?: boolean
146
- mcp?: boolean
147
- readonly?: boolean
148
- deploy?: 'serverless' | 'server' | 'auto'
149
- sessionless?: boolean
150
- /** When true, workflow steps calling this function are dispatched via the queue. No queue service configured is a hard error. */
151
- workflowQueued?: boolean
152
- /** Retry count when this function is used as a workflow step. */
153
- workflowRetries?: number
154
- /** Timeout when this function is used as a workflow step (e.g. '30s', '5m'). */
155
- workflowTimeout?: string
156
- /**
157
- * Scenario steps only: which surfaces this step declares a binding for.
158
- *
159
- * The reporter derives coverage from this — a `then` with no binding for the
160
- * surface the run targeted was never actually witnessed there, which is a gap
161
- * worth counting rather than excusing.
162
- */
163
- scenarioStepSurfaces?: ScenarioSurface[]
164
- /**
165
- * Scenario steps only: who acts. Absent means `persona` — the ordinary step,
166
- * and the only kind that existed before the other two.
167
- *
168
- * A `platform` or `addon` step is the app or a third-party system acting, and
169
- * it must never reach a virtual user's catalogue. That is not tidiness: a
170
- * virtual user that can invoke "Stripe's webhook arrives" can forge its own
171
- * payment success, and every finding downstream of that is worthless.
172
- */
173
- scenarioStepKind?: ScenarioStepKind
174
- /** Addon steps only: the addon whose system acts — `wireAddon`'s `name`. */
175
- scenarioStepAddon?: string
176
- /** Scenario steps only: the prose a reporter renders, with `{placeholders}` filled from the step's recorded input. */
177
- scenarioStepTemplate?: string
178
- /**
179
- * The function's `audit` config, resolved — `audit: true` reads as
180
- * `{ durability: 'best-effort' }`. Absent means the function records nothing:
181
- * `auditLog.write()` from an unmarked function is dropped with a warning, so
182
- * this is the only place a reader can see which functions have a trail at all
183
- * without running them.
184
- *
185
- * Informational. The runner resolves audit from the live function config, not
186
- * from here, so meta and runtime cannot disagree about whether audit is on.
187
- */
188
- audit?: {
189
- durability: AuditDurability
190
- }
191
- version?: number
192
- approvalRequired?: boolean
193
- approvalDescription?: string
194
- implementationHash?: string
195
- contractHash?: string
196
- inputHash?: string
197
- outputHash?: string
198
- }
199
-
200
- export type FunctionMeta = FunctionRuntimeMeta &
201
- Partial<
202
- {
203
- name: string
204
- /** `remote`: a contract with no local body, answered by a connected client. */
205
- functionType: 'user' | 'inline' | 'helper' | 'remote'
206
- funcWrapper: string
207
- services: FunctionServicesMeta
208
- wires: FunctionWiresMeta
209
- inputs: string[] | null
210
- outputs: string[] | null
211
- middleware: MiddlewareMetadata[]
212
- permissions: PermissionMetadata[]
213
- isDirectFunction: boolean
214
- sourceFile: string
215
- exportedName: string
216
- /** File containing the handler body when it differs from sourceFile (imported handlers) */
217
- bodySourceFile?: string
218
- /** 1-indexed first line of the handler body (verbose meta; coverage mapping) */
219
- bodyStart: number
220
- /** 1-indexed last line of the handler body (verbose meta; coverage mapping) */
221
- bodyEnd: number
222
- } & CommonWireMeta
223
- >
224
-
225
- export type FunctionsRuntimeMeta = Record<string, FunctionRuntimeMeta>
226
- export type FunctionsMeta = Record<string, FunctionMeta>
227
-
228
- export type MakeRequired<T, K extends keyof T> = Omit<T, K> &
229
- Required<Pick<T, K>>
230
-
231
- export type JSONPrimitive = string | number | boolean | null | undefined
232
-
233
- export type JSONValue =
234
- | JSONPrimitive
235
- | JSONValue[]
236
- | {
237
- [key: string]: JSONValue
238
- }
239
-
240
- export type PickRequired<T, K extends keyof T> = T & Required<Pick<T, K>>
241
-
242
- export type PickOptional<T, K extends keyof T> = Partial<T> & Pick<T, K>
243
-
244
- export type RequireAtLeastOne<T> = {
245
- [K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>
246
- }[keyof T]
247
-
248
74
  /**
249
75
  * Runtime pool tuning for the Postgres adapter. The connection string stays
250
76
  * the flat `postgresUrl` config field — the contract the CLI's db commands read.
@@ -371,6 +197,22 @@ export interface CoreSingletonServices<Config extends CoreConfig = CoreConfig> {
371
197
  auth?: () => Promise<AuthInstance>
372
198
  }
373
199
 
200
+ /**
201
+ * Reads a single credential. The first signature resolves the value type from
202
+ * the project's generated `CredentialsMap`; the second keeps a name the map
203
+ * does not know callable with an explicit type.
204
+ *
205
+ * `TCredentials` is unconstrained because the generated map is an interface,
206
+ * which has no implicit index signature and so cannot satisfy
207
+ * `Record<string, unknown>`.
208
+ */
209
+ export type GetCredential<TCredentials = Record<string, unknown>> = {
210
+ <K extends keyof TCredentials & string>(
211
+ name: K
212
+ ): TCredentials[K] | null | Promise<TCredentials[K] | null>
213
+ <T = unknown>(name: string): T | null | Promise<T | null>
214
+ }
215
+
374
216
  export type PikkuWire<
375
217
  In = unknown,
376
218
  Out = unknown,
@@ -386,6 +228,7 @@ export type PikkuWire<
386
228
  // `ScenarioContext`.
387
229
  TypedScenario extends PikkuScenarioWire<any> | never = PikkuScenarioWire<any>,
388
230
  TypedActors extends ScenarioPersonas = ScenarioPersonas,
231
+ TypedCredentials = Record<string, unknown>,
389
232
  > = {
390
233
  /** Always present — lazily initialised on first access for every function invocation */
391
234
  rpc: TypedRPC
@@ -415,8 +258,18 @@ export type PikkuWire<
415
258
  workflow: TypedWorkflow
416
259
  scenario: TypedScenario
417
260
  actors: TypedActors
261
+ /**
262
+ * The persona this step runs as, injected by the runner.
263
+ *
264
+ * Required on a `browser` binding, which cannot be provisioned without one,
265
+ * and on any binding whose step declares `actor: true`. A step that declares
266
+ * neither has no `actor` on its wire at all rather than an optional one —
267
+ * a pure assertion has nobody to be, and `attemptsSignIn` deliberately posts
268
+ * credentials instead of reusing an actor's session.
269
+ */
270
+ actor: ScenarioPersonaOf<TypedActors>
418
271
  /** Present on every scenario step invocation */
419
- scenarioStep: PikkuScenarioStepWire<ScenarioPersonaOf<TypedActors>>
272
+ scenarioStep: PikkuScenarioStepWire
420
273
  /** Present only when the runner provisioned a browser for this step */
421
274
  browser: PikkuBrowserWire
422
275
  workflowStep: WorkflowStepWire
@@ -435,11 +288,10 @@ export type PikkuWire<
435
288
  /** Set a credential value (available in middleware) */
436
289
  setCredential: (name: string, value: unknown) => void
437
290
  /** Get a single credential by name — lazy-loads from CredentialService on first call, sync thereafter */
438
- getCredential: <T = unknown>(name: string) => T | null | Promise<T | null>
291
+ getCredential: GetCredential<TypedCredentials>
439
292
  /** Get all resolved credentials — lazy-loads from CredentialService on first call, sync thereafter */
440
293
  getCredentials: () =>
441
- | Record<string, unknown>
442
- | Promise<Record<string, unknown>>
294
+ Record<string, unknown> | Promise<Record<string, unknown>>
443
295
  audit: {
444
296
  durability: AuditDurability
445
297
  }
@@ -462,100 +314,6 @@ export type PikkuWire<
462
314
  /** Wire as constructed by runners, before the function runner lazily adds `rpc`. */
463
315
  export type PikkuRawWire = Omit<PikkuWire, 'rpc'>
464
316
 
465
- export type CorePikkuMiddleware<
466
- SingletonServices extends CoreSingletonServices = CoreSingletonServices,
467
- UserSession extends CoreUserSession = CoreUserSession,
468
- > = (
469
- services: SingletonServices,
470
- wires: PikkuWire,
471
- next: () => Promise<void>
472
- ) => Promise<void>
473
-
474
- /**
475
- * Execution order: `highest` runs first (outermost in the onion), `lowest`
476
- * runs last, closest to the function.
477
- */
478
- export type MiddlewarePriority =
479
- | 'highest'
480
- | 'high'
481
- | 'medium'
482
- | 'low'
483
- | 'lowest'
484
-
485
- export type CorePikkuMiddlewareConfig<
486
- SingletonServices extends CoreSingletonServices = CoreSingletonServices,
487
- UserSession extends CoreUserSession = CoreUserSession,
488
- > = {
489
- func: CorePikkuMiddleware<SingletonServices, UserSession>
490
- name?: string
491
- description?: string
492
- /** Execution priority. Lower runs first (outermost). Defaults to 'medium'. */
493
- priority?: MiddlewarePriority
494
- }
495
-
496
- export type CorePikkuMiddlewareFactory<
497
- In = any,
498
- SingletonServices extends CoreSingletonServices = CoreSingletonServices,
499
- UserSession extends CoreUserSession = CoreUserSession,
500
- > = (input: In) => CorePikkuMiddleware<SingletonServices, UserSession>
501
-
502
- export type CorePikkuMiddlewareGroup<
503
- SingletonServices extends CoreSingletonServices = CoreSingletonServices,
504
- UserSession extends CoreUserSession = CoreUserSession,
505
- > = Array<
506
- | CorePikkuMiddleware<SingletonServices, UserSession>
507
- | CorePikkuMiddlewareFactory<any, SingletonServices, UserSession>
508
- >
509
-
510
- export const pikkuMiddleware = <
511
- SingletonServices extends CoreSingletonServices = CoreSingletonServices,
512
- UserSession extends CoreUserSession = CoreUserSession,
513
- >(
514
- middleware:
515
- | CorePikkuMiddleware<SingletonServices, UserSession>
516
- | CorePikkuMiddlewareConfig<SingletonServices, UserSession>
517
- ): CorePikkuMiddleware<SingletonServices, UserSession> => {
518
- if (typeof middleware === 'function') return middleware
519
- const func = middleware.func as CorePikkuMiddleware<
520
- SingletonServices,
521
- UserSession
522
- > & { __priority?: MiddlewarePriority }
523
- if (middleware.priority) {
524
- func.__priority = middleware.priority
525
- }
526
- return func
527
- }
528
-
529
- export const pikkuMiddlewareFactory = <In = any>(
530
- factory: CorePikkuMiddlewareFactory<In>
531
- ): CorePikkuMiddlewareFactory<In> => {
532
- return factory
533
- }
534
-
535
- export const pikkuChannelMiddleware = <
536
- SingletonServices extends CoreSingletonServices = CoreSingletonServices,
537
- Event = unknown,
538
- >(
539
- middleware: CorePikkuChannelMiddleware<SingletonServices, Event>
540
- ): CorePikkuChannelMiddleware<SingletonServices, Event> => {
541
- return middleware
542
- }
543
-
544
- export const pikkuChannelMiddlewareFactory = <In = any>(
545
- factory: CorePikkuChannelMiddlewareFactory<In>
546
- ): CorePikkuChannelMiddlewareFactory<In> => {
547
- return factory
548
- }
549
-
550
- export type { PikkuAgentMiddlewareHooks } from '../wirings/agent/agent.types.js'
551
-
552
- export const pikkuAgentMiddleware = <
553
- State extends Record<string, unknown> = Record<string, unknown>,
554
- SingletonServices extends CoreSingletonServices = CoreSingletonServices,
555
- >(
556
- hooks: PikkuAgentMiddlewareHooks<State, SingletonServices>
557
- ): PikkuAgentMiddlewareHooks<State, SingletonServices> => hooks
558
-
559
317
  export type CoreServices<SingletonServices = CoreSingletonServices> =
560
318
  SingletonServices
561
319
 
@@ -666,16 +424,6 @@ export interface SecurityAuditReport {
666
424
  summary: SecurityAuditSummary
667
425
  }
668
426
 
669
- export interface SerializedError {
670
- message: string
671
- stack?: string
672
- code?: string
673
- // Set for a deliberate PikkuError; survives step-boundary rehydration so
674
- // the workflow runner logs the message alone rather than a stack trace.
675
- expected?: boolean
676
- [key: string]: any
677
- }
678
-
679
427
  /**
680
428
  * A generated schema's declaration site, used by the credential/secret/variable
681
429
  * definition validators to point conflicting definitions at their source.
@@ -0,0 +1,25 @@
1
+ export type {
2
+ AuthInstance,
3
+ CommonWireMeta,
4
+ CoreConfig,
5
+ CoreServices,
6
+ CoreSingletonServices,
7
+ CoreUserSession,
8
+ CreateConfig,
9
+ CreateSingletonServices,
10
+ CreateWireServices,
11
+ GetCredential,
12
+ PikkuWire,
13
+ PikkuWiringTypes,
14
+ PostgresConfig,
15
+ SecretlessServices,
16
+ SecurityAuditIssue,
17
+ SecurityAuditReport,
18
+ SecurityAuditSummary,
19
+ SecurityAuditUpdate,
20
+ SecuritySeverity,
21
+ SecurityUpdateLevel,
22
+ ServerLifecycle,
23
+ WireServices,
24
+ } from './core.types.js'
25
+ export type * from './state.types.js'
@@ -54,9 +54,6 @@ import type {
54
54
  TriggerSourceMeta,
55
55
  } from '../wirings/trigger/trigger.types.js'
56
56
  import type {
57
- FunctionsMeta,
58
- CorePikkuMiddleware,
59
- CorePikkuMiddlewareGroup,
60
57
  CreateConfig,
61
58
  CreateSingletonServices,
62
59
  CreateWireServices,
@@ -65,6 +62,11 @@ import type {
65
62
  CoreServices,
66
63
  CoreUserSession,
67
64
  } from './core.types.js'
65
+ import type { FunctionsMeta } from '../function/function-meta.types.js'
66
+ import type {
67
+ CorePikkuMiddleware,
68
+ CorePikkuMiddlewareGroup,
69
+ } from '../middleware/middleware.types.js'
68
70
  import type { CorePikkuChannelMiddleware } from '../wirings/channel/channel.types.js'
69
71
 
70
72
  export interface PikkuPackageState {
@@ -210,8 +212,7 @@ export interface PikkuPackageState {
210
212
  /** The pikkuBetterAuth factory, self-registered when auth.ts is evaluated.
211
213
  * pikkuServices reads it to build and inject the `auth` singleton. */
212
214
  authFactory:
213
- | ((services: CoreSingletonServices) => unknown | Promise<unknown>)
214
- | null
215
+ ((services: CoreSingletonServices) => unknown | Promise<unknown>) | null
215
216
  credentialsMeta: Record<
216
217
  string,
217
218
  { name: string; displayName: string; type: string; oauth2?: boolean }
@@ -0,0 +1,72 @@
1
+ import { describe, test } from 'node:test'
2
+ import assert from 'node:assert/strict'
3
+ import type { CoreUserSession, GetCredential, PikkuWire } from './core.types.js'
4
+ import type { PikkuRPC } from '../wirings/rpc/rpc-types.js'
5
+ import type { PikkuWorkflowWire } from '../wirings/workflow/workflow.types.js'
6
+ import type { PikkuScenarioWire } from '../wirings/workflow/scenario.types.js'
7
+ import type { ScenarioPersonas } from '../services/personas-service.js'
8
+
9
+ interface CredentialsMap {
10
+ slack: { token: string }
11
+ stripe: { apiKey: string; accountId: string }
12
+ }
13
+
14
+ type TypedWire = PikkuWire<
15
+ unknown,
16
+ unknown,
17
+ false,
18
+ CoreUserSession,
19
+ PikkuRPC,
20
+ null,
21
+ never,
22
+ PikkuWorkflowWire,
23
+ unknown,
24
+ PikkuScenarioWire<any>,
25
+ ScenarioPersonas,
26
+ CredentialsMap
27
+ >
28
+
29
+ const VALUES: Record<string, unknown> = {
30
+ slack: { token: 'xoxb-1' },
31
+ stripe: { apiKey: 'sk-1', accountId: 'acct-1' },
32
+ 'not-in-the-map': { anything: true },
33
+ }
34
+
35
+ // Mirrors `createWireServicesCredentialWireProps`, so this also pins that a
36
+ // generic single-signature implementation still satisfies the overload pair.
37
+ const getCredential: NonNullable<TypedWire['getCredential']> = <T = unknown>(
38
+ name: string
39
+ ) => (VALUES[name] ?? null) as T | null
40
+
41
+ describe('wire.getCredential is typed by the generated CredentialsMap', () => {
42
+ test('resolves a mapped name without an explicit type argument', async () => {
43
+ const slack: { token: string } | null | Promise<{ token: string } | null> =
44
+ getCredential('slack')
45
+ assert.deepEqual(await slack, { token: 'xoxb-1' })
46
+
47
+ const stripe = await getCredential('stripe')
48
+ assert.equal(stripe?.accountId, 'acct-1')
49
+ })
50
+
51
+ test('rejects the wrong type for a mapped name', () => {
52
+ // @ts-expect-error 'slack' resolves to { token: string }, not a string
53
+ const wrong: string | null | Promise<string | null> = getCredential('slack')
54
+ assert.ok(wrong)
55
+ })
56
+
57
+ test('keeps an unmapped name callable with an explicit type argument', async () => {
58
+ const other = await getCredential<{ anything: boolean }>('not-in-the-map')
59
+ assert.equal(other?.anything, true)
60
+ })
61
+
62
+ test('falls back to unknown when no map is bound', async () => {
63
+ const untyped: GetCredential = <T = unknown>(name: string) =>
64
+ (VALUES[name] ?? null) as T | null
65
+ // @ts-expect-error no map is bound, so the value is unknown
66
+ const wrong: { token: string } | null = await untyped('slack')
67
+ assert.deepEqual(wrong, { token: 'xoxb-1' })
68
+ assert.deepEqual(await untyped<{ token: string }>('slack'), {
69
+ token: 'xoxb-1',
70
+ })
71
+ })
72
+ })
package/src/utils.ts CHANGED
@@ -129,3 +129,37 @@ export const pikkuServerLifecycle = <
129
129
  >(
130
130
  lifecycle: ServerLifecycle<SS>
131
131
  ): ServerLifecycle<SS> => lifecycle
132
+
133
+ export type MakeRequired<T, K extends keyof T> = Omit<T, K> &
134
+ Required<Pick<T, K>>
135
+
136
+ export type JSONPrimitive = string | number | boolean | null | undefined
137
+
138
+ export type JSONValue =
139
+ | JSONPrimitive
140
+ | JSONValue[]
141
+ | {
142
+ [key: string]: JSONValue
143
+ }
144
+
145
+ export type PickRequired<T, K extends keyof T> = T & Required<Pick<T, K>>
146
+
147
+ export type PickOptional<T, K extends keyof T> = Partial<T> & Pick<T, K>
148
+
149
+ export type RequireAtLeastOne<T> = {
150
+ [K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>
151
+ }[keyof T]
152
+
153
+ export {
154
+ getDurationInMilliseconds,
155
+ getRelativeTimeOffset,
156
+ getRelativeTimeOffsetFromNow,
157
+ parseDurationString,
158
+ } from './time-utils.js'
159
+ export type { RelativeTimeInput } from './time-utils.js'
160
+
161
+ export {
162
+ formatVersionedId,
163
+ isVersionedId,
164
+ parseVersionedId,
165
+ } from './version.js'
@@ -4,7 +4,7 @@ import assert from 'node:assert/strict'
4
4
  import { addFunction, runPikkuFunc } from '../../function/function-runner.js'
5
5
  import { pikkuState, resetPikkuState } from '../../pikku-state.js'
6
6
  import { MissingScopeError } from '../../errors/errors.js'
7
- import { ContextAwareRPCService } from './rpc-runner.js'
7
+ import { ContextAwareRPCService } from '../rpc/rpc-runner.js'
8
8
  import { wireAddon } from './wire-addon.js'
9
9
 
10
10
  const ADDON_PACKAGE = '@addon/console'
@@ -0,0 +1,12 @@
1
+ export { wireAddon } from './wire-addon.js'
2
+ export type { WireAddonConfig } from './wire-addon.js'
3
+ export { wireRemoteAddon } from './wire-remote-addon.js'
4
+ export type {
5
+ WireRemoteAddonConfig,
6
+ RemoteAddonAuth,
7
+ } from './wire-remote-addon.js'
8
+ export {
9
+ resolveRemoteAddonToken,
10
+ RemoteAddonAuthError,
11
+ } from './remote-addon-auth.js'
12
+ export type { RemoteAddonAuthBinding } from './remote-addon-auth.js'
@@ -1,6 +1,9 @@
1
1
  import type { CoreServices, PikkuRawWire } from '../../types/core.types.js'
2
2
  import { PikkuError, addError } from '../../errors/error-handler.js'
3
- import { isSecretValue, type SecretValue } from '../../secret-value.js'
3
+ import {
4
+ isSecretValue,
5
+ type SecretValue,
6
+ } from '../../classification/secret-value.js'
4
7
 
5
8
  export type RemoteAddonAuthBinding =
6
9
  | { credentialId: string }
@@ -1,7 +1,6 @@
1
1
  import { pikkuState } from '../../pikku-state.js'
2
2
  import { getTagGroups } from '../../utils.js'
3
- import type { CorePikkuMiddleware } from '../../types/core.types.js'
4
-
3
+ import type { CorePikkuMiddleware } from '../../middleware/middleware.types.js'
5
4
  export type WireAddonConfig = {
6
5
  name: string
7
6
  package: string
@@ -143,6 +142,42 @@ export const resolveAddonAuth = (
143
142
  (config) => config.auth === true
144
143
  )
145
144
 
145
+ /**
146
+ * The package a namespaced function id belongs to, and the name that package
147
+ * publishes it under.
148
+ *
149
+ * A wiring that points at an addon function through `ref('ns:fn')` records
150
+ * `ns:fn` as its own function id — the same id every other wire type records —
151
+ * but the addon publishes its metadata under the bare `fn`, in its own package
152
+ * state. Without this the wire finds the function it registered and no metadata
153
+ * to run it by.
154
+ *
155
+ * The wiring itself stays the consuming app's, so `packageName` is the package
156
+ * the *wire* runs in, not the target's: it is null for a `ref()` the app wired,
157
+ * and only narrows the lookup when a wire really does run inside the addon.
158
+ */
159
+ export const resolveAddonFunctionTarget = (
160
+ funcName: string,
161
+ packageName: string | null
162
+ ): { packageName: string; localName: string } | null => {
163
+ const separator = funcName.indexOf(':')
164
+ if (separator === -1) {
165
+ return null
166
+ }
167
+ const namespace = funcName.slice(0, separator)
168
+ const config = pikkuState(null, 'addons', 'packages').get(namespace)
169
+ if (!config) {
170
+ return null
171
+ }
172
+ if (packageName && config.package !== packageName) {
173
+ return null
174
+ }
175
+ return {
176
+ packageName: config.package,
177
+ localName: funcName.slice(separator + 1),
178
+ }
179
+ }
180
+
146
181
  /**
147
182
  * Addon tags name middleware the *consuming app* registered, so they resolve
148
183
  * against the root tag groups rather than the addon package's own.