@secondlayer/shared 0.10.2 → 0.12.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 (46) hide show
  1. package/dist/src/db/index.d.ts +180 -2
  2. package/dist/src/db/queries/accounts.d.ts +157 -2
  3. package/dist/src/db/queries/accounts.js +17 -1
  4. package/dist/src/db/queries/accounts.js.map +3 -3
  5. package/dist/src/db/queries/integrity.d.ts +150 -1
  6. package/dist/src/db/queries/marketplace.d.ts +464 -0
  7. package/dist/src/db/queries/marketplace.js +142 -0
  8. package/dist/src/db/queries/marketplace.js.map +10 -0
  9. package/dist/src/db/queries/metrics.d.ts +150 -1
  10. package/dist/src/db/queries/projects.d.ts +424 -0
  11. package/dist/src/db/queries/projects.js +47 -0
  12. package/dist/src/db/queries/projects.js.map +10 -0
  13. package/dist/src/db/queries/subgraph-gaps.d.ts +150 -1
  14. package/dist/src/db/queries/subgraphs.d.ts +158 -6
  15. package/dist/src/db/queries/subgraphs.js +18 -13
  16. package/dist/src/db/queries/subgraphs.js.map +3 -3
  17. package/dist/src/db/queries/usage.d.ts +150 -1
  18. package/dist/src/db/queries/workflows.d.ts +440 -0
  19. package/dist/src/db/queries/workflows.js +115 -0
  20. package/dist/src/db/queries/workflows.js.map +11 -0
  21. package/dist/src/db/schema.d.ts +180 -2
  22. package/dist/src/index.d.ts +258 -10
  23. package/dist/src/index.js +91 -72
  24. package/dist/src/index.js.map +5 -4
  25. package/dist/src/node/local-client.d.ts +150 -1
  26. package/dist/src/schemas/index.d.ts +79 -9
  27. package/dist/src/schemas/index.js +93 -74
  28. package/dist/src/schemas/index.js.map +5 -4
  29. package/dist/src/schemas/marketplace.d.ts +63 -0
  30. package/dist/src/schemas/marketplace.js +39 -0
  31. package/dist/src/schemas/marketplace.js.map +10 -0
  32. package/dist/src/schemas/subgraphs.d.ts +8 -0
  33. package/dist/src/schemas/subgraphs.js.map +2 -2
  34. package/dist/src/schemas/workflows.d.ts +66 -0
  35. package/dist/src/schemas/workflows.js +39 -0
  36. package/dist/src/schemas/workflows.js.map +10 -0
  37. package/dist/src/types.d.ts +1 -0
  38. package/migrations/0022_marketplace.ts +88 -0
  39. package/migrations/0023_projects.ts +149 -0
  40. package/migrations/0024_chat_sessions.ts +51 -0
  41. package/migrations/0025_chat_session_summary.ts +15 -0
  42. package/migrations/0026_workflows.ts +204 -0
  43. package/migrations/0027_workflow_cursors.ts +16 -0
  44. package/migrations/0028_subgraph_account_scoping.ts +116 -0
  45. package/migrations/0029_subgraph_handler_code.ts +23 -0
  46. package/package.json +22 -2
@@ -41,6 +41,7 @@ interface StreamsTable {
41
41
  endpoint_url: string;
42
42
  signing_secret: string | null;
43
43
  api_key_id: string;
44
+ project_id: string | null;
44
45
  created_at: Generated<Date>;
45
46
  updated_at: Generated<Date>;
46
47
  }
@@ -102,7 +103,14 @@ interface SubgraphsTable {
102
103
  last_error_at: Date | null;
103
104
  total_processed: Generated<number>;
104
105
  total_errors: Generated<number>;
105
- api_key_id: string;
106
+ api_key_id: string | null;
107
+ account_id: string;
108
+ handler_code: string | null;
109
+ project_id: string | null;
110
+ is_public: Generated<boolean>;
111
+ tags: Generated<string[]>;
112
+ description: string | null;
113
+ forked_from_id: string | null;
106
114
  created_at: Generated<Date>;
107
115
  updated_at: Generated<Date>;
108
116
  }
@@ -133,6 +141,10 @@ interface AccountsTable {
133
141
  id: Generated<string>;
134
142
  email: string;
135
143
  plan: Generated<string>;
144
+ display_name: string | null;
145
+ bio: string | null;
146
+ avatar_url: string | null;
147
+ slug: string | null;
136
148
  created_at: Generated<Date>;
137
149
  }
138
150
  interface SessionsTable {
@@ -233,6 +245,131 @@ interface SubgraphHealthSnapshotsTable {
233
245
  last_processed_block: number | null;
234
246
  captured_at: Generated<Date>;
235
247
  }
248
+ interface SubgraphUsageDailyTable {
249
+ subgraph_id: string;
250
+ date: string;
251
+ query_count: Generated<number>;
252
+ }
253
+ interface ProjectsTable {
254
+ id: Generated<string>;
255
+ name: string;
256
+ slug: string;
257
+ account_id: string;
258
+ settings: Generated<Record<string, unknown>>;
259
+ network: Generated<string>;
260
+ node_rpc: string | null;
261
+ created_at: Generated<Date>;
262
+ updated_at: Generated<Date>;
263
+ }
264
+ interface TeamMembersTable {
265
+ id: Generated<string>;
266
+ project_id: string;
267
+ account_id: string;
268
+ role: Generated<string>;
269
+ invited_by: string | null;
270
+ created_at: Generated<Date>;
271
+ }
272
+ interface TeamInvitationsTable {
273
+ id: Generated<string>;
274
+ project_id: string;
275
+ email: string;
276
+ role: Generated<string>;
277
+ token: string;
278
+ invited_by: string | null;
279
+ expires_at: Date;
280
+ accepted_at: Date | null;
281
+ created_at: Generated<Date>;
282
+ }
283
+ interface ChatSessionsTable {
284
+ id: Generated<string>;
285
+ account_id: string;
286
+ title: string | null;
287
+ summary: unknown | null;
288
+ created_at: Generated<Date>;
289
+ updated_at: Generated<Date>;
290
+ }
291
+ interface ChatMessagesTable {
292
+ id: Generated<string>;
293
+ chat_session_id: string;
294
+ role: string;
295
+ parts: unknown;
296
+ metadata: unknown | null;
297
+ created_at: Generated<Date>;
298
+ }
299
+ interface WorkflowDefinitionsTable {
300
+ id: Generated<string>;
301
+ name: string;
302
+ version: Generated<string>;
303
+ status: Generated<string>;
304
+ trigger_type: string;
305
+ trigger_config: unknown;
306
+ handler_path: string;
307
+ retries_config: unknown | null;
308
+ timeout_ms: number | null;
309
+ api_key_id: string;
310
+ project_id: string | null;
311
+ created_at: Generated<Date>;
312
+ updated_at: Generated<Date>;
313
+ }
314
+ interface WorkflowRunsTable {
315
+ id: Generated<string>;
316
+ definition_id: string;
317
+ status: Generated<string>;
318
+ trigger_type: string;
319
+ trigger_data: unknown | null;
320
+ dedup_key: string | null;
321
+ error: string | null;
322
+ started_at: Date | null;
323
+ completed_at: Date | null;
324
+ duration_ms: number | null;
325
+ total_ai_tokens: Generated<number>;
326
+ created_at: Generated<Date>;
327
+ }
328
+ interface WorkflowStepsTable {
329
+ id: Generated<string>;
330
+ run_id: string;
331
+ step_index: number;
332
+ step_id: string;
333
+ step_type: string;
334
+ status: Generated<string>;
335
+ input: unknown | null;
336
+ output: unknown | null;
337
+ error: string | null;
338
+ retry_count: Generated<number>;
339
+ ai_tokens_used: Generated<number>;
340
+ started_at: Date | null;
341
+ completed_at: Date | null;
342
+ duration_ms: number | null;
343
+ created_at: Generated<Date>;
344
+ }
345
+ interface WorkflowQueueTable {
346
+ id: Generated<string>;
347
+ run_id: string;
348
+ status: Generated<string>;
349
+ attempts: Generated<number>;
350
+ max_attempts: Generated<number>;
351
+ scheduled_for: Generated<Date>;
352
+ locked_at: Date | null;
353
+ locked_by: string | null;
354
+ error: string | null;
355
+ created_at: Generated<Date>;
356
+ completed_at: Date | null;
357
+ }
358
+ interface WorkflowSchedulesTable {
359
+ id: Generated<string>;
360
+ definition_id: string;
361
+ cron_expr: string;
362
+ timezone: Generated<string>;
363
+ next_run_at: Date;
364
+ last_run_at: Date | null;
365
+ enabled: Generated<boolean>;
366
+ created_at: Generated<Date>;
367
+ }
368
+ interface WorkflowCursorsTable {
369
+ name: string;
370
+ block_height: Generated<number>;
371
+ updated_at: Generated<Date>;
372
+ }
236
373
  interface Database {
237
374
  blocks: BlocksTable;
238
375
  transactions: TransactionsTable;
@@ -256,6 +393,18 @@ interface Database {
256
393
  subgraph_processing_stats: SubgraphProcessingStatsTable;
257
394
  subgraph_table_snapshots: SubgraphTableSnapshotsTable;
258
395
  subgraph_gaps: SubgraphGapsTable;
396
+ subgraph_usage_daily: SubgraphUsageDailyTable;
397
+ projects: ProjectsTable;
398
+ team_members: TeamMembersTable;
399
+ team_invitations: TeamInvitationsTable;
400
+ chat_sessions: ChatSessionsTable;
401
+ chat_messages: ChatMessagesTable;
402
+ workflow_definitions: WorkflowDefinitionsTable;
403
+ workflow_runs: WorkflowRunsTable;
404
+ workflow_steps: WorkflowStepsTable;
405
+ workflow_queue: WorkflowQueueTable;
406
+ workflow_schedules: WorkflowSchedulesTable;
407
+ workflow_cursors: WorkflowCursorsTable;
259
408
  }
260
409
  interface GapRange {
261
410
  start: number;
@@ -41,6 +41,7 @@ interface StreamsTable {
41
41
  endpoint_url: string;
42
42
  signing_secret: string | null;
43
43
  api_key_id: string;
44
+ project_id: string | null;
44
45
  created_at: Generated<Date>;
45
46
  updated_at: Generated<Date>;
46
47
  }
@@ -102,7 +103,14 @@ interface SubgraphsTable {
102
103
  last_error_at: Date | null;
103
104
  total_processed: Generated<number>;
104
105
  total_errors: Generated<number>;
105
- api_key_id: string;
106
+ api_key_id: string | null;
107
+ account_id: string;
108
+ handler_code: string | null;
109
+ project_id: string | null;
110
+ is_public: Generated<boolean>;
111
+ tags: Generated<string[]>;
112
+ description: string | null;
113
+ forked_from_id: string | null;
106
114
  created_at: Generated<Date>;
107
115
  updated_at: Generated<Date>;
108
116
  }
@@ -133,6 +141,10 @@ interface AccountsTable {
133
141
  id: Generated<string>;
134
142
  email: string;
135
143
  plan: Generated<string>;
144
+ display_name: string | null;
145
+ bio: string | null;
146
+ avatar_url: string | null;
147
+ slug: string | null;
136
148
  created_at: Generated<Date>;
137
149
  }
138
150
  interface SessionsTable {
@@ -233,6 +245,131 @@ interface SubgraphHealthSnapshotsTable {
233
245
  last_processed_block: number | null;
234
246
  captured_at: Generated<Date>;
235
247
  }
248
+ interface SubgraphUsageDailyTable {
249
+ subgraph_id: string;
250
+ date: string;
251
+ query_count: Generated<number>;
252
+ }
253
+ interface ProjectsTable {
254
+ id: Generated<string>;
255
+ name: string;
256
+ slug: string;
257
+ account_id: string;
258
+ settings: Generated<Record<string, unknown>>;
259
+ network: Generated<string>;
260
+ node_rpc: string | null;
261
+ created_at: Generated<Date>;
262
+ updated_at: Generated<Date>;
263
+ }
264
+ interface TeamMembersTable {
265
+ id: Generated<string>;
266
+ project_id: string;
267
+ account_id: string;
268
+ role: Generated<string>;
269
+ invited_by: string | null;
270
+ created_at: Generated<Date>;
271
+ }
272
+ interface TeamInvitationsTable {
273
+ id: Generated<string>;
274
+ project_id: string;
275
+ email: string;
276
+ role: Generated<string>;
277
+ token: string;
278
+ invited_by: string | null;
279
+ expires_at: Date;
280
+ accepted_at: Date | null;
281
+ created_at: Generated<Date>;
282
+ }
283
+ interface ChatSessionsTable {
284
+ id: Generated<string>;
285
+ account_id: string;
286
+ title: string | null;
287
+ summary: unknown | null;
288
+ created_at: Generated<Date>;
289
+ updated_at: Generated<Date>;
290
+ }
291
+ interface ChatMessagesTable {
292
+ id: Generated<string>;
293
+ chat_session_id: string;
294
+ role: string;
295
+ parts: unknown;
296
+ metadata: unknown | null;
297
+ created_at: Generated<Date>;
298
+ }
299
+ interface WorkflowDefinitionsTable {
300
+ id: Generated<string>;
301
+ name: string;
302
+ version: Generated<string>;
303
+ status: Generated<string>;
304
+ trigger_type: string;
305
+ trigger_config: unknown;
306
+ handler_path: string;
307
+ retries_config: unknown | null;
308
+ timeout_ms: number | null;
309
+ api_key_id: string;
310
+ project_id: string | null;
311
+ created_at: Generated<Date>;
312
+ updated_at: Generated<Date>;
313
+ }
314
+ interface WorkflowRunsTable {
315
+ id: Generated<string>;
316
+ definition_id: string;
317
+ status: Generated<string>;
318
+ trigger_type: string;
319
+ trigger_data: unknown | null;
320
+ dedup_key: string | null;
321
+ error: string | null;
322
+ started_at: Date | null;
323
+ completed_at: Date | null;
324
+ duration_ms: number | null;
325
+ total_ai_tokens: Generated<number>;
326
+ created_at: Generated<Date>;
327
+ }
328
+ interface WorkflowStepsTable {
329
+ id: Generated<string>;
330
+ run_id: string;
331
+ step_index: number;
332
+ step_id: string;
333
+ step_type: string;
334
+ status: Generated<string>;
335
+ input: unknown | null;
336
+ output: unknown | null;
337
+ error: string | null;
338
+ retry_count: Generated<number>;
339
+ ai_tokens_used: Generated<number>;
340
+ started_at: Date | null;
341
+ completed_at: Date | null;
342
+ duration_ms: number | null;
343
+ created_at: Generated<Date>;
344
+ }
345
+ interface WorkflowQueueTable {
346
+ id: Generated<string>;
347
+ run_id: string;
348
+ status: Generated<string>;
349
+ attempts: Generated<number>;
350
+ max_attempts: Generated<number>;
351
+ scheduled_for: Generated<Date>;
352
+ locked_at: Date | null;
353
+ locked_by: string | null;
354
+ error: string | null;
355
+ created_at: Generated<Date>;
356
+ completed_at: Date | null;
357
+ }
358
+ interface WorkflowSchedulesTable {
359
+ id: Generated<string>;
360
+ definition_id: string;
361
+ cron_expr: string;
362
+ timezone: Generated<string>;
363
+ next_run_at: Date;
364
+ last_run_at: Date | null;
365
+ enabled: Generated<boolean>;
366
+ created_at: Generated<Date>;
367
+ }
368
+ interface WorkflowCursorsTable {
369
+ name: string;
370
+ block_height: Generated<number>;
371
+ updated_at: Generated<Date>;
372
+ }
236
373
  interface Database {
237
374
  blocks: BlocksTable;
238
375
  transactions: TransactionsTable;
@@ -256,14 +393,26 @@ interface Database {
256
393
  subgraph_processing_stats: SubgraphProcessingStatsTable;
257
394
  subgraph_table_snapshots: SubgraphTableSnapshotsTable;
258
395
  subgraph_gaps: SubgraphGapsTable;
396
+ subgraph_usage_daily: SubgraphUsageDailyTable;
397
+ projects: ProjectsTable;
398
+ team_members: TeamMembersTable;
399
+ team_invitations: TeamInvitationsTable;
400
+ chat_sessions: ChatSessionsTable;
401
+ chat_messages: ChatMessagesTable;
402
+ workflow_definitions: WorkflowDefinitionsTable;
403
+ workflow_runs: WorkflowRunsTable;
404
+ workflow_steps: WorkflowStepsTable;
405
+ workflow_queue: WorkflowQueueTable;
406
+ workflow_schedules: WorkflowSchedulesTable;
407
+ workflow_cursors: WorkflowCursorsTable;
259
408
  }
260
409
  type Subgraph = Selectable<SubgraphsTable>;
261
410
  /**
262
411
  * Convert a subgraph name to its PostgreSQL schema name.
263
- * With keyPrefix: "subgraph_{prefix}_{name}" (tenant-isolated)
264
- * Without keyPrefix: "subgraph_{name}" (backward compat)
412
+ * With accountPrefix (first 8 chars of account_id): "subgraph_{prefix}_{name}"
413
+ * Without prefix: "subgraph_{name}" (backward compat / local dev)
265
414
  */
266
- declare function pgSchemaName(subgraphName: string, keyPrefix?: string): string;
415
+ declare function pgSchemaName(subgraphName: string, accountPrefix?: string): string;
267
416
  declare function registerSubgraph(db: Kysely<Database>, data: {
268
417
  name: string
269
418
  version: string
@@ -271,11 +420,14 @@ declare function registerSubgraph(db: Kysely<Database>, data: {
271
420
  schemaHash: string
272
421
  handlerPath: string
273
422
  apiKeyId?: string
423
+ accountId?: string
274
424
  schemaName?: string
275
425
  startBlock?: number
426
+ forkedFromId?: string
427
+ handlerCode?: string
276
428
  }): Promise<Subgraph>;
277
- declare function getSubgraph(db: Kysely<Database>, name: string, apiKeyId?: string): Promise<Subgraph | null>;
278
- declare function listSubgraphs(db: Kysely<Database>, apiKeyId?: string): Promise<Subgraph[]>;
429
+ declare function getSubgraph(db: Kysely<Database>, name: string, accountId?: string): Promise<Subgraph | null>;
430
+ declare function listSubgraphs(db: Kysely<Database>, accountId?: string): Promise<Subgraph[]>;
279
431
  declare function updateSubgraphStatus(db: Kysely<Database>, name: string, status: string, lastProcessedBlock?: number): Promise<void>;
280
432
  declare function recordSubgraphProcessed(db: Kysely<Database>, name: string, processed: number, errors: number, lastError?: string): Promise<void>;
281
433
  declare function updateSubgraphHandlerPath(db: Kysely<Database>, name: string, handlerPath: string): Promise<void>;
@@ -33,12 +33,12 @@ function parseJsonb(value) {
33
33
 
34
34
  // src/db/queries/subgraphs.ts
35
35
  import { sql as sql2 } from "kysely";
36
- function pgSchemaName(subgraphName, keyPrefix) {
36
+ function pgSchemaName(subgraphName, accountPrefix) {
37
37
  const safeName = subgraphName.replace(/-/g, "_");
38
- if (!keyPrefix) {
38
+ if (!accountPrefix) {
39
39
  return `subgraph_${safeName}`;
40
40
  }
41
- const safePrefix = keyPrefix.replace(/^sk-sl_/, "").replace(/-/g, "_");
41
+ const safePrefix = accountPrefix.replace(/-/g, "_");
42
42
  return `subgraph_${safePrefix}_${safeName}`;
43
43
  }
44
44
  async function registerSubgraph(db, data) {
@@ -48,30 +48,35 @@ async function registerSubgraph(db, data) {
48
48
  definition: jsonb(data.definition),
49
49
  schema_hash: data.schemaHash,
50
50
  handler_path: data.handlerPath,
51
- api_key_id: data.apiKeyId,
51
+ api_key_id: data.apiKeyId ?? null,
52
+ account_id: data.accountId ?? "",
53
+ handler_code: data.handlerCode ?? null,
52
54
  schema_name: data.schemaName ?? null,
53
- start_block: data.startBlock ?? 0
54
- }).onConflict((oc) => oc.columns(["name", "api_key_id"]).doUpdateSet({
55
+ start_block: data.startBlock ?? 0,
56
+ forked_from_id: data.forkedFromId ?? null
57
+ }).onConflict((oc) => oc.columns(["name", "account_id"]).doUpdateSet({
55
58
  version: data.version,
56
59
  definition: jsonb(data.definition),
57
60
  schema_hash: data.schemaHash,
58
61
  handler_path: data.handlerPath,
62
+ handler_code: data.handlerCode ?? null,
63
+ api_key_id: data.apiKeyId ?? null,
59
64
  schema_name: data.schemaName ?? null,
60
65
  start_block: data.startBlock ?? 0,
61
66
  updated_at: new Date
62
67
  })).returningAll().executeTakeFirstOrThrow();
63
68
  }
64
- async function getSubgraph(db, name, apiKeyId) {
69
+ async function getSubgraph(db, name, accountId) {
65
70
  let query = db.selectFrom("subgraphs").selectAll().where("name", "=", name);
66
- if (apiKeyId) {
67
- query = query.where("api_key_id", "=", apiKeyId);
71
+ if (accountId) {
72
+ query = query.where("account_id", "=", accountId);
68
73
  }
69
74
  return await query.executeTakeFirst() ?? null;
70
75
  }
71
- async function listSubgraphs(db, apiKeyId) {
76
+ async function listSubgraphs(db, accountId) {
72
77
  let query = db.selectFrom("subgraphs").selectAll();
73
- if (apiKeyId) {
74
- query = query.where("api_key_id", "=", apiKeyId);
78
+ if (accountId) {
79
+ query = query.where("account_id", "=", accountId);
75
80
  }
76
81
  return query.execute();
77
82
  }
@@ -113,5 +118,5 @@ export {
113
118
  deleteSubgraph
114
119
  };
115
120
 
116
- //# debugId=3B8125C51D68206164756E2164756E21
121
+ //# debugId=19BA785B5DA83C2564756E2164756E21
117
122
  //# sourceMappingURL=subgraphs.js.map
@@ -3,9 +3,9 @@
3
3
  "sources": ["../src/db/jsonb.ts", "../src/db/queries/subgraphs.ts"],
4
4
  "sourcesContent": [
5
5
  "import { type RawBuilder, sql } from \"kysely\";\n\n/**\n * Safely encode a JS value as a JSONB literal for Kysely inserts/updates.\n * Kysely + postgres.js double-encodes JSON when using parameterized queries\n * with ::jsonb casts. This uses sql.raw to inline a properly escaped literal.\n */\nexport function jsonb(value: unknown): RawBuilder<unknown> {\n\tconst escaped = JSON.stringify(value).replace(/'/g, \"''\");\n\treturn sql`${sql.raw(`'${escaped}'::jsonb`)}`;\n}\n\n/**\n * Safely parse a JSONB value from the database.\n * Handles double-encoded strings where postgres.js returns a JSON string\n * instead of a parsed object.\n */\nexport function parseJsonb<T = unknown>(value: unknown): T {\n\tif (typeof value === \"string\") {\n\t\ttry {\n\t\t\treturn JSON.parse(value) as T;\n\t\t} catch {\n\t\t\treturn value as T;\n\t\t}\n\t}\n\treturn (value ?? {}) as T;\n}\n",
6
- "import { type Kysely, sql } from \"kysely\";\nimport { jsonb } from \"../jsonb.ts\";\nimport type { Database, Subgraph } from \"../types.ts\";\n\n/**\n * Convert a subgraph name to its PostgreSQL schema name.\n * With keyPrefix: \"subgraph_{prefix}_{name}\" (tenant-isolated)\n * Without keyPrefix: \"subgraph_{name}\" (backward compat)\n */\nexport function pgSchemaName(subgraphName: string, keyPrefix?: string): string {\n\tconst safeName = subgraphName.replace(/-/g, \"_\");\n\tif (!keyPrefix) {\n\t\treturn `subgraph_${safeName}`;\n\t}\n\tconst safePrefix = keyPrefix.replace(/^sk-sl_/, \"\").replace(/-/g, \"_\");\n\treturn `subgraph_${safePrefix}_${safeName}`;\n}\n\nexport async function registerSubgraph(\n\tdb: Kysely<Database>,\n\tdata: {\n\t\tname: string;\n\t\tversion: string;\n\t\tdefinition: Record<string, unknown>;\n\t\tschemaHash: string;\n\t\thandlerPath: string;\n\t\tapiKeyId?: string;\n\t\tschemaName?: string;\n\t\tstartBlock?: number;\n\t},\n): Promise<Subgraph> {\n\treturn await db\n\t\t.insertInto(\"subgraphs\")\n\t\t.values({\n\t\t\tname: data.name,\n\t\t\tversion: data.version,\n\t\t\tdefinition: jsonb(data.definition) as any,\n\t\t\tschema_hash: data.schemaHash,\n\t\t\thandler_path: data.handlerPath,\n\t\t\tapi_key_id: data.apiKeyId!,\n\t\t\tschema_name: data.schemaName ?? null,\n\t\t\tstart_block: data.startBlock ?? 0,\n\t\t})\n\t\t.onConflict((oc) =>\n\t\t\toc.columns([\"name\", \"api_key_id\"]).doUpdateSet({\n\t\t\t\tversion: data.version,\n\t\t\t\tdefinition: jsonb(data.definition) as any,\n\t\t\t\tschema_hash: data.schemaHash,\n\t\t\t\thandler_path: data.handlerPath,\n\t\t\t\tschema_name: data.schemaName ?? null,\n\t\t\t\tstart_block: data.startBlock ?? 0,\n\t\t\t\tupdated_at: new Date(),\n\t\t\t}),\n\t\t)\n\t\t.returningAll()\n\t\t.executeTakeFirstOrThrow();\n}\n\nexport async function getSubgraph(\n\tdb: Kysely<Database>,\n\tname: string,\n\tapiKeyId?: string,\n): Promise<Subgraph | null> {\n\tlet query = db.selectFrom(\"subgraphs\").selectAll().where(\"name\", \"=\", name);\n\n\tif (apiKeyId) {\n\t\tquery = query.where(\"api_key_id\", \"=\", apiKeyId);\n\t}\n\n\treturn (await query.executeTakeFirst()) ?? null;\n}\n\nexport async function listSubgraphs(\n\tdb: Kysely<Database>,\n\tapiKeyId?: string,\n): Promise<Subgraph[]> {\n\tlet query = db.selectFrom(\"subgraphs\").selectAll();\n\tif (apiKeyId) {\n\t\tquery = query.where(\"api_key_id\", \"=\", apiKeyId);\n\t}\n\treturn query.execute();\n}\n\nexport async function updateSubgraphStatus(\n\tdb: Kysely<Database>,\n\tname: string,\n\tstatus: string,\n\tlastProcessedBlock?: number,\n): Promise<void> {\n\tawait db\n\t\t.updateTable(\"subgraphs\")\n\t\t.set({\n\t\t\tstatus,\n\t\t\t...(lastProcessedBlock !== undefined\n\t\t\t\t? { last_processed_block: lastProcessedBlock }\n\t\t\t\t: {}),\n\t\t\tupdated_at: new Date(),\n\t\t})\n\t\t.where(\"name\", \"=\", name)\n\t\t.execute();\n}\n\nexport async function recordSubgraphProcessed(\n\tdb: Kysely<Database>,\n\tname: string,\n\tprocessed: number,\n\terrors: number,\n\tlastError?: string,\n): Promise<void> {\n\tawait db\n\t\t.updateTable(\"subgraphs\")\n\t\t.set({\n\t\t\ttotal_processed: sql`total_processed + ${processed}`,\n\t\t\ttotal_errors: sql`total_errors + ${errors}`,\n\t\t\t...(lastError\n\t\t\t\t? { last_error: lastError, last_error_at: new Date() }\n\t\t\t\t: {}),\n\t\t\tupdated_at: new Date(),\n\t\t})\n\t\t.where(\"name\", \"=\", name)\n\t\t.execute();\n}\n\nexport async function updateSubgraphHandlerPath(\n\tdb: Kysely<Database>,\n\tname: string,\n\thandlerPath: string,\n): Promise<void> {\n\tawait db\n\t\t.updateTable(\"subgraphs\")\n\t\t.set({ handler_path: handlerPath, updated_at: new Date() })\n\t\t.where(\"name\", \"=\", name)\n\t\t.execute();\n}\n\nexport async function deleteSubgraph(\n\tdb: Kysely<Database>,\n\tname: string,\n\tapiKeyId?: string,\n): Promise<Subgraph | null> {\n\tconst subgraph = await getSubgraph(db, name, apiKeyId);\n\tif (!subgraph) return null;\n\n\t// Use stored schema_name if available, otherwise compute\n\tconst schemaName = subgraph.schema_name ?? pgSchemaName(name);\n\n\t// Drop the subgraph's schema (CASCADE drops all tables within)\n\tawait sql`DROP SCHEMA IF EXISTS ${sql.raw(`\"${schemaName}\"`)} CASCADE`.execute(\n\t\tdb,\n\t);\n\n\t// Remove from registry\n\tawait db.deleteFrom(\"subgraphs\").where(\"id\", \"=\", subgraph.id).execute();\n\n\treturn subgraph;\n}\n"
6
+ "import { type Kysely, sql } from \"kysely\";\nimport { jsonb } from \"../jsonb.ts\";\nimport type { Database, Subgraph } from \"../types.ts\";\n\n/**\n * Convert a subgraph name to its PostgreSQL schema name.\n * With accountPrefix (first 8 chars of account_id): \"subgraph_{prefix}_{name}\"\n * Without prefix: \"subgraph_{name}\" (backward compat / local dev)\n */\nexport function pgSchemaName(\n\tsubgraphName: string,\n\taccountPrefix?: string,\n): string {\n\tconst safeName = subgraphName.replace(/-/g, \"_\");\n\tif (!accountPrefix) {\n\t\treturn `subgraph_${safeName}`;\n\t}\n\tconst safePrefix = accountPrefix.replace(/-/g, \"_\");\n\treturn `subgraph_${safePrefix}_${safeName}`;\n}\n\nexport async function registerSubgraph(\n\tdb: Kysely<Database>,\n\tdata: {\n\t\tname: string;\n\t\tversion: string;\n\t\tdefinition: Record<string, unknown>;\n\t\tschemaHash: string;\n\t\thandlerPath: string;\n\t\tapiKeyId?: string;\n\t\taccountId?: string;\n\t\tschemaName?: string;\n\t\tstartBlock?: number;\n\t\tforkedFromId?: string;\n\t\thandlerCode?: string;\n\t},\n): Promise<Subgraph> {\n\treturn await db\n\t\t.insertInto(\"subgraphs\")\n\t\t.values({\n\t\t\tname: data.name,\n\t\t\tversion: data.version,\n\t\t\tdefinition: jsonb(data.definition) as any,\n\t\t\tschema_hash: data.schemaHash,\n\t\t\thandler_path: data.handlerPath,\n\t\t\tapi_key_id: data.apiKeyId ?? null,\n\t\t\taccount_id: data.accountId ?? \"\",\n\t\t\thandler_code: data.handlerCode ?? null,\n\t\t\tschema_name: data.schemaName ?? null,\n\t\t\tstart_block: data.startBlock ?? 0,\n\t\t\tforked_from_id: data.forkedFromId ?? null,\n\t\t})\n\t\t.onConflict((oc) =>\n\t\t\toc.columns([\"name\", \"account_id\"]).doUpdateSet({\n\t\t\t\tversion: data.version,\n\t\t\t\tdefinition: jsonb(data.definition) as any,\n\t\t\t\tschema_hash: data.schemaHash,\n\t\t\t\thandler_path: data.handlerPath,\n\t\t\t\thandler_code: data.handlerCode ?? null,\n\t\t\t\tapi_key_id: data.apiKeyId ?? null,\n\t\t\t\tschema_name: data.schemaName ?? null,\n\t\t\t\tstart_block: data.startBlock ?? 0,\n\t\t\t\tupdated_at: new Date(),\n\t\t\t}),\n\t\t)\n\t\t.returningAll()\n\t\t.executeTakeFirstOrThrow();\n}\n\nexport async function getSubgraph(\n\tdb: Kysely<Database>,\n\tname: string,\n\taccountId?: string,\n): Promise<Subgraph | null> {\n\tlet query = db.selectFrom(\"subgraphs\").selectAll().where(\"name\", \"=\", name);\n\n\tif (accountId) {\n\t\tquery = query.where(\"account_id\", \"=\", accountId);\n\t}\n\n\treturn (await query.executeTakeFirst()) ?? null;\n}\n\nexport async function listSubgraphs(\n\tdb: Kysely<Database>,\n\taccountId?: string,\n): Promise<Subgraph[]> {\n\tlet query = db.selectFrom(\"subgraphs\").selectAll();\n\tif (accountId) {\n\t\tquery = query.where(\"account_id\", \"=\", accountId);\n\t}\n\treturn query.execute();\n}\n\nexport async function updateSubgraphStatus(\n\tdb: Kysely<Database>,\n\tname: string,\n\tstatus: string,\n\tlastProcessedBlock?: number,\n): Promise<void> {\n\tawait db\n\t\t.updateTable(\"subgraphs\")\n\t\t.set({\n\t\t\tstatus,\n\t\t\t...(lastProcessedBlock !== undefined\n\t\t\t\t? { last_processed_block: lastProcessedBlock }\n\t\t\t\t: {}),\n\t\t\tupdated_at: new Date(),\n\t\t})\n\t\t.where(\"name\", \"=\", name)\n\t\t.execute();\n}\n\nexport async function recordSubgraphProcessed(\n\tdb: Kysely<Database>,\n\tname: string,\n\tprocessed: number,\n\terrors: number,\n\tlastError?: string,\n): Promise<void> {\n\tawait db\n\t\t.updateTable(\"subgraphs\")\n\t\t.set({\n\t\t\ttotal_processed: sql`total_processed + ${processed}`,\n\t\t\ttotal_errors: sql`total_errors + ${errors}`,\n\t\t\t...(lastError\n\t\t\t\t? { last_error: lastError, last_error_at: new Date() }\n\t\t\t\t: {}),\n\t\t\tupdated_at: new Date(),\n\t\t})\n\t\t.where(\"name\", \"=\", name)\n\t\t.execute();\n}\n\nexport async function updateSubgraphHandlerPath(\n\tdb: Kysely<Database>,\n\tname: string,\n\thandlerPath: string,\n): Promise<void> {\n\tawait db\n\t\t.updateTable(\"subgraphs\")\n\t\t.set({ handler_path: handlerPath, updated_at: new Date() })\n\t\t.where(\"name\", \"=\", name)\n\t\t.execute();\n}\n\nexport async function deleteSubgraph(\n\tdb: Kysely<Database>,\n\tname: string,\n\tapiKeyId?: string,\n): Promise<Subgraph | null> {\n\tconst subgraph = await getSubgraph(db, name, apiKeyId);\n\tif (!subgraph) return null;\n\n\t// Use stored schema_name if available, otherwise compute\n\tconst schemaName = subgraph.schema_name ?? pgSchemaName(name);\n\n\t// Drop the subgraph's schema (CASCADE drops all tables within)\n\tawait sql`DROP SCHEMA IF EXISTS ${sql.raw(`\"${schemaName}\"`)} CASCADE`.execute(\n\t\tdb,\n\t);\n\n\t// Remove from registry\n\tawait db.deleteFrom(\"subgraphs\").where(\"id\", \"=\", subgraph.id).execute();\n\n\treturn subgraph;\n}\n"
7
7
  ],
8
- "mappings": "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",
9
- "debugId": "3B8125C51D68206164756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "19BA785B5DA83C2564756E2164756E21",
10
10
  "names": []
11
11
  }
@@ -49,6 +49,7 @@ interface StreamsTable {
49
49
  endpoint_url: string;
50
50
  signing_secret: string | null;
51
51
  api_key_id: string;
52
+ project_id: string | null;
52
53
  created_at: Generated<Date>;
53
54
  updated_at: Generated<Date>;
54
55
  }
@@ -110,7 +111,14 @@ interface SubgraphsTable {
110
111
  last_error_at: Date | null;
111
112
  total_processed: Generated<number>;
112
113
  total_errors: Generated<number>;
113
- api_key_id: string;
114
+ api_key_id: string | null;
115
+ account_id: string;
116
+ handler_code: string | null;
117
+ project_id: string | null;
118
+ is_public: Generated<boolean>;
119
+ tags: Generated<string[]>;
120
+ description: string | null;
121
+ forked_from_id: string | null;
114
122
  created_at: Generated<Date>;
115
123
  updated_at: Generated<Date>;
116
124
  }
@@ -141,6 +149,10 @@ interface AccountsTable {
141
149
  id: Generated<string>;
142
150
  email: string;
143
151
  plan: Generated<string>;
152
+ display_name: string | null;
153
+ bio: string | null;
154
+ avatar_url: string | null;
155
+ slug: string | null;
144
156
  created_at: Generated<Date>;
145
157
  }
146
158
  interface SessionsTable {
@@ -241,6 +253,131 @@ interface SubgraphHealthSnapshotsTable {
241
253
  last_processed_block: number | null;
242
254
  captured_at: Generated<Date>;
243
255
  }
256
+ interface SubgraphUsageDailyTable {
257
+ subgraph_id: string;
258
+ date: string;
259
+ query_count: Generated<number>;
260
+ }
261
+ interface ProjectsTable {
262
+ id: Generated<string>;
263
+ name: string;
264
+ slug: string;
265
+ account_id: string;
266
+ settings: Generated<Record<string, unknown>>;
267
+ network: Generated<string>;
268
+ node_rpc: string | null;
269
+ created_at: Generated<Date>;
270
+ updated_at: Generated<Date>;
271
+ }
272
+ interface TeamMembersTable {
273
+ id: Generated<string>;
274
+ project_id: string;
275
+ account_id: string;
276
+ role: Generated<string>;
277
+ invited_by: string | null;
278
+ created_at: Generated<Date>;
279
+ }
280
+ interface TeamInvitationsTable {
281
+ id: Generated<string>;
282
+ project_id: string;
283
+ email: string;
284
+ role: Generated<string>;
285
+ token: string;
286
+ invited_by: string | null;
287
+ expires_at: Date;
288
+ accepted_at: Date | null;
289
+ created_at: Generated<Date>;
290
+ }
291
+ interface ChatSessionsTable {
292
+ id: Generated<string>;
293
+ account_id: string;
294
+ title: string | null;
295
+ summary: unknown | null;
296
+ created_at: Generated<Date>;
297
+ updated_at: Generated<Date>;
298
+ }
299
+ interface ChatMessagesTable {
300
+ id: Generated<string>;
301
+ chat_session_id: string;
302
+ role: string;
303
+ parts: unknown;
304
+ metadata: unknown | null;
305
+ created_at: Generated<Date>;
306
+ }
307
+ interface WorkflowDefinitionsTable {
308
+ id: Generated<string>;
309
+ name: string;
310
+ version: Generated<string>;
311
+ status: Generated<string>;
312
+ trigger_type: string;
313
+ trigger_config: unknown;
314
+ handler_path: string;
315
+ retries_config: unknown | null;
316
+ timeout_ms: number | null;
317
+ api_key_id: string;
318
+ project_id: string | null;
319
+ created_at: Generated<Date>;
320
+ updated_at: Generated<Date>;
321
+ }
322
+ interface WorkflowRunsTable {
323
+ id: Generated<string>;
324
+ definition_id: string;
325
+ status: Generated<string>;
326
+ trigger_type: string;
327
+ trigger_data: unknown | null;
328
+ dedup_key: string | null;
329
+ error: string | null;
330
+ started_at: Date | null;
331
+ completed_at: Date | null;
332
+ duration_ms: number | null;
333
+ total_ai_tokens: Generated<number>;
334
+ created_at: Generated<Date>;
335
+ }
336
+ interface WorkflowStepsTable {
337
+ id: Generated<string>;
338
+ run_id: string;
339
+ step_index: number;
340
+ step_id: string;
341
+ step_type: string;
342
+ status: Generated<string>;
343
+ input: unknown | null;
344
+ output: unknown | null;
345
+ error: string | null;
346
+ retry_count: Generated<number>;
347
+ ai_tokens_used: Generated<number>;
348
+ started_at: Date | null;
349
+ completed_at: Date | null;
350
+ duration_ms: number | null;
351
+ created_at: Generated<Date>;
352
+ }
353
+ interface WorkflowQueueTable {
354
+ id: Generated<string>;
355
+ run_id: string;
356
+ status: Generated<string>;
357
+ attempts: Generated<number>;
358
+ max_attempts: Generated<number>;
359
+ scheduled_for: Generated<Date>;
360
+ locked_at: Date | null;
361
+ locked_by: string | null;
362
+ error: string | null;
363
+ created_at: Generated<Date>;
364
+ completed_at: Date | null;
365
+ }
366
+ interface WorkflowSchedulesTable {
367
+ id: Generated<string>;
368
+ definition_id: string;
369
+ cron_expr: string;
370
+ timezone: Generated<string>;
371
+ next_run_at: Date;
372
+ last_run_at: Date | null;
373
+ enabled: Generated<boolean>;
374
+ created_at: Generated<Date>;
375
+ }
376
+ interface WorkflowCursorsTable {
377
+ name: string;
378
+ block_height: Generated<number>;
379
+ updated_at: Generated<Date>;
380
+ }
244
381
  interface Database {
245
382
  blocks: BlocksTable;
246
383
  transactions: TransactionsTable;
@@ -264,6 +401,18 @@ interface Database {
264
401
  subgraph_processing_stats: SubgraphProcessingStatsTable;
265
402
  subgraph_table_snapshots: SubgraphTableSnapshotsTable;
266
403
  subgraph_gaps: SubgraphGapsTable;
404
+ subgraph_usage_daily: SubgraphUsageDailyTable;
405
+ projects: ProjectsTable;
406
+ team_members: TeamMembersTable;
407
+ team_invitations: TeamInvitationsTable;
408
+ chat_sessions: ChatSessionsTable;
409
+ chat_messages: ChatMessagesTable;
410
+ workflow_definitions: WorkflowDefinitionsTable;
411
+ workflow_runs: WorkflowRunsTable;
412
+ workflow_steps: WorkflowStepsTable;
413
+ workflow_queue: WorkflowQueueTable;
414
+ workflow_schedules: WorkflowSchedulesTable;
415
+ workflow_cursors: WorkflowCursorsTable;
267
416
  }
268
417
  /** Increment API request counter for today. Fire-and-forget safe. */
269
418
  declare function incrementApiRequests(db: Kysely<Database>, accountId: string): Promise<void>;