@pikku/core 0.12.107 → 0.12.112

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 (594) hide show
  1. package/CHANGELOG.md +357 -0
  2. package/dist/analytics/analytics.d.ts +6 -0
  3. package/dist/analytics/analytics.js +58 -0
  4. package/dist/analytics/analytics.types.d.ts +156 -0
  5. package/dist/analytics/analytics.types.js +1 -0
  6. package/dist/analytics/anonymous-analytics-identity.d.ts +23 -0
  7. package/dist/analytics/anonymous-analytics-identity.js +27 -0
  8. package/dist/analytics/compose-analytics-identity.d.ts +14 -0
  9. package/dist/analytics/compose-analytics-identity.js +33 -0
  10. package/dist/analytics/cookie-analytics-identity.d.ts +24 -0
  11. package/dist/analytics/cookie-analytics-identity.js +37 -0
  12. package/dist/analytics/define-analytics-events.d.ts +22 -0
  13. package/dist/analytics/define-analytics-events.js +9 -0
  14. package/dist/analytics/fan-out-analytics.d.ts +15 -0
  15. package/dist/analytics/fan-out-analytics.js +36 -0
  16. package/dist/analytics/index.d.ts +13 -0
  17. package/dist/analytics/index.js +8 -0
  18. package/dist/analytics/logger-analytics-service.d.ts +14 -0
  19. package/dist/analytics/logger-analytics-service.js +23 -0
  20. package/dist/analytics/mint-cookie.d.ts +44 -0
  21. package/dist/analytics/mint-cookie.js +55 -0
  22. package/dist/dev/hot-reload.d.ts +0 -1
  23. package/dist/dev/hot-reload.js +4 -25
  24. package/dist/dev/module-runner.js +104 -25
  25. package/dist/errors/errors.d.ts +7 -0
  26. package/dist/errors/errors.js +17 -0
  27. package/dist/function/function-meta.types.d.ts +2 -0
  28. package/dist/function/function-runner.js +29 -0
  29. package/dist/function/functions.types.d.ts +22 -3
  30. package/dist/middleware/auth-apikey.d.ts +1 -1
  31. package/dist/pikku-state.d.ts +1 -1
  32. package/dist/scopes.d.ts +11 -0
  33. package/dist/scopes.js +17 -0
  34. package/dist/services/credential-wire-service.d.ts +1 -1
  35. package/dist/services/feature-flag-service.d.ts +100 -0
  36. package/dist/services/feature-flag-service.js +1 -0
  37. package/dist/services/index.d.ts +1 -0
  38. package/dist/services/meta-service.d.ts +16 -0
  39. package/dist/services/meta-service.js +19 -0
  40. package/dist/services/webhook-service.d.ts +7 -2
  41. package/dist/services/webhook-service.js +11 -6
  42. package/dist/testing/service-tests/agent-run-service-tests.d.ts +2 -2
  43. package/dist/testing/service-tests/agent-storage-service-tests.d.ts +1 -1
  44. package/dist/testing/service-tests/channel-store-tests.d.ts +1 -1
  45. package/dist/testing/service-tests/credential-service-tests.d.ts +1 -1
  46. package/dist/testing/service-tests/deployment-service-tests.d.ts +1 -1
  47. package/dist/testing/service-tests/event-hub-store-tests.d.ts +1 -1
  48. package/dist/testing/service-tests/secret-service-tests.d.ts +1 -1
  49. package/dist/testing/service-tests/session-store-tests.d.ts +1 -1
  50. package/dist/testing/service-tests/workflow-run-service-tests.d.ts +1 -1
  51. package/dist/testing/service-tests/workflow-service-tests.d.ts +1 -1
  52. package/dist/types/core.types.d.ts +23 -0
  53. package/dist/wirings/agent/agent-rpc.d.ts +1 -1
  54. package/dist/wirings/agent/agent-turn.d.ts +1 -1
  55. package/dist/wirings/agent-scorer/agent-scorer-live.d.ts +1 -1
  56. package/dist/wirings/channel/channel-common.d.ts +1 -1
  57. package/dist/wirings/channel/channel-rpc-validators.d.ts +2 -2
  58. package/dist/wirings/channel/channel-runner.d.ts +1 -1
  59. package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
  60. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
  61. package/dist/wirings/cli/channel/cli-approval.d.ts +2 -2
  62. package/dist/wirings/flag/assert-feature-available.d.ts +15 -0
  63. package/dist/wirings/flag/assert-feature-available.js +23 -0
  64. package/dist/wirings/flag/cached-flag-source.d.ts +73 -0
  65. package/dist/wirings/flag/cached-flag-source.js +96 -0
  66. package/dist/wirings/flag/define-feature-flags.d.ts +33 -0
  67. package/dist/wirings/flag/define-feature-flags.js +32 -0
  68. package/dist/wirings/flag/flag.types.d.ts +97 -0
  69. package/dist/wirings/flag/flag.types.js +1 -0
  70. package/dist/wirings/flag/index.d.ts +7 -0
  71. package/dist/wirings/flag/index.js +5 -0
  72. package/dist/wirings/flag/resolve-flag.d.ts +52 -0
  73. package/dist/wirings/flag/resolve-flag.js +90 -0
  74. package/dist/wirings/flag/validate-flag-definitions.d.ts +26 -0
  75. package/dist/wirings/flag/validate-flag-definitions.js +103 -0
  76. package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +8 -8
  77. package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +1 -1
  78. package/dist/wirings/workflow/workflow-queue-routing.d.ts +1 -1
  79. package/knowledge/decisions/internals/a-reset-suite-makes-the-dev-seed-the-fixture.md +50 -0
  80. package/knowledge/decisions/internals/hot-reload-reads-the-changed-source-never-a-compiled-copy.md +38 -0
  81. package/knowledge/decisions/internals/index.md +2 -0
  82. package/package.json +11 -5
  83. package/run-tests.sh +17 -9
  84. package/src/public-surface.json +26 -0
  85. package/src/agent-naming.test.ts +0 -68
  86. package/src/api-report.test.ts +0 -138
  87. package/src/app-alias-surface.test.ts +0 -179
  88. package/src/app-leaf-surface.test.ts +0 -222
  89. package/src/bootstrap-compat/root.ts +0 -20
  90. package/src/classification/column-form.test.ts +0 -97
  91. package/src/classification/column-form.ts +0 -55
  92. package/src/classification/data-classification.ts +0 -73
  93. package/src/classification/index.ts +0 -40
  94. package/src/classification/key-ids.ts +0 -2
  95. package/src/classification/secret-value.test.ts +0 -204
  96. package/src/classification/secret-value.ts +0 -106
  97. package/src/crypto-utils.test.ts +0 -668
  98. package/src/crypto-utils.ts +0 -460
  99. package/src/dev/hot-reload.test.ts +0 -587
  100. package/src/dev/hot-reload.ts +0 -225
  101. package/src/dev/module-runner.test.ts +0 -235
  102. package/src/dev/module-runner.ts +0 -138
  103. package/src/dev/reload-meta.test.ts +0 -183
  104. package/src/dev/reload-meta.ts +0 -144
  105. package/src/ecosystem-tier-removed.test.ts +0 -72
  106. package/src/env.ts +0 -1
  107. package/src/errors/error-handler.ts +0 -77
  108. package/src/errors/error.test.ts +0 -229
  109. package/src/errors/errors.ts +0 -393
  110. package/src/errors/index.ts +0 -11
  111. package/src/errors/serialized-error.ts +0 -12
  112. package/src/factory-functions.test.ts +0 -111
  113. package/src/function/abort-scope.test.ts +0 -97
  114. package/src/function/abort-scope.ts +0 -80
  115. package/src/function/function-meta.types.ts +0 -151
  116. package/src/function/function-runner.test.ts +0 -1619
  117. package/src/function/function-runner.ts +0 -499
  118. package/src/function/functions.types.ts +0 -319
  119. package/src/function/index.ts +0 -40
  120. package/src/function/list.types.test.ts +0 -100
  121. package/src/function/list.types.ts +0 -69
  122. package/src/function/pikku-request.test.ts +0 -35
  123. package/src/function/pikku-request.ts +0 -17
  124. package/src/gopass-secrets-removed.test.ts +0 -51
  125. package/src/handle-error.test.ts +0 -532
  126. package/src/handle-error.ts +0 -64
  127. package/src/middleware/auth-apikey.test.ts +0 -362
  128. package/src/middleware/auth-apikey.ts +0 -39
  129. package/src/middleware/auth-bearer.test.ts +0 -566
  130. package/src/middleware/auth-bearer.ts +0 -83
  131. package/src/middleware/auth-cookie.test.ts +0 -572
  132. package/src/middleware/auth-cookie.ts +0 -107
  133. package/src/middleware/cors.test.ts +0 -579
  134. package/src/middleware/cors.ts +0 -103
  135. package/src/middleware/index.ts +0 -30
  136. package/src/middleware/middleware-factories.ts +0 -76
  137. package/src/middleware/middleware.types.ts +0 -61
  138. package/src/middleware/remote-auth.test.ts +0 -547
  139. package/src/middleware/remote-auth.ts +0 -95
  140. package/src/middleware/remote-jobs-secret.ts +0 -35
  141. package/src/middleware/require-origin.test.ts +0 -115
  142. package/src/middleware/require-origin.ts +0 -79
  143. package/src/middleware/telemetry.ts +0 -83
  144. package/src/middleware-runner.test.ts +0 -578
  145. package/src/middleware-runner.ts +0 -232
  146. package/src/no-any-casts.test.ts +0 -57
  147. package/src/no-root-barrel.test.ts +0 -122
  148. package/src/permissions.test.ts +0 -256
  149. package/src/permissions.ts +0 -217
  150. package/src/pikku-state.test.ts +0 -198
  151. package/src/pikku-state.ts +0 -206
  152. package/src/production-barrels-stay-lean.test.ts +0 -110
  153. package/src/public-surface.test.ts +0 -133
  154. package/src/remote.test.ts +0 -173
  155. package/src/remote.ts +0 -56
  156. package/src/removed-legacy-exports.test.ts +0 -66
  157. package/src/run-tests-script.test.ts +0 -67
  158. package/src/schema.test.ts +0 -430
  159. package/src/schema.ts +0 -204
  160. package/src/scopes.test.ts +0 -203
  161. package/src/scopes.ts +0 -67
  162. package/src/services/agent-run-state-service.ts +0 -37
  163. package/src/services/agent-runner-service.ts +0 -238
  164. package/src/services/agent-storage-service.ts +0 -39
  165. package/src/services/ai-embedding-service.ts +0 -9
  166. package/src/services/audit-service.test.ts +0 -44
  167. package/src/services/audit-service.ts +0 -280
  168. package/src/services/content-service.ts +0 -65
  169. package/src/services/credential-service.ts +0 -20
  170. package/src/services/credential-wire-service.test.ts +0 -235
  171. package/src/services/credential-wire-service.ts +0 -120
  172. package/src/services/deployment-service.ts +0 -32
  173. package/src/services/email-service.test.ts +0 -100
  174. package/src/services/email-service.ts +0 -60
  175. package/src/services/email-template.test.ts +0 -311
  176. package/src/services/email-template.ts +0 -254
  177. package/src/services/file-scenario-run-store.test.ts +0 -349
  178. package/src/services/file-scenario-run-store.ts +0 -282
  179. package/src/services/gateway-service.ts +0 -5
  180. package/src/services/http-personas-converse.test.ts +0 -274
  181. package/src/services/http-personas.test.ts +0 -379
  182. package/src/services/http-personas.ts +0 -508
  183. package/src/services/in-memory-agent-run-state-service.ts +0 -87
  184. package/src/services/in-memory-queue-service.test.ts +0 -162
  185. package/src/services/in-memory-queue-service.ts +0 -78
  186. package/src/services/in-memory-session-store.test.ts +0 -58
  187. package/src/services/in-memory-session-store.ts +0 -20
  188. package/src/services/in-memory-trigger-service.ts +0 -47
  189. package/src/services/in-memory-workflow-service.test.ts +0 -430
  190. package/src/services/in-memory-workflow-service.ts +0 -595
  191. package/src/services/index.ts +0 -192
  192. package/src/services/istanbul-coverage-service.test.ts +0 -66
  193. package/src/services/istanbul-coverage-service.ts +0 -59
  194. package/src/services/jwt-service.ts +0 -15
  195. package/src/services/local-content-request-handler.test.ts +0 -240
  196. package/src/services/local-content-request-handler.ts +0 -295
  197. package/src/services/local-content.test.ts +0 -186
  198. package/src/services/local-content.ts +0 -242
  199. package/src/services/local-credential-service.ts +0 -63
  200. package/src/services/local-email-service.test.ts +0 -182
  201. package/src/services/local-email-service.ts +0 -43
  202. package/src/services/local-gateway-service.ts +0 -51
  203. package/src/services/local-secrets.test.ts +0 -95
  204. package/src/services/local-secrets.ts +0 -71
  205. package/src/services/local-variables.test.ts +0 -61
  206. package/src/services/local-variables.ts +0 -45
  207. package/src/services/logger-console.test.ts +0 -117
  208. package/src/services/logger-console.ts +0 -174
  209. package/src/services/logger.ts +0 -48
  210. package/src/services/meta-service.test.ts +0 -75
  211. package/src/services/meta-service.ts +0 -767
  212. package/src/services/persona-actor-secret.test.ts +0 -68
  213. package/src/services/persona-actor-secret.ts +0 -70
  214. package/src/services/persona-sign-in.test.ts +0 -219
  215. package/src/services/persona-sign-in.ts +0 -238
  216. package/src/services/personas-service.ts +0 -191
  217. package/src/services/pikku-user-id.test.ts +0 -62
  218. package/src/services/pikku-user-id.ts +0 -13
  219. package/src/services/queue-webhook-service.test.ts +0 -409
  220. package/src/services/queue-webhook-service.ts +0 -150
  221. package/src/services/remote-jobs.test.ts +0 -106
  222. package/src/services/remote-jobs.ts +0 -92
  223. package/src/services/scheduler-service.ts +0 -37
  224. package/src/services/schema-service.ts +0 -10
  225. package/src/services/scope-service.ts +0 -91
  226. package/src/services/scoped-credential-service.test.ts +0 -86
  227. package/src/services/scoped-credential-service.ts +0 -63
  228. package/src/services/scoped-secret-service.test.ts +0 -93
  229. package/src/services/scoped-secret-service.ts +0 -40
  230. package/src/services/secret-host-binding.test.ts +0 -138
  231. package/src/services/secret-host-binding.ts +0 -51
  232. package/src/services/secret-service.ts +0 -25
  233. package/src/services/secretless.test.ts +0 -54
  234. package/src/services/secretless.ts +0 -29
  235. package/src/services/session-store.ts +0 -9
  236. package/src/services/stub-tracker.test.ts +0 -104
  237. package/src/services/stub-tracker.ts +0 -175
  238. package/src/services/system-role-guard.test.ts +0 -96
  239. package/src/services/system-role-guard.ts +0 -71
  240. package/src/services/temporary-file-service.ts +0 -76
  241. package/src/services/trigger-service.ts +0 -5
  242. package/src/services/typed-credential-service.ts +0 -83
  243. package/src/services/typed-secret-service.test.ts +0 -204
  244. package/src/services/typed-secret-service.ts +0 -132
  245. package/src/services/typed-variables-service.test.ts +0 -166
  246. package/src/services/typed-variables-service.ts +0 -166
  247. package/src/services/user-session-service.test.ts +0 -147
  248. package/src/services/user-session-service.ts +0 -85
  249. package/src/services/v8-coverage-service.test.ts +0 -69
  250. package/src/services/v8-coverage-service.ts +0 -163
  251. package/src/services/variables-service.ts +0 -13
  252. package/src/services/webhook-service.ts +0 -147
  253. package/src/services/workflow-service.ts +0 -120
  254. package/src/side-effects-are-declared.test.ts +0 -84
  255. package/src/source-files-stay-composable.test.ts +0 -41
  256. package/src/template-alias-surface.test.ts +0 -240
  257. package/src/test-utils.ts +0 -38
  258. package/src/testing/index.ts +0 -3
  259. package/src/testing/service-tests/agent-run-service-tests.ts +0 -98
  260. package/src/testing/service-tests/agent-storage-service-tests.ts +0 -379
  261. package/src/testing/service-tests/channel-store-tests.ts +0 -98
  262. package/src/testing/service-tests/credential-service-tests.ts +0 -143
  263. package/src/testing/service-tests/deployment-service-tests.ts +0 -33
  264. package/src/testing/service-tests/event-hub-store-tests.ts +0 -48
  265. package/src/testing/service-tests/secret-service-tests.ts +0 -105
  266. package/src/testing/service-tests/session-store-tests.ts +0 -62
  267. package/src/testing/service-tests/workflow-run-service-tests.ts +0 -59
  268. package/src/testing/service-tests/workflow-service-tests.ts +0 -308
  269. package/src/testing/service-tests.ts +0 -95
  270. package/src/time-utils.test.ts +0 -56
  271. package/src/time-utils.ts +0 -89
  272. package/src/types/core.types.ts +0 -446
  273. package/src/types/index.ts +0 -25
  274. package/src/types/state.types.ts +0 -226
  275. package/src/types/typed-credentials.test.ts +0 -72
  276. package/src/utils/hash.test.ts +0 -68
  277. package/src/utils/hash.ts +0 -26
  278. package/src/utils/hmac.ts +0 -21
  279. package/src/utils/node-host-resolver.ts +0 -20
  280. package/src/utils/safe-fetch.test.ts +0 -515
  281. package/src/utils/safe-fetch.ts +0 -347
  282. package/src/utils.test.ts +0 -359
  283. package/src/utils.ts +0 -165
  284. package/src/version.test.ts +0 -80
  285. package/src/version.ts +0 -25
  286. package/src/wirings/actor-flow/actor-flow.types.ts +0 -40
  287. package/src/wirings/actor-flow/index.ts +0 -10
  288. package/src/wirings/actor-flow/run-conversation.test.ts +0 -187
  289. package/src/wirings/actor-flow/run-conversation.ts +0 -280
  290. package/src/wirings/addon/addon-auth-tags.test.ts +0 -219
  291. package/src/wirings/addon/addon-runner.ts +0 -236
  292. package/src/wirings/addon/addon-scopes.test.ts +0 -225
  293. package/src/wirings/addon/addon-secrets.test.ts +0 -391
  294. package/src/wirings/addon/index.ts +0 -12
  295. package/src/wirings/addon/remote-addon-auth.ts +0 -65
  296. package/src/wirings/addon/wire-addon.test.ts +0 -102
  297. package/src/wirings/addon/wire-addon.ts +0 -202
  298. package/src/wirings/addon/wire-remote-addon.ts +0 -41
  299. package/src/wirings/agent/agent-agui.test.ts +0 -1213
  300. package/src/wirings/agent/agent-agui.ts +0 -405
  301. package/src/wirings/agent/agent-authorization.test.ts +0 -208
  302. package/src/wirings/agent/agent-finalize.test.ts +0 -187
  303. package/src/wirings/agent/agent-finalize.ts +0 -197
  304. package/src/wirings/agent/agent-helpers.test.ts +0 -215
  305. package/src/wirings/agent/agent-helpers.ts +0 -96
  306. package/src/wirings/agent/agent-interrupt.test.ts +0 -833
  307. package/src/wirings/agent/agent-interrupt.ts +0 -400
  308. package/src/wirings/agent/agent-memory.test.ts +0 -397
  309. package/src/wirings/agent/agent-memory.ts +0 -496
  310. package/src/wirings/agent/agent-middleware.types.test.ts +0 -41
  311. package/src/wirings/agent/agent-model-config.test.ts +0 -103
  312. package/src/wirings/agent/agent-model-config.ts +0 -59
  313. package/src/wirings/agent/agent-prepare.test.ts +0 -977
  314. package/src/wirings/agent/agent-prepare.ts +0 -1083
  315. package/src/wirings/agent/agent-registry.test.ts +0 -455
  316. package/src/wirings/agent/agent-registry.ts +0 -99
  317. package/src/wirings/agent/agent-resume-authorization.test.ts +0 -206
  318. package/src/wirings/agent/agent-rpc.ts +0 -116
  319. package/src/wirings/agent/agent-runner.test.ts +0 -1229
  320. package/src/wirings/agent/agent-runner.ts +0 -858
  321. package/src/wirings/agent/agent-stream-delegate.test.ts +0 -381
  322. package/src/wirings/agent/agent-stream-output-hooks.test.ts +0 -353
  323. package/src/wirings/agent/agent-stream.test.ts +0 -1800
  324. package/src/wirings/agent/agent-stream.ts +0 -1639
  325. package/src/wirings/agent/agent-thread-ownership.test.ts +0 -297
  326. package/src/wirings/agent/agent-turn.test.ts +0 -65
  327. package/src/wirings/agent/agent-turn.ts +0 -122
  328. package/src/wirings/agent/agent-utils.ts +0 -20
  329. package/src/wirings/agent/agent.types.ts +0 -676
  330. package/src/wirings/agent/index.ts +0 -58
  331. package/src/wirings/agent/voice-input.test.ts +0 -220
  332. package/src/wirings/agent/voice-input.ts +0 -180
  333. package/src/wirings/agent/voice-output.test.ts +0 -510
  334. package/src/wirings/agent/voice-output.ts +0 -311
  335. package/src/wirings/agent-scorer/agent-scorer-grade.test.ts +0 -106
  336. package/src/wirings/agent-scorer/agent-scorer-grade.ts +0 -55
  337. package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +0 -285
  338. package/src/wirings/agent-scorer/agent-scorer-judge.ts +0 -180
  339. package/src/wirings/agent-scorer/agent-scorer-live.test.ts +0 -174
  340. package/src/wirings/agent-scorer/agent-scorer-live.ts +0 -56
  341. package/src/wirings/agent-scorer/agent-scorer-registry.ts +0 -66
  342. package/src/wirings/agent-scorer/agent-scorer-sampling.test.ts +0 -34
  343. package/src/wirings/agent-scorer/agent-scorer-sampling.ts +0 -36
  344. package/src/wirings/agent-scorer/agent-scorer-snapshots.test.ts +0 -49
  345. package/src/wirings/agent-scorer/agent-scorer-snapshots.ts +0 -46
  346. package/src/wirings/agent-scorer/agent-scorer-worker.test.ts +0 -122
  347. package/src/wirings/agent-scorer/agent-scorer-worker.ts +0 -71
  348. package/src/wirings/agent-scorer/agent-scorer.ts +0 -102
  349. package/src/wirings/agent-scorer/agent-scorer.types.ts +0 -128
  350. package/src/wirings/agent-scorer/index.ts +0 -23
  351. package/src/wirings/channel/channel-common.ts +0 -102
  352. package/src/wirings/channel/channel-handler-shapes.test.ts +0 -72
  353. package/src/wirings/channel/channel-handler.test.ts +0 -322
  354. package/src/wirings/channel/channel-handler.ts +0 -259
  355. package/src/wirings/channel/channel-host-rpc.test.ts +0 -150
  356. package/src/wirings/channel/channel-host-rpc.ts +0 -69
  357. package/src/wirings/channel/channel-middleware-runner.test.ts +0 -188
  358. package/src/wirings/channel/channel-middleware-runner.ts +0 -126
  359. package/src/wirings/channel/channel-rpc-registry.ts +0 -116
  360. package/src/wirings/channel/channel-rpc-responder.ts +0 -117
  361. package/src/wirings/channel/channel-rpc-service.ts +0 -132
  362. package/src/wirings/channel/channel-rpc-validators.ts +0 -65
  363. package/src/wirings/channel/channel-rpc.test.ts +0 -841
  364. package/src/wirings/channel/channel-rpc.ts +0 -5
  365. package/src/wirings/channel/channel-rpc.types.ts +0 -160
  366. package/src/wirings/channel/channel-runner.ts +0 -164
  367. package/src/wirings/channel/channel-store.ts +0 -35
  368. package/src/wirings/channel/channel.types.ts +0 -193
  369. package/src/wirings/channel/define-channel-routes.ts +0 -5
  370. package/src/wirings/channel/eventhub-service.ts +0 -16
  371. package/src/wirings/channel/eventhub-store.ts +0 -13
  372. package/src/wirings/channel/index.ts +0 -40
  373. package/src/wirings/channel/local/index.ts +0 -3
  374. package/src/wirings/channel/local/local-channel-handler.ts +0 -98
  375. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -339
  376. package/src/wirings/channel/local/local-channel-runner.ts +0 -271
  377. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -77
  378. package/src/wirings/channel/local/local-eventhub-service.ts +0 -69
  379. package/src/wirings/channel/log-channels.ts +0 -16
  380. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -135
  381. package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -60
  382. package/src/wirings/channel/serverless/index.ts +0 -6
  383. package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -328
  384. package/src/wirings/cli/channel/cli-approval.test.ts +0 -177
  385. package/src/wirings/cli/channel/cli-approval.ts +0 -135
  386. package/src/wirings/cli/channel/cli-channel-runner.ts +0 -118
  387. package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +0 -192
  388. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +0 -148
  389. package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +0 -480
  390. package/src/wirings/cli/channel/cli-raw-client-runner.ts +0 -188
  391. package/src/wirings/cli/channel/index.ts +0 -6
  392. package/src/wirings/cli/cli-runner.test.ts +0 -969
  393. package/src/wirings/cli/cli-runner.ts +0 -538
  394. package/src/wirings/cli/cli.types.ts +0 -388
  395. package/src/wirings/cli/command-parser.test.ts +0 -1120
  396. package/src/wirings/cli/command-parser.ts +0 -713
  397. package/src/wirings/cli/define-cli-commands.ts +0 -13
  398. package/src/wirings/cli/format-cli-error.test.ts +0 -91
  399. package/src/wirings/cli/format-cli-error.ts +0 -96
  400. package/src/wirings/cli/index.ts +0 -19
  401. package/src/wirings/credential/credential.types.ts +0 -37
  402. package/src/wirings/credential/define-credential.ts +0 -49
  403. package/src/wirings/credential/index.ts +0 -7
  404. package/src/wirings/credential/validate-credential-definitions.ts +0 -63
  405. package/src/wirings/gateway/gateway-authorization.test.ts +0 -575
  406. package/src/wirings/gateway/gateway-channel-meta.test.ts +0 -44
  407. package/src/wirings/gateway/gateway-runner.test.ts +0 -581
  408. package/src/wirings/gateway/gateway-runner.ts +0 -411
  409. package/src/wirings/gateway/gateway.types.ts +0 -137
  410. package/src/wirings/gateway/index.ts +0 -15
  411. package/src/wirings/http/http-routes.test.ts +0 -318
  412. package/src/wirings/http/http-routes.ts +0 -111
  413. package/src/wirings/http/http-runner-addon-ref.test.ts +0 -238
  414. package/src/wirings/http/http-runner.test.ts +0 -503
  415. package/src/wirings/http/http-runner.ts +0 -462
  416. package/src/wirings/http/http.types.ts +0 -307
  417. package/src/wirings/http/index.ts +0 -27
  418. package/src/wirings/http/log-http-routes.ts +0 -18
  419. package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -318
  420. package/src/wirings/http/pikku-fetch-http-request.ts +0 -260
  421. package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -123
  422. package/src/wirings/http/pikku-fetch-http-response.ts +0 -149
  423. package/src/wirings/http/routers/http-router.ts +0 -13
  424. package/src/wirings/http/routers/path-to-regex.test.ts +0 -306
  425. package/src/wirings/http/routers/path-to-regex.ts +0 -115
  426. package/src/wirings/http/web-request.test.ts +0 -382
  427. package/src/wirings/http/web-request.ts +0 -162
  428. package/src/wirings/mcp/index.ts +0 -26
  429. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -388
  430. package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
  431. package/src/wirings/mcp/mcp-runner.test.ts +0 -588
  432. package/src/wirings/mcp/mcp-runner.ts +0 -330
  433. package/src/wirings/mcp/mcp.types.ts +0 -199
  434. package/src/wirings/node/index.ts +0 -2
  435. package/src/wirings/node/node.types.ts +0 -23
  436. package/src/wirings/oauth2/index.ts +0 -1
  437. package/src/wirings/oauth2/oauth2.types.ts +0 -12
  438. package/src/wirings/persona/define-personas.ts +0 -33
  439. package/src/wirings/persona/index.ts +0 -75
  440. package/src/wirings/persona/persona-app-scopes.test.ts +0 -47
  441. package/src/wirings/persona/persona-app-scopes.ts +0 -74
  442. package/src/wirings/persona/persona-email.ts +0 -87
  443. package/src/wirings/persona/persona-environments.test.ts +0 -194
  444. package/src/wirings/persona/persona-environments.ts +0 -138
  445. package/src/wirings/persona/persona-mailbox.ts +0 -156
  446. package/src/wirings/persona/persona.test.ts +0 -230
  447. package/src/wirings/persona/persona.types.ts +0 -156
  448. package/src/wirings/persona/validate-personas.ts +0 -137
  449. package/src/wirings/queue/index.ts +0 -29
  450. package/src/wirings/queue/queue-identity.test.ts +0 -454
  451. package/src/wirings/queue/queue-identity.ts +0 -176
  452. package/src/wirings/queue/queue-runner.test.ts +0 -705
  453. package/src/wirings/queue/queue-runner.ts +0 -181
  454. package/src/wirings/queue/queue.types.ts +0 -161
  455. package/src/wirings/queue/register-queue-helper.ts +0 -46
  456. package/src/wirings/queue/signed-queue-service.ts +0 -60
  457. package/src/wirings/queue/validate-worker-config.test.ts +0 -108
  458. package/src/wirings/queue/validate-worker-config.ts +0 -90
  459. package/src/wirings/role/define-system-role.ts +0 -33
  460. package/src/wirings/role/index.ts +0 -13
  461. package/src/wirings/role/role.test.ts +0 -104
  462. package/src/wirings/role/role.types.ts +0 -47
  463. package/src/wirings/role/validate-role-definitions.ts +0 -93
  464. package/src/wirings/rpc/index.ts +0 -8
  465. package/src/wirings/rpc/rpc-runner.test.ts +0 -1130
  466. package/src/wirings/rpc/rpc-runner.ts +0 -569
  467. package/src/wirings/rpc/rpc-types.ts +0 -87
  468. package/src/wirings/scheduler/index.ts +0 -11
  469. package/src/wirings/scheduler/log-schedulers.ts +0 -16
  470. package/src/wirings/scheduler/scheduler-runner.test.ts +0 -835
  471. package/src/wirings/scheduler/scheduler-runner.ts +0 -138
  472. package/src/wirings/scheduler/scheduler.types.ts +0 -42
  473. package/src/wirings/scope/define-scope.ts +0 -33
  474. package/src/wirings/scope/index.ts +0 -15
  475. package/src/wirings/scope/scope.test.ts +0 -159
  476. package/src/wirings/scope/scope.types.ts +0 -42
  477. package/src/wirings/scope/validate-scope-definitions.ts +0 -107
  478. package/src/wirings/secret/index.ts +0 -9
  479. package/src/wirings/secret/secret.types.ts +0 -70
  480. package/src/wirings/secret/validate-secret-definitions.test.ts +0 -232
  481. package/src/wirings/secret/validate-secret-definitions.ts +0 -88
  482. package/src/wirings/trigger/index.ts +0 -9
  483. package/src/wirings/trigger/pikku-trigger-service.ts +0 -107
  484. package/src/wirings/trigger/trigger-runner.test.ts +0 -78
  485. package/src/wirings/trigger/trigger-runner.ts +0 -113
  486. package/src/wirings/trigger/trigger.types.ts +0 -100
  487. package/src/wirings/variable/index.ts +0 -8
  488. package/src/wirings/variable/validate-variable-definitions.test.ts +0 -115
  489. package/src/wirings/variable/validate-variable-definitions.ts +0 -71
  490. package/src/wirings/variable/variable.types.ts +0 -40
  491. package/src/wirings/virtual-user/index.ts +0 -107
  492. package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +0 -115
  493. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +0 -95
  494. package/src/wirings/virtual-user/run-virtual-user.test.ts +0 -774
  495. package/src/wirings/virtual-user/run-virtual-user.ts +0 -684
  496. package/src/wirings/virtual-user/virtual-user-agents.test.ts +0 -72
  497. package/src/wirings/virtual-user/virtual-user-agents.ts +0 -62
  498. package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +0 -215
  499. package/src/wirings/virtual-user/virtual-user-catalogue.ts +0 -184
  500. package/src/wirings/virtual-user/virtual-user-derive.test.ts +0 -426
  501. package/src/wirings/virtual-user/virtual-user-derive.ts +0 -161
  502. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +0 -68
  503. package/src/wirings/virtual-user/virtual-user-dispositions.ts +0 -210
  504. package/src/wirings/virtual-user/virtual-user-intents.test.ts +0 -218
  505. package/src/wirings/virtual-user/virtual-user-intents.ts +0 -185
  506. package/src/wirings/virtual-user/virtual-user-rng.test.ts +0 -72
  507. package/src/wirings/virtual-user/virtual-user-rng.ts +0 -50
  508. package/src/wirings/virtual-user/virtual-user-run-store.ts +0 -131
  509. package/src/wirings/virtual-user/virtual-user-scaffold.test.ts +0 -854
  510. package/src/wirings/virtual-user/virtual-user-scaffold.ts +0 -664
  511. package/src/wirings/virtual-user/virtual-user-schedule-store.ts +0 -93
  512. package/src/wirings/virtual-user/virtual-user-schedule.test.ts +0 -280
  513. package/src/wirings/virtual-user/virtual-user-schedule.ts +0 -156
  514. package/src/wirings/virtual-user/virtual-user-target.ts +0 -47
  515. package/src/wirings/virtual-user/virtual-user.types.ts +0 -215
  516. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -709
  517. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -25
  518. package/src/wirings/workflow/feature.test.ts +0 -131
  519. package/src/wirings/workflow/feature.ts +0 -59
  520. package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +0 -569
  521. package/src/wirings/workflow/graph/graph-foreach.test.ts +0 -626
  522. package/src/wirings/workflow/graph/graph-node.ts +0 -115
  523. package/src/wirings/workflow/graph/graph-runner.test.ts +0 -1049
  524. package/src/wirings/workflow/graph/graph-runner.ts +0 -1376
  525. package/src/wirings/workflow/graph/graph-validation.test.ts +0 -27
  526. package/src/wirings/workflow/graph/graph-validation.ts +0 -41
  527. package/src/wirings/workflow/graph/template.test.ts +0 -49
  528. package/src/wirings/workflow/graph/template.ts +0 -42
  529. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -39
  530. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -75
  531. package/src/wirings/workflow/index.ts +0 -107
  532. package/src/wirings/workflow/pikku-scenario-service.ts +0 -1013
  533. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -963
  534. package/src/wirings/workflow/pikku-workflow-service.ts +0 -1993
  535. package/src/wirings/workflow/run-timeline.test.ts +0 -199
  536. package/src/wirings/workflow/run-timeline.ts +0 -185
  537. package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -107
  538. package/src/wirings/workflow/scenario-cookie-jar.ts +0 -57
  539. package/src/wirings/workflow/scenario-expectations.test.ts +0 -238
  540. package/src/wirings/workflow/scenario-hooks.test.ts +0 -259
  541. package/src/wirings/workflow/scenario-poll.test.ts +0 -64
  542. package/src/wirings/workflow/scenario-poll.ts +0 -27
  543. package/src/wirings/workflow/scenario-prose.test.ts +0 -275
  544. package/src/wirings/workflow/scenario-prose.ts +0 -86
  545. package/src/wirings/workflow/scenario-run.types.ts +0 -193
  546. package/src/wirings/workflow/scenario-service.test.ts +0 -147
  547. package/src/wirings/workflow/scenario-step-guards.ts +0 -23
  548. package/src/wirings/workflow/scenario-step.test.ts +0 -800
  549. package/src/wirings/workflow/scenario-step.types.ts +0 -262
  550. package/src/wirings/workflow/scenario-surface.test.ts +0 -146
  551. package/src/wirings/workflow/scenario-surface.ts +0 -71
  552. package/src/wirings/workflow/scenario.types.ts +0 -63
  553. package/src/wirings/workflow/workflow-approval-audit.ts +0 -47
  554. package/src/wirings/workflow/workflow-approval-policy.test.ts +0 -594
  555. package/src/wirings/workflow/workflow-approval-policy.ts +0 -68
  556. package/src/wirings/workflow/workflow-approval.ts +0 -290
  557. package/src/wirings/workflow/workflow-child-run-session.test.ts +0 -168
  558. package/src/wirings/workflow/workflow-constants.ts +0 -66
  559. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +0 -116
  560. package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -55
  561. package/src/wirings/workflow/workflow-dispatch-relay.test.ts +0 -128
  562. package/src/wirings/workflow/workflow-errors.ts +0 -132
  563. package/src/wirings/workflow/workflow-inline-authority.test.ts +0 -175
  564. package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -51
  565. package/src/wirings/workflow/workflow-invocation-id.ts +0 -28
  566. package/src/wirings/workflow/workflow-meta-resolver.ts +0 -45
  567. package/src/wirings/workflow/workflow-mirror.test.ts +0 -171
  568. package/src/wirings/workflow/workflow-missing-meta.test.ts +0 -92
  569. package/src/wirings/workflow/workflow-on-error.test.ts +0 -145
  570. package/src/wirings/workflow/workflow-queue-routing.ts +0 -129
  571. package/src/wirings/workflow/workflow-queue-wiring.ts +0 -149
  572. package/src/wirings/workflow/workflow-queue-workers.test.ts +0 -131
  573. package/src/wirings/workflow/workflow-queue-workers.ts +0 -66
  574. package/src/wirings/workflow/workflow-recovery.ts +0 -192
  575. package/src/wirings/workflow/workflow-replay-snapshot.test.ts +0 -140
  576. package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -113
  577. package/src/wirings/workflow/workflow-run-authority.test.ts +0 -212
  578. package/src/wirings/workflow/workflow-run-context.test.ts +0 -172
  579. package/src/wirings/workflow/workflow-run-engine.types.ts +0 -92
  580. package/src/wirings/workflow/workflow-run-ownership.ts +0 -37
  581. package/src/wirings/workflow/workflow-run-polling.test.ts +0 -127
  582. package/src/wirings/workflow/workflow-stalled-recovery.test.ts +0 -152
  583. package/src/wirings/workflow/workflow-status-stream.test.ts +0 -354
  584. package/src/wirings/workflow/workflow-status-stream.ts +0 -144
  585. package/src/wirings/workflow/workflow-step-claim.ts +0 -46
  586. package/src/wirings/workflow/workflow-step-ordinal.test.ts +0 -94
  587. package/src/wirings/workflow/workflow-step-session.test.ts +0 -87
  588. package/src/wirings/workflow/workflow-suspend.ts +0 -61
  589. package/src/wirings/workflow/workflow-terminal-run-guard.test.ts +0 -105
  590. package/src/wirings/workflow/workflow.types.ts +0 -268
  591. package/src/wirings-stay-decoupled.test.ts +0 -130
  592. package/tsconfig.json +0 -14
  593. package/tsconfig.tsbuildinfo +0 -1
  594. package/tsconfig.type-tests.json +0 -15
@@ -0,0 +1,103 @@
1
+ const SEPARATOR = ':';
2
+ /**
3
+ * Names that already exist on every object literal. Declaring one makes the
4
+ * meta lookup below find `Object.prototype`'s member, treat the flag as
5
+ * already declared, and drop it — a flag that validated but never reached the
6
+ * snapshot, which is the one failure a typed flag key exists to prevent.
7
+ */
8
+ const INHERITED_NAMES = new Set(['__proto__', 'constructor', 'prototype']);
9
+ const assertFlagName = (name) => {
10
+ if (name.length === 0) {
11
+ throw new Error('A feature flag is declared with an empty name.');
12
+ }
13
+ if (INHERITED_NAMES.has(name)) {
14
+ throw new Error(`Feature flag '${name}' is named after a property every object already ` +
15
+ `carries, so it cannot be told apart from one. Pick another name.`);
16
+ }
17
+ if (name.includes(SEPARATOR)) {
18
+ throw new Error(`Feature flag '${name}' contains the '${SEPARATOR}' separator. ` +
19
+ `'${SEPARATOR}' delimits scope ids; a flag named like a scope reads as one.`);
20
+ }
21
+ };
22
+ /**
23
+ * The declared flags as a flat list, deduplicated by name.
24
+ *
25
+ * A flag may legitimately be declared more than once — an addon and its host
26
+ * app both contributing one — and
27
+ * {@link validateAndBuildFeatureFlagDefinitionsMeta} has already guaranteed
28
+ * those declarations are identical.
29
+ */
30
+ export const flattenFeatureFlagDefinitions = (definitions) => {
31
+ const seen = new Set();
32
+ const out = [];
33
+ for (const def of definitions) {
34
+ if (seen.has(def.name)) {
35
+ continue;
36
+ }
37
+ seen.add(def.name);
38
+ out.push({
39
+ name: def.name,
40
+ description: def.description,
41
+ anyOf: def.anyOf ? [...def.anyOf] : undefined,
42
+ });
43
+ }
44
+ return out;
45
+ };
46
+ /**
47
+ * Validates declared flags and keys them by name.
48
+ *
49
+ * Definitions sharing a name must name the same scope set; a conflicting
50
+ * redeclaration is a hard error naming both source files. Order within `anyOf`
51
+ * is not significant.
52
+ */
53
+ export function validateAndBuildFeatureFlagDefinitionsMeta(definitions) {
54
+ const meta = {};
55
+ for (const def of definitions) {
56
+ assertFlagName(def.name);
57
+ if (def.anyOf && def.anyOf.length === 0) {
58
+ throw new Error(`Feature flag '${def.name}' declares 'anyOf: []'. ` +
59
+ `An empty list satisfies nobody, which is never what is meant: ` +
60
+ `omit 'anyOf' for a pure switch, or name the scopes that reveal it.`);
61
+ }
62
+ const existing = meta[def.name];
63
+ if (existing) {
64
+ const sameScopes = JSON.stringify([...(existing.anyOf ?? [])].sort()) ===
65
+ JSON.stringify([...(def.anyOf ?? [])].sort());
66
+ if (!sameScopes) {
67
+ throw new Error(`Feature flag '${def.name}' is declared with different scopes.\n` +
68
+ ` First declaration: ${existing.sourceFile ?? 'unknown'}\n` +
69
+ ` Second declaration: ${def.sourceFile ?? 'unknown'}\n` +
70
+ `Flags sharing a name must name the same scopes.`);
71
+ }
72
+ // The description is what an operator reads beside the switch, and the
73
+ // winner here is whichever file the inspector walked first. Two
74
+ // descriptions for one flag is a disagreement about what the switch
75
+ // does, and source order is not the thing that should settle it.
76
+ if (existing.description !== def.description) {
77
+ throw new Error(`Feature flag '${def.name}' is declared with different descriptions.\n` +
78
+ ` First declaration: ${existing.sourceFile ?? 'unknown'}\n` +
79
+ ` Second declaration: ${def.sourceFile ?? 'unknown'}\n` +
80
+ `Flags sharing a name must describe the same thing.`);
81
+ }
82
+ continue;
83
+ }
84
+ meta[def.name] = {
85
+ name: def.name,
86
+ description: def.description,
87
+ anyOf: def.anyOf ? [...def.anyOf] : undefined,
88
+ sourceFile: def.sourceFile,
89
+ };
90
+ }
91
+ return meta;
92
+ }
93
+ /**
94
+ * The snapshot a flag source falls back to when its store cannot be read: every
95
+ * declared flag on, no rollout, no overrides.
96
+ *
97
+ * This is the compiled declaration, not a database read — putting a fallback
98
+ * query on the request path is how a slow store becomes a slow product.
99
+ */
100
+ export const compiledFallbackSnapshot = (flags) => Object.fromEntries(flags.map((flag) => [
101
+ flag.name,
102
+ { enabled: true, rolloutPercent: null, overrides: {} },
103
+ ]));
@@ -38,9 +38,9 @@ export declare const VIRTUAL_USER_VARIABLES: {
38
38
  * and a server that cannot name its own public URL would be signing in
39
39
  * somewhere it only assumed was itself.
40
40
  */
41
- readonly apiUrl: "VIRTUAL_USER_API_URL";
42
- readonly secret: "SCENARIO_ACTOR_SECRET";
43
- readonly model: "VIRTUAL_USER_MODEL";
41
+ readonly apiUrl: 'VIRTUAL_USER_API_URL';
42
+ readonly secret: 'SCENARIO_ACTOR_SECRET';
43
+ readonly model: 'VIRTUAL_USER_MODEL';
44
44
  /**
45
45
  * The same two variables a scenario run reads, because a virtual user signs
46
46
  * in and calls through exactly the doors a scenario does. An app that mounts
@@ -48,15 +48,15 @@ export declare const VIRTUAL_USER_VARIABLES: {
48
48
  * other way to say so, and without them the run signs in against a 404 and
49
49
  * spends its whole budget thinking about why nothing works.
50
50
  */
51
- readonly signInPath: "SCENARIO_SIGN_IN_PATH";
52
- readonly rpcPath: "SCENARIO_RPC_PATH";
51
+ readonly signInPath: 'SCENARIO_SIGN_IN_PATH';
52
+ readonly rpcPath: 'SCENARIO_RPC_PATH';
53
53
  /**
54
54
  * The deployed way in. A Fabric operator token is asymmetric — a stage can
55
55
  * verify one and can never mint one — so unlike the actor secret it is safe
56
56
  * for a run against a real environment. Read from the environment only as the
57
57
  * fallback for a run nobody handed a token to, which is what a schedule is.
58
58
  */
59
- readonly operatorToken: "FABRIC_OPERATOR_TOKEN";
59
+ readonly operatorToken: 'FABRIC_OPERATOR_TOKEN';
60
60
  };
61
61
  /**
62
62
  * Which door under the auth mount, given the credential in hand.
@@ -66,7 +66,7 @@ export declare const VIRTUAL_USER_VARIABLES: {
66
66
  * to `/api/auth` says so once and both paths follow. A path that names neither
67
67
  * plugin is left alone, since it was configured deliberately.
68
68
  */
69
- export declare const signInPathFor: (configured: string | undefined, plugin: "actor" | "fabric") => string | undefined;
69
+ export declare const signInPathFor: (configured: string | undefined, plugin: 'actor' | 'fabric') => string | undefined;
70
70
  /**
71
71
  * The declared persona behind an id, refused unless it is one a run may be.
72
72
  *
@@ -130,7 +130,7 @@ export declare const serializeVirtualUserRun: (run: VirtualUserRunRecord) => {
130
130
  persona: string;
131
131
  disposition: VirtualUserDisposition;
132
132
  seed: number;
133
- status: "failed" | "running" | "completed";
133
+ status: "completed" | "failed" | "running";
134
134
  goals: string[];
135
135
  memory: Record<string, string>;
136
136
  findings: {
@@ -31,7 +31,7 @@ export declare const isDue: (schedule: VirtualUserScheduleRecord, now: Date) =>
31
31
  * than rejected, because a schedule is configuration and a swapped pair is a
32
32
  * typo, not an attack.
33
33
  */
34
- export declare const nextRunAt: (schedule: Pick<VirtualUserScheduleRecord, "minIntervalMs" | "maxIntervalMs">, now: Date, random: () => number) => Date;
34
+ export declare const nextRunAt: (schedule: Pick<VirtualUserScheduleRecord, 'minIntervalMs' | 'maxIntervalMs'>, now: Date, random: () => number) => Date;
35
35
  export type VirtualUserSkipReason = 'in-flight' | 'dispatch-failed' | 'claimed-elsewhere';
36
36
  export interface VirtualUserTickResult {
37
37
  dispatched: {
@@ -21,6 +21,6 @@ export declare const stepWorkerQueueName: (strategy: WorkflowQueueStrategy, rpcN
21
21
  * every step dispatch would pay for that — only a step that names a workflow
22
22
  * and has a queue to reach ever asks.
23
23
  */
24
- export declare const stepDispatchTarget: (rpcName: string, stepName: string, parentIsInline: () => Promise<boolean>) => Promise<"queue" | "inline">;
24
+ export declare const stepDispatchTarget: (rpcName: string, stepName: string, parentIsInline: () => Promise<boolean>) => Promise<'queue' | 'inline'>;
25
25
  export declare const jobGroupFor: (strategy: WorkflowQueueStrategy, id?: string) => JobGroup | undefined;
26
26
  export declare const stepJobOptions: (stepOptions?: WorkflowStepOptions) => JobOptions;
@@ -0,0 +1,50 @@
1
+ ---
2
+ type: decision
3
+ title: With scenarios.reset on, the dev seed is the fixture every assertion is written against
4
+ description: The rollback restores the database as the suite found it, so seed rows are the shared baseline — which makes an absolute date in the seed a test that expires
5
+ tags: cli, scenarios
6
+ ---
7
+
8
+ # A reset suite makes the dev seed the fixture
9
+
10
+ `scenarios.reset` takes a copy of every table when the suite starts and restores
11
+ that copy between scenarios. It is a snapshot-and-restore, not a
12
+ truncate-and-reseed: nothing replays the seed file, and nothing regenerates its
13
+ rows.
14
+
15
+ Two things follow, and both are easy to get wrong.
16
+
17
+ **The seed is the fixture.** Before a reset was available, a project usually had
18
+ a hand-rolled reset RPC that wiped and re-created the handful of rows its
19
+ scenarios touched. That RPC was the fixture and the seed was scenery. With the
20
+ rollback on, the whole seed is in scope — every booking, invoice and event a
21
+ developer put there for their own convenience is now a row some scenario can
22
+ count. Assertions written as counts against the old narrow fixture go wrong the
23
+ moment the baseline widens.
24
+
25
+ **A date literal in the seed expires.** A seed is applied once, and from then on
26
+ the restore keeps handing back the same rows. Write `'2026-03-14'` and the
27
+ fixture is correct on the day it was written and quietly wrong a month later —
28
+ the booking that was supposed to be upcoming is in the past, and the scenario
29
+ that asserts on it fails for a reason that has nothing to do with the code. Seed
30
+ dates belong relative to the moment the seed is applied:
31
+
32
+ ```sql
33
+ INSERT INTO booking (id, starts_at, ends_at) VALUES
34
+ ('b_upcoming', date('now', '+200 days'), date('now', '+207 days')),
35
+ ('b_ended', date('now', '-8 days'), date('now', '-1 days'));
36
+ ```
37
+
38
+ `date('now', ...)` in sqlite, `now() + interval '200 days'` in postgres. Pick the
39
+ offsets so each row sits unambiguously on the side of whatever boundary the
40
+ scenarios test, rather than a day away from it.
41
+
42
+ There is a third limit worth stating plainly: the baseline is the database _as
43
+ the suite starts_, so it is not a pristine seed. Run N+1 inherits whatever run N
44
+ left behind. A value that must be unique in the database — an invoice number, a
45
+ reference code — has to be scoped to the run, not hard-coded, or the second run
46
+ collides with the first.
47
+
48
+ **What this rules out:** treating the reset as "the suite starts from the seed
49
+ every time". It starts from wherever the database was, and keeps returning
50
+ there.
@@ -0,0 +1,38 @@
1
+ ---
2
+ type: decision
3
+ title: Hot reload reads the changed source, never a compiled copy of it
4
+ description: A leftover .js beside a .ts made the reloader announce a reload while re-registering the previous implementation; project TypeScript is now compiled by the reloader itself
5
+ tags: core, dev
6
+ ---
7
+
8
+ # Hot reload reads the changed source, never a compiled copy of it
9
+
10
+ The reloader watches `.ts` files and runs the file that changed. It used to
11
+ look for a compiled `.js` first — `<outDir>/dist/<rel>.js`, then the sibling
12
+ `<file>.js` — and import the source only when neither existed.
13
+
14
+ `pikku dev` compiles nothing. Every one of those `.js` files is a leftover from
15
+ an earlier `tsc`, `pikku dist` or bundler run, so reading one re-registered the
16
+ implementation the developer had just replaced and logged `Hot-reloaded: <fn>`
17
+ over the top of it. The log line reads as confirmation, so the change looks
18
+ applied and wrong rather than unapplied — which is the expensive way round
19
+ (#1721).
20
+
21
+ The lookup was a leftover of the first implementation, which imported raw file
22
+ content through a `data:` URL and genuinely could not handle TypeScript. The
23
+ module runner has transpiled with esbuild since, so the source was loadable all
24
+ along and the compiled candidates could only ever supply stale code.
25
+
26
+ Loading the source means the reloader also owns resolution. `require('./x.js')`
27
+ where only `x.ts` exists is what every relative import in a TypeScript project
28
+ looks like, and node's `require` has no `.js → .ts` rewrite. Resolution goes
29
+ through the host first — so packages bind to the instance the rest of the
30
+ process holds and `wire*` side effects mutate live state — and a resolved
31
+ TypeScript file outside `node_modules` is then compiled by the reloader rather
32
+ than handed back, because both node and Bun cache what they load and a helper
33
+ edited alongside its caller would otherwise keep answering with the copy loaded
34
+ at startup. That cache is scoped to a single reload for the same reason.
35
+
36
+ **What this rules out:** reintroducing a compiled-output lookup as a
37
+ "performance" shortcut, and letting the host load project `.ts` dependencies so
38
+ reloads inherit its module cache.
@@ -12,6 +12,7 @@ caller is entitled to assume.
12
12
  <!-- pikku:knowledge-index -->
13
13
 
14
14
  - [A non-streaming agent run registers with aiRunState on the same terms as a streaming one](a-non-streaming-agent-run-registers-with-airunstate-too.md) — Otherwise interruptAIAgent finds the run, passes the ownership check, then cannot stop it — and reports that as if the run were on another host
15
+ - [With scenarios.reset on, the dev seed is the fixture every assertion is written against](a-reset-suite-makes-the-dev-seed-the-fixture.md) — The rollback restores the database as the suite found it, so seed rows are the shared baseline — which makes an absolute date in the seed a test that expires
15
16
  - [A resumed turn is as interruptible as the first one](a-resumed-agent-turn-is-as-interruptible-as-the-first.md) — It is the same person listening to the same voice, and after an approval it is where most of the reply actually gets spoken
16
17
  - [A scenario step's prose template is offered to a virtual user unfilled](a-scenario-step-template-is-offered-unfilled.md) — A reporter fills placeholders from a run that happened; there is no run yet, and the filled form would answer the question the user is there to answer
17
18
  - [A secret that fails to decrypt fails the whole read](a-secret-that-fails-to-decrypt-fails-the-whole-read.md) — getSecrets throws naming the key and its key_version rather than omitting the row, because a silent omission surfaces as an unrelated failure much later
@@ -73,6 +74,7 @@ caller is entitled to assume.
73
74
  - [Gateway webhook challenges echo bytes not JSON](gateway-webhook-challenges-echo-bytes-not-json.md) — String verification challenges are returned raw with returnsJSON false, because platforms byte-compare the echo and JSON quoting fails the handshake
74
75
  - [Gateway wiring is a meta-wiring over HTTP and channels](gateway-wiring-is-a-meta-wiring-over-http-and-channels.md) — wireGateway writes handler implementations into the HTTP and channel state directly while the inspector compiles the corresponding meta, so runtime registration deliberately writes no meta
75
76
  - [Generated src paths in pikku meta are absolute](generated-src-paths-in-pikku-meta-are-absolute.md) — emailsMeta.src is resolved by the CLI at generation time, so reading through the project-relative helpers produces a wrong compound path
77
+ - [Hot reload reads the changed source, never a compiled copy of it](hot-reload-reads-the-changed-source-never-a-compiled-copy.md) — A leftover .js beside a .ts made the reloader announce a reload while re-registering the previous implementation; project TypeScript is now compiled by the reloader itself
76
78
  - [Hot reload writes into the function map captured at startup, not pikkuState's current one](hot-reload-writes-into-the-function-map-captured-at-startup.md) — A dev-server watcher may have swapped in a codegen-scoped map whose writes are discarded on restore, and schemas are deliberately left alone
77
79
  - [HTTP request bodies are read once and shared between consumers](http-request-bodies-are-read-once-and-shared.md) — The fetch request wrapper memoises the single-use body and builds web Requests lazily, at the cost of holding the whole body in memory
78
80
  - [HTTP route groups cascade config in a fixed, per-field order](http-route-groups-cascade-config-in-a-fixed-order.md) — basePath concatenates, tags and middleware merge outward-in, auth is overridden by the innermost group
package/package.json CHANGED
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "name": "@pikku/core",
3
- "version": "0.12.107",
3
+ "version": "0.12.112",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/pikkujs/pikku.git",
7
+ "directory": "packages/core"
8
+ },
4
9
  "description": "The Pikku runtime — functions, wirings, services, middleware and types",
5
10
  "author": "yasser.fadl@gmail.com",
6
11
  "license": "MIT",
@@ -13,7 +18,7 @@
13
18
  "test": "bash run-tests.sh",
14
19
  "test:watch": "bash run-tests.sh --watch",
15
20
  "test:coverage": "bash run-tests.sh --coverage",
16
- "prepublishOnly": "yarn build",
21
+ "prepublishOnly": "bun run build",
17
22
  "api-report": "tsx scripts/generate-api-report.mts"
18
23
  },
19
24
  "sideEffects": [
@@ -51,6 +56,7 @@
51
56
  "./mcp": "./dist/wirings/mcp/index.js",
52
57
  "./agent": "./dist/wirings/agent/index.js",
53
58
  "./agent-scorer": "./dist/wirings/agent-scorer/index.js",
59
+ "./analytics": "./dist/analytics/index.js",
54
60
  "./gateway": "./dist/wirings/gateway/index.js",
55
61
  "./cli": "./dist/wirings/cli/index.js",
56
62
  "./cli/command-parser": "./dist/wirings/cli/command-parser.js",
@@ -65,6 +71,7 @@
65
71
  "./oauth2": "./dist/wirings/oauth2/index.js",
66
72
  "./errors": "./dist/errors/index.js",
67
73
  "./services": "./dist/services/index.js",
74
+ "./flag": "./dist/wirings/flag/index.js",
68
75
  "./services/local-meta": "./dist/services/meta-service.js",
69
76
  "./services/v8-coverage": "./dist/services/v8-coverage-service.js",
70
77
  "./services/istanbul-coverage": "./dist/services/istanbul-coverage-service.js",
@@ -92,10 +99,9 @@
92
99
  "@ag-ui/core": "0.0.57",
93
100
  "@types/node": "^24.13.3",
94
101
  "esbuild": "~0.28.2",
95
- "tsx": "^4.23.12",
96
- "typescript": "^6.0.3"
102
+ "tsx": "^4.23.12"
97
103
  },
98
104
  "engines": {
99
105
  "node": ">=24"
100
106
  }
101
- }
107
+ }
package/run-tests.sh CHANGED
@@ -1,8 +1,5 @@
1
1
  #!/bin/bash
2
2
 
3
- script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
4
- cd "$script_dir"
5
-
6
3
  # Enable nullglob to handle cases where no files match the pattern
7
4
  shopt -s nullglob
8
5
 
@@ -43,18 +40,29 @@ if [ ${#files[@]} -eq 0 ]; then
43
40
  exit 0
44
41
  fi
45
42
 
46
- # Construct the node command
47
- node_cmd=(node --import tsx --test)
43
+ # Construct the bun command
44
+ #
45
+ # --parallel gives every test file its own worker process, which is what node's
46
+ # `--test` did. Several suites keep module-level caches (a TypeScript program, a
47
+ # temp fixture directory) that a shared process would leak between files.
48
+ #
49
+ # --timeout because bun caps a test at 5s by default where node had no cap, and
50
+ # the suites that build real TypeScript programs run well past that.
51
+ bun_cmd=(bun test --parallel --timeout 120000)
48
52
 
49
53
  # Append options based on flags
50
54
  if [ "$watch_mode" = true ]; then
51
- node_cmd+=(--watch)
55
+ # --watch reruns in one process; parallel workers have nothing to watch.
56
+ bun_cmd=(bun test --watch --timeout 120000)
52
57
  fi
53
58
 
54
59
  if [ "$coverage_mode" = true ]; then
55
- node_cmd+=(--test-coverage-include="src/**/*.{ts,js}" --test-coverage-exclude="**/dist/**" --experimental-test-coverage --test-reporter=lcov --test-reporter-destination=lcov.info)
60
+ # --coverage-dir=. keeps lcov.info at the package root: CI merges every
61
+ # package's report by prefixing its SF paths with the file's own directory,
62
+ # so a nested coverage/ directory would re-root them one level too deep.
63
+ bun_cmd+=(--coverage --coverage-reporter=lcov --coverage-reporter=text --coverage-dir=.)
56
64
  export PIKKU_TEST_COVERAGE=1
57
65
  fi
58
66
 
59
- # Execute the node command with the expanded list of files
60
- "${node_cmd[@]}" "${files[@]}"
67
+ # Execute the bun command with the expanded list of files
68
+ "${bun_cmd[@]}" "${files[@]}"
@@ -350,6 +350,7 @@
350
350
  "BadRequestError",
351
351
  "ConflictError",
352
352
  "ExpectationFailedError",
353
+ "FeatureUnavailableError",
353
354
  "ForbiddenError",
354
355
  "GatewayTimeoutError",
355
356
  "GoneError",
@@ -449,6 +450,19 @@
449
450
  "verifyActorSecret",
450
451
  "withoutSecrets"
451
452
  ],
453
+ "./flag": [
454
+ "CachedFlagSource",
455
+ "assertFeatureAvailable",
456
+ "bucketOf",
457
+ "compiledFallbackSnapshot",
458
+ "defineFeatureFlags",
459
+ "flattenFeatureFlagDefinitions",
460
+ "resolveFlag",
461
+ "resolveFlagForClient",
462
+ "resolveFlagsForClient",
463
+ "subjectIdOf",
464
+ "validateAndBuildFeatureFlagDefinitionsMeta"
465
+ ],
452
466
  "./services/local-meta": [
453
467
  "LocalMetaService"
454
468
  ],
@@ -549,5 +563,17 @@
549
563
  "pikkuDevReloader",
550
564
  "reconcileAddonRegistry",
551
565
  "reloadGeneratedMeta"
566
+ ],
567
+ "./analytics": [
568
+ "LoggerAnalyticsService",
569
+ "anonymousAnalyticsIdentity",
570
+ "composeAnalyticsIdentity",
571
+ "cookieAnalyticsIdentity",
572
+ "createInvocationAnalytics",
573
+ "defineAnalyticsEvents",
574
+ "fanOutAnalytics",
575
+ "flattenAnalyticsEvent",
576
+ "mintCookie",
577
+ "randomDigits"
552
578
  ]
553
579
  }
@@ -1,68 +0,0 @@
1
- import { describe, test } from 'node:test'
2
- import assert from 'node:assert/strict'
3
- import { readFileSync } from 'node:fs'
4
- import { fileURLToPath } from 'node:url'
5
- import { join, dirname } from 'node:path'
6
-
7
- const packageRoot = join(dirname(fileURLToPath(import.meta.url)), '..')
8
- const reportPath = join(packageRoot, 'api-report.md')
9
-
10
- /**
11
- * `AI` described the model provider, never the agent runtime, so #596 renamed
12
- * every agent symbol to `Agent`. The names below are the ones that survived,
13
- * because each really does wrap a provider call.
14
- *
15
- * Listing them here is what makes the rule checkable: anything else exported as
16
- * `AI*` is a symbol that slipped back to the old naming, and this fails rather
17
- * than letting it reach a consumer.
18
- */
19
- const PROVIDER_SYMBOLS = new Set([
20
- 'AIEmbeddingService',
21
- 'AIEmbedManyParams',
22
- 'AIEmbedManyResult',
23
- 'AIEmbedParams',
24
- 'AIEmbedResult',
25
- 'AIGenerateImageParams',
26
- 'AIGenerateImagePrompt',
27
- 'AIGenerateImageResult',
28
- 'AIGenerateSpeechParams',
29
- 'AIGenerateSpeechResult',
30
- 'AIProviderAuthError',
31
- 'AIProviderNotConfiguredError',
32
- 'AIProviderOptions',
33
- 'AIRerankParams',
34
- 'AIRerankResult',
35
- 'AITranscriptionParams',
36
- 'AITranscriptionResult',
37
- ])
38
-
39
- describe('the agent runtime is not exported under the AI name', () => {
40
- test('every AI* symbol in the public surface is a provider wrapper', () => {
41
- const report = readFileSync(reportPath, 'utf-8')
42
- const found = new Set(report.match(/\bAI[A-Z][A-Za-z]*/g) ?? [])
43
-
44
- const strays = [...found].filter((name) => !PROVIDER_SYMBOLS.has(name))
45
-
46
- assert.deepEqual(
47
- strays,
48
- [],
49
- 'these are exported as `AI*` but are not provider wrappers — rename them ' +
50
- 'to `Agent*`, or add them to PROVIDER_SYMBOLS if they genuinely wrap a ' +
51
- 'model provider call'
52
- )
53
- })
54
-
55
- test('the agent entry points are the renamed ones', () => {
56
- const { exports } = JSON.parse(
57
- readFileSync(join(packageRoot, 'package.json'), 'utf-8')
58
- )
59
-
60
- assert.ok(exports['./agent'], 'expected the ./agent entry point')
61
- assert.ok(
62
- exports['./agent-scorer'],
63
- 'expected the ./agent-scorer entry point'
64
- )
65
- assert.equal(exports['./ai-agent'], undefined)
66
- assert.equal(exports['./ai-scorer'], undefined)
67
- })
68
- })
@@ -1,138 +0,0 @@
1
- import { describe, test } from 'node:test'
2
- import assert from 'node:assert/strict'
3
- import { execFileSync } from 'node:child_process'
4
- import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
5
- import { tmpdir } from 'node:os'
6
- import { fileURLToPath } from 'node:url'
7
- import { join, dirname } from 'node:path'
8
-
9
- const packageRoot = join(dirname(fileURLToPath(import.meta.url)), '..')
10
- const reportPath = join(packageRoot, 'api-report.md')
11
-
12
- /**
13
- * `public-surface.json` pins the *names* a consumer can reach. That catches an
14
- * export appearing or vanishing and nothing else — adding a method to
15
- * `MetaService`, or making a field on `ChannelMeta` required, sails past it,
16
- * as does every type-only export. Those are the changes that break a
17
- * consumer's build, and the report's summary counts how many more of them
18
- * there are than there are names.
19
- *
20
- * So `api-report.md` records what each symbol *is*, and this fails when the
21
- * committed report and the code disagree.
22
- *
23
- * knowledge: decisions/internals/the-api-report-pins-members-not-just-names.md
24
- */
25
- describe('the API report matches the code', () => {
26
- test('regenerating produces no diff', () => {
27
- const committed = readFileSync(reportPath, 'utf-8')
28
-
29
- execFileSync(
30
- 'npx',
31
- ['tsx', join(packageRoot, 'scripts', 'generate-api-report.mts')],
32
- { cwd: packageRoot, stdio: 'pipe' }
33
- )
34
- const regenerated = readFileSync(reportPath, 'utf-8')
35
-
36
- if (committed !== regenerated) {
37
- // Restore, so a failing run does not leave the tree dirty.
38
- const committedLines = committed.split('\n')
39
- const regeneratedLines = regenerated.split('\n')
40
- const firstDiff = regeneratedLines.findIndex(
41
- (line, i) => line !== committedLines[i]
42
- )
43
- writeFileSync(reportPath, committed)
44
-
45
- assert.fail(
46
- 'the public API changed but api-report.md was not regenerated.\n' +
47
- `First difference at line ${firstDiff + 1}:\n` +
48
- ` committed: ${committedLines[firstDiff] ?? '(end of file)'}\n` +
49
- ` regenerated: ${regeneratedLines[firstDiff] ?? '(end of file)'}\n` +
50
- 'Run `yarn api-report` and review the diff — a member added to an ' +
51
- 'exported interface or class is a change consumers compile against.'
52
- )
53
- }
54
- })
55
-
56
- test('the report actually contains member-level detail', () => {
57
- // Guards the test above: a report of bare names would match itself forever
58
- // while pinning nothing that public-surface.json does not already pin.
59
- const report = readFileSync(reportPath, 'utf-8')
60
-
61
- assert.ok(
62
- /export interface MetaService \{[^}]*getHttpMeta/.test(report),
63
- 'expected MetaService to be reported with its members'
64
- )
65
- assert.ok(
66
- !/^\w+: any$/m.test(report),
67
- 'symbols reported as `any` mean re-export aliases are not being followed'
68
- )
69
- })
70
- })
71
-
72
- /**
73
- * Every branch that touches the public surface rewrites the whole report, so
74
- * two of them meeting is a ~9000-line conflict with no meaningful resolution
75
- * in it. A merge driver takes the conflict away; the test above is what still
76
- * insists on a report that matches the code.
77
- *
78
- * knowledge: decisions/internals/the-api-report-pins-members-not-just-names.md
79
- */
80
- describe('merging the API report is not hand work', () => {
81
- const repoRoot = join(packageRoot, '..', '..')
82
-
83
- test('.gitattributes routes the report through the driver', () => {
84
- const attributes = readFileSync(join(repoRoot, '.gitattributes'), 'utf-8')
85
-
86
- assert.match(
87
- attributes,
88
- /^packages\/core\/api-report\.md\s+merge=api-report\b/m,
89
- 'the report must name the merge driver, or git conflicts on it as usual'
90
- )
91
- })
92
-
93
- test('the setup script registers the driver as a plain take-one-side', () => {
94
- // Against a throwaway repository rather than this one: a driver is written
95
- // to `.git/config`, which every worktree of a checkout shares, so running
96
- // this in place would reach into whatever else is checked out beside it.
97
- const sandbox = mkdtempSync(join(tmpdir(), 'pikku-merge-driver-'))
98
- try {
99
- execFileSync('git', ['init', '--quiet', sandbox], { stdio: 'pipe' })
100
- execFileSync(
101
- 'node',
102
- [join(repoRoot, 'scripts', 'setup-merge-drivers.mjs')],
103
- { cwd: sandbox, stdio: 'pipe' }
104
- )
105
- const driver = execFileSync(
106
- 'git',
107
- ['config', '--local', 'merge.api-report.driver'],
108
- { cwd: sandbox, stdio: 'pipe' }
109
- )
110
- .toString()
111
- .trim()
112
-
113
- // `true` writes nothing and succeeds, which is how a driver tells git to
114
- // keep the side already in %A. Anything that regenerates the report is
115
- // the trap this pins shut: git runs a driver while merging that one
116
- // path, with the rest of the tree still unmerged, so the generator reads
117
- // the old sources and resolves to a report missing exactly the API the
118
- // incoming branch adds — conflict-free and wrong, which is worse than a
119
- // conflict. The regeneration belongs to the guard above, which runs
120
- // against a finished tree.
121
- assert.equal(
122
- driver,
123
- 'true',
124
- 'the driver must resolve to one side verbatim and run nothing'
125
- )
126
- } finally {
127
- rmSync(sandbox, { recursive: true, force: true })
128
- }
129
- })
130
-
131
- test('postinstall runs the setup, so a fresh clone is not left without it', () => {
132
- const manifest = JSON.parse(
133
- readFileSync(join(repoRoot, 'package.json'), 'utf-8')
134
- )
135
-
136
- assert.match(manifest.scripts.postinstall, /setup-merge-drivers\.mjs/)
137
- })
138
- })