@gscdump/engine 3.8.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/dist/THIRD-PARTY-LICENSES.md +2 -2
  2. package/dist/adapters/filesystem.mjs +52 -19
  3. package/dist/adapters/hyparquet.d.mts +2 -2
  4. package/dist/adapters/hyparquet.mjs +6 -6
  5. package/dist/adapters/node.d.mts +2 -2
  6. package/dist/adapters/parquet-attach.d.mts +11 -4
  7. package/dist/adapters/parquet-attach.mjs +18 -5
  8. package/dist/adapters/r2-manifest.mjs +47 -27
  9. package/dist/analysis-range.d.mts +58 -1
  10. package/dist/analysis-range.mjs +102 -1
  11. package/dist/analysis-types.d.mts +42 -1
  12. package/dist/analysis-types.mjs +8 -1
  13. package/dist/analyzer/dispatch.mjs +21 -4
  14. package/dist/engine.mjs +5 -4
  15. package/dist/entities/inspection.d.mts +11 -0
  16. package/dist/entities/inspection.mjs +17 -0
  17. package/dist/entities/sitemap-list.d.mts +37 -0
  18. package/dist/entities/sitemap-list.mjs +23 -0
  19. package/dist/entities.d.mts +3 -2
  20. package/dist/entities.mjs +3 -2
  21. package/dist/entity-keys.d.mts +2 -0
  22. package/dist/entity-keys.mjs +4 -1
  23. package/dist/iceberg/catalog.d.mts +2 -2
  24. package/dist/iceberg/catalog.mjs +2 -2
  25. package/dist/ingest.d.mts +11 -2
  26. package/dist/ingest.mjs +19 -12
  27. package/dist/node_modules/.pnpm/hyparquet-compressors@1.1.2/node_modules/hyparquet-compressors/src/brotli.bitreader.mjs +93 -0
  28. package/dist/node_modules/.pnpm/{hyparquet-compressors@1.1.1 → hyparquet-compressors@1.1.2}/node_modules/hyparquet-compressors/src/brotli.huffman.mjs +19 -15
  29. package/dist/node_modules/.pnpm/{hyparquet-compressors@1.1.1 → hyparquet-compressors@1.1.2}/node_modules/hyparquet-compressors/src/brotli.mjs +5 -13
  30. package/dist/node_modules/.pnpm/hyparquet-compressors@1.1.2/node_modules/hyparquet-compressors/src/brotli.streams.mjs +25 -0
  31. package/dist/node_modules/.pnpm/{hyparquet-compressors@1.1.1 → hyparquet-compressors@1.1.2}/node_modules/hyparquet-compressors/src/brotli.transform.mjs +9 -7
  32. package/dist/node_modules/.pnpm/{hyparquet-compressors@1.1.1 → hyparquet-compressors@1.1.2}/node_modules/hyparquet-compressors/src/gzip.mjs +1 -4
  33. package/dist/node_modules/.pnpm/{hyparquet-compressors@1.1.1 → hyparquet-compressors@1.1.2}/node_modules/hyparquet-compressors/src/lz4.mjs +2 -1
  34. package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/bloom.mjs +1 -1
  35. package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/column.mjs +5 -4
  36. package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/datapage.mjs +1 -1
  37. package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/delta.mjs +21 -6
  38. package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/dremel.mjs +1 -1
  39. package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/indexes.mjs +1 -1
  40. package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/metadata.mjs +2 -2
  41. package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/parquet-writer.mjs +1 -1
  42. package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/types.d.mts +1 -1
  43. package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/unconvert.mjs +2 -2
  44. package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/types/index.d.mts +1 -1
  45. package/dist/node_modules/.pnpm/hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f/node_modules/hyparquet-writer/types/parquet-writer.d.mts +2 -0
  46. package/dist/node_modules/.pnpm/hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f/node_modules/hyparquet-writer/types/schema.d.mts +2 -0
  47. package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/filter.mjs +1 -1
  48. package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/index.mjs +2 -2
  49. package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/indexes.mjs +3 -3
  50. package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/metadata.mjs +2 -2
  51. package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/node.mjs +2 -2
  52. package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/rowgroup.mjs +7 -7
  53. package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/types.d.mts +9 -1
  54. package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/utils.mjs +18 -1
  55. package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/types/index.d.mts +2 -1
  56. package/dist/node_modules/.pnpm/hyparquet@1.31.1/node_modules/hyparquet/types/node.d.mts +3 -0
  57. package/dist/node_modules/.pnpm/icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/src/avro/avro.metadata.mjs +2 -0
  58. package/dist/node_modules/.pnpm/icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/src/avro/avro.read.mjs +5 -0
  59. package/dist/node_modules/.pnpm/icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/src/avro/avro.write.mjs +2 -0
  60. package/dist/node_modules/.pnpm/icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/src/fetch.mjs +9 -0
  61. package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/index.mjs +1 -1
  62. package/dist/node_modules/.pnpm/icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/src/read.mjs +12 -0
  63. package/dist/node_modules/.pnpm/icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/src/s3.mjs +3 -0
  64. package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/sql/icebergDataSource.mjs +1 -1
  65. package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/sql/icebergQuery.mjs +1 -1
  66. package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/types.d.mts +4 -4
  67. package/dist/node_modules/.pnpm/icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/src/write/parquet.mjs +5 -0
  68. package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/rewrite.mjs +1 -1
  69. package/dist/node_modules/.pnpm/icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/types/fetch.d.mts +2 -0
  70. package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/types/index.d.mts +1 -1
  71. package/dist/node_modules/.pnpm/icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/types/read.d.mts +3 -0
  72. package/dist/node_modules/.pnpm/icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/types/sql/icebergDataSource.d.mts +2 -0
  73. package/dist/node_modules/.pnpm/icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/types/sql/icebergQuery.d.mts +2 -0
  74. package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/plan/plan.mjs +1 -0
  75. package/dist/report/types.d.mts +8 -1
  76. package/dist/resolver/fragments.mjs +6 -4
  77. package/dist/schema.d.mts +4 -2
  78. package/dist/storage.d.mts +15 -5
  79. package/dist/vendor/hysnappy-purejs.mjs +1 -1
  80. package/package.json +12 -12
  81. package/dist/node_modules/.pnpm/hyparquet-compressors@1.1.1/node_modules/hyparquet-compressors/src/brotli.bitreader.mjs +0 -88
  82. package/dist/node_modules/.pnpm/hyparquet-compressors@1.1.1/node_modules/hyparquet-compressors/src/brotli.streams.mjs +0 -21
  83. package/dist/node_modules/.pnpm/hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f/node_modules/hyparquet-writer/types/parquet-writer.d.mts +0 -2
  84. package/dist/node_modules/.pnpm/hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f/node_modules/hyparquet-writer/types/schema.d.mts +0 -2
  85. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/assemble.mjs +0 -3
  86. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/bloom.mjs +0 -69
  87. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/column.mjs +0 -8
  88. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/convert.mjs +0 -3
  89. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/datapage.mjs +0 -6
  90. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/delta.mjs +0 -2
  91. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/encoding.mjs +0 -2
  92. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/filter.mjs +0 -4
  93. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/geoparquet.mjs +0 -1
  94. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/index.mjs +0 -8
  95. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/indexes.mjs +0 -5
  96. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/metadata.mjs +0 -7
  97. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/node.mjs +0 -3
  98. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/plain.mjs +0 -1
  99. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/plan.mjs +0 -6
  100. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/read.mjs +0 -7
  101. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/rowgroup.mjs +0 -7
  102. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/scan.mjs +0 -6
  103. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/schema.mjs +0 -54
  104. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/snappy.mjs +0 -1
  105. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/thrift.mjs +0 -1
  106. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/types.d.mts +0 -8
  107. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/utils.mjs +0 -19
  108. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/variant.mjs +0 -3
  109. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/src/wkb.mjs +0 -1
  110. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/types/index.d.mts +0 -9
  111. package/dist/node_modules/.pnpm/hyparquet@1.29.2/node_modules/hyparquet/types/node.d.mts +0 -3
  112. package/dist/node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/src/constants.mjs +0 -80
  113. package/dist/node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/src/query.mjs +0 -3
  114. package/dist/node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/src/xxhash.mjs +0 -68
  115. package/dist/node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/types/indexes.d.mts +0 -1
  116. package/dist/node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/types/node.d.mts +0 -3
  117. package/dist/node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/types/query.d.mts +0 -1
  118. package/dist/node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/types/read.d.mts +0 -1
  119. package/dist/node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/types/scan.d.mts +0 -1
  120. package/dist/node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/types/snappy.d.mts +0 -1
  121. package/dist/node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/types/utils.d.mts +0 -1
  122. package/dist/node_modules/.pnpm/icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/src/avro/avro.metadata.mjs +0 -1
  123. package/dist/node_modules/.pnpm/icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/src/avro/avro.read.mjs +0 -4
  124. package/dist/node_modules/.pnpm/icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/src/avro/avro.write.mjs +0 -2
  125. package/dist/node_modules/.pnpm/icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/src/fetch.mjs +0 -9
  126. package/dist/node_modules/.pnpm/icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/src/read.mjs +0 -12
  127. package/dist/node_modules/.pnpm/icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/src/s3.mjs +0 -3
  128. package/dist/node_modules/.pnpm/icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/src/write/parquet.mjs +0 -5
  129. package/dist/node_modules/.pnpm/icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/types/fetch.d.mts +0 -2
  130. package/dist/node_modules/.pnpm/icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/types/metadata.d.mts +0 -1
  131. package/dist/node_modules/.pnpm/icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/types/read.d.mts +0 -3
  132. package/dist/node_modules/.pnpm/icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/types/sql/icebergDataSource.d.mts +0 -2
  133. package/dist/node_modules/.pnpm/icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird/types/sql/icebergQuery.d.mts +0 -2
  134. /package/dist/node_modules/.pnpm/{hyparquet-compressors@1.1.1 → hyparquet-compressors@1.1.2}/node_modules/hyparquet-compressors/src/brotli.blocks.mjs +0 -0
  135. /package/dist/node_modules/.pnpm/{hyparquet-compressors@1.1.1 → hyparquet-compressors@1.1.2}/node_modules/hyparquet-compressors/src/brotli.context.mjs +0 -0
  136. /package/dist/node_modules/.pnpm/{hyparquet-compressors@1.1.1 → hyparquet-compressors@1.1.2}/node_modules/hyparquet-compressors/src/brotli.contextmap.mjs +0 -0
  137. /package/dist/node_modules/.pnpm/{hyparquet-compressors@1.1.1 → hyparquet-compressors@1.1.2}/node_modules/hyparquet-compressors/src/brotli.dictionary.mjs +0 -0
  138. /package/dist/node_modules/.pnpm/{hyparquet-compressors@1.1.1 → hyparquet-compressors@1.1.2}/node_modules/hyparquet-compressors/src/brotli.prefix.mjs +0 -0
  139. /package/dist/node_modules/.pnpm/{hyparquet-compressors@1.1.1 → hyparquet-compressors@1.1.2}/node_modules/hyparquet-compressors/src/compressors.mjs +0 -0
  140. /package/dist/node_modules/.pnpm/{hyparquet-compressors@1.1.1 → hyparquet-compressors@1.1.2}/node_modules/hyparquet-compressors/src/gzip.huffman.mjs +0 -0
  141. /package/dist/node_modules/.pnpm/{hyparquet-compressors@1.1.1 → hyparquet-compressors@1.1.2}/node_modules/hyparquet-compressors/src/index.mjs +0 -0
  142. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/bytewriter.mjs +0 -0
  143. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/dictionary.mjs +0 -0
  144. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/encoding.mjs +0 -0
  145. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/geospatial.mjs +0 -0
  146. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/index.mjs +0 -0
  147. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/node.mjs +0 -0
  148. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/plain.mjs +0 -0
  149. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/schema.mjs +0 -0
  150. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/snappy.mjs +0 -0
  151. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/splitstream.mjs +0 -0
  152. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/thrift.mjs +0 -0
  153. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/variant.mjs +0 -0
  154. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/wkb.mjs +0 -0
  155. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/write-rows.mjs +0 -0
  156. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/src/write.mjs +0 -0
  157. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/types/bytewriter.d.mts +0 -0
  158. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/types/node.d.mts +0 -0
  159. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/types/wkb.d.mts +0 -0
  160. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/types/write-rows.d.mts +0 -0
  161. /package/dist/node_modules/.pnpm/{hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f → hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f}/node_modules/hyparquet-writer/types/write.d.mts +0 -0
  162. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/assemble.mjs +0 -0
  163. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/bloom.mjs +0 -0
  164. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/column.mjs +0 -0
  165. /package/dist/node_modules/.pnpm/{hyparquet@1.29.2 → hyparquet@1.31.1}/node_modules/hyparquet/src/constants.mjs +0 -0
  166. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/convert.mjs +0 -0
  167. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/datapage.mjs +0 -0
  168. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/delta.mjs +0 -0
  169. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/encoding.mjs +0 -0
  170. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/geoparquet.mjs +0 -0
  171. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/plain.mjs +0 -0
  172. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/plan.mjs +0 -0
  173. /package/dist/node_modules/.pnpm/{hyparquet@1.29.2 → hyparquet@1.31.1}/node_modules/hyparquet/src/query.mjs +0 -0
  174. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/read.mjs +0 -0
  175. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/scan.mjs +0 -0
  176. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/schema.mjs +0 -0
  177. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/snappy.mjs +0 -0
  178. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/thrift.mjs +0 -0
  179. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/variant.mjs +0 -0
  180. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0 → hyparquet@1.31.1}/node_modules/hyparquet/src/wkb.mjs +0 -0
  181. /package/dist/node_modules/.pnpm/{hyparquet@1.29.2 → hyparquet@1.31.1}/node_modules/hyparquet/src/xxhash.mjs +0 -0
  182. /package/dist/node_modules/.pnpm/{hyparquet@1.29.2 → hyparquet@1.31.1}/node_modules/hyparquet/types/indexes.d.mts +0 -0
  183. /package/dist/node_modules/.pnpm/{hyparquet@1.29.2 → hyparquet@1.31.1}/node_modules/hyparquet/types/metadata.d.mts +0 -0
  184. /package/dist/node_modules/.pnpm/{hyparquet@1.29.2 → hyparquet@1.31.1}/node_modules/hyparquet/types/query.d.mts +0 -0
  185. /package/dist/node_modules/.pnpm/{hyparquet@1.29.2 → hyparquet@1.31.1}/node_modules/hyparquet/types/read.d.mts +0 -0
  186. /package/dist/node_modules/.pnpm/{hyparquet@1.29.2 → hyparquet@1.31.1}/node_modules/hyparquet/types/scan.d.mts +0 -0
  187. /package/dist/node_modules/.pnpm/{hyparquet@1.29.2 → hyparquet@1.31.1}/node_modules/hyparquet/types/snappy.d.mts +0 -0
  188. /package/dist/node_modules/.pnpm/{hyparquet@1.29.2 → hyparquet@1.31.1}/node_modules/hyparquet/types/utils.d.mts +0 -0
  189. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/catalog/file.mjs +0 -0
  190. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/catalog/loadTable.mjs +0 -0
  191. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/catalog/rest.mjs +0 -0
  192. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/create.mjs +0 -0
  193. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/delete.mjs +0 -0
  194. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/json.mjs +0 -0
  195. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/manifest.mjs +0 -0
  196. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/metadata.mjs +0 -0
  197. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/prune.mjs +0 -0
  198. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/puffin/deletion-vector.mjs +0 -0
  199. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/puffin/puffin.mjs +0 -0
  200. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/puffin/roaring.mjs +0 -0
  201. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/schema.mjs +0 -0
  202. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/sigv4.mjs +0 -0
  203. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/sql/whereFilter.mjs +0 -0
  204. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/utils.mjs +0 -0
  205. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/commit.mjs +0 -0
  206. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/conversions.mjs +0 -0
  207. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/delete-file.mjs +0 -0
  208. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/geospatial.mjs +0 -0
  209. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/manifest-list.mjs +0 -0
  210. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/manifest.mjs +0 -0
  211. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/partition.mjs +0 -0
  212. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/serde.mjs +0 -0
  213. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/snapshot.mjs +0 -0
  214. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/sort.mjs +0 -0
  215. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/stage-deletion-vector.mjs +0 -0
  216. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/stage-position-delete.mjs +0 -0
  217. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/stage.mjs +0 -0
  218. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/stats.mjs +0 -0
  219. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/transform.mjs +0 -0
  220. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/src/write/write.mjs +0 -0
  221. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/types/catalog/file.d.mts +0 -0
  222. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/types/catalog/rest.d.mts +0 -0
  223. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/types/create.d.mts +0 -0
  224. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/types/manifest.d.mts +0 -0
  225. /package/dist/node_modules/.pnpm/{hyparquet@1.30.0/node_modules/hyparquet → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae/node_modules/icebird}/types/metadata.d.mts +0 -0
  226. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/types/s3.d.mts +0 -0
  227. /package/dist/node_modules/.pnpm/{icebird@0.8.28_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae → icebird@0.8.30_patch_hash_fddf140b38d2e0cf41ed74c5b5eb5cac324d0a6ac428572f1df7a967dcb19cae}/node_modules/icebird/types/write/write.d.mts +0 -0
  228. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/ast.d.mts +0 -0
  229. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/backend/batch.mjs +0 -0
  230. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/backend/batchAdapters.mjs +0 -0
  231. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/backend/dataSource.mjs +0 -0
  232. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/execute/accumulator.mjs +0 -0
  233. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/execute/aggregates.mjs +0 -0
  234. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/execute/batchResults.mjs +0 -0
  235. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/execute/batches.mjs +0 -0
  236. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/execute/execute.mjs +0 -0
  237. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/execute/fold.mjs +0 -0
  238. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/execute/join.mjs +0 -0
  239. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/execute/rowScope.mjs +0 -0
  240. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/execute/scanColumn.mjs +0 -0
  241. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/execute/sort.mjs +0 -0
  242. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/execute/streamingAggregate.mjs +0 -0
  243. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/execute/utils.mjs +0 -0
  244. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/execute/window.mjs +0 -0
  245. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/execute/yield.mjs +0 -0
  246. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/expression/alias.mjs +0 -0
  247. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/expression/batch.mjs +0 -0
  248. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/expression/binary.mjs +0 -0
  249. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/expression/date.mjs +0 -0
  250. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/expression/evaluate.mjs +0 -0
  251. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/expression/math.mjs +0 -0
  252. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/expression/regexp.mjs +0 -0
  253. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/expression/scalar.mjs +0 -0
  254. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/expression/strings.mjs +0 -0
  255. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/index.d.mts +0 -0
  256. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/index.mjs +0 -0
  257. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/parse/expression.mjs +0 -0
  258. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/parse/extractTables.mjs +0 -0
  259. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/parse/functions.mjs +0 -0
  260. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/parse/joins.mjs +0 -0
  261. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/parse/parse.mjs +0 -0
  262. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/parse/primary.mjs +0 -0
  263. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/parse/state.mjs +0 -0
  264. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/parse/tokenize.mjs +0 -0
  265. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/parse/types.d.mts +0 -0
  266. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/plan/columns.mjs +0 -0
  267. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/plan/types.d.mts +0 -0
  268. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/spatial/bbox.mjs +0 -0
  269. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/spatial/equality.mjs +0 -0
  270. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/spatial/operations.mjs +0 -0
  271. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/spatial/pointRelations.mjs +0 -0
  272. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/spatial/primitives.mjs +0 -0
  273. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/spatial/segments.mjs +0 -0
  274. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/spatial/spatial.mjs +0 -0
  275. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/spatial/wkt.mjs +0 -0
  276. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/types.d.mts +0 -0
  277. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/validation/aggregates.mjs +0 -0
  278. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/validation/executionErrors.mjs +0 -0
  279. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/validation/functions.mjs +0 -0
  280. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/validation/keywords.mjs +0 -0
  281. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/validation/parseErrors.mjs +0 -0
  282. /package/dist/node_modules/.pnpm/{squirreling@0.16.4 → squirreling@0.16.6}/node_modules/squirreling/src/validation/tables.mjs +0 -0
@@ -35,11 +35,11 @@ Repository: https://github.com/101arrowz/fzstd
35
35
 
36
36
  ---------------------------------------
37
37
 
38
- ## hyparquet, hyparquet, hyparquet-compressors, hyparquet-writer, icebird, squirreling
38
+ ## hyparquet, hyparquet-compressors, hyparquet-writer, icebird, squirreling
39
39
 
40
40
  License: MIT
41
41
  By: Hyperparam
42
- Repositories: https://github.com/hyparam/hyparquet, https://github.com/hyparam/hyparquet, https://github.com/hyparam/hyparquet-compressors, https://github.com/hyparam/hyparquet-writer, https://github.com/hyparam/icebird, https://github.com/hyparam/squirreling
42
+ Repositories: https://github.com/hyparam/hyparquet, https://github.com/hyparam/hyparquet-compressors, https://github.com/hyparam/hyparquet-writer, https://github.com/hyparam/icebird, https://github.com/hyparam/squirreling
43
43
 
44
44
  > The MIT License (MIT)
45
45
  >
@@ -130,10 +130,48 @@ function lockFileFor(locksDir, scope) {
130
130
  const safe = `${scope.userId}|${scope.siteId ?? ""}|${scope.table}|${scope.partition}`.replace(/[^\w.-]/g, "_");
131
131
  return join(locksDir, `${safe}.lock`);
132
132
  }
133
+ const inProcessLockTails = /* @__PURE__ */ new Map();
134
+ async function withInProcessQueue(path, fn) {
135
+ const previous = inProcessLockTails.get(path) ?? Promise.resolve();
136
+ let release;
137
+ const current = new Promise((resolve) => {
138
+ release = resolve;
139
+ });
140
+ const tail = previous.then(() => current);
141
+ inProcessLockTails.set(path, tail);
142
+ await previous;
143
+ try {
144
+ return await fn();
145
+ } finally {
146
+ release();
147
+ if (inProcessLockTails.get(path) === tail) inProcessLockTails.delete(path);
148
+ }
149
+ }
133
150
  function createFilesystemManifestStore(opts) {
134
151
  const manifestPath = resolve(opts.path);
135
152
  const locksDir = join(dirname(manifestPath), "locks");
136
153
  const readyDirectories = /* @__PURE__ */ new Map();
154
+ async function withFileLock(path, fn) {
155
+ await writeFile(path, "", { flag: "a" }).catch(async (error) => {
156
+ if (error.code !== "ENOENT") throw error;
157
+ readyDirectories.delete(locksDir);
158
+ await ensureDirectory(locksDir);
159
+ await writeFile(path, "", { flag: "a" });
160
+ });
161
+ const release = await lock(path, {
162
+ realpath: false,
163
+ stale: 3e4,
164
+ retries: {
165
+ retries: 20,
166
+ minTimeout: 50,
167
+ maxTimeout: 500,
168
+ factor: 1.5
169
+ }
170
+ });
171
+ return await fn().finally(() => release().catch((releaseErr) => {
172
+ console.warn(`[gscdump/engine] failed to release lock ${path}; it will go stale after 30000ms`, releaseErr);
173
+ }));
174
+ }
137
175
  async function ensureDirectory(path) {
138
176
  let pending = readyDirectories.get(path);
139
177
  if (!pending) {
@@ -247,28 +285,23 @@ function createFilesystemManifestStore(opts) {
247
285
  await save(data);
248
286
  });
249
287
  },
288
+ async setSyncStates(scopes, state, detail) {
289
+ if (scopes.length === 0) return;
290
+ return enqueue(async () => {
291
+ const data = await load();
292
+ const byKey = new Map((data.syncStates ?? []).map((s) => [syncStateKey(s), s]));
293
+ for (const scope of scopes) {
294
+ const key = syncStateKey(scope);
295
+ byKey.set(key, mergeSyncState(byKey.get(key), scope, state, detail));
296
+ }
297
+ data.syncStates = Array.from(byKey.values());
298
+ await save(data);
299
+ });
300
+ },
250
301
  async withLock(scope, fn) {
251
302
  await ensureDirectory(locksDir);
252
303
  const path = lockFileFor(locksDir, scope);
253
- await writeFile(path, "", { flag: "a" }).catch(async (error) => {
254
- if (error.code !== "ENOENT") throw error;
255
- readyDirectories.delete(locksDir);
256
- await ensureDirectory(locksDir);
257
- await writeFile(path, "", { flag: "a" });
258
- });
259
- const release = await lock(path, {
260
- realpath: false,
261
- stale: 3e4,
262
- retries: {
263
- retries: 20,
264
- minTimeout: 50,
265
- maxTimeout: 500,
266
- factor: 1.5
267
- }
268
- });
269
- return await fn().finally(() => release().catch((releaseErr) => {
270
- console.warn(`[gscdump/engine] failed to release lock ${path}; it will go stale after 30000ms`, releaseErr);
271
- }));
304
+ return withInProcessQueue(path, () => withFileLock(path, fn));
272
305
  },
273
306
  async purgeTenant(filter) {
274
307
  return enqueue(async () => {
@@ -1,5 +1,5 @@
1
- import { ParquetQueryFilter } from "../node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/types/index.mjs";
2
- import "../node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/types/node.mjs";
1
+ import { ParquetQueryFilter } from "../node_modules/.pnpm/hyparquet@1.31.1/node_modules/hyparquet/types/index.mjs";
2
+ import "../node_modules/.pnpm/hyparquet@1.31.1/node_modules/hyparquet/types/node.mjs";
3
3
  import { CodecCtx, DataSource, ParquetCodec, Row, TableName } from "../storage.mjs";
4
4
  import { ColumnDef } from "../schema.mjs";
5
5
  export declare function encodeRowsToParquet(table: TableName, rows: readonly Row[]): Uint8Array;
@@ -1,11 +1,11 @@
1
1
  import { TABLE_METADATA } from "../drizzle-schema.mjs";
2
2
  import { SCHEMAS } from "../schema.mjs";
3
- import { parquetMetadataAsync, parquetSchema } from "../node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/src/metadata.mjs";
4
- import { parquetReadObjects } from "../node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/src/read.mjs";
5
- import "../node_modules/.pnpm/hyparquet@1.30.0/node_modules/hyparquet/src/node.mjs";
6
- import { ByteWriter } from "../node_modules/.pnpm/hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f/node_modules/hyparquet-writer/src/bytewriter.mjs";
7
- import { parquetWriteRows } from "../node_modules/.pnpm/hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f/node_modules/hyparquet-writer/src/write-rows.mjs";
8
- import "../node_modules/.pnpm/hyparquet-writer@0.16.9_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f/node_modules/hyparquet-writer/src/node.mjs";
3
+ import { parquetMetadataAsync, parquetSchema } from "../node_modules/.pnpm/hyparquet@1.31.1/node_modules/hyparquet/src/metadata.mjs";
4
+ import { parquetReadObjects } from "../node_modules/.pnpm/hyparquet@1.31.1/node_modules/hyparquet/src/read.mjs";
5
+ import "../node_modules/.pnpm/hyparquet@1.31.1/node_modules/hyparquet/src/node.mjs";
6
+ import { ByteWriter } from "../node_modules/.pnpm/hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f/node_modules/hyparquet-writer/src/bytewriter.mjs";
7
+ import { parquetWriteRows } from "../node_modules/.pnpm/hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f/node_modules/hyparquet-writer/src/write-rows.mjs";
8
+ import "../node_modules/.pnpm/hyparquet-writer@0.16.10_patch_hash_d26d002aede61ad95dd633d6557b56897cdcbc45dfc3a5d93fa0e9075ad5425f/node_modules/hyparquet-writer/src/node.mjs";
9
9
  const ROW_GROUP_SIZE = 25e3;
10
10
  const DEFAULT_COMPACTION_READ_CONCURRENCY = 8;
11
11
  const MAX_COMPACTION_READ_CONCURRENCY = 32;
@@ -1,5 +1,5 @@
1
1
  import { NodeDuckDBOptions, createNodeDuckDBHandle, resetNodeDuckDB } from "./duckdb-node.mjs";
2
2
  import { NodeHarness, NodeHarnessOptions, createNodeHarness } from "./node-harness.mjs";
3
3
  import { AttachSnapshotOptions, AttachSnapshotResult, SnapshotQueryRunner, attachSnapshotIndex, snapshotAlias } from "./snapshot-attach.mjs";
4
- import { AttachParquetIndexOptions, AttachParquetIndexResult, attachParquetIndex } from "./parquet-attach.mjs";
5
- export { type AttachParquetIndexOptions, type AttachParquetIndexResult, type AttachSnapshotOptions, type AttachSnapshotResult, type NodeDuckDBOptions, type NodeHarness, type NodeHarnessOptions, type SnapshotQueryRunner, attachParquetIndex, attachSnapshotIndex, createNodeDuckDBHandle, createNodeHarness, resetNodeDuckDB, snapshotAlias };
4
+ import { AttachParquetIndexOptions, AttachParquetIndexResult, ParquetFileGroup, attachParquetIndex } from "./parquet-attach.mjs";
5
+ export { type AttachParquetIndexOptions, type AttachParquetIndexResult, type AttachSnapshotOptions, type AttachSnapshotResult, type NodeDuckDBOptions, type NodeHarness, type NodeHarnessOptions, type ParquetFileGroup, type SnapshotQueryRunner, attachParquetIndex, attachSnapshotIndex, createNodeDuckDBHandle, createNodeHarness, resetNodeDuckDB, snapshotAlias };
@@ -1,11 +1,18 @@
1
1
  import { SnapshotQueryRunner } from "./snapshot-attach.mjs";
2
+ /** Files that share constant column values, such as one Site and search type. */
3
+ export interface ParquetFileGroup {
4
+ urls: string[];
5
+ /** Column name → VARCHAR value added to every row of this group. */
6
+ constants?: Record<string, string>;
7
+ }
2
8
  export interface AttachParquetIndexOptions {
3
9
  /**
4
- * Map of table name → list of Parquet URLs or local paths. The list may mix monthly
5
- * compacted files and per-day files — DuckDB will scan all of them with
6
- * `union_by_name = true`. Empty lists are skipped (no view created).
10
+ * Map of table name → list of Parquet URLs or local paths, or groups of
11
+ * them. A list may mix monthly compacted files and per-day files — DuckDB
12
+ * scans all of them with `union_by_name = true`. Empty lists and groups
13
+ * are skipped; a table with no files gets no view.
7
14
  */
8
- tables: Record<string, string[]>;
15
+ tables: Record<string, string[] | ParquetFileGroup[]>;
9
16
  /** Schema the views land under. Default `main`. */
10
17
  schema?: string;
11
18
  /**
@@ -1,11 +1,24 @@
1
1
  const IDENT_RE = /^[A-Z_][\w$]*$/i;
2
2
  const REMOTE_URL_RE = /^(?:https?|s3):\/\//i;
3
+ function toGroups(value) {
4
+ return value.every((item) => typeof item === "string") ? [{ urls: value }] : value;
5
+ }
6
+ function quote(value) {
7
+ return `'${value.replace(/'/g, "''")}'`;
8
+ }
9
+ function groupSelect(group) {
10
+ return `SELECT ${Object.entries(group.constants ?? {}).map(([name, value]) => `${quote(value)}::VARCHAR AS ${name}, `).join("")}* FROM read_parquet([${group.urls.map(quote).join(", ")}], union_by_name = true)`;
11
+ }
3
12
  async function attachParquetIndex(runner, opts) {
4
13
  const schema = opts.schema ?? "main";
5
14
  const forceDownload = opts.forceDownload !== false;
6
15
  if (!IDENT_RE.test(schema)) throw new TypeError(`attachParquetIndex: invalid schema identifier ${JSON.stringify(schema)}`);
7
- for (const table of Object.keys(opts.tables)) if (!IDENT_RE.test(table)) throw new TypeError(`attachParquetIndex: invalid table identifier ${JSON.stringify(table)}`);
8
- if (Object.values(opts.tables).some((urls) => urls.some((url) => REMOTE_URL_RE.test(url)))) {
16
+ const tables = Object.entries(opts.tables).map(([table, value]) => [table, toGroups(value).filter((group) => group.urls.length > 0)]);
17
+ for (const [table, groups] of tables) {
18
+ if (!IDENT_RE.test(table)) throw new TypeError(`attachParquetIndex: invalid table identifier ${JSON.stringify(table)}`);
19
+ for (const name of groups.flatMap((group) => Object.keys(group.constants ?? {}))) if (!IDENT_RE.test(name)) throw new TypeError(`attachParquetIndex: invalid column identifier ${JSON.stringify(name)}`);
20
+ }
21
+ if (tables.some(([, groups]) => groups.some((group) => group.urls.some((url) => REMOTE_URL_RE.test(url))))) {
9
22
  await runner("LOAD httpfs").catch((cause) => {
10
23
  throw new Error("Remote files require the DuckDB httpfs extension. Install httpfs before attaching remote files.", { cause });
11
24
  });
@@ -13,9 +26,9 @@ async function attachParquetIndex(runner, opts) {
13
26
  }
14
27
  await runner(`CREATE SCHEMA IF NOT EXISTS ${schema}`);
15
28
  const created = [];
16
- for (const [table, urls] of Object.entries(opts.tables)) {
17
- if (urls.length === 0) continue;
18
- await runner(`CREATE OR REPLACE VIEW ${schema}.${table} AS SELECT * FROM read_parquet([${urls.map((u) => `'${u.replace(/'/g, "''")}'`).join(", ")}], union_by_name = true)`);
29
+ for (const [table, groups] of tables) {
30
+ if (groups.length === 0) continue;
31
+ await runner(`CREATE OR REPLACE VIEW ${schema}.${table} AS ${groups.map(groupSelect).join(" UNION ALL BY NAME ")}`);
19
32
  created.push(table);
20
33
  }
21
34
  return {
@@ -54,6 +54,34 @@ function shardScopesFromEntries(entries) {
54
54
  }
55
55
  return out;
56
56
  }
57
+ function applySyncState(snap, scope, state, at, detail) {
58
+ const scopeSearchType = inferSearchType(scope);
59
+ const idx = snap.syncStates.findIndex((s) => s.userId === scope.userId && s.siteId === scope.siteId && s.table === scope.table && s.date === scope.date && inferSearchType(s) === scopeSearchType);
60
+ if (idx === -1) {
61
+ snap.syncStates.push({
62
+ userId: scope.userId,
63
+ siteId: scope.siteId,
64
+ table: scope.table,
65
+ date: scope.date,
66
+ state,
67
+ updatedAt: at,
68
+ attempts: 1,
69
+ error: detail?.error,
70
+ ...scope.searchType !== void 0 ? { searchType: scope.searchType } : {}
71
+ });
72
+ return;
73
+ }
74
+ const prev = snap.syncStates[idx];
75
+ const attempts = state === "inflight" && prev.state !== "inflight" ? prev.attempts + 1 : prev.attempts;
76
+ const error = state === "done" ? void 0 : detail?.error ?? prev.error;
77
+ snap.syncStates[idx] = {
78
+ ...prev,
79
+ state,
80
+ updatedAt: at,
81
+ attempts,
82
+ error
83
+ };
84
+ }
57
85
  function createR2ManifestStore(opts) {
58
86
  const { bucket, userId } = opts;
59
87
  const newSnapshotId = opts.newSnapshotId ?? defaultSnapshotId;
@@ -298,34 +326,26 @@ function createR2ManifestStore(opts) {
298
326
  assertScopedUser(scope.userId, "setSyncState");
299
327
  if (scope.siteId === void 0) throw new Error("R2 manifest store requires sync states to carry siteId");
300
328
  const at = detail?.at ?? now();
301
- const scopeSearchType = inferSearchType(scope);
302
- await mutateShard(scope.siteId, scope.table, (snap) => {
303
- const idx = snap.syncStates.findIndex((s) => s.userId === userId && s.siteId === scope.siteId && s.table === scope.table && s.date === scope.date && inferSearchType(s) === scopeSearchType);
304
- if (idx === -1) {
305
- snap.syncStates.push({
306
- userId,
307
- siteId: scope.siteId,
308
- table: scope.table,
309
- date: scope.date,
310
- state,
311
- updatedAt: at,
312
- attempts: 1,
313
- error: detail?.error,
314
- ...scope.searchType !== void 0 ? { searchType: scope.searchType } : {}
315
- });
316
- return;
317
- }
318
- const prev = snap.syncStates[idx];
319
- const attempts = state === "inflight" && prev.state !== "inflight" ? prev.attempts + 1 : prev.attempts;
320
- const error = state === "done" ? void 0 : detail?.error ?? prev.error;
321
- snap.syncStates[idx] = {
322
- ...prev,
323
- state,
324
- updatedAt: at,
325
- attempts,
326
- error
329
+ await mutateShard(scope.siteId, scope.table, (snap) => applySyncState(snap, scope, state, at, detail));
330
+ },
331
+ async setSyncStates(scopes, state, detail) {
332
+ const byShard = /* @__PURE__ */ new Map();
333
+ for (const scope of scopes) {
334
+ assertScopedUser(scope.userId, "setSyncStates");
335
+ if (scope.siteId === void 0) throw new Error("R2 manifest store requires sync states to carry siteId");
336
+ const key = `${scope.siteId}|${scope.table}`;
337
+ const shard = byShard.get(key) ?? {
338
+ siteId: scope.siteId,
339
+ table: scope.table,
340
+ scopes: []
327
341
  };
328
- });
342
+ shard.scopes.push(scope);
343
+ byShard.set(key, shard);
344
+ }
345
+ const at = detail?.at ?? now();
346
+ await mapWithConcurrency([...byShard.values()], SHARD_IO_CONCURRENCY, async (shard) => mutateShard(shard.siteId, shard.table, (snap) => {
347
+ for (const scope of shard.scopes) applySyncState(snap, scope, state, at, detail);
348
+ }));
329
349
  },
330
350
  async withLock(_scope, fn) {
331
351
  return fn();
@@ -1,6 +1,63 @@
1
1
  import { AnalysisParams } from "./analysis-types.mjs";
2
+ import { SearchType } from "gscdump/query";
2
3
  export interface AnalysisCoverageRange {
3
4
  start: string;
4
5
  end: string;
5
6
  }
6
- export declare function analysisRequestedRange(params: AnalysisParams, onInvalidFilter?: (error: unknown) => void): AnalysisCoverageRange | null;
7
+ export declare function analysisRequestedRange(params: AnalysisParams, onInvalidFilter?: (error: unknown) => void): AnalysisCoverageRange | null;
8
+ export interface DateSpan {
9
+ start: string;
10
+ end: string;
11
+ }
12
+ /**
13
+ * Where a host reads synced dates from. gscdump.com reads its ingest
14
+ * ledger; the CLI reads the Store's sync states. `table` is a string so a
15
+ * host can name its own derived tables.
16
+ */
17
+ export interface CoverageReader {
18
+ datesForTable: (opts: {
19
+ table: string;
20
+ searchType: SearchType;
21
+ start: string;
22
+ end: string;
23
+ }) => Promise<readonly string[]>;
24
+ }
25
+ export interface CoveragePlanTable {
26
+ table: string;
27
+ required: boolean;
28
+ coveredSpans: DateSpan[];
29
+ gaps: DateSpan[];
30
+ }
31
+ export interface CoveragePlan {
32
+ searchType: SearchType;
33
+ requested: DateSpan;
34
+ tables: CoveragePlanTable[];
35
+ /** Every required table covers the requested range (less the tail grace). */
36
+ complete: boolean;
37
+ /** Hash of the covered spans. It changes when coverage changes. */
38
+ coverageVersion: string;
39
+ }
40
+ export interface BuildCoveragePlanOptions {
41
+ searchType: SearchType;
42
+ requested: DateSpan;
43
+ tables: readonly (string | {
44
+ table: string;
45
+ required?: boolean;
46
+ })[];
47
+ reader: CoverageReader;
48
+ /** Ignore the still-restating tail when deciding whether coverage is complete. */
49
+ tailGraceDays?: number;
50
+ /** Tables read at once. Default 3. */
51
+ concurrency?: number;
52
+ }
53
+ /** Sorted, merged spans of consecutive dates. */
54
+ export declare function consolidateDatesToSpans(dates: readonly string[]): DateSpan[];
55
+ /** The parts of `requested` that no span covers. Spans must be sorted and disjoint. */
56
+ export declare function gapsForRange(coveredSpans: readonly DateSpan[], requested: DateSpan): DateSpan[];
57
+ /** Days in a span, both ends included. */
58
+ export declare function spanDays(span: DateSpan): number;
59
+ /**
60
+ * Per-table coverage of one requested range. Pure over the reader: the
61
+ * host decides where synced dates live.
62
+ */
63
+ export declare function buildCoveragePlan(opts: BuildCoveragePlanOptions): Promise<CoveragePlan>;
@@ -1,3 +1,4 @@
1
+ import { addDays } from "gscdump/dates";
1
2
  import { extractDateRange, normalizeFilter } from "gscdump/query";
2
3
  const ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
3
4
  function addRange(ranges, start, end) {
@@ -31,4 +32,104 @@ function analysisRequestedRange(params, onInvalidFilter) {
31
32
  end: next.end > range.end ? next.end : range.end
32
33
  }));
33
34
  }
34
- export { analysisRequestedRange };
35
+ function consolidateDatesToSpans(dates) {
36
+ if (dates.length === 0) return [];
37
+ const sorted = [...new Set(dates)].sort();
38
+ const out = [];
39
+ let start = sorted[0];
40
+ let end = sorted[0];
41
+ for (const date of sorted.slice(1)) {
42
+ if (date === addDays(end, 1)) {
43
+ end = date;
44
+ continue;
45
+ }
46
+ out.push({
47
+ start,
48
+ end
49
+ });
50
+ start = date;
51
+ end = date;
52
+ }
53
+ out.push({
54
+ start,
55
+ end
56
+ });
57
+ return out;
58
+ }
59
+ function gapsForRange(coveredSpans, requested) {
60
+ const gaps = [];
61
+ let cursor = requested.start;
62
+ for (const span of coveredSpans) {
63
+ if (span.end < cursor) continue;
64
+ if (span.start > requested.end) break;
65
+ if (span.start > cursor) gaps.push({
66
+ start: cursor,
67
+ end: addDays(span.start, -1)
68
+ });
69
+ if (span.end >= requested.end) return gaps;
70
+ cursor = addDays(span.end, 1);
71
+ }
72
+ if (cursor <= requested.end) gaps.push({
73
+ start: cursor,
74
+ end: requested.end
75
+ });
76
+ return gaps;
77
+ }
78
+ function spanDays(span) {
79
+ return Math.round((Date.parse(`${span.end}T00:00:00Z`) - Date.parse(`${span.start}T00:00:00Z`)) / 864e5) + 1;
80
+ }
81
+ async function mapLimit(items, limit, fn) {
82
+ const out = Array.from({ length: items.length });
83
+ let next = 0;
84
+ const worker = async () => {
85
+ while (next < items.length) {
86
+ const index = next++;
87
+ out[index] = await fn(items[index]);
88
+ }
89
+ };
90
+ await Promise.all(Array.from({ length: Math.max(1, Math.min(limit, items.length)) }, worker));
91
+ return out;
92
+ }
93
+ async function hashCoverage(parts) {
94
+ const data = new TextEncoder().encode(parts.sort().join("\n"));
95
+ const digest = await crypto.subtle.digest("SHA-256", data);
96
+ return [...new Uint8Array(digest).slice(0, 16)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
97
+ }
98
+ async function buildCoveragePlan(opts) {
99
+ const { requested, searchType } = opts;
100
+ const graceEnd = opts.tailGraceDays && opts.tailGraceDays > 0 ? addDays(requested.end, -opts.tailGraceDays) : requested.end;
101
+ const gate = {
102
+ start: requested.start,
103
+ end: graceEnd < requested.start ? requested.start : graceEnd
104
+ };
105
+ const tables = await mapLimit(opts.tables, opts.concurrency ?? 3, async (raw) => {
106
+ const input = typeof raw === "string" ? {
107
+ table: raw,
108
+ required: true
109
+ } : {
110
+ table: raw.table,
111
+ required: raw.required ?? true
112
+ };
113
+ const coveredSpans = consolidateDatesToSpans((await opts.reader.datesForTable({
114
+ table: input.table,
115
+ searchType,
116
+ start: requested.start,
117
+ end: requested.end
118
+ })).filter((date) => date >= requested.start && date <= requested.end));
119
+ return {
120
+ table: input.table,
121
+ required: input.required,
122
+ coveredSpans,
123
+ gaps: gapsForRange(coveredSpans, requested)
124
+ };
125
+ });
126
+ const required = tables.filter((table) => table.required);
127
+ return {
128
+ searchType,
129
+ requested: { ...requested },
130
+ tables,
131
+ complete: required.length > 0 && required.every((table) => gapsForRange(table.coveredSpans, gate).length === 0),
132
+ coverageVersion: await hashCoverage(tables.flatMap((table) => table.coveredSpans.map((span) => `${table.table}\0${span.start}\0${span.end}`)))
133
+ };
134
+ }
135
+ export { analysisRequestedRange, buildCoveragePlan, consolidateDatesToSpans, gapsForRange, spanDays };
@@ -7,8 +7,18 @@ export interface AnalysisParams {
7
7
  prevStartDate?: string;
8
8
  prevEndDate?: string;
9
9
  brandTerms?: string[];
10
+ /**
11
+ * Output cap: how many result rows the analyzer returns. It never bounds
12
+ * the rows an analyzer reads. Use `fetchBudget` for that.
13
+ */
10
14
  limit?: number;
11
15
  offset?: number;
16
+ /**
17
+ * Row-plan fetch cap per query, in rows. Defaults to
18
+ * `DEFAULT_FETCH_BUDGET` (one GSC page). SQL plans ignore it. When a fetch
19
+ * reaches the budget, the result meta reports `coverage.kind: 'truncated'`.
20
+ */
21
+ fetchBudget?: number;
12
22
  /**
13
23
  * movers: select a single direction and paginate within it. When set, the
14
24
  * analyzer filters to that direction, reports `meta.total` as the full
@@ -48,9 +58,40 @@ export interface AnalysisParams {
48
58
  /** GSC slice the analysis is scoped to. Undefined = analyzer runs cross-type (today's behaviour for web-only sites). */
49
59
  searchType?: SearchType;
50
60
  }
61
+ /**
62
+ * Whether an analyzer read every matching row. `truncated` means at least one
63
+ * row query stopped at its fetch budget, so totals and rankings can be wrong.
64
+ * `fetched` is the row count of the largest truncated query.
65
+ */
66
+ export type AnalyzerCoverage = {
67
+ kind: 'complete';
68
+ } | {
69
+ kind: 'truncated';
70
+ fetched: number;
71
+ };
51
72
  export interface AnalysisResult {
52
73
  results: Record<string, unknown>[];
53
- meta: Record<string, unknown>;
74
+ meta: Record<string, unknown> & {
75
+ coverage?: AnalyzerCoverage;
76
+ };
54
77
  }
78
+ /** One GSC Search Analytics page. The default row-plan fetch cap. */
79
+ export declare const DEFAULT_FETCH_BUDGET = 25000;
80
+ /** Upper bound for an opt-in fetch budget. Larger pulls exhaust GSC quota. */
81
+ export declare const MAX_FETCH_BUDGET = 100000;
82
+ declare const fetchBudgetBrand: unique symbol;
83
+ /**
84
+ * Rows a row plan may fetch per query. Branded so an output `limit` cannot
85
+ * be passed where a fetch cap is expected. Build one with `fetchBudgetOf`.
86
+ */
87
+ export type FetchBudget = number & {
88
+ readonly [fetchBudgetBrand]: true;
89
+ };
90
+ /**
91
+ * Resolve the fetch budget for a run: `params.fetchBudget` clamped to
92
+ * `[1, MAX_FETCH_BUDGET]`, else `DEFAULT_FETCH_BUDGET`. It never reads
93
+ * `params.limit`.
94
+ */
95
+ export declare function fetchBudgetOf(params: Pick<AnalysisParams, 'fetchBudget'>): FetchBudget;
55
96
  /** Coerce arbitrary value (number, bigint, string, null) to number, defaulting to 0. */
56
97
  export declare function num(v: unknown): number;
@@ -1,7 +1,14 @@
1
+ const DEFAULT_FETCH_BUDGET = 25e3;
2
+ const MAX_FETCH_BUDGET = 1e5;
3
+ function fetchBudgetOf(params) {
4
+ const raw = params.fetchBudget;
5
+ if (raw == null || !Number.isFinite(raw) || raw < 1) return DEFAULT_FETCH_BUDGET;
6
+ return Math.min(Math.floor(raw), MAX_FETCH_BUDGET);
7
+ }
1
8
  function num(v) {
2
9
  if (typeof v === "number") return v;
3
10
  if (typeof v === "bigint") return Number(v);
4
11
  if (v == null) return 0;
5
12
  return Number(v);
6
13
  }
7
- export { num };
14
+ export { DEFAULT_FETCH_BUDGET, MAX_FETCH_BUDGET, fetchBudgetOf, num };
@@ -47,16 +47,32 @@ async function runAnalyzerFromSource(source, params, registry) {
47
47
  if (plan.kind === "rows") return runRowsPlanAgainstSource(source, analyzer, plan, params);
48
48
  return runSqlPlanAgainstSource(source, analyzer, plan, params);
49
49
  }
50
+ async function fetchPlanRows(source, state) {
51
+ const rows = await source.queryRows(state);
52
+ return {
53
+ rows,
54
+ truncated: state.rowLimit != null && rows.length >= state.rowLimit
55
+ };
56
+ }
57
+ function coverageOf(fetches) {
58
+ const truncated = fetches.filter((f) => f.truncated);
59
+ if (truncated.length === 0) return { kind: "complete" };
60
+ return {
61
+ kind: "truncated",
62
+ fetched: Math.max(...truncated.map((f) => f.rows.length))
63
+ };
64
+ }
50
65
  async function runRowsPlanAgainstSource(source, analyzer, plan, params) {
51
66
  const entries = Object.entries(plan.queries);
52
- const resolved = await Promise.all(entries.map(async ([k, q]) => [k, await source.queryRows(q.state)]));
53
- const rowMap = Object.fromEntries(resolved);
67
+ const fetched = await Promise.all(entries.map(async ([k, q]) => [k, await fetchPlanRows(source, q.state)]));
68
+ const rowMap = Object.fromEntries(fetched.map(([k, f]) => [k, f.rows]));
54
69
  const { results, meta } = analyzer.reduce(rowMap, { params });
55
70
  return {
56
71
  results,
57
72
  meta: {
58
73
  tool: params.type,
59
- ...meta
74
+ ...meta,
75
+ coverage: coverageOf(fetched.map(([, f]) => f))
60
76
  }
61
77
  };
62
78
  }
@@ -85,7 +101,8 @@ async function runSqlPlanAgainstSource(source, analyzer, plan, params) {
85
101
  meta: {
86
102
  tool: params.type,
87
103
  ...sourceMeta,
88
- ...meta
104
+ ...meta,
105
+ coverage: { kind: "complete" }
89
106
  }
90
107
  };
91
108
  }
package/dist/engine.mjs CHANGED
@@ -1,8 +1,9 @@
1
1
  import { dayPartition, hourPartition, inferSearchType, objectKey, tenantPrefix } from "./layout.mjs";
2
- import { SCHEMAS, currentSchemaVersion, dedupeByNaturalKey } from "./schema.mjs";
2
+ import { SCHEMAS, currentSchemaVersion } from "./schema.mjs";
3
3
  import { compactTieredImpl, dedupeOverlappingTiers, splitOverlappingTiers } from "./compaction.mjs";
4
4
  import { compileLogicalQueryPlan } from "./parquet-plan.mjs";
5
5
  import { gcOrphansImpl } from "./gc.mjs";
6
+ import { sumByStoredKey } from "./ingest.mjs";
6
7
  import { extractParquetPushdown } from "./parquet-pushdown.mjs";
7
8
  import { buildLogicalPlan } from "gscdump/query/plan";
8
9
  import { normalizeUrl } from "gscdump/normalize";
@@ -60,7 +61,7 @@ function createStorageEngine(opts) {
60
61
  partitions: [partition],
61
62
  searchType: inferSearchType({ searchType })
62
63
  });
63
- const normalizedRows = dedupeByNaturalKey(ctx.table, rows.map((r) => normalizeRow(ctx.table, r)));
64
+ const normalizedRows = sumByStoredKey(ctx.table, rows.map((r) => normalizeRow(ctx.table, r)));
64
65
  const key = objectKey(ctx, ctx.table, partition, now, searchType);
65
66
  const { bytes: writtenBytes, rowCount } = await codec.writeRows({ table: ctx.table }, normalizedRows, key, dataSource);
66
67
  let bytes = writtenBytes;
@@ -128,8 +129,7 @@ function createStorageEngine(opts) {
128
129
  const k = `${String(r.url ?? "")}\0${String(r.hour ?? "")}`;
129
130
  dedup.set(k, r);
130
131
  }
131
- for (const r of rows) {
132
- const normalized = normalizeRow(ctx.table, r);
132
+ for (const normalized of sumByStoredKey(ctx.table, rows.map((r) => normalizeRow(ctx.table, r)))) {
133
133
  const k = `${String(normalized.url ?? "")}\0${String(normalized.hour ?? "")}`;
134
134
  dedup.set(k, normalized);
135
135
  }
@@ -381,6 +381,7 @@ function createStorageEngine(opts) {
381
381
  getWatermarks: (filter) => manifestStore.getWatermarks(filter),
382
382
  getSyncStates: (filter) => manifestStore.getSyncStates(filter),
383
383
  setSyncState: (scope, state, detail) => manifestStore.setSyncState(scope, state, detail),
384
+ setSyncStates: (scopes, state, detail) => manifestStore.setSyncStates(scopes, state, detail),
384
385
  readObject: (key) => dataSource.read(key)
385
386
  };
386
387
  }
@@ -155,6 +155,12 @@ export interface InspectionStore {
155
155
  * `undefined` if the month has no shards.
156
156
  */
157
157
  loadHistory: (ctx: TenantCtx, yearMonth: string) => Promise<InspectionHistoryShard | undefined>;
158
+ /**
159
+ * Month buckets (`YYYY-MM`, or `unknown`) that hold at least one history
160
+ * shard, sorted ascending. Pair with {@link InspectionStore.loadHistory} to
161
+ * read the full history.
162
+ */
163
+ listHistoryMonths: (ctx: TenantCtx) => Promise<string[]>;
158
164
  /**
159
165
  * Encode caller-provided rows into the inspections parquet sidecar at
160
166
  * `entities/inspections/index.parquet`. Sorted by `urlHash` so DuckDB
@@ -171,6 +177,11 @@ export interface InspectionStore {
171
177
  rowCount: number;
172
178
  bytes: number;
173
179
  }>;
180
+ /**
181
+ * Rows of the inspections parquet sidecar that {@link InspectionStore.materialize}
182
+ * wrote last, or `undefined` if it was never written.
183
+ */
184
+ loadMaterialized: (ctx: TenantCtx) => Promise<InspectionParquetRow[] | undefined>;
174
185
  /**
175
186
  * Append a batch of inspection results as an immutable per-batch parquet
176
187
  * under `events/<YYYY-MM>/<batchId>.parquet`, partitioned by the `YYYY-MM`