@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
@@ -1,7 +1,7 @@
1
1
  import type { CoreChannel, RunChannelOptions } from '../channel.types.js';
2
2
  import { PikkuLocalChannelHandler } from './local-channel-handler.js';
3
3
  import type { PikkuHTTPRequest, PikkuHTTPResponse } from '../../http/http.types.js';
4
- export declare const runLocalChannel: ({ channelId, request, response, route, skipUserSession, respondWith404, coerceDataFromSchema, logWarningsForStatusCodes, bubbleErrors, }: Partial<Pick<CoreChannel<unknown, any>, "route">> & RunChannelOptions & {
4
+ export declare const runLocalChannel: ({ channelId, request, response, route, skipUserSession, respondWith404, coerceDataFromSchema, logWarningsForStatusCodes, bubbleErrors, }: Partial<Pick<CoreChannel<unknown, any>, 'route'>> & RunChannelOptions & {
5
5
  channelId: string;
6
6
  request?: PikkuHTTPRequest;
7
7
  response?: PikkuHTTPResponse;
@@ -5,6 +5,6 @@ export interface RunServerlessChannelParams<ChannelData> extends RunChannelParam
5
5
  channelHandlerFactory: PikkuChannelHandlerFactory;
6
6
  channelObject?: unknown;
7
7
  }
8
- export declare const runChannelConnect: ({ channelId, channelObject, request, response, route, channelStore, channelHandlerFactory, coerceDataFromSchema, logWarningsForStatusCodes, respondWith404, bubbleErrors, }: Pick<CoreChannel<unknown, any>, "route"> & RunChannelOptions & RunServerlessChannelParams<unknown>) => Promise<void>;
8
+ export declare const runChannelConnect: ({ channelId, channelObject, request, response, route, channelStore, channelHandlerFactory, coerceDataFromSchema, logWarningsForStatusCodes, respondWith404, bubbleErrors, }: Pick<CoreChannel<unknown, any>, 'route'> & RunChannelOptions & RunServerlessChannelParams<unknown>) => Promise<void>;
9
9
  export declare const runChannelDisconnect: ({ channelId, channelStore, channelHandlerFactory, }: RunServerlessChannelParams<unknown>) => Promise<void>;
10
10
  export declare const runChannelMessage: ({ channelId, channelStore, channelHandlerFactory, }: RunServerlessChannelParams<unknown>, data: unknown) => Promise<unknown>;
@@ -6,8 +6,8 @@ import type { ApprovalRequester } from '../../channel/channel-rpc.js';
6
6
  */
7
7
  export type ApprovalMode = 'prompt' | 'auto' | 'dangerous';
8
8
  export declare const APPROVAL_FLAGS: {
9
- readonly auto: "--auto-approve";
10
- readonly dangerous: "--dangerously-auto-approve";
9
+ readonly auto: '--auto-approve';
10
+ readonly dangerous: '--dangerously-auto-approve';
11
11
  };
12
12
  /**
13
13
  * Stripped from argv, not just read: the server owns the command tree and has
@@ -0,0 +1,15 @@
1
+ import type { CoreUserSession } from '../../types/core.types.js';
2
+ import type { FeatureFlagSource } from '../../services/feature-flag-service.js';
3
+ import type { FlagSubject } from './flag.types.js';
4
+ /**
5
+ * The runner's half of a `featureFlag:` declaration.
6
+ *
7
+ * Availability only. Enforcing the capability half here would make a flag a
8
+ * second authorization path that ORs against `scopes:`, and the two would
9
+ * disagree the first time someone widened a flag's `anyOf` to preview it.
10
+ *
11
+ * No source registered is a no-op rather than a closed door: a project that has
12
+ * not wired one yet should not discover it by having every flagged function
13
+ * start throwing.
14
+ */
15
+ export declare const assertFeatureAvailable: (key: string, featureFlags: FeatureFlagSource | undefined, session: CoreUserSession | undefined, subject?: FlagSubject) => Promise<void>;
@@ -0,0 +1,23 @@
1
+ import { FeatureUnavailableError } from '../../errors/errors.js';
2
+ import { resolveFlag } from './resolve-flag.js';
3
+ /**
4
+ * The runner's half of a `featureFlag:` declaration.
5
+ *
6
+ * Availability only. Enforcing the capability half here would make a flag a
7
+ * second authorization path that ORs against `scopes:`, and the two would
8
+ * disagree the first time someone widened a flag's `anyOf` to preview it.
9
+ *
10
+ * No source registered is a no-op rather than a closed door: a project that has
11
+ * not wired one yet should not discover it by having every flagged function
12
+ * start throwing.
13
+ */
14
+ export const assertFeatureAvailable = async (key, featureFlags, session, subject) => {
15
+ if (!featureFlags) {
16
+ return;
17
+ }
18
+ const config = await featureFlags.snapshot();
19
+ const { available } = resolveFlag(key, undefined, session, config, subject);
20
+ if (!available) {
21
+ throw new FeatureUnavailableError(key);
22
+ }
23
+ };
@@ -0,0 +1,73 @@
1
+ import type { FeatureFlagSource } from '../../services/feature-flag-service.js';
2
+ import type { DeclaredFlag, FlagConfigSnapshot } from './flag.types.js';
3
+ export interface CachedFlagSourceOptions {
4
+ /**
5
+ * How long a snapshot is served before it is refreshed, in milliseconds.
6
+ *
7
+ * This is the latency of a kill switch, so it is short. It is not zero
8
+ * because the alternative is a round trip on every call to every flagged
9
+ * function, and a flag system that costs one is a flag system nobody puts on
10
+ * a hot path — which is exactly where a kill switch earns its keep.
11
+ */
12
+ ttlMs?: number;
13
+ /**
14
+ * The declared flags, used to build the cold-start fallback. Omitted leaves
15
+ * the fallback empty, which resolves every flag as available: a flag absent
16
+ * from a snapshot fails open.
17
+ */
18
+ declared?: readonly DeclaredFlag[];
19
+ }
20
+ /**
21
+ * The caching every flag source needs, so no adapter has to get it right twice.
22
+ *
23
+ * Three layers, in descending order of truth: a fresh read, the last good read,
24
+ * and the compiled declaration. The middle layer is the one that matters —
25
+ * dropping straight to the compiled fallback on a blip would switch on every
26
+ * flag an operator had deliberately left off, which is the opposite of what a
27
+ * dark launch is for. The compiled fallback is reached only on a cold start
28
+ * that has never managed a read, where there is nothing better to say.
29
+ *
30
+ * Refresh is pull-on-demand rather than a background poller on purpose. A
31
+ * poller assumes a long-lived process; an isolate on a serverless runtime is
32
+ * neither long-lived nor allowed to hold a timer between requests, so a vendor
33
+ * SDK built around one either never refreshes or leaks. Fetching inside the
34
+ * request that noticed the snapshot was stale works in both places.
35
+ */
36
+ export declare abstract class CachedFlagSource implements FeatureFlagSource {
37
+ private cached;
38
+ private cachedAt;
39
+ private inflight;
40
+ /**
41
+ * Bumped by every `invalidate()`. A read that started before the signal
42
+ * arrived carries the generation it started in, and stores nothing if that
43
+ * generation is no longer current — otherwise a webhook that landed
44
+ * mid-fetch would be answered by the pre-webhook snapshot, stamped fresh,
45
+ * and the kill switch would sit stale for another whole TTL.
46
+ */
47
+ private generation;
48
+ private fallback;
49
+ private declared;
50
+ private readonly ttlMs;
51
+ constructor(options?: CachedFlagSourceOptions);
52
+ /** One read of the backing store. Never called concurrently with itself. */
53
+ protected abstract fetchSnapshot(): Promise<FlagConfigSnapshot>;
54
+ /** Replaces the cold-start fallback, once the declared set is known. */
55
+ protected setDeclared(declared: DeclaredFlag[]): void;
56
+ declaredFlags(): readonly DeclaredFlag[];
57
+ /**
58
+ * Drops the cache, so the next read goes to the store.
59
+ *
60
+ * Public because the signal usually arrives from outside: PostHog and Unleash
61
+ * both emit a webhook on a flag change, and an HTTP wiring that receives one
62
+ * calls this to cut the kill-switch latency from the TTL to delivery time. A
63
+ * LaunchDarkly stream is the same call from a held-open connection rather
64
+ * than a request.
65
+ *
66
+ * It does not fetch. An eager refetch makes a burst of webhooks N round
67
+ * trips, and on a serverless runtime the isolate that received the signal may
68
+ * be gone before anything reads the result. The request that next notices the
69
+ * cache is empty pays for the read, and it is the one that needs it.
70
+ */
71
+ invalidate(): void;
72
+ snapshot(): Promise<FlagConfigSnapshot>;
73
+ }
@@ -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;