@secondlayer/shared 10.0.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/src/archive/range-digest.d.ts +15 -0
  2. package/dist/src/archive/semantic-digest-builder.d.ts +15 -0
  3. package/dist/src/coverage/index.d.ts +15 -0
  4. package/dist/src/crypto/secrets.js.map +2 -2
  5. package/dist/src/db/index.d.ts +20 -1
  6. package/dist/src/db/index.js +2 -1
  7. package/dist/src/db/index.js.map +5 -5
  8. package/dist/src/db/queries/chain-reorgs.d.ts +15 -0
  9. package/dist/src/db/queries/chain-reorgs.js +2 -1
  10. package/dist/src/db/queries/chain-reorgs.js.map +5 -5
  11. package/dist/src/db/queries/contracts.d.ts +15 -0
  12. package/dist/src/db/queries/instance.d.ts +15 -0
  13. package/dist/src/db/queries/integrity.d.ts +15 -0
  14. package/dist/src/db/queries/subgraph-gaps.d.ts +15 -0
  15. package/dist/src/db/queries/subgraph-operations.d.ts +15 -0
  16. package/dist/src/db/queries/subgraphs.d.ts +16 -8
  17. package/dist/src/db/queries/subgraphs.js +1 -9
  18. package/dist/src/db/queries/subgraphs.js.map +4 -4
  19. package/dist/src/db/queries/subscriptions.d.ts +15 -0
  20. package/dist/src/db/queries/subscriptions.js.map +2 -2
  21. package/dist/src/db/queries/sync-scope.d.ts +15 -0
  22. package/dist/src/db/schema.d.ts +19 -1
  23. package/dist/src/errors.d.ts +5 -2
  24. package/dist/src/errors.js +5 -5
  25. package/dist/src/errors.js.map +3 -3
  26. package/dist/src/index.d.ts +34 -9
  27. package/dist/src/index.js +13 -13
  28. package/dist/src/index.js.map +8 -8
  29. package/dist/src/mode.d.ts +4 -3
  30. package/dist/src/mode.js.map +2 -2
  31. package/dist/src/node/local-client.d.ts +15 -0
  32. package/dist/src/runtime/index.js +2 -2
  33. package/dist/src/runtime/index.js.map +3 -3
  34. package/dist/src/schemas/index.d.ts +0 -6
  35. package/dist/src/schemas/index.js +2 -3
  36. package/dist/src/schemas/index.js.map +3 -3
  37. package/dist/src/schemas/subgraphs.d.ts +0 -6
  38. package/dist/src/schemas/subgraphs.js +2 -3
  39. package/dist/src/schemas/subgraphs.js.map +3 -3
  40. package/dist/src/subgraphs/spec.d.ts +9 -0
  41. package/dist/src/subgraphs/spec.js +7 -7
  42. package/dist/src/subgraphs/spec.js.map +3 -3
  43. package/migrations/0121_archive_fetches.ts +49 -0
  44. package/package.json +1 -1
@@ -19,14 +19,14 @@ var SYSTEM_COLUMNS = ["_id", "_block_height", "_tx_id", "_created_at"];
19
19
  var BASE_QUERY_PARAMS = ["_limit", "_offset", "_sort", "_order", "_fields"];
20
20
  var PUBLIC_BASE_QUERY_PARAMS = ["_limit", "cursor", "_order", "_fields"];
21
21
  var COMPARISON_OPS = ["neq", "gt", "gte", "lt", "lte"];
22
- function isPublicRead(detail) {
23
- return detail.visibility === "public";
22
+ function isPublicRead(detail, options) {
23
+ return options.forcePublicRead ?? detail.visibility === "public";
24
24
  }
25
25
  function generatedAt(options) {
26
26
  return options.generatedAt ?? new Date().toISOString();
27
27
  }
28
28
  function normalizeServerUrl(serverUrl) {
29
- return (serverUrl ?? "https://api.secondlayer.tools").replace(/\/+$/, "");
29
+ return (serverUrl ?? "http://127.0.0.1:3800").replace(/\/+$/, "");
30
30
  }
31
31
  function tablePath(subgraphName, tableName, publicRead) {
32
32
  const base = publicRead ? "/v1/subgraphs" : "/api/subgraphs";
@@ -213,7 +213,7 @@ function tableParameters(table, publicRead) {
213
213
  }
214
214
  function generateSubgraphAgentSchema(detail, options = {}) {
215
215
  const serverUrl = normalizeServerUrl(options.serverUrl);
216
- const publicRead = isPublicRead(detail);
216
+ const publicRead = isPublicRead(detail, options);
217
217
  const tables = {};
218
218
  for (const [tableName, table] of Object.entries(detail.tables)) {
219
219
  const path = tablePath(detail.name, tableName, publicRead);
@@ -255,7 +255,7 @@ function generateSubgraphAgentSchema(detail, options = {}) {
255
255
  }
256
256
  function generateSubgraphOpenApi(detail, options = {}) {
257
257
  const serverUrl = normalizeServerUrl(options.serverUrl);
258
- const publicRead = isPublicRead(detail);
258
+ const publicRead = isPublicRead(detail, options);
259
259
  const paths = {};
260
260
  const schemas = {};
261
261
  for (const [tableName, table] of Object.entries(detail.tables)) {
@@ -367,7 +367,7 @@ function generateSubgraphOpenApi(detail, options = {}) {
367
367
  }
368
368
  function generateSubgraphMarkdown(detail, options = {}) {
369
369
  const agent = generateSubgraphAgentSchema(detail, options);
370
- const publicRead = isPublicRead(detail);
370
+ const publicRead = isPublicRead(detail, options);
371
371
  const lines = [
372
372
  `# ${detail.name} Subgraph API`,
373
373
  "",
@@ -409,5 +409,5 @@ export {
409
409
  generateSubgraphAgentSchema
410
410
  };
411
411
 
412
- //# debugId=948E6C1DD2B5F6FC64756E2164756E21
412
+ //# debugId=99B028147A21173164756E2164756E21
413
413
  //# sourceMappingURL=spec.js.map
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/subgraphs/spec.ts"],
4
4
  "sourcesContent": [
5
- "import type { SubgraphDetail } from \"../schemas/subgraphs.ts\";\n\nexport type SubgraphSpecFormat = \"openapi\" | \"agent\" | \"markdown\";\n\nexport interface SubgraphSpecOptions {\n\tserverUrl?: string;\n\tgeneratedAt?: string;\n}\n\nexport interface SubgraphAgentSchema {\n\tname: string;\n\tversion: string;\n\tdescription?: string;\n\tschemaHash?: string;\n\tgeneratedAt: string;\n\tserverUrl: string;\n\tsources?: Record<string, unknown>;\n\ttables: Record<\n\t\tstring,\n\t\t{\n\t\t\tendpoint: string;\n\t\t\tcountEndpoint: string;\n\t\t\taggregateEndpoint?: string;\n\t\t\tstreamEndpoint?: string;\n\t\t\trowCount: number;\n\t\t\tcolumns: SubgraphDetail[\"tables\"][string][\"columns\"];\n\t\t\tindexes?: readonly (readonly string[])[];\n\t\t\tuniqueKeys?: readonly (readonly string[])[];\n\t\t\tquery: {\n\t\t\t\tparameters: string[];\n\t\t\t\tsortable: string[];\n\t\t\t\tselectable: string[];\n\t\t\t\tsearchable: string[];\n\t\t\t\tfilters: string[];\n\t\t\t};\n\t\t\texamples: {\n\t\t\t\tlist: Record<string, unknown>;\n\t\t\t\tcount: { count: number };\n\t\t\t\tcurl: string;\n\t\t\t};\n\t\t}\n\t>;\n}\n\ntype ColumnMeta = SubgraphDetail[\"tables\"][string][\"columns\"][string];\n\nconst SYSTEM_COLUMNS = [\"_id\", \"_block_height\", \"_tx_id\", \"_created_at\"];\nconst BASE_QUERY_PARAMS = [\"_limit\", \"_offset\", \"_sort\", \"_order\", \"_fields\"];\n// /v1 rejects _offset/_sort: keyset pagination via cursor + _order only.\nconst PUBLIC_BASE_QUERY_PARAMS = [\"_limit\", \"cursor\", \"_order\", \"_fields\"];\nconst COMPARISON_OPS = [\"neq\", \"gt\", \"gte\", \"lt\", \"lte\"];\n\nfunction isPublicRead(detail: SubgraphDetail): boolean {\n\treturn detail.visibility === \"public\";\n}\n\nfunction generatedAt(options: SubgraphSpecOptions): string {\n\treturn options.generatedAt ?? new Date().toISOString();\n}\n\nfunction normalizeServerUrl(serverUrl?: string): string {\n\treturn (serverUrl ?? \"https://api.secondlayer.tools\").replace(/\\/+$/, \"\");\n}\n\nfunction tablePath(\n\tsubgraphName: string,\n\ttableName: string,\n\tpublicRead: boolean,\n): string {\n\tconst base = publicRead ? \"/v1/subgraphs\" : \"/api/subgraphs\";\n\treturn `${base}/${subgraphName}/${tableName}`;\n}\n\nfunction countPath(\n\tsubgraphName: string,\n\ttableName: string,\n\tpublicRead: boolean,\n): string {\n\treturn `${tablePath(subgraphName, tableName, publicRead)}/count`;\n}\n\nfunction isTextLike(type: string): boolean {\n\treturn type === \"text\" || type === \"principal\" || type === \"timestamp\";\n}\n\nfunction isComparable(type: string): boolean {\n\treturn (\n\t\ttype === \"uint\" ||\n\t\ttype === \"int\" ||\n\t\ttype === \"bigint\" ||\n\t\ttype === \"serial\" ||\n\t\ttype === \"timestamp\"\n\t);\n}\n\nfunction exampleForColumn(type: string): unknown {\n\tswitch (type) {\n\t\tcase \"uint\":\n\t\tcase \"int\":\n\t\tcase \"bigint\":\n\t\t\treturn \"1000\";\n\t\tcase \"serial\":\n\t\t\treturn 1;\n\t\tcase \"principal\":\n\t\t\treturn \"SP000000000000000000002Q6VF78\";\n\t\tcase \"timestamp\":\n\t\t\treturn \"2026-01-01T00:00:00.000Z\";\n\t\tcase \"boolean\":\n\t\t\treturn true;\n\t\tcase \"jsonb\":\n\t\t\treturn { example: true };\n\t\tdefault:\n\t\t\treturn \"example\";\n\t}\n}\n\nfunction openApiSchemaForColumn(col: ColumnMeta): Record<string, unknown> {\n\tlet schema: Record<string, unknown>;\n\tswitch (col.type) {\n\t\tcase \"uint\":\n\t\tcase \"int\":\n\t\tcase \"bigint\":\n\t\t\tschema = { type: \"string\", pattern: \"^-?\\\\d+(\\\\.\\\\d+)?$\" };\n\t\t\tbreak;\n\t\tcase \"serial\":\n\t\t\tschema = { type: \"integer\" };\n\t\t\tbreak;\n\t\tcase \"principal\":\n\t\tcase \"text\":\n\t\t\tschema = { type: \"string\" };\n\t\t\tbreak;\n\t\tcase \"timestamp\":\n\t\t\tschema = { type: \"string\", format: \"date-time\" };\n\t\t\tbreak;\n\t\tcase \"boolean\":\n\t\t\tschema = { type: \"boolean\" };\n\t\t\tbreak;\n\t\tcase \"jsonb\":\n\t\t\tschema = { type: \"object\", additionalProperties: true };\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tschema = {};\n\t\t\tbreak;\n\t}\n\tif (col.nullable) {\n\t\tconst type = schema.type;\n\t\tif (typeof type === \"string\") schema.type = [type, \"null\"];\n\t}\n\treturn schema;\n}\n\nfunction columnEntries(table: SubgraphDetail[\"tables\"][string]) {\n\treturn Object.entries(table.columns);\n}\n\nfunction selectableColumns(table: SubgraphDetail[\"tables\"][string]): string[] {\n\treturn columnEntries(table).map(([name]) => name);\n}\n\nfunction searchableColumns(table: SubgraphDetail[\"tables\"][string]): string[] {\n\treturn columnEntries(table)\n\t\t.filter(([, col]) => col.searchable)\n\t\t.map(([name]) => name);\n}\n\nfunction filterNames(table: SubgraphDetail[\"tables\"][string]): string[] {\n\tconst result: string[] = [];\n\tfor (const [name, col] of columnEntries(table)) {\n\t\tresult.push(name);\n\t\tresult.push(`${name}.neq`);\n\t\tif (isComparable(col.type)) {\n\t\t\tfor (const op of COMPARISON_OPS.filter((op) => op !== \"neq\")) {\n\t\t\t\tresult.push(`${name}.${op}`);\n\t\t\t}\n\t\t}\n\t\tif (isTextLike(col.type)) result.push(`${name}.like`);\n\t}\n\treturn result;\n}\n\nfunction queryParameters(\n\ttable: SubgraphDetail[\"tables\"][string],\n\tpublicRead: boolean,\n): string[] {\n\tconst params = publicRead\n\t\t? [...PUBLIC_BASE_QUERY_PARAMS]\n\t\t: [...BASE_QUERY_PARAMS];\n\tif (searchableColumns(table).length > 0) params.push(\"_search\");\n\treturn params;\n}\n\nfunction rowExample(table: SubgraphDetail[\"tables\"][string]) {\n\tconst row: Record<string, unknown> = {};\n\tfor (const [name, col] of columnEntries(table)) {\n\t\trow[name] = exampleForColumn(col.type);\n\t}\n\treturn row;\n}\n\nfunction openApiParameter(\n\tname: string,\n\tdescription: string,\n\tschema: Record<string, unknown> = { type: \"string\" },\n) {\n\treturn {\n\t\tname,\n\t\tin: \"query\",\n\t\trequired: false,\n\t\tdescription,\n\t\tschema,\n\t};\n}\n\nfunction tableParameters(\n\ttable: SubgraphDetail[\"tables\"][string],\n\tpublicRead: boolean,\n) {\n\tconst parameters = publicRead\n\t\t? [\n\t\t\t\topenApiParameter(\"_limit\", \"Maximum rows to return.\", {\n\t\t\t\t\ttype: \"integer\",\n\t\t\t\t\tdefault: 50,\n\t\t\t\t\tminimum: 1,\n\t\t\t\t\tmaximum: 1000,\n\t\t\t\t}),\n\t\t\t\topenApiParameter(\n\t\t\t\t\t\"cursor\",\n\t\t\t\t\t\"Resume token from next_cursor (keyset pagination on _id).\",\n\t\t\t\t\t{ type: \"string\" },\n\t\t\t\t),\n\t\t\t\topenApiParameter(\"_order\", \"Sort direction (_id keyset).\", {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tenum: [\"asc\", \"desc\"],\n\t\t\t\t\tdefault: \"asc\",\n\t\t\t\t}),\n\t\t\t\topenApiParameter(\"_fields\", \"Comma-separated columns to include.\", {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t}),\n\t\t\t]\n\t\t: [\n\t\t\t\topenApiParameter(\"_limit\", \"Maximum rows to return.\", {\n\t\t\t\t\ttype: \"integer\",\n\t\t\t\t\tdefault: 50,\n\t\t\t\t\tminimum: 1,\n\t\t\t\t\tmaximum: 1000,\n\t\t\t\t}),\n\t\t\t\topenApiParameter(\"_offset\", \"Rows to skip for pagination.\", {\n\t\t\t\t\ttype: \"integer\",\n\t\t\t\t\tdefault: 0,\n\t\t\t\t\tminimum: 0,\n\t\t\t\t}),\n\t\t\t\topenApiParameter(\"_sort\", \"Column to sort by.\", {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tenum: selectableColumns(table),\n\t\t\t\t}),\n\t\t\t\topenApiParameter(\"_order\", \"Sort direction.\", {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tenum: [\"asc\", \"desc\"],\n\t\t\t\t\tdefault: \"asc\",\n\t\t\t\t}),\n\t\t\t\topenApiParameter(\"_fields\", \"Comma-separated columns to include.\", {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t}),\n\t\t\t];\n\tif (searchableColumns(table).length > 0) {\n\t\tparameters.push(\n\t\t\topenApiParameter(\"_search\", \"Search across searchable columns.\", {\n\t\t\t\ttype: \"string\",\n\t\t\t}),\n\t\t);\n\t}\n\tfor (const [name, col] of columnEntries(table)) {\n\t\tparameters.push(\n\t\t\topenApiParameter(name, `Filter ${name} by equality.`, {\n\t\t\t\ttype: \"string\",\n\t\t\t}),\n\t\t);\n\t\tparameters.push(\n\t\t\topenApiParameter(`${name}.neq`, `Filter ${name} by inequality.`, {\n\t\t\t\ttype: \"string\",\n\t\t\t}),\n\t\t);\n\t\tif (isComparable(col.type)) {\n\t\t\tfor (const op of [\"gt\", \"gte\", \"lt\", \"lte\"]) {\n\t\t\t\tparameters.push(\n\t\t\t\t\topenApiParameter(`${name}.${op}`, `Filter ${name} with ${op}.`, {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (isTextLike(col.type)) {\n\t\t\tparameters.push(\n\t\t\t\topenApiParameter(\n\t\t\t\t\t`${name}.like`,\n\t\t\t\t\t`Case-insensitive contains filter for ${name}.`,\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\treturn parameters;\n}\n\nexport function generateSubgraphAgentSchema(\n\tdetail: SubgraphDetail,\n\toptions: SubgraphSpecOptions = {},\n): SubgraphAgentSchema {\n\tconst serverUrl = normalizeServerUrl(options.serverUrl);\n\tconst publicRead = isPublicRead(detail);\n\tconst tables: SubgraphAgentSchema[\"tables\"] = {};\n\tfor (const [tableName, table] of Object.entries(detail.tables)) {\n\t\tconst path = tablePath(detail.name, tableName, publicRead);\n\t\ttables[tableName] = {\n\t\t\tendpoint: `${serverUrl}${path}`,\n\t\t\tcountEndpoint: `${serverUrl}${countPath(detail.name, tableName, publicRead)}`,\n\t\t\t...(publicRead\n\t\t\t\t? {\n\t\t\t\t\t\taggregateEndpoint: `${serverUrl}${path}/aggregate`,\n\t\t\t\t\t\tstreamEndpoint: `${serverUrl}${path}/stream`,\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\trowCount: table.rowCount,\n\t\t\tcolumns: table.columns,\n\t\t\t...(table.indexes ? { indexes: table.indexes } : {}),\n\t\t\t...(table.uniqueKeys ? { uniqueKeys: table.uniqueKeys } : {}),\n\t\t\tquery: {\n\t\t\t\tparameters: queryParameters(table, publicRead),\n\t\t\t\t// /v1 is _id keyset only — no _sort.\n\t\t\t\tsortable: publicRead ? [] : selectableColumns(table),\n\t\t\t\tselectable: selectableColumns(table),\n\t\t\t\tsearchable: searchableColumns(table),\n\t\t\t\tfilters: filterNames(table),\n\t\t\t},\n\t\t\texamples: {\n\t\t\t\tlist: rowExample(table),\n\t\t\t\tcount: { count: table.rowCount },\n\t\t\t\tcurl: publicRead\n\t\t\t\t\t? `curl '${serverUrl}${path}?_limit=10&_order=desc'`\n\t\t\t\t\t: `curl '${serverUrl}${path}?_limit=10&_sort=_block_height&_order=desc'`,\n\t\t\t},\n\t\t};\n\t}\n\treturn {\n\t\tname: detail.name,\n\t\tversion: detail.version,\n\t\t...(detail.description ? { description: detail.description } : {}),\n\t\t...(detail.schemaHash ? { schemaHash: detail.schemaHash } : {}),\n\t\tgeneratedAt: generatedAt(options),\n\t\tserverUrl,\n\t\t...(detail.sources ? { sources: detail.sources } : {}),\n\t\ttables,\n\t};\n}\n\nexport function generateSubgraphOpenApi(\n\tdetail: SubgraphDetail,\n\toptions: SubgraphSpecOptions = {},\n): Record<string, unknown> {\n\tconst serverUrl = normalizeServerUrl(options.serverUrl);\n\tconst publicRead = isPublicRead(detail);\n\tconst paths: Record<string, unknown> = {};\n\tconst schemas: Record<string, unknown> = {};\n\n\tfor (const [tableName, table] of Object.entries(detail.tables)) {\n\t\tconst schemaName = `${tableName}Row`;\n\t\tconst properties: Record<string, unknown> = {};\n\t\tconst required: string[] = [];\n\t\tfor (const [columnName, column] of columnEntries(table)) {\n\t\t\tproperties[columnName] = openApiSchemaForColumn(column);\n\t\t\tif (!column.nullable) required.push(columnName);\n\t\t}\n\t\tschemas[schemaName] = {\n\t\t\ttype: \"object\",\n\t\t\tproperties,\n\t\t\trequired,\n\t\t\texample: rowExample(table),\n\t\t};\n\n\t\tconst responseSchema = publicRead\n\t\t\t? {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\trows: {\n\t\t\t\t\t\t\ttype: \"array\",\n\t\t\t\t\t\t\titems: { $ref: `#/components/schemas/${schemaName}` },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnext_cursor: { type: [\"string\", \"null\"] },\n\t\t\t\t\t\ttip: {\n\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\tblock_height: { type: \"integer\" },\n\t\t\t\t\t\t\t\tsubgraph_height: { type: \"integer\" },\n\t\t\t\t\t\t\t\tblocks_behind: { type: \"integer\" },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\ttype: \"array\",\n\t\t\t\t\t\t\titems: { $ref: `#/components/schemas/${schemaName}` },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\ttotal: { type: \"integer\" },\n\t\t\t\t\t\t\t\tlimit: { type: \"integer\" },\n\t\t\t\t\t\t\t\toffset: { type: \"integer\" },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\tpaths[tablePath(detail.name, tableName, publicRead)] = {\n\t\t\tget: {\n\t\t\t\tsummary: `Query ${detail.name}.${tableName}`,\n\t\t\t\toperationId: `query_${detail.name.replace(/-/g, \"_\")}_${tableName}`,\n\t\t\t\tparameters: tableParameters(table, publicRead),\n\t\t\t\tresponses: {\n\t\t\t\t\t\"200\": {\n\t\t\t\t\t\tdescription: \"Rows returned from the subgraph table.\",\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\tschema: responseSchema,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tpaths[countPath(detail.name, tableName, publicRead)] = {\n\t\t\tget: {\n\t\t\t\tsummary: `Count ${detail.name}.${tableName}`,\n\t\t\t\toperationId: `count_${detail.name.replace(/-/g, \"_\")}_${tableName}`,\n\t\t\t\tparameters: tableParameters(table, publicRead),\n\t\t\t\tresponses: {\n\t\t\t\t\t\"200\": {\n\t\t\t\t\t\tdescription: \"Row count for the filtered table query.\",\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\tproperties: { count: { type: \"integer\" } },\n\t\t\t\t\t\t\t\t\trequired: [\"count\"],\n\t\t\t\t\t\t\t\t\texample: { count: table.rowCount },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\treturn {\n\t\topenapi: \"3.1.0\",\n\t\tinfo: {\n\t\t\ttitle: `${detail.name} Subgraph API`,\n\t\t\tversion: detail.version,\n\t\t\t...(detail.description ? { description: detail.description } : {}),\n\t\t},\n\t\tservers: [{ url: serverUrl }],\n\t\tpaths,\n\t\tcomponents: { schemas },\n\t\t\"x-secondlayer-subgraph\": detail.name,\n\t\t\"x-secondlayer-version\": detail.version,\n\t\t\"x-secondlayer-schema-hash\": detail.schemaHash,\n\t\t\"x-secondlayer-generated-at\": generatedAt(options),\n\t\t\"x-secondlayer-sources\": detail.sources ?? {},\n\t\t\"x-secondlayer-tables\": Object.keys(detail.tables),\n\t};\n}\n\nexport function generateSubgraphMarkdown(\n\tdetail: SubgraphDetail,\n\toptions: SubgraphSpecOptions = {},\n): string {\n\tconst agent = generateSubgraphAgentSchema(detail, options);\n\tconst publicRead = isPublicRead(detail);\n\tconst lines = [\n\t\t`# ${detail.name} Subgraph API`,\n\t\t\"\",\n\t\t`Version: ${detail.version}`,\n\t\tdetail.schemaHash ? `Schema hash: ${detail.schemaHash}` : undefined,\n\t\t`Server: ${agent.serverUrl}`,\n\t\tpublicRead\n\t\t\t? \"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).\"\n\t\t\t: undefined,\n\t\t\"\",\n\t\tdetail.description,\n\t].filter((line): line is string => line !== undefined && line !== \"\");\n\n\tfor (const [tableName, table] of Object.entries(agent.tables)) {\n\t\tlines.push(\n\t\t\t\"\",\n\t\t\t`## ${tableName}`,\n\t\t\t\"\",\n\t\t\t`GET ${table.endpoint}`,\n\t\t\t`GET ${table.countEndpoint}`,\n\t\t\t...(table.aggregateEndpoint ? [`GET ${table.aggregateEndpoint}`] : []),\n\t\t\t...(table.streamEndpoint ? [`GET ${table.streamEndpoint} (SSE)`] : []),\n\t\t\t\"\",\n\t\t\t`Rows: ${table.rowCount}`,\n\t\t\t\"\",\n\t\t\t\"### Columns\",\n\t\t\t\"\",\n\t\t\t\"| Column | Type | Attributes |\",\n\t\t\t\"| --- | --- | --- |\",\n\t\t);\n\t\tfor (const [columnName, col] of Object.entries(table.columns)) {\n\t\t\tconst attrs = [\n\t\t\t\tSYSTEM_COLUMNS.includes(columnName) ? \"system\" : undefined,\n\t\t\t\tcol.nullable ? \"nullable\" : undefined,\n\t\t\t\tcol.indexed ? \"indexed\" : undefined,\n\t\t\t\tcol.searchable ? \"searchable\" : undefined,\n\t\t\t]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\", \");\n\t\t\tlines.push(`| \\`${columnName}\\` | \\`${col.type}\\` | ${attrs || \"-\"} |`);\n\t\t}\n\t\tlines.push(\n\t\t\t\"\",\n\t\t\t\"### Query\",\n\t\t\t\"\",\n\t\t\t`Parameters: ${table.query.parameters.map((p) => `\\`${p}\\``).join(\", \")}`,\n\t\t\t`Filters: ${table.query.filters.map((p) => `\\`${p}\\``).join(\", \")}`,\n\t\t\t\"\",\n\t\t\t\"### Example\",\n\t\t\t\"\",\n\t\t\t\"```bash\",\n\t\t\ttable.examples.curl,\n\t\t\t\"```\",\n\t\t);\n\t}\n\treturn `${lines.join(\"\\n\")}\\n`;\n}\n\nexport function generateSubgraphSpec(\n\tdetail: SubgraphDetail,\n\tformat: SubgraphSpecFormat,\n\toptions: SubgraphSpecOptions = {},\n): Record<string, unknown> | SubgraphAgentSchema | string {\n\tif (format === \"openapi\") return generateSubgraphOpenApi(detail, options);\n\tif (format === \"agent\") return generateSubgraphAgentSchema(detail, options);\n\treturn generateSubgraphMarkdown(detail, options);\n}\n"
5
+ "import type { SubgraphDetail } from \"../schemas/subgraphs.ts\";\n\nexport type SubgraphSpecFormat = \"openapi\" | \"agent\" | \"markdown\";\n\nexport interface SubgraphSpecOptions {\n\tserverUrl?: string;\n\tgeneratedAt?: string;\n\t/**\n\t * Self-hosted instances ignore the `visibility` column when deciding\n\t * whether a read needs a key (`/v1/subgraphs` auth is the loopback rule,\n\t * not the flag) — but this generator still branched on it, so a spec built\n\t * for a self-hosted deploy pointed readers at the authenticated `/api`\n\t * path for a read that was actually open. Callers on that mode should set\n\t * this so the generated URLs match the auth the API actually enforces.\n\t */\n\tforcePublicRead?: boolean;\n}\n\nexport interface SubgraphAgentSchema {\n\tname: string;\n\tversion: string;\n\tdescription?: string;\n\tschemaHash?: string;\n\tgeneratedAt: string;\n\tserverUrl: string;\n\tsources?: Record<string, unknown>;\n\ttables: Record<\n\t\tstring,\n\t\t{\n\t\t\tendpoint: string;\n\t\t\tcountEndpoint: string;\n\t\t\taggregateEndpoint?: string;\n\t\t\tstreamEndpoint?: string;\n\t\t\trowCount: number;\n\t\t\tcolumns: SubgraphDetail[\"tables\"][string][\"columns\"];\n\t\t\tindexes?: readonly (readonly string[])[];\n\t\t\tuniqueKeys?: readonly (readonly string[])[];\n\t\t\tquery: {\n\t\t\t\tparameters: string[];\n\t\t\t\tsortable: string[];\n\t\t\t\tselectable: string[];\n\t\t\t\tsearchable: string[];\n\t\t\t\tfilters: string[];\n\t\t\t};\n\t\t\texamples: {\n\t\t\t\tlist: Record<string, unknown>;\n\t\t\t\tcount: { count: number };\n\t\t\t\tcurl: string;\n\t\t\t};\n\t\t}\n\t>;\n}\n\ntype ColumnMeta = SubgraphDetail[\"tables\"][string][\"columns\"][string];\n\nconst SYSTEM_COLUMNS = [\"_id\", \"_block_height\", \"_tx_id\", \"_created_at\"];\nconst BASE_QUERY_PARAMS = [\"_limit\", \"_offset\", \"_sort\", \"_order\", \"_fields\"];\n// /v1 rejects _offset/_sort: keyset pagination via cursor + _order only.\nconst PUBLIC_BASE_QUERY_PARAMS = [\"_limit\", \"cursor\", \"_order\", \"_fields\"];\nconst COMPARISON_OPS = [\"neq\", \"gt\", \"gte\", \"lt\", \"lte\"];\n\nfunction isPublicRead(\n\tdetail: SubgraphDetail,\n\toptions: SubgraphSpecOptions,\n): boolean {\n\treturn options.forcePublicRead ?? detail.visibility === \"public\";\n}\n\nfunction generatedAt(options: SubgraphSpecOptions): string {\n\treturn options.generatedAt ?? new Date().toISOString();\n}\n\n/**\n * Callers that know their instance pass `serverUrl` (the API derives it from the\n * request; the CLI from its resolved API URL). The fallback is the documented\n * default bind, not a hosted host — a spec that advertises someone else's API\n * produces a client that silently talks to the wrong place.\n */\nfunction normalizeServerUrl(serverUrl?: string): string {\n\treturn (serverUrl ?? \"http://127.0.0.1:3800\").replace(/\\/+$/, \"\");\n}\n\nfunction tablePath(\n\tsubgraphName: string,\n\ttableName: string,\n\tpublicRead: boolean,\n): string {\n\tconst base = publicRead ? \"/v1/subgraphs\" : \"/api/subgraphs\";\n\treturn `${base}/${subgraphName}/${tableName}`;\n}\n\nfunction countPath(\n\tsubgraphName: string,\n\ttableName: string,\n\tpublicRead: boolean,\n): string {\n\treturn `${tablePath(subgraphName, tableName, publicRead)}/count`;\n}\n\nfunction isTextLike(type: string): boolean {\n\treturn type === \"text\" || type === \"principal\" || type === \"timestamp\";\n}\n\nfunction isComparable(type: string): boolean {\n\treturn (\n\t\ttype === \"uint\" ||\n\t\ttype === \"int\" ||\n\t\ttype === \"bigint\" ||\n\t\ttype === \"serial\" ||\n\t\ttype === \"timestamp\"\n\t);\n}\n\nfunction exampleForColumn(type: string): unknown {\n\tswitch (type) {\n\t\tcase \"uint\":\n\t\tcase \"int\":\n\t\tcase \"bigint\":\n\t\t\treturn \"1000\";\n\t\tcase \"serial\":\n\t\t\treturn 1;\n\t\tcase \"principal\":\n\t\t\treturn \"SP000000000000000000002Q6VF78\";\n\t\tcase \"timestamp\":\n\t\t\treturn \"2026-01-01T00:00:00.000Z\";\n\t\tcase \"boolean\":\n\t\t\treturn true;\n\t\tcase \"jsonb\":\n\t\t\treturn { example: true };\n\t\tdefault:\n\t\t\treturn \"example\";\n\t}\n}\n\nfunction openApiSchemaForColumn(col: ColumnMeta): Record<string, unknown> {\n\tlet schema: Record<string, unknown>;\n\tswitch (col.type) {\n\t\tcase \"uint\":\n\t\tcase \"int\":\n\t\tcase \"bigint\":\n\t\t\tschema = { type: \"string\", pattern: \"^-?\\\\d+(\\\\.\\\\d+)?$\" };\n\t\t\tbreak;\n\t\tcase \"serial\":\n\t\t\tschema = { type: \"integer\" };\n\t\t\tbreak;\n\t\tcase \"principal\":\n\t\tcase \"text\":\n\t\t\tschema = { type: \"string\" };\n\t\t\tbreak;\n\t\tcase \"timestamp\":\n\t\t\tschema = { type: \"string\", format: \"date-time\" };\n\t\t\tbreak;\n\t\tcase \"boolean\":\n\t\t\tschema = { type: \"boolean\" };\n\t\t\tbreak;\n\t\tcase \"jsonb\":\n\t\t\tschema = { type: \"object\", additionalProperties: true };\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tschema = {};\n\t\t\tbreak;\n\t}\n\tif (col.nullable) {\n\t\tconst type = schema.type;\n\t\tif (typeof type === \"string\") schema.type = [type, \"null\"];\n\t}\n\treturn schema;\n}\n\nfunction columnEntries(table: SubgraphDetail[\"tables\"][string]) {\n\treturn Object.entries(table.columns);\n}\n\nfunction selectableColumns(table: SubgraphDetail[\"tables\"][string]): string[] {\n\treturn columnEntries(table).map(([name]) => name);\n}\n\nfunction searchableColumns(table: SubgraphDetail[\"tables\"][string]): string[] {\n\treturn columnEntries(table)\n\t\t.filter(([, col]) => col.searchable)\n\t\t.map(([name]) => name);\n}\n\nfunction filterNames(table: SubgraphDetail[\"tables\"][string]): string[] {\n\tconst result: string[] = [];\n\tfor (const [name, col] of columnEntries(table)) {\n\t\tresult.push(name);\n\t\tresult.push(`${name}.neq`);\n\t\tif (isComparable(col.type)) {\n\t\t\tfor (const op of COMPARISON_OPS.filter((op) => op !== \"neq\")) {\n\t\t\t\tresult.push(`${name}.${op}`);\n\t\t\t}\n\t\t}\n\t\tif (isTextLike(col.type)) result.push(`${name}.like`);\n\t}\n\treturn result;\n}\n\nfunction queryParameters(\n\ttable: SubgraphDetail[\"tables\"][string],\n\tpublicRead: boolean,\n): string[] {\n\tconst params = publicRead\n\t\t? [...PUBLIC_BASE_QUERY_PARAMS]\n\t\t: [...BASE_QUERY_PARAMS];\n\tif (searchableColumns(table).length > 0) params.push(\"_search\");\n\treturn params;\n}\n\nfunction rowExample(table: SubgraphDetail[\"tables\"][string]) {\n\tconst row: Record<string, unknown> = {};\n\tfor (const [name, col] of columnEntries(table)) {\n\t\trow[name] = exampleForColumn(col.type);\n\t}\n\treturn row;\n}\n\nfunction openApiParameter(\n\tname: string,\n\tdescription: string,\n\tschema: Record<string, unknown> = { type: \"string\" },\n) {\n\treturn {\n\t\tname,\n\t\tin: \"query\",\n\t\trequired: false,\n\t\tdescription,\n\t\tschema,\n\t};\n}\n\nfunction tableParameters(\n\ttable: SubgraphDetail[\"tables\"][string],\n\tpublicRead: boolean,\n) {\n\tconst parameters = publicRead\n\t\t? [\n\t\t\t\topenApiParameter(\"_limit\", \"Maximum rows to return.\", {\n\t\t\t\t\ttype: \"integer\",\n\t\t\t\t\tdefault: 50,\n\t\t\t\t\tminimum: 1,\n\t\t\t\t\tmaximum: 1000,\n\t\t\t\t}),\n\t\t\t\topenApiParameter(\n\t\t\t\t\t\"cursor\",\n\t\t\t\t\t\"Resume token from next_cursor (keyset pagination on _id).\",\n\t\t\t\t\t{ type: \"string\" },\n\t\t\t\t),\n\t\t\t\topenApiParameter(\"_order\", \"Sort direction (_id keyset).\", {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tenum: [\"asc\", \"desc\"],\n\t\t\t\t\tdefault: \"asc\",\n\t\t\t\t}),\n\t\t\t\topenApiParameter(\"_fields\", \"Comma-separated columns to include.\", {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t}),\n\t\t\t]\n\t\t: [\n\t\t\t\topenApiParameter(\"_limit\", \"Maximum rows to return.\", {\n\t\t\t\t\ttype: \"integer\",\n\t\t\t\t\tdefault: 50,\n\t\t\t\t\tminimum: 1,\n\t\t\t\t\tmaximum: 1000,\n\t\t\t\t}),\n\t\t\t\topenApiParameter(\"_offset\", \"Rows to skip for pagination.\", {\n\t\t\t\t\ttype: \"integer\",\n\t\t\t\t\tdefault: 0,\n\t\t\t\t\tminimum: 0,\n\t\t\t\t}),\n\t\t\t\topenApiParameter(\"_sort\", \"Column to sort by.\", {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tenum: selectableColumns(table),\n\t\t\t\t}),\n\t\t\t\topenApiParameter(\"_order\", \"Sort direction.\", {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tenum: [\"asc\", \"desc\"],\n\t\t\t\t\tdefault: \"asc\",\n\t\t\t\t}),\n\t\t\t\topenApiParameter(\"_fields\", \"Comma-separated columns to include.\", {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t}),\n\t\t\t];\n\tif (searchableColumns(table).length > 0) {\n\t\tparameters.push(\n\t\t\topenApiParameter(\"_search\", \"Search across searchable columns.\", {\n\t\t\t\ttype: \"string\",\n\t\t\t}),\n\t\t);\n\t}\n\tfor (const [name, col] of columnEntries(table)) {\n\t\tparameters.push(\n\t\t\topenApiParameter(name, `Filter ${name} by equality.`, {\n\t\t\t\ttype: \"string\",\n\t\t\t}),\n\t\t);\n\t\tparameters.push(\n\t\t\topenApiParameter(`${name}.neq`, `Filter ${name} by inequality.`, {\n\t\t\t\ttype: \"string\",\n\t\t\t}),\n\t\t);\n\t\tif (isComparable(col.type)) {\n\t\t\tfor (const op of [\"gt\", \"gte\", \"lt\", \"lte\"]) {\n\t\t\t\tparameters.push(\n\t\t\t\t\topenApiParameter(`${name}.${op}`, `Filter ${name} with ${op}.`, {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (isTextLike(col.type)) {\n\t\t\tparameters.push(\n\t\t\t\topenApiParameter(\n\t\t\t\t\t`${name}.like`,\n\t\t\t\t\t`Case-insensitive contains filter for ${name}.`,\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\treturn parameters;\n}\n\nexport function generateSubgraphAgentSchema(\n\tdetail: SubgraphDetail,\n\toptions: SubgraphSpecOptions = {},\n): SubgraphAgentSchema {\n\tconst serverUrl = normalizeServerUrl(options.serverUrl);\n\tconst publicRead = isPublicRead(detail, options);\n\tconst tables: SubgraphAgentSchema[\"tables\"] = {};\n\tfor (const [tableName, table] of Object.entries(detail.tables)) {\n\t\tconst path = tablePath(detail.name, tableName, publicRead);\n\t\ttables[tableName] = {\n\t\t\tendpoint: `${serverUrl}${path}`,\n\t\t\tcountEndpoint: `${serverUrl}${countPath(detail.name, tableName, publicRead)}`,\n\t\t\t...(publicRead\n\t\t\t\t? {\n\t\t\t\t\t\taggregateEndpoint: `${serverUrl}${path}/aggregate`,\n\t\t\t\t\t\tstreamEndpoint: `${serverUrl}${path}/stream`,\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\trowCount: table.rowCount,\n\t\t\tcolumns: table.columns,\n\t\t\t...(table.indexes ? { indexes: table.indexes } : {}),\n\t\t\t...(table.uniqueKeys ? { uniqueKeys: table.uniqueKeys } : {}),\n\t\t\tquery: {\n\t\t\t\tparameters: queryParameters(table, publicRead),\n\t\t\t\t// /v1 is _id keyset only — no _sort.\n\t\t\t\tsortable: publicRead ? [] : selectableColumns(table),\n\t\t\t\tselectable: selectableColumns(table),\n\t\t\t\tsearchable: searchableColumns(table),\n\t\t\t\tfilters: filterNames(table),\n\t\t\t},\n\t\t\texamples: {\n\t\t\t\tlist: rowExample(table),\n\t\t\t\tcount: { count: table.rowCount },\n\t\t\t\tcurl: publicRead\n\t\t\t\t\t? `curl '${serverUrl}${path}?_limit=10&_order=desc'`\n\t\t\t\t\t: `curl '${serverUrl}${path}?_limit=10&_sort=_block_height&_order=desc'`,\n\t\t\t},\n\t\t};\n\t}\n\treturn {\n\t\tname: detail.name,\n\t\tversion: detail.version,\n\t\t...(detail.description ? { description: detail.description } : {}),\n\t\t...(detail.schemaHash ? { schemaHash: detail.schemaHash } : {}),\n\t\tgeneratedAt: generatedAt(options),\n\t\tserverUrl,\n\t\t...(detail.sources ? { sources: detail.sources } : {}),\n\t\ttables,\n\t};\n}\n\nexport function generateSubgraphOpenApi(\n\tdetail: SubgraphDetail,\n\toptions: SubgraphSpecOptions = {},\n): Record<string, unknown> {\n\tconst serverUrl = normalizeServerUrl(options.serverUrl);\n\tconst publicRead = isPublicRead(detail, options);\n\tconst paths: Record<string, unknown> = {};\n\tconst schemas: Record<string, unknown> = {};\n\n\tfor (const [tableName, table] of Object.entries(detail.tables)) {\n\t\tconst schemaName = `${tableName}Row`;\n\t\tconst properties: Record<string, unknown> = {};\n\t\tconst required: string[] = [];\n\t\tfor (const [columnName, column] of columnEntries(table)) {\n\t\t\tproperties[columnName] = openApiSchemaForColumn(column);\n\t\t\tif (!column.nullable) required.push(columnName);\n\t\t}\n\t\tschemas[schemaName] = {\n\t\t\ttype: \"object\",\n\t\t\tproperties,\n\t\t\trequired,\n\t\t\texample: rowExample(table),\n\t\t};\n\n\t\tconst responseSchema = publicRead\n\t\t\t? {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\trows: {\n\t\t\t\t\t\t\ttype: \"array\",\n\t\t\t\t\t\t\titems: { $ref: `#/components/schemas/${schemaName}` },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnext_cursor: { type: [\"string\", \"null\"] },\n\t\t\t\t\t\ttip: {\n\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\tblock_height: { type: \"integer\" },\n\t\t\t\t\t\t\t\tsubgraph_height: { type: \"integer\" },\n\t\t\t\t\t\t\t\tblocks_behind: { type: \"integer\" },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\ttype: \"array\",\n\t\t\t\t\t\t\titems: { $ref: `#/components/schemas/${schemaName}` },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\ttotal: { type: \"integer\" },\n\t\t\t\t\t\t\t\tlimit: { type: \"integer\" },\n\t\t\t\t\t\t\t\toffset: { type: \"integer\" },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\tpaths[tablePath(detail.name, tableName, publicRead)] = {\n\t\t\tget: {\n\t\t\t\tsummary: `Query ${detail.name}.${tableName}`,\n\t\t\t\toperationId: `query_${detail.name.replace(/-/g, \"_\")}_${tableName}`,\n\t\t\t\tparameters: tableParameters(table, publicRead),\n\t\t\t\tresponses: {\n\t\t\t\t\t\"200\": {\n\t\t\t\t\t\tdescription: \"Rows returned from the subgraph table.\",\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\tschema: responseSchema,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tpaths[countPath(detail.name, tableName, publicRead)] = {\n\t\t\tget: {\n\t\t\t\tsummary: `Count ${detail.name}.${tableName}`,\n\t\t\t\toperationId: `count_${detail.name.replace(/-/g, \"_\")}_${tableName}`,\n\t\t\t\tparameters: tableParameters(table, publicRead),\n\t\t\t\tresponses: {\n\t\t\t\t\t\"200\": {\n\t\t\t\t\t\tdescription: \"Row count for the filtered table query.\",\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\tproperties: { count: { type: \"integer\" } },\n\t\t\t\t\t\t\t\t\trequired: [\"count\"],\n\t\t\t\t\t\t\t\t\texample: { count: table.rowCount },\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\n\treturn {\n\t\topenapi: \"3.1.0\",\n\t\tinfo: {\n\t\t\ttitle: `${detail.name} Subgraph API`,\n\t\t\tversion: detail.version,\n\t\t\t...(detail.description ? { description: detail.description } : {}),\n\t\t},\n\t\tservers: [{ url: serverUrl }],\n\t\tpaths,\n\t\tcomponents: { schemas },\n\t\t\"x-secondlayer-subgraph\": detail.name,\n\t\t\"x-secondlayer-version\": detail.version,\n\t\t\"x-secondlayer-schema-hash\": detail.schemaHash,\n\t\t\"x-secondlayer-generated-at\": generatedAt(options),\n\t\t\"x-secondlayer-sources\": detail.sources ?? {},\n\t\t\"x-secondlayer-tables\": Object.keys(detail.tables),\n\t};\n}\n\nexport function generateSubgraphMarkdown(\n\tdetail: SubgraphDetail,\n\toptions: SubgraphSpecOptions = {},\n): string {\n\tconst agent = generateSubgraphAgentSchema(detail, options);\n\tconst publicRead = isPublicRead(detail, options);\n\tconst lines = [\n\t\t`# ${detail.name} Subgraph API`,\n\t\t\"\",\n\t\t`Version: ${detail.version}`,\n\t\tdetail.schemaHash ? `Schema hash: ${detail.schemaHash}` : undefined,\n\t\t`Server: ${agent.serverUrl}`,\n\t\tpublicRead\n\t\t\t? \"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).\"\n\t\t\t: undefined,\n\t\t\"\",\n\t\tdetail.description,\n\t].filter((line): line is string => line !== undefined && line !== \"\");\n\n\tfor (const [tableName, table] of Object.entries(agent.tables)) {\n\t\tlines.push(\n\t\t\t\"\",\n\t\t\t`## ${tableName}`,\n\t\t\t\"\",\n\t\t\t`GET ${table.endpoint}`,\n\t\t\t`GET ${table.countEndpoint}`,\n\t\t\t...(table.aggregateEndpoint ? [`GET ${table.aggregateEndpoint}`] : []),\n\t\t\t...(table.streamEndpoint ? [`GET ${table.streamEndpoint} (SSE)`] : []),\n\t\t\t\"\",\n\t\t\t`Rows: ${table.rowCount}`,\n\t\t\t\"\",\n\t\t\t\"### Columns\",\n\t\t\t\"\",\n\t\t\t\"| Column | Type | Attributes |\",\n\t\t\t\"| --- | --- | --- |\",\n\t\t);\n\t\tfor (const [columnName, col] of Object.entries(table.columns)) {\n\t\t\tconst attrs = [\n\t\t\t\tSYSTEM_COLUMNS.includes(columnName) ? \"system\" : undefined,\n\t\t\t\tcol.nullable ? \"nullable\" : undefined,\n\t\t\t\tcol.indexed ? \"indexed\" : undefined,\n\t\t\t\tcol.searchable ? \"searchable\" : undefined,\n\t\t\t]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\", \");\n\t\t\tlines.push(`| \\`${columnName}\\` | \\`${col.type}\\` | ${attrs || \"-\"} |`);\n\t\t}\n\t\tlines.push(\n\t\t\t\"\",\n\t\t\t\"### Query\",\n\t\t\t\"\",\n\t\t\t`Parameters: ${table.query.parameters.map((p) => `\\`${p}\\``).join(\", \")}`,\n\t\t\t`Filters: ${table.query.filters.map((p) => `\\`${p}\\``).join(\", \")}`,\n\t\t\t\"\",\n\t\t\t\"### Example\",\n\t\t\t\"\",\n\t\t\t\"```bash\",\n\t\t\ttable.examples.curl,\n\t\t\t\"```\",\n\t\t);\n\t}\n\treturn `${lines.join(\"\\n\")}\\n`;\n}\n\nexport function generateSubgraphSpec(\n\tdetail: SubgraphDetail,\n\tformat: SubgraphSpecFormat,\n\toptions: SubgraphSpecOptions = {},\n): Record<string, unknown> | SubgraphAgentSchema | string {\n\tif (format === \"openapi\") return generateSubgraphOpenApi(detail, options);\n\tif (format === \"agent\") return generateSubgraphAgentSchema(detail, options);\n\treturn generateSubgraphMarkdown(detail, options);\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "948E6C1DD2B5F6FC64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "99B028147A21173164756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -0,0 +1,49 @@
1
+ import { type Kysely, sql } from "kysely";
2
+ import { onControlPlane } from "../src/db/migration-role.ts";
3
+
4
+ /**
5
+ * `archive_fetches` — the charge log for the metered archive fetch gate
6
+ * (design-f089). One row per priced attempt to fetch a partition object,
7
+ * successful or free (24h re-issue / monthly repair allowance). Never
8
+ * updated after insert — it is an append-only log, read for two things:
9
+ *
10
+ * - the 24h re-issue window: has this account already paid for this exact
11
+ * path recently, so a resumed/retried fetch re-presigns for free.
12
+ * - the monthly repair allowance: how many partitions this account has
13
+ * pulled via the free allowance this calendar month.
14
+ *
15
+ * `usd_micros` is 0 for allowance/re-issue rows, so summing it per account
16
+ * is real revenue, not fetch volume. Lives on the control plane next to
17
+ * `account_credits`, the balance it debits from.
18
+ */
19
+ export async function up(db: Kysely<unknown>): Promise<void> {
20
+ await onControlPlane(async () => {
21
+ await sql`SET lock_timeout = '30s'`.execute(db);
22
+
23
+ await sql`
24
+ CREATE TABLE archive_fetches (
25
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
26
+ account_id uuid NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
27
+ path text NOT NULL,
28
+ dataset text NOT NULL,
29
+ usd_micros bigint NOT NULL,
30
+ via_allowance boolean NOT NULL DEFAULT false,
31
+ charged_at timestamptz NOT NULL DEFAULT now(),
32
+ UNIQUE (account_id, path, charged_at)
33
+ )
34
+ `.execute(db);
35
+
36
+ // Serves both the 24h re-issue lookup (account_id, path, charged_at)
37
+ // and the monthly allowance count (account_id, via_allowance, charged_at).
38
+ await sql`
39
+ CREATE INDEX archive_fetches_account_charged_at_idx
40
+ ON archive_fetches (account_id, charged_at)
41
+ `.execute(db);
42
+ });
43
+ }
44
+
45
+ export async function down(db: Kysely<unknown>): Promise<void> {
46
+ await onControlPlane(async () => {
47
+ await sql`DROP TABLE IF EXISTS archive_fetches`.execute(db);
48
+ });
49
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@secondlayer/shared",
3
- "version": "10.0.0",
3
+ "version": "11.0.0",
4
4
  "description": "Internal building blocks shared across Secondlayer packages.",
5
5
  "license": "MIT",
6
6
  "repository": {