@secondlayer/shared 0.12.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +5 -7
  2. package/dist/src/constants.d.ts +2 -0
  3. package/dist/src/constants.js +24 -0
  4. package/dist/src/constants.js.map +10 -0
  5. package/dist/src/db/index.d.ts +3 -64
  6. package/dist/src/db/index.js +2 -2
  7. package/dist/src/db/index.js.map +2 -2
  8. package/dist/src/db/queries/accounts.d.ts +12 -52
  9. package/dist/src/db/queries/accounts.js +27 -2
  10. package/dist/src/db/queries/accounts.js.map +3 -3
  11. package/dist/src/db/queries/integrity.d.ts +2 -51
  12. package/dist/src/db/queries/marketplace.d.ts +2 -51
  13. package/dist/src/db/queries/projects.d.ts +2 -51
  14. package/dist/src/db/queries/subgraph-gaps.d.ts +2 -51
  15. package/dist/src/db/queries/subgraphs.d.ts +3 -51
  16. package/dist/src/db/queries/subgraphs.js +3 -1
  17. package/dist/src/db/queries/subgraphs.js.map +3 -3
  18. package/dist/src/db/queries/usage.d.ts +3 -56
  19. package/dist/src/db/queries/usage.js +1 -19
  20. package/dist/src/db/queries/usage.js.map +4 -4
  21. package/dist/src/db/queries/workflows.d.ts +7 -53
  22. package/dist/src/db/queries/workflows.js +130 -13
  23. package/dist/src/db/queries/workflows.js.map +5 -4
  24. package/dist/src/db/schema.d.ts +3 -64
  25. package/dist/src/errors.d.ts +19 -50
  26. package/dist/src/errors.js +28 -45
  27. package/dist/src/errors.js.map +3 -3
  28. package/dist/src/index.d.ts +25 -256
  29. package/dist/src/index.js +32 -234
  30. package/dist/src/index.js.map +7 -9
  31. package/dist/src/lib/plans.d.ts +0 -1
  32. package/dist/src/lib/plans.js +1 -2
  33. package/dist/src/lib/plans.js.map +3 -3
  34. package/dist/src/node/local-client.d.ts +2 -51
  35. package/dist/src/queue/listener.d.ts +1 -18
  36. package/dist/src/queue/listener.js +2 -12
  37. package/dist/src/queue/listener.js.map +3 -3
  38. package/dist/src/schemas/filters.d.ts +3 -3
  39. package/dist/src/schemas/filters.js +3 -3
  40. package/dist/src/schemas/filters.js.map +3 -3
  41. package/dist/src/schemas/index.d.ts +5 -100
  42. package/dist/src/schemas/index.js +4 -88
  43. package/dist/src/schemas/index.js.map +5 -6
  44. package/dist/src/schemas/subgraphs.d.ts +2 -0
  45. package/dist/src/schemas/subgraphs.js +2 -1
  46. package/dist/src/schemas/subgraphs.js.map +3 -3
  47. package/dist/src/schemas/workflows.d.ts +4 -0
  48. package/dist/src/schemas/workflows.js +5 -1
  49. package/dist/src/schemas/workflows.js.map +3 -3
  50. package/dist/src/types.d.ts +1 -53
  51. package/migrations/0030_workflow_source_code.ts +21 -0
  52. package/migrations/0031_subgraph_source_code.ts +18 -0
  53. package/migrations/0032_drop_streams_tables.ts +43 -0
  54. package/package.json +6 -14
  55. package/dist/src/db/queries/metrics.d.ts +0 -419
  56. package/dist/src/db/queries/metrics.js +0 -55
  57. package/dist/src/db/queries/metrics.js.map +0 -10
  58. package/dist/src/queue/index.d.ts +0 -50
  59. package/dist/src/queue/index.js +0 -184
  60. package/dist/src/queue/index.js.map +0 -12
  61. package/dist/src/queue/recovery.d.ts +0 -14
  62. package/dist/src/queue/recovery.js +0 -108
  63. package/dist/src/queue/recovery.js.map +0 -12
@@ -32,40 +32,6 @@ interface EventsTable {
32
32
  data: unknown;
33
33
  created_at: Generated<Date>;
34
34
  }
35
- interface StreamsTable {
36
- id: Generated<string>;
37
- name: string;
38
- status: Generated<string>;
39
- filters: unknown;
40
- options: Generated<unknown>;
41
- endpoint_url: string;
42
- signing_secret: string | null;
43
- api_key_id: string;
44
- project_id: string | null;
45
- created_at: Generated<Date>;
46
- updated_at: Generated<Date>;
47
- }
48
- interface StreamMetricsTable {
49
- stream_id: string;
50
- last_triggered_at: Date | null;
51
- last_triggered_block: number | null;
52
- total_deliveries: Generated<number>;
53
- failed_deliveries: Generated<number>;
54
- error_message: string | null;
55
- }
56
- interface JobsTable {
57
- id: Generated<string>;
58
- stream_id: string;
59
- block_height: number;
60
- status: Generated<string>;
61
- attempts: Generated<number>;
62
- locked_at: Date | null;
63
- locked_by: string | null;
64
- error: string | null;
65
- backfill: Generated<boolean>;
66
- created_at: Generated<Date>;
67
- completed_at: Date | null;
68
- }
69
35
  interface IndexProgressTable {
70
36
  network: string;
71
37
  last_indexed_block: Generated<number>;
@@ -73,19 +39,6 @@ interface IndexProgressTable {
73
39
  highest_seen_block: Generated<number>;
74
40
  updated_at: Generated<Date>;
75
41
  }
76
- interface DeliveriesTable {
77
- id: Generated<string>;
78
- stream_id: string;
79
- job_id: string | null;
80
- block_height: number;
81
- status: string;
82
- status_code: number | null;
83
- response_time_ms: number | null;
84
- attempts: Generated<number>;
85
- error: string | null;
86
- payload: unknown;
87
- created_at: Generated<Date>;
88
- }
89
42
  interface SubgraphsTable {
90
43
  id: Generated<string>;
91
44
  name: string;
@@ -106,6 +59,7 @@ interface SubgraphsTable {
106
59
  api_key_id: string | null;
107
60
  account_id: string;
108
61
  handler_code: string | null;
62
+ source_code: string | null;
109
63
  project_id: string | null;
110
64
  is_public: Generated<boolean>;
111
65
  tags: Generated<string[]>;
@@ -304,6 +258,7 @@ interface WorkflowDefinitionsTable {
304
258
  trigger_type: string;
305
259
  trigger_config: unknown;
306
260
  handler_path: string;
261
+ source_code: string | null;
307
262
  retries_config: unknown | null;
308
263
  timeout_ms: number | null;
309
264
  api_key_id: string;
@@ -374,11 +329,7 @@ interface Database {
374
329
  blocks: BlocksTable;
375
330
  transactions: TransactionsTable;
376
331
  events: EventsTable;
377
- streams: StreamsTable;
378
- stream_metrics: StreamMetricsTable;
379
- jobs: JobsTable;
380
332
  index_progress: IndexProgressTable;
381
- deliveries: DeliveriesTable;
382
333
  subgraphs: SubgraphsTable;
383
334
  api_keys: ApiKeysTable;
384
335
  accounts: AccountsTable;
@@ -409,6 +360,8 @@ interface Database {
409
360
  type WorkflowDefinition = Selectable<WorkflowDefinitionsTable>;
410
361
  type WorkflowRun = Selectable<WorkflowRunsTable>;
411
362
  type WorkflowStep = Selectable<WorkflowStepsTable>;
363
+ /** Bump the patch digit of a semver string. Falls back to "1.0.1" on malformed input. */
364
+ declare function bumpPatch(version: string): string;
412
365
  declare function listWorkflowDefinitions(db: Kysely<Database>, apiKeyIds?: string[]): Promise<WorkflowDefinition[]>;
413
366
  declare function getWorkflowDefinition(db: Kysely<Database>, name: string, apiKeyIds?: string[]): Promise<WorkflowDefinition | null>;
414
367
  declare function upsertWorkflowDefinition(db: Kysely<Database>, data: {
@@ -420,7 +373,8 @@ declare function upsertWorkflowDefinition(db: Kysely<Database>, data: {
420
373
  projectId?: string
421
374
  retriesConfig?: Record<string, unknown>
422
375
  timeoutMs?: number
423
- version?: string
376
+ sourceCode?: string
377
+ expectedVersion?: string
424
378
  }): Promise<WorkflowDefinition>;
425
379
  declare function updateWorkflowStatus(db: Kysely<Database>, name: string, apiKeyId: string, status: string): Promise<void>;
426
380
  declare function deleteWorkflowDefinition(db: Kysely<Database>, name: string, apiKeyId: string): Promise<void>;
@@ -437,4 +391,4 @@ declare function listWorkflowRuns(db: Kysely<Database>, definitionId: string, pa
437
391
  offset?: number
438
392
  }): Promise<WorkflowRun[]>;
439
393
  declare function getWorkflowSteps(db: Kysely<Database>, runId: string): Promise<WorkflowStep[]>;
440
- export { upsertWorkflowDefinition, updateWorkflowStatus, listWorkflowRuns, listWorkflowDefinitions, getWorkflowSteps, getWorkflowRun, getWorkflowDefinition, deleteWorkflowDefinition, createWorkflowRun };
394
+ export { upsertWorkflowDefinition, updateWorkflowStatus, listWorkflowRuns, listWorkflowDefinitions, getWorkflowSteps, getWorkflowRun, getWorkflowDefinition, deleteWorkflowDefinition, createWorkflowRun, bumpPatch };
@@ -31,7 +31,113 @@ function parseJsonb(value) {
31
31
  return value ?? {};
32
32
  }
33
33
 
34
+ // src/errors.ts
35
+ var ErrorCodes = {
36
+ VALIDATION_ERROR: "VALIDATION_ERROR",
37
+ DATABASE_ERROR: "DATABASE_ERROR",
38
+ AUTHENTICATION_ERROR: "AUTHENTICATION_ERROR",
39
+ AUTHORIZATION_ERROR: "AUTHORIZATION_ERROR",
40
+ RATE_LIMIT_ERROR: "RATE_LIMIT_ERROR",
41
+ FORBIDDEN: "FORBIDDEN",
42
+ VERSION_CONFLICT: "VERSION_CONFLICT",
43
+ NOT_FOUND: "NOT_FOUND"
44
+ };
45
+
46
+ class SecondLayerError extends Error {
47
+ code;
48
+ cause;
49
+ constructor(code, message, cause) {
50
+ super(message);
51
+ this.code = code;
52
+ this.cause = cause;
53
+ this.name = this.constructor.name;
54
+ Error.captureStackTrace?.(this, this.constructor);
55
+ }
56
+ toJSON() {
57
+ return {
58
+ name: this.name,
59
+ code: this.code,
60
+ message: this.message,
61
+ stack: this.stack,
62
+ cause: this.cause
63
+ };
64
+ }
65
+ }
66
+
67
+ class NotFoundError extends SecondLayerError {
68
+ constructor(message) {
69
+ super("NOT_FOUND", message);
70
+ }
71
+ }
72
+
73
+ class ValidationError extends SecondLayerError {
74
+ constructor(message, cause) {
75
+ super("VALIDATION_ERROR", message, cause);
76
+ }
77
+ }
78
+
79
+ class DatabaseError extends SecondLayerError {
80
+ constructor(message, cause) {
81
+ super("DATABASE_ERROR", message, cause);
82
+ }
83
+ }
84
+
85
+ class AuthenticationError extends SecondLayerError {
86
+ constructor(message) {
87
+ super("AUTHENTICATION_ERROR", message);
88
+ }
89
+ }
90
+
91
+ class AuthorizationError extends SecondLayerError {
92
+ constructor(message) {
93
+ super("AUTHORIZATION_ERROR", message);
94
+ }
95
+ }
96
+
97
+ class RateLimitError extends SecondLayerError {
98
+ constructor(message) {
99
+ super("RATE_LIMIT_ERROR", message);
100
+ }
101
+ }
102
+
103
+ class ForbiddenError extends SecondLayerError {
104
+ constructor(message = "Forbidden") {
105
+ super("FORBIDDEN", message);
106
+ }
107
+ }
108
+
109
+ class VersionConflictError extends SecondLayerError {
110
+ currentVersion;
111
+ expectedVersion;
112
+ constructor(currentVersion, expectedVersion) {
113
+ super("VERSION_CONFLICT", `Version conflict: expected ${expectedVersion}, current ${currentVersion}`);
114
+ this.currentVersion = currentVersion;
115
+ this.expectedVersion = expectedVersion;
116
+ }
117
+ }
118
+ var CODE_TO_STATUS = {
119
+ AUTHENTICATION_ERROR: 401,
120
+ AUTHORIZATION_ERROR: 403,
121
+ RATE_LIMIT_ERROR: 429,
122
+ FORBIDDEN: 403,
123
+ NOT_FOUND: 404,
124
+ VALIDATION_ERROR: 400
125
+ };
126
+ function getErrorMessage(err) {
127
+ return err instanceof Error ? err.message : String(err);
128
+ }
129
+
34
130
  // src/db/queries/workflows.ts
131
+ function bumpPatch(version) {
132
+ const parts = version.split(".");
133
+ if (parts.length !== 3)
134
+ return "1.0.1";
135
+ const [major, minor, patch] = parts.map((p) => Number.parseInt(p, 10));
136
+ if (Number.isNaN(major) || Number.isNaN(minor) || Number.isNaN(patch) || major === undefined || minor === undefined || patch === undefined) {
137
+ return "1.0.1";
138
+ }
139
+ return `${major}.${minor}.${patch + 1}`;
140
+ }
35
141
  async function listWorkflowDefinitions(db, apiKeyIds) {
36
142
  let query = db.selectFrom("workflow_definitions").selectAll().where("status", "!=", "deleted").orderBy("created_at", "desc");
37
143
  if (apiKeyIds?.length) {
@@ -47,26 +153,36 @@ async function getWorkflowDefinition(db, name, apiKeyIds) {
47
153
  return await query.executeTakeFirst() ?? null;
48
154
  }
49
155
  async function upsertWorkflowDefinition(db, data) {
156
+ const existing = await db.selectFrom("workflow_definitions").selectAll().where("name", "=", data.name).where("api_key_id", "=", data.apiKeyId).executeTakeFirst();
157
+ if (existing) {
158
+ if (data.expectedVersion !== undefined && existing.version !== data.expectedVersion) {
159
+ throw new VersionConflictError(existing.version, data.expectedVersion);
160
+ }
161
+ const nextVersion = bumpPatch(existing.version);
162
+ return await db.updateTable("workflow_definitions").set({
163
+ trigger_type: data.triggerType,
164
+ trigger_config: jsonb(data.triggerConfig),
165
+ handler_path: data.handlerPath,
166
+ source_code: data.sourceCode ?? existing.source_code,
167
+ retries_config: data.retriesConfig ? jsonb(data.retriesConfig) : null,
168
+ timeout_ms: data.timeoutMs ?? null,
169
+ version: nextVersion,
170
+ status: "active",
171
+ updated_at: new Date
172
+ }).where("id", "=", existing.id).returningAll().executeTakeFirstOrThrow();
173
+ }
50
174
  return await db.insertInto("workflow_definitions").values({
51
175
  name: data.name,
52
176
  trigger_type: data.triggerType,
53
177
  trigger_config: jsonb(data.triggerConfig),
54
178
  handler_path: data.handlerPath,
179
+ source_code: data.sourceCode ?? null,
55
180
  api_key_id: data.apiKeyId,
56
181
  project_id: data.projectId ?? null,
57
182
  retries_config: data.retriesConfig ? jsonb(data.retriesConfig) : null,
58
183
  timeout_ms: data.timeoutMs ?? null,
59
- version: data.version ?? "1.0.0"
60
- }).onConflict((oc) => oc.columns(["name", "api_key_id"]).doUpdateSet({
61
- trigger_type: data.triggerType,
62
- trigger_config: jsonb(data.triggerConfig),
63
- handler_path: data.handlerPath,
64
- retries_config: data.retriesConfig ? jsonb(data.retriesConfig) : null,
65
- timeout_ms: data.timeoutMs ?? null,
66
- version: data.version ?? "1.0.0",
67
- status: "active",
68
- updated_at: new Date
69
- })).returningAll().executeTakeFirstOrThrow();
184
+ version: "1.0.0"
185
+ }).returningAll().executeTakeFirstOrThrow();
70
186
  }
71
187
  async function updateWorkflowStatus(db, name, apiKeyId, status) {
72
188
  await db.updateTable("workflow_definitions").set({ status, updated_at: new Date }).where("name", "=", name).where("api_key_id", "=", apiKeyId).execute();
@@ -108,8 +224,9 @@ export {
108
224
  getWorkflowRun,
109
225
  getWorkflowDefinition,
110
226
  deleteWorkflowDefinition,
111
- createWorkflowRun
227
+ createWorkflowRun,
228
+ bumpPatch
112
229
  };
113
230
 
114
- //# debugId=EDBC38F3000DD9C664756E2164756E21
231
+ //# debugId=A3CE9B539936424A64756E2164756E21
115
232
  //# sourceMappingURL=workflows.js.map
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/db/jsonb.ts", "../src/db/queries/workflows.ts"],
3
+ "sources": ["../src/db/jsonb.ts", "../src/errors.ts", "../src/db/queries/workflows.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, (_k, v) => (typeof v === \"bigint\" ? v.toString() : v)).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 } from \"kysely\";\nimport { jsonb } from \"../jsonb.ts\";\nimport type {\n\tDatabase,\n\tWorkflowDefinition,\n\tWorkflowRun,\n\tWorkflowStep,\n} from \"../types.ts\";\n\n// ── Definitions ──────────────────────────────────────────────────────\n\nexport async function listWorkflowDefinitions(\n\tdb: Kysely<Database>,\n\tapiKeyIds?: string[],\n): Promise<WorkflowDefinition[]> {\n\tlet query = db\n\t\t.selectFrom(\"workflow_definitions\")\n\t\t.selectAll()\n\t\t.where(\"status\", \"!=\", \"deleted\")\n\t\t.orderBy(\"created_at\", \"desc\");\n\n\tif (apiKeyIds?.length) {\n\t\tquery = query.where(\"api_key_id\", \"in\", apiKeyIds);\n\t}\n\n\treturn await query.execute();\n}\n\nexport async function getWorkflowDefinition(\n\tdb: Kysely<Database>,\n\tname: string,\n\tapiKeyIds?: string[],\n): Promise<WorkflowDefinition | null> {\n\tlet query = db\n\t\t.selectFrom(\"workflow_definitions\")\n\t\t.selectAll()\n\t\t.where(\"name\", \"=\", name);\n\n\tif (apiKeyIds?.length) {\n\t\tquery = query.where(\"api_key_id\", \"in\", apiKeyIds);\n\t}\n\n\treturn (await query.executeTakeFirst()) ?? null;\n}\n\nexport async function upsertWorkflowDefinition(\n\tdb: Kysely<Database>,\n\tdata: {\n\t\tname: string;\n\t\ttriggerType: string;\n\t\ttriggerConfig: Record<string, unknown>;\n\t\thandlerPath: string;\n\t\tapiKeyId: string;\n\t\tprojectId?: string;\n\t\tretriesConfig?: Record<string, unknown>;\n\t\ttimeoutMs?: number;\n\t\tversion?: string;\n\t},\n): Promise<WorkflowDefinition> {\n\treturn await db\n\t\t.insertInto(\"workflow_definitions\")\n\t\t.values({\n\t\t\tname: data.name,\n\t\t\ttrigger_type: data.triggerType,\n\t\t\ttrigger_config: jsonb(data.triggerConfig) as any,\n\t\t\thandler_path: data.handlerPath,\n\t\t\tapi_key_id: data.apiKeyId,\n\t\t\tproject_id: data.projectId ?? null,\n\t\t\tretries_config: data.retriesConfig\n\t\t\t\t? (jsonb(data.retriesConfig) as any)\n\t\t\t\t: null,\n\t\t\ttimeout_ms: data.timeoutMs ?? null,\n\t\t\tversion: data.version ?? \"1.0.0\",\n\t\t})\n\t\t.onConflict((oc) =>\n\t\t\toc.columns([\"name\", \"api_key_id\"]).doUpdateSet({\n\t\t\t\ttrigger_type: data.triggerType,\n\t\t\t\ttrigger_config: jsonb(data.triggerConfig) as any,\n\t\t\t\thandler_path: data.handlerPath,\n\t\t\t\tretries_config: data.retriesConfig\n\t\t\t\t\t? (jsonb(data.retriesConfig) as any)\n\t\t\t\t\t: null,\n\t\t\t\ttimeout_ms: data.timeoutMs ?? null,\n\t\t\t\tversion: data.version ?? \"1.0.0\",\n\t\t\t\tstatus: \"active\",\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 updateWorkflowStatus(\n\tdb: Kysely<Database>,\n\tname: string,\n\tapiKeyId: string,\n\tstatus: string,\n): Promise<void> {\n\tawait db\n\t\t.updateTable(\"workflow_definitions\")\n\t\t.set({ status, updated_at: new Date() })\n\t\t.where(\"name\", \"=\", name)\n\t\t.where(\"api_key_id\", \"=\", apiKeyId)\n\t\t.execute();\n}\n\nexport async function deleteWorkflowDefinition(\n\tdb: Kysely<Database>,\n\tname: string,\n\tapiKeyId: string,\n): Promise<void> {\n\tawait db\n\t\t.updateTable(\"workflow_definitions\")\n\t\t.set({ status: \"deleted\", updated_at: new Date() })\n\t\t.where(\"name\", \"=\", name)\n\t\t.where(\"api_key_id\", \"=\", apiKeyId)\n\t\t.execute();\n}\n\n// ── Runs ─────────────────────────────────────────────────────────────\n\nexport async function createWorkflowRun(\n\tdb: Kysely<Database>,\n\tdata: {\n\t\tdefinitionId: string;\n\t\ttriggerType: string;\n\t\ttriggerData?: Record<string, unknown>;\n\t\tdedupKey?: string;\n\t},\n): Promise<WorkflowRun> {\n\treturn await db\n\t\t.insertInto(\"workflow_runs\")\n\t\t.values({\n\t\t\tdefinition_id: data.definitionId,\n\t\t\ttrigger_type: data.triggerType,\n\t\t\ttrigger_data: data.triggerData\n\t\t\t\t? (jsonb(data.triggerData) as any)\n\t\t\t\t: null,\n\t\t\tdedup_key: data.dedupKey ?? null,\n\t\t})\n\t\t.returningAll()\n\t\t.executeTakeFirstOrThrow();\n}\n\nexport async function getWorkflowRun(\n\tdb: Kysely<Database>,\n\trunId: string,\n): Promise<WorkflowRun | null> {\n\treturn (\n\t\t(await db\n\t\t\t.selectFrom(\"workflow_runs\")\n\t\t\t.selectAll()\n\t\t\t.where(\"id\", \"=\", runId)\n\t\t\t.executeTakeFirst()) ?? null\n\t);\n}\n\nexport async function listWorkflowRuns(\n\tdb: Kysely<Database>,\n\tdefinitionId: string,\n\tparams?: { status?: string; limit?: number; offset?: number },\n): Promise<WorkflowRun[]> {\n\tlet query = db\n\t\t.selectFrom(\"workflow_runs\")\n\t\t.selectAll()\n\t\t.where(\"definition_id\", \"=\", definitionId)\n\t\t.orderBy(\"created_at\", \"desc\");\n\n\tif (params?.status) {\n\t\tquery = query.where(\"status\", \"=\", params.status);\n\t}\n\n\tquery = query.limit(params?.limit ?? 20);\n\n\tif (params?.offset) {\n\t\tquery = query.offset(params.offset);\n\t}\n\n\treturn await query.execute();\n}\n\n// ── Steps ────────────────────────────────────────────────────────────\n\nexport async function getWorkflowSteps(\n\tdb: Kysely<Database>,\n\trunId: string,\n): Promise<WorkflowStep[]> {\n\treturn await db\n\t\t.selectFrom(\"workflow_steps\")\n\t\t.selectAll()\n\t\t.where(\"run_id\", \"=\", runId)\n\t\t.orderBy(\"step_index\", \"asc\")\n\t\t.execute();\n}\n"
6
+ "export const ErrorCodes = {\n\tVALIDATION_ERROR: \"VALIDATION_ERROR\",\n\tDATABASE_ERROR: \"DATABASE_ERROR\",\n\tAUTHENTICATION_ERROR: \"AUTHENTICATION_ERROR\",\n\tAUTHORIZATION_ERROR: \"AUTHORIZATION_ERROR\",\n\tRATE_LIMIT_ERROR: \"RATE_LIMIT_ERROR\",\n\tFORBIDDEN: \"FORBIDDEN\",\n\tVERSION_CONFLICT: \"VERSION_CONFLICT\",\n\tNOT_FOUND: \"NOT_FOUND\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/** Base error class for all Secondlayer errors. */\nexport class SecondLayerError extends Error {\n\tpublic code: ErrorCode;\n\tpublic override cause?: unknown;\n\n\tconstructor(code: ErrorCode, message: string, cause?: unknown) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t\tthis.cause = cause;\n\t\tthis.name = this.constructor.name;\n\t\tError.captureStackTrace?.(this, this.constructor);\n\t}\n\n\ttoJSON(): {\n\t\tname: string;\n\t\tcode: string;\n\t\tmessage: string;\n\t\tstack: string | undefined;\n\t\tcause: unknown;\n\t} {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tcode: this.code,\n\t\t\tmessage: this.message,\n\t\t\tstack: this.stack,\n\t\t\tcause: this.cause,\n\t\t};\n\t}\n}\n\nexport class NotFoundError extends SecondLayerError {\n\tconstructor(message: string) {\n\t\tsuper(\"NOT_FOUND\", message);\n\t}\n}\n\nexport class ValidationError extends SecondLayerError {\n\tconstructor(message: string, cause?: unknown) {\n\t\tsuper(\"VALIDATION_ERROR\", message, cause);\n\t}\n}\n\nexport class DatabaseError extends SecondLayerError {\n\tconstructor(message: string, cause?: unknown) {\n\t\tsuper(\"DATABASE_ERROR\", message, cause);\n\t}\n}\n\nexport class AuthenticationError extends SecondLayerError {\n\tconstructor(message: string) {\n\t\tsuper(\"AUTHENTICATION_ERROR\", message);\n\t}\n}\n\nexport class AuthorizationError extends SecondLayerError {\n\tconstructor(message: string) {\n\t\tsuper(\"AUTHORIZATION_ERROR\", message);\n\t}\n}\n\nexport class RateLimitError extends SecondLayerError {\n\tconstructor(message: string) {\n\t\tsuper(\"RATE_LIMIT_ERROR\", message);\n\t}\n}\n\nexport class ForbiddenError extends SecondLayerError {\n\tconstructor(message = \"Forbidden\") {\n\t\tsuper(\"FORBIDDEN\", message);\n\t}\n}\n\nexport class VersionConflictError extends SecondLayerError {\n\tpublic currentVersion: string;\n\tpublic expectedVersion: string;\n\n\tconstructor(currentVersion: string, expectedVersion: string) {\n\t\tsuper(\n\t\t\t\"VERSION_CONFLICT\",\n\t\t\t`Version conflict: expected ${expectedVersion}, current ${currentVersion}`,\n\t\t);\n\t\tthis.currentVersion = currentVersion;\n\t\tthis.expectedVersion = expectedVersion;\n\t}\n}\n\n/** Error code HTTP status. Used by API middleware for code-based matching\n * (avoids cross-bundle instanceof failures from bunup class duplication). */\ntype MappedCode = Extract<\n\tErrorCode,\n\t| \"AUTHENTICATION_ERROR\"\n\t| \"AUTHORIZATION_ERROR\"\n\t| \"RATE_LIMIT_ERROR\"\n\t| \"FORBIDDEN\"\n\t| \"NOT_FOUND\"\n\t| \"VALIDATION_ERROR\"\n>;\nexport const CODE_TO_STATUS: Record<MappedCode, 400 | 401 | 403 | 404 | 429> = {\n\tAUTHENTICATION_ERROR: 401,\n\tAUTHORIZATION_ERROR: 403,\n\tRATE_LIMIT_ERROR: 429,\n\tFORBIDDEN: 403,\n\tNOT_FOUND: 404,\n\tVALIDATION_ERROR: 400,\n} as const;\n\nexport function getErrorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n",
7
+ "import type { Kysely } from \"kysely\";\nimport { VersionConflictError } from \"../../errors.ts\";\nimport { jsonb } from \"../jsonb.ts\";\nimport type {\n\tDatabase,\n\tWorkflowDefinition,\n\tWorkflowRun,\n\tWorkflowStep,\n} from \"../types.ts\";\n\n/** Bump the patch digit of a semver string. Falls back to \"1.0.1\" on malformed input. */\nexport function bumpPatch(version: string): string {\n\tconst parts = version.split(\".\");\n\tif (parts.length !== 3) return \"1.0.1\";\n\tconst [major, minor, patch] = parts.map((p) => Number.parseInt(p, 10));\n\tif (\n\t\tNumber.isNaN(major) ||\n\t\tNumber.isNaN(minor) ||\n\t\tNumber.isNaN(patch) ||\n\t\tmajor === undefined ||\n\t\tminor === undefined ||\n\t\tpatch === undefined\n\t) {\n\t\treturn \"1.0.1\";\n\t}\n\treturn `${major}.${minor}.${patch + 1}`;\n}\n\n// ── Definitions ──────────────────────────────────────────────────────\n\nexport async function listWorkflowDefinitions(\n\tdb: Kysely<Database>,\n\tapiKeyIds?: string[],\n): Promise<WorkflowDefinition[]> {\n\tlet query = db\n\t\t.selectFrom(\"workflow_definitions\")\n\t\t.selectAll()\n\t\t.where(\"status\", \"!=\", \"deleted\")\n\t\t.orderBy(\"created_at\", \"desc\");\n\n\tif (apiKeyIds?.length) {\n\t\tquery = query.where(\"api_key_id\", \"in\", apiKeyIds);\n\t}\n\n\treturn await query.execute();\n}\n\nexport async function getWorkflowDefinition(\n\tdb: Kysely<Database>,\n\tname: string,\n\tapiKeyIds?: string[],\n): Promise<WorkflowDefinition | null> {\n\tlet query = db\n\t\t.selectFrom(\"workflow_definitions\")\n\t\t.selectAll()\n\t\t.where(\"name\", \"=\", name);\n\n\tif (apiKeyIds?.length) {\n\t\tquery = query.where(\"api_key_id\", \"in\", apiKeyIds);\n\t}\n\n\treturn (await query.executeTakeFirst()) ?? null;\n}\n\nexport async function upsertWorkflowDefinition(\n\tdb: Kysely<Database>,\n\tdata: {\n\t\tname: string;\n\t\ttriggerType: string;\n\t\ttriggerConfig: Record<string, unknown>;\n\t\thandlerPath: string;\n\t\tapiKeyId: string;\n\t\tprojectId?: string;\n\t\tretriesConfig?: Record<string, unknown>;\n\t\ttimeoutMs?: number;\n\t\tsourceCode?: string;\n\t\texpectedVersion?: string;\n\t},\n): Promise<WorkflowDefinition> {\n\tconst existing = await db\n\t\t.selectFrom(\"workflow_definitions\")\n\t\t.selectAll()\n\t\t.where(\"name\", \"=\", data.name)\n\t\t.where(\"api_key_id\", \"=\", data.apiKeyId)\n\t\t.executeTakeFirst();\n\n\tif (existing) {\n\t\tif (\n\t\t\tdata.expectedVersion !== undefined &&\n\t\t\texisting.version !== data.expectedVersion\n\t\t) {\n\t\t\tthrow new VersionConflictError(existing.version, data.expectedVersion);\n\t\t}\n\n\t\tconst nextVersion = bumpPatch(existing.version);\n\n\t\treturn await db\n\t\t\t.updateTable(\"workflow_definitions\")\n\t\t\t.set({\n\t\t\t\ttrigger_type: data.triggerType,\n\t\t\t\ttrigger_config: jsonb(data.triggerConfig) as unknown as string,\n\t\t\t\thandler_path: data.handlerPath,\n\t\t\t\tsource_code: data.sourceCode ?? existing.source_code,\n\t\t\t\tretries_config: data.retriesConfig\n\t\t\t\t\t? (jsonb(data.retriesConfig) as unknown as string)\n\t\t\t\t\t: null,\n\t\t\t\ttimeout_ms: data.timeoutMs ?? null,\n\t\t\t\tversion: nextVersion,\n\t\t\t\tstatus: \"active\",\n\t\t\t\tupdated_at: new Date(),\n\t\t\t})\n\t\t\t.where(\"id\", \"=\", existing.id)\n\t\t\t.returningAll()\n\t\t\t.executeTakeFirstOrThrow();\n\t}\n\n\treturn await db\n\t\t.insertInto(\"workflow_definitions\")\n\t\t.values({\n\t\t\tname: data.name,\n\t\t\ttrigger_type: data.triggerType,\n\t\t\ttrigger_config: jsonb(data.triggerConfig) as unknown as string,\n\t\t\thandler_path: data.handlerPath,\n\t\t\tsource_code: data.sourceCode ?? null,\n\t\t\tapi_key_id: data.apiKeyId,\n\t\t\tproject_id: data.projectId ?? null,\n\t\t\tretries_config: data.retriesConfig\n\t\t\t\t? (jsonb(data.retriesConfig) as unknown as string)\n\t\t\t\t: null,\n\t\t\ttimeout_ms: data.timeoutMs ?? null,\n\t\t\tversion: \"1.0.0\",\n\t\t})\n\t\t.returningAll()\n\t\t.executeTakeFirstOrThrow();\n}\n\nexport async function updateWorkflowStatus(\n\tdb: Kysely<Database>,\n\tname: string,\n\tapiKeyId: string,\n\tstatus: string,\n): Promise<void> {\n\tawait db\n\t\t.updateTable(\"workflow_definitions\")\n\t\t.set({ status, updated_at: new Date() })\n\t\t.where(\"name\", \"=\", name)\n\t\t.where(\"api_key_id\", \"=\", apiKeyId)\n\t\t.execute();\n}\n\nexport async function deleteWorkflowDefinition(\n\tdb: Kysely<Database>,\n\tname: string,\n\tapiKeyId: string,\n): Promise<void> {\n\tawait db\n\t\t.updateTable(\"workflow_definitions\")\n\t\t.set({ status: \"deleted\", updated_at: new Date() })\n\t\t.where(\"name\", \"=\", name)\n\t\t.where(\"api_key_id\", \"=\", apiKeyId)\n\t\t.execute();\n}\n\n// ── Runs ─────────────────────────────────────────────────────────────\n\nexport async function createWorkflowRun(\n\tdb: Kysely<Database>,\n\tdata: {\n\t\tdefinitionId: string;\n\t\ttriggerType: string;\n\t\ttriggerData?: Record<string, unknown>;\n\t\tdedupKey?: string;\n\t},\n): Promise<WorkflowRun> {\n\treturn await db\n\t\t.insertInto(\"workflow_runs\")\n\t\t.values({\n\t\t\tdefinition_id: data.definitionId,\n\t\t\ttrigger_type: data.triggerType,\n\t\t\ttrigger_data: data.triggerData\n\t\t\t\t? (jsonb(data.triggerData) as unknown as string)\n\t\t\t\t: null,\n\t\t\tdedup_key: data.dedupKey ?? null,\n\t\t})\n\t\t.returningAll()\n\t\t.executeTakeFirstOrThrow();\n}\n\nexport async function getWorkflowRun(\n\tdb: Kysely<Database>,\n\trunId: string,\n): Promise<WorkflowRun | null> {\n\treturn (\n\t\t(await db\n\t\t\t.selectFrom(\"workflow_runs\")\n\t\t\t.selectAll()\n\t\t\t.where(\"id\", \"=\", runId)\n\t\t\t.executeTakeFirst()) ?? null\n\t);\n}\n\nexport async function listWorkflowRuns(\n\tdb: Kysely<Database>,\n\tdefinitionId: string,\n\tparams?: { status?: string; limit?: number; offset?: number },\n): Promise<WorkflowRun[]> {\n\tlet query = db\n\t\t.selectFrom(\"workflow_runs\")\n\t\t.selectAll()\n\t\t.where(\"definition_id\", \"=\", definitionId)\n\t\t.orderBy(\"created_at\", \"desc\");\n\n\tif (params?.status) {\n\t\tquery = query.where(\"status\", \"=\", params.status);\n\t}\n\n\tquery = query.limit(params?.limit ?? 20);\n\n\tif (params?.offset) {\n\t\tquery = query.offset(params.offset);\n\t}\n\n\treturn await query.execute();\n}\n\n// ── Steps ────────────────────────────────────────────────────────────\n\nexport async function getWorkflowSteps(\n\tdb: Kysely<Database>,\n\trunId: string,\n): Promise<WorkflowStep[]> {\n\treturn await db\n\t\t.selectFrom(\"workflow_steps\")\n\t\t.selectAll()\n\t\t.where(\"run_id\", \"=\", runId)\n\t\t.orderBy(\"step_index\", \"asc\")\n\t\t.execute();\n}\n"
7
8
  ],
8
- "mappings": "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",
9
- "debugId": "EDBC38F3000DD9C664756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "A3CE9B539936424A64756E2164756E21",
10
11
  "names": []
11
12
  }
@@ -31,40 +31,6 @@ interface EventsTable {
31
31
  data: unknown;
32
32
  created_at: Generated<Date>;
33
33
  }
34
- interface StreamsTable {
35
- id: Generated<string>;
36
- name: string;
37
- status: Generated<string>;
38
- filters: unknown;
39
- options: Generated<unknown>;
40
- endpoint_url: string;
41
- signing_secret: string | null;
42
- api_key_id: string;
43
- project_id: string | null;
44
- created_at: Generated<Date>;
45
- updated_at: Generated<Date>;
46
- }
47
- interface StreamMetricsTable {
48
- stream_id: string;
49
- last_triggered_at: Date | null;
50
- last_triggered_block: number | null;
51
- total_deliveries: Generated<number>;
52
- failed_deliveries: Generated<number>;
53
- error_message: string | null;
54
- }
55
- interface JobsTable {
56
- id: Generated<string>;
57
- stream_id: string;
58
- block_height: number;
59
- status: Generated<string>;
60
- attempts: Generated<number>;
61
- locked_at: Date | null;
62
- locked_by: string | null;
63
- error: string | null;
64
- backfill: Generated<boolean>;
65
- created_at: Generated<Date>;
66
- completed_at: Date | null;
67
- }
68
34
  interface IndexProgressTable {
69
35
  network: string;
70
36
  last_indexed_block: Generated<number>;
@@ -72,19 +38,6 @@ interface IndexProgressTable {
72
38
  highest_seen_block: Generated<number>;
73
39
  updated_at: Generated<Date>;
74
40
  }
75
- interface DeliveriesTable {
76
- id: Generated<string>;
77
- stream_id: string;
78
- job_id: string | null;
79
- block_height: number;
80
- status: string;
81
- status_code: number | null;
82
- response_time_ms: number | null;
83
- attempts: Generated<number>;
84
- error: string | null;
85
- payload: unknown;
86
- created_at: Generated<Date>;
87
- }
88
41
  interface SubgraphsTable {
89
42
  id: Generated<string>;
90
43
  name: string;
@@ -105,6 +58,7 @@ interface SubgraphsTable {
105
58
  api_key_id: string | null;
106
59
  account_id: string;
107
60
  handler_code: string | null;
61
+ source_code: string | null;
108
62
  project_id: string | null;
109
63
  is_public: Generated<boolean>;
110
64
  tags: Generated<string[]>;
@@ -303,6 +257,7 @@ interface WorkflowDefinitionsTable {
303
257
  trigger_type: string;
304
258
  trigger_config: unknown;
305
259
  handler_path: string;
260
+ source_code: string | null;
306
261
  retries_config: unknown | null;
307
262
  timeout_ms: number | null;
308
263
  api_key_id: string;
@@ -373,11 +328,7 @@ interface Database {
373
328
  blocks: BlocksTable;
374
329
  transactions: TransactionsTable;
375
330
  events: EventsTable;
376
- streams: StreamsTable;
377
- stream_metrics: StreamMetricsTable;
378
- jobs: JobsTable;
379
331
  index_progress: IndexProgressTable;
380
- deliveries: DeliveriesTable;
381
332
  subgraphs: SubgraphsTable;
382
333
  api_keys: ApiKeysTable;
383
334
  accounts: AccountsTable;
@@ -414,21 +365,9 @@ type UpdateTransaction = Updateable<TransactionsTable>;
414
365
  type Event = Selectable<EventsTable>;
415
366
  type InsertEvent = Insertable<EventsTable>;
416
367
  type UpdateEvent = Updateable<EventsTable>;
417
- type Stream = Selectable<StreamsTable>;
418
- type InsertStream = Insertable<StreamsTable>;
419
- type UpdateStreamRow = Updateable<StreamsTable>;
420
- type StreamMetrics = Selectable<StreamMetricsTable>;
421
- type InsertStreamMetrics = Insertable<StreamMetricsTable>;
422
- type UpdateStreamMetrics = Updateable<StreamMetricsTable>;
423
- type Job = Selectable<JobsTable>;
424
- type InsertJob = Insertable<JobsTable>;
425
- type UpdateJob = Updateable<JobsTable>;
426
368
  type IndexProgress = Selectable<IndexProgressTable>;
427
369
  type InsertIndexProgress = Insertable<IndexProgressTable>;
428
370
  type UpdateIndexProgress = Updateable<IndexProgressTable>;
429
- type Delivery = Selectable<DeliveriesTable>;
430
- type InsertDelivery = Insertable<DeliveriesTable>;
431
- type UpdateDelivery = Updateable<DeliveriesTable>;
432
371
  type Subgraph = Selectable<SubgraphsTable>;
433
372
  type InsertSubgraph = Insertable<SubgraphsTable>;
434
373
  type UpdateSubgraph = Updateable<SubgraphsTable>;
@@ -480,4 +419,4 @@ type InsertChatSession = Insertable<ChatSessionsTable>;
480
419
  type UpdateChatSession = Updateable<ChatSessionsTable>;
481
420
  type ChatMessage = Selectable<ChatMessagesTable>;
482
421
  type InsertChatMessage = Insertable<ChatMessagesTable>;
483
- export { WorkflowStepsTable, WorkflowStep, WorkflowSchedulesTable, WorkflowSchedule, WorkflowRunsTable, WorkflowRun, WorkflowQueueTable, WorkflowQueueItem, WorkflowDefinitionsTable, WorkflowDefinition, WorkflowCursorsTable, WorkflowCursor, WaitlistTable, UsageSnapshotsTable, UsageSnapshot, UsageDailyTable, UsageDaily, UpdateWorkflowStep, UpdateWorkflowSchedule, UpdateWorkflowRun, UpdateWorkflowDefinition, UpdateTransaction, UpdateSubgraph, UpdateStreamRow, UpdateStreamMetrics, UpdateProject, UpdateJob, UpdateIndexProgress, UpdateEvent, UpdateDelivery, UpdateChatSession, UpdateBlock, UpdateApiKey, TransactionsTable, Transaction, TeamMembersTable, TeamMember, TeamInvitationsTable, TeamInvitation, SubgraphsTable, SubgraphUsageDailyTable, SubgraphUsageDaily, SubgraphTableSnapshotsTable, SubgraphProcessingStatsTable, SubgraphHealthSnapshotsTable, SubgraphHealthSnapshot, SubgraphGapsTable, SubgraphGap, Subgraph, StreamsTable, StreamMetricsTable, StreamMetrics, Stream, SessionsTable, Session, ProjectsTable, Project, MagicLinksTable, MagicLink, JobsTable, Job, InsertWorkflowStep, InsertWorkflowSchedule, InsertWorkflowRun, InsertWorkflowQueueItem, InsertWorkflowDefinition, InsertTransaction, InsertTeamMember, InsertTeamInvitation, InsertSubgraphUsageDaily, InsertSubgraphHealthSnapshot, InsertSubgraphGap, InsertSubgraph, InsertStreamMetrics, InsertStream, InsertSession, InsertProject, InsertMagicLink, InsertJob, InsertIndexProgress, InsertEvent, InsertDelivery, InsertChatSession, InsertChatMessage, InsertBlock, InsertApiKey, InsertAccountInsight, InsertAccountAgentRun, InsertAccount, IndexProgressTable, IndexProgress, EventsTable, Event, Delivery, DeliveriesTable, Database, ChatSessionsTable, ChatSession, ChatMessagesTable, ChatMessage, BlocksTable, Block, ApiKeysTable, ApiKey, AccountsTable, AccountInsightsTable, AccountInsight, AccountAgentRunsTable, AccountAgentRun, Account };
422
+ export { WorkflowStepsTable, WorkflowStep, WorkflowSchedulesTable, WorkflowSchedule, WorkflowRunsTable, WorkflowRun, WorkflowQueueTable, WorkflowQueueItem, WorkflowDefinitionsTable, WorkflowDefinition, WorkflowCursorsTable, WorkflowCursor, WaitlistTable, UsageSnapshotsTable, UsageSnapshot, UsageDailyTable, UsageDaily, UpdateWorkflowStep, UpdateWorkflowSchedule, UpdateWorkflowRun, UpdateWorkflowDefinition, UpdateTransaction, UpdateSubgraph, UpdateProject, UpdateIndexProgress, UpdateEvent, UpdateChatSession, UpdateBlock, UpdateApiKey, TransactionsTable, Transaction, TeamMembersTable, TeamMember, TeamInvitationsTable, TeamInvitation, SubgraphsTable, SubgraphUsageDailyTable, SubgraphUsageDaily, SubgraphTableSnapshotsTable, SubgraphProcessingStatsTable, SubgraphHealthSnapshotsTable, SubgraphHealthSnapshot, SubgraphGapsTable, SubgraphGap, Subgraph, SessionsTable, Session, ProjectsTable, Project, MagicLinksTable, MagicLink, InsertWorkflowStep, InsertWorkflowSchedule, InsertWorkflowRun, InsertWorkflowQueueItem, InsertWorkflowDefinition, InsertTransaction, InsertTeamMember, InsertTeamInvitation, InsertSubgraphUsageDaily, InsertSubgraphHealthSnapshot, InsertSubgraphGap, InsertSubgraph, InsertSession, InsertProject, InsertMagicLink, InsertIndexProgress, InsertEvent, InsertChatSession, InsertChatMessage, InsertBlock, InsertApiKey, InsertAccountInsight, InsertAccountAgentRun, InsertAccount, IndexProgressTable, IndexProgress, EventsTable, Event, Database, ChatSessionsTable, ChatSession, ChatMessagesTable, ChatMessage, BlocksTable, Block, ApiKeysTable, ApiKey, AccountsTable, AccountInsightsTable, AccountInsight, AccountAgentRunsTable, AccountAgentRun, Account };
@@ -1,19 +1,16 @@
1
1
  declare const ErrorCodes: {
2
- readonly STREAM_NOT_FOUND: "STREAM_NOT_FOUND"
3
2
  readonly VALIDATION_ERROR: "VALIDATION_ERROR"
4
3
  readonly DATABASE_ERROR: "DATABASE_ERROR"
5
- readonly DELIVERY_ERROR: "DELIVERY_ERROR"
6
- readonly FILTER_EVALUATION_ERROR: "FILTER_EVALUATION_ERROR"
7
4
  readonly AUTHENTICATION_ERROR: "AUTHENTICATION_ERROR"
8
5
  readonly AUTHORIZATION_ERROR: "AUTHORIZATION_ERROR"
9
6
  readonly RATE_LIMIT_ERROR: "RATE_LIMIT_ERROR"
10
7
  readonly FORBIDDEN: "FORBIDDEN"
8
+ readonly VERSION_CONFLICT: "VERSION_CONFLICT"
9
+ readonly NOT_FOUND: "NOT_FOUND"
11
10
  };
12
11
  type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];
13
- /**
14
- * Base error class for all Stacks Streams errors
15
- */
16
- declare class StreamsError extends Error {
12
+ /** Base error class for all Secondlayer errors. */
13
+ declare class SecondLayerError extends Error {
17
14
  code: ErrorCode;
18
15
  cause?: unknown;
19
16
  constructor(code: ErrorCode, message: string, cause?: unknown);
@@ -25,63 +22,35 @@ declare class StreamsError extends Error {
25
22
  cause: unknown
26
23
  };
27
24
  }
28
- /**
29
- * Stream not found error
30
- */
31
- declare class StreamNotFoundError extends StreamsError {
32
- constructor(streamId: string);
33
- }
34
- /**
35
- * Validation error for invalid input
36
- */
37
- declare class ValidationError extends StreamsError {
38
- constructor(message: string, cause?: unknown);
25
+ declare class NotFoundError extends SecondLayerError {
26
+ constructor(message: string);
39
27
  }
40
- /**
41
- * Database operation error
42
- */
43
- declare class DatabaseError extends StreamsError {
28
+ declare class ValidationError extends SecondLayerError {
44
29
  constructor(message: string, cause?: unknown);
45
30
  }
46
- /**
47
- * Delivery error
48
- */
49
- declare class DeliveryError extends StreamsError {
50
- statusCode?: number;
51
- constructor(message: string, statusCode?: number, cause?: unknown);
52
- toJSON(): {
53
- name: string
54
- code: string
55
- message: string
56
- stack: string | undefined
57
- cause: unknown
58
- statusCode: number | undefined
59
- };
60
- }
61
- /**
62
- * Filter evaluation error
63
- */
64
- declare class FilterEvaluationError extends StreamsError {
31
+ declare class DatabaseError extends SecondLayerError {
65
32
  constructor(message: string, cause?: unknown);
66
33
  }
67
- declare class AuthenticationError extends StreamsError {
34
+ declare class AuthenticationError extends SecondLayerError {
68
35
  constructor(message: string);
69
36
  }
70
- declare class AuthorizationError extends StreamsError {
37
+ declare class AuthorizationError extends SecondLayerError {
71
38
  constructor(message: string);
72
39
  }
73
- declare class RateLimitError extends StreamsError {
40
+ declare class RateLimitError extends SecondLayerError {
74
41
  constructor(message: string);
75
42
  }
76
- declare class ForbiddenError extends StreamsError {
43
+ declare class ForbiddenError extends SecondLayerError {
77
44
  constructor(message?: string);
78
45
  }
46
+ declare class VersionConflictError extends SecondLayerError {
47
+ currentVersion: string;
48
+ expectedVersion: string;
49
+ constructor(currentVersion: string, expectedVersion: string);
50
+ }
79
51
  /** Error code → HTTP status. Used by API middleware for code-based matching
80
52
  * (avoids cross-bundle instanceof failures from bunup class duplication). */
81
- type MappedCode = Extract<ErrorCode, "AUTHENTICATION_ERROR" | "AUTHORIZATION_ERROR" | "RATE_LIMIT_ERROR" | "FORBIDDEN" | "STREAM_NOT_FOUND" | "VALIDATION_ERROR">;
53
+ type MappedCode = Extract<ErrorCode, "AUTHENTICATION_ERROR" | "AUTHORIZATION_ERROR" | "RATE_LIMIT_ERROR" | "FORBIDDEN" | "NOT_FOUND" | "VALIDATION_ERROR">;
82
54
  declare const CODE_TO_STATUS: Record<MappedCode, 400 | 401 | 403 | 404 | 429>;
83
- /**
84
- * Safely extract error message from unknown error value
85
- */
86
55
  declare function getErrorMessage(err: unknown): string;
87
- export { getErrorMessage, ValidationError, StreamsError, StreamNotFoundError, RateLimitError, ForbiddenError, FilterEvaluationError, ErrorCodes, ErrorCode, DeliveryError, DatabaseError, CODE_TO_STATUS, AuthorizationError, AuthenticationError };
56
+ export { getErrorMessage, VersionConflictError, ValidationError, SecondLayerError, RateLimitError, NotFoundError, ForbiddenError, ErrorCodes, ErrorCode, DatabaseError, CODE_TO_STATUS, AuthorizationError, AuthenticationError };