mainsequence-metatable 0.1.28.dev50__tar.gz → 0.1.29.dev52__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (586) hide show
  1. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/client/metatables-meta-tables/SKILL.md +4 -0
  2. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/client/metatables-migrations/SKILL.md +21 -0
  3. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +4 -0
  4. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/PKG-INFO +1 -1
  5. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0007-database-enforced-table-access.md +10 -0
  6. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0013-application-owned-migrations.md +17 -0
  7. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/authentication-and-errors.md +2 -2
  8. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/openapi.json +9 -0
  9. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/bounded-transfers.md +5 -0
  10. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/operations/hosted-runtime.md +10 -0
  11. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/pyproject.toml +1 -1
  12. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/mainsequence_metatable.egg-info/PKG-INFO +1 -1
  13. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/managed_finalize.py +33 -5
  14. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/migration_connection.py +54 -2
  15. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +61 -2
  16. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/contracts.py +3 -1
  17. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/migration_connection.py +25 -1
  18. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/operations.py +15 -0
  19. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/__init__.py +4 -0
  20. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/connection.py +34 -0
  21. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/env.py +3 -1
  22. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/runner.py +45 -14
  23. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/models.py +8 -0
  24. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_managed_finalize_client_api.py +91 -0
  25. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_remaining_client_routes.py +6 -0
  26. mainsequence_metatable-0.1.29.dev52/tests/permissions/test_migration_boundary.py +178 -0
  27. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/uv.lock +1 -1
  28. mainsequence_metatable-0.1.28.dev50/tests/permissions/test_migration_boundary.py +0 -77
  29. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/analyze-with-sql/SKILL.md +0 -0
  30. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
  31. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/client/metatables-table-discovery/SKILL.md +0 -0
  32. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
  33. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/discover-tables/SKILL.md +0 -0
  34. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/ms_tau_sdk/PINNED_FROM.txt +0 -0
  35. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/ms_tau_sdk/tau_a2a_runtime_adapter/SKILL.md +0 -0
  36. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/ms_tau_sdk/tau_local_development/SKILL.md +0 -0
  37. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/ms_tau_sdk/tau_project_customization/SKILL.md +0 -0
  38. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/ms_tau_sdk/tau_repository_integration/SKILL.md +0 -0
  39. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.agents/skills/ms_tau_sdk/tau_security_and_access/SKILL.md +0 -0
  40. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/.mainsequence/workflows/metatables-api.yaml +0 -0
  41. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/LICENSE +0 -0
  42. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/MANIFEST.in +0 -0
  43. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/README.md +0 -0
  44. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/alembic.ini +0 -0
  45. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/api/metatables/main.py +0 -0
  46. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/compose.database-tests.yml +0 -0
  47. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/agent/0019-metatables-analyst-agent.md +0 -0
  48. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/agent/0020-analyst-reads-as-its-requester.md +0 -0
  49. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/agent/0021-api-serves-the-analyst-tools-over-mcp.md +0 -0
  50. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
  51. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
  52. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0004-approved-application-migrations.md +0 -0
  53. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
  54. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0006-historical-run-graphs.md +0 -0
  55. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
  56. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
  57. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
  58. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0009-shared-credential-store.md +0 -0
  59. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
  60. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
  61. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
  62. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
  63. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0016-impact-preflight.md +0 -0
  64. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0017-hosted-request-identity.md +0 -0
  65. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0018-search-document-pipeline.svg +0 -0
  66. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0018-table-search.md +0 -0
  67. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/api/0022-concurrent-requests-and-connection-reuse.md +0 -0
  68. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
  69. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
  70. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/adr/index.md +0 -0
  71. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/data-sources.md +0 -0
  72. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/overview.md +0 -0
  73. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/reference.md +0 -0
  74. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/tables-and-migrations.md +0 -0
  75. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/api/time-index-and-updates.md +0 -0
  76. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/assets/branding/metatables.svg +0 -0
  77. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/assets/diagrams/local-client-experience.svg +0 -0
  78. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/assets/diagrams/namespace-access.svg +0 -0
  79. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/build-an-updater.md +0 -0
  80. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/define-and-migrate-tables.md +0 -0
  81. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/deploy-application-migrations.md +0 -0
  82. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/installation-and-connection.md +0 -0
  83. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/local-storage.md +0 -0
  84. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/query-and-mutate.md +0 -0
  85. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/quickstart.md +0 -0
  86. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/read-existing-time-index-tables.md +0 -0
  87. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/register-existing-tables.md +0 -0
  88. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/tutorial.md +0 -0
  89. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/client/upgrade-legacy-app.md +0 -0
  90. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/concepts/architecture.md +0 -0
  91. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/concepts/data-sources.md +0 -0
  92. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/concepts/identity-and-scope.md +0 -0
  93. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/concepts/permissions-namespaces-labels.md +0 -0
  94. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/concepts/runs-and-execution-graphs.md +0 -0
  95. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
  96. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/concepts/time-index-tables-and-updates.md +0 -0
  97. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/contributing/architecture-and-boundaries.md +0 -0
  98. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/contributing/database-backends.md +0 -0
  99. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/contributing/documentation.md +0 -0
  100. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/contributing/releasing.md +0 -0
  101. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/contributing/testing.md +0 -0
  102. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/README.md +0 -0
  103. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/__init__.py +0 -0
  104. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/bounded_reader.py +0 -0
  105. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/data_sources/README.md +0 -0
  106. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/data_sources/mssql.json +0 -0
  107. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/data_sources/mysql.json +0 -0
  108. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/data_sources/postgresql.json +0 -0
  109. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/data_sources/register.py +0 -0
  110. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/external_table.py +0 -0
  111. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/README.md +0 -0
  112. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/__init__.py +0 -0
  113. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/__main__.py +0 -0
  114. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/migrations/__init__.py +0 -0
  115. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/migrations/env.py +0 -0
  116. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/migrations/script.py.mako +0 -0
  117. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
  118. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/local_app/tables.py +0 -0
  119. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/query.py +0 -0
  120. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/quickstart.py +0 -0
  121. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/reader.py +0 -0
  122. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/scripts/__init__.py +0 -0
  123. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/scripts/setup_metatables.py +0 -0
  124. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tables.py +0 -0
  125. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/README.md +0 -0
  126. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/__init__.py +0 -0
  127. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/__main__.py +0 -0
  128. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/data/README.md +0 -0
  129. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
  130. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/frames.py +0 -0
  131. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/__init__.py +0 -0
  132. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/env.py +0 -0
  133. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/registry.py +0 -0
  134. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/script.py.mako +0 -0
  135. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
  136. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
  137. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
  138. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
  139. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/operations.py +0 -0
  140. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/tables.py +0 -0
  141. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/tutorial/updaters.py +0 -0
  142. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/examples/updater.py +0 -0
  143. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/index.md +0 -0
  144. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/operations/catalog-migrations.md +0 -0
  145. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/operations/configuration.md +0 -0
  146. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/operations/local-runtime.md +0 -0
  147. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/operations/recovery-and-observability.md +0 -0
  148. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/operations/run-history.md +0 -0
  149. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/operations/run-logs.md +0 -0
  150. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/reference/capabilities.md +0 -0
  151. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/reference/cli.md +0 -0
  152. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/reference/python.md +0 -0
  153. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/security/index.md +0 -0
  154. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/security/ownership-and-sharing.md +0 -0
  155. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/docs/security/permissions.md +0 -0
  156. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/mkdocs.yml +0 -0
  157. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/__init__.py +0 -0
  158. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/build_reference.py +0 -0
  159. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/check_boundaries.py +0 -0
  160. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/check_client_api_coverage.py +0 -0
  161. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/check_distribution_sources.py +0 -0
  162. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/check_docs.py +0 -0
  163. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/check_examples_debug.py +0 -0
  164. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/check_project.py +0 -0
  165. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/dev_release_version.py +0 -0
  166. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/test_databases.py +0 -0
  167. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/scripts/test_postgresql.py +0 -0
  168. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/setup.cfg +0 -0
  169. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/mainsequence_metatable.egg-info/SOURCES.txt +0 -0
  170. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
  171. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
  172. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
  173. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
  174. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/__init__.py +0 -0
  175. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/_admin_source.json +0 -0
  176. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/_build.py +0 -0
  177. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/_skill_bundle.py +0 -0
  178. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/analysis.py +0 -0
  179. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/analyst/__init__.py +0 -0
  180. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/__init__.py +0 -0
  181. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/__init__.py +0 -0
  182. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/auth/__init__.py +0 -0
  183. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/auth/boundary.py +0 -0
  184. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/auth/local_actor.py +0 -0
  185. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/bootstrap.py +0 -0
  186. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/configuration.py +0 -0
  187. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/connection_count.py +0 -0
  188. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/credential_admin.py +0 -0
  189. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/development.py +0 -0
  190. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/development_client.py +0 -0
  191. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/error_logging.py +0 -0
  192. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/main.py +0 -0
  193. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/mcp.py +0 -0
  194. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/platform_cache.py +0 -0
  195. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/__init__.py +0 -0
  196. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/access_map.py +0 -0
  197. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/caller.py +0 -0
  198. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/column_search.py +0 -0
  199. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/contract_validation.py +0 -0
  200. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/data_sources.py +0 -0
  201. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/namespaces.py +0 -0
  202. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/run_logs.py +0 -0
  203. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/runtime_context.py +0 -0
  204. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/schema_graph.py +0 -0
  205. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/security.py +0 -0
  206. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_cascade.py +0 -0
  207. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_crud.py +0 -0
  208. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_delete.py +0 -0
  209. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_filter.py +0 -0
  210. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_import.py +0 -0
  211. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_introspection.py +0 -0
  212. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_patch.py +0 -0
  213. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_registration.py +0 -0
  214. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_response.py +0 -0
  215. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_search.py +0 -0
  216. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_search_document.py +0 -0
  217. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_sql.py +0 -0
  218. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
  219. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/time_index_delete.py +0 -0
  220. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/time_index_reads.py +0 -0
  221. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/time_index_stats.py +0 -0
  222. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/timescale_policies.py +0 -0
  223. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_batch.py +0 -0
  224. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
  225. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_constants.py +0 -0
  226. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_crud.py +0 -0
  227. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_details.py +0 -0
  228. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_graph.py +0 -0
  229. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
  230. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_registration.py +0 -0
  231. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_runs.py +0 -0
  232. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/routes/update_statistics.py +0 -0
  233. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/runtime.py +0 -0
  234. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/runtime_control.py +0 -0
  235. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/runtime_database.py +0 -0
  236. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/source_passwords.py +0 -0
  237. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/app/transfer.py +0 -0
  238. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/__init__.py +0 -0
  239. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/__init__.py +0 -0
  240. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/access.py +0 -0
  241. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
  242. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
  243. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
  244. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
  245. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
  246. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
  247. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
  248. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
  249. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
  250. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
  251. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
  252. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
  253. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
  254. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
  255. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
  256. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
  257. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
  258. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
  259. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
  260. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
  261. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/catalog.py +0 -0
  262. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
  263. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/catalog_types.py +0 -0
  264. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/connection_pool.py +0 -0
  265. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/hosted.py +0 -0
  266. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/hosted_access.py +0 -0
  267. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/native.py +0 -0
  268. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/pages.py +0 -0
  269. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/postgresql_access.py +0 -0
  270. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/registry.py +0 -0
  271. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/relation_tables.py +0 -0
  272. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/relational.py +0 -0
  273. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
  274. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/sqlite_access.py +0 -0
  275. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/streaming.py +0 -0
  276. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/backends/timescale.py +0 -0
  277. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/contracts/__init__.py +0 -0
  278. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/contracts/relation_import.py +0 -0
  279. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
  280. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
  281. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/contracts/values.py +0 -0
  282. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/domain/__init__.py +0 -0
  283. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
  284. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
  285. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/domain/index_statistics.py +0 -0
  286. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/domain/label_rules.py +0 -0
  287. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/domain/permission_rules.py +0 -0
  288. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/domain/update_constants.py +0 -0
  289. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/__init__.py +0 -0
  290. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
  291. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
  292. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/credential_store.py +0 -0
  293. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
  294. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
  295. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
  296. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
  297. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/run_logs.py +0 -0
  298. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
  299. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
  300. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/integrations/source_validation.py +0 -0
  301. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/__init__.py +0 -0
  302. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/env.py +0 -0
  303. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/script.py.mako +0 -0
  304. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
  305. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
  306. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
  307. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
  308. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
  309. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
  310. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
  311. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
  312. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
  313. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0010_cascade_targets.py +0 -0
  314. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0011_table_search.py +0 -0
  315. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/0012_table_creator.py +0 -0
  316. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
  317. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/__init__.py +0 -0
  318. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
  319. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
  320. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/create_table.py +0 -0
  321. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
  322. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/import_relations.py +0 -0
  323. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/introspect_table.py +0 -0
  324. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/read_time_index.py +0 -0
  325. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/operations/register_catalog.py +0 -0
  326. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/__init__.py +0 -0
  327. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/cascade.py +0 -0
  328. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/catalog.py +0 -0
  329. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/database.py +0 -0
  330. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/grants.py +0 -0
  331. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/impact.py +0 -0
  332. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/labels.py +0 -0
  333. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/locking.py +0 -0
  334. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/models.py +0 -0
  335. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
  336. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/projections.py +0 -0
  337. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
  338. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
  339. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
  340. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
  341. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/table_queries.py +0 -0
  342. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/table_response.py +0 -0
  343. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/update_graph.py +0 -0
  344. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
  345. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/updates.py +0 -0
  346. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
  347. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
  348. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/search/__init__.py +0 -0
  349. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/search/documents.py +0 -0
  350. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/search/embeddings.py +0 -0
  351. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/search/index.py +0 -0
  352. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/search/ranking.py +0 -0
  353. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/search/text.py +0 -0
  354. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/backend/search/worker.py +0 -0
  355. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/metatables/__init__.py +0 -0
  356. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/metatables/configuration.yaml +0 -0
  357. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/metatables/main.py +0 -0
  358. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/api/request_timing.py +0 -0
  359. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/__init__.py +0 -0
  360. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/admin_install.py +0 -0
  361. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/app.py +0 -0
  362. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/filters.py +0 -0
  363. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/local.py +0 -0
  364. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/migrations.py +0 -0
  365. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/project.py +0 -0
  366. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/cli/skills.py +0 -0
  367. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/compiled_sql/__init__.py +0 -0
  368. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/compiled_sql/mssql.py +0 -0
  369. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/compiled_sql/v1.py +0 -0
  370. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/dtype_codec.py +0 -0
  371. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/endpoint.py +0 -0
  372. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/README.md +0 -0
  373. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/__init__.py +0 -0
  374. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/bounded_reader.py +0 -0
  375. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/data_sources/README.md +0 -0
  376. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/data_sources/mssql.json +0 -0
  377. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/data_sources/mysql.json +0 -0
  378. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/data_sources/postgresql.json +0 -0
  379. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/data_sources/register.py +0 -0
  380. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/external_table.py +0 -0
  381. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/README.md +0 -0
  382. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/__init__.py +0 -0
  383. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/__main__.py +0 -0
  384. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
  385. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/migrations/env.py +0 -0
  386. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
  387. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
  388. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/local_app/tables.py +0 -0
  389. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/query.py +0 -0
  390. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/quickstart.py +0 -0
  391. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/reader.py +0 -0
  392. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/scripts/__init__.py +0 -0
  393. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/scripts/setup_metatables.py +0 -0
  394. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tables.py +0 -0
  395. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/README.md +0 -0
  396. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/__init__.py +0 -0
  397. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/__main__.py +0 -0
  398. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/data/README.md +0 -0
  399. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
  400. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/frames.py +0 -0
  401. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
  402. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/env.py +0 -0
  403. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
  404. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
  405. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
  406. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
  407. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
  408. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
  409. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/operations.py +0 -0
  410. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/tables.py +0 -0
  411. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/tutorial/updaters.py +0 -0
  412. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/examples/updater.py +0 -0
  413. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/future_registry.py +0 -0
  414. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/hashing.py +0 -0
  415. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/instrumentation.py +0 -0
  416. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/local_connection.py +0 -0
  417. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/local_files.py +0 -0
  418. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/local_run_logs.py +0 -0
  419. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/log_contract.py +0 -0
  420. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/alembic.py +0 -0
  421. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/provider.py +0 -0
  422. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/registry.py +0 -0
  423. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/scaffold.py +0 -0
  424. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/sqlite.py +0 -0
  425. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/templates/__init__.py +0 -0
  426. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/templates/env.py.mako +0 -0
  427. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/templates/script.py.mako +0 -0
  428. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/migrations/tls.py +0 -0
  429. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/pydantic_metadata.py +0 -0
  430. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/run_logging.py +0 -0
  431. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/runtime.py +0 -0
  432. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/runtime_context.py +0 -0
  433. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/runtime_contract.py +0 -0
  434. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/schema_names.py +0 -0
  435. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/sdk_compat.py +0 -0
  436. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/sqlalchemy_contracts.py +0 -0
  437. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/storage_layout_contract.py +0 -0
  438. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/time_index_table_refs.py +0 -0
  439. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/transfer.py +0 -0
  440. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/transfer_contract.py +0 -0
  441. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/transport.py +0 -0
  442. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/update_configuration_contract.py +0 -0
  443. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/__init__.py +0 -0
  444. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/configuration.py +0 -0
  445. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/dependencies.py +0 -0
  446. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/managers.py +0 -0
  447. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/namespacing.py +0 -0
  448. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/runner.py +0 -0
  449. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/updaters.py +0 -0
  450. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/updaters/utils.py +0 -0
  451. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/src/metatables/upload.py +0 -0
  452. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/analyst/test_agent_surface.py +0 -0
  453. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/analyst/test_api_search.py +0 -0
  454. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/analyst/test_mcp.py +0 -0
  455. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/analyst/test_tools.py +0 -0
  456. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_bootstrap_failure_cause.py +0 -0
  457. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_caller_endpoint.py +0 -0
  458. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_data_source_identity.py +0 -0
  459. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_development_client.py +0 -0
  460. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_hosted_agent.py +0 -0
  461. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_hosted_environment_target.py +0 -0
  462. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_local_mode.py +0 -0
  463. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_platform_fact_cache.py +0 -0
  464. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_request_identity.py +0 -0
  465. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_runtime_bootstrap.py +0 -0
  466. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_runtime_database.py +0 -0
  467. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_runtime_scaffold.py +0 -0
  468. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_runtime_selection.py +0 -0
  469. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_runtime_storage_binding.py +0 -0
  470. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/auth/test_source_passwords.py +0 -0
  471. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/catalog/test_catalog_foundation.py +0 -0
  472. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/catalog/test_contract_projection.py +0 -0
  473. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/catalog/test_database_config.py +0 -0
  474. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/catalog/test_index_statistics.py +0 -0
  475. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/catalog/test_migration.py +0 -0
  476. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/conftest.py +0 -0
  477. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/capabilities.json +0 -0
  478. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/client_signatures.json +0 -0
  479. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/database_operations.json +0 -0
  480. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/test_bounded_transfer.py +0 -0
  481. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/test_compiler_runtime_source.py +0 -0
  482. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/test_relation_batching.py +0 -0
  483. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/test_relation_import.py +0 -0
  484. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/test_runtime_contract_compat.py +0 -0
  485. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/test_storage_layouts.py +0 -0
  486. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/contracts/test_table_contracts.py +0 -0
  487. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/Dockerfile +0 -0
  488. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/Dockerfile.dockerignore +0 -0
  489. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/__init__.py +0 -0
  490. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/conftest.py +0 -0
  491. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/provider/__init__.py +0 -0
  492. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/provider/env.py +0 -0
  493. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
  494. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_api_contract.py +0 -0
  495. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_application_migration.py +0 -0
  496. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_bootstrap_recovery.py +0 -0
  497. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_catalog_contract.py +0 -0
  498. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_credential_catalog.py +0 -0
  499. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_physical_contract.py +0 -0
  500. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_relation_import.py +0 -0
  501. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_runtime_bootstrap.py +0 -0
  502. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_sql_security.py +0 -0
  503. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_backend/test_update_client.py +0 -0
  504. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_operations/test_physical_operations.py +0 -0
  505. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_operations/test_postgresql_operations.py +0 -0
  506. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/database_operations/test_runtime_and_temporal.py +0 -0
  507. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/documentation/test_project_checks.py +0 -0
  508. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_admin_installation.py +0 -0
  509. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_api_endpoint.py +0 -0
  510. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_application_owned_migrations.py +0 -0
  511. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_catalog_outage.py +0 -0
  512. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_client_api_contract.py +0 -0
  513. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_client_api_coverage.py +0 -0
  514. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_client_migration_scaffold.py +0 -0
  515. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_client_migration_tls.py +0 -0
  516. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_client_package.py +0 -0
  517. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_client_signatures.py +0 -0
  518. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_client_value_behaviors.py +0 -0
  519. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_data_source_registry.py +0 -0
  520. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_local_actor_client_api.py +0 -0
  521. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_local_cli_workflow.py +0 -0
  522. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_local_client_selection.py +0 -0
  523. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_namespaces_admin_http.py +0 -0
  524. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_public_imports.py +0 -0
  525. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_run_graphs.py +0 -0
  526. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_run_logs.py +0 -0
  527. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_runtime_upgrade.py +0 -0
  528. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_sdk_local_startup.py +0 -0
  529. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_sqlite_runtime.py +0 -0
  530. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_delete_client_api.py +0 -0
  531. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_filter_client_api.py +0 -0
  532. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_introspection_client_api.py +0 -0
  533. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_patch_client_api.py +0 -0
  534. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_search_api.py +0 -0
  535. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_search_document_api.py +0 -0
  536. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_search_scale.py +0 -0
  537. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_stats_api.py +0 -0
  538. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_update_pipeline.py +0 -0
  539. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_table_updates_http.py +0 -0
  540. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_time_index_delete_client_api.py +0 -0
  541. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_time_index_reads_client_api.py +0 -0
  542. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_timescale_policies_client_api.py +0 -0
  543. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_update_batch_client_api.py +0 -0
  544. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
  545. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
  546. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
  547. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/e2e/test_update_registration_client_api.py +0 -0
  548. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/examples/test_documented_examples.py +0 -0
  549. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/examples/test_postgresql_examples.py +0 -0
  550. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/examples/test_setup_launch.py +0 -0
  551. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/examples/test_tutorial.py +0 -0
  552. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_connection_reuse.py +0 -0
  553. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_credential_store.py +0 -0
  554. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_data_source_rules.py +0 -0
  555. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_local_data_sources.py +0 -0
  556. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_local_run_logs.py +0 -0
  557. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_postgresql_connection.py +0 -0
  558. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_postgresql_sql.py +0 -0
  559. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_postgresql_tables.py +0 -0
  560. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
  561. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_request_timing.py +0 -0
  562. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_serving_policy.py +0 -0
  563. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_source_validation.py +0 -0
  564. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/integrations/test_sqlite_operations.py +0 -0
  565. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/labels/test_labels.py +0 -0
  566. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/operations/test_create_table_operation.py +0 -0
  567. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/operations/test_create_table_postgres.py +0 -0
  568. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/operations/test_physical_operation_journal.py +0 -0
  569. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/operations/test_register_catalog.py +0 -0
  570. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/operations/test_search_documents.py +0 -0
  571. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/operations/test_timescale_policies.py +0 -0
  572. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/packaging/test_client_skills.py +0 -0
  573. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/packaging/test_dev_release_version.py +0 -0
  574. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/packaging/test_distribution_sources.py +0 -0
  575. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/packaging/test_editable_build.py +0 -0
  576. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/packaging/test_installed_distribution.py +0 -0
  577. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_access_map.py +0 -0
  578. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_governed_sql_scope.py +0 -0
  579. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_incremental_security.py +0 -0
  580. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_local_actor_membership.py +0 -0
  581. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_namespace_grants.py +0 -0
  582. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_security_api.py +0 -0
  583. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_table_body_filter.py +0 -0
  584. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_table_grants.py +0 -0
  585. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_table_queries.py +0 -0
  586. {mainsequence_metatable-0.1.28.dev50 → mainsequence_metatable-0.1.29.dev52}/tests/permissions/test_workload_principals.py +0 -0
@@ -178,3 +178,7 @@ for restart recovery. On an uncertain outcome, inspect `upload_receipt()` before
178
178
  resubmitting; do not assign a fresh key to bypass uncertainty. Administrator
179
179
  reconciliation requires verified physical evidence. This workflow uses the Main
180
180
  Sequence API and has no Artifact or temporary-URL dependency.
181
+
182
+ A 429 `transfer_capacity_exceeded` or 503 `database_connections_busy` means the
183
+ API was at capacity and nothing ran. Retry after `Retry-After`, including SQL and
184
+ writes; it is not an uncertain outcome.
@@ -240,6 +240,27 @@ Read `docs/operations/recovery-and-observability.md`.
240
240
  - Inspect partial DDL before retrying, especially on engines without transactional
241
241
  DDL. A finalization-only failure can be retried without reapplying committed
242
242
  revisions. Client DDL has no API executor journal.
243
+ - Finalization sends at most 10 tables per request, the version table first, and
244
+ reports `Finalizing MetaTables 11-20 of 62.` for larger providers (client 0.1.28
245
+ and later). A run that stops partway leaves earlier batches active; rerun the
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.
243
264
  - Destructive catalog deletion is not migration recovery and never bypasses
244
265
  schema-management protection.
245
266
 
@@ -124,3 +124,7 @@ for restart recovery. On an uncertain outcome, inspect `upload_receipt()` before
124
124
  resubmitting; do not assign a fresh key to bypass uncertainty. Administrator
125
125
  reconciliation requires verified physical evidence. This workflow uses the Main
126
126
  Sequence API and has no Artifact or temporary-URL dependency.
127
+
128
+ A 429 `transfer_capacity_exceeded` or 503 `database_connections_busy` means the
129
+ API was at capacity and nothing ran. Retry after `Retry-After`, an upload with the
130
+ same operation UUID; it is not an uncertain outcome.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence-metatable
3
- Version: 0.1.28.dev50
3
+ Version: 0.1.29.dev52
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
@@ -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.
@@ -73,7 +73,7 @@ DataSource and bootstrap state and returns `Cache-Control: no-store`.
73
73
  | 404 | Resource missing or not visible to the current actor. |
74
74
  | 409 | Lifecycle, capability, protection, reference, or physical-state conflict. |
75
75
  | 422 | Request/schema validation failure. |
76
- | 503 | Catalog, SDK verification/source access, physical connection, or an uncertain operation outcome is unavailable. |
76
+ | 503 | Catalog, SDK verification/source access, physical connection, or an uncertain operation outcome is unavailable; or every database connection the API may hold stayed busy (`database_connections_busy`, `Retry-After: 1`). |
77
77
 
78
78
  Most framework errors use a `detail` field. Some domain operations provide a
79
79
  structured code and field information. Raw-query validation errors can be returned
@@ -87,4 +87,4 @@ An unknown physical commit outcome requires reconciliation, not a blind retry.
87
87
 
88
88
  ## Transfer errors
89
89
 
90
- Data routes return 413 for request/row/response byte limits, 408 for the overall transfer deadline, and 429 with `Retry-After: 1` when per-process admission capacity is exhausted. Existing SQL/driver errors can retain their engine-specific deadline codes and status. Upload conflicts use 409 and uncertainty can use 503. A limit enforced by schema validation can return 422. See [typed client exceptions and recovery](../client/bounded-transfers.md).
90
+ Data routes return 413 for request/row/response byte limits, 408 for the overall transfer deadline, and 429 `transfer_capacity_exceeded` with `Retry-After: 1` when no data-request slot freed up within the request deadline (each API process runs `serving.concurrency` data requests at once). A 503 `database_connections_busy` with `Retry-After: 1` means every database connection stayed busy until the deadline. In both cases no statement ran, so any request, including SQL and writes, is safe to retry. Existing SQL/driver errors can retain their engine-specific deadline codes and status. Upload conflicts use 409 and uncertainty can use 503. A limit enforced by schema validation can return 422. See [typed client exceptions and recovery](../client/bounded-transfers.md).
@@ -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": [
@@ -132,6 +132,11 @@ statistics refresh (even though it uses GET), and receipt reconciliation do not
132
132
  automatically replay after uncertain failures. SDK authentication and one
133
133
  credential refresh remain; SDK and HTTP adapter write retry loops are bypassed.
134
134
 
135
+ Capacity answers are the exception: 429 `transfer_capacity_exceeded` and 503
136
+ `database_connections_busy` mean the API was at capacity and no statement ran.
137
+ Retry any request after `Retry-After`, including SQL and writes; the client does
138
+ so automatically only for safe reads.
139
+
135
140
  Exceptions are available in `metatables.transfer`: `TransferLimitError`,
136
141
  `TransferDeadlineError`, `TransferRetryExhausted`, `TransferConflictError`, and
137
142
  `TransferOutcomeUnknown`. Deterministic authorization/validation errors retain
@@ -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.28.dev50"
7
+ version = "0.1.29.dev52"
8
8
  description = "Main Sequence MetaTables Python client and standalone API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence-metatable
3
- Version: 0.1.28.dev50
3
+ Version: 0.1.29.dev52
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
@@ -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
- if uid == version_root:
166
- rows.append(_row(table, uid, previous=previous, specialization=specialization,
167
- error={"code": "physical_table_missing", "detail": "Alembic version table is missing."}))
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": "Physical introspection failed."}))
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
- if not columns:
111
- raise PhysicalIntrospectionError("physical_table_not_found")
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 = {"sslmode": settings.ssl_mode, "connect_timeout": "10"}
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