@littlebearapps/platform-admin-sdk 1.0.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 (94) hide show
  1. package/README.md +112 -0
  2. package/dist/index.d.ts +16 -0
  3. package/dist/index.js +89 -0
  4. package/dist/prompts.d.ts +27 -0
  5. package/dist/prompts.js +80 -0
  6. package/dist/scaffold.d.ts +5 -0
  7. package/dist/scaffold.js +65 -0
  8. package/dist/templates.d.ts +16 -0
  9. package/dist/templates.js +131 -0
  10. package/package.json +46 -0
  11. package/templates/full/migrations/006_pattern_discovery.sql +199 -0
  12. package/templates/full/migrations/007_notifications_search.sql +127 -0
  13. package/templates/full/workers/lib/pattern-discovery/ai-prompt.ts +644 -0
  14. package/templates/full/workers/lib/pattern-discovery/clustering.ts +278 -0
  15. package/templates/full/workers/lib/pattern-discovery/shadow-evaluation.ts +603 -0
  16. package/templates/full/workers/lib/pattern-discovery/storage.ts +806 -0
  17. package/templates/full/workers/lib/pattern-discovery/types.ts +159 -0
  18. package/templates/full/workers/lib/pattern-discovery/validation.ts +278 -0
  19. package/templates/full/workers/pattern-discovery.ts +661 -0
  20. package/templates/full/workers/platform-alert-router.ts +1809 -0
  21. package/templates/full/workers/platform-notifications.ts +424 -0
  22. package/templates/full/workers/platform-search.ts +480 -0
  23. package/templates/full/workers/platform-settings.ts +436 -0
  24. package/templates/full/wrangler.alert-router.jsonc.hbs +34 -0
  25. package/templates/full/wrangler.notifications.jsonc.hbs +23 -0
  26. package/templates/full/wrangler.pattern-discovery.jsonc.hbs +33 -0
  27. package/templates/full/wrangler.search.jsonc.hbs +16 -0
  28. package/templates/full/wrangler.settings.jsonc.hbs +23 -0
  29. package/templates/shared/README.md.hbs +69 -0
  30. package/templates/shared/config/budgets.yaml.hbs +72 -0
  31. package/templates/shared/config/services.yaml.hbs +45 -0
  32. package/templates/shared/migrations/001_core_tables.sql +117 -0
  33. package/templates/shared/migrations/002_usage_warehouse.sql +830 -0
  34. package/templates/shared/migrations/003_feature_tracking.sql +250 -0
  35. package/templates/shared/migrations/004_settings_alerts.sql +452 -0
  36. package/templates/shared/migrations/seed.sql.hbs +4 -0
  37. package/templates/shared/package.json.hbs +21 -0
  38. package/templates/shared/scripts/sync-config.ts +242 -0
  39. package/templates/shared/tsconfig.json +12 -0
  40. package/templates/shared/workers/lib/analytics-engine.ts +357 -0
  41. package/templates/shared/workers/lib/billing.ts +293 -0
  42. package/templates/shared/workers/lib/circuit-breaker-middleware.ts +25 -0
  43. package/templates/shared/workers/lib/control.ts +292 -0
  44. package/templates/shared/workers/lib/economics.ts +368 -0
  45. package/templates/shared/workers/lib/metrics.ts +103 -0
  46. package/templates/shared/workers/lib/platform-settings.ts +407 -0
  47. package/templates/shared/workers/lib/shared/allowances.ts +333 -0
  48. package/templates/shared/workers/lib/shared/cloudflare.ts +1362 -0
  49. package/templates/shared/workers/lib/shared/types.ts +58 -0
  50. package/templates/shared/workers/lib/telemetry-sampling.ts +360 -0
  51. package/templates/shared/workers/lib/usage/collectors/example.ts +96 -0
  52. package/templates/shared/workers/lib/usage/collectors/index.ts +128 -0
  53. package/templates/shared/workers/lib/usage/handlers/audit.ts +306 -0
  54. package/templates/shared/workers/lib/usage/handlers/backfill.ts +845 -0
  55. package/templates/shared/workers/lib/usage/handlers/behavioral.ts +429 -0
  56. package/templates/shared/workers/lib/usage/handlers/data-queries.ts +507 -0
  57. package/templates/shared/workers/lib/usage/handlers/dlq-admin.ts +364 -0
  58. package/templates/shared/workers/lib/usage/handlers/health-trends.ts +222 -0
  59. package/templates/shared/workers/lib/usage/handlers/index.ts +35 -0
  60. package/templates/shared/workers/lib/usage/handlers/usage-admin.ts +421 -0
  61. package/templates/shared/workers/lib/usage/handlers/usage-features.ts +1262 -0
  62. package/templates/shared/workers/lib/usage/handlers/usage-metrics.ts +2420 -0
  63. package/templates/shared/workers/lib/usage/handlers/usage-settings.ts +610 -0
  64. package/templates/shared/workers/lib/usage/queue/budget-enforcement.ts +1032 -0
  65. package/templates/shared/workers/lib/usage/queue/cost-budget-enforcement.ts +128 -0
  66. package/templates/shared/workers/lib/usage/queue/cost-calculator.ts +77 -0
  67. package/templates/shared/workers/lib/usage/queue/dlq-handler.ts +161 -0
  68. package/templates/shared/workers/lib/usage/queue/index.ts +19 -0
  69. package/templates/shared/workers/lib/usage/queue/telemetry-processor.ts +790 -0
  70. package/templates/shared/workers/lib/usage/scheduled/anomaly-detection.ts +732 -0
  71. package/templates/shared/workers/lib/usage/scheduled/data-collection.ts +956 -0
  72. package/templates/shared/workers/lib/usage/scheduled/error-digest.ts +343 -0
  73. package/templates/shared/workers/lib/usage/scheduled/index.ts +18 -0
  74. package/templates/shared/workers/lib/usage/scheduled/rollups.ts +1561 -0
  75. package/templates/shared/workers/lib/usage/shared/constants.ts +362 -0
  76. package/templates/shared/workers/lib/usage/shared/index.ts +14 -0
  77. package/templates/shared/workers/lib/usage/shared/types.ts +1066 -0
  78. package/templates/shared/workers/lib/usage/shared/utils.ts +795 -0
  79. package/templates/shared/workers/platform-usage.ts +1915 -0
  80. package/templates/shared/wrangler.usage.jsonc.hbs +58 -0
  81. package/templates/standard/migrations/005_error_collection.sql +162 -0
  82. package/templates/standard/workers/error-collector.ts +2670 -0
  83. package/templates/standard/workers/lib/error-collector/capture.ts +213 -0
  84. package/templates/standard/workers/lib/error-collector/digest.ts +448 -0
  85. package/templates/standard/workers/lib/error-collector/email-health-alerts.ts +262 -0
  86. package/templates/standard/workers/lib/error-collector/fingerprint.ts +258 -0
  87. package/templates/standard/workers/lib/error-collector/gap-alerts.ts +293 -0
  88. package/templates/standard/workers/lib/error-collector/github.ts +329 -0
  89. package/templates/standard/workers/lib/error-collector/types.ts +262 -0
  90. package/templates/standard/workers/lib/sentinel/gap-detection.ts +734 -0
  91. package/templates/standard/workers/lib/shared/slack-alerts.ts +585 -0
  92. package/templates/standard/workers/platform-sentinel.ts +1744 -0
  93. package/templates/standard/wrangler.error-collector.jsonc.hbs +44 -0
  94. package/templates/standard/wrangler.sentinel.jsonc.hbs +45 -0
@@ -0,0 +1,1066 @@
1
+ /**
2
+ * Platform Usage Types
3
+ *
4
+ * Shared type definitions extracted from platform-usage.ts.
5
+ * These types are used across handlers, scheduled tasks, and queue processing.
6
+ */
7
+
8
+ import type {
9
+ KVNamespace,
10
+ D1Database,
11
+ Queue,
12
+ AnalyticsEngineDataset,
13
+ Fetcher,
14
+ } from '@cloudflare/workers-types';
15
+ import type { TelemetryMessage, FeatureMetrics } from '@littlebearapps/platform-consumer-sdk';
16
+ import type {
17
+ TimePeriod,
18
+ DateRange,
19
+ CompareMode,
20
+ AccountUsage,
21
+ CostBreakdown,
22
+ ProjectCostBreakdown,
23
+ ThresholdAnalysis,
24
+ SparklineData,
25
+ WorkersErrorBreakdown,
26
+ QueuesMetrics,
27
+ CacheAnalytics,
28
+ PeriodComparison,
29
+ ResourceType,
30
+ DailyCostData,
31
+ WorkersAISummary,
32
+ } from '../../shared/cloudflare';
33
+ import type { BillingSettings } from '../../billing';
34
+ import type { PlatformSettings } from '../../platform-settings';
35
+
36
+ // =============================================================================
37
+ // ENVIRONMENT
38
+ // =============================================================================
39
+
40
+ /**
41
+ * Worker environment bindings
42
+ */
43
+ export interface Env {
44
+ PLATFORM_CACHE: KVNamespace;
45
+ PLATFORM_DB: D1Database;
46
+ CLOUDFLARE_ACCOUNT_ID: string;
47
+ CLOUDFLARE_API_TOKEN: string;
48
+ SLACK_WEBHOOK_URL?: string;
49
+ GITHUB_TOKEN?: string;
50
+ // GitHub Enterprise (for consumed-licenses API)
51
+ GITHUB_PAT?: string; // PAT with read:enterprise scope (falls back to GITHUB_TOKEN)
52
+ GITHUB_ENTERPRISE_SLUG?: string; // Enterprise slug for license queries
53
+ // Third-party provider API keys
54
+ ANTHROPIC_ADMIN_API_KEY?: string;
55
+ OPENAI_ADMIN_API_KEY?: string; // Admin key (sk-admin-...) required for Usage API
56
+ RESEND_API_KEY?: string;
57
+ APIFY_API_KEY?: string;
58
+ // Additional AI providers
59
+ DEEPSEEK_API_KEY?: string;
60
+ MINIMAX_API_KEY?: string;
61
+ GCP_PROJECT_ID?: string;
62
+ GCP_SERVICE_ACCOUNT_JSON?: string; // JSON string for service account credentials
63
+ // Live usage API authentication
64
+ USAGE_API_KEY?: string;
65
+ // Platform SDK bindings (pilot integration)
66
+ PLATFORM_TELEMETRY: Queue<TelemetryMessage>;
67
+ PLATFORM_DLQ: Queue<TelemetryMessage>; // Dead Letter Queue for failed messages
68
+ PLATFORM_ANALYTICS: AnalyticsEngineDataset;
69
+ // Service bindings
70
+ ALERT_ROUTER?: Fetcher;
71
+ NOTIFICATIONS_API?: Fetcher; // For creating dashboard notifications
72
+ // Gatus heartbeat ping URL for cron monitoring
73
+ GATUS_HEARTBEAT_URL?: string;
74
+ GATUS_TOKEN?: string;
75
+ }
76
+
77
+ // =============================================================================
78
+ // BUDGET CHECKING TYPES
79
+ // =============================================================================
80
+
81
+ /**
82
+ * Daily limits structure stored in KV (snake_case, matching budgets.yaml).
83
+ * Used for budget checking in queue handler.
84
+ */
85
+ export interface DailyLimits {
86
+ d1_writes?: number;
87
+ d1_reads?: number;
88
+ d1_rows_read?: number;
89
+ d1_rows_written?: number;
90
+ kv_reads?: number;
91
+ kv_writes?: number;
92
+ kv_deletes?: number;
93
+ kv_lists?: number;
94
+ r2_class_a?: number;
95
+ r2_class_b?: number;
96
+ ai_requests?: number;
97
+ ai_neurons?: number;
98
+ vectorize_queries?: number;
99
+ vectorize_inserts?: number;
100
+ queue_messages?: number;
101
+ do_requests?: number;
102
+ workflow_invocations?: number;
103
+ requests?: number;
104
+ cpu_ms?: number;
105
+ }
106
+
107
+ /**
108
+ * Monthly limits structure stored in KV (same fields as DailyLimits).
109
+ * Checked once daily at midnight via checkMonthlyBudgets().
110
+ * KV key: CONFIG:FEATURE:{feature_key}:BUDGET_MONTHLY
111
+ */
112
+ export type MonthlyLimits = DailyLimits;
113
+
114
+ // =============================================================================
115
+ // ADAPTIVE SAMPLING
116
+ // =============================================================================
117
+
118
+ /**
119
+ * Sampling mode based on D1 write usage.
120
+ * Higher modes collect less frequently but never stop completely.
121
+ */
122
+ export enum SamplingMode {
123
+ FULL = 1, // Every hour (< 60% of D1 limit)
124
+ HALF = 2, // Every 2 hours (60-80% of limit)
125
+ QUARTER = 4, // Every 4 hours (80-90% of limit)
126
+ MINIMAL = 24, // Daily only (> 90% of limit)
127
+ }
128
+
129
+ // =============================================================================
130
+ // DELTA CALCULATION TYPES
131
+ // =============================================================================
132
+
133
+ /**
134
+ * Previous hour's cumulative metric values for delta calculation.
135
+ * These are the raw cumulative values from the last GraphQL collection.
136
+ */
137
+ export interface PreviousHourMetrics {
138
+ snapshotHour: string; // YYYY-MM-DDTHH:00:00Z when these values were recorded
139
+ timestamp: number; // Unix timestamp
140
+
141
+ // Durable Objects (counters - need delta)
142
+ do: {
143
+ requests: number;
144
+ gbSeconds: number;
145
+ storageReadUnits: number;
146
+ storageWriteUnits: number;
147
+ storageDeleteUnits: number;
148
+ };
149
+
150
+ // Workers AI (counters - need delta)
151
+ workersAI: {
152
+ neurons: number;
153
+ requests: number;
154
+ };
155
+
156
+ // Vectorize (counters - need delta)
157
+ vectorize: {
158
+ queries: number;
159
+ };
160
+
161
+ // Queues (counters - need delta)
162
+ queues: {
163
+ produced: number;
164
+ consumed: number;
165
+ };
166
+
167
+ // Workflows (counters - need delta)
168
+ workflows: {
169
+ executions: number;
170
+ successes: number;
171
+ failures: number;
172
+ wallTimeMs: number;
173
+ cpuTimeMs: number;
174
+ };
175
+
176
+ // Workers (counters - need delta)
177
+ workers: {
178
+ requests: number;
179
+ errors: number;
180
+ cpuTimeMs: number;
181
+ };
182
+
183
+ // D1 (counters - need delta)
184
+ d1: {
185
+ rowsRead: number;
186
+ rowsWritten: number;
187
+ };
188
+
189
+ // KV (counters - need delta)
190
+ kv: {
191
+ reads: number;
192
+ writes: number;
193
+ deletes: number;
194
+ lists: number;
195
+ };
196
+
197
+ // R2 (counters - need delta)
198
+ r2: {
199
+ classAOps: number;
200
+ classBOps: number;
201
+ egressBytes: number;
202
+ };
203
+
204
+ // AI Gateway (counters - need delta)
205
+ aiGateway: {
206
+ requests: number;
207
+ tokensIn: number;
208
+ tokensOut: number;
209
+ cached: number;
210
+ };
211
+
212
+ // Pages (counters - need delta)
213
+ pages: {
214
+ deployments: number;
215
+ bandwidthBytes: number;
216
+ };
217
+
218
+ // Per-project cumulative metrics for delta calculation
219
+ projects?: Record<
220
+ string,
221
+ {
222
+ workersRequests: number;
223
+ workersErrors: number;
224
+ workersCpuTimeMs: number;
225
+ d1RowsRead: number;
226
+ d1RowsWritten: number;
227
+ kvReads: number;
228
+ kvWrites: number;
229
+ kvDeletes: number;
230
+ kvLists: number;
231
+ r2ClassAOps: number;
232
+ r2ClassBOps: number;
233
+ doRequests: number;
234
+ doGbSeconds: number;
235
+ }
236
+ >;
237
+ }
238
+
239
+ /**
240
+ * Delta values for all metric types.
241
+ * These represent the change from the previous hour.
242
+ */
243
+ export interface MetricDeltas {
244
+ do: {
245
+ requests: number;
246
+ gbSeconds: number;
247
+ storageReadUnits: number;
248
+ storageWriteUnits: number;
249
+ storageDeleteUnits: number;
250
+ };
251
+ workersAI: {
252
+ neurons: number;
253
+ requests: number;
254
+ };
255
+ vectorize: {
256
+ queries: number;
257
+ };
258
+ queues: {
259
+ produced: number;
260
+ consumed: number;
261
+ };
262
+ workflows: {
263
+ executions: number;
264
+ successes: number;
265
+ failures: number;
266
+ wallTimeMs: number;
267
+ cpuTimeMs: number;
268
+ };
269
+ workers: {
270
+ requests: number;
271
+ errors: number;
272
+ cpuTimeMs: number;
273
+ };
274
+ d1: {
275
+ rowsRead: number;
276
+ rowsWritten: number;
277
+ };
278
+ kv: {
279
+ reads: number;
280
+ writes: number;
281
+ deletes: number;
282
+ lists: number;
283
+ };
284
+ r2: {
285
+ classAOps: number;
286
+ classBOps: number;
287
+ egressBytes: number;
288
+ };
289
+ aiGateway: {
290
+ requests: number;
291
+ tokensIn: number;
292
+ tokensOut: number;
293
+ cached: number;
294
+ };
295
+ pages: {
296
+ deployments: number;
297
+ bandwidthBytes: number;
298
+ };
299
+ }
300
+
301
+ // =============================================================================
302
+ // PRICING TYPES
303
+ // =============================================================================
304
+
305
+ /**
306
+ * Platform pricing configuration loaded from KV.
307
+ * Falls back to hardcoded defaults from CF_PRICING if KV is empty.
308
+ */
309
+ export interface PlatformPricing {
310
+ version: string;
311
+ workers: {
312
+ baseCostMonthly: number;
313
+ includedRequests: number;
314
+ requestsPerMillion: number;
315
+ cpuMsPerMillion: number;
316
+ };
317
+ d1: {
318
+ rowsReadPerBillion: number;
319
+ rowsWrittenPerMillion: number;
320
+ storagePerGb: number;
321
+ };
322
+ kv: {
323
+ readsPerMillion: number;
324
+ writesPerMillion: number;
325
+ deletesPerMillion: number;
326
+ listsPerMillion: number;
327
+ storagePerGb: number;
328
+ };
329
+ r2: {
330
+ storagePerGbMonth: number;
331
+ classAPerMillion: number;
332
+ classBPerMillion: number;
333
+ };
334
+ vectorize: {
335
+ storedDimensionsPerMillion: number;
336
+ queriedDimensionsPerMillion: number;
337
+ };
338
+ workersAI: {
339
+ neuronsPerThousand: number;
340
+ };
341
+ durableObjects: {
342
+ requestsPerMillion: number;
343
+ gbSecondsPerMillion: number;
344
+ storagePerGbMonth: number;
345
+ readsPerMillion: number;
346
+ writesPerMillion: number;
347
+ deletesPerMillion: number;
348
+ };
349
+ queues: {
350
+ messagesPerMillion: number;
351
+ operationsPerMillion: number;
352
+ };
353
+ pages: {
354
+ buildCost: number;
355
+ bandwidthPerGb: number;
356
+ };
357
+ }
358
+
359
+ // =============================================================================
360
+ // API RESPONSE TYPES
361
+ // =============================================================================
362
+
363
+ /**
364
+ * Usage API response
365
+ */
366
+ export interface UsageResponse {
367
+ success: boolean;
368
+ period: TimePeriod;
369
+ project: string;
370
+ timestamp: string;
371
+ cached: boolean;
372
+ data: {
373
+ workers: AccountUsage['workers'];
374
+ d1: AccountUsage['d1'];
375
+ kv: AccountUsage['kv'];
376
+ r2: AccountUsage['r2'];
377
+ durableObjects: AccountUsage['durableObjects'];
378
+ vectorize: AccountUsage['vectorize'];
379
+ aiGateway: AccountUsage['aiGateway'];
380
+ pages: AccountUsage['pages'];
381
+ summary: {
382
+ totalWorkers: number;
383
+ totalD1Databases: number;
384
+ totalKVNamespaces: number;
385
+ totalR2Buckets: number;
386
+ totalVectorizeIndexes: number;
387
+ totalAIGateways: number;
388
+ totalPagesProjects: number;
389
+ totalRequests: number;
390
+ totalRowsRead: number;
391
+ totalRowsWritten: number;
392
+ };
393
+ };
394
+ costs: CostBreakdown & {
395
+ formatted: {
396
+ workers: string;
397
+ d1: string;
398
+ kv: string;
399
+ r2: string;
400
+ durableObjects: string;
401
+ vectorize: string;
402
+ aiGateway: string;
403
+ pages: string;
404
+ queues: string;
405
+ workflows: string;
406
+ total: string;
407
+ };
408
+ };
409
+ projectCosts: ProjectCostBreakdown[];
410
+ thresholds: ThresholdAnalysis;
411
+ }
412
+
413
+ /**
414
+ * Enhanced Usage Response with sparklines, trends, and additional metrics
415
+ */
416
+ export interface EnhancedUsageResponse extends UsageResponse {
417
+ sparklines: {
418
+ workersRequests: SparklineData;
419
+ workersErrors: SparklineData;
420
+ d1RowsRead: SparklineData;
421
+ kvReads: SparklineData;
422
+ };
423
+ errorBreakdown: WorkersErrorBreakdown[];
424
+ queues: QueuesMetrics[];
425
+ cache: CacheAnalytics;
426
+ comparison: {
427
+ workersRequests: PeriodComparison;
428
+ workersErrors: PeriodComparison;
429
+ d1RowsRead: PeriodComparison;
430
+ totalCost: PeriodComparison;
431
+ };
432
+ }
433
+
434
+ /**
435
+ * Comparison Response
436
+ */
437
+ export interface ComparisonResponse {
438
+ success: boolean;
439
+ compareMode: CompareMode;
440
+ current: {
441
+ dateRange: DateRange;
442
+ summary: {
443
+ totalWorkers: number;
444
+ totalD1Databases: number;
445
+ totalKVNamespaces: number;
446
+ totalR2Buckets: number;
447
+ totalVectorizeIndexes: number;
448
+ totalAIGateways: number;
449
+ totalPagesProjects: number;
450
+ totalRequests: number;
451
+ totalRowsRead: number;
452
+ totalRowsWritten: number;
453
+ };
454
+ costs: CostBreakdown;
455
+ data: AccountUsage;
456
+ };
457
+ prior: {
458
+ dateRange: DateRange;
459
+ summary: {
460
+ totalWorkers: number;
461
+ totalD1Databases: number;
462
+ totalKVNamespaces: number;
463
+ totalR2Buckets: number;
464
+ totalVectorizeIndexes: number;
465
+ totalAIGateways: number;
466
+ totalPagesProjects: number;
467
+ totalRequests: number;
468
+ totalRowsRead: number;
469
+ totalRowsWritten: number;
470
+ };
471
+ costs: CostBreakdown;
472
+ data: AccountUsage;
473
+ };
474
+ comparison: {
475
+ workersRequests: PeriodComparison;
476
+ workersErrors: PeriodComparison;
477
+ d1RowsRead: PeriodComparison;
478
+ totalCost: PeriodComparison;
479
+ };
480
+ timestamp: string;
481
+ cached: boolean;
482
+ }
483
+
484
+ /**
485
+ * Settings response for alert thresholds
486
+ */
487
+ export interface SettingsResponse {
488
+ success: boolean;
489
+ thresholds: Record<string, unknown>;
490
+ budgetThresholds: {
491
+ softBudgetLimit: number;
492
+ warningThreshold: number;
493
+ };
494
+ updated?: string;
495
+ cached?: boolean;
496
+ responseTimeMs?: number;
497
+ }
498
+
499
+ /**
500
+ * Projected Monthly Burn calculation
501
+ */
502
+ export interface ProjectedBurn {
503
+ currentPeriodDays: number;
504
+ currentPeriodCost: number;
505
+ dailyBurnRate: number;
506
+ projectedMonthlyCost: number;
507
+ projectedVsLastMonthPct: number | null;
508
+ lastMonthCost: number | null;
509
+ confidence: 'low' | 'medium' | 'high';
510
+ }
511
+
512
+ // =============================================================================
513
+ // LIVE USAGE TYPES
514
+ // =============================================================================
515
+
516
+ /**
517
+ * Live usage response interface.
518
+ */
519
+ export interface LiveUsageResponse {
520
+ timestamp: string;
521
+ circuitBreakers: {
522
+ globalStop: boolean;
523
+ activeBreakers: Array<{
524
+ project: string;
525
+ status: 'paused' | 'degraded';
526
+ reason?: string;
527
+ }>;
528
+ };
529
+ adaptiveSampling: {
530
+ mode: string;
531
+ d1Writes24h: number;
532
+ d1WriteLimit: number;
533
+ d1WritePercentage: number;
534
+ };
535
+ latestSnapshot: {
536
+ snapshotHour: string | null;
537
+ workersRequests: number | null;
538
+ d1RowsRead: number | null;
539
+ kvReads: number | null;
540
+ } | null;
541
+ responseTimeMs: number;
542
+ }
543
+
544
+ // =============================================================================
545
+ // FEATURE USAGE TYPES
546
+ // =============================================================================
547
+
548
+ /**
549
+ * Feature usage response for a single feature.
550
+ */
551
+ export interface FeatureUsageData {
552
+ featureKey: string;
553
+ project: string;
554
+ category: string;
555
+ feature: string;
556
+ metrics: Record<string, number>;
557
+ circuitBreaker: {
558
+ enabled: boolean;
559
+ disabledReason?: string;
560
+ disabledAt?: string;
561
+ autoResetAt?: string;
562
+ };
563
+ budget?: Record<string, number>;
564
+ circuitBreakerEnabled?: boolean;
565
+ hasActivity?: boolean;
566
+ /** Last heartbeat timestamp (ISO string) from system_health_checks */
567
+ lastHeartbeat?: string;
568
+ /** Health status from system_health_checks (e.g., 'healthy') */
569
+ healthStatus?: string;
570
+ }
571
+
572
+ // =============================================================================
573
+ // WORKERS AI TYPES
574
+ // =============================================================================
575
+
576
+ /**
577
+ * Workers AI response interface
578
+ */
579
+ export interface WorkersAIResponse {
580
+ success: boolean;
581
+ period: string;
582
+ data: WorkersAISummary;
583
+ cached: boolean;
584
+ timestamp: string;
585
+ responseTimeMs?: number;
586
+ }
587
+
588
+ // =============================================================================
589
+ // DAILY COST TYPES
590
+ // =============================================================================
591
+
592
+ /**
593
+ * Daily cost response interface
594
+ */
595
+ export interface DailyCostResponse {
596
+ success: boolean;
597
+ period: string; // Display period like '24h', '7d', '30d'
598
+ data: DailyCostData;
599
+ cached: boolean;
600
+ timestamp: string;
601
+ responseTimeMs?: number;
602
+ }
603
+
604
+ // =============================================================================
605
+ // UTILIZATION & BURN RATE TYPES
606
+ // =============================================================================
607
+
608
+ /**
609
+ * Utilization status for service-level metrics
610
+ */
611
+ export type ServiceUtilizationStatus = 'ok' | 'warning' | 'critical' | 'overage';
612
+
613
+ /**
614
+ * Resource metric for the usage overview dashboard
615
+ */
616
+ export interface ResourceMetricData {
617
+ id: string;
618
+ label: string;
619
+ provider: 'cloudflare' | 'github';
620
+ current: number;
621
+ limit: number | null;
622
+ unit: string;
623
+ percentage: number;
624
+ costEstimate: number;
625
+ status: ServiceUtilizationStatus;
626
+ overage: number;
627
+ overageCost: number;
628
+ }
629
+
630
+ /**
631
+ * Provider health summary
632
+ */
633
+ export interface ProviderHealthData {
634
+ provider: 'cloudflare' | 'github';
635
+ percentage: number;
636
+ warnings: number;
637
+ status: ServiceUtilizationStatus;
638
+ }
639
+
640
+ /**
641
+ * Project utilization data for UI
642
+ */
643
+ export interface ProjectUtilizationData {
644
+ projectId: string;
645
+ projectName: string;
646
+ primaryResource: string;
647
+ mtdCost: number;
648
+ costDeltaPct: number;
649
+ utilizationPct: number;
650
+ utilizationCurrent: number;
651
+ utilizationLimit: number;
652
+ utilizationUnit: string;
653
+ status: 'green' | 'yellow' | 'red';
654
+ sparklineData: number[];
655
+ circuitBreakerStatus: 'active' | 'tripped' | 'degraded' | 'disabled';
656
+ circuitBreakerLabel: string;
657
+ hasCBEnabled: boolean;
658
+ }
659
+
660
+ /**
661
+ * GitHub usage data for the utilization response
662
+ */
663
+ export interface GitHubUsageResponse {
664
+ mtdUsage: {
665
+ actionsMinutes: number;
666
+ actionsMinutesIncluded: number;
667
+ actionsMinutesUsagePct: number;
668
+ actionsStorageGbHours: number;
669
+ actionsStorageGbIncluded: number;
670
+ ghecUserMonths: number;
671
+ ghasCodeSecuritySeats: number;
672
+ ghasSecretProtectionSeats: number;
673
+ totalCost: number;
674
+ };
675
+ plan: {
676
+ name: string;
677
+ filledSeats: number;
678
+ totalSeats: number;
679
+ };
680
+ lastUpdated: string | null;
681
+ isStale: boolean;
682
+ }
683
+
684
+ /**
685
+ * Burn rate response data
686
+ */
687
+ export interface BurnRateResponse {
688
+ success: boolean;
689
+ burnRate: {
690
+ mtdCost: number;
691
+ mtdStartDate: string;
692
+ mtdEndDate: string;
693
+ projectedMonthlyCost: number;
694
+ dailyBurnRate: number;
695
+ daysIntoMonth: number;
696
+ daysRemaining: number;
697
+ confidence: 'low' | 'medium' | 'high';
698
+ vsLastMonthPct: number | null;
699
+ billingPeriodStart: string;
700
+ billingPeriodEnd: string;
701
+ status: 'green' | 'yellow' | 'red';
702
+ statusLabel: string;
703
+ statusDetail: string;
704
+ };
705
+ projects: ProjectUtilizationData[];
706
+ github: GitHubUsageResponse | null;
707
+ health?: {
708
+ cloudflare: ProviderHealthData;
709
+ github: ProviderHealthData;
710
+ };
711
+ cloudflareServices?: ResourceMetricData[];
712
+ githubServices?: ResourceMetricData[];
713
+ timestamp: string;
714
+ cached: boolean;
715
+ responseTimeMs?: number;
716
+ }
717
+
718
+ /**
719
+ * Budget threshold settings from D1 usage_settings table
720
+ */
721
+ export interface BudgetThresholds {
722
+ softBudgetLimit: number;
723
+ warningThreshold: number;
724
+ }
725
+
726
+ // =============================================================================
727
+ // ANOMALY DETECTION TYPES
728
+ // =============================================================================
729
+
730
+ /**
731
+ * Rolling stats for anomaly detection.
732
+ * Uses avg/stddev/samples to match the actual implementation.
733
+ */
734
+ export interface RollingStats {
735
+ avg: number;
736
+ stddev: number;
737
+ samples: number;
738
+ }
739
+
740
+ /**
741
+ * Anomaly record from D1 (matches actual table schema).
742
+ * Note: D1 returns integers for timestamps and booleans (0/1).
743
+ */
744
+ export interface AnomalyRecord {
745
+ id: number;
746
+ detected_at: number; // Unix timestamp (seconds)
747
+ metric_name: string;
748
+ project: string;
749
+ current_value: number;
750
+ rolling_avg: number;
751
+ rolling_stddev?: number;
752
+ deviation_factor: number;
753
+ alert_sent: number; // 0 or 1
754
+ alert_channel: string | null;
755
+ resolved: number; // 0 or 1
756
+ resolved_at: number | null; // Unix timestamp (seconds)
757
+ resolved_by: string | null;
758
+ }
759
+
760
+ /**
761
+ * Anomalies response
762
+ */
763
+ export interface AnomaliesResponse {
764
+ success: boolean;
765
+ anomalies: Array<{
766
+ id: number;
767
+ detectedAt: string;
768
+ metric: string;
769
+ project: string;
770
+ currentValue: number;
771
+ rollingAvg: number;
772
+ deviationFactor: number;
773
+ alertSent: boolean;
774
+ alertChannel: string | null;
775
+ resolved: boolean;
776
+ resolvedAt: string | null;
777
+ resolvedBy: string | null;
778
+ }>;
779
+ total: number;
780
+ timestamp: string;
781
+ cached: boolean;
782
+ }
783
+
784
+ // =============================================================================
785
+ // GITHUB BILLING TYPES
786
+ // =============================================================================
787
+
788
+ /**
789
+ * GitHub billing usage item from the new API.
790
+ */
791
+ export interface GitHubUsageItem {
792
+ date: string;
793
+ product: string;
794
+ sku: string;
795
+ quantity: number;
796
+ unitType: string;
797
+ pricePerUnit: number;
798
+ grossAmount: number;
799
+ discountAmount: number;
800
+ netAmount: number;
801
+ organizationName: string;
802
+ repositoryName: string;
803
+ }
804
+
805
+ /**
806
+ * GitHub organization plan info from /orgs/{org} endpoint.
807
+ */
808
+ export interface GitHubPlanInfo {
809
+ planName: string;
810
+ filledSeats: number;
811
+ totalSeats: number;
812
+ privateRepos: number;
813
+ }
814
+
815
+ /**
816
+ * Aggregated GitHub billing data.
817
+ */
818
+ export interface GitHubBillingData {
819
+ plan: GitHubPlanInfo;
820
+ actionsMinutes: number;
821
+ actionsMinutesCost: number;
822
+ actionsStorageGbHours: number;
823
+ actionsStorageCost: number;
824
+ ghecUserMonths: number;
825
+ ghecCost: number;
826
+ ghasCodeSecurityUserMonths: number;
827
+ ghasCodeSecurityCost: number;
828
+ ghasSecretProtectionUserMonths: number;
829
+ ghasSecretProtectionCost: number;
830
+ /** Packages storage in GB */
831
+ packagesStorageGb: number;
832
+ packagesStorageCost: number;
833
+ /** Packages bandwidth in GB */
834
+ packagesBandwidthGb: number;
835
+ packagesBandwidthCost: number;
836
+ /** Git LFS storage in GB */
837
+ lfsStorageGb: number;
838
+ lfsStorageCost: number;
839
+ /** Git LFS bandwidth in GB */
840
+ lfsBandwidthGb: number;
841
+ lfsBandwidthCost: number;
842
+ /** Copilot seats */
843
+ copilotSeats: number;
844
+ copilotCost: number;
845
+ totalNetCost: number;
846
+ }
847
+
848
+ /**
849
+ * GitHub plan inclusions (what's included per plan).
850
+ */
851
+ export interface GitHubPlanInclusions {
852
+ actionsMinutesIncluded: number;
853
+ actionsStorageGbIncluded: number;
854
+ packagesStorageGbIncluded: number;
855
+ codespacesHoursIncluded: number;
856
+ }
857
+
858
+ // =============================================================================
859
+ // THIRD-PARTY USAGE TYPES
860
+ // =============================================================================
861
+
862
+ /**
863
+ * Anthropic usage data
864
+ */
865
+ export interface AnthropicUsageData {
866
+ inputTokens: number;
867
+ outputTokens: number;
868
+ cacheCreationTokens?: number;
869
+ cacheReadTokens?: number;
870
+ totalCost: number;
871
+ modelBreakdown: Record<string, { inputTokens: number; outputTokens: number }>;
872
+ }
873
+
874
+ /**
875
+ * OpenAI usage data
876
+ */
877
+ export interface OpenAIUsageData {
878
+ inputTokens: number;
879
+ outputTokens: number;
880
+ totalTokens: number;
881
+ totalCost: number;
882
+ requestCount: number;
883
+ modelBreakdown: Record<string, { inputTokens: number; outputTokens: number; requests: number }>;
884
+ }
885
+
886
+ /**
887
+ * Resend usage data
888
+ */
889
+ export interface ResendUsageData {
890
+ emailsSent: number;
891
+ domainsCount: number;
892
+ }
893
+
894
+ /**
895
+ * Apify usage data
896
+ */
897
+ export interface ApifyUsageData {
898
+ totalUsageCreditsUsd: number;
899
+ actorComputeUnits: number;
900
+ dataTransferGb: number;
901
+ storageGb: number;
902
+ }
903
+
904
+ /**
905
+ * DeepSeek balance data (Stock metric - balance remaining, not usage)
906
+ * @see https://api-docs.deepseek.com/api/get-user-balance
907
+ */
908
+ export interface DeepSeekBalanceData {
909
+ /** Total balance remaining in USD */
910
+ totalBalance: number;
911
+ /** Granted/promotional balance */
912
+ grantedBalance: number;
913
+ /** Topped-up/purchased balance */
914
+ toppedUpBalance: number;
915
+ /** Whether the account is available for API calls */
916
+ isAvailable: boolean;
917
+ /** Currency (typically 'USD') */
918
+ currency: string;
919
+ }
920
+
921
+ /**
922
+ * Minimax quota data (Stock metric - quota remaining, not usage)
923
+ */
924
+ export interface MinimaxQuotaData {
925
+ /** Remaining quota units */
926
+ remainingQuota: number;
927
+ /** Total quota units allocated */
928
+ totalQuota: number;
929
+ /** Usage percentage (0-100) */
930
+ usagePercentage: number;
931
+ /** Plan type (e.g., 'coding_plan') */
932
+ planType: string;
933
+ }
934
+
935
+ /**
936
+ * Google Gemini usage data (Flow metric - actual usage)
937
+ * Collected via Cloud Monitoring API for generativelanguage.googleapis.com
938
+ */
939
+ export interface GeminiUsageData {
940
+ /** Total API requests in the period */
941
+ requestCount: number;
942
+ /** Average latency in milliseconds */
943
+ avgLatencyMs: number;
944
+ /** Estimated cost in USD (based on request counts and Gemini pricing) */
945
+ estimatedCostUsd: number;
946
+ /** Period start timestamp */
947
+ periodStart: string;
948
+ /** Period end timestamp */
949
+ periodEnd: string;
950
+ /** Per-method request breakdown (e.g. GenerateContent, EmbedContent) */
951
+ methodBreakdown: Record<string, number>;
952
+ }
953
+
954
+ // =============================================================================
955
+ // ERROR HANDLING TYPES
956
+ // =============================================================================
957
+
958
+ /**
959
+ * Error alert payload - flexible structure for different alert types
960
+ */
961
+ export interface ErrorAlertPayload {
962
+ type: 'p0_immediate' | 'p1_digest' | 'p2_summary';
963
+ feature_key: string;
964
+ project: string;
965
+ category: string;
966
+ feature: string;
967
+ // P0 immediate alerts
968
+ error_category?: string;
969
+ error_code?: string;
970
+ error_rate?: number;
971
+ window_minutes?: number;
972
+ correlation_id?: string;
973
+ // Digest/summary alerts
974
+ total_errors?: number;
975
+ distinct_types?: number;
976
+ top_errors?: Array<{
977
+ feature_key: string;
978
+ error_category: string;
979
+ count: number;
980
+ }>;
981
+ period_start?: string;
982
+ period_end?: string;
983
+ }
984
+
985
+ // =============================================================================
986
+ // QUEUE PROCESSING TYPES
987
+ // =============================================================================
988
+
989
+ /**
990
+ * Feature batch state for queue processing
991
+ */
992
+ export interface FeatureBatchState {
993
+ cpuMsSamples: number[];
994
+ bcuTotal: number;
995
+ messageCount: number;
996
+ lastTimestamp: number;
997
+ }
998
+
999
+ // =============================================================================
1000
+ // VECTORIZE ATTRIBUTION TYPES
1001
+ // =============================================================================
1002
+
1003
+ /**
1004
+ * Attribution result for Vectorize queries by project.
1005
+ */
1006
+ export interface VectorizeAttribution {
1007
+ byProject: Map<string, number>;
1008
+ unattributed: number;
1009
+ total: number;
1010
+ }
1011
+
1012
+ /**
1013
+ * Project lookup cache for a single request.
1014
+ * Maps "{resourceType}:{resourceName}" -> projectId
1015
+ */
1016
+ export type ProjectLookupCache = Map<string, string>;
1017
+
1018
+ // =============================================================================
1019
+ // RE-EXPORTS
1020
+ // =============================================================================
1021
+
1022
+ // Re-export commonly used types from dependencies
1023
+ export type { TelemetryMessage, FeatureMetrics } from '@littlebearapps/platform-consumer-sdk';
1024
+
1025
+ export type {
1026
+ TimePeriod,
1027
+ DateRange,
1028
+ CompareMode,
1029
+ AccountUsage,
1030
+ CostBreakdown,
1031
+ ProjectCostBreakdown,
1032
+ ThresholdAnalysis,
1033
+ SparklineData,
1034
+ WorkersErrorBreakdown,
1035
+ QueuesMetrics,
1036
+ CacheAnalytics,
1037
+ PeriodComparison,
1038
+ ResourceType,
1039
+ AlertThresholds,
1040
+ ServiceThreshold,
1041
+ WorkersAISummary,
1042
+ AIGatewaySummary,
1043
+ DailyCostData,
1044
+ DailyUsageMetrics,
1045
+ Project,
1046
+ } from '../../shared/cloudflare';
1047
+
1048
+ export type { BillingSettings, BillingPeriod } from '../../billing';
1049
+
1050
+ export type { PlatformSettings } from '../../platform-settings';
1051
+
1052
+ export type {
1053
+ HourlyUsageMetrics,
1054
+ AccountDailyUsage,
1055
+ DailyBillableCostBreakdown,
1056
+ } from '@littlebearapps/platform-consumer-sdk';
1057
+
1058
+ export type { TimeBucketedUsage, TimeBucketQueryParams } from '../../analytics-engine';
1059
+
1060
+ export type { PIDState } from '../../control';
1061
+
1062
+ export type { ReservoirState } from '../../telemetry-sampling';
1063
+
1064
+ export type { BCUResult } from '../../economics';
1065
+
1066
+ export type { CircuitBreakerStatusValue } from '../../circuit-breaker-middleware';