@secondlayer/shared 5.2.1 → 6.1.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/dist/src/db/index.d.ts +45 -1
- package/dist/src/db/queries/account-spend-caps.d.ts +44 -0
- package/dist/src/db/queries/account-usage.d.ts +44 -0
- package/dist/src/db/queries/account-usage.js +4 -29
- package/dist/src/db/queries/account-usage.js.map +3 -3
- package/dist/src/db/queries/accounts.d.ts +44 -0
- package/dist/src/db/queries/chain-reorgs.d.ts +532 -0
- package/dist/src/db/queries/chain-reorgs.js +322 -0
- package/dist/src/db/queries/chain-reorgs.js.map +14 -0
- package/dist/src/db/queries/integrity.d.ts +44 -0
- package/dist/src/db/queries/projects.d.ts +44 -0
- package/dist/src/db/queries/provisioning-audit.d.ts +44 -0
- package/dist/src/db/queries/subgraph-gaps.d.ts +44 -0
- package/dist/src/db/queries/subgraph-operations.d.ts +44 -0
- package/dist/src/db/queries/subgraphs.d.ts +44 -0
- package/dist/src/db/queries/subscriptions.d.ts +44 -0
- package/dist/src/db/queries/tenant-compute-addons.d.ts +44 -0
- package/dist/src/db/queries/tenants.d.ts +45 -7
- package/dist/src/db/queries/tenants.js +1 -5
- package/dist/src/db/queries/tenants.js.map +3 -3
- package/dist/src/db/queries/usage.d.ts +47 -1
- package/dist/src/db/queries/usage.js +20 -1
- package/dist/src/db/queries/usage.js.map +3 -3
- package/dist/src/db/schema.d.ts +45 -1
- package/dist/src/index.d.ts +47 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/node/local-client.d.ts +44 -0
- package/dist/src/pricing.d.ts +6 -5
- package/dist/src/pricing.js +4 -29
- package/dist/src/pricing.js.map +3 -3
- package/dist/src/schemas/index.d.ts +2 -2
- package/dist/src/schemas/index.js.map +1 -1
- package/dist/src/schemas/subgraphs.d.ts +2 -2
- package/dist/src/schemas/subgraphs.js.map +1 -1
- package/dist/src/subgraphs/spec.d.ts +2 -2
- package/dist/src/types.d.ts +2 -1
- package/migrations/0064_remove_hobby_plan.ts +28 -0
- package/migrations/0065_l2_decoded_events.ts +50 -0
- package/migrations/0066_public_l2_decoded_events.ts +83 -0
- package/migrations/0067_product_usage_counters.ts +18 -0
- package/migrations/0068_chain_reorgs_and_burn_block_hash.ts +48 -0
- package/package.json +5 -1
package/dist/src/db/index.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ interface BlocksTable {
|
|
|
23
23
|
hash: string;
|
|
24
24
|
parent_hash: string;
|
|
25
25
|
burn_block_height: number;
|
|
26
|
+
burn_block_hash: ColumnType<string | null, string | null | undefined, string | null>;
|
|
26
27
|
timestamp: number;
|
|
27
28
|
canonical: Generated<boolean>;
|
|
28
29
|
created_at: Generated<Date>;
|
|
@@ -163,6 +164,8 @@ interface UsageDailyTable {
|
|
|
163
164
|
date: string;
|
|
164
165
|
api_requests: Generated<number>;
|
|
165
166
|
deliveries: Generated<number>;
|
|
167
|
+
streams_events_returned: Generated<number>;
|
|
168
|
+
index_decoded_events_returned: Generated<number>;
|
|
166
169
|
}
|
|
167
170
|
interface UsageSnapshotsTable {
|
|
168
171
|
id: Generated<string>;
|
|
@@ -291,6 +294,44 @@ interface ProcessedStripeEventsTable {
|
|
|
291
294
|
event_type: string;
|
|
292
295
|
processed_at: Generated<Date>;
|
|
293
296
|
}
|
|
297
|
+
interface DecodedEventsTable {
|
|
298
|
+
cursor: string;
|
|
299
|
+
block_height: number;
|
|
300
|
+
tx_id: string;
|
|
301
|
+
tx_index: number;
|
|
302
|
+
event_index: number;
|
|
303
|
+
event_type: string;
|
|
304
|
+
microblock_hash: string | null;
|
|
305
|
+
canonical: Generated<boolean>;
|
|
306
|
+
contract_id: string | null;
|
|
307
|
+
sender: string | null;
|
|
308
|
+
recipient: string | null;
|
|
309
|
+
amount: string | null;
|
|
310
|
+
asset_identifier: string | null;
|
|
311
|
+
value: string | null;
|
|
312
|
+
memo: string | null;
|
|
313
|
+
source_cursor: string;
|
|
314
|
+
created_at: Generated<Date>;
|
|
315
|
+
}
|
|
316
|
+
interface L2DecoderCheckpointsTable {
|
|
317
|
+
decoder_name: string;
|
|
318
|
+
last_cursor: string | null;
|
|
319
|
+
updated_at: Generated<Date>;
|
|
320
|
+
}
|
|
321
|
+
interface ChainReorgsTable {
|
|
322
|
+
id: Generated<string>;
|
|
323
|
+
detected_at: Generated<Date>;
|
|
324
|
+
fork_point_height: number;
|
|
325
|
+
old_index_block_hash: string | null;
|
|
326
|
+
new_index_block_hash: string | null;
|
|
327
|
+
orphaned_from_height: number;
|
|
328
|
+
orphaned_from_event_index: number;
|
|
329
|
+
orphaned_to_height: number;
|
|
330
|
+
orphaned_to_event_index: number;
|
|
331
|
+
new_canonical_height: number;
|
|
332
|
+
new_canonical_event_index: number;
|
|
333
|
+
created_at: Generated<Date>;
|
|
334
|
+
}
|
|
294
335
|
interface Database {
|
|
295
336
|
blocks: BlocksTable;
|
|
296
337
|
transactions: TransactionsTable;
|
|
@@ -326,6 +367,9 @@ interface Database {
|
|
|
326
367
|
subscriptions: SubscriptionsTable;
|
|
327
368
|
subscription_outbox: SubscriptionOutboxTable;
|
|
328
369
|
subscription_deliveries: SubscriptionDeliveriesTable;
|
|
370
|
+
decoded_events: DecodedEventsTable;
|
|
371
|
+
l2_decoder_checkpoints: L2DecoderCheckpointsTable;
|
|
372
|
+
chain_reorgs: ChainReorgsTable;
|
|
329
373
|
}
|
|
330
374
|
type TenantStatus = "provisioning" | "active" | "limit_warning" | "paused_limit" | "suspended" | "error" | "deleted";
|
|
331
375
|
interface TenantsTable {
|
|
@@ -562,4 +606,4 @@ declare function getDb(connectionString?: string): Kysely<Database>;
|
|
|
562
606
|
declare function getRawClient(role?: "source" | "target"): ReturnType<typeof postgres>;
|
|
563
607
|
/** Close all DB connection pools. Call in CLI commands to allow process exit. */
|
|
564
608
|
declare function closeDb(): Promise<void>;
|
|
565
|
-
export { sql, parseJsonb, jsonb, getTargetDb, getSourceDb, getRawClient, getDb, closeDb, WaitlistTable, UsageSnapshotsTable, UsageSnapshot, UsageDailyTable, UsageDaily, UpdateTransaction, UpdateTenantUsageMonthly, UpdateTenantComputeAddon, UpdateTenant, UpdateSubscriptionOutbox, UpdateSubscription, UpdateSubgraphOperation, UpdateSubgraph, UpdateProject, UpdateIndexProgress, UpdateEvent, UpdateChatSession, UpdateBlock, UpdateApiKey, UpdateAccountSpendCap, TransactionsTable, Transaction, TenantsTable, TenantUsageMonthlyTable, TenantUsageMonthly, TenantStatus, TenantComputeAddonsTable, TenantComputeAddon, Tenant, TeamMembersTable, TeamMember, TeamInvitationsTable, TeamInvitation, SubscriptionsTable, SubscriptionStatus, SubscriptionRuntime, SubscriptionOutboxTable, SubscriptionOutbox, SubscriptionFormat, SubscriptionDelivery, SubscriptionDeliveriesTable, Subscription, SubgraphsTable, SubgraphUsageDailyTable, SubgraphUsageDaily, SubgraphTableSnapshotsTable, SubgraphProcessingStatsTable, SubgraphOperationsTable, SubgraphOperationStatus, SubgraphOperationKind, SubgraphOperation, SubgraphHealthSnapshotsTable, SubgraphHealthSnapshot, SubgraphGapsTable, SubgraphGap, Subgraph, SessionsTable, Session, ProvisioningAuditStatus, ProvisioningAuditLogTable, ProvisioningAuditLog, ProvisioningAuditEvent, ProjectsTable, Project, ProcessedStripeEventsTable, OutboxStatus, MagicLinksTable, MagicLink, InsertTransaction, InsertTenantUsageMonthly, InsertTenantComputeAddon, InsertTenant, InsertTeamMember, InsertTeamInvitation, InsertSubscriptionOutbox, InsertSubscriptionDelivery, InsertSubscription, InsertSubgraphUsageDaily, InsertSubgraphOperation, InsertSubgraphHealthSnapshot, InsertSubgraphGap, InsertSubgraph, InsertSession, InsertProvisioningAuditLog, InsertProject, InsertMagicLink, InsertIndexProgress, InsertEvent, InsertChatSession, InsertChatMessage, InsertBlock, InsertApiKey, InsertAccountSpendCap, InsertAccountInsight, InsertAccountAgentRun, InsertAccount, IndexProgressTable, IndexProgress, EventsTable, Event, Database, ChatSessionsTable, ChatSession, ChatMessagesTable, ChatMessage, BlocksTable, Block, ApiKeysTable, ApiKey, AccountsTable, AccountSpendCapsTable, AccountSpendCap, AccountInsightsTable, AccountInsight, AccountAgentRunsTable, AccountAgentRun, Account };
|
|
609
|
+
export { sql, parseJsonb, jsonb, getTargetDb, getSourceDb, getRawClient, getDb, closeDb, WaitlistTable, UsageSnapshotsTable, UsageSnapshot, UsageDailyTable, UsageDaily, UpdateTransaction, UpdateTenantUsageMonthly, UpdateTenantComputeAddon, UpdateTenant, UpdateSubscriptionOutbox, UpdateSubscription, UpdateSubgraphOperation, UpdateSubgraph, UpdateProject, UpdateIndexProgress, UpdateEvent, UpdateChatSession, UpdateBlock, UpdateApiKey, UpdateAccountSpendCap, TransactionsTable, Transaction, TenantsTable, TenantUsageMonthlyTable, TenantUsageMonthly, TenantStatus, TenantComputeAddonsTable, TenantComputeAddon, Tenant, TeamMembersTable, TeamMember, TeamInvitationsTable, TeamInvitation, SubscriptionsTable, SubscriptionStatus, SubscriptionRuntime, SubscriptionOutboxTable, SubscriptionOutbox, SubscriptionFormat, SubscriptionDelivery, SubscriptionDeliveriesTable, Subscription, SubgraphsTable, SubgraphUsageDailyTable, SubgraphUsageDaily, SubgraphTableSnapshotsTable, SubgraphProcessingStatsTable, SubgraphOperationsTable, SubgraphOperationStatus, SubgraphOperationKind, SubgraphOperation, SubgraphHealthSnapshotsTable, SubgraphHealthSnapshot, SubgraphGapsTable, SubgraphGap, Subgraph, SessionsTable, Session, ProvisioningAuditStatus, ProvisioningAuditLogTable, ProvisioningAuditLog, ProvisioningAuditEvent, ProjectsTable, Project, ProcessedStripeEventsTable, OutboxStatus, MagicLinksTable, MagicLink, L2DecoderCheckpointsTable, InsertTransaction, InsertTenantUsageMonthly, InsertTenantComputeAddon, InsertTenant, InsertTeamMember, InsertTeamInvitation, InsertSubscriptionOutbox, InsertSubscriptionDelivery, InsertSubscription, InsertSubgraphUsageDaily, InsertSubgraphOperation, InsertSubgraphHealthSnapshot, InsertSubgraphGap, InsertSubgraph, InsertSession, InsertProvisioningAuditLog, InsertProject, InsertMagicLink, InsertIndexProgress, InsertEvent, InsertChatSession, InsertChatMessage, InsertBlock, InsertApiKey, InsertAccountSpendCap, InsertAccountInsight, InsertAccountAgentRun, InsertAccount, IndexProgressTable, IndexProgress, EventsTable, Event, DecodedEventsTable, Database, ChatSessionsTable, ChatSession, ChatMessagesTable, ChatMessage, ChainReorgsTable, BlocksTable, Block, ApiKeysTable, ApiKey, AccountsTable, AccountSpendCapsTable, AccountSpendCap, AccountInsightsTable, AccountInsight, AccountAgentRunsTable, AccountAgentRun, Account };
|
|
@@ -5,6 +5,7 @@ interface BlocksTable {
|
|
|
5
5
|
hash: string;
|
|
6
6
|
parent_hash: string;
|
|
7
7
|
burn_block_height: number;
|
|
8
|
+
burn_block_hash: ColumnType<string | null, string | null | undefined, string | null>;
|
|
8
9
|
timestamp: number;
|
|
9
10
|
canonical: Generated<boolean>;
|
|
10
11
|
created_at: Generated<Date>;
|
|
@@ -145,6 +146,8 @@ interface UsageDailyTable {
|
|
|
145
146
|
date: string;
|
|
146
147
|
api_requests: Generated<number>;
|
|
147
148
|
deliveries: Generated<number>;
|
|
149
|
+
streams_events_returned: Generated<number>;
|
|
150
|
+
index_decoded_events_returned: Generated<number>;
|
|
148
151
|
}
|
|
149
152
|
interface UsageSnapshotsTable {
|
|
150
153
|
id: Generated<string>;
|
|
@@ -273,6 +276,44 @@ interface ProcessedStripeEventsTable {
|
|
|
273
276
|
event_type: string;
|
|
274
277
|
processed_at: Generated<Date>;
|
|
275
278
|
}
|
|
279
|
+
interface DecodedEventsTable {
|
|
280
|
+
cursor: string;
|
|
281
|
+
block_height: number;
|
|
282
|
+
tx_id: string;
|
|
283
|
+
tx_index: number;
|
|
284
|
+
event_index: number;
|
|
285
|
+
event_type: string;
|
|
286
|
+
microblock_hash: string | null;
|
|
287
|
+
canonical: Generated<boolean>;
|
|
288
|
+
contract_id: string | null;
|
|
289
|
+
sender: string | null;
|
|
290
|
+
recipient: string | null;
|
|
291
|
+
amount: string | null;
|
|
292
|
+
asset_identifier: string | null;
|
|
293
|
+
value: string | null;
|
|
294
|
+
memo: string | null;
|
|
295
|
+
source_cursor: string;
|
|
296
|
+
created_at: Generated<Date>;
|
|
297
|
+
}
|
|
298
|
+
interface L2DecoderCheckpointsTable {
|
|
299
|
+
decoder_name: string;
|
|
300
|
+
last_cursor: string | null;
|
|
301
|
+
updated_at: Generated<Date>;
|
|
302
|
+
}
|
|
303
|
+
interface ChainReorgsTable {
|
|
304
|
+
id: Generated<string>;
|
|
305
|
+
detected_at: Generated<Date>;
|
|
306
|
+
fork_point_height: number;
|
|
307
|
+
old_index_block_hash: string | null;
|
|
308
|
+
new_index_block_hash: string | null;
|
|
309
|
+
orphaned_from_height: number;
|
|
310
|
+
orphaned_from_event_index: number;
|
|
311
|
+
orphaned_to_height: number;
|
|
312
|
+
orphaned_to_event_index: number;
|
|
313
|
+
new_canonical_height: number;
|
|
314
|
+
new_canonical_event_index: number;
|
|
315
|
+
created_at: Generated<Date>;
|
|
316
|
+
}
|
|
276
317
|
interface Database {
|
|
277
318
|
blocks: BlocksTable;
|
|
278
319
|
transactions: TransactionsTable;
|
|
@@ -308,6 +349,9 @@ interface Database {
|
|
|
308
349
|
subscriptions: SubscriptionsTable;
|
|
309
350
|
subscription_outbox: SubscriptionOutboxTable;
|
|
310
351
|
subscription_deliveries: SubscriptionDeliveriesTable;
|
|
352
|
+
decoded_events: DecodedEventsTable;
|
|
353
|
+
l2_decoder_checkpoints: L2DecoderCheckpointsTable;
|
|
354
|
+
chain_reorgs: ChainReorgsTable;
|
|
311
355
|
}
|
|
312
356
|
type TenantStatus = "provisioning" | "active" | "limit_warning" | "paused_limit" | "suspended" | "error" | "deleted";
|
|
313
357
|
interface TenantsTable {
|
|
@@ -5,6 +5,7 @@ interface BlocksTable {
|
|
|
5
5
|
hash: string;
|
|
6
6
|
parent_hash: string;
|
|
7
7
|
burn_block_height: number;
|
|
8
|
+
burn_block_hash: ColumnType<string | null, string | null | undefined, string | null>;
|
|
8
9
|
timestamp: number;
|
|
9
10
|
canonical: Generated<boolean>;
|
|
10
11
|
created_at: Generated<Date>;
|
|
@@ -145,6 +146,8 @@ interface UsageDailyTable {
|
|
|
145
146
|
date: string;
|
|
146
147
|
api_requests: Generated<number>;
|
|
147
148
|
deliveries: Generated<number>;
|
|
149
|
+
streams_events_returned: Generated<number>;
|
|
150
|
+
index_decoded_events_returned: Generated<number>;
|
|
148
151
|
}
|
|
149
152
|
interface UsageSnapshotsTable {
|
|
150
153
|
id: Generated<string>;
|
|
@@ -273,6 +276,44 @@ interface ProcessedStripeEventsTable {
|
|
|
273
276
|
event_type: string;
|
|
274
277
|
processed_at: Generated<Date>;
|
|
275
278
|
}
|
|
279
|
+
interface DecodedEventsTable {
|
|
280
|
+
cursor: string;
|
|
281
|
+
block_height: number;
|
|
282
|
+
tx_id: string;
|
|
283
|
+
tx_index: number;
|
|
284
|
+
event_index: number;
|
|
285
|
+
event_type: string;
|
|
286
|
+
microblock_hash: string | null;
|
|
287
|
+
canonical: Generated<boolean>;
|
|
288
|
+
contract_id: string | null;
|
|
289
|
+
sender: string | null;
|
|
290
|
+
recipient: string | null;
|
|
291
|
+
amount: string | null;
|
|
292
|
+
asset_identifier: string | null;
|
|
293
|
+
value: string | null;
|
|
294
|
+
memo: string | null;
|
|
295
|
+
source_cursor: string;
|
|
296
|
+
created_at: Generated<Date>;
|
|
297
|
+
}
|
|
298
|
+
interface L2DecoderCheckpointsTable {
|
|
299
|
+
decoder_name: string;
|
|
300
|
+
last_cursor: string | null;
|
|
301
|
+
updated_at: Generated<Date>;
|
|
302
|
+
}
|
|
303
|
+
interface ChainReorgsTable {
|
|
304
|
+
id: Generated<string>;
|
|
305
|
+
detected_at: Generated<Date>;
|
|
306
|
+
fork_point_height: number;
|
|
307
|
+
old_index_block_hash: string | null;
|
|
308
|
+
new_index_block_hash: string | null;
|
|
309
|
+
orphaned_from_height: number;
|
|
310
|
+
orphaned_from_event_index: number;
|
|
311
|
+
orphaned_to_height: number;
|
|
312
|
+
orphaned_to_event_index: number;
|
|
313
|
+
new_canonical_height: number;
|
|
314
|
+
new_canonical_event_index: number;
|
|
315
|
+
created_at: Generated<Date>;
|
|
316
|
+
}
|
|
276
317
|
interface Database {
|
|
277
318
|
blocks: BlocksTable;
|
|
278
319
|
transactions: TransactionsTable;
|
|
@@ -308,6 +349,9 @@ interface Database {
|
|
|
308
349
|
subscriptions: SubscriptionsTable;
|
|
309
350
|
subscription_outbox: SubscriptionOutboxTable;
|
|
310
351
|
subscription_deliveries: SubscriptionDeliveriesTable;
|
|
352
|
+
decoded_events: DecodedEventsTable;
|
|
353
|
+
l2_decoder_checkpoints: L2DecoderCheckpointsTable;
|
|
354
|
+
chain_reorgs: ChainReorgsTable;
|
|
311
355
|
}
|
|
312
356
|
type TenantStatus = "provisioning" | "active" | "limit_warning" | "paused_limit" | "suspended" | "error" | "deleted";
|
|
313
357
|
interface TenantsTable {
|
|
@@ -55,26 +55,6 @@ function allocForTotals(totalMemoryMb, totalCpus) {
|
|
|
55
55
|
return totalMemoryMb < 1024 ? allocTight(totalMemoryMb, totalCpus) : alloc(totalMemoryMb, totalCpus);
|
|
56
56
|
}
|
|
57
57
|
var PLANS = {
|
|
58
|
-
hobby: {
|
|
59
|
-
id: "hobby",
|
|
60
|
-
displayName: "Hobby",
|
|
61
|
-
monthlyPriceCents: 0,
|
|
62
|
-
annualPriceCents: null,
|
|
63
|
-
totalCpus: 0.5,
|
|
64
|
-
totalMemoryMb: 1024,
|
|
65
|
-
storageLimitMb: 10240,
|
|
66
|
-
containers: alloc(1024, 0.5),
|
|
67
|
-
tagline: "MVP/demo/side project",
|
|
68
|
-
features: [
|
|
69
|
-
"0.5 vCPU · 1 GB RAM",
|
|
70
|
-
"10 GB storage · auto-pause 7d",
|
|
71
|
-
"MVP demos + side projects",
|
|
72
|
-
"Recent-range reindexing",
|
|
73
|
-
"Community support"
|
|
74
|
-
],
|
|
75
|
-
stripeLookupKey: null,
|
|
76
|
-
stripeAnnualLookupKey: null
|
|
77
|
-
},
|
|
78
58
|
launch: {
|
|
79
59
|
id: "launch",
|
|
80
60
|
displayName: "Launch",
|
|
@@ -134,12 +114,7 @@ var PLANS = {
|
|
|
134
114
|
stripeAnnualLookupKey: null
|
|
135
115
|
}
|
|
136
116
|
};
|
|
137
|
-
var PLAN_IDS = [
|
|
138
|
-
"hobby",
|
|
139
|
-
"launch",
|
|
140
|
-
"scale",
|
|
141
|
-
"enterprise"
|
|
142
|
-
];
|
|
117
|
+
var PLAN_IDS = ["launch", "scale", "enterprise"];
|
|
143
118
|
function getPlan(id) {
|
|
144
119
|
const plan = PLANS[id];
|
|
145
120
|
if (!plan)
|
|
@@ -155,13 +130,13 @@ function getComputeAllowanceHours(_plan) {
|
|
|
155
130
|
function getStorageAllowanceBytes(plan) {
|
|
156
131
|
const planDef = PLANS[plan];
|
|
157
132
|
if (!planDef)
|
|
158
|
-
return
|
|
133
|
+
return 0;
|
|
159
134
|
if (planDef.storageLimitMb < 0)
|
|
160
135
|
return Number.POSITIVE_INFINITY;
|
|
161
136
|
return planDef.storageLimitMb * 1024 * 1024;
|
|
162
137
|
}
|
|
163
138
|
function hasStorageOverage(plan) {
|
|
164
|
-
return plan !== "
|
|
139
|
+
return plan !== "none" && plan !== "enterprise";
|
|
165
140
|
}
|
|
166
141
|
function getBasePriceCents(plan) {
|
|
167
142
|
const planDef = PLANS[plan];
|
|
@@ -287,5 +262,5 @@ export {
|
|
|
287
262
|
getComputeUsage
|
|
288
263
|
};
|
|
289
264
|
|
|
290
|
-
//# debugId=
|
|
265
|
+
//# debugId=7B39A65B4DBA7F2D64756E2164756E21
|
|
291
266
|
//# sourceMappingURL=account-usage.js.map
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/pricing.ts", "../src/db/queries/account-usage.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * Single source of truth for plan tiers — capacity, price, display copy,\n * Stripe binding, and container allocations.\n *\n * Consumed by:\n * - Provisioner (`packages/provisioner/src/plans.ts` re-exports)\n * - API (`/api/accounts/usage` for allowance math + display)\n * - Web app (`/billing` page renders plan cards from this)\n *\n * Adding a tier? Add an entry to PLANS. Removing one? Drop here, run\n * the Stripe-side cleanup (archive lookup_key), and update env vars.\n */\n\nconst BYTES_PER_GB: number = 1024 ** 3;\n\nexport type
|
|
5
|
+
"/**\n * Single source of truth for plan tiers — capacity, price, display copy,\n * Stripe binding, and container allocations.\n *\n * Consumed by:\n * - Provisioner (`packages/provisioner/src/plans.ts` re-exports)\n * - API (`/api/accounts/usage` for allowance math + display)\n * - Web app (`/billing` page renders plan cards from this)\n *\n * Adding a tier? Add an entry to PLANS. Removing one? Drop here, run\n * the Stripe-side cleanup (archive lookup_key), and update env vars.\n */\n\nconst BYTES_PER_GB: number = 1024 ** 3;\n\nexport type AccountPlanId = \"none\" | PlanId;\nexport type PlanId = \"launch\" | \"scale\" | \"enterprise\";\n\nexport interface ContainerAlloc {\n\tmemoryMb: number;\n\tcpus: number;\n}\n\nexport interface Plan {\n\tid: PlanId;\n\tdisplayName: string;\n\t/** Monthly subscription price in cents. null = custom (Enterprise). */\n\tmonthlyPriceCents: number | null;\n\t/** Annual subscription price in cents. null = no self-serve annual price. */\n\tannualPriceCents: number | null;\n\ttotalCpus: number;\n\ttotalMemoryMb: number;\n\t/** Hard cap. -1 = unlimited (Enterprise). Storage overage bills past this. */\n\tstorageLimitMb: number;\n\tcontainers: {\n\t\tpostgres: ContainerAlloc;\n\t\tapi: ContainerAlloc;\n\t\tprocessor: ContainerAlloc;\n\t};\n\t/** Display-only. Marketing/short pitch. */\n\ttagline: string;\n\t/** Display-only. Bullet list on the plan card. */\n\tfeatures: string[];\n\t/** Stripe `lookup_key` for monthly recurring tier price. null for enterprise. */\n\tstripeLookupKey: string | null;\n\t/** Stripe `lookup_key` for annual recurring tier price. null for enterprise. */\n\tstripeAnnualLookupKey: string | null;\n}\n\n// ── Allocation helpers ──────────────────────────────────────────────\n//\n// Allocation within a plan (3 containers per tenant):\n// Default split (paid tiers) — PG 50% / proc 30% / api 20%\n// Sub-1GB total — PG 60% / proc 25% / api 15%\n//\n// Docker memory limit is a hard cap (OOM kill on overage). CPU is a soft\n// cap via `--cpus` (throttling, not killing). Storage is monitored\n// separately and billed as overage — PG crashes if we hard-cap it.\n\nfunction alloc(totalMb: number, totalCpus: number): Plan[\"containers\"] {\n\treturn {\n\t\tpostgres: {\n\t\t\tmemoryMb: Math.floor(totalMb * 0.5),\n\t\t\tcpus: round2(totalCpus * 0.5),\n\t\t},\n\t\tprocessor: {\n\t\t\tmemoryMb: Math.floor(totalMb * 0.3),\n\t\t\tcpus: round2(totalCpus * 0.3),\n\t\t},\n\t\tapi: {\n\t\t\tmemoryMb: Math.floor(totalMb * 0.2),\n\t\t\tcpus: round2(totalCpus * 0.2),\n\t\t},\n\t};\n}\n\nfunction allocTight(totalMb: number, totalCpus: number): Plan[\"containers\"] {\n\treturn {\n\t\tpostgres: {\n\t\t\tmemoryMb: Math.floor(totalMb * 0.6),\n\t\t\tcpus: round2(totalCpus * 0.6),\n\t\t},\n\t\tprocessor: {\n\t\t\tmemoryMb: Math.floor(totalMb * 0.25),\n\t\t\tcpus: round2(totalCpus * 0.25),\n\t\t},\n\t\tapi: {\n\t\t\tmemoryMb: Math.floor(totalMb * 0.15),\n\t\t\tcpus: round2(totalCpus * 0.15),\n\t\t},\n\t};\n}\n\nfunction round2(n: number): number {\n\treturn Math.round(n * 100) / 100;\n}\n\n/**\n * Split a compute envelope across (postgres, processor, api) containers.\n * Auto-biases PG-heavy (60/25/15) for sub-1GB totals.\n */\nexport function allocForTotals(\n\ttotalMemoryMb: number,\n\ttotalCpus: number,\n): Plan[\"containers\"] {\n\treturn totalMemoryMb < 1024\n\t\t? allocTight(totalMemoryMb, totalCpus)\n\t\t: alloc(totalMemoryMb, totalCpus);\n}\n\n// ── Canonical plan data ─────────────────────────────────────────────\n\nexport const PLANS: Record<PlanId, Plan> = {\n\tlaunch: {\n\t\tid: \"launch\",\n\t\tdisplayName: \"Launch\",\n\t\tmonthlyPriceCents: 9_900, // $99\n\t\tannualPriceCents: 99_000, // 2 months free\n\t\ttotalCpus: 2,\n\t\ttotalMemoryMb: 6_144,\n\t\tstorageLimitMb: 102_400, // 100 GB\n\t\tcontainers: alloc(6_144, 2),\n\t\ttagline: \"Real product\",\n\t\tfeatures: [\n\t\t\t\"2 vCPU · 6 GB RAM\",\n\t\t\t\"100 GB storage · always-on\",\n\t\t\t\"3-5 contracts\",\n\t\t\t\"Production reindex windows\",\n\t\t\t\"Spend caps + alerts\",\n\t\t\t\"Email support\",\n\t\t],\n\t\tstripeLookupKey: \"secondlayer_launch_monthly\",\n\t\tstripeAnnualLookupKey: \"secondlayer_launch_yearly\",\n\t},\n\tscale: {\n\t\tid: \"scale\",\n\t\tdisplayName: \"Scale\",\n\t\tmonthlyPriceCents: 29_900, // $299\n\t\tannualPriceCents: 299_000, // 2 months free\n\t\ttotalCpus: 8,\n\t\ttotalMemoryMb: 24_576,\n\t\tstorageLimitMb: 512_000, // 500 GB\n\t\tcontainers: alloc(24_576, 8),\n\t\ttagline: \"Full indexing\",\n\t\tfeatures: [\n\t\t\t\"8 vCPU · 24 GB RAM\",\n\t\t\t\"500 GB storage · always-on\",\n\t\t\t\"Heavy history + replay\",\n\t\t\t\"24h SLA · priority support\",\n\t\t],\n\t\tstripeLookupKey: \"secondlayer_scale_monthly\",\n\t\tstripeAnnualLookupKey: \"secondlayer_scale_yearly\",\n\t},\n\tenterprise: {\n\t\tid: \"enterprise\",\n\t\tdisplayName: \"Enterprise\",\n\t\tmonthlyPriceCents: null,\n\t\tannualPriceCents: null,\n\t\ttotalCpus: 16,\n\t\ttotalMemoryMb: 65_536,\n\t\tstorageLimitMb: -1,\n\t\tcontainers: alloc(65_536, 16),\n\t\ttagline: \"Whatever needed\",\n\t\tfeatures: [\n\t\t\t\"Custom compute + storage\",\n\t\t\t\"SLAs · regions · SSO\",\n\t\t\t\"Dedicated success engineer\",\n\t\t],\n\t\tstripeLookupKey: null,\n\t\tstripeAnnualLookupKey: null,\n\t},\n};\n\nexport const PLAN_IDS: readonly PlanId[] = [\"launch\", \"scale\", \"enterprise\"];\n\nexport function getPlan(id: string): Plan {\n\tconst plan = (PLANS as Record<string, Plan | undefined>)[id];\n\tif (!plan) throw new Error(`Unknown plan: ${id}`);\n\treturn plan;\n}\n\nexport function isValidPlanId(id: string): id is PlanId {\n\treturn id in PLANS;\n}\n\n// ── Allowance helpers (used by /api/accounts/usage display) ─────────\n//\n// Compute is hard-capped by Docker `--cpus`, so there's no compute\n// overage billing. The function below returns ∞ for paid plans (display-\n// only — no metering).\n//\n// Storage IS metered and billed past the plan's allowance via the\n// `storage_gb_months` Stripe meter at $2/GB-mo.\n\nexport function getComputeAllowanceHours(_plan: string): number {\n\t// Compute overage was killed when we removed the `compute_hours` meter.\n\t// All plans are now hard-capped by Docker `--cpus`. ∞ here means \"no\n\t// overage tracked\" for display purposes.\n\treturn Number.POSITIVE_INFINITY;\n}\n\nexport function getStorageAllowanceBytes(plan: string): number {\n\tconst planDef = (PLANS as Record<string, Plan | undefined>)[plan];\n\tif (!planDef) return 0;\n\tif (planDef.storageLimitMb < 0) return Number.POSITIVE_INFINITY;\n\treturn planDef.storageLimitMb * 1024 * 1024;\n}\n\n/** Paid tiers bill $2/GB over allowance. Accounts with no plan do not accrue overage. */\nexport function hasStorageOverage(plan: string): boolean {\n\treturn plan !== \"none\" && plan !== \"enterprise\";\n}\n\nexport function getBasePriceCents(plan: string): number {\n\tconst planDef = (PLANS as Record<string, Plan | undefined>)[plan];\n\treturn planDef?.monthlyPriceCents ?? 0;\n}\n\nexport function getPlanDisplayName(plan: string): string {\n\tconst planDef = (PLANS as Record<string, Plan | undefined>)[plan];\n\treturn planDef?.displayName ?? plan.charAt(0).toUpperCase() + plan.slice(1);\n}\n\n// Re-export bytes-per-GB constant for callers that compute display values.\nexport { BYTES_PER_GB };\n",
|
|
6
6
|
"import { type Kysely, sql } from \"kysely\";\nimport {\n\tgetComputeAllowanceHours,\n\tgetStorageAllowanceBytes,\n} from \"../../pricing.ts\";\nimport type { Database } from \"../types.ts\";\n\n/**\n * Rollup queries that power the `/platform/usage` page.\n *\n * Compute-hours approximation: each active tenant contributes\n * cpus × hours-in-period-while-active\n * where \"active\" is approximated from `last_active_at`. This undercounts\n * tenants that went idle between cron ticks and overcounts nothing.\n *\n * Actual Stripe billing happens in `packages/worker/src/jobs/compute-metering.ts`\n * — these numbers are for display only. Follow-up work: write-through\n * compute ledger so this query reads truth instead of estimating.\n */\n\nconst IDLE_GRACE_MS = 2 * 60 * 60 * 1000; // 2h\nconst BYTES_PER_MB = 1024 * 1024;\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface SparklinePoint {\n\tday: string; // YYYY-MM-DD\n\tvalue: number;\n}\n\nexport interface ComputeUsage {\n\tusedHours: number;\n\tallowanceHours: number;\n\tpct: number;\n\tsparkline: SparklinePoint[];\n}\n\nexport interface StorageUsage {\n\tusedBytes: number;\n\tallowanceBytes: number;\n\tpct: number;\n\tsparkline: SparklinePoint[];\n}\n\nexport interface ProjectRow {\n\tid: string;\n\tslug: string;\n\tname: string;\n\tstatus: string;\n\tsubgraphCount: number;\n\tcompute: { hours: number; pct: number };\n\tstorage: { bytes: number; pct: number };\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\nfunction toDayKey(d: Date): string {\n\treturn d.toISOString().slice(0, 10);\n}\n\nfunction* lastNDays(n: number, endInclusive: Date): Generator<string> {\n\tconst end = new Date(endInclusive);\n\tfor (let i = n - 1; i >= 0; i--) {\n\t\tconst d = new Date(end);\n\t\td.setUTCDate(d.getUTCDate() - i);\n\t\tyield toDayKey(d);\n\t}\n}\n\nfunction computeActiveHours(\n\tperiodStart: Date,\n\tnow: Date,\n\ttenant: {\n\t\tcreated_at: Date;\n\t\tlast_active_at: Date;\n\t\tstatus: string;\n\t},\n): number {\n\tif (tenant.status !== \"active\" && tenant.status !== \"limit_warning\") return 0;\n\tconst rangeStart = Math.max(\n\t\tperiodStart.getTime(),\n\t\ttenant.created_at.getTime(),\n\t);\n\tconst rangeEnd = Math.min(\n\t\tnow.getTime(),\n\t\ttenant.last_active_at.getTime() + IDLE_GRACE_MS,\n\t);\n\tif (rangeEnd <= rangeStart) return 0;\n\treturn (rangeEnd - rangeStart) / (1000 * 60 * 60);\n}\n\nfunction pct(used: number, allowance: number): number {\n\tif (!Number.isFinite(allowance) || allowance <= 0) return 0;\n\treturn Math.min((used / allowance) * 100, 100);\n}\n\n// ── Queries ──────────────────────────────────────────────────────────\n\nexport async function getComputeUsage(\n\tdb: Kysely<Database>,\n\taccountId: string,\n\tplan: string,\n\tperiodStart: Date,\n\tnow: Date = new Date(),\n): Promise<ComputeUsage> {\n\tconst tenants = await db\n\t\t.selectFrom(\"tenants\")\n\t\t.select([\"id\", \"cpus\", \"status\", \"created_at\", \"last_active_at\"])\n\t\t.where(\"account_id\", \"=\", accountId)\n\t\t.where(\"status\", \"!=\", \"deleted\")\n\t\t.execute();\n\n\tlet totalHours = 0;\n\tfor (const t of tenants) {\n\t\tconst hours = computeActiveHours(periodStart, now, {\n\t\t\tcreated_at: t.created_at,\n\t\t\tlast_active_at: t.last_active_at,\n\t\t\tstatus: String(t.status),\n\t\t});\n\t\ttotalHours += hours * Number(t.cpus);\n\t}\n\n\tconst allowance = getComputeAllowanceHours(plan);\n\n\t// 14-day sparkline: bucket the same formula per-day.\n\tconst sparkline: SparklinePoint[] = [];\n\tfor (const day of lastNDays(14, now)) {\n\t\tconst dayStart = new Date(`${day}T00:00:00.000Z`);\n\t\tconst dayEnd = new Date(`${day}T23:59:59.999Z`);\n\t\tlet dayHours = 0;\n\t\tfor (const t of tenants) {\n\t\t\tconst hours = computeActiveHours(dayStart, dayEnd, {\n\t\t\t\tcreated_at: t.created_at,\n\t\t\t\tlast_active_at: t.last_active_at,\n\t\t\t\tstatus: String(t.status),\n\t\t\t});\n\t\t\tdayHours += Math.min(hours, 24) * Number(t.cpus);\n\t\t}\n\t\tsparkline.push({ day, value: dayHours });\n\t}\n\n\treturn {\n\t\tusedHours: totalHours,\n\t\tallowanceHours: allowance,\n\t\tpct: pct(totalHours, allowance),\n\t\tsparkline,\n\t};\n}\n\nexport async function getStorageUsage(\n\tdb: Kysely<Database>,\n\taccountId: string,\n\tplan: string,\n\tnow: Date = new Date(),\n): Promise<StorageUsage> {\n\t// Current usage: sum of tenants.storage_used_mb for this account.\n\tconst current = await db\n\t\t.selectFrom(\"tenants\")\n\t\t.select(sql<string>`COALESCE(SUM(storage_used_mb), 0)`.as(\"mb\"))\n\t\t.where(\"account_id\", \"=\", accountId)\n\t\t.where(\"status\", \"!=\", \"deleted\")\n\t\t.executeTakeFirst();\n\n\tconst usedBytes = Number(current?.mb ?? 0) * BYTES_PER_MB;\n\tconst allowance = getStorageAllowanceBytes(plan);\n\n\t// 14-day sparkline: per-month snapshots only — fall back to a flat\n\t// line at the current value. When per-day storage history lands, swap\n\t// this for a real bucket query.\n\tconst sparkline: SparklinePoint[] = [];\n\tfor (const day of lastNDays(14, now)) {\n\t\tsparkline.push({ day, value: Number(current?.mb ?? 0) });\n\t}\n\n\treturn {\n\t\tusedBytes,\n\t\tallowanceBytes: allowance,\n\t\tpct: pct(usedBytes, allowance),\n\t\tsparkline,\n\t};\n}\n\nexport async function getProjectBreakdown(\n\tdb: Kysely<Database>,\n\taccountId: string,\n\tplan: string,\n\tperiodStart: Date,\n\tnow: Date = new Date(),\n): Promise<ProjectRow[]> {\n\tconst tenants = await db\n\t\t.selectFrom(\"tenants\")\n\t\t.select([\n\t\t\t\"id\",\n\t\t\t\"slug\",\n\t\t\t\"status\",\n\t\t\t\"cpus\",\n\t\t\t\"storage_used_mb\",\n\t\t\t\"created_at\",\n\t\t\t\"last_active_at\",\n\t\t])\n\t\t.where(\"account_id\", \"=\", accountId)\n\t\t.where(\"status\", \"!=\", \"deleted\")\n\t\t.orderBy(\"created_at\", \"desc\")\n\t\t.execute();\n\n\tif (tenants.length === 0) return [];\n\n\tconst computeAllowance = getComputeAllowanceHours(plan);\n\tconst storageAllowance = getStorageAllowanceBytes(plan);\n\n\treturn tenants.map((t) => {\n\t\tconst hours =\n\t\t\tcomputeActiveHours(periodStart, now, {\n\t\t\t\tcreated_at: t.created_at,\n\t\t\t\tlast_active_at: t.last_active_at,\n\t\t\t\tstatus: String(t.status),\n\t\t\t}) * Number(t.cpus);\n\t\tconst bytes = Number(t.storage_used_mb ?? 0) * BYTES_PER_MB;\n\n\t\treturn {\n\t\t\tid: t.id,\n\t\t\tslug: t.slug,\n\t\t\tname: t.slug,\n\t\t\tstatus: String(t.status),\n\t\t\t// subgraphCount not tracked at account-DB level (subgraphs live on\n\t\t\t// per-tenant DBs). Left at 0; later pass can ping each tenant API.\n\t\t\tsubgraphCount: 0,\n\t\t\tcompute: { hours, pct: pct(hours, computeAllowance) },\n\t\t\tstorage: { bytes, pct: pct(bytes, storageAllowance) },\n\t\t};\n\t});\n}\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAaA,IAAM,eAAuB,QAAQ;
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "7B39A65B4DBA7F2D64756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
|
@@ -6,6 +6,7 @@ interface BlocksTable {
|
|
|
6
6
|
hash: string;
|
|
7
7
|
parent_hash: string;
|
|
8
8
|
burn_block_height: number;
|
|
9
|
+
burn_block_hash: ColumnType<string | null, string | null | undefined, string | null>;
|
|
9
10
|
timestamp: number;
|
|
10
11
|
canonical: Generated<boolean>;
|
|
11
12
|
created_at: Generated<Date>;
|
|
@@ -146,6 +147,8 @@ interface UsageDailyTable {
|
|
|
146
147
|
date: string;
|
|
147
148
|
api_requests: Generated<number>;
|
|
148
149
|
deliveries: Generated<number>;
|
|
150
|
+
streams_events_returned: Generated<number>;
|
|
151
|
+
index_decoded_events_returned: Generated<number>;
|
|
149
152
|
}
|
|
150
153
|
interface UsageSnapshotsTable {
|
|
151
154
|
id: Generated<string>;
|
|
@@ -274,6 +277,44 @@ interface ProcessedStripeEventsTable {
|
|
|
274
277
|
event_type: string;
|
|
275
278
|
processed_at: Generated<Date>;
|
|
276
279
|
}
|
|
280
|
+
interface DecodedEventsTable {
|
|
281
|
+
cursor: string;
|
|
282
|
+
block_height: number;
|
|
283
|
+
tx_id: string;
|
|
284
|
+
tx_index: number;
|
|
285
|
+
event_index: number;
|
|
286
|
+
event_type: string;
|
|
287
|
+
microblock_hash: string | null;
|
|
288
|
+
canonical: Generated<boolean>;
|
|
289
|
+
contract_id: string | null;
|
|
290
|
+
sender: string | null;
|
|
291
|
+
recipient: string | null;
|
|
292
|
+
amount: string | null;
|
|
293
|
+
asset_identifier: string | null;
|
|
294
|
+
value: string | null;
|
|
295
|
+
memo: string | null;
|
|
296
|
+
source_cursor: string;
|
|
297
|
+
created_at: Generated<Date>;
|
|
298
|
+
}
|
|
299
|
+
interface L2DecoderCheckpointsTable {
|
|
300
|
+
decoder_name: string;
|
|
301
|
+
last_cursor: string | null;
|
|
302
|
+
updated_at: Generated<Date>;
|
|
303
|
+
}
|
|
304
|
+
interface ChainReorgsTable {
|
|
305
|
+
id: Generated<string>;
|
|
306
|
+
detected_at: Generated<Date>;
|
|
307
|
+
fork_point_height: number;
|
|
308
|
+
old_index_block_hash: string | null;
|
|
309
|
+
new_index_block_hash: string | null;
|
|
310
|
+
orphaned_from_height: number;
|
|
311
|
+
orphaned_from_event_index: number;
|
|
312
|
+
orphaned_to_height: number;
|
|
313
|
+
orphaned_to_event_index: number;
|
|
314
|
+
new_canonical_height: number;
|
|
315
|
+
new_canonical_event_index: number;
|
|
316
|
+
created_at: Generated<Date>;
|
|
317
|
+
}
|
|
277
318
|
interface Database {
|
|
278
319
|
blocks: BlocksTable;
|
|
279
320
|
transactions: TransactionsTable;
|
|
@@ -309,6 +350,9 @@ interface Database {
|
|
|
309
350
|
subscriptions: SubscriptionsTable;
|
|
310
351
|
subscription_outbox: SubscriptionOutboxTable;
|
|
311
352
|
subscription_deliveries: SubscriptionDeliveriesTable;
|
|
353
|
+
decoded_events: DecodedEventsTable;
|
|
354
|
+
l2_decoder_checkpoints: L2DecoderCheckpointsTable;
|
|
355
|
+
chain_reorgs: ChainReorgsTable;
|
|
312
356
|
}
|
|
313
357
|
type TenantStatus = "provisioning" | "active" | "limit_warning" | "paused_limit" | "suspended" | "error" | "deleted";
|
|
314
358
|
interface TenantsTable {
|