@pikku/core 0.12.107 → 0.12.111

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 (588) hide show
  1. package/CHANGELOG.md +344 -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/errors/errors.d.ts +7 -0
  23. package/dist/errors/errors.js +17 -0
  24. package/dist/function/function-meta.types.d.ts +2 -0
  25. package/dist/function/function-runner.js +29 -0
  26. package/dist/function/functions.types.d.ts +22 -3
  27. package/dist/middleware/auth-apikey.d.ts +1 -1
  28. package/dist/pikku-state.d.ts +1 -1
  29. package/dist/scopes.d.ts +11 -0
  30. package/dist/scopes.js +17 -0
  31. package/dist/services/credential-wire-service.d.ts +1 -1
  32. package/dist/services/feature-flag-service.d.ts +100 -0
  33. package/dist/services/feature-flag-service.js +1 -0
  34. package/dist/services/index.d.ts +1 -0
  35. package/dist/services/meta-service.d.ts +16 -0
  36. package/dist/services/meta-service.js +19 -0
  37. package/dist/services/webhook-service.d.ts +7 -2
  38. package/dist/services/webhook-service.js +11 -6
  39. package/dist/testing/service-tests/agent-run-service-tests.d.ts +2 -2
  40. package/dist/testing/service-tests/agent-storage-service-tests.d.ts +1 -1
  41. package/dist/testing/service-tests/channel-store-tests.d.ts +1 -1
  42. package/dist/testing/service-tests/credential-service-tests.d.ts +1 -1
  43. package/dist/testing/service-tests/deployment-service-tests.d.ts +1 -1
  44. package/dist/testing/service-tests/event-hub-store-tests.d.ts +1 -1
  45. package/dist/testing/service-tests/secret-service-tests.d.ts +1 -1
  46. package/dist/testing/service-tests/session-store-tests.d.ts +1 -1
  47. package/dist/testing/service-tests/workflow-run-service-tests.d.ts +1 -1
  48. package/dist/testing/service-tests/workflow-service-tests.d.ts +1 -1
  49. package/dist/types/core.types.d.ts +23 -0
  50. package/dist/wirings/agent/agent-rpc.d.ts +1 -1
  51. package/dist/wirings/agent/agent-turn.d.ts +1 -1
  52. package/dist/wirings/agent-scorer/agent-scorer-live.d.ts +1 -1
  53. package/dist/wirings/channel/channel-common.d.ts +1 -1
  54. package/dist/wirings/channel/channel-rpc-validators.d.ts +2 -2
  55. package/dist/wirings/channel/channel-runner.d.ts +1 -1
  56. package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
  57. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
  58. package/dist/wirings/cli/channel/cli-approval.d.ts +2 -2
  59. package/dist/wirings/flag/assert-feature-available.d.ts +15 -0
  60. package/dist/wirings/flag/assert-feature-available.js +23 -0
  61. package/dist/wirings/flag/cached-flag-source.d.ts +73 -0
  62. package/dist/wirings/flag/cached-flag-source.js +96 -0
  63. package/dist/wirings/flag/define-feature-flags.d.ts +33 -0
  64. package/dist/wirings/flag/define-feature-flags.js +32 -0
  65. package/dist/wirings/flag/flag.types.d.ts +97 -0
  66. package/dist/wirings/flag/flag.types.js +1 -0
  67. package/dist/wirings/flag/index.d.ts +7 -0
  68. package/dist/wirings/flag/index.js +5 -0
  69. package/dist/wirings/flag/resolve-flag.d.ts +52 -0
  70. package/dist/wirings/flag/resolve-flag.js +90 -0
  71. package/dist/wirings/flag/validate-flag-definitions.d.ts +26 -0
  72. package/dist/wirings/flag/validate-flag-definitions.js +103 -0
  73. package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +8 -8
  74. package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +1 -1
  75. package/dist/wirings/workflow/workflow-queue-routing.d.ts +1 -1
  76. package/package.json +11 -5
  77. package/run-tests.sh +17 -9
  78. package/src/public-surface.json +26 -0
  79. package/src/agent-naming.test.ts +0 -68
  80. package/src/api-report.test.ts +0 -138
  81. package/src/app-alias-surface.test.ts +0 -179
  82. package/src/app-leaf-surface.test.ts +0 -222
  83. package/src/bootstrap-compat/root.ts +0 -20
  84. package/src/classification/column-form.test.ts +0 -97
  85. package/src/classification/column-form.ts +0 -55
  86. package/src/classification/data-classification.ts +0 -73
  87. package/src/classification/index.ts +0 -40
  88. package/src/classification/key-ids.ts +0 -2
  89. package/src/classification/secret-value.test.ts +0 -204
  90. package/src/classification/secret-value.ts +0 -106
  91. package/src/crypto-utils.test.ts +0 -668
  92. package/src/crypto-utils.ts +0 -460
  93. package/src/dev/hot-reload.test.ts +0 -587
  94. package/src/dev/hot-reload.ts +0 -225
  95. package/src/dev/module-runner.test.ts +0 -235
  96. package/src/dev/module-runner.ts +0 -138
  97. package/src/dev/reload-meta.test.ts +0 -183
  98. package/src/dev/reload-meta.ts +0 -144
  99. package/src/ecosystem-tier-removed.test.ts +0 -72
  100. package/src/env.ts +0 -1
  101. package/src/errors/error-handler.ts +0 -77
  102. package/src/errors/error.test.ts +0 -229
  103. package/src/errors/errors.ts +0 -393
  104. package/src/errors/index.ts +0 -11
  105. package/src/errors/serialized-error.ts +0 -12
  106. package/src/factory-functions.test.ts +0 -111
  107. package/src/function/abort-scope.test.ts +0 -97
  108. package/src/function/abort-scope.ts +0 -80
  109. package/src/function/function-meta.types.ts +0 -151
  110. package/src/function/function-runner.test.ts +0 -1619
  111. package/src/function/function-runner.ts +0 -499
  112. package/src/function/functions.types.ts +0 -319
  113. package/src/function/index.ts +0 -40
  114. package/src/function/list.types.test.ts +0 -100
  115. package/src/function/list.types.ts +0 -69
  116. package/src/function/pikku-request.test.ts +0 -35
  117. package/src/function/pikku-request.ts +0 -17
  118. package/src/gopass-secrets-removed.test.ts +0 -51
  119. package/src/handle-error.test.ts +0 -532
  120. package/src/handle-error.ts +0 -64
  121. package/src/middleware/auth-apikey.test.ts +0 -362
  122. package/src/middleware/auth-apikey.ts +0 -39
  123. package/src/middleware/auth-bearer.test.ts +0 -566
  124. package/src/middleware/auth-bearer.ts +0 -83
  125. package/src/middleware/auth-cookie.test.ts +0 -572
  126. package/src/middleware/auth-cookie.ts +0 -107
  127. package/src/middleware/cors.test.ts +0 -579
  128. package/src/middleware/cors.ts +0 -103
  129. package/src/middleware/index.ts +0 -30
  130. package/src/middleware/middleware-factories.ts +0 -76
  131. package/src/middleware/middleware.types.ts +0 -61
  132. package/src/middleware/remote-auth.test.ts +0 -547
  133. package/src/middleware/remote-auth.ts +0 -95
  134. package/src/middleware/remote-jobs-secret.ts +0 -35
  135. package/src/middleware/require-origin.test.ts +0 -115
  136. package/src/middleware/require-origin.ts +0 -79
  137. package/src/middleware/telemetry.ts +0 -83
  138. package/src/middleware-runner.test.ts +0 -578
  139. package/src/middleware-runner.ts +0 -232
  140. package/src/no-any-casts.test.ts +0 -57
  141. package/src/no-root-barrel.test.ts +0 -122
  142. package/src/permissions.test.ts +0 -256
  143. package/src/permissions.ts +0 -217
  144. package/src/pikku-state.test.ts +0 -198
  145. package/src/pikku-state.ts +0 -206
  146. package/src/production-barrels-stay-lean.test.ts +0 -110
  147. package/src/public-surface.test.ts +0 -133
  148. package/src/remote.test.ts +0 -173
  149. package/src/remote.ts +0 -56
  150. package/src/removed-legacy-exports.test.ts +0 -66
  151. package/src/run-tests-script.test.ts +0 -67
  152. package/src/schema.test.ts +0 -430
  153. package/src/schema.ts +0 -204
  154. package/src/scopes.test.ts +0 -203
  155. package/src/scopes.ts +0 -67
  156. package/src/services/agent-run-state-service.ts +0 -37
  157. package/src/services/agent-runner-service.ts +0 -238
  158. package/src/services/agent-storage-service.ts +0 -39
  159. package/src/services/ai-embedding-service.ts +0 -9
  160. package/src/services/audit-service.test.ts +0 -44
  161. package/src/services/audit-service.ts +0 -280
  162. package/src/services/content-service.ts +0 -65
  163. package/src/services/credential-service.ts +0 -20
  164. package/src/services/credential-wire-service.test.ts +0 -235
  165. package/src/services/credential-wire-service.ts +0 -120
  166. package/src/services/deployment-service.ts +0 -32
  167. package/src/services/email-service.test.ts +0 -100
  168. package/src/services/email-service.ts +0 -60
  169. package/src/services/email-template.test.ts +0 -311
  170. package/src/services/email-template.ts +0 -254
  171. package/src/services/file-scenario-run-store.test.ts +0 -349
  172. package/src/services/file-scenario-run-store.ts +0 -282
  173. package/src/services/gateway-service.ts +0 -5
  174. package/src/services/http-personas-converse.test.ts +0 -274
  175. package/src/services/http-personas.test.ts +0 -379
  176. package/src/services/http-personas.ts +0 -508
  177. package/src/services/in-memory-agent-run-state-service.ts +0 -87
  178. package/src/services/in-memory-queue-service.test.ts +0 -162
  179. package/src/services/in-memory-queue-service.ts +0 -78
  180. package/src/services/in-memory-session-store.test.ts +0 -58
  181. package/src/services/in-memory-session-store.ts +0 -20
  182. package/src/services/in-memory-trigger-service.ts +0 -47
  183. package/src/services/in-memory-workflow-service.test.ts +0 -430
  184. package/src/services/in-memory-workflow-service.ts +0 -595
  185. package/src/services/index.ts +0 -192
  186. package/src/services/istanbul-coverage-service.test.ts +0 -66
  187. package/src/services/istanbul-coverage-service.ts +0 -59
  188. package/src/services/jwt-service.ts +0 -15
  189. package/src/services/local-content-request-handler.test.ts +0 -240
  190. package/src/services/local-content-request-handler.ts +0 -295
  191. package/src/services/local-content.test.ts +0 -186
  192. package/src/services/local-content.ts +0 -242
  193. package/src/services/local-credential-service.ts +0 -63
  194. package/src/services/local-email-service.test.ts +0 -182
  195. package/src/services/local-email-service.ts +0 -43
  196. package/src/services/local-gateway-service.ts +0 -51
  197. package/src/services/local-secrets.test.ts +0 -95
  198. package/src/services/local-secrets.ts +0 -71
  199. package/src/services/local-variables.test.ts +0 -61
  200. package/src/services/local-variables.ts +0 -45
  201. package/src/services/logger-console.test.ts +0 -117
  202. package/src/services/logger-console.ts +0 -174
  203. package/src/services/logger.ts +0 -48
  204. package/src/services/meta-service.test.ts +0 -75
  205. package/src/services/meta-service.ts +0 -767
  206. package/src/services/persona-actor-secret.test.ts +0 -68
  207. package/src/services/persona-actor-secret.ts +0 -70
  208. package/src/services/persona-sign-in.test.ts +0 -219
  209. package/src/services/persona-sign-in.ts +0 -238
  210. package/src/services/personas-service.ts +0 -191
  211. package/src/services/pikku-user-id.test.ts +0 -62
  212. package/src/services/pikku-user-id.ts +0 -13
  213. package/src/services/queue-webhook-service.test.ts +0 -409
  214. package/src/services/queue-webhook-service.ts +0 -150
  215. package/src/services/remote-jobs.test.ts +0 -106
  216. package/src/services/remote-jobs.ts +0 -92
  217. package/src/services/scheduler-service.ts +0 -37
  218. package/src/services/schema-service.ts +0 -10
  219. package/src/services/scope-service.ts +0 -91
  220. package/src/services/scoped-credential-service.test.ts +0 -86
  221. package/src/services/scoped-credential-service.ts +0 -63
  222. package/src/services/scoped-secret-service.test.ts +0 -93
  223. package/src/services/scoped-secret-service.ts +0 -40
  224. package/src/services/secret-host-binding.test.ts +0 -138
  225. package/src/services/secret-host-binding.ts +0 -51
  226. package/src/services/secret-service.ts +0 -25
  227. package/src/services/secretless.test.ts +0 -54
  228. package/src/services/secretless.ts +0 -29
  229. package/src/services/session-store.ts +0 -9
  230. package/src/services/stub-tracker.test.ts +0 -104
  231. package/src/services/stub-tracker.ts +0 -175
  232. package/src/services/system-role-guard.test.ts +0 -96
  233. package/src/services/system-role-guard.ts +0 -71
  234. package/src/services/temporary-file-service.ts +0 -76
  235. package/src/services/trigger-service.ts +0 -5
  236. package/src/services/typed-credential-service.ts +0 -83
  237. package/src/services/typed-secret-service.test.ts +0 -204
  238. package/src/services/typed-secret-service.ts +0 -132
  239. package/src/services/typed-variables-service.test.ts +0 -166
  240. package/src/services/typed-variables-service.ts +0 -166
  241. package/src/services/user-session-service.test.ts +0 -147
  242. package/src/services/user-session-service.ts +0 -85
  243. package/src/services/v8-coverage-service.test.ts +0 -69
  244. package/src/services/v8-coverage-service.ts +0 -163
  245. package/src/services/variables-service.ts +0 -13
  246. package/src/services/webhook-service.ts +0 -147
  247. package/src/services/workflow-service.ts +0 -120
  248. package/src/side-effects-are-declared.test.ts +0 -84
  249. package/src/source-files-stay-composable.test.ts +0 -41
  250. package/src/template-alias-surface.test.ts +0 -240
  251. package/src/test-utils.ts +0 -38
  252. package/src/testing/index.ts +0 -3
  253. package/src/testing/service-tests/agent-run-service-tests.ts +0 -98
  254. package/src/testing/service-tests/agent-storage-service-tests.ts +0 -379
  255. package/src/testing/service-tests/channel-store-tests.ts +0 -98
  256. package/src/testing/service-tests/credential-service-tests.ts +0 -143
  257. package/src/testing/service-tests/deployment-service-tests.ts +0 -33
  258. package/src/testing/service-tests/event-hub-store-tests.ts +0 -48
  259. package/src/testing/service-tests/secret-service-tests.ts +0 -105
  260. package/src/testing/service-tests/session-store-tests.ts +0 -62
  261. package/src/testing/service-tests/workflow-run-service-tests.ts +0 -59
  262. package/src/testing/service-tests/workflow-service-tests.ts +0 -308
  263. package/src/testing/service-tests.ts +0 -95
  264. package/src/time-utils.test.ts +0 -56
  265. package/src/time-utils.ts +0 -89
  266. package/src/types/core.types.ts +0 -446
  267. package/src/types/index.ts +0 -25
  268. package/src/types/state.types.ts +0 -226
  269. package/src/types/typed-credentials.test.ts +0 -72
  270. package/src/utils/hash.test.ts +0 -68
  271. package/src/utils/hash.ts +0 -26
  272. package/src/utils/hmac.ts +0 -21
  273. package/src/utils/node-host-resolver.ts +0 -20
  274. package/src/utils/safe-fetch.test.ts +0 -515
  275. package/src/utils/safe-fetch.ts +0 -347
  276. package/src/utils.test.ts +0 -359
  277. package/src/utils.ts +0 -165
  278. package/src/version.test.ts +0 -80
  279. package/src/version.ts +0 -25
  280. package/src/wirings/actor-flow/actor-flow.types.ts +0 -40
  281. package/src/wirings/actor-flow/index.ts +0 -10
  282. package/src/wirings/actor-flow/run-conversation.test.ts +0 -187
  283. package/src/wirings/actor-flow/run-conversation.ts +0 -280
  284. package/src/wirings/addon/addon-auth-tags.test.ts +0 -219
  285. package/src/wirings/addon/addon-runner.ts +0 -236
  286. package/src/wirings/addon/addon-scopes.test.ts +0 -225
  287. package/src/wirings/addon/addon-secrets.test.ts +0 -391
  288. package/src/wirings/addon/index.ts +0 -12
  289. package/src/wirings/addon/remote-addon-auth.ts +0 -65
  290. package/src/wirings/addon/wire-addon.test.ts +0 -102
  291. package/src/wirings/addon/wire-addon.ts +0 -202
  292. package/src/wirings/addon/wire-remote-addon.ts +0 -41
  293. package/src/wirings/agent/agent-agui.test.ts +0 -1213
  294. package/src/wirings/agent/agent-agui.ts +0 -405
  295. package/src/wirings/agent/agent-authorization.test.ts +0 -208
  296. package/src/wirings/agent/agent-finalize.test.ts +0 -187
  297. package/src/wirings/agent/agent-finalize.ts +0 -197
  298. package/src/wirings/agent/agent-helpers.test.ts +0 -215
  299. package/src/wirings/agent/agent-helpers.ts +0 -96
  300. package/src/wirings/agent/agent-interrupt.test.ts +0 -833
  301. package/src/wirings/agent/agent-interrupt.ts +0 -400
  302. package/src/wirings/agent/agent-memory.test.ts +0 -397
  303. package/src/wirings/agent/agent-memory.ts +0 -496
  304. package/src/wirings/agent/agent-middleware.types.test.ts +0 -41
  305. package/src/wirings/agent/agent-model-config.test.ts +0 -103
  306. package/src/wirings/agent/agent-model-config.ts +0 -59
  307. package/src/wirings/agent/agent-prepare.test.ts +0 -977
  308. package/src/wirings/agent/agent-prepare.ts +0 -1083
  309. package/src/wirings/agent/agent-registry.test.ts +0 -455
  310. package/src/wirings/agent/agent-registry.ts +0 -99
  311. package/src/wirings/agent/agent-resume-authorization.test.ts +0 -206
  312. package/src/wirings/agent/agent-rpc.ts +0 -116
  313. package/src/wirings/agent/agent-runner.test.ts +0 -1229
  314. package/src/wirings/agent/agent-runner.ts +0 -858
  315. package/src/wirings/agent/agent-stream-delegate.test.ts +0 -381
  316. package/src/wirings/agent/agent-stream-output-hooks.test.ts +0 -353
  317. package/src/wirings/agent/agent-stream.test.ts +0 -1800
  318. package/src/wirings/agent/agent-stream.ts +0 -1639
  319. package/src/wirings/agent/agent-thread-ownership.test.ts +0 -297
  320. package/src/wirings/agent/agent-turn.test.ts +0 -65
  321. package/src/wirings/agent/agent-turn.ts +0 -122
  322. package/src/wirings/agent/agent-utils.ts +0 -20
  323. package/src/wirings/agent/agent.types.ts +0 -676
  324. package/src/wirings/agent/index.ts +0 -58
  325. package/src/wirings/agent/voice-input.test.ts +0 -220
  326. package/src/wirings/agent/voice-input.ts +0 -180
  327. package/src/wirings/agent/voice-output.test.ts +0 -510
  328. package/src/wirings/agent/voice-output.ts +0 -311
  329. package/src/wirings/agent-scorer/agent-scorer-grade.test.ts +0 -106
  330. package/src/wirings/agent-scorer/agent-scorer-grade.ts +0 -55
  331. package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +0 -285
  332. package/src/wirings/agent-scorer/agent-scorer-judge.ts +0 -180
  333. package/src/wirings/agent-scorer/agent-scorer-live.test.ts +0 -174
  334. package/src/wirings/agent-scorer/agent-scorer-live.ts +0 -56
  335. package/src/wirings/agent-scorer/agent-scorer-registry.ts +0 -66
  336. package/src/wirings/agent-scorer/agent-scorer-sampling.test.ts +0 -34
  337. package/src/wirings/agent-scorer/agent-scorer-sampling.ts +0 -36
  338. package/src/wirings/agent-scorer/agent-scorer-snapshots.test.ts +0 -49
  339. package/src/wirings/agent-scorer/agent-scorer-snapshots.ts +0 -46
  340. package/src/wirings/agent-scorer/agent-scorer-worker.test.ts +0 -122
  341. package/src/wirings/agent-scorer/agent-scorer-worker.ts +0 -71
  342. package/src/wirings/agent-scorer/agent-scorer.ts +0 -102
  343. package/src/wirings/agent-scorer/agent-scorer.types.ts +0 -128
  344. package/src/wirings/agent-scorer/index.ts +0 -23
  345. package/src/wirings/channel/channel-common.ts +0 -102
  346. package/src/wirings/channel/channel-handler-shapes.test.ts +0 -72
  347. package/src/wirings/channel/channel-handler.test.ts +0 -322
  348. package/src/wirings/channel/channel-handler.ts +0 -259
  349. package/src/wirings/channel/channel-host-rpc.test.ts +0 -150
  350. package/src/wirings/channel/channel-host-rpc.ts +0 -69
  351. package/src/wirings/channel/channel-middleware-runner.test.ts +0 -188
  352. package/src/wirings/channel/channel-middleware-runner.ts +0 -126
  353. package/src/wirings/channel/channel-rpc-registry.ts +0 -116
  354. package/src/wirings/channel/channel-rpc-responder.ts +0 -117
  355. package/src/wirings/channel/channel-rpc-service.ts +0 -132
  356. package/src/wirings/channel/channel-rpc-validators.ts +0 -65
  357. package/src/wirings/channel/channel-rpc.test.ts +0 -841
  358. package/src/wirings/channel/channel-rpc.ts +0 -5
  359. package/src/wirings/channel/channel-rpc.types.ts +0 -160
  360. package/src/wirings/channel/channel-runner.ts +0 -164
  361. package/src/wirings/channel/channel-store.ts +0 -35
  362. package/src/wirings/channel/channel.types.ts +0 -193
  363. package/src/wirings/channel/define-channel-routes.ts +0 -5
  364. package/src/wirings/channel/eventhub-service.ts +0 -16
  365. package/src/wirings/channel/eventhub-store.ts +0 -13
  366. package/src/wirings/channel/index.ts +0 -40
  367. package/src/wirings/channel/local/index.ts +0 -3
  368. package/src/wirings/channel/local/local-channel-handler.ts +0 -98
  369. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -339
  370. package/src/wirings/channel/local/local-channel-runner.ts +0 -271
  371. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -77
  372. package/src/wirings/channel/local/local-eventhub-service.ts +0 -69
  373. package/src/wirings/channel/log-channels.ts +0 -16
  374. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -135
  375. package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -60
  376. package/src/wirings/channel/serverless/index.ts +0 -6
  377. package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -328
  378. package/src/wirings/cli/channel/cli-approval.test.ts +0 -177
  379. package/src/wirings/cli/channel/cli-approval.ts +0 -135
  380. package/src/wirings/cli/channel/cli-channel-runner.ts +0 -118
  381. package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +0 -192
  382. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +0 -148
  383. package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +0 -480
  384. package/src/wirings/cli/channel/cli-raw-client-runner.ts +0 -188
  385. package/src/wirings/cli/channel/index.ts +0 -6
  386. package/src/wirings/cli/cli-runner.test.ts +0 -969
  387. package/src/wirings/cli/cli-runner.ts +0 -538
  388. package/src/wirings/cli/cli.types.ts +0 -388
  389. package/src/wirings/cli/command-parser.test.ts +0 -1120
  390. package/src/wirings/cli/command-parser.ts +0 -713
  391. package/src/wirings/cli/define-cli-commands.ts +0 -13
  392. package/src/wirings/cli/format-cli-error.test.ts +0 -91
  393. package/src/wirings/cli/format-cli-error.ts +0 -96
  394. package/src/wirings/cli/index.ts +0 -19
  395. package/src/wirings/credential/credential.types.ts +0 -37
  396. package/src/wirings/credential/define-credential.ts +0 -49
  397. package/src/wirings/credential/index.ts +0 -7
  398. package/src/wirings/credential/validate-credential-definitions.ts +0 -63
  399. package/src/wirings/gateway/gateway-authorization.test.ts +0 -575
  400. package/src/wirings/gateway/gateway-channel-meta.test.ts +0 -44
  401. package/src/wirings/gateway/gateway-runner.test.ts +0 -581
  402. package/src/wirings/gateway/gateway-runner.ts +0 -411
  403. package/src/wirings/gateway/gateway.types.ts +0 -137
  404. package/src/wirings/gateway/index.ts +0 -15
  405. package/src/wirings/http/http-routes.test.ts +0 -318
  406. package/src/wirings/http/http-routes.ts +0 -111
  407. package/src/wirings/http/http-runner-addon-ref.test.ts +0 -238
  408. package/src/wirings/http/http-runner.test.ts +0 -503
  409. package/src/wirings/http/http-runner.ts +0 -462
  410. package/src/wirings/http/http.types.ts +0 -307
  411. package/src/wirings/http/index.ts +0 -27
  412. package/src/wirings/http/log-http-routes.ts +0 -18
  413. package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -318
  414. package/src/wirings/http/pikku-fetch-http-request.ts +0 -260
  415. package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -123
  416. package/src/wirings/http/pikku-fetch-http-response.ts +0 -149
  417. package/src/wirings/http/routers/http-router.ts +0 -13
  418. package/src/wirings/http/routers/path-to-regex.test.ts +0 -306
  419. package/src/wirings/http/routers/path-to-regex.ts +0 -115
  420. package/src/wirings/http/web-request.test.ts +0 -382
  421. package/src/wirings/http/web-request.ts +0 -162
  422. package/src/wirings/mcp/index.ts +0 -26
  423. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -388
  424. package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
  425. package/src/wirings/mcp/mcp-runner.test.ts +0 -588
  426. package/src/wirings/mcp/mcp-runner.ts +0 -330
  427. package/src/wirings/mcp/mcp.types.ts +0 -199
  428. package/src/wirings/node/index.ts +0 -2
  429. package/src/wirings/node/node.types.ts +0 -23
  430. package/src/wirings/oauth2/index.ts +0 -1
  431. package/src/wirings/oauth2/oauth2.types.ts +0 -12
  432. package/src/wirings/persona/define-personas.ts +0 -33
  433. package/src/wirings/persona/index.ts +0 -75
  434. package/src/wirings/persona/persona-app-scopes.test.ts +0 -47
  435. package/src/wirings/persona/persona-app-scopes.ts +0 -74
  436. package/src/wirings/persona/persona-email.ts +0 -87
  437. package/src/wirings/persona/persona-environments.test.ts +0 -194
  438. package/src/wirings/persona/persona-environments.ts +0 -138
  439. package/src/wirings/persona/persona-mailbox.ts +0 -156
  440. package/src/wirings/persona/persona.test.ts +0 -230
  441. package/src/wirings/persona/persona.types.ts +0 -156
  442. package/src/wirings/persona/validate-personas.ts +0 -137
  443. package/src/wirings/queue/index.ts +0 -29
  444. package/src/wirings/queue/queue-identity.test.ts +0 -454
  445. package/src/wirings/queue/queue-identity.ts +0 -176
  446. package/src/wirings/queue/queue-runner.test.ts +0 -705
  447. package/src/wirings/queue/queue-runner.ts +0 -181
  448. package/src/wirings/queue/queue.types.ts +0 -161
  449. package/src/wirings/queue/register-queue-helper.ts +0 -46
  450. package/src/wirings/queue/signed-queue-service.ts +0 -60
  451. package/src/wirings/queue/validate-worker-config.test.ts +0 -108
  452. package/src/wirings/queue/validate-worker-config.ts +0 -90
  453. package/src/wirings/role/define-system-role.ts +0 -33
  454. package/src/wirings/role/index.ts +0 -13
  455. package/src/wirings/role/role.test.ts +0 -104
  456. package/src/wirings/role/role.types.ts +0 -47
  457. package/src/wirings/role/validate-role-definitions.ts +0 -93
  458. package/src/wirings/rpc/index.ts +0 -8
  459. package/src/wirings/rpc/rpc-runner.test.ts +0 -1130
  460. package/src/wirings/rpc/rpc-runner.ts +0 -569
  461. package/src/wirings/rpc/rpc-types.ts +0 -87
  462. package/src/wirings/scheduler/index.ts +0 -11
  463. package/src/wirings/scheduler/log-schedulers.ts +0 -16
  464. package/src/wirings/scheduler/scheduler-runner.test.ts +0 -835
  465. package/src/wirings/scheduler/scheduler-runner.ts +0 -138
  466. package/src/wirings/scheduler/scheduler.types.ts +0 -42
  467. package/src/wirings/scope/define-scope.ts +0 -33
  468. package/src/wirings/scope/index.ts +0 -15
  469. package/src/wirings/scope/scope.test.ts +0 -159
  470. package/src/wirings/scope/scope.types.ts +0 -42
  471. package/src/wirings/scope/validate-scope-definitions.ts +0 -107
  472. package/src/wirings/secret/index.ts +0 -9
  473. package/src/wirings/secret/secret.types.ts +0 -70
  474. package/src/wirings/secret/validate-secret-definitions.test.ts +0 -232
  475. package/src/wirings/secret/validate-secret-definitions.ts +0 -88
  476. package/src/wirings/trigger/index.ts +0 -9
  477. package/src/wirings/trigger/pikku-trigger-service.ts +0 -107
  478. package/src/wirings/trigger/trigger-runner.test.ts +0 -78
  479. package/src/wirings/trigger/trigger-runner.ts +0 -113
  480. package/src/wirings/trigger/trigger.types.ts +0 -100
  481. package/src/wirings/variable/index.ts +0 -8
  482. package/src/wirings/variable/validate-variable-definitions.test.ts +0 -115
  483. package/src/wirings/variable/validate-variable-definitions.ts +0 -71
  484. package/src/wirings/variable/variable.types.ts +0 -40
  485. package/src/wirings/virtual-user/index.ts +0 -107
  486. package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +0 -115
  487. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +0 -95
  488. package/src/wirings/virtual-user/run-virtual-user.test.ts +0 -774
  489. package/src/wirings/virtual-user/run-virtual-user.ts +0 -684
  490. package/src/wirings/virtual-user/virtual-user-agents.test.ts +0 -72
  491. package/src/wirings/virtual-user/virtual-user-agents.ts +0 -62
  492. package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +0 -215
  493. package/src/wirings/virtual-user/virtual-user-catalogue.ts +0 -184
  494. package/src/wirings/virtual-user/virtual-user-derive.test.ts +0 -426
  495. package/src/wirings/virtual-user/virtual-user-derive.ts +0 -161
  496. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +0 -68
  497. package/src/wirings/virtual-user/virtual-user-dispositions.ts +0 -210
  498. package/src/wirings/virtual-user/virtual-user-intents.test.ts +0 -218
  499. package/src/wirings/virtual-user/virtual-user-intents.ts +0 -185
  500. package/src/wirings/virtual-user/virtual-user-rng.test.ts +0 -72
  501. package/src/wirings/virtual-user/virtual-user-rng.ts +0 -50
  502. package/src/wirings/virtual-user/virtual-user-run-store.ts +0 -131
  503. package/src/wirings/virtual-user/virtual-user-scaffold.test.ts +0 -854
  504. package/src/wirings/virtual-user/virtual-user-scaffold.ts +0 -664
  505. package/src/wirings/virtual-user/virtual-user-schedule-store.ts +0 -93
  506. package/src/wirings/virtual-user/virtual-user-schedule.test.ts +0 -280
  507. package/src/wirings/virtual-user/virtual-user-schedule.ts +0 -156
  508. package/src/wirings/virtual-user/virtual-user-target.ts +0 -47
  509. package/src/wirings/virtual-user/virtual-user.types.ts +0 -215
  510. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -709
  511. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -25
  512. package/src/wirings/workflow/feature.test.ts +0 -131
  513. package/src/wirings/workflow/feature.ts +0 -59
  514. package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +0 -569
  515. package/src/wirings/workflow/graph/graph-foreach.test.ts +0 -626
  516. package/src/wirings/workflow/graph/graph-node.ts +0 -115
  517. package/src/wirings/workflow/graph/graph-runner.test.ts +0 -1049
  518. package/src/wirings/workflow/graph/graph-runner.ts +0 -1376
  519. package/src/wirings/workflow/graph/graph-validation.test.ts +0 -27
  520. package/src/wirings/workflow/graph/graph-validation.ts +0 -41
  521. package/src/wirings/workflow/graph/template.test.ts +0 -49
  522. package/src/wirings/workflow/graph/template.ts +0 -42
  523. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -39
  524. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -75
  525. package/src/wirings/workflow/index.ts +0 -107
  526. package/src/wirings/workflow/pikku-scenario-service.ts +0 -1013
  527. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -963
  528. package/src/wirings/workflow/pikku-workflow-service.ts +0 -1993
  529. package/src/wirings/workflow/run-timeline.test.ts +0 -199
  530. package/src/wirings/workflow/run-timeline.ts +0 -185
  531. package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -107
  532. package/src/wirings/workflow/scenario-cookie-jar.ts +0 -57
  533. package/src/wirings/workflow/scenario-expectations.test.ts +0 -238
  534. package/src/wirings/workflow/scenario-hooks.test.ts +0 -259
  535. package/src/wirings/workflow/scenario-poll.test.ts +0 -64
  536. package/src/wirings/workflow/scenario-poll.ts +0 -27
  537. package/src/wirings/workflow/scenario-prose.test.ts +0 -275
  538. package/src/wirings/workflow/scenario-prose.ts +0 -86
  539. package/src/wirings/workflow/scenario-run.types.ts +0 -193
  540. package/src/wirings/workflow/scenario-service.test.ts +0 -147
  541. package/src/wirings/workflow/scenario-step-guards.ts +0 -23
  542. package/src/wirings/workflow/scenario-step.test.ts +0 -800
  543. package/src/wirings/workflow/scenario-step.types.ts +0 -262
  544. package/src/wirings/workflow/scenario-surface.test.ts +0 -146
  545. package/src/wirings/workflow/scenario-surface.ts +0 -71
  546. package/src/wirings/workflow/scenario.types.ts +0 -63
  547. package/src/wirings/workflow/workflow-approval-audit.ts +0 -47
  548. package/src/wirings/workflow/workflow-approval-policy.test.ts +0 -594
  549. package/src/wirings/workflow/workflow-approval-policy.ts +0 -68
  550. package/src/wirings/workflow/workflow-approval.ts +0 -290
  551. package/src/wirings/workflow/workflow-child-run-session.test.ts +0 -168
  552. package/src/wirings/workflow/workflow-constants.ts +0 -66
  553. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +0 -116
  554. package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -55
  555. package/src/wirings/workflow/workflow-dispatch-relay.test.ts +0 -128
  556. package/src/wirings/workflow/workflow-errors.ts +0 -132
  557. package/src/wirings/workflow/workflow-inline-authority.test.ts +0 -175
  558. package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -51
  559. package/src/wirings/workflow/workflow-invocation-id.ts +0 -28
  560. package/src/wirings/workflow/workflow-meta-resolver.ts +0 -45
  561. package/src/wirings/workflow/workflow-mirror.test.ts +0 -171
  562. package/src/wirings/workflow/workflow-missing-meta.test.ts +0 -92
  563. package/src/wirings/workflow/workflow-on-error.test.ts +0 -145
  564. package/src/wirings/workflow/workflow-queue-routing.ts +0 -129
  565. package/src/wirings/workflow/workflow-queue-wiring.ts +0 -149
  566. package/src/wirings/workflow/workflow-queue-workers.test.ts +0 -131
  567. package/src/wirings/workflow/workflow-queue-workers.ts +0 -66
  568. package/src/wirings/workflow/workflow-recovery.ts +0 -192
  569. package/src/wirings/workflow/workflow-replay-snapshot.test.ts +0 -140
  570. package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -113
  571. package/src/wirings/workflow/workflow-run-authority.test.ts +0 -212
  572. package/src/wirings/workflow/workflow-run-context.test.ts +0 -172
  573. package/src/wirings/workflow/workflow-run-engine.types.ts +0 -92
  574. package/src/wirings/workflow/workflow-run-ownership.ts +0 -37
  575. package/src/wirings/workflow/workflow-run-polling.test.ts +0 -127
  576. package/src/wirings/workflow/workflow-stalled-recovery.test.ts +0 -152
  577. package/src/wirings/workflow/workflow-status-stream.test.ts +0 -354
  578. package/src/wirings/workflow/workflow-status-stream.ts +0 -144
  579. package/src/wirings/workflow/workflow-step-claim.ts +0 -46
  580. package/src/wirings/workflow/workflow-step-ordinal.test.ts +0 -94
  581. package/src/wirings/workflow/workflow-step-session.test.ts +0 -87
  582. package/src/wirings/workflow/workflow-suspend.ts +0 -61
  583. package/src/wirings/workflow/workflow-terminal-run-guard.test.ts +0 -105
  584. package/src/wirings/workflow/workflow.types.ts +0 -268
  585. package/src/wirings-stay-decoupled.test.ts +0 -130
  586. package/tsconfig.json +0 -14
  587. package/tsconfig.tsbuildinfo +0 -1
  588. package/tsconfig.type-tests.json +0 -15
@@ -0,0 +1,96 @@
1
+ import { compiledFallbackSnapshot } from './validate-flag-definitions.js';
2
+ const DEFAULT_TTL_MS = 30_000;
3
+ /**
4
+ * The caching every flag source needs, so no adapter has to get it right twice.
5
+ *
6
+ * Three layers, in descending order of truth: a fresh read, the last good read,
7
+ * and the compiled declaration. The middle layer is the one that matters —
8
+ * dropping straight to the compiled fallback on a blip would switch on every
9
+ * flag an operator had deliberately left off, which is the opposite of what a
10
+ * dark launch is for. The compiled fallback is reached only on a cold start
11
+ * that has never managed a read, where there is nothing better to say.
12
+ *
13
+ * Refresh is pull-on-demand rather than a background poller on purpose. A
14
+ * poller assumes a long-lived process; an isolate on a serverless runtime is
15
+ * neither long-lived nor allowed to hold a timer between requests, so a vendor
16
+ * SDK built around one either never refreshes or leaks. Fetching inside the
17
+ * request that noticed the snapshot was stale works in both places.
18
+ */
19
+ export class CachedFlagSource {
20
+ cached;
21
+ cachedAt = 0;
22
+ inflight;
23
+ /**
24
+ * Bumped by every `invalidate()`. A read that started before the signal
25
+ * arrived carries the generation it started in, and stores nothing if that
26
+ * generation is no longer current — otherwise a webhook that landed
27
+ * mid-fetch would be answered by the pre-webhook snapshot, stamped fresh,
28
+ * and the kill switch would sit stale for another whole TTL.
29
+ */
30
+ generation = 0;
31
+ fallback;
32
+ declared;
33
+ ttlMs;
34
+ constructor(options = {}) {
35
+ this.ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
36
+ this.declared = options.declared ?? [];
37
+ this.fallback = compiledFallbackSnapshot(this.declared);
38
+ }
39
+ /** Replaces the cold-start fallback, once the declared set is known. */
40
+ setDeclared(declared) {
41
+ this.declared = declared;
42
+ this.fallback = compiledFallbackSnapshot(declared);
43
+ }
44
+ declaredFlags() {
45
+ return this.declared;
46
+ }
47
+ /**
48
+ * Drops the cache, so the next read goes to the store.
49
+ *
50
+ * Public because the signal usually arrives from outside: PostHog and Unleash
51
+ * both emit a webhook on a flag change, and an HTTP wiring that receives one
52
+ * calls this to cut the kill-switch latency from the TTL to delivery time. A
53
+ * LaunchDarkly stream is the same call from a held-open connection rather
54
+ * than a request.
55
+ *
56
+ * It does not fetch. An eager refetch makes a burst of webhooks N round
57
+ * trips, and on a serverless runtime the isolate that received the signal may
58
+ * be gone before anything reads the result. The request that next notices the
59
+ * cache is empty pays for the read, and it is the one that needs it.
60
+ */
61
+ invalidate() {
62
+ this.cachedAt = 0;
63
+ this.generation++;
64
+ this.inflight = undefined;
65
+ }
66
+ async snapshot() {
67
+ if (this.cached && Date.now() - this.cachedAt < this.ttlMs) {
68
+ return this.cached;
69
+ }
70
+ if (!this.inflight) {
71
+ const generation = this.generation;
72
+ const read = this.fetchSnapshot().then((snapshot) => {
73
+ if (generation === this.generation) {
74
+ this.cached = snapshot;
75
+ this.cachedAt = Date.now();
76
+ if (this.inflight === read) {
77
+ this.inflight = undefined;
78
+ }
79
+ }
80
+ return snapshot;
81
+ });
82
+ read.catch(() => {
83
+ if (this.inflight === read) {
84
+ this.inflight = undefined;
85
+ }
86
+ });
87
+ this.inflight = read;
88
+ }
89
+ try {
90
+ return await this.inflight;
91
+ }
92
+ catch {
93
+ return this.cached ?? this.fallback;
94
+ }
95
+ }
96
+ }
@@ -0,0 +1,33 @@
1
+ import type { CoreFeatureFlags } from './flag.types.js';
2
+ /**
3
+ * No-op function for declaring feature flags.
4
+ * This exists purely for TypeScript type checking and will be tree-shaken.
5
+ * The CLI extracts metadata via AST parsing and generates a `FeatureFlagName`
6
+ * union, so `flags.calList` is a compile error rather than a silent `false`.
7
+ *
8
+ * That typing is load-bearing rather than a convenience: flags fail closed, so
9
+ * a typo'd flag reads `false`, hides its feature permanently, and leaves every
10
+ * test, screenshot and gate green. An untyped key makes a missing product
11
+ * indistinguishable from a working one.
12
+ *
13
+ * Removal is deliberately not destructive. Deleting a declaration leaves the
14
+ * row in the store, marked undeclared and inert, until `pikku flags prune` —
15
+ * the same additive contract `defineScope` and `defineSystemRole` have, and for
16
+ * the same reason: a mid-deploy revocation is not something a code edit should
17
+ * be able to cause.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * defineFeatureFlags({
22
+ * takeInBike: {
23
+ * description: 'Book a bike in at the counter',
24
+ * anyOf: ['bikes:intake'],
25
+ * },
26
+ * aiAssistant: {
27
+ * description: 'The assistant panel',
28
+ * // no anyOf — the switch is the whole answer
29
+ * },
30
+ * })
31
+ * ```
32
+ */
33
+ export declare const defineFeatureFlags: (_config: CoreFeatureFlags) => void;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * No-op function for declaring feature flags.
3
+ * This exists purely for TypeScript type checking and will be tree-shaken.
4
+ * The CLI extracts metadata via AST parsing and generates a `FeatureFlagName`
5
+ * union, so `flags.calList` is a compile error rather than a silent `false`.
6
+ *
7
+ * That typing is load-bearing rather than a convenience: flags fail closed, so
8
+ * a typo'd flag reads `false`, hides its feature permanently, and leaves every
9
+ * test, screenshot and gate green. An untyped key makes a missing product
10
+ * indistinguishable from a working one.
11
+ *
12
+ * Removal is deliberately not destructive. Deleting a declaration leaves the
13
+ * row in the store, marked undeclared and inert, until `pikku flags prune` —
14
+ * the same additive contract `defineScope` and `defineSystemRole` have, and for
15
+ * the same reason: a mid-deploy revocation is not something a code edit should
16
+ * be able to cause.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * defineFeatureFlags({
21
+ * takeInBike: {
22
+ * description: 'Book a bike in at the counter',
23
+ * anyOf: ['bikes:intake'],
24
+ * },
25
+ * aiAssistant: {
26
+ * description: 'The assistant panel',
27
+ * // no anyOf — the switch is the whole answer
28
+ * },
29
+ * })
30
+ * ```
31
+ */
32
+ export const defineFeatureFlags = (_config) => { };
@@ -0,0 +1,97 @@
1
+ /**
2
+ * A feature flag: a UI-facing name a client can ask about without knowing
3
+ * anything about the capability vocabulary.
4
+ *
5
+ * The flag is the indirection that keeps scopes a server concern. Returning
6
+ * `session.scopes` to the client would work and is wrong three times over: it
7
+ * publishes the vocabulary to every screen, it makes a scope rename a frontend
8
+ * refactor, and it forces each call site to reimplement parent-grant
9
+ * resolution — which some will get wrong in the permissive direction.
10
+ */
11
+ export type CoreFeatureFlag = {
12
+ /** Surfaced in the console beside the switch. */
13
+ description?: string;
14
+ /**
15
+ * The session satisfies this flag by holding ANY of these — deliberately the
16
+ * opposite of `scopes:`, which is AND, because a flag usually reveals one
17
+ * entry point several roles can reach. Named `anyOf` and not `scopes` so the
18
+ * inverted semantics are visible at the call site.
19
+ *
20
+ * Every id must be declared with `defineScope`; the inspector fails the
21
+ * build otherwise, the same rule `defineSystemRole` already enforces.
22
+ *
23
+ * Omitted means no capability constraint — NOT "always on". The switch,
24
+ * the rollout bucket and any override still apply, which is what makes a
25
+ * flag usable as a pure kill switch. An explicit `anyOf: []` is a
26
+ * declaration error: write no key, or write scopes.
27
+ */
28
+ anyOf?: string[];
29
+ };
30
+ /**
31
+ * Feature flags to declare, keyed by name. A key must be non-empty and must
32
+ * not contain `:` — that separator belongs to scopes, and a flag that looks
33
+ * like a scope id invites exactly the confusion this exists to prevent.
34
+ */
35
+ export type CoreFeatureFlags = Record<string, CoreFeatureFlag>;
36
+ export type FeatureFlagDefinitionMeta = {
37
+ name: string;
38
+ description?: string;
39
+ anyOf?: string[];
40
+ sourceFile?: string;
41
+ };
42
+ export type FeatureFlagDefinitions = FeatureFlagDefinitionMeta[];
43
+ export type FeatureFlagDefinitionsMeta = Record<string, FeatureFlagDefinitionMeta>;
44
+ /** A declared flag, ready to sync into a flag store. */
45
+ export type DeclaredFlag = {
46
+ name: string;
47
+ description?: string;
48
+ anyOf?: string[];
49
+ };
50
+ /**
51
+ * Who a rollout bucket and an override are keyed on.
52
+ *
53
+ * The organization is preferred over the user wherever both are known: two
54
+ * colleagues on a screen-share seeing different UIs is a support ticket.
55
+ */
56
+ export type FlagSubject = {
57
+ organizationId?: string;
58
+ userId?: string;
59
+ };
60
+ /** The runtime half of one flag: what an operator set, not what code declared. */
61
+ export type FlagConfig = {
62
+ enabled: boolean;
63
+ /** 0–100, or null for no rollout constraint. */
64
+ rolloutPercent: number | null;
65
+ /**
66
+ * Per-subject short-circuits, keyed by subject id. The one genuine OR in the
67
+ * model: "off for everyone, but these three orgs see it." An override wins
68
+ * over both the switch and the bucket, in either direction, so QA can enter a
69
+ * 5% rollout and a single tenant can be excluded from a bad one.
70
+ */
71
+ overrides: Record<string, boolean>;
72
+ };
73
+ /**
74
+ * The global config half, keyed by flag name. One small blob shared by every
75
+ * user, which is why it is not baked into the session: writing it per-session
76
+ * would make killing a feature an unbounded fan-out over every active session,
77
+ * with users on both sides of the flip for its duration.
78
+ */
79
+ export type FlagConfigSnapshot = Record<string, FlagConfig>;
80
+ /**
81
+ * A flag resolves to two booleans, not one. One bit cannot distinguish "you may
82
+ * not" (a 403, the caller's own situation) from "nobody may right now" (a 503,
83
+ * ours) — and collapsing them is what leaves a kill switch with nothing to
84
+ * enforce.
85
+ */
86
+ export type FlagState = {
87
+ /** The feature is switched on at all. Global, caller-blind, and the only half
88
+ * the runner enforces. */
89
+ available: boolean;
90
+ /** This session holds a satisfying scope. Advisory to the client; hides UI and
91
+ * protects nothing, forever. */
92
+ capable: boolean;
93
+ };
94
+ /** What a client renders on. */
95
+ export type ResolvedFlag = FlagState & {
96
+ show: boolean;
97
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ export { CachedFlagSource } from './cached-flag-source.js';
2
+ export type { CachedFlagSourceOptions } from './cached-flag-source.js';
3
+ export { assertFeatureAvailable } from './assert-feature-available.js';
4
+ export { defineFeatureFlags } from './define-feature-flags.js';
5
+ export { bucketOf, resolveFlag, resolveFlagForClient, resolveFlagsForClient, subjectIdOf, } from './resolve-flag.js';
6
+ export { compiledFallbackSnapshot, flattenFeatureFlagDefinitions, validateAndBuildFeatureFlagDefinitionsMeta, } from './validate-flag-definitions.js';
7
+ export type { CoreFeatureFlag, CoreFeatureFlags, DeclaredFlag, FeatureFlagDefinitionMeta, FeatureFlagDefinitions, FeatureFlagDefinitionsMeta, FlagConfig, FlagConfigSnapshot, FlagState, FlagSubject, ResolvedFlag, } from './flag.types.js';
@@ -0,0 +1,5 @@
1
+ export { CachedFlagSource } from './cached-flag-source.js';
2
+ export { assertFeatureAvailable } from './assert-feature-available.js';
3
+ export { defineFeatureFlags } from './define-feature-flags.js';
4
+ export { bucketOf, resolveFlag, resolveFlagForClient, resolveFlagsForClient, subjectIdOf, } from './resolve-flag.js';
5
+ export { compiledFallbackSnapshot, flattenFeatureFlagDefinitions, validateAndBuildFeatureFlagDefinitionsMeta, } from './validate-flag-definitions.js';
@@ -0,0 +1,52 @@
1
+ import type { CoreUserSession } from '../../types/core.types.js';
2
+ import type { DeclaredFlag, FlagConfigSnapshot, FlagState, FlagSubject, ResolvedFlag } from './flag.types.js';
3
+ /**
4
+ * FNV-1a over `${flag}:${subject}`.
5
+ *
6
+ * Salted by flag key so two flags at 50% do not select the same half and
7
+ * concurrent rollouts stay independent. Sync and non-crypto on purpose:
8
+ * WebCrypto's digest is async and this runs inside resolution, which does no
9
+ * I/O and cannot await.
10
+ */
11
+ export declare const bucketOf: (flag: string, subject: string) => number;
12
+ /**
13
+ * The subject a bucket and an override are keyed on.
14
+ *
15
+ * Organization first: a percentage rollout that splits colleagues inside one
16
+ * account is a support ticket, not an experiment.
17
+ */
18
+ export declare const subjectIdOf: (subject: FlagSubject | undefined) => string | undefined;
19
+ /**
20
+ * Resolves one flag from the session and the config snapshot. Pure, sync, and
21
+ * the only thing on the request path — the I/O is the snapshot read, which the
22
+ * caller has already done and which implementations cache.
23
+ *
24
+ * `subject` is passed explicitly rather than read off the session because the
25
+ * subject is not always in one: a queue worker, a cron task or a workflow step
26
+ * knows its organization from its input, and resolving those against no subject
27
+ * would skip every per-org override and deny an org that was explicitly
28
+ * granted. Where it is omitted the session is used.
29
+ *
30
+ * A flag absent from the snapshot fails OPEN on availability, falling back to
31
+ * the declaration compiled into the bundle. Treating an unreadable config as
32
+ * everything-off turns a transient store blip into a total outage of your own
33
+ * product. It is safe only because `capable` comes from the session and
34
+ * `scopes:` is untouched, so failing open cannot expose anything the caller was
35
+ * not already authorized for.
36
+ */
37
+ export declare const resolveFlag: (key: string, anyOf: readonly string[] | undefined, session: CoreUserSession | undefined, config: FlagConfigSnapshot, subject?: FlagSubject) => FlagState;
38
+ /** {@link resolveFlag} plus the `show` a client renders on. */
39
+ export declare const resolveFlagForClient: (key: string, anyOf: readonly string[] | undefined, session: CoreUserSession | undefined, config: FlagConfigSnapshot, subject?: FlagSubject) => ResolvedFlag;
40
+ /**
41
+ * Every declared flag resolved for one caller, as a client consumes them.
42
+ *
43
+ * A client asks once per session and reads the map synchronously after, rather
44
+ * than asking per flag: a flag is checked wherever a component renders, and a
45
+ * request from each would put the network in front of a paint. The snapshot is
46
+ * already in isolate memory, so this is a map over a cached object.
47
+ *
48
+ * Bare booleans, not `FlagState`. `show` is the collapse of the two halves, and
49
+ * sending them apart would tell a client which features exist but are dark —
50
+ * a roadmap nobody meant to publish.
51
+ */
52
+ export declare const resolveFlagsForClient: (declared: readonly DeclaredFlag[], session: CoreUserSession | undefined, config: FlagConfigSnapshot, subject?: FlagSubject) => Record<string, boolean>;
@@ -0,0 +1,90 @@
1
+ import { hasAnyScope } from '../../scopes.js';
2
+ /**
3
+ * FNV-1a over `${flag}:${subject}`.
4
+ *
5
+ * Salted by flag key so two flags at 50% do not select the same half and
6
+ * concurrent rollouts stay independent. Sync and non-crypto on purpose:
7
+ * WebCrypto's digest is async and this runs inside resolution, which does no
8
+ * I/O and cannot await.
9
+ */
10
+ export const bucketOf = (flag, subject) => {
11
+ let h = 0x811c9dc5;
12
+ const s = `${flag}:${subject}`;
13
+ for (let i = 0; i < s.length; i++) {
14
+ h ^= s.charCodeAt(i);
15
+ h = Math.imul(h, 0x01000193) >>> 0;
16
+ }
17
+ return h % 10_000;
18
+ };
19
+ /**
20
+ * The subject a bucket and an override are keyed on.
21
+ *
22
+ * Organization first: a percentage rollout that splits colleagues inside one
23
+ * account is a support ticket, not an experiment.
24
+ */
25
+ export const subjectIdOf = (subject) => {
26
+ const usable = (id) => id === undefined || id === '' ? undefined : id;
27
+ return usable(subject?.organizationId) ?? usable(subject?.userId);
28
+ };
29
+ /**
30
+ * Resolves one flag from the session and the config snapshot. Pure, sync, and
31
+ * the only thing on the request path — the I/O is the snapshot read, which the
32
+ * caller has already done and which implementations cache.
33
+ *
34
+ * `subject` is passed explicitly rather than read off the session because the
35
+ * subject is not always in one: a queue worker, a cron task or a workflow step
36
+ * knows its organization from its input, and resolving those against no subject
37
+ * would skip every per-org override and deny an org that was explicitly
38
+ * granted. Where it is omitted the session is used.
39
+ *
40
+ * A flag absent from the snapshot fails OPEN on availability, falling back to
41
+ * the declaration compiled into the bundle. Treating an unreadable config as
42
+ * everything-off turns a transient store blip into a total outage of your own
43
+ * product. It is safe only because `capable` comes from the session and
44
+ * `scopes:` is untouched, so failing open cannot expose anything the caller was
45
+ * not already authorized for.
46
+ */
47
+ export const resolveFlag = (key, anyOf, session, config, subject) => {
48
+ const capable = anyOf === undefined ? true : hasAnyScope(anyOf, session?.scopes);
49
+ const row = config[key];
50
+ if (!row) {
51
+ return { available: true, capable };
52
+ }
53
+ const id = subjectIdOf(subject) ??
54
+ subjectIdOf({ organizationId: session?.orgId, userId: session?.userId });
55
+ const override = id === undefined ? undefined : row.overrides[id];
56
+ if (override !== undefined) {
57
+ return { available: override, capable };
58
+ }
59
+ // No subject skips the bucket rather than failing it. A sessionless caller
60
+ // has nothing to hash, and hashing a constant would put every cron run in one
61
+ // bucket — making a 10% rollout either 0% or 100% of background work at
62
+ // random. A percentage is a statement about users; background work is either
63
+ // on or off.
64
+ const inBucket = row.rolloutPercent === null || id === undefined
65
+ ? true
66
+ : bucketOf(key, id) < Math.round(row.rolloutPercent * 100);
67
+ return { available: row.enabled && inBucket, capable };
68
+ };
69
+ /** {@link resolveFlag} plus the `show` a client renders on. */
70
+ export const resolveFlagForClient = (key, anyOf, session, config, subject) => {
71
+ const state = resolveFlag(key, anyOf, session, config, subject);
72
+ return { ...state, show: state.available && state.capable };
73
+ };
74
+ /**
75
+ * Every declared flag resolved for one caller, as a client consumes them.
76
+ *
77
+ * A client asks once per session and reads the map synchronously after, rather
78
+ * than asking per flag: a flag is checked wherever a component renders, and a
79
+ * request from each would put the network in front of a paint. The snapshot is
80
+ * already in isolate memory, so this is a map over a cached object.
81
+ *
82
+ * Bare booleans, not `FlagState`. `show` is the collapse of the two halves, and
83
+ * sending them apart would tell a client which features exist but are dark —
84
+ * a roadmap nobody meant to publish.
85
+ */
86
+ export const resolveFlagsForClient = (declared, session, config, subject) => Object.fromEntries(declared.map((flag) => [
87
+ flag.name,
88
+ resolveFlagForClient(flag.name, flag.anyOf, session, config, subject)
89
+ .show,
90
+ ]));
@@ -0,0 +1,26 @@
1
+ import type { DeclaredFlag, FeatureFlagDefinitions, FeatureFlagDefinitionsMeta, FlagConfigSnapshot } from './flag.types.js';
2
+ /**
3
+ * The declared flags as a flat list, deduplicated by name.
4
+ *
5
+ * A flag may legitimately be declared more than once — an addon and its host
6
+ * app both contributing one — and
7
+ * {@link validateAndBuildFeatureFlagDefinitionsMeta} has already guaranteed
8
+ * those declarations are identical.
9
+ */
10
+ export declare const flattenFeatureFlagDefinitions: (definitions: FeatureFlagDefinitions) => DeclaredFlag[];
11
+ /**
12
+ * Validates declared flags and keys them by name.
13
+ *
14
+ * Definitions sharing a name must name the same scope set; a conflicting
15
+ * redeclaration is a hard error naming both source files. Order within `anyOf`
16
+ * is not significant.
17
+ */
18
+ export declare function validateAndBuildFeatureFlagDefinitionsMeta(definitions: FeatureFlagDefinitions): FeatureFlagDefinitionsMeta;
19
+ /**
20
+ * The snapshot a flag source falls back to when its store cannot be read: every
21
+ * declared flag on, no rollout, no overrides.
22
+ *
23
+ * This is the compiled declaration, not a database read — putting a fallback
24
+ * query on the request path is how a slow store becomes a slow product.
25
+ */
26
+ export declare const compiledFallbackSnapshot: (flags: readonly DeclaredFlag[]) => FlagConfigSnapshot;
@@ -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;