@pikku/core 0.12.84 → 0.12.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (564) hide show
  1. package/CHANGELOG.md +424 -0
  2. package/dist/bootstrap-compat/root.d.ts +20 -0
  3. package/dist/classification/column-form.d.ts +32 -0
  4. package/dist/classification/column-form.js +42 -0
  5. package/dist/classification/data-classification.d.ts +64 -0
  6. package/dist/classification/index.d.ts +13 -0
  7. package/dist/classification/index.js +2 -0
  8. package/dist/classification/secret-value.d.ts +56 -0
  9. package/dist/classification/secret-value.js +46 -0
  10. package/dist/crypto-utils.d.ts +1 -1
  11. package/dist/ecosystem/agent-scorer.d.ts +1 -1
  12. package/dist/ecosystem/agent.d.ts +4 -1
  13. package/dist/ecosystem/channel/local.d.ts +2 -0
  14. package/dist/ecosystem/channel/local.js +2 -0
  15. package/dist/ecosystem/channel/serverless.d.ts +9 -0
  16. package/dist/ecosystem/channel/serverless.js +1 -0
  17. package/dist/ecosystem/channel.d.ts +3 -0
  18. package/dist/ecosystem/channel.js +1 -0
  19. package/dist/ecosystem/cli.d.ts +1 -1
  20. package/dist/ecosystem/cli.js +1 -1
  21. package/dist/ecosystem/credential.d.ts +1 -0
  22. package/dist/ecosystem/crypto-utils.d.ts +8 -0
  23. package/dist/ecosystem/crypto-utils.js +1 -0
  24. package/dist/ecosystem/dev.d.ts +1 -0
  25. package/dist/ecosystem/dev.js +1 -0
  26. package/{src/ecosystem/testing.ts → dist/ecosystem/errors.d.ts} +3 -3
  27. package/dist/ecosystem/errors.js +2 -0
  28. package/dist/ecosystem/function.d.ts +1 -1
  29. package/dist/ecosystem/function.js +1 -1
  30. package/dist/ecosystem/http.d.ts +3 -1
  31. package/dist/ecosystem/http.js +3 -1
  32. package/dist/ecosystem/mcp.d.ts +1 -1
  33. package/dist/ecosystem/mcp.js +1 -1
  34. package/dist/ecosystem/middleware.d.ts +2 -1
  35. package/dist/ecosystem/middleware.js +2 -1
  36. package/dist/ecosystem/persona.d.ts +4 -2
  37. package/dist/ecosystem/persona.js +2 -1
  38. package/dist/ecosystem/queue.d.ts +4 -2
  39. package/dist/ecosystem/queue.js +3 -1
  40. package/dist/ecosystem/role.d.ts +1 -0
  41. package/dist/ecosystem/rpc.d.ts +2 -0
  42. package/dist/ecosystem/rpc.js +1 -0
  43. package/dist/ecosystem/scenario.d.ts +8 -2
  44. package/dist/ecosystem/scenario.js +5 -1
  45. package/dist/ecosystem/scheduler.d.ts +2 -1
  46. package/dist/ecosystem/scheduler.js +2 -1
  47. package/dist/ecosystem/schema.d.ts +2 -1
  48. package/dist/ecosystem/schema.js +1 -1
  49. package/dist/ecosystem/scope.d.ts +2 -0
  50. package/dist/ecosystem/scope.js +1 -0
  51. package/dist/ecosystem/secret.d.ts +2 -0
  52. package/dist/ecosystem/secret.js +1 -0
  53. package/dist/ecosystem/services/local-content.d.ts +2 -1
  54. package/dist/ecosystem/services/local-content.js +1 -1
  55. package/dist/ecosystem/services/local-meta.d.ts +1 -0
  56. package/dist/ecosystem/services/local-meta.js +1 -0
  57. package/dist/ecosystem/services.d.ts +11 -3
  58. package/dist/ecosystem/services.js +7 -1
  59. package/dist/ecosystem/trigger.d.ts +1 -0
  60. package/dist/ecosystem/trigger.js +1 -1
  61. package/dist/ecosystem/types.d.ts +6 -3
  62. package/dist/ecosystem/types.js +3 -2
  63. package/dist/ecosystem/variable.d.ts +1 -0
  64. package/dist/ecosystem/virtual-user.d.ts +3 -0
  65. package/dist/ecosystem/virtual-user.js +3 -0
  66. package/dist/ecosystem/workflow.d.ts +2 -0
  67. package/dist/ecosystem/workflow.js +2 -0
  68. package/dist/errors/index.d.ts +8 -0
  69. package/dist/errors/index.js +1 -0
  70. package/dist/errors/serialized-error.d.ts +7 -0
  71. package/dist/function/function-meta.types.d.ts +139 -0
  72. package/dist/function/function-runner.d.ts +3 -2
  73. package/dist/function/function-runner.js +31 -11
  74. package/dist/function/functions.types.d.ts +10 -2
  75. package/dist/function/index.d.ts +8 -2
  76. package/dist/function/index.js +4 -1
  77. package/dist/function/pikku-request.d.ts +8 -0
  78. package/dist/function/pikku-request.js +15 -0
  79. package/dist/middleware/auth-apikey.d.ts +2 -10
  80. package/dist/middleware/auth-apikey.js +1 -1
  81. package/dist/middleware/auth-bearer.d.ts +2 -10
  82. package/dist/middleware/auth-bearer.js +1 -1
  83. package/dist/middleware/auth-cookie.d.ts +2 -10
  84. package/dist/middleware/auth-cookie.js +1 -1
  85. package/dist/middleware/cors.d.ts +5 -11
  86. package/dist/middleware/cors.js +13 -6
  87. package/dist/middleware/index.d.ts +3 -0
  88. package/dist/middleware/index.js +1 -0
  89. package/dist/middleware/middleware-factories.d.ts +9 -0
  90. package/dist/middleware/middleware-factories.js +19 -0
  91. package/dist/middleware/middleware.types.d.ts +27 -0
  92. package/dist/middleware/middleware.types.js +1 -0
  93. package/dist/middleware/remote-auth.d.ts +2 -2
  94. package/dist/middleware/remote-auth.js +1 -1
  95. package/dist/middleware/telemetry.d.ts +4 -20
  96. package/dist/middleware/telemetry.js +1 -1
  97. package/dist/middleware-runner.d.ts +2 -1
  98. package/dist/pikku-state.d.ts +2 -1
  99. package/dist/services/audit-service.d.ts +1 -1
  100. package/dist/services/credential-wire-service.js +1 -1
  101. package/dist/services/email-service.d.ts +1 -1
  102. package/dist/services/file-scenario-run-store.d.ts +58 -0
  103. package/dist/services/file-scenario-run-store.js +214 -0
  104. package/dist/services/in-memory-workflow-service.d.ts +1 -1
  105. package/dist/services/index.d.ts +5 -1
  106. package/dist/services/index.js +3 -0
  107. package/dist/services/local-secrets.d.ts +1 -1
  108. package/dist/services/local-secrets.js +1 -1
  109. package/dist/services/logger.d.ts +7 -7
  110. package/dist/services/meta-service.d.ts +2 -1
  111. package/dist/services/scoped-secret-service.d.ts +1 -1
  112. package/dist/services/secret-service.d.ts +1 -1
  113. package/dist/services/typed-secret-service.d.ts +16 -2
  114. package/dist/services/typed-secret-service.js +5 -0
  115. package/dist/services/webhook-service.d.ts +1 -1
  116. package/dist/services/workflow-service.d.ts +2 -1
  117. package/dist/testing/index.d.ts +1 -0
  118. package/dist/testing/index.js +1 -0
  119. package/dist/types/core.types.d.ts +30 -180
  120. package/dist/types/core.types.js +1 -19
  121. package/dist/types/index.d.ts +2 -0
  122. package/dist/types/index.js +1 -0
  123. package/dist/types/state.types.d.ts +3 -1
  124. package/dist/utils.d.ts +13 -0
  125. package/dist/utils.js +2 -0
  126. package/dist/wirings/addon/addon-runner.d.ts +17 -0
  127. package/dist/wirings/addon/addon-runner.js +150 -0
  128. package/dist/wirings/addon/index.d.ts +6 -0
  129. package/dist/wirings/addon/index.js +3 -0
  130. package/dist/wirings/addon/remote-addon-auth.d.ts +16 -0
  131. package/dist/wirings/addon/remote-addon-auth.js +39 -0
  132. package/dist/wirings/addon/wire-addon.d.ts +80 -0
  133. package/dist/wirings/addon/wire-addon.js +120 -0
  134. package/dist/wirings/addon/wire-remote-addon.d.ts +22 -0
  135. package/dist/wirings/addon/wire-remote-addon.js +11 -0
  136. package/dist/wirings/agent/agent-prepare.d.ts +3 -3
  137. package/dist/wirings/agent/agent-prepare.js +1 -1
  138. package/dist/wirings/agent/agent-runner.js +2 -3
  139. package/dist/wirings/agent/agent-stream.js +2 -2
  140. package/dist/wirings/agent/agent-utils.d.ts +13 -0
  141. package/dist/wirings/agent/agent-utils.js +16 -0
  142. package/dist/wirings/agent/agent.types.d.ts +3 -2
  143. package/dist/wirings/agent/index.d.ts +1 -1
  144. package/dist/wirings/agent/voice-input.js +1 -1
  145. package/dist/wirings/agent/voice-output.js +1 -1
  146. package/dist/wirings/agent-scorer/agent-scorer-judge.d.ts +13 -0
  147. package/dist/wirings/agent-scorer/agent-scorer-judge.js +52 -0
  148. package/dist/wirings/agent-scorer/agent-scorer.d.ts +7 -1
  149. package/dist/wirings/agent-scorer/agent-scorer.js +1 -0
  150. package/dist/wirings/agent-scorer/agent-scorer.types.d.ts +20 -0
  151. package/dist/wirings/agent-scorer/index.d.ts +1 -1
  152. package/dist/wirings/channel/channel-common.d.ts +2 -1
  153. package/dist/wirings/channel/channel-middleware-runner.d.ts +2 -1
  154. package/dist/wirings/channel/channel.types.d.ts +1 -1
  155. package/dist/wirings/channel/serverless/index.d.ts +1 -0
  156. package/dist/wirings/cli/channel/index.d.ts +1 -1
  157. package/dist/wirings/cli/cli-runner.d.ts +2 -1
  158. package/dist/wirings/cli/cli-runner.js +4 -1
  159. package/dist/wirings/cli/cli.types.d.ts +21 -2
  160. package/dist/wirings/cli/command-parser.js +157 -23
  161. package/dist/wirings/gateway/gateway.types.d.ts +2 -1
  162. package/dist/wirings/http/http-runner.d.ts +1 -1
  163. package/dist/wirings/http/http-runner.js +1 -1
  164. package/dist/wirings/http/http.types.d.ts +2 -2
  165. package/dist/wirings/http/index.d.ts +1 -0
  166. package/dist/wirings/http/index.js +1 -0
  167. package/dist/wirings/http/pikku-fetch-http-request.js +1 -1
  168. package/dist/wirings/http/pikku-fetch-http-response.js +2 -2
  169. package/dist/wirings/mcp/mcp.types.d.ts +1 -1
  170. package/dist/wirings/persona/index.d.ts +1 -1
  171. package/dist/wirings/persona/index.js +1 -1
  172. package/dist/wirings/persona/persona.types.d.ts +14 -0
  173. package/dist/wirings/queue/queue.types.d.ts +1 -1
  174. package/dist/wirings/queue/signed-queue-service.d.ts +1 -1
  175. package/dist/wirings/rpc/index.d.ts +0 -6
  176. package/dist/wirings/rpc/index.js +0 -3
  177. package/dist/wirings/rpc/remote-addon-auth.d.ts +1 -1
  178. package/dist/wirings/rpc/remote-addon-auth.js +1 -1
  179. package/dist/wirings/rpc/rpc-runner.js +2 -2
  180. package/dist/wirings/rpc/wire-addon.d.ts +1 -1
  181. package/dist/wirings/scheduler/scheduler.types.d.ts +2 -1
  182. package/dist/wirings/scope/index.d.ts +1 -0
  183. package/dist/wirings/scope/index.js +1 -0
  184. package/dist/wirings/secret/secret.types.d.ts +10 -0
  185. package/dist/wirings/secret/validate-secret-definitions.js +2 -0
  186. package/dist/wirings/variable/validate-variable-definitions.js +2 -0
  187. package/dist/wirings/variable/variable.types.d.ts +9 -0
  188. package/dist/wirings/virtual-user/index.d.ts +1 -1
  189. package/dist/wirings/virtual-user/index.js +1 -1
  190. package/dist/wirings/virtual-user/prepare-virtual-user-run.d.ts +1 -1
  191. package/dist/wirings/virtual-user/virtual-user-derive.d.ts +1 -1
  192. package/dist/wirings/workflow/graph/graph-node.d.ts +9 -2
  193. package/dist/wirings/workflow/graph/graph-node.js +2 -0
  194. package/dist/wirings/workflow/graph/graph-runner.d.ts +1 -0
  195. package/dist/wirings/workflow/graph/graph-runner.js +283 -31
  196. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +16 -1
  197. package/dist/wirings/workflow/index.d.ts +2 -0
  198. package/dist/wirings/workflow/index.js +1 -0
  199. package/dist/wirings/workflow/pikku-scenario-service.d.ts +14 -4
  200. package/dist/wirings/workflow/pikku-scenario-service.js +44 -16
  201. package/dist/wirings/workflow/pikku-workflow-service.d.ts +2 -1
  202. package/dist/wirings/workflow/pikku-workflow-service.js +3 -4
  203. package/dist/wirings/workflow/run-timeline.d.ts +1 -1
  204. package/dist/wirings/workflow/scenario-run.types.d.ts +171 -0
  205. package/dist/wirings/workflow/scenario-run.types.js +1 -0
  206. package/dist/wirings/workflow/scenario-step-guards.d.ts +1 -2
  207. package/dist/wirings/workflow/scenario-step-guards.js +0 -8
  208. package/dist/wirings/workflow/scenario-step.types.d.ts +27 -12
  209. package/dist/wirings/workflow/workflow-approval.js +2 -1
  210. package/dist/wirings/workflow/workflow-run-engine.types.d.ts +2 -1
  211. package/dist/wirings/workflow/workflow.types.d.ts +2 -1
  212. package/knowledge/decisions/index.md +2 -0
  213. package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +1 -1
  214. package/knowledge/decisions/internals/a-secret-that-fails-to-decrypt-fails-the-whole-read.md +1 -1
  215. package/knowledge/decisions/internals/a-virtual-user-run-is-not-a-workflow-and-not-a-queued-job.md +2 -2
  216. package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +6 -6
  217. package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +1 -1
  218. package/knowledge/decisions/internals/addon-singleton-services-are-cached-per-namespace-not-per-package.md +1 -1
  219. package/knowledge/decisions/internals/addon-workflow-names-are-prefixed-with-the-consumer-namespace.md +1 -1
  220. package/knowledge/decisions/internals/an-addon-scope-root-loses-to-a-root-the-host-already-declares.md +1 -1
  221. package/knowledge/decisions/internals/channel-message-handlers-accept-three-config-shapes.md +1 -1
  222. package/knowledge/decisions/internals/channel-middleware-caches-only-statically-resolved-middleware.md +1 -1
  223. package/knowledge/decisions/internals/channel-user-id-is-persisted-after-onconnect-middleware-runs.md +1 -1
  224. package/knowledge/decisions/internals/cli-option-names-are-camelcase-in-state-and-kebab-on-the-command-line.md +1 -1
  225. package/knowledge/decisions/internals/cli-parse-errors-are-routed-by-message-prefix.md +1 -1
  226. package/knowledge/decisions/internals/cli-unknown-long-options-warn-instead-of-failing.md +1 -1
  227. package/knowledge/decisions/internals/core-column-form-is-an-axis-of-its-own.md +4 -4
  228. package/knowledge/decisions/internals/core-data-classification-brand-is-an-optional-property.md +1 -1
  229. package/knowledge/decisions/internals/core-function-runner-restores-the-wire-fields-it-overwrites.md +3 -3
  230. package/knowledge/decisions/internals/core-hot-reload-merges-generated-meta-never-replaces-it.md +2 -2
  231. package/knowledge/decisions/internals/core-hot-reload-owns-its-module-registry.md +2 -2
  232. package/knowledge/decisions/internals/core-middleware-order-is-scope-then-priority.md +1 -1
  233. package/knowledge/decisions/internals/core-schema-defaults-apply-on-every-transport.md +1 -1
  234. package/knowledge/decisions/internals/core-scopes-are-an-and-gate-separate-from-permissions.md +3 -3
  235. package/knowledge/decisions/internals/gateway-adapters-resolve-lazily-and-are-promise-cached.md +1 -1
  236. package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +4 -4
  237. package/knowledge/decisions/internals/gateway-wiring-is-a-meta-wiring-over-http-and-channels.md +1 -1
  238. package/knowledge/decisions/internals/http-router-matches-normalized-paths-but-returns-registered-ones.md +1 -1
  239. package/knowledge/decisions/internals/in-a-scenario-a-4xx-is-data-not-an-exception.md +1 -1
  240. package/knowledge/decisions/internals/in-memory-workflow-history-aliases-the-live-step-object.md +1 -1
  241. package/knowledge/decisions/internals/index.md +4 -2
  242. package/knowledge/decisions/internals/istanbul-statement-counts-attach-to-the-start-line-only.md +1 -1
  243. package/knowledge/decisions/internals/one-project-shape-check-two-validators.md +1 -1
  244. package/knowledge/decisions/internals/queue-jobs-always-carry-an-explicit-attempts-count.md +1 -1
  245. package/knowledge/decisions/internals/remote-addons-dispatch-over-http-instead-of-local-meta.md +1 -1
  246. package/knowledge/decisions/internals/rpc-names-resolve-through-package-scope-before-root.md +1 -1
  247. package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +2 -2
  248. package/knowledge/decisions/internals/scenarios-live-in-files-named-for-them.md +5 -5
  249. package/knowledge/decisions/internals/the-actor-prompt-says-json-because-of-json-object-mode.md +1 -1
  250. package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +1 -1
  251. package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +43 -19
  252. package/knowledge/decisions/internals/the-persona-runtime-is-exported-from-the-persona-entry-point.md +1 -1
  253. package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +1 -1
  254. package/knowledge/decisions/internals/validate-runs-checks-by-precondition.md +3 -3
  255. package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +1 -1
  256. package/knowledge/decisions/internals/webhook-delivery-history-records-every-attempt-best-effort.md +1 -1
  257. package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +1 -1
  258. package/knowledge/decisions/internals/workflow-approval-expiry-is-decided-from-a-recorded-deadline.md +1 -1
  259. package/knowledge/decisions/internals/workflow-core-never-imports-a-browser-driver.md +1 -1
  260. package/knowledge/decisions/internals/workflow-inline-runs-report-their-run-id-before-they-can-fail.md +1 -1
  261. package/knowledge/decisions/internals/workflow-invocation-id-is-the-dedupe-key-not-step-id.md +1 -1
  262. package/knowledge/decisions/internals/workflow-run-capabilities-are-extensions-not-subclasses.md +1 -1
  263. package/knowledge/decisions/internals/workflow-run-timeline-is-a-pure-fold-over-durable-history.md +1 -1
  264. package/knowledge/decisions/internals/workflow-scenario-assertions-never-retry-and-record-one-step.md +9 -5
  265. package/knowledge/decisions/internals/workflow-scenario-hooks-are-a-scenario-only-affordance.md +1 -1
  266. package/knowledge/decisions/internals/workflow-step-rpc-name-is-provenance-only.md +2 -2
  267. package/knowledge/decisions/internals/workflow-suspend-and-approval-reasons-are-durable-step-identities.md +1 -1
  268. package/knowledge/decisions/security/a-function-never-receives-the-secret-service.md +1 -1
  269. package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +1 -1
  270. package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +2 -3
  271. package/knowledge/decisions/security/actor-sign-in-is-proven-by-set-cookie-not-a-non-empty-jar.md +1 -1
  272. package/knowledge/decisions/security/addon-auth-and-tags-only-tighten.md +1 -1
  273. package/knowledge/decisions/security/agent-gate-requires-a-session-only-when-auth-is-true.md +1 -1
  274. package/knowledge/decisions/security/an-approval-answer-outlives-the-run-it-answered.md +3 -3
  275. package/knowledge/decisions/security/console-addon-privileged-functions-gate-themselves.md +4 -3
  276. package/knowledge/decisions/security/core-safe-fetch-blocks-ssrf-by-host-literal-not-dns.md +1 -1
  277. package/knowledge/decisions/security/gateway-middleware-sessions-must-be-bridged-onto-the-wire.md +2 -2
  278. package/knowledge/decisions/security/global-permissions-and-function-permissions-are-independent-gates.md +1 -1
  279. package/knowledge/decisions/security/http-request-bodies-are-bounded-before-they-are-buffered.md +2 -2
  280. package/knowledge/decisions/security/index.md +2 -0
  281. package/knowledge/decisions/security/mcp-internal-error-details-are-double-gated-on-production.md +1 -1
  282. package/knowledge/decisions/security/queue-jobs-carry-the-producers-pikku-user-id.md +3 -3
  283. package/knowledge/decisions/security/remote-addon-tokens-are-client-credentials-not-mesh-trust.md +1 -1
  284. package/knowledge/decisions/security/scaffold-features-are-authenticated-unless-opted-out.md +2 -2
  285. package/knowledge/decisions/security/self-authentication-is-declared-not-detected.md +1 -1
  286. package/knowledge/decisions/security/signed-content-urls-bind-the-request-path.md +2 -2
  287. package/knowledge/index.md +3 -1
  288. package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +1 -1
  289. package/knowledge/questions/index.md +2 -0
  290. package/package.json +14 -13
  291. package/run-tests.sh +0 -0
  292. package/scripts/generate-api-report.d.mts +1 -1
  293. package/scripts/generate-api-report.mjs +67 -60
  294. package/scripts/generate-api-report.mts +11 -45
  295. package/src/api-report.test.ts +70 -1
  296. package/src/app-alias-surface.test.ts +179 -0
  297. package/src/app-leaf-surface.test.ts +217 -0
  298. package/src/bootstrap-compat/root.ts +20 -0
  299. package/src/{column-form.test.ts → classification/column-form.test.ts} +2 -2
  300. package/src/{data-classification.ts → classification/data-classification.ts} +1 -5
  301. package/src/classification/index.ts +38 -0
  302. package/src/{secret-value.test.ts → classification/secret-value.test.ts} +2 -2
  303. package/src/{secret-value.ts → classification/secret-value.ts} +1 -6
  304. package/src/crypto-utils.ts +1 -1
  305. package/src/dev/reload-meta.test.ts +1 -1
  306. package/src/errors/index.ts +9 -0
  307. package/src/errors/serialized-error.ts +9 -0
  308. package/src/factory-functions.test.ts +4 -2
  309. package/src/function/function-meta.types.ts +151 -0
  310. package/src/function/function-runner.test.ts +4 -2
  311. package/src/function/function-runner.ts +47 -14
  312. package/src/function/functions.types.ts +11 -7
  313. package/src/function/index.ts +24 -5
  314. package/src/function/list.types.ts +1 -3
  315. package/src/middleware/auth-apikey.ts +4 -2
  316. package/src/middleware/auth-bearer.test.ts +1 -1
  317. package/src/middleware/auth-bearer.ts +4 -2
  318. package/src/middleware/auth-cookie.ts +4 -1
  319. package/src/middleware/cors.test.ts +126 -5
  320. package/src/middleware/cors.ts +19 -8
  321. package/src/middleware/index.ts +16 -0
  322. package/src/middleware/middleware-factories.ts +62 -0
  323. package/src/middleware/middleware.types.ts +61 -0
  324. package/src/middleware/remote-auth.test.ts +1 -1
  325. package/src/middleware/remote-auth.ts +1 -1
  326. package/src/middleware/telemetry.ts +4 -2
  327. package/src/middleware-runner.test.ts +2 -3
  328. package/src/middleware-runner.ts +2 -2
  329. package/src/no-root-barrel.test.ts +114 -0
  330. package/src/permissions.ts +2 -4
  331. package/src/pikku-state.ts +3 -1
  332. package/src/public-surface.json +56 -241
  333. package/src/public-surface.json.README +3 -3
  334. package/src/public-surface.test.ts +5 -5
  335. package/src/remote.test.ts +1 -1
  336. package/src/removed-legacy-exports.test.ts +5 -1
  337. package/src/services/audit-service.ts +1 -1
  338. package/src/services/credential-wire-service.ts +1 -1
  339. package/src/services/email-service.ts +2 -4
  340. package/src/services/file-scenario-run-store.test.ts +349 -0
  341. package/src/services/file-scenario-run-store.ts +282 -0
  342. package/src/services/in-memory-workflow-service.ts +1 -1
  343. package/src/services/index.ts +13 -1
  344. package/src/services/local-content-request-handler.ts +1 -2
  345. package/src/services/local-secrets.ts +1 -1
  346. package/src/services/logger.ts +7 -7
  347. package/src/services/meta-service.ts +2 -2
  348. package/src/services/queue-webhook-service.test.ts +1 -1
  349. package/src/services/scoped-secret-service.ts +1 -1
  350. package/src/services/secret-service.ts +1 -1
  351. package/src/services/typed-secret-service.test.ts +52 -0
  352. package/src/services/typed-secret-service.ts +26 -2
  353. package/src/services/webhook-service.ts +1 -1
  354. package/src/services/workflow-service.ts +2 -1
  355. package/src/template-alias-surface.test.ts +240 -0
  356. package/src/testing/index.ts +1 -0
  357. package/src/types/core.types.ts +33 -285
  358. package/src/types/index.ts +2 -0
  359. package/src/types/state.types.ts +6 -5
  360. package/src/types/typed-credentials.test.ts +72 -0
  361. package/src/utils.ts +34 -0
  362. package/src/wirings/{rpc → addon}/addon-scopes.test.ts +1 -1
  363. package/src/wirings/addon/index.ts +12 -0
  364. package/src/wirings/{rpc → addon}/remote-addon-auth.ts +4 -1
  365. package/src/wirings/{rpc → addon}/wire-addon.ts +37 -2
  366. package/src/wirings/agent/agent-prepare.ts +8 -5
  367. package/src/wirings/agent/agent-runner.ts +2 -3
  368. package/src/wirings/agent/agent-stream.ts +2 -3
  369. package/src/wirings/agent/agent-utils.ts +19 -0
  370. package/src/wirings/agent/agent.types.ts +3 -3
  371. package/src/wirings/agent/index.ts +1 -0
  372. package/src/wirings/agent/voice-input.ts +1 -1
  373. package/src/wirings/agent/voice-output.test.ts +2 -4
  374. package/src/wirings/agent/voice-output.ts +1 -1
  375. package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +145 -0
  376. package/src/wirings/agent-scorer/agent-scorer-judge.ts +60 -0
  377. package/src/wirings/agent-scorer/agent-scorer.ts +8 -0
  378. package/src/wirings/agent-scorer/agent-scorer.types.ts +21 -0
  379. package/src/wirings/agent-scorer/index.ts +1 -0
  380. package/src/wirings/channel/channel-common.ts +4 -2
  381. package/src/wirings/channel/channel-handler.ts +2 -5
  382. package/src/wirings/channel/channel-middleware-runner.ts +1 -1
  383. package/src/wirings/channel/channel-rpc.types.ts +1 -5
  384. package/src/wirings/channel/channel.types.ts +1 -2
  385. package/src/wirings/channel/local/local-channel-runner.test.ts +1 -2
  386. package/src/wirings/channel/serverless/index.ts +1 -0
  387. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +2 -2
  388. package/src/wirings/cli/channel/index.ts +1 -3
  389. package/src/wirings/cli/cli-runner.test.ts +1 -1
  390. package/src/wirings/cli/cli-runner.ts +11 -7
  391. package/src/wirings/cli/cli.types.ts +24 -3
  392. package/src/wirings/cli/command-parser.test.ts +388 -1
  393. package/src/wirings/cli/command-parser.ts +189 -29
  394. package/src/wirings/gateway/gateway-runner.test.ts +1 -2
  395. package/src/wirings/gateway/gateway-runner.ts +3 -6
  396. package/src/wirings/gateway/gateway.types.ts +5 -4
  397. package/src/wirings/http/http-routes.test.ts +1 -2
  398. package/src/wirings/http/http-runner-addon-ref.test.ts +238 -0
  399. package/src/wirings/http/http-runner.test.ts +3 -8
  400. package/src/wirings/http/http-runner.ts +9 -3
  401. package/src/wirings/http/http.types.ts +3 -12
  402. package/src/wirings/http/index.ts +1 -0
  403. package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
  404. package/src/wirings/http/pikku-fetch-http-response.ts +3 -2
  405. package/src/wirings/mcp/mcp-runner.test.ts +1 -1
  406. package/src/wirings/mcp/mcp.types.ts +1 -2
  407. package/src/wirings/persona/index.ts +1 -4
  408. package/src/wirings/persona/persona.types.ts +14 -0
  409. package/src/wirings/queue/queue-identity.test.ts +1 -1
  410. package/src/wirings/queue/queue.types.ts +2 -6
  411. package/src/wirings/queue/signed-queue-service.ts +1 -1
  412. package/src/wirings/rpc/index.ts +0 -12
  413. package/src/wirings/rpc/rpc-runner.test.ts +4 -4
  414. package/src/wirings/rpc/rpc-runner.ts +3 -3
  415. package/src/wirings/scheduler/scheduler.types.ts +2 -5
  416. package/src/wirings/scope/index.ts +1 -0
  417. package/src/wirings/secret/secret.types.ts +10 -0
  418. package/src/wirings/secret/validate-secret-definitions.test.ts +23 -0
  419. package/src/wirings/secret/validate-secret-definitions.ts +2 -0
  420. package/src/wirings/variable/validate-variable-definitions.test.ts +23 -0
  421. package/src/wirings/variable/validate-variable-definitions.ts +2 -0
  422. package/src/wirings/variable/variable.types.ts +9 -0
  423. package/src/wirings/virtual-user/index.ts +1 -4
  424. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +1 -1
  425. package/src/wirings/virtual-user/virtual-user-derive.test.ts +1 -1
  426. package/src/wirings/virtual-user/virtual-user-derive.ts +1 -1
  427. package/src/wirings/virtual-user/virtual-user.types.ts +1 -5
  428. package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +569 -0
  429. package/src/wirings/workflow/graph/graph-foreach.test.ts +626 -0
  430. package/src/wirings/workflow/graph/graph-node.ts +16 -1
  431. package/src/wirings/workflow/graph/graph-runner.ts +387 -61
  432. package/src/wirings/workflow/graph/workflow-graph.types.ts +28 -3
  433. package/src/wirings/workflow/index.ts +8 -0
  434. package/src/wirings/workflow/pikku-scenario-service.ts +59 -19
  435. package/src/wirings/workflow/pikku-workflow-service.ts +6 -8
  436. package/src/wirings/workflow/run-timeline.ts +1 -1
  437. package/src/wirings/workflow/scenario-expectations.test.ts +28 -13
  438. package/src/wirings/workflow/scenario-run.types.ts +186 -0
  439. package/src/wirings/workflow/scenario-step-guards.ts +1 -14
  440. package/src/wirings/workflow/scenario-step.test.ts +32 -7
  441. package/src/wirings/workflow/scenario-step.types.ts +27 -12
  442. package/src/wirings/workflow/workflow-approval-policy.test.ts +117 -47
  443. package/src/wirings/workflow/workflow-approval.ts +2 -1
  444. package/src/wirings/workflow/workflow-run-engine.types.ts +2 -1
  445. package/src/wirings/workflow/workflow.types.ts +4 -12
  446. package/src/wirings-stay-decoupled.test.ts +6 -3
  447. package/tsconfig.tsbuildinfo +1 -1
  448. package/tsconfig.type-tests.json +3 -2
  449. package/dist/ecosystem/ai-agent.d.ts +0 -18
  450. package/dist/ecosystem/ai-agent.js +0 -6
  451. package/dist/ecosystem/ai-scorer.d.ts +0 -12
  452. package/dist/ecosystem/ai-scorer.js +0 -5
  453. package/dist/services/ai-agent-runner-service.d.ts +0 -220
  454. package/dist/services/ai-run-state-service.d.ts +0 -29
  455. package/dist/services/ai-storage-service.d.ts +0 -18
  456. package/dist/services/in-memory-ai-run-state-service.d.ts +0 -19
  457. package/dist/services/in-memory-ai-run-state-service.js +0 -54
  458. package/dist/testing/service-tests/ai-storage-service-tests.d.ts +0 -3
  459. package/dist/testing/service-tests/ai-storage-service-tests.js +0 -302
  460. package/dist/wirings/ai-agent/agent-rpc.d.ts +0 -15
  461. package/dist/wirings/ai-agent/agent-rpc.js +0 -53
  462. package/dist/wirings/ai-agent/ai-agent-agui.d.ts +0 -79
  463. package/dist/wirings/ai-agent/ai-agent-agui.js +0 -327
  464. package/dist/wirings/ai-agent/ai-agent-finalize.d.ts +0 -58
  465. package/dist/wirings/ai-agent/ai-agent-finalize.js +0 -138
  466. package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +0 -35
  467. package/dist/wirings/ai-agent/ai-agent-helpers.js +0 -47
  468. package/dist/wirings/ai-agent/ai-agent-interrupt.d.ts +0 -153
  469. package/dist/wirings/ai-agent/ai-agent-interrupt.js +0 -257
  470. package/dist/wirings/ai-agent/ai-agent-memory.d.ts +0 -42
  471. package/dist/wirings/ai-agent/ai-agent-memory.js +0 -333
  472. package/dist/wirings/ai-agent/ai-agent-model-config.d.ts +0 -16
  473. package/dist/wirings/ai-agent/ai-agent-model-config.js +0 -51
  474. package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +0 -117
  475. package/dist/wirings/ai-agent/ai-agent-prepare.js +0 -728
  476. package/dist/wirings/ai-agent/ai-agent-registry.d.ts +0 -16
  477. package/dist/wirings/ai-agent/ai-agent-registry.js +0 -51
  478. package/dist/wirings/ai-agent/ai-agent-runner.d.ts +0 -7
  479. package/dist/wirings/ai-agent/ai-agent-runner.js +0 -580
  480. package/dist/wirings/ai-agent/ai-agent-stream.d.ts +0 -41
  481. package/dist/wirings/ai-agent/ai-agent-stream.js +0 -1029
  482. package/dist/wirings/ai-agent/ai-agent-turn.d.ts +0 -57
  483. package/dist/wirings/ai-agent/ai-agent-turn.js +0 -82
  484. package/dist/wirings/ai-agent/ai-agent-utils.d.ts +0 -1
  485. package/dist/wirings/ai-agent/ai-agent-utils.js +0 -1
  486. package/dist/wirings/ai-agent/ai-agent.types.d.ts +0 -625
  487. package/dist/wirings/ai-agent/index.d.ts +0 -12
  488. package/dist/wirings/ai-agent/index.js +0 -10
  489. package/dist/wirings/ai-agent/voice-input.d.ts +0 -69
  490. package/dist/wirings/ai-agent/voice-input.js +0 -150
  491. package/dist/wirings/ai-agent/voice-output.d.ts +0 -85
  492. package/dist/wirings/ai-agent/voice-output.js +0 -196
  493. package/dist/wirings/ai-scorer/ai-scorer-grade.d.ts +0 -26
  494. package/dist/wirings/ai-scorer/ai-scorer-grade.js +0 -33
  495. package/dist/wirings/ai-scorer/ai-scorer-judge.d.ts +0 -17
  496. package/dist/wirings/ai-scorer/ai-scorer-judge.js +0 -92
  497. package/dist/wirings/ai-scorer/ai-scorer-live.d.ts +0 -15
  498. package/dist/wirings/ai-scorer/ai-scorer-live.js +0 -38
  499. package/dist/wirings/ai-scorer/ai-scorer-registry.d.ts +0 -18
  500. package/dist/wirings/ai-scorer/ai-scorer-registry.js +0 -46
  501. package/dist/wirings/ai-scorer/ai-scorer-sampling.d.ts +0 -8
  502. package/dist/wirings/ai-scorer/ai-scorer-sampling.js +0 -31
  503. package/dist/wirings/ai-scorer/ai-scorer-snapshots.d.ts +0 -10
  504. package/dist/wirings/ai-scorer/ai-scorer-snapshots.js +0 -40
  505. package/dist/wirings/ai-scorer/ai-scorer-worker.d.ts +0 -15
  506. package/dist/wirings/ai-scorer/ai-scorer-worker.js +0 -58
  507. package/dist/wirings/ai-scorer/ai-scorer.d.ts +0 -39
  508. package/dist/wirings/ai-scorer/ai-scorer.js +0 -40
  509. package/dist/wirings/ai-scorer/ai-scorer.types.d.ts +0 -90
  510. package/dist/wirings/ai-scorer/ai-scorer.types.js +0 -4
  511. package/dist/wirings/ai-scorer/index.d.ts +0 -6
  512. package/dist/wirings/ai-scorer/index.js +0 -5
  513. package/src/ecosystem/agent-scorer.ts +0 -24
  514. package/src/ecosystem/agent.ts +0 -42
  515. package/src/ecosystem/channel/local.ts +0 -1
  516. package/src/ecosystem/channel.ts +0 -22
  517. package/src/ecosystem/cli/channel.ts +0 -25
  518. package/src/ecosystem/cli.ts +0 -21
  519. package/src/ecosystem/credential.ts +0 -10
  520. package/src/ecosystem/dev.ts +0 -12
  521. package/src/ecosystem/function.ts +0 -28
  522. package/src/ecosystem/gateway.ts +0 -4
  523. package/src/ecosystem/hmac.ts +0 -1
  524. package/src/ecosystem/http.ts +0 -22
  525. package/src/ecosystem/mcp.ts +0 -17
  526. package/src/ecosystem/middleware.ts +0 -27
  527. package/src/ecosystem/node-host-resolver.ts +0 -1
  528. package/src/ecosystem/node.ts +0 -5
  529. package/src/ecosystem/oauth2.ts +0 -4
  530. package/src/ecosystem/persona.ts +0 -30
  531. package/src/ecosystem/queue.ts +0 -23
  532. package/src/ecosystem/remote.ts +0 -9
  533. package/src/ecosystem/role.ts +0 -13
  534. package/src/ecosystem/rpc.ts +0 -7
  535. package/src/ecosystem/safe-fetch.ts +0 -8
  536. package/src/ecosystem/scenario.ts +0 -32
  537. package/src/ecosystem/scheduler.ts +0 -5
  538. package/src/ecosystem/schema.ts +0 -1
  539. package/src/ecosystem/scope.ts +0 -14
  540. package/src/ecosystem/secret.ts +0 -15
  541. package/src/ecosystem/services/istanbul-coverage.ts +0 -1
  542. package/src/ecosystem/services/local-content-request-handler.ts +0 -16
  543. package/src/ecosystem/services/local-content.ts +0 -1
  544. package/src/ecosystem/services/v8-coverage.ts +0 -1
  545. package/src/ecosystem/services.ts +0 -82
  546. package/src/ecosystem/trigger.ts +0 -7
  547. package/src/ecosystem/types.ts +0 -34
  548. package/src/ecosystem/variable.ts +0 -14
  549. package/src/ecosystem/virtual-user.ts +0 -48
  550. package/src/ecosystem/workflow.ts +0 -68
  551. package/src/ecosystem.ts +0 -40
  552. package/src/index.ts +0 -244
  553. /package/dist/{services/ai-agent-runner-service.js → bootstrap-compat/root.js} +0 -0
  554. /package/dist/{services/ai-run-state-service.js → classification/data-classification.js} +0 -0
  555. /package/dist/{services/ai-storage-service.js → errors/serialized-error.js} +0 -0
  556. /package/dist/{wirings/ai-agent/ai-agent.types.js → function/function-meta.types.js} +0 -0
  557. /package/src/{column-form.ts → classification/column-form.ts} +0 -0
  558. /package/src/{pikku-request.test.ts → function/pikku-request.test.ts} +0 -0
  559. /package/src/{pikku-request.ts → function/pikku-request.ts} +0 -0
  560. /package/src/wirings/{rpc → addon}/addon-auth-tags.test.ts +0 -0
  561. /package/src/wirings/{rpc → addon}/addon-runner.ts +0 -0
  562. /package/src/wirings/{rpc → addon}/addon-secrets.test.ts +0 -0
  563. /package/src/wirings/{rpc → addon}/wire-addon.test.ts +0 -0
  564. /package/src/wirings/{rpc → addon}/wire-remote-addon.ts +0 -0
@@ -1,333 +0,0 @@
1
- import { randomUUID } from 'crypto';
2
- export function resolveMemoryServices(agent, singletonServices) {
3
- const memoryConfig = agent.memory;
4
- const storage = memoryConfig?.storage
5
- ? // The service is named by string in agent config, so the lookup cannot be
6
- // checked — only the shape it is required to have.
7
- singletonServices[memoryConfig.storage]
8
- : singletonServices.aiStorage;
9
- return { storage };
10
- }
11
- export function isWorkingMemoryEnabled(memoryConfig, storage) {
12
- return !!memoryConfig?.workingMemory && !!storage;
13
- }
14
- export function deepMergeWorkingMemory(existing, updates) {
15
- const result = { ...existing };
16
- for (const key of Object.keys(updates)) {
17
- if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
18
- continue;
19
- }
20
- const value = updates[key];
21
- if (value === null) {
22
- delete result[key];
23
- }
24
- else if (typeof value === 'object' &&
25
- !Array.isArray(value) &&
26
- typeof result[key] === 'object' &&
27
- result[key] !== null &&
28
- !Array.isArray(result[key])) {
29
- result[key] = deepMergeWorkingMemory(result[key], value);
30
- }
31
- else {
32
- result[key] = value;
33
- }
34
- }
35
- return result;
36
- }
37
- export function buildWorkingMemoryPrompt(currentState, jsonSchema) {
38
- const parts = [];
39
- if (jsonSchema?.properties) {
40
- const props = jsonSchema.properties;
41
- const fieldLines = Object.entries(props).map(([name, def]) => {
42
- const type = def.type ?? 'unknown';
43
- const desc = def.description ? ` - ${def.description}` : '';
44
- return ` - ${name} (${type})${desc}`;
45
- });
46
- if (fieldLines.length > 0) {
47
- parts.push(`Working memory fields:\n${fieldLines.join('\n')}`);
48
- }
49
- }
50
- if (currentState && Object.keys(currentState).length > 0) {
51
- parts.push(`Current working memory:\n${JSON.stringify(currentState)}`);
52
- }
53
- else {
54
- parts.push('Current working memory: (empty)');
55
- }
56
- parts.push('When you learn new information, output a partial JSON update in <working_memory> tags. ' +
57
- 'Only include durable facts you have actually derived or the user has confirmed. ' +
58
- 'Do not output templates, placeholders, or narration. ' +
59
- 'Only include changed fields. Leave unknown fields untouched. Set a field to null to delete it.');
60
- return parts.join('\n\n');
61
- }
62
- export async function loadContextMessages(memoryConfig, storage, input, workingMemoryJsonSchema) {
63
- const contextMessages = [];
64
- const workingMemoryStorage = isWorkingMemoryEnabled(memoryConfig, storage)
65
- ? storage
66
- : undefined;
67
- if (workingMemoryStorage) {
68
- const workingMem = await workingMemoryStorage.getWorkingMemory(input.threadId, 'thread');
69
- const prompt = buildWorkingMemoryPrompt(workingMem, workingMemoryJsonSchema);
70
- contextMessages.push({
71
- id: `wm-${randomUUID()}`,
72
- role: 'system',
73
- content: prompt,
74
- createdAt: new Date(),
75
- });
76
- }
77
- return contextMessages;
78
- }
79
- export async function saveMessages(storage, threadId, resourceId, memoryConfig, userMessage, result) {
80
- const responseText = memoryConfig?.workingMemory
81
- ? extractWorkingMemory(result.text).cleanedText
82
- : result.text;
83
- if (storage) {
84
- const newMessages = userMessage ? [userMessage] : [];
85
- for (const step of result.steps) {
86
- if (step.toolCalls?.length) {
87
- const toolCallIds = step.toolCalls.map(() => randomUUID());
88
- newMessages.push({
89
- id: randomUUID(),
90
- role: 'assistant',
91
- toolCalls: step.toolCalls.map((tc, i) => ({
92
- id: toolCallIds[i],
93
- name: tc.name,
94
- args: tc.args,
95
- })),
96
- createdAt: new Date(),
97
- });
98
- newMessages.push({
99
- id: randomUUID(),
100
- role: 'tool',
101
- toolResults: step.toolCalls.map((tc, i) => ({
102
- id: toolCallIds[i],
103
- name: tc.name,
104
- result: tc.result,
105
- ...(tc.error ? { error: tc.error } : {}),
106
- })),
107
- createdAt: new Date(),
108
- });
109
- }
110
- }
111
- const assistantContent = result.uiSpec != null
112
- ? [
113
- ...(responseText
114
- ? [{ type: 'text', text: responseText }]
115
- : []),
116
- { type: 'generative-ui', spec: result.uiSpec },
117
- ]
118
- : responseText;
119
- newMessages.push({
120
- id: randomUUID(),
121
- role: 'assistant',
122
- content: assistantContent || undefined,
123
- createdAt: new Date(),
124
- });
125
- await storage.saveMessages(threadId, newMessages);
126
- }
127
- return responseText;
128
- }
129
- export function trimMessages(messages, maxTokenBudget = 100000) {
130
- const sanitized = sanitizeToolMessages(messages);
131
- let estimatedTokens = 0;
132
- const result = [];
133
- for (let i = sanitized.length - 1; i >= 0; i--) {
134
- const msg = sanitized[i];
135
- const msgTokens = estimateTokens(msg);
136
- if (estimatedTokens + msgTokens > maxTokenBudget && result.length > 0) {
137
- break;
138
- }
139
- estimatedTokens += msgTokens;
140
- result.unshift(msg);
141
- }
142
- if (result.length > 0 &&
143
- result[0].role !== 'user' &&
144
- result[0].role !== 'system') {
145
- const firstUserIdx = result.findIndex((m) => m.role === 'user' || m.role === 'system');
146
- if (firstUserIdx > 0) {
147
- return result.slice(firstUserIdx);
148
- }
149
- }
150
- return result;
151
- }
152
- function sanitizeToolMessages(messages) {
153
- const result = [];
154
- for (let i = 0; i < messages.length; i++) {
155
- const msg = messages[i];
156
- if (msg.role === 'assistant' && msg.toolCalls?.length) {
157
- const next = messages[i + 1];
158
- if (!next || next.role !== 'tool' || !next.toolResults?.length) {
159
- if (msg.content) {
160
- result.push({ ...msg, toolCalls: undefined });
161
- }
162
- continue;
163
- }
164
- const toolCallIds = new Set(msg.toolCalls.map((tc) => tc.id));
165
- const resultIds = new Set(next.toolResults.map((tr) => tr.id));
166
- const allMatched = [...toolCallIds].every((id) => resultIds.has(id));
167
- if (!allMatched) {
168
- if (msg.content) {
169
- result.push({ ...msg, toolCalls: undefined });
170
- }
171
- result.push({
172
- ...next,
173
- toolResults: next.toolResults.filter((tr) => !toolCallIds.has(tr.id)) ||
174
- undefined,
175
- });
176
- i++;
177
- continue;
178
- }
179
- }
180
- result.push(msg);
181
- }
182
- return result.filter((m) => m.role !== 'tool' || (m.toolResults && m.toolResults.length > 0));
183
- }
184
- function estimateTokens(msg) {
185
- let chars = 0;
186
- if (msg.content) {
187
- if (typeof msg.content === 'string') {
188
- chars += msg.content.length;
189
- }
190
- else {
191
- for (const part of msg.content) {
192
- if (part.type === 'text')
193
- chars += part.text.length;
194
- else
195
- chars += 1000;
196
- }
197
- }
198
- }
199
- if (msg.toolCalls)
200
- chars += JSON.stringify(msg.toolCalls).length;
201
- if (msg.toolResults)
202
- chars += JSON.stringify(msg.toolResults).length;
203
- return Math.ceil(chars / 4);
204
- }
205
- export function parseWorkingMemory(text) {
206
- const match = text.match(/<working_memory>([\s\S]*?)<\/working_memory>/);
207
- if (!match)
208
- return null;
209
- try {
210
- return JSON.parse(match[1].trim());
211
- }
212
- catch {
213
- return null;
214
- }
215
- }
216
- export function stripWorkingMemoryTags(text) {
217
- return text.replace(/<working_memory>[\s\S]*?<\/working_memory>/g, '').trim();
218
- }
219
- export function extractWorkingMemory(text) {
220
- const workingMemory = parseWorkingMemory(text);
221
- return {
222
- workingMemory,
223
- cleanedText: workingMemory ? stripWorkingMemoryTags(text) : text,
224
- };
225
- }
226
- function getPendingWorkingMemoryPrefixLength(text) {
227
- const prefixes = ['<working_memory>', '</working_memory>'];
228
- const lastLt = text.lastIndexOf('<');
229
- if (lastLt === -1)
230
- return 0;
231
- const suffix = text.slice(lastLt);
232
- for (const prefix of prefixes) {
233
- if (prefix.startsWith(suffix)) {
234
- return suffix.length;
235
- }
236
- }
237
- return 0;
238
- }
239
- export function stripWorkingMemoryForStreaming(text) {
240
- let output = '';
241
- let cursor = 0;
242
- while (cursor < text.length) {
243
- const openIndex = text.indexOf('<working_memory>', cursor);
244
- if (openIndex === -1) {
245
- const tail = text.slice(cursor);
246
- const pendingPrefixLength = getPendingWorkingMemoryPrefixLength(tail);
247
- output +=
248
- pendingPrefixLength > 0 ? tail.slice(0, -pendingPrefixLength) : tail;
249
- return output;
250
- }
251
- output += text.slice(cursor, openIndex);
252
- const closeIndex = text.indexOf('</working_memory>', openIndex);
253
- if (closeIndex === -1) {
254
- return output;
255
- }
256
- cursor = closeIndex + '</working_memory>'.length;
257
- }
258
- return output;
259
- }
260
- async function persistWorkingMemory(options, workingMemory) {
261
- if (!options.storage)
262
- return;
263
- const existing = (await options.storage.getWorkingMemory(options.threadId, 'thread')) ?? {};
264
- const merged = deepMergeWorkingMemory(existing, workingMemory);
265
- if (options.schemaService && options.workingMemorySchemaName) {
266
- try {
267
- await options.schemaService.validateSchema(options.workingMemorySchemaName, merged);
268
- }
269
- catch (err) {
270
- options.logger?.warn(`Working memory validation failed: ${err instanceof Error ? err.message : String(err)}`);
271
- return;
272
- }
273
- }
274
- await options.storage.saveWorkingMemory(options.threadId, 'thread', merged);
275
- }
276
- export function createWorkingMemoryMiddleware(options) {
277
- return {
278
- modifyOutputStream: async (_services, { event, state }) => {
279
- // A streamed step ends at its `usage` event, or at `done` for a model
280
- // that reports no usage. That is the last moment the unstripped text is
281
- // still reachable: it lives only in `state.rawText`, because the strip
282
- // below runs before anything downstream — including the channel that
283
- // accumulates what `modifyOutput` would later be handed.
284
- if (event.type === 'usage' || event.type === 'done') {
285
- const { workingMemory } = extractWorkingMemory(state.rawText ?? '');
286
- state.rawText = '';
287
- state.emittedVisibleText = '';
288
- if (workingMemory) {
289
- await persistWorkingMemory(options, workingMemory);
290
- }
291
- return event;
292
- }
293
- if (event.type !== 'text-delta')
294
- return event;
295
- const rawText = `${state.rawText ?? ''}${event.text}`;
296
- state.rawText = rawText;
297
- const visibleText = stripWorkingMemoryForStreaming(rawText);
298
- const emittedVisibleText = state.emittedVisibleText ?? '';
299
- if (!visibleText.startsWith(emittedVisibleText)) {
300
- state.emittedVisibleText = visibleText;
301
- return { ...event, text: visibleText };
302
- }
303
- const delta = visibleText.slice(emittedVisibleText.length);
304
- state.emittedVisibleText = visibleText;
305
- if (!delta)
306
- return null;
307
- return { ...event, text: delta };
308
- },
309
- modifyOutput: async (_services, { text, messages }) => {
310
- const { workingMemory, cleanedText } = extractWorkingMemory(text);
311
- if (workingMemory) {
312
- await persistWorkingMemory(options, workingMemory);
313
- }
314
- return {
315
- text: cleanedText,
316
- messages,
317
- };
318
- },
319
- };
320
- }
321
- export function getWorkingMemoryMiddleware(memoryConfig, storage, options) {
322
- if (!isWorkingMemoryEnabled(memoryConfig, storage))
323
- return [];
324
- return [
325
- createWorkingMemoryMiddleware({
326
- storage,
327
- threadId: options.threadId,
328
- workingMemorySchemaName: options.workingMemorySchemaName,
329
- logger: options.logger,
330
- schemaService: options.schemaService,
331
- }),
332
- ];
333
- }
@@ -1,16 +0,0 @@
1
- /**
2
- * Resolves a model name to a concrete `provider/model`. Aliases come from the
3
- * `models` table in pikku.config.json; a name containing `/` is already
4
- * concrete. Read from the main package, not the calling addon's — which model
5
- * a tier points at is the hosting app's decision.
6
- */
7
- export declare const resolveModelAlias: (model: string) => string;
8
- export declare function resolveModelConfig(_agentName: string, agent: {
9
- model: string;
10
- temperature?: number;
11
- maxSteps?: number;
12
- }): {
13
- model: string;
14
- temperature?: number;
15
- maxSteps?: number;
16
- };
@@ -1,51 +0,0 @@
1
- // knowledge: decisions/internals/ai-agent-model-config-stays-a-single-resolution-seam.md
2
- import { pikkuState } from '../../pikku-state.js';
3
- const isProviderQualified = (model) => model.includes('/');
4
- /** `PIKKU_MODEL_ALIASES=cheap:openai/gpt-5-mini,tool:anthropic/claude-sonnet-5` */
5
- const envAliases = () => {
6
- const raw = process.env.PIKKU_MODEL_ALIASES;
7
- if (!raw)
8
- return {};
9
- const aliases = {};
10
- for (const entry of raw.split(',')) {
11
- // First colon only — a model id may contain its own.
12
- const separator = entry.indexOf(':');
13
- if (separator === -1)
14
- continue;
15
- const alias = entry.slice(0, separator).trim();
16
- const model = entry.slice(separator + 1).trim();
17
- if (alias && model)
18
- aliases[alias] = model;
19
- }
20
- return aliases;
21
- };
22
- /**
23
- * Resolves a model name to a concrete `provider/model`. Aliases come from the
24
- * `models` table in pikku.config.json; a name containing `/` is already
25
- * concrete. Read from the main package, not the calling addon's — which model
26
- * a tier points at is the hosting app's decision.
27
- */
28
- export const resolveModelAlias = (model) => {
29
- if (isProviderQualified(model))
30
- return model;
31
- const generated = pikkuState(null, 'agent', 'modelAliases');
32
- const override = envAliases()[model];
33
- const resolved = override ?? generated[model];
34
- if (!resolved) {
35
- const known = Object.keys({ ...generated, ...envAliases() }).sort();
36
- throw new Error(`Unknown model alias '${model}'. ` +
37
- (known.length
38
- ? `Known aliases: ${known.join(', ')}. `
39
- : `No aliases are configured. `) +
40
- `Add it to the "models" table in pikku.config.json, or name a ` +
41
- `provider-qualified model such as 'openai/gpt-5-mini'.`);
42
- }
43
- return resolved;
44
- };
45
- export function resolveModelConfig(_agentName, agent) {
46
- return {
47
- model: resolveModelAlias(agent.model),
48
- temperature: agent.temperature,
49
- maxSteps: agent.maxSteps,
50
- };
51
- }
@@ -1,117 +0,0 @@
1
- import type { CoreUserSession } from '../../types/core.types.js';
2
- import type { CoreAIAgent, AIAgentInput, AIAgentToolDef, AIMessage, AIStreamChannel, PikkuAIMiddlewareHooks, SessionScope } from './ai-agent.types.js';
3
- import type { AIAgentRunnerParams } from '../../services/ai-agent-runner-service.js';
4
- import { PikkuError } from '../../errors/error-handler.js';
5
- import type { SessionService } from '../../services/user-session-service.js';
6
- export type RunAIAgentParams = {
7
- sessionService?: SessionService<CoreUserSession>;
8
- /** Credential accessor for the current request — used to read per-user overrides (e.g. AI_API_KEY). */
9
- getCredential?: <T = unknown>(name: string) => T | null | Promise<T | null>;
10
- /** Ephemeral owner identity minted for a sessionless request; never client-supplied, never reused across requests. */
11
- anonymousOwnerResourceId?: string;
12
- };
13
- export declare function resolveSessionPrincipal(params: RunAIAgentParams, sessionScope: SessionScope | undefined): string | undefined;
14
- export declare function resolveOwnerResourceId(params: RunAIAgentParams, sessionScope: SessionScope | undefined, requestedResourceId: string): string;
15
- export declare function assertResourcePrincipalOwner(params: RunAIAgentParams, sessionScope: SessionScope | undefined, storedResourceId: string, kind: 'thread' | 'run'): void;
16
- export declare function agentSessionScope(agentName: string): SessionScope;
17
- export declare function assertResourceOwner(ownerResourceId: string, storedResourceId: string, kind: 'thread' | 'run'): void;
18
- export declare function sessionPrincipals(session: {
19
- userId?: string;
20
- orgId?: string;
21
- } | undefined): string[];
22
- export declare function isOwnedByPrincipal(storedResourceId: string, principal: string): boolean;
23
- export declare function threadOwnerConstraint(session: {
24
- userId?: string;
25
- orgId?: string;
26
- } | undefined): string[];
27
- export declare function canAccessThread(storedResourceId: string, session: {
28
- userId?: string;
29
- orgId?: string;
30
- } | undefined): boolean;
31
- export type StreamAIAgentOptions = {
32
- requiresToolApproval?: 'all' | 'explicit' | false;
33
- onRunCreated?: (runId: string) => void;
34
- };
35
- export declare const APPROVAL_REQUIRED: unique symbol;
36
- /**
37
- * In-process brand proving a credential request was produced by pikku itself and
38
- * not by tool output an attacker can influence. Never serialized — a value that
39
- * has crossed a JSON boundary has lost the brand and is treated as untrusted.
40
- */
41
- export declare const CREDENTIAL_REQUIRED: unique symbol;
42
- export declare class ToolApprovalRequired extends PikkuError {
43
- readonly toolCallId: string;
44
- readonly toolName: string;
45
- readonly args: unknown;
46
- reason?: string;
47
- readonly displayToolName?: string;
48
- readonly displayArgs?: unknown;
49
- readonly agentRunId?: string;
50
- constructor(toolCallId: string, toolName: string, args: unknown, reason?: string, displayToolName?: string, displayArgs?: unknown, agentRunId?: string);
51
- }
52
- export declare class ToolCredentialRequired extends PikkuError {
53
- readonly toolCallId: string;
54
- readonly toolName: string;
55
- readonly args: unknown;
56
- readonly credentialName: string;
57
- readonly credentialType: 'oauth2' | 'apikey';
58
- readonly connectUrl?: string;
59
- constructor(toolCallId: string, toolName: string, args: unknown, credentialName: string, credentialType: 'oauth2' | 'apikey', connectUrl?: string);
60
- }
61
- export interface AddonCredentialRequirement {
62
- credentialName: string;
63
- displayName: string;
64
- addonNamespace: string;
65
- type: 'wire';
66
- oauth2: boolean;
67
- }
68
- export declare function getAddonCredentialRequirements(toolNames: string[]): AddonCredentialRequirement[];
69
- export type StreamContext = {
70
- channel: AIStreamChannel;
71
- options?: StreamAIAgentOptions;
72
- delegateState?: {
73
- delegated: boolean;
74
- };
75
- };
76
- export declare const resolveAgent: (agentName: string) => {
77
- agent: CoreAIAgent;
78
- packageName: string | null;
79
- resolvedName: string;
80
- };
81
- export declare function assertAgentAuthorized(agent: CoreAIAgent, params: RunAIAgentParams, packageName: string | null): Promise<void>;
82
- export declare function buildInstructions(agentName: string, packageName: string | null): Promise<string>;
83
- export type ScopedChannel = AIStreamChannel & {
84
- approvals: Array<{
85
- toolCallId: string;
86
- toolName: string;
87
- args: unknown;
88
- reason?: string;
89
- runId: string;
90
- }>;
91
- };
92
- export declare function createScopedChannel(parent: AIStreamChannel, agentName: string, session: string): ScopedChannel;
93
- export declare function buildSubAgentRunInput(message: string, threadId: string, resourceId: string, parentContext?: string): {
94
- message: string;
95
- threadId: string;
96
- resourceId: string;
97
- context?: string;
98
- };
99
- export declare function buildToolDefs(params: RunAIAgentParams, agentSessionMap: Map<string, string>, resourceId: string, agentName: string, packageName: string | null, streamContext?: StreamContext, aiMiddlewares?: PikkuAIMiddlewareHooks[], agentMode?: 'delegate' | 'supervise', parentContext?: string): Promise<{
100
- tools: AIAgentToolDef[];
101
- missingRpcs: string[];
102
- }>;
103
- export declare function prepareAgentRun(agentName: string, input: AIAgentInput, params: RunAIAgentParams, agentSessionMap: Map<string, string>, streamContext?: StreamContext): Promise<{
104
- agent: CoreAIAgent;
105
- packageName: string | null;
106
- resolvedName: string;
107
- agentRunner: import("../../services/ai-agent-runner-service.js").AIAgentRunnerService;
108
- storage: import("../../index.js").AIStorageService | undefined;
109
- memoryConfig: import("./ai-agent.types.js").AIAgentMemoryConfig | undefined;
110
- threadId: string;
111
- userMessage: AIMessage;
112
- runnerParams: AIAgentRunnerParams;
113
- maxSteps: number;
114
- missingRpcs: string[];
115
- workingMemoryJsonSchema: any;
116
- workingMemorySchemaName: string | null;
117
- }>;