@adonis-agora/flags 0.0.0-beta-20261112141227

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 (322) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +16 -0
  4. package/dist/assets/spa/assets/index-DdmFo7xr.js +12 -0
  5. package/dist/assets/spa/assets/index-DdmFo7xr.js.map +1 -0
  6. package/dist/assets/spa/assets/index-DhkcP3Cw.css +2 -0
  7. package/dist/assets/spa/index.html +26 -0
  8. package/dist/commands/flags_list.d.ts +9 -0
  9. package/dist/commands/flags_list.d.ts.map +1 -0
  10. package/dist/commands/flags_list.js +51 -0
  11. package/dist/commands/flags_list.js.map +1 -0
  12. package/dist/commands/flags_ops.d.ts +60 -0
  13. package/dist/commands/flags_ops.d.ts.map +1 -0
  14. package/dist/commands/flags_ops.js +253 -0
  15. package/dist/commands/flags_ops.js.map +1 -0
  16. package/dist/commands/flags_refs.d.ts +15 -0
  17. package/dist/commands/flags_refs.d.ts.map +1 -0
  18. package/dist/commands/flags_refs.js +90 -0
  19. package/dist/commands/flags_refs.js.map +1 -0
  20. package/dist/commands/flags_set.d.ts +19 -0
  21. package/dist/commands/flags_set.d.ts.map +1 -0
  22. package/dist/commands/flags_set.js +97 -0
  23. package/dist/commands/flags_set.js.map +1 -0
  24. package/dist/commands/flags_types.d.ts +18 -0
  25. package/dist/commands/flags_types.d.ts.map +1 -0
  26. package/dist/commands/flags_types.js +94 -0
  27. package/dist/commands/flags_types.js.map +1 -0
  28. package/dist/commands/flags_work.d.ts +16 -0
  29. package/dist/commands/flags_work.d.ts.map +1 -0
  30. package/dist/commands/flags_work.js +71 -0
  31. package/dist/commands/flags_work.js.map +1 -0
  32. package/dist/commands/main.d.ts +15 -0
  33. package/dist/commands/main.d.ts.map +1 -0
  34. package/dist/commands/main.js +30 -0
  35. package/dist/commands/main.js.map +1 -0
  36. package/dist/commands/shared.d.ts +21 -0
  37. package/dist/commands/shared.d.ts.map +1 -0
  38. package/dist/commands/shared.js +70 -0
  39. package/dist/commands/shared.js.map +1 -0
  40. package/dist/configure.d.ts +11 -0
  41. package/dist/configure.d.ts.map +1 -0
  42. package/dist/configure.js +32 -0
  43. package/dist/configure.js.map +1 -0
  44. package/dist/providers/dashboard_provider.d.ts +65 -0
  45. package/dist/providers/dashboard_provider.d.ts.map +1 -0
  46. package/dist/providers/dashboard_provider.js +340 -0
  47. package/dist/providers/dashboard_provider.js.map +1 -0
  48. package/dist/providers/flags_provider.d.ts +30 -0
  49. package/dist/providers/flags_provider.d.ts.map +1 -0
  50. package/dist/providers/flags_provider.js +184 -0
  51. package/dist/providers/flags_provider.js.map +1 -0
  52. package/dist/services/main.d.ts +17 -0
  53. package/dist/services/main.d.ts.map +1 -0
  54. package/dist/services/main.js +20 -0
  55. package/dist/services/main.js.map +1 -0
  56. package/dist/src/admin.d.ts +189 -0
  57. package/dist/src/admin.d.ts.map +1 -0
  58. package/dist/src/admin.js +539 -0
  59. package/dist/src/admin.js.map +1 -0
  60. package/dist/src/analytics/backend.d.ts +18 -0
  61. package/dist/src/analytics/backend.d.ts.map +1 -0
  62. package/dist/src/analytics/backend.js +25 -0
  63. package/dist/src/analytics/backend.js.map +1 -0
  64. package/dist/src/analytics/clickhouse_backend.d.ts +16 -0
  65. package/dist/src/analytics/clickhouse_backend.d.ts.map +1 -0
  66. package/dist/src/analytics/clickhouse_backend.js +48 -0
  67. package/dist/src/analytics/clickhouse_backend.js.map +1 -0
  68. package/dist/src/analytics/duckdb.d.ts +39 -0
  69. package/dist/src/analytics/duckdb.d.ts.map +1 -0
  70. package/dist/src/analytics/duckdb.js +117 -0
  71. package/dist/src/analytics/duckdb.js.map +1 -0
  72. package/dist/src/analytics/lucid_backend.d.ts +16 -0
  73. package/dist/src/analytics/lucid_backend.d.ts.map +1 -0
  74. package/dist/src/analytics/lucid_backend.js +45 -0
  75. package/dist/src/analytics/lucid_backend.js.map +1 -0
  76. package/dist/src/analytics/metrics.d.ts +50 -0
  77. package/dist/src/analytics/metrics.d.ts.map +1 -0
  78. package/dist/src/analytics/metrics.js +42 -0
  79. package/dist/src/analytics/metrics.js.map +1 -0
  80. package/dist/src/analytics/results.d.ts +80 -0
  81. package/dist/src/analytics/results.d.ts.map +1 -0
  82. package/dist/src/analytics/results.js +143 -0
  83. package/dist/src/analytics/results.js.map +1 -0
  84. package/dist/src/dashboard/access_denied_page.d.ts +100 -0
  85. package/dist/src/dashboard/access_denied_page.d.ts.map +1 -0
  86. package/dist/src/dashboard/access_denied_page.js +262 -0
  87. package/dist/src/dashboard/access_denied_page.js.map +1 -0
  88. package/dist/src/dashboard/actor.d.ts +12 -0
  89. package/dist/src/dashboard/actor.d.ts.map +1 -0
  90. package/dist/src/dashboard/actor.js +33 -0
  91. package/dist/src/dashboard/actor.js.map +1 -0
  92. package/dist/src/dashboard/authorize_decision.d.ts +48 -0
  93. package/dist/src/dashboard/authorize_decision.d.ts.map +1 -0
  94. package/dist/src/dashboard/authorize_decision.js +44 -0
  95. package/dist/src/dashboard/authorize_decision.js.map +1 -0
  96. package/dist/src/dashboard/console_authorize.d.ts +77 -0
  97. package/dist/src/dashboard/console_authorize.d.ts.map +1 -0
  98. package/dist/src/dashboard/console_authorize.js +104 -0
  99. package/dist/src/dashboard/console_authorize.js.map +1 -0
  100. package/dist/src/dashboard/define_config.d.ts +71 -0
  101. package/dist/src/dashboard/define_config.d.ts.map +1 -0
  102. package/dist/src/dashboard/define_config.js +18 -0
  103. package/dist/src/dashboard/define_config.js.map +1 -0
  104. package/dist/src/dashboard/handlers.d.ts +172 -0
  105. package/dist/src/dashboard/handlers.d.ts.map +1 -0
  106. package/dist/src/dashboard/handlers.js +949 -0
  107. package/dist/src/dashboard/handlers.js.map +1 -0
  108. package/dist/src/dashboard/index.d.ts +15 -0
  109. package/dist/src/dashboard/index.d.ts.map +1 -0
  110. package/dist/src/dashboard/index.js +10 -0
  111. package/dist/src/dashboard/index.js.map +1 -0
  112. package/dist/src/dashboard/shape.d.ts +12 -0
  113. package/dist/src/dashboard/shape.d.ts.map +1 -0
  114. package/dist/src/dashboard/shape.js +232 -0
  115. package/dist/src/dashboard/shape.js.map +1 -0
  116. package/dist/src/dashboard/spa.d.ts +34 -0
  117. package/dist/src/dashboard/spa.d.ts.map +1 -0
  118. package/dist/src/dashboard/spa.js +50 -0
  119. package/dist/src/dashboard/spa.js.map +1 -0
  120. package/dist/src/declare.d.ts +85 -0
  121. package/dist/src/declare.d.ts.map +1 -0
  122. package/dist/src/declare.js +62 -0
  123. package/dist/src/declare.js.map +1 -0
  124. package/dist/src/define_config.d.ts +256 -0
  125. package/dist/src/define_config.d.ts.map +1 -0
  126. package/dist/src/define_config.js +90 -0
  127. package/dist/src/define_config.js.map +1 -0
  128. package/dist/src/durable.d.ts +29 -0
  129. package/dist/src/durable.d.ts.map +1 -0
  130. package/dist/src/durable.js +55 -0
  131. package/dist/src/durable.js.map +1 -0
  132. package/dist/src/enrichers.d.ts +51 -0
  133. package/dist/src/enrichers.d.ts.map +1 -0
  134. package/dist/src/enrichers.js +105 -0
  135. package/dist/src/enrichers.js.map +1 -0
  136. package/dist/src/events/buffer.d.ts +38 -0
  137. package/dist/src/events/buffer.d.ts.map +1 -0
  138. package/dist/src/events/buffer.js +86 -0
  139. package/dist/src/events/buffer.js.map +1 -0
  140. package/dist/src/events/event.d.ts +42 -0
  141. package/dist/src/events/event.d.ts.map +1 -0
  142. package/dist/src/events/event.js +82 -0
  143. package/dist/src/events/event.js.map +1 -0
  144. package/dist/src/http/browser.d.ts +33 -0
  145. package/dist/src/http/browser.d.ts.map +1 -0
  146. package/dist/src/http/browser.js +81 -0
  147. package/dist/src/http/browser.js.map +1 -0
  148. package/dist/src/http/browser_api.d.ts +48 -0
  149. package/dist/src/http/browser_api.d.ts.map +1 -0
  150. package/dist/src/http/browser_api.js +273 -0
  151. package/dist/src/http/browser_api.js.map +1 -0
  152. package/dist/src/http/browser_tokens.d.ts +27 -0
  153. package/dist/src/http/browser_tokens.d.ts.map +1 -0
  154. package/dist/src/http/browser_tokens.js +48 -0
  155. package/dist/src/http/browser_tokens.js.map +1 -0
  156. package/dist/src/http/control_plane.d.ts +58 -0
  157. package/dist/src/http/control_plane.d.ts.map +1 -0
  158. package/dist/src/http/control_plane.js +318 -0
  159. package/dist/src/http/control_plane.js.map +1 -0
  160. package/dist/src/http/csrf.d.ts +22 -0
  161. package/dist/src/http/csrf.d.ts.map +1 -0
  162. package/dist/src/http/csrf.js +24 -0
  163. package/dist/src/http/csrf.js.map +1 -0
  164. package/dist/src/http/edge_tag.d.ts +55 -0
  165. package/dist/src/http/edge_tag.d.ts.map +1 -0
  166. package/dist/src/http/edge_tag.js +45 -0
  167. package/dist/src/http/edge_tag.js.map +1 -0
  168. package/dist/src/http/flag_middleware.d.ts +27 -0
  169. package/dist/src/http/flag_middleware.d.ts.map +1 -0
  170. package/dist/src/http/flag_middleware.js +30 -0
  171. package/dist/src/http/flag_middleware.js.map +1 -0
  172. package/dist/src/http/flags_middleware.d.ts +20 -0
  173. package/dist/src/http/flags_middleware.d.ts.map +1 -0
  174. package/dist/src/http/flags_middleware.js +20 -0
  175. package/dist/src/http/flags_middleware.js.map +1 -0
  176. package/dist/src/http/subject_resolver.d.ts +45 -0
  177. package/dist/src/http/subject_resolver.d.ts.map +1 -0
  178. package/dist/src/http/subject_resolver.js +93 -0
  179. package/dist/src/http/subject_resolver.js.map +1 -0
  180. package/dist/src/identity.d.ts +82 -0
  181. package/dist/src/identity.d.ts.map +1 -0
  182. package/dist/src/identity.js +100 -0
  183. package/dist/src/identity.js.map +1 -0
  184. package/dist/src/index.d.ts +41 -0
  185. package/dist/src/index.d.ts.map +1 -0
  186. package/dist/src/index.js +34 -0
  187. package/dist/src/index.js.map +1 -0
  188. package/dist/src/manager.d.ts +154 -0
  189. package/dist/src/manager.d.ts.map +1 -0
  190. package/dist/src/manager.js +333 -0
  191. package/dist/src/manager.js.map +1 -0
  192. package/dist/src/openfeature/provider.d.ts +36 -0
  193. package/dist/src/openfeature/provider.d.ts.map +1 -0
  194. package/dist/src/openfeature/provider.js +82 -0
  195. package/dist/src/openfeature/provider.js.map +1 -0
  196. package/dist/src/relay/relay.d.ts +36 -0
  197. package/dist/src/relay/relay.d.ts.map +1 -0
  198. package/dist/src/relay/relay.js +73 -0
  199. package/dist/src/relay/relay.js.map +1 -0
  200. package/dist/src/relay/results_cache.d.ts +20 -0
  201. package/dist/src/relay/results_cache.d.ts.map +1 -0
  202. package/dist/src/relay/results_cache.js +31 -0
  203. package/dist/src/relay/results_cache.js.map +1 -0
  204. package/dist/src/relay/worker.d.ts +66 -0
  205. package/dist/src/relay/worker.d.ts.map +1 -0
  206. package/dist/src/relay/worker.js +177 -0
  207. package/dist/src/relay/worker.js.map +1 -0
  208. package/dist/src/ruleset_source.d.ts +73 -0
  209. package/dist/src/ruleset_source.d.ts.map +1 -0
  210. package/dist/src/ruleset_source.js +128 -0
  211. package/dist/src/ruleset_source.js.map +1 -0
  212. package/dist/src/runtime.d.ts +70 -0
  213. package/dist/src/runtime.d.ts.map +1 -0
  214. package/dist/src/runtime.js +301 -0
  215. package/dist/src/runtime.js.map +1 -0
  216. package/dist/src/schema.d.ts +39 -0
  217. package/dist/src/schema.d.ts.map +1 -0
  218. package/dist/src/schema.js +311 -0
  219. package/dist/src/schema.js.map +1 -0
  220. package/dist/src/services/accessor.d.ts +5 -0
  221. package/dist/src/services/accessor.d.ts.map +1 -0
  222. package/dist/src/services/accessor.js +20 -0
  223. package/dist/src/services/accessor.js.map +1 -0
  224. package/dist/src/sinks/clickhouse.d.ts +41 -0
  225. package/dist/src/sinks/clickhouse.d.ts.map +1 -0
  226. package/dist/src/sinks/clickhouse.js +117 -0
  227. package/dist/src/sinks/clickhouse.js.map +1 -0
  228. package/dist/src/sinks/lucid_sink.d.ts +25 -0
  229. package/dist/src/sinks/lucid_sink.d.ts.map +1 -0
  230. package/dist/src/sinks/lucid_sink.js +87 -0
  231. package/dist/src/sinks/lucid_sink.js.map +1 -0
  232. package/dist/src/sinks/parquet_sink.d.ts +41 -0
  233. package/dist/src/sinks/parquet_sink.d.ts.map +1 -0
  234. package/dist/src/sinks/parquet_sink.js +140 -0
  235. package/dist/src/sinks/parquet_sink.js.map +1 -0
  236. package/dist/src/sinks/posthog_sink.d.ts +29 -0
  237. package/dist/src/sinks/posthog_sink.d.ts.map +1 -0
  238. package/dist/src/sinks/posthog_sink.js +65 -0
  239. package/dist/src/sinks/posthog_sink.js.map +1 -0
  240. package/dist/src/sinks/sink.d.ts +36 -0
  241. package/dist/src/sinks/sink.d.ts.map +1 -0
  242. package/dist/src/sinks/sink.js +36 -0
  243. package/dist/src/sinks/sink.js.map +1 -0
  244. package/dist/src/sql.d.ts +33 -0
  245. package/dist/src/sql.d.ts.map +1 -0
  246. package/dist/src/sql.js +66 -0
  247. package/dist/src/sql.js.map +1 -0
  248. package/dist/src/stores/lucid_store.d.ts +55 -0
  249. package/dist/src/stores/lucid_store.d.ts.map +1 -0
  250. package/dist/src/stores/lucid_store.js +412 -0
  251. package/dist/src/stores/lucid_store.js.map +1 -0
  252. package/dist/src/stores/memory_store.d.ts +38 -0
  253. package/dist/src/stores/memory_store.d.ts.map +1 -0
  254. package/dist/src/stores/memory_store.js +166 -0
  255. package/dist/src/stores/memory_store.js.map +1 -0
  256. package/dist/src/stores/store.d.ts +166 -0
  257. package/dist/src/stores/store.d.ts.map +1 -0
  258. package/dist/src/stores/store.js +67 -0
  259. package/dist/src/stores/store.js.map +1 -0
  260. package/dist/src/subject.d.ts +25 -0
  261. package/dist/src/subject.d.ts.map +1 -0
  262. package/dist/src/subject.js +30 -0
  263. package/dist/src/subject.js.map +1 -0
  264. package/dist/src/testing/index.d.ts +31 -0
  265. package/dist/src/testing/index.d.ts.map +1 -0
  266. package/dist/src/testing/index.js +60 -0
  267. package/dist/src/testing/index.js.map +1 -0
  268. package/dist/src/topology/browser_token.d.ts +48 -0
  269. package/dist/src/topology/browser_token.d.ts.map +1 -0
  270. package/dist/src/topology/browser_token.js +128 -0
  271. package/dist/src/topology/browser_token.js.map +1 -0
  272. package/dist/src/topology/remote_source.d.ts +39 -0
  273. package/dist/src/topology/remote_source.d.ts.map +1 -0
  274. package/dist/src/topology/remote_source.js +184 -0
  275. package/dist/src/topology/remote_source.js.map +1 -0
  276. package/dist/src/topology/token.d.ts +36 -0
  277. package/dist/src/topology/token.d.ts.map +1 -0
  278. package/dist/src/topology/token.js +68 -0
  279. package/dist/src/topology/token.js.map +1 -0
  280. package/dist/src/topology/verify.d.ts +88 -0
  281. package/dist/src/topology/verify.d.ts.map +1 -0
  282. package/dist/src/topology/verify.js +128 -0
  283. package/dist/src/topology/verify.js.map +1 -0
  284. package/dist/src/transports/db_transport.d.ts +55 -0
  285. package/dist/src/transports/db_transport.d.ts.map +1 -0
  286. package/dist/src/transports/db_transport.js +202 -0
  287. package/dist/src/transports/db_transport.js.map +1 -0
  288. package/dist/src/transports/http_transport.d.ts +30 -0
  289. package/dist/src/transports/http_transport.d.ts.map +1 -0
  290. package/dist/src/transports/http_transport.js +51 -0
  291. package/dist/src/transports/http_transport.js.map +1 -0
  292. package/dist/src/transports/memory_transport.d.ts +29 -0
  293. package/dist/src/transports/memory_transport.d.ts.map +1 -0
  294. package/dist/src/transports/memory_transport.js +91 -0
  295. package/dist/src/transports/memory_transport.js.map +1 -0
  296. package/dist/src/transports/redis_transport.d.ts +50 -0
  297. package/dist/src/transports/redis_transport.d.ts.map +1 -0
  298. package/dist/src/transports/redis_transport.js +107 -0
  299. package/dist/src/transports/redis_transport.js.map +1 -0
  300. package/dist/src/transports/transport.d.ts +62 -0
  301. package/dist/src/transports/transport.d.ts.map +1 -0
  302. package/dist/src/transports/transport.js +2 -0
  303. package/dist/src/transports/transport.js.map +1 -0
  304. package/dist/src/types.d.ts +30 -0
  305. package/dist/src/types.d.ts.map +1 -0
  306. package/dist/src/types.js +2 -0
  307. package/dist/src/types.js.map +1 -0
  308. package/dist/src/usage.d.ts +18 -0
  309. package/dist/src/usage.d.ts.map +1 -0
  310. package/dist/src/usage.js +52 -0
  311. package/dist/src/usage.js.map +1 -0
  312. package/dist/stubs/config/flags.stub +50 -0
  313. package/dist/stubs/config/flags_dashboard.stub +35 -0
  314. package/dist/stubs/database/migrations/create_flags_tables.stub +27 -0
  315. package/dist/stubs/main.d.ts +3 -0
  316. package/dist/stubs/main.d.ts.map +1 -0
  317. package/dist/stubs/main.js +9 -0
  318. package/dist/stubs/main.js.map +1 -0
  319. package/package.json +181 -0
  320. package/skills/flags-basics/SKILL.md +142 -0
  321. package/skills/flags-deployment/SKILL.md +125 -0
  322. package/skills/flags-experiments/SKILL.md +99 -0
@@ -0,0 +1,539 @@
1
+ import { RULESET_SCHEMA_VERSION, validateRuleset, } from '@adonis-agora/flags-core';
2
+ import { fromData, toData } from './declare.js';
3
+ import { applyChange, } from './stores/store.js';
4
+ /** Flag keys: what URLs, SQL and code can all carry safely. */
5
+ const FLAG_KEY = /^[A-Za-z0-9_.-]{1,100}$/;
6
+ export class ValidationError extends Error {
7
+ issues;
8
+ code = 'E_FLAGS_INVALID';
9
+ constructor(issues) {
10
+ super(`invalid ruleset change:\n${issues.map((i) => ` ${i.path}: ${i.message}`).join('\n')}`);
11
+ this.issues = issues;
12
+ }
13
+ }
14
+ export class ForbiddenError extends Error {
15
+ code = 'E_FLAGS_FORBIDDEN';
16
+ }
17
+ /** The definition a declared flag starts with when it is first edited. */
18
+ export function definitionFromDeclaration(declaration) {
19
+ if (declaration.type === 'boolean') {
20
+ const on = declaration.default === true;
21
+ return {
22
+ variants: { on: true, off: false },
23
+ enabled: true,
24
+ offVariant: 'off',
25
+ fallthrough: { variant: on ? 'on' : 'off' },
26
+ };
27
+ }
28
+ if (declaration.type === 'string' && declaration.variants && declaration.variants.length > 0) {
29
+ return {
30
+ variants: Object.fromEntries(declaration.variants.map((v) => [v, v])),
31
+ enabled: true,
32
+ offVariant: String(declaration.default),
33
+ fallthrough: { variant: String(declaration.default) },
34
+ };
35
+ }
36
+ return {
37
+ variants: { default: declaration.default },
38
+ enabled: true,
39
+ offVariant: 'default',
40
+ fallthrough: { variant: 'default' },
41
+ };
42
+ }
43
+ /** Issues where a ruleset contradicts what the code declares (types, variant names). */
44
+ export function checkAgainstDeclarations(ruleset, declarations) {
45
+ const issues = [];
46
+ for (const [key, flag] of Object.entries(ruleset.flags)) {
47
+ const declaration = declarations[key];
48
+ if (!declaration)
49
+ continue;
50
+ for (const [variant, value] of Object.entries(flag.variants)) {
51
+ const type = Array.isArray(value) ? 'json' : value === null ? 'json' : typeof value;
52
+ const expected = declaration.type === 'json' ? 'json' : declaration.type;
53
+ const ok = expected === 'json' ? true : type === expected;
54
+ if (!ok) {
55
+ issues.push({
56
+ path: `flags.${key}.variants.${variant}`,
57
+ message: `is ${type}, the code declares ${declaration.type}`,
58
+ });
59
+ }
60
+ if (declaration.type === 'string' &&
61
+ declaration.variants &&
62
+ !declaration.variants.includes(String(value))) {
63
+ issues.push({
64
+ path: `flags.${key}.variants.${variant}`,
65
+ message: `value "${String(value)}" is not one of the declared variants (${declaration.variants.join(', ')})`,
66
+ });
67
+ }
68
+ }
69
+ }
70
+ return issues;
71
+ }
72
+ /**
73
+ * Every write to the ruleset goes through here: validation (structure and declared types),
74
+ * authorization, approvals, and the audit trail the store writes.
75
+ */
76
+ export class FlagsAdmin {
77
+ store;
78
+ options;
79
+ constructor(store, options) {
80
+ this.store = store;
81
+ this.options = options;
82
+ }
83
+ get environment() {
84
+ return this.options.environment;
85
+ }
86
+ get declarations() {
87
+ return this.options.declarations;
88
+ }
89
+ requiresApproval(environment) {
90
+ const envs = this.options.approvals?.environments;
91
+ return envs === true || (Array.isArray(envs) && envs.includes(environment));
92
+ }
93
+ /** Approvals mean nothing between anonymous actors: refuse them where approvals are on. */
94
+ #assertIdentified(actor, environment) {
95
+ if (actor.anonymous && this.requiresApproval(environment)) {
96
+ throw new ForbiddenError(`changes to "${environment}" need approval, so the person acting must be identified (sign in, or set \`actor\` in the console config)`);
97
+ }
98
+ }
99
+ async #authorize(actor, action, target) {
100
+ if (!this.options.authorize)
101
+ return;
102
+ if (!(await this.options.authorize(actor, action, target))) {
103
+ throw new ForbiddenError(`${actor.id} may not ${action} flags in ${target.environment}`);
104
+ }
105
+ }
106
+ /** The ruleset after `change`, validated. Throws {@link ValidationError}. */
107
+ async preview(change, environment = this.environment) {
108
+ const current = await this.store.readRuleset(environment);
109
+ const next = applyChange(current, change);
110
+ const issues = [...validateRuleset(next), ...checkAgainstDeclarations(next, this.declarations)];
111
+ // Only issues the change introduces block it; pre-existing ones are reported elsewhere.
112
+ const before = new Set([...validateRuleset(current), ...checkAgainstDeclarations(current, this.declarations)].map((i) => `${i.path}\u0000${i.message}`));
113
+ const introduced = issues.filter((i) => !before.has(`${i.path}\u0000${i.message}`));
114
+ if (introduced.length > 0)
115
+ throw new ValidationError(introduced);
116
+ return next;
117
+ }
118
+ /** Applies a change, or files a change request when the environment needs approval. */
119
+ async propose(change, actor, options = {}) {
120
+ const environment = options.environment ?? this.environment;
121
+ this.#assertIdentified(actor, environment);
122
+ await this.#authorize(actor, 'write', { environment, change });
123
+ await this.preview(change, environment);
124
+ if (this.requiresApproval(environment)) {
125
+ const request = await this.store.createChangeRequest({
126
+ environment,
127
+ change,
128
+ ...(options.note ? { note: options.note } : {}),
129
+ requestedBy: actor,
130
+ baseVersion: await this.store.version(environment),
131
+ });
132
+ return { status: 'pending', request };
133
+ }
134
+ const { version } = await this.store.apply(environment, change, actor);
135
+ this.options.onApplied?.(environment, version);
136
+ return { status: 'applied', version };
137
+ }
138
+ /** Approves and applies a pending request. The requester cannot approve their own. */
139
+ async approve(id, actor, note) {
140
+ const request = await this.store.getChangeRequest(id);
141
+ if (!request)
142
+ throw new Error(`change request ${id} not found`);
143
+ if (request.status !== 'pending')
144
+ throw new Error(`change request ${id} is ${request.status}`);
145
+ this.#assertIdentified(actor, request.environment);
146
+ if (request.requestedBy.id === actor.id) {
147
+ throw new ForbiddenError('a change cannot be approved by the person who requested it');
148
+ }
149
+ await this.#authorize(actor, 'approve', {
150
+ environment: request.environment,
151
+ request,
152
+ change: request.change,
153
+ });
154
+ // Re-validate against the CURRENT ruleset: it may have moved since the request was filed.
155
+ await this.preview(request.change, request.environment);
156
+ await this.store.updateChangeRequest(id, {
157
+ status: 'approved',
158
+ reviewedBy: actor,
159
+ reviewedAt: new Date(),
160
+ ...(note ? { reviewNote: note } : {}),
161
+ });
162
+ const { version } = await this.store.apply(request.environment, request.change, request.requestedBy, {
163
+ changeRequestId: id,
164
+ });
165
+ const applied = await this.store.updateChangeRequest(id, { status: 'applied' });
166
+ this.options.onApplied?.(request.environment, version);
167
+ return { version, request: applied };
168
+ }
169
+ async reject(id, actor, note) {
170
+ const request = await this.store.getChangeRequest(id);
171
+ if (!request)
172
+ throw new Error(`change request ${id} not found`);
173
+ if (request.status !== 'pending')
174
+ throw new Error(`change request ${id} is ${request.status}`);
175
+ this.#assertIdentified(actor, request.environment);
176
+ await this.#authorize(actor, 'approve', { environment: request.environment, request });
177
+ return this.store.updateChangeRequest(id, {
178
+ status: 'rejected',
179
+ reviewedBy: actor,
180
+ reviewedAt: new Date(),
181
+ ...(note ? { reviewNote: note } : {}),
182
+ });
183
+ }
184
+ async cancel(id, actor) {
185
+ const request = await this.store.getChangeRequest(id);
186
+ if (!request)
187
+ throw new Error(`change request ${id} not found`);
188
+ if (request.requestedBy.id !== actor.id)
189
+ throw new ForbiddenError('only the requester can cancel a change request');
190
+ if (request.status !== 'pending')
191
+ throw new Error(`change request ${id} is ${request.status}`);
192
+ return this.store.updateChangeRequest(id, { status: 'cancelled' });
193
+ }
194
+ /** The stored definition, or the one the declaration implies. */
195
+ async definition(key, environment = this.environment) {
196
+ const ruleset = await this.store.readRuleset(environment);
197
+ const existing = ruleset.flags[key];
198
+ if (existing)
199
+ return existing;
200
+ const declaration = this.declarations[key];
201
+ if (!declaration)
202
+ throw new Error(`flag "${key}" is neither in the ruleset nor declared in code`);
203
+ return definitionFromDeclaration(declaration);
204
+ }
205
+ /**
206
+ * Saves a flag's targeting. A console declaration already stored on the flag is kept when the new
207
+ * definition does not carry one, so editing targeting never drops a flag's type and default.
208
+ */
209
+ async saveFlag(key, definition, actor, options = {}) {
210
+ let value = definition;
211
+ if (!definition.declaration) {
212
+ const current = (await this.store.readRuleset(options.environment ?? this.environment)).flags[key];
213
+ if (current?.declaration)
214
+ value = { ...definition, declaration: current.declaration };
215
+ }
216
+ return this.propose({ entity: 'flag', key, value }, actor, options);
217
+ }
218
+ /**
219
+ * Creates a flag from the console: its declaration (type, default, metadata) and a starting
220
+ * targeting that serves the default to everyone. Refused when the key is declared in code or
221
+ * already exists in this environment.
222
+ */
223
+ async createFlag(key, declaration, actor, options = {}) {
224
+ if (!FLAG_KEY.test(key)) {
225
+ throw new ValidationError([
226
+ { path: 'key', message: 'use letters, digits, ".", "_" or "-" (1–100 characters)' },
227
+ ]);
228
+ }
229
+ if (this.declarations[key]) {
230
+ throw new ValidationError([
231
+ { path: 'key', message: `"${key}" is declared in code; configure it instead` },
232
+ ]);
233
+ }
234
+ const environment = options.environment ?? this.environment;
235
+ if ((await this.store.readRuleset(environment)).flags[key]) {
236
+ throw new ValidationError([
237
+ { path: 'key', message: `"${key}" already exists in ${environment}` },
238
+ ]);
239
+ }
240
+ const definition = {
241
+ ...definitionFromDeclaration(declaration),
242
+ declaration: toData(declaration),
243
+ };
244
+ return this.propose({ entity: 'flag', key, value: definition }, actor, options);
245
+ }
246
+ /** Changes a console flag's declaration (description, owner, expiry, default, …). */
247
+ async updateDeclaration(key, patch, actor, options = {}) {
248
+ if (this.declarations[key]) {
249
+ throw new ValidationError([
250
+ { path: 'key', message: `"${key}" is declared in code; change it there` },
251
+ ]);
252
+ }
253
+ const environment = options.environment ?? this.environment;
254
+ const current = (await this.store.readRuleset(environment)).flags[key];
255
+ if (!current?.declaration)
256
+ throw new Error(`flag "${key}" has no console declaration in ${environment}`);
257
+ if (patch.type !== undefined && patch.type !== current.declaration.type) {
258
+ throw new ValidationError([
259
+ {
260
+ path: 'declaration.type',
261
+ message: 'the type of an existing flag cannot change; create a new flag',
262
+ },
263
+ ]);
264
+ }
265
+ const declaration = toData({ ...fromData(current.declaration), ...patch });
266
+ return this.propose({ entity: 'flag', key, value: { ...current, declaration } }, actor, options);
267
+ }
268
+ deleteFlag(key, actor, options) {
269
+ return this.propose({ entity: 'flag', key, value: null }, actor, options);
270
+ }
271
+ /**
272
+ * The kill switch: `false` serves `offVariant` to everyone regardless of targeting; `true` turns
273
+ * targeting back on. To serve `on` to everyone, use {@link turnOn}.
274
+ */
275
+ async setEnabled(key, enabled, actor, options = {}) {
276
+ const definition = await this.definition(key, options.environment);
277
+ return this.saveFlag(key, { ...definition, enabled }, actor, options);
278
+ }
279
+ /** Boolean flags: serves `on` to everyone (targeting rules and overrides still apply first). */
280
+ turnOn(key, actor, options = {}) {
281
+ return this.setVariant(key, 'on', actor, options);
282
+ }
283
+ /** Boolean flags: serves `off` to everyone not matched by a rule or override. */
284
+ turnOff(key, actor, options = {}) {
285
+ return this.setVariant(key, 'off', actor, options);
286
+ }
287
+ /** Serves one variant to everyone (clears any split on the fallthrough). */
288
+ async setVariant(key, variant, actor, options = {}) {
289
+ const definition = await this.definition(key, options.environment);
290
+ return this.saveFlag(key, { ...definition, enabled: true, fallthrough: { variant } }, actor, options);
291
+ }
292
+ /**
293
+ * Serves `value` to everyone: the variant with that value when there is one, else a new variant
294
+ * named after it. For number, string and JSON flags without a variant for the value yet
295
+ * (`node ace flags:set max_uploads 25`).
296
+ */
297
+ async setValue(key, value, actor, options = {}) {
298
+ const definition = await this.definition(key, options.environment);
299
+ const same = JSON.stringify(value);
300
+ let variant = Object.keys(definition.variants).find((name) => JSON.stringify(definition.variants[name]) === same);
301
+ const variants = { ...definition.variants };
302
+ if (!variant) {
303
+ variant = typeof value === 'string' ? value : same;
304
+ variants[variant] = value;
305
+ }
306
+ return this.saveFlag(key, { ...definition, variants, enabled: true, fallthrough: { variant } }, actor, options);
307
+ }
308
+ /**
309
+ * Percentage rollout of a boolean flag: `percent`% get `on`. Keeps the `on` arm first so raising
310
+ * the percentage only adds people (see `pickVariant`).
311
+ */
312
+ async setRollout(key, percent, actor, options = {}) {
313
+ if (!(percent >= 0 && percent <= 100))
314
+ throw new RangeError('percent must be between 0 and 100');
315
+ const definition = await this.definition(key, options.environment);
316
+ if (!Object.hasOwn(definition.variants, 'on') || !Object.hasOwn(definition.variants, 'off')) {
317
+ throw new Error(`flag "${key}" is not an on/off flag; edit its split instead`);
318
+ }
319
+ const fallthrough = percent === 100
320
+ ? { variant: 'on' }
321
+ : percent === 0
322
+ ? { variant: 'off' }
323
+ : {
324
+ split: [
325
+ { variant: 'on', weight: Math.round(percent * 100) },
326
+ { variant: 'off', weight: 10_000 - Math.round(percent * 100) },
327
+ ],
328
+ };
329
+ return this.saveFlag(key, { ...definition, enabled: true, fallthrough }, actor, options);
330
+ }
331
+ /** Forces a variant for one subject (`null` removes the override). */
332
+ async setOverride(key, subject, variant, actor, options = {}) {
333
+ const definition = await this.definition(key, options.environment);
334
+ const overrides = { ...(definition.overrides ?? {}) };
335
+ if (variant === null)
336
+ delete overrides[subject];
337
+ else
338
+ overrides[subject] = variant;
339
+ return this.saveFlag(key, { ...definition, overrides }, actor, options);
340
+ }
341
+ // ── Scheduling ────────────────────────────────────────────────────────────
342
+ async schedule(input, actor) {
343
+ const environment = input.environment ?? this.environment;
344
+ await this.#authorize(actor, 'write', { environment });
345
+ if (input.kind === 'rollout' &&
346
+ !(Number(input.payload.percent) >= 0 && Number(input.payload.percent) <= 100)) {
347
+ throw new RangeError('a rollout schedule needs payload.percent between 0 and 100');
348
+ }
349
+ return this.store.createSchedule({ ...input, environment, createdBy: actor });
350
+ }
351
+ /** A gradual rollout: one schedule per step (`[{ at, percent }]`). */
352
+ async scheduleRollout(key, steps, actor, options = {}) {
353
+ const out = [];
354
+ for (const step of [...steps].sort((a, b) => a.at.getTime() - b.at.getTime())) {
355
+ out.push(await this.schedule({
356
+ flag: key,
357
+ kind: 'rollout',
358
+ payload: { percent: step.percent },
359
+ runAt: step.at,
360
+ ...options,
361
+ }, actor));
362
+ }
363
+ return out;
364
+ }
365
+ async cancelSchedule(id, actor) {
366
+ const schedule = await this.store.getSchedule(id);
367
+ if (!schedule)
368
+ throw new Error(`schedule ${id} not found`);
369
+ await this.#authorize(actor, 'write', { environment: schedule.environment });
370
+ if (schedule.status !== 'pending')
371
+ throw new Error(`schedule ${id} is ${schedule.status}`);
372
+ return this.store.updateSchedule(id, { status: 'cancelled' });
373
+ }
374
+ /**
375
+ * Executes due schedules. Each is claimed atomically, so replicas running this concurrently apply
376
+ * each step once. Scheduled changes skip approvals: they were authorized when scheduled.
377
+ */
378
+ async runDueSchedules(now = new Date()) {
379
+ const due = await this.store.listSchedules({ status: 'pending', dueBefore: now, limit: 100 });
380
+ const results = [];
381
+ for (const schedule of due) {
382
+ if (!(await this.store.claimSchedule(schedule.id)))
383
+ continue;
384
+ const actor = {
385
+ id: `schedule:${schedule.id}`,
386
+ name: `scheduled by ${schedule.createdBy.id}`,
387
+ };
388
+ try {
389
+ const definition = await this.definition(schedule.flag, schedule.environment);
390
+ let change;
391
+ if (schedule.kind === 'enable' || schedule.kind === 'disable') {
392
+ change = {
393
+ entity: 'flag',
394
+ key: schedule.flag,
395
+ value: { ...definition, enabled: schedule.kind === 'enable' },
396
+ };
397
+ }
398
+ else if (schedule.kind === 'rollout') {
399
+ const percent = Number(schedule.payload.percent);
400
+ change = {
401
+ entity: 'flag',
402
+ key: schedule.flag,
403
+ value: {
404
+ ...definition,
405
+ enabled: true,
406
+ fallthrough: percent >= 100
407
+ ? { variant: 'on' }
408
+ : percent <= 0
409
+ ? { variant: 'off' }
410
+ : {
411
+ split: [
412
+ { variant: 'on', weight: Math.round(percent * 100) },
413
+ { variant: 'off', weight: 10_000 - Math.round(percent * 100) },
414
+ ],
415
+ },
416
+ },
417
+ };
418
+ }
419
+ else {
420
+ if (!schedule.payload.change)
421
+ throw new Error('a change schedule needs payload.change');
422
+ change = schedule.payload.change;
423
+ }
424
+ await this.preview(change, schedule.environment);
425
+ const { version } = await this.store.apply(schedule.environment, change, actor);
426
+ this.options.onApplied?.(schedule.environment, version);
427
+ await this.store.updateSchedule(schedule.id, { status: 'done', executedAt: new Date() });
428
+ results.push({ id: schedule.id, ok: true });
429
+ }
430
+ catch (error) {
431
+ const message = error instanceof Error ? error.message : String(error);
432
+ await this.store.updateSchedule(schedule.id, {
433
+ status: 'failed',
434
+ error: message,
435
+ executedAt: new Date(),
436
+ });
437
+ results.push({ id: schedule.id, ok: false, error: message });
438
+ }
439
+ }
440
+ return results;
441
+ }
442
+ // ── Import / export / promote ─────────────────────────────────────────────
443
+ async exportRuleset(environment = this.environment) {
444
+ return this.store.readRuleset(environment);
445
+ }
446
+ async importRuleset(ruleset, actor, options = {}) {
447
+ if (ruleset.schemaVersion !== undefined && ruleset.schemaVersion > RULESET_SCHEMA_VERSION) {
448
+ throw new ValidationError([
449
+ { path: 'schemaVersion', message: `this version supports up to ${RULESET_SCHEMA_VERSION}` },
450
+ ]);
451
+ }
452
+ return this.propose({
453
+ entity: 'ruleset',
454
+ value: {
455
+ flags: ruleset.flags,
456
+ segments: ruleset.segments ?? {},
457
+ layers: ruleset.layers ?? {},
458
+ ...(ruleset.holdout ? { holdout: ruleset.holdout } : {}),
459
+ },
460
+ }, actor, options);
461
+ }
462
+ /** Copies one environment's ruleset over another's (staging → production). */
463
+ async promote(from, to, actor, note) {
464
+ await this.#authorize(actor, 'read', { environment: from });
465
+ const source = await this.store.readRuleset(from);
466
+ return this.importRuleset(source, actor, { environment: to, ...(note ? { note } : {}) });
467
+ }
468
+ // ── Hygiene ───────────────────────────────────────────────────────────────
469
+ /**
470
+ * Flags that probably should be removed: not evaluated for `unusedDays` (`unused`), past their
471
+ * declared expiry (`expired`), serving one value to everyone for `staticDays` — fully rolled out
472
+ * or killed (`static`), or in the ruleset but declared by no app (`undeclared`).
473
+ */
474
+ async stale(options = {}) {
475
+ const environment = options.environment ?? this.environment;
476
+ const now = options.now ?? new Date();
477
+ const unusedDays = options.unusedDays ?? 30;
478
+ const staticDays = options.staticDays ?? 30;
479
+ const since = new Date(now.getTime() - 90 * 86_400_000).toISOString().slice(0, 10);
480
+ const [ruleset, usage, declaredRows] = await Promise.all([
481
+ this.store.readRuleset(environment),
482
+ this.store.usage({ environment, since }),
483
+ this.store.declarations(),
484
+ ]);
485
+ const lastSeen = new Map();
486
+ for (const row of usage) {
487
+ if (row.evaluations > 0 && (lastSeen.get(row.flag) ?? '') < row.day)
488
+ lastSeen.set(row.flag, row.day);
489
+ }
490
+ const declared = new Map(Object.entries(this.declarations));
491
+ for (const [key, definition] of Object.entries(ruleset.flags)) {
492
+ if (definition.declaration && !declared.has(key))
493
+ declared.set(key, fromData(definition.declaration));
494
+ }
495
+ for (const row of declaredRows)
496
+ if (!declared.has(row.key))
497
+ declared.set(row.key, row.declaration);
498
+ const unusedCutoff = new Date(now.getTime() - unusedDays * 86_400_000)
499
+ .toISOString()
500
+ .slice(0, 10);
501
+ const staticCutoff = now.getTime() - staticDays * 86_400_000;
502
+ const keys = new Set([...Object.keys(ruleset.flags), ...declared.keys()]);
503
+ const out = [];
504
+ for (const key of [...keys].sort()) {
505
+ const reasons = [];
506
+ const declaration = declared.get(key);
507
+ const definition = ruleset.flags[key];
508
+ const seen = lastSeen.get(key);
509
+ if (!seen || seen < unusedCutoff)
510
+ reasons.push('unused');
511
+ if (declaration?.expiresAt && new Date(declaration.expiresAt).getTime() < now.getTime())
512
+ reasons.push('expired');
513
+ if (definition && !declaration)
514
+ reasons.push('undeclared');
515
+ if (definition) {
516
+ const isStatic = !definition.enabled ||
517
+ ((definition.rules?.length ?? 0) === 0 &&
518
+ Object.keys(definition.overrides ?? {}).length === 0 &&
519
+ 'variant' in definition.fallthrough);
520
+ if (isStatic) {
521
+ const lastChange = (await this.store.audit({ environment, entity: 'flag', key, limit: 1 }))[0];
522
+ if (!lastChange || lastChange.at.getTime() < staticCutoff)
523
+ reasons.push('static');
524
+ }
525
+ }
526
+ if (reasons.length > 0) {
527
+ out.push({
528
+ key,
529
+ reasons,
530
+ ...(seen ? { lastEvaluated: seen } : {}),
531
+ ...(declaration?.expiresAt ? { expiresAt: declaration.expiresAt } : {}),
532
+ ...(declaration?.owner ? { owner: declaration.owner } : {}),
533
+ });
534
+ }
535
+ }
536
+ return out;
537
+ }
538
+ }
539
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/admin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { MetricDefinition, VariantMetricStats } from './metrics.js';
2
+ /**
3
+ * Where experiment numbers come from. DESIGN §12: the backend only aggregates — per-variant
4
+ * sufficient statistics — and the inference runs once, in TypeScript (`flags-core/stats`), so every
5
+ * backend reports the same results for the same data.
6
+ */
7
+ export interface AnalyticsBackend {
8
+ readonly kind: string;
9
+ /** Subjects exposed to the experiment in `environment`, per variant. */
10
+ exposures(experiment: string, environment: string): Promise<Record<string, number>>;
11
+ /** One metric's statistics per variant, over every exposed subject (zeros included). */
12
+ metric(experiment: string, definition: MetricDefinition, environment: string): Promise<Record<string, VariantMetricStats>>;
13
+ close?(): Promise<void>;
14
+ }
15
+ export declare function emptyStats(): VariantMetricStats;
16
+ /** Maps a backend row (any numeric representation) to {@link VariantMetricStats}. */
17
+ export declare function statsFromRow(row: Record<string, unknown>): VariantMetricStats;
18
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../../src/analytics/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEzE;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpF,wFAAwF;IACxF,MAAM,CACJ,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,gBAAgB,EAC5B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,wBAAgB,UAAU,IAAI,kBAAkB,CAE/C;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CAgB7E"}
@@ -0,0 +1,25 @@
1
+ export function emptyStats() {
2
+ return { n: 0, sumY: 0, sumY2: 0, sumX: 0, sumX2: 0, sumXY: 0 };
3
+ }
4
+ /** Maps a backend row (any numeric representation) to {@link VariantMetricStats}. */
5
+ export function statsFromRow(row) {
6
+ const n = (key) => {
7
+ const value = row[key];
8
+ if (typeof value === 'number')
9
+ return value;
10
+ if (typeof value === 'bigint')
11
+ return Number(value);
12
+ if (typeof value === 'string')
13
+ return Number(value);
14
+ return 0;
15
+ };
16
+ return {
17
+ n: n('n'),
18
+ sumY: n('sum_y'),
19
+ sumY2: n('sum_y2'),
20
+ sumX: n('sum_x'),
21
+ sumX2: n('sum_x2'),
22
+ sumXY: n('sum_xy'),
23
+ };
24
+ }
25
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../../src/analytics/backend.ts"],"names":[],"mappings":"AAoBA,MAAM,UAAU,UAAU;IACxB,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAC,GAA4B;IACvD,MAAM,CAAC,GAAG,CAAC,GAAW,EAAE,EAAE;QACxB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IACF,OAAO;QACL,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;QACT,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC;QAChB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC;QAClB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC;QAChB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC;QAClB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC;KACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { ClickHouseClient, type ClickHouseOptions } from '../sinks/clickhouse.js';
2
+ import { type AnalyticsBackend } from './backend.js';
3
+ import { type MetricDefinition, type VariantMetricStats } from './metrics.js';
4
+ /**
5
+ * Level 3 of DESIGN §12: reads the table the `clickhouse` sink writes. Queries use `FINAL` so
6
+ * re-sent events are collapsed even before ClickHouse merges them.
7
+ */
8
+ export declare class ClickHouseBackend implements AnalyticsBackend {
9
+ #private;
10
+ readonly kind = "clickhouse";
11
+ readonly client: ClickHouseClient;
12
+ constructor(options: ClickHouseOptions);
13
+ exposures(experiment: string, environment: string): Promise<Record<string, number>>;
14
+ metric(experiment: string, definition: MetricDefinition, environment: string): Promise<Record<string, VariantMetricStats>>;
15
+ }
16
+ //# sourceMappingURL=clickhouse_backend.d.ts.map