@secondlayer/shared 0.12.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +5 -7
  2. package/dist/src/constants.d.ts +1 -1
  3. package/dist/src/constants.js.map +2 -2
  4. package/dist/src/crypto/secrets.d.ts +5 -0
  5. package/dist/src/crypto/secrets.js +69 -0
  6. package/dist/src/crypto/secrets.js.map +10 -0
  7. package/dist/src/db/index.d.ts +37 -64
  8. package/dist/src/db/index.js +2 -2
  9. package/dist/src/db/index.js.map +2 -2
  10. package/dist/src/db/queries/accounts.d.ts +30 -51
  11. package/dist/src/db/queries/integrity.d.ts +30 -51
  12. package/dist/src/db/queries/marketplace.d.ts +30 -51
  13. package/dist/src/db/queries/projects.d.ts +30 -51
  14. package/dist/src/db/queries/subgraph-gaps.d.ts +30 -51
  15. package/dist/src/db/queries/subgraphs.d.ts +31 -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 +31 -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 +35 -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 +37 -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 +59 -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 +30 -51
  35. package/dist/src/pricing.d.ts +28 -0
  36. package/dist/src/pricing.js +47 -0
  37. package/dist/src/pricing.js.map +10 -0
  38. package/dist/src/queue/listener.d.ts +1 -18
  39. package/dist/src/queue/listener.js +2 -12
  40. package/dist/src/queue/listener.js.map +3 -3
  41. package/dist/src/schemas/filters.d.ts +3 -3
  42. package/dist/src/schemas/filters.js +3 -3
  43. package/dist/src/schemas/filters.js.map +3 -3
  44. package/dist/src/schemas/index.d.ts +5 -100
  45. package/dist/src/schemas/index.js +4 -88
  46. package/dist/src/schemas/index.js.map +5 -6
  47. package/dist/src/schemas/subgraphs.d.ts +2 -0
  48. package/dist/src/schemas/subgraphs.js +2 -1
  49. package/dist/src/schemas/subgraphs.js.map +3 -3
  50. package/dist/src/schemas/workflows.d.ts +4 -0
  51. package/dist/src/schemas/workflows.js +5 -1
  52. package/dist/src/schemas/workflows.js.map +3 -3
  53. package/dist/src/types.d.ts +1 -53
  54. package/migrations/0030_workflow_source_code.ts +21 -0
  55. package/migrations/0031_subgraph_source_code.ts +18 -0
  56. package/migrations/0032_drop_streams_tables.ts +43 -0
  57. package/migrations/0033_workflow_steps_memo_key.ts +54 -0
  58. package/migrations/0034_workflow_signer_secrets.ts +42 -0
  59. package/migrations/0035_workflow_budgets.ts +53 -0
  60. package/migrations/0036_tx_confirmed_notify.ts +36 -0
  61. package/package.json +11 -15
  62. package/dist/src/db/queries/metrics.d.ts +0 -419
  63. package/dist/src/db/queries/metrics.js +0 -55
  64. package/dist/src/db/queries/metrics.js.map +0 -10
  65. package/dist/src/queue/index.d.ts +0 -50
  66. package/dist/src/queue/index.js +0 -184
  67. package/dist/src/queue/index.js.map +0 -12
  68. package/dist/src/queue/recovery.d.ts +0 -14
  69. package/dist/src/queue/recovery.js +0 -108
  70. package/dist/src/queue/recovery.js.map +0 -12
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/lib/plans.ts"],
4
4
  "sourcesContent": [
5
- "export interface PlanLimits {\n\tstreams: number;\n\tsubgraphs: number;\n\tapiRequestsPerDay: number;\n\tdeliveriesPerMonth: number;\n\tstorageBytes: number;\n}\n\nexport const FREE_PLAN: PlanLimits = {\n\tstreams: 3,\n\tsubgraphs: 2,\n\tapiRequestsPerDay: 1_000,\n\tdeliveriesPerMonth: 5_000,\n\tstorageBytes: 100 * 1024 * 1024, // 100MB\n};\n\nexport function getPlanLimits(plan: string): PlanLimits {\n\tswitch (plan) {\n\t\tcase \"free\":\n\t\tdefault:\n\t\t\treturn FREE_PLAN;\n\t}\n}\n"
5
+ "export interface PlanLimits {\n\tsubgraphs: number;\n\tapiRequestsPerDay: number;\n\tdeliveriesPerMonth: number;\n\tstorageBytes: number;\n}\n\nexport const FREE_PLAN: PlanLimits = {\n\tsubgraphs: 2,\n\tapiRequestsPerDay: 1_000,\n\tdeliveriesPerMonth: 5_000,\n\tstorageBytes: 100 * 1024 * 1024,\n};\n\nexport function getPlanLimits(plan: string): PlanLimits {\n\tswitch (plan) {\n\t\tcase \"free\":\n\t\tdefault:\n\t\t\treturn FREE_PLAN;\n\t}\n}\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;AAQO,IAAM,YAAwB;AAAA,EACpC,SAAS;AAAA,EACT,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,cAAc,MAAM,OAAO;AAC5B;AAEO,SAAS,aAAa,CAAC,MAA0B;AAAA,EACvD,QAAQ;AAAA,SACF;AAAA;AAAA,MAEJ,OAAO;AAAA;AAAA;",
8
- "debugId": "9CCA872DC413D4D864756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;AAOO,IAAM,YAAwB;AAAA,EACpC,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,cAAc,MAAM,OAAO;AAC5B;AAEO,SAAS,aAAa,CAAC,MAA0B;AAAA,EACvD,QAAQ;AAAA,SACF;AAAA;AAAA,MAEJ,OAAO;AAAA;AAAA;",
8
+ "debugId": "073DFD0969A0C8D364756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -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;
@@ -340,6 +295,8 @@ interface WorkflowStepsTable {
340
295
  started_at: Date | null;
341
296
  completed_at: Date | null;
342
297
  duration_ms: number | null;
298
+ memo_key: string | null;
299
+ parent_step_id: string | null;
343
300
  created_at: Generated<Date>;
344
301
  }
345
302
  interface WorkflowQueueTable {
@@ -374,11 +331,7 @@ interface Database {
374
331
  blocks: BlocksTable;
375
332
  transactions: TransactionsTable;
376
333
  events: EventsTable;
377
- streams: StreamsTable;
378
- stream_metrics: StreamMetricsTable;
379
- jobs: JobsTable;
380
334
  index_progress: IndexProgressTable;
381
- deliveries: DeliveriesTable;
382
335
  subgraphs: SubgraphsTable;
383
336
  api_keys: ApiKeysTable;
384
337
  accounts: AccountsTable;
@@ -405,6 +358,32 @@ interface Database {
405
358
  workflow_queue: WorkflowQueueTable;
406
359
  workflow_schedules: WorkflowSchedulesTable;
407
360
  workflow_cursors: WorkflowCursorsTable;
361
+ workflow_signer_secrets: WorkflowSignerSecretsTable;
362
+ workflow_budgets: WorkflowBudgetsTable;
363
+ }
364
+ interface WorkflowBudgetsTable {
365
+ id: Generated<string>;
366
+ workflow_definition_id: string;
367
+ /** Period key: "daily:YYYY-MM-DD" | "weekly:YYYY-Www" | "per-run:<uuid>". */
368
+ period: string;
369
+ ai_usd_used: Generated<string>;
370
+ ai_tokens_used: Generated<string>;
371
+ chain_microstx_used: Generated<string>;
372
+ chain_tx_count: Generated<number>;
373
+ run_count: Generated<number>;
374
+ step_count: Generated<number>;
375
+ reset_at: Date;
376
+ created_at: Generated<Date>;
377
+ updated_at: Generated<Date>;
378
+ }
379
+ interface WorkflowSignerSecretsTable {
380
+ id: Generated<string>;
381
+ account_id: string;
382
+ name: string;
383
+ /** AES-GCM ciphertext bytes produced by the runner's KMS on write. */
384
+ encrypted_value: Buffer;
385
+ created_at: Generated<Date>;
386
+ updated_at: Generated<Date>;
408
387
  }
409
388
  /** Matches the NewBlockPayload shape expected by the indexer's /new_block endpoint */
410
389
  interface ReplayBlockPayload {
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Token → USD pricing constants for internal observability.
3
+ *
4
+ * **Not customer billing.** Tier pricing covers compute; these constants
5
+ * let the dashboard display "~$X spent in AI today" and let us track
6
+ * gross-margin internally. Update manually when providers change prices
7
+ * (roughly twice per year).
8
+ *
9
+ * Source: public provider pricing pages as of 2026-04-17.
10
+ */
11
+ interface ModelPricing {
12
+ /** USD per 1M input tokens */
13
+ inputPerMTokens: number;
14
+ /** USD per 1M output tokens */
15
+ outputPerMTokens: number;
16
+ }
17
+ declare const MODEL_PRICING: Record<string, Record<string, ModelPricing>>;
18
+ interface TokenUsage {
19
+ inputTokens: number;
20
+ outputTokens: number;
21
+ }
22
+ /**
23
+ * Compute approximate USD cost for an AI step. Returns `null` if the
24
+ * (provider, model) pair isn't in the pricing table — the caller should
25
+ * display "-" rather than "$0".
26
+ */
27
+ declare function computeUsdCost(provider: string, modelId: string, usage: TokenUsage): number | null;
28
+ export { computeUsdCost, TokenUsage, ModelPricing, MODEL_PRICING };
@@ -0,0 +1,47 @@
1
+ import { createRequire } from "node:module";
2
+ var __defProp = Object.defineProperty;
3
+ var __returnValue = (v) => v;
4
+ function __exportSetter(name, newValue) {
5
+ this[name] = __returnValue.bind(null, newValue);
6
+ }
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, {
10
+ get: all[name],
11
+ enumerable: true,
12
+ configurable: true,
13
+ set: __exportSetter.bind(all, name)
14
+ });
15
+ };
16
+
17
+ // src/pricing.ts
18
+ var MODEL_PRICING = {
19
+ anthropic: {
20
+ "claude-haiku-4-5": { inputPerMTokens: 1, outputPerMTokens: 5 },
21
+ "claude-haiku-4-5-20251001": { inputPerMTokens: 1, outputPerMTokens: 5 },
22
+ "claude-sonnet-4-6": { inputPerMTokens: 3, outputPerMTokens: 15 },
23
+ "claude-opus-4-7": { inputPerMTokens: 15, outputPerMTokens: 75 }
24
+ },
25
+ openai: {
26
+ "gpt-4.1": { inputPerMTokens: 2.5, outputPerMTokens: 10 },
27
+ "gpt-4o": { inputPerMTokens: 2.5, outputPerMTokens: 10 },
28
+ "gpt-4o-mini": { inputPerMTokens: 0.15, outputPerMTokens: 0.6 }
29
+ },
30
+ google: {
31
+ "gemini-2.5-pro": { inputPerMTokens: 1.25, outputPerMTokens: 10 },
32
+ "gemini-2.5-flash": { inputPerMTokens: 0.3, outputPerMTokens: 2.5 }
33
+ }
34
+ };
35
+ function computeUsdCost(provider, modelId, usage) {
36
+ const p = MODEL_PRICING[provider]?.[modelId];
37
+ if (!p)
38
+ return null;
39
+ return usage.inputTokens * p.inputPerMTokens / 1e6 + usage.outputTokens * p.outputPerMTokens / 1e6;
40
+ }
41
+ export {
42
+ computeUsdCost,
43
+ MODEL_PRICING
44
+ };
45
+
46
+ //# debugId=4DD95AFC388E4B9664756E2164756E21
47
+ //# sourceMappingURL=pricing.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/pricing.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Token → USD pricing constants for internal observability.\n *\n * **Not customer billing.** Tier pricing covers compute; these constants\n * let the dashboard display \"~$X spent in AI today\" and let us track\n * gross-margin internally. Update manually when providers change prices\n * (roughly twice per year).\n *\n * Source: public provider pricing pages as of 2026-04-17.\n */\n\nexport interface ModelPricing {\n\t/** USD per 1M input tokens */\n\tinputPerMTokens: number;\n\t/** USD per 1M output tokens */\n\toutputPerMTokens: number;\n}\n\nexport const MODEL_PRICING: Record<string, Record<string, ModelPricing>> = {\n\tanthropic: {\n\t\t\"claude-haiku-4-5\": { inputPerMTokens: 1, outputPerMTokens: 5 },\n\t\t\"claude-haiku-4-5-20251001\": { inputPerMTokens: 1, outputPerMTokens: 5 },\n\t\t\"claude-sonnet-4-6\": { inputPerMTokens: 3, outputPerMTokens: 15 },\n\t\t\"claude-opus-4-7\": { inputPerMTokens: 15, outputPerMTokens: 75 },\n\t},\n\topenai: {\n\t\t\"gpt-4.1\": { inputPerMTokens: 2.5, outputPerMTokens: 10 },\n\t\t\"gpt-4o\": { inputPerMTokens: 2.5, outputPerMTokens: 10 },\n\t\t\"gpt-4o-mini\": { inputPerMTokens: 0.15, outputPerMTokens: 0.6 },\n\t},\n\tgoogle: {\n\t\t\"gemini-2.5-pro\": { inputPerMTokens: 1.25, outputPerMTokens: 10 },\n\t\t\"gemini-2.5-flash\": { inputPerMTokens: 0.3, outputPerMTokens: 2.5 },\n\t},\n};\n\nexport interface TokenUsage {\n\tinputTokens: number;\n\toutputTokens: number;\n}\n\n/**\n * Compute approximate USD cost for an AI step. Returns `null` if the\n * (provider, model) pair isn't in the pricing table — the caller should\n * display \"-\" rather than \"$0\".\n */\nexport function computeUsdCost(\n\tprovider: string,\n\tmodelId: string,\n\tusage: TokenUsage,\n): number | null {\n\tconst p = MODEL_PRICING[provider]?.[modelId];\n\tif (!p) return null;\n\treturn (\n\t\t(usage.inputTokens * p.inputPerMTokens) / 1_000_000 +\n\t\t(usage.outputTokens * p.outputPerMTokens) / 1_000_000\n\t);\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;AAkBO,IAAM,gBAA8D;AAAA,EAC1E,WAAW;AAAA,IACV,oBAAoB,EAAE,iBAAiB,GAAG,kBAAkB,EAAE;AAAA,IAC9D,6BAA6B,EAAE,iBAAiB,GAAG,kBAAkB,EAAE;AAAA,IACvE,qBAAqB,EAAE,iBAAiB,GAAG,kBAAkB,GAAG;AAAA,IAChE,mBAAmB,EAAE,iBAAiB,IAAI,kBAAkB,GAAG;AAAA,EAChE;AAAA,EACA,QAAQ;AAAA,IACP,WAAW,EAAE,iBAAiB,KAAK,kBAAkB,GAAG;AAAA,IACxD,UAAU,EAAE,iBAAiB,KAAK,kBAAkB,GAAG;AAAA,IACvD,eAAe,EAAE,iBAAiB,MAAM,kBAAkB,IAAI;AAAA,EAC/D;AAAA,EACA,QAAQ;AAAA,IACP,kBAAkB,EAAE,iBAAiB,MAAM,kBAAkB,GAAG;AAAA,IAChE,oBAAoB,EAAE,iBAAiB,KAAK,kBAAkB,IAAI;AAAA,EACnE;AACD;AAYO,SAAS,cAAc,CAC7B,UACA,SACA,OACgB;AAAA,EAChB,MAAM,IAAI,cAAc,YAAY;AAAA,EACpC,IAAI,CAAC;AAAA,IAAG,OAAO;AAAA,EACf,OACE,MAAM,cAAc,EAAE,kBAAmB,MACzC,MAAM,eAAe,EAAE,mBAAoB;AAAA;",
8
+ "debugId": "4DD95AFC388E4B9664756E2164756E21",
9
+ "names": []
10
+ }
@@ -1,20 +1,3 @@
1
- declare const CHANNEL_NEW_JOB = "streams:new_job";
2
- /**
3
- * Listen for notifications on a channel
4
- * Uses a dedicated connection for LISTEN
5
- */
6
1
  declare function listen(channel: string, callback: (payload?: string) => void): Promise<() => Promise<void>>;
7
- /**
8
- * Send a notification on a channel
9
- */
10
2
  declare function notify(channel: string, payload?: string): Promise<void>;
11
- /**
12
- * Listen for new job notifications
13
- * Convenience wrapper for the common use case
14
- */
15
- declare function listenForJobs(callback: (payload?: string) => void): Promise<() => Promise<void>>;
16
- /**
17
- * Notify workers about new jobs
18
- */
19
- declare function notifyNewJob(streamId?: string): Promise<void>;
20
- export { notifyNewJob, notify, listenForJobs, listen, CHANNEL_NEW_JOB };
3
+ export { notify, listen };
@@ -16,7 +16,6 @@ var __export = (target, all) => {
16
16
 
17
17
  // src/queue/listener.ts
18
18
  import postgres from "postgres";
19
- var CHANNEL_NEW_JOB = "streams:new_job";
20
19
  async function listen(channel, callback) {
21
20
  const connectionString = process.env.DATABASE_URL;
22
21
  if (!connectionString) {
@@ -49,19 +48,10 @@ async function notify(channel, payload) {
49
48
  await client.end();
50
49
  }
51
50
  }
52
- async function listenForJobs(callback) {
53
- return listen(CHANNEL_NEW_JOB, callback);
54
- }
55
- async function notifyNewJob(streamId) {
56
- return notify(CHANNEL_NEW_JOB, streamId);
57
- }
58
51
  export {
59
- notifyNewJob,
60
52
  notify,
61
- listenForJobs,
62
- listen,
63
- CHANNEL_NEW_JOB
53
+ listen
64
54
  };
65
55
 
66
- //# debugId=694EC70CE737295164756E2164756E21
56
+ //# debugId=BC1D53C4E8438D5E64756E2164756E21
67
57
  //# sourceMappingURL=listener.js.map
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/queue/listener.ts"],
4
4
  "sourcesContent": [
5
- "import postgres from \"postgres\";\n\nconst CHANNEL_NEW_JOB = \"streams:new_job\";\n\n/**\n * Listen for notifications on a channel\n * Uses a dedicated connection for LISTEN\n */\nexport async function listen(\n\tchannel: string,\n\tcallback: (payload?: string) => void,\n): Promise<() => Promise<void>> {\n\tconst connectionString = process.env.DATABASE_URL;\n\tif (!connectionString) {\n\t\tthrow new Error(\"DATABASE_URL is required\");\n\t}\n\n\t// Each listener gets its own connection\n\tconst client = postgres(connectionString, {\n\t\tmax: 1,\n\t\tonnotice: () => {}, // Ignore notices\n\t});\n\n\tawait client.listen(channel, (payload) => {\n\t\tcallback(payload);\n\t});\n\n\t// Return cleanup function\n\treturn async () => {\n\t\tawait client.end();\n\t};\n}\n\n/**\n * Send a notification on a channel\n */\nexport async function notify(channel: string, payload?: string): Promise<void> {\n\tconst connectionString = process.env.DATABASE_URL;\n\tif (!connectionString) {\n\t\tthrow new Error(\"DATABASE_URL is required\");\n\t}\n\n\tconst client = postgres(connectionString, { max: 1 });\n\n\ttry {\n\t\tif (payload) {\n\t\t\tawait client`SELECT pg_notify(${channel}, ${payload})`;\n\t\t} else {\n\t\t\tawait client`SELECT pg_notify(${channel}, '')`;\n\t\t}\n\t} finally {\n\t\tawait client.end();\n\t}\n}\n\n/**\n * Listen for new job notifications\n * Convenience wrapper for the common use case\n */\nexport async function listenForJobs(\n\tcallback: (payload?: string) => void,\n): Promise<() => Promise<void>> {\n\treturn listen(CHANNEL_NEW_JOB, callback);\n}\n\n/**\n * Notify workers about new jobs\n */\nexport async function notifyNewJob(streamId?: string): Promise<void> {\n\treturn notify(CHANNEL_NEW_JOB, streamId);\n}\n\nexport { CHANNEL_NEW_JOB };\n"
5
+ "import postgres from \"postgres\";\n\nexport async function listen(\n\tchannel: string,\n\tcallback: (payload?: string) => void,\n): Promise<() => Promise<void>> {\n\tconst connectionString = process.env.DATABASE_URL;\n\tif (!connectionString) {\n\t\tthrow new Error(\"DATABASE_URL is required\");\n\t}\n\n\tconst client = postgres(connectionString, {\n\t\tmax: 1,\n\t\tonnotice: () => {},\n\t});\n\n\tawait client.listen(channel, (payload) => {\n\t\tcallback(payload);\n\t});\n\n\treturn async () => {\n\t\tawait client.end();\n\t};\n}\n\nexport async function notify(channel: string, payload?: string): Promise<void> {\n\tconst connectionString = process.env.DATABASE_URL;\n\tif (!connectionString) {\n\t\tthrow new Error(\"DATABASE_URL is required\");\n\t}\n\n\tconst client = postgres(connectionString, { max: 1 });\n\n\ttry {\n\t\tif (payload) {\n\t\t\tawait client`SELECT pg_notify(${channel}, ${payload})`;\n\t\t} else {\n\t\t\tawait client`SELECT pg_notify(${channel}, '')`;\n\t\t}\n\t} finally {\n\t\tawait client.end();\n\t}\n}\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAEA,IAAM,kBAAkB;AAMxB,eAAsB,MAAM,CAC3B,SACA,UAC+B;AAAA,EAC/B,MAAM,mBAAmB,QAAQ,IAAI;AAAA,EACrC,IAAI,CAAC,kBAAkB;AAAA,IACtB,MAAM,IAAI,MAAM,0BAA0B;AAAA,EAC3C;AAAA,EAGA,MAAM,SAAS,SAAS,kBAAkB;AAAA,IACzC,KAAK;AAAA,IACL,UAAU,MAAM;AAAA,EACjB,CAAC;AAAA,EAED,MAAM,OAAO,OAAO,SAAS,CAAC,YAAY;AAAA,IACzC,SAAS,OAAO;AAAA,GAChB;AAAA,EAGD,OAAO,YAAY;AAAA,IAClB,MAAM,OAAO,IAAI;AAAA;AAAA;AAOnB,eAAsB,MAAM,CAAC,SAAiB,SAAiC;AAAA,EAC9E,MAAM,mBAAmB,QAAQ,IAAI;AAAA,EACrC,IAAI,CAAC,kBAAkB;AAAA,IACtB,MAAM,IAAI,MAAM,0BAA0B;AAAA,EAC3C;AAAA,EAEA,MAAM,SAAS,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC;AAAA,EAEpD,IAAI;AAAA,IACH,IAAI,SAAS;AAAA,MACZ,MAAM,0BAA0B,YAAY;AAAA,IAC7C,EAAO;AAAA,MACN,MAAM,0BAA0B;AAAA;AAAA,YAEhC;AAAA,IACD,MAAM,OAAO,IAAI;AAAA;AAAA;AAQnB,eAAsB,aAAa,CAClC,UAC+B;AAAA,EAC/B,OAAO,OAAO,iBAAiB,QAAQ;AAAA;AAMxC,eAAsB,YAAY,CAAC,UAAkC;AAAA,EACpE,OAAO,OAAO,iBAAiB,QAAQ;AAAA;",
8
- "debugId": "694EC70CE737295164756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAEA,eAAsB,MAAM,CAC3B,SACA,UAC+B;AAAA,EAC/B,MAAM,mBAAmB,QAAQ,IAAI;AAAA,EACrC,IAAI,CAAC,kBAAkB;AAAA,IACtB,MAAM,IAAI,MAAM,0BAA0B;AAAA,EAC3C;AAAA,EAEA,MAAM,SAAS,SAAS,kBAAkB;AAAA,IACzC,KAAK;AAAA,IACL,UAAU,MAAM;AAAA,EACjB,CAAC;AAAA,EAED,MAAM,OAAO,OAAO,SAAS,CAAC,YAAY;AAAA,IACzC,SAAS,OAAO;AAAA,GAChB;AAAA,EAED,OAAO,YAAY;AAAA,IAClB,MAAM,OAAO,IAAI;AAAA;AAAA;AAInB,eAAsB,MAAM,CAAC,SAAiB,SAAiC;AAAA,EAC9E,MAAM,mBAAmB,QAAQ,IAAI;AAAA,EACrC,IAAI,CAAC,kBAAkB;AAAA,IACtB,MAAM,IAAI,MAAM,0BAA0B;AAAA,EAC3C;AAAA,EAEA,MAAM,SAAS,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC;AAAA,EAEpD,IAAI;AAAA,IACH,IAAI,SAAS;AAAA,MACZ,MAAM,0BAA0B,YAAY;AAAA,IAC7C,EAAO;AAAA,MACN,MAAM,0BAA0B;AAAA;AAAA,YAEhC;AAAA,IACD,MAAM,OAAO,IAAI;AAAA;AAAA;",
8
+ "debugId": "BC1D53C4E8438D5E64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -76,7 +76,7 @@ interface PrintEventFilter {
76
76
  topic?: string;
77
77
  contains?: string;
78
78
  }
79
- type StreamFilter = StxTransferFilter | StxMintFilter | StxBurnFilter | StxLockFilter | FtTransferFilter | FtMintFilter | FtBurnFilter | NftTransferFilter | NftMintFilter | NftBurnFilter | ContractCallFilter | ContractDeployFilter | PrintEventFilter;
79
+ type EventFilter = StxTransferFilter | StxMintFilter | StxBurnFilter | StxLockFilter | FtTransferFilter | FtMintFilter | FtBurnFilter | NftTransferFilter | NftMintFilter | NftBurnFilter | ContractCallFilter | ContractDeployFilter | PrintEventFilter;
80
80
  declare const StxTransferFilterSchema: z.ZodType<StxTransferFilter>;
81
81
  declare const StxMintFilterSchema: z.ZodType<StxMintFilter>;
82
82
  declare const StxBurnFilterSchema: z.ZodType<StxBurnFilter>;
@@ -90,5 +90,5 @@ declare const NftBurnFilterSchema: z.ZodType<NftBurnFilter>;
90
90
  declare const ContractCallFilterSchema: z.ZodType<ContractCallFilter>;
91
91
  declare const ContractDeployFilterSchema: z.ZodType<ContractDeployFilter>;
92
92
  declare const PrintEventFilterSchema: z.ZodType<PrintEventFilter>;
93
- declare const StreamFilterSchema: z.ZodType<StreamFilter>;
94
- export { StxTransferFilterSchema, StxTransferFilter, StxMintFilterSchema, StxMintFilter, StxLockFilterSchema, StxLockFilter, StxBurnFilterSchema, StxBurnFilter, StreamFilterSchema, StreamFilter, PrintEventFilterSchema, PrintEventFilter, NftTransferFilterSchema, NftTransferFilter, NftMintFilterSchema, NftMintFilter, NftBurnFilterSchema, NftBurnFilter, FtTransferFilterSchema, FtTransferFilter, FtMintFilterSchema, FtMintFilter, FtBurnFilterSchema, FtBurnFilter, ContractDeployFilterSchema, ContractDeployFilter, ContractCallFilterSchema, ContractCallFilter };
93
+ declare const EventFilterSchema: z.ZodType<EventFilter>;
94
+ export { StxTransferFilterSchema, StxTransferFilter, StxMintFilterSchema, StxMintFilter, StxLockFilterSchema, StxLockFilter, StxBurnFilterSchema, StxBurnFilter, PrintEventFilterSchema, PrintEventFilter, NftTransferFilterSchema, NftTransferFilter, NftMintFilterSchema, NftMintFilter, NftBurnFilterSchema, NftBurnFilter, FtTransferFilterSchema, FtTransferFilter, FtMintFilterSchema, FtMintFilter, FtBurnFilterSchema, FtBurnFilter, EventFilterSchema, EventFilter, ContractDeployFilterSchema, ContractDeployFilter, ContractCallFilterSchema, ContractCallFilter };
@@ -102,7 +102,7 @@ var PrintEventFilterSchema = z.object({
102
102
  topic: z.string().optional(),
103
103
  contains: z.string().optional()
104
104
  });
105
- var StreamFilterSchema = z.discriminatedUnion("type", [
105
+ var EventFilterSchema = z.discriminatedUnion("type", [
106
106
  StxTransferFilterSchema,
107
107
  StxMintFilterSchema,
108
108
  StxBurnFilterSchema,
@@ -122,7 +122,6 @@ export {
122
122
  StxMintFilterSchema,
123
123
  StxLockFilterSchema,
124
124
  StxBurnFilterSchema,
125
- StreamFilterSchema,
126
125
  PrintEventFilterSchema,
127
126
  NftTransferFilterSchema,
128
127
  NftMintFilterSchema,
@@ -130,9 +129,10 @@ export {
130
129
  FtTransferFilterSchema,
131
130
  FtMintFilterSchema,
132
131
  FtBurnFilterSchema,
132
+ EventFilterSchema,
133
133
  ContractDeployFilterSchema,
134
134
  ContractCallFilterSchema
135
135
  };
136
136
 
137
- //# debugId=A8EC768F22E32CBD64756E2164756E21
137
+ //# debugId=DB823597308735A664756E2164756E21
138
138
  //# sourceMappingURL=filters.js.map
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/schemas/filters.ts"],
4
4
  "sourcesContent": [
5
- "import { isValidAddress as _isValidAddress } from \"@secondlayer/stacks\";\nimport { z } from \"zod/v4\";\n\nconst isValidAddress = _isValidAddress as (addr: string) => boolean;\n\n/** Validate a Stacks principal (standard or contract, e.g. SP2J...ABC or SP2J...ABC.contract-name) */\nconst stacksPrincipal = z.string().refine((val) => {\n\tconst parts = val.split(\".\");\n\tif (parts.length > 2) return false;\n\treturn isValidAddress(parts[0]!);\n}, \"Invalid Stacks principal address\");\n\n// Base filter with common fields\nconst baseFilter = {\n\t// Optional: filter by sender\n\tsender: stacksPrincipal.optional(),\n\t// Optional: filter by recipient\n\trecipient: stacksPrincipal.optional(),\n};\n\n// Type exports — defined first so they can annotate schemas\nexport interface StxTransferFilter {\n\ttype: \"stx_transfer\";\n\tsender?: string;\n\trecipient?: string;\n\tminAmount?: number;\n\tmaxAmount?: number;\n}\n\nexport interface StxMintFilter {\n\ttype: \"stx_mint\";\n\trecipient?: string;\n\tminAmount?: number;\n}\n\nexport interface StxBurnFilter {\n\ttype: \"stx_burn\";\n\tsender?: string;\n\tminAmount?: number;\n}\n\nexport interface StxLockFilter {\n\ttype: \"stx_lock\";\n\tlockedAddress?: string;\n\tminAmount?: number;\n}\n\nexport interface FtTransferFilter {\n\ttype: \"ft_transfer\";\n\tsender?: string;\n\trecipient?: string;\n\tassetIdentifier?: string;\n\tminAmount?: number;\n}\n\nexport interface FtMintFilter {\n\ttype: \"ft_mint\";\n\trecipient?: string;\n\tassetIdentifier?: string;\n\tminAmount?: number;\n}\n\nexport interface FtBurnFilter {\n\ttype: \"ft_burn\";\n\tsender?: string;\n\tassetIdentifier?: string;\n\tminAmount?: number;\n}\n\nexport interface NftTransferFilter {\n\ttype: \"nft_transfer\";\n\tsender?: string;\n\trecipient?: string;\n\tassetIdentifier?: string;\n\ttokenId?: string;\n}\n\nexport interface NftMintFilter {\n\ttype: \"nft_mint\";\n\trecipient?: string;\n\tassetIdentifier?: string;\n\ttokenId?: string;\n}\n\nexport interface NftBurnFilter {\n\ttype: \"nft_burn\";\n\tsender?: string;\n\tassetIdentifier?: string;\n\ttokenId?: string;\n}\n\nexport interface ContractCallFilter {\n\ttype: \"contract_call\";\n\tcontractId?: string;\n\tfunctionName?: string;\n\tcaller?: string;\n}\n\nexport interface ContractDeployFilter {\n\ttype: \"contract_deploy\";\n\tdeployer?: string;\n\tcontractName?: string;\n}\n\nexport interface PrintEventFilter {\n\ttype: \"print_event\";\n\tcontractId?: string;\n\ttopic?: string;\n\tcontains?: string;\n}\n\nexport type StreamFilter =\n\t| StxTransferFilter\n\t| StxMintFilter\n\t| StxBurnFilter\n\t| StxLockFilter\n\t| FtTransferFilter\n\t| FtMintFilter\n\t| FtBurnFilter\n\t| NftTransferFilter\n\t| NftMintFilter\n\t| NftBurnFilter\n\t| ContractCallFilter\n\t| ContractDeployFilter\n\t| PrintEventFilter;\n\n// STX Transfer Filter\nexport const StxTransferFilterSchema: z.ZodType<StxTransferFilter> = z.object({\n\ttype: z.literal(\"stx_transfer\"),\n\t...baseFilter,\n\t// Optional: minimum amount in microSTX\n\tminAmount: z.coerce.number().int().positive().optional(),\n\t// Optional: maximum amount in microSTX\n\tmaxAmount: z.coerce.number().int().positive().optional(),\n});\n\n// STX Mint Filter\nexport const StxMintFilterSchema: z.ZodType<StxMintFilter> = z.object({\n\ttype: z.literal(\"stx_mint\"),\n\trecipient: stacksPrincipal.optional(),\n\tminAmount: z.coerce.number().int().positive().optional(),\n});\n\n// STX Burn Filter\nexport const StxBurnFilterSchema: z.ZodType<StxBurnFilter> = z.object({\n\ttype: z.literal(\"stx_burn\"),\n\tsender: stacksPrincipal.optional(),\n\tminAmount: z.coerce.number().int().positive().optional(),\n});\n\n// STX Lock Filter\nexport const StxLockFilterSchema: z.ZodType<StxLockFilter> = z.object({\n\ttype: z.literal(\"stx_lock\"),\n\tlockedAddress: stacksPrincipal.optional(),\n\tminAmount: z.coerce.number().int().positive().optional(),\n});\n\n// FT Transfer Filter\nexport const FtTransferFilterSchema: z.ZodType<FtTransferFilter> = z.object({\n\ttype: z.literal(\"ft_transfer\"),\n\t...baseFilter,\n\t// Contract that defines the token (e.g., SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wstx)\n\tassetIdentifier: z.string().optional(),\n\tminAmount: z.coerce.number().int().positive().optional(),\n});\n\n// FT Mint Filter\nexport const FtMintFilterSchema: z.ZodType<FtMintFilter> = z.object({\n\ttype: z.literal(\"ft_mint\"),\n\trecipient: stacksPrincipal.optional(),\n\tassetIdentifier: z.string().optional(),\n\tminAmount: z.coerce.number().int().positive().optional(),\n});\n\n// FT Burn Filter\nexport const FtBurnFilterSchema: z.ZodType<FtBurnFilter> = z.object({\n\ttype: z.literal(\"ft_burn\"),\n\tsender: stacksPrincipal.optional(),\n\tassetIdentifier: z.string().optional(),\n\tminAmount: z.coerce.number().int().positive().optional(),\n});\n\n// NFT Transfer Filter\nexport const NftTransferFilterSchema: z.ZodType<NftTransferFilter> = z.object({\n\ttype: z.literal(\"nft_transfer\"),\n\t...baseFilter,\n\tassetIdentifier: z.string().optional(),\n\t// Optional: filter by specific token ID (Clarity value as hex)\n\ttokenId: z.string().optional(),\n});\n\n// NFT Mint Filter\nexport const NftMintFilterSchema: z.ZodType<NftMintFilter> = z.object({\n\ttype: z.literal(\"nft_mint\"),\n\trecipient: stacksPrincipal.optional(),\n\tassetIdentifier: z.string().optional(),\n\ttokenId: z.string().optional(),\n});\n\n// NFT Burn Filter\nexport const NftBurnFilterSchema: z.ZodType<NftBurnFilter> = z.object({\n\ttype: z.literal(\"nft_burn\"),\n\tsender: stacksPrincipal.optional(),\n\tassetIdentifier: z.string().optional(),\n\ttokenId: z.string().optional(),\n});\n\n// Contract Call Filter\nexport const ContractCallFilterSchema: z.ZodType<ContractCallFilter> = z.object(\n\t{\n\t\ttype: z.literal(\"contract_call\"),\n\t\t// Contract being called\n\t\tcontractId: stacksPrincipal.optional(),\n\t\t// Function name (supports wildcards with *)\n\t\tfunctionName: z.string().optional(),\n\t\t// Caller address\n\t\tcaller: stacksPrincipal.optional(),\n\t},\n);\n\n// Contract Deploy Filter\nexport const ContractDeployFilterSchema: z.ZodType<ContractDeployFilter> =\n\tz.object({\n\t\ttype: z.literal(\"contract_deploy\"),\n\t\t// Deployer address\n\t\tdeployer: stacksPrincipal.optional(),\n\t\t// Contract name pattern (supports wildcards)\n\t\tcontractName: z.string().optional(),\n\t});\n\n// Print Event Filter (smart contract events)\nexport const PrintEventFilterSchema: z.ZodType<PrintEventFilter> = z.object({\n\ttype: z.literal(\"print_event\"),\n\t// Contract emitting the event\n\tcontractId: stacksPrincipal.optional(),\n\t// Topic/name of the event\n\ttopic: z.string().optional(),\n\t// Search for substring in event data\n\tcontains: z.string().optional(),\n});\n\n// Union of all filter types\nexport const StreamFilterSchema: z.ZodType<StreamFilter> = z.discriminatedUnion(\n\t\"type\",\n\t[\n\t\tStxTransferFilterSchema as any,\n\t\tStxMintFilterSchema as any,\n\t\tStxBurnFilterSchema as any,\n\t\tStxLockFilterSchema as any,\n\t\tFtTransferFilterSchema as any,\n\t\tFtMintFilterSchema as any,\n\t\tFtBurnFilterSchema as any,\n\t\tNftTransferFilterSchema as any,\n\t\tNftMintFilterSchema as any,\n\t\tNftBurnFilterSchema as any,\n\t\tContractCallFilterSchema as any,\n\t\tContractDeployFilterSchema as any,\n\t\tPrintEventFilterSchema as any,\n\t],\n);\n"
5
+ "import { isValidAddress as _isValidAddress } from \"@secondlayer/stacks\";\nimport { z } from \"zod/v4\";\n\nconst isValidAddress = _isValidAddress as (addr: string) => boolean;\n\n/** Validate a Stacks principal (standard or contract, e.g. SP2J...ABC or SP2J...ABC.contract-name) */\nconst stacksPrincipal = z.string().refine((val) => {\n\tconst parts = val.split(\".\");\n\tif (parts.length > 2) return false;\n\treturn isValidAddress(parts[0]!);\n}, \"Invalid Stacks principal address\");\n\n// Base filter with common fields\nconst baseFilter = {\n\t// Optional: filter by sender\n\tsender: stacksPrincipal.optional(),\n\t// Optional: filter by recipient\n\trecipient: stacksPrincipal.optional(),\n};\n\n// Type exports — defined first so they can annotate schemas\nexport interface StxTransferFilter {\n\ttype: \"stx_transfer\";\n\tsender?: string;\n\trecipient?: string;\n\tminAmount?: number;\n\tmaxAmount?: number;\n}\n\nexport interface StxMintFilter {\n\ttype: \"stx_mint\";\n\trecipient?: string;\n\tminAmount?: number;\n}\n\nexport interface StxBurnFilter {\n\ttype: \"stx_burn\";\n\tsender?: string;\n\tminAmount?: number;\n}\n\nexport interface StxLockFilter {\n\ttype: \"stx_lock\";\n\tlockedAddress?: string;\n\tminAmount?: number;\n}\n\nexport interface FtTransferFilter {\n\ttype: \"ft_transfer\";\n\tsender?: string;\n\trecipient?: string;\n\tassetIdentifier?: string;\n\tminAmount?: number;\n}\n\nexport interface FtMintFilter {\n\ttype: \"ft_mint\";\n\trecipient?: string;\n\tassetIdentifier?: string;\n\tminAmount?: number;\n}\n\nexport interface FtBurnFilter {\n\ttype: \"ft_burn\";\n\tsender?: string;\n\tassetIdentifier?: string;\n\tminAmount?: number;\n}\n\nexport interface NftTransferFilter {\n\ttype: \"nft_transfer\";\n\tsender?: string;\n\trecipient?: string;\n\tassetIdentifier?: string;\n\ttokenId?: string;\n}\n\nexport interface NftMintFilter {\n\ttype: \"nft_mint\";\n\trecipient?: string;\n\tassetIdentifier?: string;\n\ttokenId?: string;\n}\n\nexport interface NftBurnFilter {\n\ttype: \"nft_burn\";\n\tsender?: string;\n\tassetIdentifier?: string;\n\ttokenId?: string;\n}\n\nexport interface ContractCallFilter {\n\ttype: \"contract_call\";\n\tcontractId?: string;\n\tfunctionName?: string;\n\tcaller?: string;\n}\n\nexport interface ContractDeployFilter {\n\ttype: \"contract_deploy\";\n\tdeployer?: string;\n\tcontractName?: string;\n}\n\nexport interface PrintEventFilter {\n\ttype: \"print_event\";\n\tcontractId?: string;\n\ttopic?: string;\n\tcontains?: string;\n}\n\nexport type EventFilter =\n\t| StxTransferFilter\n\t| StxMintFilter\n\t| StxBurnFilter\n\t| StxLockFilter\n\t| FtTransferFilter\n\t| FtMintFilter\n\t| FtBurnFilter\n\t| NftTransferFilter\n\t| NftMintFilter\n\t| NftBurnFilter\n\t| ContractCallFilter\n\t| ContractDeployFilter\n\t| PrintEventFilter;\n\n// STX Transfer Filter\nexport const StxTransferFilterSchema: z.ZodType<StxTransferFilter> = z.object({\n\ttype: z.literal(\"stx_transfer\"),\n\t...baseFilter,\n\t// Optional: minimum amount in microSTX\n\tminAmount: z.coerce.number().int().positive().optional(),\n\t// Optional: maximum amount in microSTX\n\tmaxAmount: z.coerce.number().int().positive().optional(),\n});\n\n// STX Mint Filter\nexport const StxMintFilterSchema: z.ZodType<StxMintFilter> = z.object({\n\ttype: z.literal(\"stx_mint\"),\n\trecipient: stacksPrincipal.optional(),\n\tminAmount: z.coerce.number().int().positive().optional(),\n});\n\n// STX Burn Filter\nexport const StxBurnFilterSchema: z.ZodType<StxBurnFilter> = z.object({\n\ttype: z.literal(\"stx_burn\"),\n\tsender: stacksPrincipal.optional(),\n\tminAmount: z.coerce.number().int().positive().optional(),\n});\n\n// STX Lock Filter\nexport const StxLockFilterSchema: z.ZodType<StxLockFilter> = z.object({\n\ttype: z.literal(\"stx_lock\"),\n\tlockedAddress: stacksPrincipal.optional(),\n\tminAmount: z.coerce.number().int().positive().optional(),\n});\n\n// FT Transfer Filter\nexport const FtTransferFilterSchema: z.ZodType<FtTransferFilter> = z.object({\n\ttype: z.literal(\"ft_transfer\"),\n\t...baseFilter,\n\t// Contract that defines the token (e.g., SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wstx)\n\tassetIdentifier: z.string().optional(),\n\tminAmount: z.coerce.number().int().positive().optional(),\n});\n\n// FT Mint Filter\nexport const FtMintFilterSchema: z.ZodType<FtMintFilter> = z.object({\n\ttype: z.literal(\"ft_mint\"),\n\trecipient: stacksPrincipal.optional(),\n\tassetIdentifier: z.string().optional(),\n\tminAmount: z.coerce.number().int().positive().optional(),\n});\n\n// FT Burn Filter\nexport const FtBurnFilterSchema: z.ZodType<FtBurnFilter> = z.object({\n\ttype: z.literal(\"ft_burn\"),\n\tsender: stacksPrincipal.optional(),\n\tassetIdentifier: z.string().optional(),\n\tminAmount: z.coerce.number().int().positive().optional(),\n});\n\n// NFT Transfer Filter\nexport const NftTransferFilterSchema: z.ZodType<NftTransferFilter> = z.object({\n\ttype: z.literal(\"nft_transfer\"),\n\t...baseFilter,\n\tassetIdentifier: z.string().optional(),\n\t// Optional: filter by specific token ID (Clarity value as hex)\n\ttokenId: z.string().optional(),\n});\n\n// NFT Mint Filter\nexport const NftMintFilterSchema: z.ZodType<NftMintFilter> = z.object({\n\ttype: z.literal(\"nft_mint\"),\n\trecipient: stacksPrincipal.optional(),\n\tassetIdentifier: z.string().optional(),\n\ttokenId: z.string().optional(),\n});\n\n// NFT Burn Filter\nexport const NftBurnFilterSchema: z.ZodType<NftBurnFilter> = z.object({\n\ttype: z.literal(\"nft_burn\"),\n\tsender: stacksPrincipal.optional(),\n\tassetIdentifier: z.string().optional(),\n\ttokenId: z.string().optional(),\n});\n\n// Contract Call Filter\nexport const ContractCallFilterSchema: z.ZodType<ContractCallFilter> = z.object(\n\t{\n\t\ttype: z.literal(\"contract_call\"),\n\t\t// Contract being called\n\t\tcontractId: stacksPrincipal.optional(),\n\t\t// Function name (supports wildcards with *)\n\t\tfunctionName: z.string().optional(),\n\t\t// Caller address\n\t\tcaller: stacksPrincipal.optional(),\n\t},\n);\n\n// Contract Deploy Filter\nexport const ContractDeployFilterSchema: z.ZodType<ContractDeployFilter> =\n\tz.object({\n\t\ttype: z.literal(\"contract_deploy\"),\n\t\t// Deployer address\n\t\tdeployer: stacksPrincipal.optional(),\n\t\t// Contract name pattern (supports wildcards)\n\t\tcontractName: z.string().optional(),\n\t});\n\n// Print Event Filter (smart contract events)\nexport const PrintEventFilterSchema: z.ZodType<PrintEventFilter> = z.object({\n\ttype: z.literal(\"print_event\"),\n\t// Contract emitting the event\n\tcontractId: stacksPrincipal.optional(),\n\t// Topic/name of the event\n\ttopic: z.string().optional(),\n\t// Search for substring in event data\n\tcontains: z.string().optional(),\n});\n\n// Union of all filter types\nexport const EventFilterSchema: z.ZodType<EventFilter> = z.discriminatedUnion(\n\t\"type\",\n\t[\n\t\tStxTransferFilterSchema as any,\n\t\tStxMintFilterSchema as any,\n\t\tStxBurnFilterSchema as any,\n\t\tStxLockFilterSchema as any,\n\t\tFtTransferFilterSchema as any,\n\t\tFtMintFilterSchema as any,\n\t\tFtBurnFilterSchema as any,\n\t\tNftTransferFilterSchema as any,\n\t\tNftMintFilterSchema as any,\n\t\tNftBurnFilterSchema as any,\n\t\tContractCallFilterSchema as any,\n\t\tContractDeployFilterSchema as any,\n\t\tPrintEventFilterSchema as any,\n\t],\n);\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "A8EC768F22E32CBD64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "DB823597308735A664756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -76,7 +76,7 @@ interface PrintEventFilter {
76
76
  topic?: string;
77
77
  contains?: string;
78
78
  }
79
- type StreamFilter = StxTransferFilter | StxMintFilter | StxBurnFilter | StxLockFilter | FtTransferFilter | FtMintFilter | FtBurnFilter | NftTransferFilter | NftMintFilter | NftBurnFilter | ContractCallFilter | ContractDeployFilter | PrintEventFilter;
79
+ type EventFilter = StxTransferFilter | StxMintFilter | StxBurnFilter | StxLockFilter | FtTransferFilter | FtMintFilter | FtBurnFilter | NftTransferFilter | NftMintFilter | NftBurnFilter | ContractCallFilter | ContractDeployFilter | PrintEventFilter;
80
80
  declare const StxTransferFilterSchema: z.ZodType<StxTransferFilter>;
81
81
  declare const StxMintFilterSchema: z.ZodType<StxMintFilter>;
82
82
  declare const StxBurnFilterSchema: z.ZodType<StxBurnFilter>;
@@ -90,7 +90,7 @@ declare const NftBurnFilterSchema: z.ZodType<NftBurnFilter>;
90
90
  declare const ContractCallFilterSchema: z.ZodType<ContractCallFilter>;
91
91
  declare const ContractDeployFilterSchema: z.ZodType<ContractDeployFilter>;
92
92
  declare const PrintEventFilterSchema: z.ZodType<PrintEventFilter>;
93
- declare const StreamFilterSchema: z.ZodType<StreamFilter>;
93
+ declare const EventFilterSchema: z.ZodType<EventFilter>;
94
94
  import { z as z2 } from "zod/v4";
95
95
  interface PublishSubgraphRequest {
96
96
  tags?: string[];
@@ -161,6 +161,8 @@ interface DeploySubgraphRequest {
161
161
  sources: Record<string, Record<string, unknown>>;
162
162
  schema: Record<string, unknown>;
163
163
  handlerCode: string;
164
+ /** Original TypeScript source, persisted so chat can read/diff/edit later. */
165
+ sourceCode?: string;
164
166
  /** @deprecated Use server auto-reindex on breaking changes instead */
165
167
  reindex?: boolean;
166
168
  }
@@ -266,101 +268,4 @@ interface SubgraphQueryParams {
266
268
  fields?: string;
267
269
  filters?: Record<string, string>;
268
270
  }
269
- import { z as z4 } from "zod/v4";
270
- interface StreamOptions {
271
- decodeClarityValues: boolean;
272
- includeRawTx: boolean;
273
- includeBlockMetadata: boolean;
274
- rateLimit: number;
275
- timeoutMs: number;
276
- maxRetries: number;
277
- }
278
- interface CreateStream {
279
- name: string;
280
- endpointUrl: string;
281
- filters: StreamFilter[];
282
- options?: StreamOptions;
283
- startBlock?: number;
284
- endBlock?: number;
285
- }
286
- interface UpdateStream {
287
- name?: string;
288
- endpointUrl?: string;
289
- filters?: StreamFilter[];
290
- options?: Partial<StreamOptions>;
291
- }
292
- interface DeliveryPayload {
293
- streamId: string;
294
- streamName: string;
295
- block: {
296
- height: number
297
- hash: string
298
- parentHash: string
299
- burnBlockHeight: number
300
- timestamp: number
301
- };
302
- matches: {
303
- transactions: Array<{
304
- txId: string
305
- type: string
306
- sender: string
307
- status: string
308
- contractId: string | null
309
- functionName: string | null
310
- rawTx?: string
311
- }>
312
- events: Array<{
313
- txId: string
314
- eventIndex: number
315
- type: string
316
- data?: any
317
- }>
318
- };
319
- isBackfill: boolean;
320
- deliveredAt: string;
321
- }
322
- interface StreamMetricsResponse {
323
- totalDeliveries: number;
324
- failedDeliveries: number;
325
- lastTriggeredAt: string | null;
326
- lastTriggeredBlock: number | null;
327
- errorMessage: string | null;
328
- }
329
- interface StreamResponse {
330
- id: string;
331
- name: string;
332
- status: "inactive" | "active" | "paused" | "failed";
333
- endpointUrl: string;
334
- filters: StreamFilter[];
335
- options: StreamOptions;
336
- totalDeliveries: number;
337
- failedDeliveries: number;
338
- lastTriggeredAt?: string | null;
339
- lastTriggeredBlock?: number | null;
340
- errorMessage?: string | null;
341
- createdAt: string;
342
- updatedAt: string;
343
- }
344
- declare const StreamOptionsSchema: z4.ZodType<StreamOptions>;
345
- declare const CreateStreamSchema: z4.ZodType<CreateStream>;
346
- declare const UpdateStreamSchema: z4.ZodType<UpdateStream>;
347
- declare const DeliveryPayloadSchema: z4.ZodType<DeliveryPayload>;
348
- declare const StreamMetricsSchema: z4.ZodType<StreamMetricsResponse>;
349
- declare const StreamResponseSchema: z4.ZodType<StreamResponse>;
350
- interface CreateStreamResponse {
351
- stream: StreamResponse;
352
- signingSecret: string;
353
- }
354
- interface ListStreamsResponse {
355
- streams: StreamResponse[];
356
- total: number;
357
- }
358
- interface BulkPauseResponse {
359
- paused: number;
360
- streams: StreamResponse[];
361
- }
362
- interface BulkResumeResponse {
363
- resumed: number;
364
- streams: StreamResponse[];
365
- }
366
- export { UpdateStreamSchema, UpdateStream, UpdateProfileRequestSchema, UpdateProfileRequest, SubgraphSyncInfo, SubgraphSummary, SubgraphQueryParams, SubgraphGapsResponse, SubgraphGapRange, SubgraphGapEntry, SubgraphDetail, StxTransferFilterSchema, StxTransferFilter, StxMintFilterSchema, StxMintFilter, StxLockFilterSchema, StxLockFilter, StxBurnFilterSchema, StxBurnFilter, StreamResponseSchema, StreamResponse, StreamOptionsSchema, StreamOptions, StreamMetricsSchema, StreamMetricsResponse, StreamFilterSchema, StreamFilter, ReindexResponse, PublishSubgraphRequestSchema, PublishSubgraphRequest, PrintEventFilterSchema, PrintEventFilter, NftTransferFilterSchema, NftTransferFilter, NftMintFilterSchema, NftMintFilter, NftBurnFilterSchema, NftBurnFilter, MarketplaceSubgraphSummary, MarketplaceSubgraphDetail, MarketplaceCreator, ListStreamsResponse, FtTransferFilterSchema, FtTransferFilter, FtMintFilterSchema, FtMintFilter, FtBurnFilterSchema, FtBurnFilter, ForkSubgraphRequestSchema, ForkSubgraphRequest, DeploySubgraphResponse, DeploySubgraphRequestSchema, DeploySubgraphRequest, DeliveryPayloadSchema, DeliveryPayload, CreatorProfile, CreateStreamSchema, CreateStreamResponse, CreateStream, ContractDeployFilterSchema, ContractDeployFilter, ContractCallFilterSchema, ContractCallFilter, BulkResumeResponse, BulkPauseResponse };
271
+ export { UpdateProfileRequestSchema, UpdateProfileRequest, SubgraphSyncInfo, SubgraphSummary, SubgraphQueryParams, SubgraphGapsResponse, SubgraphGapRange, SubgraphGapEntry, SubgraphDetail, StxTransferFilterSchema, StxTransferFilter, StxMintFilterSchema, StxMintFilter, StxLockFilterSchema, StxLockFilter, StxBurnFilterSchema, StxBurnFilter, ReindexResponse, PublishSubgraphRequestSchema, PublishSubgraphRequest, PrintEventFilterSchema, PrintEventFilter, NftTransferFilterSchema, NftTransferFilter, NftMintFilterSchema, NftMintFilter, NftBurnFilterSchema, NftBurnFilter, MarketplaceSubgraphSummary, MarketplaceSubgraphDetail, MarketplaceCreator, FtTransferFilterSchema, FtTransferFilter, FtMintFilterSchema, FtMintFilter, FtBurnFilterSchema, FtBurnFilter, ForkSubgraphRequestSchema, ForkSubgraphRequest, EventFilterSchema, EventFilter, DeploySubgraphResponse, DeploySubgraphRequestSchema, DeploySubgraphRequest, CreatorProfile, ContractDeployFilterSchema, ContractDeployFilter, ContractCallFilterSchema, ContractCallFilter };