@secondlayer/sdk 2.0.0 → 3.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -41,39 +41,6 @@ const rows = await sl.subgraphs.queryTable("my-subgraph", "transfers", {
41
41
  const result = await sl.subgraphs.deploy({ name, sources, schema, handlerCode });
42
42
  ```
43
43
 
44
- ## Workflows
45
-
46
- Deploy and manage automated workflows.
47
-
48
- ```typescript
49
- // List
50
- const { workflows } = await sl.workflows.list();
51
-
52
- // Get
53
- const detail = await sl.workflows.get("whale-alerts");
54
-
55
- // Deploy
56
- const result = await sl.workflows.deploy({
57
- name: "whale-alerts",
58
- trigger: { type: "event", filter: { type: "stx_transfer" } },
59
- handlerCode: "...",
60
- });
61
-
62
- // Trigger manually
63
- const { runId } = await sl.workflows.trigger("whale-alerts", { threshold: 100000 });
64
-
65
- // Pause / Resume / Delete
66
- await sl.workflows.pause("whale-alerts");
67
- await sl.workflows.resume("whale-alerts");
68
- await sl.workflows.delete("whale-alerts");
69
-
70
- // List runs
71
- const { runs } = await sl.workflows.listRuns("whale-alerts", { status: "completed", limit: 10 });
72
-
73
- // Get run details
74
- const run = await sl.workflows.getRun("run-id");
75
- ```
76
-
77
44
  ## Error Handling
78
45
 
79
46
  ```typescript
package/dist/index.d.ts CHANGED
@@ -92,183 +92,83 @@ declare class Subgraphs extends BaseClient {
92
92
  private createTableClient;
93
93
  }
94
94
  import { InferSubgraphClient as InferSubgraphClient2 } from "@secondlayer/subgraphs";
95
- import { WorkflowRun, WorkflowRunStatus } from "@secondlayer/workflows";
96
- interface WorkflowSource {
97
- name: string;
98
- version: string;
99
- sourceCode: string | null;
100
- readOnly: boolean;
101
- reason?: string;
102
- updatedAt: string;
103
- }
104
- interface WorkflowStepEvent {
95
+ type SubscriptionStatus = "active" | "paused" | "error";
96
+ type SubscriptionFormat = "standard-webhooks" | "inngest" | "trigger" | "cloudflare" | "cloudevents" | "raw";
97
+ type SubscriptionRuntime = "inngest" | "trigger" | "cloudflare" | "node";
98
+ interface SubscriptionSummary {
105
99
  id: string;
106
- stepIndex: number;
107
- stepId: string;
108
- stepType: string;
109
- status: string;
110
- output?: unknown;
111
- error: string | null;
112
- retryCount: number;
113
- aiTokensUsed: number;
114
- startedAt: string | null;
115
- completedAt: string | null;
116
- durationMs: number | null;
117
- ts: string;
118
- }
119
- interface WorkflowRunDoneEvent {
120
- runId: string;
121
- status: string;
122
- error?: string | null;
123
- completedAt?: string | null;
124
- }
125
- type WorkflowTailEvent = {
126
- type: "step"
127
- step: WorkflowStepEvent
128
- } | {
129
- type: "done"
130
- done: WorkflowRunDoneEvent
131
- } | {
132
- type: "heartbeat"
133
- ts: string
134
- } | {
135
- type: "timeout"
136
- message: string
137
- };
138
- interface DeployDryRunResponse {
139
- valid: boolean;
140
- validation?: {
141
- name: string
142
- triggerType: string
143
- };
144
- bundleSize: number;
145
- error?: string;
146
- }
147
- interface DeployResponse {
148
- action: "created" | "updated";
149
- workflowId: string;
150
- version: string;
151
- message: string;
152
- }
153
- interface BundleWorkflowResponse {
154
- ok: true;
155
- name: string;
156
- trigger: Record<string, unknown>;
157
- handlerCode: string;
158
- sourceCode: string;
159
- retries: Record<string, unknown> | null;
160
- timeout: number | null;
161
- bundleSize: number;
162
- }
163
- interface WorkflowSummary {
164
100
  name: string;
165
- status: "active" | "paused";
166
- triggerType: "event" | "schedule" | "manual";
101
+ status: SubscriptionStatus;
102
+ subgraphName: string;
103
+ tableName: string;
104
+ format: SubscriptionFormat;
105
+ runtime: SubscriptionRuntime | null;
106
+ url: string;
107
+ lastDeliveryAt: string | null;
108
+ lastSuccessAt: string | null;
167
109
  createdAt: string;
168
110
  updatedAt: string;
169
111
  }
170
- interface WorkflowDetail extends WorkflowSummary {
171
- trigger: Record<string, unknown>;
172
- retries?: {
173
- maxAttempts?: number
174
- backoffMs?: number
175
- };
176
- timeout?: number;
177
- totalRuns: number;
178
- lastRunAt: string | null;
179
- }
180
- interface WorkflowRunSummary {
181
- id: string;
182
- workflowName: string;
183
- status: WorkflowRunStatus;
184
- duration: number;
185
- aiTokensUsed: number;
186
- triggeredAt: string;
187
- completedAt: string | null;
188
- }
189
- declare class Workflows extends BaseClient {
190
- deploy(data: {
191
- name: string
192
- trigger: Record<string, unknown>
193
- handlerCode: string
194
- sourceCode?: string
195
- expectedVersion?: string
196
- retries?: Record<string, unknown>
197
- timeout?: number
198
- clientRequestId?: string
199
- } & {
200
- dryRun?: false
201
- }): Promise<DeployResponse>;
202
- deploy(data: {
203
- name: string
204
- trigger: Record<string, unknown>
205
- handlerCode: string
206
- sourceCode?: string
207
- expectedVersion?: string
208
- retries?: Record<string, unknown>
209
- timeout?: number
210
- dryRun: true
211
- }): Promise<DeployDryRunResponse>;
212
- getSource(name: string): Promise<WorkflowSource>;
213
- /**
214
- * Bundle a TypeScript workflow source on the server. Used by the web chat
215
- * authoring loop so Vercel's serverless runtime doesn't have to run esbuild.
216
- * CLI and MCP still bundle locally — this method is for clients that can't
217
- * install `@secondlayer/bundler` directly (e.g. browser tooling, edge
218
- * functions).
219
- */
220
- bundle(data: {
221
- code: string
222
- }): Promise<BundleWorkflowResponse>;
223
- pauseAll(): Promise<{
224
- paused: number
225
- workflows: Array<{
226
- name: string
227
- version: string
228
- status: string
229
- }>
230
- }>;
231
- cancelRun(runId: string): Promise<{
232
- runId: string
233
- status: string
234
- cancelled: boolean
235
- completedAt?: string
236
- message?: string
237
- }>;
238
- rollback(name: string, toVersion?: string): Promise<{
239
- action: "rolled-back"
240
- name: string
241
- fromVersion: string
242
- restoredFromVersion: string
243
- version: string
244
- }>;
245
- /**
246
- * Subscribe to a workflow run's server-sent event stream. Resolves when the
247
- * run completes, times out, or the signal is aborted. Throws on HTTP errors
248
- * opening the stream.
249
- */
250
- streamRun(name: string, runId: string, onEvent: (event: WorkflowTailEvent) => void, signal?: AbortSignal): Promise<void>;
112
+ interface SubscriptionDetail extends SubscriptionSummary {
113
+ filter: Record<string, unknown>;
114
+ authConfig: Record<string, unknown>;
115
+ maxRetries: number;
116
+ timeoutMs: number;
117
+ concurrency: number;
118
+ circuitFailures: number;
119
+ circuitOpenedAt: string | null;
120
+ lastError: string | null;
121
+ }
122
+ interface CreateSubscriptionRequest {
123
+ name: string;
124
+ subgraphName: string;
125
+ tableName: string;
126
+ url: string;
127
+ filter?: Record<string, unknown>;
128
+ format?: SubscriptionFormat;
129
+ runtime?: SubscriptionRuntime;
130
+ authConfig?: Record<string, unknown>;
131
+ maxRetries?: number;
132
+ timeoutMs?: number;
133
+ concurrency?: number;
134
+ }
135
+ interface CreateSubscriptionResponse {
136
+ subscription: SubscriptionDetail;
137
+ /** Plaintext signing secret — surfaced ONCE. Store it server-side. */
138
+ signingSecret: string;
139
+ }
140
+ interface UpdateSubscriptionRequest {
141
+ name?: string;
142
+ url?: string;
143
+ filter?: Record<string, unknown>;
144
+ format?: SubscriptionFormat;
145
+ runtime?: SubscriptionRuntime | null;
146
+ authConfig?: Record<string, unknown>;
147
+ maxRetries?: number;
148
+ timeoutMs?: number;
149
+ concurrency?: number;
150
+ }
151
+ interface RotateSecretResponse {
152
+ subscription: SubscriptionDetail;
153
+ signingSecret: string;
154
+ }
155
+ declare class Subscriptions extends BaseClient {
251
156
  list(): Promise<{
252
- workflows: WorkflowSummary[]
157
+ data: SubscriptionSummary[]
253
158
  }>;
254
- get(name: string): Promise<WorkflowDetail>;
255
- trigger(name: string, input?: Record<string, unknown>): Promise<{
256
- runId: string
257
- }>;
258
- pause(name: string): Promise<void>;
259
- resume(name: string): Promise<void>;
260
- delete(name: string): Promise<void>;
261
- listRuns(name: string, params?: {
262
- status?: WorkflowRunStatus
263
- limit?: number
264
- }): Promise<{
265
- runs: WorkflowRunSummary[]
159
+ get(id: string): Promise<SubscriptionDetail>;
160
+ create(input: CreateSubscriptionRequest): Promise<CreateSubscriptionResponse>;
161
+ update(id: string, patch: UpdateSubscriptionRequest): Promise<SubscriptionDetail>;
162
+ pause(id: string): Promise<SubscriptionDetail>;
163
+ resume(id: string): Promise<SubscriptionDetail>;
164
+ delete(id: string): Promise<{
165
+ ok: true
266
166
  }>;
267
- getRun(runId: string): Promise<WorkflowRun>;
167
+ rotateSecret(id: string): Promise<RotateSecretResponse>;
268
168
  }
269
169
  declare class SecondLayer extends BaseClient {
270
170
  readonly subgraphs: Subgraphs;
271
- readonly workflows: Workflows;
171
+ readonly subscriptions: Subscriptions;
272
172
  constructor(options?: Partial<SecondLayerOptions>);
273
173
  }
274
174
  /**
@@ -348,4 +248,4 @@ declare class VersionConflictError extends ApiError {
348
248
  * ```
349
249
  */
350
250
  declare function verifyWebhookSignature(rawBody: string, signatureHeader: string, secret: string, toleranceSeconds?: number): boolean;
351
- export { verifyWebhookSignature, getSubgraph, VersionConflictError, Subgraphs, SecondLayerOptions, SecondLayer, ApiError };
251
+ export { verifyWebhookSignature, getSubgraph, VersionConflictError, UpdateSubscriptionRequest, Subscriptions, SubscriptionSummary, SubscriptionStatus, SubscriptionRuntime, SubscriptionFormat, SubscriptionDetail, Subgraphs, SecondLayerOptions, SecondLayer, RotateSecretResponse, CreateSubscriptionResponse, CreateSubscriptionRequest, ApiError };
package/dist/index.js CHANGED
@@ -248,158 +248,42 @@ class Subgraphs extends BaseClient {
248
248
  };
249
249
  }
250
250
  }
251
- // src/workflows/client.ts
252
- function parseSseChunk(raw) {
253
- let event = "message";
254
- const dataLines = [];
255
- for (const line of raw.split(`
256
- `)) {
257
- if (line.startsWith("event:")) {
258
- event = line.slice(6).trim();
259
- } else if (line.startsWith("data:")) {
260
- dataLines.push(line.slice(5).trimStart());
261
- }
262
- }
263
- if (dataLines.length === 0)
264
- return null;
265
- const data = dataLines.join(`
266
- `);
267
- try {
268
- const parsed = JSON.parse(data);
269
- switch (event) {
270
- case "step":
271
- return { type: "step", step: parsed };
272
- case "done":
273
- return { type: "done", done: parsed };
274
- case "heartbeat":
275
- return {
276
- type: "heartbeat",
277
- ts: typeof parsed === "string" ? parsed : String(parsed)
278
- };
279
- case "timeout":
280
- return {
281
- type: "timeout",
282
- message: parsed.message ?? "timeout"
283
- };
284
- default:
285
- return null;
286
- }
287
- } catch {
288
- return null;
289
- }
290
- }
291
-
292
- class Workflows extends BaseClient {
293
- async deploy(data) {
294
- try {
295
- return await this.request("POST", "/api/workflows", data);
296
- } catch (err) {
297
- if (err instanceof ApiError && err.status === 409) {
298
- const body = err.body;
299
- if (body?.currentVersion && body.expectedVersion) {
300
- throw new VersionConflictError(body.currentVersion, body.expectedVersion, err.message);
301
- }
302
- }
303
- throw err;
304
- }
305
- }
306
- async getSource(name) {
307
- return this.request("GET", `/api/workflows/${name}/source`);
308
- }
309
- async bundle(data) {
310
- return this.request("POST", "/api/workflows/bundle", data);
311
- }
312
- async pauseAll() {
313
- return this.request("POST", "/api/workflows/pause-all");
314
- }
315
- async cancelRun(runId) {
316
- return this.request("POST", `/api/workflows/runs/${runId}/cancel`);
317
- }
318
- async rollback(name, toVersion) {
319
- return this.request("POST", `/api/workflows/${name}/rollback`, toVersion ? { toVersion } : {});
320
- }
321
- async streamRun(name, runId, onEvent, signal) {
322
- const url = `${this.baseUrl}/api/workflows/${name}/runs/${runId}/stream`;
323
- const headers = {
324
- Accept: "text/event-stream",
325
- "x-sl-origin": this.origin
326
- };
327
- if (this.apiKey) {
328
- headers.Authorization = `Bearer ${this.apiKey}`;
329
- }
330
- const res = await fetch(url, { headers, signal });
331
- if (!res.ok || !res.body) {
332
- throw new ApiError(res.status, `Failed to open workflow run stream (HTTP ${res.status})`);
333
- }
334
- const reader = res.body.pipeThrough(new TextDecoderStream).getReader();
335
- let buffer = "";
336
- while (true) {
337
- const { value, done } = await reader.read();
338
- if (done)
339
- break;
340
- buffer += value;
341
- let sep = buffer.indexOf(`
342
-
343
- `);
344
- while (sep !== -1) {
345
- const chunk = buffer.slice(0, sep);
346
- buffer = buffer.slice(sep + 2);
347
- const parsed = parseSseChunk(chunk);
348
- if (parsed) {
349
- onEvent(parsed);
350
- if (parsed.type === "done" || parsed.type === "timeout") {
351
- await reader.cancel().catch(() => {
352
- return;
353
- });
354
- return;
355
- }
356
- }
357
- sep = buffer.indexOf(`
358
-
359
- `);
360
- }
361
- }
362
- }
251
+ // src/subscriptions/client.ts
252
+ class Subscriptions extends BaseClient {
363
253
  async list() {
364
- return this.request("GET", "/api/workflows");
254
+ return this.request("GET", "/api/subscriptions");
365
255
  }
366
- async get(name) {
367
- return this.request("GET", `/api/workflows/${name}`);
256
+ async get(id) {
257
+ return this.request("GET", `/api/subscriptions/${id}`);
368
258
  }
369
- async trigger(name, input) {
370
- return this.request("POST", `/api/workflows/${name}/trigger`, input ? { input } : undefined);
259
+ async create(input) {
260
+ return this.request("POST", "/api/subscriptions", input);
371
261
  }
372
- async pause(name) {
373
- return this.request("POST", `/api/workflows/${name}/pause`);
262
+ async update(id, patch) {
263
+ return this.request("PATCH", `/api/subscriptions/${id}`, patch);
374
264
  }
375
- async resume(name) {
376
- return this.request("POST", `/api/workflows/${name}/resume`);
265
+ async pause(id) {
266
+ return this.request("POST", `/api/subscriptions/${id}/pause`);
377
267
  }
378
- async delete(name) {
379
- return this.request("DELETE", `/api/workflows/${name}`);
268
+ async resume(id) {
269
+ return this.request("POST", `/api/subscriptions/${id}/resume`);
380
270
  }
381
- async listRuns(name, params) {
382
- const qs = new URLSearchParams;
383
- if (params?.status)
384
- qs.set("status", params.status);
385
- if (params?.limit !== undefined)
386
- qs.set("limit", String(params.limit));
387
- const query = qs.toString();
388
- return this.request("GET", `/api/workflows/${name}/runs${query ? `?${query}` : ""}`);
271
+ async delete(id) {
272
+ return this.request("DELETE", `/api/subscriptions/${id}`);
389
273
  }
390
- async getRun(runId) {
391
- return this.request("GET", `/api/workflows/runs/${runId}`);
274
+ async rotateSecret(id) {
275
+ return this.request("POST", `/api/subscriptions/${id}/rotate-secret`);
392
276
  }
393
277
  }
394
278
 
395
279
  // src/client.ts
396
280
  class SecondLayer extends BaseClient {
397
281
  subgraphs;
398
- workflows;
282
+ subscriptions;
399
283
  constructor(options = {}) {
400
284
  super(options);
401
285
  this.subgraphs = new Subgraphs(options);
402
- this.workflows = new Workflows(options);
286
+ this.subscriptions = new Subscriptions(options);
403
287
  }
404
288
  }
405
289
 
@@ -422,10 +306,11 @@ export {
422
306
  verifyWebhookSignature,
423
307
  getSubgraph,
424
308
  VersionConflictError,
309
+ Subscriptions,
425
310
  Subgraphs,
426
311
  SecondLayer,
427
312
  ApiError
428
313
  };
429
314
 
430
- //# debugId=56F4E9CF4BB3487864756E2164756E21
315
+ //# debugId=8D5F53ED0AC865AD64756E2164756E21
431
316
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/errors.ts", "../src/base.ts", "../src/subgraphs/serialize.ts", "../src/subgraphs/client.ts", "../src/workflows/client.ts", "../src/client.ts", "../src/subgraphs/get-subgraph.ts", "../src/webhooks.ts"],
3
+ "sources": ["../src/errors.ts", "../src/base.ts", "../src/subgraphs/serialize.ts", "../src/subgraphs/client.ts", "../src/subscriptions/client.ts", "../src/client.ts", "../src/subgraphs/get-subgraph.ts", "../src/webhooks.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * Error thrown by {@link SecondLayer} when an API request fails.\n * Includes the HTTP status code for programmatic error handling.\n *\n * @example\n * ```ts\n * try {\n * await client.subgraphs.get(\"my-subgraph\");\n * } catch (err) {\n * if (err instanceof ApiError && err.status === 404) {\n * console.log(\"Subgraph not found\");\n * }\n * }\n * ```\n */\nexport class ApiError extends Error {\n\tconstructor(\n\t\t/** HTTP status code (0 for network errors). */\n\t\tpublic status: number,\n\t\tmessage: string,\n\t\t/** Raw response body (parsed JSON if possible) — preserved for callers that need error details. */\n\t\tpublic body?: unknown,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"ApiError\";\n\t}\n}\n\n/**\n * Thrown by {@link Workflows.deploy} when the server rejects a deploy because the\n * provided `expectedVersion` does not match the current stored version.\n */\nexport class VersionConflictError extends ApiError {\n\tconstructor(\n\t\tpublic currentVersion: string,\n\t\tpublic expectedVersion: string,\n\t\tmessage = `Version conflict: expected ${expectedVersion}, current ${currentVersion}`,\n\t) {\n\t\tsuper(409, message, { currentVersion, expectedVersion });\n\t\tthis.name = \"VersionConflictError\";\n\t}\n}\n",
6
6
  "import { ApiError } from \"./errors.ts\";\n\nexport interface SecondLayerOptions {\n\t/** Base URL of the Secondlayer API (trailing slashes are stripped). */\n\tbaseUrl: string;\n\t/** Bearer token for authenticated requests. */\n\tapiKey?: string;\n\t/** Deploy origin label sent as `x-sl-origin` (telemetry). Defaults to `cli`. */\n\torigin?: \"cli\" | \"mcp\" | \"session\";\n}\n\nconst DEFAULT_BASE_URL = \"https://api.secondlayer.tools\";\n\nexport abstract class BaseClient {\n\tprotected baseUrl: string;\n\tprotected apiKey?: string;\n\tprotected origin: \"cli\" | \"mcp\" | \"session\";\n\n\tconstructor(options: Partial<SecondLayerOptions> = {}) {\n\t\tthis.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n\t\tthis.apiKey = options.apiKey;\n\t\tthis.origin = options.origin ?? \"cli\";\n\t}\n\n\tstatic authHeaders(apiKey?: string): Record<string, string> {\n\t\tconst headers: Record<string, string> = {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t};\n\t\tif (apiKey) {\n\t\t\theaders.Authorization = `Bearer ${apiKey}`;\n\t\t}\n\t\treturn headers;\n\t}\n\n\tprotected async request<T>(\n\t\tmethod: string,\n\t\tpath: string,\n\t\tbody?: unknown,\n\t): Promise<T> {\n\t\tconst url = `${this.baseUrl}${path}`;\n\t\tconst headers = BaseClient.authHeaders(this.apiKey);\n\t\theaders[\"x-sl-origin\"] = this.origin;\n\n\t\tlet response: Response;\n\t\ttry {\n\t\t\tresponse = await fetch(url, {\n\t\t\t\tmethod,\n\t\t\t\theaders,\n\t\t\t\tbody: body ? JSON.stringify(body) : undefined,\n\t\t\t});\n\t\t} catch {\n\t\t\tthrow new ApiError(\n\t\t\t\t0,\n\t\t\t\t`Cannot reach API at ${this.baseUrl}. Check your connection or try again.`,\n\t\t\t);\n\t\t}\n\n\t\tif (!response.ok) {\n\t\t\tif (response.status === 401) {\n\t\t\t\tthrow new ApiError(401, \"API key invalid or expired.\");\n\t\t\t}\n\n\t\t\tif (response.status === 429) {\n\t\t\t\tconst retryAfter = response.headers.get(\"Retry-After\");\n\t\t\t\tconst msg = retryAfter\n\t\t\t\t\t? `Rate limited. Wait ${retryAfter} seconds.`\n\t\t\t\t\t: \"Rate limited. Try again later.\";\n\t\t\t\tthrow new ApiError(429, msg);\n\t\t\t}\n\n\t\t\tif (response.status >= 500) {\n\t\t\t\tthrow new ApiError(\n\t\t\t\t\tresponse.status,\n\t\t\t\t\t`Server error. Try again or check status at ${this.baseUrl}/health`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst errorBody = await response.text();\n\t\t\tlet message = `HTTP ${response.status}`;\n\t\t\tlet parsedBody: unknown = errorBody;\n\t\t\ttry {\n\t\t\t\tconst json = JSON.parse(errorBody);\n\t\t\t\tparsedBody = json;\n\t\t\t\tconst err = json.error ?? json.message;\n\t\t\t\tif (typeof err === \"string\") {\n\t\t\t\t\tmessage = err;\n\t\t\t\t} else if (err && typeof err === \"object\") {\n\t\t\t\t\tmessage = JSON.stringify(err);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tif (errorBody) message = errorBody;\n\t\t\t}\n\t\t\tthrow new ApiError(response.status, message, parsedBody);\n\t\t}\n\n\t\tif (response.status === 204) {\n\t\t\treturn undefined as T;\n\t\t}\n\n\t\treturn response.json() as Promise<T>;\n\t}\n}\n",
7
7
  "/**\n * Maps camelCase system column names (with or without `_` prefix) to the\n * actual snake_case DB column names used in query params.\n */\nconst SYSTEM_COLUMN_MAP: Record<string, string> = {\n\t// underscore-prefixed camelCase (canonical row shape)\n\t_blockHeight: \"_block_height\",\n\t_txId: \"_tx_id\",\n\t_createdAt: \"_created_at\",\n\t_id: \"_id\",\n\t// no-prefix aliases\n\tblockHeight: \"_block_height\",\n\ttxId: \"_tx_id\",\n\tcreatedAt: \"_created_at\",\n\tid: \"_id\",\n};\n\nfunction resolveColumn(col: string): string {\n\treturn SYSTEM_COLUMN_MAP[col] ?? col;\n}\n\n/**\n * Serializes a WhereInput object into the flat filter map expected by\n * SubgraphQueryParams.filters (and the REST API query string).\n *\n * Scalar values → `{ column: \"value\" }`\n * Comparison objects → `{ \"column.gte\": \"100\", \"column.lt\": \"200\" }`\n * System column aliases → `blockHeight` / `_blockHeight` both → `_block_height`\n */\nexport function serializeWhere(\n\twhere: Record<string, unknown>,\n): Record<string, string> {\n\tconst filters: Record<string, string> = {};\n\n\tfor (const [column, value] of Object.entries(where)) {\n\t\tif (value === null || value === undefined) continue;\n\n\t\tconst col = resolveColumn(column);\n\n\t\tif (typeof value === \"object\" && !Array.isArray(value)) {\n\t\t\tconst ops = value as Record<string, unknown>;\n\t\t\tfor (const [op, opValue] of Object.entries(ops)) {\n\t\t\t\tif (opValue === null || opValue === undefined) continue;\n\t\t\t\tif (op === \"eq\") {\n\t\t\t\t\tfilters[col] = String(opValue);\n\t\t\t\t} else if ([\"neq\", \"gt\", \"gte\", \"lt\", \"lte\"].includes(op)) {\n\t\t\t\t\tfilters[`${col}.${op}`] = String(opValue);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfilters[col] = String(value);\n\t\t}\n\t}\n\n\treturn filters;\n}\n\n/**\n * Resolves an orderBy column name (either alias or canonical) to the DB column name.\n */\nexport function resolveOrderByColumn(col: string): string {\n\treturn resolveColumn(col);\n}\n",
8
8
  "import type {\n\tReindexResponse,\n\tSubgraphDetail,\n\tSubgraphGapsResponse,\n\tSubgraphQueryParams,\n\tSubgraphSummary,\n} from \"@secondlayer/shared/schemas\";\nimport type {\n\tDeploySubgraphRequest,\n\tDeploySubgraphResponse,\n} from \"@secondlayer/shared/schemas/subgraphs\";\nimport type {\n\tFindManyOptions,\n\tInferSubgraphClient,\n\tWhereInput,\n} from \"@secondlayer/subgraphs\";\nimport { BaseClient } from \"../base.ts\";\nimport { resolveOrderByColumn, serializeWhere } from \"./serialize.ts\";\n\nexport interface SubgraphSource {\n\tname: string;\n\tversion: string;\n\tsourceCode: string | null;\n\treadOnly: boolean;\n\treason?: string;\n\tupdatedAt: string;\n}\n\nexport interface BundleSubgraphResponse {\n\tok: true;\n\tname: string;\n\tversion: string | null;\n\tdescription: string | null;\n\tsources: Record<string, Record<string, unknown>>;\n\tschema: Record<string, unknown>;\n\thandlerCode: string;\n\tsourceCode: string;\n\tbundleSize: number;\n}\n\nfunction buildSubgraphQueryString(params: SubgraphQueryParams): string {\n\tconst qs = new URLSearchParams();\n\tif (params.sort) qs.set(\"_sort\", params.sort);\n\tif (params.order) qs.set(\"_order\", params.order);\n\tif (params.limit !== undefined) qs.set(\"_limit\", String(params.limit));\n\tif (params.offset !== undefined) qs.set(\"_offset\", String(params.offset));\n\tif (params.fields) qs.set(\"_fields\", params.fields);\n\tif (params.filters) {\n\t\tfor (const [key, value] of Object.entries(params.filters)) {\n\t\t\tqs.set(key, String(value));\n\t\t}\n\t}\n\tconst str = qs.toString();\n\treturn str ? `?${str}` : \"\";\n}\n\nexport class Subgraphs extends BaseClient {\n\tasync list(): Promise<{ data: SubgraphSummary[] }> {\n\t\treturn this.request<{ data: SubgraphSummary[] }>(\"GET\", \"/api/subgraphs\");\n\t}\n\n\tasync get(name: string): Promise<SubgraphDetail> {\n\t\treturn this.request<SubgraphDetail>(\"GET\", `/api/subgraphs/${name}`);\n\t}\n\n\tasync reindex(\n\t\tname: string,\n\t\toptions?: { fromBlock?: number; toBlock?: number },\n\t): Promise<ReindexResponse> {\n\t\treturn this.request<ReindexResponse>(\n\t\t\t\"POST\",\n\t\t\t`/api/subgraphs/${name}/reindex`,\n\t\t\toptions,\n\t\t);\n\t}\n\n\tasync stop(name: string): Promise<{ message: string }> {\n\t\treturn this.request<{ message: string }>(\n\t\t\t\"POST\",\n\t\t\t`/api/subgraphs/${name}/stop`,\n\t\t);\n\t}\n\n\tasync backfill(\n\t\tname: string,\n\t\toptions: { fromBlock: number; toBlock: number },\n\t): Promise<ReindexResponse> {\n\t\treturn this.request<ReindexResponse>(\n\t\t\t\"POST\",\n\t\t\t`/api/subgraphs/${name}/backfill`,\n\t\t\toptions,\n\t\t);\n\t}\n\n\tasync gaps(\n\t\tname: string,\n\t\topts?: { limit?: number; offset?: number; resolved?: boolean },\n\t): Promise<SubgraphGapsResponse> {\n\t\tconst qs = new URLSearchParams();\n\t\tif (opts?.limit !== undefined) qs.set(\"_limit\", String(opts.limit));\n\t\tif (opts?.offset !== undefined) qs.set(\"_offset\", String(opts.offset));\n\t\tif (opts?.resolved !== undefined) qs.set(\"resolved\", String(opts.resolved));\n\t\tconst query = qs.toString();\n\t\treturn this.request<SubgraphGapsResponse>(\n\t\t\t\"GET\",\n\t\t\t`/api/subgraphs/${name}/gaps${query ? `?${query}` : \"\"}`,\n\t\t);\n\t}\n\n\tasync delete(name: string): Promise<{ message: string }> {\n\t\treturn this.request<{ message: string }>(\n\t\t\t\"DELETE\",\n\t\t\t`/api/subgraphs/${name}`,\n\t\t);\n\t}\n\n\tasync deploy(data: DeploySubgraphRequest): Promise<DeploySubgraphResponse> {\n\t\treturn this.request<DeploySubgraphResponse>(\"POST\", \"/api/subgraphs\", data);\n\t}\n\n\tasync getSource(name: string): Promise<SubgraphSource> {\n\t\treturn this.request<SubgraphSource>(\"GET\", `/api/subgraphs/${name}/source`);\n\t}\n\n\t/**\n\t * Bundle a TypeScript subgraph source on the server. Used by the web chat\n\t * authoring loop so Vercel's serverless runtime doesn't have to run esbuild.\n\t */\n\tasync bundle(data: { code: string }): Promise<BundleSubgraphResponse> {\n\t\treturn this.request<BundleSubgraphResponse>(\n\t\t\t\"POST\",\n\t\t\t\"/api/subgraphs/bundle\",\n\t\t\tdata,\n\t\t);\n\t}\n\n\tasync queryTable(\n\t\tname: string,\n\t\ttable: string,\n\t\tparams: SubgraphQueryParams = {},\n\t): Promise<unknown[]> {\n\t\tconst result = await this.request<{ data: unknown[] } | unknown[]>(\n\t\t\t\"GET\",\n\t\t\t`/api/subgraphs/${name}/${table}${buildSubgraphQueryString(params)}`,\n\t\t);\n\t\treturn Array.isArray(result) ? result : result.data;\n\t}\n\n\tasync queryTableCount(\n\t\tname: string,\n\t\ttable: string,\n\t\tparams: SubgraphQueryParams = {},\n\t): Promise<{ count: number }> {\n\t\treturn this.request<{ count: number }>(\n\t\t\t\"GET\",\n\t\t\t`/api/subgraphs/${name}/${table}/count${buildSubgraphQueryString(params)}`,\n\t\t);\n\t}\n\n\t/**\n\t * Returns a typed client for a subgraph defined with `defineSubgraph()`.\n\t * Row types are inferred from the subgraph's schema literal types.\n\t *\n\t * @example\n\t * ```ts\n\t * import mySubgraph from './subgraphs/my-token-subgraph'\n\t * const client = sl.subgraphs.typed(mySubgraph)\n\t * const rows = await client.transfers.findMany({ where: { sender: 'SP...' } })\n\t * // rows: InferTableRow<typeof mySubgraph.schema.transfers>[]\n\t * ```\n\t */\n\ttyped<T extends { name: string; schema: Record<string, unknown> }>(\n\t\tdef: T,\n\t): InferSubgraphClient<T> {\n\t\tconst result: Record<string, unknown> = {};\n\n\t\tfor (const tableName of Object.keys(def.schema)) {\n\t\t\tresult[tableName] = this.createTableClient(def.name, tableName);\n\t\t}\n\n\t\treturn result as InferSubgraphClient<T>;\n\t}\n\n\tprivate createTableClient(subgraphName: string, tableName: string) {\n\t\tconst self = this;\n\n\t\treturn {\n\t\t\tasync findMany<TRow>(\n\t\t\t\toptions: FindManyOptions<TRow> = {},\n\t\t\t): Promise<TRow[]> {\n\t\t\t\tconst filters = options.where\n\t\t\t\t\t? serializeWhere(options.where as Record<string, unknown>)\n\t\t\t\t\t: undefined;\n\n\t\t\t\tlet sort: string | undefined;\n\t\t\t\tlet order: string | undefined;\n\t\t\t\tif (options.orderBy) {\n\t\t\t\t\tconst entries = Object.entries(options.orderBy) as [\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\t\"asc\" | \"desc\",\n\t\t\t\t\t][];\n\t\t\t\t\tif (entries.length > 0) {\n\t\t\t\t\t\tif (entries.length > 1) {\n\t\t\t\t\t\t\tconst extra = entries\n\t\t\t\t\t\t\t\t.slice(1)\n\t\t\t\t\t\t\t\t.map(([col]) => col)\n\t\t\t\t\t\t\t\t.join(\", \");\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`orderBy supports only one column; remove extra keys: ${extra}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst [col, dir] = entries[0]!;\n\t\t\t\t\t\tsort = resolveOrderByColumn(col);\n\t\t\t\t\t\torder = dir ?? \"asc\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst params: SubgraphQueryParams = {\n\t\t\t\t\tsort,\n\t\t\t\t\torder,\n\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\toffset: options.offset,\n\t\t\t\t\tfields: options.fields?.join(\",\"),\n\t\t\t\t\tfilters,\n\t\t\t\t};\n\n\t\t\t\treturn self.queryTable(subgraphName, tableName, params) as Promise<\n\t\t\t\t\tTRow[]\n\t\t\t\t>;\n\t\t\t},\n\n\t\t\tasync count<TRow>(where?: WhereInput<TRow>): Promise<number> {\n\t\t\t\tconst filters = where\n\t\t\t\t\t? serializeWhere(where as Record<string, unknown>)\n\t\t\t\t\t: undefined;\n\n\t\t\t\tconst result = await self.queryTableCount(subgraphName, tableName, {\n\t\t\t\t\tfilters,\n\t\t\t\t});\n\t\t\t\treturn result.count;\n\t\t\t},\n\t\t};\n\t}\n}\n",
9
- "import type { WorkflowRun, WorkflowRunStatus } from \"@secondlayer/workflows\";\nimport { BaseClient } from \"../base.ts\";\nimport { ApiError, VersionConflictError } from \"../errors.ts\";\n\nfunction parseSseChunk(raw: string): WorkflowTailEvent | null {\n\tlet event = \"message\";\n\tconst dataLines: string[] = [];\n\tfor (const line of raw.split(\"\\n\")) {\n\t\tif (line.startsWith(\"event:\")) {\n\t\t\tevent = line.slice(6).trim();\n\t\t} else if (line.startsWith(\"data:\")) {\n\t\t\tdataLines.push(line.slice(5).trimStart());\n\t\t}\n\t}\n\tif (dataLines.length === 0) return null;\n\tconst data = dataLines.join(\"\\n\");\n\ttry {\n\t\tconst parsed = JSON.parse(data);\n\t\tswitch (event) {\n\t\t\tcase \"step\":\n\t\t\t\treturn { type: \"step\", step: parsed as WorkflowStepEvent };\n\t\t\tcase \"done\":\n\t\t\t\treturn { type: \"done\", done: parsed as WorkflowRunDoneEvent };\n\t\t\tcase \"heartbeat\":\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"heartbeat\",\n\t\t\t\t\tts: typeof parsed === \"string\" ? parsed : String(parsed),\n\t\t\t\t};\n\t\t\tcase \"timeout\":\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"timeout\",\n\t\t\t\t\tmessage: (parsed as { message?: string }).message ?? \"timeout\",\n\t\t\t\t};\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport interface WorkflowSource {\n\tname: string;\n\tversion: string;\n\tsourceCode: string | null;\n\treadOnly: boolean;\n\treason?: string;\n\tupdatedAt: string;\n}\n\nexport interface WorkflowStepEvent {\n\tid: string;\n\tstepIndex: number;\n\tstepId: string;\n\tstepType: string;\n\tstatus: string;\n\toutput?: unknown;\n\terror: string | null;\n\tretryCount: number;\n\taiTokensUsed: number;\n\tstartedAt: string | null;\n\tcompletedAt: string | null;\n\tdurationMs: number | null;\n\tts: string;\n}\n\nexport interface WorkflowRunDoneEvent {\n\trunId: string;\n\tstatus: string;\n\terror?: string | null;\n\tcompletedAt?: string | null;\n}\n\nexport type WorkflowTailEvent =\n\t| { type: \"step\"; step: WorkflowStepEvent }\n\t| { type: \"done\"; done: WorkflowRunDoneEvent }\n\t| { type: \"heartbeat\"; ts: string }\n\t| { type: \"timeout\"; message: string };\n\nexport interface DeployDryRunResponse {\n\tvalid: boolean;\n\tvalidation?: { name: string; triggerType: string };\n\tbundleSize: number;\n\terror?: string;\n}\n\nexport interface DeployResponse {\n\taction: \"created\" | \"updated\";\n\tworkflowId: string;\n\tversion: string;\n\tmessage: string;\n}\n\nexport interface BundleWorkflowResponse {\n\tok: true;\n\tname: string;\n\ttrigger: Record<string, unknown>;\n\thandlerCode: string;\n\tsourceCode: string;\n\tretries: Record<string, unknown> | null;\n\ttimeout: number | null;\n\tbundleSize: number;\n}\n\nexport interface WorkflowSummary {\n\tname: string;\n\tstatus: \"active\" | \"paused\";\n\ttriggerType: \"event\" | \"schedule\" | \"manual\";\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport interface WorkflowDetail extends WorkflowSummary {\n\ttrigger: Record<string, unknown>;\n\tretries?: { maxAttempts?: number; backoffMs?: number };\n\ttimeout?: number;\n\ttotalRuns: number;\n\tlastRunAt: string | null;\n}\n\nexport interface WorkflowRunSummary {\n\tid: string;\n\tworkflowName: string;\n\tstatus: WorkflowRunStatus;\n\tduration: number;\n\taiTokensUsed: number;\n\ttriggeredAt: string;\n\tcompletedAt: string | null;\n}\n\nexport class Workflows extends BaseClient {\n\tasync deploy(\n\t\tdata: {\n\t\t\tname: string;\n\t\t\ttrigger: Record<string, unknown>;\n\t\t\thandlerCode: string;\n\t\t\tsourceCode?: string;\n\t\t\texpectedVersion?: string;\n\t\t\tretries?: Record<string, unknown>;\n\t\t\ttimeout?: number;\n\t\t\tclientRequestId?: string;\n\t\t} & { dryRun?: false },\n\t): Promise<DeployResponse>;\n\tasync deploy(data: {\n\t\tname: string;\n\t\ttrigger: Record<string, unknown>;\n\t\thandlerCode: string;\n\t\tsourceCode?: string;\n\t\texpectedVersion?: string;\n\t\tretries?: Record<string, unknown>;\n\t\ttimeout?: number;\n\t\tdryRun: true;\n\t}): Promise<DeployDryRunResponse>;\n\tasync deploy(data: {\n\t\tname: string;\n\t\ttrigger: Record<string, unknown>;\n\t\thandlerCode: string;\n\t\tsourceCode?: string;\n\t\texpectedVersion?: string;\n\t\tdryRun?: boolean;\n\t\tclientRequestId?: string;\n\t\tretries?: Record<string, unknown>;\n\t\ttimeout?: number;\n\t}): Promise<DeployResponse | DeployDryRunResponse> {\n\t\ttry {\n\t\t\treturn await this.request(\"POST\", \"/api/workflows\", data);\n\t\t} catch (err) {\n\t\t\tif (err instanceof ApiError && err.status === 409) {\n\t\t\t\tconst body = err.body as\n\t\t\t\t\t| { currentVersion?: string; expectedVersion?: string }\n\t\t\t\t\t| undefined;\n\t\t\t\tif (body?.currentVersion && body.expectedVersion) {\n\t\t\t\t\tthrow new VersionConflictError(\n\t\t\t\t\t\tbody.currentVersion,\n\t\t\t\t\t\tbody.expectedVersion,\n\t\t\t\t\t\terr.message,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync getSource(name: string): Promise<WorkflowSource> {\n\t\treturn this.request(\"GET\", `/api/workflows/${name}/source`);\n\t}\n\n\t/**\n\t * Bundle a TypeScript workflow source on the server. Used by the web chat\n\t * authoring loop so Vercel's serverless runtime doesn't have to run esbuild.\n\t * CLI and MCP still bundle locally — this method is for clients that can't\n\t * install `@secondlayer/bundler` directly (e.g. browser tooling, edge\n\t * functions).\n\t */\n\tasync bundle(data: { code: string }): Promise<BundleWorkflowResponse> {\n\t\treturn this.request(\"POST\", \"/api/workflows/bundle\", data);\n\t}\n\n\tasync pauseAll(): Promise<{\n\t\tpaused: number;\n\t\tworkflows: Array<{ name: string; version: string; status: string }>;\n\t}> {\n\t\treturn this.request(\"POST\", \"/api/workflows/pause-all\");\n\t}\n\n\tasync cancelRun(runId: string): Promise<{\n\t\trunId: string;\n\t\tstatus: string;\n\t\tcancelled: boolean;\n\t\tcompletedAt?: string;\n\t\tmessage?: string;\n\t}> {\n\t\treturn this.request(\"POST\", `/api/workflows/runs/${runId}/cancel`);\n\t}\n\n\tasync rollback(\n\t\tname: string,\n\t\ttoVersion?: string,\n\t): Promise<{\n\t\taction: \"rolled-back\";\n\t\tname: string;\n\t\tfromVersion: string;\n\t\trestoredFromVersion: string;\n\t\tversion: string;\n\t}> {\n\t\treturn this.request(\n\t\t\t\"POST\",\n\t\t\t`/api/workflows/${name}/rollback`,\n\t\t\ttoVersion ? { toVersion } : {},\n\t\t);\n\t}\n\n\t/**\n\t * Subscribe to a workflow run's server-sent event stream. Resolves when the\n\t * run completes, times out, or the signal is aborted. Throws on HTTP errors\n\t * opening the stream.\n\t */\n\tasync streamRun(\n\t\tname: string,\n\t\trunId: string,\n\t\tonEvent: (event: WorkflowTailEvent) => void,\n\t\tsignal?: AbortSignal,\n\t): Promise<void> {\n\t\tconst url = `${this.baseUrl}/api/workflows/${name}/runs/${runId}/stream`;\n\t\tconst headers: Record<string, string> = {\n\t\t\tAccept: \"text/event-stream\",\n\t\t\t\"x-sl-origin\": this.origin,\n\t\t};\n\t\tif (this.apiKey) {\n\t\t\theaders.Authorization = `Bearer ${this.apiKey}`;\n\t\t}\n\n\t\tconst res = await fetch(url, { headers, signal });\n\t\tif (!res.ok || !res.body) {\n\t\t\tthrow new ApiError(\n\t\t\t\tres.status,\n\t\t\t\t`Failed to open workflow run stream (HTTP ${res.status})`,\n\t\t\t);\n\t\t}\n\n\t\tconst reader = res.body.pipeThrough(new TextDecoderStream()).getReader();\n\t\tlet buffer = \"\";\n\n\t\twhile (true) {\n\t\t\tconst { value, done } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tbuffer += value;\n\n\t\t\tlet sep = buffer.indexOf(\"\\n\\n\");\n\t\t\twhile (sep !== -1) {\n\t\t\t\tconst chunk = buffer.slice(0, sep);\n\t\t\t\tbuffer = buffer.slice(sep + 2);\n\t\t\t\tconst parsed = parseSseChunk(chunk);\n\t\t\t\tif (parsed) {\n\t\t\t\t\tonEvent(parsed);\n\t\t\t\t\tif (parsed.type === \"done\" || parsed.type === \"timeout\") {\n\t\t\t\t\t\tawait reader.cancel().catch(() => undefined);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsep = buffer.indexOf(\"\\n\\n\");\n\t\t\t}\n\t\t}\n\t}\n\n\tasync list(): Promise<{ workflows: WorkflowSummary[] }> {\n\t\treturn this.request(\"GET\", \"/api/workflows\");\n\t}\n\n\tasync get(name: string): Promise<WorkflowDetail> {\n\t\treturn this.request(\"GET\", `/api/workflows/${name}`);\n\t}\n\n\tasync trigger(\n\t\tname: string,\n\t\tinput?: Record<string, unknown>,\n\t): Promise<{ runId: string }> {\n\t\treturn this.request(\n\t\t\t\"POST\",\n\t\t\t`/api/workflows/${name}/trigger`,\n\t\t\tinput ? { input } : undefined,\n\t\t);\n\t}\n\n\tasync pause(name: string): Promise<void> {\n\t\treturn this.request(\"POST\", `/api/workflows/${name}/pause`);\n\t}\n\n\tasync resume(name: string): Promise<void> {\n\t\treturn this.request(\"POST\", `/api/workflows/${name}/resume`);\n\t}\n\n\tasync delete(name: string): Promise<void> {\n\t\treturn this.request(\"DELETE\", `/api/workflows/${name}`);\n\t}\n\n\tasync listRuns(\n\t\tname: string,\n\t\tparams?: { status?: WorkflowRunStatus; limit?: number },\n\t): Promise<{ runs: WorkflowRunSummary[] }> {\n\t\tconst qs = new URLSearchParams();\n\t\tif (params?.status) qs.set(\"status\", params.status);\n\t\tif (params?.limit !== undefined) qs.set(\"limit\", String(params.limit));\n\t\tconst query = qs.toString();\n\t\treturn this.request(\n\t\t\t\"GET\",\n\t\t\t`/api/workflows/${name}/runs${query ? `?${query}` : \"\"}`,\n\t\t);\n\t}\n\n\tasync getRun(runId: string): Promise<WorkflowRun> {\n\t\treturn this.request(\"GET\", `/api/workflows/runs/${runId}`);\n\t}\n}\n",
10
- "import { BaseClient } from \"./base.ts\";\nimport type { SecondLayerOptions } from \"./base.ts\";\nimport { Subgraphs } from \"./subgraphs/client.ts\";\nimport { Workflows } from \"./workflows/client.ts\";\n\nexport class SecondLayer extends BaseClient {\n\treadonly subgraphs: Subgraphs;\n\treadonly workflows: Workflows;\n\n\tconstructor(options: Partial<SecondLayerOptions> = {}) {\n\t\tsuper(options);\n\t\tthis.subgraphs = new Subgraphs(options);\n\t\tthis.workflows = new Workflows(options);\n\t}\n}\n",
9
+ "import { BaseClient } from \"../base.ts\";\n\nexport type SubscriptionStatus = \"active\" | \"paused\" | \"error\";\nexport type SubscriptionFormat =\n\t| \"standard-webhooks\"\n\t| \"inngest\"\n\t| \"trigger\"\n\t| \"cloudflare\"\n\t| \"cloudevents\"\n\t| \"raw\";\nexport type SubscriptionRuntime = \"inngest\" | \"trigger\" | \"cloudflare\" | \"node\";\n\nexport interface SubscriptionSummary {\n\tid: string;\n\tname: string;\n\tstatus: SubscriptionStatus;\n\tsubgraphName: string;\n\ttableName: string;\n\tformat: SubscriptionFormat;\n\truntime: SubscriptionRuntime | null;\n\turl: string;\n\tlastDeliveryAt: string | null;\n\tlastSuccessAt: string | null;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport interface SubscriptionDetail extends SubscriptionSummary {\n\tfilter: Record<string, unknown>;\n\tauthConfig: Record<string, unknown>;\n\tmaxRetries: number;\n\ttimeoutMs: number;\n\tconcurrency: number;\n\tcircuitFailures: number;\n\tcircuitOpenedAt: string | null;\n\tlastError: string | null;\n}\n\nexport interface CreateSubscriptionRequest {\n\tname: string;\n\tsubgraphName: string;\n\ttableName: string;\n\turl: string;\n\tfilter?: Record<string, unknown>;\n\tformat?: SubscriptionFormat;\n\truntime?: SubscriptionRuntime;\n\tauthConfig?: Record<string, unknown>;\n\tmaxRetries?: number;\n\ttimeoutMs?: number;\n\tconcurrency?: number;\n}\n\nexport interface CreateSubscriptionResponse {\n\tsubscription: SubscriptionDetail;\n\t/** Plaintext signing secret surfaced ONCE. Store it server-side. */\n\tsigningSecret: string;\n}\n\nexport interface UpdateSubscriptionRequest {\n\tname?: string;\n\turl?: string;\n\tfilter?: Record<string, unknown>;\n\tformat?: SubscriptionFormat;\n\truntime?: SubscriptionRuntime | null;\n\tauthConfig?: Record<string, unknown>;\n\tmaxRetries?: number;\n\ttimeoutMs?: number;\n\tconcurrency?: number;\n}\n\nexport interface RotateSecretResponse {\n\tsubscription: SubscriptionDetail;\n\tsigningSecret: string;\n}\n\nexport class Subscriptions extends BaseClient {\n\tasync list(): Promise<{ data: SubscriptionSummary[] }> {\n\t\treturn this.request<{ data: SubscriptionSummary[] }>(\n\t\t\t\"GET\",\n\t\t\t\"/api/subscriptions\",\n\t\t);\n\t}\n\n\tasync get(id: string): Promise<SubscriptionDetail> {\n\t\treturn this.request<SubscriptionDetail>(\"GET\", `/api/subscriptions/${id}`);\n\t}\n\n\tasync create(\n\t\tinput: CreateSubscriptionRequest,\n\t): Promise<CreateSubscriptionResponse> {\n\t\treturn this.request<CreateSubscriptionResponse>(\n\t\t\t\"POST\",\n\t\t\t\"/api/subscriptions\",\n\t\t\tinput,\n\t\t);\n\t}\n\n\tasync update(\n\t\tid: string,\n\t\tpatch: UpdateSubscriptionRequest,\n\t): Promise<SubscriptionDetail> {\n\t\treturn this.request<SubscriptionDetail>(\n\t\t\t\"PATCH\",\n\t\t\t`/api/subscriptions/${id}`,\n\t\t\tpatch,\n\t\t);\n\t}\n\n\tasync pause(id: string): Promise<SubscriptionDetail> {\n\t\treturn this.request<SubscriptionDetail>(\n\t\t\t\"POST\",\n\t\t\t`/api/subscriptions/${id}/pause`,\n\t\t);\n\t}\n\n\tasync resume(id: string): Promise<SubscriptionDetail> {\n\t\treturn this.request<SubscriptionDetail>(\n\t\t\t\"POST\",\n\t\t\t`/api/subscriptions/${id}/resume`,\n\t\t);\n\t}\n\n\tasync delete(id: string): Promise<{ ok: true }> {\n\t\treturn this.request<{ ok: true }>(\"DELETE\", `/api/subscriptions/${id}`);\n\t}\n\n\tasync rotateSecret(id: string): Promise<RotateSecretResponse> {\n\t\treturn this.request<RotateSecretResponse>(\n\t\t\t\"POST\",\n\t\t\t`/api/subscriptions/${id}/rotate-secret`,\n\t\t);\n\t}\n}\n",
10
+ "import { BaseClient } from \"./base.ts\";\nimport type { SecondLayerOptions } from \"./base.ts\";\nimport { Subgraphs } from \"./subgraphs/client.ts\";\nimport { Subscriptions } from \"./subscriptions/client.ts\";\n\nexport class SecondLayer extends BaseClient {\n\treadonly subgraphs: Subgraphs;\n\treadonly subscriptions: Subscriptions;\n\n\tconstructor(options: Partial<SecondLayerOptions> = {}) {\n\t\tsuper(options);\n\t\tthis.subgraphs = new Subgraphs(options);\n\t\tthis.subscriptions = new Subscriptions(options);\n\t}\n}\n",
11
11
  "import type { InferSubgraphClient } from \"@secondlayer/subgraphs\";\nimport type { SecondLayerOptions } from \"../base.ts\";\nimport { SecondLayer } from \"../client.ts\";\nimport { Subgraphs } from \"./client.ts\";\n\n/**\n * Returns a typed client for a subgraph defined with `defineSubgraph()`.\n *\n * Accepts a plain options object, a `SecondLayer` instance, or a `Subgraphs` instance.\n *\n * @example\n * ```ts\n * import mySubgraph from './subgraphs/my-subgraph'\n * import { getSubgraph } from '@secondlayer/sdk'\n *\n * const client = getSubgraph(mySubgraph, { apiKey: 'sl_...' })\n * const rows = await client.transfers.findMany({ where: { sender: 'SP...' } })\n * ```\n */\nexport function getSubgraph<\n\tT extends { name: string; schema: Record<string, unknown> },\n>(\n\tdef: T,\n\toptions: Partial<SecondLayerOptions> | SecondLayer | Subgraphs = {},\n): InferSubgraphClient<T> {\n\tif (options instanceof Subgraphs) {\n\t\treturn options.typed(def);\n\t}\n\tif (options instanceof SecondLayer) {\n\t\treturn options.subgraphs.typed(def);\n\t}\n\treturn new Subgraphs(options).typed(def);\n}\n",
12
12
  "import { verifySignatureHeader } from \"@secondlayer/shared/crypto/hmac\";\n\nexport { verifySignatureHeader };\n\n/**\n * Verify a webhook delivery signature from Secondlayer.\n *\n * Every delivery includes an `x-secondlayer-signature` header in the format\n * `t=<timestamp>,v1=<hmac>`. This function verifies the HMAC and checks\n * the timestamp is within the tolerance window (default 5 minutes).\n *\n * @param rawBody - The raw request body as a string (not parsed JSON)\n * @param signatureHeader - The value of the `x-secondlayer-signature` header\n * @param secret - Your signing secret\n * @param toleranceSeconds - Max age of signature in seconds (default 300)\n * @returns true if the signature is valid\n *\n * @example\n * ```ts\n * import { verifyWebhookSignature } from \"@secondlayer/sdk\";\n *\n * app.post(\"/webhook\", (req, res) => {\n * const sig = req.headers[\"x-secondlayer-signature\"];\n * const raw = JSON.stringify(req.body);\n * if (!verifyWebhookSignature(raw, sig, process.env.SIGNING_SECRET!)) {\n * return res.status(401).send(\"Invalid signature\");\n * }\n * // Process the event...\n * });\n * ```\n */\nexport function verifyWebhookSignature(\n\trawBody: string,\n\tsignatureHeader: string,\n\tsecret: string,\n\ttoleranceSeconds = 300,\n): boolean {\n\treturn verifySignatureHeader(\n\t\trawBody,\n\t\tsignatureHeader,\n\t\tsecret,\n\t\ttoleranceSeconds,\n\t);\n}\n"
13
13
  ],
14
- "mappings": "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",
15
- "debugId": "56F4E9CF4BB3487864756E2164756E21",
14
+ "mappings": "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",
15
+ "debugId": "8D5F53ED0AC865AD64756E2164756E21",
16
16
  "names": []
17
17
  }