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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (724) hide show
  1. {vgi_python-0.44.0 → vgi_python-0.45.0}/.github/workflows/ci.yml +1 -1
  2. {vgi_python-0.44.0 → vgi_python-0.45.0}/.github/workflows/tailnet-integration.yml +2 -2
  3. {vgi_python-0.44.0 → vgi_python-0.45.0}/CLAUDE.md +5 -3
  4. {vgi_python-0.44.0 → vgi_python-0.45.0}/PKG-INFO +2 -2
  5. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/api/auth.md +1 -1
  6. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/api/worker.md +1 -1
  7. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/authentication.md +1 -1
  8. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/protocol/vgi-attach-tickets.md +9 -5
  9. {vgi_python-0.44.0 → vgi_python-0.45.0}/pyproject.toml +2 -2
  10. {vgi_python-0.44.0 → vgi_python-0.45.0}/scripts/hosted_protocols_conformance.sh +1 -1
  11. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_attach_ticket.py +33 -7
  12. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_cpp_records.py +1 -1
  13. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_grant_auth.py +2 -2
  14. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_hosted_protocols.py +2 -2
  15. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_serve.py +11 -8
  16. {vgi_python-0.44.0 → vgi_python-0.45.0}/uv.lock +317 -204
  17. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/http_server.py +1 -1
  18. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/identity_fixture.py +1 -1
  19. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/attach_ticket.py +16 -7
  20. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/auth.py +1 -1
  21. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/cpp_records.py +0 -27
  22. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/meta_worker.py +1 -1
  23. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/rpc_server.py +6 -6
  24. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/serve.py +1 -1
  25. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/worker.py +6 -4
  26. {vgi_python-0.44.0 → vgi_python-0.45.0}/.dockerignore +0 -0
  27. {vgi_python-0.44.0 → vgi_python-0.45.0}/.gitattributes +0 -0
  28. {vgi_python-0.44.0 → vgi_python-0.45.0}/.github/dependabot.yml +0 -0
  29. {vgi_python-0.44.0 → vgi_python-0.45.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  30. {vgi_python-0.44.0 → vgi_python-0.45.0}/.github/workflows/docs.yml +0 -0
  31. {vgi_python-0.44.0 → vgi_python-0.45.0}/.github/workflows/integration.yml +0 -0
  32. {vgi_python-0.44.0 → vgi_python-0.45.0}/.github/workflows/release.yml +0 -0
  33. {vgi_python-0.44.0 → vgi_python-0.45.0}/.gitignore +0 -0
  34. {vgi_python-0.44.0 → vgi_python-0.45.0}/.python-version +0 -0
  35. {vgi_python-0.44.0 → vgi_python-0.45.0}/.vale.ini +0 -0
  36. {vgi_python-0.44.0 → vgi_python-0.45.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  37. {vgi_python-0.44.0 → vgi_python-0.45.0}/DOCS_REVIEW_RUBRIC.md +0 -0
  38. {vgi_python-0.44.0 → vgi_python-0.45.0}/DOCS_USABILITY_TEST.md +0 -0
  39. {vgi_python-0.44.0 → vgi_python-0.45.0}/LICENSE +0 -0
  40. {vgi_python-0.44.0 → vgi_python-0.45.0}/PROTOCOL.md +0 -0
  41. {vgi_python-0.44.0 → vgi_python-0.45.0}/README.md +0 -0
  42. {vgi_python-0.44.0 → vgi_python-0.45.0}/RELEASE-RUNBOOK.md +0 -0
  43. {vgi_python-0.44.0 → vgi_python-0.45.0}/SECURITY.md +0 -0
  44. {vgi_python-0.44.0 → vgi_python-0.45.0}/ci/README.md +0 -0
  45. {vgi_python-0.44.0 → vgi_python-0.45.0}/ci/preprocess-require.awk +0 -0
  46. {vgi_python-0.44.0 → vgi_python-0.45.0}/ci/run-integration.sh +0 -0
  47. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/README.md +0 -0
  48. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/cases/negative/and-too-few-children.json +0 -0
  49. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/cases/negative/delta-required-upsert.json +0 -0
  50. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/cases/negative/nested-runtime-filter.json +0 -0
  51. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/cases/negative/remove-with-expression.json +0 -0
  52. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/cases/negative/required-runtime-filter.json +0 -0
  53. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/cases/negative/snapshot-nonzero-revision.json +0 -0
  54. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/cases/negative/unknown-document-property.json +0 -0
  55. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/cases/negative/unknown-node.json +0 -0
  56. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/cases/positive/advisory-upsert-delta.json +0 -0
  57. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/cases/positive/boolean-column-predicate.json +0 -0
  58. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/cases/positive/empty-snapshot.json +0 -0
  59. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/cases/positive/nested-required-snapshot.json +0 -0
  60. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/cases/positive/remove-delta.json +0 -0
  61. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/cases/positive/runtime-filter-snapshot.json +0 -0
  62. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/filter-v2.schema.json +0 -0
  63. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/generate_runtime.py +0 -0
  64. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/manifest.json +0 -0
  65. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/run_worker.py +0 -0
  66. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow +0 -0
  67. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow +0 -0
  68. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/arithmetic-add/input.arrow +0 -0
  69. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/arithmetic-multiply/expected.arrow +0 -0
  70. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/arithmetic-multiply/filter.arrow +0 -0
  71. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/arithmetic-multiply/input.arrow +0 -0
  72. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/arithmetic-negate/expected.arrow +0 -0
  73. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow +0 -0
  74. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow +0 -0
  75. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/arithmetic-subtract/expected.arrow +0 -0
  76. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/arithmetic-subtract/filter.arrow +0 -0
  77. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/arithmetic-subtract/input.arrow +0 -0
  78. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/cast-integer-to-double/expected.arrow +0 -0
  79. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/cast-integer-to-double/filter.arrow +0 -0
  80. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/cast-integer-to-double/input.arrow +0 -0
  81. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-distinct_from/expected.arrow +0 -0
  82. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-distinct_from/filter.arrow +0 -0
  83. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-distinct_from/input.arrow +0 -0
  84. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-distinct_from/worker-expected.arrow +0 -0
  85. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-eq/expected.arrow +0 -0
  86. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-eq/filter.arrow +0 -0
  87. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-eq/input.arrow +0 -0
  88. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-eq/worker-expected.arrow +0 -0
  89. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-ge/expected.arrow +0 -0
  90. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-ge/filter.arrow +0 -0
  91. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-ge/input.arrow +0 -0
  92. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-ge/worker-expected.arrow +0 -0
  93. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-gt/expected.arrow +0 -0
  94. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-gt/filter.arrow +0 -0
  95. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-gt/input.arrow +0 -0
  96. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-gt/worker-expected.arrow +0 -0
  97. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-le/expected.arrow +0 -0
  98. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-le/filter.arrow +0 -0
  99. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-le/input.arrow +0 -0
  100. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-le/worker-expected.arrow +0 -0
  101. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-lt/expected.arrow +0 -0
  102. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-lt/filter.arrow +0 -0
  103. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-lt/input.arrow +0 -0
  104. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-lt/worker-expected.arrow +0 -0
  105. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-ne/expected.arrow +0 -0
  106. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-ne/filter.arrow +0 -0
  107. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-ne/input.arrow +0 -0
  108. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-ne/worker-expected.arrow +0 -0
  109. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/expected.arrow +0 -0
  110. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/filter.arrow +0 -0
  111. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/input.arrow +0 -0
  112. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/worker-expected.arrow +0 -0
  113. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/delta-0.arrow +0 -0
  114. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/expected.arrow +0 -0
  115. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/filter.arrow +0 -0
  116. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/input.arrow +0 -0
  117. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/delta-empty-noop/delta-0.arrow +0 -0
  118. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/delta-empty-noop/expected.arrow +0 -0
  119. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/delta-empty-noop/filter.arrow +0 -0
  120. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/delta-empty-noop/input.arrow +0 -0
  121. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-0.arrow +0 -0
  122. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-1.arrow +0 -0
  123. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-2.arrow +0 -0
  124. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/expected.arrow +0 -0
  125. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/filter.arrow +0 -0
  126. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/input.arrow +0 -0
  127. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/empty-snapshot/expected.arrow +0 -0
  128. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/empty-snapshot/filter.arrow +0 -0
  129. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/empty-snapshot/input.arrow +0 -0
  130. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/empty-snapshot/worker-expected.arrow +0 -0
  131. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-cast-type-not-null/filter.arrow +0 -0
  132. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-cast-type-not-null/input.arrow +0 -0
  133. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-column-index/filter.arrow +0 -0
  134. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-column-index/input.arrow +0 -0
  135. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-column-name/filter.arrow +0 -0
  136. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-column-name/input.arrow +0 -0
  137. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/filter.arrow +0 -0
  138. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/input.arrow +0 -0
  139. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/filter.arrow +0 -0
  140. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/input.arrow +0 -0
  141. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-external-column-index/filter.arrow +0 -0
  142. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-external-column-index/input.arrow +0 -0
  143. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-external-column-index/join-keys-0.arrow +0 -0
  144. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-external-column-name/filter.arrow +0 -0
  145. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-external-column-name/input.arrow +0 -0
  146. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-external-column-name/join-keys-0.arrow +0 -0
  147. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-field-non-struct/filter.arrow +0 -0
  148. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-field-non-struct/input.arrow +0 -0
  149. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-in-payload-not-list/filter.arrow +0 -0
  150. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-in-payload-not-list/input.arrow +0 -0
  151. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-in-payload-null-list/filter.arrow +0 -0
  152. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-in-payload-null-list/input.arrow +0 -0
  153. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-invalid-overload/filter.arrow +0 -0
  154. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-invalid-overload/input.arrow +0 -0
  155. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-missing-literal/filter.arrow +0 -0
  156. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-missing-literal/input.arrow +0 -0
  157. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-non-boolean-root/filter.arrow +0 -0
  158. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-non-boolean-root/input.arrow +0 -0
  159. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-unknown-standard-function/filter.arrow +0 -0
  160. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/error-unknown-standard-function/input.arrow +0 -0
  161. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/external-in-nonzero-column/expected.arrow +0 -0
  162. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/external-in-nonzero-column/filter.arrow +0 -0
  163. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/external-in-nonzero-column/input.arrow +0 -0
  164. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/external-in-nonzero-column/join-keys-0.arrow +0 -0
  165. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/external-in-nonzero-column/worker-expected.arrow +0 -0
  166. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/function-contains/expected.arrow +0 -0
  167. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/function-contains/filter.arrow +0 -0
  168. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/function-contains/input.arrow +0 -0
  169. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/function-ends-with/expected.arrow +0 -0
  170. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/function-ends-with/filter.arrow +0 -0
  171. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/function-ends-with/input.arrow +0 -0
  172. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/function-list-contains/expected.arrow +0 -0
  173. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/function-list-contains/filter.arrow +0 -0
  174. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/function-list-contains/input.arrow +0 -0
  175. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/function-starts-with/expected.arrow +0 -0
  176. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/function-starts-with/filter.arrow +0 -0
  177. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/function-starts-with/input.arrow +0 -0
  178. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/in-empty/expected.arrow +0 -0
  179. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/in-empty/filter.arrow +0 -0
  180. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/in-empty/input.arrow +0 -0
  181. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/in-empty/worker-expected.arrow +0 -0
  182. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/in-with-null/expected.arrow +0 -0
  183. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/in-with-null/filter.arrow +0 -0
  184. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/in-with-null/input.arrow +0 -0
  185. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/in-with-null/worker-expected.arrow +0 -0
  186. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/is-not-null/expected.arrow +0 -0
  187. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/is-not-null/filter.arrow +0 -0
  188. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/is-not-null/input.arrow +0 -0
  189. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/is-not-null/worker-expected.arrow +0 -0
  190. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/is-null/expected.arrow +0 -0
  191. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/is-null/filter.arrow +0 -0
  192. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/is-null/input.arrow +0 -0
  193. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/is-null/worker-expected.arrow +0 -0
  194. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/kleene-and/expected.arrow +0 -0
  195. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/kleene-and/filter.arrow +0 -0
  196. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/kleene-and/input.arrow +0 -0
  197. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/kleene-not/expected.arrow +0 -0
  198. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/kleene-not/filter.arrow +0 -0
  199. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/kleene-not/input.arrow +0 -0
  200. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/kleene-or/expected.arrow +0 -0
  201. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/kleene-or/filter.arrow +0 -0
  202. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/kleene-or/input.arrow +0 -0
  203. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/nan-comparison/expected.arrow +0 -0
  204. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/nan-comparison/filter.arrow +0 -0
  205. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/nan-comparison/input.arrow +0 -0
  206. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/negative-zero-membership/expected.arrow +0 -0
  207. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/negative-zero-membership/filter.arrow +0 -0
  208. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/negative-zero-membership/input.arrow +0 -0
  209. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/nested-null-propagation/expected.arrow +0 -0
  210. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/nested-null-propagation/filter.arrow +0 -0
  211. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/nested-null-propagation/input.arrow +0 -0
  212. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/not-in-empty/expected.arrow +0 -0
  213. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/not-in-empty/filter.arrow +0 -0
  214. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/not-in-empty/input.arrow +0 -0
  215. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/not-in-empty/worker-expected.arrow +0 -0
  216. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/not-in-with-null/expected.arrow +0 -0
  217. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/not-in-with-null/filter.arrow +0 -0
  218. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/not-in-with-null/input.arrow +0 -0
  219. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/not-in-with-null/worker-expected.arrow +0 -0
  220. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/session-integer-division/expected.arrow +0 -0
  221. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/session-integer-division/filter.arrow +0 -0
  222. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime/session-integer-division/input.arrow +0 -0
  223. {vgi_python-0.44.0 → vgi_python-0.45.0}/conformance/filter-v2/runtime-manifest.json +0 -0
  224. {vgi_python-0.44.0 → vgi_python-0.45.0}/dist-vgi/.gitignore +0 -0
  225. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/aggregate-functions.md +0 -0
  226. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/api/arguments.md +0 -0
  227. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/api/catalogs.md +0 -0
  228. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/api/client.md +0 -0
  229. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/api/exceptions.md +0 -0
  230. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/api/filters.md +0 -0
  231. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/api/functions.md +0 -0
  232. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/api/http.md +0 -0
  233. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/api/index.md +0 -0
  234. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/api/metadata.md +0 -0
  235. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/api/observability.md +0 -0
  236. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/api/storage.md +0 -0
  237. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/api/transactor.md +0 -0
  238. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/argument-serialization.md +0 -0
  239. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/assets/apple-touch-icon.png +0 -0
  240. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/assets/favicon-16x16.png +0 -0
  241. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/assets/favicon-32x32.png +0 -0
  242. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/assets/favicon.ico +0 -0
  243. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/assets/kinds/aggregate.svg +0 -0
  244. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/assets/kinds/buffering.svg +0 -0
  245. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/assets/kinds/scalar.svg +0 -0
  246. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/assets/kinds/table-in-out.svg +0 -0
  247. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/assets/kinds/table.svg +0 -0
  248. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/assets/logo.png +0 -0
  249. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/assets/social-card.png +0 -0
  250. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/assets/video-thumbnail.jpg +0 -0
  251. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/catalog-interface.md +0 -0
  252. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/cli.md +0 -0
  253. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/column-statistics.md +0 -0
  254. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/concepts/index.md +0 -0
  255. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/contributing-docs.md +0 -0
  256. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/design/reporting-protocols/IMPLEMENTATION.md +0 -0
  257. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/design/reporting-protocols/README.md +0 -0
  258. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/design/reporting-protocols/alerts.md +0 -0
  259. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/design/reporting-protocols/attach-tickets-plan.md +0 -0
  260. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/design/reporting-protocols/credentials.md +0 -0
  261. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/design/reporting-protocols/notify.md +0 -0
  262. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/design/reporting-protocols/prerequisites.md +0 -0
  263. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/design/reporting-protocols/render.md +0 -0
  264. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/design/reporting-protocols/reporting-protocols.html +0 -0
  265. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/design/reporting-protocols/reports.md +0 -0
  266. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/design/reporting-protocols/schedules.md +0 -0
  267. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/design/reporting-protocols/sql_tasks.md +0 -0
  268. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/filter-pushdown.md +0 -0
  269. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/generator-api.md +0 -0
  270. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/global-functions.md +0 -0
  271. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/how-to/catalogs.md +0 -0
  272. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/how-to/function-patterns.md +0 -0
  273. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/how-to/http-auth.md +0 -0
  274. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/how-to/index.md +0 -0
  275. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/how-to/iroh.md +0 -0
  276. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/how-to/pushdown-and-statistics.md +0 -0
  277. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/how-to/state-storage.md +0 -0
  278. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/how-to/tailnet.md +0 -0
  279. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/index.md +0 -0
  280. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/lifecycle.md +0 -0
  281. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/metadata.md +0 -0
  282. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/overrides/main.html +0 -0
  283. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/protocol/index.md +0 -0
  284. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/protocol/vgi-catalog-query-pushdown-design.md +0 -0
  285. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/protocol/vgi-duckdb-filter-adapter.md +0 -0
  286. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/protocol/vgi-filter-encoding-v2-spec.md +0 -0
  287. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/protocol/vgi-opaque-data-sealing.md +0 -0
  288. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/protocol/vgi-protocol-proposed-changes.md +0 -0
  289. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/protocol/vgi-runtime-filter-artifacts.md +0 -0
  290. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/protocol/vgi-secrets.md +0 -0
  291. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/robots.txt +0 -0
  292. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/shared-storage.md +0 -0
  293. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/stylesheets/extra.css +0 -0
  294. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/tutorial/index.md +0 -0
  295. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/tutorial/scalar.md +0 -0
  296. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/tutorial/table.md +0 -0
  297. {vgi_python-0.44.0 → vgi_python-0.45.0}/docs/vgi-logo.png +0 -0
  298. {vgi_python-0.44.0 → vgi_python-0.45.0}/examples/batch_index_worker.py +0 -0
  299. {vgi_python-0.44.0 → vgi_python-0.45.0}/examples/cache_worker.py +0 -0
  300. {vgi_python-0.44.0 → vgi_python-0.45.0}/examples/calc_scalar_worker.py +0 -0
  301. {vgi_python-0.44.0 → vgi_python-0.45.0}/examples/calc_worker.py +0 -0
  302. {vgi_python-0.44.0 → vgi_python-0.45.0}/examples/copy_format_worker.py +0 -0
  303. {vgi_python-0.44.0 → vgi_python-0.45.0}/examples/filter_worker.py +0 -0
  304. {vgi_python-0.44.0 → vgi_python-0.45.0}/examples/greeting_scalar_worker.py +0 -0
  305. {vgi_python-0.44.0 → vgi_python-0.45.0}/examples/row_count_worker.py +0 -0
  306. {vgi_python-0.44.0 → vgi_python-0.45.0}/examples/series_streaming_worker.py +0 -0
  307. {vgi_python-0.44.0 → vgi_python-0.45.0}/examples/sum_worker.py +0 -0
  308. {vgi_python-0.44.0 → vgi_python-0.45.0}/identity.png +0 -0
  309. {vgi_python-0.44.0 → vgi_python-0.45.0}/mkdocs.yml +0 -0
  310. {vgi_python-0.44.0 → vgi_python-0.45.0}/packages/vgi-fixtures/LICENSE +0 -0
  311. {vgi_python-0.44.0 → vgi_python-0.45.0}/packages/vgi-fixtures/README.md +0 -0
  312. {vgi_python-0.44.0 → vgi_python-0.45.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  313. {vgi_python-0.44.0 → vgi_python-0.45.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  314. {vgi_python-0.44.0 → vgi_python-0.45.0}/packages/vgi-fixtures/pyproject.toml +0 -0
  315. {vgi_python-0.44.0 → vgi_python-0.45.0}/scripts/build_reporting_protocols_html.py +0 -0
  316. {vgi_python-0.44.0 → vgi_python-0.45.0}/scripts/gen_attach_ticket_vectors.py +0 -0
  317. {vgi_python-0.44.0 → vgi_python-0.45.0}/scripts/measure_startup.py +0 -0
  318. {vgi_python-0.44.0 → vgi_python-0.45.0}/scripts/regen_generated.py +0 -0
  319. {vgi_python-0.44.0 → vgi_python-0.45.0}/scripts/run_all_tests.sh +0 -0
  320. {vgi_python-0.44.0 → vgi_python-0.45.0}/test-data/generate.sh +0 -0
  321. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/__init__.py +0 -0
  322. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/_hosted_protocols_worker.py +0 -0
  323. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/_http_fixtures.py +0 -0
  324. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/__init__.py +0 -0
  325. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_attach_option.py +0 -0
  326. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_catalog_contents.py +0 -0
  327. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_catalog_interface.py +0 -0
  328. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_client_catalog.py +0 -0
  329. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_client_load_catalog.py +0 -0
  330. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_column_statistics.py +0 -0
  331. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_declarative.py +0 -0
  332. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_example_worker_catalog.py +0 -0
  333. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_integration.py +0 -0
  334. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_required_filters.py +0 -0
  335. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_scan_branches.py +0 -0
  336. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_serialization.py +0 -0
  337. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_setting.py +0 -0
  338. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_storage.py +0 -0
  339. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_time_travel.py +0 -0
  340. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/catalog/test_writable_table.py +0 -0
  341. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/__init__.py +0 -0
  342. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_aggregate_client.py +0 -0
  343. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_batch_metadata_callback.py +0 -0
  344. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_bind_and_join_keys.py +0 -0
  345. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_broken_pipe.py +0 -0
  346. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_cli.py +0 -0
  347. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_cli_catalog_functions.py +0 -0
  348. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_copy_client.py +0 -0
  349. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_http_response_budget.py +0 -0
  350. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_iroh_client.py +0 -0
  351. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_scan_branches_client.py +0 -0
  352. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_split_client.py +0 -0
  353. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_stop_force.py +0 -0
  354. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_table_column_statistics.py +0 -0
  355. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_time_travel_client.py +0 -0
  356. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/client/test_worker_debug.py +0 -0
  357. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/__init__.py +0 -0
  358. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/_stub.py +0 -0
  359. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/conftest.py +0 -0
  360. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_accumulate.py +0 -0
  361. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_aggregate.py +0 -0
  362. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_attach.py +0 -0
  363. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_bearer_auth.py +0 -0
  364. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_const_param_enforcement.py +0 -0
  365. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_container.py +0 -0
  366. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_copy_from.py +0 -0
  367. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_copy_to.py +0 -0
  368. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_directory_parity.py +0 -0
  369. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_function_inventory.py +0 -0
  370. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_github.py +0 -0
  371. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_http_client.py +0 -0
  372. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_http_external_location.py +0 -0
  373. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_http_upload_url.py +0 -0
  374. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_macro.py +0 -0
  375. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_overload.py +0 -0
  376. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_protocol_inventory.py +0 -0
  377. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_protocol_version.py +0 -0
  378. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_resumable_scan.py +0 -0
  379. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_scalar.py +0 -0
  380. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  381. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_secret.py +0 -0
  382. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_settings.py +0 -0
  383. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_splits.py +0 -0
  384. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_table.py +0 -0
  385. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_table_in_out.py +0 -0
  386. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_view.py +0 -0
  387. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conformance/test_writable.py +0 -0
  388. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/conftest.py +0 -0
  389. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
  390. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
  391. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
  392. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/data/split_tokens/bad_version.bin +0 -0
  393. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/data/split_tokens/generate.py +0 -0
  394. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/data/split_tokens/manifest.json +0 -0
  395. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
  396. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/data/split_tokens/stale_anchor.bin +0 -0
  397. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/data/split_tokens/truncated.bin +0 -0
  398. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/data/split_tokens/valid_sealed.bin +0 -0
  399. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/data/split_tokens/valid_unsealed.bin +0 -0
  400. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/scalar/__init__.py +0 -0
  401. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/scalar/test_bernoulli_function.py +0 -0
  402. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/scalar/test_binary_packet_function.py +0 -0
  403. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/scalar/test_client.py +0 -0
  404. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/scalar/test_conditional_message_function.py +0 -0
  405. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/scalar/test_hash_seed_function.py +0 -0
  406. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  407. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/scalar/test_multiply_function.py +0 -0
  408. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/scalar/test_random_bytes_function.py +0 -0
  409. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/scalar/test_return_secret_value_function.py +0 -0
  410. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/sdk_conformance/__init__.py +0 -0
  411. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/sdk_conformance/test_opaque_sealing.py +0 -0
  412. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/sdk_conformance/test_opaque_sealing_stdio.py +0 -0
  413. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/__init__.py +0 -0
  414. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/generator/__init__.py +0 -0
  415. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/generator/test_constant_columns_function.py +0 -0
  416. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/generator/test_double_sequence_function.py +0 -0
  417. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/generator/test_exception_function.py +0 -0
  418. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/generator/test_filter_echo_function.py +0 -0
  419. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/generator/test_logging_function.py +0 -0
  420. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
  421. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/generator/test_partitioned_function.py +0 -0
  422. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/generator/test_projected_data_function.py +0 -0
  423. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/generator/test_sequence_function.py +0 -0
  424. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/generator/test_settings_function.py +0 -0
  425. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/generator/test_struct_settings_function.py +0 -0
  426. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
  427. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table/test_wide_columns.py +0 -0
  428. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table_in_out/__init__.py +0 -0
  429. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table_in_out/generator/__init__.py +0 -0
  430. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  431. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
  432. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  433. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  434. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  435. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
  436. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  437. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table_in_out/test_blended_exchange.py +0 -0
  438. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table_in_out/test_blended_metadata.py +0 -0
  439. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table_in_out/test_client.py +0 -0
  440. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/table_in_out/test_table_buffering_empty_input.py +0 -0
  441. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/tailnet/Dockerfile +0 -0
  442. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/tailnet/__init__.py +0 -0
  443. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/tailnet/compose.yaml +0 -0
  444. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/tailnet/probe.py +0 -0
  445. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/tailnet/run.sh +0 -0
  446. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/tailnet/test_worker.py +0 -0
  447. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/tailnet/worker.py +0 -0
  448. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_access_log_audit.py +0 -0
  449. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_aggregate_function.py +0 -0
  450. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_argument_spec.py +0 -0
  451. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_auth.py +0 -0
  452. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_bind_exceptions.py +0 -0
  453. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_bind_request_at_clause.py +0 -0
  454. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_bound_storage_conformance.py +0 -0
  455. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_cache_control.py +0 -0
  456. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_call_state_attach.py +0 -0
  457. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_catalog_auth_binding.py +0 -0
  458. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_client_oauth.py +0 -0
  459. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_client_reflection.py +0 -0
  460. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_codegen_request_inventory.py +0 -0
  461. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_copy_from_function.py +0 -0
  462. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_copy_to_function.py +0 -0
  463. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_docstrings.py +0 -0
  464. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_documentation_examples.py +0 -0
  465. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_dynamic_filter_http_turns.py +0 -0
  466. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_error_codes.py +0 -0
  467. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_example_function_arg_types.py +0 -0
  468. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_examples_workers.py +0 -0
  469. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_exception_handling.py +0 -0
  470. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_exceptions.py +0 -0
  471. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_filter_pushdown.py +0 -0
  472. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_filter_pushdown_extension.py +0 -0
  473. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_filter_v2.py +0 -0
  474. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_filter_v2_builder.py +0 -0
  475. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_filter_v2_runtime_corpus.py +0 -0
  476. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_filter_v2_spec_schema.py +0 -0
  477. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_fixture_catalog_parity.py +0 -0
  478. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_function_shape_mismatch.py +0 -0
  479. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_function_storage.py +0 -0
  480. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_function_storage_azure_sql.py +0 -0
  481. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_function_storage_cf_do.py +0 -0
  482. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_function_storage_cf_do_integration.py +0 -0
  483. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_function_storage_conformance.py +0 -0
  484. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_function_subclass_check.py +0 -0
  485. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_cpp_constants.py +0 -0
  486. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_cpp_protocol_name.py +0 -0
  487. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_cpp_protocol_version.py +0 -0
  488. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_cpp_request_builders.py +0 -0
  489. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_cpp_schemas.py +0 -0
  490. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_cpp_secret.py +0 -0
  491. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_csharp.py +0 -0
  492. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_go_schemas.py +0 -0
  493. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_go_types.py +0 -0
  494. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_java_schemas.py +0 -0
  495. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_java_types.py +0 -0
  496. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_protocol_version.py +0 -0
  497. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_registry.py +0 -0
  498. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_rust_request_builders.py +0 -0
  499. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_rust_schemas.py +0 -0
  500. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_rust_types.py +0 -0
  501. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_schemas_cross_lang.py +0 -0
  502. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_ts_client.py +0 -0
  503. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_ts_schemas.py +0 -0
  504. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_generated_ts_types.py +0 -0
  505. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_http_demo_storage.py +0 -0
  506. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_http_s3_offload_input.py +0 -0
  507. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_http_s3_offload_output.py +0 -0
  508. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_import_side_effects.py +0 -0
  509. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_landing_discovery.py +0 -0
  510. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_launch_transport.py +0 -0
  511. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_metadata.py +0 -0
  512. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_mypy_consolidated.py +0 -0
  513. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_nest_tensor.py +0 -0
  514. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_otel.py +0 -0
  515. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_projection_enforcement.py +0 -0
  516. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_projection_repro.py +0 -0
  517. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_protocol_classes.py +0 -0
  518. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_resolved_secrets.py +0 -0
  519. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_schema_paths_v2.py +0 -0
  520. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_schema_scoped_functions.py +0 -0
  521. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_schema_utils.py +0 -0
  522. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_setting_secret_annotations.py +0 -0
  523. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_signing_key.py +0 -0
  524. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_split_token.py +0 -0
  525. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_subprocess_transport.py +0 -0
  526. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_table_buffering_function.py +0 -0
  527. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_table_function_dynamic_to_string.py +0 -0
  528. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_table_function_early_close.py +0 -0
  529. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_tcp_transport.py +0 -0
  530. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_type_bounds.py +0 -0
  531. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_union_argument.py +0 -0
  532. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_wire_record_schema_parity.py +0 -0
  533. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_worker.py +0 -0
  534. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_worker_cli.py +0 -0
  535. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_worker_page.py +0 -0
  536. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/test_write_results.py +0 -0
  537. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/transactor/__init__.py +0 -0
  538. {vgi_python-0.44.0 → vgi_python-0.45.0}/tests/transactor/test_transactor.py +0 -0
  539. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/__init__.py +0 -0
  540. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_duckdb.py +0 -0
  541. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_redact.py +0 -0
  542. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_storage_profile.py +0 -0
  543. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/__init__.py +0 -0
  544. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  545. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  546. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  547. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  548. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  549. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  550. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  551. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  552. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  553. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
  554. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  555. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  556. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  557. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
  558. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/attach_options.py +0 -0
  559. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/attach_ticket_vectors.json +0 -0
  560. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/bad_enum.py +0 -0
  561. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
  562. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/cancellable.py +0 -0
  563. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/catalog.py +0 -0
  564. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/catalog_contents.py +0 -0
  565. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/companion.py +0 -0
  566. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/copy_from.py +0 -0
  567. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/copy_to.py +0 -0
  568. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/global_functions.py +0 -0
  569. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  570. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  571. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
  572. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  573. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  574. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  575. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
  576. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
  577. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
  578. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
  579. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
  580. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  581. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
  582. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  583. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  584. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/scalar/same_name.py +0 -0
  585. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  586. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  587. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  588. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  589. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/secret_cache.py +0 -0
  590. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/simple_writable.py +0 -0
  591. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/__init__.py +0 -0
  592. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/_common.py +0 -0
  593. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
  594. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  595. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/cache.py +0 -0
  596. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  597. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/filters.py +0 -0
  598. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  599. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/make_series.py +0 -0
  600. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/misc.py +0 -0
  601. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
  602. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/pairs.py +0 -0
  603. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  604. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  605. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  606. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
  607. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
  608. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
  609. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/sequence.py +0 -0
  610. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/settings.py +0 -0
  611. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/splits.py +0 -0
  612. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  613. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  614. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  615. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/versioned.py +0 -0
  616. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table/wide.py +0 -0
  617. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table_in_out.py +0 -0
  618. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
  619. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/ticket_probe.py +0 -0
  620. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/twin_catalogs.py +0 -0
  621. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/versioned.py +0 -0
  622. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
  623. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/worker.py +0 -0
  624. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
  625. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/writable/generic.py +0 -0
  626. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/writable/table.py +0 -0
  627. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/_test_fixtures/writable/worker.py +0 -0
  628. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/aggregate_function.py +0 -0
  629. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/argument_spec.py +0 -0
  630. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/arguments.py +0 -0
  631. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/attach_header.py +0 -0
  632. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/cache_control.py +0 -0
  633. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/catalog/__init__.py +0 -0
  634. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/catalog/_descriptor_spec.py +0 -0
  635. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/catalog/attach_option.py +0 -0
  636. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/catalog/catalog_interface.py +0 -0
  637. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/catalog/descriptors.py +0 -0
  638. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/catalog/duckdb_statistics.py +0 -0
  639. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/catalog/secret_type.py +0 -0
  640. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/catalog/setting.py +0 -0
  641. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/catalog/storage.py +0 -0
  642. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/client/__init__.py +0 -0
  643. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/client/aggregate.py +0 -0
  644. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/client/catalog_mixin.py +0 -0
  645. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/client/cli.py +0 -0
  646. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/client/cli_catalog.py +0 -0
  647. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/client/cli_schema.py +0 -0
  648. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/client/cli_table.py +0 -0
  649. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/client/cli_transaction.py +0 -0
  650. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/client/cli_utils.py +0 -0
  651. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/client/cli_view.py +0 -0
  652. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/client/client.py +0 -0
  653. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/client/errors.py +0 -0
  654. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/__init__.py +0 -0
  655. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/_common.py +0 -0
  656. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/_registry.py +0 -0
  657. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/_registry_backend.py +0 -0
  658. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/cpp_constants.py +0 -0
  659. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/cpp_protocol_name.py +0 -0
  660. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/cpp_protocol_version.py +0 -0
  661. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/cpp_registry.py +0 -0
  662. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/cpp_request_builders.py +0 -0
  663. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/cpp_schemas.py +0 -0
  664. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  665. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  666. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
  667. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/csharp_registry.py +0 -0
  668. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/csharp_schemas.py +0 -0
  669. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/csharp_types.py +0 -0
  670. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/go_registry.py +0 -0
  671. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/go_schemas.py +0 -0
  672. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/go_types.py +0 -0
  673. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/java_registry.py +0 -0
  674. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/java_schemas.py +0 -0
  675. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/java_types.py +0 -0
  676. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/protocol_version.py +0 -0
  677. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/rust_registry.py +0 -0
  678. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/rust_request_builders.py +0 -0
  679. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/rust_schemas.py +0 -0
  680. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/rust_types.py +0 -0
  681. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/ts_client.py +0 -0
  682. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/ts_registry.py +0 -0
  683. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/ts_schemas.py +0 -0
  684. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/codegen/ts_types.py +0 -0
  685. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/copy_from_function.py +0 -0
  686. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/copy_to_function.py +0 -0
  687. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/exceptions.py +0 -0
  688. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/filter_v2.py +0 -0
  689. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/filter_v2_builder.py +0 -0
  690. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/function.py +0 -0
  691. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/function_storage.py +0 -0
  692. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/function_storage_azure_sql.py +0 -0
  693. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/function_storage_cf_do.py +0 -0
  694. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/http/__init__.py +0 -0
  695. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/http/demo_storage.py +0 -0
  696. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/http/landing.html +0 -0
  697. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/http/landing_page.py +0 -0
  698. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/http/vgi-client.js +0 -0
  699. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/http/worker_page.py +0 -0
  700. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/invocation.py +0 -0
  701. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/logging_config.py +0 -0
  702. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/metadata.py +0 -0
  703. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/otel.py +0 -0
  704. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/profiling.py +0 -0
  705. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/protocol.py +0 -0
  706. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/protocol_version.txt +0 -0
  707. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/py.typed +0 -0
  708. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/scalar_function.py +0 -0
  709. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/schema_path.py +0 -0
  710. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/schema_utils.py +0 -0
  711. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/secret_protocol.py +0 -0
  712. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/secret_service.py +0 -0
  713. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/split_token.py +0 -0
  714. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/table_buffering_function.py +0 -0
  715. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/table_filter_pushdown.py +0 -0
  716. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/table_function.py +0 -0
  717. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/table_in_out_function.py +0 -0
  718. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/transactor/__init__.py +0 -0
  719. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/transactor/_duckdb_compat.py +0 -0
  720. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/transactor/client.py +0 -0
  721. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/transactor/protocol.py +0 -0
  722. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/transactor/server.py +0 -0
  723. {vgi_python-0.44.0 → vgi_python-0.45.0}/vgi/write_results.py +0 -0
  724. {vgi_python-0.44.0 → vgi_python-0.45.0}/wrangler.jsonc +0 -0
@@ -129,7 +129,7 @@ jobs:
129
129
  hosted-protocols:
130
130
  # vgi-rpc's cross-SDK hosted-protocols group: the fixture workers must host
131
131
  # vgi.v2 then conformance.Secondary.v1 on stdio, unix and HTTP, and pass the
132
- # Identity.v1 groups over HTTP (vgi-fixture-http --identity).
132
+ # Identity.v2 groups over HTTP (vgi-fixture-http --identity).
133
133
  name: Hosted-protocols conformance
134
134
  runs-on: ubuntu-latest
135
135
  steps:
@@ -33,12 +33,12 @@ jobs:
33
33
  steps:
34
34
  - uses: actions/checkout@v7
35
35
 
36
- - name: Checkout unreleased vgi-rpc identity layer
36
+ - name: Checkout vgi-rpc (Identity.v2)
37
37
  uses: actions/checkout@v7
38
38
  with:
39
39
  repository: Query-farm/vgi-rpc-python
40
40
  path: .tailnet/vgi-rpc
41
- ref: 04f19147625b4f643b38a687151d8233daa8997c
41
+ ref: e04ddfa56c19b4cd7cc1e3729d165c763b0d98c7 # v0.52.0 (Identity.v2)
42
42
 
43
43
  - name: Check kernel networking support
44
44
  run: |
@@ -302,7 +302,7 @@ vgi-client --input data.parquet --function sum_all_columns --worker vgi-fixture-
302
302
  | `VGI_OAUTH_DEVICE_CODE_CLIENT_SECRET` | Client secret for device-code flow (optional, URL-safe chars only) |
303
303
  | `VGI_OAUTH_USE_ID_TOKEN` | When `1`/`true`/`yes`, clients use OIDC `id_token` as Bearer instead of `access_token` |
304
304
  | `VGI_RPC_GRANT_KEYS` | Comma-separated base64 32-byte sealed-grant keys (first mints, all verify); enables grants as HTTP bearers. Also `VGI_RPC_GRANT_AUDIENCE`, `VGI_RPC_GRANT_MAX_TTL_SECONDS` |
305
- | `VGI_INTROSPECT_PRINCIPALS` | Comma-separated principals permitted to call `vgi_rpc.Identity.v1`'s `introspect_token`. Required — no permissive default — whenever the worker implements `resolve_token()` (see below) |
305
+ | `VGI_INTROSPECT_PRINCIPALS` | Comma-separated principals permitted to call `vgi_rpc.Identity.v2`'s `introspect_token`. Required — no permissive default — whenever the worker implements `resolve_token()` (see below) |
306
306
  | `VGI_WORKER_ACCESS_LOG_SAMPLE` | Fraction of *successful* calls to keep in the access log, `0.0`–`1.0`. Errors are always kept; the decision is per call, so every record of one stream shares a fate |
307
307
  | `VGI_WORKER_ACCESS_LOG_ASYNC` | When `1`/`true`/`yes`, emit access-log records from a listener thread. Bounded queue; full means drop, and a crash loses whatever is queued |
308
308
  | `VGI_WORKER_ACCESS_LOG_QUEUE_SIZE` | Bound on the async access-log queue (default 10000) |
@@ -426,7 +426,7 @@ Also available on `Worker.main --http` and the fixture server. Under
426
426
 
427
427
  ### Token Introspection (`resolve_token`)
428
428
 
429
- A worker may optionally host the `vgi_rpc.Identity.v1` protocol, whose
429
+ A worker may optionally host the `vgi_rpc.Identity.v2` protocol, whose
430
430
  `introspect_token` method resolves an opaque bearer credential to a principal —
431
431
  for a reverse proxy that terminates the only public listener and must know the
432
432
  caller's identity before it can authorize anything.
@@ -509,7 +509,9 @@ one. Allowlist rules are unchanged. See `docs/authentication.md` and
509
509
 
510
510
  ### Attach Tickets (`vgi.attach_tickets.v1`)
511
511
 
512
- `seal_attach` seals a user's ATTACH (catalog name, options incl. secrets,
512
+ Protocol version `2.0.0`: `AttachTicket.expires_at` is nullable
513
+ `timestamp[us, tz="UTC"]` (`datetime | None`, null = no expiry); `1.0.0` was a
514
+ float64 with `+inf`. `seal_attach` seals a user's ATTACH (catalog name, options incl. secrets,
513
515
  version specs) into a `vgia1.` ticket under `VGI_SIGNING_KEY`, AAD
514
516
  `"vgi.attach_ticket.v1\0" + principal` (principal only, not domain). A runner
515
517
  holding the user's grant reattaches with the single option `vgi_attach_ticket`;
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vgi-python
3
- Version: 0.44.0
3
+ Version: 0.45.0
4
4
  Summary: Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow
5
5
  Project-URL: Homepage, https://query.farm
6
6
  Project-URL: Repository, https://github.com/Query-farm/vgi-python
@@ -162,7 +162,7 @@ Requires-Dist: httpx2>=2.12.0
162
162
  Requires-Dist: platformdirs
163
163
  Requires-Dist: pyarrow
164
164
  Requires-Dist: typer>=0.9
165
- Requires-Dist: vgi-rpc>=0.51.1
165
+ Requires-Dist: vgi-rpc>=0.52.0
166
166
  Provides-Extra: azure
167
167
  Requires-Dist: azure-identity>=1.16.0; extra == 'azure'
168
168
  Requires-Dist: pymssql>=2.3.0; extra == 'azure'
@@ -18,7 +18,7 @@ require `pip install vgi-python[http]`; JWT authentication additionally requires
18
18
  `principal` plus an optional `token_name`. It lives in a private `vgi-rpc` module, so `vgi.auth`
19
19
  re-exports it — a worker that implements `resolve_token` never has to name a private import path.
20
20
 
21
- As of vgi-rpc 0.46.0 introspection is the `vgi_rpc.Identity.v1` protocol hosted on the RPC server,
21
+ As of vgi-rpc 0.46.0 introspection is the `vgi_rpc.Identity.v2` protocol hosted on the RPC server,
22
22
  not an HTTP JSON route, so clients discover it through reflection. VGI hosts it on HTTP only, the
23
23
  transport that authenticates callers: its allowlist names principals, which stdin/stdout, AF_UNIX
24
24
  and TCP do not have. `TokenIdentity` and `TokenResolver` are no longer gated on the `[http]` extra.
@@ -72,7 +72,7 @@ overriding the same hook stop it at startup.
72
72
 
73
73
  Reflection (`list_protocols`) reports protocols in this order:
74
74
 
75
- | Transport | `vgi.v2` | `hosted_protocols()` | `vgi_rpc.Reflection.v1` | `vgi_rpc.Identity.v1` |
75
+ | Transport | `vgi.v2` | `hosted_protocols()` | `vgi_rpc.Reflection.v1` | `vgi_rpc.Identity.v2` |
76
76
  | --- | --- | --- | --- | --- |
77
77
  | stdin/stdout | yes | yes | yes | no |
78
78
  | AF_UNIX / named pipe | yes | yes | yes | no |
@@ -41,7 +41,7 @@ lookup.
41
41
 
42
42
  ## Grants and resolved tokens as bearer credentials
43
43
 
44
- `vgi_rpc.Identity.v1`'s `issue_grant` mints a standing credential that
44
+ `vgi_rpc.Identity.v2`'s `issue_grant` mints a standing credential that
45
45
  unattended automation later presents as an ordinary bearer. Over HTTP the
46
46
  worker accepts two kinds of identity credential after the deployment's own
47
47
  authenticator:
@@ -1,7 +1,11 @@
1
1
  # VGI Attach Tickets
2
2
 
3
3
  **Status:** Normative. Reference implementation: vgi-python `vgi/attach_ticket.py`.
4
- **Protocol:** `vgi.attach_tickets.v1`, version `1.0.0`. No change to `vgi.v2`.
4
+ **Protocol:** `vgi.attach_tickets.v1`, version `2.0.0`. No change to `vgi.v2`.
5
+ **Revision 2026-10-17 (`2.0.0`):** `AttachTicket.expires_at` changed from
6
+ `float64` unix seconds (`+inf` = no expiry) to nullable
7
+ `timestamp[us, tz="UTC"]` (null = no expiry). The sealed payload (§2) is
8
+ unchanged; the exact major.minor version check rejects a `1.0.0` peer.
5
9
  **Vectors:** [`vgi/_test_fixtures/attach_ticket_vectors.json`](https://github.com/Query-farm/vgi-python/blob/main/vgi/_test_fixtures/attach_ticket_vectors.json)
6
10
 
7
11
  An SDK implements attach tickets from this page alone. The words MUST, MUST
@@ -17,7 +21,7 @@ this worker can open. Later a runner attaches with one option,
17
21
  `vgi_attach_ticket`, and the worker restores the original attach before any
18
22
  catalog code runs.
19
23
 
20
- A ticket says *what* to attach. A sealed grant (`vgi_rpc.Identity.v1`
24
+ A ticket says *what* to attach. A sealed grant (`vgi_rpc.Identity.v2`
21
25
  `issue_grant`) says *who* attaches. The two are separate on purpose:
22
26
 
23
27
  - **A ticket carries no authority.** It opens only under the caller's
@@ -133,7 +137,7 @@ from `vgi_rpc.Reflection.v1` `list_protocols`):
133
137
  is useless without a grant.
134
138
 
135
139
  It is hosted beside `vgi.v2` and never changes how a `vgi.v2` request is
136
- dispatched. Wire name `vgi.attach_tickets.v1`, `protocol_version = "1.0.0"`.
140
+ dispatched. Wire name `vgi.attach_tickets.v1`, `protocol_version = "2.0.0"`.
137
141
 
138
142
  ### 5.2 Shapes
139
143
 
@@ -154,7 +158,7 @@ One unary method, `seal_attach(request: SealAttachRequest) -> AttachTicket`.
154
158
  | Field | Arrow type | Meaning |
155
159
  | --- | --- | --- |
156
160
  | `ticket` | `utf8` not null | The `vgia1.` text |
157
- | `expires_at` | `float64` not null | Unix seconds; `+inf` when the ticket has no expiry |
161
+ | `expires_at` | `timestamp[us, tz="UTC"]` nullable | The UTC instant the ticket expires (the sealed `expires_at` seconds × 1 000 000 µs); null when the ticket has no expiry |
158
162
 
159
163
  ### 5.3 Rules
160
164
 
@@ -194,7 +198,7 @@ In this order:
194
198
 
195
199
  So the two halves of a held entry (grant and ticket) expire together.
196
200
  5. **Seal** per §2 with a fresh `ticket_id` and nonce. Return the text and
197
- `expires_at` (`+inf` for `0`).
201
+ `expires_at` (null for `0`).
198
202
 
199
203
  A worker MAY refuse by policy with `action_denied`.
200
204
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vgi-python"
3
- version = "0.44.0"
3
+ version = "0.45.0"
4
4
  description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -40,7 +40,7 @@ dependencies = [
40
40
  "pyarrow",
41
41
  "typer>=0.9",
42
42
  "platformdirs",
43
- "vgi-rpc>=0.51.1",
43
+ "vgi-rpc>=0.52.0",
44
44
  "httpx2>=2.12.0",
45
45
  ]
46
46
 
@@ -6,7 +6,7 @@
6
6
  #
7
7
  # stdio vgi-fixture-worker (MetaWorker.serve, pipe)
8
8
  # unix vgi-fixture-worker --unix <sock> (the DuckDB launcher path)
9
- # http vgi-fixture-http --identity (+ the Identity.v1 groups)
9
+ # http vgi-fixture-http --identity (+ the Identity.v2 groups)
10
10
  #
11
11
  # Every worker must host, in order, vgi.v2 then conformance.Secondary.v1.
12
12
  #
@@ -22,9 +22,9 @@ from __future__ import annotations
22
22
  import base64
23
23
  import importlib.util
24
24
  import json
25
- import math
26
25
  import time
27
26
  from collections.abc import Iterator
27
+ from datetime import UTC, datetime, timedelta
28
28
  from pathlib import Path
29
29
  from typing import Annotated, Any
30
30
 
@@ -68,7 +68,7 @@ _DEFAULTS = _VECTORS["defaults"]
68
68
 
69
69
  _GRANT_KEY_B64 = base64.b64encode(bytes(range(32))).decode()
70
70
  _SIGNING_KEY = b"attach-ticket-test-signing-key-1"
71
- _IDENTITY = "vgi_rpc.Identity.v1"
71
+ _IDENTITY = "vgi_rpc.Identity.v2"
72
72
 
73
73
 
74
74
  @pytest.fixture(autouse=True)
@@ -293,7 +293,7 @@ class _MintingWorker(TicketProbeWorker):
293
293
  @classmethod
294
294
  def mint_grant(cls, principal: str, purpose: str, scopes: list[str], ttl_seconds: int) -> IssuedGrant:
295
295
  """Mint grant."""
296
- return IssuedGrant(token=f"own-{principal}", expires_at=time.time() + ttl_seconds)
296
+ return IssuedGrant(token=f"own-{principal}", expires_at=datetime.now(UTC) + timedelta(seconds=ttl_seconds))
297
297
 
298
298
 
299
299
  def _server(worker: Any, *, transport: str = "http", configured: bool = True, keys: bool = True) -> Any:
@@ -469,15 +469,15 @@ class TestSealAttach:
469
469
  [(0, 3600, 3600), (60, 3600, 60), (99999, 3600, 3600), (0, None, None), (60, None, 60)],
470
470
  )
471
471
  def test_lifetime(self, ttl: int, ceiling: int | None, expected: int | None) -> None:
472
- """expires_at = min(requested, grant maximum); 0 asks for the maximum; no maximum is +inf."""
472
+ """expires_at = min(requested, grant maximum); 0 asks for the maximum; no maximum is null."""
473
473
  before = int(time.time())
474
474
  ticket = _seal(_impl(ceiling), ttl_seconds=ttl)
475
475
  claims = open_attach_ticket(_SIGNING_KEY, ticket.ticket, principal="alice")
476
476
  if expected is None:
477
- assert claims.expires_at == 0 and math.isinf(ticket.expires_at)
477
+ assert claims.expires_at == 0 and ticket.expires_at is None
478
478
  else:
479
479
  assert before + expected <= claims.expires_at <= int(time.time()) + expected
480
- assert ticket.expires_at == claims.expires_at
480
+ assert ticket.expires_at == datetime.fromtimestamp(claims.expires_at, tz=UTC)
481
481
 
482
482
  def test_max_ttl_from_grant_keys_and_env(self, monkeypatch: pytest.MonkeyPatch) -> None:
483
483
  """Max ttl from grant keys and env."""
@@ -666,7 +666,8 @@ class TestEndToEnd:
666
666
  with http_connect(Identity, client=user) as identity: # type: ignore[type-abstract]
667
667
  grant = identity.issue_grant(purpose="vgi.unattended", scopes=[], ttl_seconds=600)
668
668
  assert sealed.ticket.startswith("vgia1.") and "sk-live-secret" not in sealed.ticket
669
- assert sealed.expires_at <= time.time() + 7 * 24 * 3600 + 5
669
+ assert sealed.expires_at is not None
670
+ assert sealed.expires_at <= datetime.now(UTC) + timedelta(days=7, seconds=5)
670
671
 
671
672
  runner = _SyncTestClient(app, default_headers={"Authorization": f"Bearer {grant.token}"})
672
673
  reattached = _attach_over_http(runner, {"vgi_attach_ticket": sealed.ticket})
@@ -738,3 +739,28 @@ def test_fixture_http_server_hosts_attach_tickets_when_keyed(http_worker: Any) -
738
739
  with http_connect(Reflection, base_url) as reflection: # type: ignore[type-abstract]
739
740
  hosted = {p.protocol for p in reflection.list_protocols().protocols}
740
741
  assert ATTACH_TICKETS_PROTOCOL_NAME in hosted
742
+
743
+
744
+ class TestAttachTicketWireShape:
745
+ """Protocol ``2.0.0``: ``expires_at`` is a nullable UTC microsecond timestamp."""
746
+
747
+ def test_protocol_version(self) -> None:
748
+ """The exact major.minor check rejects a ``1.0.0`` (float64 ``expires_at``) peer."""
749
+ assert AttachTickets.protocol_version == "2.0.0"
750
+
751
+ def test_expires_at_is_a_nullable_utc_timestamp(self) -> None:
752
+ """``timestamp[us, tz="UTC"]``, nullable; null replaces ``+inf``."""
753
+ field = AttachTicket.ARROW_SCHEMA.field("expires_at")
754
+ assert field.type == pa.timestamp("us", tz="UTC")
755
+ assert field.nullable
756
+
757
+ @pytest.mark.parametrize("when", [None, datetime(2026, 9, 21, 12, 0, 0, 123456, tzinfo=UTC)])
758
+ def test_round_trip(self, when: datetime | None) -> None:
759
+ """Null and a microsecond-precision instant both survive the wire."""
760
+ got = AttachTicket.deserialize_from_bytes(AttachTicket(ticket="vgia1.x", expires_at=when).serialize_to_bytes())
761
+ assert got.expires_at == when
762
+
763
+ def test_a_naive_datetime_is_refused(self) -> None:
764
+ """Arrow would read a naive value as UTC, silently shifting local time."""
765
+ with pytest.raises(ValueError, match="timezone-aware"):
766
+ AttachTicket(ticket="vgia1.x", expires_at=datetime(2026, 1, 1))
@@ -109,7 +109,7 @@ def test_known_shapes() -> None:
109
109
 
110
110
  def test_enum_wire_values_are_member_names_in_order() -> None:
111
111
  """Enumerator order is the wire dictionary order; the wire value is the member name."""
112
- from vgi.protocol import TableInOutFunctionInitPhase
112
+ from vgi.table_function import TableInOutFunctionInitPhase
113
113
 
114
114
  phase = cpp_records.build_model().enums["VgiInitPhase"]
115
115
  assert [m.wire_name for m in phase.members] == [m.name for m in TableInOutFunctionInitPhase]
@@ -2,7 +2,7 @@
2
2
 
3
3
  """Identity credentials accepted as HTTP bearers: sealed grants and ``resolve_token``.
4
4
 
5
- vgi-rpc's ``Identity.v1`` mints grants "presented later by unattended
5
+ vgi-rpc's ``Identity.v2`` mints grants "presented later by unattended
6
6
  automation as an ordinary bearer". These tests close that loop through
7
7
  vgi-python's own HTTP surface (``create_app``), not vgi-rpc in isolation:
8
8
 
@@ -42,7 +42,7 @@ from vgi.serve import create_app
42
42
  _KEY_B64 = base64.b64encode(bytes(range(32))).decode()
43
43
  _OTHER_KEY_B64 = base64.b64encode(bytes(range(32, 64))).decode()
44
44
  _SIGNING_KEY = b"grant-auth-test-signing-key-0001"
45
- _IDENTITY = "vgi_rpc.Identity.v1"
45
+ _IDENTITY = "vgi_rpc.Identity.v2"
46
46
  _GRANT_ENV = (GRANT_KEYS_ENV, "VGI_RPC_GRANT_AUDIENCE", "VGI_RPC_GRANT_MAX_TTL_SECONDS")
47
47
 
48
48
  _VECTORS = json.loads(files("vgi_rpc.conformance").joinpath("grant_token_vectors.json").read_text(encoding="utf-8"))
@@ -38,7 +38,7 @@ _REPO_ROOT = Path(__file__).resolve().parent.parent
38
38
 
39
39
  _EXTRAS = ["vgi_test.Echo.v1", "vgi_test.Counter.v1"]
40
40
  _EXPECTED = ["vgi.v2", *_EXTRAS, "vgi_rpc.Reflection.v1"]
41
- _IDENTITY = "vgi_rpc.Identity.v1"
41
+ _IDENTITY = "vgi_rpc.Identity.v2"
42
42
 
43
43
  # Protocol classes are abstract to mypy; the connect helpers want concrete types.
44
44
  _REFLECTION: type[Any] = Reflection
@@ -49,7 +49,7 @@ _POSIX_ONLY = pytest.mark.skipif(sys.platform == "win32", reason="AF_UNIX launch
49
49
 
50
50
 
51
51
  class _IdentityHostingWorker(HostingWorker):
52
- """Opts into ``vgi_rpc.Identity.v1`` as well."""
52
+ """Opts into ``vgi_rpc.Identity.v2`` as well."""
53
53
 
54
54
  @classmethod
55
55
  def resolve_token(cls, token: str) -> TokenIdentity | None:
@@ -10,6 +10,7 @@ import subprocess
10
10
  import sys
11
11
  import textwrap
12
12
  import time
13
+ from datetime import UTC, datetime, timedelta
13
14
  from typing import TYPE_CHECKING, Annotated, Any
14
15
 
15
16
  import pyarrow as pa
@@ -499,7 +500,7 @@ class _MintingWorker(Worker):
499
500
  ttl = min(ttl_seconds, 3600)
500
501
  return IssuedGrant(
501
502
  token=f"sealed:{principal}:{':'.join(scopes)}:{purpose}",
502
- expires_at=1_000_000.0 + ttl,
503
+ expires_at=datetime.fromtimestamp(1_000_000, tz=UTC) + timedelta(seconds=ttl),
503
504
  grant_id="grant-1",
504
505
  )
505
506
 
@@ -509,7 +510,9 @@ class _BothWorker(_IntrospectingWorker):
509
510
 
510
511
  @classmethod
511
512
  def mint_grant(cls, principal: str, purpose: str, scopes: list[str], ttl_seconds: int) -> IssuedGrant:
512
- return IssuedGrant(token=f"sealed:{principal}", expires_at=1_000_000.0, grant_id="g")
513
+ return IssuedGrant(
514
+ token=f"sealed:{principal}", expires_at=datetime.fromtimestamp(1_000_000, tz=UTC), grant_id="g"
515
+ )
513
516
 
514
517
 
515
518
  class TestIntrospectResolverDetection:
@@ -582,7 +585,7 @@ def _hosted_protocols(worker_cls: type[Worker]) -> frozenset[str]:
582
585
 
583
586
 
584
587
  class TestTokenIntrospection:
585
- """``vgi_rpc.Identity.v1`` — unhosted unless a worker implements the hook.
588
+ """``vgi_rpc.Identity.v2`` — unhosted unless a worker implements the hook.
586
589
 
587
590
  Identity was an HTTP JSON route (``POST {prefix}/__introspect_token__``)
588
591
  through vgi-rpc 0.45.x. As of 0.46.0 it is an RPC-layer protocol hosted on
@@ -615,7 +618,7 @@ class TestTokenIntrospection:
615
618
 
616
619
  def test_protocol_not_hosted_without_hook(self) -> None:
617
620
  """The server built for such a worker hosts no identity protocol."""
618
- assert "vgi_rpc.Identity.v1" not in _hosted_protocols(_SingleWorker)
621
+ assert "vgi_rpc.Identity.v2" not in _hosted_protocols(_SingleWorker)
619
622
 
620
623
  def test_identity_built_with_hook(self) -> None:
621
624
  """Implementing the hook is what builds the implementation."""
@@ -638,7 +641,7 @@ class TestTokenIntrospection:
638
641
  with pytest.MonkeyPatch.context() as mp:
639
642
  mp.setenv("VGI_INTROSPECT_PRINCIPALS", "proxy-a")
640
643
  hosted = _hosted_protocols(_IntrospectingWorker)
641
- assert "vgi_rpc.Identity.v1" in hosted
644
+ assert "vgi_rpc.Identity.v2" in hosted
642
645
 
643
646
  def test_resolver_answers_through_the_implementation(self) -> None:
644
647
  """The worker's own lookup is what the hosted protocol calls."""
@@ -697,7 +700,7 @@ class TestTokenIntrospection:
697
700
 
698
701
 
699
702
  class TestGrantMinting:
700
- """``issue_grant`` — the other half of ``vgi_rpc.Identity.v1``.
703
+ """``issue_grant`` — the other half of ``vgi_rpc.Identity.v2``.
701
704
 
702
705
  Guarded very differently from ``introspect_token``, and deliberately so.
703
706
  Introspection answers a question about *somebody else's* credential, so it
@@ -729,7 +732,7 @@ class TestGrantMinting:
729
732
 
730
733
  def test_minting_alone_hosts_the_protocol(self) -> None:
731
734
  """A worker may mint without resolving — the two are independent."""
732
- assert "vgi_rpc.Identity.v1" in _hosted_protocols(_MintingWorker)
735
+ assert "vgi_rpc.Identity.v2" in _hosted_protocols(_MintingWorker)
733
736
 
734
737
  def test_minting_alone_offers_only_issue_grant(self) -> None:
735
738
  """The protocol describes what the worker does, not what it could do."""
@@ -774,7 +777,7 @@ class TestGrantMinting:
774
777
  grant = identity.issue_grant( # type: ignore[attr-defined]
775
778
  "long", [], 86_400, _minting_ctx("alice")
776
779
  )
777
- assert grant.expires_at == 1_000_000.0 + 3600
780
+ assert grant.expires_at == datetime.fromtimestamp(1_000_000 + 3600, tz=UTC)
778
781
 
779
782
  def test_stale_authentication_cannot_mint(self) -> None:
780
783
  """Minting while the user is present is enforced, not just documented."""