@nebulr-group/bridge-auth-core 0.1.2 → 0.4.0-beta.0

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 (131) hide show
  1. package/dist/billing/bridge-subscription.d.ts +71 -0
  2. package/dist/billing/bridge-subscription.d.ts.map +1 -0
  3. package/dist/billing/bridge-subscription.js +209 -0
  4. package/dist/billing/bridge-subscription.js.map +1 -0
  5. package/dist/billing/entitlements-store.d.ts +61 -0
  6. package/dist/billing/entitlements-store.d.ts.map +1 -0
  7. package/dist/billing/entitlements-store.js +127 -0
  8. package/dist/billing/entitlements-store.js.map +1 -0
  9. package/dist/billing/fetch-billing-state.d.ts +9 -0
  10. package/dist/billing/fetch-billing-state.d.ts.map +1 -0
  11. package/dist/billing/fetch-billing-state.js +22 -0
  12. package/dist/billing/fetch-billing-state.js.map +1 -0
  13. package/dist/billing/lock-signal.d.ts +6 -0
  14. package/dist/billing/lock-signal.d.ts.map +1 -0
  15. package/dist/billing/lock-signal.js +8 -0
  16. package/dist/billing/lock-signal.js.map +1 -0
  17. package/dist/billing/quota-store.d.ts +86 -0
  18. package/dist/billing/quota-store.d.ts.map +1 -0
  19. package/dist/billing/quota-store.js +180 -0
  20. package/dist/billing/quota-store.js.map +1 -0
  21. package/dist/billing/types.d.ts +64 -0
  22. package/dist/billing/types.d.ts.map +1 -0
  23. package/dist/billing/types.js +49 -0
  24. package/dist/billing/types.js.map +1 -0
  25. package/dist/billing/use-bridge.d.ts +131 -0
  26. package/dist/billing/use-bridge.d.ts.map +1 -0
  27. package/dist/billing/use-bridge.js +181 -0
  28. package/dist/billing/use-bridge.js.map +1 -0
  29. package/dist/bridge-auth.d.ts +36 -1
  30. package/dist/bridge-auth.d.ts.map +1 -1
  31. package/dist/bridge-auth.js +57 -3
  32. package/dist/bridge-auth.js.map +1 -1
  33. package/dist/direct-auth.d.ts +1 -0
  34. package/dist/direct-auth.d.ts.map +1 -1
  35. package/dist/direct-auth.js +7 -0
  36. package/dist/direct-auth.js.map +1 -1
  37. package/dist/errors.d.ts +11 -0
  38. package/dist/errors.d.ts.map +1 -1
  39. package/dist/errors.js +14 -0
  40. package/dist/errors.js.map +1 -1
  41. package/dist/flags/attribute-providers.d.ts +229 -0
  42. package/dist/flags/attribute-providers.d.ts.map +1 -0
  43. package/dist/flags/attribute-providers.js +375 -0
  44. package/dist/flags/attribute-providers.js.map +1 -0
  45. package/dist/flags/dev-attribute-provider.d.ts +67 -0
  46. package/dist/flags/dev-attribute-provider.d.ts.map +1 -0
  47. package/dist/flags/dev-attribute-provider.js +200 -0
  48. package/dist/flags/dev-attribute-provider.js.map +1 -0
  49. package/dist/flags/evaluator.d.ts +58 -0
  50. package/dist/flags/evaluator.d.ts.map +1 -0
  51. package/dist/flags/evaluator.js +160 -0
  52. package/dist/flags/evaluator.js.map +1 -0
  53. package/dist/flags/flag.d.ts +199 -0
  54. package/dist/flags/flag.d.ts.map +1 -0
  55. package/dist/flags/flag.js +337 -0
  56. package/dist/flags/flag.js.map +1 -0
  57. package/dist/flags/identity.d.ts +77 -0
  58. package/dist/flags/identity.d.ts.map +1 -0
  59. package/dist/flags/identity.js +134 -0
  60. package/dist/flags/identity.js.map +1 -0
  61. package/dist/flags/index.d.ts +20 -0
  62. package/dist/flags/index.d.ts.map +1 -0
  63. package/dist/flags/index.js +21 -0
  64. package/dist/flags/index.js.map +1 -0
  65. package/dist/flags/operators.d.ts +63 -0
  66. package/dist/flags/operators.d.ts.map +1 -0
  67. package/dist/flags/operators.js +299 -0
  68. package/dist/flags/operators.js.map +1 -0
  69. package/dist/flags/propagation.d.ts +16 -0
  70. package/dist/flags/propagation.d.ts.map +1 -0
  71. package/dist/flags/propagation.js +107 -0
  72. package/dist/flags/propagation.js.map +1 -0
  73. package/dist/flags/realtime.d.ts +328 -0
  74. package/dist/flags/realtime.d.ts.map +1 -0
  75. package/dist/flags/realtime.js +504 -0
  76. package/dist/flags/realtime.js.map +1 -0
  77. package/dist/flags/runtime-mode.d.ts +32 -0
  78. package/dist/flags/runtime-mode.d.ts.map +1 -0
  79. package/dist/flags/runtime-mode.js +84 -0
  80. package/dist/flags/runtime-mode.js.map +1 -0
  81. package/dist/flags/telemetry.d.ts +79 -0
  82. package/dist/flags/telemetry.d.ts.map +1 -0
  83. package/dist/flags/telemetry.js +286 -0
  84. package/dist/flags/telemetry.js.map +1 -0
  85. package/dist/http.d.ts.map +1 -1
  86. package/dist/http.js +11 -1
  87. package/dist/http.js.map +1 -1
  88. package/dist/index.d.ts +14 -2
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +16 -1
  91. package/dist/index.js.map +1 -1
  92. package/dist/management-types.d.ts +38 -0
  93. package/dist/management-types.d.ts.map +1 -1
  94. package/dist/route-guard.d.ts.map +1 -1
  95. package/dist/route-guard.js +15 -5
  96. package/dist/route-guard.js.map +1 -1
  97. package/dist/token-manager.d.ts +3 -1
  98. package/dist/token-manager.d.ts.map +1 -1
  99. package/dist/token-manager.js +10 -6
  100. package/dist/token-manager.js.map +1 -1
  101. package/dist/types.d.ts +10 -2
  102. package/dist/types.d.ts.map +1 -1
  103. package/dist/usage/index.d.ts +3 -0
  104. package/dist/usage/index.d.ts.map +1 -0
  105. package/dist/usage/index.js +4 -0
  106. package/dist/usage/index.js.map +1 -0
  107. package/dist/usage/storage/durable-storage.d.ts +47 -0
  108. package/dist/usage/storage/durable-storage.d.ts.map +1 -0
  109. package/dist/usage/storage/durable-storage.js +27 -0
  110. package/dist/usage/storage/durable-storage.js.map +1 -0
  111. package/dist/usage/storage/index.d.ts +7 -0
  112. package/dist/usage/storage/index.d.ts.map +1 -0
  113. package/dist/usage/storage/index.js +28 -0
  114. package/dist/usage/storage/index.js.map +1 -0
  115. package/dist/usage/storage/indexeddb-storage.d.ts +18 -0
  116. package/dist/usage/storage/indexeddb-storage.d.ts.map +1 -0
  117. package/dist/usage/storage/indexeddb-storage.js +159 -0
  118. package/dist/usage/storage/indexeddb-storage.js.map +1 -0
  119. package/dist/usage/storage/node-fs-storage.d.ts +29 -0
  120. package/dist/usage/storage/node-fs-storage.d.ts.map +1 -0
  121. package/dist/usage/storage/node-fs-storage.js +180 -0
  122. package/dist/usage/storage/node-fs-storage.js.map +1 -0
  123. package/dist/usage/storage/noop-storage.d.ts +17 -0
  124. package/dist/usage/storage/noop-storage.d.ts.map +1 -0
  125. package/dist/usage/storage/noop-storage.js +67 -0
  126. package/dist/usage/storage/noop-storage.js.map +1 -0
  127. package/dist/usage/usage-reporter.d.ts +64 -0
  128. package/dist/usage/usage-reporter.d.ts.map +1 -0
  129. package/dist/usage/usage-reporter.js +234 -0
  130. package/dist/usage/usage-reporter.js.map +1 -0
  131. package/package.json +2 -1
@@ -0,0 +1,79 @@
1
+ import type { BridgeFlags } from './flag.js';
2
+ export interface TelemetryBatcherConfig {
3
+ /** Bridge API base URL (e.g. https://api.thebridge.dev or http://localhost:3500). */
4
+ apiBaseUrl: string;
5
+ /** JWT-shaped workspace API key — sent as `x-api-key` header. */
6
+ apiKey: string;
7
+ /** Flush interval in ms. Default 30s. */
8
+ flushIntervalMs?: number;
9
+ /** Maximum events buffered before forcing a flush. Default 500. */
10
+ flushAtSize?: number;
11
+ /**
12
+ * Short debounce after any discovery / attribute-observation event, so
13
+ * first-sight items reach the admin near-instantly without waiting for the
14
+ * 30s eval cadence. Default 1000ms. Set higher to coalesce more aggressively
15
+ * or to 0 to flush synchronously.
16
+ */
17
+ firstSightFlushMs?: number;
18
+ /** When false, telemetry HTTP calls are skipped — useful for tests + opt-out apps. */
19
+ enabled?: boolean;
20
+ }
21
+ export declare class TelemetryBatcher {
22
+ private readonly evalBuffer;
23
+ private readonly discoveryBuffer;
24
+ private readonly attributeDeclBuffer;
25
+ private readonly attributeObsBuffer;
26
+ private readonly callSiteBuffer;
27
+ private readonly seenCallSites;
28
+ private timer?;
29
+ private firstSightTimer?;
30
+ private readonly cfg;
31
+ private flushing;
32
+ constructor(cfg: TelemetryBatcherConfig);
33
+ /** Schedule a near-instant flush in response to a first-sight event. Debounced
34
+ * so a burst of first-sights collapses to a single flush. Discovery + attribute
35
+ * observation paths both use this; eval events keep the 30s cadence. */
36
+ private scheduleFirstSightFlush;
37
+ /**
38
+ * Attach to a BridgeFlags instance. Registers hooks for eval + discovery
39
+ * + attribute-declaration events. Also starts the periodic flush timer.
40
+ */
41
+ attach(bridge: BridgeFlags): void;
42
+ /** Record a call-site sighting. Caller supplies the fingerprint. */
43
+ recordCallSite(flag: string, identity: string, fingerprint: string, devLabel?: string): void;
44
+ /** Hook entrypoint — coalesces eval events per (identity, flag, value, minute). */
45
+ private recordEval;
46
+ /** Hook entrypoint — discovery events are inherently dedupe'd by BridgeFlags.
47
+ * Schedules a near-instant flush so a new flag shows up in the admin within
48
+ * ~1s of first eval, not at the next 30s tick. */
49
+ private recordDiscovery;
50
+ /** Hook entrypoint — attribute type declarations (TBP-174, deprecated). */
51
+ private recordAttributeDeclaration;
52
+ /** Hook entrypoint — per-call attribute observations (TBP-178). Same near-
53
+ * instant flush so a new dev-supplied attribute reaches the admin catalog
54
+ * within ~1s of first eval. */
55
+ private recordAttributeObservation;
56
+ /** Begin periodic flushing. Idempotent. */
57
+ start(): void;
58
+ /** Stop the timer and force a final flush. Called on app shutdown / SDK teardown. */
59
+ stop(): Promise<void>;
60
+ /** Force a flush now. Returns when all in-flight HTTP calls settle. */
61
+ flush(): Promise<void>;
62
+ /** Telemetry surface for introspection / tests. */
63
+ stats(): {
64
+ evalQueue: number;
65
+ discoveryQueue: number;
66
+ attributeDeclQueue: number;
67
+ attributeObsQueue: number;
68
+ callSiteQueue: number;
69
+ seenCallSites: number;
70
+ };
71
+ private maybeFlushOnSize;
72
+ private flushEvals;
73
+ private flushDiscoveries;
74
+ private flushAttributeDeclarations;
75
+ private flushAttributeObservations;
76
+ private flushCallSites;
77
+ private post;
78
+ }
79
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/flags/telemetry.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAGV,WAAW,EAGZ,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,sBAAsB;IACrC,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sFAAsF;IACtF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAuCD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAC5D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuC;IAC3E,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAuC;IAC1E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAMvB;IACR,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,KAAK,CAAC,CAAiC;IAC/C,OAAO,CAAC,eAAe,CAAC,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmC;IACvD,OAAO,CAAC,QAAQ,CAAS;gBAEb,GAAG,EAAE,sBAAsB;IAWvC;;6EAEyE;IACzE,OAAO,CAAC,uBAAuB;IAS/B;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAUjC,oEAAoE;IACpE,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAS5F,mFAAmF;IACnF,OAAO,CAAC,UAAU;IAoBlB;;uDAEmD;IACnD,OAAO,CAAC,eAAe;IAWvB,2EAA2E;IAC3E,OAAO,CAAC,0BAA0B;IAUlC;;oCAEgC;IAChC,OAAO,CAAC,0BAA0B;IAWlC,2CAA2C;IAC3C,KAAK,IAAI,IAAI;IAUb,qFAAqF;IAC/E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,uEAAuE;IACjE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B,mDAAmD;IACnD,KAAK,IAAI;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB;IAWD,OAAO,CAAC,gBAAgB;YAYV,UAAU;YAOV,gBAAgB;YAWhB,0BAA0B;YAe1B,0BAA0B;YAe1B,cAAc;YAMd,IAAI;CAoBnB"}
@@ -0,0 +1,286 @@
1
+ // SDK telemetry batcher (TBP-157).
2
+ //
3
+ // Wires the BridgeFlags hooks (`onEval`, `onDiscover`, `onIdentify`) to the
4
+ // bridge-api ingest endpoints (`/v1/flags/eval-events`, `/v1/flags/discover`,
5
+ // `/v1/flags/call-sites`). Coalesces eval events per (identity, flag, value)
6
+ // per minute, dedupes call-site reports per (identity, fingerprint) for the
7
+ // SDK runtime, and periodically flushes via HTTP.
8
+ //
9
+ // This module is platform-agnostic — it uses global `fetch` and a `setInterval`
10
+ // timer. Framework SDKs construct it during bootstrap and pass the workspace
11
+ // API key. On graceful shutdown they call `stop()` to flush pending events.
12
+ export class TelemetryBatcher {
13
+ evalBuffer = new Map();
14
+ discoveryBuffer = [];
15
+ attributeDeclBuffer = [];
16
+ attributeObsBuffer = [];
17
+ callSiteBuffer = [];
18
+ seenCallSites = new Set(); // dedup per runtime: `identity|fingerprint`
19
+ timer;
20
+ firstSightTimer;
21
+ cfg;
22
+ flushing = false;
23
+ constructor(cfg) {
24
+ this.cfg = {
25
+ apiBaseUrl: cfg.apiBaseUrl.replace(/\/+$/, ''),
26
+ apiKey: cfg.apiKey,
27
+ flushIntervalMs: cfg.flushIntervalMs ?? 30_000,
28
+ flushAtSize: cfg.flushAtSize ?? 500,
29
+ firstSightFlushMs: cfg.firstSightFlushMs ?? 1_000,
30
+ enabled: cfg.enabled !== false,
31
+ };
32
+ }
33
+ /** Schedule a near-instant flush in response to a first-sight event. Debounced
34
+ * so a burst of first-sights collapses to a single flush. Discovery + attribute
35
+ * observation paths both use this; eval events keep the 30s cadence. */
36
+ scheduleFirstSightFlush() {
37
+ if (this.firstSightTimer)
38
+ return;
39
+ this.firstSightTimer = setTimeout(() => {
40
+ this.firstSightTimer = undefined;
41
+ void this.flush();
42
+ }, this.cfg.firstSightFlushMs);
43
+ if (this.firstSightTimer?.unref)
44
+ this.firstSightTimer.unref();
45
+ }
46
+ /**
47
+ * Attach to a BridgeFlags instance. Registers hooks for eval + discovery
48
+ * + attribute-declaration events. Also starts the periodic flush timer.
49
+ */
50
+ attach(bridge) {
51
+ bridge.setHooks({
52
+ onEval: (ev) => this.recordEval(ev),
53
+ onDiscover: (ev) => this.recordDiscovery(ev),
54
+ onAttributeDeclaration: (decl) => this.recordAttributeDeclaration(decl),
55
+ onAttributeObserved: (obs) => this.recordAttributeObservation(obs),
56
+ });
57
+ this.start();
58
+ }
59
+ /** Record a call-site sighting. Caller supplies the fingerprint. */
60
+ recordCallSite(flag, identity, fingerprint, devLabel) {
61
+ if (!identity || !fingerprint)
62
+ return;
63
+ const key = `${identity}|${fingerprint}`;
64
+ if (this.seenCallSites.has(key))
65
+ return;
66
+ this.seenCallSites.add(key);
67
+ this.callSiteBuffer.push({ flag, identity, fingerprint, devLabel, timestamp: Date.now() });
68
+ this.maybeFlushOnSize();
69
+ }
70
+ /** Hook entrypoint — coalesces eval events per (identity, flag, value, minute). */
71
+ recordEval(ev) {
72
+ const valueKey = canonicalValueKey(ev.value);
73
+ const bucketMinute = Math.floor(ev.timestamp / 60_000);
74
+ const key = `${ev.identity ?? ''}::${ev.flag}::${valueKey}::${ev.variantIndex}::${bucketMinute}`;
75
+ const existing = this.evalBuffer.get(key);
76
+ if (existing) {
77
+ existing.count++;
78
+ }
79
+ else {
80
+ this.evalBuffer.set(key, {
81
+ flag: ev.flag,
82
+ value: ev.value,
83
+ variantIndex: ev.variantIndex,
84
+ identity: ev.identity,
85
+ timestamp: ev.timestamp,
86
+ count: 1,
87
+ });
88
+ }
89
+ this.maybeFlushOnSize();
90
+ }
91
+ /** Hook entrypoint — discovery events are inherently dedupe'd by BridgeFlags.
92
+ * Schedules a near-instant flush so a new flag shows up in the admin within
93
+ * ~1s of first eval, not at the next 30s tick. */
94
+ recordDiscovery(ev) {
95
+ this.discoveryBuffer.push({
96
+ flag: ev.flag,
97
+ defaultValue: ev.defaultValue,
98
+ observedType: ev.observedType,
99
+ timestamp: ev.timestamp,
100
+ });
101
+ this.scheduleFirstSightFlush();
102
+ this.maybeFlushOnSize();
103
+ }
104
+ /** Hook entrypoint — attribute type declarations (TBP-174, deprecated). */
105
+ recordAttributeDeclaration(decl) {
106
+ this.attributeDeclBuffer.push({
107
+ name: decl.name,
108
+ type: decl.type,
109
+ timestamp: decl.timestamp,
110
+ });
111
+ this.scheduleFirstSightFlush();
112
+ this.maybeFlushOnSize();
113
+ }
114
+ /** Hook entrypoint — per-call attribute observations (TBP-178). Same near-
115
+ * instant flush so a new dev-supplied attribute reaches the admin catalog
116
+ * within ~1s of first eval. */
117
+ recordAttributeObservation(obs) {
118
+ this.attributeObsBuffer.push({
119
+ key: obs.key,
120
+ sampleValue: obs.sampleValue,
121
+ observedType: obs.observedType,
122
+ timestamp: obs.timestamp,
123
+ });
124
+ this.scheduleFirstSightFlush();
125
+ this.maybeFlushOnSize();
126
+ }
127
+ /** Begin periodic flushing. Idempotent. */
128
+ start() {
129
+ if (this.timer)
130
+ return;
131
+ this.timer = setInterval(() => {
132
+ void this.flush();
133
+ }, this.cfg.flushIntervalMs);
134
+ // Some runtimes (Node) keep the process alive on a timer; in the SDK
135
+ // context this is typically a browser, so it's a no-op there.
136
+ if (this.timer?.unref)
137
+ this.timer.unref();
138
+ }
139
+ /** Stop the timer and force a final flush. Called on app shutdown / SDK teardown. */
140
+ async stop() {
141
+ if (this.timer) {
142
+ clearInterval(this.timer);
143
+ this.timer = undefined;
144
+ }
145
+ if (this.firstSightTimer) {
146
+ clearTimeout(this.firstSightTimer);
147
+ this.firstSightTimer = undefined;
148
+ }
149
+ await this.flush();
150
+ }
151
+ /** Force a flush now. Returns when all in-flight HTTP calls settle. */
152
+ async flush() {
153
+ if (!this.cfg.enabled) {
154
+ this.evalBuffer.clear();
155
+ this.discoveryBuffer.length = 0;
156
+ this.attributeDeclBuffer.length = 0;
157
+ this.attributeObsBuffer.length = 0;
158
+ this.callSiteBuffer.length = 0;
159
+ return;
160
+ }
161
+ if (this.flushing)
162
+ return; // single-flight; the next interval picks up the rest
163
+ this.flushing = true;
164
+ try {
165
+ await Promise.all([
166
+ this.flushEvals(),
167
+ this.flushDiscoveries(),
168
+ this.flushAttributeDeclarations(),
169
+ this.flushAttributeObservations(),
170
+ this.flushCallSites(),
171
+ ]);
172
+ }
173
+ finally {
174
+ this.flushing = false;
175
+ }
176
+ }
177
+ /** Telemetry surface for introspection / tests. */
178
+ stats() {
179
+ return {
180
+ evalQueue: this.evalBuffer.size,
181
+ discoveryQueue: this.discoveryBuffer.length,
182
+ attributeDeclQueue: this.attributeDeclBuffer.length,
183
+ attributeObsQueue: this.attributeObsBuffer.length,
184
+ callSiteQueue: this.callSiteBuffer.length,
185
+ seenCallSites: this.seenCallSites.size,
186
+ };
187
+ }
188
+ maybeFlushOnSize() {
189
+ const total = this.evalBuffer.size +
190
+ this.discoveryBuffer.length +
191
+ this.attributeDeclBuffer.length +
192
+ this.attributeObsBuffer.length +
193
+ this.callSiteBuffer.length;
194
+ if (total >= this.cfg.flushAtSize) {
195
+ void this.flush();
196
+ }
197
+ }
198
+ async flushEvals() {
199
+ if (this.evalBuffer.size === 0)
200
+ return;
201
+ const events = Array.from(this.evalBuffer.values());
202
+ this.evalBuffer.clear();
203
+ await this.post('/v1/flags/eval-events', { events });
204
+ }
205
+ async flushDiscoveries() {
206
+ if (this.discoveryBuffer.length === 0)
207
+ return;
208
+ const events = this.discoveryBuffer.splice(0).map((d) => ({
209
+ kind: 'flag',
210
+ key: d.flag,
211
+ observedType: d.observedType,
212
+ timestamp: d.timestamp,
213
+ }));
214
+ await this.post('/v1/flags/discover', { events });
215
+ }
216
+ async flushAttributeDeclarations() {
217
+ if (this.attributeDeclBuffer.length === 0)
218
+ return;
219
+ // Attribute declarations are sent through the discovery endpoint with
220
+ // `kind: 'attribute'` + observedType. The admin UI's Discovered panel
221
+ // distinguishes declared vs inferred via the observedType + a future
222
+ // `declared: true` field (TODO once the backend supports the flag).
223
+ const events = this.attributeDeclBuffer.splice(0).map((d) => ({
224
+ kind: 'attribute',
225
+ key: d.name,
226
+ observedType: d.type,
227
+ timestamp: d.timestamp,
228
+ }));
229
+ await this.post('/v1/flags/discover', { events });
230
+ }
231
+ async flushAttributeObservations() {
232
+ if (this.attributeObsBuffer.length === 0)
233
+ return;
234
+ // Per-call attribute observations (TBP-178) — relayed to the same discovery
235
+ // endpoint with `kind: 'attribute'` + observedType + sampleValue. Backend
236
+ // accumulates distinct samples per (app, key) via `$addToSet`.
237
+ const events = this.attributeObsBuffer.splice(0).map((o) => ({
238
+ kind: 'attribute',
239
+ key: o.key,
240
+ sampleValue: o.sampleValue,
241
+ observedType: o.observedType,
242
+ timestamp: o.timestamp,
243
+ }));
244
+ await this.post('/v1/flags/discover', { events });
245
+ }
246
+ async flushCallSites() {
247
+ if (this.callSiteBuffer.length === 0)
248
+ return;
249
+ const events = this.callSiteBuffer.splice(0);
250
+ await this.post('/v1/flags/call-sites', { events });
251
+ }
252
+ async post(path, body) {
253
+ const url = `${this.cfg.apiBaseUrl}${path}`;
254
+ try {
255
+ await fetch(url, {
256
+ method: 'POST',
257
+ headers: {
258
+ 'Content-Type': 'application/json',
259
+ 'x-api-key': this.cfg.apiKey,
260
+ },
261
+ body: JSON.stringify(body),
262
+ });
263
+ // We don't currently inspect the response — accepted/rejected counts
264
+ // are useful for debugging but not actionable from the SDK side.
265
+ // A future hardening could log on non-2xx.
266
+ }
267
+ catch {
268
+ // Network errors swallowed — telemetry is best-effort. A future
269
+ // hardening could re-buffer with backoff, but losing some events is
270
+ // strictly preferred over breaking the SDK on a flaky network.
271
+ }
272
+ }
273
+ }
274
+ // ── helpers ─────────────────────────────────────────────────────────────────
275
+ function canonicalValueKey(v) {
276
+ if (v === undefined)
277
+ return 'undefined';
278
+ try {
279
+ const s = JSON.stringify(v);
280
+ return s.length > 256 ? s.slice(0, 256) + '…' : s;
281
+ }
282
+ catch {
283
+ return String(v);
284
+ }
285
+ }
286
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/flags/telemetry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAoChG"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAU1C,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAwChG"}
package/dist/http.js CHANGED
@@ -1,4 +1,10 @@
1
- import { HttpError } from './errors.js';
1
+ import { BillingLockedError, HttpError } from './errors.js';
2
+ import { emitBillingLock } from './billing/lock-signal.js';
3
+ function isBillingLockedPayload(body) {
4
+ return (typeof body === 'object' &&
5
+ body !== null &&
6
+ body.reason === 'billing_locked');
7
+ }
2
8
  export async function httpFetch(url, options, logger) {
3
9
  const { method = 'GET', headers = {}, body, credentials } = options;
4
10
  const fetchOptions = {
@@ -21,6 +27,10 @@ export async function httpFetch(url, options, logger) {
21
27
  catch {
22
28
  errorBody = await response.text().catch(() => null);
23
29
  }
30
+ if (response.status === 402 && isBillingLockedPayload(errorBody)) {
31
+ emitBillingLock(errorBody);
32
+ throw new BillingLockedError(errorBody);
33
+ }
24
34
  const message = typeof errorBody === 'object' && errorBody && 'message' in errorBody
25
35
  ? String(errorBody.message)
26
36
  : `HTTP ${response.status}: ${response.statusText}`;
package/dist/http.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAUxC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,GAAW,EAAE,OAAoB,EAAE,MAAc;IAClF,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,OAAO,GAAG,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAEpE,MAAM,YAAY,GAAgB;QAChC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE;KAC5D,CAAC;IAEF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,YAAY,CAAC,WAAW,GAAG,WAAW,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;IAEjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAEhD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,SAAkB,CAAC;QACvB,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS;YAClF,CAAC,CAAC,MAAM,CAAE,SAAiB,CAAC,OAAO,CAAC;YACpC,CAAC,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtD,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAc,CAAC;IACjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAI3D,SAAS,sBAAsB,CAAC,IAAa;IAC3C,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACZ,IAA6B,CAAC,MAAM,KAAK,gBAAgB,CAC3D,CAAC;AACJ,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,GAAW,EAAE,OAAoB,EAAE,MAAc;IAClF,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,OAAO,GAAG,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAEpE,MAAM,YAAY,GAAgB;QAChC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE;KAC5D,CAAC;IAEF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,YAAY,CAAC,WAAW,GAAG,WAAW,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;IAEjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAEhD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,SAAkB,CAAC;QACvB,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC;YACjE,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,MAAM,IAAI,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS;YAClF,CAAC,CAAC,MAAM,CAAE,SAAiB,CAAC,OAAO,CAAC;YACpC,CAAC,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtD,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAc,CAAC;IACjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;AAC/B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -4,12 +4,12 @@ export { TeamService } from './team-service.js';
4
4
  export type { TeamProfile, TeamProfileUpdateInput, TeamUser, TeamUserListResult, TeamUserUpdateInput, TeamWorkspace, TeamWorkspaceUpdateInput, } from './team-types.js';
5
5
  export { ApiTokenService } from './api-token-service.js';
6
6
  export type { ApiToken, AvailablePrivilege, CreateApiTokenInput, CreateApiTokenResponse, } from './api-token-service.js';
7
- export { BridgeAuthError, HttpError } from './errors.js';
7
+ export { BridgeAuthError, HttpError, BillingLockedError } from './errors.js';
8
8
  export { LocalStorageAdapter, MemoryAdapter } from './token-storage.js';
9
9
  export { decodeJwtPayload, getTokenExpiry, isTokenExpired, shouldRefreshNow } from './token-utils.js';
10
10
  export { BridgeManagement } from './management/index.js';
11
11
  export { ManagementHttpClient } from './management-http.js';
12
- export type { ManagementConfig, AppResponse, UpdateAppRequest, CredentialsState, UpdateCredentialsRequest, TenantResponse, CreateTenantRequest, UpdateTenantRequest, UserResponse, InviteUserRequest, UpdateUserRequest, RoleResponse, CreateRoleRequest, UpdateRoleRequest, PrivilegeResponse, FlagResponse, CreateFlagInput, UpdateFlagInput, SegmentResponse, SegmentInput, Target, TargetValue, BrandingResponse, UpdateBrandingRequest, CssFileResponse, UpdateCssFileRequest, PlanResponse, CreatePlanRequest, UpdatePlanRequest, PlanPrice, TokenRecord, CreateTokenRequest, CreateTokenResponse, EventQuery, EventResult, OnboardingResponse, UpdateOnboardingRequest, SetupSSOParams, SetupSSOResult, SetupPaymentsParams, SetupPaymentsResult, SetupCommunicationParams, SetupCommunicationResult, SSOProvider, } from './management-types.js';
12
+ export type { ManagementConfig, AppResponse, UpdateAppRequest, CredentialsState, UpdateCredentialsRequest, TenantResponse, CreateTenantRequest, UpdateTenantRequest, UserResponse, InviteUserRequest, UpdateUserRequest, RoleResponse, CreateRoleRequest, UpdateRoleRequest, PrivilegeResponse, FlagResponse, CreateFlagInput, UpdateFlagInput, SegmentResponse, SegmentInput, Target, TargetValue, FlagSchedule, BrandingResponse, UpdateBrandingRequest, CssFileResponse, UpdateCssFileRequest, PlanResponse, CreatePlanRequest, UpdatePlanRequest, PlanPrice, TokenRecord, CreateTokenRequest, CreateTokenResponse, EventQuery, EventResult, OnboardingResponse, UpdateOnboardingRequest, SetupSSOParams, SetupSSOResult, SetupPaymentsParams, SetupPaymentsResult, SetupCommunicationParams, SetupCommunicationResult, SSOProvider, } from './management-types.js';
13
13
  export { AppManagementService } from './management/app.service.js';
14
14
  export { TenantManagementService } from './management/tenant.service.js';
15
15
  export { UserManagementService } from './management/user.service.js';
@@ -21,4 +21,16 @@ export { TokenManagementService } from './management/token.service.js';
21
21
  export { EventManagementService } from './management/event.service.js';
22
22
  export { OnboardingManagementService } from './management/onboarding.service.js';
23
23
  export { ManagementWorkflows } from './management/workflows.js';
24
+ export { OPERATORS, OPERATOR_VERSION, CONDITIONS_PER_RULE_MAX, isOperator, isOperatorValidForType, validOperatorsForType, evaluateCondition, validateConditions, bucket, evaluateBranch, evaluateRule, resolveAttribute, validateRule, BridgeFlags, BridgeIdentity, MemoryIdentityStorage, attachIdentity, generateAnonymousId, AttributeProviderRegistry, AuthAttributeProvider, BillingAttributeProvider, DevAttributeProvider, BridgePullCache, TelemetryBatcher, RealtimeClient, BRIDGE_CONTEXT_HEADER, serializeContext, deserializeContext, serverInstanceId, } from './flags/index.js';
25
+ export type { Operator, AttributeType, Condition, ConditionValue, ValidationError, Branch, Rule, FlagState, EvalContext, EvalResult, RuleValidationError, CachedFlag, FlagEvalResult, FlagValueType, EvalTelemetry, DiscoveryTelemetry, BridgeFlagsHooks, DeclaredAttributeType, AttributeDeclaration, BridgeFlagsMode, FlagUsageReporterLike, AnonymousTrackingMode, IdentityStorage, AttributeProvider, AuthJwtClaims, AuthProviderConfig, BillingSnapshot, BillingProviderConfig, BillingProviderStores, AttributeGetter, AttributeBulkGetter, AttributesSetOptions, BridgeRuntimeMode, PullCacheOptions, TelemetryBatcherConfig, RealtimeClientConfig, RealtimeMessage, FlagUpdateMessage, FlagRemovedMessage, UserStateMessage, SubscriptionPlanChangedMessage, BillingLifecycleMessage, QuotaUpdatedMessage, EntitlementsChangedMessage, SessionSnapshotMessage, ConnectionState, WebSocketLike, } from './flags/index.js';
26
+ export { useBridge } from './billing/use-bridge.js';
27
+ export type { UseBridgeApi, UseBridgeEntitlementsApi, BillingEventHandlers, BillingGateState, } from './billing/use-bridge.js';
28
+ export { BridgeSubscription } from './billing/bridge-subscription.js';
29
+ export { fetchBillingState } from './billing/fetch-billing-state.js';
30
+ export { QuotaStore } from './billing/quota-store.js';
31
+ export type { QuotaSnapshot } from './billing/quota-store.js';
32
+ export { EntitlementsStore } from './billing/entitlements-store.js';
33
+ export type { EntitlementSnapshot } from './billing/entitlements-store.js';
34
+ export { deriveNoticeState, deriveSeverity } from './billing/types.js';
35
+ export type { BillingSubscriptionStatus, BillingSeverity, PastDueReason, BillingPlanRef, BillingSubscriptionState, BillingSubscriptionSnapshot, BillingNoticeState, BillingLockedPayload, MountOptions, } from './billing/types.js';
24
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ export { TeamService } from './team-service.js';
5
5
  // API token management
6
6
  export { ApiTokenService } from './api-token-service.js';
7
7
  // Errors
8
- export { BridgeAuthError, HttpError } from './errors.js';
8
+ export { BridgeAuthError, HttpError, BillingLockedError } from './errors.js';
9
9
  // Storage adapters (for custom configuration)
10
10
  export { LocalStorageAdapter, MemoryAdapter } from './token-storage.js';
11
11
  // Utilities
@@ -24,4 +24,19 @@ export { TokenManagementService } from './management/token.service.js';
24
24
  export { EventManagementService } from './management/event.service.js';
25
25
  export { OnboardingManagementService } from './management/onboarding.service.js';
26
26
  export { ManagementWorkflows } from './management/workflows.js';
27
+ // ── Feature Flags 2.0 — locked operator set + branch evaluator ──────────────
28
+ // Shared between bridge-api (server eval) and SDK consumers (client eval) so
29
+ // there is no drift in semantics. See `flags/operators.ts` (per-condition
30
+ // primitives) and `flags/evaluator.ts` (branch + rollout layer).
31
+ export { OPERATORS, OPERATOR_VERSION, CONDITIONS_PER_RULE_MAX, isOperator, isOperatorValidForType, validOperatorsForType, evaluateCondition, validateConditions, bucket, evaluateBranch, evaluateRule, resolveAttribute, validateRule, BridgeFlags, BridgeIdentity, MemoryIdentityStorage, attachIdentity, generateAnonymousId, AttributeProviderRegistry, AuthAttributeProvider, BillingAttributeProvider, DevAttributeProvider, BridgePullCache, TelemetryBatcher, RealtimeClient, BRIDGE_CONTEXT_HEADER, serializeContext, deserializeContext, serverInstanceId, } from './flags/index.js';
32
+ // ── Billing 2.0 — canonical SDK reactive surface (TBP-248 / US-2) ───────────
33
+ // Parallel to FF 2.0's BridgeFlags surface. Do NOT unify with FF 2.0 yet —
34
+ // REF-1 (post-feature) folds them. See TBP-248 for context.
35
+ export { useBridge } from './billing/use-bridge.js';
36
+ export { BridgeSubscription } from './billing/bridge-subscription.js';
37
+ export { fetchBillingState } from './billing/fetch-billing-state.js';
38
+ export { QuotaStore } from './billing/quota-store.js';
39
+ // Billing 2.0 US-12 — entitlement cache + types.
40
+ export { EntitlementsStore } from './billing/entitlements-store.js';
41
+ export { deriveNoticeState, deriveSeverity } from './billing/types.js';
27
42
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAuC9C,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAWhD,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAQzD,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEzD,8CAA8C;AAC9C,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExE,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEtG,yCAAyC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AA8B5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAuC9C,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAWhD,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAQzD,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE7E,8CAA8C;AAC9C,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExE,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEtG,yCAAyC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AA+B5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,+EAA+E;AAC/E,6EAA6E;AAC7E,0EAA0E;AAC1E,iEAAiE;AACjE,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,uBAAuB,EACvB,UAAU,EACV,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,MAAM,EACN,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAmD1B,+EAA+E;AAC/E,2EAA2E;AAC3E,4DAA4D;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAOpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,iDAAiD;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
@@ -189,6 +189,10 @@ export interface UpdateRoleRequest {
189
189
  privileges?: string[];
190
190
  isDefault?: boolean;
191
191
  }
192
+ export type { Rule, Branch, FlagState } from './flags/evaluator.js';
193
+ export type { FlagValueType } from './flags/flag.js';
194
+ import type { Rule, FlagState } from './flags/evaluator.js';
195
+ import type { FlagValueType } from './flags/flag.js';
192
196
  export interface TargetValue {
193
197
  operator: 'eq' | 'beginsWith' | 'endsWith' | 'contains' | 'lessThan' | 'greaterThan';
194
198
  value: string;
@@ -227,6 +231,19 @@ export interface SegmentInput {
227
231
  description?: string;
228
232
  targets?: Target[];
229
233
  }
234
+ /**
235
+ * A scheduled future state transition (TBP-189).
236
+ *
237
+ * `null` clears any existing schedule on a write. The runner that flips the
238
+ * state at the appointed time is implemented separately; the management types
239
+ * just describe the persisted shape.
240
+ */
241
+ export interface FlagSchedule {
242
+ /** ISO-8601 timestamp at which the transition fires. */
243
+ at: string;
244
+ /** Target state the runner will set when the timer fires. */
245
+ state: FlagState;
246
+ }
230
247
  export interface FlagResponse {
231
248
  id: string;
232
249
  key: string;
@@ -235,6 +252,15 @@ export interface FlagResponse {
235
252
  segments: SegmentResponse[];
236
253
  targetValue?: boolean;
237
254
  enabled: boolean;
255
+ state?: FlagState;
256
+ valueType?: FlagValueType;
257
+ offValue?: unknown;
258
+ onValue?: unknown;
259
+ rule?: Rule | null;
260
+ schedule?: FlagSchedule | null;
261
+ evalCount?: number;
262
+ /** ISO-8601 timestamp of the most recent eval, or null when never evaluated. */
263
+ lastEvalAt?: string | null;
238
264
  }
239
265
  export interface CreateFlagInput {
240
266
  key: string;
@@ -243,6 +269,12 @@ export interface CreateFlagInput {
243
269
  segments?: string[];
244
270
  targetValue?: boolean;
245
271
  enabled?: boolean;
272
+ state?: FlagState;
273
+ valueType?: FlagValueType;
274
+ offValue?: unknown;
275
+ onValue?: unknown;
276
+ rule?: Rule | null;
277
+ schedule?: FlagSchedule | null;
246
278
  }
247
279
  export interface UpdateFlagInput {
248
280
  key?: string;
@@ -251,6 +283,12 @@ export interface UpdateFlagInput {
251
283
  segments?: string[];
252
284
  targetValue?: boolean;
253
285
  enabled?: boolean;
286
+ state?: FlagState;
287
+ valueType?: FlagValueType;
288
+ offValue?: unknown;
289
+ onValue?: unknown;
290
+ rule?: Rule | null;
291
+ schedule?: FlagSchedule | null;
254
292
  }
255
293
  export interface BrandingResponse {
256
294
  bgColor: string;