mainsequence-metatable 0.1.28.dev51__tar.gz → 0.1.29.dev53__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.
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.agents/skills/client/metatables-migrations/SKILL.md +17 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.agents/skills/ms_tau_sdk/PINNED_FROM.txt +1 -1
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.agents/skills/ms_tau_sdk/tau_project_customization/SKILL.md +5 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/PKG-INFO +2 -2
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/agent/0019-metatables-analyst-agent.md +1 -1
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/agent/0021-api-serves-the-analyst-tools-over-mcp.md +1 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0007-database-enforced-table-access.md +10 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0013-application-owned-migrations.md +17 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/api/openapi.json +9 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/operations/hosted-runtime.md +10 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/pyproject.toml +2 -2
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/mainsequence_metatable.egg-info/PKG-INFO +2 -2
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/mainsequence_metatable.egg-info/requires.txt +1 -1
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/managed_finalize.py +33 -5
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/migration_connection.py +54 -2
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +61 -2
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/contracts.py +3 -1
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/migration_connection.py +25 -1
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/operations.py +15 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/migrations/__init__.py +4 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/migrations/connection.py +34 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/migrations/env.py +3 -1
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/migrations/runner.py +45 -14
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/models.py +8 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_managed_finalize_client_api.py +91 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_remaining_client_routes.py +6 -0
- mainsequence_metatable-0.1.29.dev53/tests/permissions/test_migration_boundary.py +178 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/uv.lock +5 -5
- mainsequence_metatable-0.1.28.dev51/tests/permissions/test_migration_boundary.py +0 -77
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.agents/skills/analyze-with-sql/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.agents/skills/client/metatables-meta-tables/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.agents/skills/client/metatables-table-discovery/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.agents/skills/discover-tables/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.agents/skills/ms_tau_sdk/tau_a2a_runtime_adapter/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.agents/skills/ms_tau_sdk/tau_local_development/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.agents/skills/ms_tau_sdk/tau_repository_integration/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.agents/skills/ms_tau_sdk/tau_security_and_access/SKILL.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/.mainsequence/workflows/metatables-api.yaml +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/LICENSE +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/MANIFEST.in +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/alembic.ini +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/compose.database-tests.yml +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/agent/0020-analyst-reads-as-its-requester.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0004-approved-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0006-historical-run-graphs.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0009-shared-credential-store.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0016-impact-preflight.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0017-hosted-request-identity.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0018-search-document-pipeline.svg +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0018-table-search.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/api/0022-concurrent-requests-and-connection-reuse.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/adr/index.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/api/authentication-and-errors.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/api/data-sources.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/api/overview.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/api/reference.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/api/tables-and-migrations.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/api/time-index-and-updates.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/assets/branding/metatables.svg +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/assets/diagrams/local-client-experience.svg +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/assets/diagrams/namespace-access.svg +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/client/bounded-transfers.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/client/build-an-updater.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/client/define-and-migrate-tables.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/client/deploy-application-migrations.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/client/installation-and-connection.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/client/local-storage.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/client/query-and-mutate.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/client/quickstart.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/client/read-existing-time-index-tables.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/client/register-existing-tables.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/client/tutorial.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/client/upgrade-legacy-app.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/concepts/architecture.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/concepts/data-sources.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/concepts/identity-and-scope.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/concepts/permissions-namespaces-labels.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/concepts/runs-and-execution-graphs.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/concepts/time-index-tables-and-updates.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/contributing/architecture-and-boundaries.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/contributing/database-backends.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/contributing/documentation.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/contributing/releasing.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/contributing/testing.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/query.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/index.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/operations/catalog-migrations.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/operations/configuration.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/operations/local-runtime.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/operations/recovery-and-observability.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/operations/run-history.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/operations/run-logs.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/reference/capabilities.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/reference/cli.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/reference/python.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/security/index.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/security/ownership-and-sharing.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/security/permissions.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/mkdocs.yml +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/scripts/build_reference.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/scripts/check_boundaries.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/scripts/check_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/scripts/check_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/scripts/check_docs.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/scripts/check_examples_debug.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/scripts/check_project.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/scripts/dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/scripts/test_databases.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/scripts/test_postgresql.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/setup.cfg +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/mainsequence_metatable.egg-info/SOURCES.txt +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/_admin_source.json +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/_build.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/_skill_bundle.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/analysis.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/analyst/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/auth/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/auth/boundary.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/auth/local_actor.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/bootstrap.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/configuration.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/connection_count.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/credential_admin.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/development.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/development_client.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/error_logging.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/main.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/mcp.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/platform_cache.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/access_map.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/caller.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/column_search.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/contract_validation.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/data_sources.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/namespaces.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/run_logs.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/security.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/table_cascade.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/table_crud.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/table_delete.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/table_filter.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/table_import.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/table_introspection.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/table_patch.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/table_registration.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/table_response.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/table_search.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/table_search_document.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/table_sql.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/time_index_reads.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/update_batch.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/update_constants.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/update_crud.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/update_details.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/update_graph.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/update_registration.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/update_runs.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/routes/update_statistics.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/runtime.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/runtime_control.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/runtime_database.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/source_passwords.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/app/transfer.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/access.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/catalog.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/catalog_types.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/connection_pool.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/hosted.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/hosted_access.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/native.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/pages.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/postgresql_access.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/registry.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/relation_tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/relational.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/sqlite_access.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/streaming.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/backends/timescale.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/contracts/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/contracts/relation_import.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/contracts/values.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/domain/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/domain/index_statistics.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/domain/label_rules.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/domain/permission_rules.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/domain/update_constants.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/integrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/integrations/credential_store.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/integrations/run_logs.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/integrations/source_validation.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/versions/0010_cascade_targets.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/versions/0011_table_search.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/versions/0012_table_creator.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/operations/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/operations/create_table.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/operations/import_relations.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/operations/introspect_table.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/operations/read_time_index.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/operations/register_catalog.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/cascade.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/catalog.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/database.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/grants.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/impact.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/labels.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/locking.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/models.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/projections.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/table_queries.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/table_response.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/update_graph.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/updates.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/search/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/search/documents.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/search/embeddings.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/search/index.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/search/ranking.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/search/text.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/backend/search/worker.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/metatables/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/metatables/configuration.yaml +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/metatables/main.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/api/request_timing.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/cli/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/cli/admin_install.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/cli/app.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/cli/filters.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/cli/local.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/cli/migrations.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/cli/project.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/cli/skills.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/compiled_sql/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/compiled_sql/mssql.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/compiled_sql/v1.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/dtype_codec.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/endpoint.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/bounded_reader.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/data_sources/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/data_sources/mssql.json +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/data_sources/mysql.json +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/data_sources/postgresql.json +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/data_sources/register.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/external_table.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/local_app/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/local_app/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/local_app/__main__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/local_app/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/local_app/tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/query.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/quickstart.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/reader.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/scripts/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/scripts/setup_metatables.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/__main__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/data/README.md +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/frames.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/migrations/env.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/operations.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/tutorial/updaters.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/examples/updater.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/future_registry.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/hashing.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/instrumentation.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/local_connection.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/local_files.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/log_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/migrations/alembic.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/migrations/provider.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/migrations/registry.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/migrations/scaffold.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/migrations/sqlite.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/migrations/templates/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/migrations/templates/env.py.mako +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/migrations/templates/script.py.mako +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/migrations/tls.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/pydantic_metadata.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/run_logging.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/runtime.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/runtime_context.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/runtime_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/schema_names.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/sdk_compat.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/sqlalchemy_contracts.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/storage_layout_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/time_index_table_refs.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/transfer.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/transfer_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/transport.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/update_configuration_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/updaters/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/updaters/configuration.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/updaters/dependencies.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/updaters/managers.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/updaters/namespacing.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/updaters/runner.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/updaters/updaters.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/updaters/utils.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/src/metatables/upload.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/analyst/test_agent_surface.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/analyst/test_api_search.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/analyst/test_mcp.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/analyst/test_tools.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_bootstrap_failure_cause.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_caller_endpoint.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_data_source_identity.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_development_client.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_hosted_agent.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_hosted_environment_target.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_local_mode.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_platform_fact_cache.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_request_identity.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_runtime_database.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_runtime_scaffold.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_runtime_selection.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_runtime_storage_binding.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/auth/test_source_passwords.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/catalog/test_catalog_foundation.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/catalog/test_contract_projection.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/catalog/test_database_config.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/catalog/test_index_statistics.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/catalog/test_migration.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/conftest.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/contracts/capabilities.json +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/contracts/client_signatures.json +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/contracts/database_operations.json +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/contracts/test_bounded_transfer.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/contracts/test_compiler_runtime_source.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/contracts/test_relation_batching.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/contracts/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/contracts/test_runtime_contract_compat.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/contracts/test_storage_layouts.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/contracts/test_table_contracts.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/Dockerfile +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/Dockerfile.dockerignore +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/conftest.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/provider/__init__.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/provider/env.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/test_api_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/test_application_migration.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/test_bootstrap_recovery.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/test_catalog_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/test_credential_catalog.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/test_physical_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/test_relation_import.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/test_runtime_bootstrap.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/test_sql_security.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_backend/test_update_client.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_operations/test_physical_operations.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_operations/test_postgresql_operations.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/database_operations/test_runtime_and_temporal.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/documentation/test_project_checks.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_admin_installation.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_api_endpoint.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_application_owned_migrations.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_catalog_outage.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_client_api_contract.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_client_api_coverage.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_client_migration_scaffold.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_client_migration_tls.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_client_package.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_client_signatures.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_client_value_behaviors.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_data_source_registry.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_local_actor_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_local_cli_workflow.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_local_client_selection.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_namespaces_admin_http.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_public_imports.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_run_graphs.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_run_logs.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_runtime_upgrade.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_sdk_local_startup.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_sqlite_runtime.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_table_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_table_filter_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_table_introspection_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_table_patch_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_table_search_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_table_search_document_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_table_search_scale.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_table_stats_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_table_update_pipeline.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_table_updates_http.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_time_index_delete_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_time_index_reads_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_timescale_policies_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_update_batch_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/e2e/test_update_registration_client_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/examples/test_documented_examples.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/examples/test_postgresql_examples.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/examples/test_setup_launch.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/examples/test_tutorial.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/integrations/test_connection_reuse.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/integrations/test_credential_store.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/integrations/test_data_source_rules.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/integrations/test_local_data_sources.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/integrations/test_local_run_logs.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/integrations/test_postgresql_connection.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/integrations/test_postgresql_sql.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/integrations/test_postgresql_tables.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/integrations/test_request_timing.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/integrations/test_serving_policy.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/integrations/test_source_validation.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/integrations/test_sqlite_operations.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/labels/test_labels.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/operations/test_create_table_operation.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/operations/test_create_table_postgres.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/operations/test_physical_operation_journal.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/operations/test_register_catalog.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/operations/test_search_documents.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/operations/test_timescale_policies.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/packaging/test_client_skills.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/packaging/test_dev_release_version.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/packaging/test_distribution_sources.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/packaging/test_editable_build.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/packaging/test_installed_distribution.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/permissions/test_access_map.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/permissions/test_governed_sql_scope.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/permissions/test_incremental_security.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/permissions/test_local_actor_membership.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/permissions/test_namespace_grants.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/permissions/test_security_api.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/permissions/test_table_body_filter.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/permissions/test_table_grants.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/permissions/test_table_queries.py +0 -0
- {mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/tests/permissions/test_workload_principals.py +0 -0
|
@@ -244,6 +244,23 @@ Read `docs/operations/recovery-and-observability.md`.
|
|
|
244
244
|
reports `Finalizing MetaTables 11-20 of 62.` for larger providers (client 0.1.28
|
|
245
245
|
and later). A run that stops partway leaves earlier batches active; rerun the
|
|
246
246
|
same upgrade to finalize the rest.
|
|
247
|
+
- If the migration connection is refused with `provider_tables_misplaced`, provider
|
|
248
|
+
tables sit in the `metatables` catalog schema (MetaTables #50). Don't stamp, rerun or
|
|
249
|
+
hand-edit revisions. An administrator moves or drops those tables, then rerun.
|
|
250
|
+
- If it is refused with `provider_tables_owner_unreachable`, the tables belong to a
|
|
251
|
+
retired role, named in `owners`. A database administrator runs
|
|
252
|
+
`REASSIGN OWNED BY <role> TO mt_owner;` in that database, then rerun.
|
|
253
|
+
- If the client refuses because the connection "resolves unqualified names" outside the
|
|
254
|
+
default schema, it isn't the connection MetaTables issued. Use that connection, or set
|
|
255
|
+
`search_path` to the default schema.
|
|
256
|
+
- If finalization reports `physical_table_missing`, a current table is absent and nothing
|
|
257
|
+
named it as removed. Its catalog binding is kept; check `other_schemas` and where your
|
|
258
|
+
revisions created it. Client 0.1.29 and later name tables removed from the models or
|
|
259
|
+
dropped by the run, such as on downgrade. Older clients fail this way after a removal or
|
|
260
|
+
downgrade, so upgrade the client.
|
|
261
|
+
- `physical_table_inaccessible` means the table exists, but the MetaTables login can't
|
|
262
|
+
read all its columns or use its owner. Fix ownership or privileges; the stored contract
|
|
263
|
+
is kept.
|
|
247
264
|
- Destructive catalog deletion is not migration recovery and never bypasses
|
|
248
265
|
schema-management protection.
|
|
249
266
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
schema=1
|
|
2
2
|
library_name=ms-tau-sdk
|
|
3
3
|
namespace=ms_tau_sdk
|
|
4
|
-
pinned_version=2.0.
|
|
4
|
+
pinned_version=2.0.10
|
|
5
5
|
skills_path=src/ms_tau_sdk/agent_skills
|
|
6
6
|
skills=tau_a2a_runtime_adapter,tau_local_development,tau_project_customization,tau_repository_integration,tau_security_and_access
|
|
7
7
|
command=ms-tau skills sync --path .
|
|
@@ -91,6 +91,11 @@ the application's tool, not in the Agent. A tool that declares nothing gets
|
|
|
91
91
|
`harness_agent.spec.env_vars`, the process environment, or
|
|
92
92
|
`TauSDKSettings(mcp_tool_timeout_seconds=...)`. No call outlives its turn.
|
|
93
93
|
|
|
94
|
+
Before MCP opens, an application's access may be `waking`. Tau waits according to the platform's
|
|
95
|
+
retry guidance for up to `TAU_MCP_APPLICATION_READY_TIMEOUT_SECONDS` (default `120`) or the remaining
|
|
96
|
+
turn time. This startup budget is separate from the tool's execution limit; an expired readiness
|
|
97
|
+
wait reports `readiness_timeout`. Cancellation, ended delegation and terminal refusals stop the wait.
|
|
98
|
+
|
|
94
99
|
## Invariants extensions must not replace
|
|
95
100
|
|
|
96
101
|
Extensions may change effective agent capabilities, but they must not replace or bypass:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mainsequence-metatable
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.29.dev53
|
|
4
4
|
Summary: Main Sequence MetaTables Python client and standalone API
|
|
5
5
|
Author-email: Main Sequence GmbH <dev@main-sequence.io>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -51,7 +51,7 @@ Requires-Dist: twine<7,>=6; extra == "dev"
|
|
|
51
51
|
Provides-Extra: docs
|
|
52
52
|
Requires-Dist: mkdocs<2,>=1.6; extra == "docs"
|
|
53
53
|
Provides-Extra: agent
|
|
54
|
-
Requires-Dist: ms-tau-sdk==2.0.
|
|
54
|
+
Requires-Dist: ms-tau-sdk==2.0.10; extra == "agent"
|
|
55
55
|
Provides-Extra: mysql
|
|
56
56
|
Requires-Dist: PyMySQL[rsa]<1.2,>=1.1.1; extra == "mysql"
|
|
57
57
|
Provides-Extra: mssql
|
|
@@ -70,7 +70,7 @@ refuses anything else.
|
|
|
70
70
|
|
|
71
71
|
| Part | Rule |
|
|
72
72
|
| --- | --- |
|
|
73
|
-
| Runtime | `ms-tau-sdk` 2.0.
|
|
73
|
+
| Runtime | `ms-tau-sdk` 2.0.10, `openai-codex` / `gpt-5.6-luna`, thinking `medium`. |
|
|
74
74
|
| Identity | The person each turn serves (ADR 0020); the agent's own identity holds no grants. |
|
|
75
75
|
| Tools | The six tools below, served by the API over MCP when hosted (ADR 0021), and the SDK's skill-scoped `read`. No shell, file writes or Main Sequence MCP. |
|
|
76
76
|
| Instructions | `.tau/SYSTEM.md` covers MetaTables; vendored `pg-aiguide` skills cover PostgreSQL and TimescaleDB. |
|
|
@@ -35,6 +35,7 @@ The hosted API serves the read tools at `/mcp`, and the hosted Analyst uses them
|
|
|
35
35
|
| Analyst | The agent declares `mcp_applications: [{resource: metatables}]` and gets `metatables__list_tools` and `metatables__call_tool`. Its extension registers the tools only in a local `ms-tau` session, where they call the local API as the developer. |
|
|
36
36
|
| Key | The API's workflow key is `metatables`, because MCP keys become tool prefixes and must match `^[a-z][a-z0-9_]{0,39}$`. |
|
|
37
37
|
| Time limits | Each tool declares how long an Agent should wait in its MCP `_meta` under `mainsequence.ai/timeout-seconds/v1` (ms-tau-sdk 2.0.9): 120 s, the bound of one in-process API call, and 300 s for `deep_search`, which the release's 300 s request timeout bounds. An undeclared tool would get the Agent's default of 60 s. |
|
|
38
|
+
| Application readiness | The Analyst pins ms-tau-sdk 2.0.10, which waits when application access is `waking` before opening MCP ([SDK issue 87](https://github.com/mainsequence-sdk/ms-tau-sdk/issues/87)). The SDK's default readiness budget is 120 s, bounded by the remaining turn time; it honors retry guidance and cancellation. This wait is separate from each tool's execution limit, and expiry reports `readiness_timeout`. |
|
|
38
39
|
|
|
39
40
|
## Consequences
|
|
40
41
|
|
|
@@ -55,6 +55,16 @@
|
|
|
55
55
|
> reuses login-role connections within a pod, only by the login role that opened them
|
|
56
56
|
> and never through `SET ROLE`; no session state carries over from one use to the next.
|
|
57
57
|
|
|
58
|
+
> Amendment (2026-10-09, [MetaTables #50](https://github.com/mainsequence-projects/MetaTables/issues/50)):
|
|
59
|
+
> Application migrations use the shared `metatables` login ([ADR 0013](0013-application-owned-migrations.md)),
|
|
60
|
+
> whose `"$user"` schema is the catalog. The invariant that they cannot accidentally create
|
|
61
|
+
> tables in the catalog therefore rests on the migration connection, not on a separate login:
|
|
62
|
+
>
|
|
63
|
+
> - the connection is pinned to `search_path=public`, and the client verifies that path;
|
|
64
|
+
> - the API refuses a provider whose tables are in `metatables`.
|
|
65
|
+
>
|
|
66
|
+
> This guards against accidents, not misuse: the login keeps its privileges.
|
|
67
|
+
|
|
58
68
|
|
|
59
69
|
Date: 2026-09-29
|
|
60
70
|
|
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# ADR 0013: Application-owned migrations through the client
|
|
2
2
|
|
|
3
|
+
> Amendment (2026-10-09, [MetaTables #50](https://github.com/mainsequence-projects/MetaTables/issues/50)
|
|
4
|
+
> and [#51](https://github.com/mainsequence-projects/MetaTables/issues/51)): The configured login is
|
|
5
|
+
> named `metatables`, so its default `"$user", public` search path starts in the catalog schema.
|
|
6
|
+
>
|
|
7
|
+
> - The migration connection carries `search_path=public`, the only default schema hosted
|
|
8
|
+
> PostgreSQL accepts. The client refuses a session whose effective path is anything else
|
|
9
|
+
> before it reads Alembic state. On PostgreSQL the version table is always qualified:
|
|
10
|
+
> `public` when the provider declares no schema.
|
|
11
|
+
> - Before issuing the connection, the API refuses a provider whose tables are in the
|
|
12
|
+
> `metatables` schema or belong to a role the login can't use. Nothing is stamped or
|
|
13
|
+
> replayed.
|
|
14
|
+
> - Lifecycle step 5 never infers removal from absence. Finalization deletes a catalog binding
|
|
15
|
+
> only for a table the client names as removed (dropped from its models, or dropped by this
|
|
16
|
+
> run, as on downgrade) and that is confirmed absent. Any other missing or unreadable table
|
|
17
|
+
> keeps its binding and fails. Older clients name nothing, so their removal and downgrade
|
|
18
|
+
> cleanup fails safe until they upgrade.
|
|
19
|
+
|
|
3
20
|
Date: 2026-10-01
|
|
4
21
|
|
|
5
22
|
Status: Accepted and implemented.
|
{mainsequence_metatable-0.1.28.dev51 → mainsequence_metatable-0.1.29.dev53}/docs/api/openapi.json
RENAMED
|
@@ -679,6 +679,15 @@
|
|
|
679
679
|
}
|
|
680
680
|
],
|
|
681
681
|
"title": "Migration Provider Key"
|
|
682
|
+
},
|
|
683
|
+
"removed_meta_table_uids": {
|
|
684
|
+
"items": {
|
|
685
|
+
"format": "uuid",
|
|
686
|
+
"type": "string"
|
|
687
|
+
},
|
|
688
|
+
"maxItems": 200,
|
|
689
|
+
"title": "Removed Meta Table Uids",
|
|
690
|
+
"type": "array"
|
|
682
691
|
}
|
|
683
692
|
},
|
|
684
693
|
"required": [
|
|
@@ -120,6 +120,16 @@ lists what MetaTables requires.
|
|
|
120
120
|
6. Open **Settings** and check the declaration, the resolved connection, the
|
|
121
121
|
`ready` status and the applied migration revisions.
|
|
122
122
|
|
|
123
|
+
The login and the catalog schema are both named `metatables`, so the login's default
|
|
124
|
+
search path (`"$user", public`) starts in the catalog. Application migration connections
|
|
125
|
+
are therefore pinned to `public`, and a provider with tables in `metatables` is refused
|
|
126
|
+
with `provider_tables_misplaced`
|
|
127
|
+
([MetaTables #50](https://github.com/mainsequence-projects/MetaTables/issues/50)). Tables
|
|
128
|
+
created before 2026-09-30 may still belong to a retired `ms_ds_*_migration_owner` role. When
|
|
129
|
+
a migration reports `provider_tables_owner_unreachable`, a database administrator runs
|
|
130
|
+
`REASSIGN OWNED BY <role> TO mt_owner;` in that database. Granting the login that role
|
|
131
|
+
doesn't fix it.
|
|
132
|
+
|
|
123
133
|
## Deployment gate
|
|
124
134
|
|
|
125
135
|
In `.mainsequence/workflows/metatables-api.yaml`, the `migrate-system` Job
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "mainsequence-metatable"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.29.dev53"
|
|
8
8
|
description = "Main Sequence MetaTables Python client and standalone API"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13"
|
|
@@ -59,7 +59,7 @@ Documentation = "https://potential-doodle-wn39mnm.pages.github.io/"
|
|
|
59
59
|
[project.optional-dependencies]
|
|
60
60
|
dev = ["pytest>=8,<10", "ruff>=0.14", "build>=1,<2", "packaging>=24.2", "twine>=6,<7"]
|
|
61
61
|
docs = ["mkdocs>=1.6,<2"]
|
|
62
|
-
agent = ["ms-tau-sdk==2.0.
|
|
62
|
+
agent = ["ms-tau-sdk==2.0.10"]
|
|
63
63
|
mysql = ["PyMySQL[rsa]>=1.1.1,<1.2"]
|
|
64
64
|
# Keep the published extra name for existing installers; pyodbc is required.
|
|
65
65
|
mssql = []
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mainsequence-metatable
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.29.dev53
|
|
4
4
|
Summary: Main Sequence MetaTables Python client and standalone API
|
|
5
5
|
Author-email: Main Sequence GmbH <dev@main-sequence.io>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -51,7 +51,7 @@ Requires-Dist: twine<7,>=6; extra == "dev"
|
|
|
51
51
|
Provides-Extra: docs
|
|
52
52
|
Requires-Dist: mkdocs<2,>=1.6; extra == "docs"
|
|
53
53
|
Provides-Extra: agent
|
|
54
|
-
Requires-Dist: ms-tau-sdk==2.0.
|
|
54
|
+
Requires-Dist: ms-tau-sdk==2.0.10; extra == "agent"
|
|
55
55
|
Provides-Extra: mysql
|
|
56
56
|
Requires-Dist: PyMySQL[rsa]<1.2,>=1.1.1; extra == "mysql"
|
|
57
57
|
Provides-Extra: mssql
|
|
@@ -62,6 +62,9 @@ class FinalizeManagedRequest(BaseModel):
|
|
|
62
62
|
migration_provider_key: str | None = Field(default=None, max_length=384)
|
|
63
63
|
alembic_version_meta_table_uid: UUID | None = None
|
|
64
64
|
alembic_revision: str | None = Field(default=None, max_length=255)
|
|
65
|
+
# Tables the client removed from its models or dropped in this run. Only
|
|
66
|
+
# these may lose their binding when absent; absence alone is never removal.
|
|
67
|
+
removed_meta_table_uids: list[UUID] = Field(default_factory=list, max_length=200)
|
|
65
68
|
code_repository_context: dict[str, Any] | None = None
|
|
66
69
|
|
|
67
70
|
|
|
@@ -73,6 +76,18 @@ def physical_finalization_introspector() -> Callable[..., dict]:
|
|
|
73
76
|
return introspect_physical_table
|
|
74
77
|
|
|
75
78
|
|
|
79
|
+
def _missing_error(root: bool, other_schemas: list[str]) -> dict:
|
|
80
|
+
error = {
|
|
81
|
+
"code": "physical_table_missing",
|
|
82
|
+
"detail": "Alembic version table is missing." if root else (
|
|
83
|
+
"Physical table is missing and the request did not name it as removed."
|
|
84
|
+
),
|
|
85
|
+
}
|
|
86
|
+
if other_schemas:
|
|
87
|
+
error["other_schemas"] = other_schemas
|
|
88
|
+
return error
|
|
89
|
+
|
|
90
|
+
|
|
76
91
|
def _row(table: MetaTable | None, uid: UUID, *, previous: str = "unknown", exists: bool = False,
|
|
77
92
|
finalized: bool = False, deleted: bool = False, error: dict | None = None,
|
|
78
93
|
specialization: TimeIndexTable | None = None) -> dict:
|
|
@@ -113,6 +128,7 @@ def finalize_managed(
|
|
|
113
128
|
) -> dict:
|
|
114
129
|
"""Reconcile each requested row and return a per-table result envelope."""
|
|
115
130
|
requested = list(dict.fromkeys(payload.meta_table_uids))
|
|
131
|
+
removed = set(payload.removed_meta_table_uids)
|
|
116
132
|
lock_catalog(session)
|
|
117
133
|
guards = {
|
|
118
134
|
"migration_package": payload.migration_package,
|
|
@@ -162,16 +178,22 @@ def finalize_managed(
|
|
|
162
178
|
except PhysicalIntrospectionError as exc:
|
|
163
179
|
logger.warning("Physical table introspection failed during finalization", exc_info=True)
|
|
164
180
|
if exc.code == "physical_table_not_found":
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
else:
|
|
181
|
+
# Absence is never evidence of removal (MetaTables #50): only a table
|
|
182
|
+
# the request names as removed loses its binding, never the root.
|
|
183
|
+
if uid != version_root and uid in removed:
|
|
169
184
|
rows.append(_row(table, uid, previous=previous, specialization=specialization,
|
|
170
185
|
finalized=True, deleted=True))
|
|
171
186
|
session.delete(table)
|
|
187
|
+
else:
|
|
188
|
+
rows.append(_row(table, uid, previous=previous, specialization=specialization,
|
|
189
|
+
error=_missing_error(uid == version_root, exc.other_schemas)))
|
|
172
190
|
continue
|
|
191
|
+
detail = (
|
|
192
|
+
"The MetaTables login can't read this table's full shape."
|
|
193
|
+
if exc.code == "physical_table_inaccessible" else "Physical introspection failed."
|
|
194
|
+
)
|
|
173
195
|
rows.append(_row(table, uid, previous=previous, specialization=specialization, exists=True,
|
|
174
|
-
error={"code": exc.code, "detail":
|
|
196
|
+
error={"code": exc.code, "detail": detail}))
|
|
175
197
|
continue
|
|
176
198
|
except DataSourceAdmissionError as exc:
|
|
177
199
|
session.rollback()
|
|
@@ -179,6 +201,12 @@ def finalize_managed(
|
|
|
179
201
|
except (DataSourceIntegrationError, PhysicalConnectionUnavailable) as exc:
|
|
180
202
|
session.rollback()
|
|
181
203
|
raise HTTPException(status_code=503, detail="DataSource is unavailable.") from exc
|
|
204
|
+
if snapshot.get("owner_reachable") is False:
|
|
205
|
+
# Grant reconciliation must re-own platform-managed tables (ADR 0007).
|
|
206
|
+
rows.append(_row(table, uid, previous=previous, specialization=specialization, exists=True,
|
|
207
|
+
error={"code": "physical_table_inaccessible",
|
|
208
|
+
"detail": "The table's owner is a role the MetaTables login can't use."}))
|
|
209
|
+
continue
|
|
182
210
|
try:
|
|
183
211
|
with session.begin_nested():
|
|
184
212
|
contract = contract_from_physical_snapshot(
|
|
@@ -15,18 +15,63 @@ from metatables.api.app.auth.local_actor import catalog_session
|
|
|
15
15
|
from metatables.api.app.routes.table_introspection import data_source_provider
|
|
16
16
|
from metatables.api.app.routes.table_sql import authorized_table
|
|
17
17
|
from metatables.api.backend.backends.migration_connection import migration_connection_description
|
|
18
|
+
from metatables.api.backend.backends.operations import (
|
|
19
|
+
PhysicalConnectionUnavailable,
|
|
20
|
+
PhysicalIntrospectionError,
|
|
21
|
+
provider_physical_storage,
|
|
22
|
+
)
|
|
18
23
|
from metatables.api.backend.domain.data_source_rules import (
|
|
19
24
|
DataSourceAdmissionError,
|
|
20
25
|
require_data_source_access,
|
|
21
26
|
)
|
|
22
27
|
from metatables.api.backend.domain.permission_rules import TrustedActorFacts
|
|
23
28
|
from metatables.api.backend.integrations.runtime_data_sources import DataSourceIntegrationError
|
|
29
|
+
from metatables.api.backend.operations.bootstrap_migrations import PROGRESS_TABLE, VERSION_TABLE
|
|
24
30
|
from metatables.api.backend.persistence.grants import GrantRepository
|
|
25
31
|
from metatables.api.backend.persistence.locking import lock_catalog
|
|
26
|
-
from metatables.api.backend.persistence.models import MetaTable
|
|
32
|
+
from metatables.api.backend.persistence.models import Base, MetaTable
|
|
27
33
|
|
|
28
34
|
router = APIRouter(prefix="/meta-tables", tags=["MetaTables"])
|
|
29
35
|
|
|
36
|
+
CATALOG_TABLES = frozenset(Base.metadata.tables) | {PROGRESS_TABLE, VERSION_TABLE}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def provider_storage_inspector():
|
|
40
|
+
return provider_physical_storage
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def provider_storage_problem(tables, storage) -> dict | None:
|
|
44
|
+
"""Refuse providers whose tables a pinned connection would hide or can't use (#50)."""
|
|
45
|
+
misplaced = sorted(
|
|
46
|
+
f"metatables.{row['table_name']}"
|
|
47
|
+
for row in storage
|
|
48
|
+
if row["schema_name"] == "metatables" and row["table_name"] not in CATALOG_TABLES
|
|
49
|
+
)
|
|
50
|
+
if misplaced:
|
|
51
|
+
# A pinned connection would no longer see these and replay the provider's
|
|
52
|
+
# history next to them; nothing is stamped, replayed or chosen for it.
|
|
53
|
+
return {
|
|
54
|
+
"code": "provider_tables_misplaced",
|
|
55
|
+
"detail": "These provider tables are in the metatables catalog schema. An "
|
|
56
|
+
"administrator must move or drop them before the provider migrates.",
|
|
57
|
+
"tables": misplaced,
|
|
58
|
+
}
|
|
59
|
+
registered = {(item.physical_schema or "public", item.physical_table_name) for item in tables}
|
|
60
|
+
unreachable = [
|
|
61
|
+
row for row in storage
|
|
62
|
+
if (row["schema_name"], row["table_name"]) in registered and not row["owner_reachable"]
|
|
63
|
+
]
|
|
64
|
+
if unreachable:
|
|
65
|
+
return {
|
|
66
|
+
"code": "provider_tables_owner_unreachable",
|
|
67
|
+
"detail": "These provider tables belong to a role the MetaTables login can't use. "
|
|
68
|
+
"An administrator must move their ownership to mt_owner (REASSIGN OWNED) "
|
|
69
|
+
"before the provider migrates.",
|
|
70
|
+
"tables": [f"{row['schema_name']}.{row['table_name']}" for row in unreachable],
|
|
71
|
+
"owners": sorted({row["owner"] for row in unreachable}),
|
|
72
|
+
}
|
|
73
|
+
return None
|
|
74
|
+
|
|
30
75
|
|
|
31
76
|
class MigrationRequest(BaseModel):
|
|
32
77
|
model_config = ConfigDict(extra="forbid")
|
|
@@ -47,6 +92,7 @@ def migration_connection(
|
|
|
47
92
|
actor: TrustedActorFacts = Depends(trusted_actor_facts),
|
|
48
93
|
session: Session = Depends(catalog_session),
|
|
49
94
|
sources=Depends(data_source_provider),
|
|
95
|
+
inspect_storage=Depends(provider_storage_inspector),
|
|
50
96
|
):
|
|
51
97
|
lock_catalog(session)
|
|
52
98
|
table = authorized_table(session, actor, table_uid, edit=True, reserved_policy="reconcile")
|
|
@@ -78,11 +124,17 @@ def migration_connection(
|
|
|
78
124
|
try:
|
|
79
125
|
source = sources.get(table.data_source_uid)
|
|
80
126
|
require_data_source_access(source, access="write")
|
|
127
|
+
storage = inspect_storage(
|
|
128
|
+
source=source,
|
|
129
|
+
table_names=sorted({item.physical_table_name for item in tables if item.physical_table_name}),
|
|
130
|
+
)
|
|
81
131
|
result = migration_connection_description(source)
|
|
82
132
|
except DataSourceAdmissionError as exc:
|
|
83
133
|
raise HTTPException(exc.status_code, exc.code) from exc
|
|
84
|
-
except DataSourceIntegrationError as exc:
|
|
134
|
+
except (DataSourceIntegrationError, PhysicalConnectionUnavailable, PhysicalIntrospectionError) as exc:
|
|
85
135
|
raise HTTPException(503, "DataSource is unavailable.") from exc
|
|
136
|
+
if (problem := provider_storage_problem(tables, storage)) is not None:
|
|
137
|
+
raise HTTPException(409, problem)
|
|
86
138
|
# Include removed provider models so finalization reconciles dropped tables.
|
|
87
139
|
result["meta_table_uids"] = [str(item.uid) for item in tables if item.uid != root_uid]
|
|
88
140
|
control = getattr(request.app.state, "runtime_control", None)
|
|
@@ -14,6 +14,33 @@ from metatables.api.backend.backends.adapters.sqlite_connection import configure
|
|
|
14
14
|
from metatables.api.backend.backends.contracts import PhysicalIntrospectionError
|
|
15
15
|
from metatables.api.backend.integrations.runtime_data_sources import RuntimeDataSource
|
|
16
16
|
|
|
17
|
+
# pg_class and pg_attribute are readable whatever the login's privileges, unlike
|
|
18
|
+
# information_schema, which hides what the login can't access (MetaTables #51).
|
|
19
|
+
# The relation kinds match those information_schema.columns describes.
|
|
20
|
+
_RELATION_SQL = """
|
|
21
|
+
SELECT (SELECT count(*) FROM pg_attribute a
|
|
22
|
+
WHERE a.attrelid = c.oid AND a.attnum > 0 AND NOT a.attisdropped) AS column_count,
|
|
23
|
+
pg_has_role(current_user, c.relowner, 'MEMBER') AS owner_reachable
|
|
24
|
+
FROM pg_class c
|
|
25
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
26
|
+
WHERE n.nspname = %s AND c.relname = %s AND c.relkind IN ('r', 'p', 'v', 'f')
|
|
27
|
+
"""
|
|
28
|
+
_OTHER_SCHEMAS_SQL = """
|
|
29
|
+
SELECT n.nspname
|
|
30
|
+
FROM pg_class c
|
|
31
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
32
|
+
WHERE c.relname = %s AND n.nspname <> %s AND c.relkind IN ('r', 'p', 'v', 'f')
|
|
33
|
+
ORDER BY n.nspname
|
|
34
|
+
"""
|
|
35
|
+
_PROVIDER_STORAGE_SQL = """
|
|
36
|
+
SELECT n.nspname AS schema_name, c.relname AS table_name,
|
|
37
|
+
pg_get_userbyid(c.relowner) AS owner,
|
|
38
|
+
pg_has_role(current_user, c.relowner, 'MEMBER') AS owner_reachable
|
|
39
|
+
FROM pg_class c
|
|
40
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
41
|
+
WHERE c.relkind IN ('r', 'p') AND c.relname = ANY(%s)
|
|
42
|
+
ORDER BY n.nspname, c.relname
|
|
43
|
+
"""
|
|
17
44
|
_COLUMNS_SQL = """
|
|
18
45
|
SELECT column_name AS name, data_type, udt_name AS backend_type,
|
|
19
46
|
is_nullable = 'YES' AS nullable, ordinal_position
|
|
@@ -105,10 +132,19 @@ def introspect_postgresql_table(
|
|
|
105
132
|
with connection.cursor(cursor_factory=RealDictCursor) as cursor:
|
|
106
133
|
configure_cursor(cursor, readonly=True, statement_timeout_ms=15000)
|
|
107
134
|
arguments = (schema, physical_table_name)
|
|
135
|
+
cursor.execute(_RELATION_SQL, arguments)
|
|
136
|
+
relation = cursor.fetchone()
|
|
137
|
+
if relation is None:
|
|
138
|
+
cursor.execute(_OTHER_SCHEMAS_SQL, (physical_table_name, schema))
|
|
139
|
+
raise PhysicalIntrospectionError(
|
|
140
|
+
"physical_table_not_found",
|
|
141
|
+
other_schemas=[row["nspname"] for row in cursor.fetchall()],
|
|
142
|
+
)
|
|
108
143
|
cursor.execute(_COLUMNS_SQL, arguments)
|
|
109
144
|
columns = [dict(row) for row in cursor.fetchall()]
|
|
110
|
-
|
|
111
|
-
|
|
145
|
+
# Fewer visible columns than the table has: never a contract (#51).
|
|
146
|
+
if len(columns) < relation["column_count"]:
|
|
147
|
+
raise PhysicalIntrospectionError("physical_table_inaccessible")
|
|
112
148
|
cursor.execute(_INDEXES_SQL, arguments)
|
|
113
149
|
indexes = [dict(row) for row in cursor.fetchall()]
|
|
114
150
|
cursor.execute(_CONSTRAINTS_SQL, arguments)
|
|
@@ -127,4 +163,27 @@ def introspect_postgresql_table(
|
|
|
127
163
|
"columns": columns,
|
|
128
164
|
"indexes": indexes,
|
|
129
165
|
"constraints": constraints,
|
|
166
|
+
"owner_reachable": relation["owner_reachable"],
|
|
130
167
|
}
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def postgresql_provider_storage(
|
|
171
|
+
*, source: RuntimeDataSource, table_names: list[str]
|
|
172
|
+
) -> list[dict[str, Any]]:
|
|
173
|
+
"""Every schema in which the provider's table names exist, with their owners."""
|
|
174
|
+
with open_postgresql_connection(
|
|
175
|
+
source, access="read", operation="migration_preflight"
|
|
176
|
+
) as connection:
|
|
177
|
+
try:
|
|
178
|
+
with connection.cursor(cursor_factory=RealDictCursor) as cursor:
|
|
179
|
+
configure_cursor(cursor, readonly=True, statement_timeout_ms=15000)
|
|
180
|
+
cursor.execute(_PROVIDER_STORAGE_SQL, (list(table_names),))
|
|
181
|
+
rows = [dict(row) for row in cursor.fetchall()]
|
|
182
|
+
connection.rollback()
|
|
183
|
+
except DATABASE_ERRORS as exc:
|
|
184
|
+
try:
|
|
185
|
+
connection.rollback()
|
|
186
|
+
except DATABASE_ERRORS:
|
|
187
|
+
pass
|
|
188
|
+
raise PhysicalIntrospectionError("physical_table_introspection_failed") from exc
|
|
189
|
+
return rows
|
|
@@ -288,8 +288,10 @@ class TimeIndexQueryError(RuntimeError):
|
|
|
288
288
|
class PhysicalIntrospectionError(RuntimeError):
|
|
289
289
|
"""A secret-safe physical introspection failure."""
|
|
290
290
|
|
|
291
|
-
def __init__(self, code: str) -> None:
|
|
291
|
+
def __init__(self, code: str, *, other_schemas: Sequence[str] = ()) -> None:
|
|
292
292
|
self.code = code
|
|
293
|
+
# Where a same-named relation exists instead; a hint, not proof (#50).
|
|
294
|
+
self.other_schemas = list(other_schemas)
|
|
293
295
|
super().__init__(code)
|
|
294
296
|
|
|
295
297
|
|
|
@@ -4,9 +4,29 @@ DDL authority belongs to the configured database login. This does not create a
|
|
|
4
4
|
role or claim that a direct database connection enforces catalog table grants.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
+
import re
|
|
8
|
+
|
|
7
9
|
from sqlalchemy.engine import URL
|
|
8
10
|
|
|
9
11
|
from metatables.api.backend.backends.registry import engine_descriptor
|
|
12
|
+
from metatables.api.backend.domain.data_source_rules import DataSourceAdmissionError
|
|
13
|
+
|
|
14
|
+
_PLAIN_SCHEMA = re.compile(r"[a-z_][a-z0-9_]*")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def search_path_option(schema):
|
|
18
|
+
"""Pin unqualified application DDL to the default schema (MetaTables #50).
|
|
19
|
+
|
|
20
|
+
The login is named `metatables`, so PostgreSQL's default `"$user", public`
|
|
21
|
+
path would otherwise put unqualified tables in the catalog schema.
|
|
22
|
+
"""
|
|
23
|
+
if not _PLAIN_SCHEMA.fullmatch(schema or "") or schema == "metatables":
|
|
24
|
+
raise DataSourceAdmissionError(
|
|
25
|
+
"migration_schema_invalid",
|
|
26
|
+
"Application migrations need a plain default schema other than metatables.",
|
|
27
|
+
status_code=409,
|
|
28
|
+
)
|
|
29
|
+
return f"-c search_path={schema}"
|
|
10
30
|
|
|
11
31
|
|
|
12
32
|
def migration_connection_description(source):
|
|
@@ -23,7 +43,11 @@ def migration_connection_description(source):
|
|
|
23
43
|
"mssql": "mssql+pyodbc",
|
|
24
44
|
}[dialect]
|
|
25
45
|
if dialect == "postgresql":
|
|
26
|
-
query = {
|
|
46
|
+
query = {
|
|
47
|
+
"sslmode": settings.ssl_mode,
|
|
48
|
+
"connect_timeout": "10",
|
|
49
|
+
"options": search_path_option(settings.default_schema),
|
|
50
|
+
}
|
|
27
51
|
elif dialect == "mysql":
|
|
28
52
|
query = {"charset": settings.default_charset or "utf8mb4"}
|
|
29
53
|
else:
|
|
@@ -227,6 +227,21 @@ def introspect_physical_table(
|
|
|
227
227
|
)
|
|
228
228
|
|
|
229
229
|
|
|
230
|
+
def provider_physical_storage(*, source: RuntimeDataSource, table_names: Sequence[str]):
|
|
231
|
+
"""Where a migration provider's tables exist and who owns them (MetaTables #50).
|
|
232
|
+
|
|
233
|
+
Only PostgreSQL and TimescaleDB keep the catalog in a schema that unqualified
|
|
234
|
+
application DDL can reach; other engines report nothing.
|
|
235
|
+
"""
|
|
236
|
+
if source.class_type not in {"postgresql", "timescale_db"} or not table_names:
|
|
237
|
+
return []
|
|
238
|
+
from metatables.api.backend.backends.adapters.postgresql_introspection import (
|
|
239
|
+
postgresql_provider_storage,
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
return postgresql_provider_storage(source=source, table_names=list(table_names))
|
|
243
|
+
|
|
244
|
+
|
|
230
245
|
def drop_table(*, source: RuntimeDataSource, physical_schema: str | None, physical_table_name: str):
|
|
231
246
|
return backend_for(source).tables.drop(
|
|
232
247
|
physical_schema=physical_schema, physical_table_name=physical_table_name
|
|
@@ -72,6 +72,8 @@ class PreparedAlembicMetaTableMigration:
|
|
|
72
72
|
meta_table_uids: list[str]
|
|
73
73
|
reserved_tables: list[MetaTable] = field(default_factory=list)
|
|
74
74
|
owner_role_name: str | None = None
|
|
75
|
+
# Tables whose absence finalization may accept: removed models and tables this run dropped.
|
|
76
|
+
removed_meta_table_uids: list[str] = field(default_factory=list)
|
|
75
77
|
|
|
76
78
|
|
|
77
79
|
@dataclass(frozen=True, slots=True)
|
|
@@ -619,6 +621,7 @@ class AlembicMetaTableMigration:
|
|
|
619
621
|
finalize_meta_table_uids = list(
|
|
620
622
|
dict.fromkeys([str(registry_uid), *prepared.meta_table_uids])
|
|
621
623
|
)
|
|
624
|
+
removed = set(prepared.removed_meta_table_uids)
|
|
622
625
|
response = _finalize_in_batches(
|
|
623
626
|
finalize_meta_table_uids,
|
|
624
627
|
lambda batch: MetaTable.finalize_managed(
|
|
@@ -629,6 +632,7 @@ class AlembicMetaTableMigration:
|
|
|
629
632
|
migration_provider_key=self.migration_provider_key,
|
|
630
633
|
alembic_version_meta_table_uid=str(registry_uid),
|
|
631
634
|
alembic_revision=alembic_revision,
|
|
635
|
+
removed_meta_table_uids=[uid for uid in batch if uid in removed] or None,
|
|
632
636
|
),
|
|
633
637
|
timeout=timeout,
|
|
634
638
|
on_status=on_metatable_finalize_status,
|
|
@@ -9,6 +9,8 @@ from sqlalchemy.pool import NullPool
|
|
|
9
9
|
from . import sqlite as _sqlite # noqa: F401 Registers SQLite DDL and batch rules.
|
|
10
10
|
from .tls import migration_tls_arguments
|
|
11
11
|
|
|
12
|
+
CATALOG_SCHEMA = "metatables"
|
|
13
|
+
|
|
12
14
|
|
|
13
15
|
def version_schema(config, dialect):
|
|
14
16
|
schema = config.attributes["mainsequence_migration_provider"].version_table_schema
|
|
@@ -16,9 +18,41 @@ def version_schema(config, dialect):
|
|
|
16
18
|
return None
|
|
17
19
|
if dialect == "mssql" and schema in (None, "public"):
|
|
18
20
|
return config.attributes.get("metatables_default_schema", "dbo")
|
|
21
|
+
if dialect == "postgresql" and schema is None:
|
|
22
|
+
# Never left to search_path: the registry is the table the catalog
|
|
23
|
+
# registers, in the default schema (MetaTables #50).
|
|
24
|
+
return config.attributes.get("metatables_default_schema") or "public"
|
|
19
25
|
return schema
|
|
20
26
|
|
|
21
27
|
|
|
28
|
+
def require_default_schema_session(connection, migration, config):
|
|
29
|
+
"""Refuse a PostgreSQL session whose unqualified names could leave the default schema.
|
|
30
|
+
|
|
31
|
+
MetaTables issues migration connections pinned to the default schema; the
|
|
32
|
+
`metatables` login's own `"$user"` schema is the catalog (MetaTables #50).
|
|
33
|
+
"""
|
|
34
|
+
if connection.dialect.name != "postgresql":
|
|
35
|
+
return
|
|
36
|
+
declared = {table.schema for table in migration.target_metadata.tables.values()}
|
|
37
|
+
if CATALOG_SCHEMA in declared | {migration.version_table_schema}:
|
|
38
|
+
raise RuntimeError(
|
|
39
|
+
f"Application tables cannot use the reserved {CATALOG_SCHEMA} schema."
|
|
40
|
+
)
|
|
41
|
+
expected = config.attributes.get("metatables_default_schema") or "public"
|
|
42
|
+
began = not connection.in_transaction()
|
|
43
|
+
path = [row[0] for row in connection.exec_driver_sql(
|
|
44
|
+
"SELECT unnest(current_schemas(false))::text"
|
|
45
|
+
)]
|
|
46
|
+
if began:
|
|
47
|
+
connection.rollback()
|
|
48
|
+
if path != [expected]:
|
|
49
|
+
raise RuntimeError(
|
|
50
|
+
f"The migration connection resolves unqualified names in {path or 'no schema'}; "
|
|
51
|
+
f"MetaTables requires exactly [{expected!r}]. Use the connection MetaTables "
|
|
52
|
+
"issues for this provider or set search_path to the default schema."
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
22
56
|
@contextmanager
|
|
23
57
|
def migration_engine(config):
|
|
24
58
|
url = make_url(config.get_main_option("sqlalchemy.url"))
|
|
@@ -14,7 +14,7 @@ def run_mainsequence_alembic_env(
|
|
|
14
14
|
from alembic import context
|
|
15
15
|
|
|
16
16
|
from metatables.migrations import apply_mainsequence_migration_role
|
|
17
|
-
from metatables.migrations.connection import migration_engine
|
|
17
|
+
from metatables.migrations.connection import migration_engine, require_default_schema_session
|
|
18
18
|
from metatables.migrations.sqlite import AUTO_BATCH_OPTION, check_foreign_keys
|
|
19
19
|
|
|
20
20
|
def migration_provider() -> Any:
|
|
@@ -105,6 +105,7 @@ def run_mainsequence_alembic_env(
|
|
|
105
105
|
connection = config.attributes.get("connection")
|
|
106
106
|
if connection is not None:
|
|
107
107
|
apply_mainsequence_migration_role(connection, config)
|
|
108
|
+
require_default_schema_session(connection, migration_provider(), config)
|
|
108
109
|
context.configure(connection=connection, **configure_kwargs(connection))
|
|
109
110
|
run(connection)
|
|
110
111
|
return
|
|
@@ -112,6 +113,7 @@ def run_mainsequence_alembic_env(
|
|
|
112
113
|
config.attributes.setdefault("mainsequence_migration_provider", migration_provider())
|
|
113
114
|
with migration_engine(config) as engine, engine.connect() as connection:
|
|
114
115
|
apply_mainsequence_migration_role(connection, config)
|
|
116
|
+
require_default_schema_session(connection, migration_provider(), config)
|
|
115
117
|
context.configure(connection=connection, **configure_kwargs(connection))
|
|
116
118
|
run(connection)
|
|
117
119
|
|