@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,3 +1,4 @@
1
+ import { pikkuState } from '../../pikku-state.js';
1
2
  /** "from-plan" → "fromPlan"; the parser accepts either spelling. */
2
3
  function toCamelCase(str) {
3
4
  return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
@@ -57,6 +58,114 @@ function warnUnknownOption(typed, availableOptions, result) {
57
58
  * one error per character.
58
59
  */
59
60
  const MAX_SHORT_FLAG_CLUSTER = 64;
61
+ function resolveOptionType(optionDef) {
62
+ if (optionDef.type) {
63
+ return optionDef.type;
64
+ }
65
+ if (typeof optionDef.default === 'boolean') {
66
+ return 'boolean';
67
+ }
68
+ if (typeof optionDef.default === 'number') {
69
+ return 'number';
70
+ }
71
+ return 'string';
72
+ }
73
+ /**
74
+ * A command's options are keys of its function's input, so the input schema
75
+ * already records what each one is. Reading it here means a declaration never
76
+ * has to repeat — or contradict — the type the function is validated against.
77
+ * An explicit `type` still wins, and an option the schema says nothing about
78
+ * (a program-level option belonging to no function input) is left untouched.
79
+ */
80
+ function applySchemaOptionTypes(options, commandMeta) {
81
+ const properties = commandInputProperties(commandMeta);
82
+ if (!properties) {
83
+ return options;
84
+ }
85
+ const typed = { ...options };
86
+ for (const [name, option] of Object.entries(typed)) {
87
+ if (option.type) {
88
+ continue;
89
+ }
90
+ const schemaType = optionTypeFromSchema(properties[name]);
91
+ if (schemaType) {
92
+ typed[name] = { ...option, type: schemaType };
93
+ }
94
+ }
95
+ return typed;
96
+ }
97
+ function commandInputProperties(commandMeta) {
98
+ const funcMeta = pikkuState(null, 'function', 'meta')[commandMeta.pikkuFuncId];
99
+ const schemaName = funcMeta?.inputSchemaName;
100
+ if (!schemaName) {
101
+ return null;
102
+ }
103
+ const schema = pikkuState(funcMeta.packageName ?? null, 'misc', 'schemas').get(schemaName);
104
+ const properties = schema?.properties;
105
+ return properties && typeof properties === 'object' ? properties : null;
106
+ }
107
+ function optionTypeFromSchema(property) {
108
+ if (!property || typeof property !== 'object') {
109
+ return undefined;
110
+ }
111
+ // An optional field can arrive as a union with null, which is not a shape the
112
+ // parser can read a value into.
113
+ const declared = Array.isArray(property.type)
114
+ ? property.type.filter((entry) => entry !== 'null')[0]
115
+ : property.type;
116
+ switch (declared) {
117
+ case 'array':
118
+ return 'string[]';
119
+ case 'number':
120
+ case 'integer':
121
+ return 'number';
122
+ case 'boolean':
123
+ return 'boolean';
124
+ case 'string':
125
+ return 'string';
126
+ default:
127
+ return undefined;
128
+ }
129
+ }
130
+ const BOOLEAN_LITERALS = new Map([
131
+ ['true', true],
132
+ ['false', false],
133
+ ['1', true],
134
+ ['0', false],
135
+ ['yes', true],
136
+ ['no', false],
137
+ ]);
138
+ /**
139
+ * A boolean option is a flag, but `--watch false` is how scripts and CI turn a
140
+ * default-on flag off, so an explicit literal directly after the flag is taken
141
+ * as its value rather than left behind as a positional.
142
+ */
143
+ function readBooleanLiteral(raw) {
144
+ if (raw === undefined) {
145
+ return undefined;
146
+ }
147
+ return BOOLEAN_LITERALS.get(raw.toLowerCase());
148
+ }
149
+ function readOptionValue(raw, optionDef) {
150
+ if (resolveOptionType(optionDef) !== 'string[]') {
151
+ return parseOptionValue(raw, optionDef);
152
+ }
153
+ return raw
154
+ .split(',')
155
+ .map((item) => item.trim())
156
+ .filter((item) => item.length > 0)
157
+ .map((item) => parseOptionValue(item, optionDef));
158
+ }
159
+ /** A repeated array option accumulates rather than replacing. */
160
+ function assignOptionValue(optionArgs, key, value) {
161
+ const existing = optionArgs[key];
162
+ if (Array.isArray(existing) && Array.isArray(value)) {
163
+ optionArgs[key] = [...existing, ...value];
164
+ }
165
+ else {
166
+ optionArgs[key] = value;
167
+ }
168
+ }
60
169
  export function parseCLIArguments(args, programName, allMeta) {
61
170
  const result = {
62
171
  program: programName,
@@ -131,7 +240,7 @@ export function parseCLIArguments(args, programName, allMeta) {
131
240
  result.errors.push(`Missing subcommand: ${result.commandPath.join(' ')}`);
132
241
  return result;
133
242
  }
134
- const availableOptions = collectAvailableOptions(meta, result.commandPath);
243
+ const availableOptions = applySchemaOptionTypes(collectAvailableOptions(meta, result.commandPath), commandMeta);
135
244
  const positionalArgs = [];
136
245
  const optionArgs = {};
137
246
  while (currentIndex < args.length) {
@@ -142,8 +251,9 @@ export function parseCLIArguments(args, programName, allMeta) {
142
251
  : undefined;
143
252
  const equalIndex = arg.indexOf('=');
144
253
  if (negatedKey &&
145
- typeof availableOptions[negatedKey]?.default === 'boolean') {
146
- // Requiring a boolean default keeps a literal `--no-something` option
254
+ availableOptions[negatedKey] &&
255
+ resolveOptionType(availableOptions[negatedKey]) === 'boolean') {
256
+ // Requiring a boolean type keeps a literal `--no-something` option
147
257
  // name parsing as itself rather than as a negation.
148
258
  optionArgs[negatedKey] = false;
149
259
  }
@@ -154,7 +264,12 @@ export function parseCLIArguments(args, programName, allMeta) {
154
264
  warnUnknownOption(arg.slice(2, equalIndex), availableOptions, result);
155
265
  }
156
266
  const value = arg.slice(equalIndex + 1);
157
- optionArgs[key] = parseOptionValue(value, optionDef);
267
+ if (optionDef) {
268
+ assignOptionValue(optionArgs, key, readOptionValue(value, optionDef));
269
+ }
270
+ else {
271
+ optionArgs[key] = parseOptionValue(value, optionDef);
272
+ }
158
273
  }
159
274
  else {
160
275
  const key = toCamelCase(arg.slice(2));
@@ -162,21 +277,31 @@ export function parseCLIArguments(args, programName, allMeta) {
162
277
  if (!optionDef) {
163
278
  warnUnknownOption(arg.slice(2), availableOptions, result);
164
279
  }
165
- if (optionDef && optionDef.array) {
166
- currentIndex++;
167
- const values = [];
168
- while (currentIndex < args.length &&
169
- !args[currentIndex].startsWith('-')) {
170
- values.push(parseOptionValue(args[currentIndex], optionDef));
280
+ if (!optionDef) {
281
+ // With no spec there is nothing to consult, so the lookahead
282
+ // heuristic is all that is left.
283
+ if (currentIndex + 1 < args.length &&
284
+ !args[currentIndex + 1].startsWith('-')) {
171
285
  currentIndex++;
286
+ optionArgs[key] = parseOptionValue(args[currentIndex], optionDef);
287
+ }
288
+ else {
289
+ optionArgs[key] = true;
172
290
  }
173
- currentIndex--; // Back up one since we'll increment at loop end
174
- optionArgs[key] = values;
175
291
  }
176
- else if (currentIndex + 1 < args.length &&
177
- !args[currentIndex + 1].startsWith('-')) {
292
+ else if (resolveOptionType(optionDef) === 'boolean') {
293
+ const literal = readBooleanLiteral(args[currentIndex + 1]);
294
+ if (literal === undefined) {
295
+ optionArgs[key] = true;
296
+ }
297
+ else {
298
+ currentIndex++;
299
+ optionArgs[key] = literal;
300
+ }
301
+ }
302
+ else if (currentIndex + 1 < args.length) {
178
303
  currentIndex++;
179
- optionArgs[key] = parseOptionValue(args[currentIndex], optionDef);
304
+ assignOptionValue(optionArgs, key, readOptionValue(args[currentIndex], optionDef));
180
305
  }
181
306
  else {
182
307
  optionArgs[key] = true;
@@ -193,12 +318,21 @@ export function parseCLIArguments(args, programName, allMeta) {
193
318
  const shortFlag = arg[i];
194
319
  const longOption = findLongOption(shortFlag, availableOptions);
195
320
  if (longOption) {
321
+ const optionDef = availableOptions[longOption];
196
322
  // Only the last flag in a cluster can take a value.
197
- if (i === arg.length - 1 &&
198
- currentIndex + 1 < args.length &&
199
- !args[currentIndex + 1].startsWith('-')) {
323
+ const isLast = i === arg.length - 1;
324
+ const literal = isLast && resolveOptionType(optionDef) === 'boolean'
325
+ ? readBooleanLiteral(args[currentIndex + 1])
326
+ : undefined;
327
+ if (literal !== undefined) {
328
+ currentIndex++;
329
+ optionArgs[longOption] = literal;
330
+ }
331
+ else if (isLast &&
332
+ resolveOptionType(optionDef) !== 'boolean' &&
333
+ currentIndex + 1 < args.length) {
200
334
  currentIndex++;
201
- optionArgs[longOption] = parseOptionValue(args[currentIndex], availableOptions[longOption]);
335
+ assignOptionValue(optionArgs, longOption, readOptionValue(args[currentIndex], optionDef));
202
336
  }
203
337
  else {
204
338
  optionArgs[longOption] = true;
@@ -272,11 +406,11 @@ function parseOptionValue(value, optionDef) {
272
406
  return parseFloat(value);
273
407
  return value;
274
408
  }
275
- const defaultValue = optionDef.default;
276
- if (typeof defaultValue === 'boolean') {
277
- return value === 'true' || value === '1' || value === 'yes';
409
+ const optionType = resolveOptionType(optionDef);
410
+ if (optionType === 'boolean') {
411
+ return readBooleanLiteral(value) ?? false;
278
412
  }
279
- if (typeof defaultValue === 'number') {
413
+ if (optionType === 'number') {
280
414
  return parseFloat(value);
281
415
  }
282
416
  if (optionDef.choices && !optionDef.choices.includes(value)) {
@@ -1,4 +1,5 @@
1
- import type { CommonWireMeta, CorePikkuMiddleware, CorePikkuMiddlewareGroup, CoreSingletonServices } from '../../types/core.types.js';
1
+ import type { CommonWireMeta, CoreSingletonServices } from '../../types/core.types.js';
2
+ import type { CorePikkuMiddleware, CorePikkuMiddlewareGroup } from '../../middleware/middleware.types.js';
2
3
  import type { CorePikkuFunctionConfig } from '../../function/functions.types.js';
3
4
  import type { PikkuHTTPRequest } from '../http/http.types.js';
4
5
  export interface GatewayAttachment {
@@ -1,6 +1,6 @@
1
1
  import type { CoreHTTPFunctionWiring, RunHTTPWiringOptions, PikkuHTTP, PikkuHTTPRequest, PikkuHTTPResponse } from './http.types.js';
2
2
  import type { CorePikkuFunction, CorePikkuFunctionSessionless, CorePikkuPermission } from '../../function/functions.types.js';
3
- import type { CorePikkuMiddleware, CorePikkuMiddlewareGroup } from '../../types/core.types.js';
3
+ import type { CorePikkuMiddleware, CorePikkuMiddlewareGroup } from '../../middleware/middleware.types.js';
4
4
  import { PikkuFetchHTTPResponse } from './pikku-fetch-http-response.js';
5
5
  export declare const addHTTPMiddleware: <PikkuMiddleware extends CorePikkuMiddleware>(pattern: string, middleware: CorePikkuMiddlewareGroup, packageName?: string | null) => CorePikkuMiddlewareGroup;
6
6
  export declare const wireHTTP: <In, Out, Route extends string, PikkuFunction extends CorePikkuFunction<In, Out> = CorePikkuFunction<In, Out>, PikkuFunctionSessionless extends CorePikkuFunctionSessionless<In, Out> = CorePikkuFunctionSessionless<In, Out>, PikkuPermissionGroup extends CorePikkuPermission<In> = CorePikkuPermission<In>, PikkuMiddleware extends CorePikkuMiddleware = CorePikkuMiddleware>(httpWiring: CoreHTTPFunctionWiring<In, Out, Route, PikkuFunction, PikkuFunctionSessionless, PikkuPermissionGroup, PikkuMiddleware>) => void;
@@ -42,7 +42,7 @@ export const wireHTTP = (httpWiring) => {
42
42
  return;
43
43
  }
44
44
  if (httpWiring.func) {
45
- addFunction(routeMeta.pikkuFuncId, httpWiring.func);
45
+ addFunction(routeMeta.pikkuFuncId, httpWiring.func, routeMeta.packageName ?? null);
46
46
  }
47
47
  const routes = pikkuState(null, 'http', 'routes');
48
48
  if (!routes.has(httpWiring.method)) {
@@ -1,6 +1,7 @@
1
1
  import type { SerializeOptions } from 'cookie';
2
2
  import type { StandardSchemaV1 } from '@standard-schema/spec';
3
- import type { CorePikkuMiddleware, CommonWireMeta } from '../../types/core.types.js';
3
+ import type { CommonWireMeta } from '../../types/core.types.js';
4
+ import type { CorePikkuMiddleware } from '../../middleware/middleware.types.js';
4
5
  import type { CorePikkuFunction, CorePikkuFunctionSessionless, CorePikkuPermission, CorePikkuFunctionConfig } from '../../function/functions.types.js';
5
6
  type ExtractHTTPWiringParams<S extends string> = S extends `${string}:${infer Param}/${infer Rest}` ? Param | ExtractHTTPWiringParams<`/${Rest}`> : S extends `${string}:${infer Param}` ? Param : never;
6
7
  export type AssertHTTPWiringParams<In, HTTPWiring extends string> = ExtractHTTPWiringParams<HTTPWiring> extends keyof In ? unknown : [
@@ -104,7 +105,6 @@ export type HTTPWiringMeta = CommonWireMeta & {
104
105
  * join wrong reads an open route as a closed one.
105
106
  */
106
107
  requiresSession?: boolean;
107
- refTarget?: string;
108
108
  params?: string[];
109
109
  query?: string[];
110
110
  inputTypes?: HTTPFunctionMetaInputTypes;
@@ -4,4 +4,5 @@ export { logRoutes } from './log-http-routes.js';
4
4
  export { fetch, fetchData, wireHTTP, addHTTPMiddleware } from './http-runner.js';
5
5
  export { wireHTTPRoutes, defineHTTPRoutes } from './http-routes.js';
6
6
  export { toWebRequest, applyWebResponse } from './web-request.js';
7
+ export { httpRouter } from './routers/http-router.js';
7
8
  export type { AssertHTTPWiringParams, CoreHTTPFunctionWiring, HTTPMethod, HTTPRouteBaseConfig, HTTPRouteContract, HTTPRouteMap, HTTPWiringsMeta, PikkuHTTP, PikkuHTTPRequest, PikkuHTTPResponse, PikkuQuery, RunHTTPWiringOptions, } from './http.types.js';
@@ -4,3 +4,4 @@ export { logRoutes } from './log-http-routes.js';
4
4
  export { fetch, fetchData, wireHTTP, addHTTPMiddleware } from './http-runner.js';
5
5
  export { wireHTTPRoutes, defineHTTPRoutes } from './http-routes.js';
6
6
  export { toWebRequest, applyWebResponse } from './web-request.js';
7
+ export { httpRouter } from './routers/http-router.js';
@@ -1,5 +1,5 @@
1
1
  import { parse as parseQuery } from 'picoquery';
2
- import { parse as parseCookie } from 'cookie';
2
+ import { parseCookie } from 'cookie';
3
3
  import { PayloadTooLargeError, UnprocessableContentError, } from '../../errors/errors.js';
4
4
  export const DEFAULT_MAX_BODY_SIZE = 10 * 1024 * 1024;
5
5
  /**
@@ -1,4 +1,4 @@
1
- import { serialize as serializeCookie } from 'cookie';
1
+ import { stringifySetCookie } from 'cookie';
2
2
  export class PikkuFetchHTTPResponse {
3
3
  #statusCode = 200;
4
4
  #headers = new Headers();
@@ -95,7 +95,7 @@ export class PikkuFetchHTTPResponse {
95
95
  return this;
96
96
  }
97
97
  toResponse(args) {
98
- const cookieHeader = Array.from(this.#cookies.entries()).map(([name, { value, flags }]) => serializeCookie(name, value, flags));
98
+ const cookieHeader = Array.from(this.#cookies.entries()).map(([name, { value, flags }]) => stringifySetCookie({ name, value, ...flags }, flags));
99
99
  cookieHeader.forEach((cookie) => this.#headers.append('Set-Cookie', cookie));
100
100
  return new Response(this.#body, {
101
101
  ...args,
@@ -1,5 +1,5 @@
1
1
  import type { CorePikkuFunctionConfig, CorePikkuFunctionSessionless, CorePikkuPermission } from '../../function/functions.types.js';
2
- import type { CorePikkuMiddleware, MiddlewareMetadata } from '../../types/core.types.js';
2
+ import type { CorePikkuMiddleware, MiddlewareMetadata } from '../../middleware/middleware.types.js';
3
3
  /** "user/{userId}/post/{postId}" => "userId" | "postId" */
4
4
  type ExtractMCPURIParams<S extends string> = S extends `${string}{${infer Param}}/${infer Rest}` ? Param | ExtractMCPURIParams<Rest> : S extends `${string}{${infer Param}}` ? Param : never;
5
5
  /** Resolves to a tuple of error strings, not `never`, so the mismatch surfaces in the type error. */
@@ -3,7 +3,7 @@ export { isRunnablePersona, roleMismatchMessage, runnablePersonas, validateAndBu
3
3
  export type { RoleVerification } from './validate-personas.js';
4
4
  export { personaEnvironmentErrors, personaEnvironmentRefusal, } from './persona-environments.js';
5
5
  export type { PersonaEnvironment, PersonaEnvironmentSubject, } from './persona-environments.js';
6
- export { personaEmail, personaEmails, } from './persona-email.js';
6
+ export { personaEmail, personaEmails } from './persona-email.js';
7
7
  export type { MailboxAllowlist, PersonaMailbox, ReceivedEmail, } from './persona-mailbox.js';
8
8
  export type { CorePersona, CorePersonas, PersonaAccountMeta, PersonaDefinitions, PersonaMeta, PersonasMeta, } from './persona.types.js';
9
9
  /**
@@ -1,7 +1,7 @@
1
1
  export { definePersonas } from './define-personas.js';
2
2
  export { isRunnablePersona, roleMismatchMessage, runnablePersonas, validateAndBuildPersonasMeta, verifyPersonaRoles, } from './validate-personas.js';
3
3
  export { personaEnvironmentErrors, personaEnvironmentRefusal, } from './persona-environments.js';
4
- export { personaEmail, personaEmails, } from './persona-email.js';
4
+ export { personaEmail, personaEmails } from './persona-email.js';
5
5
  /**
6
6
  * Signing in as a persona and talking to a stage over HTTP.
7
7
  *
@@ -105,6 +105,18 @@ export type CorePersona = {
105
105
  * into a flaky suite.
106
106
  */
107
107
  runnable?: boolean;
108
+ /**
109
+ * The app this person signs into, when the product is more than one frontend.
110
+ *
111
+ * A person uses one of them — staff their app, customers theirs — and that is
112
+ * what decides where a browser step navigates: `/dashboard` is a different
113
+ * page in each, so the actor settles which one without the scenario saying.
114
+ * The runner takes the base url per app (`--app-url <app>=<url>`, or
115
+ * `appUrls` on the environment) and each actor browses against its own.
116
+ *
117
+ * Omitted is the normal case: one app, one url, nothing to say.
118
+ */
119
+ app?: string;
108
120
  };
109
121
  /** Personas to declare, keyed by id. */
110
122
  export type CorePersonas = Record<string, CorePersona>;
@@ -130,6 +142,8 @@ export type PersonaMeta = {
130
142
  /** Absent means "everywhere but production", which is resolved, not stored. */
131
143
  environments?: string[];
132
144
  runnable: boolean;
145
+ /** The app this person signs into; picks their base url on a browser run. */
146
+ app?: string;
133
147
  sourceFile?: string;
134
148
  };
135
149
  export type PersonaDefinitions = PersonaMeta[];
@@ -1,7 +1,7 @@
1
1
  import type { CommonWireMeta } from '../../types/core.types.js';
2
2
  import type { CorePikkuFunctionConfig } from '../../function/functions.types.js';
3
3
  import type { QueueConfigMapping } from './validate-worker-config.js';
4
- import type { Safe } from '../../secret-value.js';
4
+ import type { Safe } from '../../classification/secret-value.js';
5
5
  export interface PikkuWorkerConfig {
6
6
  name?: string;
7
7
  /** Total worker concurrency. */
@@ -1,4 +1,4 @@
1
- import type { Safe } from '../../secret-value.js';
1
+ import type { Safe } from '../../classification/secret-value.js';
2
2
  import type { Logger } from '../../services/logger.js';
3
3
  import type { SecretService } from '../../services/secret-service.js';
4
4
  import type { JobOptions, QueueJob, QueueService } from './queue.types.js';
@@ -1,8 +1,2 @@
1
1
  export { PikkuRPCService, rpcService, RPCNotFoundError, RemoteAddonConfigError, RemoteAddonRequestError, } from './rpc-runner.js';
2
- export { resolveRemoteAddonToken, RemoteAddonAuthError, } from './remote-addon-auth.js';
3
- export type { RemoteAddonAuthBinding } from './remote-addon-auth.js';
4
2
  export type { PikkuRPC, RPCMeta } from './rpc-types.js';
5
- export { wireAddon } from './wire-addon.js';
6
- export type { WireAddonConfig } from './wire-addon.js';
7
- export { wireRemoteAddon } from './wire-remote-addon.js';
8
- export type { WireRemoteAddonConfig, RemoteAddonAuth, } from './wire-remote-addon.js';
@@ -1,4 +1 @@
1
1
  export { PikkuRPCService, rpcService, RPCNotFoundError, RemoteAddonConfigError, RemoteAddonRequestError, } from './rpc-runner.js';
2
- export { resolveRemoteAddonToken, RemoteAddonAuthError, } from './remote-addon-auth.js';
3
- export { wireAddon } from './wire-addon.js';
4
- export { wireRemoteAddon } from './wire-remote-addon.js';
@@ -1,6 +1,6 @@
1
1
  import type { CoreServices, PikkuRawWire } from '../../types/core.types.js';
2
2
  import { PikkuError } from '../../errors/error-handler.js';
3
- import { type SecretValue } from '../../secret-value.js';
3
+ import { type SecretValue } from '../../classification/secret-value.js';
4
4
  export type RemoteAddonAuthBinding = {
5
5
  credentialId: string;
6
6
  } | {
@@ -1,5 +1,5 @@
1
1
  import { PikkuError, addError } from '../../errors/error-handler.js';
2
- import { isSecretValue } from '../../secret-value.js';
2
+ import { isSecretValue, } from '../../classification/secret-value.js';
3
3
  export class RemoteAddonAuthError extends PikkuError {
4
4
  namespace;
5
5
  constructor(namespace, detail) {
@@ -1,9 +1,9 @@
1
1
  import { runPikkuFunc } from '../../function/function-runner.js';
2
- import { addonInstanceForNamespace } from './addon-runner.js';
2
+ import { addonInstanceForNamespace } from '../addon/addon-runner.js';
3
3
  import { pikkuState } from '../../pikku-state.js';
4
4
  import { PikkuError, addError } from '../../errors/error-handler.js';
5
5
  import { parseVersionedId } from '../../version.js';
6
- import { resolveRemoteAddonToken } from './remote-addon-auth.js';
6
+ import { resolveRemoteAddonToken } from '../addon/remote-addon-auth.js';
7
7
  import { createAgentRPC } from '../agent/agent-rpc.js';
8
8
  /**
9
9
  * The session for a wire: read through `getSession` when a runner attached one,
@@ -1,4 +1,4 @@
1
- import type { CorePikkuMiddleware } from '../../types/core.types.js';
1
+ import type { CorePikkuMiddleware } from '../../middleware/middleware.types.js';
2
2
  export type WireAddonConfig = {
3
3
  name: string;
4
4
  package: string;
@@ -1,4 +1,5 @@
1
- import type { CoreUserSession, CorePikkuMiddleware, CommonWireMeta } from '../../types/core.types.js';
1
+ import type { CoreUserSession, CommonWireMeta } from '../../types/core.types.js';
2
+ import type { CorePikkuMiddleware } from '../../middleware/middleware.types.js';
2
3
  import type { CorePikkuFunctionConfig, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
3
4
  export type ScheduledTasksMeta<UserSession extends CoreUserSession = any> = Record<string, CommonWireMeta & {
4
5
  name: string;
@@ -1,3 +1,4 @@
1
1
  export { defineScope } from './define-scope.js';
2
2
  export { flattenScopeDefinitions, validateAndBuildScopeDefinitionsMeta, } from './validate-scope-definitions.js';
3
3
  export type { CoreScopes, CoreScopeNode, FlatScope, ScopeDefinitionMeta, ScopeDefinitionsMeta, ScopeDefinitions, ScopeNodeMeta, } from './scope.types.js';
4
+ export { hasScopes, verifyScopes } from '../../scopes.js';
@@ -1,2 +1,3 @@
1
1
  export { defineScope } from './define-scope.js';
2
2
  export { flattenScopeDefinitions, validateAndBuildScopeDefinitionsMeta, } from './validate-scope-definitions.js';
3
+ export { hasScopes, verifyScopes } from '../../scopes.js';
@@ -4,6 +4,15 @@ export type CoreSecret<T = unknown> = {
4
4
  description?: string;
5
5
  secretId: string;
6
6
  schema: T;
7
+ /**
8
+ * A secret is REQUIRED by default because `getSecret` throws when the value is
9
+ * missing — a deploy without it is a runtime failure waiting to happen, so the
10
+ * deploy gate refuses it. Mark a secret `optional` when absence is a supported
11
+ * state the app handles (a feature that simply stays off): the generated map
12
+ * emits it as an optional property and `getSecret` resolves `undefined`
13
+ * instead of throwing.
14
+ */
15
+ optional?: boolean;
7
16
  /**
8
17
  * Where a user goes to obtain this value — a provider's API-key page, a setup
9
18
  * guide, an internal runbook. Consoles and deploy UIs surface it beside a
@@ -36,6 +45,7 @@ export type SecretDefinitionMeta = {
36
45
  description?: string;
37
46
  secretId: string;
38
47
  schema?: Record<string, unknown> | string;
48
+ optional?: boolean;
39
49
  docsUrl?: string;
40
50
  oauth2?: OAuth2CredentialConfig;
41
51
  rotationPeriod?: string;
@@ -32,6 +32,7 @@ export function validateAndBuildSecretDefinitionsMeta(definitions, schemaLookup)
32
32
  description: def.description,
33
33
  secretId: def.secretId,
34
34
  schema: def.schema,
35
+ optional: def.optional,
35
36
  oauth2: def.oauth2,
36
37
  rotationPeriod: def.rotationPeriod,
37
38
  allowedHosts: def.allowedHosts,
@@ -49,6 +50,7 @@ export function validateAndBuildSecretDefinitionsMeta(definitions, schemaLookup)
49
50
  description: def.description,
50
51
  secretId: def.secretId,
51
52
  schema: def.schema,
53
+ optional: def.optional,
52
54
  oauth2: def.oauth2,
53
55
  rotationPeriod: def.rotationPeriod,
54
56
  allowedHosts: def.allowedHosts,
@@ -24,6 +24,7 @@ export function validateAndBuildVariableDefinitionsMeta(definitions, schemaLooku
24
24
  description: def.description,
25
25
  variableId: def.variableId,
26
26
  schema: def.schema,
27
+ required: def.required,
27
28
  docsUrl: def.docsUrl,
28
29
  sourceFile: def.sourceFile,
29
30
  };
@@ -38,6 +39,7 @@ export function validateAndBuildVariableDefinitionsMeta(definitions, schemaLooku
38
39
  description: def.description,
39
40
  variableId: def.variableId,
40
41
  schema: def.schema,
42
+ required: def.required,
41
43
  docsUrl: def.docsUrl,
42
44
  sourceFile: def.sourceFile,
43
45
  };
@@ -4,6 +4,14 @@ export type CoreVariable<T = unknown> = {
4
4
  description?: string;
5
5
  variableId: string;
6
6
  schema: T;
7
+ /**
8
+ * A variable is OPTIONAL by default because `variables.get` returns
9
+ * `T | undefined` and never throws — every caller already handles absence, so
10
+ * a deploy gate that blocks on one contradicts the API. Mark a variable
11
+ * `required` for the few whose absence genuinely breaks the app; only those
12
+ * block a deploy.
13
+ */
14
+ required?: boolean;
7
15
  docsUrl?: string;
8
16
  };
9
17
  export type VariableDefinitionMeta = {
@@ -12,6 +20,7 @@ export type VariableDefinitionMeta = {
12
20
  description?: string;
13
21
  variableId: string;
14
22
  schema?: Record<string, unknown> | string;
23
+ required?: boolean;
15
24
  docsUrl?: string;
16
25
  sourceFile?: string;
17
26
  };
@@ -24,6 +24,6 @@ export type { VirtualUserRunOutcome, VirtualUserRunRecord, VirtualUserRunStart,
24
24
  export { DISPOSITIONS, dispositionProfile, type DispositionProfile, type VirtualUserTuning, } from './virtual-user-dispositions.js';
25
25
  export { catalogueClassification, catalogueLookup, isReadOnly, reachableCatalogue, unreachableCatalogue, } from './virtual-user-catalogue.js';
26
26
  export { type AgentReachability, type ReachableAgent, } from './virtual-user-agents.js';
27
- export { IntentStack, intentsForPersona, } from './virtual-user-intents.js';
27
+ export { IntentStack, intentsForPersona } from './virtual-user-intents.js';
28
28
  export { deriveCatalogue, deriveIntents, type SchemaMap, } from './virtual-user-derive.js';
29
29
  export { personaVirtualUserTarget, type PersonaTargetOptions, } from './virtual-user-target.js';
@@ -3,6 +3,6 @@ export { runVirtualUser, } from './run-virtual-user.js';
3
3
  export { personaScopes, prepareVirtualUserRun, } from './prepare-virtual-user-run.js';
4
4
  export { DISPOSITIONS, dispositionProfile, } from './virtual-user-dispositions.js';
5
5
  export { catalogueClassification, catalogueLookup, isReadOnly, reachableCatalogue, unreachableCatalogue, } from './virtual-user-catalogue.js';
6
- export { IntentStack, intentsForPersona, } from './virtual-user-intents.js';
6
+ export { IntentStack, intentsForPersona } from './virtual-user-intents.js';
7
7
  export { deriveCatalogue, deriveIntents, } from './virtual-user-derive.js';
8
8
  export { personaVirtualUserTarget, } from './virtual-user-target.js';
@@ -1,4 +1,4 @@
1
- import type { FunctionsMeta } from '../../types/core.types.js';
1
+ import type { FunctionsMeta } from '../../function/function-meta.types.js';
2
2
  import type { WorkflowsMeta } from '../workflow/workflow.types.js';
3
3
  import type { SystemRoleDefinitions, SystemRoleDefinitionsMeta } from '../role/role.types.js';
4
4
  import { type SchemaMap } from './virtual-user-derive.js';
@@ -1,4 +1,4 @@
1
- import type { FunctionsMeta } from '../../types/core.types.js';
1
+ import type { FunctionsMeta } from '../../function/function-meta.types.js';
2
2
  import type { WorkflowsMeta } from '../workflow/workflow.types.js';
3
3
  import type { ApiCatalogueEntry, IntentSource } from './virtual-user.types.js';
4
4
  /** A generated JSON schema, keyed by the name the function meta refers to. */
@@ -1,4 +1,4 @@
1
- import type { GraphNodeConfig, NextConfig, RefValue } from './workflow-graph.types.js';
1
+ import type { ForEachConfig, ForEachMode, GraphNodeConfig, ItemFn, NextConfig, RefValue, TemplateFn } from './workflow-graph.types.js';
2
2
  export interface RPCHandler<I = any, O = any> {
3
3
  input: I;
4
4
  output: O;
@@ -19,7 +19,14 @@ export declare function createGraph<RPCMap extends Record<string, RPCHandler>>()
19
19
  type GraphNodeConfigMap<FuncMap extends Record<string, string>, RPCMap extends Record<string, RPCHandler>> = {
20
20
  [K in Extract<keyof FuncMap, string>]?: {
21
21
  next?: NextConfig<Extract<keyof FuncMap, string>>;
22
- input?: (ref: <N extends Extract<keyof FuncMap, string>, P extends keyof ComputeNodeOutputs<FuncMap, RPCMap>[N] & string>(nodeId: N, path: P) => TypedRef<ComputeNodeOutputs<FuncMap, RPCMap>[N][P]>) => InputWithRefs<ComputeNodeInputs<FuncMap, RPCMap>[K]>;
22
+ /**
23
+ * Run this node once per element of an upstream array. The node's own
24
+ * result becomes the ordered array of per-item results.
25
+ */
26
+ forEach?: ForEachConfig<Extract<keyof FuncMap, string>>;
27
+ /** How the per-item instances run. Defaults to 'parallel'. */
28
+ mode?: ForEachMode;
29
+ input?: (ref: <N extends Extract<keyof FuncMap, string>, P extends keyof ComputeNodeOutputs<FuncMap, RPCMap>[N] & string>(nodeId: N, path: P) => TypedRef<ComputeNodeOutputs<FuncMap, RPCMap>[N][P]>, template: TemplateFn, $item: ItemFn) => InputWithRefs<ComputeNodeInputs<FuncMap, RPCMap>[K]>;
23
30
  onError?: Extract<keyof FuncMap, string> | Extract<keyof FuncMap, string>[];
24
31
  retries?: number;
25
32
  retryDelay?: string | number;
@@ -16,6 +16,8 @@ export function createGraph() {
16
16
  for (const [nodeId, def] of Object.entries(nodes)) {
17
17
  result[nodeId] = {
18
18
  func: funcMap[nodeId],
19
+ forEach: def?.forEach,
20
+ mode: def?.mode,
19
21
  input: def?.input,
20
22
  next: def?.next,
21
23
  onError: def?.onError,
@@ -7,6 +7,7 @@ export declare class ChildWorkflowStartedException extends Error {
7
7
  name: string;
8
8
  constructor(parentRunId: string, stepId: string, childRunId: string);
9
9
  }
10
+ export declare function stripInstanceOrdinal(name: string): string;
10
11
  export declare function continueGraph(workflowService: PikkuWorkflowService, runId: string, graphName: string, overrideMeta?: WorkflowRuntimeMeta): Promise<void>;
11
12
  export declare function executeGraphStep(workflowService: PikkuWorkflowService, rpcService: any, runId: string, stepId: string, nodeId: string, rpcName: string, data: any, graphName: string): Promise<any>;
12
13
  export declare function runFromMeta(workflowService: PikkuWorkflowService, runId: string, meta: WorkflowRuntimeMeta, _rpcService: any): Promise<void>;