@pikku/core 0.12.78 → 0.12.80

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 (341) hide show
  1. package/CHANGELOG.md +234 -0
  2. package/dist/dev/hot-reload.js +1 -6
  3. package/dist/ecosystem.d.ts +27 -0
  4. package/dist/ecosystem.js +26 -0
  5. package/dist/errors/error-handler.js +4 -2
  6. package/dist/function/function-runner.js +20 -42
  7. package/dist/function/functions.types.d.ts +9 -5
  8. package/dist/index.d.ts +4 -9
  9. package/dist/index.js +3 -8
  10. package/dist/middleware/auth-cookie.d.ts +0 -4
  11. package/dist/middleware/auth-cookie.js +38 -2
  12. package/dist/middleware/cors.js +1 -0
  13. package/dist/middleware/index.d.ts +1 -1
  14. package/dist/middleware/index.js +1 -1
  15. package/dist/middleware/remote-auth.js +14 -3
  16. package/dist/permissions.d.ts +8 -10
  17. package/dist/permissions.js +0 -11
  18. package/dist/pikku-state.js +12 -5
  19. package/dist/schema.js +35 -1
  20. package/dist/services/ai-run-state-service.d.ts +7 -1
  21. package/dist/services/in-memory-ai-run-state-service.d.ts +1 -1
  22. package/dist/services/in-memory-ai-run-state-service.js +2 -1
  23. package/dist/services/in-memory-workflow-service.d.ts +10 -0
  24. package/dist/services/in-memory-workflow-service.js +25 -0
  25. package/dist/services/local-content-request-handler.d.ts +21 -0
  26. package/dist/services/local-content-request-handler.js +72 -53
  27. package/dist/services/local-content.d.ts +6 -0
  28. package/dist/services/local-content.js +14 -1
  29. package/dist/services/workflow-service.d.ts +4 -2
  30. package/dist/testing/service-tests/agent-run-service-tests.d.ts +10 -0
  31. package/dist/testing/service-tests/agent-run-service-tests.js +72 -0
  32. package/dist/testing/service-tests/ai-storage-service-tests.d.ts +3 -0
  33. package/dist/testing/service-tests/ai-storage-service-tests.js +226 -0
  34. package/dist/testing/service-tests/channel-store-tests.d.ts +3 -0
  35. package/dist/testing/service-tests/channel-store-tests.js +72 -0
  36. package/dist/testing/service-tests/credential-service-tests.d.ts +3 -0
  37. package/dist/testing/service-tests/credential-service-tests.js +109 -0
  38. package/dist/testing/service-tests/deployment-service-tests.d.ts +3 -0
  39. package/dist/testing/service-tests/deployment-service-tests.js +21 -0
  40. package/dist/testing/service-tests/event-hub-store-tests.d.ts +3 -0
  41. package/dist/testing/service-tests/event-hub-store-tests.js +34 -0
  42. package/dist/testing/service-tests/secret-service-tests.d.ts +3 -0
  43. package/dist/testing/service-tests/secret-service-tests.js +80 -0
  44. package/dist/testing/service-tests/session-store-tests.d.ts +3 -0
  45. package/dist/testing/service-tests/session-store-tests.js +43 -0
  46. package/dist/testing/service-tests/workflow-run-service-tests.d.ts +3 -0
  47. package/dist/testing/service-tests/workflow-run-service-tests.js +42 -0
  48. package/dist/testing/service-tests/workflow-service-tests.d.ts +3 -0
  49. package/dist/testing/service-tests/workflow-service-tests.js +150 -0
  50. package/dist/testing/service-tests.d.ts +6 -0
  51. package/dist/testing/service-tests.js +26 -791
  52. package/dist/types/core.types.d.ts +11 -1
  53. package/dist/types/state.types.d.ts +1 -1
  54. package/dist/utils/node-host-resolver.d.ts +12 -0
  55. package/dist/utils/node-host-resolver.js +16 -0
  56. package/dist/utils/safe-fetch.d.ts +18 -0
  57. package/dist/utils/safe-fetch.js +167 -29
  58. package/dist/wirings/actor-flow/run-conversation.js +1 -6
  59. package/dist/wirings/ai-agent/agent-rpc.d.ts +15 -0
  60. package/dist/wirings/ai-agent/agent-rpc.js +53 -0
  61. package/dist/wirings/ai-agent/ai-agent-agui.js +1 -5
  62. package/dist/wirings/ai-agent/ai-agent-memory.js +3 -1
  63. package/dist/wirings/ai-agent/ai-agent-prepare.js +3 -9
  64. package/dist/wirings/ai-agent/ai-agent-runner.js +28 -107
  65. package/dist/wirings/ai-agent/ai-agent-stream.js +20 -61
  66. package/dist/wirings/ai-agent/ai-agent-turn.d.ts +56 -0
  67. package/dist/wirings/ai-agent/ai-agent-turn.js +81 -0
  68. package/dist/wirings/ai-agent/ai-agent.types.d.ts +1 -1
  69. package/dist/wirings/ai-agent/voice-input.js +1 -6
  70. package/dist/wirings/ai-agent/voice-output.js +2 -12
  71. package/dist/wirings/channel/channel-common.js +1 -0
  72. package/dist/wirings/channel/channel-handler.js +3 -5
  73. package/dist/wirings/channel/channel-rpc-service.d.ts +0 -6
  74. package/dist/wirings/channel/channel-rpc-service.js +0 -8
  75. package/dist/wirings/channel/channel-rpc.types.d.ts +6 -0
  76. package/dist/wirings/channel/channel-rpc.types.js +8 -0
  77. package/dist/wirings/channel/channel-runner.d.ts +1 -3
  78. package/dist/wirings/channel/channel-runner.js +16 -8
  79. package/dist/wirings/channel/channel.types.d.ts +2 -0
  80. package/dist/wirings/channel/pikku-abstract-channel-handler.js +1 -0
  81. package/dist/wirings/channel/serverless/serverless-channel-runner.js +3 -0
  82. package/dist/wirings/cli/channel/cli-channel-runner.js +2 -0
  83. package/dist/wirings/cli/cli-runner.js +4 -2
  84. package/dist/wirings/cli/cli.types.d.ts +0 -8
  85. package/dist/wirings/cli/command-parser.js +13 -0
  86. package/dist/wirings/gateway/gateway-runner.js +41 -5
  87. package/dist/wirings/http/http-routes.js +2 -0
  88. package/dist/wirings/http/http-runner.d.ts +0 -10
  89. package/dist/wirings/http/http-runner.js +6 -13
  90. package/dist/wirings/http/http.types.d.ts +0 -10
  91. package/dist/wirings/http/index.d.ts +1 -1
  92. package/dist/wirings/http/index.js +1 -1
  93. package/dist/wirings/mcp/mcp-runner.d.ts +0 -7
  94. package/dist/wirings/mcp/mcp-runner.js +0 -6
  95. package/dist/wirings/rpc/rpc-runner.d.ts +8 -51
  96. package/dist/wirings/rpc/rpc-runner.js +53 -86
  97. package/dist/wirings/rpc/rpc-types.d.ts +3 -0
  98. package/dist/wirings/secret/validate-secret-definitions.js +2 -0
  99. package/dist/wirings/trigger/pikku-trigger-service.d.ts +0 -4
  100. package/dist/wirings/trigger/trigger-runner.js +1 -0
  101. package/dist/wirings/virtual-user/run-virtual-user.js +11 -11
  102. package/dist/wirings/virtual-user/virtual-user-derive.js +4 -25
  103. package/dist/wirings/virtual-user/virtual-user-dispositions.js +1 -4
  104. package/dist/wirings/workflow/dsl/workflow-dsl.types.d.ts +29 -2
  105. package/dist/wirings/workflow/feature.js +7 -4
  106. package/dist/wirings/workflow/graph/graph-runner.d.ts +1 -2
  107. package/dist/wirings/workflow/graph/graph-runner.js +8 -7
  108. package/dist/wirings/workflow/graph/workflow-graph.types.d.ts +0 -4
  109. package/dist/wirings/workflow/index.d.ts +7 -2
  110. package/dist/wirings/workflow/index.js +5 -1
  111. package/dist/wirings/workflow/pikku-scenario-service.d.ts +17 -3
  112. package/dist/wirings/workflow/pikku-scenario-service.js +38 -10
  113. package/dist/wirings/workflow/pikku-workflow-service.d.ts +44 -111
  114. package/dist/wirings/workflow/pikku-workflow-service.js +86 -404
  115. package/dist/wirings/workflow/workflow-approval.d.ts +39 -0
  116. package/dist/wirings/workflow/workflow-approval.js +114 -0
  117. package/dist/wirings/workflow/workflow-constants.d.ts +26 -0
  118. package/dist/wirings/workflow/workflow-constants.js +35 -0
  119. package/dist/wirings/workflow/workflow-errors.d.ts +58 -0
  120. package/dist/wirings/workflow/workflow-errors.js +112 -0
  121. package/dist/wirings/workflow/workflow-meta-resolver.d.ts +11 -0
  122. package/dist/wirings/workflow/workflow-meta-resolver.js +31 -0
  123. package/dist/wirings/workflow/workflow-queue-routing.d.ts +8 -0
  124. package/dist/wirings/workflow/workflow-queue-routing.js +38 -0
  125. package/dist/wirings/workflow/workflow-queue-wiring.d.ts +20 -0
  126. package/dist/wirings/workflow/workflow-queue-wiring.js +79 -0
  127. package/dist/wirings/workflow/workflow-recovery.d.ts +68 -0
  128. package/dist/wirings/workflow/workflow-recovery.js +101 -0
  129. package/dist/wirings/workflow/workflow-run-engine.types.d.ts +54 -0
  130. package/dist/wirings/workflow/workflow-run-engine.types.js +1 -0
  131. package/dist/wirings/workflow/workflow-run-ownership.d.ts +16 -0
  132. package/dist/wirings/workflow/workflow-run-ownership.js +29 -0
  133. package/dist/wirings/workflow/workflow-suspend.d.ts +12 -0
  134. package/dist/wirings/workflow/workflow-suspend.js +33 -0
  135. package/dist/wirings/workflow/workflow.types.d.ts +7 -0
  136. package/knowledge/decisions/internals/a-non-streaming-agent-run-registers-with-airunstate-too.md +22 -0
  137. package/knowledge/decisions/internals/a-resumed-agent-turn-is-as-interruptible-as-the-first.md +20 -0
  138. package/knowledge/decisions/internals/a-scenario-step-template-is-offered-unfilled.md +21 -0
  139. package/knowledge/decisions/internals/a-virtual-user-decides-whether-to-trust-memory-once-per-turn.md +21 -0
  140. package/knowledge/decisions/internals/a-wall-clock-threshold-is-a-load-test-in-disguise.md +46 -0
  141. package/knowledge/decisions/internals/a-workflow-wire-is-built-from-the-run-not-from-the-rpc-service.md +45 -0
  142. package/knowledge/decisions/internals/agent-context-waits-for-a-tool-result-still-being-written.md +21 -0
  143. package/knowledge/decisions/internals/agent-speech-travels-as-a-custom-agui-event.md +22 -0
  144. package/knowledge/decisions/internals/an-agent-interrupt-is-not-a-failure.md +23 -0
  145. package/knowledge/decisions/internals/an-agent-run-owned-by-another-instance-says-so.md +25 -0
  146. package/knowledge/decisions/internals/an-agent-stream-send-must-return-the-inner-sends-promise.md +22 -0
  147. package/knowledge/decisions/internals/an-empty-text-part-is-omitted-from-an-agent-message.md +20 -0
  148. package/knowledge/decisions/internals/an-empty-transcript-is-not-recorded.md +22 -0
  149. package/knowledge/decisions/internals/an-unref-d-timer-cannot-be-awaited-under-node-test.md +66 -0
  150. package/knowledge/decisions/internals/channel-state-accessors-are-unsound-generics-that-every-implementation-asserts.md +33 -0
  151. package/knowledge/decisions/internals/gateway-listener-middleware-runs-without-an-rpc-on-the-wire.md +43 -0
  152. package/knowledge/decisions/internals/hot-reload-writes-into-the-function-map-captured-at-startup.md +26 -0
  153. package/knowledge/decisions/internals/index.md +38 -26
  154. package/knowledge/decisions/internals/only-exposed-functions-enter-a-virtual-user-catalogue.md +21 -0
  155. package/knowledge/decisions/internals/scenario-given-and-when-are-sugar-but-then-is-not.md +24 -0
  156. package/knowledge/decisions/internals/side-effects-are-an-allowlist-not-a-boolean.md +34 -0
  157. package/knowledge/decisions/internals/speech-synthesis-picks-a-voice-per-sentence-and-warns-once.md +24 -0
  158. package/knowledge/decisions/internals/the-actor-prompt-says-json-because-of-json-object-mode.md +22 -0
  159. package/knowledge/decisions/internals/the-agent-done-event-goes-through-the-middleware-and-is-awaited.md +26 -0
  160. package/knowledge/decisions/internals/the-api-report-pins-members-not-just-names.md +43 -0
  161. package/knowledge/decisions/internals/the-ecosystem-entry-point-carries-the-adapter-surface.md +58 -0
  162. package/knowledge/decisions/internals/the-middleware-resolution-cache-is-deliberately-unbounded.md +40 -0
  163. package/knowledge/decisions/internals/the-per-invocation-rpc-view-is-a-class.md +40 -0
  164. package/knowledge/decisions/internals/the-persona-runtime-is-exported-from-the-persona-entry-point.md +28 -0
  165. package/knowledge/decisions/internals/the-transcript-event-is-sent-ahead-of-the-run.md +25 -0
  166. package/knowledge/decisions/internals/the-virtual-user-catalogue-is-the-only-gate-on-what-may-be-called.md +21 -0
  167. package/knowledge/decisions/internals/the-worker-disposition-is-the-one-that-is-not-testing.md +22 -0
  168. package/knowledge/decisions/internals/thread-history-records-the-transcript-not-the-audio.md +25 -0
  169. package/knowledge/decisions/internals/virtual-user-step-order-comes-from-insertion-order.md +21 -0
  170. package/knowledge/decisions/internals/voice-output-speaks-unless-voice-input-explicitly-says-otherwise.md +24 -0
  171. package/knowledge/decisions/internals/wiring-registries-erase-the-generics-their-wire-functions-capture.md +35 -0
  172. package/knowledge/decisions/security/a-dropped-audit-write-is-always-logged.md +4 -2
  173. package/knowledge/decisions/security/a-graph-run-starts-at-an-entry-node-the-graph-declared.md +33 -0
  174. package/knowledge/decisions/security/a-permission-gets-a-wire-it-cannot-reply-on.md +33 -0
  175. package/knowledge/decisions/security/a-step-runs-the-function-the-workflow-dispatched-it-with.md +37 -0
  176. package/knowledge/decisions/security/a-virtual-user-is-never-offered-a-step-that-would-forge-its-own-oracle.md +28 -0
  177. package/knowledge/decisions/security/a-workflow-run-is-read-and-approved-by-its-owner.md +34 -0
  178. package/knowledge/decisions/security/an-agent-approval-is-claimed-before-the-tool-runs.md +33 -0
  179. package/knowledge/decisions/security/an-upload-is-counted-as-it-arrives-not-buffered-then-measured.md +24 -0
  180. package/knowledge/decisions/security/gateway-handlers-run-through-the-function-runner-gate.md +13 -3
  181. package/knowledge/decisions/security/index.md +7 -0
  182. package/knowledge/questions/channel-middleware-accepts-bare-factories-that-nothing-resolves.md +35 -0
  183. package/knowledge/questions/index.md +2 -1
  184. package/knowledge/questions/unauthorized-channel-replies-escape-the-declared-out-type.md +44 -0
  185. package/package.json +14 -3
  186. package/scripts/generate-api-report.d.mts +1 -0
  187. package/scripts/generate-api-report.mjs +89 -0
  188. package/scripts/generate-api-report.mts +218 -0
  189. package/src/api-report.test.ts +69 -0
  190. package/src/column-form.ts +1 -4
  191. package/src/crypto-utils.test.ts +15 -2
  192. package/src/dev/hot-reload.ts +2 -7
  193. package/src/ecosystem.ts +40 -0
  194. package/src/errors/error-handler.ts +5 -3
  195. package/src/errors/error.test.ts +4 -1
  196. package/src/function/function-runner.test.ts +1 -1
  197. package/src/function/function-runner.ts +28 -39
  198. package/src/function/functions.types.ts +15 -9
  199. package/src/handle-error.ts +1 -1
  200. package/src/index.ts +3 -22
  201. package/src/middleware/auth-cookie.test.ts +50 -0
  202. package/src/middleware/auth-cookie.ts +38 -2
  203. package/src/middleware/cors.ts +2 -1
  204. package/src/middleware/index.ts +1 -1
  205. package/src/middleware/remote-auth.test.ts +43 -0
  206. package/src/middleware/remote-auth.ts +17 -3
  207. package/src/middleware-runner.ts +4 -2
  208. package/src/no-any-casts.test.ts +57 -0
  209. package/src/permissions.test.ts +3 -1
  210. package/src/permissions.ts +22 -24
  211. package/src/pikku-state.ts +17 -6
  212. package/src/public-surface.json +578 -0
  213. package/src/public-surface.json.README +25 -0
  214. package/src/public-surface.test.ts +105 -0
  215. package/src/removed-legacy-exports.test.ts +62 -0
  216. package/src/schema.test.ts +78 -0
  217. package/src/schema.ts +36 -1
  218. package/src/services/ai-run-state-service.ts +7 -1
  219. package/src/services/audit-service.ts +2 -2
  220. package/src/services/in-memory-ai-run-state-service.ts +3 -2
  221. package/src/services/in-memory-workflow-service.ts +25 -0
  222. package/src/services/index.ts +1 -4
  223. package/src/services/local-content-request-handler.test.ts +43 -5
  224. package/src/services/local-content-request-handler.ts +103 -74
  225. package/src/services/local-content.ts +15 -1
  226. package/src/services/local-email-service.ts +5 -1
  227. package/src/services/system-role-guard.test.ts +4 -1
  228. package/src/services/workflow-service.ts +9 -2
  229. package/src/side-effects-are-declared.test.ts +84 -0
  230. package/src/source-files-stay-composable.test.ts +41 -0
  231. package/src/testing/service-tests/agent-run-service-tests.ts +98 -0
  232. package/src/testing/service-tests/ai-storage-service-tests.ts +286 -0
  233. package/src/testing/service-tests/channel-store-tests.ts +98 -0
  234. package/src/testing/service-tests/credential-service-tests.ts +143 -0
  235. package/src/testing/service-tests/deployment-service-tests.ts +33 -0
  236. package/src/testing/service-tests/event-hub-store-tests.ts +48 -0
  237. package/src/testing/service-tests/secret-service-tests.ts +105 -0
  238. package/src/testing/service-tests/session-store-tests.ts +62 -0
  239. package/src/testing/service-tests/workflow-run-service-tests.ts +59 -0
  240. package/src/testing/service-tests/workflow-service-tests.ts +308 -0
  241. package/src/testing/service-tests.ts +31 -1111
  242. package/src/types/core.types.ts +15 -1
  243. package/src/types/state.types.ts +1 -1
  244. package/src/utils/node-host-resolver.ts +20 -0
  245. package/src/utils/safe-fetch.test.ts +143 -1
  246. package/src/utils/safe-fetch.ts +200 -25
  247. package/src/wirings/actor-flow/run-conversation.ts +1 -6
  248. package/src/wirings/ai-agent/agent-rpc.ts +120 -0
  249. package/src/wirings/ai-agent/ai-agent-agui.ts +1 -5
  250. package/src/wirings/ai-agent/ai-agent-interrupt.test.ts +2 -1
  251. package/src/wirings/ai-agent/ai-agent-memory.ts +8 -1
  252. package/src/wirings/ai-agent/ai-agent-prepare.ts +10 -12
  253. package/src/wirings/ai-agent/ai-agent-resume-authorization.test.ts +1 -0
  254. package/src/wirings/ai-agent/ai-agent-runner.test.ts +82 -2
  255. package/src/wirings/ai-agent/ai-agent-runner.ts +49 -120
  256. package/src/wirings/ai-agent/ai-agent-stream.test.ts +2 -0
  257. package/src/wirings/ai-agent/ai-agent-stream.ts +36 -63
  258. package/src/wirings/ai-agent/ai-agent-thread-ownership.test.ts +1 -1
  259. package/src/wirings/ai-agent/ai-agent-turn.ts +121 -0
  260. package/src/wirings/ai-agent/ai-agent.types.ts +1 -1
  261. package/src/wirings/ai-agent/voice-input.ts +1 -6
  262. package/src/wirings/ai-agent/voice-output.ts +2 -12
  263. package/src/wirings/channel/channel-common.ts +5 -2
  264. package/src/wirings/channel/channel-handler-shapes.test.ts +72 -0
  265. package/src/wirings/channel/channel-handler.ts +7 -7
  266. package/src/wirings/channel/channel-rpc-service.ts +0 -14
  267. package/src/wirings/channel/channel-rpc.test.ts +25 -4
  268. package/src/wirings/channel/channel-rpc.types.ts +14 -0
  269. package/src/wirings/channel/channel-runner.ts +33 -20
  270. package/src/wirings/channel/channel.types.ts +2 -0
  271. package/src/wirings/channel/local/local-channel-runner.ts +1 -1
  272. package/src/wirings/channel/pikku-abstract-channel-handler.ts +2 -1
  273. package/src/wirings/channel/serverless/serverless-channel-runner.ts +6 -3
  274. package/src/wirings/cli/channel/cli-channel-runner.ts +3 -1
  275. package/src/wirings/cli/channel/cli-raw-client-runner.ts +4 -1
  276. package/src/wirings/cli/cli-runner.ts +7 -4
  277. package/src/wirings/cli/cli.types.ts +0 -39
  278. package/src/wirings/cli/command-parser.test.ts +19 -0
  279. package/src/wirings/cli/command-parser.ts +17 -1
  280. package/src/wirings/gateway/gateway-authorization.test.ts +131 -0
  281. package/src/wirings/gateway/gateway-channel-meta.test.ts +44 -0
  282. package/src/wirings/gateway/gateway-runner.ts +62 -22
  283. package/src/wirings/http/http-routes.ts +4 -1
  284. package/src/wirings/http/http-runner.ts +11 -26
  285. package/src/wirings/http/http.types.ts +0 -15
  286. package/src/wirings/http/index.ts +1 -7
  287. package/src/wirings/http/pikku-fetch-http-request.ts +2 -2
  288. package/src/wirings/http/web-request.ts +1 -1
  289. package/src/wirings/mcp/mcp-runner.ts +2 -16
  290. package/src/wirings/persona/persona-environments.test.ts +14 -3
  291. package/src/wirings/persona/persona.test.ts +13 -3
  292. package/src/wirings/persona/validate-personas.ts +5 -1
  293. package/src/wirings/queue/queue-runner.ts +1 -1
  294. package/src/wirings/rpc/addon-auth-tags.test.ts +1 -5
  295. package/src/wirings/rpc/rpc-runner.ts +58 -136
  296. package/src/wirings/rpc/rpc-types.ts +7 -0
  297. package/src/wirings/rpc/wire-addon.ts +3 -1
  298. package/src/wirings/secret/validate-secret-definitions.test.ts +69 -0
  299. package/src/wirings/secret/validate-secret-definitions.ts +2 -0
  300. package/src/wirings/trigger/pikku-trigger-service.ts +0 -5
  301. package/src/wirings/trigger/trigger-runner.ts +7 -5
  302. package/src/wirings/virtual-user/run-virtual-user.test.ts +18 -9
  303. package/src/wirings/virtual-user/run-virtual-user.ts +28 -15
  304. package/src/wirings/virtual-user/virtual-user-agents.test.ts +4 -1
  305. package/src/wirings/virtual-user/virtual-user-derive.ts +4 -25
  306. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +7 -2
  307. package/src/wirings/virtual-user/virtual-user-dispositions.ts +1 -4
  308. package/src/wirings/virtual-user/virtual-user-intents.test.ts +13 -3
  309. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +35 -2
  310. package/src/wirings/workflow/feature.ts +7 -4
  311. package/src/wirings/workflow/graph/graph-node.ts +1 -1
  312. package/src/wirings/workflow/graph/graph-runner.test.ts +4 -2
  313. package/src/wirings/workflow/graph/graph-runner.ts +13 -16
  314. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -5
  315. package/src/wirings/workflow/index.ts +12 -4
  316. package/src/wirings/workflow/pikku-scenario-service.ts +54 -25
  317. package/src/wirings/workflow/pikku-workflow-service.test.ts +2 -2
  318. package/src/wirings/workflow/pikku-workflow-service.ts +208 -630
  319. package/src/wirings/workflow/scenario-hooks.test.ts +51 -0
  320. package/src/wirings/workflow/workflow-approval.ts +185 -0
  321. package/src/wirings/workflow/workflow-child-run-session.test.ts +89 -0
  322. package/src/wirings/workflow/workflow-constants.ts +47 -0
  323. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +1 -1
  324. package/src/wirings/workflow/workflow-dispatch-relay.test.ts +128 -0
  325. package/src/wirings/workflow/workflow-errors.ts +128 -0
  326. package/src/wirings/workflow/workflow-inline-authority.test.ts +12 -6
  327. package/src/wirings/workflow/workflow-meta-resolver.ts +45 -0
  328. package/src/wirings/workflow/workflow-missing-meta.test.ts +92 -0
  329. package/src/wirings/workflow/workflow-queue-routing.ts +85 -0
  330. package/src/wirings/workflow/workflow-queue-wiring.ts +149 -0
  331. package/src/wirings/workflow/workflow-recovery.ts +162 -0
  332. package/src/wirings/workflow/workflow-retry-policy.test.ts +1 -1
  333. package/src/wirings/workflow/workflow-run-authority.test.ts +215 -0
  334. package/src/wirings/workflow/workflow-run-engine.types.ts +91 -0
  335. package/src/wirings/workflow/workflow-run-ownership.ts +36 -0
  336. package/src/wirings/workflow/workflow-suspend.ts +61 -0
  337. package/src/wirings/workflow/workflow.types.ts +7 -0
  338. package/src/wirings-stay-decoupled.test.ts +123 -0
  339. package/tsconfig.json +1 -1
  340. package/tsconfig.tsbuildinfo +1 -1
  341. package/src/internal.ts +0 -10
@@ -16,11 +16,22 @@ import type { TriggerMeta } from './wirings/trigger/trigger.types.js'
16
16
 
17
17
  const PIKKU_STATE_KEY = Symbol.for('@pikku/core/state')
18
18
 
19
+ /**
20
+ * State is parked on `globalThis` under a registered symbol so separate copies
21
+ * of @pikku/core in one process share it. Typed once here rather than at each
22
+ * access.
23
+ */
24
+ const stateHost = globalThis as unknown as {
25
+ [key: symbol]: Map<string, PikkuPackageState> | undefined
26
+ }
27
+
19
28
  export const getAllPackageStates = (): Map<string, PikkuPackageState> => {
20
- if (!(globalThis as any)[PIKKU_STATE_KEY]) {
21
- ;(globalThis as any)[PIKKU_STATE_KEY] = new Map<string, PikkuPackageState>()
29
+ let states = stateHost[PIKKU_STATE_KEY]
30
+ if (!states) {
31
+ states = new Map<string, PikkuPackageState>()
32
+ stateHost[PIKKU_STATE_KEY] = states
22
33
  }
23
- return (globalThis as any)[PIKKU_STATE_KEY] as Map<string, PikkuPackageState>
34
+ return states
24
35
  }
25
36
 
26
37
  export const pikkuState = <
@@ -119,13 +130,13 @@ const createEmptyPackageState = (): PikkuPackageState => ({
119
130
  middleware: {
120
131
  tagGroup: {},
121
132
  httpGroup: {},
122
- global: [] as any,
133
+ global: [],
123
134
  },
124
135
  channelMiddleware: {
125
136
  tagGroup: {},
126
137
  },
127
138
  permissions: {
128
- global: [] as any,
139
+ global: [],
129
140
  },
130
141
  misc: {
131
142
  errors: new Map(),
@@ -153,7 +164,7 @@ export const resetPikkuState = () => {
153
164
  // Error definitions come from module-import side effects that never re-run.
154
165
  const existingErrors = getAllPackageStates().get('__main__')?.misc.errors
155
166
 
156
- ;(globalThis as any)[PIKKU_STATE_KEY] = new Map<string, PikkuPackageState>()
167
+ stateHost[PIKKU_STATE_KEY] = new Map<string, PikkuPackageState>()
157
168
  initializePikkuState('__main__')
158
169
 
159
170
  if (existingErrors) {
@@ -0,0 +1,578 @@
1
+ {
2
+ ".": [
3
+ "AIProviderAuthError",
4
+ "AIProviderNotConfiguredError",
5
+ "AbandonedError",
6
+ "BadGatewayError",
7
+ "BadRequestError",
8
+ "ConflictError",
9
+ "ExpectationFailedError",
10
+ "ForbiddenError",
11
+ "GatewayTimeoutError",
12
+ "GoneError",
13
+ "HTTPVersionNotSupportedError",
14
+ "InternalServerError",
15
+ "InvalidMiddlewareWireError",
16
+ "InvalidOriginError",
17
+ "InvalidSessionError",
18
+ "LengthRequiredError",
19
+ "LocalEnvironmentOnlyError",
20
+ "LockedError",
21
+ "MaxComputeTimeReachedError",
22
+ "MethodNotAllowedError",
23
+ "MissingCredentialError",
24
+ "MissingSchemaError",
25
+ "MissingScopeError",
26
+ "MissingServiceError",
27
+ "MissingSessionError",
28
+ "NoopAuditService",
29
+ "NotAcceptableError",
30
+ "NotFoundError",
31
+ "NotImplementedError",
32
+ "PayloadTooLargeError",
33
+ "PaymentRequiredError",
34
+ "PikkuError",
35
+ "PikkuMissingMetaError",
36
+ "PikkuRequest",
37
+ "PreconditionFailedError",
38
+ "ProxyAuthenticationRequiredError",
39
+ "REDACTED",
40
+ "RangeNotSatisfiableError",
41
+ "ReadonlySessionError",
42
+ "RequestTimeoutError",
43
+ "SchedulerService",
44
+ "SecretAccessDeniedError",
45
+ "SecretCoercionError",
46
+ "SecretHostNotAllowedError",
47
+ "ServiceUnavailableError",
48
+ "TooManyRequestsError",
49
+ "URITooLongError",
50
+ "UnauthorizedError",
51
+ "UnprocessableContentError",
52
+ "UnsupportedMediaTypeError",
53
+ "addGlobalPermission",
54
+ "addTagMiddleware",
55
+ "assertSecretAllowedForHost",
56
+ "beginChanges",
57
+ "checkAuthPermissions",
58
+ "clearPikkuRuntimeState",
59
+ "createGraph",
60
+ "createInvocationAudit",
61
+ "createSecretValue",
62
+ "fetch",
63
+ "formatVersionedId",
64
+ "getAbortScope",
65
+ "getAllFunctionNames",
66
+ "getRelativeTimeOffsetFromNow",
67
+ "hasScopes",
68
+ "hashToken",
69
+ "isExpectedError",
70
+ "isSecretValue",
71
+ "isSerializable",
72
+ "isVersionedId",
73
+ "parseDurationString",
74
+ "parseVersionedId",
75
+ "pikkuAIMiddleware",
76
+ "pikkuApprovalDescription",
77
+ "pikkuAuth",
78
+ "pikkuCLIRender",
79
+ "pikkuChannelMiddleware",
80
+ "pikkuChannelMiddlewareFactory",
81
+ "pikkuMiddleware",
82
+ "pikkuMiddlewareFactory",
83
+ "pikkuPermission",
84
+ "pikkuPermissionFactory",
85
+ "pikkuServerLifecycle",
86
+ "resolveAuditConfig",
87
+ "resolveAuditUserIdentityFromWire",
88
+ "runInAbortScope",
89
+ "runMiddleware",
90
+ "stopSingletonServices",
91
+ "unsafeAsHashed",
92
+ "unsafeAsSealed",
93
+ "unsafeAsWrapped",
94
+ "verifyScopes",
95
+ "wireAddon",
96
+ "wireRemoteAddon",
97
+ "withoutSecrets"
98
+ ],
99
+ "./middleware": [
100
+ "addGlobalMiddleware",
101
+ "addGlobalPermission",
102
+ "addMiddleware",
103
+ "addTagMiddleware",
104
+ "authAPIKey",
105
+ "authBearer",
106
+ "authCookie",
107
+ "cors",
108
+ "pikkuRemoteAuthMiddleware",
109
+ "runMiddleware",
110
+ "telemetryInner",
111
+ "telemetryOuter"
112
+ ],
113
+ "./function": [
114
+ "addFunction",
115
+ "getAllFunctionNames",
116
+ "pikkuApprovalDescription",
117
+ "pikkuAuth",
118
+ "pikkuPermission",
119
+ "pikkuPermissionFactory"
120
+ ],
121
+ "./channel": [
122
+ "CHANNEL_RPC_PENDING",
123
+ "CHANNEL_RPC_REQUEST",
124
+ "CHANNEL_RPC_RESPONSE",
125
+ "ChannelDeploymentService",
126
+ "ChannelRPCError",
127
+ "ChannelRPCRegistry",
128
+ "ChannelStore",
129
+ "EventHubStore",
130
+ "PikkuAbstractChannelHandler",
131
+ "addChannelMiddleware",
132
+ "channelRemote",
133
+ "combineChannelMiddleware",
134
+ "createChannelRPCInputValidator",
135
+ "createChannelRPCResponder",
136
+ "createChannelRPCResultValidator",
137
+ "defineChannelRoutes",
138
+ "getChannelHostRPC",
139
+ "handleChannelRPCResponse",
140
+ "isChannelRPCPending",
141
+ "isChannelRPCRequest",
142
+ "isChannelRPCResponse",
143
+ "logChannels",
144
+ "openChannel",
145
+ "releaseChannelHostRPC",
146
+ "resolveCapability",
147
+ "unsupportedChannelRemote",
148
+ "wireChannel",
149
+ "wrapChannelWithMiddleware"
150
+ ],
151
+ "./workflow": [
152
+ "DEFAULT_STEP_RETRIES",
153
+ "PikkuWorkflowService",
154
+ "SCENARIO_SURFACES",
155
+ "WorkflowApprovalResolvedError",
156
+ "WorkflowCancelledException",
157
+ "WorkflowDispatchException",
158
+ "WorkflowNotFoundError",
159
+ "WorkflowRunForbiddenError",
160
+ "WorkflowRunNotFoundError",
161
+ "WorkflowStepFunctionMismatchError",
162
+ "WorkflowSuspendedException",
163
+ "addFeature",
164
+ "addWorkflow",
165
+ "assertWorkflowRunOwner",
166
+ "buildRunTimeline",
167
+ "composeStepProse",
168
+ "createCookieJar",
169
+ "deriveInvocationId",
170
+ "isRef",
171
+ "pikkuWorkflowGraph",
172
+ "pikkuWorkflowOrchestratorFunc",
173
+ "pikkuWorkflowSleeperFunc",
174
+ "pikkuWorkflowWorkerFunc",
175
+ "pollUntil",
176
+ "reconstructFinalState",
177
+ "reconstructStateAt",
178
+ "renderStepTemplate",
179
+ "requireActor",
180
+ "requireScenarioEnv",
181
+ "resolveFeatureScenarios",
182
+ "resolveScenarioSurfaces",
183
+ "template",
184
+ "uuidv5",
185
+ "witnessesAgree"
186
+ ],
187
+ "./scenario": [
188
+ "PikkuScenarioService",
189
+ "ScenarioBrowserActorRequired",
190
+ "ScenarioBrowserUnavailable",
191
+ "ScenarioHookError",
192
+ "ScenarioNoSurfaceBinding",
193
+ "ScenarioNoWitness",
194
+ "ScenarioWitnessDisagreement",
195
+ "createScenarioRunner"
196
+ ],
197
+ "./workflow/timeline": [
198
+ "buildRunTimeline",
199
+ "reconstructFinalState",
200
+ "reconstructStateAt"
201
+ ],
202
+ "./workflow/types": [],
203
+ "./actor-flow": ["runConversation"],
204
+ "./virtual-user": [
205
+ "DISPOSITIONS",
206
+ "IntentStack",
207
+ "PRODUCTION_DISPOSITION",
208
+ "catalogueClassification",
209
+ "catalogueIndex",
210
+ "catalogueLookup",
211
+ "createRng",
212
+ "deriveCatalogue",
213
+ "deriveIntents",
214
+ "describeEntry",
215
+ "dispositionProfile",
216
+ "intentsForPersona",
217
+ "isReadOnly",
218
+ "personaScopes",
219
+ "personaVirtualUserTarget",
220
+ "prepareVirtualUserRun",
221
+ "reachableAgents",
222
+ "reachableCatalogue",
223
+ "rememberIds",
224
+ "renderCatalogue",
225
+ "runVirtualUser",
226
+ "unreachableCatalogue"
227
+ ],
228
+ "./channel/local": [
229
+ "LocalEventHubService",
230
+ "PikkuLocalChannelHandler",
231
+ "runLocalChannel"
232
+ ],
233
+ "./channel/serverless": [
234
+ "runChannelConnect",
235
+ "runChannelDisconnect",
236
+ "runChannelMessage"
237
+ ],
238
+ "./http": [
239
+ "DEFAULT_MAX_BODY_SIZE",
240
+ "PikkuFetchHTTPRequest",
241
+ "PikkuFetchHTTPResponse",
242
+ "addHTTPMiddleware",
243
+ "applyWebResponse",
244
+ "defineHTTPRoutes",
245
+ "fetch",
246
+ "fetchData",
247
+ "logRoutes",
248
+ "toWebRequest",
249
+ "wireHTTP",
250
+ "wireHTTPRoutes"
251
+ ],
252
+ "./remote": ["buildRemoteHeaders"],
253
+ "./queue": [
254
+ "QUEUE_IDENTITY_CLAIM_VERSION",
255
+ "QUEUE_IDENTITY_INFO",
256
+ "QUEUE_IDENTITY_SECRET_NAME",
257
+ "QueueJobDiscardedError",
258
+ "QueueJobFailedError",
259
+ "SignedQueueService",
260
+ "getQueueIdentitySecret",
261
+ "getQueueWorkers",
262
+ "registerQueueWorkers",
263
+ "removeQueueWorker",
264
+ "resolveQueueJobIdentity",
265
+ "runQueueJob",
266
+ "signQueueIdentity",
267
+ "validateWorkerConfig",
268
+ "verifyQueueIdentity",
269
+ "wireQueueWorker"
270
+ ],
271
+ "./scheduler": [
272
+ "getScheduledTasks",
273
+ "logSchedulers",
274
+ "runScheduledTask",
275
+ "wireScheduler"
276
+ ],
277
+ "./trigger": ["PikkuTriggerService", "wireTrigger", "wireTriggerSource"],
278
+ "./rpc": [
279
+ "PikkuRPCService",
280
+ "RPCNotFoundError",
281
+ "RemoteAddonAuthError",
282
+ "RemoteAddonConfigError",
283
+ "RemoteAddonRequestError",
284
+ "resolveRemoteAddonToken",
285
+ "rpcService",
286
+ "wireAddon",
287
+ "wireRemoteAddon"
288
+ ],
289
+ "./safe-fetch": [
290
+ "assertFetchableUrl",
291
+ "isPrivateHost",
292
+ "safeFetch",
293
+ "setDefaultHostResolver"
294
+ ],
295
+ "./node-host-resolver": ["installNodeHostResolver", "nodeHostResolver"],
296
+ "./mcp": [
297
+ "MCPEndpointRegistry",
298
+ "MCPError",
299
+ "getMCPPromptsMeta",
300
+ "getMCPResourcesMeta",
301
+ "getMCPToolsMeta",
302
+ "runMCPPrompt",
303
+ "runMCPResource",
304
+ "runMCPTool",
305
+ "wireMCPPrompt",
306
+ "wireMCPResource"
307
+ ],
308
+ "./ai-agent": [
309
+ "AgentInterruptedError",
310
+ "NoSpeechDetectedError",
311
+ "SPOKEN_TRANSCRIPT",
312
+ "SPOKEN_TURN",
313
+ "ToolApprovalRequired",
314
+ "ToolCredentialRequired",
315
+ "addAIAgent",
316
+ "agent",
317
+ "agentApprove",
318
+ "agentInterrupt",
319
+ "agentResume",
320
+ "agentStream",
321
+ "approveAIAgent",
322
+ "awaitPendingInterruptNote",
323
+ "canAccessThread",
324
+ "getAIAgents",
325
+ "getAIAgentsMeta",
326
+ "getInFlightTools",
327
+ "interruptAIAgent",
328
+ "isAbortError",
329
+ "isOwnedByPrincipal",
330
+ "isRunInterruptible",
331
+ "persistOrphanedToolResults",
332
+ "readsAsNonSpeech",
333
+ "registerInterruptibleRun",
334
+ "resumeAIAgent",
335
+ "resumeAIAgentSync",
336
+ "runAIAgent",
337
+ "sessionPrincipals",
338
+ "signalRunInterrupt",
339
+ "streamAIAgent",
340
+ "threadOwnerConstraint",
341
+ "trackInterruptNote",
342
+ "trackToolExecution",
343
+ "unspeakableScripts",
344
+ "voiceForText",
345
+ "voiceInput",
346
+ "voiceOutput",
347
+ "wrapChannelWithAGUI"
348
+ ],
349
+ "./gateway": [
350
+ "createListenerMessageHandler",
351
+ "resolveGatewayAdapter",
352
+ "wireGateway"
353
+ ],
354
+ "./cli": [
355
+ "CLIError",
356
+ "defineCLICommands",
357
+ "executeCLI",
358
+ "generateCommandHelp",
359
+ "parseCLIArguments",
360
+ "pikkuCLIRender",
361
+ "runCLICommand",
362
+ "wireCLI"
363
+ ],
364
+ "./cli/command-parser": ["generateCommandHelp", "parseCLIArguments"],
365
+ "./cli/channel": [
366
+ "APPROVAL_FLAGS",
367
+ "approverForMode",
368
+ "createTerminalApprover",
369
+ "executeCLIViaChannel",
370
+ "executeRawCLIViaChannel",
371
+ "handleRawCLI",
372
+ "takeApprovalFlags"
373
+ ],
374
+ "./node": [],
375
+ "./credential": [
376
+ "defineCredential",
377
+ "validateAndBuildCredentialDefinitionsMeta"
378
+ ],
379
+ "./scope": [
380
+ "defineScope",
381
+ "flattenScopeDefinitions",
382
+ "validateAndBuildScopeDefinitionsMeta"
383
+ ],
384
+ "./role": [
385
+ "defineSystemRole",
386
+ "flattenSystemRoleDefinitions",
387
+ "validateAndBuildSystemRoleDefinitionsMeta"
388
+ ],
389
+ "./persona": [
390
+ "HttpPersona",
391
+ "allowedLinks",
392
+ "applyMailboxAllowlist",
393
+ "createHttpPersonas",
394
+ "definePersonas",
395
+ "isAllowedSender",
396
+ "isRunnablePersona",
397
+ "personaEmail",
398
+ "personaEmailLabel",
399
+ "personaEmails",
400
+ "personaEnvironmentErrors",
401
+ "personaEnvironmentRefusal",
402
+ "postScenarioJson",
403
+ "readScenarioHttpResponse",
404
+ "resolvePersonaEnvironments",
405
+ "roleMismatchMessage",
406
+ "runnablePersonas",
407
+ "validateAndBuildPersonasMeta",
408
+ "verifyPersonaRoles"
409
+ ],
410
+ "./secret": ["defineSecret", "validateAndBuildSecretDefinitionsMeta"],
411
+ "./variable": ["defineVariable", "validateAndBuildVariableDefinitionsMeta"],
412
+ "./oauth2": [],
413
+ "./errors": [
414
+ "AIProviderAuthError",
415
+ "AIProviderNotConfiguredError",
416
+ "BadGatewayError",
417
+ "BadRequestError",
418
+ "ConflictError",
419
+ "ExpectationFailedError",
420
+ "ForbiddenError",
421
+ "GatewayTimeoutError",
422
+ "GoneError",
423
+ "HTTPVersionNotSupportedError",
424
+ "InternalServerError",
425
+ "InvalidMiddlewareWireError",
426
+ "InvalidOriginError",
427
+ "InvalidSessionError",
428
+ "LengthRequiredError",
429
+ "LocalEnvironmentOnlyError",
430
+ "LockedError",
431
+ "MaxComputeTimeReachedError",
432
+ "MethodNotAllowedError",
433
+ "MissingCredentialError",
434
+ "MissingSchemaError",
435
+ "MissingScopeError",
436
+ "MissingServiceError",
437
+ "MissingSessionError",
438
+ "NotAcceptableError",
439
+ "NotFoundError",
440
+ "NotImplementedError",
441
+ "PayloadTooLargeError",
442
+ "PaymentRequiredError",
443
+ "PikkuError",
444
+ "PikkuMissingMetaError",
445
+ "PreconditionFailedError",
446
+ "ProxyAuthenticationRequiredError",
447
+ "RangeNotSatisfiableError",
448
+ "ReadonlySessionError",
449
+ "RequestTimeoutError",
450
+ "ServiceUnavailableError",
451
+ "SystemRoleImmutableError",
452
+ "SystemRoleShadowedError",
453
+ "TooManyRequestsError",
454
+ "URITooLongError",
455
+ "UnauthorizedError",
456
+ "UnprocessableContentError",
457
+ "UnsupportedMediaTypeError",
458
+ "WeakKeyMaterialError",
459
+ "addError",
460
+ "addErrors"
461
+ ],
462
+ "./services": [
463
+ "ConsoleLogger",
464
+ "DEFAULT_WEBHOOK_RETRIES",
465
+ "DEFAULT_WEBHOOK_SIGNATURE_HEADER",
466
+ "InMemoryAIRunStateService",
467
+ "InMemoryQueueService",
468
+ "InMemorySessionStore",
469
+ "InMemoryTriggerService",
470
+ "InMemoryWorkflowService",
471
+ "JsonConsoleLogger",
472
+ "LocalCredentialService",
473
+ "LocalEmailService",
474
+ "LocalGatewayService",
475
+ "LocalSecretService",
476
+ "LocalVariablesService",
477
+ "LogLevel",
478
+ "NoopAuditService",
479
+ "PIKKU_OUTGOING_WEBHOOK_QUEUE_NAME",
480
+ "PikkuCredentialWireService",
481
+ "PikkuSessionService",
482
+ "QueueWebhookService",
483
+ "ScopedSecretService",
484
+ "SecretHostNotAllowedError",
485
+ "StubTracker",
486
+ "TypedCredentialService",
487
+ "TypedSecretService",
488
+ "TypedVariablesService",
489
+ "WebhookService",
490
+ "assertRoleIsMutable",
491
+ "assertRoleNameAvailable",
492
+ "assertSecretAllowedForHost",
493
+ "createFunctionSessionWireProps",
494
+ "createInvocationAudit",
495
+ "createMiddlewareCredentialWireProps",
496
+ "createMiddlewareSessionWireProps",
497
+ "createStubProxy",
498
+ "createWireServicesCredentialWireProps",
499
+ "getStubTracker",
500
+ "isTestRun",
501
+ "pikkuWebhookWorkerFunc",
502
+ "resolveAuditConfig",
503
+ "resolveAuditUserIdentityFromWire",
504
+ "roleLockReason",
505
+ "spy",
506
+ "stub"
507
+ ],
508
+ "./services/local-meta": ["LocalMetaService"],
509
+ "./services/v8-coverage": ["V8CoverageService"],
510
+ "./services/istanbul-coverage": ["IstanbulCoverageService"],
511
+ "./services/local-content": ["LocalContent", "signedContentPath"],
512
+ "./services/local-content-request-handler": [
513
+ "createLocalContentRequestHandler",
514
+ "verifySignedContentRequest"
515
+ ],
516
+ "./services/temporary-file-service": [
517
+ "TemporaryFileInstance",
518
+ "TemporaryFileService"
519
+ ],
520
+ "./crypto-utils": [
521
+ "MIN_KEY_MATERIAL_LENGTH",
522
+ "REMOTE_SESSION_INFO",
523
+ "assertStrongKeyMaterial",
524
+ "decodeBase64UrlText",
525
+ "decryptJSON",
526
+ "decryptWithKeyMaterial",
527
+ "deriveKEK",
528
+ "encodeBase64UrlText",
529
+ "encryptJSON",
530
+ "encryptWithKeyMaterial",
531
+ "envelopeDecrypt",
532
+ "envelopeEncrypt",
533
+ "envelopeRewrap",
534
+ "generateDEK",
535
+ "generateKEKSalt",
536
+ "signWithKeyMaterial",
537
+ "unwrapDEK",
538
+ "verifyWithKeyMaterial",
539
+ "wrapDEK"
540
+ ],
541
+ "./hmac": ["hmacSha256Hex", "timingSafeStringEqual"],
542
+ "./ecosystem": [
543
+ "addFunction",
544
+ "addGlobalMiddleware",
545
+ "addMiddleware",
546
+ "getAllPackageStates",
547
+ "getCreateWireServices",
548
+ "getSingletonServices",
549
+ "httpRouter",
550
+ "pikkuState",
551
+ "resetPikkuState",
552
+ "runPikkuFunc",
553
+ "setSingletonServices"
554
+ ],
555
+ "./internal": [
556
+ "addFunction",
557
+ "addGlobalMiddleware",
558
+ "addMiddleware",
559
+ "getAllPackageStates",
560
+ "getCreateWireServices",
561
+ "getSingletonServices",
562
+ "httpRouter",
563
+ "pikkuState",
564
+ "resetPikkuState",
565
+ "runPikkuFunc",
566
+ "setSingletonServices"
567
+ ],
568
+ "./schema": [
569
+ "addSchema",
570
+ "applyDefaultsFromSchema",
571
+ "coerceTopLevelDataFromSchema",
572
+ "compileAllSchemas",
573
+ "getSchema",
574
+ "validateSchema"
575
+ ],
576
+ "./testing": ["defineServiceTests"],
577
+ "./dev": ["pikkuDevReloader", "reconcileAddonRegistry", "reloadGeneratedMeta"]
578
+ }
@@ -0,0 +1,25 @@
1
+ `public-surface.json` pins every runtime export reachable through a
2
+ `package.json` `exports` subpath. `public-surface.test.ts` fails when the two
3
+ disagree, so widening the API is a visible diff rather than a side effect of an
4
+ `export *`.
5
+
6
+ Types are not pinned: they are erased before the test can enumerate them.
7
+
8
+ Regenerate after an intentional change, from `packages/core`:
9
+
10
+ ```bash
11
+ cat > src/__gen-surface.mts <<'EOF'
12
+ import { readFileSync, writeFileSync } from 'node:fs'
13
+ import { resolve } from 'node:path'
14
+ import { pathToFileURL } from 'node:url'
15
+
16
+ const pkg = JSON.parse(readFileSync('package.json', 'utf-8'))
17
+ const surface: Record<string, string[]> = {}
18
+ for (const [sub, dist] of Object.entries(pkg.exports as Record<string, string>)) {
19
+ const src = pathToFileURL(resolve(dist.replace('./dist/', './src/'))).href
20
+ surface[sub] = Object.keys(await import(src)).sort()
21
+ }
22
+ writeFileSync('src/public-surface.json', JSON.stringify(surface, null, 2) + '\n')
23
+ EOF
24
+ npx tsx src/__gen-surface.mts && rm src/__gen-surface.mts
25
+ ```