@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
@@ -1,5 +1,7 @@
1
1
  import type { CorePermissionGroup, CorePikkuPermission } from '../../function/functions.types.js';
2
- import type { CorePikkuMiddleware, MiddlewareMetadata, PermissionMetadata } from '../../types/core.types.js';
2
+ import type { CorePikkuMiddleware, MiddlewareMetadata } from '../../middleware/middleware.types.js';
3
+ import type { CoreSingletonServices } from '../../types/core.types.js';
4
+ import type { PermissionMetadata } from '../../function/function-meta.types.js';
3
5
  import type { AIProviderOptions } from '../../services/agent-runner-service.js';
4
6
  import type { PikkuChannel } from '../channel/channel.types.js';
5
7
  import type { CorePikkuChannelMiddleware } from '../channel/channel.types.js';
@@ -168,8 +170,8 @@ export interface AgentToolDef extends Partial<ApprovalPolicy> {
168
170
  */
169
171
  forwardsApproval?: boolean;
170
172
  }
171
- export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown> = Record<string, unknown>, Services = any> {
172
- modifyInput?: (services: Services, ctx: {
173
+ export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown> = Record<string, unknown>, SingletonServices extends CoreSingletonServices = CoreSingletonServices> {
174
+ modifyInput?: (services: SingletonServices, ctx: {
173
175
  messages: AgentMessage[];
174
176
  instructions: string;
175
177
  /**
@@ -196,7 +198,7 @@ export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown>
196
198
  messages: AgentMessage[];
197
199
  instructions: string;
198
200
  };
199
- modifyOutputStream?: (services: Services, ctx: {
201
+ modifyOutputStream?: (services: SingletonServices, ctx: {
200
202
  event: AgentStreamEvent;
201
203
  allEvents: readonly AgentStreamEvent[];
202
204
  /** Private to this middleware, for this run. Cross-middleware facts go in `shared`. */
@@ -240,7 +242,7 @@ export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown>
240
242
  * and handed to anything that grades the run, and scrubbing the reply alone
241
243
  * leaves them untouched.
242
244
  */
243
- modifyOutput?: (services: Services, ctx: {
245
+ modifyOutput?: (services: SingletonServices, ctx: {
244
246
  text: string;
245
247
  messages: AgentMessage[];
246
248
  usage: {
@@ -257,7 +259,7 @@ export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown>
257
259
  messages: AgentMessage[];
258
260
  toolCalls?: NonNullable<AgentStep['toolCalls']>;
259
261
  };
260
- beforeToolCall?: (services: Services, ctx: {
262
+ beforeToolCall?: (services: SingletonServices, ctx: {
261
263
  toolName: string;
262
264
  toolCallId: string;
263
265
  args: Record<string, unknown>;
@@ -266,7 +268,7 @@ export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown>
266
268
  } | void> | {
267
269
  args: Record<string, unknown>;
268
270
  } | void;
269
- afterToolCall?: (services: Services, ctx: {
271
+ afterToolCall?: (services: SingletonServices, ctx: {
270
272
  toolName: string;
271
273
  toolCallId: string;
272
274
  args: Record<string, unknown>;
@@ -277,7 +279,7 @@ export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown>
277
279
  } | void> | {
278
280
  result: unknown;
279
281
  } | void;
280
- afterStep?: (services: Services, ctx: {
282
+ afterStep?: (services: SingletonServices, ctx: {
281
283
  stepNumber: number;
282
284
  text: string;
283
285
  toolCalls: {
@@ -298,7 +300,7 @@ export interface PikkuAgentMiddlewareHooks<State extends Record<string, unknown>
298
300
  };
299
301
  finishReason: string;
300
302
  }) => Promise<void> | void;
301
- onError?: (services: Services, ctx: {
303
+ onError?: (services: SingletonServices, ctx: {
302
304
  error: Error;
303
305
  stepNumber: number;
304
306
  messages: AgentMessage[];
@@ -389,7 +391,7 @@ export type CoreAgent<PikkuPermission = CorePikkuPermission<any, any>, PikkuMidd
389
391
  * which OR together, a scope can only narrow access.
390
392
  *
391
393
  * Narrowed to the generated `ScopeId` union in a project's own
392
- * `pikku-types.gen.ts`, so an undeclared scope is a compile error.
394
+ * `#pikku/scopes`, so an undeclared scope is a compile error.
393
395
  */
394
396
  scopes?: Scope[];
395
397
  permissions?: CorePermissionGroup<PikkuPermission>;
@@ -4,7 +4,7 @@ export { runAgent, resumeAgentSync } from './agent-runner.js';
4
4
  export { resolveModelAlias } from './agent-model-config.js';
5
5
  export { streamAgent, resumeAgent, interruptAgent } from './agent-stream.js';
6
6
  export { voiceInput, NoSpeechDetectedError, SPOKEN_TURN, SPOKEN_TRANSCRIPT, } from './voice-input.js';
7
- export { voiceOutput, unspeakableScripts, voiceForText, type SpeakableScripts, } from './voice-output.js';
7
+ export { voiceOutput, unspeakableScripts, voiceForText, type SpeakableScripts, type VoiceOutputState, } from './voice-output.js';
8
8
  export { AgentInterruptedError, signalRunInterrupt } from './agent-interrupt.js';
9
9
  export type { AgentInterruption, AgentInterruptResult, InterruptibleRunHandle, } from './agent-interrupt.js';
10
10
  export { type RunAgentParams, type StreamAgentOptions, ToolApprovalRequired, ToolCredentialRequired, canAccessThread, isOwnedByPrincipal, threadOwnerConstraint, } from './agent-prepare.js';
@@ -1,4 +1,4 @@
1
- import { pikkuAgentMiddleware } from '../../types/core.types.js';
1
+ import { pikkuAgentMiddleware } from '../../middleware/middleware-factories.js';
2
2
  import { safeFetch } from '../../utils/safe-fetch.js';
3
3
  function base64ToUint8Array(base64) {
4
4
  const binary = atob(base64);
@@ -1,4 +1,4 @@
1
- import { pikkuAgentMiddleware } from '../../types/core.types.js';
1
+ import { pikkuAgentMiddleware } from '../../middleware/middleware-factories.js';
2
2
  import { SPOKEN_TURN } from './voice-input.js';
3
3
  function bufferToBase64(data) {
4
4
  let binary = '';
@@ -5,6 +5,19 @@ import type { PikkuAgentScorer, ScorerInput, ScorerJudgeConfig, ScorerOutput } f
5
5
  *
6
6
  * A reference-based judge is shown the answer key; a reference-free one is not,
7
7
  * and grades the answer on its own merits.
8
+ *
9
+ * The tool calls are shown because without them a judge cannot tell a fact from
10
+ * a fabrication. Grading a todo agent that had just listed the user's todos
11
+ * correctly, a judge given only the answer called it "a plausible-looking list"
12
+ * that "offers no real access to your actual list, making it effectively a
13
+ * guess", and scored 0.2 what it scored 1 on other runs — right by its rubric,
14
+ * on the evidence it was given, and wrong about the run. An agent that answers
15
+ * from a tool and one that invents the same sentence are indistinguishable in
16
+ * the output alone; they differ only in what the run did to get there.
17
+ *
18
+ * How much of that to show is `judge.toolCalls`, and the default stops at the
19
+ * names: the 0.2 was the judge doubting the run had any access, and a name
20
+ * settles that without handing a third-party model the rows.
8
21
  */
9
22
  export declare const buildJudgePrompt: (judge: ScorerJudgeConfig, input: ScorerInput) => string;
10
23
  /**
@@ -16,11 +16,59 @@ const JUDGE_OUTPUT_SCHEMA = {
16
16
  required: ['score', 'reason'],
17
17
  additionalProperties: false,
18
18
  };
19
+ /**
20
+ * The default disclosure: which tools ran and which failed, and nothing about
21
+ * what went in or came back. A judge that can see a run reached `listTodos`
22
+ * can tell a retrieved list from an invented one, which is the whole of what
23
+ * the trajectory is needed for — the rows themselves it does not need, and an
24
+ * error string is a tool's own words about the caller's data, so it is
25
+ * summarised rather than quoted.
26
+ */
27
+ const describeToolCallName = (call) => `- ${call.name}${call.error ? ' (failed)' : ''}`;
28
+ /** Everything about a call, for a judge that grades against what came back. */
29
+ const describeToolCall = (call) => {
30
+ const outcome = call.error
31
+ ? `failed: ${call.error}`
32
+ : `returned ${formatToolValue(call.result)}`;
33
+ return `- ${call.name}(${formatToolValue(call.args)}) ${outcome}`;
34
+ };
35
+ /**
36
+ * A tool's arguments and result are arbitrary JSON, and some of it is large —
37
+ * a listing, a document, a page of search results. Truncating keeps a single
38
+ * fat call from crowding the answer out of the judge's context; what survives
39
+ * is the head, which is where the shape of a value is.
40
+ */
41
+ const TOOL_VALUE_LIMIT = 500;
42
+ const formatToolValue = (value) => {
43
+ if (value === undefined) {
44
+ return 'nothing';
45
+ }
46
+ const text = typeof value === 'string' ? value : JSON.stringify(value);
47
+ if (text === undefined) {
48
+ return 'nothing';
49
+ }
50
+ return text.length > TOOL_VALUE_LIMIT
51
+ ? `${text.slice(0, TOOL_VALUE_LIMIT)}… (truncated)`
52
+ : text;
53
+ };
19
54
  /**
20
55
  * The message a judge grades when its scorer supplies no `prompt`.
21
56
  *
22
57
  * A reference-based judge is shown the answer key; a reference-free one is not,
23
58
  * and grades the answer on its own merits.
59
+ *
60
+ * The tool calls are shown because without them a judge cannot tell a fact from
61
+ * a fabrication. Grading a todo agent that had just listed the user's todos
62
+ * correctly, a judge given only the answer called it "a plausible-looking list"
63
+ * that "offers no real access to your actual list, making it effectively a
64
+ * guess", and scored 0.2 what it scored 1 on other runs — right by its rubric,
65
+ * on the evidence it was given, and wrong about the run. An agent that answers
66
+ * from a tool and one that invents the same sentence are indistinguishable in
67
+ * the output alone; they differ only in what the run did to get there.
68
+ *
69
+ * How much of that to show is `judge.toolCalls`, and the default stops at the
70
+ * names: the 0.2 was the judge doubting the run had any access, and a name
71
+ * settles that without handing a third-party model the rows.
24
72
  */
25
73
  export const buildJudgePrompt = (judge, input) => {
26
74
  if (judge.prompt)
@@ -30,6 +78,10 @@ export const buildJudgePrompt = (judge, input) => {
30
78
  sections.push(`Reference answer:\n${input.reference}`);
31
79
  }
32
80
  sections.push(`Assistant answered:\n${input.output}`);
81
+ if (judge.toolCalls !== 'off' && input.toolCalls.length > 0) {
82
+ const describe = judge.toolCalls === 'full' ? describeToolCall : describeToolCallName;
83
+ sections.push(`Tools the assistant ran:\n${input.toolCalls.map(describe).join('\n')}`);
84
+ }
33
85
  sections.push(judge.goal);
34
86
  sections.push('Respond with a score 0..1 and a brief reason.');
35
87
  return sections.join('\n\n');
@@ -1,4 +1,4 @@
1
- import type { PikkuAgentScorer, ScorerInput, ScorerOutput } from './agent-scorer.types.js';
1
+ import type { JudgeToolCallDisclosure, PikkuAgentScorer, ScorerInput, ScorerOutput } from './agent-scorer.types.js';
2
2
  /**
3
3
  * A heuristic scorer: pure code over the finished run, no model call, so it
4
4
  * grades on the fast lane.
@@ -35,5 +35,11 @@ export declare const pikkuAgentJudge: <Services = any>(config: {
35
35
  requiresReference?: boolean;
36
36
  model: string;
37
37
  goal: string;
38
+ /**
39
+ * How much of the run's trajectory to disclose to the judge. Defaults to
40
+ * `names`: enough to tell a tool-backed answer from an invented one, without
41
+ * sending a third-party model the rows the tools returned.
42
+ */
43
+ toolCalls?: JudgeToolCallDisclosure;
38
44
  prompt?: (input: ScorerInput) => string;
39
45
  }) => PikkuAgentScorer<Services>;
@@ -35,6 +35,7 @@ export const pikkuAgentJudge = (config) => ({
35
35
  judge: {
36
36
  model: config.model,
37
37
  goal: config.goal,
38
+ toolCalls: config.toolCalls ?? 'names',
38
39
  ...(config.prompt ? { prompt: config.prompt } : {}),
39
40
  },
40
41
  });
@@ -43,6 +43,24 @@ export interface ScorerOutput {
43
43
  */
44
44
  export type ScorerLane = 'fast' | 'slow';
45
45
  export declare const SCORER_LANE_QUEUES: Record<ScorerLane, string>;
46
+ /**
47
+ * How much of the run's trajectory the default judge prompt discloses.
48
+ *
49
+ * A judge is a third-party model, and a tool's arguments and results are the
50
+ * most sensitive thing a run touches — the row it read, the address it looked
51
+ * up, the message it sent. Output middleware has already had its pass by the
52
+ * time a scorer sees any of this, so what a judge is shown is what was stored;
53
+ * this is the second gate, for a judge that should be told less than the
54
+ * database was.
55
+ *
56
+ * - `names` — which tools ran, and whether each failed. No arguments, no
57
+ * results. Enough to tell an answer backed by a tool from an invented one,
58
+ * which is the failure this exists to catch, while disclosing no row data.
59
+ * - `full` — names, arguments and results, truncated. For a judge that must
60
+ * check the answer *against* what the tool returned.
61
+ * - `off` — no trajectory at all. The judge grades the answer alone.
62
+ */
63
+ export type JudgeToolCallDisclosure = 'off' | 'names' | 'full';
46
64
  /**
47
65
  * A judge's model call. Present only on a scorer built with `pikkuAgentJudge`;
48
66
  * `score` is present only on one built with `pikkuAgentScorer`. Exactly one of the
@@ -51,6 +69,8 @@ export declare const SCORER_LANE_QUEUES: Record<ScorerLane, string>;
51
69
  export type ScorerJudgeConfig = {
52
70
  model: string;
53
71
  goal: string;
72
+ /** Always set: `pikkuAgentJudge` resolves the default. */
73
+ toolCalls: JudgeToolCallDisclosure;
54
74
  prompt?: (input: ScorerInput) => string;
55
75
  };
56
76
  export type PikkuAgentScorer<Services = any> = {
@@ -3,4 +3,4 @@ export { addAgentScorer, getAgentScorers, getAgentScorersMeta, } from './agent-s
3
3
  export { gradeRun } from './agent-scorer-grade.js';
4
4
  export { enableScoreSnapshots, getScoreSnapshot, } from './agent-scorer-snapshots.js';
5
5
  export { wireAgentScorerQueueWorkers } from './agent-scorer-worker.js';
6
- export type { AgentRunScore, PikkuAgentScorer, ScoreJob, ScorerInput, ScorerJudgeConfig, ScorerLane, ScorerMeta, ScorerOutput, } from './agent-scorer.types.js';
6
+ export type { AgentRunScore, JudgeToolCallDisclosure, PikkuAgentScorer, ScoreJob, ScorerInput, ScorerJudgeConfig, ScorerLane, ScorerMeta, ScorerOutput, } from './agent-scorer.types.js';
@@ -1,4 +1,5 @@
1
- import type { CoreSingletonServices, MiddlewareMetadata } from '../../types/core.types.js';
1
+ import type { CoreSingletonServices } from '../../types/core.types.js';
2
+ import type { MiddlewareMetadata } from '../../middleware/middleware.types.js';
2
3
  import type { CoreChannel, ChannelMessageMeta } from './channel.types.js';
3
4
  import { type PikkuSessionService } from '../../services/user-session-service.js';
4
5
  export declare const runChannelLifecycleWithMiddleware: ({ channelConfig, meta, lifecycleConfig, lifecycleType, services, channel, data, channelMiddlewareMeta, userSession, }: {
@@ -1,4 +1,5 @@
1
- import type { CoreSingletonServices, MiddlewareMetadata, PikkuRawWire } from '../../types/core.types.js';
1
+ import type { CoreSingletonServices, PikkuRawWire } from '../../types/core.types.js';
2
+ import type { MiddlewareMetadata } from '../../middleware/middleware.types.js';
2
3
  import type { CorePikkuChannelMiddleware } from './channel.types.js';
3
4
  export declare const addChannelMiddleware: (tag: string, middleware: CorePikkuChannelMiddleware[], packageName?: string | null) => CorePikkuChannelMiddleware[];
4
5
  export declare const clearChannelMiddlewareCache: () => void;
@@ -1,5 +1,5 @@
1
1
  import type { HTTPFunctionMetaInputTypes, PikkuHTTPRequest, PikkuHTTPResponse } from '../http/http.types.js';
2
- import type { CorePikkuMiddleware, MiddlewareMetadata } from '../../types/core.types.js';
2
+ import type { CorePikkuMiddleware, MiddlewareMetadata } from '../../middleware/middleware.types.js';
3
3
  export type BinaryData = ArrayBuffer | Uint8Array;
4
4
  export type CorePikkuChannelMiddleware<Services = any, Event = unknown> = (services: Services, event: Event, next: (event: Event | Event[] | null) => Promise<void> | void) => Promise<void> | void;
5
5
  export type CorePikkuChannelMiddlewareFactory<In = any, Services = any, Event = unknown> = (input: In) => CorePikkuChannelMiddleware<Services, Event>;
@@ -1 +1,2 @@
1
1
  export { runChannelConnect, runChannelDisconnect, runChannelMessage, } from './serverless-channel-runner.js';
2
+ export type { RunServerlessChannelParams } from './serverless-channel-runner.js';
@@ -2,5 +2,5 @@ export { executeCLIViaChannel } from './cli-channel-runner.js';
2
2
  export { handleRawCLI } from './cli-raw-channel-runner.js';
3
3
  export type { RawCLIFrame, RawCLIResult } from './cli-raw-channel-runner.js';
4
4
  export { executeRawCLIViaChannel } from './cli-raw-client-runner.js';
5
- export type { CorePikkuCLIClientRender, } from './cli-raw-client-runner.js';
5
+ export type { CorePikkuCLIClientRender } from './cli-raw-client-runner.js';
6
6
  export type { ApprovalMode } from './cli-approval.js';
@@ -1,4 +1,5 @@
1
- import type { CorePikkuMiddleware, CoreUserSession } from '../../types/core.types.js';
1
+ import type { CoreUserSession } from '../../types/core.types.js';
2
+ import type { CorePikkuMiddleware } from '../../middleware/middleware.types.js';
2
3
  import type { CoreCLI, CorePikkuCLIRender, CoreCLICommandConfig } from './cli.types.js';
3
4
  import type { CoreSingletonServices, CoreServices, CreateWireServices, CreateConfig, CreateSingletonServices } from '../../types/core.types.js';
4
5
  import type { PikkuChannel } from '../channel/channel.types.js';
@@ -303,8 +303,11 @@ export async function executeCLI({ programName, args, createConfig, createSingle
303
303
  }
304
304
  }
305
305
  const data = { ...parsed.positionals, ...parsed.options };
306
+ // The command path is passed through so a config factory can tell which
307
+ // command is about to run. Some commands are meant to work outside a
308
+ // project, and cannot be gated behind loading that project's config.
306
309
  const config = createConfig
307
- ? await createConfig(new LocalVariablesService(), data)
310
+ ? await createConfig(new LocalVariablesService(), data, parsed.commandPath)
308
311
  : {};
309
312
  const singletonServices = await createSingletonServices(config);
310
313
  pikkuState(null, 'package', 'singletonServices', singletonServices);
@@ -1,15 +1,27 @@
1
- import type { CorePikkuMiddleware, CoreSingletonServices, CoreUserSession, CoreServices, MiddlewareMetadata } from '../../types/core.types.js';
1
+ import type { CoreSingletonServices, CoreUserSession, CoreServices } from '../../types/core.types.js';
2
+ import type { CorePikkuMiddleware, MiddlewareMetadata } from '../../middleware/middleware.types.js';
2
3
  import type { CorePikkuFunctionConfig, CorePikkuPermission, CorePikkuFunction, CorePikkuFunctionSessionless } from '../../function/functions.types.js';
3
4
  import type { ChannelRemote, PikkuChannel } from '../channel/channel.types.js';
5
+ /**
6
+ * The shape an option's value is parsed into. `'string[]'` splits a single
7
+ * value on commas; `'boolean'` is a flag that consumes the next token only
8
+ * when it is an explicit literal (`true`/`false`/`1`/`0`/`yes`/`no`); every
9
+ * other type consumes one token verbatim, so a value may start with `-`. Left
10
+ * unset — which is the usual case — it is read from the command function's
11
+ * input schema, then from `default`, and otherwise falls back to `'string'`.
12
+ * Declare it only where neither can say: an option belonging to no function
13
+ * input, such as one the config factory reads straight off the CLI data.
14
+ */
15
+ export type CLIOptionType = 'string' | 'number' | 'boolean' | 'string[]';
4
16
  /**
5
17
  * CLI option definition
6
18
  */
7
19
  export interface CLIOption<T = any> {
8
20
  description: string;
9
21
  short?: string;
22
+ type?: CLIOptionType;
10
23
  default?: T;
11
24
  choices?: T[];
12
- array?: boolean;
13
25
  required?: boolean;
14
26
  }
15
27
  /**
@@ -149,7 +161,14 @@ export type CoreCLICommandConfig<FuncConfig, PikkuMiddleware extends CorePikkuMi
149
161
  [K in keyof ExtractFunctionInput<FuncConfig>]?: {
150
162
  description?: string;
151
163
  short?: string;
164
+ type?: CLIOptionType;
152
165
  default?: ExtractFunctionInput<FuncConfig>[K];
166
+ /**
167
+ * The values this option accepts. Rejected by the parser and listed in
168
+ * `--help`, so a flag with a fixed vocabulary says so once rather than
169
+ * repeating itself in its description.
170
+ */
171
+ choices?: ReadonlyArray<ExtractFunctionInput<FuncConfig>[K]>;
153
172
  };
154
173
  };
155
174
  middleware?: PikkuMiddleware[];
@@ -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)) {