@secondlayer/shared 6.28.1 → 6.29.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 (42) hide show
  1. package/dist/src/db/index.d.ts +40 -2
  2. package/dist/src/db/index.js +3 -1
  3. package/dist/src/db/index.js.map +3 -3
  4. package/dist/src/db/queries/chain-reorgs.d.ts +35 -1
  5. package/dist/src/db/queries/chain-reorgs.js +3 -1
  6. package/dist/src/db/queries/chain-reorgs.js.map +3 -3
  7. package/dist/src/db/queries/contracts.d.ts +35 -1
  8. package/dist/src/db/queries/integrity.d.ts +35 -1
  9. package/dist/src/db/queries/subgraph-gaps.d.ts +35 -1
  10. package/dist/src/db/queries/subgraph-operations.d.ts +35 -1
  11. package/dist/src/db/queries/subgraphs.d.ts +43 -2
  12. package/dist/src/db/queries/subgraphs.js +11 -1
  13. package/dist/src/db/queries/subgraphs.js.map +4 -4
  14. package/dist/src/db/queries/subscriptions.d.ts +35 -1
  15. package/dist/src/db/schema.d.ts +38 -2
  16. package/dist/src/errors.d.ts +11 -2
  17. package/dist/src/errors.js +13 -2
  18. package/dist/src/errors.js.map +3 -3
  19. package/dist/src/index.d.ts +62 -3
  20. package/dist/src/index.js +99 -38
  21. package/dist/src/index.js.map +6 -6
  22. package/dist/src/node/hiro-client.d.ts +15 -1
  23. package/dist/src/node/hiro-client.js +10 -1
  24. package/dist/src/node/hiro-client.js.map +3 -3
  25. package/dist/src/node/local-client.d.ts +35 -1
  26. package/dist/src/schemas/index.d.ts +10 -0
  27. package/dist/src/schemas/index.js +3 -2
  28. package/dist/src/schemas/index.js.map +3 -3
  29. package/dist/src/schemas/subgraphs.d.ts +10 -0
  30. package/dist/src/schemas/subgraphs.js +3 -2
  31. package/dist/src/schemas/subgraphs.js.map +3 -3
  32. package/dist/src/subgraphs/spec.d.ts +3 -0
  33. package/dist/src/subgraphs/spec.js +83 -36
  34. package/dist/src/subgraphs/spec.js.map +3 -3
  35. package/dist/src/x402.d.ts +38 -0
  36. package/dist/src/x402.js +74 -0
  37. package/dist/src/x402.js.map +10 -0
  38. package/migrations/0090_events_streams_filter_idx.ts +8 -0
  39. package/migrations/0091_x402_payments.ts +41 -0
  40. package/migrations/0092_subgraph_visibility.ts +33 -0
  41. package/migrations/0093_ghost_accounts.ts +47 -0
  42. package/package.json +6 -2
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/errors.ts"],
4
4
  "sourcesContent": [
5
- "export const ErrorCodes = {\n\tVALIDATION_ERROR: \"VALIDATION_ERROR\",\n\tDATABASE_ERROR: \"DATABASE_ERROR\",\n\tAUTHENTICATION_ERROR: \"AUTHENTICATION_ERROR\",\n\tAUTHORIZATION_ERROR: \"AUTHORIZATION_ERROR\",\n\tRATE_LIMIT_ERROR: \"RATE_LIMIT_ERROR\",\n\tFORBIDDEN: \"FORBIDDEN\",\n\tVERSION_CONFLICT: \"VERSION_CONFLICT\",\n\tNOT_FOUND: \"NOT_FOUND\",\n\t// Tenant lifecycle (CLI surfaces these verbatim)\n\tKEY_ROTATED: \"KEY_ROTATED\",\n\tTENANT_SUSPENDED: \"TENANT_SUSPENDED\",\n\tNO_TENANT_FOR_PROJECT: \"NO_TENANT_FOR_PROJECT\",\n\tINSTANCE_EXISTS: \"INSTANCE_EXISTS\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/**\n * Structured payload carried on a refused BYO breaking-change deploy. Single-sourced\n * here so subgraphs (thrower), api (body), sdk (typed error), and cli (renderer) all\n * agree on shape. The deploy is still refused — this only describes the manual\n * DROP + rebuild the user must run themselves.\n */\nexport interface ByoBreakingChangeDetails {\n\treasons: string[];\n\tdiff: {\n\t\taddedTables: string[];\n\t\tremovedTables: string[];\n\t\taddedColumns: Record<string, string[]>;\n\t\tbreakingChanges: string[];\n\t};\n\tplan: {\n\t\tschemaName: string;\n\t\tdropStatement: string;\n\t\tstatements: string[];\n\t\tgrantScript: string;\n\t};\n}\n\n/** Base error class for all Secondlayer errors. */\nexport class SecondLayerError extends Error {\n\tpublic code: ErrorCode;\n\tpublic override cause?: unknown;\n\t/** Optional structured payload merged into the HTTP error body (machine-readable hints). */\n\tpublic details?: Record<string, unknown>;\n\n\tconstructor(\n\t\tcode: ErrorCode,\n\t\tmessage: string,\n\t\tcause?: unknown,\n\t\tdetails?: Record<string, unknown>,\n\t) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t\tthis.cause = cause;\n\t\tthis.details = details;\n\t\tthis.name = this.constructor.name;\n\t\tError.captureStackTrace?.(this, this.constructor);\n\t}\n\n\ttoJSON(): {\n\t\tname: string;\n\t\tcode: string;\n\t\tmessage: string;\n\t\tstack: string | undefined;\n\t\tcause: unknown;\n\t\tdetails: Record<string, unknown> | undefined;\n\t} {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tcode: this.code,\n\t\t\tmessage: this.message,\n\t\t\tstack: this.stack,\n\t\t\tcause: this.cause,\n\t\t\tdetails: this.details,\n\t\t};\n\t}\n}\n\nexport class NotFoundError extends SecondLayerError {\n\tconstructor(message: string) {\n\t\tsuper(\"NOT_FOUND\", message);\n\t}\n}\n\nexport class ValidationError extends SecondLayerError {\n\tconstructor(message: string, cause?: unknown) {\n\t\tsuper(\"VALIDATION_ERROR\", message, cause);\n\t}\n}\n\nexport class DatabaseError extends SecondLayerError {\n\tconstructor(message: string, cause?: unknown) {\n\t\tsuper(\"DATABASE_ERROR\", message, cause);\n\t}\n}\n\nexport class AuthenticationError extends SecondLayerError {\n\tconstructor(message: string) {\n\t\tsuper(\"AUTHENTICATION_ERROR\", message);\n\t}\n}\n\nexport class AuthorizationError extends SecondLayerError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(\"AUTHORIZATION_ERROR\", message, undefined, details);\n\t}\n}\n\nexport class RateLimitError extends SecondLayerError {\n\tconstructor(message: string) {\n\t\tsuper(\"RATE_LIMIT_ERROR\", message);\n\t}\n}\n\nexport class ForbiddenError extends SecondLayerError {\n\tconstructor(message = \"Forbidden\") {\n\t\tsuper(\"FORBIDDEN\", message);\n\t}\n}\n\nexport class VersionConflictError extends SecondLayerError {\n\tpublic currentVersion: string;\n\tpublic expectedVersion: string;\n\n\tconstructor(currentVersion: string, expectedVersion: string) {\n\t\tsuper(\n\t\t\t\"VERSION_CONFLICT\",\n\t\t\t`Version conflict: expected ${expectedVersion}, current ${currentVersion}`,\n\t\t);\n\t\tthis.currentVersion = currentVersion;\n\t\tthis.expectedVersion = expectedVersion;\n\t}\n}\n\nexport class KeyRotatedError extends SecondLayerError {\n\tconstructor(message = \"Token has been rotated\") {\n\t\tsuper(\"KEY_ROTATED\", message);\n\t}\n}\n\nexport class TenantSuspendedError extends SecondLayerError {\n\tconstructor(message = \"Instance is suspended\") {\n\t\tsuper(\"TENANT_SUSPENDED\", message);\n\t}\n}\n\n/** Error code → HTTP status. Used by API middleware for code-based matching\n * (avoids cross-bundle instanceof failures from bunup class duplication). */\n// String literal map — codes don't have to be in the central ErrorCode\n// enum (route-local error classes can supply any code; we just map the\n// HTTP status here). This keeps cross-bundle instanceof failures out of\n// the equation.\nexport const CODE_TO_STATUS: Record<\n\tstring,\n\t400 | 401 | 403 | 404 | 409 | 422 | 423 | 429\n> = {\n\tAUTHENTICATION_ERROR: 401,\n\tAUTHORIZATION_ERROR: 403,\n\tRATE_LIMIT_ERROR: 429,\n\tFORBIDDEN: 403,\n\tNOT_FOUND: 404,\n\tVALIDATION_ERROR: 400,\n\tKEY_ROTATED: 401,\n\tTENANT_SUSPENDED: 423,\n\tNO_TENANT_FOR_PROJECT: 404,\n\tINSTANCE_EXISTS: 409,\n\tSUBGRAPH_NOT_FOUND: 404,\n\tBYO_BREAKING_CHANGE: 422,\n} as const;\n\nexport function getErrorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n"
5
+ "export const ErrorCodes = {\n\tVALIDATION_ERROR: \"VALIDATION_ERROR\",\n\tDATABASE_ERROR: \"DATABASE_ERROR\",\n\tAUTHENTICATION_ERROR: \"AUTHENTICATION_ERROR\",\n\tAUTHORIZATION_ERROR: \"AUTHORIZATION_ERROR\",\n\tRATE_LIMIT_ERROR: \"RATE_LIMIT_ERROR\",\n\tPAYMENT_REQUIRED: \"PAYMENT_REQUIRED\",\n\tFORBIDDEN: \"FORBIDDEN\",\n\tVERSION_CONFLICT: \"VERSION_CONFLICT\",\n\tNOT_FOUND: \"NOT_FOUND\",\n\t// Tenant lifecycle (CLI surfaces these verbatim)\n\tKEY_ROTATED: \"KEY_ROTATED\",\n\tTENANT_SUSPENDED: \"TENANT_SUSPENDED\",\n\tNO_TENANT_FOR_PROJECT: \"NO_TENANT_FOR_PROJECT\",\n\tINSTANCE_EXISTS: \"INSTANCE_EXISTS\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/**\n * Structured payload carried on a refused BYO breaking-change deploy. Single-sourced\n * here so subgraphs (thrower), api (body), sdk (typed error), and cli (renderer) all\n * agree on shape. The deploy is still refused — this only describes the manual\n * DROP + rebuild the user must run themselves.\n */\nexport interface ByoBreakingChangeDetails {\n\treasons: string[];\n\tdiff: {\n\t\taddedTables: string[];\n\t\tremovedTables: string[];\n\t\taddedColumns: Record<string, string[]>;\n\t\tbreakingChanges: string[];\n\t};\n\tplan: {\n\t\tschemaName: string;\n\t\tdropStatement: string;\n\t\tstatements: string[];\n\t\tgrantScript: string;\n\t};\n}\n\n/** Base error class for all Secondlayer errors. */\nexport class SecondLayerError extends Error {\n\tpublic code: ErrorCode;\n\tpublic override cause?: unknown;\n\t/** Optional structured payload merged into the HTTP error body (machine-readable hints). */\n\tpublic details?: Record<string, unknown>;\n\n\tconstructor(\n\t\tcode: ErrorCode,\n\t\tmessage: string,\n\t\tcause?: unknown,\n\t\tdetails?: Record<string, unknown>,\n\t) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t\tthis.cause = cause;\n\t\tthis.details = details;\n\t\tthis.name = this.constructor.name;\n\t\tError.captureStackTrace?.(this, this.constructor);\n\t}\n\n\ttoJSON(): {\n\t\tname: string;\n\t\tcode: string;\n\t\tmessage: string;\n\t\tstack: string | undefined;\n\t\tcause: unknown;\n\t\tdetails: Record<string, unknown> | undefined;\n\t} {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tcode: this.code,\n\t\t\tmessage: this.message,\n\t\t\tstack: this.stack,\n\t\t\tcause: this.cause,\n\t\t\tdetails: this.details,\n\t\t};\n\t}\n}\n\nexport class NotFoundError extends SecondLayerError {\n\tconstructor(message: string) {\n\t\tsuper(\"NOT_FOUND\", message);\n\t}\n}\n\nexport class ValidationError extends SecondLayerError {\n\tconstructor(message: string, cause?: unknown) {\n\t\tsuper(\"VALIDATION_ERROR\", message, cause);\n\t}\n}\n\nexport class DatabaseError extends SecondLayerError {\n\tconstructor(message: string, cause?: unknown) {\n\t\tsuper(\"DATABASE_ERROR\", message, cause);\n\t}\n}\n\nexport class AuthenticationError extends SecondLayerError {\n\tconstructor(message: string) {\n\t\tsuper(\"AUTHENTICATION_ERROR\", message);\n\t}\n}\n\nexport class AuthorizationError extends SecondLayerError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(\"AUTHORIZATION_ERROR\", message, undefined, details);\n\t}\n}\n\nexport class RateLimitError extends SecondLayerError {\n\tconstructor(message: string) {\n\t\tsuper(\"RATE_LIMIT_ERROR\", message);\n\t}\n}\n\n/**\n * HTTP 402. Carries the x402 challenge (or a retry-later reason) in `details` so\n * the global error handler emits it in the body. The wire `PAYMENT-REQUIRED`\n * header is set separately by the x402 middleware on the challenge path.\n */\nexport class PaymentRequiredError extends SecondLayerError {\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(\"PAYMENT_REQUIRED\", message, undefined, details);\n\t}\n}\n\nexport class ForbiddenError extends SecondLayerError {\n\tconstructor(message = \"Forbidden\") {\n\t\tsuper(\"FORBIDDEN\", message);\n\t}\n}\n\nexport class VersionConflictError extends SecondLayerError {\n\tpublic currentVersion: string;\n\tpublic expectedVersion: string;\n\n\tconstructor(currentVersion: string, expectedVersion: string) {\n\t\tsuper(\n\t\t\t\"VERSION_CONFLICT\",\n\t\t\t`Version conflict: expected ${expectedVersion}, current ${currentVersion}`,\n\t\t);\n\t\tthis.currentVersion = currentVersion;\n\t\tthis.expectedVersion = expectedVersion;\n\t}\n}\n\nexport class KeyRotatedError extends SecondLayerError {\n\tconstructor(message = \"Token has been rotated\") {\n\t\tsuper(\"KEY_ROTATED\", message);\n\t}\n}\n\nexport class TenantSuspendedError extends SecondLayerError {\n\tconstructor(message = \"Instance is suspended\") {\n\t\tsuper(\"TENANT_SUSPENDED\", message);\n\t}\n}\n\n/** Error code → HTTP status. Used by API middleware for code-based matching\n * (avoids cross-bundle instanceof failures from bunup class duplication). */\n// String literal map — codes don't have to be in the central ErrorCode\n// enum (route-local error classes can supply any code; we just map the\n// HTTP status here). This keeps cross-bundle instanceof failures out of\n// the equation.\nexport const CODE_TO_STATUS: Record<\n\tstring,\n\t400 | 401 | 402 | 403 | 404 | 409 | 422 | 423 | 429\n> = {\n\tAUTHENTICATION_ERROR: 401,\n\tAUTHORIZATION_ERROR: 403,\n\tPAYMENT_REQUIRED: 402,\n\tRATE_LIMIT_ERROR: 429,\n\tFORBIDDEN: 403,\n\tNOT_FOUND: 404,\n\tVALIDATION_ERROR: 400,\n\tKEY_ROTATED: 401,\n\tTENANT_SUSPENDED: 423,\n\tNO_TENANT_FOR_PROJECT: 404,\n\tINSTANCE_EXISTS: 409,\n\tSUBGRAPH_NOT_FOUND: 404,\n\tBYO_BREAKING_CHANGE: 422,\n\tPUBLIC_NAME_TAKEN: 409,\n\tGHOST_KEY_READ_ONLY: 403,\n} as const;\n\nexport function getErrorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "6DC48FDB4F1ED3CA64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "1AD62D3D4C1034E064756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -112,6 +112,7 @@ interface SubgraphsTable {
112
112
  handler_code: string | null;
113
113
  source_code: string | null;
114
114
  project_id: string | null;
115
+ visibility: Generated<string>;
115
116
  database_url_enc: ColumnType<Buffer | null, Buffer | null | undefined, Buffer | null>;
116
117
  created_at: Generated<Date>;
117
118
  updated_at: Generated<Date>;
@@ -176,7 +177,10 @@ interface ApiKeysTable {
176
177
  }
177
178
  interface AccountsTable {
178
179
  id: Generated<string>;
179
- email: string;
180
+ /** NULL for unclaimed ghost accounts (anonymous self-serve keys). */
181
+ email: string | null;
182
+ /** True for anonymous self-serve accounts until claimed via magic link. */
183
+ ghost: Generated<boolean>;
180
184
  plan: Generated<string>;
181
185
  display_name: string | null;
182
186
  bio: string | null;
@@ -196,6 +200,19 @@ interface SessionsTable {
196
200
  last_used_at: Date | null;
197
201
  created_at: Generated<Date>;
198
202
  }
203
+ /**
204
+ * One-time claim tokens for ghost accounts. The raw token only ever appears in
205
+ * the claim URL returned at mint time; we store its sha256. A used token marks
206
+ * the account as claimed (or merged into an existing account).
207
+ */
208
+ interface ClaimTokensTable {
209
+ id: Generated<string>;
210
+ account_id: string;
211
+ token_hash: string;
212
+ created_at: Generated<Date>;
213
+ expires_at: Date;
214
+ used_at: Date | null;
215
+ }
199
216
  interface MagicLinksTable {
200
217
  id: Generated<string>;
201
218
  email: string;
@@ -613,6 +630,7 @@ interface Database {
613
630
  accounts: AccountsTable;
614
631
  sessions: SessionsTable;
615
632
  magic_links: MagicLinksTable;
633
+ claim_tokens: ClaimTokensTable;
616
634
  usage_daily: UsageDailyTable;
617
635
  usage_snapshots: UsageSnapshotsTable;
618
636
  account_insights: AccountInsightsTable;
@@ -655,11 +673,27 @@ interface Database {
655
673
  bns_names: BnsNamesTable;
656
674
  bns_namespaces: BnsNamespacesTable;
657
675
  service_heartbeats: ServiceHeartbeatsTable;
676
+ x402_payments: X402PaymentsTable;
658
677
  }
659
678
  interface ServiceHeartbeatsTable {
660
679
  name: string;
661
680
  updated_at: Generated<Date>;
662
681
  }
682
+ /** x402 pay-per-request ledger (control plane). One row per settled payment,
683
+ * keyed by challenge nonce + settled txid. `state` tracks confirmed-tier
684
+ * settlement and post-serve reorg reversal. */
685
+ interface X402PaymentsTable {
686
+ id: Generated<string>;
687
+ nonce: string;
688
+ txid: string;
689
+ asset: string;
690
+ amount: string;
691
+ payer: string;
692
+ surface: string;
693
+ state: Generated<"pending" | "confirmed" | "reverted">;
694
+ created_at: Generated<Date>;
695
+ updated_at: Generated<Date>;
696
+ }
663
697
  type TenantStatus = "provisioning" | "active" | "limit_warning" | "paused_limit" | "suspended" | "error" | "deleted";
664
698
  interface TenantsTable {
665
699
  id: Generated<string>;
@@ -779,6 +813,8 @@ type Account = Selectable<AccountsTable>;
779
813
  type InsertAccount = Insertable<AccountsTable>;
780
814
  type MagicLink = Selectable<MagicLinksTable>;
781
815
  type InsertMagicLink = Insertable<MagicLinksTable>;
816
+ type ClaimToken = Selectable<ClaimTokensTable>;
817
+ type InsertClaimToken = Insertable<ClaimTokensTable>;
782
818
  type Session = Selectable<SessionsTable>;
783
819
  type InsertSession = Insertable<SessionsTable>;
784
820
  type UsageDaily = Selectable<UsageDailyTable>;
@@ -1783,6 +1819,7 @@ declare const TABLE_TO_DB: {
1783
1819
  api_keys: string
1784
1820
  sessions: string
1785
1821
  magic_links: string
1822
+ claim_tokens: string
1786
1823
  usage_daily: string
1787
1824
  usage_snapshots: string
1788
1825
  account_insights: string
@@ -1809,6 +1846,7 @@ declare const TABLE_TO_DB: {
1809
1846
  subgraph_usage_daily: string
1810
1847
  subgraph_processing_stats: string
1811
1848
  subgraph_table_snapshots: string
1849
+ x402_payments: string
1812
1850
  service_heartbeats: string
1813
1851
  };
1814
1852
  interface DbSplitStatus {
@@ -1884,6 +1922,7 @@ declare const ErrorCodes: {
1884
1922
  readonly AUTHENTICATION_ERROR: "AUTHENTICATION_ERROR"
1885
1923
  readonly AUTHORIZATION_ERROR: "AUTHORIZATION_ERROR"
1886
1924
  readonly RATE_LIMIT_ERROR: "RATE_LIMIT_ERROR"
1925
+ readonly PAYMENT_REQUIRED: "PAYMENT_REQUIRED"
1887
1926
  readonly FORBIDDEN: "FORBIDDEN"
1888
1927
  readonly VERSION_CONFLICT: "VERSION_CONFLICT"
1889
1928
  readonly NOT_FOUND: "NOT_FOUND"
@@ -1948,6 +1987,14 @@ declare class AuthorizationError extends SecondLayerError {
1948
1987
  declare class RateLimitError extends SecondLayerError {
1949
1988
  constructor(message: string);
1950
1989
  }
1990
+ /**
1991
+ * HTTP 402. Carries the x402 challenge (or a retry-later reason) in `details` so
1992
+ * the global error handler emits it in the body. The wire `PAYMENT-REQUIRED`
1993
+ * header is set separately by the x402 middleware on the challenge path.
1994
+ */
1995
+ declare class PaymentRequiredError extends SecondLayerError {
1996
+ constructor(message: string, details?: Record<string, unknown>);
1997
+ }
1951
1998
  declare class ForbiddenError extends SecondLayerError {
1952
1999
  constructor(message?: string);
1953
2000
  }
@@ -1964,7 +2011,7 @@ declare class TenantSuspendedError extends SecondLayerError {
1964
2011
  }
1965
2012
  /** Error code → HTTP status. Used by API middleware for code-based matching
1966
2013
  * (avoids cross-bundle instanceof failures from bunup class duplication). */
1967
- declare const CODE_TO_STATUS: Record<string, 400 | 401 | 403 | 404 | 409 | 422 | 423 | 429>;
2014
+ declare const CODE_TO_STATUS: Record<string, 400 | 401 | 402 | 403 | 404 | 409 | 422 | 423 | 429>;
1968
2015
  declare function getErrorMessage(err: unknown): string;
1969
2016
  declare class Logger {
1970
2017
  private _level?;
@@ -2094,12 +2141,20 @@ interface DeploySubgraphRequest {
2094
2141
  databaseUrl?: string;
2095
2142
  /** Validate the connection + print the DDL/grant plan without deploying. */
2096
2143
  dryRun?: boolean;
2144
+ /**
2145
+ * Read visibility. Server-side defaults: managed deploys → public (anon
2146
+ * reads on /v1/subgraphs, name claimed in the global public namespace);
2147
+ * BYO-database deploys → private (public reads hit the user's own
2148
+ * Postgres, so going public is an explicit choice).
2149
+ */
2150
+ visibility?: "public" | "private";
2097
2151
  }
2098
2152
  declare const DeploySubgraphRequestSchema: z3.ZodType<DeploySubgraphRequest>;
2099
2153
  interface DeploySubgraphResponse {
2100
2154
  action: "created" | "unchanged" | "handler_updated" | "updated" | "reindexed";
2101
2155
  subgraphId: string;
2102
2156
  version: string;
2157
+ visibility?: "public" | "private";
2103
2158
  message: string;
2104
2159
  operationId?: string;
2105
2160
  reindexStarted?: boolean;
@@ -2127,6 +2182,7 @@ interface SubgraphSummary {
2127
2182
  resourceWarning?: SubgraphResourceWarning;
2128
2183
  gapCount: number;
2129
2184
  integrity: "complete" | "gaps_detected";
2185
+ visibility?: "public" | "private";
2130
2186
  createdAt: string;
2131
2187
  }
2132
2188
  interface SubgraphGapRange {
@@ -2172,6 +2228,7 @@ interface SubgraphDetail {
2172
2228
  version: string;
2173
2229
  schemaHash?: string;
2174
2230
  status: string;
2231
+ visibility?: "public" | "private";
2175
2232
  lastProcessedBlock: number;
2176
2233
  description?: string;
2177
2234
  sources?: Record<string, unknown>;
@@ -2500,6 +2557,8 @@ interface SubgraphAgentSchema {
2500
2557
  tables: Record<string, {
2501
2558
  endpoint: string
2502
2559
  countEndpoint: string
2560
+ aggregateEndpoint?: string
2561
+ streamEndpoint?: string
2503
2562
  rowCount: number
2504
2563
  columns: SubgraphDetail["tables"][string]["columns"]
2505
2564
  indexes?: string[][]
@@ -2672,4 +2731,4 @@ interface ChainReorgRollbackEnvelope {
2672
2731
  }
2673
2732
  /** Any chain-subscription webhook body. Discriminate on `action`. */
2674
2733
  type ChainWebhookEnvelope = ChainApplyEnvelope | ChainReorgRollbackEnvelope;
2675
- export { validateSubscriptionFilterForTable, sql, setMigrationRole, parseJsonb, onControlPlane, onChainPlane, logger, jsonb, isPox4DecoderEnabled, getTargetDb, getSourceDb, getRawClientFor, getRawClient, getMigrationRole, getErrorMessage, getEnv, getDbSplitStatus, getDb, generateSubgraphSpec, generateSubgraphOpenApi, generateSubgraphMarkdown, generateSubgraphAgentSchema, formatSubscriptionSchemaErrors, finalizedBurnHeight, encodeStreamsCursor, exports_ed25519 as ed25519, decodeStreamsCursor, exports_hmac as crypto, closeDb, assertDbSplit, VersionConflictError, ValidationError, UsageSnapshotsTable, UsageSnapshot, UsageDailyTable, UsageDaily, UpdateTransaction, UpdateTenantUsageMonthly, UpdateTenantComputeAddon, UpdateTenant, UpdateSubscriptionRequestSchema, UpdateSubscriptionRequest, UpdateSubscriptionOutbox, UpdateSubscription, UpdateSubgraphOperation, UpdateSubgraph, UpdateProject, UpdateIndexProgress, UpdateEvent, UpdateContract, UpdateChatSession, UpdateBlock, UpdateApiKey, UpdateAccountSpendCap, TriggerEvaluatorStateTable, TriggerEvaluatorState, TransactionsTable, TransactionsArchiveTable, Transaction, TenantsTable, TenantUsageMonthlyTable, TenantUsageMonthly, TenantSuspendedError, TenantStatus, TenantComputeAddonsTable, TenantComputeAddon, Tenant, TeamMembersTable, TeamMember, TeamInvitationsTable, TeamInvitation, TABLE_TO_DB, SubscriptionsTable, SubscriptionSummary, SubscriptionStatusSchema, SubscriptionStatus, SubscriptionSchemaTables, SubscriptionSchemaTable, SubscriptionSchemaColumn, SubscriptionRuntimeSchema, SubscriptionRuntime, SubscriptionOutboxTable, SubscriptionOutbox, SubscriptionKind, SubscriptionFormatSchema, SubscriptionFormat, SubscriptionFilterSchema, SubscriptionFilterPrimitiveSchema, SubscriptionFilterPrimitive, SubscriptionFilterOperatorSchema, SubscriptionFilterOperator, SubscriptionFilterClauseSchema, SubscriptionFilterClause, SubscriptionFilter, SubscriptionDetail, SubscriptionDelivery, SubscriptionDeliveriesTable, Subscription, SubgraphsTable, SubgraphUsageDailyTable, SubgraphUsageDaily, SubgraphTableSnapshotsTable, SubgraphSyncInfo, SubgraphSummary, SubgraphSpecOptions, SubgraphSpecFormat, SubgraphResourceWarning, SubgraphQueryParams, SubgraphProcessingStatsTable, SubgraphOperationsTable, SubgraphOperationStatus, SubgraphOperationKind, SubgraphOperation, SubgraphHealthSnapshotsTable, SubgraphHealthSnapshot, SubgraphGapsTable, SubgraphGapsResponse, SubgraphGapRange, SubgraphGapEntry, SubgraphGap, SubgraphDetail, SubgraphAggregateResponse, SubgraphAggregateParams, SubgraphAgentSchema, Subgraph, StxTransferFilterSchema, StxTransferFilter, StxMintFilterSchema, StxMintFilter, StxLockFilterSchema, StxLockFilter, StxBurnFilterSchema, StxBurnFilter, StreamsEventType, StreamsDbEventType, StreamsCursor, SessionsTable, Session, ServiceHeartbeatsTable, SecondLayerError, SbtcTokenEventsTable, SbtcTokenEventType, SbtcSupplySnapshotsTable, SbtcEventsTable, SbtcEventTopic, SUBSCRIPTION_STATUSES, SUBSCRIPTION_RUNTIMES, SUBSCRIPTION_FORMATS, SUBSCRIPTION_FILTER_OPERATORS, STREAMS_TO_DB_EVENT_TYPES, STREAMS_EVENT_TYPES, STREAMS_DB_EVENT_TYPES, SOURCE_READ_TYPES, SOURCE_READ_PKS, SOURCE_READ_COLUMNS, RotateSecretResponse, ReplaySubscriptionRequestSchema, ReplaySubscriptionRequest, ReplayResult, ReindexResponse, RateLimitError, ProvisioningAuditStatus, ProvisioningAuditLogTable, ProvisioningAuditLog, ProvisioningAuditEvent, ProjectsTable, Project, ProcessedStripeEventsTable, PrintEventFilterSchema, PrintEventFilter, Pox4SignersDailyTable, Pox4FunctionName, Pox4CyclesDailyTable, Pox4CallsTable, ParsedUpdateSubscriptionRequest, ParsedReplaySubscriptionRequest, ParsedCreateSubscriptionRequest, OutboxStatus, NumericAsText, NotFoundError, NftTransferFilterSchema, NftTransferFilter, NftMintFilterSchema, NftMintFilter, NftBurnFilterSchema, NftBurnFilter, MigrationRole, MempoolTransactionsTable, MempoolTransaction, MagicLinksTable, MagicLink, L2DecoderCheckpointsTable, KeyRotatedError, InsertTransaction, InsertTenantUsageMonthly, InsertTenantComputeAddon, InsertTenant, InsertTeamMember, InsertTeamInvitation, InsertSubscriptionOutbox, InsertSubscriptionDelivery, InsertSubscription, InsertSubgraphUsageDaily, InsertSubgraphOperation, InsertSubgraphHealthSnapshot, InsertSubgraphGap, InsertSubgraph, InsertSession, InsertProvisioningAuditLog, InsertProject, InsertMempoolTransaction, InsertMagicLink, InsertIndexProgress, InsertEvent, InsertContract, InsertChatSession, InsertChatMessage, InsertBlock, InsertApiKey, InsertAccountSpendCap, InsertAccountInsight, InsertAccountAgentRun, InsertAccount, IndexProgressTable, IndexProgress, IndexPrimaryKey, IndexColumnType, IndexColumn, FtTransferFilterSchema, FtTransferFilter, FtMintFilterSchema, FtMintFilter, FtBurnFilterSchema, FtBurnFilter, ForbiddenError, EventsTable, EventsArchiveTable, EventFilterSchema, EventFilter, Event, ErrorCodes, ErrorCode, Env, EMPTY_RANGE_EVENT_INDEX_SENTINEL, DeploySubgraphResponse, DeploySubgraphRequestSchema, DeploySubgraphRequest, DeliveryRow, DecodedEventsTable, DecodedEventType, DeadRow, DeadLetterEventsTable, DbSplitStatus, DbReadRow, DbPlane, DatabaseError, Database, DEFAULT_BTC_CONFIRMATIONS, DECODED_EVENT_TYPES, DB_TO_STREAMS_EVENT_TYPE, CreateSubscriptionResponse, CreateSubscriptionRequestSchema, CreateSubscriptionRequest, ContractsTable, ContractDeployFilterSchema, ContractDeployFilter, ContractCallFilterSchema, ContractCallFilter, Contract, ChatSessionsTable, ChatSession, ChatMessagesTable, ChatMessage, ChainWebhookEnvelope, ChainReorgsTable, ChainReorgRollbackEnvelope, ChainReorgOrphanedEntry, ChainApplyEnvelope, CODE_TO_STATUS, CHAIN_TRIGGER_TYPES, CHAIN_TRIGGER_FIELDS, ByoBreakingChangeDetails, BurnBlockRewardsTable, BurnBlockRewardSlotsTable, BnsNamespacesTable, BnsNamespaceEventsTable, BnsNamespaceEventStatus, BnsNamesTable, BnsNameEventsTable, BnsNameEventTopic, BnsMarketplaceEventsTable, BnsMarketplaceAction, BlocksTable, Block, AuthorizationError, AuthenticationError, ApiKeysTable, ApiKey, AccountsTable, AccountSpendCapsTable, AccountSpendCap, AccountInsightsTable, AccountInsight, AccountAgentRunsTable, AccountAgentRun, Account };
2734
+ export { validateSubscriptionFilterForTable, sql, setMigrationRole, parseJsonb, onControlPlane, onChainPlane, logger, jsonb, isPox4DecoderEnabled, getTargetDb, getSourceDb, getRawClientFor, getRawClient, getMigrationRole, getErrorMessage, getEnv, getDbSplitStatus, getDb, generateSubgraphSpec, generateSubgraphOpenApi, generateSubgraphMarkdown, generateSubgraphAgentSchema, formatSubscriptionSchemaErrors, finalizedBurnHeight, encodeStreamsCursor, exports_ed25519 as ed25519, decodeStreamsCursor, exports_hmac as crypto, closeDb, assertDbSplit, X402PaymentsTable, VersionConflictError, ValidationError, UsageSnapshotsTable, UsageSnapshot, UsageDailyTable, UsageDaily, UpdateTransaction, UpdateTenantUsageMonthly, UpdateTenantComputeAddon, UpdateTenant, UpdateSubscriptionRequestSchema, UpdateSubscriptionRequest, UpdateSubscriptionOutbox, UpdateSubscription, UpdateSubgraphOperation, UpdateSubgraph, UpdateProject, UpdateIndexProgress, UpdateEvent, UpdateContract, UpdateChatSession, UpdateBlock, UpdateApiKey, UpdateAccountSpendCap, TriggerEvaluatorStateTable, TriggerEvaluatorState, TransactionsTable, TransactionsArchiveTable, Transaction, TenantsTable, TenantUsageMonthlyTable, TenantUsageMonthly, TenantSuspendedError, TenantStatus, TenantComputeAddonsTable, TenantComputeAddon, Tenant, TeamMembersTable, TeamMember, TeamInvitationsTable, TeamInvitation, TABLE_TO_DB, SubscriptionsTable, SubscriptionSummary, SubscriptionStatusSchema, SubscriptionStatus, SubscriptionSchemaTables, SubscriptionSchemaTable, SubscriptionSchemaColumn, SubscriptionRuntimeSchema, SubscriptionRuntime, SubscriptionOutboxTable, SubscriptionOutbox, SubscriptionKind, SubscriptionFormatSchema, SubscriptionFormat, SubscriptionFilterSchema, SubscriptionFilterPrimitiveSchema, SubscriptionFilterPrimitive, SubscriptionFilterOperatorSchema, SubscriptionFilterOperator, SubscriptionFilterClauseSchema, SubscriptionFilterClause, SubscriptionFilter, SubscriptionDetail, SubscriptionDelivery, SubscriptionDeliveriesTable, Subscription, SubgraphsTable, SubgraphUsageDailyTable, SubgraphUsageDaily, SubgraphTableSnapshotsTable, SubgraphSyncInfo, SubgraphSummary, SubgraphSpecOptions, SubgraphSpecFormat, SubgraphResourceWarning, SubgraphQueryParams, SubgraphProcessingStatsTable, SubgraphOperationsTable, SubgraphOperationStatus, SubgraphOperationKind, SubgraphOperation, SubgraphHealthSnapshotsTable, SubgraphHealthSnapshot, SubgraphGapsTable, SubgraphGapsResponse, SubgraphGapRange, SubgraphGapEntry, SubgraphGap, SubgraphDetail, SubgraphAggregateResponse, SubgraphAggregateParams, SubgraphAgentSchema, Subgraph, StxTransferFilterSchema, StxTransferFilter, StxMintFilterSchema, StxMintFilter, StxLockFilterSchema, StxLockFilter, StxBurnFilterSchema, StxBurnFilter, StreamsEventType, StreamsDbEventType, StreamsCursor, SessionsTable, Session, ServiceHeartbeatsTable, SecondLayerError, SbtcTokenEventsTable, SbtcTokenEventType, SbtcSupplySnapshotsTable, SbtcEventsTable, SbtcEventTopic, SUBSCRIPTION_STATUSES, SUBSCRIPTION_RUNTIMES, SUBSCRIPTION_FORMATS, SUBSCRIPTION_FILTER_OPERATORS, STREAMS_TO_DB_EVENT_TYPES, STREAMS_EVENT_TYPES, STREAMS_DB_EVENT_TYPES, SOURCE_READ_TYPES, SOURCE_READ_PKS, SOURCE_READ_COLUMNS, RotateSecretResponse, ReplaySubscriptionRequestSchema, ReplaySubscriptionRequest, ReplayResult, ReindexResponse, RateLimitError, ProvisioningAuditStatus, ProvisioningAuditLogTable, ProvisioningAuditLog, ProvisioningAuditEvent, ProjectsTable, Project, ProcessedStripeEventsTable, PrintEventFilterSchema, PrintEventFilter, Pox4SignersDailyTable, Pox4FunctionName, Pox4CyclesDailyTable, Pox4CallsTable, PaymentRequiredError, ParsedUpdateSubscriptionRequest, ParsedReplaySubscriptionRequest, ParsedCreateSubscriptionRequest, OutboxStatus, NumericAsText, NotFoundError, NftTransferFilterSchema, NftTransferFilter, NftMintFilterSchema, NftMintFilter, NftBurnFilterSchema, NftBurnFilter, MigrationRole, MempoolTransactionsTable, MempoolTransaction, MagicLinksTable, MagicLink, L2DecoderCheckpointsTable, KeyRotatedError, InsertTransaction, InsertTenantUsageMonthly, InsertTenantComputeAddon, InsertTenant, InsertTeamMember, InsertTeamInvitation, InsertSubscriptionOutbox, InsertSubscriptionDelivery, InsertSubscription, InsertSubgraphUsageDaily, InsertSubgraphOperation, InsertSubgraphHealthSnapshot, InsertSubgraphGap, InsertSubgraph, InsertSession, InsertProvisioningAuditLog, InsertProject, InsertMempoolTransaction, InsertMagicLink, InsertIndexProgress, InsertEvent, InsertContract, InsertClaimToken, InsertChatSession, InsertChatMessage, InsertBlock, InsertApiKey, InsertAccountSpendCap, InsertAccountInsight, InsertAccountAgentRun, InsertAccount, IndexProgressTable, IndexProgress, IndexPrimaryKey, IndexColumnType, IndexColumn, FtTransferFilterSchema, FtTransferFilter, FtMintFilterSchema, FtMintFilter, FtBurnFilterSchema, FtBurnFilter, ForbiddenError, EventsTable, EventsArchiveTable, EventFilterSchema, EventFilter, Event, ErrorCodes, ErrorCode, Env, EMPTY_RANGE_EVENT_INDEX_SENTINEL, DeploySubgraphResponse, DeploySubgraphRequestSchema, DeploySubgraphRequest, DeliveryRow, DecodedEventsTable, DecodedEventType, DeadRow, DeadLetterEventsTable, DbSplitStatus, DbReadRow, DbPlane, DatabaseError, Database, DEFAULT_BTC_CONFIRMATIONS, DECODED_EVENT_TYPES, DB_TO_STREAMS_EVENT_TYPE, CreateSubscriptionResponse, CreateSubscriptionRequestSchema, CreateSubscriptionRequest, ContractsTable, ContractDeployFilterSchema, ContractDeployFilter, ContractCallFilterSchema, ContractCallFilter, Contract, ClaimTokensTable, ClaimToken, ChatSessionsTable, ChatSession, ChatMessagesTable, ChatMessage, ChainWebhookEnvelope, ChainReorgsTable, ChainReorgRollbackEnvelope, ChainReorgOrphanedEntry, ChainApplyEnvelope, CODE_TO_STATUS, CHAIN_TRIGGER_TYPES, CHAIN_TRIGGER_FIELDS, ByoBreakingChangeDetails, BurnBlockRewardsTable, BurnBlockRewardSlotsTable, BnsNamespacesTable, BnsNamespaceEventsTable, BnsNamespaceEventStatus, BnsNamesTable, BnsNameEventsTable, BnsNameEventTopic, BnsMarketplaceEventsTable, BnsMarketplaceAction, BlocksTable, Block, AuthorizationError, AuthenticationError, ApiKeysTable, ApiKey, AccountsTable, AccountSpendCapsTable, AccountSpendCap, AccountInsightsTable, AccountInsight, AccountAgentRunsTable, AccountAgentRun, Account };
package/dist/src/index.js CHANGED
@@ -672,6 +672,7 @@ var TABLE_TO_DB = {
672
672
  api_keys: "target",
673
673
  sessions: "target",
674
674
  magic_links: "target",
675
+ claim_tokens: "target",
675
676
  usage_daily: "target",
676
677
  usage_snapshots: "target",
677
678
  account_insights: "target",
@@ -698,6 +699,7 @@ var TABLE_TO_DB = {
698
699
  subgraph_usage_daily: "target",
699
700
  subgraph_processing_stats: "target",
700
701
  subgraph_table_snapshots: "target",
702
+ x402_payments: "target",
701
703
  service_heartbeats: "both"
702
704
  };
703
705
 
@@ -864,6 +866,7 @@ var ErrorCodes = {
864
866
  AUTHENTICATION_ERROR: "AUTHENTICATION_ERROR",
865
867
  AUTHORIZATION_ERROR: "AUTHORIZATION_ERROR",
866
868
  RATE_LIMIT_ERROR: "RATE_LIMIT_ERROR",
869
+ PAYMENT_REQUIRED: "PAYMENT_REQUIRED",
867
870
  FORBIDDEN: "FORBIDDEN",
868
871
  VERSION_CONFLICT: "VERSION_CONFLICT",
869
872
  NOT_FOUND: "NOT_FOUND",
@@ -933,6 +936,12 @@ class RateLimitError extends SecondLayerError {
933
936
  }
934
937
  }
935
938
 
939
+ class PaymentRequiredError extends SecondLayerError {
940
+ constructor(message, details) {
941
+ super("PAYMENT_REQUIRED", message, undefined, details);
942
+ }
943
+ }
944
+
936
945
  class ForbiddenError extends SecondLayerError {
937
946
  constructor(message = "Forbidden") {
938
947
  super("FORBIDDEN", message);
@@ -963,6 +972,7 @@ class TenantSuspendedError extends SecondLayerError {
963
972
  var CODE_TO_STATUS = {
964
973
  AUTHENTICATION_ERROR: 401,
965
974
  AUTHORIZATION_ERROR: 403,
975
+ PAYMENT_REQUIRED: 402,
966
976
  RATE_LIMIT_ERROR: 429,
967
977
  FORBIDDEN: 403,
968
978
  NOT_FOUND: 404,
@@ -972,7 +982,9 @@ var CODE_TO_STATUS = {
972
982
  NO_TENANT_FOR_PROJECT: 404,
973
983
  INSTANCE_EXISTS: 409,
974
984
  SUBGRAPH_NOT_FOUND: 404,
975
- BYO_BREAKING_CHANGE: 422
985
+ BYO_BREAKING_CHANGE: 422,
986
+ PUBLIC_NAME_TAKEN: 409,
987
+ GHOST_KEY_READ_ONLY: 403
976
988
  };
977
989
  function getErrorMessage(err) {
978
990
  return err instanceof Error ? err.message : String(err);
@@ -1094,7 +1106,8 @@ var DeploySubgraphRequestSchema = z3.object({
1094
1106
  startBlock: z3.number().int().nonnegative().optional(),
1095
1107
  sourceCode: z3.string().max(1048576, "source code exceeds 1MB limit").optional(),
1096
1108
  databaseUrl: z3.string().url().refine((u) => u.startsWith("postgres://") || u.startsWith("postgresql://"), "must be a postgres:// connection string").optional(),
1097
- dryRun: z3.boolean().optional()
1109
+ dryRun: z3.boolean().optional(),
1110
+ visibility: z3.enum(["public", "private"]).optional()
1098
1111
  });
1099
1112
 
1100
1113
  // src/schemas/subscriptions.ts
@@ -1414,18 +1427,23 @@ function validateSubscriptionFilterForTable(input) {
1414
1427
  // src/subgraphs/spec.ts
1415
1428
  var SYSTEM_COLUMNS = ["_id", "_block_height", "_tx_id", "_created_at"];
1416
1429
  var BASE_QUERY_PARAMS = ["_limit", "_offset", "_sort", "_order", "_fields"];
1430
+ var PUBLIC_BASE_QUERY_PARAMS = ["_limit", "cursor", "_order", "_fields"];
1417
1431
  var COMPARISON_OPS = ["neq", "gt", "gte", "lt", "lte"];
1432
+ function isPublicRead(detail) {
1433
+ return detail.visibility === "public";
1434
+ }
1418
1435
  function generatedAt(options) {
1419
1436
  return options.generatedAt ?? new Date().toISOString();
1420
1437
  }
1421
1438
  function normalizeServerUrl(serverUrl) {
1422
1439
  return (serverUrl ?? "https://api.secondlayer.tools").replace(/\/+$/, "");
1423
1440
  }
1424
- function tablePath(subgraphName, tableName) {
1425
- return `/api/subgraphs/${subgraphName}/${tableName}`;
1441
+ function tablePath(subgraphName, tableName, publicRead) {
1442
+ const base = publicRead ? "/v1/subgraphs" : "/api/subgraphs";
1443
+ return `${base}/${subgraphName}/${tableName}`;
1426
1444
  }
1427
- function countPath(subgraphName, tableName) {
1428
- return `${tablePath(subgraphName, tableName)}/count`;
1445
+ function countPath(subgraphName, tableName, publicRead) {
1446
+ return `${tablePath(subgraphName, tableName, publicRead)}/count`;
1429
1447
  }
1430
1448
  function isTextLike(type) {
1431
1449
  return type === "text" || type === "principal" || type === "timestamp";
@@ -1512,8 +1530,8 @@ function filterNames(table) {
1512
1530
  }
1513
1531
  return result;
1514
1532
  }
1515
- function queryParameters(table) {
1516
- const params = [...BASE_QUERY_PARAMS];
1533
+ function queryParameters(table, publicRead) {
1534
+ const params = publicRead ? [...PUBLIC_BASE_QUERY_PARAMS] : [...BASE_QUERY_PARAMS];
1517
1535
  if (searchableColumns(table).length > 0)
1518
1536
  params.push("_search");
1519
1537
  return params;
@@ -1534,8 +1552,24 @@ function openApiParameter(name2, description, schema = { type: "string" }) {
1534
1552
  schema
1535
1553
  };
1536
1554
  }
1537
- function tableParameters(table) {
1538
- const parameters = [
1555
+ function tableParameters(table, publicRead) {
1556
+ const parameters = publicRead ? [
1557
+ openApiParameter("_limit", "Maximum rows to return.", {
1558
+ type: "integer",
1559
+ default: 50,
1560
+ minimum: 1,
1561
+ maximum: 1000
1562
+ }),
1563
+ openApiParameter("cursor", "Resume token from next_cursor (keyset pagination on _id).", { type: "string" }),
1564
+ openApiParameter("_order", "Sort direction (_id keyset).", {
1565
+ type: "string",
1566
+ enum: ["asc", "desc"],
1567
+ default: "asc"
1568
+ }),
1569
+ openApiParameter("_fields", "Comma-separated columns to include.", {
1570
+ type: "string"
1571
+ })
1572
+ ] : [
1539
1573
  openApiParameter("_limit", "Maximum rows to return.", {
1540
1574
  type: "integer",
1541
1575
  default: 50,
@@ -1589,19 +1623,24 @@ function tableParameters(table) {
1589
1623
  }
1590
1624
  function generateSubgraphAgentSchema(detail, options = {}) {
1591
1625
  const serverUrl = normalizeServerUrl(options.serverUrl);
1626
+ const publicRead = isPublicRead(detail);
1592
1627
  const tables = {};
1593
1628
  for (const [tableName, table] of Object.entries(detail.tables)) {
1594
- const path = tablePath(detail.name, tableName);
1629
+ const path = tablePath(detail.name, tableName, publicRead);
1595
1630
  tables[tableName] = {
1596
1631
  endpoint: `${serverUrl}${path}`,
1597
- countEndpoint: `${serverUrl}${countPath(detail.name, tableName)}`,
1632
+ countEndpoint: `${serverUrl}${countPath(detail.name, tableName, publicRead)}`,
1633
+ ...publicRead ? {
1634
+ aggregateEndpoint: `${serverUrl}${path}/aggregate`,
1635
+ streamEndpoint: `${serverUrl}${path}/stream`
1636
+ } : {},
1598
1637
  rowCount: table.rowCount,
1599
1638
  columns: table.columns,
1600
1639
  ...table.indexes ? { indexes: table.indexes } : {},
1601
1640
  ...table.uniqueKeys ? { uniqueKeys: table.uniqueKeys } : {},
1602
1641
  query: {
1603
- parameters: queryParameters(table),
1604
- sortable: selectableColumns(table),
1642
+ parameters: queryParameters(table, publicRead),
1643
+ sortable: publicRead ? [] : selectableColumns(table),
1605
1644
  selectable: selectableColumns(table),
1606
1645
  searchable: searchableColumns(table),
1607
1646
  filters: filterNames(table)
@@ -1609,7 +1648,7 @@ function generateSubgraphAgentSchema(detail, options = {}) {
1609
1648
  examples: {
1610
1649
  list: rowExample(table),
1611
1650
  count: { count: table.rowCount },
1612
- curl: `curl '${serverUrl}${path}?_limit=10&_sort=_block_height&_order=desc'`
1651
+ curl: publicRead ? `curl '${serverUrl}${path}?_limit=10&_order=desc'` : `curl '${serverUrl}${path}?_limit=10&_sort=_block_height&_order=desc'`
1613
1652
  }
1614
1653
  };
1615
1654
  }
@@ -1626,6 +1665,7 @@ function generateSubgraphAgentSchema(detail, options = {}) {
1626
1665
  }
1627
1666
  function generateSubgraphOpenApi(detail, options = {}) {
1628
1667
  const serverUrl = normalizeServerUrl(options.serverUrl);
1668
+ const publicRead = isPublicRead(detail);
1629
1669
  const paths = {};
1630
1670
  const schemas = {};
1631
1671
  for (const [tableName, table] of Object.entries(detail.tables)) {
@@ -1643,44 +1683,62 @@ function generateSubgraphOpenApi(detail, options = {}) {
1643
1683
  required,
1644
1684
  example: rowExample(table)
1645
1685
  };
1646
- paths[tablePath(detail.name, tableName)] = {
1686
+ const responseSchema = publicRead ? {
1687
+ type: "object",
1688
+ properties: {
1689
+ rows: {
1690
+ type: "array",
1691
+ items: { $ref: `#/components/schemas/${schemaName}` }
1692
+ },
1693
+ next_cursor: { type: ["string", "null"] },
1694
+ tip: {
1695
+ type: "object",
1696
+ properties: {
1697
+ block_height: { type: "integer" },
1698
+ subgraph_height: { type: "integer" },
1699
+ blocks_behind: { type: "integer" }
1700
+ }
1701
+ }
1702
+ }
1703
+ } : {
1704
+ type: "object",
1705
+ properties: {
1706
+ data: {
1707
+ type: "array",
1708
+ items: { $ref: `#/components/schemas/${schemaName}` }
1709
+ },
1710
+ meta: {
1711
+ type: "object",
1712
+ properties: {
1713
+ total: { type: "integer" },
1714
+ limit: { type: "integer" },
1715
+ offset: { type: "integer" }
1716
+ }
1717
+ }
1718
+ }
1719
+ };
1720
+ paths[tablePath(detail.name, tableName, publicRead)] = {
1647
1721
  get: {
1648
1722
  summary: `Query ${detail.name}.${tableName}`,
1649
1723
  operationId: `query_${detail.name.replace(/-/g, "_")}_${tableName}`,
1650
- parameters: tableParameters(table),
1724
+ parameters: tableParameters(table, publicRead),
1651
1725
  responses: {
1652
1726
  "200": {
1653
1727
  description: "Rows returned from the subgraph table.",
1654
1728
  content: {
1655
1729
  "application/json": {
1656
- schema: {
1657
- type: "object",
1658
- properties: {
1659
- data: {
1660
- type: "array",
1661
- items: { $ref: `#/components/schemas/${schemaName}` }
1662
- },
1663
- meta: {
1664
- type: "object",
1665
- properties: {
1666
- total: { type: "integer" },
1667
- limit: { type: "integer" },
1668
- offset: { type: "integer" }
1669
- }
1670
- }
1671
- }
1672
- }
1730
+ schema: responseSchema
1673
1731
  }
1674
1732
  }
1675
1733
  }
1676
1734
  }
1677
1735
  }
1678
1736
  };
1679
- paths[countPath(detail.name, tableName)] = {
1737
+ paths[countPath(detail.name, tableName, publicRead)] = {
1680
1738
  get: {
1681
1739
  summary: `Count ${detail.name}.${tableName}`,
1682
1740
  operationId: `count_${detail.name.replace(/-/g, "_")}_${tableName}`,
1683
- parameters: tableParameters(table),
1741
+ parameters: tableParameters(table, publicRead),
1684
1742
  responses: {
1685
1743
  "200": {
1686
1744
  description: "Row count for the filtered table query.",
@@ -1719,17 +1777,19 @@ function generateSubgraphOpenApi(detail, options = {}) {
1719
1777
  }
1720
1778
  function generateSubgraphMarkdown(detail, options = {}) {
1721
1779
  const agent = generateSubgraphAgentSchema(detail, options);
1780
+ const publicRead = isPublicRead(detail);
1722
1781
  const lines = [
1723
1782
  `# ${detail.name} Subgraph API`,
1724
1783
  "",
1725
1784
  `Version: ${detail.version}`,
1726
1785
  detail.schemaHash ? `Schema hash: ${detail.schemaHash}` : undefined,
1727
1786
  `Server: ${agent.serverUrl}`,
1787
+ publicRead ? "Visibility: public — anon reads, no API key. Responses use the `{ rows, next_cursor, tip }` envelope; paginate with `?cursor=<next_cursor>` and `_order=asc|desc` (`_offset`/`_sort` are rejected)." : undefined,
1728
1788
  "",
1729
1789
  detail.description
1730
1790
  ].filter((line) => line !== undefined && line !== "");
1731
1791
  for (const [tableName, table] of Object.entries(agent.tables)) {
1732
- lines.push("", `## ${tableName}`, "", `GET ${table.endpoint}`, `GET ${table.countEndpoint}`, "", `Rows: ${table.rowCount}`, "", "### Columns", "", "| Column | Type | Attributes |", "| --- | --- | --- |");
1792
+ lines.push("", `## ${tableName}`, "", `GET ${table.endpoint}`, `GET ${table.countEndpoint}`, ...table.aggregateEndpoint ? [`GET ${table.aggregateEndpoint}`] : [], ...table.streamEndpoint ? [`GET ${table.streamEndpoint} (SSE)`] : [], "", `Rows: ${table.rowCount}`, "", "### Columns", "", "| Column | Type | Attributes |", "| --- | --- | --- |");
1733
1793
  for (const [columnName, col] of Object.entries(table.columns)) {
1734
1794
  const attrs = [
1735
1795
  SYSTEM_COLUMNS.includes(columnName) ? "system" : undefined,
@@ -2007,6 +2067,7 @@ export {
2007
2067
  ReplaySubscriptionRequestSchema,
2008
2068
  RateLimitError,
2009
2069
  PrintEventFilterSchema,
2070
+ PaymentRequiredError,
2010
2071
  NotFoundError,
2011
2072
  NftTransferFilterSchema,
2012
2073
  NftMintFilterSchema,
@@ -2034,5 +2095,5 @@ export {
2034
2095
  AuthenticationError
2035
2096
  };
2036
2097
 
2037
- //# debugId=C4E916AE70681E9064756E2164756E21
2098
+ //# debugId=0BB6C7F6F5DA455A64756E2164756E21
2038
2099
  //# sourceMappingURL=index.js.map