@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.
- package/README.md +112 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +89 -0
- package/dist/prompts.d.ts +27 -0
- package/dist/prompts.js +80 -0
- package/dist/scaffold.d.ts +5 -0
- package/dist/scaffold.js +65 -0
- package/dist/templates.d.ts +16 -0
- package/dist/templates.js +131 -0
- package/package.json +46 -0
- package/templates/full/migrations/006_pattern_discovery.sql +199 -0
- package/templates/full/migrations/007_notifications_search.sql +127 -0
- package/templates/full/workers/lib/pattern-discovery/ai-prompt.ts +644 -0
- package/templates/full/workers/lib/pattern-discovery/clustering.ts +278 -0
- package/templates/full/workers/lib/pattern-discovery/shadow-evaluation.ts +603 -0
- package/templates/full/workers/lib/pattern-discovery/storage.ts +806 -0
- package/templates/full/workers/lib/pattern-discovery/types.ts +159 -0
- package/templates/full/workers/lib/pattern-discovery/validation.ts +278 -0
- package/templates/full/workers/pattern-discovery.ts +661 -0
- package/templates/full/workers/platform-alert-router.ts +1809 -0
- package/templates/full/workers/platform-notifications.ts +424 -0
- package/templates/full/workers/platform-search.ts +480 -0
- package/templates/full/workers/platform-settings.ts +436 -0
- package/templates/full/wrangler.alert-router.jsonc.hbs +34 -0
- package/templates/full/wrangler.notifications.jsonc.hbs +23 -0
- package/templates/full/wrangler.pattern-discovery.jsonc.hbs +33 -0
- package/templates/full/wrangler.search.jsonc.hbs +16 -0
- package/templates/full/wrangler.settings.jsonc.hbs +23 -0
- package/templates/shared/README.md.hbs +69 -0
- package/templates/shared/config/budgets.yaml.hbs +72 -0
- package/templates/shared/config/services.yaml.hbs +45 -0
- package/templates/shared/migrations/001_core_tables.sql +117 -0
- package/templates/shared/migrations/002_usage_warehouse.sql +830 -0
- package/templates/shared/migrations/003_feature_tracking.sql +250 -0
- package/templates/shared/migrations/004_settings_alerts.sql +452 -0
- package/templates/shared/migrations/seed.sql.hbs +4 -0
- package/templates/shared/package.json.hbs +21 -0
- package/templates/shared/scripts/sync-config.ts +242 -0
- package/templates/shared/tsconfig.json +12 -0
- package/templates/shared/workers/lib/analytics-engine.ts +357 -0
- package/templates/shared/workers/lib/billing.ts +293 -0
- package/templates/shared/workers/lib/circuit-breaker-middleware.ts +25 -0
- package/templates/shared/workers/lib/control.ts +292 -0
- package/templates/shared/workers/lib/economics.ts +368 -0
- package/templates/shared/workers/lib/metrics.ts +103 -0
- package/templates/shared/workers/lib/platform-settings.ts +407 -0
- package/templates/shared/workers/lib/shared/allowances.ts +333 -0
- package/templates/shared/workers/lib/shared/cloudflare.ts +1362 -0
- package/templates/shared/workers/lib/shared/types.ts +58 -0
- package/templates/shared/workers/lib/telemetry-sampling.ts +360 -0
- package/templates/shared/workers/lib/usage/collectors/example.ts +96 -0
- package/templates/shared/workers/lib/usage/collectors/index.ts +128 -0
- package/templates/shared/workers/lib/usage/handlers/audit.ts +306 -0
- package/templates/shared/workers/lib/usage/handlers/backfill.ts +845 -0
- package/templates/shared/workers/lib/usage/handlers/behavioral.ts +429 -0
- package/templates/shared/workers/lib/usage/handlers/data-queries.ts +507 -0
- package/templates/shared/workers/lib/usage/handlers/dlq-admin.ts +364 -0
- package/templates/shared/workers/lib/usage/handlers/health-trends.ts +222 -0
- package/templates/shared/workers/lib/usage/handlers/index.ts +35 -0
- package/templates/shared/workers/lib/usage/handlers/usage-admin.ts +421 -0
- package/templates/shared/workers/lib/usage/handlers/usage-features.ts +1262 -0
- package/templates/shared/workers/lib/usage/handlers/usage-metrics.ts +2420 -0
- package/templates/shared/workers/lib/usage/handlers/usage-settings.ts +610 -0
- package/templates/shared/workers/lib/usage/queue/budget-enforcement.ts +1032 -0
- package/templates/shared/workers/lib/usage/queue/cost-budget-enforcement.ts +128 -0
- package/templates/shared/workers/lib/usage/queue/cost-calculator.ts +77 -0
- package/templates/shared/workers/lib/usage/queue/dlq-handler.ts +161 -0
- package/templates/shared/workers/lib/usage/queue/index.ts +19 -0
- package/templates/shared/workers/lib/usage/queue/telemetry-processor.ts +790 -0
- package/templates/shared/workers/lib/usage/scheduled/anomaly-detection.ts +732 -0
- package/templates/shared/workers/lib/usage/scheduled/data-collection.ts +956 -0
- package/templates/shared/workers/lib/usage/scheduled/error-digest.ts +343 -0
- package/templates/shared/workers/lib/usage/scheduled/index.ts +18 -0
- package/templates/shared/workers/lib/usage/scheduled/rollups.ts +1561 -0
- package/templates/shared/workers/lib/usage/shared/constants.ts +362 -0
- package/templates/shared/workers/lib/usage/shared/index.ts +14 -0
- package/templates/shared/workers/lib/usage/shared/types.ts +1066 -0
- package/templates/shared/workers/lib/usage/shared/utils.ts +795 -0
- package/templates/shared/workers/platform-usage.ts +1915 -0
- package/templates/shared/wrangler.usage.jsonc.hbs +58 -0
- package/templates/standard/migrations/005_error_collection.sql +162 -0
- package/templates/standard/workers/error-collector.ts +2670 -0
- package/templates/standard/workers/lib/error-collector/capture.ts +213 -0
- package/templates/standard/workers/lib/error-collector/digest.ts +448 -0
- package/templates/standard/workers/lib/error-collector/email-health-alerts.ts +262 -0
- package/templates/standard/workers/lib/error-collector/fingerprint.ts +258 -0
- package/templates/standard/workers/lib/error-collector/gap-alerts.ts +293 -0
- package/templates/standard/workers/lib/error-collector/github.ts +329 -0
- package/templates/standard/workers/lib/error-collector/types.ts +262 -0
- package/templates/standard/workers/lib/sentinel/gap-detection.ts +734 -0
- package/templates/standard/workers/lib/shared/slack-alerts.ts +585 -0
- package/templates/standard/workers/platform-sentinel.ts +1744 -0
- package/templates/standard/wrangler.error-collector.jsonc.hbs +44 -0
- 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';
|