@pikku/core 0.12.106 → 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 (589) hide show
  1. package/CHANGELOG.md +358 -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/rpc/rpc-runner.js +3 -0
  74. package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +8 -8
  75. package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +1 -1
  76. package/dist/wirings/workflow/workflow-queue-routing.d.ts +1 -1
  77. package/package.json +11 -5
  78. package/run-tests.sh +17 -9
  79. package/src/public-surface.json +26 -0
  80. package/src/agent-naming.test.ts +0 -68
  81. package/src/api-report.test.ts +0 -138
  82. package/src/app-alias-surface.test.ts +0 -179
  83. package/src/app-leaf-surface.test.ts +0 -222
  84. package/src/bootstrap-compat/root.ts +0 -20
  85. package/src/classification/column-form.test.ts +0 -97
  86. package/src/classification/column-form.ts +0 -55
  87. package/src/classification/data-classification.ts +0 -73
  88. package/src/classification/index.ts +0 -40
  89. package/src/classification/key-ids.ts +0 -2
  90. package/src/classification/secret-value.test.ts +0 -204
  91. package/src/classification/secret-value.ts +0 -106
  92. package/src/crypto-utils.test.ts +0 -668
  93. package/src/crypto-utils.ts +0 -460
  94. package/src/dev/hot-reload.test.ts +0 -587
  95. package/src/dev/hot-reload.ts +0 -225
  96. package/src/dev/module-runner.test.ts +0 -235
  97. package/src/dev/module-runner.ts +0 -138
  98. package/src/dev/reload-meta.test.ts +0 -183
  99. package/src/dev/reload-meta.ts +0 -144
  100. package/src/ecosystem-tier-removed.test.ts +0 -72
  101. package/src/env.ts +0 -1
  102. package/src/errors/error-handler.ts +0 -77
  103. package/src/errors/error.test.ts +0 -229
  104. package/src/errors/errors.ts +0 -393
  105. package/src/errors/index.ts +0 -11
  106. package/src/errors/serialized-error.ts +0 -12
  107. package/src/factory-functions.test.ts +0 -111
  108. package/src/function/abort-scope.test.ts +0 -97
  109. package/src/function/abort-scope.ts +0 -80
  110. package/src/function/function-meta.types.ts +0 -151
  111. package/src/function/function-runner.test.ts +0 -1619
  112. package/src/function/function-runner.ts +0 -499
  113. package/src/function/functions.types.ts +0 -319
  114. package/src/function/index.ts +0 -40
  115. package/src/function/list.types.test.ts +0 -100
  116. package/src/function/list.types.ts +0 -69
  117. package/src/function/pikku-request.test.ts +0 -35
  118. package/src/function/pikku-request.ts +0 -17
  119. package/src/gopass-secrets-removed.test.ts +0 -51
  120. package/src/handle-error.test.ts +0 -532
  121. package/src/handle-error.ts +0 -64
  122. package/src/middleware/auth-apikey.test.ts +0 -362
  123. package/src/middleware/auth-apikey.ts +0 -39
  124. package/src/middleware/auth-bearer.test.ts +0 -566
  125. package/src/middleware/auth-bearer.ts +0 -83
  126. package/src/middleware/auth-cookie.test.ts +0 -572
  127. package/src/middleware/auth-cookie.ts +0 -107
  128. package/src/middleware/cors.test.ts +0 -579
  129. package/src/middleware/cors.ts +0 -103
  130. package/src/middleware/index.ts +0 -30
  131. package/src/middleware/middleware-factories.ts +0 -76
  132. package/src/middleware/middleware.types.ts +0 -61
  133. package/src/middleware/remote-auth.test.ts +0 -547
  134. package/src/middleware/remote-auth.ts +0 -95
  135. package/src/middleware/remote-jobs-secret.ts +0 -35
  136. package/src/middleware/require-origin.test.ts +0 -115
  137. package/src/middleware/require-origin.ts +0 -79
  138. package/src/middleware/telemetry.ts +0 -83
  139. package/src/middleware-runner.test.ts +0 -578
  140. package/src/middleware-runner.ts +0 -232
  141. package/src/no-any-casts.test.ts +0 -57
  142. package/src/no-root-barrel.test.ts +0 -122
  143. package/src/permissions.test.ts +0 -256
  144. package/src/permissions.ts +0 -217
  145. package/src/pikku-state.test.ts +0 -198
  146. package/src/pikku-state.ts +0 -206
  147. package/src/production-barrels-stay-lean.test.ts +0 -110
  148. package/src/public-surface.test.ts +0 -133
  149. package/src/remote.test.ts +0 -173
  150. package/src/remote.ts +0 -56
  151. package/src/removed-legacy-exports.test.ts +0 -66
  152. package/src/run-tests-script.test.ts +0 -67
  153. package/src/schema.test.ts +0 -430
  154. package/src/schema.ts +0 -204
  155. package/src/scopes.test.ts +0 -203
  156. package/src/scopes.ts +0 -67
  157. package/src/services/agent-run-state-service.ts +0 -37
  158. package/src/services/agent-runner-service.ts +0 -238
  159. package/src/services/agent-storage-service.ts +0 -39
  160. package/src/services/ai-embedding-service.ts +0 -9
  161. package/src/services/audit-service.test.ts +0 -44
  162. package/src/services/audit-service.ts +0 -280
  163. package/src/services/content-service.ts +0 -65
  164. package/src/services/credential-service.ts +0 -20
  165. package/src/services/credential-wire-service.test.ts +0 -235
  166. package/src/services/credential-wire-service.ts +0 -120
  167. package/src/services/deployment-service.ts +0 -32
  168. package/src/services/email-service.test.ts +0 -100
  169. package/src/services/email-service.ts +0 -60
  170. package/src/services/email-template.test.ts +0 -311
  171. package/src/services/email-template.ts +0 -254
  172. package/src/services/file-scenario-run-store.test.ts +0 -349
  173. package/src/services/file-scenario-run-store.ts +0 -282
  174. package/src/services/gateway-service.ts +0 -5
  175. package/src/services/http-personas-converse.test.ts +0 -274
  176. package/src/services/http-personas.test.ts +0 -379
  177. package/src/services/http-personas.ts +0 -508
  178. package/src/services/in-memory-agent-run-state-service.ts +0 -87
  179. package/src/services/in-memory-queue-service.test.ts +0 -162
  180. package/src/services/in-memory-queue-service.ts +0 -78
  181. package/src/services/in-memory-session-store.test.ts +0 -58
  182. package/src/services/in-memory-session-store.ts +0 -20
  183. package/src/services/in-memory-trigger-service.ts +0 -47
  184. package/src/services/in-memory-workflow-service.test.ts +0 -430
  185. package/src/services/in-memory-workflow-service.ts +0 -595
  186. package/src/services/index.ts +0 -192
  187. package/src/services/istanbul-coverage-service.test.ts +0 -66
  188. package/src/services/istanbul-coverage-service.ts +0 -59
  189. package/src/services/jwt-service.ts +0 -15
  190. package/src/services/local-content-request-handler.test.ts +0 -240
  191. package/src/services/local-content-request-handler.ts +0 -295
  192. package/src/services/local-content.test.ts +0 -186
  193. package/src/services/local-content.ts +0 -242
  194. package/src/services/local-credential-service.ts +0 -63
  195. package/src/services/local-email-service.test.ts +0 -182
  196. package/src/services/local-email-service.ts +0 -43
  197. package/src/services/local-gateway-service.ts +0 -51
  198. package/src/services/local-secrets.test.ts +0 -95
  199. package/src/services/local-secrets.ts +0 -71
  200. package/src/services/local-variables.test.ts +0 -61
  201. package/src/services/local-variables.ts +0 -45
  202. package/src/services/logger-console.test.ts +0 -117
  203. package/src/services/logger-console.ts +0 -174
  204. package/src/services/logger.ts +0 -48
  205. package/src/services/meta-service.test.ts +0 -75
  206. package/src/services/meta-service.ts +0 -767
  207. package/src/services/persona-actor-secret.test.ts +0 -68
  208. package/src/services/persona-actor-secret.ts +0 -70
  209. package/src/services/persona-sign-in.test.ts +0 -219
  210. package/src/services/persona-sign-in.ts +0 -238
  211. package/src/services/personas-service.ts +0 -191
  212. package/src/services/pikku-user-id.test.ts +0 -62
  213. package/src/services/pikku-user-id.ts +0 -13
  214. package/src/services/queue-webhook-service.test.ts +0 -409
  215. package/src/services/queue-webhook-service.ts +0 -150
  216. package/src/services/remote-jobs.test.ts +0 -106
  217. package/src/services/remote-jobs.ts +0 -92
  218. package/src/services/scheduler-service.ts +0 -37
  219. package/src/services/schema-service.ts +0 -10
  220. package/src/services/scope-service.ts +0 -91
  221. package/src/services/scoped-credential-service.test.ts +0 -86
  222. package/src/services/scoped-credential-service.ts +0 -63
  223. package/src/services/scoped-secret-service.test.ts +0 -93
  224. package/src/services/scoped-secret-service.ts +0 -40
  225. package/src/services/secret-host-binding.test.ts +0 -138
  226. package/src/services/secret-host-binding.ts +0 -51
  227. package/src/services/secret-service.ts +0 -25
  228. package/src/services/secretless.test.ts +0 -54
  229. package/src/services/secretless.ts +0 -29
  230. package/src/services/session-store.ts +0 -9
  231. package/src/services/stub-tracker.test.ts +0 -104
  232. package/src/services/stub-tracker.ts +0 -175
  233. package/src/services/system-role-guard.test.ts +0 -96
  234. package/src/services/system-role-guard.ts +0 -71
  235. package/src/services/temporary-file-service.ts +0 -76
  236. package/src/services/trigger-service.ts +0 -5
  237. package/src/services/typed-credential-service.ts +0 -83
  238. package/src/services/typed-secret-service.test.ts +0 -204
  239. package/src/services/typed-secret-service.ts +0 -132
  240. package/src/services/typed-variables-service.test.ts +0 -166
  241. package/src/services/typed-variables-service.ts +0 -166
  242. package/src/services/user-session-service.test.ts +0 -147
  243. package/src/services/user-session-service.ts +0 -85
  244. package/src/services/v8-coverage-service.test.ts +0 -69
  245. package/src/services/v8-coverage-service.ts +0 -163
  246. package/src/services/variables-service.ts +0 -13
  247. package/src/services/webhook-service.ts +0 -147
  248. package/src/services/workflow-service.ts +0 -120
  249. package/src/side-effects-are-declared.test.ts +0 -84
  250. package/src/source-files-stay-composable.test.ts +0 -41
  251. package/src/template-alias-surface.test.ts +0 -240
  252. package/src/test-utils.ts +0 -38
  253. package/src/testing/index.ts +0 -3
  254. package/src/testing/service-tests/agent-run-service-tests.ts +0 -98
  255. package/src/testing/service-tests/agent-storage-service-tests.ts +0 -379
  256. package/src/testing/service-tests/channel-store-tests.ts +0 -98
  257. package/src/testing/service-tests/credential-service-tests.ts +0 -143
  258. package/src/testing/service-tests/deployment-service-tests.ts +0 -33
  259. package/src/testing/service-tests/event-hub-store-tests.ts +0 -48
  260. package/src/testing/service-tests/secret-service-tests.ts +0 -105
  261. package/src/testing/service-tests/session-store-tests.ts +0 -62
  262. package/src/testing/service-tests/workflow-run-service-tests.ts +0 -59
  263. package/src/testing/service-tests/workflow-service-tests.ts +0 -308
  264. package/src/testing/service-tests.ts +0 -95
  265. package/src/time-utils.test.ts +0 -56
  266. package/src/time-utils.ts +0 -89
  267. package/src/types/core.types.ts +0 -446
  268. package/src/types/index.ts +0 -25
  269. package/src/types/state.types.ts +0 -226
  270. package/src/types/typed-credentials.test.ts +0 -72
  271. package/src/utils/hash.test.ts +0 -68
  272. package/src/utils/hash.ts +0 -26
  273. package/src/utils/hmac.ts +0 -21
  274. package/src/utils/node-host-resolver.ts +0 -20
  275. package/src/utils/safe-fetch.test.ts +0 -515
  276. package/src/utils/safe-fetch.ts +0 -347
  277. package/src/utils.test.ts +0 -359
  278. package/src/utils.ts +0 -165
  279. package/src/version.test.ts +0 -80
  280. package/src/version.ts +0 -25
  281. package/src/wirings/actor-flow/actor-flow.types.ts +0 -40
  282. package/src/wirings/actor-flow/index.ts +0 -10
  283. package/src/wirings/actor-flow/run-conversation.test.ts +0 -187
  284. package/src/wirings/actor-flow/run-conversation.ts +0 -280
  285. package/src/wirings/addon/addon-auth-tags.test.ts +0 -219
  286. package/src/wirings/addon/addon-runner.ts +0 -236
  287. package/src/wirings/addon/addon-scopes.test.ts +0 -225
  288. package/src/wirings/addon/addon-secrets.test.ts +0 -391
  289. package/src/wirings/addon/index.ts +0 -12
  290. package/src/wirings/addon/remote-addon-auth.ts +0 -65
  291. package/src/wirings/addon/wire-addon.test.ts +0 -102
  292. package/src/wirings/addon/wire-addon.ts +0 -202
  293. package/src/wirings/addon/wire-remote-addon.ts +0 -41
  294. package/src/wirings/agent/agent-agui.test.ts +0 -1213
  295. package/src/wirings/agent/agent-agui.ts +0 -405
  296. package/src/wirings/agent/agent-authorization.test.ts +0 -208
  297. package/src/wirings/agent/agent-finalize.test.ts +0 -187
  298. package/src/wirings/agent/agent-finalize.ts +0 -197
  299. package/src/wirings/agent/agent-helpers.test.ts +0 -215
  300. package/src/wirings/agent/agent-helpers.ts +0 -96
  301. package/src/wirings/agent/agent-interrupt.test.ts +0 -833
  302. package/src/wirings/agent/agent-interrupt.ts +0 -400
  303. package/src/wirings/agent/agent-memory.test.ts +0 -397
  304. package/src/wirings/agent/agent-memory.ts +0 -496
  305. package/src/wirings/agent/agent-middleware.types.test.ts +0 -41
  306. package/src/wirings/agent/agent-model-config.test.ts +0 -103
  307. package/src/wirings/agent/agent-model-config.ts +0 -59
  308. package/src/wirings/agent/agent-prepare.test.ts +0 -977
  309. package/src/wirings/agent/agent-prepare.ts +0 -1083
  310. package/src/wirings/agent/agent-registry.test.ts +0 -455
  311. package/src/wirings/agent/agent-registry.ts +0 -99
  312. package/src/wirings/agent/agent-resume-authorization.test.ts +0 -206
  313. package/src/wirings/agent/agent-rpc.ts +0 -116
  314. package/src/wirings/agent/agent-runner.test.ts +0 -1229
  315. package/src/wirings/agent/agent-runner.ts +0 -858
  316. package/src/wirings/agent/agent-stream-delegate.test.ts +0 -381
  317. package/src/wirings/agent/agent-stream-output-hooks.test.ts +0 -353
  318. package/src/wirings/agent/agent-stream.test.ts +0 -1800
  319. package/src/wirings/agent/agent-stream.ts +0 -1639
  320. package/src/wirings/agent/agent-thread-ownership.test.ts +0 -297
  321. package/src/wirings/agent/agent-turn.test.ts +0 -65
  322. package/src/wirings/agent/agent-turn.ts +0 -122
  323. package/src/wirings/agent/agent-utils.ts +0 -20
  324. package/src/wirings/agent/agent.types.ts +0 -676
  325. package/src/wirings/agent/index.ts +0 -58
  326. package/src/wirings/agent/voice-input.test.ts +0 -220
  327. package/src/wirings/agent/voice-input.ts +0 -180
  328. package/src/wirings/agent/voice-output.test.ts +0 -510
  329. package/src/wirings/agent/voice-output.ts +0 -311
  330. package/src/wirings/agent-scorer/agent-scorer-grade.test.ts +0 -106
  331. package/src/wirings/agent-scorer/agent-scorer-grade.ts +0 -55
  332. package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +0 -285
  333. package/src/wirings/agent-scorer/agent-scorer-judge.ts +0 -180
  334. package/src/wirings/agent-scorer/agent-scorer-live.test.ts +0 -174
  335. package/src/wirings/agent-scorer/agent-scorer-live.ts +0 -56
  336. package/src/wirings/agent-scorer/agent-scorer-registry.ts +0 -66
  337. package/src/wirings/agent-scorer/agent-scorer-sampling.test.ts +0 -34
  338. package/src/wirings/agent-scorer/agent-scorer-sampling.ts +0 -36
  339. package/src/wirings/agent-scorer/agent-scorer-snapshots.test.ts +0 -49
  340. package/src/wirings/agent-scorer/agent-scorer-snapshots.ts +0 -46
  341. package/src/wirings/agent-scorer/agent-scorer-worker.test.ts +0 -122
  342. package/src/wirings/agent-scorer/agent-scorer-worker.ts +0 -71
  343. package/src/wirings/agent-scorer/agent-scorer.ts +0 -102
  344. package/src/wirings/agent-scorer/agent-scorer.types.ts +0 -128
  345. package/src/wirings/agent-scorer/index.ts +0 -23
  346. package/src/wirings/channel/channel-common.ts +0 -102
  347. package/src/wirings/channel/channel-handler-shapes.test.ts +0 -72
  348. package/src/wirings/channel/channel-handler.test.ts +0 -322
  349. package/src/wirings/channel/channel-handler.ts +0 -259
  350. package/src/wirings/channel/channel-host-rpc.test.ts +0 -150
  351. package/src/wirings/channel/channel-host-rpc.ts +0 -69
  352. package/src/wirings/channel/channel-middleware-runner.test.ts +0 -188
  353. package/src/wirings/channel/channel-middleware-runner.ts +0 -126
  354. package/src/wirings/channel/channel-rpc-registry.ts +0 -116
  355. package/src/wirings/channel/channel-rpc-responder.ts +0 -117
  356. package/src/wirings/channel/channel-rpc-service.ts +0 -132
  357. package/src/wirings/channel/channel-rpc-validators.ts +0 -65
  358. package/src/wirings/channel/channel-rpc.test.ts +0 -841
  359. package/src/wirings/channel/channel-rpc.ts +0 -5
  360. package/src/wirings/channel/channel-rpc.types.ts +0 -160
  361. package/src/wirings/channel/channel-runner.ts +0 -164
  362. package/src/wirings/channel/channel-store.ts +0 -35
  363. package/src/wirings/channel/channel.types.ts +0 -193
  364. package/src/wirings/channel/define-channel-routes.ts +0 -5
  365. package/src/wirings/channel/eventhub-service.ts +0 -16
  366. package/src/wirings/channel/eventhub-store.ts +0 -13
  367. package/src/wirings/channel/index.ts +0 -40
  368. package/src/wirings/channel/local/index.ts +0 -3
  369. package/src/wirings/channel/local/local-channel-handler.ts +0 -98
  370. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -339
  371. package/src/wirings/channel/local/local-channel-runner.ts +0 -271
  372. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -77
  373. package/src/wirings/channel/local/local-eventhub-service.ts +0 -69
  374. package/src/wirings/channel/log-channels.ts +0 -16
  375. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -135
  376. package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -60
  377. package/src/wirings/channel/serverless/index.ts +0 -6
  378. package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -328
  379. package/src/wirings/cli/channel/cli-approval.test.ts +0 -177
  380. package/src/wirings/cli/channel/cli-approval.ts +0 -135
  381. package/src/wirings/cli/channel/cli-channel-runner.ts +0 -118
  382. package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +0 -192
  383. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +0 -148
  384. package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +0 -480
  385. package/src/wirings/cli/channel/cli-raw-client-runner.ts +0 -188
  386. package/src/wirings/cli/channel/index.ts +0 -6
  387. package/src/wirings/cli/cli-runner.test.ts +0 -969
  388. package/src/wirings/cli/cli-runner.ts +0 -538
  389. package/src/wirings/cli/cli.types.ts +0 -388
  390. package/src/wirings/cli/command-parser.test.ts +0 -1120
  391. package/src/wirings/cli/command-parser.ts +0 -713
  392. package/src/wirings/cli/define-cli-commands.ts +0 -13
  393. package/src/wirings/cli/format-cli-error.test.ts +0 -91
  394. package/src/wirings/cli/format-cli-error.ts +0 -96
  395. package/src/wirings/cli/index.ts +0 -19
  396. package/src/wirings/credential/credential.types.ts +0 -37
  397. package/src/wirings/credential/define-credential.ts +0 -49
  398. package/src/wirings/credential/index.ts +0 -7
  399. package/src/wirings/credential/validate-credential-definitions.ts +0 -63
  400. package/src/wirings/gateway/gateway-authorization.test.ts +0 -575
  401. package/src/wirings/gateway/gateway-channel-meta.test.ts +0 -44
  402. package/src/wirings/gateway/gateway-runner.test.ts +0 -581
  403. package/src/wirings/gateway/gateway-runner.ts +0 -411
  404. package/src/wirings/gateway/gateway.types.ts +0 -137
  405. package/src/wirings/gateway/index.ts +0 -15
  406. package/src/wirings/http/http-routes.test.ts +0 -318
  407. package/src/wirings/http/http-routes.ts +0 -111
  408. package/src/wirings/http/http-runner-addon-ref.test.ts +0 -238
  409. package/src/wirings/http/http-runner.test.ts +0 -503
  410. package/src/wirings/http/http-runner.ts +0 -462
  411. package/src/wirings/http/http.types.ts +0 -307
  412. package/src/wirings/http/index.ts +0 -27
  413. package/src/wirings/http/log-http-routes.ts +0 -18
  414. package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -318
  415. package/src/wirings/http/pikku-fetch-http-request.ts +0 -260
  416. package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -123
  417. package/src/wirings/http/pikku-fetch-http-response.ts +0 -149
  418. package/src/wirings/http/routers/http-router.ts +0 -13
  419. package/src/wirings/http/routers/path-to-regex.test.ts +0 -306
  420. package/src/wirings/http/routers/path-to-regex.ts +0 -115
  421. package/src/wirings/http/web-request.test.ts +0 -382
  422. package/src/wirings/http/web-request.ts +0 -162
  423. package/src/wirings/mcp/index.ts +0 -26
  424. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -388
  425. package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
  426. package/src/wirings/mcp/mcp-runner.test.ts +0 -588
  427. package/src/wirings/mcp/mcp-runner.ts +0 -330
  428. package/src/wirings/mcp/mcp.types.ts +0 -199
  429. package/src/wirings/node/index.ts +0 -2
  430. package/src/wirings/node/node.types.ts +0 -23
  431. package/src/wirings/oauth2/index.ts +0 -1
  432. package/src/wirings/oauth2/oauth2.types.ts +0 -12
  433. package/src/wirings/persona/define-personas.ts +0 -33
  434. package/src/wirings/persona/index.ts +0 -75
  435. package/src/wirings/persona/persona-app-scopes.test.ts +0 -47
  436. package/src/wirings/persona/persona-app-scopes.ts +0 -74
  437. package/src/wirings/persona/persona-email.ts +0 -87
  438. package/src/wirings/persona/persona-environments.test.ts +0 -194
  439. package/src/wirings/persona/persona-environments.ts +0 -138
  440. package/src/wirings/persona/persona-mailbox.ts +0 -156
  441. package/src/wirings/persona/persona.test.ts +0 -230
  442. package/src/wirings/persona/persona.types.ts +0 -156
  443. package/src/wirings/persona/validate-personas.ts +0 -137
  444. package/src/wirings/queue/index.ts +0 -29
  445. package/src/wirings/queue/queue-identity.test.ts +0 -454
  446. package/src/wirings/queue/queue-identity.ts +0 -176
  447. package/src/wirings/queue/queue-runner.test.ts +0 -705
  448. package/src/wirings/queue/queue-runner.ts +0 -181
  449. package/src/wirings/queue/queue.types.ts +0 -161
  450. package/src/wirings/queue/register-queue-helper.ts +0 -46
  451. package/src/wirings/queue/signed-queue-service.ts +0 -60
  452. package/src/wirings/queue/validate-worker-config.test.ts +0 -108
  453. package/src/wirings/queue/validate-worker-config.ts +0 -90
  454. package/src/wirings/role/define-system-role.ts +0 -33
  455. package/src/wirings/role/index.ts +0 -13
  456. package/src/wirings/role/role.test.ts +0 -104
  457. package/src/wirings/role/role.types.ts +0 -47
  458. package/src/wirings/role/validate-role-definitions.ts +0 -93
  459. package/src/wirings/rpc/index.ts +0 -8
  460. package/src/wirings/rpc/rpc-runner.test.ts +0 -1130
  461. package/src/wirings/rpc/rpc-runner.ts +0 -566
  462. package/src/wirings/rpc/rpc-types.ts +0 -87
  463. package/src/wirings/scheduler/index.ts +0 -11
  464. package/src/wirings/scheduler/log-schedulers.ts +0 -16
  465. package/src/wirings/scheduler/scheduler-runner.test.ts +0 -835
  466. package/src/wirings/scheduler/scheduler-runner.ts +0 -138
  467. package/src/wirings/scheduler/scheduler.types.ts +0 -42
  468. package/src/wirings/scope/define-scope.ts +0 -33
  469. package/src/wirings/scope/index.ts +0 -15
  470. package/src/wirings/scope/scope.test.ts +0 -159
  471. package/src/wirings/scope/scope.types.ts +0 -42
  472. package/src/wirings/scope/validate-scope-definitions.ts +0 -107
  473. package/src/wirings/secret/index.ts +0 -9
  474. package/src/wirings/secret/secret.types.ts +0 -70
  475. package/src/wirings/secret/validate-secret-definitions.test.ts +0 -232
  476. package/src/wirings/secret/validate-secret-definitions.ts +0 -88
  477. package/src/wirings/trigger/index.ts +0 -9
  478. package/src/wirings/trigger/pikku-trigger-service.ts +0 -107
  479. package/src/wirings/trigger/trigger-runner.test.ts +0 -78
  480. package/src/wirings/trigger/trigger-runner.ts +0 -113
  481. package/src/wirings/trigger/trigger.types.ts +0 -100
  482. package/src/wirings/variable/index.ts +0 -8
  483. package/src/wirings/variable/validate-variable-definitions.test.ts +0 -115
  484. package/src/wirings/variable/validate-variable-definitions.ts +0 -71
  485. package/src/wirings/variable/variable.types.ts +0 -40
  486. package/src/wirings/virtual-user/index.ts +0 -107
  487. package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +0 -115
  488. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +0 -95
  489. package/src/wirings/virtual-user/run-virtual-user.test.ts +0 -774
  490. package/src/wirings/virtual-user/run-virtual-user.ts +0 -684
  491. package/src/wirings/virtual-user/virtual-user-agents.test.ts +0 -72
  492. package/src/wirings/virtual-user/virtual-user-agents.ts +0 -62
  493. package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +0 -215
  494. package/src/wirings/virtual-user/virtual-user-catalogue.ts +0 -184
  495. package/src/wirings/virtual-user/virtual-user-derive.test.ts +0 -426
  496. package/src/wirings/virtual-user/virtual-user-derive.ts +0 -161
  497. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +0 -68
  498. package/src/wirings/virtual-user/virtual-user-dispositions.ts +0 -210
  499. package/src/wirings/virtual-user/virtual-user-intents.test.ts +0 -218
  500. package/src/wirings/virtual-user/virtual-user-intents.ts +0 -185
  501. package/src/wirings/virtual-user/virtual-user-rng.test.ts +0 -72
  502. package/src/wirings/virtual-user/virtual-user-rng.ts +0 -50
  503. package/src/wirings/virtual-user/virtual-user-run-store.ts +0 -131
  504. package/src/wirings/virtual-user/virtual-user-scaffold.test.ts +0 -854
  505. package/src/wirings/virtual-user/virtual-user-scaffold.ts +0 -664
  506. package/src/wirings/virtual-user/virtual-user-schedule-store.ts +0 -93
  507. package/src/wirings/virtual-user/virtual-user-schedule.test.ts +0 -280
  508. package/src/wirings/virtual-user/virtual-user-schedule.ts +0 -156
  509. package/src/wirings/virtual-user/virtual-user-target.ts +0 -47
  510. package/src/wirings/virtual-user/virtual-user.types.ts +0 -215
  511. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -709
  512. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -25
  513. package/src/wirings/workflow/feature.test.ts +0 -131
  514. package/src/wirings/workflow/feature.ts +0 -59
  515. package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +0 -569
  516. package/src/wirings/workflow/graph/graph-foreach.test.ts +0 -626
  517. package/src/wirings/workflow/graph/graph-node.ts +0 -115
  518. package/src/wirings/workflow/graph/graph-runner.test.ts +0 -1049
  519. package/src/wirings/workflow/graph/graph-runner.ts +0 -1376
  520. package/src/wirings/workflow/graph/graph-validation.test.ts +0 -27
  521. package/src/wirings/workflow/graph/graph-validation.ts +0 -41
  522. package/src/wirings/workflow/graph/template.test.ts +0 -49
  523. package/src/wirings/workflow/graph/template.ts +0 -42
  524. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -39
  525. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -75
  526. package/src/wirings/workflow/index.ts +0 -107
  527. package/src/wirings/workflow/pikku-scenario-service.ts +0 -1013
  528. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -963
  529. package/src/wirings/workflow/pikku-workflow-service.ts +0 -1993
  530. package/src/wirings/workflow/run-timeline.test.ts +0 -199
  531. package/src/wirings/workflow/run-timeline.ts +0 -185
  532. package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -107
  533. package/src/wirings/workflow/scenario-cookie-jar.ts +0 -57
  534. package/src/wirings/workflow/scenario-expectations.test.ts +0 -238
  535. package/src/wirings/workflow/scenario-hooks.test.ts +0 -259
  536. package/src/wirings/workflow/scenario-poll.test.ts +0 -64
  537. package/src/wirings/workflow/scenario-poll.ts +0 -27
  538. package/src/wirings/workflow/scenario-prose.test.ts +0 -275
  539. package/src/wirings/workflow/scenario-prose.ts +0 -86
  540. package/src/wirings/workflow/scenario-run.types.ts +0 -193
  541. package/src/wirings/workflow/scenario-service.test.ts +0 -147
  542. package/src/wirings/workflow/scenario-step-guards.ts +0 -23
  543. package/src/wirings/workflow/scenario-step.test.ts +0 -800
  544. package/src/wirings/workflow/scenario-step.types.ts +0 -262
  545. package/src/wirings/workflow/scenario-surface.test.ts +0 -146
  546. package/src/wirings/workflow/scenario-surface.ts +0 -71
  547. package/src/wirings/workflow/scenario.types.ts +0 -63
  548. package/src/wirings/workflow/workflow-approval-audit.ts +0 -47
  549. package/src/wirings/workflow/workflow-approval-policy.test.ts +0 -594
  550. package/src/wirings/workflow/workflow-approval-policy.ts +0 -68
  551. package/src/wirings/workflow/workflow-approval.ts +0 -290
  552. package/src/wirings/workflow/workflow-child-run-session.test.ts +0 -168
  553. package/src/wirings/workflow/workflow-constants.ts +0 -66
  554. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +0 -116
  555. package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -55
  556. package/src/wirings/workflow/workflow-dispatch-relay.test.ts +0 -128
  557. package/src/wirings/workflow/workflow-errors.ts +0 -132
  558. package/src/wirings/workflow/workflow-inline-authority.test.ts +0 -175
  559. package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -51
  560. package/src/wirings/workflow/workflow-invocation-id.ts +0 -28
  561. package/src/wirings/workflow/workflow-meta-resolver.ts +0 -45
  562. package/src/wirings/workflow/workflow-mirror.test.ts +0 -171
  563. package/src/wirings/workflow/workflow-missing-meta.test.ts +0 -92
  564. package/src/wirings/workflow/workflow-on-error.test.ts +0 -145
  565. package/src/wirings/workflow/workflow-queue-routing.ts +0 -129
  566. package/src/wirings/workflow/workflow-queue-wiring.ts +0 -149
  567. package/src/wirings/workflow/workflow-queue-workers.test.ts +0 -131
  568. package/src/wirings/workflow/workflow-queue-workers.ts +0 -66
  569. package/src/wirings/workflow/workflow-recovery.ts +0 -192
  570. package/src/wirings/workflow/workflow-replay-snapshot.test.ts +0 -140
  571. package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -113
  572. package/src/wirings/workflow/workflow-run-authority.test.ts +0 -212
  573. package/src/wirings/workflow/workflow-run-context.test.ts +0 -172
  574. package/src/wirings/workflow/workflow-run-engine.types.ts +0 -92
  575. package/src/wirings/workflow/workflow-run-ownership.ts +0 -37
  576. package/src/wirings/workflow/workflow-run-polling.test.ts +0 -127
  577. package/src/wirings/workflow/workflow-stalled-recovery.test.ts +0 -152
  578. package/src/wirings/workflow/workflow-status-stream.test.ts +0 -354
  579. package/src/wirings/workflow/workflow-status-stream.ts +0 -144
  580. package/src/wirings/workflow/workflow-step-claim.ts +0 -46
  581. package/src/wirings/workflow/workflow-step-ordinal.test.ts +0 -94
  582. package/src/wirings/workflow/workflow-step-session.test.ts +0 -87
  583. package/src/wirings/workflow/workflow-suspend.ts +0 -61
  584. package/src/wirings/workflow/workflow-terminal-run-guard.test.ts +0 -105
  585. package/src/wirings/workflow/workflow.types.ts +0 -268
  586. package/src/wirings-stay-decoupled.test.ts +0 -130
  587. package/tsconfig.json +0 -14
  588. package/tsconfig.tsbuildinfo +0 -1
  589. package/tsconfig.type-tests.json +0 -15
@@ -0,0 +1,100 @@
1
+ import type { DeclaredFlag, FlagConfigSnapshot, FlagSubject } from '../wirings/flag/flag.types.js';
2
+ /**
3
+ * The read half of feature flags, and the only half on the request path.
4
+ *
5
+ * Split from {@link FeatureFlagStore} so a third-party provider — PostHog,
6
+ * Unleash, LaunchDarkly — can back flags without pretending to implement an
7
+ * administration surface it does not own. Their UI is the operator surface;
8
+ * writing flags back through their management API means two systems own the
9
+ * same rows, and an implementation that throws from six methods is a console
10
+ * full of buttons that 500.
11
+ */
12
+ export interface FeatureFlagSource {
13
+ /**
14
+ * The global config half: one small blob shared by every user, never
15
+ * per-user data.
16
+ *
17
+ * Implementations MUST cache this in isolate memory and MUST fall back to the
18
+ * compiled declaration when the backing store cannot be read — never to a
19
+ * database query, which would put I/O on the request path this design exists
20
+ * to keep clear. See `compiledFallbackSnapshot`.
21
+ */
22
+ snapshot(): Promise<FlagConfigSnapshot>;
23
+ /**
24
+ * The flags the running app declares, where the implementation was told.
25
+ *
26
+ * Optional because it is not on the request path: resolution reads the
27
+ * snapshot, and a declaration absent from it already fails open. It exists so
28
+ * an administration surface can report the drift a provider cannot fix for
29
+ * itself — a flag declared in code that nobody created in PostHog resolves as
30
+ * on for everyone, and that is worth seeing before production finds it.
31
+ */
32
+ declaredFlags?(): readonly DeclaredFlag[];
33
+ }
34
+ /** One flag as an administration surface sees it. */
35
+ export type FlagRow = DeclaredFlag & {
36
+ enabled: boolean;
37
+ rolloutPercent: number | null;
38
+ /**
39
+ * False when the flag's declaration has been removed from code but its row
40
+ * survives: still switchable, no longer offered, awaiting `pikku flags
41
+ * prune`. Never a silent revoke.
42
+ */
43
+ declared: boolean;
44
+ };
45
+ /**
46
+ * One override, as an administration surface sees it.
47
+ *
48
+ * Carries the subject's kind, which resolution does not: by the time a flag is
49
+ * resolved the organization and the user are one opaque string, and only a
50
+ * screen rendering the row needs to say which it was.
51
+ */
52
+ export type FlagOverrideRow = {
53
+ /** The organization or user this override pins, as an opaque id. */
54
+ subjectId: string;
55
+ /** Which of the two `subjectId` is — `organization` or `user`. */
56
+ subjectKind: string;
57
+ /** Whether the subject is pinned on or pinned off, past the rollout either way. */
58
+ enabled: boolean;
59
+ /** The user who wrote the override, where the store recorded one. */
60
+ grantedBy?: string;
61
+ /** When it was written, as an ISO-8601 instant, where the store recorded one. */
62
+ grantedAt?: string;
63
+ };
64
+ /**
65
+ * The write half: the declaration lifecycle plus the operator controls.
66
+ *
67
+ * Implemented by a store pikku owns. Absent when flags come from a provider,
68
+ * which is what makes the console's Flags tab read-only rather than lying.
69
+ */
70
+ export interface FeatureFlagStore extends FeatureFlagSource {
71
+ /**
72
+ * Registers the declared vocabulary. Additive on the same terms as
73
+ * `syncScopes`: a removed declaration leaves the row marked `declared: false`
74
+ * rather than deleting an operator's switch on deploy.
75
+ *
76
+ * A flag's description and `anyOf` *are* re-synced, because that is the
77
+ * declaration's whole content — editing it is how you change what the flag
78
+ * means, and the deploy is when it takes effect. `enabled`, the rollout and
79
+ * every override are the operator's, and are never touched.
80
+ */
81
+ syncFlags(flags: DeclaredFlag[]): Promise<void>;
82
+ listFlags(): Promise<FlagRow[]>;
83
+ /**
84
+ * One flag's overrides, in full.
85
+ *
86
+ * Not folded into {@link listFlags}: the overrides are unbounded per flag
87
+ * while the list is one row each, and a screen that reads every override of
88
+ * every flag to render a board would grow with the wrong number.
89
+ */
90
+ listOverrides(key: string): Promise<FlagOverrideRow[]>;
91
+ setEnabled(key: string, enabled: boolean, actor?: string, note?: string): Promise<void>;
92
+ /** `percent` is 0–100, or null to remove the rollout constraint. */
93
+ setRollout(key: string, percent: number | null, actor?: string): Promise<void>;
94
+ setOverride(key: string, subject: FlagSubject, enabled: boolean, actor?: string): Promise<void>;
95
+ clearOverride(key: string, subject: FlagSubject): Promise<void>;
96
+ /** Flags in the store with no declaration left in code; powers `pikku flags audit`. */
97
+ findStaleFlags(): Promise<string[]>;
98
+ /** Removes undeclared flags and their overrides. */
99
+ pruneFlags(): Promise<string[]>;
100
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -47,6 +47,7 @@ export type { VariableMeta } from './typed-variables-service.js';
47
47
  export type { MetaService } from './meta-service.js';
48
48
  export type { SessionStore } from './session-store.js';
49
49
  export type { ScopeService, Role } from './scope-service.js';
50
+ export type { FeatureFlagSource, FeatureFlagStore, FlagRow, FlagOverrideRow, } from './feature-flag-service.js';
50
51
  export type { IsSystemRole } from './system-role-guard.js';
51
52
  export { NoopAuditService, createInvocationAudit } from './audit-service.js';
52
53
  export type { AuditConfig, AuditDurability, AuditEvent, AuditEventBatch, AuditLog, AuditService, AuditUserIdentity, ResolvedAuditConfig, } from './audit-service.js';
@@ -9,6 +9,8 @@ import type { WorkflowsMeta } from '../wirings/workflow/workflow.types.js';
9
9
  import type { FeaturesMeta } from '../wirings/workflow/scenario.types.js';
10
10
  import type { ResolvedPersona } from './personas-service.js';
11
11
  import type { SystemRoleDefinitionsMeta } from '../wirings/role/role.types.js';
12
+ import type { FeatureFlagDefinitionsMeta } from '../wirings/flag/flag.types.js';
13
+ import type { AnalyticsEventsMeta } from '../analytics/analytics.types.js';
12
14
  import type { TriggerMeta, TriggerSourceMeta } from '../wirings/trigger/trigger.types.js';
13
15
  import type { SecretDefinitionsMeta } from '../wirings/secret/secret.types.js';
14
16
  import type { CredentialDefinitionsMeta } from '../wirings/credential/credential.types.js';
@@ -152,6 +154,16 @@ export interface MetaService {
152
154
  * seed granted from rather than a second one.
153
155
  */
154
156
  getSystemRolesMeta(): Promise<SystemRoleDefinitionsMeta>;
157
+ /**
158
+ * The flags declared with `defineFeatureFlags`, keyed by name.
159
+ *
160
+ * The declaration half only. What an operator set — the switch, the rollout,
161
+ * the overrides — lives in the flag store and is read through the admin
162
+ * surface, because it changes without a deploy and this does not.
163
+ */
164
+ getFeatureFlagsMeta(): Promise<FeatureFlagDefinitionsMeta>;
165
+ /** The events declared with `defineAnalyticsEvents`, keyed by name. */
166
+ getAnalyticsMeta(): Promise<AnalyticsEventsMeta>;
155
167
  getFeaturesMeta(): Promise<FeaturesMeta>;
156
168
  getTriggerMeta(): Promise<TriggerMeta>;
157
169
  getTriggerSourceMeta(): Promise<TriggerSourceMeta>;
@@ -182,6 +194,8 @@ export declare class LocalMetaService implements MetaService {
182
194
  private workflowMetaCache;
183
195
  private personasMetaCache;
184
196
  private systemRolesMetaCache;
197
+ private featureFlagsMetaCache;
198
+ private analyticsMetaCache;
185
199
  private featuresMetaCache;
186
200
  private triggerMetaCache;
187
201
  private triggerSourceMetaCache;
@@ -216,6 +230,8 @@ export declare class LocalMetaService implements MetaService {
216
230
  getWorkflowMeta(): Promise<WorkflowsMeta>;
217
231
  getPersonasMeta(): Promise<Record<string, ResolvedPersona>>;
218
232
  getSystemRolesMeta(): Promise<SystemRoleDefinitionsMeta>;
233
+ getFeatureFlagsMeta(): Promise<FeatureFlagDefinitionsMeta>;
234
+ getAnalyticsMeta(): Promise<AnalyticsEventsMeta>;
219
235
  getFeaturesMeta(): Promise<FeaturesMeta>;
220
236
  getTriggerMeta(): Promise<TriggerMeta>;
221
237
  getTriggerSourceMeta(): Promise<TriggerSourceMeta>;
@@ -15,6 +15,8 @@ export class LocalMetaService {
15
15
  workflowMetaCache = null;
16
16
  personasMetaCache = null;
17
17
  systemRolesMetaCache = null;
18
+ featureFlagsMetaCache = null;
19
+ analyticsMetaCache = null;
18
20
  featuresMetaCache = null;
19
21
  triggerMetaCache = null;
20
22
  triggerSourceMetaCache = null;
@@ -111,6 +113,8 @@ export class LocalMetaService {
111
113
  this.workflowMetaCache = null;
112
114
  this.personasMetaCache = null;
113
115
  this.systemRolesMetaCache = null;
116
+ this.featureFlagsMetaCache = null;
117
+ this.analyticsMetaCache = null;
114
118
  this.featuresMetaCache = null;
115
119
  this.triggerMetaCache = null;
116
120
  this.triggerSourceMetaCache = null;
@@ -270,6 +274,21 @@ export class LocalMetaService {
270
274
  this.systemRolesMetaCache = content ? JSON.parse(content) : {};
271
275
  return this.systemRolesMetaCache;
272
276
  }
277
+ async getFeatureFlagsMeta() {
278
+ if (this.featureFlagsMetaCache)
279
+ return this.featureFlagsMetaCache;
280
+ // Beside the scopes their `anyOf` names, which is where codegen writes it.
281
+ const content = await this.readFile('scopes/pikku-flags-meta.gen.json');
282
+ this.featureFlagsMetaCache = content ? JSON.parse(content) : {};
283
+ return this.featureFlagsMetaCache;
284
+ }
285
+ async getAnalyticsMeta() {
286
+ if (this.analyticsMetaCache)
287
+ return this.analyticsMetaCache;
288
+ const content = await this.readFile('analytics/pikku-analytics-meta.gen.json');
289
+ this.analyticsMetaCache = content ? JSON.parse(content) : {};
290
+ return this.analyticsMetaCache;
291
+ }
273
292
  async getFeaturesMeta() {
274
293
  if (this.featuresMetaCache)
275
294
  return this.featuresMetaCache;
@@ -92,8 +92,13 @@ export declare abstract class WebhookService {
92
92
  verify(secret: string, signature: string, body: string): boolean;
93
93
  /**
94
94
  * The three methods below are optional capability: the default queue-only
95
- * service keeps no history and throws, and a store-backed implementation
96
- * (e.g. `KyselyWebhookService` in `@pikku/kysely`) overrides them.
95
+ * service keeps no history, and a store-backed implementation (e.g.
96
+ * `KyselyWebhookService` in `@pikku/kysely`) overrides them.
97
+ *
98
+ * Only the write throws. A write that goes nowhere loses the caller's data,
99
+ * so it has to say so; a read of a history nobody keeps is honestly empty,
100
+ * and throwing there turns the console's webhooks page into an error on
101
+ * every app that has not opted into persistence.
97
102
  */
98
103
  recordAttempt(_deliveryId: string, _result: WebhookAttemptResult): Promise<void>;
99
104
  /** Most recent first. */
@@ -14,17 +14,22 @@ export class WebhookService {
14
14
  }
15
15
  /**
16
16
  * The three methods below are optional capability: the default queue-only
17
- * service keeps no history and throws, and a store-backed implementation
18
- * (e.g. `KyselyWebhookService` in `@pikku/kysely`) overrides them.
17
+ * service keeps no history, and a store-backed implementation (e.g.
18
+ * `KyselyWebhookService` in `@pikku/kysely`) overrides them.
19
+ *
20
+ * Only the write throws. A write that goes nowhere loses the caller's data,
21
+ * so it has to say so; a read of a history nobody keeps is honestly empty,
22
+ * and throwing there turns the console's webhooks page into an error on
23
+ * every app that has not opted into persistence.
19
24
  */
20
25
  recordAttempt(_deliveryId, _result) {
21
26
  throw new NotImplementedError('webhook delivery persistence is not configured');
22
27
  }
23
28
  /** Most recent first. */
24
- listDeliveries(_opts) {
25
- throw new NotImplementedError('webhook delivery persistence is not configured');
29
+ async listDeliveries(_opts) {
30
+ return [];
26
31
  }
27
- getDelivery(_deliveryId) {
28
- throw new NotImplementedError('webhook delivery persistence is not configured');
32
+ async getDelivery(_deliveryId) {
33
+ return null;
29
34
  }
30
35
  }
@@ -1,10 +1,10 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `agentRunService`. Runs only when a backend supplies one. */
3
- export declare const defineAgentRunServiceTests: (name: string, agentRunService: NonNullable<ServiceTestConfig["services"]["agentRunService"]>,
3
+ export declare const defineAgentRunServiceTests: (name: string, agentRunService: NonNullable<ServiceTestConfig['services']['agentRunService']>,
4
4
  /**
5
5
  * Thread-ownership is a property of the two services together — the run
6
6
  * service lists what the storage service owns — so that half of the suite
7
7
  * only runs when a backend supplies both. Passed explicitly rather than
8
8
  * closed over, so the dependency is visible in the signature.
9
9
  */
10
- agentStorageService?: ServiceTestConfig["services"]["agentStorageService"]) => void;
10
+ agentStorageService?: ServiceTestConfig['services']['agentStorageService']) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `agentStorageService`. Runs only when a backend supplies one. */
3
- export declare const defineAiStorageServiceTests: (name: string, agentStorageService: NonNullable<ServiceTestConfig["services"]["agentStorageService"]>) => void;
3
+ export declare const defineAiStorageServiceTests: (name: string, agentStorageService: NonNullable<ServiceTestConfig['services']['agentStorageService']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `channelStore`. Runs only when a backend supplies one. */
3
- export declare const defineChannelStoreTests: (name: string, channelStore: NonNullable<ServiceTestConfig["services"]["channelStore"]>) => void;
3
+ export declare const defineChannelStoreTests: (name: string, channelStore: NonNullable<ServiceTestConfig['services']['channelStore']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `credentialService`. Runs only when a backend supplies one. */
3
- export declare const defineCredentialServiceTests: (name: string, credentialService: NonNullable<ServiceTestConfig["services"]["credentialService"]>) => void;
3
+ export declare const defineCredentialServiceTests: (name: string, credentialService: NonNullable<ServiceTestConfig['services']['credentialService']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `deploymentService`. Runs only when a backend supplies one. */
3
- export declare const defineDeploymentServiceTests: (name: string, deploymentService: NonNullable<ServiceTestConfig["services"]["deploymentService"]>) => void;
3
+ export declare const defineDeploymentServiceTests: (name: string, deploymentService: NonNullable<ServiceTestConfig['services']['deploymentService']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `eventHubStore`. Runs only when a backend supplies one. */
3
- export declare const defineEventHubStoreTests: (name: string, eventHubStore: NonNullable<ServiceTestConfig["services"]["eventHubStore"]>) => void;
3
+ export declare const defineEventHubStoreTests: (name: string, eventHubStore: NonNullable<ServiceTestConfig['services']['eventHubStore']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `secretService`. Runs only when a backend supplies one. */
3
- export declare const defineSecretServiceTests: (name: string, secretService: NonNullable<ServiceTestConfig["services"]["secretService"]>) => void;
3
+ export declare const defineSecretServiceTests: (name: string, secretService: NonNullable<ServiceTestConfig['services']['secretService']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `sessionStore`. Runs only when a backend supplies one. */
3
- export declare const defineSessionStoreTests: (name: string, sessionStore: NonNullable<ServiceTestConfig["services"]["sessionStore"]>) => void;
3
+ export declare const defineSessionStoreTests: (name: string, sessionStore: NonNullable<ServiceTestConfig['services']['sessionStore']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `workflowRunService`. Runs only when a backend supplies one. */
3
- export declare const defineWorkflowRunServiceTests: (name: string, workflowRunService: NonNullable<ServiceTestConfig["services"]["workflowRunService"]>) => void;
3
+ export declare const defineWorkflowRunServiceTests: (name: string, workflowRunService: NonNullable<ServiceTestConfig['services']['workflowRunService']>) => void;
@@ -1,3 +1,3 @@
1
1
  import type { ServiceTestConfig } from '../service-tests.js';
2
2
  /** Conformance suite for `workflowService`. Runs only when a backend supplies one. */
3
- export declare const defineWorkflowServiceTests: (name: string, workflowService: NonNullable<ServiceTestConfig["services"]["workflowService"]>) => void;
3
+ export declare const defineWorkflowServiceTests: (name: string, workflowService: NonNullable<ServiceTestConfig['services']['workflowService']>) => void;
@@ -38,7 +38,9 @@ import type { MetaService } from '../services/meta-service.js';
38
38
  import type { CoverageService } from '../services/v8-coverage-service.js';
39
39
  import type { SessionStore } from '../services/session-store.js';
40
40
  import type { ScopeService } from '../services/scope-service.js';
41
+ import type { FeatureFlagSource } from '../services/feature-flag-service.js';
41
42
  import type { AuditDurability, AuditLog, AuditService } from '../services/audit-service.js';
43
+ import type { AnalyticsLog, AnalyticsIdentityResolver, AnalyticsService } from '../analytics/analytics.types.js';
42
44
  export type PikkuWiringTypes = 'http' | 'scheduler' | 'trigger' | 'channel' | 'rpc' | 'queue' | 'mcp' | 'cli' | 'workflow' | 'agent' | 'gateway';
43
45
  /**
44
46
  * Runtime pool tuning for the Postgres adapter. The connection string stays
@@ -145,6 +147,20 @@ export interface CoreSingletonServices<Config extends CoreConfig = CoreConfig> {
145
147
  /** V8 precise-coverage collector (`pikku dev --coverage` only) */
146
148
  coverageService?: CoverageService;
147
149
  audit?: AuditService;
150
+ /** Where product-analytics events go; unset means the logger. */
151
+ analyticsService?: AnalyticsService;
152
+ /**
153
+ * Resolves the browser-originated half of an event's identity — vendor ids
154
+ * and consent — from the wire. Unset means a sink sees only what the session
155
+ * carries, which is enough for a product-analytics tool and not enough for an
156
+ * ad platform.
157
+ */
158
+ analyticsIdentity?: AnalyticsIdentityResolver;
159
+ /**
160
+ * Request-scoped buffer writing into `analyticsService`. Narrow it to the
161
+ * app's own event union in `SingletonServices` to type `record()`.
162
+ */
163
+ analytics?: AnalyticsLog;
148
164
  /**
149
165
  * Request-scoped audit buffer that writes into `audit` (the durable sink).
150
166
  * Returned as a wire service so the runner flushes it via `close()` when the
@@ -158,6 +174,13 @@ export interface CoreSingletonServices<Config extends CoreConfig = CoreConfig> {
158
174
  * never by the function runner.
159
175
  */
160
176
  scopeService?: ScopeService;
177
+ /**
178
+ * The global feature-flag config, read by the function runner to enforce a
179
+ * flag's availability. Inert when absent: a project that declares no flag
180
+ * carries nothing, and a `featureFlag:` with no source registered is a
181
+ * no-op rather than a closed door.
182
+ */
183
+ featureFlags?: FeatureFlagSource;
161
184
  /**
162
185
  * Built once by the factory an auth package registers and injected by the
163
186
  * generated `pikkuServices` wrapper — service factories must not return it
@@ -12,4 +12,4 @@ export type AgentRPCOptions = {
12
12
  * to the runner and stream code it delegates to, instead of a wing of the RPC
13
13
  * primitive.
14
14
  */
15
- export declare const createAgentRPC: (wire: PikkuRawWire, options: AgentRPCOptions) => PikkuRPC["agent"];
15
+ export declare const createAgentRPC: (wire: PikkuRawWire, options: AgentRPCOptions) => PikkuRPC['agent'];
@@ -30,10 +30,10 @@ export declare const toAccumulatedStep: (stepResult: StepResult) => {
30
30
  outputTokens: number;
31
31
  };
32
32
  toolCalls: {
33
- error?: string | undefined;
34
33
  name: string;
35
34
  args: Record<string, unknown>;
36
35
  result: string;
36
+ error?: string | undefined;
37
37
  }[];
38
38
  };
39
39
  type PendingApproval = {
@@ -8,7 +8,7 @@ import { type ScorerInput } from './agent-scorer.types.js';
8
8
  * also strictly best-effort: the client already has its answer, so nothing here
9
9
  * may fail the run.
10
10
  */
11
- export declare const scoreFinishedRun: (run: ScorerInput, services: Pick<CoreSingletonServices, "logger"> & {
11
+ export declare const scoreFinishedRun: (run: ScorerInput, services: Pick<CoreSingletonServices, 'logger'> & {
12
12
  queueService?: {
13
13
  add: (queueName: string, data: unknown) => Promise<any>;
14
14
  };
@@ -6,7 +6,7 @@ export declare const runChannelLifecycleWithMiddleware: ({ channelConfig, meta,
6
6
  channelConfig: CoreChannel<unknown, any>;
7
7
  meta: ChannelMessageMeta;
8
8
  lifecycleConfig: any;
9
- lifecycleType: "connect" | "disconnect";
9
+ lifecycleType: 'connect' | 'disconnect';
10
10
  services: CoreSingletonServices;
11
11
  channel: any;
12
12
  data?: unknown;
@@ -5,10 +5,10 @@ import type { ChannelRPCValidator } from './channel-rpc.types.js';
5
5
  * declared return type — the same one an agent tool or an HTTP response is
6
6
  * checked against.
7
7
  */
8
- export declare const createChannelRPCResultValidator: (singletonServices: Pick<CoreSingletonServices, "logger" | "schema">, packageName?: string | null) => ChannelRPCValidator;
8
+ export declare const createChannelRPCResultValidator: (singletonServices: Pick<CoreSingletonServices, 'logger' | 'schema'>, packageName?: string | null) => ChannelRPCValidator;
9
9
  /**
10
10
  * Checks outbound arguments against the declared input type. Unlike the result
11
11
  * check this is not a boundary — it catches version drift, where a server built
12
12
  * against a newer capability signature calls a client that predates it.
13
13
  */
14
- export declare const createChannelRPCInputValidator: (singletonServices: Pick<CoreSingletonServices, "logger" | "schema">, packageName?: string | null) => ChannelRPCValidator;
14
+ export declare const createChannelRPCInputValidator: (singletonServices: Pick<CoreSingletonServices, 'logger' | 'schema'>, packageName?: string | null) => ChannelRPCValidator;
@@ -1,7 +1,7 @@
1
1
  import type { SessionService } from '../../services/user-session-service.js';
2
2
  import type { ChannelMeta, CoreChannel, RunChannelOptions, RunChannelParams } from './channel.types.js';
3
3
  export declare const wireChannel: <In, Channel extends string, ChannelConnect, ChannelDisconnect, ChannelFunctionMessage>(channel: CoreChannel<In, Channel, ChannelConnect, ChannelDisconnect, ChannelFunctionMessage>) => void;
4
- export declare const openChannel: ({ route, coerceDataFromSchema, request, }: Pick<CoreChannel<unknown, string>, "route"> & RunChannelParams<unknown> & {
4
+ export declare const openChannel: ({ route, coerceDataFromSchema, request, }: Pick<CoreChannel<unknown, string>, 'route'> & RunChannelParams<unknown> & {
5
5
  userSession: SessionService<any>;
6
6
  } & RunChannelOptions) => Promise<{
7
7
  openingData: unknown;
@@ -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
+ }