vgi-python 0.42.1__tar.gz → 0.43.1__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 (698) hide show
  1. {vgi_python-0.42.1 → vgi_python-0.43.1}/CLAUDE.md +30 -3
  2. {vgi_python-0.42.1 → vgi_python-0.43.1}/PKG-INFO +2 -2
  3. {vgi_python-0.42.1 → vgi_python-0.43.1}/ci/run-integration.sh +8 -1
  4. vgi_python-0.43.1/docs/api/client.md +38 -0
  5. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/worker.md +8 -0
  6. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/catalog-interface.md +2 -0
  7. vgi_python-0.43.1/docs/protocol/vgi-attach-tickets.md +329 -0
  8. vgi_python-0.43.1/docs/protocol/vgi-opaque-data-sealing.md +220 -0
  9. {vgi_python-0.42.1 → vgi_python-0.43.1}/mkdocs.yml +2 -0
  10. {vgi_python-0.42.1 → vgi_python-0.43.1}/pyproject.toml +2 -2
  11. vgi_python-0.43.1/scripts/gen_attach_ticket_vectors.py +528 -0
  12. {vgi_python-0.42.1 → vgi_python-0.43.1}/scripts/run_all_tests.sh +4 -1
  13. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_directory_parity.py +6 -0
  14. vgi_python-0.43.1/tests/sdk_conformance/__init__.py +8 -0
  15. vgi_python-0.43.1/tests/sdk_conformance/test_opaque_sealing.py +565 -0
  16. vgi_python-0.43.1/tests/sdk_conformance/test_opaque_sealing_stdio.py +53 -0
  17. vgi_python-0.43.1/tests/test_attach_ticket.py +740 -0
  18. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_catalog_auth_binding.py +95 -0
  19. vgi_python-0.43.1/tests/test_client_reflection.py +143 -0
  20. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_table_function_early_close.py +44 -10
  21. {vgi_python-0.42.1 → vgi_python-0.43.1}/uv.lock +5 -5
  22. vgi_python-0.43.1/vgi/_redact.py +35 -0
  23. vgi_python-0.43.1/vgi/_test_fixtures/attach_ticket_vectors.json +450 -0
  24. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/catalog.py +2 -1
  25. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/http_server.py +30 -5
  26. vgi_python-0.43.1/vgi/_test_fixtures/ticket_probe.py +167 -0
  27. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/worker.py +4 -0
  28. vgi_python-0.43.1/vgi/attach_ticket.py +733 -0
  29. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/attach_option.py +12 -1
  30. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/__init__.py +3 -0
  31. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/client.py +98 -4
  32. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/exceptions.py +24 -1
  33. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/meta_worker.py +21 -3
  34. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/rpc_server.py +38 -4
  35. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/serve.py +23 -0
  36. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/transactor/server.py +12 -9
  37. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/worker.py +40 -25
  38. vgi_python-0.42.1/docs/api/client.md +0 -6
  39. {vgi_python-0.42.1 → vgi_python-0.43.1}/.dockerignore +0 -0
  40. {vgi_python-0.42.1 → vgi_python-0.43.1}/.gitattributes +0 -0
  41. {vgi_python-0.42.1 → vgi_python-0.43.1}/.github/dependabot.yml +0 -0
  42. {vgi_python-0.42.1 → vgi_python-0.43.1}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  43. {vgi_python-0.42.1 → vgi_python-0.43.1}/.github/workflows/ci.yml +0 -0
  44. {vgi_python-0.42.1 → vgi_python-0.43.1}/.github/workflows/docs.yml +0 -0
  45. {vgi_python-0.42.1 → vgi_python-0.43.1}/.github/workflows/integration.yml +0 -0
  46. {vgi_python-0.42.1 → vgi_python-0.43.1}/.github/workflows/release.yml +0 -0
  47. {vgi_python-0.42.1 → vgi_python-0.43.1}/.github/workflows/tailnet-integration.yml +0 -0
  48. {vgi_python-0.42.1 → vgi_python-0.43.1}/.gitignore +0 -0
  49. {vgi_python-0.42.1 → vgi_python-0.43.1}/.python-version +0 -0
  50. {vgi_python-0.42.1 → vgi_python-0.43.1}/.vale.ini +0 -0
  51. {vgi_python-0.42.1 → vgi_python-0.43.1}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  52. {vgi_python-0.42.1 → vgi_python-0.43.1}/DOCS_REVIEW_RUBRIC.md +0 -0
  53. {vgi_python-0.42.1 → vgi_python-0.43.1}/DOCS_USABILITY_TEST.md +0 -0
  54. {vgi_python-0.42.1 → vgi_python-0.43.1}/LICENSE +0 -0
  55. {vgi_python-0.42.1 → vgi_python-0.43.1}/PROTOCOL.md +0 -0
  56. {vgi_python-0.42.1 → vgi_python-0.43.1}/README.md +0 -0
  57. {vgi_python-0.42.1 → vgi_python-0.43.1}/RELEASE-RUNBOOK.md +0 -0
  58. {vgi_python-0.42.1 → vgi_python-0.43.1}/SECURITY.md +0 -0
  59. {vgi_python-0.42.1 → vgi_python-0.43.1}/ci/README.md +0 -0
  60. {vgi_python-0.42.1 → vgi_python-0.43.1}/ci/preprocess-require.awk +0 -0
  61. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/README.md +0 -0
  62. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/and-too-few-children.json +0 -0
  63. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/delta-required-upsert.json +0 -0
  64. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/nested-runtime-filter.json +0 -0
  65. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/remove-with-expression.json +0 -0
  66. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/required-runtime-filter.json +0 -0
  67. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/snapshot-nonzero-revision.json +0 -0
  68. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/unknown-document-property.json +0 -0
  69. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/unknown-node.json +0 -0
  70. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/positive/advisory-upsert-delta.json +0 -0
  71. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/positive/boolean-column-predicate.json +0 -0
  72. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/positive/empty-snapshot.json +0 -0
  73. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/positive/nested-required-snapshot.json +0 -0
  74. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/positive/remove-delta.json +0 -0
  75. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/positive/runtime-filter-snapshot.json +0 -0
  76. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/filter-v2.schema.json +0 -0
  77. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/generate_runtime.py +0 -0
  78. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/manifest.json +0 -0
  79. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/run_worker.py +0 -0
  80. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow +0 -0
  81. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow +0 -0
  82. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-add/input.arrow +0 -0
  83. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-multiply/expected.arrow +0 -0
  84. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-multiply/filter.arrow +0 -0
  85. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-multiply/input.arrow +0 -0
  86. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-negate/expected.arrow +0 -0
  87. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow +0 -0
  88. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow +0 -0
  89. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-subtract/expected.arrow +0 -0
  90. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-subtract/filter.arrow +0 -0
  91. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-subtract/input.arrow +0 -0
  92. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/cast-integer-to-double/expected.arrow +0 -0
  93. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/cast-integer-to-double/filter.arrow +0 -0
  94. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/cast-integer-to-double/input.arrow +0 -0
  95. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-distinct_from/expected.arrow +0 -0
  96. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-distinct_from/filter.arrow +0 -0
  97. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-distinct_from/input.arrow +0 -0
  98. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-distinct_from/worker-expected.arrow +0 -0
  99. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-eq/expected.arrow +0 -0
  100. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-eq/filter.arrow +0 -0
  101. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-eq/input.arrow +0 -0
  102. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-eq/worker-expected.arrow +0 -0
  103. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ge/expected.arrow +0 -0
  104. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ge/filter.arrow +0 -0
  105. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ge/input.arrow +0 -0
  106. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ge/worker-expected.arrow +0 -0
  107. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-gt/expected.arrow +0 -0
  108. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-gt/filter.arrow +0 -0
  109. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-gt/input.arrow +0 -0
  110. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-gt/worker-expected.arrow +0 -0
  111. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-le/expected.arrow +0 -0
  112. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-le/filter.arrow +0 -0
  113. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-le/input.arrow +0 -0
  114. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-le/worker-expected.arrow +0 -0
  115. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-lt/expected.arrow +0 -0
  116. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-lt/filter.arrow +0 -0
  117. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-lt/input.arrow +0 -0
  118. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-lt/worker-expected.arrow +0 -0
  119. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ne/expected.arrow +0 -0
  120. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ne/filter.arrow +0 -0
  121. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ne/input.arrow +0 -0
  122. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ne/worker-expected.arrow +0 -0
  123. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/expected.arrow +0 -0
  124. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/filter.arrow +0 -0
  125. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/input.arrow +0 -0
  126. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/worker-expected.arrow +0 -0
  127. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/delta-0.arrow +0 -0
  128. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/expected.arrow +0 -0
  129. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/filter.arrow +0 -0
  130. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/input.arrow +0 -0
  131. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-empty-noop/delta-0.arrow +0 -0
  132. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-empty-noop/expected.arrow +0 -0
  133. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-empty-noop/filter.arrow +0 -0
  134. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-empty-noop/input.arrow +0 -0
  135. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-0.arrow +0 -0
  136. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-1.arrow +0 -0
  137. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-2.arrow +0 -0
  138. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/expected.arrow +0 -0
  139. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/filter.arrow +0 -0
  140. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/input.arrow +0 -0
  141. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/empty-snapshot/expected.arrow +0 -0
  142. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/empty-snapshot/filter.arrow +0 -0
  143. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/empty-snapshot/input.arrow +0 -0
  144. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/empty-snapshot/worker-expected.arrow +0 -0
  145. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-cast-type-not-null/filter.arrow +0 -0
  146. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-cast-type-not-null/input.arrow +0 -0
  147. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-column-index/filter.arrow +0 -0
  148. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-column-index/input.arrow +0 -0
  149. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-column-name/filter.arrow +0 -0
  150. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-column-name/input.arrow +0 -0
  151. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-contextual-cast-without-session/filter.arrow +0 -0
  152. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-contextual-cast-without-session/input.arrow +0 -0
  153. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-duplicate-predicate-id/filter.arrow +0 -0
  154. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-duplicate-predicate-id/input.arrow +0 -0
  155. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-external-column-index/filter.arrow +0 -0
  156. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-external-column-index/input.arrow +0 -0
  157. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-external-column-index/join-keys-0.arrow +0 -0
  158. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-external-column-name/filter.arrow +0 -0
  159. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-external-column-name/input.arrow +0 -0
  160. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-external-column-name/join-keys-0.arrow +0 -0
  161. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-field-non-struct/filter.arrow +0 -0
  162. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-field-non-struct/input.arrow +0 -0
  163. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-in-payload-not-list/filter.arrow +0 -0
  164. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-in-payload-not-list/input.arrow +0 -0
  165. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-in-payload-null-list/filter.arrow +0 -0
  166. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-in-payload-null-list/input.arrow +0 -0
  167. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-invalid-overload/filter.arrow +0 -0
  168. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-invalid-overload/input.arrow +0 -0
  169. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-missing-literal/filter.arrow +0 -0
  170. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-missing-literal/input.arrow +0 -0
  171. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-non-boolean-root/filter.arrow +0 -0
  172. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-non-boolean-root/input.arrow +0 -0
  173. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-unknown-standard-function/filter.arrow +0 -0
  174. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-unknown-standard-function/input.arrow +0 -0
  175. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/external-in-nonzero-column/expected.arrow +0 -0
  176. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/external-in-nonzero-column/filter.arrow +0 -0
  177. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/external-in-nonzero-column/input.arrow +0 -0
  178. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/external-in-nonzero-column/join-keys-0.arrow +0 -0
  179. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/external-in-nonzero-column/worker-expected.arrow +0 -0
  180. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-contains/expected.arrow +0 -0
  181. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-contains/filter.arrow +0 -0
  182. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-contains/input.arrow +0 -0
  183. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-ends-with/expected.arrow +0 -0
  184. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-ends-with/filter.arrow +0 -0
  185. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-ends-with/input.arrow +0 -0
  186. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-list-contains/expected.arrow +0 -0
  187. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-list-contains/filter.arrow +0 -0
  188. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-list-contains/input.arrow +0 -0
  189. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-starts-with/expected.arrow +0 -0
  190. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-starts-with/filter.arrow +0 -0
  191. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-starts-with/input.arrow +0 -0
  192. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-empty/expected.arrow +0 -0
  193. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-empty/filter.arrow +0 -0
  194. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-empty/input.arrow +0 -0
  195. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-empty/worker-expected.arrow +0 -0
  196. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-with-null/expected.arrow +0 -0
  197. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-with-null/filter.arrow +0 -0
  198. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-with-null/input.arrow +0 -0
  199. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-with-null/worker-expected.arrow +0 -0
  200. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-not-null/expected.arrow +0 -0
  201. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-not-null/filter.arrow +0 -0
  202. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-not-null/input.arrow +0 -0
  203. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-not-null/worker-expected.arrow +0 -0
  204. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-null/expected.arrow +0 -0
  205. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-null/filter.arrow +0 -0
  206. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-null/input.arrow +0 -0
  207. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-null/worker-expected.arrow +0 -0
  208. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-and/expected.arrow +0 -0
  209. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-and/filter.arrow +0 -0
  210. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-and/input.arrow +0 -0
  211. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-not/expected.arrow +0 -0
  212. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-not/filter.arrow +0 -0
  213. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-not/input.arrow +0 -0
  214. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-or/expected.arrow +0 -0
  215. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-or/filter.arrow +0 -0
  216. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-or/input.arrow +0 -0
  217. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/nan-comparison/expected.arrow +0 -0
  218. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/nan-comparison/filter.arrow +0 -0
  219. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/nan-comparison/input.arrow +0 -0
  220. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/negative-zero-membership/expected.arrow +0 -0
  221. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/negative-zero-membership/filter.arrow +0 -0
  222. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/negative-zero-membership/input.arrow +0 -0
  223. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/nested-null-propagation/expected.arrow +0 -0
  224. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/nested-null-propagation/filter.arrow +0 -0
  225. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/nested-null-propagation/input.arrow +0 -0
  226. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-empty/expected.arrow +0 -0
  227. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-empty/filter.arrow +0 -0
  228. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-empty/input.arrow +0 -0
  229. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-empty/worker-expected.arrow +0 -0
  230. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-with-null/expected.arrow +0 -0
  231. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-with-null/filter.arrow +0 -0
  232. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-with-null/input.arrow +0 -0
  233. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-with-null/worker-expected.arrow +0 -0
  234. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/session-integer-division/expected.arrow +0 -0
  235. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/session-integer-division/filter.arrow +0 -0
  236. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/session-integer-division/input.arrow +0 -0
  237. {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime-manifest.json +0 -0
  238. {vgi_python-0.42.1 → vgi_python-0.43.1}/dist-vgi/.gitignore +0 -0
  239. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/aggregate-functions.md +0 -0
  240. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/arguments.md +0 -0
  241. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/auth.md +0 -0
  242. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/catalogs.md +0 -0
  243. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/exceptions.md +0 -0
  244. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/filters.md +0 -0
  245. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/functions.md +0 -0
  246. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/http.md +0 -0
  247. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/index.md +0 -0
  248. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/metadata.md +0 -0
  249. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/observability.md +0 -0
  250. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/storage.md +0 -0
  251. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/transactor.md +0 -0
  252. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/argument-serialization.md +0 -0
  253. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/apple-touch-icon.png +0 -0
  254. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/favicon-16x16.png +0 -0
  255. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/favicon-32x32.png +0 -0
  256. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/favicon.ico +0 -0
  257. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/kinds/aggregate.svg +0 -0
  258. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/kinds/buffering.svg +0 -0
  259. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/kinds/scalar.svg +0 -0
  260. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/kinds/table-in-out.svg +0 -0
  261. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/kinds/table.svg +0 -0
  262. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/logo.png +0 -0
  263. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/social-card.png +0 -0
  264. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/video-thumbnail.jpg +0 -0
  265. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/authentication.md +0 -0
  266. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/cli.md +0 -0
  267. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/column-statistics.md +0 -0
  268. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/concepts/index.md +0 -0
  269. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/contributing-docs.md +0 -0
  270. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/filter-pushdown.md +0 -0
  271. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/generator-api.md +0 -0
  272. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/global-functions.md +0 -0
  273. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/catalogs.md +0 -0
  274. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/function-patterns.md +0 -0
  275. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/http-auth.md +0 -0
  276. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/index.md +0 -0
  277. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/iroh.md +0 -0
  278. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/pushdown-and-statistics.md +0 -0
  279. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/state-storage.md +0 -0
  280. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/tailnet.md +0 -0
  281. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/index.md +0 -0
  282. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/lifecycle.md +0 -0
  283. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/metadata.md +0 -0
  284. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/overrides/main.html +0 -0
  285. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/protocol/index.md +0 -0
  286. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/protocol/vgi-catalog-query-pushdown-design.md +0 -0
  287. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/protocol/vgi-duckdb-filter-adapter.md +0 -0
  288. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/protocol/vgi-filter-encoding-v2-spec.md +0 -0
  289. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/protocol/vgi-protocol-proposed-changes.md +0 -0
  290. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/protocol/vgi-runtime-filter-artifacts.md +0 -0
  291. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/robots.txt +0 -0
  292. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/shared-storage.md +0 -0
  293. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/stylesheets/extra.css +0 -0
  294. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/tutorial/index.md +0 -0
  295. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/tutorial/scalar.md +0 -0
  296. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/tutorial/table.md +0 -0
  297. {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/vgi-logo.png +0 -0
  298. {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/batch_index_worker.py +0 -0
  299. {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/cache_worker.py +0 -0
  300. {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/calc_scalar_worker.py +0 -0
  301. {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/calc_worker.py +0 -0
  302. {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/copy_format_worker.py +0 -0
  303. {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/filter_worker.py +0 -0
  304. {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/greeting_scalar_worker.py +0 -0
  305. {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/row_count_worker.py +0 -0
  306. {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/series_streaming_worker.py +0 -0
  307. {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/sum_worker.py +0 -0
  308. {vgi_python-0.42.1 → vgi_python-0.43.1}/identity.png +0 -0
  309. {vgi_python-0.42.1 → vgi_python-0.43.1}/packages/vgi-fixtures/LICENSE +0 -0
  310. {vgi_python-0.42.1 → vgi_python-0.43.1}/packages/vgi-fixtures/README.md +0 -0
  311. {vgi_python-0.42.1 → vgi_python-0.43.1}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  312. {vgi_python-0.42.1 → vgi_python-0.43.1}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  313. {vgi_python-0.42.1 → vgi_python-0.43.1}/packages/vgi-fixtures/pyproject.toml +0 -0
  314. {vgi_python-0.42.1 → vgi_python-0.43.1}/scripts/hosted_protocols_conformance.sh +0 -0
  315. {vgi_python-0.42.1 → vgi_python-0.43.1}/scripts/measure_startup.py +0 -0
  316. {vgi_python-0.42.1 → vgi_python-0.43.1}/scripts/regen_generated.py +0 -0
  317. {vgi_python-0.42.1 → vgi_python-0.43.1}/test-data/generate.sh +0 -0
  318. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/__init__.py +0 -0
  319. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/_hosted_protocols_worker.py +0 -0
  320. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/_http_fixtures.py +0 -0
  321. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/__init__.py +0 -0
  322. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_attach_option.py +0 -0
  323. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_catalog_contents.py +0 -0
  324. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_catalog_interface.py +0 -0
  325. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_client_catalog.py +0 -0
  326. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_client_load_catalog.py +0 -0
  327. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_column_statistics.py +0 -0
  328. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_declarative.py +0 -0
  329. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_example_worker_catalog.py +0 -0
  330. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_integration.py +0 -0
  331. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_required_filters.py +0 -0
  332. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_scan_branches.py +0 -0
  333. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_serialization.py +0 -0
  334. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_setting.py +0 -0
  335. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_storage.py +0 -0
  336. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_time_travel.py +0 -0
  337. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_writable_table.py +0 -0
  338. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/__init__.py +0 -0
  339. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_aggregate_client.py +0 -0
  340. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_batch_metadata_callback.py +0 -0
  341. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_bind_and_join_keys.py +0 -0
  342. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_broken_pipe.py +0 -0
  343. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_cli.py +0 -0
  344. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_cli_catalog_functions.py +0 -0
  345. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_copy_client.py +0 -0
  346. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_http_response_budget.py +0 -0
  347. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_iroh_client.py +0 -0
  348. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_scan_branches_client.py +0 -0
  349. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_split_client.py +0 -0
  350. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_stop_force.py +0 -0
  351. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_table_column_statistics.py +0 -0
  352. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_time_travel_client.py +0 -0
  353. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_worker_debug.py +0 -0
  354. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/__init__.py +0 -0
  355. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/_stub.py +0 -0
  356. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/conftest.py +0 -0
  357. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_accumulate.py +0 -0
  358. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_aggregate.py +0 -0
  359. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_attach.py +0 -0
  360. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_bearer_auth.py +0 -0
  361. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_const_param_enforcement.py +0 -0
  362. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_container.py +0 -0
  363. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_copy_from.py +0 -0
  364. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_copy_to.py +0 -0
  365. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_function_inventory.py +0 -0
  366. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_github.py +0 -0
  367. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_http_client.py +0 -0
  368. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_http_external_location.py +0 -0
  369. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_http_upload_url.py +0 -0
  370. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_macro.py +0 -0
  371. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_overload.py +0 -0
  372. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_protocol_inventory.py +0 -0
  373. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_protocol_version.py +0 -0
  374. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_resumable_scan.py +0 -0
  375. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_scalar.py +0 -0
  376. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  377. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_secret.py +0 -0
  378. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_settings.py +0 -0
  379. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_splits.py +0 -0
  380. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_table.py +0 -0
  381. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_table_in_out.py +0 -0
  382. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_view.py +0 -0
  383. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_writable.py +0 -0
  384. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conftest.py +0 -0
  385. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
  386. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
  387. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
  388. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/bad_version.bin +0 -0
  389. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/generate.py +0 -0
  390. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/manifest.json +0 -0
  391. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
  392. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/stale_anchor.bin +0 -0
  393. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/truncated.bin +0 -0
  394. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/valid_sealed.bin +0 -0
  395. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/valid_unsealed.bin +0 -0
  396. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/__init__.py +0 -0
  397. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_bernoulli_function.py +0 -0
  398. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_binary_packet_function.py +0 -0
  399. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_client.py +0 -0
  400. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_conditional_message_function.py +0 -0
  401. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_hash_seed_function.py +0 -0
  402. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  403. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_multiply_function.py +0 -0
  404. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_random_bytes_function.py +0 -0
  405. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_return_secret_value_function.py +0 -0
  406. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/__init__.py +0 -0
  407. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/__init__.py +0 -0
  408. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_constant_columns_function.py +0 -0
  409. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_double_sequence_function.py +0 -0
  410. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_exception_function.py +0 -0
  411. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_filter_echo_function.py +0 -0
  412. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_logging_function.py +0 -0
  413. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_nested_sequence_function.py +0 -0
  414. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_partitioned_function.py +0 -0
  415. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_projected_data_function.py +0 -0
  416. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_sequence_function.py +0 -0
  417. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_settings_function.py +0 -0
  418. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_struct_settings_function.py +0 -0
  419. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_ten_thousand_function.py +0 -0
  420. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/test_wide_columns.py +0 -0
  421. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/__init__.py +0 -0
  422. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/__init__.py +0 -0
  423. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  424. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/test_echo_function.py +0 -0
  425. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  426. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  427. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  428. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
  429. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  430. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/test_blended_exchange.py +0 -0
  431. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/test_blended_metadata.py +0 -0
  432. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/test_client.py +0 -0
  433. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/test_table_buffering_empty_input.py +0 -0
  434. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/tailnet/Dockerfile +0 -0
  435. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/tailnet/__init__.py +0 -0
  436. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/tailnet/compose.yaml +0 -0
  437. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/tailnet/probe.py +0 -0
  438. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/tailnet/run.sh +0 -0
  439. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/tailnet/test_worker.py +0 -0
  440. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/tailnet/worker.py +0 -0
  441. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_access_log_audit.py +0 -0
  442. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_aggregate_function.py +0 -0
  443. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_argument_spec.py +0 -0
  444. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_auth.py +0 -0
  445. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_bind_exceptions.py +0 -0
  446. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_bind_request_at_clause.py +0 -0
  447. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_bound_storage_conformance.py +0 -0
  448. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_cache_control.py +0 -0
  449. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_call_state_attach.py +0 -0
  450. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_client_oauth.py +0 -0
  451. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_codegen_request_inventory.py +0 -0
  452. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_copy_from_function.py +0 -0
  453. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_copy_to_function.py +0 -0
  454. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_docstrings.py +0 -0
  455. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_documentation_examples.py +0 -0
  456. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_dynamic_filter_http_turns.py +0 -0
  457. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_example_function_arg_types.py +0 -0
  458. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_examples_workers.py +0 -0
  459. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_exception_handling.py +0 -0
  460. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_exceptions.py +0 -0
  461. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_filter_pushdown.py +0 -0
  462. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_filter_pushdown_extension.py +0 -0
  463. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_filter_v2.py +0 -0
  464. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_filter_v2_builder.py +0 -0
  465. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_filter_v2_runtime_corpus.py +0 -0
  466. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_filter_v2_spec_schema.py +0 -0
  467. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_fixture_catalog_parity.py +0 -0
  468. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_function_shape_mismatch.py +0 -0
  469. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_function_storage.py +0 -0
  470. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_function_storage_azure_sql.py +0 -0
  471. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_function_storage_cf_do.py +0 -0
  472. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_function_storage_cf_do_integration.py +0 -0
  473. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_function_storage_conformance.py +0 -0
  474. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_cpp_constants.py +0 -0
  475. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_cpp_protocol_name.py +0 -0
  476. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_cpp_protocol_version.py +0 -0
  477. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_cpp_request_builders.py +0 -0
  478. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_cpp_schemas.py +0 -0
  479. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_cpp_secret.py +0 -0
  480. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_csharp.py +0 -0
  481. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_go_schemas.py +0 -0
  482. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_go_types.py +0 -0
  483. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_java_schemas.py +0 -0
  484. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_java_types.py +0 -0
  485. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_protocol_version.py +0 -0
  486. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_rust_request_builders.py +0 -0
  487. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_rust_schemas.py +0 -0
  488. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_rust_types.py +0 -0
  489. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_schemas_cross_lang.py +0 -0
  490. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_ts_client.py +0 -0
  491. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_ts_schemas.py +0 -0
  492. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_ts_types.py +0 -0
  493. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_grant_auth.py +0 -0
  494. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_hosted_protocols.py +0 -0
  495. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_http_demo_storage.py +0 -0
  496. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_http_s3_offload_input.py +0 -0
  497. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_http_s3_offload_output.py +0 -0
  498. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_import_side_effects.py +0 -0
  499. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_landing_discovery.py +0 -0
  500. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_launch_transport.py +0 -0
  501. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_metadata.py +0 -0
  502. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_mypy_consolidated.py +0 -0
  503. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_nest_tensor.py +0 -0
  504. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_otel.py +0 -0
  505. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_projection_enforcement.py +0 -0
  506. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_projection_repro.py +0 -0
  507. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_protocol_classes.py +0 -0
  508. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_resolved_secrets.py +0 -0
  509. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_schema_paths_v2.py +0 -0
  510. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_schema_scoped_functions.py +0 -0
  511. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_schema_utils.py +0 -0
  512. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_serve.py +0 -0
  513. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_setting_secret_annotations.py +0 -0
  514. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_signing_key.py +0 -0
  515. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_split_token.py +0 -0
  516. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_subprocess_transport.py +0 -0
  517. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_table_buffering_function.py +0 -0
  518. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_table_function_dynamic_to_string.py +0 -0
  519. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_tcp_transport.py +0 -0
  520. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_type_bounds.py +0 -0
  521. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_union_argument.py +0 -0
  522. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_wire_record_schema_parity.py +0 -0
  523. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_worker.py +0 -0
  524. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_worker_cli.py +0 -0
  525. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_worker_page.py +0 -0
  526. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_write_results.py +0 -0
  527. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/transactor/__init__.py +0 -0
  528. {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/transactor/test_transactor.py +0 -0
  529. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/__init__.py +0 -0
  530. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_duckdb.py +0 -0
  531. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_storage_profile.py +0 -0
  532. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/__init__.py +0 -0
  533. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  534. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  535. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  536. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  537. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  538. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  539. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  540. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  541. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  542. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
  543. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  544. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  545. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  546. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/window.py +0 -0
  547. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/attach_options.py +0 -0
  548. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/bad_enum.py +0 -0
  549. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/bad_protocol.py +0 -0
  550. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/cancellable.py +0 -0
  551. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/catalog_contents.py +0 -0
  552. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/companion.py +0 -0
  553. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/copy_from.py +0 -0
  554. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/copy_to.py +0 -0
  555. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/global_functions.py +0 -0
  556. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/identity_fixture.py +0 -0
  557. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  558. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  559. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/nest_tensor.py +0 -0
  560. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  561. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  562. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  563. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/__init__.py +0 -0
  564. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/_common.py +0 -0
  565. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
  566. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
  567. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/binary.py +0 -0
  568. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  569. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/geo.py +0 -0
  570. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  571. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  572. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/same_name.py +0 -0
  573. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  574. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  575. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  576. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  577. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/secret_cache.py +0 -0
  578. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/simple_writable.py +0 -0
  579. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/__init__.py +0 -0
  580. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/_common.py +0 -0
  581. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/batch_index.py +0 -0
  582. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  583. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/cache.py +0 -0
  584. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  585. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/filters.py +0 -0
  586. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  587. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/make_series.py +0 -0
  588. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/misc.py +0 -0
  589. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/order_modes.py +0 -0
  590. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/pairs.py +0 -0
  591. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  592. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  593. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  594. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/required_filters.py +0 -0
  595. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
  596. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
  597. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/sequence.py +0 -0
  598. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/settings.py +0 -0
  599. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/splits.py +0 -0
  600. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  601. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  602. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  603. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/versioned.py +0 -0
  604. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/wide.py +0 -0
  605. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table_in_out.py +0 -0
  606. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
  607. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/twin_catalogs.py +0 -0
  608. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/versioned.py +0 -0
  609. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/versioned_tables.py +0 -0
  610. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/writable/__init__.py +0 -0
  611. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/writable/generic.py +0 -0
  612. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/writable/table.py +0 -0
  613. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/writable/worker.py +0 -0
  614. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/aggregate_function.py +0 -0
  615. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/argument_spec.py +0 -0
  616. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/arguments.py +0 -0
  617. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/attach_header.py +0 -0
  618. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/auth.py +0 -0
  619. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/cache_control.py +0 -0
  620. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/__init__.py +0 -0
  621. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/_descriptor_spec.py +0 -0
  622. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/catalog_interface.py +0 -0
  623. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/descriptors.py +0 -0
  624. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/duckdb_statistics.py +0 -0
  625. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/secret_type.py +0 -0
  626. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/setting.py +0 -0
  627. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/storage.py +0 -0
  628. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/aggregate.py +0 -0
  629. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/catalog_mixin.py +0 -0
  630. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/cli.py +0 -0
  631. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/cli_catalog.py +0 -0
  632. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/cli_schema.py +0 -0
  633. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/cli_table.py +0 -0
  634. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/cli_transaction.py +0 -0
  635. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/cli_utils.py +0 -0
  636. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/cli_view.py +0 -0
  637. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/errors.py +0 -0
  638. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/__init__.py +0 -0
  639. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/_common.py +0 -0
  640. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_constants.py +0 -0
  641. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_protocol_name.py +0 -0
  642. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_protocol_version.py +0 -0
  643. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_request_builders.py +0 -0
  644. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_schemas.py +0 -0
  645. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  646. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  647. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_secret_schemas.py +0 -0
  648. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/csharp_schemas.py +0 -0
  649. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/csharp_types.py +0 -0
  650. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/go_schemas.py +0 -0
  651. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/go_types.py +0 -0
  652. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/java_schemas.py +0 -0
  653. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/java_types.py +0 -0
  654. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/protocol_version.py +0 -0
  655. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/rust_request_builders.py +0 -0
  656. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/rust_schemas.py +0 -0
  657. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/rust_types.py +0 -0
  658. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/ts_client.py +0 -0
  659. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/ts_schemas.py +0 -0
  660. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/ts_types.py +0 -0
  661. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/copy_from_function.py +0 -0
  662. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/copy_to_function.py +0 -0
  663. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/filter_v2.py +0 -0
  664. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/filter_v2_builder.py +0 -0
  665. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/function.py +0 -0
  666. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/function_storage.py +0 -0
  667. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/function_storage_azure_sql.py +0 -0
  668. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/function_storage_cf_do.py +0 -0
  669. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/http/__init__.py +0 -0
  670. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/http/demo_storage.py +0 -0
  671. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/http/landing.html +0 -0
  672. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/http/landing_page.py +0 -0
  673. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/http/vgi-client.js +0 -0
  674. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/http/worker_page.py +0 -0
  675. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/invocation.py +0 -0
  676. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/logging_config.py +0 -0
  677. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/metadata.py +0 -0
  678. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/otel.py +0 -0
  679. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/profiling.py +0 -0
  680. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/protocol.py +0 -0
  681. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/protocol_version.txt +0 -0
  682. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/py.typed +0 -0
  683. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/scalar_function.py +0 -0
  684. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/schema_path.py +0 -0
  685. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/schema_utils.py +0 -0
  686. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/secret_protocol.py +0 -0
  687. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/secret_service.py +0 -0
  688. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/split_token.py +0 -0
  689. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/table_buffering_function.py +0 -0
  690. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/table_filter_pushdown.py +0 -0
  691. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/table_function.py +0 -0
  692. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/table_in_out_function.py +0 -0
  693. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/transactor/__init__.py +0 -0
  694. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/transactor/_duckdb_compat.py +0 -0
  695. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/transactor/client.py +0 -0
  696. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/transactor/protocol.py +0 -0
  697. {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/write_results.py +0 -0
  698. {vgi_python-0.42.1 → vgi_python-0.43.1}/wrangler.jsonc +0 -0
@@ -96,9 +96,13 @@ e.g. to pass an unusual filter to `unittest`):
96
96
  ```bash
97
97
  cd ~/Development/vgi
98
98
  VGI_TEST_WORKER="uv run --project ~/Development/vgi-python vgi-fixture-worker" \
99
- ./build/release/test/unittest "test/sql/integration/*"
99
+ ./build/release/test/unittest --test-config test/configs/no_error_skip.json "test/sql/integration/*"
100
100
  ```
101
101
 
102
+ Always pass `--test-config test/configs/no_error_skip.json` to `unittest`: without
103
+ it, DuckDB's runner reports any error mentioning "HTTP" or "Unable to connect" as
104
+ a SKIP and exits 0.
105
+
102
106
  **HTTP transport** (worker as an HTTP server):
103
107
  ```bash
104
108
  cd ~/Development/vgi
@@ -142,7 +146,7 @@ with elapsed milliseconds. This helps identify slow queries and bottlenecks.
142
146
  # Timing output goes to stderr, grep for the bracket-prefixed lines:
143
147
  cd ~/Development/vgi
144
148
  VGI_TEST_WORKER="uv run --project ~/Development/vgi-python vgi-fixture-worker" \
145
- ./build/release/test/unittest "test/sql/integration/table/writable_table*" \
149
+ ./build/release/test/unittest --test-config test/configs/no_error_skip.json "test/sql/integration/table/writable_table*" \
146
150
  2>&1 | grep "^\[stmt\|^\[query" | sort -t']' -k2 -rn
147
151
  ```
148
152
 
@@ -166,7 +170,7 @@ uv run coverage run -m pytest --no-cov -n auto
166
170
  # 3. Run DuckDB subprocess integration tests with coverage
167
171
  cd ~/Development/vgi
168
172
  VGI_TEST_WORKER="/tmp/vgi-coverage-worker.sh" \
169
- ./build/release/test/unittest "test/sql/integration/*"
173
+ ./build/release/test/unittest --test-config test/configs/no_error_skip.json "test/sql/integration/*"
170
174
 
171
175
  # 4. Run DuckDB HTTP integration tests with coverage
172
176
  cd ~/Development/vgi
@@ -503,6 +507,20 @@ one. Allowlist rules are unchanged. See `docs/authentication.md` and
503
507
  `tests/test_grant_auth.py`, which also runs the shared
504
508
  `grant_token_vectors.json` through `create_app`.
505
509
 
510
+ ### Attach Tickets (`vgi.attach_tickets.v1`)
511
+
512
+ `seal_attach` seals a user's ATTACH (catalog name, options incl. secrets,
513
+ version specs) into a `vgia1.` ticket under `VGI_SIGNING_KEY`, AAD
514
+ `"vgi.attach_ticket.v1\0" + principal` (principal only, not domain). A runner
515
+ holding the user's grant reattaches with the single option `vgi_attach_ticket`;
516
+ `Worker.catalog_attach` (and `MetaWorker`, before routing) redeems it before any
517
+ catalog code. Hosted on HTTP only, only with an explicitly configured signing key
518
+ (`signing_key_configured` in `build_rpc_server`; a minted key never counts) and
519
+ the ability to issue grants. `vgi_attach_ticket` is a reserved attach-option
520
+ name. Code: `vgi/attach_ticket.py`; spec: `docs/protocol/vgi-attach-tickets.md`;
521
+ vectors: `vgi/_test_fixtures/attach_ticket_vectors.json` (regenerate with
522
+ `scripts/gen_attach_ticket_vectors.py`); fixture catalog: `ticket_probe`.
523
+
506
524
  ### Hosting Additional Protocols (`hosted_protocols`)
507
525
 
508
526
  Every transport (stdio, unix/named pipe, TCP, Iroh, HTTP) builds its `RpcServer`
@@ -523,6 +541,15 @@ hook. `MetaWorker` hosts its children's lists concatenated. Identity is not
523
541
  supplied through this hook. It stays opt-in via `resolve_token`/`mint_grant`
524
542
  and is hosted on HTTP only. See `docs/api/worker.md`.
525
543
 
544
+ Client side, `Client.list_protocols()` returns the hosted set as
545
+ `vgi_rpc.HostedProtocol` (re-exported from `vgi.client`) in server order, over
546
+ any transport, and `Client.describe_protocol(name)` returns one protocol's
547
+ methods. Both are thin wrappers over vgi-rpc's public `list_protocols` /
548
+ `describe_protocol` on the primary proxy (no private vgi-rpc imports). A worker
549
+ without reflection (`ReflectionNotSupportedError`) yields
550
+ `[HostedProtocol("vgi.v2", "", "")]` rather than an error. Tests: `tests/test_client_reflection.py`; cross-language coverage is the
551
+ C++ repo's `test/sql/integration/reflection/`. See `docs/api/client.md`.
552
+
526
553
  ### Access Log Sampling and Async Emission
527
554
 
528
555
  `--access-log-sample 0.05` keeps 5% of *successful* calls. Errors are always
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vgi-python
3
- Version: 0.42.1
3
+ Version: 0.43.1
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.49.0
165
+ Requires-Dist: vgi-rpc>=0.50.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'
@@ -336,6 +336,13 @@ EOF
336
336
  "$HAYBARN_UNITTEST" "test/_warm.test" >/dev/null 2>&1 || echo "::warning::extension warm step did not fully succeed"
337
337
  rm -f "$STAGE/test/_warm.test"
338
338
 
339
+ # DuckDB's sqllogictest runner, given no --test-config, turns any error whose
340
+ # text contains "HTTP" or "Unable to connect" into a SKIP and exits 0. Over the
341
+ # http transport every worker error carries "HTTP", so real failures read as
342
+ # skips. The extension ships a config that disables that; every run below uses it.
343
+ TEST_CONFIG="$VGI_SRC/test/configs/no_error_skip.json"
344
+ [ -f "$TEST_CONFIG" ] || { echo "::error::missing $TEST_CONFIG (VGI_REF predates it?)"; exit 1; }
345
+
339
346
  # Run the lane, streaming the native sqllogictest report (a progress line per
340
347
  # file + the final "All tests passed (.. N assertions ..)" summary). Out-of-scope
341
348
  # tests were dropped at staging; any failed assertion exits non-zero.
@@ -366,7 +373,7 @@ run_unittest() {
366
373
  # `set +e` rather than `|| true`: the latter runs before PIPESTATUS is read and
367
374
  # overwrites it with true's 0, silently swallowing every real test failure.
368
375
  set +e
369
- "$HAYBARN_UNITTEST" "$@" 2>&1 | tee "$log"
376
+ "$HAYBARN_UNITTEST" --test-config "$TEST_CONFIG" "$@" 2>&1 | tee "$log"
370
377
  rc="${PIPESTATUS[0]}"
371
378
  set -e
372
379
  if grep -q 'due to a fatal error condition' "$log"; then
@@ -0,0 +1,38 @@
1
+ # Client
2
+
3
+ The Python `Client` spawns or connects to a worker, streams Arrow data to and from its functions,
4
+ and surfaces errors as `ClientError`. It is the pure-Python counterpart to the DuckDB extension.
5
+
6
+ ## Discovering hosted protocols
7
+
8
+ Every worker hosts the vgi-rpc reflection protocol, `vgi_rpc.Reflection.v1`, on every transport.
9
+ `Client.list_protocols()` asks it what the worker hosts, in the worker's order: `vgi.v2` first,
10
+ then any protocols the worker adds through `Worker.hosted_protocols()`, then the framework's own.
11
+ Each entry is a `HostedProtocol` (vgi-rpc's, re-exported from `vgi.client`) with `name`,
12
+ `version`, `hash`, `deprecated`, `deprecation_message` and `features`. The hash is a SHA-256 hex digest of the
13
+ protocol's canonical description, so two equal hashes mean the same method surface.
14
+ `Client.describe_protocol(name)` returns one protocol's methods and schemas as a
15
+ `vgi_rpc.ServiceDescription`. Both are thin wrappers over vgi-rpc's `list_protocols(proxy)` /
16
+ `describe_protocol(proxy, name)` on the client's primary connection.
17
+
18
+ ```python test="skip"
19
+ from vgi.client import Client
20
+
21
+ with Client("vgi-fixture-worker") as client:
22
+ hosted = {p.name for p in client.list_protocols()}
23
+ if "conformance.Secondary.v1" in hosted:
24
+ print(client.describe_protocol("conformance.Secondary.v1"))
25
+ ```
26
+
27
+ A worker that does not host reflection (one built before it existed answers `UNIMPLEMENTED` /
28
+ `protocol_not_supported`, which vgi-rpc raises as `ReflectionNotSupportedError`) is not an
29
+ error for `list_protocols()`. It returns the single entry
30
+ `HostedProtocol("vgi.v2", "", "")`, because `vgi.v2` is the one protocol every worker hosts. The
31
+ empty hash marks the entry as inferred rather than reported.
32
+
33
+ Both calls use the client's primary connection. Do not call them while a stream is open on
34
+ the same client.
35
+
36
+ ## API reference
37
+
38
+ ::: vgi.client
@@ -86,6 +86,10 @@ Identity stays framework-owned. You enable it by overriding
86
86
  only on HTTP, which authenticates callers. Its introspection allowlist names principals, and the
87
87
  other transports have no principals to check.
88
88
 
89
+ `vgi.attach_tickets.v1` is framework-owned too. It is hosted on HTTP only, and only when
90
+ `VGI_SIGNING_KEY` is configured explicitly and the worker can issue grants (grant keys, or its own
91
+ `mint_grant`). See [Attach tickets](../protocol/vgi-attach-tickets.md).
92
+
89
93
  ## Worker
90
94
 
91
95
  ::: vgi.worker
@@ -97,3 +101,7 @@ other transports have no principals to check.
97
101
  ## Serving
98
102
 
99
103
  ::: vgi.serve
104
+
105
+ ## Attach tickets
106
+
107
+ ::: vgi.attach_ticket
@@ -351,6 +351,8 @@ ATTACH 'mydb' (TYPE vgi, LOCATION 'https://worker.example.com', api_key getenv('
351
351
 
352
352
  On the wire, `required` and `secret` are nullable boolean columns appended after the four shared spec columns (`name`, `description`, `type`, `default_value`), in that order. Readers look columns up by name, so a spec from a peer that predates either column reads it as `false`, and older peers ignore columns they don't know.
353
353
 
354
+ **Never put a secret option's value in `attach_opaque_data`.** On HTTP the worker seals the value, but over stdio and a unix socket it reaches the client, and the DuckDB extension, unsealed. Keep the credential server-side, re-derive it per call, or store a digest of it, as the `ticket_probe` fixture does (see [Opaque values: sealing](protocol/vgi-opaque-data-sealing.md), rule 5).
355
+
354
356
  `secret` does not change what the worker itself logs: attach options are never logged unless the catalog opts in through `loggable_attach_options()` (below), which must never return a secret option.
355
357
 
356
358
  ---
@@ -0,0 +1,329 @@
1
+ # VGI Attach Tickets
2
+
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`.
5
+ **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
+
7
+ An SDK implements attach tickets from this page alone. The words MUST, MUST
8
+ NOT and SHOULD are used as in RFC 2119.
9
+
10
+ ## 1. Purpose
11
+
12
+ An attach ticket lets a runner reattach a user's catalog later, as that user,
13
+ without ever seeing the user's attach options. While the user is attached and
14
+ logged in, the client calls `seal_attach` on the worker. The worker seals the
15
+ options the user attached with, secret ones included, into a ticket that only
16
+ this worker can open. Later a runner attaches with one option,
17
+ `vgi_attach_ticket`, and the worker restores the original attach before any
18
+ catalog code runs.
19
+
20
+ A ticket says *what* to attach. A sealed grant (`vgi_rpc.Identity.v1`
21
+ `issue_grant`) says *who* attaches. The two are separate on purpose:
22
+
23
+ - **A ticket carries no authority.** It opens only under the caller's
24
+ principal, so it attaches nothing without a grant (or login) for the same
25
+ principal. Issuing one needs no fresh login, and a leaked ticket alone
26
+ exposes nothing usable.
27
+ - **A ticket adds no authentication path.** Secret options never enter
28
+ `AuthContext`.
29
+
30
+ ## 2. Token format
31
+
32
+ ```
33
+ ticket = "vgia1." base64url_nopad( envelope )
34
+ envelope = version(1) = 0x01 || nonce(24) || XChaCha20-Poly1305(key, nonce, payload, aad) ; ciphertext || tag(16)
35
+ key = normalize(VGI_SIGNING_KEY)
36
+ aad = "vgi.attach_ticket.v1" 0x00 || UTF-8(principal)
37
+ ```
38
+
39
+ - **Envelope.** The same XChaCha20-Poly1305 construction and
40
+ `version || nonce || ciphertext || tag` layout every SDK already uses to seal
41
+ `attach_opaque_data` (vgi-rpc's `crypto.seal_bytes`). The version byte is
42
+ `0x01`, fixed by this format and independent of the attach envelope's own
43
+ version. The nonce MUST be 24 fresh random bytes per ticket.
44
+ - **Key.** The worker's `VGI_SIGNING_KEY`, as bytes (the UTF-8 of the
45
+ environment value), normalized exactly as for the attach envelope: a 32-byte
46
+ key is used as-is; any other length is replaced by `SHA-256(key)`.
47
+ - **AAD.** The **principal only**. The attach envelope binds
48
+ `(auth domain, principal)`; a ticket MUST NOT, because it is sealed while the
49
+ user is logged in (domain `jwt`, say) and opened when a runner presents their
50
+ grant (domain `grant`). The principal is the same in both, since a grant is
51
+ minted for its caller's principal. The distinct AAD prefix means an attach
52
+ envelope never opens as a ticket, nor the reverse.
53
+ - **Encoding.** Unpadded base64url (RFC 4648 §5). Only the canonical spelling
54
+ is valid: no `=`, no `+` or `/`, length mod 4 ≠ 1, and zero trailing bits
55
+ (re-encoding the decoded bytes MUST give the same text).
56
+ - **Size.** A verifier refuses a ticket longer than 32768 characters before
57
+ decoding it.
58
+
59
+ ### 2.1 Payload
60
+
61
+ All integers little-endian. A *string* is a `u16` byte length followed by
62
+ that many bytes of UTF-8.
63
+
64
+ | # | Field | Encoding | Rule |
65
+ | --- | --- | --- | --- |
66
+ | 1 | `issued_at` | int64 | Unix seconds |
67
+ | 2 | `expires_at` | int64 | Unix seconds; `0` means no expiry; otherwise `> issued_at` |
68
+ | 3 | `ticket_id` | string | Exactly 32 lowercase hex characters (16 random bytes) |
69
+ | 4 | `catalog_name` | string | Non-empty |
70
+ | 5 | `data_version_spec` | string | `""` means none (`null` on the wire) |
71
+ | 6 | `implementation_version` | string | `""` means none (`null` on the wire) |
72
+ | 7 | `options` | `u32` length + bytes | Arrow IPC stream of the one-row options record, exactly as `CatalogAttachRequest.options` carries it; length `0` means no options; at most 16384 bytes |
73
+
74
+ The options bytes are opaque to the ticket format. A port seals the bytes it
75
+ received (or its own serialization of the same record) and, on redemption,
76
+ deserializes them as it would `CatalogAttachRequest.options`.
77
+
78
+ ## 3. Verifying a ticket
79
+
80
+ Steps in this order. Every failure before step 6 is
81
+ `attach_ticket_invalid`, with no distinction between causes.
82
+
83
+ 1. **Prefix.** The text starts with `vgia1.`.
84
+ 2. **Length.** At most 32768 characters.
85
+ 3. **Base64url.** The remainder is canonical unpadded base64url (§2).
86
+ 4. **Caller.** The caller is authenticated and has a non-empty principal.
87
+ An anonymous caller never opens a ticket.
88
+ 5. **Open.** Open the envelope with the worker's key and
89
+ `aad = "vgi.attach_ticket.v1" 0x00 || UTF-8(caller principal)`, expecting
90
+ version `0x01`. Any failure (short envelope, wrong version, wrong key, wrong
91
+ principal, tampering) is `attach_ticket_invalid`. **There is no separate
92
+ principal comparison:** the AAD is the check.
93
+ 6. **Parse.** Strictly, per §2.1: exact lengths, strict UTF-8, no trailing
94
+ bytes, the field rules in the table. Failure is `attach_ticket_invalid`.
95
+ 7. **Lifetime.** With `skew = 60` seconds and `now` the current Unix time:
96
+ `issued_at > now + skew` (not yet valid) or, when `expires_at ≠ 0`,
97
+ `now ≥ expires_at + skew` (expired) is `attach_ticket_expired`.
98
+
99
+ The lifetime is inside the ciphertext, so it is trusted only after step 5.
100
+ `attach_ticket_expired` is therefore only ever reported for an authentic
101
+ ticket presented by its own principal.
102
+
103
+ ## 4. Errors
104
+
105
+ Errors use vgi-rpc's error model: `vgi_rpc.error_code`, `vgi_rpc.error_kind`
106
+ and `vgi_rpc.error_details`.
107
+
108
+ | `error_kind` | `error_code` | Details | When |
109
+ | --- | --- | --- | --- |
110
+ | `attach_ticket_invalid` | `INVALID_ARGUMENT` | `BadRequest`, field `vgi_attach_ticket` | §3 steps 1–6, a non-string ticket value, or a worker without a signing key |
111
+ | `attach_ticket_expired` | `FAILED_PRECONDITION` | `PreconditionFailure`, type `ATTACH_TICKET`, subject `vgi_attach_ticket` | §3 step 7 |
112
+ | `invalid_request` | `INVALID_ARGUMENT` | `BadRequest`, one violation per bad field | Another option beside the ticket (§6); a `seal_attach` request that fails validation (§5.3) |
113
+ | `action_denied` | `PERMISSION_DENIED` | `ErrorInfo`, `metadata.action = "seal_attach"` | Anonymous `seal_attach`, or a worker refusing by policy |
114
+
115
+ No error message, log line or detail ever contains the ticket text or a
116
+ restored option value.
117
+
118
+ ## 5. `vgi.attach_tickets.v1`
119
+
120
+ ### 5.1 Hosting
121
+
122
+ A worker hosts the protocol when **all** of these hold, and otherwise does not
123
+ host it at all (absent, not hosted-and-refusing, so a client learns the answer
124
+ from `vgi_rpc.Reflection.v1` `list_protocols`):
125
+
126
+ 1. The transport is HTTP. Other transports have no caller identity.
127
+ 2. `VGI_SIGNING_KEY` is configured explicitly. A key the process generated for
128
+ itself MUST NOT enable the protocol: every ticket would die on restart. (A
129
+ pre-fork server that generates one key and hands it to its children marks
130
+ it as generated; vgi-python uses the private `VGI_SIGNING_KEY_MINTED=1`.)
131
+ 3. The worker can issue grants: grant keys are configured
132
+ (`VGI_RPC_GRANT_KEYS`) or the worker supplies its own `mint_grant`. A ticket
133
+ is useless without a grant.
134
+
135
+ 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"`.
137
+
138
+ ### 5.2 Shapes
139
+
140
+ One unary method, `seal_attach(request: SealAttachRequest) -> AttachTicket`.
141
+
142
+ `SealAttachRequest`:
143
+
144
+ | Field | Arrow type | Meaning |
145
+ | --- | --- | --- |
146
+ | `catalog_name` | `utf8` not null | The catalog the caller attached |
147
+ | `options` | `binary` nullable | Arrow IPC stream of the one-row options record, as `CatalogAttachRequest.options`; null for none |
148
+ | `data_version_spec` | `utf8` not null | As given at ATTACH; `""` for none |
149
+ | `implementation_version` | `utf8` not null | As given at ATTACH; `""` for none |
150
+ | `ttl_seconds` | `int64` not null | Requested lifetime; `0` = as long as the worker allows |
151
+
152
+ `AttachTicket`:
153
+
154
+ | Field | Arrow type | Meaning |
155
+ | --- | --- | --- |
156
+ | `ticket` | `utf8` not null | The `vgia1.` text |
157
+ | `expires_at` | `float64` not null | Unix seconds; `+inf` when the ticket has no expiry |
158
+
159
+ ### 5.3 Rules
160
+
161
+ In this order:
162
+
163
+ 1. **Caller.** Anonymous (unauthenticated, or no principal) is
164
+ `action_denied`. The principal sealed is always the caller's; there is no
165
+ subject parameter.
166
+ 2. **No freshness requirement.** Unlike `issue_grant`, a stale login may seal.
167
+ 3. **Validation**, all violations reported together as `invalid_request`
168
+ with one `BadRequest` field violation each:
169
+ - `ttl_seconds < 0` → field `ttl_seconds`.
170
+ - `options` with more than one row → field `options`. Zero rows or null
171
+ means no options.
172
+ - `catalog_name` not among the worker's catalogs (`catalog_catalogs`) →
173
+ field `catalog_name`.
174
+ - An option whose name (case-insensitive) is `vgi_attach_ticket` → field
175
+ `options.<name>`.
176
+ - An option the catalog does not declare in its `attach_option_specs`
177
+ (names compared case-insensitively) → field `options.<name>`.
178
+ - A declared `required` option missing → field `options.<spec name>`.
179
+ - Options larger than 16384 bytes once serialized → field `options`.
180
+
181
+ Validation never attaches: it has no side effects. Option *values* are not
182
+ type-checked here; the catalog checks them when the ticket is redeemed.
183
+ 4. **Lifetime.** Let `max` be the worker's grant maximum lifetime: the grant
184
+ keys' `max_ttl_seconds` when grant keys are configured, otherwise
185
+ `VGI_RPC_GRANT_MAX_TTL_SECONDS` when set, otherwise none.
186
+ `issued_at = now` (integer seconds), and
187
+
188
+ | `ttl_seconds` | `max` set | `expires_at` |
189
+ | --- | --- | --- |
190
+ | `0` | yes | `issued_at + max` |
191
+ | `0` | no | `0` (no expiry) |
192
+ | `> 0` | yes | `issued_at + min(ttl_seconds, max)` |
193
+ | `> 0` | no | `issued_at + ttl_seconds` |
194
+
195
+ So the two halves of a held entry (grant and ticket) expire together.
196
+ 5. **Seal** per §2 with a fresh `ticket_id` and nonce. Return the text and
197
+ `expires_at` (`+inf` for `0`).
198
+
199
+ A worker MAY refuse by policy with `action_denied`.
200
+
201
+ ## 6. Redeeming: what `catalog_attach` does
202
+
203
+ When a `vgi.v2` `catalog_attach` request's options contain a key equal,
204
+ case-insensitively, to `vgi_attach_ticket`, the SDK framework, before any
205
+ catalog code:
206
+
207
+ 1. **Rejects any other option alongside it** — including a second spelling of
208
+ the ticket key — as `invalid_request`, one `BadRequest` violation
209
+ `options.<name>` per extra option. The sealed options are authoritative, so
210
+ there is nothing to merge. This check comes before the ticket is opened.
211
+ 2. **Verifies the ticket** per §3 under the caller's principal and the
212
+ worker's signing key. A non-string value, or a worker with no signing key
213
+ (subprocess and unix transports), is `attach_ticket_invalid`.
214
+ 3. **Replaces the request** with the one the user originally made:
215
+ `name = catalog_name`, `options =` the sealed options (null when length
216
+ 0), `data_version_spec` / `implementation_version =` the sealed strings
217
+ (null when `""`). `client_capabilities` is kept from the incoming request.
218
+ The incoming `name` is ignored.
219
+ 4. **Proceeds as a normal attach** with the restored request: the catalog's
220
+ own `catalog_attach` runs unchanged, sealing of `attach_opaque_data`,
221
+ lifecycle logging (`loggable_attach_options` sees the restored options as
222
+ usual) and tracing all behave as if the user had typed it.
223
+
224
+ A worker composing several catalogs (vgi-python's `MetaWorker`) redeems
225
+ **before** routing, so the sealed catalog name, not the request's name, picks
226
+ the catalog.
227
+
228
+ **Reserved name.** `vgi_attach_ticket` is reserved: declaring an attach option
229
+ with that name (compared case-insensitively) MUST fail at worker startup.
230
+
231
+ **Never logged.** Neither the ticket nor the restored options (beyond what
232
+ `loggable_attach_options` returns) may reach a log, span, breadcrumb or error.
233
+
234
+ **Principal namespaces.** A ticket sealed for `alice` opens for any caller
235
+ whose principal is `alice`, whatever authenticated them. That is already true
236
+ of grants. A deployment whose authenticators map one string to different
237
+ people has that problem today; tickets do not add it.
238
+
239
+ **Key rotation.** Tickets live as long as `VGI_SIGNING_KEY` does. Rotating it
240
+ invalidates every ticket, as it already invalidates attach envelopes.
241
+
242
+ ## 7. Fixture catalog: `ticket_probe`
243
+
244
+ Every SDK's fixture worker serves this catalog identically (in vgi-python,
245
+ `vgi/_test_fixtures/ticket_probe.py`, in both `vgi-fixture-worker` and
246
+ `vgi-fixture-http`). The cross-SDK sqllogictests in
247
+ `vgi/test/sql/integration/attach_ticket/` run against it.
248
+
249
+ - Catalog `ticket_probe`, default schema `main`.
250
+ - Attach options, in this order:
251
+
252
+ | Name | Type | Required | Secret | Default |
253
+ | --- | --- | --- | --- | --- |
254
+ | `region` | `VARCHAR` | no | no | `'us-east-1'` |
255
+ | `api_key` | `VARCHAR` | **yes** | **yes** | none |
256
+
257
+ - Table `main.probe`, backed by the table function `main.ticket_probe` (no
258
+ arguments). Exactly one row:
259
+
260
+ | Column | Type | Value |
261
+ | --- | --- | --- |
262
+ | `region` | `VARCHAR` | The attached `region`, or `'us-east-1'` |
263
+ | `api_key_sha256` | `VARCHAR` | The first 12 lowercase hex characters of `SHA-256(UTF-8(api_key))` |
264
+
265
+ The key itself is never returned. Option names are matched
266
+ case-insensitively.
267
+
268
+ - Attaching without `api_key` fails (the option is required). So a reattach
269
+ with nothing but `vgi_attach_ticket` reading the same row proves the secret
270
+ took effect without travelling again.
271
+
272
+ For example, `api_key = 'sk-test-0123456789'` reads back as
273
+ `api_key_sha256 = '0d3b56072291'`.
274
+
275
+ ### 7.1 Fixture HTTP server
276
+
277
+ The fixture HTTP server hosts `vgi.attach_tickets.v1` when started with both:
278
+
279
+ ```bash
280
+ VGI_SIGNING_KEY=<any stable value> \
281
+ VGI_RPC_GRANT_KEYS=<base64 of 32 bytes> \
282
+ vgi-fixture-http
283
+ ```
284
+
285
+ Its default test authenticator accepts `Bearer vgi-test-alice` (principal
286
+ `alice`) and `Bearer vgi-test-bob` (principal `bob`) as **fresh** logins (it
287
+ stamps `auth_time = now`), so a client can `issue_grant` with nothing but a
288
+ bearer token. When grant keys are configured, a `Bearer vgig1.…` falls
289
+ through to the sealed-grant authenticator; any other unknown bearer stays
290
+ anonymous as before.
291
+
292
+ ## 8. Vectors
293
+
294
+ `attach_ticket_vectors.json` pins the format byte for byte. Every SDK's unit
295
+ tests MUST consume it. Keys and options are standard base64; nonces and
296
+ payloads are hex. `defaults` supplies `signing_key_b64` and `now` for cases
297
+ that omit them.
298
+
299
+ | Section | Each case gives | A port must |
300
+ | --- | --- | --- |
301
+ | `mint` | key, principal, catalog, options bytes, version specs, `issued_at`, `expires_at`, `ticket_id`, `nonce_hex`, plus `aad_hex`, `payload_hex` and `token` | Seal with exactly these inputs and produce exactly `payload_hex`, `aad_hex` and `token` |
302
+ | `accept` | `token`, `principal`, `now` | Open it and produce exactly `claims` (options compared as bytes) |
303
+ | `reject` | `token`, `principal`, optional `now` / key | Refuse it with exactly `error_kind` |
304
+ | `redeem` | the incoming options map (strings), `principal` | Apply §6 and either produce `result` (catalog name, version specs, decoded options; `null` means the request is untouched) or refuse with `error_kind` |
305
+
306
+ The reject cases cover a wrong principal, an anonymous caller, a principal
307
+ differing only in case, tampering, another worker's key, expiry and
308
+ not-yet-valid (with the 60 s skew edges in `accept`), an attach envelope
309
+ presented as a ticket (both as minted and re-sealed with the ticket version
310
+ byte), a `(domain, principal)` AAD, non-canonical / padded / standard-alphabet
311
+ base64, wrong and missing prefixes, short and over-long tickets, trailing,
312
+ truncated and overrunning payloads, oversize options, bad ticket ids, an empty
313
+ or non-UTF-8 catalog name, and an empty lifetime.
314
+
315
+ The file is generated by `scripts/gen_attach_ticket_vectors.py`; vgi-python's
316
+ `tests/test_attach_ticket.py` fails if the two drift.
317
+
318
+ ## 9. Porting checklist
319
+
320
+ Each of these, removed, MUST turn a test red in your SDK:
321
+
322
+ - The principal in the AAD (or swapping in the attach envelope's
323
+ `(domain, principal)` AAD).
324
+ - The expiry check.
325
+ - The "no other option beside the ticket" rule.
326
+ - Redeeming before routing, in a worker that composes catalogs.
327
+ - The reserved-name check on attach option declarations.
328
+ - The hosting conditions: no protocol without an explicit key, without the
329
+ ability to issue grants, or off HTTP.