vgi-python 0.44.0__tar.gz → 0.46.0__tar.gz

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 (733) hide show
  1. {vgi_python-0.44.0 → vgi_python-0.46.0}/.github/workflows/ci.yml +1 -1
  2. {vgi_python-0.44.0 → vgi_python-0.46.0}/.github/workflows/integration.yml +13 -23
  3. {vgi_python-0.44.0 → vgi_python-0.46.0}/.github/workflows/tailnet-integration.yml +2 -2
  4. {vgi_python-0.44.0 → vgi_python-0.46.0}/CLAUDE.md +5 -3
  5. {vgi_python-0.44.0 → vgi_python-0.46.0}/PKG-INFO +4 -2
  6. {vgi_python-0.44.0 → vgi_python-0.46.0}/ci/README.md +43 -38
  7. {vgi_python-0.44.0 → vgi_python-0.46.0}/ci/run-integration.sh +27 -4
  8. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/api/auth.md +1 -1
  9. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/api/worker.md +1 -1
  10. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/authentication.md +1 -1
  11. vgi_python-0.46.0/docs/catalog_publication.md +171 -0
  12. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/protocol/vgi-attach-tickets.md +9 -5
  13. {vgi_python-0.44.0 → vgi_python-0.46.0}/packages/vgi-fixtures/pyproject.toml +1 -1
  14. {vgi_python-0.44.0 → vgi_python-0.46.0}/pyproject.toml +5 -2
  15. vgi_python-0.46.0/scripts/catalog_publication_fixture.py +7 -0
  16. {vgi_python-0.44.0 → vgi_python-0.46.0}/scripts/hosted_protocols_conformance.sh +1 -1
  17. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_catalog_contents.py +46 -31
  18. vgi_python-0.46.0/tests/catalog/test_catalog_publication.py +643 -0
  19. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_declarative.py +1 -1
  20. vgi_python-0.46.0/tests/catalog/test_function_info_binary_dictionary.py +117 -0
  21. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_serialization.py +5 -5
  22. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_protocol_version.py +3 -3
  23. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_attach_ticket.py +33 -7
  24. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_cpp_records.py +4 -1
  25. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_rust_types.py +1 -1
  26. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_ts_types.py +5 -4
  27. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_grant_auth.py +2 -2
  28. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_hosted_protocols.py +2 -2
  29. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_serve.py +11 -8
  30. {vgi_python-0.44.0 → vgi_python-0.46.0}/uv.lock +323 -206
  31. vgi_python-0.46.0/vgi/_test_fixtures/catalog_publication.py +107 -0
  32. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/http_server.py +1 -1
  33. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/identity_fixture.py +1 -1
  34. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -1
  35. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -1
  36. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -1
  37. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/writable/worker.py +0 -1
  38. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/attach_ticket.py +16 -7
  39. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/auth.py +1 -1
  40. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/catalog/catalog_interface.py +13 -6
  41. vgi_python-0.46.0/vgi/catalog/contents_codec.py +223 -0
  42. vgi_python-0.46.0/vgi/catalog/contract.py +22 -0
  43. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/catalog/descriptors.py +3 -1
  44. vgi_python-0.46.0/vgi/catalog/snapshot.py +680 -0
  45. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/client/catalog_mixin.py +7 -24
  46. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/client/client.py +14 -16
  47. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/cpp_protocol_version.py +5 -0
  48. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/cpp_records.py +5 -28
  49. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/csharp_types.py +7 -0
  50. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/go_schemas.py +5 -0
  51. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/java_registry.py +3 -0
  52. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/java_types.py +19 -0
  53. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/rust_schemas.py +5 -0
  54. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/ts_client.py +11 -8
  55. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/ts_registry.py +2 -1
  56. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/ts_schemas.py +5 -0
  57. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/ts_types.py +2 -0
  58. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/meta_worker.py +1 -1
  59. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/protocol.py +21 -27
  60. vgi_python-0.46.0/vgi/protocol_version.txt +1 -0
  61. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/rpc_server.py +6 -6
  62. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/serve.py +1 -1
  63. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/worker.py +122 -76
  64. vgi_python-0.44.0/vgi/protocol_version.txt +0 -1
  65. {vgi_python-0.44.0 → vgi_python-0.46.0}/.dockerignore +0 -0
  66. {vgi_python-0.44.0 → vgi_python-0.46.0}/.gitattributes +0 -0
  67. {vgi_python-0.44.0 → vgi_python-0.46.0}/.github/dependabot.yml +0 -0
  68. {vgi_python-0.44.0 → vgi_python-0.46.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  69. {vgi_python-0.44.0 → vgi_python-0.46.0}/.github/workflows/docs.yml +0 -0
  70. {vgi_python-0.44.0 → vgi_python-0.46.0}/.github/workflows/release.yml +0 -0
  71. {vgi_python-0.44.0 → vgi_python-0.46.0}/.gitignore +0 -0
  72. {vgi_python-0.44.0 → vgi_python-0.46.0}/.python-version +0 -0
  73. {vgi_python-0.44.0 → vgi_python-0.46.0}/.vale.ini +0 -0
  74. {vgi_python-0.44.0 → vgi_python-0.46.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  75. {vgi_python-0.44.0 → vgi_python-0.46.0}/DOCS_REVIEW_RUBRIC.md +0 -0
  76. {vgi_python-0.44.0 → vgi_python-0.46.0}/DOCS_USABILITY_TEST.md +0 -0
  77. {vgi_python-0.44.0 → vgi_python-0.46.0}/LICENSE +0 -0
  78. {vgi_python-0.44.0 → vgi_python-0.46.0}/PROTOCOL.md +0 -0
  79. {vgi_python-0.44.0 → vgi_python-0.46.0}/README.md +0 -0
  80. {vgi_python-0.44.0 → vgi_python-0.46.0}/RELEASE-RUNBOOK.md +0 -0
  81. {vgi_python-0.44.0 → vgi_python-0.46.0}/SECURITY.md +0 -0
  82. {vgi_python-0.44.0 → vgi_python-0.46.0}/ci/preprocess-require.awk +0 -0
  83. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/README.md +0 -0
  84. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/cases/negative/and-too-few-children.json +0 -0
  85. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/cases/negative/delta-required-upsert.json +0 -0
  86. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/cases/negative/nested-runtime-filter.json +0 -0
  87. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/cases/negative/remove-with-expression.json +0 -0
  88. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/cases/negative/required-runtime-filter.json +0 -0
  89. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/cases/negative/snapshot-nonzero-revision.json +0 -0
  90. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/cases/negative/unknown-document-property.json +0 -0
  91. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/cases/negative/unknown-node.json +0 -0
  92. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/cases/positive/advisory-upsert-delta.json +0 -0
  93. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/cases/positive/boolean-column-predicate.json +0 -0
  94. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/cases/positive/empty-snapshot.json +0 -0
  95. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/cases/positive/nested-required-snapshot.json +0 -0
  96. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/cases/positive/remove-delta.json +0 -0
  97. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/cases/positive/runtime-filter-snapshot.json +0 -0
  98. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/filter-v2.schema.json +0 -0
  99. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/generate_runtime.py +0 -0
  100. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/manifest.json +0 -0
  101. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/run_worker.py +0 -0
  102. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow +0 -0
  103. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow +0 -0
  104. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/arithmetic-add/input.arrow +0 -0
  105. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/arithmetic-multiply/expected.arrow +0 -0
  106. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/arithmetic-multiply/filter.arrow +0 -0
  107. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/arithmetic-multiply/input.arrow +0 -0
  108. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/arithmetic-negate/expected.arrow +0 -0
  109. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow +0 -0
  110. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow +0 -0
  111. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/arithmetic-subtract/expected.arrow +0 -0
  112. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/arithmetic-subtract/filter.arrow +0 -0
  113. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/arithmetic-subtract/input.arrow +0 -0
  114. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/cast-integer-to-double/expected.arrow +0 -0
  115. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/cast-integer-to-double/filter.arrow +0 -0
  116. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/cast-integer-to-double/input.arrow +0 -0
  117. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-distinct_from/expected.arrow +0 -0
  118. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-distinct_from/filter.arrow +0 -0
  119. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-distinct_from/input.arrow +0 -0
  120. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-distinct_from/worker-expected.arrow +0 -0
  121. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-eq/expected.arrow +0 -0
  122. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-eq/filter.arrow +0 -0
  123. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-eq/input.arrow +0 -0
  124. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-eq/worker-expected.arrow +0 -0
  125. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-ge/expected.arrow +0 -0
  126. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-ge/filter.arrow +0 -0
  127. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-ge/input.arrow +0 -0
  128. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-ge/worker-expected.arrow +0 -0
  129. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-gt/expected.arrow +0 -0
  130. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-gt/filter.arrow +0 -0
  131. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-gt/input.arrow +0 -0
  132. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-gt/worker-expected.arrow +0 -0
  133. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-le/expected.arrow +0 -0
  134. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-le/filter.arrow +0 -0
  135. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-le/input.arrow +0 -0
  136. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-le/worker-expected.arrow +0 -0
  137. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-lt/expected.arrow +0 -0
  138. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-lt/filter.arrow +0 -0
  139. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-lt/input.arrow +0 -0
  140. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-lt/worker-expected.arrow +0 -0
  141. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-ne/expected.arrow +0 -0
  142. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-ne/filter.arrow +0 -0
  143. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-ne/input.arrow +0 -0
  144. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-ne/worker-expected.arrow +0 -0
  145. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/expected.arrow +0 -0
  146. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/filter.arrow +0 -0
  147. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/input.arrow +0 -0
  148. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/worker-expected.arrow +0 -0
  149. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/delta-0.arrow +0 -0
  150. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/expected.arrow +0 -0
  151. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/filter.arrow +0 -0
  152. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/input.arrow +0 -0
  153. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/delta-empty-noop/delta-0.arrow +0 -0
  154. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/delta-empty-noop/expected.arrow +0 -0
  155. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/delta-empty-noop/filter.arrow +0 -0
  156. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/delta-empty-noop/input.arrow +0 -0
  157. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-0.arrow +0 -0
  158. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-1.arrow +0 -0
  159. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-2.arrow +0 -0
  160. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/expected.arrow +0 -0
  161. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/filter.arrow +0 -0
  162. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/input.arrow +0 -0
  163. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/empty-snapshot/expected.arrow +0 -0
  164. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/empty-snapshot/filter.arrow +0 -0
  165. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/empty-snapshot/input.arrow +0 -0
  166. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/empty-snapshot/worker-expected.arrow +0 -0
  167. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-cast-type-not-null/filter.arrow +0 -0
  168. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-cast-type-not-null/input.arrow +0 -0
  169. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-column-index/filter.arrow +0 -0
  170. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-column-index/input.arrow +0 -0
  171. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-column-name/filter.arrow +0 -0
  172. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-column-name/input.arrow +0 -0
  173. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/filter.arrow +0 -0
  174. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/input.arrow +0 -0
  175. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/filter.arrow +0 -0
  176. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/input.arrow +0 -0
  177. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-external-column-index/filter.arrow +0 -0
  178. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-external-column-index/input.arrow +0 -0
  179. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-external-column-index/join-keys-0.arrow +0 -0
  180. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-external-column-name/filter.arrow +0 -0
  181. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-external-column-name/input.arrow +0 -0
  182. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-external-column-name/join-keys-0.arrow +0 -0
  183. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-field-non-struct/filter.arrow +0 -0
  184. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-field-non-struct/input.arrow +0 -0
  185. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-in-payload-not-list/filter.arrow +0 -0
  186. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-in-payload-not-list/input.arrow +0 -0
  187. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-in-payload-null-list/filter.arrow +0 -0
  188. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-in-payload-null-list/input.arrow +0 -0
  189. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-invalid-overload/filter.arrow +0 -0
  190. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-invalid-overload/input.arrow +0 -0
  191. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-missing-literal/filter.arrow +0 -0
  192. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-missing-literal/input.arrow +0 -0
  193. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-non-boolean-root/filter.arrow +0 -0
  194. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-non-boolean-root/input.arrow +0 -0
  195. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-unknown-standard-function/filter.arrow +0 -0
  196. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/error-unknown-standard-function/input.arrow +0 -0
  197. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/external-in-nonzero-column/expected.arrow +0 -0
  198. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/external-in-nonzero-column/filter.arrow +0 -0
  199. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/external-in-nonzero-column/input.arrow +0 -0
  200. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/external-in-nonzero-column/join-keys-0.arrow +0 -0
  201. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/external-in-nonzero-column/worker-expected.arrow +0 -0
  202. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/function-contains/expected.arrow +0 -0
  203. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/function-contains/filter.arrow +0 -0
  204. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/function-contains/input.arrow +0 -0
  205. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/function-ends-with/expected.arrow +0 -0
  206. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/function-ends-with/filter.arrow +0 -0
  207. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/function-ends-with/input.arrow +0 -0
  208. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/function-list-contains/expected.arrow +0 -0
  209. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/function-list-contains/filter.arrow +0 -0
  210. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/function-list-contains/input.arrow +0 -0
  211. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/function-starts-with/expected.arrow +0 -0
  212. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/function-starts-with/filter.arrow +0 -0
  213. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/function-starts-with/input.arrow +0 -0
  214. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/in-empty/expected.arrow +0 -0
  215. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/in-empty/filter.arrow +0 -0
  216. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/in-empty/input.arrow +0 -0
  217. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/in-empty/worker-expected.arrow +0 -0
  218. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/in-with-null/expected.arrow +0 -0
  219. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/in-with-null/filter.arrow +0 -0
  220. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/in-with-null/input.arrow +0 -0
  221. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/in-with-null/worker-expected.arrow +0 -0
  222. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/is-not-null/expected.arrow +0 -0
  223. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/is-not-null/filter.arrow +0 -0
  224. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/is-not-null/input.arrow +0 -0
  225. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/is-not-null/worker-expected.arrow +0 -0
  226. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/is-null/expected.arrow +0 -0
  227. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/is-null/filter.arrow +0 -0
  228. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/is-null/input.arrow +0 -0
  229. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/is-null/worker-expected.arrow +0 -0
  230. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/kleene-and/expected.arrow +0 -0
  231. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/kleene-and/filter.arrow +0 -0
  232. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/kleene-and/input.arrow +0 -0
  233. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/kleene-not/expected.arrow +0 -0
  234. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/kleene-not/filter.arrow +0 -0
  235. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/kleene-not/input.arrow +0 -0
  236. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/kleene-or/expected.arrow +0 -0
  237. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/kleene-or/filter.arrow +0 -0
  238. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/kleene-or/input.arrow +0 -0
  239. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/nan-comparison/expected.arrow +0 -0
  240. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/nan-comparison/filter.arrow +0 -0
  241. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/nan-comparison/input.arrow +0 -0
  242. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/negative-zero-membership/expected.arrow +0 -0
  243. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/negative-zero-membership/filter.arrow +0 -0
  244. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/negative-zero-membership/input.arrow +0 -0
  245. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/nested-null-propagation/expected.arrow +0 -0
  246. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/nested-null-propagation/filter.arrow +0 -0
  247. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/nested-null-propagation/input.arrow +0 -0
  248. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/not-in-empty/expected.arrow +0 -0
  249. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/not-in-empty/filter.arrow +0 -0
  250. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/not-in-empty/input.arrow +0 -0
  251. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/not-in-empty/worker-expected.arrow +0 -0
  252. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/not-in-with-null/expected.arrow +0 -0
  253. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/not-in-with-null/filter.arrow +0 -0
  254. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/not-in-with-null/input.arrow +0 -0
  255. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/not-in-with-null/worker-expected.arrow +0 -0
  256. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/session-integer-division/expected.arrow +0 -0
  257. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/session-integer-division/filter.arrow +0 -0
  258. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime/session-integer-division/input.arrow +0 -0
  259. {vgi_python-0.44.0 → vgi_python-0.46.0}/conformance/filter-v2/runtime-manifest.json +0 -0
  260. {vgi_python-0.44.0 → vgi_python-0.46.0}/dist-vgi/.gitignore +0 -0
  261. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/aggregate-functions.md +0 -0
  262. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/api/arguments.md +0 -0
  263. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/api/catalogs.md +0 -0
  264. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/api/client.md +0 -0
  265. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/api/exceptions.md +0 -0
  266. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/api/filters.md +0 -0
  267. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/api/functions.md +0 -0
  268. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/api/http.md +0 -0
  269. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/api/index.md +0 -0
  270. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/api/metadata.md +0 -0
  271. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/api/observability.md +0 -0
  272. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/api/storage.md +0 -0
  273. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/api/transactor.md +0 -0
  274. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/argument-serialization.md +0 -0
  275. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/assets/apple-touch-icon.png +0 -0
  276. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/assets/favicon-16x16.png +0 -0
  277. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/assets/favicon-32x32.png +0 -0
  278. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/assets/favicon.ico +0 -0
  279. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/assets/kinds/aggregate.svg +0 -0
  280. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/assets/kinds/buffering.svg +0 -0
  281. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/assets/kinds/scalar.svg +0 -0
  282. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/assets/kinds/table-in-out.svg +0 -0
  283. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/assets/kinds/table.svg +0 -0
  284. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/assets/logo.png +0 -0
  285. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/assets/social-card.png +0 -0
  286. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/assets/video-thumbnail.jpg +0 -0
  287. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/catalog-interface.md +0 -0
  288. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/cli.md +0 -0
  289. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/column-statistics.md +0 -0
  290. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/concepts/index.md +0 -0
  291. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/contributing-docs.md +0 -0
  292. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/design/reporting-protocols/IMPLEMENTATION.md +0 -0
  293. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/design/reporting-protocols/README.md +0 -0
  294. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/design/reporting-protocols/alerts.md +0 -0
  295. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/design/reporting-protocols/attach-tickets-plan.md +0 -0
  296. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/design/reporting-protocols/credentials.md +0 -0
  297. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/design/reporting-protocols/notify.md +0 -0
  298. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/design/reporting-protocols/prerequisites.md +0 -0
  299. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/design/reporting-protocols/render.md +0 -0
  300. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/design/reporting-protocols/reporting-protocols.html +0 -0
  301. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/design/reporting-protocols/reports.md +0 -0
  302. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/design/reporting-protocols/schedules.md +0 -0
  303. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/design/reporting-protocols/sql_tasks.md +0 -0
  304. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/filter-pushdown.md +0 -0
  305. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/generator-api.md +0 -0
  306. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/global-functions.md +0 -0
  307. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/how-to/catalogs.md +0 -0
  308. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/how-to/function-patterns.md +0 -0
  309. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/how-to/http-auth.md +0 -0
  310. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/how-to/index.md +0 -0
  311. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/how-to/iroh.md +0 -0
  312. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/how-to/pushdown-and-statistics.md +0 -0
  313. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/how-to/state-storage.md +0 -0
  314. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/how-to/tailnet.md +0 -0
  315. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/index.md +0 -0
  316. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/lifecycle.md +0 -0
  317. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/metadata.md +0 -0
  318. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/overrides/main.html +0 -0
  319. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/protocol/index.md +0 -0
  320. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/protocol/vgi-catalog-query-pushdown-design.md +0 -0
  321. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/protocol/vgi-duckdb-filter-adapter.md +0 -0
  322. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/protocol/vgi-filter-encoding-v2-spec.md +0 -0
  323. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/protocol/vgi-opaque-data-sealing.md +0 -0
  324. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/protocol/vgi-protocol-proposed-changes.md +0 -0
  325. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/protocol/vgi-runtime-filter-artifacts.md +0 -0
  326. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/protocol/vgi-secrets.md +0 -0
  327. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/robots.txt +0 -0
  328. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/shared-storage.md +0 -0
  329. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/stylesheets/extra.css +0 -0
  330. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/tutorial/index.md +0 -0
  331. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/tutorial/scalar.md +0 -0
  332. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/tutorial/table.md +0 -0
  333. {vgi_python-0.44.0 → vgi_python-0.46.0}/docs/vgi-logo.png +0 -0
  334. {vgi_python-0.44.0 → vgi_python-0.46.0}/examples/batch_index_worker.py +0 -0
  335. {vgi_python-0.44.0 → vgi_python-0.46.0}/examples/cache_worker.py +0 -0
  336. {vgi_python-0.44.0 → vgi_python-0.46.0}/examples/calc_scalar_worker.py +0 -0
  337. {vgi_python-0.44.0 → vgi_python-0.46.0}/examples/calc_worker.py +0 -0
  338. {vgi_python-0.44.0 → vgi_python-0.46.0}/examples/copy_format_worker.py +0 -0
  339. {vgi_python-0.44.0 → vgi_python-0.46.0}/examples/filter_worker.py +0 -0
  340. {vgi_python-0.44.0 → vgi_python-0.46.0}/examples/greeting_scalar_worker.py +0 -0
  341. {vgi_python-0.44.0 → vgi_python-0.46.0}/examples/row_count_worker.py +0 -0
  342. {vgi_python-0.44.0 → vgi_python-0.46.0}/examples/series_streaming_worker.py +0 -0
  343. {vgi_python-0.44.0 → vgi_python-0.46.0}/examples/sum_worker.py +0 -0
  344. {vgi_python-0.44.0 → vgi_python-0.46.0}/identity.png +0 -0
  345. {vgi_python-0.44.0 → vgi_python-0.46.0}/mkdocs.yml +0 -0
  346. {vgi_python-0.44.0 → vgi_python-0.46.0}/packages/vgi-fixtures/LICENSE +0 -0
  347. {vgi_python-0.44.0 → vgi_python-0.46.0}/packages/vgi-fixtures/README.md +0 -0
  348. {vgi_python-0.44.0 → vgi_python-0.46.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  349. {vgi_python-0.44.0 → vgi_python-0.46.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  350. {vgi_python-0.44.0 → vgi_python-0.46.0}/scripts/build_reporting_protocols_html.py +0 -0
  351. {vgi_python-0.44.0 → vgi_python-0.46.0}/scripts/gen_attach_ticket_vectors.py +0 -0
  352. {vgi_python-0.44.0 → vgi_python-0.46.0}/scripts/measure_startup.py +0 -0
  353. {vgi_python-0.44.0 → vgi_python-0.46.0}/scripts/regen_generated.py +0 -0
  354. {vgi_python-0.44.0 → vgi_python-0.46.0}/scripts/run_all_tests.sh +0 -0
  355. {vgi_python-0.44.0 → vgi_python-0.46.0}/test-data/generate.sh +0 -0
  356. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/__init__.py +0 -0
  357. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/_hosted_protocols_worker.py +0 -0
  358. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/_http_fixtures.py +0 -0
  359. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/__init__.py +0 -0
  360. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_attach_option.py +0 -0
  361. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_catalog_interface.py +0 -0
  362. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_client_catalog.py +0 -0
  363. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_client_load_catalog.py +0 -0
  364. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_column_statistics.py +0 -0
  365. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_example_worker_catalog.py +0 -0
  366. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_integration.py +0 -0
  367. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_required_filters.py +0 -0
  368. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_scan_branches.py +0 -0
  369. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_setting.py +0 -0
  370. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_storage.py +0 -0
  371. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_time_travel.py +0 -0
  372. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/catalog/test_writable_table.py +0 -0
  373. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/__init__.py +0 -0
  374. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_aggregate_client.py +0 -0
  375. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_batch_metadata_callback.py +0 -0
  376. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_bind_and_join_keys.py +0 -0
  377. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_broken_pipe.py +0 -0
  378. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_cli.py +0 -0
  379. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_cli_catalog_functions.py +0 -0
  380. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_copy_client.py +0 -0
  381. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_http_response_budget.py +0 -0
  382. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_iroh_client.py +0 -0
  383. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_scan_branches_client.py +0 -0
  384. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_split_client.py +0 -0
  385. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_stop_force.py +0 -0
  386. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_table_column_statistics.py +0 -0
  387. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_time_travel_client.py +0 -0
  388. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/client/test_worker_debug.py +0 -0
  389. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/__init__.py +0 -0
  390. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/_stub.py +0 -0
  391. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/conftest.py +0 -0
  392. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_accumulate.py +0 -0
  393. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_aggregate.py +0 -0
  394. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_attach.py +0 -0
  395. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_bearer_auth.py +0 -0
  396. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_const_param_enforcement.py +0 -0
  397. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_container.py +0 -0
  398. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_copy_from.py +0 -0
  399. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_copy_to.py +0 -0
  400. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_directory_parity.py +0 -0
  401. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_function_inventory.py +0 -0
  402. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_github.py +0 -0
  403. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_http_client.py +0 -0
  404. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_http_external_location.py +0 -0
  405. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_http_upload_url.py +0 -0
  406. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_macro.py +0 -0
  407. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_overload.py +0 -0
  408. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_protocol_inventory.py +0 -0
  409. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_resumable_scan.py +0 -0
  410. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_scalar.py +0 -0
  411. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  412. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_secret.py +0 -0
  413. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_settings.py +0 -0
  414. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_splits.py +0 -0
  415. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_table.py +0 -0
  416. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_table_in_out.py +0 -0
  417. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_view.py +0 -0
  418. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conformance/test_writable.py +0 -0
  419. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/conftest.py +0 -0
  420. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
  421. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
  422. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
  423. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/data/split_tokens/bad_version.bin +0 -0
  424. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/data/split_tokens/generate.py +0 -0
  425. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/data/split_tokens/manifest.json +0 -0
  426. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
  427. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/data/split_tokens/stale_anchor.bin +0 -0
  428. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/data/split_tokens/truncated.bin +0 -0
  429. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/data/split_tokens/valid_sealed.bin +0 -0
  430. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/data/split_tokens/valid_unsealed.bin +0 -0
  431. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/scalar/__init__.py +0 -0
  432. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/scalar/test_bernoulli_function.py +0 -0
  433. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/scalar/test_binary_packet_function.py +0 -0
  434. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/scalar/test_client.py +0 -0
  435. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/scalar/test_conditional_message_function.py +0 -0
  436. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/scalar/test_hash_seed_function.py +0 -0
  437. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  438. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/scalar/test_multiply_function.py +0 -0
  439. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/scalar/test_random_bytes_function.py +0 -0
  440. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/scalar/test_return_secret_value_function.py +0 -0
  441. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/sdk_conformance/__init__.py +0 -0
  442. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/sdk_conformance/test_opaque_sealing.py +0 -0
  443. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/sdk_conformance/test_opaque_sealing_stdio.py +0 -0
  444. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/__init__.py +0 -0
  445. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/generator/__init__.py +0 -0
  446. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/generator/test_constant_columns_function.py +0 -0
  447. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/generator/test_double_sequence_function.py +0 -0
  448. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/generator/test_exception_function.py +0 -0
  449. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/generator/test_filter_echo_function.py +0 -0
  450. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/generator/test_logging_function.py +0 -0
  451. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
  452. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/generator/test_partitioned_function.py +0 -0
  453. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/generator/test_projected_data_function.py +0 -0
  454. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/generator/test_sequence_function.py +0 -0
  455. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/generator/test_settings_function.py +0 -0
  456. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/generator/test_struct_settings_function.py +0 -0
  457. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
  458. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table/test_wide_columns.py +0 -0
  459. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table_in_out/__init__.py +0 -0
  460. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table_in_out/generator/__init__.py +0 -0
  461. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  462. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
  463. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  464. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  465. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  466. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
  467. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  468. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table_in_out/test_blended_exchange.py +0 -0
  469. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table_in_out/test_blended_metadata.py +0 -0
  470. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table_in_out/test_client.py +0 -0
  471. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/table_in_out/test_table_buffering_empty_input.py +0 -0
  472. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/tailnet/Dockerfile +0 -0
  473. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/tailnet/__init__.py +0 -0
  474. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/tailnet/compose.yaml +0 -0
  475. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/tailnet/probe.py +0 -0
  476. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/tailnet/run.sh +0 -0
  477. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/tailnet/test_worker.py +0 -0
  478. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/tailnet/worker.py +0 -0
  479. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_access_log_audit.py +0 -0
  480. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_aggregate_function.py +0 -0
  481. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_argument_spec.py +0 -0
  482. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_auth.py +0 -0
  483. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_bind_exceptions.py +0 -0
  484. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_bind_request_at_clause.py +0 -0
  485. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_bound_storage_conformance.py +0 -0
  486. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_cache_control.py +0 -0
  487. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_call_state_attach.py +0 -0
  488. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_catalog_auth_binding.py +0 -0
  489. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_client_oauth.py +0 -0
  490. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_client_reflection.py +0 -0
  491. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_codegen_request_inventory.py +0 -0
  492. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_copy_from_function.py +0 -0
  493. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_copy_to_function.py +0 -0
  494. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_docstrings.py +0 -0
  495. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_documentation_examples.py +0 -0
  496. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_dynamic_filter_http_turns.py +0 -0
  497. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_error_codes.py +0 -0
  498. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_example_function_arg_types.py +0 -0
  499. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_examples_workers.py +0 -0
  500. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_exception_handling.py +0 -0
  501. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_exceptions.py +0 -0
  502. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_filter_pushdown.py +0 -0
  503. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_filter_pushdown_extension.py +0 -0
  504. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_filter_v2.py +0 -0
  505. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_filter_v2_builder.py +0 -0
  506. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_filter_v2_runtime_corpus.py +0 -0
  507. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_filter_v2_spec_schema.py +0 -0
  508. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_fixture_catalog_parity.py +0 -0
  509. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_function_shape_mismatch.py +0 -0
  510. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_function_storage.py +0 -0
  511. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_function_storage_azure_sql.py +0 -0
  512. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_function_storage_cf_do.py +0 -0
  513. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_function_storage_cf_do_integration.py +0 -0
  514. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_function_storage_conformance.py +0 -0
  515. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_function_subclass_check.py +0 -0
  516. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_cpp_constants.py +0 -0
  517. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_cpp_protocol_name.py +0 -0
  518. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_cpp_protocol_version.py +0 -0
  519. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_cpp_request_builders.py +0 -0
  520. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_cpp_schemas.py +0 -0
  521. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_cpp_secret.py +0 -0
  522. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_csharp.py +0 -0
  523. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_go_schemas.py +0 -0
  524. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_go_types.py +0 -0
  525. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_java_schemas.py +0 -0
  526. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_java_types.py +0 -0
  527. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_protocol_version.py +0 -0
  528. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_registry.py +0 -0
  529. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_rust_request_builders.py +0 -0
  530. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_rust_schemas.py +0 -0
  531. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_schemas_cross_lang.py +0 -0
  532. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_ts_client.py +0 -0
  533. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_generated_ts_schemas.py +0 -0
  534. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_http_demo_storage.py +0 -0
  535. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_http_s3_offload_input.py +0 -0
  536. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_http_s3_offload_output.py +0 -0
  537. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_import_side_effects.py +0 -0
  538. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_landing_discovery.py +0 -0
  539. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_launch_transport.py +0 -0
  540. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_metadata.py +0 -0
  541. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_mypy_consolidated.py +0 -0
  542. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_nest_tensor.py +0 -0
  543. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_otel.py +0 -0
  544. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_projection_enforcement.py +0 -0
  545. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_projection_repro.py +0 -0
  546. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_protocol_classes.py +0 -0
  547. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_resolved_secrets.py +0 -0
  548. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_schema_paths_v2.py +0 -0
  549. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_schema_scoped_functions.py +0 -0
  550. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_schema_utils.py +0 -0
  551. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_setting_secret_annotations.py +0 -0
  552. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_signing_key.py +0 -0
  553. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_split_token.py +0 -0
  554. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_subprocess_transport.py +0 -0
  555. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_table_buffering_function.py +0 -0
  556. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_table_function_dynamic_to_string.py +0 -0
  557. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_table_function_early_close.py +0 -0
  558. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_tcp_transport.py +0 -0
  559. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_type_bounds.py +0 -0
  560. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_union_argument.py +0 -0
  561. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_wire_record_schema_parity.py +0 -0
  562. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_worker.py +0 -0
  563. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_worker_cli.py +0 -0
  564. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_worker_page.py +0 -0
  565. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/test_write_results.py +0 -0
  566. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/transactor/__init__.py +0 -0
  567. {vgi_python-0.44.0 → vgi_python-0.46.0}/tests/transactor/test_transactor.py +0 -0
  568. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/__init__.py +0 -0
  569. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_duckdb.py +0 -0
  570. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_redact.py +0 -0
  571. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_storage_profile.py +0 -0
  572. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/__init__.py +0 -0
  573. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  574. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  575. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  576. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  577. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  578. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  579. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  580. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  581. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  582. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
  583. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  584. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  585. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  586. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
  587. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/attach_options.py +0 -0
  588. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/attach_ticket_vectors.json +0 -0
  589. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/bad_enum.py +0 -0
  590. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
  591. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/cancellable.py +0 -0
  592. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/catalog.py +0 -0
  593. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/catalog_contents.py +0 -0
  594. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/companion.py +0 -0
  595. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/copy_from.py +0 -0
  596. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/copy_to.py +0 -0
  597. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/global_functions.py +0 -0
  598. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  599. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
  600. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  601. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  602. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
  603. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
  604. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
  605. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
  606. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
  607. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  608. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
  609. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  610. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  611. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/scalar/same_name.py +0 -0
  612. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  613. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  614. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  615. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/secret_cache.py +0 -0
  616. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/simple_writable.py +0 -0
  617. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/__init__.py +0 -0
  618. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/_common.py +0 -0
  619. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
  620. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  621. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/cache.py +0 -0
  622. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  623. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/filters.py +0 -0
  624. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  625. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/make_series.py +0 -0
  626. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/misc.py +0 -0
  627. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
  628. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/pairs.py +0 -0
  629. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  630. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  631. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  632. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
  633. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
  634. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
  635. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/sequence.py +0 -0
  636. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/settings.py +0 -0
  637. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/splits.py +0 -0
  638. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  639. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  640. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  641. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/versioned.py +0 -0
  642. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table/wide.py +0 -0
  643. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table_in_out.py +0 -0
  644. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
  645. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/ticket_probe.py +0 -0
  646. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/twin_catalogs.py +0 -0
  647. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/versioned.py +0 -0
  648. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
  649. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/worker.py +0 -0
  650. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
  651. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/writable/generic.py +0 -0
  652. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/_test_fixtures/writable/table.py +0 -0
  653. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/aggregate_function.py +0 -0
  654. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/argument_spec.py +0 -0
  655. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/arguments.py +0 -0
  656. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/attach_header.py +0 -0
  657. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/cache_control.py +0 -0
  658. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/catalog/__init__.py +0 -0
  659. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/catalog/_descriptor_spec.py +0 -0
  660. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/catalog/attach_option.py +0 -0
  661. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/catalog/duckdb_statistics.py +0 -0
  662. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/catalog/secret_type.py +0 -0
  663. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/catalog/setting.py +0 -0
  664. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/catalog/storage.py +0 -0
  665. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/client/__init__.py +0 -0
  666. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/client/aggregate.py +0 -0
  667. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/client/cli.py +0 -0
  668. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/client/cli_catalog.py +0 -0
  669. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/client/cli_schema.py +0 -0
  670. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/client/cli_table.py +0 -0
  671. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/client/cli_transaction.py +0 -0
  672. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/client/cli_utils.py +0 -0
  673. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/client/cli_view.py +0 -0
  674. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/client/errors.py +0 -0
  675. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/__init__.py +0 -0
  676. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/_common.py +0 -0
  677. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/_registry.py +0 -0
  678. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/_registry_backend.py +0 -0
  679. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/cpp_constants.py +0 -0
  680. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/cpp_protocol_name.py +0 -0
  681. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/cpp_registry.py +0 -0
  682. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/cpp_request_builders.py +0 -0
  683. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/cpp_schemas.py +0 -0
  684. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  685. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  686. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
  687. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/csharp_registry.py +0 -0
  688. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/csharp_schemas.py +0 -0
  689. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/go_registry.py +0 -0
  690. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/go_types.py +0 -0
  691. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/java_schemas.py +0 -0
  692. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/protocol_version.py +0 -0
  693. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/rust_registry.py +0 -0
  694. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/rust_request_builders.py +0 -0
  695. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/codegen/rust_types.py +0 -0
  696. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/copy_from_function.py +0 -0
  697. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/copy_to_function.py +0 -0
  698. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/exceptions.py +0 -0
  699. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/filter_v2.py +0 -0
  700. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/filter_v2_builder.py +0 -0
  701. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/function.py +0 -0
  702. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/function_storage.py +0 -0
  703. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/function_storage_azure_sql.py +0 -0
  704. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/function_storage_cf_do.py +0 -0
  705. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/http/__init__.py +0 -0
  706. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/http/demo_storage.py +0 -0
  707. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/http/landing.html +0 -0
  708. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/http/landing_page.py +0 -0
  709. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/http/vgi-client.js +0 -0
  710. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/http/worker_page.py +0 -0
  711. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/invocation.py +0 -0
  712. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/logging_config.py +0 -0
  713. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/metadata.py +0 -0
  714. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/otel.py +0 -0
  715. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/profiling.py +0 -0
  716. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/py.typed +0 -0
  717. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/scalar_function.py +0 -0
  718. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/schema_path.py +0 -0
  719. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/schema_utils.py +0 -0
  720. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/secret_protocol.py +0 -0
  721. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/secret_service.py +0 -0
  722. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/split_token.py +0 -0
  723. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/table_buffering_function.py +0 -0
  724. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/table_filter_pushdown.py +0 -0
  725. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/table_function.py +0 -0
  726. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/table_in_out_function.py +0 -0
  727. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/transactor/__init__.py +0 -0
  728. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/transactor/_duckdb_compat.py +0 -0
  729. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/transactor/client.py +0 -0
  730. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/transactor/protocol.py +0 -0
  731. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/transactor/server.py +0 -0
  732. {vgi_python-0.44.0 → vgi_python-0.46.0}/vgi/write_results.py +0 -0
  733. {vgi_python-0.44.0 → vgi_python-0.46.0}/wrangler.jsonc +0 -0
@@ -129,7 +129,7 @@ jobs:
129
129
  hosted-protocols:
130
130
  # vgi-rpc's cross-SDK hosted-protocols group: the fixture workers must host
131
131
  # vgi.v2 then conformance.Secondary.v1 on stdio, unix and HTTP, and pass the
132
- # Identity.v1 groups over HTTP (vgi-fixture-http --identity).
132
+ # Identity.v2 groups over HTTP (vgi-fixture-http --identity).
133
133
  name: Hosted-protocols conformance
134
134
  runs-on: ubuntu-latest
135
135
  steps:
@@ -1,13 +1,12 @@
1
1
  # Runs the canonical Query-farm/vgi integration sqllogictest suite against the
2
- # Python example worker on every push / PR. Rather than building the C++ extension
3
- # from source, it drives a prebuilt standalone `haybarn-unittest` and installs the
4
- # SIGNED vgi extension from the Haybarn community channel + its deps from core.
5
- # The .test files come from a pinned Query-farm/vgi checkout; ci/run-integration.sh
6
- # + ci/preprocess-require.awk adapt them for the standalone runner. See ci/README.md.
2
+ # Python example worker on every push / PR. The native runner comes from the
3
+ # Query-farm/vgi Actions build of the same commit as the test suite and statically
4
+ # links the matching extension. Public package releases remain separate.
5
+ # ci/run-integration.sh also supports the published standalone runner locally.
7
6
  #
8
7
  # (The separate ci.yml covers lint / type-check / unit + conformance tests / docs.
9
8
  # Those drive the pure-Python in-process Client; this workflow is the only place
10
- # the worker is exercised through the real published DuckDB extension over the wire.)
9
+ # the worker is exercised through the real DuckDB extension over the wire.)
11
10
  name: Integration suite
12
11
 
13
12
  on:
@@ -19,20 +18,16 @@ on:
19
18
 
20
19
  permissions:
21
20
  contents: read
21
+ actions: read
22
22
 
23
23
  concurrency:
24
24
  group: integration-${{ github.ref }}
25
25
  cancel-in-progress: true
26
26
 
27
27
  env:
28
- # The Query-farm/vgi ref whose test/sql/integration suite we run. For now this
29
- # tracks the latest `main` (resolved at checkout time) so the Python port is
30
- # always validated against the newest C++ test suite. Pin to a specific commit
31
- # SHA here if/when reproducible, deliberate bumps are wanted (see ci/README.md).
32
- VGI_REF: main
33
- # The Haybarn release providing the prebuilt haybarn-unittest binary. Must be
34
- # ABI-compatible with the community-published vgi extension.
35
- HAYBARN_RELEASE: haybarn-v1.5.5-rc1
28
+ # The test suite and native Actions artifact must come from this exact ref.
29
+ # The downloader verifies its provenance against the checked-out commit.
30
+ VGI_REF: 3a2249f815ff6e2a8b5289a3e6284326084e3630
36
31
  # CI is not a user: its ATTACHes should not land in Query.Farm's adoption data.
37
32
  # The vgi extension fires a telemetry event per successful ATTACH, and this
38
33
  # suite performs several hundred of them per lane, so opting out keeps the
@@ -81,18 +76,13 @@ jobs:
81
76
  - name: Install dependencies (vgi + fixtures + all extras)
82
77
  run: uv sync --all-extras --python 3.14
83
78
 
84
- - name: Download haybarn-unittest
79
+ - name: Download the matching native integration runner
85
80
  run: |
86
- gh release download "$HAYBARN_RELEASE" \
87
- --repo Query-farm-haybarn/haybarn \
88
- --pattern 'haybarn_unittest-linux-amd64.zip' \
89
- --output /tmp/haybarn-unittest.zip --clobber
90
- unzip -o -q /tmp/haybarn-unittest.zip -d /tmp/haybarn-unittest
91
- UNITTEST=$(find /tmp/haybarn-unittest -name 'haybarn-unittest' -type f | head -1)
92
- chmod +x "$UNITTEST"
93
- echo "HAYBARN_UNITTEST=$UNITTEST" >> "$GITHUB_ENV"
81
+ python3 "$VGI_SRC/scripts/ci_fetch_native_runner.py" \
82
+ --source "$VGI_SRC" --output "$RUNNER_TEMP/vgi-native"
94
83
  env:
95
84
  GH_TOKEN: ${{ github.token }}
85
+ VGI_SRC: ${{ github.workspace }}/vgi-upstream
96
86
 
97
87
  - name: Run integration suite (${{ matrix.lane }})
98
88
  run: ci/run-integration.sh
@@ -33,12 +33,12 @@ jobs:
33
33
  steps:
34
34
  - uses: actions/checkout@v7
35
35
 
36
- - name: Checkout unreleased vgi-rpc identity layer
36
+ - name: Checkout vgi-rpc (Identity.v2)
37
37
  uses: actions/checkout@v7
38
38
  with:
39
39
  repository: Query-farm/vgi-rpc-python
40
40
  path: .tailnet/vgi-rpc
41
- ref: 04f19147625b4f643b38a687151d8233daa8997c
41
+ ref: e04ddfa56c19b4cd7cc1e3729d165c763b0d98c7 # v0.52.0 (Identity.v2)
42
42
 
43
43
  - name: Check kernel networking support
44
44
  run: |
@@ -302,7 +302,7 @@ vgi-client --input data.parquet --function sum_all_columns --worker vgi-fixture-
302
302
  | `VGI_OAUTH_DEVICE_CODE_CLIENT_SECRET` | Client secret for device-code flow (optional, URL-safe chars only) |
303
303
  | `VGI_OAUTH_USE_ID_TOKEN` | When `1`/`true`/`yes`, clients use OIDC `id_token` as Bearer instead of `access_token` |
304
304
  | `VGI_RPC_GRANT_KEYS` | Comma-separated base64 32-byte sealed-grant keys (first mints, all verify); enables grants as HTTP bearers. Also `VGI_RPC_GRANT_AUDIENCE`, `VGI_RPC_GRANT_MAX_TTL_SECONDS` |
305
- | `VGI_INTROSPECT_PRINCIPALS` | Comma-separated principals permitted to call `vgi_rpc.Identity.v1`'s `introspect_token`. Required — no permissive default — whenever the worker implements `resolve_token()` (see below) |
305
+ | `VGI_INTROSPECT_PRINCIPALS` | Comma-separated principals permitted to call `vgi_rpc.Identity.v2`'s `introspect_token`. Required — no permissive default — whenever the worker implements `resolve_token()` (see below) |
306
306
  | `VGI_WORKER_ACCESS_LOG_SAMPLE` | Fraction of *successful* calls to keep in the access log, `0.0`–`1.0`. Errors are always kept; the decision is per call, so every record of one stream shares a fate |
307
307
  | `VGI_WORKER_ACCESS_LOG_ASYNC` | When `1`/`true`/`yes`, emit access-log records from a listener thread. Bounded queue; full means drop, and a crash loses whatever is queued |
308
308
  | `VGI_WORKER_ACCESS_LOG_QUEUE_SIZE` | Bound on the async access-log queue (default 10000) |
@@ -426,7 +426,7 @@ Also available on `Worker.main --http` and the fixture server. Under
426
426
 
427
427
  ### Token Introspection (`resolve_token`)
428
428
 
429
- A worker may optionally host the `vgi_rpc.Identity.v1` protocol, whose
429
+ A worker may optionally host the `vgi_rpc.Identity.v2` protocol, whose
430
430
  `introspect_token` method resolves an opaque bearer credential to a principal —
431
431
  for a reverse proxy that terminates the only public listener and must know the
432
432
  caller's identity before it can authorize anything.
@@ -509,7 +509,9 @@ one. Allowlist rules are unchanged. See `docs/authentication.md` and
509
509
 
510
510
  ### Attach Tickets (`vgi.attach_tickets.v1`)
511
511
 
512
- `seal_attach` seals a user's ATTACH (catalog name, options incl. secrets,
512
+ Protocol version `2.0.0`: `AttachTicket.expires_at` is nullable
513
+ `timestamp[us, tz="UTC"]` (`datetime | None`, null = no expiry); `1.0.0` was a
514
+ float64 with `+inf`. `seal_attach` seals a user's ATTACH (catalog name, options incl. secrets,
513
515
  version specs) into a `vgia1.` ticket under `VGI_SIGNING_KEY`, AAD
514
516
  `"vgi.attach_ticket.v1\0" + principal` (principal only, not domain). A runner
515
517
  holding the user's grant reattaches with the single option `vgi_attach_ticket`;
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vgi-python
3
- Version: 0.44.0
3
+ Version: 0.46.0
4
4
  Summary: Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow
5
5
  Project-URL: Homepage, https://query.farm
6
6
  Project-URL: Repository, https://github.com/Query-farm/vgi-python
@@ -162,7 +162,7 @@ Requires-Dist: httpx2>=2.12.0
162
162
  Requires-Dist: platformdirs
163
163
  Requires-Dist: pyarrow
164
164
  Requires-Dist: typer>=0.9
165
- Requires-Dist: vgi-rpc>=0.51.1
165
+ Requires-Dist: vgi-rpc>=0.52.0
166
166
  Provides-Extra: azure
167
167
  Requires-Dist: azure-identity>=1.16.0; extra == 'azure'
168
168
  Requires-Dist: pymssql>=2.3.0; extra == 'azure'
@@ -189,6 +189,8 @@ Requires-Dist: vgi-rpc[otel]; extra == 'dev'
189
189
  Requires-Dist: vgi-rpc[sentry]; extra == 'dev'
190
190
  Provides-Extra: duckdb
191
191
  Requires-Dist: duckdb==1.5.5; extra == 'duckdb'
192
+ Provides-Extra: external
193
+ Requires-Dist: vgi-rpc[external]; extra == 'external'
192
194
  Provides-Extra: fixtures
193
195
  Requires-Dist: vgi-fixtures; extra == 'fixtures'
194
196
  Provides-Extra: granian
@@ -4,19 +4,18 @@
4
4
  runs the canonical [Query-farm/vgi](https://github.com/Query-farm/vgi)
5
5
  integration sqllogictest suite against this repo's Python example worker on
6
6
  every push / PR. The same `.test` files run against the Python, Java, and Go
7
- ports, so a green run here is real wire-compatibility evidence — it exercises
8
- the worker through the *published* DuckDB extension, not a mock, and not the
9
- pure-Python in-process `Client` that the conformance tests in `ci.yml` use.
7
+ ports, so a green run here verifies the worker through the native DuckDB
8
+ extension over the wire. The native runner and test suite come from the same
9
+ VGI commit. Public package releases remain separate from this development check.
10
10
 
11
11
  (The separate [`ci.yml`](../.github/workflows/ci.yml) covers lint / mypy / unit
12
12
  + conformance tests / docs / LocalStack S3 offload.)
13
13
 
14
14
  ## How it works (no C++ build)
15
15
 
16
- Rather than building the vgi DuckDB extension from source (which needs the
17
- Haybarn vcpkg pipeline), CI drives a **prebuilt** standalone `haybarn-unittest`
18
- (the DuckDB/Haybarn sqllogictest runner, published in Haybarn's releases) and
19
- installs the **signed** vgi extension from the Haybarn community channel:
16
+ CI downloads the native integration runner built by Query-farm/vgi Actions.
17
+ It links vgi, httpfs, json and parquet, so the worker's wire contract is checked
18
+ against the matching client without waiting for a community extension release.
20
19
 
21
20
  1. **Install the workers** — `uv sync --all-extras` installs the `vgi-fixtures`
22
21
  workspace member, which puts the fixture console scripts
@@ -27,17 +26,27 @@ installs the **signed** vgi extension from the Haybarn community channel:
27
26
  `--http`, and the launcher's `--unix`, so one install covers every lane.
28
27
  2. **Checkout the test suite** — `Query-farm/vgi` at a pinned commit; its
29
28
  `test/sql/integration/*.test` files are the suite.
30
- 3. **Download the runner** — `haybarn_unittest-linux-amd64.zip` from the pinned
31
- Haybarn release.
32
- 4. **Preprocess** — the standalone runner links none of the extensions the tests
33
- gate on, so [`preprocess-require.awk`](preprocess-require.awk) rewrites each
34
- `require <ext>` into an explicit signed `INSTALL <ext> FROM {community,core};
35
- LOAD <ext>;`. `require-env` and everything else pass through.
36
- 5. **Run** — [`run-integration.sh`](run-integration.sh) stages the preprocessed
37
- tree, wires the `VGI_*_WORKER` env vars at the `.venv/bin` scripts for the
38
- selected transport, `FORCE INSTALL`s the vgi extension (so the run uses what
39
- users can install today), then runs the suite in a single `haybarn-unittest`
40
- invocation. Any failed assertion exits non-zero and fails the job.
29
+ 3. **Download the runner** — the pinned checkout's `ci_fetch_native_runner.py`
30
+ retrieves its Actions artifact and checks its provenance against that exact
31
+ source commit. It exports `HAYBARN_UNITTEST`, `HAYBARN_CLI` and
32
+ `RUNNER_LINKS_EXTENSIONS=1` for the next step.
33
+ 4. **Stage** — [`run-integration.sh`](run-integration.sh) copies the selected
34
+ tests unchanged when extensions are linked into the runner. Their normal
35
+ `require` gates load linked extensions; unavailable optional extensions keep
36
+ their normal skip behavior.
37
+ 5. **Run** — the harness wires the `VGI_*_WORKER` environment variables to the
38
+ `.venv/bin` scripts for the selected transport and executes the suite, with
39
+ `simple_writable` in its own process. Native mode passes `--test-dir` so the
40
+ runner discovers the staged tree instead of its compiled source directory.
41
+ Failed assertions, empty runs, fatal signals and dead shared HTTP workers
42
+ fail the job. The no-error-skip configuration keeps HTTP errors from silently
43
+ skipping tests.
44
+
45
+ For local checks against the published extension, leave
46
+ `RUNNER_LINKS_EXTENSIONS` unset or set it to `0`. This preserves the standalone
47
+ runner path: [`preprocess-require.awk`](preprocess-require.awk) converts
48
+ `require` gates to signed `INSTALL` and `LOAD` statements, and the harness
49
+ warms the community/core extension cache before running.
41
50
 
42
51
  The env wiring mirrors the vgi repo's Makefile `test_subprocess` / `test_shm` /
43
52
  `test_launcher` / `test_http` targets — the canonical local way to run this
@@ -77,9 +86,9 @@ matrix; `stdio` remains available for local compatibility testing:
77
86
  `test_launcher`), so those tests skip here; run the local stdio lane to cover
78
87
  them. One deliberate divergence from `test_launcher`: see
79
88
  `filter_echo_partitioned.test` below.
80
- - **`http`** — the whole suite over the stateless HTTP transport. Staging
81
- injects `LOAD httpfs` before each worker ATTACH (the prebuilt binary doesn't
82
- statically link httpfs).
89
+ - **`http`** — the whole suite over the stateless HTTP transport. The native
90
+ runner links httpfs; standalone mode injects `LOAD httpfs` before worker
91
+ attachments.
83
92
 
84
93
  The `simple_writable/*.test` write-path tests (INSERT/UPDATE/DELETE/RETURNING)
85
94
  run on **every** lane against `VGI_SIMPLE_WRITABLE_WORKER`
@@ -147,36 +156,32 @@ even though the fixture (`vgi-fixture-bad-enum-worker`) is installed.
147
156
  ```bash
148
157
  uv sync --all-extras
149
158
  VGI_SRC=~/Development/vgi \
150
- HAYBARN_UNITTEST=/path/to/haybarn-unittest \
159
+ HAYBARN_UNITTEST=~/Development/vgi/build/release/test/unittest \
160
+ RUNNER_LINKS_EXTENSIONS=1 \
151
161
  TRANSPORT=stdio \
152
162
  ci/run-integration.sh
153
163
  ```
154
164
 
155
- Download `haybarn-unittest` for your platform from the pinned Haybarn release:
165
+ To check the published extension instead, download `haybarn-unittest` for your
166
+ platform from a compatible Haybarn release and leave `RUNNER_LINKS_EXTENSIONS=0`:
156
167
 
157
168
  ```bash
158
169
  gh release download "$HAYBARN_RELEASE" --repo Query-farm-haybarn/haybarn \
159
170
  --pattern 'haybarn_unittest-*.zip'
160
171
  ```
161
172
 
162
- For day-to-day local work against a hand-built C++ extension, prefer the vgi
163
- repo's own targets (`make test_subprocess`, `make test_http`, …) /
164
- `scripts/run_all_tests.sh` as described in `CLAUDE.md`; this harness exists for
165
- CI, where building the extension from source is impractical.
173
+ The vgi repo's own targets (`make test_subprocess`, `make test_http`, …) and
174
+ `scripts/run_all_tests.sh` remain available as described in `CLAUDE.md`.
166
175
 
167
176
  ## Version pins (and their coupling)
168
177
 
169
- Two pins live in the workflow's `env:` block:
178
+ The workflow's `VGI_REF` pins the test suite and the native Actions artifact:
170
179
 
171
180
  | Pin | What | Why |
172
181
  |-----|------|-----|
173
- | `VGI_REF` | the `Query-farm/vgi` ref supplying the `.test` files | **for now tracks `main`** (latest at checkout time) so the port is always validated against the newest suite; switch to a commit SHA for reproducible, deliberate bumps |
174
- | `HAYBARN_RELEASE` | the Haybarn release supplying `haybarn-unittest` | must be ABI-compatible with the community vgi extension |
175
-
176
- **The coupling to know about:** the vgi extension is pulled live from the
177
- community channel (`FORCE INSTALL vgi FROM community`), which always serves the
178
- *currently published* build — it is not version-pinned here. So CI verifies the
179
- worker against what users can install today. If `VGI_REF` points at a commit
180
- whose tests exercise a protocol feature the published extension doesn't yet ship
181
- (or vice-versa), that test can fail or skip — bump `VGI_REF` deliberately and
182
- re-validate against the current community extension.
182
+ | `VGI_REF` | the `Query-farm/vgi` commit supplying the tests and native runner | the downloader requires an artifact built from that exact commit |
183
+
184
+ The optional standalone mode still installs the currently published community
185
+ extension. Use a compatible test suite and worker when checking that release;
186
+ an unreleased minor wire revision requires the matching native development
187
+ runner. Changing the CI pin does not publish an extension or an SDK package.
@@ -2,8 +2,8 @@
2
2
  # Copyright 2025, 2026 Query Farm LLC - https://query.farm
3
3
  #
4
4
  # Run the canonical Query-farm/vgi integration sqllogictest suite against the
5
- # Python example worker, using a prebuilt standalone `haybarn-unittest` and the
6
- # signed community vgi extension — no C++ build from source. See ci/README.md.
5
+ # Python example worker, using either a native runner with linked extensions or
6
+ # standalone `haybarn-unittest` and the signed community extension. See ci/README.md.
7
7
  #
8
8
  # Ported from vgi-go's harness. The Python differences:
9
9
  # * The "worker binaries" are console scripts installed into the project venv
@@ -29,6 +29,8 @@
29
29
  # Optional:
30
30
  # BIN_DIR dir holding the fixture console scripts (default: $REPO/.venv/bin)
31
31
  # TRANSPORT stdio | shm | launch | http (default: launch)
32
+ # RUNNER_LINKS_EXTENSIONS 1 for a native runner linking vgi/httpfs/json/parquet;
33
+ # 0 for the published standalone runner (default)
32
34
  # VGI_RPC_SHM_SIZE_BYTES shm side-channel segment size (the shm lane)
33
35
  # STAGE scratch dir for the preprocessed test tree (default: mktemp)
34
36
  set -euo pipefail
@@ -41,6 +43,7 @@ REPO="$(cd "$HERE/.." && pwd)"
41
43
  BIN_DIR="${BIN_DIR:-$REPO/.venv/bin}"
42
44
  STAGE="${STAGE:-$(mktemp -d)}"
43
45
  TRANSPORT="${TRANSPORT:-launch}"
46
+ RUNNER_LINKS_EXTENSIONS="${RUNNER_LINKS_EXTENSIONS:-0}"
44
47
  INTEGRATION="$VGI_SRC/test/sql/integration"
45
48
  [ -d "$INTEGRATION" ] || { echo "::error::no test/sql/integration under VGI_SRC=$VGI_SRC"; exit 1; }
46
49
 
@@ -118,7 +121,11 @@ mkdir -p "$STAGE/test/sql/integration"
118
121
  -not -name 'nested_type_combinations.test' \
119
122
  "${EXTRA_SKIP[@]}" | while read -r f; do
120
123
  mkdir -p "$STAGE/test/sql/integration/$(dirname "$f")"
121
- awk -v http="$AWK_HTTP" -f "$HERE/preprocess-require.awk" "$f" > "$STAGE/test/sql/integration/$f"
124
+ if [ "$RUNNER_LINKS_EXTENSIONS" = "1" ]; then
125
+ cp "$f" "$STAGE/test/sql/integration/$f"
126
+ else
127
+ awk -v http="$AWK_HTTP" -f "$HERE/preprocess-require.awk" "$f" > "$STAGE/test/sql/integration/$f"
128
+ fi
122
129
  done )
123
130
 
124
131
  # Some integration cases package an executable from the upstream support tree.
@@ -310,6 +317,9 @@ esac
310
317
 
311
318
  cd "$STAGE"
312
319
 
320
+ if [ "$RUNNER_LINKS_EXTENSIONS" = "1" ]; then
321
+ echo "Using extensions linked into the matching native runner."
322
+ else
313
323
  echo "Warming the extension cache (vgi from community, deps from core) ..."
314
324
  mkdir -p "$STAGE/test"
315
325
  # FORCE INSTALL vgi re-downloads the currently-published community build,
@@ -335,6 +345,7 @@ INSTALL spatial FROM core;
335
345
  EOF
336
346
  "$HAYBARN_UNITTEST" "test/_warm.test" >/dev/null 2>&1 || echo "::warning::extension warm step did not fully succeed"
337
347
  rm -f "$STAGE/test/_warm.test"
348
+ fi
338
349
 
339
350
  # DuckDB's sqllogictest runner, given no --test-config, turns any error whose
340
351
  # text contains "HTTP" or "Unable to connect" into a SKIP and exits 0. Over the
@@ -343,6 +354,14 @@ rm -f "$STAGE/test/_warm.test"
343
354
  TEST_CONFIG="$VGI_SRC/test/configs/no_error_skip.json"
344
355
  [ -f "$TEST_CONFIG" ] || { echo "::error::missing $TEST_CONFIG (VGI_REF predates it?)"; exit 1; }
345
356
 
357
+ # Native unittest defaults to its compiled source directory even after `cd`.
358
+ # Select the staged tree explicitly so discovery respects the exclusions above
359
+ # and spawned workers resolve relative fixture paths from the same directory.
360
+ RUNNER_ARGS=()
361
+ if [ "$RUNNER_LINKS_EXTENSIONS" = "1" ]; then
362
+ RUNNER_ARGS=(--test-dir "$STAGE")
363
+ fi
364
+
346
365
  # Run the lane, streaming the native sqllogictest report (a progress line per
347
366
  # file + the final "All tests passed (.. N assertions ..)" summary). Out-of-scope
348
367
  # tests were dropped at staging; any failed assertion exits non-zero.
@@ -373,7 +392,7 @@ run_unittest() {
373
392
  # `set +e` rather than `|| true`: the latter runs before PIPESTATUS is read and
374
393
  # overwrites it with true's 0, silently swallowing every real test failure.
375
394
  set +e
376
- "$HAYBARN_UNITTEST" --test-config "$TEST_CONFIG" "$@" 2>&1 | tee "$log"
395
+ "$HAYBARN_UNITTEST" "${RUNNER_ARGS[@]}" --test-config "$TEST_CONFIG" "$@" 2>&1 | tee "$log"
377
396
  rc="${PIPESTATUS[0]}"
378
397
  set -e
379
398
  if grep -q 'due to a fatal error condition' "$log"; then
@@ -382,6 +401,10 @@ run_unittest() {
382
401
  "otherwise have passed. This is invisible to the exit code by construction."
383
402
  rc=1
384
403
  fi
404
+ if grep -Eq 'No tests ran|No test cases matched' "$log"; then
405
+ echo "::error::the runner did not execute the selected tests"
406
+ rc=1
407
+ fi
385
408
  rm -f "$log"
386
409
  return "$rc"
387
410
  }
@@ -18,7 +18,7 @@ require `pip install vgi-python[http]`; JWT authentication additionally requires
18
18
  `principal` plus an optional `token_name`. It lives in a private `vgi-rpc` module, so `vgi.auth`
19
19
  re-exports it — a worker that implements `resolve_token` never has to name a private import path.
20
20
 
21
- As of vgi-rpc 0.46.0 introspection is the `vgi_rpc.Identity.v1` protocol hosted on the RPC server,
21
+ As of vgi-rpc 0.46.0 introspection is the `vgi_rpc.Identity.v2` protocol hosted on the RPC server,
22
22
  not an HTTP JSON route, so clients discover it through reflection. VGI hosts it on HTTP only, the
23
23
  transport that authenticates callers: its allowlist names principals, which stdin/stdout, AF_UNIX
24
24
  and TCP do not have. `TokenIdentity` and `TokenResolver` are no longer gated on the `[http]` extra.
@@ -72,7 +72,7 @@ overriding the same hook stop it at startup.
72
72
 
73
73
  Reflection (`list_protocols`) reports protocols in this order:
74
74
 
75
- | Transport | `vgi.v2` | `hosted_protocols()` | `vgi_rpc.Reflection.v1` | `vgi_rpc.Identity.v1` |
75
+ | Transport | `vgi.v2` | `hosted_protocols()` | `vgi_rpc.Reflection.v1` | `vgi_rpc.Identity.v2` |
76
76
  | --- | --- | --- | --- | --- |
77
77
  | stdin/stdout | yes | yes | yes | no |
78
78
  | AF_UNIX / named pipe | yes | yes | yes | no |
@@ -41,7 +41,7 @@ lookup.
41
41
 
42
42
  ## Grants and resolved tokens as bearer credentials
43
43
 
44
- `vgi_rpc.Identity.v1`'s `issue_grant` mints a standing credential that
44
+ `vgi_rpc.Identity.v2`'s `issue_grant` mints a standing credential that
45
45
  unattended automation later presents as an ordinary bearer. Over HTTP the
46
46
  worker accepts two kinds of identity credential after the deployment's own
47
47
  authenticator:
@@ -0,0 +1,171 @@
1
+ # Batched catalog contents and reusable publications
2
+
3
+ VGI wire revision **2.2.0** retains the `vgi.v2` route and replaces
4
+ `catalog_contents` with six catalog-wide Arrow IPC streams: schemas, tables,
5
+ views, functions, macros and indexes. Each stream can contain multiple batches.
6
+ Null means an empty category. Function and macro subtype fields remain intact.
7
+ Existing schema-level RPCs retain their previous collection encoding.
8
+
9
+ Function metadata stores `arguments`, `output_schema` and
10
+ `parameter_default_values` as `dictionary<int32, binary>` columns. Repeated
11
+ serialized schemas and typed defaults share dictionary entries by their byte
12
+ content. Python callers continue to use bytes for schemas and an optional
13
+ `RecordBatch` for defaults. Dictionary replacements across record batches are
14
+ supported; values remain opaque binary data rather than text.
15
+ Single-object and schema-level function RPCs use these same updated rows.
16
+
17
+ `SchemaInfo` no longer contains attachment data on the wire. Existing Python
18
+ authors may still pass `attach_opaque_data=` to its constructor during migration;
19
+ the argument is discarded. Use `CatalogAttachResult.attach_opaque_data` for
20
+ subsequent requests. Worker functions still receive their attachment state.
21
+
22
+ Every minor wire revision is an explicit contract boundary. The server checks
23
+ major and minor exactly, so clients and workers must both use 2.2. A patch bump
24
+ does not permit schema changes. Serving 2.1 and 2.2 during migration requires
25
+ separate deployment URLs or an explicit compatibility implementation.
26
+
27
+ ## Enable publication
28
+
29
+ Publication is opt-in through `CatalogInterface.catalog_snapshot_policy`.
30
+ Ordinary delivery and the existing frozen-catalog response cache remain the
31
+ default. Published delivery uses the existing vgi-rpc `ExternalRef` mechanism;
32
+ clients resolve the external object on all transports, including subprocess.
33
+
34
+ Install `vgi-python[external]` on publishing workers and clients that resolve
35
+ publications; add `http` when serving or connecting over HTTP, for example
36
+ `pip install 'vgi-python[http,external]'`. The `external` extra supplies the RPC
37
+ HTTP downloader, retry and compression dependencies. Supply your own configured
38
+ S3 client and its SDK when using the S3 repository.
39
+
40
+ The catalog implementation uses APIs available in published **vgi-rpc 0.50.0**.
41
+ An isolated check against that release passed 157 functional catalog, client,
42
+ serialization, binary dictionary and publication tests. The package retains its
43
+ declared RPC minimum of 0.52.0 for Identity.v2 support; catalog publication does
44
+ not introduce a dependency on unpublished RPC APIs.
45
+
46
+ ```python
47
+ from vgi.catalog.snapshot import (
48
+ CatalogSnapshotPolicy,
49
+ S3CatalogPublicationRepository,
50
+ SnapshotIdentity,
51
+ )
52
+ from vgi_rpc.external import Compression
53
+
54
+ # s3 is your configured boto3-compatible S3/R2 client. The client must support
55
+ # conditional PutObject with IfNoneMatch and IfMatch.
56
+ repository = S3CatalogPublicationRepository(
57
+ s3,
58
+ bucket="catalog-snapshots",
59
+ profile="production-r2-gzip",
60
+ url_ttl_seconds=3600,
61
+ retention_seconds=86400,
62
+ )
63
+
64
+ class MyCatalog(ExistingCatalog):
65
+ catalog_snapshot_policy = CatalogSnapshotPolicy(
66
+ delivery="published",
67
+ repository=repository,
68
+ identity=lambda request: SnapshotIdentity(
69
+ catalog_namespace="my-catalog",
70
+ source_revision=DEPLOYMENT_REVISION,
71
+ catalog_version=request.catalog_version,
72
+ # Omit this for the safe attachment-local default. Sharing requires
73
+ # an explicit guarantee that metadata is identical for this scope.
74
+ visibility_scope="public-default-options",
75
+ ),
76
+ compression=Compression(algorithm="gzip"),
77
+ )
78
+ ```
79
+
80
+ The identity hook must be cheap and must change `source_revision` whenever
81
+ metadata changes. A dynamic catalog can use a schema generation rather than a
82
+ deployment revision. Include options, resolved implementation/data versions,
83
+ tenant or principal, and any other metadata visibility differences in its scope.
84
+ Do not put credentials into names or scope strings. Omitting `visibility_scope`
85
+ isolates publications by a hash of the attachment envelope. Catalog version zero
86
+ still requires a meaningful source revision.
87
+
88
+ An optional `validator(request) -> str | None` can answer a matching ETag before
89
+ repository access or inventory construction. Every request unwraps and authorizes
90
+ its attachment first, even on a cache hit. The framework also checks that version
91
+ and source identity remain unchanged while it builds a publication.
92
+
93
+ ## Publication lifecycle
94
+
95
+ The framework writes a complete unary RPC envelope with one `result: binary`
96
+ row. That binary contains the catalog response and its six nested streams.
97
+ The stored object is compressed according to the policy and includes a mandatory
98
+ SHA-256 over the raw envelope. Before committing its manifest, the framework
99
+ fetches the actual HTTP URL and validates the digest, envelope, nested schemas,
100
+ all rows/batches, schema membership, subtype fields and metadata equality.
101
+ Raw and stored byte limits apply before upload and during readback, including
102
+ when the caller supplies a custom fetch policy.
103
+
104
+ The repository stores small trusted manifests separately from immutable objects.
105
+ Keys include routing name, major/minor wire revision, generated canonical catalog
106
+ contract hash, codec revision, namespace, source revision, visibility scope,
107
+ catalog version, and storage/compression profile. A new worker process looks up
108
+ the manifest before collecting metadata, then validates it with one HTTP fetch.
109
+ A warm hit performs no inventory build, serialization, compression, upload or
110
+ object GET. A client receiving the pointer still downloads the result as needed.
111
+
112
+ `S3CatalogPublicationRepository` uses conditional manifest writes and tombstones
113
+ for invalidation. It can re-sign a retained object without rebuilding it.
114
+ Configure object lifecycle rules to retain objects for at least the declared
115
+ retention interval; keep manifest retention separate. Signed URLs in manifests
116
+ are credentials, so the manifest store must be access controlled. Newly changed
117
+ retrieval URLs are validated before serving them.
118
+
119
+ `MemoryCatalogPublicationRepository` supports a supplied RPC uploader for local
120
+ use. It requires an explicit URL lifetime or stable-location declaration.
121
+ It does not provide persistence across process restarts. A process coordinates
122
+ one build per key; conditional repository commit makes separate publishers
123
+ converge but can permit duplicate initial uploads across processes. Storage
124
+ lifecycle rules should collect unused losing uploads.
125
+
126
+ The manager bounds its in-memory manifest cache. URL or object-retention expiry
127
+ causes renewal or rebuilding. Recovery of a corrupt or missing object
128
+ conditionally invalidates that manifest and attempts a fresh publication.
129
+ Publication errors fail the RPC by default. Set
130
+ `on_publication_failure="ordinary"` to explicitly permit a newly validated
131
+ ordinary full response when publication fails.
132
+
133
+ Workers expose `warm_catalog_contents(attach_opaque_data)`,
134
+ `import_catalog_publication(attach_opaque_data, manifest)` and
135
+ `invalidate_catalog_publication(attach_opaque_data, manifest_id)` for authorized
136
+ operational use. Import uses the same HTTP validation as recovery. A failed client
137
+ download does not automatically notify the worker; use conditional invalidation
138
+ to repair a known bad publication without deleting a concurrent replacement.
139
+
140
+ ## Validation
141
+
142
+ Run the focused Python checks with the project environment on `PATH`:
143
+
144
+ ```sh
145
+ uv run pytest tests/catalog/test_catalog_contents.py \
146
+ tests/catalog/test_catalog_publication.py \
147
+ tests/catalog/test_client_load_catalog.py tests/catalog/test_serialization.py
148
+ ```
149
+
150
+ The publication tests use real HTTP object retrieval with uncompressed, gzip and
151
+ zstd results. They exercise restart recovery, singleflight, default attachment
152
+ isolation, corrupt publication, explicit fallback, authentication before cached
153
+ delivery, caps, generation changes, manifest import and conditional invalidation.
154
+ The S3 fixture verifies discovery and conditional writes across repository
155
+ instances. Configure a real S3/R2 bucket and deployment CORS before production
156
+ rollout; the in-memory conditional object fixture does not validate a vendor's
157
+ credentials, CORS settings or lifecycle configuration.
158
+
159
+ The installable native/browser fixture is:
160
+
161
+ ```sh
162
+ python -m vgi._test_fixtures.catalog_publication
163
+ ```
164
+
165
+ It accepts ordinary fixture worker options, including `--http`. Only
166
+ `contents_probe` uses publication; other standard fixture catalogs retain their
167
+ normal behavior. Set `VGI_CATALOG_PUBLICATION_PORT` to expose the local object
168
+ server at a predictable port; `/stats` reports uploads and object GETs. Its CORS
169
+ headers and preflight support permit browser conformance tests. This fixture is
170
+ intended for local testing and its object storage lasts only for the worker's
171
+ lifetime.
@@ -1,7 +1,11 @@
1
1
  # VGI Attach Tickets
2
2
 
3
3
  **Status:** Normative. Reference implementation: vgi-python `vgi/attach_ticket.py`.
4
- **Protocol:** `vgi.attach_tickets.v1`, version `1.0.0`. No change to `vgi.v2`.
4
+ **Protocol:** `vgi.attach_tickets.v1`, version `2.0.0`. No change to `vgi.v2`.
5
+ **Revision 2026-10-17 (`2.0.0`):** `AttachTicket.expires_at` changed from
6
+ `float64` unix seconds (`+inf` = no expiry) to nullable
7
+ `timestamp[us, tz="UTC"]` (null = no expiry). The sealed payload (§2) is
8
+ unchanged; the exact major.minor version check rejects a `1.0.0` peer.
5
9
  **Vectors:** [`vgi/_test_fixtures/attach_ticket_vectors.json`](https://github.com/Query-farm/vgi-python/blob/main/vgi/_test_fixtures/attach_ticket_vectors.json)
6
10
 
7
11
  An SDK implements attach tickets from this page alone. The words MUST, MUST
@@ -17,7 +21,7 @@ this worker can open. Later a runner attaches with one option,
17
21
  `vgi_attach_ticket`, and the worker restores the original attach before any
18
22
  catalog code runs.
19
23
 
20
- A ticket says *what* to attach. A sealed grant (`vgi_rpc.Identity.v1`
24
+ A ticket says *what* to attach. A sealed grant (`vgi_rpc.Identity.v2`
21
25
  `issue_grant`) says *who* attaches. The two are separate on purpose:
22
26
 
23
27
  - **A ticket carries no authority.** It opens only under the caller's
@@ -133,7 +137,7 @@ from `vgi_rpc.Reflection.v1` `list_protocols`):
133
137
  is useless without a grant.
134
138
 
135
139
  It is hosted beside `vgi.v2` and never changes how a `vgi.v2` request is
136
- dispatched. Wire name `vgi.attach_tickets.v1`, `protocol_version = "1.0.0"`.
140
+ dispatched. Wire name `vgi.attach_tickets.v1`, `protocol_version = "2.0.0"`.
137
141
 
138
142
  ### 5.2 Shapes
139
143
 
@@ -154,7 +158,7 @@ One unary method, `seal_attach(request: SealAttachRequest) -> AttachTicket`.
154
158
  | Field | Arrow type | Meaning |
155
159
  | --- | --- | --- |
156
160
  | `ticket` | `utf8` not null | The `vgia1.` text |
157
- | `expires_at` | `float64` not null | Unix seconds; `+inf` when the ticket has no expiry |
161
+ | `expires_at` | `timestamp[us, tz="UTC"]` nullable | The UTC instant the ticket expires (the sealed `expires_at` seconds × 1 000 000 µs); null when the ticket has no expiry |
158
162
 
159
163
  ### 5.3 Rules
160
164
 
@@ -194,7 +198,7 @@ In this order:
194
198
 
195
199
  So the two halves of a held entry (grant and ticket) expire together.
196
200
  5. **Seal** per §2 with a fresh `ticket_id` and nonce. Return the text and
197
- `expires_at` (`+inf` for `0`).
201
+ `expires_at` (null for `0`).
198
202
 
199
203
  A worker MAY refuse by policy with `action_denied`.
200
204
 
@@ -8,7 +8,7 @@
8
8
  # and the conformance suite import it by its normal `vgi._test_fixtures` path.
9
9
  [project]
10
10
  name = "vgi-fixtures"
11
- version = "0.8.2"
11
+ version = "0.46.0"
12
12
  description = "Example/test VGI worker modules and entry points (not for production use)"
13
13
  readme = "README.md"
14
14
  # Local copy of the repo-root LICENSE (kept in sync): the build can't reach