@happyvertical/smrt-core 0.55.6 → 0.55.8

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 (205) hide show
  1. package/AGENTS.md +2 -1
  2. package/agents/browser-entry.md +44 -0
  3. package/agents/build-knowledge.md +20 -0
  4. package/agents/recipes.md +217 -0
  5. package/agents/revision-guard.md +72 -1
  6. package/dist/audit-context.d.ts.map +1 -1
  7. package/dist/audit-context.js +2 -2
  8. package/dist/audit-context.js.map +1 -1
  9. package/dist/browser.d.ts +2 -1
  10. package/dist/browser.d.ts.map +1 -1
  11. package/dist/browser.js +7 -7
  12. package/dist/cascade.d.ts +1 -1
  13. package/dist/cascade.d.ts.map +1 -1
  14. package/dist/cascade.js +1 -1
  15. package/dist/cascade.js.map +1 -1
  16. package/dist/change-feed.d.ts.map +1 -1
  17. package/dist/change-feed.js +1 -2
  18. package/dist/change-feed.js.map +1 -1
  19. package/dist/class.d.ts +1 -1
  20. package/dist/class.d.ts.map +1 -1
  21. package/dist/class.js +7 -3
  22. package/dist/class.js.map +1 -1
  23. package/dist/collection.d.ts.map +1 -1
  24. package/dist/collection.js +1 -1
  25. package/dist/collection.js.map +1 -1
  26. package/dist/consumer-plugin/index.js +2 -2
  27. package/dist/data-query.d.ts.map +1 -1
  28. package/dist/data-query.js +2 -13
  29. package/dist/data-query.js.map +1 -1
  30. package/dist/database.js +1 -1
  31. package/dist/database.js.map +1 -1
  32. package/dist/dispatch/bus.js +1 -1
  33. package/dist/dispatch/bus.js.map +1 -1
  34. package/dist/embedded-write-queue.d.ts +1 -1
  35. package/dist/embedded-write-queue.d.ts.map +1 -1
  36. package/dist/embedded-write-queue.js +7 -5
  37. package/dist/embedded-write-queue.js.map +1 -1
  38. package/dist/embeddings/hash.js +2 -2
  39. package/dist/embeddings/hash.js.map +1 -1
  40. package/dist/embeddings/storage.d.ts.map +1 -1
  41. package/dist/embeddings/storage.js +1 -2
  42. package/dist/embeddings/storage.js.map +1 -1
  43. package/dist/errors.d.ts.map +1 -1
  44. package/dist/errors.js +1 -0
  45. package/dist/errors.js.map +1 -1
  46. package/dist/generation-snapshot.js +1 -1
  47. package/dist/generators/index.js +1 -1
  48. package/dist/generators/mcp.js +3 -3
  49. package/dist/generators/preflight-route.js +1 -1
  50. package/dist/generators/rest.js +1 -1
  51. package/dist/generators.js +1 -1
  52. package/dist/host.browser.d.ts +12 -0
  53. package/dist/host.browser.d.ts.map +1 -0
  54. package/dist/host.browser.js +30 -0
  55. package/dist/host.browser.js.map +1 -0
  56. package/dist/host.d.ts +18 -0
  57. package/dist/host.d.ts.map +1 -0
  58. package/dist/host.js +15 -0
  59. package/dist/host.js.map +1 -0
  60. package/dist/index.d.ts +1 -0
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +10 -9
  63. package/dist/knowledge.d.ts.map +1 -1
  64. package/dist/knowledge.js +6 -4
  65. package/dist/knowledge.js.map +1 -1
  66. package/dist/manifest/browser-capability.generated.d.ts +14 -0
  67. package/dist/manifest/browser-capability.generated.d.ts.map +1 -0
  68. package/dist/manifest/browser-capability.generated.js +499 -0
  69. package/dist/manifest/browser-capability.generated.js.map +1 -0
  70. package/dist/manifest/discover-base-classes.js +1 -1
  71. package/dist/manifest/discover-smrt-packages.js +1 -1
  72. package/dist/manifest/generator.js +3 -3
  73. package/dist/manifest/index.js +2 -2
  74. package/dist/manifest/local-manifest-reader.d.ts +48 -0
  75. package/dist/manifest/local-manifest-reader.d.ts.map +1 -0
  76. package/dist/manifest/local-manifest-reader.js +81 -0
  77. package/dist/manifest/local-manifest-reader.js.map +1 -0
  78. package/dist/manifest/manager.d.ts +5 -28
  79. package/dist/manifest/manager.d.ts.map +1 -1
  80. package/dist/manifest/manager.js +10 -56
  81. package/dist/manifest/manager.js.map +1 -1
  82. package/dist/manifest/manifest-loader.d.ts +1 -1
  83. package/dist/manifest/manifest-loader.d.ts.map +1 -1
  84. package/dist/manifest/manifest-loader.js +43 -12
  85. package/dist/manifest/manifest-loader.js.map +1 -1
  86. package/dist/manifest/node-host.d.ts +38 -0
  87. package/dist/manifest/node-host.d.ts.map +1 -0
  88. package/dist/manifest/node-host.js +52 -0
  89. package/dist/manifest/node-host.js.map +1 -0
  90. package/dist/manifest/package-manifest-exports.js +1 -1
  91. package/dist/manifest/static-manifest.d.ts.map +1 -1
  92. package/dist/manifest/static-manifest.js +12 -2
  93. package/dist/manifest/static-manifest.js.map +1 -1
  94. package/dist/manifest/store.d.ts +2 -1
  95. package/dist/manifest/store.d.ts.map +1 -1
  96. package/dist/manifest/store.js +7 -4
  97. package/dist/manifest/store.js.map +1 -1
  98. package/dist/manifest.js +1 -1
  99. package/dist/manifest.json +14 -2
  100. package/dist/native-duckdb.d.ts +28 -0
  101. package/dist/native-duckdb.d.ts.map +1 -0
  102. package/dist/native-duckdb.js +51 -0
  103. package/dist/native-duckdb.js.map +1 -0
  104. package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/_md.js +169 -0
  105. package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/_md.js.map +1 -0
  106. package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/_u64.js +13 -0
  107. package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/_u64.js.map +1 -0
  108. package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/sha2.js +198 -0
  109. package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/sha2.js.map +1 -0
  110. package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/utils.js +243 -0
  111. package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/utils.js.map +1 -0
  112. package/dist/object.d.ts +56 -0
  113. package/dist/object.d.ts.map +1 -1
  114. package/dist/object.js +139 -16
  115. package/dist/object.js.map +1 -1
  116. package/dist/postgres-permissions.d.ts.map +1 -1
  117. package/dist/postgres-permissions.js +3 -3
  118. package/dist/postgres-permissions.js.map +1 -1
  119. package/dist/prebuild/index.js +1 -1
  120. package/dist/recipe-demo.d.ts +70 -0
  121. package/dist/recipe-demo.d.ts.map +1 -0
  122. package/dist/recipe-demo.js +130 -0
  123. package/dist/recipe-demo.js.map +1 -0
  124. package/dist/recipe.d.ts +64 -1
  125. package/dist/recipe.d.ts.map +1 -1
  126. package/dist/recipe.js +30 -0
  127. package/dist/recipe.js.map +1 -1
  128. package/dist/registry/class-registration.js +2 -2
  129. package/dist/registry/class-registration.js.map +1 -1
  130. package/dist/registry/db-cache-key.js +4 -5
  131. package/dist/registry/db-cache-key.js.map +1 -1
  132. package/dist/registry/inheritance-resolver.js +1 -1
  133. package/dist/registry/name-resolver.js +1 -1
  134. package/dist/registry/qualified-name-aliases.js +1 -1
  135. package/dist/registry/schema-builder.d.ts.map +1 -1
  136. package/dist/registry/schema-builder.js +3 -3
  137. package/dist/registry/schema-builder.js.map +1 -1
  138. package/dist/registry/types.d.ts +5 -0
  139. package/dist/registry/types.d.ts.map +1 -1
  140. package/dist/registry.d.ts.map +1 -1
  141. package/dist/registry.js +5 -8
  142. package/dist/registry.js.map +1 -1
  143. package/dist/revision-guard.js +1 -1
  144. package/dist/revision-guard.js.map +1 -1
  145. package/dist/scanner/manifest-generator.d.ts.map +1 -1
  146. package/dist/scanner/manifest-generator.js +19 -10
  147. package/dist/scanner/manifest-generator.js.map +1 -1
  148. package/dist/scanner/recipe-demo-pass.d.ts +14 -0
  149. package/dist/scanner/recipe-demo-pass.d.ts.map +1 -0
  150. package/dist/scanner/recipe-demo-pass.js +33 -0
  151. package/dist/scanner/recipe-demo-pass.js.map +1 -0
  152. package/dist/scanner/types.d.ts +9 -1
  153. package/dist/scanner/types.d.ts.map +1 -1
  154. package/dist/scanner/types.js.map +1 -1
  155. package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -1
  156. package/dist/schema/ddl/duckdb-strategy.js +1 -1
  157. package/dist/schema/ddl/duckdb-strategy.js.map +1 -1
  158. package/dist/schema/foreign-key-planner.d.ts.map +1 -1
  159. package/dist/schema/foreign-key-planner.js +1 -1
  160. package/dist/schema/foreign-key-planner.js.map +1 -1
  161. package/dist/schema/generator.d.ts.map +1 -1
  162. package/dist/schema/generator.js +10 -14
  163. package/dist/schema/generator.js.map +1 -1
  164. package/dist/schema/schema-aggregator.js +1 -1
  165. package/dist/scripts/browser-entry-evaluation.mjs +157 -0
  166. package/dist/smrt-knowledge.json +32 -12
  167. package/dist/system/browser.d.ts +16 -0
  168. package/dist/system/browser.d.ts.map +1 -0
  169. package/dist/system/browser.js +6 -0
  170. package/dist/system/index.d.ts +1 -6
  171. package/dist/system/index.d.ts.map +1 -1
  172. package/dist/system/index.js +2 -1
  173. package/dist/testing/database.js +1 -1
  174. package/dist/tools/index.js +1 -1
  175. package/dist/unchanged-indexed.d.ts +85 -0
  176. package/dist/unchanged-indexed.d.ts.map +1 -0
  177. package/dist/unchanged-indexed.js +219 -0
  178. package/dist/unchanged-indexed.js.map +1 -0
  179. package/dist/utils/async-context.d.ts +22 -0
  180. package/dist/utils/async-context.d.ts.map +1 -0
  181. package/dist/utils/async-context.js +27 -0
  182. package/dist/utils/async-context.js.map +1 -0
  183. package/dist/utils/import-project-vite.js +1 -1
  184. package/dist/utils/import-workspace-module.js +1 -1
  185. package/dist/utils/json.browser.d.ts +18 -0
  186. package/dist/utils/json.browser.d.ts.map +1 -0
  187. package/dist/utils/json.browser.js +47 -0
  188. package/dist/utils/json.browser.js.map +1 -0
  189. package/dist/utils/sha256.d.ts +15 -0
  190. package/dist/utils/sha256.d.ts.map +1 -0
  191. package/dist/utils/sha256.js +29 -0
  192. package/dist/utils/sha256.js.map +1 -0
  193. package/dist/vite-plugin/changes-route.js +1 -1
  194. package/dist/vite-plugin/dev-plane-route.js +1 -1
  195. package/dist/vite-plugin/events-route.js +1 -1
  196. package/dist/vite-plugin/import-build-aware.js +1 -1
  197. package/dist/vite-plugin/index.js +2 -2
  198. package/dist/vite-plugin/resources-route.js +1 -1
  199. package/dist/vite-plugin/sveltekit-generator.js +2 -2
  200. package/dist/vite-plugin/sveltekit-path.js +1 -1
  201. package/dist/vite-plugin/sveltekit-register-injection.js +1 -1
  202. package/dist/vite-plugin/sveltekit-route-coordinator.js +1 -1
  203. package/dist/vite-plugin/sync-apply-route.js +1 -1
  204. package/dist/vite-plugin/web-collections.js +2 -2
  205. package/package.json +21 -11
@@ -1,8 +1,8 @@
1
1
  import "../scanner/types.js";
2
- import { publishArtifactFiles } from "./artifact-publication.js";
3
2
  import { canonicalSvelteKitPath } from "../vite-plugin/sveltekit-path.js";
4
3
  import { clearGeneratedSvelteKitRouteFiles, reconcileSvelteKitRouteGitignore } from "../vite-plugin/sveltekit-generator.js";
5
4
  import { generateWebModule, isCollectionManifestClass, resolveCollectionItemObject } from "../vite-plugin/web-collections.js";
5
+ import { publishArtifactFiles } from "./artifact-publication.js";
6
6
  import { resolveFileKnowledgeConfig } from "../knowledge-config.js";
7
7
  import { buildDomainKnowledgeManifest } from "../knowledge.js";
8
8
  import { manifestExportCandidates } from "../manifest/package-manifest-exports.js";
@@ -10,8 +10,8 @@ import { loadVerifiedSmrtGenerationSnapshot, serializeSmrtGenerationSnapshot, sh
10
10
  import { generateClientModule } from "../vite-plugin/generated-client.js";
11
11
  import { activeProducerKnowledgeRoutePaths, activeSvelteKitRouteParticipants, assertNoSvelteKitRouteRootSymlinkConflict, assertSvelteKitRouteCoordinationComplete, contributeSvelteKitRoutes, expectedSvelteKitRouteOwners, markSvelteKitRouteParticipant, producerKnowledgeRoutePaths, revokeSvelteKitRoutes } from "../vite-plugin/sveltekit-route-coordinator.js";
12
12
  import { generateDeclarations } from "../prebuild/index.js";
13
- import * as fs from "node:fs";
14
13
  import * as path from "node:path";
14
+ import * as fs from "node:fs";
15
15
  //#region src/consumer-plugin/index.ts
16
16
  /**
17
17
  * Vite plugin for consuming SMRT packages
@@ -1 +1 @@
1
- {"version":3,"file":"data-query.d.ts","sourceRoot":"","sources":["../src/data-query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAUV,gBAAgB,EAChB,eAAe,EAGf,eAAe,EAGhB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAU,CAAC;AAE3C,4EAA4E;AAC5E,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAChD,eAAO,MAAM,yBAAyB,OAAQ,CAAC;AAC/C,eAAO,MAAM,+BAA+B,UAAY,CAAC;AACzD,eAAO,MAAM,2BAA2B,WAAa,CAAC;AACtD,eAAO,MAAM,4BAA4B,SAAU,CAAC;AACpD,eAAO,MAAM,qBAAqB,UAAY,CAAC;AAC/C,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,4BAA4B,OAAQ,CAAC;AAClD,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,mCAAmC,OAAQ,CAAC;AACzD,eAAO,MAAM,iCAAiC,QAAS,CAAC;AAexD,iFAAiF;AACjF,qBAAa,wBAAyB,SAAQ,eAAe;IAC3D,QAAQ,CAAC,MAAM,OAAO;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBAG7B,OAAO,EAAE,MAAM,EACf,IAAI,SAAuB,EAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAMpC;AAgWD,yEAAyE;AACzE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAiIxE;AA2UD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,OAAO,GACnB,gBAAgB,CAuGlB;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAI7E;AAED,4FAA4F;AAC5F,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,OAAO,GACd,MAAM,CAER;AAuLD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,OAAO,EACrB,WAAW,EAAE,OAAO,GACnB,eAAe,CAuLjB"}
1
+ {"version":3,"file":"data-query.d.ts","sourceRoot":"","sources":["../src/data-query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAUV,gBAAgB,EAChB,eAAe,EAGf,eAAe,EAGhB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAU,CAAC;AAG3C,4EAA4E;AAC5E,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAChD,eAAO,MAAM,yBAAyB,OAAQ,CAAC;AAC/C,eAAO,MAAM,+BAA+B,UAAY,CAAC;AACzD,eAAO,MAAM,2BAA2B,WAAa,CAAC;AACtD,eAAO,MAAM,4BAA4B,SAAU,CAAC;AACpD,eAAO,MAAM,qBAAqB,UAAY,CAAC;AAC/C,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,4BAA4B,OAAQ,CAAC;AAClD,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,mCAAmC,OAAQ,CAAC;AACzD,eAAO,MAAM,iCAAiC,QAAS,CAAC;AAexD,iFAAiF;AACjF,qBAAa,wBAAyB,SAAQ,eAAe;IAC3D,QAAQ,CAAC,MAAM,OAAO;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBAG7B,OAAO,EAAE,MAAM,EACf,IAAI,SAAuB,EAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAMpC;AAgWD,yEAAyE;AACzE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAiIxE;AA2UD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,OAAO,GACnB,gBAAgB,CAuGlB;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAI7E;AAED,4FAA4F;AAC5F,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,OAAO,GACd,MAAM,CAER;AAuLD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,OAAO,EACrB,WAAW,EAAE,OAAO,GACnB,eAAe,CAuLjB"}
@@ -1,17 +1,6 @@
1
1
  import { ValidationError } from "./errors.js";
2
- import { createHash } from "node:crypto";
2
+ import { sha256Base64Url } from "./utils/sha256.js";
3
3
  //#region src/data-query.ts
4
- /**
5
- * Canonical bounded data-query normalization (#2444).
6
- *
7
- * The shared package supplies only portable types. This server/runtime module
8
- * makes the contract executable at every trust boundary: it accepts only an
9
- * adapter-declared field/operator allowlist, canonicalizes equivalent
10
- * requests, creates a collision-resistant match fingerprint, and validates
11
- * that adapters return bounded, policy-filtered rows. It deliberately does
12
- * not execute SQL or resolve tenant/principal state; authenticated domain
13
- * adapters supply the schema and perform those responsibilities separately.
14
- */
15
4
  /** Default and hard ceilings for normalized data-query input and output. */
16
5
  var DEFAULT_DATA_QUERY_PAGE_LIMIT = 50;
17
6
  var MAX_DATA_QUERY_PAGE_LIMIT = 1e3;
@@ -606,7 +595,7 @@ function canonicalizeDataQuery(value, schema) {
606
595
  }
607
596
  /** Collision-resistant canonical fingerprint for result correlation and selection scope. */
608
597
  function createDataQueryFingerprint(value, schema) {
609
- return `dq1_${createHash("sha256").update(canonicalizeDataQuery(value, schema)).digest("base64url")}`;
598
+ return `dq1_${sha256Base64Url(canonicalizeDataQuery(value, schema))}`;
610
599
  }
611
600
  function normalizeResultFieldValue(value, descriptor, label, budget) {
612
601
  if (descriptor.type === "json") return canonicalJson(value, label, budget);
@@ -1 +1 @@
1
- {"version":3,"file":"data-query.js","names":[],"sources":["../src/data-query.ts"],"sourcesContent":["/**\n * Canonical bounded data-query normalization (#2444).\n *\n * The shared package supplies only portable types. This server/runtime module\n * makes the contract executable at every trust boundary: it accepts only an\n * adapter-declared field/operator allowlist, canonicalizes equivalent\n * requests, creates a collision-resistant match fingerprint, and validates\n * that adapters return bounded, policy-filtered rows. It deliberately does\n * not execute SQL or resolve tenant/principal state; authenticated domain\n * adapters supply the schema and perform those responsibilities separately.\n */\n\nimport { createHash } from 'node:crypto';\nimport type {\n DataQueryCondition,\n DataQueryConsistency,\n DataQueryFacetRequest,\n DataQueryFacetResult,\n DataQueryFieldDescriptor,\n DataQueryFilter,\n DataQueryFilterOperator,\n DataQueryFreshness,\n DataQueryPage,\n DataQueryRequest,\n DataQueryResult,\n DataQueryRow,\n DataQueryScalar,\n DataQuerySchema,\n DataQuerySort,\n DataQueryTotal,\n} from '@happyvertical/smrt-types';\nimport { ValidationError } from './errors';\n\n/** Default and hard ceilings for normalized data-query input and output. */\nexport const DEFAULT_DATA_QUERY_PAGE_LIMIT = 50;\nexport const MAX_DATA_QUERY_PAGE_LIMIT = 1_000;\nexport const DEFAULT_DATA_QUERY_RESULT_BYTES = 1_000_000;\nexport const MAX_DATA_QUERY_RESULT_BYTES = 10_000_000;\nexport const MAX_DATA_QUERY_REQUEST_BYTES = 100_000;\nexport const MAX_DATA_QUERY_OFFSET = 1_000_000;\nexport const MAX_DATA_QUERY_FILTER_DEPTH = 8;\nexport const MAX_DATA_QUERY_FILTERS = 50;\nexport const MAX_DATA_QUERY_IN_VALUES = 100;\nexport const MAX_DATA_QUERY_FACETS = 20;\nexport const MAX_DATA_QUERY_WARNINGS = 100;\nexport const MAX_DATA_QUERY_CURSOR_LENGTH = 2_048;\nexport const MAX_DATA_QUERY_JSON_DEPTH = 16;\nexport const MAX_DATA_QUERY_JSON_CONTAINER_ITEMS = 1_000;\nexport const MAX_DATA_QUERY_JSON_STRING_LENGTH = 65_536;\n\nconst FILTER_OPERATORS = new Set<DataQueryFilterOperator>([\n 'eq',\n 'ne',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'in',\n 'notIn',\n 'like',\n]);\nconst FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/** A typed 400-class failure for malformed or policy-disallowed data queries. */\nexport class DataQueryValidationError extends ValidationError {\n readonly status = 400;\n readonly publicMessage: string;\n\n constructor(\n message: string,\n code = 'INVALID_DATA_QUERY',\n details?: Record<string, unknown>,\n ) {\n super(message, code, details);\n this.name = 'DataQueryValidationError';\n this.publicMessage = message;\n }\n}\n\ntype JsonObject = Record<string, unknown>;\n\ninterface JsonBudget {\n remaining: number;\n failureCode: string;\n}\n\nconst encoder = new TextEncoder();\nconst RFC_3339_INSTANT =\n /^(\\d{4})-(\\d{2})-(\\d{2})T([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(?:\\.\\d{1,9})?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$/;\n\nfunction fail(\n message: string,\n code = 'INVALID_DATA_QUERY',\n details?: Record<string, unknown>,\n): never {\n throw new DataQueryValidationError(message, code, details);\n}\n\nfunction plainObject(value: unknown, label: string): JsonObject {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return fail(`${label} must be an object`);\n }\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return fail(`${label} must be a plain object`);\n }\n for (const key of Object.keys(value)) {\n if (FORBIDDEN_KEYS.has(key)) {\n return fail(`${label} contains a forbidden key`, 'FORBIDDEN_DATA_QUERY');\n }\n }\n return value as JsonObject;\n}\n\nfunction exactKeys(\n object: JsonObject,\n allowed: readonly string[],\n label: string,\n): void {\n const allowedKeys = new Set(allowed);\n for (const key of Object.keys(object)) {\n if (!allowedKeys.has(key)) {\n fail(\n `${label} contains unsupported key \"${key}\"`,\n 'FORBIDDEN_DATA_QUERY',\n );\n }\n }\n}\n\nfunction stringValue(value: unknown, label: string, maxLength = 256): string {\n if (\n typeof value !== 'string' ||\n value.length === 0 ||\n value.length > maxLength\n ) {\n return fail(\n `${label} must be a non-empty string up to ${maxLength} characters`,\n );\n }\n return value;\n}\n\nfunction nonNegativeInteger(value: unknown, label: string): number {\n if (!Number.isSafeInteger(value) || (value as number) < 0) {\n return fail(`${label} must be a non-negative safe integer`);\n }\n return value as number;\n}\n\nfunction positiveInteger(value: unknown, label: string): number {\n const normalized = nonNegativeInteger(value, label);\n if (normalized === 0) return fail(`${label} must be a positive safe integer`);\n return normalized;\n}\n\nfunction normalizedInstant(value: unknown, label: string): string {\n const input = stringValue(value, label, 128);\n const match = RFC_3339_INSTANT.exec(input);\n if (!match) return fail(`${label} must be an RFC 3339 instant`);\n const [year, month, day] = match.slice(1, 4).map(Number);\n const calendar = new Date(0);\n calendar.setUTCFullYear(year, month - 1, day);\n calendar.setUTCHours(0, 0, 0, 0);\n if (\n calendar.getUTCFullYear() !== year ||\n calendar.getUTCMonth() !== month - 1 ||\n calendar.getUTCDate() !== day\n ) {\n return fail(`${label} must be an RFC 3339 instant`);\n }\n const milliseconds = Date.parse(input);\n if (!Number.isFinite(milliseconds)) {\n return fail(`${label} must be an RFC 3339 instant`);\n }\n return new Date(milliseconds).toISOString();\n}\n\nfunction dataQueryScalar(value: unknown, label: string): DataQueryScalar {\n if (value === null || typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n if (value.length > 4_096) {\n return fail(`${label} cannot exceed 4096 characters`);\n }\n return value;\n }\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n return fail(`${label} must be a JSON scalar`);\n}\n\nfunction consumeJsonSegment(\n budget: JsonBudget | undefined,\n text: string,\n label: string,\n): void {\n if (!budget) return;\n if (text.length > budget.remaining) {\n fail(`${label} exceeds the maximum byte limit`, budget.failureCode);\n }\n const bytes = encoder.encode(text).byteLength;\n if (bytes > budget.remaining) {\n fail(`${label} exceeds the maximum byte limit`, budget.failureCode);\n }\n budget.remaining -= bytes;\n}\n\nfunction canonicalJson(\n value: unknown,\n label = 'Data query JSON',\n budget?: JsonBudget,\n depth = 0,\n ancestors = new Set<object>(),\n): unknown {\n if (depth > MAX_DATA_QUERY_JSON_DEPTH) {\n return fail(`${label} exceeds the JSON depth limit`);\n }\n if (value === null || typeof value === 'boolean') {\n consumeJsonSegment(budget, JSON.stringify(value), label);\n return value;\n }\n if (typeof value === 'string') {\n if (value.length > MAX_DATA_QUERY_JSON_STRING_LENGTH) {\n return fail(`${label} exceeds the JSON string limit`);\n }\n consumeJsonSegment(budget, JSON.stringify(value), label);\n return value;\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value))\n return fail(`${label} cannot contain a non-finite number`);\n const normalized = value === 0 ? 0 : value;\n consumeJsonSegment(budget, JSON.stringify(normalized), label);\n return normalized;\n }\n if (Array.isArray(value)) {\n if (value.length > MAX_DATA_QUERY_JSON_CONTAINER_ITEMS) {\n return fail(`${label} exceeds the JSON container-item limit`);\n }\n if (ancestors.has(value)) return fail(`${label} cannot contain a cycle`);\n ancestors.add(value);\n try {\n const result: unknown[] = [];\n consumeJsonSegment(budget, '[', label);\n for (const [index, entry] of value.entries()) {\n if (index > 0) consumeJsonSegment(budget, ',', label);\n result.push(\n canonicalJson(\n entry,\n `${label}[${index}]`,\n budget,\n depth + 1,\n ancestors,\n ),\n );\n }\n consumeJsonSegment(budget, ']', label);\n return result;\n } finally {\n ancestors.delete(value);\n }\n }\n const object = plainObject(value, label);\n const keys = Object.keys(object).sort(compareCanonicalStrings);\n if (keys.length > MAX_DATA_QUERY_JSON_CONTAINER_ITEMS) {\n return fail(`${label} exceeds the JSON container-item limit`);\n }\n if (ancestors.has(object)) return fail(`${label} cannot contain a cycle`);\n ancestors.add(object);\n try {\n const result: JsonObject = Object.create(null) as JsonObject;\n consumeJsonSegment(budget, '{', label);\n for (const [index, key] of keys.entries()) {\n if (key.length > MAX_DATA_QUERY_JSON_STRING_LENGTH) {\n return fail(`${label}.${key} exceeds the JSON string limit`);\n }\n if (index > 0) consumeJsonSegment(budget, ',', label);\n consumeJsonSegment(budget, JSON.stringify(key), `${label}.${key}`);\n consumeJsonSegment(budget, ':', label);\n Object.defineProperty(result, key, {\n value: canonicalJson(\n object[key],\n `${label}.${key}`,\n budget,\n depth + 1,\n ancestors,\n ),\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n consumeJsonSegment(budget, '}', label);\n return result;\n } finally {\n ancestors.delete(object);\n }\n}\n\nfunction signature(value: unknown): string {\n return JSON.stringify(canonicalJson(value));\n}\n\n/** Reject an over-limit raw request before canonicalization can collapse it. */\nfunction assertBoundedRawRequest(value: unknown): void {\n const budget: JsonBudget = {\n remaining: MAX_DATA_QUERY_REQUEST_BYTES,\n failureCode: 'DATA_QUERY_REQUEST_TOO_LARGE',\n };\n const ancestors = new Set<object>();\n\n const measure = (candidate: unknown, label: string, depth = 0): void => {\n if (depth > MAX_DATA_QUERY_JSON_DEPTH) {\n fail(`${label} exceeds the JSON depth limit`);\n }\n if (candidate === null || typeof candidate === 'boolean') {\n consumeJsonSegment(budget, JSON.stringify(candidate), label);\n return;\n }\n if (typeof candidate === 'string') {\n consumeJsonSegment(budget, JSON.stringify(candidate), label);\n return;\n }\n if (typeof candidate === 'number') {\n if (!Number.isFinite(candidate)) {\n fail(`${label} cannot contain a non-finite number`);\n }\n consumeJsonSegment(\n budget,\n JSON.stringify(candidate === 0 ? 0 : candidate),\n label,\n );\n return;\n }\n if (Array.isArray(candidate)) {\n if (ancestors.has(candidate)) fail(`${label} cannot contain a cycle`);\n ancestors.add(candidate);\n try {\n consumeJsonSegment(budget, '[', label);\n for (const [index, entry] of candidate.entries()) {\n if (index > 0) consumeJsonSegment(budget, ',', label);\n measure(entry, `${label}[${index}]`, depth + 1);\n }\n consumeJsonSegment(budget, ']', label);\n } finally {\n ancestors.delete(candidate);\n }\n return;\n }\n const object = plainObject(candidate, label);\n if (ancestors.has(object)) fail(`${label} cannot contain a cycle`);\n ancestors.add(object);\n try {\n consumeJsonSegment(budget, '{', label);\n for (const [index, key] of Object.keys(object).entries()) {\n if (index > 0) consumeJsonSegment(budget, ',', label);\n consumeJsonSegment(budget, JSON.stringify(key), `${label}.${key}`);\n consumeJsonSegment(budget, ':', label);\n measure(object[key], `${label}.${key}`, depth + 1);\n }\n consumeJsonSegment(budget, '}', label);\n } finally {\n ancestors.delete(object);\n }\n };\n\n measure(value, 'Data query request');\n}\n\n/** Locale-independent ordering for canonical envelopes and fingerprints. */\nfunction compareCanonicalStrings(left: string, right: string): number {\n if (left === right) return 0;\n return left < right ? -1 : 1;\n}\n\nfunction normalizeFieldDescriptor(value: unknown): DataQueryFieldDescriptor {\n const object = plainObject(value, 'Data query schema field');\n exactKeys(\n object,\n ['id', 'type', 'projectable', 'sortable', 'facetable', 'filterOperators'],\n 'Data query schema field',\n );\n const id = stringValue(object.id, 'Data query field id');\n const type = stringValue(object.type, `Data query field ${id} type`);\n if (!['string', 'number', 'boolean', 'datetime', 'json'].includes(type)) {\n return fail(`Unsupported data query field type: ${type}`);\n }\n for (const flag of ['projectable', 'sortable', 'facetable'] as const) {\n if (object[flag] !== undefined && typeof object[flag] !== 'boolean') {\n fail(`Data query field ${id} ${flag} must be boolean`);\n }\n }\n let filterOperators: DataQueryFilterOperator[] | undefined;\n if (object.filterOperators !== undefined) {\n if (!Array.isArray(object.filterOperators)) {\n return fail(`Data query field ${id} filterOperators must be an array`);\n }\n filterOperators = [\n ...new Set(\n object.filterOperators.map((operator) => {\n const normalized = stringValue(\n operator,\n `Data query field ${id} filter operator`,\n ) as DataQueryFilterOperator;\n if (!FILTER_OPERATORS.has(normalized)) {\n fail(`Unsupported data query filter operator: ${normalized}`);\n }\n return normalized;\n }),\n ),\n ].sort();\n }\n const projectable =\n typeof object.projectable === 'boolean' ? object.projectable : undefined;\n const sortable =\n typeof object.sortable === 'boolean' ? object.sortable : undefined;\n const facetable =\n typeof object.facetable === 'boolean' ? object.facetable : undefined;\n return {\n id,\n type: type as DataQueryFieldDescriptor['type'],\n ...(projectable === undefined ? {} : { projectable }),\n ...(sortable === undefined ? {} : { sortable }),\n ...(facetable === undefined ? {} : { facetable }),\n ...(filterOperators ? { filterOperators } : {}),\n };\n}\n\n/** Validate and canonicalize trusted adapter query policy before use. */\nexport function normalizeDataQuerySchema(value: unknown): DataQuerySchema {\n const object = plainObject(value, 'Data query schema');\n exactKeys(\n object,\n [\n 'version',\n 'identityField',\n 'fields',\n 'defaultPageLimit',\n 'maxPageLimit',\n 'maxResultBytes',\n 'defaultSort',\n 'supports',\n ],\n 'Data query schema',\n );\n if (object.version !== 1)\n return fail('Unsupported data query schema version');\n if (!Array.isArray(object.fields) || object.fields.length === 0) {\n return fail('Data query schema fields must be a non-empty array');\n }\n const fields = object.fields\n .map(normalizeFieldDescriptor)\n .sort((left, right) => compareCanonicalStrings(left.id, right.id));\n if (new Set(fields.map((field) => field.id)).size !== fields.length) {\n return fail('Data query schema field ids must be unique');\n }\n const identityField = stringValue(\n object.identityField,\n 'Data query identity field',\n );\n const identity = fields.find((field) => field.id === identityField);\n if (!identity) return fail('Data query identity field must be declared');\n if (identity.projectable === false) {\n return fail('Data query identity field must be projectable');\n }\n if (!['string', 'number', 'datetime'].includes(identity.type)) {\n return fail(\n 'Data query identity field must use a string, number, or datetime type',\n );\n }\n const maxPageLimit =\n object.maxPageLimit === undefined\n ? MAX_DATA_QUERY_PAGE_LIMIT\n : positiveInteger(object.maxPageLimit, 'Data query maximum page limit');\n if (maxPageLimit > MAX_DATA_QUERY_PAGE_LIMIT) {\n return fail(\n `Data query maximum page limit cannot exceed ${MAX_DATA_QUERY_PAGE_LIMIT}`,\n );\n }\n const defaultPageLimit =\n object.defaultPageLimit === undefined\n ? Math.min(DEFAULT_DATA_QUERY_PAGE_LIMIT, maxPageLimit)\n : positiveInteger(\n object.defaultPageLimit,\n 'Data query default page limit',\n );\n if (defaultPageLimit > maxPageLimit) {\n return fail(\n 'Data query default page limit cannot exceed the maximum page limit',\n );\n }\n const maxResultBytes =\n object.maxResultBytes === undefined\n ? DEFAULT_DATA_QUERY_RESULT_BYTES\n : positiveInteger(\n object.maxResultBytes,\n 'Data query maximum result bytes',\n );\n if (maxResultBytes > MAX_DATA_QUERY_RESULT_BYTES) {\n return fail(\n `Data query maximum result bytes cannot exceed ${MAX_DATA_QUERY_RESULT_BYTES}`,\n );\n }\n let supports: DataQuerySchema['supports'];\n if (object.supports !== undefined) {\n const supportObject = plainObject(\n object.supports,\n 'Data query schema supports',\n );\n exactKeys(\n supportObject,\n ['cursorPagination', 'consistency', 'facets'],\n 'Data query schema supports',\n );\n for (const key of ['cursorPagination', 'consistency', 'facets'] as const) {\n if (\n supportObject[key] !== undefined &&\n typeof supportObject[key] !== 'boolean'\n ) {\n fail(`Data query schema supports.${key} must be boolean`);\n }\n }\n const cursorPagination =\n typeof supportObject.cursorPagination === 'boolean'\n ? supportObject.cursorPagination\n : undefined;\n const consistency =\n typeof supportObject.consistency === 'boolean'\n ? supportObject.consistency\n : undefined;\n const facets =\n typeof supportObject.facets === 'boolean'\n ? supportObject.facets\n : undefined;\n supports = {\n ...(cursorPagination === undefined ? {} : { cursorPagination }),\n ...(consistency === undefined ? {} : { consistency }),\n ...(facets === undefined ? {} : { facets }),\n };\n }\n const fieldMap = new Map(fields.map((field) => [field.id, field]));\n const defaultSort = normalizeSort(\n object.defaultSort,\n fieldMap,\n identityField,\n 'Data query default sort',\n false,\n );\n return {\n version: 1,\n identityField,\n fields,\n defaultPageLimit,\n maxPageLimit,\n maxResultBytes,\n ...(defaultSort.length > 0 ? { defaultSort } : {}),\n ...(supports ? { supports } : {}),\n };\n}\n\ninterface FilterBudget {\n nodes: number;\n}\n\nfunction scalarForField(\n value: unknown,\n descriptor: DataQueryFieldDescriptor,\n label: string,\n): DataQueryScalar {\n const scalar = dataQueryScalar(value, label);\n if (scalar === null) return scalar;\n if (descriptor.type === 'number' && typeof scalar !== 'number') {\n return fail(`${label} must be a number for ${descriptor.id}`);\n }\n if (descriptor.type === 'boolean' && typeof scalar !== 'boolean') {\n return fail(`${label} must be a boolean for ${descriptor.id}`);\n }\n if (descriptor.type === 'string' && typeof scalar !== 'string') {\n return fail(`${label} must be a string for ${descriptor.id}`);\n }\n if (descriptor.type === 'datetime') {\n if (typeof scalar !== 'string') {\n return fail(`${label} must be an RFC 3339 instant for ${descriptor.id}`);\n }\n return normalizedInstant(scalar, label);\n }\n return scalar;\n}\n\nfunction normalizeFilter(\n value: unknown,\n fields: Map<string, DataQueryFieldDescriptor>,\n depth = 0,\n budget: FilterBudget = { nodes: 0 },\n): DataQueryFilter {\n if (depth > MAX_DATA_QUERY_FILTER_DEPTH) {\n return fail(\n `Data query filter cannot exceed depth ${MAX_DATA_QUERY_FILTER_DEPTH}`,\n );\n }\n budget.nodes += 1;\n if (budget.nodes > MAX_DATA_QUERY_FILTERS) {\n return fail(\n `Data query filter cannot exceed ${MAX_DATA_QUERY_FILTERS} expressions`,\n );\n }\n const object = plainObject(value, 'Data query filter');\n const kind = stringValue(object.kind, 'Data query filter kind');\n if (kind === 'condition') {\n exactKeys(\n object,\n ['kind', 'field', 'operator', 'value'],\n 'Data query condition',\n );\n const field = stringValue(object.field, 'Data query condition field');\n const descriptor = fields.get(field);\n if (!descriptor)\n return fail(\n `Data query field is not declared: ${field}`,\n 'DATA_QUERY_FIELD_NOT_ALLOWED',\n );\n const operator = stringValue(\n object.operator,\n 'Data query condition operator',\n ) as DataQueryFilterOperator;\n if (\n !FILTER_OPERATORS.has(operator) ||\n !descriptor.filterOperators?.includes(operator)\n ) {\n return fail(\n `Data query operator ${operator} is not allowed for ${field}`,\n 'DATA_QUERY_OPERATOR_NOT_ALLOWED',\n );\n }\n if (operator === 'in' || operator === 'notIn') {\n if (!Array.isArray(object.value) || object.value.length === 0) {\n return fail(`Data query ${operator} value must be a non-empty array`);\n }\n if (object.value.length > MAX_DATA_QUERY_IN_VALUES) {\n return fail(\n `Data query ${operator} value cannot exceed ${MAX_DATA_QUERY_IN_VALUES} items`,\n );\n }\n const values = object.value.map((entry, index) =>\n scalarForField(\n entry,\n descriptor,\n `Data query ${operator} value ${index}`,\n ),\n );\n const canonicalValues = [\n ...new Map(values.map((entry) => [signature(entry), entry])).values(),\n ].sort((left, right) =>\n compareCanonicalStrings(signature(left), signature(right)),\n );\n return { kind: 'condition', field, operator, value: canonicalValues };\n }\n if (Array.isArray(object.value)) {\n return fail(`Data query ${operator} value must be a scalar`);\n }\n const scalar = scalarForField(\n object.value,\n descriptor,\n `Data query ${operator} value`,\n );\n if (operator === 'like' && descriptor.type !== 'string') {\n return fail('Data query like is only available for string fields');\n }\n if (operator === 'like' && typeof scalar !== 'string') {\n return fail('Data query like value must be a string');\n }\n if (\n ['gt', 'gte', 'lt', 'lte'].includes(operator) &&\n !['number', 'string', 'datetime'].includes(descriptor.type)\n ) {\n return fail(\n `Data query ${operator} is not available for ${descriptor.type} fields`,\n );\n }\n if (\n ['gt', 'gte', 'lt', 'lte', 'like'].includes(operator) &&\n scalar === null\n ) {\n return fail(`Data query ${operator} value cannot be null`);\n }\n return {\n kind: 'condition',\n field,\n operator,\n value: scalar,\n } as DataQueryCondition;\n }\n if (kind === 'all' || kind === 'any') {\n exactKeys(object, ['kind', 'filters'], `Data query ${kind} filter`);\n if (!Array.isArray(object.filters) || object.filters.length === 0) {\n return fail(`Data query ${kind} filter must contain at least one child`);\n }\n if (object.filters.length > MAX_DATA_QUERY_FILTERS) {\n return fail(\n `Data query ${kind} filter cannot exceed ${MAX_DATA_QUERY_FILTERS} children`,\n );\n }\n const filters = object.filters\n .map((filter) => normalizeFilter(filter, fields, depth + 1, budget))\n .sort((left, right) =>\n compareCanonicalStrings(signature(left), signature(right)),\n );\n return { kind, filters };\n }\n if (kind === 'not') {\n exactKeys(object, ['kind', 'filter'], 'Data query not filter');\n return {\n kind: 'not',\n filter: normalizeFilter(object.filter, fields, depth + 1, budget),\n };\n }\n return fail(`Unsupported data query filter kind: ${kind}`);\n}\n\nfunction normalizeSort(\n value: unknown,\n fields: Map<string, DataQueryFieldDescriptor>,\n identityField: string,\n label: string,\n appendIdentity: boolean,\n): DataQuerySort[] {\n if (value === undefined)\n return appendIdentity ? [{ field: identityField, direction: 'asc' }] : [];\n if (!Array.isArray(value)) return fail(`${label} must be an array`);\n if (value.length > MAX_DATA_QUERY_FILTERS) {\n return fail(`${label} cannot exceed ${MAX_DATA_QUERY_FILTERS} terms`);\n }\n const sort = value.map((entry) => {\n const object = plainObject(entry, label);\n exactKeys(object, ['field', 'direction'], label);\n const field = stringValue(object.field, `${label} field`);\n if (!fields.get(field)?.sortable && field !== identityField) {\n fail(\n `Data query sort field is not allowed: ${field}`,\n 'DATA_QUERY_SORT_NOT_ALLOWED',\n );\n }\n const direction = stringValue(object.direction, `${label} direction`);\n if (direction !== 'asc' && direction !== 'desc') {\n fail(`Data query sort direction must be asc or desc`);\n }\n return { field, direction } as DataQuerySort;\n });\n if (new Set(sort.map((term) => term.field)).size !== sort.length) {\n return fail(`${label} field ids must be unique`);\n }\n if (appendIdentity && !sort.some((term) => term.field === identityField)) {\n sort.push({ field: identityField, direction: 'asc' });\n }\n return sort;\n}\n\nfunction normalizePage(value: unknown, schema: DataQuerySchema): DataQueryPage {\n if (value === undefined) {\n return {\n kind: 'offset',\n offset: 0,\n limit: schema.defaultPageLimit ?? DEFAULT_DATA_QUERY_PAGE_LIMIT,\n };\n }\n const object = plainObject(value, 'Data query page');\n const kind = stringValue(object.kind, 'Data query page kind');\n if (kind === 'offset') {\n exactKeys(object, ['kind', 'offset', 'limit'], 'Data query offset page');\n const offset = nonNegativeInteger(object.offset, 'Data query offset');\n if (offset > MAX_DATA_QUERY_OFFSET) {\n return fail(`Data query offset cannot exceed ${MAX_DATA_QUERY_OFFSET}`);\n }\n return {\n kind,\n offset,\n limit: Math.min(\n positiveInteger(object.limit, 'Data query page limit'),\n schema.maxPageLimit ?? MAX_DATA_QUERY_PAGE_LIMIT,\n ),\n };\n }\n if (kind === 'cursor') {\n if (!schema.supports?.cursorPagination) {\n return fail(\n 'Data query cursor pagination is not supported',\n 'DATA_QUERY_UNSUPPORTED',\n );\n }\n exactKeys(object, ['kind', 'after', 'limit'], 'Data query cursor page');\n const after =\n object.after === undefined\n ? undefined\n : stringValue(\n object.after,\n 'Data query cursor',\n MAX_DATA_QUERY_CURSOR_LENGTH,\n );\n return {\n kind,\n ...(after === undefined ? {} : { after }),\n limit: Math.min(\n positiveInteger(object.limit, 'Data query page limit'),\n schema.maxPageLimit ?? MAX_DATA_QUERY_PAGE_LIMIT,\n ),\n };\n }\n return fail(`Unsupported data query page kind: ${kind}`);\n}\n\nfunction normalizeConsistency(\n value: unknown,\n schema: DataQuerySchema,\n): DataQueryConsistency | undefined {\n if (value === undefined) return undefined;\n if (!schema.supports?.consistency) {\n return fail(\n 'Data query consistency options are not supported',\n 'DATA_QUERY_UNSUPPORTED',\n );\n }\n const object = plainObject(value, 'Data query consistency');\n exactKeys(object, ['mode', 'asOf'], 'Data query consistency');\n if (object.mode !== 'eventual' && object.mode !== 'snapshot')\n return fail('Unsupported data query consistency mode');\n const asOf =\n object.asOf === undefined\n ? undefined\n : normalizedInstant(object.asOf, 'Data query consistency asOf');\n return {\n mode: object.mode,\n ...(asOf === undefined ? {} : { asOf }),\n } as DataQueryConsistency;\n}\n\nfunction normalizeFacets(\n value: unknown,\n schema: DataQuerySchema,\n fields: Map<string, DataQueryFieldDescriptor>,\n): DataQueryFacetRequest[] {\n if (!schema.supports?.facets) {\n return fail(\n 'Data query facets are not supported',\n 'DATA_QUERY_UNSUPPORTED',\n );\n }\n if (!Array.isArray(value) || value.length === 0) {\n return fail('Data query facets must be a non-empty array');\n }\n if (value.length > MAX_DATA_QUERY_FACETS) {\n return fail(`Data query facets cannot exceed ${MAX_DATA_QUERY_FACETS}`);\n }\n const facets = value.map((entry) => {\n const object = plainObject(entry, 'Data query facet request');\n exactKeys(object, ['field', 'limit'], 'Data query facet request');\n const field = stringValue(object.field, 'Data query facet field');\n if (!fields.get(field)?.facetable) {\n fail(\n `Data query facet field is not allowed: ${field}`,\n 'DATA_QUERY_FACET_NOT_ALLOWED',\n );\n }\n return {\n field,\n limit: Math.min(\n positiveInteger(object.limit, 'Data query facet limit'),\n schema.maxPageLimit ?? MAX_DATA_QUERY_PAGE_LIMIT,\n ),\n };\n });\n if (new Set(facets.map((facet) => facet.field)).size !== facets.length) {\n return fail('Data query facet fields must be unique');\n }\n return facets.sort((left, right) =>\n compareCanonicalStrings(left.field, right.field),\n );\n}\n\nfunction boundRequestSize(request: DataQueryRequest): DataQueryRequest {\n const bytes = new TextEncoder().encode(JSON.stringify(request)).byteLength;\n if (bytes > MAX_DATA_QUERY_REQUEST_BYTES) {\n return fail(\n 'Data query request exceeds its maximum byte limit',\n 'DATA_QUERY_REQUEST_TOO_LARGE',\n );\n }\n return request;\n}\n\n/**\n * Normalize an untrusted request against its trusted adapter schema. Equivalent\n * projection/filter/facet orderings produce byte-identical output; sort order\n * remains intact because it is semantically meaningful. The identity field is\n * always projected even when a caller omits it.\n */\nexport function normalizeDataQueryRequest(\n value: unknown,\n inputSchema: unknown,\n): DataQueryRequest {\n const schema = normalizeDataQuerySchema(inputSchema);\n const fields = new Map(schema.fields.map((field) => [field.id, field]));\n const object = plainObject(value, 'Data query request');\n assertBoundedRawRequest(value);\n exactKeys(\n object,\n [\n 'version',\n 'requestId',\n 'mode',\n 'projection',\n 'filter',\n 'sort',\n 'page',\n 'consistency',\n 'facets',\n ],\n 'Data query request',\n );\n if (object.version !== 1)\n return fail('Unsupported data query request version');\n const requestId = stringValue(object.requestId, 'Data query request id', 128);\n const mode = stringValue(object.mode, 'Data query mode');\n if (!['rows', 'count', 'facets'].includes(mode))\n return fail(`Unsupported data query mode: ${mode}`);\n const filter =\n object.filter === undefined\n ? undefined\n : normalizeFilter(object.filter, fields);\n const consistency = normalizeConsistency(object.consistency, schema);\n if (mode === 'rows') {\n if (object.facets !== undefined)\n return fail('Rows queries cannot request facets');\n if (object.projection !== undefined && !Array.isArray(object.projection)) {\n return fail('Data query projection must be an array');\n }\n if (\n Array.isArray(object.projection) &&\n object.projection.length > MAX_DATA_QUERY_FILTERS\n ) {\n return fail(\n `Data query projection cannot exceed ${MAX_DATA_QUERY_FILTERS} fields`,\n );\n }\n const requestedProjection = (object.projection ?? []).map((field) =>\n stringValue(field, 'Data query projection field'),\n );\n for (const field of requestedProjection) {\n if (!fields.get(field)?.projectable && field !== schema.identityField) {\n fail(\n `Data query projection field is not allowed: ${field}`,\n 'DATA_QUERY_PROJECTION_NOT_ALLOWED',\n );\n }\n }\n const projection = [\n ...new Set([...requestedProjection, schema.identityField]),\n ].sort();\n const sort = normalizeSort(\n object.sort === undefined ? schema.defaultSort : object.sort,\n fields,\n schema.identityField,\n 'Data query sort',\n true,\n );\n return boundRequestSize({\n version: 1,\n requestId,\n mode,\n projection,\n ...(filter === undefined ? {} : { filter }),\n sort,\n page: normalizePage(object.page, schema),\n ...(consistency === undefined ? {} : { consistency }),\n });\n }\n if (\n object.projection !== undefined ||\n object.sort !== undefined ||\n object.page !== undefined\n ) {\n return fail(`${mode} data queries cannot carry projection, sort, or page`);\n }\n if (mode === 'facets') {\n return boundRequestSize({\n version: 1,\n requestId,\n mode,\n ...(filter === undefined ? {} : { filter }),\n ...(consistency === undefined ? {} : { consistency }),\n facets: normalizeFacets(object.facets, schema, fields),\n });\n }\n if (object.facets !== undefined)\n return fail('Count data queries cannot request facets');\n return boundRequestSize({\n version: 1,\n requestId,\n mode: 'count',\n ...(filter === undefined ? {} : { filter }),\n ...(consistency === undefined ? {} : { consistency }),\n });\n}\n\n/** Canonical match/query form used for stable fingerprints (no request id/page). */\nexport function canonicalizeDataQuery(value: unknown, schema: unknown): string {\n const request = normalizeDataQueryRequest(value, schema);\n const { requestId: _requestId, page: _page, ...semanticQuery } = request;\n return signature(semanticQuery);\n}\n\n/** Collision-resistant canonical fingerprint for result correlation and selection scope. */\nexport function createDataQueryFingerprint(\n value: unknown,\n schema: unknown,\n): string {\n return `dq1_${createHash('sha256').update(canonicalizeDataQuery(value, schema)).digest('base64url')}`;\n}\n\nfunction normalizeResultFieldValue(\n value: unknown,\n descriptor: DataQueryFieldDescriptor,\n label: string,\n budget: JsonBudget,\n): unknown {\n if (descriptor.type === 'json') return canonicalJson(value, label, budget);\n const normalized = scalarForField(value, descriptor, label);\n consumeJsonSegment(budget, JSON.stringify(normalized), label);\n return normalized;\n}\n\nfunction normalizeRow(\n value: unknown,\n projection: readonly string[],\n identityField: string,\n fields: Map<string, DataQueryFieldDescriptor>,\n budget: JsonBudget,\n): DataQueryRow {\n const object = plainObject(value, 'Data query row');\n const allowed = new Set(projection);\n const normalized: JsonObject = Object.create(null) as JsonObject;\n consumeJsonSegment(budget, '{', 'Data query row');\n for (const [index, key] of Object.keys(object).entries()) {\n if (!allowed.has(key)) {\n fail(\n `Data query row returned a non-projected field: ${key}`,\n 'DATA_QUERY_RESULT_NOT_ALLOWED',\n );\n }\n const descriptor = fields.get(key);\n if (!descriptor) {\n return fail(\n `Data query row returned an undeclared field: ${key}`,\n 'DATA_QUERY_RESULT_NOT_ALLOWED',\n );\n }\n if (index > 0) consumeJsonSegment(budget, ',', 'Data query row');\n consumeJsonSegment(budget, JSON.stringify(key), `Data query row ${key}`);\n consumeJsonSegment(budget, ':', `Data query row ${key}`);\n normalized[key] = normalizeResultFieldValue(\n object[key],\n descriptor,\n `Data query row ${key}`,\n budget,\n );\n }\n consumeJsonSegment(budget, '}', 'Data query row');\n const identity = normalized[identityField];\n if (\n (typeof identity !== 'string' && typeof identity !== 'number') ||\n identity === ''\n ) {\n fail(\n 'Data query row must return a string or number identity field',\n 'DATA_QUERY_RESULT_INVALID',\n );\n }\n return normalized as DataQueryRow;\n}\n\nfunction normalizeTotal(value: unknown): DataQueryTotal {\n const object = plainObject(value, 'Data query total');\n const kind = stringValue(object.kind, 'Data query total kind');\n if (kind === 'unavailable') {\n exactKeys(object, ['kind', 'reason'], 'Data query unavailable total');\n const reason =\n object.reason === undefined\n ? undefined\n : stringValue(object.reason, 'Data query total reason');\n return { kind, ...(reason === undefined ? {} : { reason }) };\n }\n if (kind !== 'exact' && kind !== 'estimated') {\n return fail(`Unsupported data query total kind: ${kind}`);\n }\n exactKeys(object, ['kind', 'value', 'asOf'], 'Data query total');\n const asOf =\n object.asOf === undefined\n ? undefined\n : normalizedInstant(object.asOf, 'Data query total asOf');\n return {\n kind,\n value: nonNegativeInteger(object.value, 'Data query total value'),\n ...(asOf === undefined ? {} : { asOf }),\n };\n}\n\nfunction normalizeFreshness(value: unknown): DataQueryFreshness {\n const object = plainObject(value, 'Data query freshness');\n exactKeys(object, ['state', 'asOf'], 'Data query freshness');\n const state = stringValue(object.state, 'Data query freshness state');\n if (!['fresh', 'stale', 'unknown'].includes(state)) {\n return fail(`Unsupported data query freshness state: ${state}`);\n }\n const asOf =\n object.asOf === undefined\n ? undefined\n : normalizedInstant(object.asOf, 'Data query freshness asOf');\n return {\n state: state as DataQueryFreshness['state'],\n ...(asOf === undefined ? {} : { asOf }),\n };\n}\n\nfunction normalizeFacetsResult(\n value: unknown,\n requested: readonly DataQueryFacetRequest[],\n fields: Map<string, DataQueryFieldDescriptor>,\n budget: JsonBudget,\n): DataQueryFacetResult[] {\n if (!Array.isArray(value))\n return fail('Data query result facets must be an array');\n if (value.length > requested.length) {\n return fail('Data query result returned too many facets');\n }\n const limits = new Map(requested.map((facet) => [facet.field, facet.limit]));\n consumeJsonSegment(budget, '[', 'Data query result facets');\n const results = value.map((entry, index) => {\n if (index > 0) consumeJsonSegment(budget, ',', 'Data query result facets');\n const object = plainObject(entry, 'Data query facet result');\n exactKeys(\n object,\n ['field', 'values', 'truncated'],\n 'Data query facet result',\n );\n const field = stringValue(object.field, 'Data query facet result field');\n const limit = limits.get(field);\n if (limit === undefined)\n return fail(`Data query returned an unrequested facet: ${field}`);\n if (!Array.isArray(object.values) || object.values.length > limit) {\n return fail(`Data query facet ${field} exceeds its requested limit`);\n }\n if (typeof object.truncated !== 'boolean')\n return fail('Data query facet truncated must be boolean');\n const descriptor = fields.get(field);\n if (!descriptor)\n return fail(`Data query facet field is not declared: ${field}`);\n consumeJsonSegment(budget, '{\"field\":', `Data query facet ${field}`);\n consumeJsonSegment(\n budget,\n JSON.stringify(field),\n `Data query facet ${field}`,\n );\n consumeJsonSegment(budget, ',\"values\":[', `Data query facet ${field}`);\n const values = object.values.map((candidate, valueIndex) => {\n if (valueIndex > 0)\n consumeJsonSegment(budget, ',', `Data query facet ${field}`);\n const facet = plainObject(candidate, 'Data query facet value');\n exactKeys(facet, ['value', 'count'], 'Data query facet value');\n const normalizedValue = scalarForField(\n facet.value,\n descriptor,\n `Data query facet ${field} value`,\n );\n const count = nonNegativeInteger(facet.count, 'Data query facet count');\n consumeJsonSegment(\n budget,\n `{\"value\":${JSON.stringify(normalizedValue)},\"count\":${JSON.stringify(count)}}`,\n `Data query facet ${field} value`,\n );\n return {\n value: normalizedValue,\n count,\n };\n });\n consumeJsonSegment(\n budget,\n `],\"truncated\":${object.truncated}}`,\n `Data query facet ${field}`,\n );\n return { field, values, truncated: object.truncated };\n });\n consumeJsonSegment(budget, ']', 'Data query result facets');\n if (new Set(results.map((facet) => facet.field)).size !== results.length) {\n return fail('Data query result facet fields must be unique');\n }\n return results.sort((left, right) =>\n compareCanonicalStrings(left.field, right.field),\n );\n}\n\n/**\n * Validate an adapter result against the normalized request and its schema.\n * This is the final projection boundary: undeclared fields, malformed totals,\n * forged fingerprints, oversized rows, and authority-shaped prototype payloads\n * cannot cross into REST, MCP, WebMCP, or browser consumers unnoticed.\n */\nexport function normalizeDataQueryResult(\n value: unknown,\n inputRequest: unknown,\n inputSchema: unknown,\n): DataQueryResult {\n const schema = normalizeDataQuerySchema(inputSchema);\n const request = normalizeDataQueryRequest(inputRequest, schema);\n const fields = new Map(schema.fields.map((field) => [field.id, field]));\n const object = plainObject(value, 'Data query result');\n exactKeys(\n object,\n [\n 'version',\n 'requestId',\n 'queryFingerprint',\n 'identityField',\n 'rows',\n 'page',\n 'total',\n 'facets',\n 'freshness',\n 'warnings',\n 'truncated',\n ],\n 'Data query result',\n );\n if (object.version !== 1)\n return fail('Unsupported data query result version');\n if (\n stringValue(object.requestId, 'Data query result request id', 128) !==\n request.requestId\n ) {\n return fail(\n 'Data query result request id does not match its request',\n 'DATA_QUERY_RESULT_INVALID',\n );\n }\n const fingerprint = createDataQueryFingerprint(request, schema);\n if (\n stringValue(\n object.queryFingerprint,\n 'Data query result fingerprint',\n 128,\n ) !== fingerprint\n ) {\n return fail(\n 'Data query result fingerprint does not match its request',\n 'DATA_QUERY_RESULT_INVALID',\n );\n }\n if (\n stringValue(object.identityField, 'Data query result identity field') !==\n schema.identityField\n ) {\n return fail(\n 'Data query result identity field does not match its schema',\n 'DATA_QUERY_RESULT_INVALID',\n );\n }\n if (!Array.isArray(object.rows))\n return fail('Data query result rows must be an array');\n const projection =\n request.mode === 'rows'\n ? (request.projection ?? [schema.identityField])\n : [];\n const page = request.mode === 'rows' ? request.page : undefined;\n if (request.mode !== 'rows' && object.rows.length > 0) {\n return fail(`${request.mode} data query results cannot return rows`);\n }\n if (page && object.rows.length > page.limit) {\n return fail('Data query result rows exceed its requested page limit');\n }\n const budget: JsonBudget = {\n remaining: schema.maxResultBytes ?? DEFAULT_DATA_QUERY_RESULT_BYTES,\n failureCode: 'DATA_QUERY_RESULT_TOO_LARGE',\n };\n consumeJsonSegment(budget, '[', 'Data query result rows');\n const rows = object.rows.map((row, index) => {\n if (index > 0) consumeJsonSegment(budget, ',', 'Data query result rows');\n return normalizeRow(row, projection, schema.identityField, fields, budget);\n });\n consumeJsonSegment(budget, ']', 'Data query result rows');\n let normalizedPage: DataQueryResult['page'];\n if (page) {\n const pageObject = plainObject(object.page, 'Data query result page');\n exactKeys(\n pageObject,\n ['kind', 'limit', 'offset', 'nextCursor', 'hasMore'],\n 'Data query result page',\n );\n if (\n pageObject.kind !== page.kind ||\n nonNegativeInteger(pageObject.limit, 'Data query result page limit') !==\n page.limit\n ) {\n return fail('Data query result page does not match its request');\n }\n if (typeof pageObject.hasMore !== 'boolean')\n return fail('Data query result page hasMore must be boolean');\n if (page.kind === 'offset') {\n if (\n nonNegativeInteger(pageObject.offset, 'Data query result offset') !==\n page.offset\n ) {\n return fail('Data query result offset does not match its request');\n }\n if (pageObject.nextCursor !== undefined)\n return fail('Offset data query results cannot return a cursor');\n normalizedPage = {\n kind: 'offset',\n limit: page.limit,\n offset: page.offset,\n hasMore: pageObject.hasMore,\n };\n } else {\n if (pageObject.offset !== undefined) {\n return fail('Cursor data query results cannot return an offset');\n }\n const nextCursor =\n pageObject.nextCursor === undefined\n ? undefined\n : stringValue(\n pageObject.nextCursor,\n 'Data query result next cursor',\n MAX_DATA_QUERY_CURSOR_LENGTH,\n );\n if (pageObject.hasMore !== Boolean(nextCursor)) {\n return fail('Data query cursor result hasMore must match nextCursor');\n }\n normalizedPage = {\n kind: 'cursor',\n limit: page.limit,\n hasMore: pageObject.hasMore,\n ...(nextCursor === undefined ? {} : { nextCursor }),\n };\n }\n } else if (object.page !== undefined) {\n return fail(`${request.mode} data query results cannot return a page`);\n }\n const total = normalizeTotal(object.total);\n const freshness = normalizeFreshness(object.freshness);\n if (\n !Array.isArray(object.warnings) ||\n object.warnings.length > MAX_DATA_QUERY_WARNINGS ||\n object.warnings.some(\n (warning) =>\n typeof warning !== 'string' ||\n warning.length === 0 ||\n warning.length > 512,\n )\n ) {\n return fail('Data query result warnings must be at most 100 short strings');\n }\n if (typeof object.truncated !== 'boolean')\n return fail('Data query result truncated must be boolean');\n const facets =\n request.mode === 'facets'\n ? normalizeFacetsResult(\n object.facets,\n request.facets ?? [],\n fields,\n budget,\n )\n : object.facets === undefined\n ? undefined\n : fail(`${request.mode} data query results cannot return facets`);\n const normalized: DataQueryResult = {\n version: 1,\n requestId: request.requestId,\n queryFingerprint: fingerprint,\n identityField: schema.identityField,\n rows,\n ...(normalizedPage === undefined ? {} : { page: normalizedPage }),\n total,\n ...(facets === undefined ? {} : { facets }),\n freshness,\n warnings: [...new Set(object.warnings)].sort(),\n truncated: object.truncated,\n };\n const bytes = new TextEncoder().encode(JSON.stringify(normalized)).byteLength;\n if (bytes > (schema.maxResultBytes ?? DEFAULT_DATA_QUERY_RESULT_BYTES)) {\n return fail(\n 'Data query result exceeds its maximum byte limit',\n 'DATA_QUERY_RESULT_TOO_LARGE',\n );\n }\n return normalized;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"data-query.js","names":[],"sources":["../src/data-query.ts"],"sourcesContent":["/**\n * Canonical bounded data-query normalization (#2444).\n *\n * The shared package supplies only portable types. This server/runtime module\n * makes the contract executable at every trust boundary: it accepts only an\n * adapter-declared field/operator allowlist, canonicalizes equivalent\n * requests, creates a collision-resistant match fingerprint, and validates\n * that adapters return bounded, policy-filtered rows. It deliberately does\n * not execute SQL or resolve tenant/principal state; authenticated domain\n * adapters supply the schema and perform those responsibilities separately.\n */\n\nimport type {\n DataQueryCondition,\n DataQueryConsistency,\n DataQueryFacetRequest,\n DataQueryFacetResult,\n DataQueryFieldDescriptor,\n DataQueryFilter,\n DataQueryFilterOperator,\n DataQueryFreshness,\n DataQueryPage,\n DataQueryRequest,\n DataQueryResult,\n DataQueryRow,\n DataQueryScalar,\n DataQuerySchema,\n DataQuerySort,\n DataQueryTotal,\n} from '@happyvertical/smrt-types';\nimport { ValidationError } from './errors';\nimport { sha256Base64Url } from './utils/sha256.js';\n\n/** Default and hard ceilings for normalized data-query input and output. */\nexport const DEFAULT_DATA_QUERY_PAGE_LIMIT = 50;\nexport const MAX_DATA_QUERY_PAGE_LIMIT = 1_000;\nexport const DEFAULT_DATA_QUERY_RESULT_BYTES = 1_000_000;\nexport const MAX_DATA_QUERY_RESULT_BYTES = 10_000_000;\nexport const MAX_DATA_QUERY_REQUEST_BYTES = 100_000;\nexport const MAX_DATA_QUERY_OFFSET = 1_000_000;\nexport const MAX_DATA_QUERY_FILTER_DEPTH = 8;\nexport const MAX_DATA_QUERY_FILTERS = 50;\nexport const MAX_DATA_QUERY_IN_VALUES = 100;\nexport const MAX_DATA_QUERY_FACETS = 20;\nexport const MAX_DATA_QUERY_WARNINGS = 100;\nexport const MAX_DATA_QUERY_CURSOR_LENGTH = 2_048;\nexport const MAX_DATA_QUERY_JSON_DEPTH = 16;\nexport const MAX_DATA_QUERY_JSON_CONTAINER_ITEMS = 1_000;\nexport const MAX_DATA_QUERY_JSON_STRING_LENGTH = 65_536;\n\nconst FILTER_OPERATORS = new Set<DataQueryFilterOperator>([\n 'eq',\n 'ne',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'in',\n 'notIn',\n 'like',\n]);\nconst FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/** A typed 400-class failure for malformed or policy-disallowed data queries. */\nexport class DataQueryValidationError extends ValidationError {\n readonly status = 400;\n readonly publicMessage: string;\n\n constructor(\n message: string,\n code = 'INVALID_DATA_QUERY',\n details?: Record<string, unknown>,\n ) {\n super(message, code, details);\n this.name = 'DataQueryValidationError';\n this.publicMessage = message;\n }\n}\n\ntype JsonObject = Record<string, unknown>;\n\ninterface JsonBudget {\n remaining: number;\n failureCode: string;\n}\n\nconst encoder = new TextEncoder();\nconst RFC_3339_INSTANT =\n /^(\\d{4})-(\\d{2})-(\\d{2})T([01]\\d|2[0-3]):([0-5]\\d):([0-5]\\d)(?:\\.\\d{1,9})?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$/;\n\nfunction fail(\n message: string,\n code = 'INVALID_DATA_QUERY',\n details?: Record<string, unknown>,\n): never {\n throw new DataQueryValidationError(message, code, details);\n}\n\nfunction plainObject(value: unknown, label: string): JsonObject {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return fail(`${label} must be an object`);\n }\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return fail(`${label} must be a plain object`);\n }\n for (const key of Object.keys(value)) {\n if (FORBIDDEN_KEYS.has(key)) {\n return fail(`${label} contains a forbidden key`, 'FORBIDDEN_DATA_QUERY');\n }\n }\n return value as JsonObject;\n}\n\nfunction exactKeys(\n object: JsonObject,\n allowed: readonly string[],\n label: string,\n): void {\n const allowedKeys = new Set(allowed);\n for (const key of Object.keys(object)) {\n if (!allowedKeys.has(key)) {\n fail(\n `${label} contains unsupported key \"${key}\"`,\n 'FORBIDDEN_DATA_QUERY',\n );\n }\n }\n}\n\nfunction stringValue(value: unknown, label: string, maxLength = 256): string {\n if (\n typeof value !== 'string' ||\n value.length === 0 ||\n value.length > maxLength\n ) {\n return fail(\n `${label} must be a non-empty string up to ${maxLength} characters`,\n );\n }\n return value;\n}\n\nfunction nonNegativeInteger(value: unknown, label: string): number {\n if (!Number.isSafeInteger(value) || (value as number) < 0) {\n return fail(`${label} must be a non-negative safe integer`);\n }\n return value as number;\n}\n\nfunction positiveInteger(value: unknown, label: string): number {\n const normalized = nonNegativeInteger(value, label);\n if (normalized === 0) return fail(`${label} must be a positive safe integer`);\n return normalized;\n}\n\nfunction normalizedInstant(value: unknown, label: string): string {\n const input = stringValue(value, label, 128);\n const match = RFC_3339_INSTANT.exec(input);\n if (!match) return fail(`${label} must be an RFC 3339 instant`);\n const [year, month, day] = match.slice(1, 4).map(Number);\n const calendar = new Date(0);\n calendar.setUTCFullYear(year, month - 1, day);\n calendar.setUTCHours(0, 0, 0, 0);\n if (\n calendar.getUTCFullYear() !== year ||\n calendar.getUTCMonth() !== month - 1 ||\n calendar.getUTCDate() !== day\n ) {\n return fail(`${label} must be an RFC 3339 instant`);\n }\n const milliseconds = Date.parse(input);\n if (!Number.isFinite(milliseconds)) {\n return fail(`${label} must be an RFC 3339 instant`);\n }\n return new Date(milliseconds).toISOString();\n}\n\nfunction dataQueryScalar(value: unknown, label: string): DataQueryScalar {\n if (value === null || typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n if (value.length > 4_096) {\n return fail(`${label} cannot exceed 4096 characters`);\n }\n return value;\n }\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n return fail(`${label} must be a JSON scalar`);\n}\n\nfunction consumeJsonSegment(\n budget: JsonBudget | undefined,\n text: string,\n label: string,\n): void {\n if (!budget) return;\n if (text.length > budget.remaining) {\n fail(`${label} exceeds the maximum byte limit`, budget.failureCode);\n }\n const bytes = encoder.encode(text).byteLength;\n if (bytes > budget.remaining) {\n fail(`${label} exceeds the maximum byte limit`, budget.failureCode);\n }\n budget.remaining -= bytes;\n}\n\nfunction canonicalJson(\n value: unknown,\n label = 'Data query JSON',\n budget?: JsonBudget,\n depth = 0,\n ancestors = new Set<object>(),\n): unknown {\n if (depth > MAX_DATA_QUERY_JSON_DEPTH) {\n return fail(`${label} exceeds the JSON depth limit`);\n }\n if (value === null || typeof value === 'boolean') {\n consumeJsonSegment(budget, JSON.stringify(value), label);\n return value;\n }\n if (typeof value === 'string') {\n if (value.length > MAX_DATA_QUERY_JSON_STRING_LENGTH) {\n return fail(`${label} exceeds the JSON string limit`);\n }\n consumeJsonSegment(budget, JSON.stringify(value), label);\n return value;\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value))\n return fail(`${label} cannot contain a non-finite number`);\n const normalized = value === 0 ? 0 : value;\n consumeJsonSegment(budget, JSON.stringify(normalized), label);\n return normalized;\n }\n if (Array.isArray(value)) {\n if (value.length > MAX_DATA_QUERY_JSON_CONTAINER_ITEMS) {\n return fail(`${label} exceeds the JSON container-item limit`);\n }\n if (ancestors.has(value)) return fail(`${label} cannot contain a cycle`);\n ancestors.add(value);\n try {\n const result: unknown[] = [];\n consumeJsonSegment(budget, '[', label);\n for (const [index, entry] of value.entries()) {\n if (index > 0) consumeJsonSegment(budget, ',', label);\n result.push(\n canonicalJson(\n entry,\n `${label}[${index}]`,\n budget,\n depth + 1,\n ancestors,\n ),\n );\n }\n consumeJsonSegment(budget, ']', label);\n return result;\n } finally {\n ancestors.delete(value);\n }\n }\n const object = plainObject(value, label);\n const keys = Object.keys(object).sort(compareCanonicalStrings);\n if (keys.length > MAX_DATA_QUERY_JSON_CONTAINER_ITEMS) {\n return fail(`${label} exceeds the JSON container-item limit`);\n }\n if (ancestors.has(object)) return fail(`${label} cannot contain a cycle`);\n ancestors.add(object);\n try {\n const result: JsonObject = Object.create(null) as JsonObject;\n consumeJsonSegment(budget, '{', label);\n for (const [index, key] of keys.entries()) {\n if (key.length > MAX_DATA_QUERY_JSON_STRING_LENGTH) {\n return fail(`${label}.${key} exceeds the JSON string limit`);\n }\n if (index > 0) consumeJsonSegment(budget, ',', label);\n consumeJsonSegment(budget, JSON.stringify(key), `${label}.${key}`);\n consumeJsonSegment(budget, ':', label);\n Object.defineProperty(result, key, {\n value: canonicalJson(\n object[key],\n `${label}.${key}`,\n budget,\n depth + 1,\n ancestors,\n ),\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n consumeJsonSegment(budget, '}', label);\n return result;\n } finally {\n ancestors.delete(object);\n }\n}\n\nfunction signature(value: unknown): string {\n return JSON.stringify(canonicalJson(value));\n}\n\n/** Reject an over-limit raw request before canonicalization can collapse it. */\nfunction assertBoundedRawRequest(value: unknown): void {\n const budget: JsonBudget = {\n remaining: MAX_DATA_QUERY_REQUEST_BYTES,\n failureCode: 'DATA_QUERY_REQUEST_TOO_LARGE',\n };\n const ancestors = new Set<object>();\n\n const measure = (candidate: unknown, label: string, depth = 0): void => {\n if (depth > MAX_DATA_QUERY_JSON_DEPTH) {\n fail(`${label} exceeds the JSON depth limit`);\n }\n if (candidate === null || typeof candidate === 'boolean') {\n consumeJsonSegment(budget, JSON.stringify(candidate), label);\n return;\n }\n if (typeof candidate === 'string') {\n consumeJsonSegment(budget, JSON.stringify(candidate), label);\n return;\n }\n if (typeof candidate === 'number') {\n if (!Number.isFinite(candidate)) {\n fail(`${label} cannot contain a non-finite number`);\n }\n consumeJsonSegment(\n budget,\n JSON.stringify(candidate === 0 ? 0 : candidate),\n label,\n );\n return;\n }\n if (Array.isArray(candidate)) {\n if (ancestors.has(candidate)) fail(`${label} cannot contain a cycle`);\n ancestors.add(candidate);\n try {\n consumeJsonSegment(budget, '[', label);\n for (const [index, entry] of candidate.entries()) {\n if (index > 0) consumeJsonSegment(budget, ',', label);\n measure(entry, `${label}[${index}]`, depth + 1);\n }\n consumeJsonSegment(budget, ']', label);\n } finally {\n ancestors.delete(candidate);\n }\n return;\n }\n const object = plainObject(candidate, label);\n if (ancestors.has(object)) fail(`${label} cannot contain a cycle`);\n ancestors.add(object);\n try {\n consumeJsonSegment(budget, '{', label);\n for (const [index, key] of Object.keys(object).entries()) {\n if (index > 0) consumeJsonSegment(budget, ',', label);\n consumeJsonSegment(budget, JSON.stringify(key), `${label}.${key}`);\n consumeJsonSegment(budget, ':', label);\n measure(object[key], `${label}.${key}`, depth + 1);\n }\n consumeJsonSegment(budget, '}', label);\n } finally {\n ancestors.delete(object);\n }\n };\n\n measure(value, 'Data query request');\n}\n\n/** Locale-independent ordering for canonical envelopes and fingerprints. */\nfunction compareCanonicalStrings(left: string, right: string): number {\n if (left === right) return 0;\n return left < right ? -1 : 1;\n}\n\nfunction normalizeFieldDescriptor(value: unknown): DataQueryFieldDescriptor {\n const object = plainObject(value, 'Data query schema field');\n exactKeys(\n object,\n ['id', 'type', 'projectable', 'sortable', 'facetable', 'filterOperators'],\n 'Data query schema field',\n );\n const id = stringValue(object.id, 'Data query field id');\n const type = stringValue(object.type, `Data query field ${id} type`);\n if (!['string', 'number', 'boolean', 'datetime', 'json'].includes(type)) {\n return fail(`Unsupported data query field type: ${type}`);\n }\n for (const flag of ['projectable', 'sortable', 'facetable'] as const) {\n if (object[flag] !== undefined && typeof object[flag] !== 'boolean') {\n fail(`Data query field ${id} ${flag} must be boolean`);\n }\n }\n let filterOperators: DataQueryFilterOperator[] | undefined;\n if (object.filterOperators !== undefined) {\n if (!Array.isArray(object.filterOperators)) {\n return fail(`Data query field ${id} filterOperators must be an array`);\n }\n filterOperators = [\n ...new Set(\n object.filterOperators.map((operator) => {\n const normalized = stringValue(\n operator,\n `Data query field ${id} filter operator`,\n ) as DataQueryFilterOperator;\n if (!FILTER_OPERATORS.has(normalized)) {\n fail(`Unsupported data query filter operator: ${normalized}`);\n }\n return normalized;\n }),\n ),\n ].sort();\n }\n const projectable =\n typeof object.projectable === 'boolean' ? object.projectable : undefined;\n const sortable =\n typeof object.sortable === 'boolean' ? object.sortable : undefined;\n const facetable =\n typeof object.facetable === 'boolean' ? object.facetable : undefined;\n return {\n id,\n type: type as DataQueryFieldDescriptor['type'],\n ...(projectable === undefined ? {} : { projectable }),\n ...(sortable === undefined ? {} : { sortable }),\n ...(facetable === undefined ? {} : { facetable }),\n ...(filterOperators ? { filterOperators } : {}),\n };\n}\n\n/** Validate and canonicalize trusted adapter query policy before use. */\nexport function normalizeDataQuerySchema(value: unknown): DataQuerySchema {\n const object = plainObject(value, 'Data query schema');\n exactKeys(\n object,\n [\n 'version',\n 'identityField',\n 'fields',\n 'defaultPageLimit',\n 'maxPageLimit',\n 'maxResultBytes',\n 'defaultSort',\n 'supports',\n ],\n 'Data query schema',\n );\n if (object.version !== 1)\n return fail('Unsupported data query schema version');\n if (!Array.isArray(object.fields) || object.fields.length === 0) {\n return fail('Data query schema fields must be a non-empty array');\n }\n const fields = object.fields\n .map(normalizeFieldDescriptor)\n .sort((left, right) => compareCanonicalStrings(left.id, right.id));\n if (new Set(fields.map((field) => field.id)).size !== fields.length) {\n return fail('Data query schema field ids must be unique');\n }\n const identityField = stringValue(\n object.identityField,\n 'Data query identity field',\n );\n const identity = fields.find((field) => field.id === identityField);\n if (!identity) return fail('Data query identity field must be declared');\n if (identity.projectable === false) {\n return fail('Data query identity field must be projectable');\n }\n if (!['string', 'number', 'datetime'].includes(identity.type)) {\n return fail(\n 'Data query identity field must use a string, number, or datetime type',\n );\n }\n const maxPageLimit =\n object.maxPageLimit === undefined\n ? MAX_DATA_QUERY_PAGE_LIMIT\n : positiveInteger(object.maxPageLimit, 'Data query maximum page limit');\n if (maxPageLimit > MAX_DATA_QUERY_PAGE_LIMIT) {\n return fail(\n `Data query maximum page limit cannot exceed ${MAX_DATA_QUERY_PAGE_LIMIT}`,\n );\n }\n const defaultPageLimit =\n object.defaultPageLimit === undefined\n ? Math.min(DEFAULT_DATA_QUERY_PAGE_LIMIT, maxPageLimit)\n : positiveInteger(\n object.defaultPageLimit,\n 'Data query default page limit',\n );\n if (defaultPageLimit > maxPageLimit) {\n return fail(\n 'Data query default page limit cannot exceed the maximum page limit',\n );\n }\n const maxResultBytes =\n object.maxResultBytes === undefined\n ? DEFAULT_DATA_QUERY_RESULT_BYTES\n : positiveInteger(\n object.maxResultBytes,\n 'Data query maximum result bytes',\n );\n if (maxResultBytes > MAX_DATA_QUERY_RESULT_BYTES) {\n return fail(\n `Data query maximum result bytes cannot exceed ${MAX_DATA_QUERY_RESULT_BYTES}`,\n );\n }\n let supports: DataQuerySchema['supports'];\n if (object.supports !== undefined) {\n const supportObject = plainObject(\n object.supports,\n 'Data query schema supports',\n );\n exactKeys(\n supportObject,\n ['cursorPagination', 'consistency', 'facets'],\n 'Data query schema supports',\n );\n for (const key of ['cursorPagination', 'consistency', 'facets'] as const) {\n if (\n supportObject[key] !== undefined &&\n typeof supportObject[key] !== 'boolean'\n ) {\n fail(`Data query schema supports.${key} must be boolean`);\n }\n }\n const cursorPagination =\n typeof supportObject.cursorPagination === 'boolean'\n ? supportObject.cursorPagination\n : undefined;\n const consistency =\n typeof supportObject.consistency === 'boolean'\n ? supportObject.consistency\n : undefined;\n const facets =\n typeof supportObject.facets === 'boolean'\n ? supportObject.facets\n : undefined;\n supports = {\n ...(cursorPagination === undefined ? {} : { cursorPagination }),\n ...(consistency === undefined ? {} : { consistency }),\n ...(facets === undefined ? {} : { facets }),\n };\n }\n const fieldMap = new Map(fields.map((field) => [field.id, field]));\n const defaultSort = normalizeSort(\n object.defaultSort,\n fieldMap,\n identityField,\n 'Data query default sort',\n false,\n );\n return {\n version: 1,\n identityField,\n fields,\n defaultPageLimit,\n maxPageLimit,\n maxResultBytes,\n ...(defaultSort.length > 0 ? { defaultSort } : {}),\n ...(supports ? { supports } : {}),\n };\n}\n\ninterface FilterBudget {\n nodes: number;\n}\n\nfunction scalarForField(\n value: unknown,\n descriptor: DataQueryFieldDescriptor,\n label: string,\n): DataQueryScalar {\n const scalar = dataQueryScalar(value, label);\n if (scalar === null) return scalar;\n if (descriptor.type === 'number' && typeof scalar !== 'number') {\n return fail(`${label} must be a number for ${descriptor.id}`);\n }\n if (descriptor.type === 'boolean' && typeof scalar !== 'boolean') {\n return fail(`${label} must be a boolean for ${descriptor.id}`);\n }\n if (descriptor.type === 'string' && typeof scalar !== 'string') {\n return fail(`${label} must be a string for ${descriptor.id}`);\n }\n if (descriptor.type === 'datetime') {\n if (typeof scalar !== 'string') {\n return fail(`${label} must be an RFC 3339 instant for ${descriptor.id}`);\n }\n return normalizedInstant(scalar, label);\n }\n return scalar;\n}\n\nfunction normalizeFilter(\n value: unknown,\n fields: Map<string, DataQueryFieldDescriptor>,\n depth = 0,\n budget: FilterBudget = { nodes: 0 },\n): DataQueryFilter {\n if (depth > MAX_DATA_QUERY_FILTER_DEPTH) {\n return fail(\n `Data query filter cannot exceed depth ${MAX_DATA_QUERY_FILTER_DEPTH}`,\n );\n }\n budget.nodes += 1;\n if (budget.nodes > MAX_DATA_QUERY_FILTERS) {\n return fail(\n `Data query filter cannot exceed ${MAX_DATA_QUERY_FILTERS} expressions`,\n );\n }\n const object = plainObject(value, 'Data query filter');\n const kind = stringValue(object.kind, 'Data query filter kind');\n if (kind === 'condition') {\n exactKeys(\n object,\n ['kind', 'field', 'operator', 'value'],\n 'Data query condition',\n );\n const field = stringValue(object.field, 'Data query condition field');\n const descriptor = fields.get(field);\n if (!descriptor)\n return fail(\n `Data query field is not declared: ${field}`,\n 'DATA_QUERY_FIELD_NOT_ALLOWED',\n );\n const operator = stringValue(\n object.operator,\n 'Data query condition operator',\n ) as DataQueryFilterOperator;\n if (\n !FILTER_OPERATORS.has(operator) ||\n !descriptor.filterOperators?.includes(operator)\n ) {\n return fail(\n `Data query operator ${operator} is not allowed for ${field}`,\n 'DATA_QUERY_OPERATOR_NOT_ALLOWED',\n );\n }\n if (operator === 'in' || operator === 'notIn') {\n if (!Array.isArray(object.value) || object.value.length === 0) {\n return fail(`Data query ${operator} value must be a non-empty array`);\n }\n if (object.value.length > MAX_DATA_QUERY_IN_VALUES) {\n return fail(\n `Data query ${operator} value cannot exceed ${MAX_DATA_QUERY_IN_VALUES} items`,\n );\n }\n const values = object.value.map((entry, index) =>\n scalarForField(\n entry,\n descriptor,\n `Data query ${operator} value ${index}`,\n ),\n );\n const canonicalValues = [\n ...new Map(values.map((entry) => [signature(entry), entry])).values(),\n ].sort((left, right) =>\n compareCanonicalStrings(signature(left), signature(right)),\n );\n return { kind: 'condition', field, operator, value: canonicalValues };\n }\n if (Array.isArray(object.value)) {\n return fail(`Data query ${operator} value must be a scalar`);\n }\n const scalar = scalarForField(\n object.value,\n descriptor,\n `Data query ${operator} value`,\n );\n if (operator === 'like' && descriptor.type !== 'string') {\n return fail('Data query like is only available for string fields');\n }\n if (operator === 'like' && typeof scalar !== 'string') {\n return fail('Data query like value must be a string');\n }\n if (\n ['gt', 'gte', 'lt', 'lte'].includes(operator) &&\n !['number', 'string', 'datetime'].includes(descriptor.type)\n ) {\n return fail(\n `Data query ${operator} is not available for ${descriptor.type} fields`,\n );\n }\n if (\n ['gt', 'gte', 'lt', 'lte', 'like'].includes(operator) &&\n scalar === null\n ) {\n return fail(`Data query ${operator} value cannot be null`);\n }\n return {\n kind: 'condition',\n field,\n operator,\n value: scalar,\n } as DataQueryCondition;\n }\n if (kind === 'all' || kind === 'any') {\n exactKeys(object, ['kind', 'filters'], `Data query ${kind} filter`);\n if (!Array.isArray(object.filters) || object.filters.length === 0) {\n return fail(`Data query ${kind} filter must contain at least one child`);\n }\n if (object.filters.length > MAX_DATA_QUERY_FILTERS) {\n return fail(\n `Data query ${kind} filter cannot exceed ${MAX_DATA_QUERY_FILTERS} children`,\n );\n }\n const filters = object.filters\n .map((filter) => normalizeFilter(filter, fields, depth + 1, budget))\n .sort((left, right) =>\n compareCanonicalStrings(signature(left), signature(right)),\n );\n return { kind, filters };\n }\n if (kind === 'not') {\n exactKeys(object, ['kind', 'filter'], 'Data query not filter');\n return {\n kind: 'not',\n filter: normalizeFilter(object.filter, fields, depth + 1, budget),\n };\n }\n return fail(`Unsupported data query filter kind: ${kind}`);\n}\n\nfunction normalizeSort(\n value: unknown,\n fields: Map<string, DataQueryFieldDescriptor>,\n identityField: string,\n label: string,\n appendIdentity: boolean,\n): DataQuerySort[] {\n if (value === undefined)\n return appendIdentity ? [{ field: identityField, direction: 'asc' }] : [];\n if (!Array.isArray(value)) return fail(`${label} must be an array`);\n if (value.length > MAX_DATA_QUERY_FILTERS) {\n return fail(`${label} cannot exceed ${MAX_DATA_QUERY_FILTERS} terms`);\n }\n const sort = value.map((entry) => {\n const object = plainObject(entry, label);\n exactKeys(object, ['field', 'direction'], label);\n const field = stringValue(object.field, `${label} field`);\n if (!fields.get(field)?.sortable && field !== identityField) {\n fail(\n `Data query sort field is not allowed: ${field}`,\n 'DATA_QUERY_SORT_NOT_ALLOWED',\n );\n }\n const direction = stringValue(object.direction, `${label} direction`);\n if (direction !== 'asc' && direction !== 'desc') {\n fail(`Data query sort direction must be asc or desc`);\n }\n return { field, direction } as DataQuerySort;\n });\n if (new Set(sort.map((term) => term.field)).size !== sort.length) {\n return fail(`${label} field ids must be unique`);\n }\n if (appendIdentity && !sort.some((term) => term.field === identityField)) {\n sort.push({ field: identityField, direction: 'asc' });\n }\n return sort;\n}\n\nfunction normalizePage(value: unknown, schema: DataQuerySchema): DataQueryPage {\n if (value === undefined) {\n return {\n kind: 'offset',\n offset: 0,\n limit: schema.defaultPageLimit ?? DEFAULT_DATA_QUERY_PAGE_LIMIT,\n };\n }\n const object = plainObject(value, 'Data query page');\n const kind = stringValue(object.kind, 'Data query page kind');\n if (kind === 'offset') {\n exactKeys(object, ['kind', 'offset', 'limit'], 'Data query offset page');\n const offset = nonNegativeInteger(object.offset, 'Data query offset');\n if (offset > MAX_DATA_QUERY_OFFSET) {\n return fail(`Data query offset cannot exceed ${MAX_DATA_QUERY_OFFSET}`);\n }\n return {\n kind,\n offset,\n limit: Math.min(\n positiveInteger(object.limit, 'Data query page limit'),\n schema.maxPageLimit ?? MAX_DATA_QUERY_PAGE_LIMIT,\n ),\n };\n }\n if (kind === 'cursor') {\n if (!schema.supports?.cursorPagination) {\n return fail(\n 'Data query cursor pagination is not supported',\n 'DATA_QUERY_UNSUPPORTED',\n );\n }\n exactKeys(object, ['kind', 'after', 'limit'], 'Data query cursor page');\n const after =\n object.after === undefined\n ? undefined\n : stringValue(\n object.after,\n 'Data query cursor',\n MAX_DATA_QUERY_CURSOR_LENGTH,\n );\n return {\n kind,\n ...(after === undefined ? {} : { after }),\n limit: Math.min(\n positiveInteger(object.limit, 'Data query page limit'),\n schema.maxPageLimit ?? MAX_DATA_QUERY_PAGE_LIMIT,\n ),\n };\n }\n return fail(`Unsupported data query page kind: ${kind}`);\n}\n\nfunction normalizeConsistency(\n value: unknown,\n schema: DataQuerySchema,\n): DataQueryConsistency | undefined {\n if (value === undefined) return undefined;\n if (!schema.supports?.consistency) {\n return fail(\n 'Data query consistency options are not supported',\n 'DATA_QUERY_UNSUPPORTED',\n );\n }\n const object = plainObject(value, 'Data query consistency');\n exactKeys(object, ['mode', 'asOf'], 'Data query consistency');\n if (object.mode !== 'eventual' && object.mode !== 'snapshot')\n return fail('Unsupported data query consistency mode');\n const asOf =\n object.asOf === undefined\n ? undefined\n : normalizedInstant(object.asOf, 'Data query consistency asOf');\n return {\n mode: object.mode,\n ...(asOf === undefined ? {} : { asOf }),\n } as DataQueryConsistency;\n}\n\nfunction normalizeFacets(\n value: unknown,\n schema: DataQuerySchema,\n fields: Map<string, DataQueryFieldDescriptor>,\n): DataQueryFacetRequest[] {\n if (!schema.supports?.facets) {\n return fail(\n 'Data query facets are not supported',\n 'DATA_QUERY_UNSUPPORTED',\n );\n }\n if (!Array.isArray(value) || value.length === 0) {\n return fail('Data query facets must be a non-empty array');\n }\n if (value.length > MAX_DATA_QUERY_FACETS) {\n return fail(`Data query facets cannot exceed ${MAX_DATA_QUERY_FACETS}`);\n }\n const facets = value.map((entry) => {\n const object = plainObject(entry, 'Data query facet request');\n exactKeys(object, ['field', 'limit'], 'Data query facet request');\n const field = stringValue(object.field, 'Data query facet field');\n if (!fields.get(field)?.facetable) {\n fail(\n `Data query facet field is not allowed: ${field}`,\n 'DATA_QUERY_FACET_NOT_ALLOWED',\n );\n }\n return {\n field,\n limit: Math.min(\n positiveInteger(object.limit, 'Data query facet limit'),\n schema.maxPageLimit ?? MAX_DATA_QUERY_PAGE_LIMIT,\n ),\n };\n });\n if (new Set(facets.map((facet) => facet.field)).size !== facets.length) {\n return fail('Data query facet fields must be unique');\n }\n return facets.sort((left, right) =>\n compareCanonicalStrings(left.field, right.field),\n );\n}\n\nfunction boundRequestSize(request: DataQueryRequest): DataQueryRequest {\n const bytes = new TextEncoder().encode(JSON.stringify(request)).byteLength;\n if (bytes > MAX_DATA_QUERY_REQUEST_BYTES) {\n return fail(\n 'Data query request exceeds its maximum byte limit',\n 'DATA_QUERY_REQUEST_TOO_LARGE',\n );\n }\n return request;\n}\n\n/**\n * Normalize an untrusted request against its trusted adapter schema. Equivalent\n * projection/filter/facet orderings produce byte-identical output; sort order\n * remains intact because it is semantically meaningful. The identity field is\n * always projected even when a caller omits it.\n */\nexport function normalizeDataQueryRequest(\n value: unknown,\n inputSchema: unknown,\n): DataQueryRequest {\n const schema = normalizeDataQuerySchema(inputSchema);\n const fields = new Map(schema.fields.map((field) => [field.id, field]));\n const object = plainObject(value, 'Data query request');\n assertBoundedRawRequest(value);\n exactKeys(\n object,\n [\n 'version',\n 'requestId',\n 'mode',\n 'projection',\n 'filter',\n 'sort',\n 'page',\n 'consistency',\n 'facets',\n ],\n 'Data query request',\n );\n if (object.version !== 1)\n return fail('Unsupported data query request version');\n const requestId = stringValue(object.requestId, 'Data query request id', 128);\n const mode = stringValue(object.mode, 'Data query mode');\n if (!['rows', 'count', 'facets'].includes(mode))\n return fail(`Unsupported data query mode: ${mode}`);\n const filter =\n object.filter === undefined\n ? undefined\n : normalizeFilter(object.filter, fields);\n const consistency = normalizeConsistency(object.consistency, schema);\n if (mode === 'rows') {\n if (object.facets !== undefined)\n return fail('Rows queries cannot request facets');\n if (object.projection !== undefined && !Array.isArray(object.projection)) {\n return fail('Data query projection must be an array');\n }\n if (\n Array.isArray(object.projection) &&\n object.projection.length > MAX_DATA_QUERY_FILTERS\n ) {\n return fail(\n `Data query projection cannot exceed ${MAX_DATA_QUERY_FILTERS} fields`,\n );\n }\n const requestedProjection = (object.projection ?? []).map((field) =>\n stringValue(field, 'Data query projection field'),\n );\n for (const field of requestedProjection) {\n if (!fields.get(field)?.projectable && field !== schema.identityField) {\n fail(\n `Data query projection field is not allowed: ${field}`,\n 'DATA_QUERY_PROJECTION_NOT_ALLOWED',\n );\n }\n }\n const projection = [\n ...new Set([...requestedProjection, schema.identityField]),\n ].sort();\n const sort = normalizeSort(\n object.sort === undefined ? schema.defaultSort : object.sort,\n fields,\n schema.identityField,\n 'Data query sort',\n true,\n );\n return boundRequestSize({\n version: 1,\n requestId,\n mode,\n projection,\n ...(filter === undefined ? {} : { filter }),\n sort,\n page: normalizePage(object.page, schema),\n ...(consistency === undefined ? {} : { consistency }),\n });\n }\n if (\n object.projection !== undefined ||\n object.sort !== undefined ||\n object.page !== undefined\n ) {\n return fail(`${mode} data queries cannot carry projection, sort, or page`);\n }\n if (mode === 'facets') {\n return boundRequestSize({\n version: 1,\n requestId,\n mode,\n ...(filter === undefined ? {} : { filter }),\n ...(consistency === undefined ? {} : { consistency }),\n facets: normalizeFacets(object.facets, schema, fields),\n });\n }\n if (object.facets !== undefined)\n return fail('Count data queries cannot request facets');\n return boundRequestSize({\n version: 1,\n requestId,\n mode: 'count',\n ...(filter === undefined ? {} : { filter }),\n ...(consistency === undefined ? {} : { consistency }),\n });\n}\n\n/** Canonical match/query form used for stable fingerprints (no request id/page). */\nexport function canonicalizeDataQuery(value: unknown, schema: unknown): string {\n const request = normalizeDataQueryRequest(value, schema);\n const { requestId: _requestId, page: _page, ...semanticQuery } = request;\n return signature(semanticQuery);\n}\n\n/** Collision-resistant canonical fingerprint for result correlation and selection scope. */\nexport function createDataQueryFingerprint(\n value: unknown,\n schema: unknown,\n): string {\n return `dq1_${sha256Base64Url(canonicalizeDataQuery(value, schema))}`;\n}\n\nfunction normalizeResultFieldValue(\n value: unknown,\n descriptor: DataQueryFieldDescriptor,\n label: string,\n budget: JsonBudget,\n): unknown {\n if (descriptor.type === 'json') return canonicalJson(value, label, budget);\n const normalized = scalarForField(value, descriptor, label);\n consumeJsonSegment(budget, JSON.stringify(normalized), label);\n return normalized;\n}\n\nfunction normalizeRow(\n value: unknown,\n projection: readonly string[],\n identityField: string,\n fields: Map<string, DataQueryFieldDescriptor>,\n budget: JsonBudget,\n): DataQueryRow {\n const object = plainObject(value, 'Data query row');\n const allowed = new Set(projection);\n const normalized: JsonObject = Object.create(null) as JsonObject;\n consumeJsonSegment(budget, '{', 'Data query row');\n for (const [index, key] of Object.keys(object).entries()) {\n if (!allowed.has(key)) {\n fail(\n `Data query row returned a non-projected field: ${key}`,\n 'DATA_QUERY_RESULT_NOT_ALLOWED',\n );\n }\n const descriptor = fields.get(key);\n if (!descriptor) {\n return fail(\n `Data query row returned an undeclared field: ${key}`,\n 'DATA_QUERY_RESULT_NOT_ALLOWED',\n );\n }\n if (index > 0) consumeJsonSegment(budget, ',', 'Data query row');\n consumeJsonSegment(budget, JSON.stringify(key), `Data query row ${key}`);\n consumeJsonSegment(budget, ':', `Data query row ${key}`);\n normalized[key] = normalizeResultFieldValue(\n object[key],\n descriptor,\n `Data query row ${key}`,\n budget,\n );\n }\n consumeJsonSegment(budget, '}', 'Data query row');\n const identity = normalized[identityField];\n if (\n (typeof identity !== 'string' && typeof identity !== 'number') ||\n identity === ''\n ) {\n fail(\n 'Data query row must return a string or number identity field',\n 'DATA_QUERY_RESULT_INVALID',\n );\n }\n return normalized as DataQueryRow;\n}\n\nfunction normalizeTotal(value: unknown): DataQueryTotal {\n const object = plainObject(value, 'Data query total');\n const kind = stringValue(object.kind, 'Data query total kind');\n if (kind === 'unavailable') {\n exactKeys(object, ['kind', 'reason'], 'Data query unavailable total');\n const reason =\n object.reason === undefined\n ? undefined\n : stringValue(object.reason, 'Data query total reason');\n return { kind, ...(reason === undefined ? {} : { reason }) };\n }\n if (kind !== 'exact' && kind !== 'estimated') {\n return fail(`Unsupported data query total kind: ${kind}`);\n }\n exactKeys(object, ['kind', 'value', 'asOf'], 'Data query total');\n const asOf =\n object.asOf === undefined\n ? undefined\n : normalizedInstant(object.asOf, 'Data query total asOf');\n return {\n kind,\n value: nonNegativeInteger(object.value, 'Data query total value'),\n ...(asOf === undefined ? {} : { asOf }),\n };\n}\n\nfunction normalizeFreshness(value: unknown): DataQueryFreshness {\n const object = plainObject(value, 'Data query freshness');\n exactKeys(object, ['state', 'asOf'], 'Data query freshness');\n const state = stringValue(object.state, 'Data query freshness state');\n if (!['fresh', 'stale', 'unknown'].includes(state)) {\n return fail(`Unsupported data query freshness state: ${state}`);\n }\n const asOf =\n object.asOf === undefined\n ? undefined\n : normalizedInstant(object.asOf, 'Data query freshness asOf');\n return {\n state: state as DataQueryFreshness['state'],\n ...(asOf === undefined ? {} : { asOf }),\n };\n}\n\nfunction normalizeFacetsResult(\n value: unknown,\n requested: readonly DataQueryFacetRequest[],\n fields: Map<string, DataQueryFieldDescriptor>,\n budget: JsonBudget,\n): DataQueryFacetResult[] {\n if (!Array.isArray(value))\n return fail('Data query result facets must be an array');\n if (value.length > requested.length) {\n return fail('Data query result returned too many facets');\n }\n const limits = new Map(requested.map((facet) => [facet.field, facet.limit]));\n consumeJsonSegment(budget, '[', 'Data query result facets');\n const results = value.map((entry, index) => {\n if (index > 0) consumeJsonSegment(budget, ',', 'Data query result facets');\n const object = plainObject(entry, 'Data query facet result');\n exactKeys(\n object,\n ['field', 'values', 'truncated'],\n 'Data query facet result',\n );\n const field = stringValue(object.field, 'Data query facet result field');\n const limit = limits.get(field);\n if (limit === undefined)\n return fail(`Data query returned an unrequested facet: ${field}`);\n if (!Array.isArray(object.values) || object.values.length > limit) {\n return fail(`Data query facet ${field} exceeds its requested limit`);\n }\n if (typeof object.truncated !== 'boolean')\n return fail('Data query facet truncated must be boolean');\n const descriptor = fields.get(field);\n if (!descriptor)\n return fail(`Data query facet field is not declared: ${field}`);\n consumeJsonSegment(budget, '{\"field\":', `Data query facet ${field}`);\n consumeJsonSegment(\n budget,\n JSON.stringify(field),\n `Data query facet ${field}`,\n );\n consumeJsonSegment(budget, ',\"values\":[', `Data query facet ${field}`);\n const values = object.values.map((candidate, valueIndex) => {\n if (valueIndex > 0)\n consumeJsonSegment(budget, ',', `Data query facet ${field}`);\n const facet = plainObject(candidate, 'Data query facet value');\n exactKeys(facet, ['value', 'count'], 'Data query facet value');\n const normalizedValue = scalarForField(\n facet.value,\n descriptor,\n `Data query facet ${field} value`,\n );\n const count = nonNegativeInteger(facet.count, 'Data query facet count');\n consumeJsonSegment(\n budget,\n `{\"value\":${JSON.stringify(normalizedValue)},\"count\":${JSON.stringify(count)}}`,\n `Data query facet ${field} value`,\n );\n return {\n value: normalizedValue,\n count,\n };\n });\n consumeJsonSegment(\n budget,\n `],\"truncated\":${object.truncated}}`,\n `Data query facet ${field}`,\n );\n return { field, values, truncated: object.truncated };\n });\n consumeJsonSegment(budget, ']', 'Data query result facets');\n if (new Set(results.map((facet) => facet.field)).size !== results.length) {\n return fail('Data query result facet fields must be unique');\n }\n return results.sort((left, right) =>\n compareCanonicalStrings(left.field, right.field),\n );\n}\n\n/**\n * Validate an adapter result against the normalized request and its schema.\n * This is the final projection boundary: undeclared fields, malformed totals,\n * forged fingerprints, oversized rows, and authority-shaped prototype payloads\n * cannot cross into REST, MCP, WebMCP, or browser consumers unnoticed.\n */\nexport function normalizeDataQueryResult(\n value: unknown,\n inputRequest: unknown,\n inputSchema: unknown,\n): DataQueryResult {\n const schema = normalizeDataQuerySchema(inputSchema);\n const request = normalizeDataQueryRequest(inputRequest, schema);\n const fields = new Map(schema.fields.map((field) => [field.id, field]));\n const object = plainObject(value, 'Data query result');\n exactKeys(\n object,\n [\n 'version',\n 'requestId',\n 'queryFingerprint',\n 'identityField',\n 'rows',\n 'page',\n 'total',\n 'facets',\n 'freshness',\n 'warnings',\n 'truncated',\n ],\n 'Data query result',\n );\n if (object.version !== 1)\n return fail('Unsupported data query result version');\n if (\n stringValue(object.requestId, 'Data query result request id', 128) !==\n request.requestId\n ) {\n return fail(\n 'Data query result request id does not match its request',\n 'DATA_QUERY_RESULT_INVALID',\n );\n }\n const fingerprint = createDataQueryFingerprint(request, schema);\n if (\n stringValue(\n object.queryFingerprint,\n 'Data query result fingerprint',\n 128,\n ) !== fingerprint\n ) {\n return fail(\n 'Data query result fingerprint does not match its request',\n 'DATA_QUERY_RESULT_INVALID',\n );\n }\n if (\n stringValue(object.identityField, 'Data query result identity field') !==\n schema.identityField\n ) {\n return fail(\n 'Data query result identity field does not match its schema',\n 'DATA_QUERY_RESULT_INVALID',\n );\n }\n if (!Array.isArray(object.rows))\n return fail('Data query result rows must be an array');\n const projection =\n request.mode === 'rows'\n ? (request.projection ?? [schema.identityField])\n : [];\n const page = request.mode === 'rows' ? request.page : undefined;\n if (request.mode !== 'rows' && object.rows.length > 0) {\n return fail(`${request.mode} data query results cannot return rows`);\n }\n if (page && object.rows.length > page.limit) {\n return fail('Data query result rows exceed its requested page limit');\n }\n const budget: JsonBudget = {\n remaining: schema.maxResultBytes ?? DEFAULT_DATA_QUERY_RESULT_BYTES,\n failureCode: 'DATA_QUERY_RESULT_TOO_LARGE',\n };\n consumeJsonSegment(budget, '[', 'Data query result rows');\n const rows = object.rows.map((row, index) => {\n if (index > 0) consumeJsonSegment(budget, ',', 'Data query result rows');\n return normalizeRow(row, projection, schema.identityField, fields, budget);\n });\n consumeJsonSegment(budget, ']', 'Data query result rows');\n let normalizedPage: DataQueryResult['page'];\n if (page) {\n const pageObject = plainObject(object.page, 'Data query result page');\n exactKeys(\n pageObject,\n ['kind', 'limit', 'offset', 'nextCursor', 'hasMore'],\n 'Data query result page',\n );\n if (\n pageObject.kind !== page.kind ||\n nonNegativeInteger(pageObject.limit, 'Data query result page limit') !==\n page.limit\n ) {\n return fail('Data query result page does not match its request');\n }\n if (typeof pageObject.hasMore !== 'boolean')\n return fail('Data query result page hasMore must be boolean');\n if (page.kind === 'offset') {\n if (\n nonNegativeInteger(pageObject.offset, 'Data query result offset') !==\n page.offset\n ) {\n return fail('Data query result offset does not match its request');\n }\n if (pageObject.nextCursor !== undefined)\n return fail('Offset data query results cannot return a cursor');\n normalizedPage = {\n kind: 'offset',\n limit: page.limit,\n offset: page.offset,\n hasMore: pageObject.hasMore,\n };\n } else {\n if (pageObject.offset !== undefined) {\n return fail('Cursor data query results cannot return an offset');\n }\n const nextCursor =\n pageObject.nextCursor === undefined\n ? undefined\n : stringValue(\n pageObject.nextCursor,\n 'Data query result next cursor',\n MAX_DATA_QUERY_CURSOR_LENGTH,\n );\n if (pageObject.hasMore !== Boolean(nextCursor)) {\n return fail('Data query cursor result hasMore must match nextCursor');\n }\n normalizedPage = {\n kind: 'cursor',\n limit: page.limit,\n hasMore: pageObject.hasMore,\n ...(nextCursor === undefined ? {} : { nextCursor }),\n };\n }\n } else if (object.page !== undefined) {\n return fail(`${request.mode} data query results cannot return a page`);\n }\n const total = normalizeTotal(object.total);\n const freshness = normalizeFreshness(object.freshness);\n if (\n !Array.isArray(object.warnings) ||\n object.warnings.length > MAX_DATA_QUERY_WARNINGS ||\n object.warnings.some(\n (warning) =>\n typeof warning !== 'string' ||\n warning.length === 0 ||\n warning.length > 512,\n )\n ) {\n return fail('Data query result warnings must be at most 100 short strings');\n }\n if (typeof object.truncated !== 'boolean')\n return fail('Data query result truncated must be boolean');\n const facets =\n request.mode === 'facets'\n ? normalizeFacetsResult(\n object.facets,\n request.facets ?? [],\n fields,\n budget,\n )\n : object.facets === undefined\n ? undefined\n : fail(`${request.mode} data query results cannot return facets`);\n const normalized: DataQueryResult = {\n version: 1,\n requestId: request.requestId,\n queryFingerprint: fingerprint,\n identityField: schema.identityField,\n rows,\n ...(normalizedPage === undefined ? {} : { page: normalizedPage }),\n total,\n ...(facets === undefined ? {} : { facets }),\n freshness,\n warnings: [...new Set(object.warnings)].sort(),\n truncated: object.truncated,\n };\n const bytes = new TextEncoder().encode(JSON.stringify(normalized)).byteLength;\n if (bytes > (schema.maxResultBytes ?? DEFAULT_DATA_QUERY_RESULT_BYTES)) {\n return fail(\n 'Data query result exceeds its maximum byte limit',\n 'DATA_QUERY_RESULT_TOO_LARGE',\n );\n }\n return normalized;\n}\n"],"mappings":"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"}
package/dist/database.js CHANGED
@@ -1,5 +1,5 @@
1
+ import { getDatabase } from "./host.js";
1
2
  import { applyPostgresRuntimeTimeouts } from "./postgres-timeouts.js";
2
- import { getDatabase } from "@happyvertical/sql";
3
3
  //#region src/database.ts
4
4
  /**
5
5
  * Type guard to check if a value is a DatabaseInterface instance
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","names":[],"sources":["../src/database.ts"],"sourcesContent":["/**\n * Database configuration and resolution utilities\n *\n * This module provides a unified type for database configuration options\n * and a utility function to resolve any config format to a DatabaseInterface.\n *\n * @module\n */\n\nimport type { DatabaseInterface, SchemasOption } from '@happyvertical/sql';\nimport { getDatabase } from '@happyvertical/sql';\nimport {\n applyPostgresRuntimeTimeouts,\n type PostgresTimeoutConfig,\n} from './postgres-timeouts.js';\n\n/**\n * Unified type for all database configuration formats\n *\n * Supports three formats:\n * - **String**: Connection URL (e.g., 'products.db', ':memory:', 'postgres://...')\n * - **Config object**: Full configuration with type, url, and options\n * - **DatabaseInterface**: Pre-initialized database instance\n *\n * @example\n * ```typescript\n * // String shortcut\n * const config: DatabaseConfig = 'products.db';\n *\n * // Config object\n * const config: DatabaseConfig = {\n * type: 'sqlite',\n * url: 'products.db',\n * authToken: 'token'\n * };\n *\n * // Pre-initialized instance\n * const db = await getDatabase({ type: 'sqlite', url: ':memory:' });\n * const config: DatabaseConfig = db;\n * ```\n */\nexport type DatabaseConfig =\n | string\n | {\n url?: string;\n type?: 'sqlite' | 'postgres' | 'duckdb' | 'json';\n authToken?: string;\n /**\n * Runtime PostgreSQL timeouts for this connection (#2377). Ignored by\n * every other engine.\n *\n * @see {@link PostgresTimeoutConfig}\n */\n timeouts?: PostgresTimeoutConfig;\n [key: string]: unknown;\n }\n | DatabaseInterface;\n\n/**\n * Canonical declaration of the request-scoped database global.\n *\n * The value is installed by whichever package owns request scoping (today\n * `@happyvertical/smrt-users`, via its session permission context) and is read\n * by the SvelteKit runtime config that `smrt-core`'s vite plugin generates into\n * consumer apps. Both sides used to `declare global` this name independently\n * with different types — `DatabaseConfig` here, a package-private\n * `QueryableDatabase` there — and TypeScript requires merged `var` declarations\n * to be *identical*, not merely compatible. Consumers whose program contained\n * both then failed to type-check (#2342).\n *\n * `smrt-core` owns the declaration because it is the base package every other\n * SMRT package and consumer already depends on. Writers should keep assigning a\n * live `DatabaseInterface`; it satisfies `DatabaseConfig` through that arm of\n * the union. Never redeclare this global elsewhere.\n */\ndeclare global {\n // eslint-disable-next-line no-var\n var __smrtGetRequestScopedDatabase:\n | (() => DatabaseConfig | undefined)\n | undefined;\n}\n\n/**\n * Type guard to check if a value is a DatabaseInterface instance\n *\n * @param value - Value to check\n * @returns True if value has query() and close() methods\n *\n * @example\n * ```typescript\n * if (isDatabaseInterface(config)) {\n * // config is DatabaseInterface\n * await config.query('SELECT 1');\n * }\n * ```\n */\nexport function isDatabaseInterface(\n value: unknown,\n): value is DatabaseInterface {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'query' in value &&\n typeof (value as { query: unknown }).query === 'function'\n );\n}\n\n/**\n * Options for resolving a database configuration\n */\nexport interface ResolveDatabaseOptions {\n /**\n * Cache key for connection pooling.\n * If provided, the same dbid returns the same cached connection.\n */\n dbid?: string;\n\n /**\n * Optional pre-generated schemas to pass to the database adapter.\n *\n * Intended for explicit tooling and test utilities that bootstrap schema\n * ahead of runtime. Core runtime no longer passes these automatically.\n */\n schemas?: SchemasOption;\n}\n\n/**\n * Resolve any DatabaseConfig format to a DatabaseInterface instance\n *\n * This utility function normalizes the three config formats:\n * 1. **String URL**: Passed to getDatabase() with auto-detected type\n * 2. **Config object**: Passed to getDatabase() directly\n * 3. **DatabaseInterface**: Returned as-is\n *\n * @param config - Database configuration in any supported format\n * @param options - Resolution options (dbid for caching, optional explicit schemas)\n * @returns Promise resolving to a DatabaseInterface instance\n *\n * @example\n * ```typescript\n * // String URL\n * const db = await resolveDatabase('products.db');\n *\n * // Config object\n * const db = await resolveDatabase({\n * type: 'postgres',\n * url: 'postgres://localhost/mydb'\n * });\n *\n * // Pre-initialized instance (returned as-is)\n * const existingDb = await getDatabase({ url: ':memory:' });\n * const db = await resolveDatabase(existingDb);\n * console.log(db === existingDb); // true\n * ```\n */\nexport async function resolveDatabase(\n config: DatabaseConfig,\n options: ResolveDatabaseOptions = {},\n): Promise<DatabaseInterface> {\n const { dbid, schemas } = options;\n\n // Already a DatabaseInterface instance - return as-is\n if (isDatabaseInterface(config)) {\n return config;\n }\n\n // String URL shortcut\n if (typeof config === 'string') {\n const isMemoryDb = config === ':memory:';\n // The dbid is derived from the *bounded* URL so two configurations that\n // differ only in their PostgreSQL timeouts cannot share one pool (#2377).\n const bounded = applyPostgresRuntimeTimeouts({ url: config });\n return getDatabase({\n ...bounded,\n schemas,\n ...(isMemoryDb ? {} : { dbid: dbid ?? `smrt:${bounded.url}` }),\n } as Parameters<typeof getDatabase>[0]);\n }\n\n // Config object\n // Only default to :memory: for SQLite (or unspecified type which defaults to SQLite)\n // Other adapters (json, postgres, duckdb) require explicit URLs\n const canUseMemory = !config.type || config.type === 'sqlite';\n const dbUrl = config.url || (canUseMemory ? ':memory:' : '');\n const isMemoryDb = dbUrl === ':memory:';\n const bounded = applyPostgresRuntimeTimeouts({ ...config, url: dbUrl });\n // `config` is the loosely-typed config-object variant of `DatabaseConfig`\n // (it carries an open `[key: string]: unknown` index for adapter-specific\n // options). Cast the merged options to `getDatabase`'s own parameter type at\n // this boundary; the adapter validates the concrete shape at runtime.\n return getDatabase({\n ...bounded,\n schemas,\n ...(isMemoryDb ? {} : { dbid: dbid ?? `smrt:${bounded.url}` }),\n } as Parameters<typeof getDatabase>[0]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAgGA,SAAgB,oBACd,OAC4B;CAC5B,OACE,UAAU,QACV,OAAO,UAAU,YACjB,WAAW,SACX,OAAQ,MAA6B,UAAU;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,eAAsB,gBACpB,QACA,UAAkC,CAAC,GACP;CAC5B,MAAM,EAAE,MAAM,YAAY;CAG1B,IAAI,oBAAoB,MAAM,GAC5B,OAAO;CAIT,IAAI,OAAO,WAAW,UAAU;EAC9B,MAAM,aAAa,WAAW;EAG9B,MAAM,UAAU,6BAA6B,EAAE,KAAK,OAAO,CAAC;EAC5D,OAAO,YAAY;GACjB,GAAG;GACH;GACA,GAAI,aAAa,CAAC,IAAI,EAAE,MAAM,QAAQ,QAAQ,QAAQ,MAAM;EAC9D,CAAsC;CACxC;CAKA,MAAM,eAAe,CAAC,OAAO,QAAQ,OAAO,SAAS;CACrD,MAAM,QAAQ,OAAO,QAAQ,eAAe,aAAa;CACzD,MAAM,aAAa,UAAU;CAC7B,MAAM,UAAU,6BAA6B;EAAE,GAAG;EAAQ,KAAK;CAAM,CAAC;CAKtE,OAAO,YAAY;EACjB,GAAG;EACH;EACA,GAAI,aAAa,CAAC,IAAI,EAAE,MAAM,QAAQ,QAAQ,QAAQ,MAAM;CAC9D,CAAsC;AACxC"}
1
+ {"version":3,"file":"database.js","names":[],"sources":["../src/database.ts"],"sourcesContent":["/**\n * Database configuration and resolution utilities\n *\n * This module provides a unified type for database configuration options\n * and a utility function to resolve any config format to a DatabaseInterface.\n *\n * @module\n */\n\nimport type { DatabaseInterface, SchemasOption } from '@happyvertical/sql';\nimport { getDatabase } from './host.js';\nimport {\n applyPostgresRuntimeTimeouts,\n type PostgresTimeoutConfig,\n} from './postgres-timeouts.js';\n\n/**\n * Unified type for all database configuration formats\n *\n * Supports three formats:\n * - **String**: Connection URL (e.g., 'products.db', ':memory:', 'postgres://...')\n * - **Config object**: Full configuration with type, url, and options\n * - **DatabaseInterface**: Pre-initialized database instance\n *\n * @example\n * ```typescript\n * // String shortcut\n * const config: DatabaseConfig = 'products.db';\n *\n * // Config object\n * const config: DatabaseConfig = {\n * type: 'sqlite',\n * url: 'products.db',\n * authToken: 'token'\n * };\n *\n * // Pre-initialized instance\n * const db = await getDatabase({ type: 'sqlite', url: ':memory:' });\n * const config: DatabaseConfig = db;\n * ```\n */\nexport type DatabaseConfig =\n | string\n | {\n url?: string;\n type?: 'sqlite' | 'postgres' | 'duckdb' | 'json';\n authToken?: string;\n /**\n * Runtime PostgreSQL timeouts for this connection (#2377). Ignored by\n * every other engine.\n *\n * @see {@link PostgresTimeoutConfig}\n */\n timeouts?: PostgresTimeoutConfig;\n [key: string]: unknown;\n }\n | DatabaseInterface;\n\n/**\n * Canonical declaration of the request-scoped database global.\n *\n * The value is installed by whichever package owns request scoping (today\n * `@happyvertical/smrt-users`, via its session permission context) and is read\n * by the SvelteKit runtime config that `smrt-core`'s vite plugin generates into\n * consumer apps. Both sides used to `declare global` this name independently\n * with different types — `DatabaseConfig` here, a package-private\n * `QueryableDatabase` there — and TypeScript requires merged `var` declarations\n * to be *identical*, not merely compatible. Consumers whose program contained\n * both then failed to type-check (#2342).\n *\n * `smrt-core` owns the declaration because it is the base package every other\n * SMRT package and consumer already depends on. Writers should keep assigning a\n * live `DatabaseInterface`; it satisfies `DatabaseConfig` through that arm of\n * the union. Never redeclare this global elsewhere.\n */\ndeclare global {\n // eslint-disable-next-line no-var\n var __smrtGetRequestScopedDatabase:\n | (() => DatabaseConfig | undefined)\n | undefined;\n}\n\n/**\n * Type guard to check if a value is a DatabaseInterface instance\n *\n * @param value - Value to check\n * @returns True if value has query() and close() methods\n *\n * @example\n * ```typescript\n * if (isDatabaseInterface(config)) {\n * // config is DatabaseInterface\n * await config.query('SELECT 1');\n * }\n * ```\n */\nexport function isDatabaseInterface(\n value: unknown,\n): value is DatabaseInterface {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'query' in value &&\n typeof (value as { query: unknown }).query === 'function'\n );\n}\n\n/**\n * Options for resolving a database configuration\n */\nexport interface ResolveDatabaseOptions {\n /**\n * Cache key for connection pooling.\n * If provided, the same dbid returns the same cached connection.\n */\n dbid?: string;\n\n /**\n * Optional pre-generated schemas to pass to the database adapter.\n *\n * Intended for explicit tooling and test utilities that bootstrap schema\n * ahead of runtime. Core runtime no longer passes these automatically.\n */\n schemas?: SchemasOption;\n}\n\n/**\n * Resolve any DatabaseConfig format to a DatabaseInterface instance\n *\n * This utility function normalizes the three config formats:\n * 1. **String URL**: Passed to getDatabase() with auto-detected type\n * 2. **Config object**: Passed to getDatabase() directly\n * 3. **DatabaseInterface**: Returned as-is\n *\n * @param config - Database configuration in any supported format\n * @param options - Resolution options (dbid for caching, optional explicit schemas)\n * @returns Promise resolving to a DatabaseInterface instance\n *\n * @example\n * ```typescript\n * // String URL\n * const db = await resolveDatabase('products.db');\n *\n * // Config object\n * const db = await resolveDatabase({\n * type: 'postgres',\n * url: 'postgres://localhost/mydb'\n * });\n *\n * // Pre-initialized instance (returned as-is)\n * const existingDb = await getDatabase({ url: ':memory:' });\n * const db = await resolveDatabase(existingDb);\n * console.log(db === existingDb); // true\n * ```\n */\nexport async function resolveDatabase(\n config: DatabaseConfig,\n options: ResolveDatabaseOptions = {},\n): Promise<DatabaseInterface> {\n const { dbid, schemas } = options;\n\n // Already a DatabaseInterface instance - return as-is\n if (isDatabaseInterface(config)) {\n return config;\n }\n\n // String URL shortcut\n if (typeof config === 'string') {\n const isMemoryDb = config === ':memory:';\n // The dbid is derived from the *bounded* URL so two configurations that\n // differ only in their PostgreSQL timeouts cannot share one pool (#2377).\n const bounded = applyPostgresRuntimeTimeouts({ url: config });\n return getDatabase({\n ...bounded,\n schemas,\n ...(isMemoryDb ? {} : { dbid: dbid ?? `smrt:${bounded.url}` }),\n } as Parameters<typeof getDatabase>[0]);\n }\n\n // Config object\n // Only default to :memory: for SQLite (or unspecified type which defaults to SQLite)\n // Other adapters (json, postgres, duckdb) require explicit URLs\n const canUseMemory = !config.type || config.type === 'sqlite';\n const dbUrl = config.url || (canUseMemory ? ':memory:' : '');\n const isMemoryDb = dbUrl === ':memory:';\n const bounded = applyPostgresRuntimeTimeouts({ ...config, url: dbUrl });\n // `config` is the loosely-typed config-object variant of `DatabaseConfig`\n // (it carries an open `[key: string]: unknown` index for adapter-specific\n // options). Cast the merged options to `getDatabase`'s own parameter type at\n // this boundary; the adapter validates the concrete shape at runtime.\n return getDatabase({\n ...bounded,\n schemas,\n ...(isMemoryDb ? {} : { dbid: dbid ?? `smrt:${bounded.url}` }),\n } as Parameters<typeof getDatabase>[0]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAgGA,SAAgB,oBACd,OAC4B;CAC5B,OACE,UAAU,QACV,OAAO,UAAU,YACjB,WAAW,SACX,OAAQ,MAA6B,UAAU;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,eAAsB,gBACpB,QACA,UAAkC,CAAC,GACP;CAC5B,MAAM,EAAE,MAAM,YAAY;CAG1B,IAAI,oBAAoB,MAAM,GAC5B,OAAO;CAIT,IAAI,OAAO,WAAW,UAAU;EAC9B,MAAM,aAAa,WAAW;EAG9B,MAAM,UAAU,6BAA6B,EAAE,KAAK,OAAO,CAAC;EAC5D,OAAO,YAAY;GACjB,GAAG;GACH;GACA,GAAI,aAAa,CAAC,IAAI,EAAE,MAAM,QAAQ,QAAQ,QAAQ,MAAM;EAC9D,CAAsC;CACxC;CAKA,MAAM,eAAe,CAAC,OAAO,QAAQ,OAAO,SAAS;CACrD,MAAM,QAAQ,OAAO,QAAQ,eAAe,aAAa;CACzD,MAAM,aAAa,UAAU;CAC7B,MAAM,UAAU,6BAA6B;EAAE,GAAG;EAAQ,KAAK;CAAM,CAAC;CAKtE,OAAO,YAAY;EACjB,GAAG;EACH;EACA,GAAI,aAAa,CAAC,IAAI,EAAE,MAAM,QAAQ,QAAQ,QAAQ,MAAM;CAC9D,CAAsC;AACxC"}
@@ -1,3 +1,4 @@
1
+ import { getDatabase } from "../host.js";
1
2
  import { resolveDispatchTenantId, resolveDispatchTenantScope } from "./tenant-resolver.js";
2
3
  import { CREATE_SMRT_DISPATCH_SUBSCRIPTIONS_TABLE, CREATE_SMRT_DISPATCH_TABLE, getSystemTableDDLForEngine } from "../system/schema.js";
3
4
  import { applyPostgresRuntimeTimeouts } from "../postgres-timeouts.js";
@@ -8,7 +9,6 @@ import { DispatchCollection } from "./collections/Dispatches.js";
8
9
  import { DispatchSubscription } from "./models/DispatchSubscription.js";
9
10
  import { DispatchSubscriptionCollection } from "./collections/DispatchSubscriptions.js";
10
11
  import { createLogger } from "@happyvertical/logger";
11
- import { getDatabase } from "@happyvertical/sql";
12
12
  //#region src/dispatch/bus.ts
13
13
  /**
14
14
  * DispatchBus - Central hub for inter-agent communication