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.
- {vgi_python-0.42.1 → vgi_python-0.43.1}/CLAUDE.md +30 -3
- {vgi_python-0.42.1 → vgi_python-0.43.1}/PKG-INFO +2 -2
- {vgi_python-0.42.1 → vgi_python-0.43.1}/ci/run-integration.sh +8 -1
- vgi_python-0.43.1/docs/api/client.md +38 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/worker.md +8 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/catalog-interface.md +2 -0
- vgi_python-0.43.1/docs/protocol/vgi-attach-tickets.md +329 -0
- vgi_python-0.43.1/docs/protocol/vgi-opaque-data-sealing.md +220 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/mkdocs.yml +2 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/pyproject.toml +2 -2
- vgi_python-0.43.1/scripts/gen_attach_ticket_vectors.py +528 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/scripts/run_all_tests.sh +4 -1
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_directory_parity.py +6 -0
- vgi_python-0.43.1/tests/sdk_conformance/__init__.py +8 -0
- vgi_python-0.43.1/tests/sdk_conformance/test_opaque_sealing.py +565 -0
- vgi_python-0.43.1/tests/sdk_conformance/test_opaque_sealing_stdio.py +53 -0
- vgi_python-0.43.1/tests/test_attach_ticket.py +740 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_catalog_auth_binding.py +95 -0
- vgi_python-0.43.1/tests/test_client_reflection.py +143 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_table_function_early_close.py +44 -10
- {vgi_python-0.42.1 → vgi_python-0.43.1}/uv.lock +5 -5
- vgi_python-0.43.1/vgi/_redact.py +35 -0
- vgi_python-0.43.1/vgi/_test_fixtures/attach_ticket_vectors.json +450 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/catalog.py +2 -1
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/http_server.py +30 -5
- vgi_python-0.43.1/vgi/_test_fixtures/ticket_probe.py +167 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/worker.py +4 -0
- vgi_python-0.43.1/vgi/attach_ticket.py +733 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/attach_option.py +12 -1
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/__init__.py +3 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/client.py +98 -4
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/exceptions.py +24 -1
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/meta_worker.py +21 -3
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/rpc_server.py +38 -4
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/serve.py +23 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/transactor/server.py +12 -9
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/worker.py +40 -25
- vgi_python-0.42.1/docs/api/client.md +0 -6
- {vgi_python-0.42.1 → vgi_python-0.43.1}/.dockerignore +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/.gitattributes +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/.github/dependabot.yml +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/.github/workflows/ci.yml +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/.github/workflows/docs.yml +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/.github/workflows/integration.yml +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/.github/workflows/release.yml +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/.github/workflows/tailnet-integration.yml +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/.gitignore +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/.python-version +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/.vale.ini +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/LICENSE +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/PROTOCOL.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/README.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/RELEASE-RUNBOOK.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/SECURITY.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/ci/README.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/README.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/and-too-few-children.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/delta-required-upsert.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/nested-runtime-filter.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/remove-with-expression.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/required-runtime-filter.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/snapshot-nonzero-revision.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/unknown-document-property.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/negative/unknown-node.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/positive/advisory-upsert-delta.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/positive/boolean-column-predicate.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/positive/empty-snapshot.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/positive/nested-required-snapshot.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/positive/remove-delta.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/cases/positive/runtime-filter-snapshot.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/filter-v2.schema.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/generate_runtime.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/manifest.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/run_worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-add/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-multiply/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-multiply/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-multiply/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-negate/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-subtract/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-subtract/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/arithmetic-subtract/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/cast-integer-to-double/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/cast-integer-to-double/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/cast-integer-to-double/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-distinct_from/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-distinct_from/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-distinct_from/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-distinct_from/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-eq/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-eq/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-eq/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-eq/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ge/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ge/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ge/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ge/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-gt/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-gt/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-gt/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-gt/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-le/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-le/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-le/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-le/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-lt/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-lt/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-lt/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-lt/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ne/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ne/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ne/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-ne/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/delta-0.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-empty-noop/delta-0.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-empty-noop/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-empty-noop/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-empty-noop/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-0.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-1.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-2.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/empty-snapshot/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/empty-snapshot/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/empty-snapshot/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/empty-snapshot/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-cast-type-not-null/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-cast-type-not-null/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-column-index/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-column-index/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-column-name/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-column-name/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-contextual-cast-without-session/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-contextual-cast-without-session/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-duplicate-predicate-id/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-duplicate-predicate-id/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-external-column-index/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-external-column-index/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-external-column-index/join-keys-0.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-external-column-name/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-external-column-name/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-external-column-name/join-keys-0.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-field-non-struct/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-field-non-struct/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-in-payload-not-list/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-in-payload-not-list/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-in-payload-null-list/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-in-payload-null-list/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-invalid-overload/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-invalid-overload/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-missing-literal/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-missing-literal/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-non-boolean-root/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-non-boolean-root/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-unknown-standard-function/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/error-unknown-standard-function/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/external-in-nonzero-column/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/external-in-nonzero-column/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/external-in-nonzero-column/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/external-in-nonzero-column/join-keys-0.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/external-in-nonzero-column/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-contains/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-contains/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-contains/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-ends-with/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-ends-with/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-ends-with/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-list-contains/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-list-contains/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-list-contains/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-starts-with/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-starts-with/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/function-starts-with/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-empty/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-empty/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-empty/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-empty/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-with-null/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-with-null/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-with-null/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/in-with-null/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-not-null/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-not-null/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-not-null/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-not-null/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-null/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-null/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-null/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/is-null/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-and/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-and/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-and/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-not/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-not/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-not/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-or/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-or/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/kleene-or/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/nan-comparison/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/nan-comparison/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/nan-comparison/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/negative-zero-membership/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/negative-zero-membership/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/negative-zero-membership/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/nested-null-propagation/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/nested-null-propagation/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/nested-null-propagation/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-empty/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-empty/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-empty/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-empty/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-with-null/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-with-null/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-with-null/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/not-in-with-null/worker-expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/session-integer-division/expected.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/session-integer-division/filter.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime/session-integer-division/input.arrow +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/conformance/filter-v2/runtime-manifest.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/arguments.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/auth.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/catalogs.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/exceptions.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/filters.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/functions.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/http.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/index.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/metadata.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/observability.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/storage.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/api/transactor.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/argument-serialization.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/logo.png +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/social-card.png +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/assets/video-thumbnail.jpg +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/authentication.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/cli.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/column-statistics.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/concepts/index.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/contributing-docs.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/generator-api.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/global-functions.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/function-patterns.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/index.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/iroh.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/state-storage.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/how-to/tailnet.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/index.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/lifecycle.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/metadata.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/overrides/main.html +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/protocol/index.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/protocol/vgi-catalog-query-pushdown-design.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/protocol/vgi-duckdb-filter-adapter.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/protocol/vgi-filter-encoding-v2-spec.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/protocol/vgi-protocol-proposed-changes.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/protocol/vgi-runtime-filter-artifacts.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/robots.txt +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/shared-storage.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/tutorial/index.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/tutorial/table.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/docs/vgi-logo.png +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/batch_index_worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/cache_worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/calc_worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/copy_format_worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/filter_worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/row_count_worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/examples/sum_worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/identity.png +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/packages/vgi-fixtures/docker/Dockerfile +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/packages/vgi-fixtures/pyproject.toml +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/scripts/hosted_protocols_conformance.sh +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/scripts/measure_startup.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/scripts/regen_generated.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/test-data/generate.sh +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/_hosted_protocols_worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_attach_option.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_catalog_contents.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_client_load_catalog.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_declarative.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_required_filters.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_serialization.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_setting.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_aggregate_client.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_batch_metadata_callback.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_bind_and_join_keys.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_cli.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_copy_client.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_http_response_budget.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_iroh_client.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_scan_branches_client.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_split_client.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_stop_force.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_table_column_statistics.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_time_travel_client.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_const_param_enforcement.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_container.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_copy_from.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_copy_to.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_github.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_protocol_version.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_splits.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/conftest.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/bad_version.bin +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/generate.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/manifest.json +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/stale_anchor.bin +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/truncated.bin +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/valid_sealed.bin +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/data/split_tokens/valid_unsealed.bin +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table/test_wide_columns.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/test_blended_exchange.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/test_blended_metadata.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/table_in_out/test_table_buffering_empty_input.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/tailnet/Dockerfile +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/tailnet/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/tailnet/compose.yaml +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/tailnet/probe.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/tailnet/run.sh +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/tailnet/test_worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/tailnet/worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_argument_spec.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_auth.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_cache_control.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_call_state_attach.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_client_oauth.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_codegen_request_inventory.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_docstrings.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_dynamic_filter_http_turns.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_examples_workers.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_exceptions.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_filter_pushdown.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_filter_v2.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_filter_v2_builder.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_filter_v2_runtime_corpus.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_filter_v2_spec_schema.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_fixture_catalog_parity.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_function_shape_mismatch.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_function_storage.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_cpp_protocol_name.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_csharp.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_go_types.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_java_schemas.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_java_types.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_rust_request_builders.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_rust_schemas.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_rust_types.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_generated_ts_types.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_grant_auth.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_hosted_protocols.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_import_side_effects.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_landing_discovery.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_launch_transport.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_metadata.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_otel.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_protocol_classes.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_schema_paths_v2.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_schema_scoped_functions.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_serve.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_setting_secret_annotations.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_signing_key.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_split_token.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_subprocess_transport.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_tcp_transport.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_union_argument.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_wire_record_schema_parity.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_worker_page.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/test_write_results.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_duckdb.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/catalog_contents.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/companion.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/global_functions.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/identity_fixture.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/same_name.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/secret_cache.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/cache.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/splits.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table/wide.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table_in_out.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/twin_catalogs.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/argument_spec.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/arguments.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/attach_header.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/auth.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/cache_control.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/catalog_interface.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/descriptors.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/duckdb_statistics.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/aggregate.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/catalog_mixin.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/cli.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/cli_catalog.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/cli_utils.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/client/errors.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/_common.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_protocol_name.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/csharp_schemas.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/csharp_types.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/go_types.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/java_schemas.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/java_types.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/rust_request_builders.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/rust_schemas.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/rust_types.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/codegen/ts_types.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/copy_from_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/filter_v2.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/filter_v2_builder.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/function_storage.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/http/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/http/landing.html +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/http/landing_page.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/http/vgi-client.js +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/invocation.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/logging_config.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/metadata.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/otel.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/profiling.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/protocol.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/protocol_version.txt +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/py.typed +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/scalar_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/schema_path.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/schema_utils.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/secret_service.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/split_token.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/table_buffering_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/table_filter_pushdown.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/table_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/table_in_out_function.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/transactor/client.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.42.1 → vgi_python-0.43.1}/vgi/write_results.py +0 -0
- {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.
|
|
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.
|
|
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.
|