@pikku/core 0.12.83 → 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 (661) hide show
  1. package/CHANGELOG.md +492 -0
  2. package/README.md +1 -1
  3. package/dist/bootstrap-compat/root.d.ts +20 -0
  4. package/dist/classification/column-form.d.ts +32 -0
  5. package/dist/classification/column-form.js +42 -0
  6. package/dist/classification/data-classification.d.ts +64 -0
  7. package/dist/classification/index.d.ts +13 -0
  8. package/dist/classification/index.js +2 -0
  9. package/dist/classification/secret-value.d.ts +56 -0
  10. package/dist/classification/secret-value.js +46 -0
  11. package/dist/crypto-utils.d.ts +1 -1
  12. package/dist/ecosystem/agent-scorer.d.ts +12 -0
  13. package/dist/ecosystem/agent-scorer.js +5 -0
  14. package/dist/ecosystem/agent.d.ts +21 -0
  15. package/dist/ecosystem/agent.js +6 -0
  16. package/dist/ecosystem/channel/local.d.ts +3 -0
  17. package/dist/ecosystem/channel/local.js +3 -0
  18. package/dist/ecosystem/channel/serverless.d.ts +9 -0
  19. package/dist/ecosystem/channel/serverless.js +1 -0
  20. package/dist/ecosystem/channel.d.ts +15 -0
  21. package/dist/ecosystem/channel.js +5 -0
  22. package/dist/ecosystem/cli/channel.d.ts +16 -0
  23. package/dist/ecosystem/cli/channel.js +2 -0
  24. package/dist/ecosystem/cli.d.ts +9 -0
  25. package/dist/ecosystem/cli.js +2 -0
  26. package/dist/ecosystem/credential.d.ts +10 -0
  27. package/dist/ecosystem/credential.js +1 -0
  28. package/dist/ecosystem/crypto-utils.d.ts +8 -0
  29. package/dist/ecosystem/crypto-utils.js +1 -0
  30. package/dist/ecosystem/dev.d.ts +9 -0
  31. package/dist/ecosystem/dev.js +2 -0
  32. package/dist/ecosystem/errors.d.ts +8 -0
  33. package/dist/ecosystem/errors.js +2 -0
  34. package/dist/ecosystem/function.d.ts +13 -0
  35. package/dist/ecosystem/function.js +2 -0
  36. package/dist/ecosystem/gateway.d.ts +1 -0
  37. package/dist/ecosystem/hmac.d.ts +1 -0
  38. package/dist/ecosystem/hmac.js +1 -0
  39. package/dist/ecosystem/http.d.ts +13 -0
  40. package/dist/ecosystem/http.js +5 -0
  41. package/dist/ecosystem/mcp.d.ts +3 -0
  42. package/dist/ecosystem/mcp.js +2 -0
  43. package/dist/ecosystem/middleware.d.ts +18 -0
  44. package/dist/ecosystem/middleware.js +7 -0
  45. package/dist/ecosystem/node-host-resolver.d.ts +1 -0
  46. package/dist/ecosystem/node-host-resolver.js +1 -0
  47. package/dist/ecosystem/node.d.ts +1 -0
  48. package/dist/ecosystem/oauth2.d.ts +1 -0
  49. package/dist/ecosystem/oauth2.js +1 -0
  50. package/dist/ecosystem/persona.d.ts +17 -0
  51. package/dist/ecosystem/persona.js +5 -0
  52. package/dist/ecosystem/queue.d.ts +13 -0
  53. package/dist/ecosystem/queue.js +4 -0
  54. package/dist/ecosystem/remote.d.ts +8 -0
  55. package/dist/ecosystem/remote.js +1 -0
  56. package/dist/ecosystem/role.d.ts +4 -0
  57. package/dist/ecosystem/role.js +2 -0
  58. package/dist/ecosystem/rpc.d.ts +6 -0
  59. package/dist/ecosystem/rpc.js +3 -0
  60. package/dist/ecosystem/safe-fetch.d.ts +7 -0
  61. package/dist/ecosystem/safe-fetch.js +1 -0
  62. package/dist/ecosystem/scenario.d.ts +21 -0
  63. package/dist/ecosystem/scenario.js +8 -0
  64. package/dist/ecosystem/scheduler.d.ts +3 -0
  65. package/dist/ecosystem/scheduler.js +2 -0
  66. package/dist/ecosystem/schema.d.ts +2 -0
  67. package/dist/ecosystem/schema.js +1 -0
  68. package/dist/ecosystem/scope.d.ts +5 -0
  69. package/dist/ecosystem/scope.js +3 -0
  70. package/dist/ecosystem/secret.d.ts +11 -0
  71. package/dist/ecosystem/secret.js +2 -0
  72. package/dist/ecosystem/services/istanbul-coverage.d.ts +1 -0
  73. package/dist/ecosystem/services/istanbul-coverage.js +1 -0
  74. package/dist/ecosystem/services/local-content-request-handler.d.ts +9 -0
  75. package/dist/ecosystem/services/local-content-request-handler.js +1 -0
  76. package/dist/ecosystem/services/local-content.d.ts +2 -0
  77. package/dist/ecosystem/services/local-content.js +1 -0
  78. package/dist/ecosystem/services/local-meta.d.ts +1 -0
  79. package/dist/ecosystem/services/local-meta.js +1 -0
  80. package/dist/ecosystem/services/v8-coverage.d.ts +1 -0
  81. package/dist/ecosystem/services/v8-coverage.js +1 -0
  82. package/dist/ecosystem/services.d.ts +36 -0
  83. package/dist/ecosystem/services.js +12 -0
  84. package/dist/ecosystem/testing.d.ts +7 -0
  85. package/dist/ecosystem/testing.js +1 -0
  86. package/dist/ecosystem/trigger.d.ts +2 -0
  87. package/dist/ecosystem/trigger.js +1 -0
  88. package/dist/ecosystem/types.d.ts +12 -0
  89. package/dist/ecosystem/types.js +6 -0
  90. package/dist/ecosystem/variable.d.ts +9 -0
  91. package/dist/ecosystem/variable.js +1 -0
  92. package/dist/ecosystem/virtual-user.d.ts +24 -0
  93. package/dist/ecosystem/virtual-user.js +8 -0
  94. package/dist/ecosystem/workflow.d.ts +20 -0
  95. package/dist/ecosystem/workflow.js +6 -0
  96. package/dist/errors/index.d.ts +8 -0
  97. package/dist/errors/index.js +1 -0
  98. package/dist/errors/serialized-error.d.ts +7 -0
  99. package/dist/errors/serialized-error.js +1 -0
  100. package/dist/function/function-meta.types.d.ts +139 -0
  101. package/dist/function/function-meta.types.js +1 -0
  102. package/dist/function/function-runner.d.ts +3 -2
  103. package/dist/function/function-runner.js +31 -11
  104. package/dist/function/functions.types.d.ts +10 -2
  105. package/dist/function/index.d.ts +8 -2
  106. package/dist/function/index.js +4 -1
  107. package/dist/function/pikku-request.d.ts +8 -0
  108. package/dist/function/pikku-request.js +15 -0
  109. package/dist/index.d.ts +8 -8
  110. package/dist/index.js +3 -3
  111. package/dist/middleware/auth-apikey.d.ts +2 -10
  112. package/dist/middleware/auth-apikey.js +1 -1
  113. package/dist/middleware/auth-bearer.d.ts +2 -10
  114. package/dist/middleware/auth-bearer.js +1 -1
  115. package/dist/middleware/auth-cookie.d.ts +2 -10
  116. package/dist/middleware/auth-cookie.js +1 -1
  117. package/dist/middleware/cors.d.ts +5 -11
  118. package/dist/middleware/cors.js +13 -6
  119. package/dist/middleware/index.d.ts +3 -0
  120. package/dist/middleware/index.js +1 -0
  121. package/dist/middleware/middleware-factories.d.ts +9 -0
  122. package/dist/middleware/middleware-factories.js +19 -0
  123. package/dist/middleware/middleware.types.d.ts +27 -0
  124. package/dist/middleware/middleware.types.js +1 -0
  125. package/dist/middleware/remote-auth.d.ts +1 -1
  126. package/dist/middleware/remote-auth.js +1 -1
  127. package/dist/middleware/telemetry.d.ts +4 -20
  128. package/dist/middleware/telemetry.js +1 -1
  129. package/dist/middleware-runner.d.ts +2 -1
  130. package/dist/pikku-state.d.ts +2 -1
  131. package/dist/services/{ai-run-state-service.d.ts → agent-run-state-service.d.ts} +5 -5
  132. package/dist/services/agent-run-state-service.js +1 -0
  133. package/dist/services/{ai-agent-runner-service.d.ts → agent-runner-service.d.ts} +12 -12
  134. package/dist/services/agent-runner-service.js +1 -0
  135. package/dist/services/{ai-storage-service.d.ts → agent-storage-service.d.ts} +7 -7
  136. package/dist/services/agent-storage-service.js +1 -0
  137. package/dist/services/audit-service.d.ts +1 -1
  138. package/dist/services/credential-wire-service.js +1 -1
  139. package/dist/services/email-service.d.ts +1 -1
  140. package/dist/services/file-scenario-run-store.d.ts +58 -0
  141. package/dist/services/file-scenario-run-store.js +214 -0
  142. package/dist/services/http-personas.d.ts +1 -1
  143. package/dist/services/http-personas.js +3 -3
  144. package/dist/services/{in-memory-ai-run-state-service.d.ts → in-memory-agent-run-state-service.d.ts} +5 -5
  145. package/dist/services/{in-memory-ai-run-state-service.js → in-memory-agent-run-state-service.js} +1 -1
  146. package/dist/services/in-memory-workflow-service.d.ts +1 -1
  147. package/dist/services/index.d.ts +9 -5
  148. package/dist/services/index.js +4 -1
  149. package/dist/services/local-secrets.d.ts +1 -1
  150. package/dist/services/local-secrets.js +1 -1
  151. package/dist/services/logger.d.ts +7 -7
  152. package/dist/services/meta-service.d.ts +5 -4
  153. package/dist/services/scoped-secret-service.d.ts +1 -1
  154. package/dist/services/secret-service.d.ts +1 -1
  155. package/dist/services/typed-secret-service.d.ts +16 -2
  156. package/dist/services/typed-secret-service.js +5 -0
  157. package/dist/services/webhook-service.d.ts +1 -1
  158. package/dist/services/workflow-service.d.ts +2 -1
  159. package/dist/testing/index.d.ts +1 -0
  160. package/dist/testing/index.js +1 -0
  161. package/dist/testing/service-tests/agent-run-service-tests.d.ts +1 -1
  162. package/dist/testing/service-tests/agent-run-service-tests.js +3 -3
  163. package/dist/testing/service-tests/agent-storage-service-tests.d.ts +3 -0
  164. package/dist/testing/service-tests/{ai-storage-service-tests.js → agent-storage-service-tests.js} +4 -4
  165. package/dist/testing/service-tests.d.ts +4 -4
  166. package/dist/testing/service-tests.js +4 -4
  167. package/dist/types/core.types.d.ts +37 -187
  168. package/dist/types/core.types.js +1 -19
  169. package/dist/types/index.d.ts +2 -0
  170. package/dist/types/index.js +1 -0
  171. package/dist/types/state.types.d.ts +8 -6
  172. package/dist/utils.d.ts +13 -0
  173. package/dist/utils.js +2 -0
  174. package/dist/wirings/actor-flow/run-conversation.d.ts +2 -2
  175. package/dist/wirings/addon/addon-runner.d.ts +17 -0
  176. package/dist/wirings/addon/addon-runner.js +150 -0
  177. package/dist/wirings/addon/index.d.ts +6 -0
  178. package/dist/wirings/addon/index.js +3 -0
  179. package/dist/wirings/addon/remote-addon-auth.d.ts +16 -0
  180. package/dist/wirings/addon/remote-addon-auth.js +39 -0
  181. package/dist/wirings/addon/wire-addon.d.ts +80 -0
  182. package/dist/wirings/addon/wire-addon.js +120 -0
  183. package/dist/wirings/addon/wire-remote-addon.d.ts +22 -0
  184. package/dist/wirings/addon/wire-remote-addon.js +11 -0
  185. package/dist/wirings/{ai-agent/ai-agent-agui.d.ts → agent/agent-agui.d.ts} +2 -2
  186. package/dist/wirings/{ai-agent/ai-agent-agui.js → agent/agent-agui.js} +1 -1
  187. package/dist/wirings/{ai-agent/ai-agent-finalize.d.ts → agent/agent-finalize.d.ts} +10 -10
  188. package/dist/wirings/{ai-agent/ai-agent-finalize.js → agent/agent-finalize.js} +7 -7
  189. package/dist/wirings/{ai-agent/ai-agent-helpers.d.ts → agent/agent-helpers.d.ts} +1 -1
  190. package/dist/wirings/{ai-agent/ai-agent-interrupt.d.ts → agent/agent-interrupt.d.ts} +4 -4
  191. package/dist/wirings/{ai-agent/ai-agent-interrupt.js → agent/agent-interrupt.js} +2 -2
  192. package/dist/wirings/{ai-agent/ai-agent-memory.d.ts → agent/agent-memory.d.ts} +14 -14
  193. package/dist/wirings/{ai-agent/ai-agent-memory.js → agent/agent-memory.js} +1 -1
  194. package/dist/wirings/{ai-agent/ai-agent-model-config.js → agent/agent-model-config.js} +1 -1
  195. package/dist/wirings/{ai-agent/ai-agent-prepare.d.ts → agent/agent-prepare.d.ts} +24 -24
  196. package/dist/wirings/{ai-agent/ai-agent-prepare.js → agent/agent-prepare.js} +17 -17
  197. package/dist/wirings/agent/agent-registry.d.ts +16 -0
  198. package/dist/wirings/{ai-agent/ai-agent-registry.js → agent/agent-registry.js} +9 -9
  199. package/dist/wirings/{ai-agent → agent}/agent-rpc.js +8 -8
  200. package/dist/wirings/agent/agent-runner.d.ts +7 -0
  201. package/dist/wirings/{ai-agent/ai-agent-runner.js → agent/agent-runner.js} +49 -50
  202. package/dist/wirings/{ai-agent/ai-agent-stream.d.ts → agent/agent-stream.d.ts} +15 -15
  203. package/dist/wirings/{ai-agent/ai-agent-stream.js → agent/agent-stream.js} +78 -78
  204. package/dist/wirings/{ai-agent/ai-agent-turn.d.ts → agent/agent-turn.d.ts} +5 -5
  205. package/dist/wirings/{ai-agent/ai-agent-turn.js → agent/agent-turn.js} +4 -4
  206. package/dist/wirings/agent/agent-utils.d.ts +14 -0
  207. package/dist/wirings/agent/agent-utils.js +17 -0
  208. package/dist/wirings/{ai-agent/ai-agent.types.d.ts → agent/agent.types.d.ts} +47 -46
  209. package/dist/wirings/agent/agent.types.js +1 -0
  210. package/dist/wirings/agent/index.d.ts +12 -0
  211. package/dist/wirings/agent/index.js +10 -0
  212. package/dist/wirings/{ai-agent → agent}/voice-input.d.ts +1 -1
  213. package/dist/wirings/{ai-agent → agent}/voice-input.js +5 -5
  214. package/dist/wirings/{ai-agent → agent}/voice-output.d.ts +2 -3
  215. package/dist/wirings/{ai-agent → agent}/voice-output.js +8 -8
  216. package/dist/wirings/{ai-scorer/ai-scorer-grade.d.ts → agent-scorer/agent-scorer-grade.d.ts} +3 -3
  217. package/dist/wirings/{ai-scorer/ai-scorer-grade.js → agent-scorer/agent-scorer-grade.js} +6 -6
  218. package/dist/wirings/agent-scorer/agent-scorer-judge.d.ts +30 -0
  219. package/dist/wirings/{ai-scorer/ai-scorer-judge.js → agent-scorer/agent-scorer-judge.js} +57 -5
  220. package/dist/wirings/{ai-scorer/ai-scorer-live.d.ts → agent-scorer/agent-scorer-live.d.ts} +1 -1
  221. package/dist/wirings/{ai-scorer/ai-scorer-live.js → agent-scorer/agent-scorer-live.js} +3 -3
  222. package/dist/wirings/{ai-scorer/ai-scorer-registry.d.ts → agent-scorer/agent-scorer-registry.d.ts} +6 -6
  223. package/dist/wirings/{ai-scorer/ai-scorer-registry.js → agent-scorer/agent-scorer-registry.js} +4 -4
  224. package/dist/wirings/{ai-scorer/ai-scorer-snapshots.d.ts → agent-scorer/agent-scorer-snapshots.d.ts} +1 -1
  225. package/dist/wirings/{ai-scorer/ai-scorer-worker.d.ts → agent-scorer/agent-scorer-worker.d.ts} +3 -3
  226. package/dist/wirings/{ai-scorer/ai-scorer-worker.js → agent-scorer/agent-scorer-worker.js} +9 -7
  227. package/dist/wirings/{ai-scorer/ai-scorer.d.ts → agent-scorer/agent-scorer.d.ts} +12 -6
  228. package/dist/wirings/{ai-scorer/ai-scorer.js → agent-scorer/agent-scorer.js} +4 -3
  229. package/dist/wirings/{ai-scorer/ai-scorer.types.d.ts → agent-scorer/agent-scorer.types.d.ts} +24 -4
  230. package/dist/wirings/agent-scorer/agent-scorer.types.js +4 -0
  231. package/dist/wirings/agent-scorer/index.d.ts +6 -0
  232. package/dist/wirings/agent-scorer/index.js +5 -0
  233. package/dist/wirings/channel/channel-common.d.ts +2 -1
  234. package/dist/wirings/channel/channel-middleware-runner.d.ts +2 -1
  235. package/dist/wirings/channel/channel-rpc.types.d.ts +2 -2
  236. package/dist/wirings/channel/channel.types.d.ts +1 -1
  237. package/dist/wirings/channel/serverless/index.d.ts +1 -0
  238. package/dist/wirings/cli/channel/index.d.ts +1 -1
  239. package/dist/wirings/cli/cli-runner.d.ts +2 -1
  240. package/dist/wirings/cli/cli-runner.js +4 -1
  241. package/dist/wirings/cli/cli.types.d.ts +21 -2
  242. package/dist/wirings/cli/command-parser.js +157 -23
  243. package/dist/wirings/gateway/gateway.types.d.ts +2 -1
  244. package/dist/wirings/http/http-runner.d.ts +1 -1
  245. package/dist/wirings/http/http-runner.js +1 -1
  246. package/dist/wirings/http/http.types.d.ts +2 -2
  247. package/dist/wirings/http/index.d.ts +1 -0
  248. package/dist/wirings/http/index.js +1 -0
  249. package/dist/wirings/http/pikku-fetch-http-request.js +1 -1
  250. package/dist/wirings/http/pikku-fetch-http-response.js +2 -2
  251. package/dist/wirings/mcp/mcp.types.d.ts +1 -1
  252. package/dist/wirings/persona/index.d.ts +1 -1
  253. package/dist/wirings/persona/index.js +1 -1
  254. package/dist/wirings/persona/persona.types.d.ts +14 -0
  255. package/dist/wirings/queue/queue.types.d.ts +1 -1
  256. package/dist/wirings/queue/signed-queue-service.d.ts +1 -1
  257. package/dist/wirings/rpc/index.d.ts +0 -6
  258. package/dist/wirings/rpc/index.js +0 -3
  259. package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -1
  260. package/dist/wirings/rpc/remote-addon-auth.js +1 -1
  261. package/dist/wirings/rpc/rpc-runner.d.ts +1 -1
  262. package/dist/wirings/rpc/rpc-runner.js +4 -4
  263. package/dist/wirings/rpc/rpc-types.d.ts +1 -1
  264. package/dist/wirings/rpc/wire-addon.d.ts +1 -1
  265. package/dist/wirings/scheduler/scheduler.types.d.ts +2 -1
  266. package/dist/wirings/scope/index.d.ts +1 -0
  267. package/dist/wirings/scope/index.js +1 -0
  268. package/dist/wirings/secret/secret.types.d.ts +10 -0
  269. package/dist/wirings/secret/validate-secret-definitions.js +2 -0
  270. package/dist/wirings/variable/validate-variable-definitions.js +2 -0
  271. package/dist/wirings/variable/variable.types.d.ts +9 -0
  272. package/dist/wirings/virtual-user/index.d.ts +1 -1
  273. package/dist/wirings/virtual-user/index.js +1 -1
  274. package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +1 -1
  275. package/dist/wirings/virtual-user/prepare-virtual-user-run.js +1 -1
  276. package/dist/wirings/virtual-user/virtual-user-agents.d.ts +1 -1
  277. package/dist/wirings/virtual-user/virtual-user-derive.d.ts +1 -1
  278. package/dist/wirings/workflow/graph/graph-node.d.ts +9 -2
  279. package/dist/wirings/workflow/graph/graph-node.js +2 -0
  280. package/dist/wirings/workflow/graph/graph-runner.d.ts +1 -0
  281. package/dist/wirings/workflow/graph/graph-runner.js +283 -31
  282. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +16 -1
  283. package/dist/wirings/workflow/index.d.ts +2 -0
  284. package/dist/wirings/workflow/index.js +1 -0
  285. package/dist/wirings/workflow/pikku-scenario-service.d.ts +14 -4
  286. package/dist/wirings/workflow/pikku-scenario-service.js +44 -16
  287. package/dist/wirings/workflow/pikku-workflow-service.d.ts +2 -1
  288. package/dist/wirings/workflow/pikku-workflow-service.js +3 -4
  289. package/dist/wirings/workflow/run-timeline.d.ts +2 -3
  290. package/dist/wirings/workflow/scenario-run.types.d.ts +171 -0
  291. package/dist/wirings/workflow/scenario-run.types.js +1 -0
  292. package/dist/wirings/workflow/scenario-step-guards.d.ts +1 -2
  293. package/dist/wirings/workflow/scenario-step-guards.js +0 -8
  294. package/dist/wirings/workflow/scenario-step.types.d.ts +27 -12
  295. package/dist/wirings/workflow/workflow-approval.js +2 -1
  296. package/dist/wirings/workflow/workflow-run-engine.types.d.ts +2 -1
  297. package/dist/wirings/workflow/workflow.types.d.ts +2 -1
  298. package/knowledge/decisions/index.md +2 -0
  299. package/knowledge/decisions/internals/{a-non-streaming-agent-run-registers-with-airunstate-too.md → a-non-streaming-agent-run-registers-with-agentrunstate-too.md} +6 -6
  300. package/knowledge/decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md +1 -1
  301. package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +1 -1
  302. package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +1 -1
  303. package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +2 -2
  304. package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +6 -6
  305. package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +1 -1
  306. package/knowledge/decisions/internals/actor-flow-drives-the-target-through-a-transport-seam.md +1 -1
  307. package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +1 -1
  308. package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +1 -1
  309. package/knowledge/decisions/internals/{ai-agent-agui-bridge-obeys-the-client-ordering-contract.md → agent-agui-bridge-obeys-the-client-ordering-contract.md} +5 -5
  310. package/knowledge/decisions/internals/{ai-agent-audio-chunks-carry-the-format-the-provider-returned.md → agent-audio-chunks-carry-the-format-the-provider-returned.md} +2 -2
  311. package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md +1 -1
  312. package/knowledge/decisions/internals/{ai-agent-credential-suspensions-hide-the-tool-result.md → agent-credential-suspensions-hide-the-tool-result.md} +2 -2
  313. package/knowledge/decisions/internals/{ai-agent-delegate-and-supervise-hide-different-text.md → agent-delegate-and-supervise-hide-different-text.md} +4 -4
  314. package/knowledge/decisions/internals/{ai-agent-llm-tool-arguments-have-nulls-stripped.md → agent-llm-tool-arguments-have-nulls-stripped.md} +3 -3
  315. package/knowledge/decisions/internals/{ai-agent-model-config-stays-a-single-resolution-seam.md → agent-model-config-stays-a-single-resolution-seam.md} +3 -3
  316. package/knowledge/decisions/internals/{ai-agent-onerror-hooks-cannot-change-the-failure.md → agent-onerror-hooks-cannot-change-the-failure.md} +6 -6
  317. package/knowledge/decisions/internals/{ai-agent-runner-methods-must-keep-their-receiver.md → agent-runner-methods-must-keep-their-receiver.md} +4 -4
  318. package/knowledge/decisions/internals/agent-speech-travels-as-a-custom-agui-event.md +1 -1
  319. package/knowledge/decisions/internals/{ai-agent-stream-persistence-is-best-effort.md → agent-stream-persistence-is-best-effort.md} +4 -4
  320. package/knowledge/decisions/internals/{ai-agent-sub-agents-inherit-the-parent-context-block.md → agent-sub-agents-inherit-the-parent-context-block.md} +3 -3
  321. package/knowledge/decisions/internals/{ai-agent-tool-execute-failures-are-logged-unconditionally.md → agent-tool-execute-failures-are-logged-unconditionally.md} +3 -3
  322. package/knowledge/decisions/internals/{ai-agent-voice-input-transcribes-audio-parts-in-place.md → agent-voice-input-transcribes-audio-parts-in-place.md} +2 -2
  323. package/knowledge/decisions/internals/{ai-agent-working-memory-is-persisted-only-when-valid.md → agent-working-memory-is-persisted-only-when-valid.md} +2 -2
  324. package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +1 -1
  325. package/knowledge/decisions/internals/an-agent-interrupt-is-not-a-failure.md +2 -2
  326. package/knowledge/decisions/internals/an-agent-run-owned-by-another-instance-says-so.md +3 -3
  327. package/knowledge/decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md +2 -2
  328. package/knowledge/decisions/internals/an-empty-text-part-is-omitted-from-an-agent-message.md +1 -1
  329. package/knowledge/decisions/internals/an-empty-transcript-is-not-recorded.md +1 -1
  330. package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +1 -1
  331. package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +1 -1
  332. package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +1 -1
  333. package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +1 -1
  334. package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +1 -1
  335. package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +1 -1
  336. package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +4 -4
  337. package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +1 -1
  338. package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +3 -3
  339. package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +2 -2
  340. package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +2 -2
  341. package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +1 -1
  342. package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +1 -1
  343. package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +3 -3
  344. package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +1 -1
  345. package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +4 -4
  346. package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +1 -1
  347. package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +1 -1
  348. package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +1 -1
  349. package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +1 -1
  350. package/knowledge/decisions/internals/index.md +4 -2
  351. package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +1 -1
  352. package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +1 -1
  353. package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +1 -1
  354. package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +1 -1
  355. package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +1 -1
  356. package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +2 -2
  357. package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +5 -5
  358. package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md +1 -1
  359. package/knowledge/decisions/internals/the-actor-prompt-says-json-because-of-json-object-mode.md +1 -1
  360. package/knowledge/decisions/internals/the-agent-done-event-goes-through-the-middleware-and-is-awaited.md +1 -1
  361. package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +1 -1
  362. package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +43 -19
  363. package/knowledge/decisions/internals/the-embedding-model-is-pinned-per-service-and-doc-query-embedding-is-split.md +1 -1
  364. package/knowledge/decisions/internals/the-per-invocation-rpc-view-is-a-class.md +5 -5
  365. package/knowledge/decisions/internals/the-persona-runtime-is-exported-from-the-persona-entry-point.md +1 -1
  366. package/knowledge/decisions/internals/the-transcript-event-is-sent-ahead-of-the-run.md +2 -2
  367. package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +1 -1
  368. package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +2 -2
  369. package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +3 -3
  370. package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +1 -1
  371. package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md +1 -1
  372. package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +1 -1
  373. package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +1 -1
  374. package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +1 -1
  375. package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +1 -1
  376. package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +1 -1
  377. package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +1 -1
  378. package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +1 -1
  379. package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +1 -1
  380. package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +9 -5
  381. package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +1 -1
  382. package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +2 -2
  383. package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +1 -1
  384. package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +1 -1
  385. package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +1 -1
  386. package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +2 -3
  387. package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +1 -1
  388. package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +1 -1
  389. package/knowledge/decisions/security/{ai-agent-approval-forwarding-requires-a-symbol-brand.md → agent-approval-forwarding-requires-a-symbol-brand.md} +3 -3
  390. package/knowledge/decisions/security/{ai-agent-credential-requests-are-symbol-branded.md → agent-credential-requests-are-symbol-branded.md} +4 -4
  391. package/knowledge/decisions/security/{ai-agent-gate-requires-a-session-only-when-auth-is-true.md → agent-gate-requires-a-session-only-when-auth-is-true.md} +4 -4
  392. package/knowledge/decisions/security/{ai-agent-ownership-failures-never-echo-the-resource.md → agent-ownership-failures-never-echo-the-resource.md} +2 -2
  393. package/knowledge/decisions/security/{ai-agent-resume-re-runs-the-authorization-gate.md → agent-resume-re-runs-the-authorization-gate.md} +4 -4
  394. package/knowledge/decisions/security/{ai-agent-sessionless-deployments-have-no-thread-ownership.md → agent-sessionless-deployments-have-no-thread-ownership.md} +5 -5
  395. package/knowledge/decisions/security/{ai-agent-thread-ownership-composes-the-session-principal.md → agent-thread-ownership-composes-the-session-principal.md} +2 -2
  396. package/knowledge/decisions/security/{ai-agent-tool-filtering-reads-the-live-function-config.md → agent-tool-filtering-reads-the-live-function-config.md} +2 -2
  397. package/knowledge/decisions/security/an-agent-approval-is-claimed-before-the-tool-runs.md +3 -3
  398. package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +3 -3
  399. package/knowledge/decisions/security/an-empty-owners-constraint-matches-nothing.md +3 -3
  400. package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +21 -13
  401. package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +1 -1
  402. package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +2 -2
  403. package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +1 -1
  404. package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +2 -2
  405. package/knowledge/decisions/security/index.md +3 -2
  406. package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +1 -1
  407. package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +3 -3
  408. package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +1 -1
  409. package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +2 -2
  410. package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +1 -1
  411. package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +2 -2
  412. package/knowledge/index.md +3 -1
  413. package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +1 -1
  414. package/knowledge/questions/index.md +2 -0
  415. package/package.json +16 -14
  416. package/run-tests.sh +0 -0
  417. package/scripts/generate-api-report.d.mts +1 -1
  418. package/scripts/generate-api-report.mjs +67 -60
  419. package/scripts/generate-api-report.mts +37 -47
  420. package/src/agent-naming.test.ts +68 -0
  421. package/src/api-report.test.ts +70 -1
  422. package/src/app-alias-surface.test.ts +179 -0
  423. package/src/app-leaf-surface.test.ts +217 -0
  424. package/src/bootstrap-compat/root.ts +20 -0
  425. package/src/{column-form.test.ts → classification/column-form.test.ts} +2 -2
  426. package/src/{data-classification.ts → classification/data-classification.ts} +1 -5
  427. package/src/classification/index.ts +38 -0
  428. package/src/{secret-value.test.ts → classification/secret-value.test.ts} +2 -2
  429. package/src/{secret-value.ts → classification/secret-value.ts} +1 -6
  430. package/src/crypto-utils.ts +1 -1
  431. package/src/dev/reload-meta.test.ts +1 -1
  432. package/src/errors/index.ts +9 -0
  433. package/src/errors/serialized-error.ts +9 -0
  434. package/src/factory-functions.test.ts +4 -2
  435. package/src/function/function-meta.types.ts +151 -0
  436. package/src/function/function-runner.test.ts +4 -2
  437. package/src/function/function-runner.ts +47 -14
  438. package/src/function/functions.types.ts +11 -7
  439. package/src/function/index.ts +24 -5
  440. package/src/function/list.types.ts +1 -3
  441. package/src/middleware/auth-apikey.ts +4 -2
  442. package/src/middleware/auth-bearer.test.ts +1 -1
  443. package/src/middleware/auth-bearer.ts +4 -2
  444. package/src/middleware/auth-cookie.ts +4 -1
  445. package/src/middleware/cors.test.ts +126 -5
  446. package/src/middleware/cors.ts +19 -8
  447. package/src/middleware/index.ts +16 -0
  448. package/src/middleware/middleware-factories.ts +62 -0
  449. package/src/middleware/middleware.types.ts +61 -0
  450. package/src/middleware/remote-auth.test.ts +1 -1
  451. package/src/middleware/remote-auth.ts +1 -1
  452. package/src/middleware/telemetry.ts +4 -2
  453. package/src/middleware-runner.test.ts +2 -3
  454. package/src/middleware-runner.ts +2 -2
  455. package/src/no-root-barrel.test.ts +114 -0
  456. package/src/permissions.ts +2 -4
  457. package/src/pikku-state.ts +6 -4
  458. package/src/public-surface.json +90 -170
  459. package/src/public-surface.json.README +20 -2
  460. package/src/public-surface.test.ts +31 -3
  461. package/src/remote.test.ts +1 -1
  462. package/src/removed-legacy-exports.test.ts +5 -1
  463. package/src/services/{ai-run-state-service.ts → agent-run-state-service.ts} +5 -5
  464. package/src/services/{ai-agent-runner-service.ts → agent-runner-service.ts} +18 -18
  465. package/src/services/{ai-storage-service.ts → agent-storage-service.ts} +7 -7
  466. package/src/services/audit-service.ts +1 -1
  467. package/src/services/credential-wire-service.ts +1 -1
  468. package/src/services/email-service.ts +2 -4
  469. package/src/services/file-scenario-run-store.test.ts +349 -0
  470. package/src/services/file-scenario-run-store.ts +282 -0
  471. package/src/services/http-personas-converse.test.ts +3 -3
  472. package/src/services/http-personas.ts +4 -4
  473. package/src/services/{in-memory-ai-run-state-service.ts → in-memory-agent-run-state-service.ts} +7 -7
  474. package/src/services/in-memory-workflow-service.ts +1 -1
  475. package/src/services/index.ts +22 -10
  476. package/src/services/local-content-request-handler.ts +1 -2
  477. package/src/services/local-secrets.ts +1 -1
  478. package/src/services/logger.ts +7 -7
  479. package/src/services/meta-service.ts +5 -5
  480. package/src/services/queue-webhook-service.test.ts +1 -1
  481. package/src/services/scoped-secret-service.ts +1 -1
  482. package/src/services/secret-service.ts +1 -1
  483. package/src/services/typed-secret-service.test.ts +52 -0
  484. package/src/services/typed-secret-service.ts +26 -2
  485. package/src/services/webhook-service.ts +1 -1
  486. package/src/services/workflow-service.ts +2 -1
  487. package/src/template-alias-surface.test.ts +240 -0
  488. package/src/testing/index.ts +1 -0
  489. package/src/testing/service-tests/agent-run-service-tests.ts +4 -4
  490. package/src/testing/service-tests/{ai-storage-service-tests.ts → agent-storage-service-tests.ts} +8 -8
  491. package/src/testing/service-tests.ts +10 -8
  492. package/src/types/core.types.ts +40 -292
  493. package/src/types/index.ts +2 -0
  494. package/src/types/state.types.ts +12 -14
  495. package/src/types/typed-credentials.test.ts +72 -0
  496. package/src/utils.ts +34 -0
  497. package/src/wirings/actor-flow/run-conversation.test.ts +2 -2
  498. package/src/wirings/actor-flow/run-conversation.ts +7 -9
  499. package/src/wirings/{rpc → addon}/addon-scopes.test.ts +1 -1
  500. package/src/wirings/addon/index.ts +12 -0
  501. package/src/wirings/{rpc → addon}/remote-addon-auth.ts +4 -1
  502. package/src/wirings/{rpc → addon}/wire-addon.ts +37 -2
  503. package/src/wirings/{ai-agent/ai-agent-agui.test.ts → agent/agent-agui.test.ts} +126 -105
  504. package/src/wirings/{ai-agent/ai-agent-agui.ts → agent/agent-agui.ts} +7 -7
  505. package/src/wirings/{ai-agent/ai-agent-authorization.test.ts → agent/agent-authorization.test.ts} +6 -6
  506. package/src/wirings/{ai-agent/ai-agent-finalize.test.ts → agent/agent-finalize.test.ts} +17 -16
  507. package/src/wirings/{ai-agent/ai-agent-finalize.ts → agent/agent-finalize.ts} +22 -22
  508. package/src/wirings/{ai-agent/ai-agent-helpers.test.ts → agent/agent-helpers.test.ts} +1 -1
  509. package/src/wirings/{ai-agent/ai-agent-helpers.ts → agent/agent-helpers.ts} +1 -1
  510. package/src/wirings/{ai-agent/ai-agent-interrupt.test.ts → agent/agent-interrupt.test.ts} +67 -77
  511. package/src/wirings/{ai-agent/ai-agent-interrupt.ts → agent/agent-interrupt.ts} +5 -5
  512. package/src/wirings/{ai-agent/ai-agent-memory.test.ts → agent/agent-memory.test.ts} +12 -12
  513. package/src/wirings/{ai-agent/ai-agent-memory.ts → agent/agent-memory.ts} +36 -36
  514. package/src/wirings/{ai-agent/ai-agent-model-config.test.ts → agent/agent-model-config.test.ts} +2 -5
  515. package/src/wirings/{ai-agent/ai-agent-model-config.ts → agent/agent-model-config.ts} +1 -1
  516. package/src/wirings/{ai-agent/ai-agent-prepare.test.ts → agent/agent-prepare.test.ts} +18 -18
  517. package/src/wirings/{ai-agent/ai-agent-prepare.ts → agent/agent-prepare.ts} +60 -56
  518. package/src/wirings/{ai-agent/ai-agent-registry.test.ts → agent/agent-registry.test.ts} +49 -43
  519. package/src/wirings/{ai-agent/ai-agent-registry.ts → agent/agent-registry.ts} +14 -14
  520. package/src/wirings/{ai-agent/ai-agent-resume-authorization.test.ts → agent/agent-resume-authorization.test.ts} +18 -18
  521. package/src/wirings/{ai-agent → agent}/agent-rpc.ts +16 -20
  522. package/src/wirings/{ai-agent/ai-agent-runner.test.ts → agent/agent-runner.test.ts} +105 -106
  523. package/src/wirings/{ai-agent/ai-agent-runner.ts → agent/agent-runner.ts} +91 -82
  524. package/src/wirings/{ai-agent/ai-agent-stream-output-hooks.test.ts → agent/agent-stream-output-hooks.test.ts} +25 -25
  525. package/src/wirings/{ai-agent/ai-agent-stream.test.ts → agent/agent-stream.test.ts} +147 -143
  526. package/src/wirings/{ai-agent/ai-agent-stream.ts → agent/agent-stream.ts} +148 -148
  527. package/src/wirings/{ai-agent/ai-agent-thread-ownership.test.ts → agent/agent-thread-ownership.test.ts} +24 -28
  528. package/src/wirings/{ai-agent/ai-agent-turn.test.ts → agent/agent-turn.test.ts} +3 -5
  529. package/src/wirings/{ai-agent/ai-agent-turn.ts → agent/agent-turn.ts} +7 -7
  530. package/src/wirings/agent/agent-utils.ts +20 -0
  531. package/src/wirings/{ai-agent/ai-agent.types.ts → agent/agent.types.ts} +54 -51
  532. package/src/wirings/agent/index.ts +57 -0
  533. package/src/wirings/{ai-agent → agent}/voice-input.test.ts +15 -15
  534. package/src/wirings/{ai-agent → agent}/voice-input.ts +11 -11
  535. package/src/wirings/{ai-agent → agent}/voice-output.test.ts +25 -27
  536. package/src/wirings/{ai-agent → agent}/voice-output.ts +11 -11
  537. package/src/wirings/{ai-scorer/ai-scorer-grade.test.ts → agent-scorer/agent-scorer-grade.test.ts} +8 -8
  538. package/src/wirings/{ai-scorer/ai-scorer-grade.ts → agent-scorer/agent-scorer-grade.ts} +9 -9
  539. package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +285 -0
  540. package/src/wirings/agent-scorer/agent-scorer-judge.ts +180 -0
  541. package/src/wirings/{ai-scorer/ai-scorer-live.test.ts → agent-scorer/agent-scorer-live.test.ts} +11 -11
  542. package/src/wirings/{ai-scorer/ai-scorer-live.ts → agent-scorer/agent-scorer-live.ts} +3 -3
  543. package/src/wirings/{ai-scorer/ai-scorer-registry.ts → agent-scorer/agent-scorer-registry.ts} +11 -8
  544. package/src/wirings/{ai-scorer/ai-scorer-sampling.test.ts → agent-scorer/agent-scorer-sampling.test.ts} +1 -1
  545. package/src/wirings/{ai-scorer/ai-scorer-snapshots.test.ts → agent-scorer/agent-scorer-snapshots.test.ts} +2 -2
  546. package/src/wirings/{ai-scorer/ai-scorer-snapshots.ts → agent-scorer/agent-scorer-snapshots.ts} +1 -1
  547. package/src/wirings/{ai-scorer/ai-scorer-worker.test.ts → agent-scorer/agent-scorer-worker.test.ts} +15 -15
  548. package/src/wirings/{ai-scorer/ai-scorer-worker.ts → agent-scorer/agent-scorer-worker.ts} +9 -7
  549. package/src/wirings/{ai-scorer/ai-scorer.ts → agent-scorer/agent-scorer.ts} +15 -7
  550. package/src/wirings/{ai-scorer/ai-scorer.types.ts → agent-scorer/agent-scorer.types.ts} +27 -6
  551. package/src/wirings/agent-scorer/index.ts +23 -0
  552. package/src/wirings/channel/channel-common.ts +4 -2
  553. package/src/wirings/channel/channel-handler.ts +2 -5
  554. package/src/wirings/channel/channel-middleware-runner.ts +1 -1
  555. package/src/wirings/channel/channel-rpc.types.ts +3 -7
  556. package/src/wirings/channel/channel.types.ts +1 -2
  557. package/src/wirings/channel/local/local-channel-runner.test.ts +1 -2
  558. package/src/wirings/channel/serverless/index.ts +1 -0
  559. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +2 -2
  560. package/src/wirings/cli/channel/index.ts +1 -3
  561. package/src/wirings/cli/cli-runner.test.ts +1 -1
  562. package/src/wirings/cli/cli-runner.ts +11 -7
  563. package/src/wirings/cli/cli.types.ts +24 -3
  564. package/src/wirings/cli/command-parser.test.ts +388 -1
  565. package/src/wirings/cli/command-parser.ts +189 -29
  566. package/src/wirings/gateway/gateway-runner.test.ts +1 -2
  567. package/src/wirings/gateway/gateway-runner.ts +3 -6
  568. package/src/wirings/gateway/gateway.types.ts +5 -4
  569. package/src/wirings/http/http-routes.test.ts +1 -2
  570. package/src/wirings/http/http-runner-addon-ref.test.ts +238 -0
  571. package/src/wirings/http/http-runner.test.ts +3 -8
  572. package/src/wirings/http/http-runner.ts +9 -3
  573. package/src/wirings/http/http.types.ts +3 -12
  574. package/src/wirings/http/index.ts +1 -0
  575. package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
  576. package/src/wirings/http/pikku-fetch-http-response.ts +3 -2
  577. package/src/wirings/mcp/mcp-runner.test.ts +1 -1
  578. package/src/wirings/mcp/mcp.types.ts +1 -2
  579. package/src/wirings/persona/index.ts +1 -4
  580. package/src/wirings/persona/persona.types.ts +14 -0
  581. package/src/wirings/queue/queue-identity.test.ts +1 -1
  582. package/src/wirings/queue/queue.types.ts +2 -6
  583. package/src/wirings/queue/signed-queue-service.ts +1 -1
  584. package/src/wirings/rpc/index.ts +0 -12
  585. package/src/wirings/rpc/rpc-runner.test.ts +4 -4
  586. package/src/wirings/rpc/rpc-runner.ts +5 -5
  587. package/src/wirings/rpc/rpc-types.ts +1 -1
  588. package/src/wirings/scheduler/scheduler.types.ts +2 -5
  589. package/src/wirings/scope/index.ts +1 -0
  590. package/src/wirings/secret/secret.types.ts +10 -0
  591. package/src/wirings/secret/validate-secret-definitions.test.ts +23 -0
  592. package/src/wirings/secret/validate-secret-definitions.ts +2 -0
  593. package/src/wirings/variable/validate-variable-definitions.test.ts +23 -0
  594. package/src/wirings/variable/validate-variable-definitions.ts +2 -0
  595. package/src/wirings/variable/variable.types.ts +9 -0
  596. package/src/wirings/virtual-user/index.ts +1 -4
  597. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +2 -2
  598. package/src/wirings/virtual-user/run-virtual-user.test.ts +2 -2
  599. package/src/wirings/virtual-user/run-virtual-user.ts +3 -3
  600. package/src/wirings/virtual-user/virtual-user-agents.ts +1 -1
  601. package/src/wirings/virtual-user/virtual-user-derive.test.ts +1 -1
  602. package/src/wirings/virtual-user/virtual-user-derive.ts +1 -1
  603. package/src/wirings/virtual-user/virtual-user.types.ts +1 -5
  604. package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +569 -0
  605. package/src/wirings/workflow/graph/graph-foreach.test.ts +626 -0
  606. package/src/wirings/workflow/graph/graph-node.ts +16 -1
  607. package/src/wirings/workflow/graph/graph-runner.ts +387 -61
  608. package/src/wirings/workflow/graph/workflow-graph.types.ts +28 -3
  609. package/src/wirings/workflow/index.ts +8 -0
  610. package/src/wirings/workflow/pikku-scenario-service.ts +59 -19
  611. package/src/wirings/workflow/pikku-workflow-service.ts +6 -8
  612. package/src/wirings/workflow/run-timeline.ts +2 -2
  613. package/src/wirings/workflow/scenario-expectations.test.ts +28 -13
  614. package/src/wirings/workflow/scenario-run.types.ts +186 -0
  615. package/src/wirings/workflow/scenario-step-guards.ts +1 -14
  616. package/src/wirings/workflow/scenario-step.test.ts +32 -7
  617. package/src/wirings/workflow/scenario-step.types.ts +27 -12
  618. package/src/wirings/workflow/workflow-approval-policy.test.ts +117 -47
  619. package/src/wirings/workflow/workflow-approval.ts +2 -1
  620. package/src/wirings/workflow/workflow-run-engine.types.ts +2 -1
  621. package/src/wirings/workflow/workflow.types.ts +4 -12
  622. package/src/wirings-stay-decoupled.test.ts +7 -4
  623. package/tsconfig.tsbuildinfo +1 -1
  624. package/tsconfig.type-tests.json +3 -2
  625. package/dist/testing/service-tests/ai-storage-service-tests.d.ts +0 -3
  626. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +0 -16
  627. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +0 -7
  628. package/dist/wirings/ai-agent/ai-agent-utils.d.ts +0 -1
  629. package/dist/wirings/ai-agent/ai-agent-utils.js +0 -1
  630. package/dist/wirings/ai-agent/index.d.ts +0 -12
  631. package/dist/wirings/ai-agent/index.js +0 -10
  632. package/dist/wirings/ai-scorer/ai-scorer-judge.d.ts +0 -17
  633. package/dist/wirings/ai-scorer/ai-scorer.types.js +0 -4
  634. package/dist/wirings/ai-scorer/index.d.ts +0 -6
  635. package/dist/wirings/ai-scorer/index.js +0 -5
  636. package/src/ecosystem.ts +0 -40
  637. package/src/index.ts +0 -255
  638. package/src/wirings/ai-agent/ai-agent-utils.ts +0 -1
  639. package/src/wirings/ai-agent/index.ts +0 -65
  640. package/src/wirings/ai-scorer/ai-scorer-judge.test.ts +0 -143
  641. package/src/wirings/ai-scorer/ai-scorer-judge.ts +0 -120
  642. package/src/wirings/ai-scorer/index.ts +0 -24
  643. /package/dist/{services/ai-agent-runner-service.js → bootstrap-compat/root.js} +0 -0
  644. /package/dist/{services/ai-run-state-service.js → classification/data-classification.js} +0 -0
  645. /package/dist/{services/ai-storage-service.js → ecosystem/gateway.js} +0 -0
  646. /package/dist/{wirings/ai-agent/ai-agent.types.js → ecosystem/node.js} +0 -0
  647. /package/dist/wirings/{ai-agent/ai-agent-helpers.js → agent/agent-helpers.js} +0 -0
  648. /package/dist/wirings/{ai-agent/ai-agent-model-config.d.ts → agent/agent-model-config.d.ts} +0 -0
  649. /package/dist/wirings/{ai-agent → agent}/agent-rpc.d.ts +0 -0
  650. /package/dist/wirings/{ai-scorer/ai-scorer-sampling.d.ts → agent-scorer/agent-scorer-sampling.d.ts} +0 -0
  651. /package/dist/wirings/{ai-scorer/ai-scorer-sampling.js → agent-scorer/agent-scorer-sampling.js} +0 -0
  652. /package/dist/wirings/{ai-scorer/ai-scorer-snapshots.js → agent-scorer/agent-scorer-snapshots.js} +0 -0
  653. /package/src/{column-form.ts → classification/column-form.ts} +0 -0
  654. /package/src/{pikku-request.test.ts → function/pikku-request.test.ts} +0 -0
  655. /package/src/{pikku-request.ts → function/pikku-request.ts} +0 -0
  656. /package/src/wirings/{rpc → addon}/addon-auth-tags.test.ts +0 -0
  657. /package/src/wirings/{rpc → addon}/addon-runner.ts +0 -0
  658. /package/src/wirings/{rpc → addon}/addon-secrets.test.ts +0 -0
  659. /package/src/wirings/{rpc → addon}/wire-addon.test.ts +0 -0
  660. /package/src/wirings/{rpc → addon}/wire-remote-addon.ts +0 -0
  661. /package/src/wirings/{ai-scorer/ai-scorer-sampling.ts → agent-scorer/agent-scorer-sampling.ts} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { pikkuState } from '../../pikku-state.js';
2
- export const addAIScorer = (scorerName, scorer, packageName = null) => {
2
+ export const addAgentScorer = (scorerName, scorer, packageName = null) => {
3
3
  const scorersMeta = pikkuState(packageName, 'agent', 'scorersMeta');
4
4
  if (!scorersMeta[scorerName]) {
5
5
  console.warn(`[pikku] Skipping AI scorer '${scorerName}' — metadata not found. Scorers must be declared in a *.scorer.ts file.`);
@@ -11,13 +11,13 @@ export const addAIScorer = (scorerName, scorer, packageName = null) => {
11
11
  }
12
12
  scorers.set(scorerName, scorer);
13
13
  };
14
- export const getAIScorers = () => pikkuState(null, 'agent', 'scorers');
15
- export const getAIScorersMeta = () => pikkuState(null, 'agent', 'scorersMeta');
14
+ export const getAgentScorers = () => pikkuState(null, 'agent', 'scorers');
15
+ export const getAgentScorersMeta = () => pikkuState(null, 'agent', 'scorersMeta');
16
16
  /**
17
17
  * Resolve a scorer by name across every registered package, the way an agent's
18
18
  * tools are resolved: a scorer declared in an addon is nameable by an app agent.
19
19
  */
20
- export const resolveAIScorer = (scorerName) => {
20
+ export const resolveAgentScorer = (scorerName) => {
21
21
  const scorer = pikkuState(null, 'agent', 'scorers').get(scorerName);
22
22
  if (!scorer) {
23
23
  throw new Error(`AI scorer not found: ${scorerName}`);
@@ -1,4 +1,4 @@
1
- import type { ScorerInput } from './ai-scorer.types.js';
1
+ import type { ScorerInput } from './agent-scorer.types.js';
2
2
  /**
3
3
  * Start retaining snapshots. Called where the scenario grading RPC is
4
4
  * registered, so the buffer exists in exactly the processes that can read it —
@@ -1,9 +1,9 @@
1
- import { type ScoreJob } from './ai-scorer.types.js';
1
+ import { type ScoreJob } from './agent-scorer.types.js';
2
2
  /**
3
3
  * The one worker behind both lanes: it resolves the scorer by name and grades.
4
4
  * The lane a job arrived on decides nothing except how long it may take.
5
5
  */
6
- export declare function pikkuAIScoreWorkerFunc(_services: Record<string, unknown>, job: ScoreJob): Promise<void>;
6
+ export declare function pikkuAgentScoreWorkerFunc(_services: Record<string, unknown>, job: ScoreJob): Promise<void>;
7
7
  /**
8
8
  * Bind the two lane queues to the shared worker.
9
9
  *
@@ -12,4 +12,4 @@ export declare function pikkuAIScoreWorkerFunc(_services: Record<string, unknown
12
12
  * for, so the metadata is synthesised here alongside the registration. This
13
13
  * mirrors how workflows wire their own queues.
14
14
  */
15
- export declare const wireAIScorerQueueWorkers: () => void;
15
+ export declare const wireAgentScorerQueueWorkers: () => void;
@@ -1,20 +1,20 @@
1
1
  import { pikkuState } from '../../pikku-state.js';
2
2
  import { addFunction } from '../../function/function-runner.js';
3
3
  import { wireQueueWorker } from '../queue/queue-runner.js';
4
- import { gradeRun } from './ai-scorer-grade.js';
5
- import { SCORER_LANE_QUEUES } from './ai-scorer.types.js';
4
+ import { gradeRun } from './agent-scorer-grade.js';
5
+ import { SCORER_LANE_QUEUES } from './agent-scorer.types.js';
6
6
  /**
7
7
  * The one worker behind both lanes: it resolves the scorer by name and grades.
8
8
  * The lane a job arrived on decides nothing except how long it may take.
9
9
  */
10
- export async function pikkuAIScoreWorkerFunc(_services, job) {
10
+ export async function pikkuAgentScoreWorkerFunc(_services, job) {
11
11
  const services = pikkuState(null, 'package', 'singletonServices');
12
12
  if (!services) {
13
13
  throw new Error(`Singleton services not initialized: cannot run the '${job.scorerName}' grade of run ${job.runId}`);
14
14
  }
15
15
  await gradeRun(job, services, { persist: true });
16
16
  }
17
- const SCORE_WORKER_FUNC_ID = 'pikkuAIScoreWorker';
17
+ const SCORE_WORKER_FUNC_ID = 'pikkuAgentScoreWorker';
18
18
  /**
19
19
  * Bind the two lane queues to the shared worker.
20
20
  *
@@ -23,7 +23,7 @@ const SCORE_WORKER_FUNC_ID = 'pikkuAIScoreWorker';
23
23
  * for, so the metadata is synthesised here alongside the registration. This
24
24
  * mirrors how workflows wire their own queues.
25
25
  */
26
- export const wireAIScorerQueueWorkers = () => {
26
+ export const wireAgentScorerQueueWorkers = () => {
27
27
  // No scorers means no lanes: a deployment that grades nothing should not be
28
28
  // left holding two queues nothing ever writes to.
29
29
  if (pikkuState(null, 'agent', 'scorers').size === 0)
@@ -32,7 +32,9 @@ export const wireAIScorerQueueWorkers = () => {
32
32
  const functionsMeta = pikkuState(null, 'function', 'meta');
33
33
  const queueMeta = pikkuState(null, 'queue', 'meta');
34
34
  if (!functions.has(SCORE_WORKER_FUNC_ID)) {
35
- addFunction(SCORE_WORKER_FUNC_ID, { func: pikkuAIScoreWorkerFunc });
35
+ addFunction(SCORE_WORKER_FUNC_ID, {
36
+ func: pikkuAgentScoreWorkerFunc,
37
+ });
36
38
  }
37
39
  if (!functionsMeta[SCORE_WORKER_FUNC_ID]) {
38
40
  functionsMeta[SCORE_WORKER_FUNC_ID] = {
@@ -52,7 +54,7 @@ export const wireAIScorerQueueWorkers = () => {
52
54
  }
53
55
  wireQueueWorker({
54
56
  name: queueName,
55
- func: { func: pikkuAIScoreWorkerFunc },
57
+ func: { func: pikkuAgentScoreWorkerFunc },
56
58
  });
57
59
  }
58
60
  };
@@ -1,9 +1,9 @@
1
- import type { PikkuAIScorer, ScorerInput, ScorerOutput } from './ai-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.
5
5
  */
6
- export declare const pikkuAIScorer: <Services = any>(config: {
6
+ export declare const pikkuAgentScorer: <Services = any>(config: {
7
7
  name: string;
8
8
  description: string;
9
9
  /** 0..1 fraction of live runs to grade. Defaults to all of them. */
@@ -14,16 +14,16 @@ export declare const pikkuAIScorer: <Services = any>(config: {
14
14
  */
15
15
  requiresReference?: boolean;
16
16
  score: (input: ScorerInput, services: Services) => ScorerOutput | Promise<ScorerOutput>;
17
- }) => PikkuAIScorer<Services>;
17
+ }) => PikkuAgentScorer<Services>;
18
18
  /**
19
19
  * An LLM-judge scorer: the runtime makes the model call and forces a structured
20
20
  * `{ score, reason }`, so a judge is a rubric rather than a prompt to parse.
21
21
  *
22
- * The rubric field is `goal`, matching `pikkuAIAgent`'s prompt vocabulary — a
22
+ * The rubric field is `goal`, matching `pikkuAgent`'s prompt vocabulary — a
23
23
  * judge is a degenerate agent, and should use the same word for the same thing.
24
24
  * `prompt` is the escape hatch for non-standard framing.
25
25
  */
26
- export declare const pikkuAIJudge: <Services = any>(config: {
26
+ export declare const pikkuAgentJudge: <Services = any>(config: {
27
27
  name: string;
28
28
  description: string;
29
29
  /** 0..1 fraction of live runs to grade. Defaults to all of them. */
@@ -35,5 +35,11 @@ export declare const pikkuAIJudge: <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
- }) => PikkuAIScorer<Services>;
45
+ }) => PikkuAgentScorer<Services>;
@@ -10,7 +10,7 @@ const assertSampleRate = (name, sampleRate) => {
10
10
  * A heuristic scorer: pure code over the finished run, no model call, so it
11
11
  * grades on the fast lane.
12
12
  */
13
- export const pikkuAIScorer = (config) => ({
13
+ export const pikkuAgentScorer = (config) => ({
14
14
  name: config.name,
15
15
  description: config.description,
16
16
  lane: 'fast',
@@ -22,11 +22,11 @@ export const pikkuAIScorer = (config) => ({
22
22
  * An LLM-judge scorer: the runtime makes the model call and forces a structured
23
23
  * `{ score, reason }`, so a judge is a rubric rather than a prompt to parse.
24
24
  *
25
- * The rubric field is `goal`, matching `pikkuAIAgent`'s prompt vocabulary — a
25
+ * The rubric field is `goal`, matching `pikkuAgent`'s prompt vocabulary — a
26
26
  * judge is a degenerate agent, and should use the same word for the same thing.
27
27
  * `prompt` is the escape hatch for non-standard framing.
28
28
  */
29
- export const pikkuAIJudge = (config) => ({
29
+ export const pikkuAgentJudge = (config) => ({
30
30
  name: config.name,
31
31
  description: config.description,
32
32
  lane: 'slow',
@@ -35,6 +35,7 @@ export const pikkuAIJudge = (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
  });
@@ -44,16 +44,36 @@ export interface ScorerOutput {
44
44
  export type ScorerLane = 'fast' | 'slow';
45
45
  export declare const SCORER_LANE_QUEUES: Record<ScorerLane, string>;
46
46
  /**
47
- * A judge's model call. Present only on a scorer built with `pikkuAIJudge`;
48
- * `score` is present only on one built with `pikkuAIScorer`. Exactly one of the
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';
64
+ /**
65
+ * A judge's model call. Present only on a scorer built with `pikkuAgentJudge`;
66
+ * `score` is present only on one built with `pikkuAgentScorer`. Exactly one of the
49
67
  * two is set, which is what the two constructors exist to guarantee.
50
68
  */
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
- export type PikkuAIScorer<Services = any> = {
76
+ export type PikkuAgentScorer<Services = any> = {
57
77
  name: string;
58
78
  description: string;
59
79
  lane: ScorerLane;
@@ -80,7 +100,7 @@ export type ScorerMeta = Record<string, {
80
100
  export type ScoreJob = ScorerInput & {
81
101
  scorerName: string;
82
102
  };
83
- export type AIRunScore = {
103
+ export type AgentRunScore = {
84
104
  runId: string;
85
105
  scorerName: string;
86
106
  score: number;
@@ -0,0 +1,4 @@
1
+ export const SCORER_LANE_QUEUES = {
2
+ fast: 'agent-score-fast',
3
+ slow: 'agent-score-slow',
4
+ };
@@ -0,0 +1,6 @@
1
+ export { pikkuAgentScorer, pikkuAgentJudge } from './agent-scorer.js';
2
+ export { addAgentScorer, getAgentScorers, getAgentScorersMeta, } from './agent-scorer-registry.js';
3
+ export { gradeRun } from './agent-scorer-grade.js';
4
+ export { enableScoreSnapshots, getScoreSnapshot, } from './agent-scorer-snapshots.js';
5
+ export { wireAgentScorerQueueWorkers } from './agent-scorer-worker.js';
6
+ export type { AgentRunScore, JudgeToolCallDisclosure, PikkuAgentScorer, ScoreJob, ScorerInput, ScorerJudgeConfig, ScorerLane, ScorerMeta, ScorerOutput, } from './agent-scorer.types.js';
@@ -0,0 +1,5 @@
1
+ export { pikkuAgentScorer, pikkuAgentJudge } from './agent-scorer.js';
2
+ export { addAgentScorer, getAgentScorers, getAgentScorersMeta, } from './agent-scorer-registry.js';
3
+ export { gradeRun } from './agent-scorer-grade.js';
4
+ export { enableScoreSnapshots, getScoreSnapshot, } from './agent-scorer-snapshots.js';
5
+ export { wireAgentScorerQueueWorkers } from './agent-scorer-worker.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;
@@ -51,7 +51,7 @@ export declare class ChannelRPCError extends Error {
51
51
  * Whether a callable exposed to a remote decider needs a human to agree before
52
52
  * it runs, and how to describe the invocation while asking.
53
53
  *
54
- * Shared with `AIAgentToolDef`: both are an allowlist of named callables
54
+ * Shared with `AgentToolDef`: both are an allowlist of named callables
55
55
  * invoked by something other than the code that wrote them. The runtime around
56
56
  * them is not shared — an agent suspends and resumes, a reverse call is a live
57
57
  * await.
@@ -62,7 +62,7 @@ export interface ApprovalPolicy {
62
62
  }
63
63
  export type CapabilityHandler = (data: any) => Promise<unknown> | unknown;
64
64
  /**
65
- * `needsApproval` is required here on purpose. On `AIAgentToolDef` the same
65
+ * `needsApproval` is required here on purpose. On `AgentToolDef` the same
66
66
  * field is optional and absence means "do not ask"; here absence means the
67
67
  * opposite, so it must not be expressible — a bare function is the
68
68
  * unclassified form.
@@ -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)) {