@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,62 @@
1
+ /** Builders for flag declarations, used in `config/flags.ts`. */
2
+ export const flag = {
3
+ /** An on/off flag. */
4
+ boolean(options) {
5
+ return { ...options, type: 'boolean' };
6
+ },
7
+ /**
8
+ * A string flag. With `variants`, the flag is a multivariate experiment and its type narrows to
9
+ * the listed names.
10
+ */
11
+ string(options) {
12
+ if (options.variants && !options.variants.includes(options.default)) {
13
+ throw new Error(`flag default "${options.default}" is not one of its variants`);
14
+ }
15
+ return { ...options, type: 'string' };
16
+ },
17
+ /** A numeric flag (limits, thresholds, percentages). */
18
+ number(options) {
19
+ return { ...options, type: 'number' };
20
+ },
21
+ /** A JSON payload flag (configuration objects). */
22
+ json(options) {
23
+ return { ...options, type: 'json' };
24
+ },
25
+ };
26
+ /** A JSON-safe copy of the declarations, as pushed to a control-plane and shown in the console. */
27
+ export function serializeDeclarations(declarations) {
28
+ return JSON.parse(JSON.stringify(declarations));
29
+ }
30
+ /**
31
+ * Every flag this app knows about: declared in code, or created in the console (the declaration
32
+ * travels in the ruleset). Code wins when both exist.
33
+ */
34
+ export function effectiveDeclarations(code, ruleset) {
35
+ const out = {};
36
+ for (const [key, definition] of Object.entries(ruleset.flags)) {
37
+ if (definition.declaration)
38
+ out[key] = { ...fromData(definition.declaration), source: 'console' };
39
+ }
40
+ for (const [key, declaration] of Object.entries(code))
41
+ out[key] = { ...declaration, source: 'code' };
42
+ return out;
43
+ }
44
+ /** A ruleset declaration as a {@link FlagDeclaration}. */
45
+ export function fromData(data) {
46
+ return { ...data };
47
+ }
48
+ /** A {@link FlagDeclaration} as ruleset data (what the console stores). */
49
+ export function toData(declaration) {
50
+ const { type, default: value, variants, description, owner, expiresAt, tags, client, } = declaration;
51
+ return {
52
+ type,
53
+ default: value,
54
+ ...(variants ? { variants: [...variants] } : {}),
55
+ ...(description ? { description } : {}),
56
+ ...(owner ? { owner } : {}),
57
+ ...(expiresAt ? { expiresAt } : {}),
58
+ ...(tags?.length ? { tags: [...tags] } : {}),
59
+ ...(client !== undefined ? { client } : {}),
60
+ };
61
+ }
62
+ //# sourceMappingURL=declare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"declare.js","sourceRoot":"","sources":["../../src/declare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,256 @@
1
+ import type { HttpContext } from '@adonisjs/core/http';
2
+ import type { ApplicationService } from '@adonisjs/core/types';
3
+ import type { AdminAuthorizer, ApprovalsConfig } from './admin.js';
4
+ import type { AnalyticsBackend } from './analytics/backend.js';
5
+ import { type DuckDbOptions } from './analytics/duckdb.js';
6
+ import type { MetricDefinition } from './analytics/metrics.js';
7
+ import type { FlagDeclaration } from './declare.js';
8
+ import type { Enricher } from './enrichers.js';
9
+ import type { BufferOptions } from './events/buffer.js';
10
+ import type { FlagEvent } from './events/event.js';
11
+ import type { FlagsIdentityProvider } from './identity.js';
12
+ import type { RelayOptions } from './relay/relay.js';
13
+ import { type ClickHouseOptions } from './sinks/clickhouse.js';
14
+ import { type ParquetSinkOptions } from './sinks/parquet_sink.js';
15
+ import { type PostHogSinkOptions } from './sinks/posthog_sink.js';
16
+ import { type Sink } from './sinks/sink.js';
17
+ import type { SqlDatabase } from './sql.js';
18
+ import { MemoryStore } from './stores/memory_store.js';
19
+ import type { FlagsStore } from './stores/store.js';
20
+ import type { Subject, SubjectLike } from './subject.js';
21
+ import type { TokenSource } from './topology/token.js';
22
+ import type { TenantVerifier, UserVerifier } from './topology/verify.js';
23
+ import { type DbTransportOptions } from './transports/db_transport.js';
24
+ import { type RedisStreamClient, type RedisTransportOptions } from './transports/redis_transport.js';
25
+ import type { Transport } from './transports/transport.js';
26
+ /** What factories receive: the app and lazy access to its database and Redis connections. */
27
+ export interface FactoryContext {
28
+ app?: ApplicationService;
29
+ /** The application's name (its package.json `name`), the default `app` stamped on events. */
30
+ appName?: string | undefined;
31
+ /** A Lucid query client for `connection` (default connection when omitted). */
32
+ db(connection?: string): Promise<SqlDatabase>;
33
+ redis(connection?: string): Promise<RedisStreamClient>;
34
+ autoCreateSchema: boolean;
35
+ partitionEvents: boolean;
36
+ }
37
+ export type Factory<T> = (context: FactoryContext) => T | Promise<T>;
38
+ export declare const stores: {
39
+ /** The ruleset in your database (Postgres, MySQL, SQLite). The default. */
40
+ lucid(options?: {
41
+ connection?: string;
42
+ }): Factory<FlagsStore>;
43
+ /** In process memory: tests and local development. */
44
+ memory(seed?: ConstructorParameters<typeof MemoryStore>[0]): Factory<FlagsStore>;
45
+ };
46
+ export declare const transports: {
47
+ /** The event log in your database. Transactional; the default when the store is `lucid`. */
48
+ db(options?: DbTransportOptions & {
49
+ connection?: string;
50
+ }): Factory<Transport>;
51
+ /** Redis Streams through `@adonisjs/redis`. */
52
+ redis(options?: RedisTransportOptions & {
53
+ connection?: string;
54
+ }): Factory<Transport>;
55
+ /** In process memory: tests and local development. */
56
+ memory(): Factory<Transport>;
57
+ };
58
+ export declare const sinks: {
59
+ /** Analysis tables in your database (`flags_exposures`, `flags_tracks`); read by `analytics.lucid()`. */
60
+ lucid(options?: {
61
+ connection?: string;
62
+ batchSize?: number;
63
+ intervalMs?: number;
64
+ }): Factory<Sink>;
65
+ posthog(options: PostHogSinkOptions): Factory<Sink>;
66
+ clickhouse(options: ClickHouseOptions & {
67
+ batchSize?: number;
68
+ intervalMs?: number;
69
+ autoCreateSchema?: boolean;
70
+ }): Factory<Sink>;
71
+ /** Parquet files through DuckDB (`@duckdb/node-api`); read by `analytics.duckdb()`. */
72
+ parquet(options: ParquetSinkOptions): Factory<Sink>;
73
+ /** Your function receives every batch. Must be idempotent by `event.id`. */
74
+ callback(fn: (events: FlagEvent[]) => Promise<void>, options?: {
75
+ batchSize?: number;
76
+ intervalMs?: number;
77
+ }): Factory<Sink>;
78
+ memory(): Factory<Sink>;
79
+ };
80
+ export declare const analytics: {
81
+ lucid(options?: {
82
+ connection?: string;
83
+ }): Factory<AnalyticsBackend>;
84
+ duckdb(options: DuckDbOptions & {
85
+ path: string;
86
+ }): Factory<AnalyticsBackend>;
87
+ clickhouse(options: ClickHouseOptions): Factory<AnalyticsBackend>;
88
+ };
89
+ /** An experiment's analysis: which metrics decide it and which must not regress. */
90
+ export interface ExperimentConfig {
91
+ metrics: string[];
92
+ guardrails?: string[];
93
+ /** Control variant. Default: the flag's `offVariant`. */
94
+ control?: string;
95
+ /** Confidence for fixed-horizon tests. Default 0.95. */
96
+ confidence?: number;
97
+ /** The flag that assigns it, when the experiment key differs from the flag key. */
98
+ flag?: string;
99
+ }
100
+ interface BaseConfig<F extends Record<string, FlagDeclaration>> {
101
+ /** Flags declared in code: types and defaults. Targeting lives in the store. */
102
+ flags: F;
103
+ /** Name stamped on events (a tenant uses its `partition`). Default: the app's name. */
104
+ app?: string;
105
+ /** Which environment's ruleset this process reads. Default `production`. */
106
+ environment?: string;
107
+ /** Which part of a split deployment this process is. Default `all`. See the ecosystem spec. */
108
+ role?: 'all' | 'api' | 'worker';
109
+ /** How background work (relay, schedules, results) runs. Default `auto`. */
110
+ dispatcher?: 'auto' | 'durable' | 'in-process';
111
+ events?: {
112
+ buffer?: BufferOptions;
113
+ };
114
+ enrichers?: Enricher[];
115
+ /**
116
+ * How flags learns who people are: the subject of `ctx.flags`, the console's actor and access, and
117
+ * who may change what. `identities.authkit()`, `identities.adonisAuth({ … })`, or your own
118
+ * `FlagsIdentityProvider`. Default: the authkit identity when `@adonis-agora/authkit-client` is
119
+ * installed, else `ctx.auth.user`; the console keeps its own defaults.
120
+ */
121
+ identity?: FlagsIdentityProvider;
122
+ /**
123
+ * The subject of `ctx.flags`, overriding `identity`. Default: the identity provider's, else the
124
+ * authkit identity, else `ctx.auth.user`, else anonymous.
125
+ */
126
+ subject?: (ctx: HttpContext) => SubjectLike | Promise<SubjectLike>;
127
+ /** Extra targeting attributes for every subject. Server-side state only. */
128
+ attributes?: (subject: Subject) => Record<string, unknown> | Promise<Record<string, unknown>>;
129
+ /** Count evaluations per flag for stale-flag detection. Default `true`. */
130
+ usage?: boolean;
131
+ /**
132
+ * Frontends that read flags straight from the flags API (`remoteFlags` in
133
+ * `@adonis-agora/flags-react`). Turns on, in every topology, the token endpoint
134
+ * (`GET /_flags/token`): it signs the same subject `ctx.flags` uses — the authkit identity, or your
135
+ * `subject` resolver — into a short-lived token. On standalone and control-plane apps it also
136
+ * serves the flags API the token is for (`<prefix>/v1/client/*`).
137
+ */
138
+ browser?: BrowserConfig;
139
+ }
140
+ export interface BrowserConfig {
141
+ /** Path of the token endpoint on this app. Default `/_flags/token`; `false` to mount none. */
142
+ tokenRoute?: string | false;
143
+ /** Token lifetime in seconds. Default 300. */
144
+ ttlSeconds?: number;
145
+ /**
146
+ * The flags API URL handed to the browser with each token. Default: this app's `/_flags`
147
+ * (standalone, control-plane) or `tenant.url` (tenant). Set it when browsers reach the flags
148
+ * server under another address than the app does.
149
+ */
150
+ publicUrl?: string;
151
+ /** Standalone and control-plane: route prefix of the flags API. Default `/_flags` (or `controlPlane.prefix`). */
152
+ prefix?: string;
153
+ /** Standalone and control-plane: origins allowed to call the flags API cross-origin. */
154
+ corsOrigins?: string[];
155
+ /**
156
+ * Standalone and control-plane: secret the per-app signing keys derive from. Default: the app key
157
+ * (`APP_KEY`). Rotating it invalidates outstanding tokens; frontends fetch new ones.
158
+ */
159
+ secret?: string;
160
+ /**
161
+ * Standalone and control-plane: also accept tokens this package did not mint — e.g.
162
+ * `userVerifiers.authkit(...)` for authkit access tokens held by mobile apps.
163
+ */
164
+ verifyUser?: UserVerifier;
165
+ }
166
+ interface OwnedStateConfig {
167
+ /** Where the ruleset lives. Default `stores.lucid()`. */
168
+ store?: Factory<FlagsStore>;
169
+ /** Default: `db` with a lucid store, `memory` with a memory store. */
170
+ transport?: Factory<Transport>;
171
+ /** Event destinations, by name. Default `{ warehouse: sinks.lucid() }` with a lucid store. */
172
+ sinks?: Record<string, Factory<Sink>>;
173
+ relay?: RelayOptions & {
174
+ /** How often each sink is drained (ms). Default 5000. */
175
+ intervalMs?: number;
176
+ };
177
+ /** Ruleset reload: poll interval and Postgres notifications. */
178
+ refresh?: {
179
+ intervalMs?: number;
180
+ notify?: boolean;
181
+ };
182
+ /** Where experiment numbers come from. Default `analytics.lucid()` when the lucid sink exists. */
183
+ analytics?: Factory<AnalyticsBackend>;
184
+ metrics?: Record<string, MetricDefinition>;
185
+ /** Experiment key → its metrics. */
186
+ experiments?: Record<string, ExperimentConfig>;
187
+ /**
188
+ * Environments whose experiment results the worker recomputes. Default: this process's
189
+ * `environment`. Events carry their environment, so staging traffic never mixes with production.
190
+ */
191
+ resultsEnvironments?: string[];
192
+ /** How often the worker recomputes experiment results (ms). Default 600000. */
193
+ resultsIntervalMs?: number;
194
+ /**
195
+ * Keep subjects on the variant they were first exposed to when weights change. Reads the
196
+ * subject's exposures once per request from the lucid sink's table. Default `false`.
197
+ */
198
+ sticky?: boolean;
199
+ /** Events older than this (days) are pruned from the `db` transport once every sink has them. Default 30. */
200
+ retentionDays?: number;
201
+ /** Who may change flags (console, commands, admin API). */
202
+ authorize?: AdminAuthorizer;
203
+ /** Environments whose changes need a second person's approval. */
204
+ approvals?: ApprovalsConfig;
205
+ /** Create the tables at boot. Default `true` (the ecosystem convention). */
206
+ autoCreateSchema?: boolean;
207
+ /** Postgres: partition the event log by month. Default `false`. Decide before first boot. */
208
+ partitionEvents?: boolean;
209
+ /** Push ruleset changes to browsers through `@adonisjs/transmit`. Default `false`. */
210
+ realtime?: {
211
+ channel?: string;
212
+ } | boolean;
213
+ }
214
+ export interface StandaloneConfig<F extends Record<string, FlagDeclaration>> extends BaseConfig<F>, OwnedStateConfig {
215
+ topology?: 'standalone';
216
+ }
217
+ export interface ControlPlaneConfig<F extends Record<string, FlagDeclaration>> extends BaseConfig<F>, OwnedStateConfig {
218
+ topology: 'control-plane';
219
+ controlPlane: {
220
+ /** Route prefix. Default `/_flags`. */
221
+ prefix?: string;
222
+ /** Validates tenant tokens; derive the tenant from the token, never the body. */
223
+ verifyTenant: TenantVerifier;
224
+ /** Serve the OpenFeature Remote Evaluation Protocol. Default `true`. */
225
+ ofrep?: boolean;
226
+ /** Origins allowed to call OFREP from browsers. Default: none (no CORS headers). */
227
+ corsOrigins?: string[];
228
+ };
229
+ }
230
+ export interface TenantConfig<F extends Record<string, FlagDeclaration>> extends BaseConfig<F> {
231
+ topology: 'tenant';
232
+ /** The control-plane connection. */
233
+ tenant: {
234
+ url: string;
235
+ /** A token source (`tokens.clientCredentials(...)`) or a fixed secret. */
236
+ token: TokenSource | string;
237
+ /** This app's name on the control-plane. */
238
+ partition: string;
239
+ /** File for the last ruleset received (served when the control-plane is down at boot). */
240
+ snapshotPath?: string;
241
+ stream?: boolean;
242
+ intervalMs?: number;
243
+ capabilities?: string[];
244
+ };
245
+ /** FORBIDDEN on a tenant: it owns no state; everything lives on the control-plane. */
246
+ store?: never;
247
+ transport?: never;
248
+ sinks?: never;
249
+ analytics?: never;
250
+ approvals?: never;
251
+ }
252
+ export type FlagsConfig<F extends Record<string, FlagDeclaration> = Record<string, FlagDeclaration>> = StandaloneConfig<F> | ControlPlaneConfig<F> | TenantConfig<F>;
253
+ /** Identity helper that types `config/flags.ts`. */
254
+ export declare function defineConfig<const F extends Record<string, FlagDeclaration>>(config: FlagsConfig<F>): FlagsConfig<F>;
255
+ export {};
256
+ //# sourceMappingURL=define_config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { ClickHouseBackend } from './analytics/clickhouse_backend.js';
2
+ import { DuckDbBackend } from './analytics/duckdb.js';
3
+ import { LucidBackend } from './analytics/lucid_backend.js';
4
+ import { ClickHouseSink } from './sinks/clickhouse.js';
5
+ import { LucidSink } from './sinks/lucid_sink.js';
6
+ import { ParquetSink } from './sinks/parquet_sink.js';
7
+ import { PostHogSink } from './sinks/posthog_sink.js';
8
+ import { CallbackSink, MemorySink } from './sinks/sink.js';
9
+ import { LucidStore } from './stores/lucid_store.js';
10
+ import { MemoryStore } from './stores/memory_store.js';
11
+ import { DbTransport } from './transports/db_transport.js';
12
+ import { MemoryTransport } from './transports/memory_transport.js';
13
+ import { RedisTransport, } from './transports/redis_transport.js';
14
+ export const stores = {
15
+ /** The ruleset in your database (Postgres, MySQL, SQLite). The default. */
16
+ lucid(options = {}) {
17
+ return async (ctx) => new LucidStore(await ctx.db(options.connection), {
18
+ autoCreateSchema: ctx.autoCreateSchema,
19
+ partitionEvents: ctx.partitionEvents,
20
+ });
21
+ },
22
+ /** In process memory: tests and local development. */
23
+ memory(seed) {
24
+ return () => new MemoryStore(seed);
25
+ },
26
+ };
27
+ export const transports = {
28
+ /** The event log in your database. Transactional; the default when the store is `lucid`. */
29
+ db(options = {}) {
30
+ return async (ctx) => new DbTransport(await ctx.db(options.connection), {
31
+ autoCreateSchema: ctx.autoCreateSchema,
32
+ partitionEvents: ctx.partitionEvents,
33
+ ...options,
34
+ });
35
+ },
36
+ /** Redis Streams through `@adonisjs/redis`. */
37
+ redis(options = {}) {
38
+ return async (ctx) => new RedisTransport(await ctx.redis(options.connection), options);
39
+ },
40
+ /** In process memory: tests and local development. */
41
+ memory() {
42
+ return () => new MemoryTransport();
43
+ },
44
+ };
45
+ export const sinks = {
46
+ /** Analysis tables in your database (`flags_exposures`, `flags_tracks`); read by `analytics.lucid()`. */
47
+ lucid(options = {}) {
48
+ return async (ctx) => new LucidSink(await ctx.db(options.connection), {
49
+ autoCreateSchema: ctx.autoCreateSchema,
50
+ ...(options.batchSize !== undefined ? { batchSize: options.batchSize } : {}),
51
+ ...(options.intervalMs !== undefined ? { intervalMs: options.intervalMs } : {}),
52
+ });
53
+ },
54
+ posthog(options) {
55
+ return () => new PostHogSink(options);
56
+ },
57
+ clickhouse(options) {
58
+ return () => new ClickHouseSink(options);
59
+ },
60
+ /** Parquet files through DuckDB (`@duckdb/node-api`); read by `analytics.duckdb()`. */
61
+ parquet(options) {
62
+ return () => new ParquetSink(options);
63
+ },
64
+ /** Your function receives every batch. Must be idempotent by `event.id`. */
65
+ callback(fn, options = {}) {
66
+ return () => new CallbackSink(fn, options.batchSize, options.intervalMs);
67
+ },
68
+ memory() {
69
+ return () => new MemorySink();
70
+ },
71
+ };
72
+ export const analytics = {
73
+ lucid(options = {}) {
74
+ return async (ctx) => new LucidBackend(await ctx.db(options.connection));
75
+ },
76
+ duckdb(options) {
77
+ return () => new DuckDbBackend(options);
78
+ },
79
+ clickhouse(options) {
80
+ return () => new ClickHouseBackend(options);
81
+ },
82
+ };
83
+ /** Identity helper that types `config/flags.ts`. */
84
+ export function defineConfig(config) {
85
+ if (config.topology === 'tenant' && config.role === 'worker') {
86
+ throw new Error('[flags] role "worker" makes no sense on a tenant: it has no relay; the control-plane fans events out');
87
+ }
88
+ return config;
89
+ }
90
+ //# sourceMappingURL=define_config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { FlagsRuntime } from './runtime.js';
2
+ /** The slice of `@adonis-agora/durable`'s engine this package uses. */
3
+ export interface DurableEngineLike {
4
+ register(name: string, version: string, fn: (ctx: unknown, input: never) => Promise<void>, opts?: {
5
+ origin?: string;
6
+ }): void;
7
+ registerSchedules?(schedules: Array<{
8
+ key: string;
9
+ workflow: string;
10
+ input?: unknown;
11
+ everyMs: number;
12
+ overlap?: 'allow' | 'skip';
13
+ }>): void;
14
+ }
15
+ export declare const PACKAGE_ORIGIN = "@adonis-agora/flags";
16
+ export declare const WORKFLOWS: {
17
+ readonly relay: 'flags.relay';
18
+ readonly schedules: 'flags.schedules';
19
+ readonly results: 'flags.results';
20
+ readonly maintenance: 'flags.maintenance';
21
+ };
22
+ /**
23
+ * Runs the background work as durable workflows: one schedule per sink for the relay, plus
24
+ * scheduled changes, results and maintenance. `overlap: 'skip'` keeps a slow run from piling up, and
25
+ * the durable console shows every run, its errors and retries. The leases and claims inside each
26
+ * task still make concurrent runs safe.
27
+ */
28
+ export declare function registerDurableWorkflows(engine: DurableEngineLike, runtime: FlagsRuntime): boolean;
29
+ //# sourceMappingURL=durable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable.d.ts","sourceRoot":"","sources":["../../src/durable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,EACjD,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GACzB,IAAI,CAAC;IACR,iBAAiB,CAAC,CAChB,SAAS,EAAE,KAAK,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;KAC5B,CAAC,GACD,IAAI,CAAC;CACT;AAED,eAAO,MAAM,cAAc,wBAAwB,CAAC;AAEpD,eAAO,MAAM,SAAS;aACpB,KAAK,EAAE,aAAa;aACpB,SAAS,EAAE,iBAAiB;aAC5B,OAAO,EAAE,eAAe;aACxB,WAAW,EAAE,mBAAmB;CACxB,CAAC;AAEX;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,YAAY,GACpB,OAAO,CAgDT"}
@@ -0,0 +1,55 @@
1
+ export const PACKAGE_ORIGIN = '@adonis-agora/flags';
2
+ export const WORKFLOWS = {
3
+ relay: 'flags.relay',
4
+ schedules: 'flags.schedules',
5
+ results: 'flags.results',
6
+ maintenance: 'flags.maintenance',
7
+ };
8
+ /**
9
+ * Runs the background work as durable workflows: one schedule per sink for the relay, plus
10
+ * scheduled changes, results and maintenance. `overlap: 'skip'` keeps a slow run from piling up, and
11
+ * the durable console shows every run, its errors and retries. The leases and claims inside each
12
+ * task still make concurrent runs safe.
13
+ */
14
+ export function registerDurableWorkflows(engine, runtime) {
15
+ const worker = runtime.worker;
16
+ if (!worker)
17
+ return false;
18
+ if (!engine.registerSchedules)
19
+ return false;
20
+ const opts = { origin: PACKAGE_ORIGIN };
21
+ engine.register(WORKFLOWS.relay, '1', async (_ctx, input) => {
22
+ const result = await worker.relaySink(input.sink);
23
+ if (result?.error)
24
+ throw new Error(result.error);
25
+ }, opts);
26
+ engine.register(WORKFLOWS.schedules, '1', async () => void (await worker.runSchedules()), opts);
27
+ engine.register(WORKFLOWS.results, '1', async () => void (await worker.computeAllResults()), opts);
28
+ engine.register(WORKFLOWS.maintenance, '1', async () => worker.maintenance(), opts);
29
+ const config = runtime.config;
30
+ const relayInterval = config.relay?.intervalMs ?? 5000;
31
+ engine.registerSchedules([
32
+ ...(runtime.relay?.sinkNames ?? []).map((sink) => ({
33
+ key: `flags.relay.${sink}`,
34
+ workflow: WORKFLOWS.relay,
35
+ input: { sink },
36
+ everyMs: Math.max(1000, runtime.sinks.get(sink)?.intervalMs ?? relayInterval),
37
+ overlap: 'skip',
38
+ })),
39
+ { key: 'flags.schedules', workflow: WORKFLOWS.schedules, everyMs: 15_000, overlap: 'skip' },
40
+ {
41
+ key: 'flags.results',
42
+ workflow: WORKFLOWS.results,
43
+ everyMs: config.resultsIntervalMs ?? 600_000,
44
+ overlap: 'skip',
45
+ },
46
+ {
47
+ key: 'flags.maintenance',
48
+ workflow: WORKFLOWS.maintenance,
49
+ everyMs: 3_600_000,
50
+ overlap: 'skip',
51
+ },
52
+ ]);
53
+ return true;
54
+ }
55
+ //# sourceMappingURL=durable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable.js","sourceRoot":"","sources":["../../src/durable.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAEpD,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,KAAK,EAAE,aAAa;IACpB,SAAS,EAAE,iBAAiB;IAC5B,OAAO,EAAE,eAAe;IACxB,WAAW,EAAE,mBAAmB;CACxB,CAAC;AAEX;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAyB,EACzB,OAAqB;IAErB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,iBAAiB;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACxC,MAAM,CAAC,QAAQ,CACb,SAAS,CAAC,KAAK,EACf,GAAG,EACH,KAAK,EAAE,IAAI,EAAE,KAAY,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAE,KAA0B,CAAC,IAAI,CAAC,CAAC;QACxE,IAAI,MAAM,EAAE,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,EACD,IAAI,CACL,CAAC;IACF,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAChG,MAAM,CAAC,QAAQ,CACb,SAAS,CAAC,OAAO,EACjB,GAAG,EACH,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC,EACnD,IAAI,CACL,CAAC;IACF,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;IAEpF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAyE,CAAC;IACjG,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,IAAI,IAAI,CAAC;IACvD,MAAM,CAAC,iBAAiB,CAAC;QACvB,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACjD,GAAG,EAAE,eAAe,IAAI,EAAE;YAC1B,QAAQ,EAAE,SAAS,CAAC,KAAK;YACzB,KAAK,EAAE,EAAE,IAAI,EAAE;YACf,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,IAAI,aAAa,CAAC;YAC7E,OAAO,EAAE,MAAe;SACzB,CAAC,CAAC;QACH,EAAE,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;QAC3F;YACE,GAAG,EAAE,eAAe;YACpB,QAAQ,EAAE,SAAS,CAAC,OAAO;YAC3B,OAAO,EAAE,MAAM,CAAC,iBAAiB,IAAI,OAAO;YAC5C,OAAO,EAAE,MAAM;SAChB;QACD;YACE,GAAG,EAAE,mBAAmB;YACxB,QAAQ,EAAE,SAAS,CAAC,WAAW;YAC/B,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,MAAM;SAChB;KACF,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,51 @@
1
+ import type { EvaluationContext, EvaluationDetails } from '@adonis-agora/flags-core';
2
+ import type { FlagEvent } from './events/event.js';
3
+ /**
4
+ * Synchronous hooks around evaluation (DESIGN §8): they attach flag state to whatever the request is
5
+ * already reporting — a span, an error report, the telescope timeline. They never block and never
6
+ * throw into the caller.
7
+ */
8
+ export interface Enricher {
9
+ readonly name: string;
10
+ setup?(): Promise<void>;
11
+ onEvaluation?(details: EvaluationDetails, context: EvaluationContext): void;
12
+ onEvent?(event: FlagEvent): void;
13
+ }
14
+ /** Channel names, following the ecosystem's `agora:<lib>:<event>` convention. */
15
+ export declare const DIAGNOSTICS_CHANNELS: {
16
+ readonly evaluation: 'agora:flags:evaluation';
17
+ readonly exposure: 'agora:flags:exposure';
18
+ readonly track: 'agora:flags:track';
19
+ readonly change: 'agora:flags:change';
20
+ };
21
+ interface SentryLike {
22
+ getClient?(): {
23
+ getIntegrationByName?(name: string): unknown;
24
+ } | undefined;
25
+ getCurrentScope?(): {
26
+ setTag?(key: string, value: string): void;
27
+ } | undefined;
28
+ }
29
+ export declare const enrichers: {
30
+ /**
31
+ * Publishes evaluations, exposures and tracks on `node:diagnostics_channel` (`agora:flags:*`):
32
+ * `@adonis-agora/diagnostics` and telescope pick them up. Free when nobody subscribes.
33
+ */
34
+ diagnostics(): Enricher;
35
+ /**
36
+ * OpenTelemetry: a `feature_flag.evaluation` event on the active span, with the semantic
37
+ * convention attributes (`feature_flag.key`, `feature_flag.result.variant`, …). Needs
38
+ * `@opentelemetry/api` (optional peer); without it this enricher does nothing.
39
+ */
40
+ otel(): Enricher;
41
+ /**
42
+ * Sentry: records each evaluated flag on the current scope, so an error report lists the flags
43
+ * the request saw. Pass your Sentry module: `enrichers.sentry(Sentry)`. Uses Sentry's
44
+ * feature-flags integration when it is installed, and a `flag.<key>` tag otherwise.
45
+ */
46
+ sentry(sentry: SentryLike): Enricher;
47
+ };
48
+ /** Runs enrichers without ever letting one break evaluation. */
49
+ export declare function runEnrichers(list: Enricher[], fn: (enricher: Enricher) => void): void;
50
+ export {};
51
+ //# sourceMappingURL=enrichers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrichers.d.ts","sourceRoot":"","sources":["../../src/enrichers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,YAAY,CAAC,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC5E,OAAO,CAAC,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;CAClC;AAED,iFAAiF;AACjF,eAAO,MAAM,oBAAoB;aAC/B,UAAU,EAAE,wBAAwB;aACpC,QAAQ,EAAE,sBAAsB;aAChC,KAAK,EAAE,mBAAmB;aAC1B,MAAM,EAAE,oBAAoB;CACpB,CAAC;AAEX,UAAU,UAAU;IAClB,SAAS,CAAC,IAAI;QAAE,oBAAoB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;IAC3E,eAAe,CAAC,IAAI;QAAE,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,SAAS,CAAC;CAC/E;AAUD,eAAO,MAAM,SAAS;IACpB;;;OAGG;IACH,WAAW,IAAI,QAAQ;IAwBvB;;;;OAIG;IACH,IAAI,IAAI,QAAQ;IA6BhB;;;;OAIG;IACH,MAAM,SAAS,UAAU,GAAG,QAAQ;CAiBrC,CAAC;AAEF,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI,CAQrF"}