mainsequence-metatable 0.1.20.dev32__tar.gz → 0.1.21__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 (541) hide show
  1. {mainsequence_metatable-0.1.20.dev32/src/mainsequence_metatable.egg-info → mainsequence_metatable-0.1.21}/PKG-INFO +1 -1
  2. mainsequence_metatable-0.1.21/docs/adr/api/0017-hosted-request-identity.md +99 -0
  3. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/index.md +1 -0
  4. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/api/authentication-and-errors.md +19 -6
  5. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/api/data-sources.md +13 -3
  6. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/api/openapi.json +0 -5
  7. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/client/installation-and-connection.md +3 -3
  8. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/contributing/releasing.md +11 -5
  9. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/contributing/testing.md +16 -0
  10. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/operations/configuration.md +2 -1
  11. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/operations/hosted-runtime.md +12 -2
  12. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/security/index.md +5 -3
  13. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/mkdocs.yml +1 -0
  14. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/pyproject.toml +1 -1
  15. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/scripts/check_boundaries.py +1 -0
  16. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21/src/mainsequence_metatable.egg-info}/PKG-INFO +1 -1
  17. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/mainsequence_metatable.egg-info/SOURCES.txt +3 -2
  18. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/auth/boundary.py +20 -19
  19. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/main.py +49 -1
  20. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/runtime_contract.py +10 -5
  21. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/sdk_compat.py +6 -1
  22. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/transfer_contract.py +1 -1
  23. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/auth/test_local_mode.py +46 -31
  24. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/auth/test_platform_fact_cache.py +19 -12
  25. mainsequence_metatable-0.1.21/tests/auth/test_request_identity.py +240 -0
  26. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/auth/test_runtime_scaffold.py +6 -6
  27. mainsequence_metatable-0.1.21/tests/conftest.py +128 -0
  28. mainsequence_metatable-0.1.21/tests/contracts/test_runtime_contract_compat.py +26 -0
  29. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_sqlite_runtime.py +18 -20
  30. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/uv.lock +1 -1
  31. mainsequence_metatable-0.1.20.dev32/src/metatables/api/app/auth/caller_assertions.py +0 -39
  32. mainsequence_metatable-0.1.20.dev32/tests/auth/test_caller_assertions.py +0 -60
  33. mainsequence_metatable-0.1.20.dev32/tests/conftest.py +0 -40
  34. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/.agents/skills/client/metatables-local-development/SKILL.md +0 -0
  35. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/.agents/skills/client/metatables-meta-tables/SKILL.md +0 -0
  36. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/.agents/skills/client/metatables-migrations/SKILL.md +0 -0
  37. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/.agents/skills/client/metatables-time-index-table-updates/SKILL.md +0 -0
  38. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/.agents/skills/client/metatables-upgrade-legacy-app/SKILL.md +0 -0
  39. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/.mainsequence/workflows/metatables-api.yaml +0 -0
  40. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/LICENSE +0 -0
  41. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/MANIFEST.in +0 -0
  42. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/README.md +0 -0
  43. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/alembic.ini +0 -0
  44. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/api/metatables/main.py +0 -0
  45. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/compose.database-tests.yml +0 -0
  46. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0001-unified-api-storage-and-local-sqlite.md +0 -0
  47. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0002-application-administration-and-table-ownership.md +0 -0
  48. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0004-approved-application-migrations.md +0 -0
  49. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0005-run-logs-and-local-file-capture.md +0 -0
  50. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0006-historical-run-graphs.md +0 -0
  51. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0007-database-enforced-table-access.md +0 -0
  52. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0007-database-roles-and-privileges.svg +0 -0
  53. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0007-query-enforcement-path.svg +0 -0
  54. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0008-mysql-mssql-table-workflows.md +0 -0
  55. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0009-shared-credential-store.md +0 -0
  56. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0010-import-external-tables-and-views.md +0 -0
  57. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0012-bounded-data-transfer-and-safe-retries.md +0 -0
  58. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0013-application-owned-migrations.md +0 -0
  59. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md +0 -0
  60. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0015-timescale-compression-and-retention-policies.md +0 -0
  61. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/api/0016-impact-preflight.md +0 -0
  62. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/client/0003-api-endpoint-resolution.md +0 -0
  63. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/adr/client/0011-cli-local-development-with-managed-admin.md +0 -0
  64. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/api/overview.md +0 -0
  65. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/api/reference.md +0 -0
  66. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/api/tables-and-migrations.md +0 -0
  67. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/api/time-index-and-updates.md +0 -0
  68. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/assets/branding/metatables.svg +0 -0
  69. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/assets/diagrams/local-client-experience.svg +0 -0
  70. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/client/bounded-transfers.md +0 -0
  71. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/client/build-an-updater.md +0 -0
  72. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/client/define-and-migrate-tables.md +0 -0
  73. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/client/deploy-application-migrations.md +0 -0
  74. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/client/local-storage.md +0 -0
  75. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/client/query-and-mutate.md +0 -0
  76. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/client/quickstart.md +0 -0
  77. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/client/read-existing-time-index-tables.md +0 -0
  78. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/client/register-existing-tables.md +0 -0
  79. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/client/tutorial.md +0 -0
  80. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/client/upgrade-legacy-app.md +0 -0
  81. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/concepts/architecture.md +0 -0
  82. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/concepts/data-sources.md +0 -0
  83. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/concepts/identity-and-scope.md +0 -0
  84. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/concepts/permissions-namespaces-labels.md +0 -0
  85. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/concepts/runs-and-execution-graphs.md +0 -0
  86. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/concepts/table-contracts-and-lifecycle.md +0 -0
  87. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/concepts/time-index-tables-and-updates.md +0 -0
  88. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/contributing/architecture-and-boundaries.md +0 -0
  89. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/contributing/database-backends.md +0 -0
  90. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/contributing/documentation.md +0 -0
  91. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/README.md +0 -0
  92. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/__init__.py +0 -0
  93. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/bounded_reader.py +0 -0
  94. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/data_sources/README.md +0 -0
  95. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/data_sources/mssql.json +0 -0
  96. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/data_sources/mysql.json +0 -0
  97. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/data_sources/postgresql.json +0 -0
  98. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/data_sources/register.py +0 -0
  99. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/external_table.py +0 -0
  100. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/local_app/README.md +0 -0
  101. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/local_app/__init__.py +0 -0
  102. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/local_app/__main__.py +0 -0
  103. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/local_app/migrations/__init__.py +0 -0
  104. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/local_app/migrations/env.py +0 -0
  105. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/local_app/migrations/script.py.mako +0 -0
  106. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
  107. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/local_app/tables.py +0 -0
  108. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/query.py +0 -0
  109. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/quickstart.py +0 -0
  110. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/reader.py +0 -0
  111. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/scripts/__init__.py +0 -0
  112. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/scripts/setup_metatables.py +0 -0
  113. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tables.py +0 -0
  114. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/README.md +0 -0
  115. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/__init__.py +0 -0
  116. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/__main__.py +0 -0
  117. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/data/README.md +0 -0
  118. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
  119. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/frames.py +0 -0
  120. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/migrations/__init__.py +0 -0
  121. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/migrations/env.py +0 -0
  122. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/migrations/registry.py +0 -0
  123. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/migrations/script.py.mako +0 -0
  124. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/migrations/versions/__init__.py +0 -0
  125. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
  126. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
  127. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
  128. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/operations.py +0 -0
  129. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/tables.py +0 -0
  130. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/tutorial/updaters.py +0 -0
  131. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/examples/updater.py +0 -0
  132. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/index.md +0 -0
  133. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/operations/catalog-migrations.md +0 -0
  134. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/operations/local-runtime.md +0 -0
  135. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/operations/recovery-and-observability.md +0 -0
  136. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/operations/run-history.md +0 -0
  137. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/operations/run-logs.md +0 -0
  138. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/reference/capabilities.md +0 -0
  139. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/reference/cli.md +0 -0
  140. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/reference/python.md +0 -0
  141. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/security/ownership-and-sharing.md +0 -0
  142. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/docs/security/permissions.md +0 -0
  143. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/scripts/__init__.py +0 -0
  144. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/scripts/build_reference.py +0 -0
  145. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/scripts/check_client_api_coverage.py +0 -0
  146. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/scripts/check_distribution_sources.py +0 -0
  147. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/scripts/check_docs.py +0 -0
  148. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/scripts/check_examples_debug.py +0 -0
  149. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/scripts/check_project.py +0 -0
  150. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/scripts/dev_release_version.py +0 -0
  151. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/scripts/test_databases.py +0 -0
  152. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/scripts/test_postgresql.py +0 -0
  153. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/setup.cfg +0 -0
  154. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/mainsequence_metatable.egg-info/dependency_links.txt +0 -0
  155. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/mainsequence_metatable.egg-info/entry_points.txt +0 -0
  156. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/mainsequence_metatable.egg-info/requires.txt +0 -0
  157. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/mainsequence_metatable.egg-info/top_level.txt +0 -0
  158. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/__init__.py +0 -0
  159. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/_admin_source.json +0 -0
  160. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/_build.py +0 -0
  161. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/_skill_bundle.py +0 -0
  162. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/__init__.py +0 -0
  163. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/__init__.py +0 -0
  164. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/auth/__init__.py +0 -0
  165. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/auth/local_actor.py +0 -0
  166. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/bootstrap.py +0 -0
  167. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/configuration.py +0 -0
  168. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/credential_admin.py +0 -0
  169. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/development.py +0 -0
  170. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/development_client.py +0 -0
  171. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/error_logging.py +0 -0
  172. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/platform_cache.py +0 -0
  173. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/__init__.py +0 -0
  174. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/column_search.py +0 -0
  175. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/contract_validation.py +0 -0
  176. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/data_sources.py +0 -0
  177. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/managed_finalize.py +0 -0
  178. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/migration_connection.py +0 -0
  179. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/namespaces.py +0 -0
  180. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/run_logs.py +0 -0
  181. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/runtime_context.py +0 -0
  182. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/schema_graph.py +0 -0
  183. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/security.py +0 -0
  184. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/table_cascade.py +0 -0
  185. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/table_crud.py +0 -0
  186. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/table_delete.py +0 -0
  187. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/table_filter.py +0 -0
  188. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/table_import.py +0 -0
  189. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/table_introspection.py +0 -0
  190. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/table_patch.py +0 -0
  191. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/table_registration.py +0 -0
  192. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/table_response.py +0 -0
  193. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/table_search_document.py +0 -0
  194. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/table_sql.py +0 -0
  195. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/table_update_pipeline.py +0 -0
  196. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/time_index_delete.py +0 -0
  197. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/time_index_reads.py +0 -0
  198. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/time_index_stats.py +0 -0
  199. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/timescale_policies.py +0 -0
  200. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/update_batch.py +0 -0
  201. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/update_chunk_insert.py +0 -0
  202. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/update_constants.py +0 -0
  203. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/update_crud.py +0 -0
  204. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/update_details.py +0 -0
  205. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/update_graph.py +0 -0
  206. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/update_index_statistics.py +0 -0
  207. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/update_registration.py +0 -0
  208. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/update_runs.py +0 -0
  209. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/routes/update_statistics.py +0 -0
  210. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/runtime.py +0 -0
  211. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/runtime_control.py +0 -0
  212. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/runtime_database.py +0 -0
  213. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/source_passwords.py +0 -0
  214. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/app/transfer.py +0 -0
  215. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/__init__.py +0 -0
  216. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/__init__.py +0 -0
  217. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/access.py +0 -0
  218. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/__init__.py +0 -0
  219. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/maintenance/__init__.py +0 -0
  220. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/maintenance/postgresql.py +0 -0
  221. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/maintenance/runtime.py +0 -0
  222. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/maintenance/temporal.py +0 -0
  223. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/maintenance/timescaledb.py +0 -0
  224. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/maintenance/validation.py +0 -0
  225. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/postgresql_cascade_delete.py +0 -0
  226. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/postgresql_connection.py +0 -0
  227. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/postgresql_introspection.py +0 -0
  228. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/postgresql_table_delete.py +0 -0
  229. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/postgresql_tables.py +0 -0
  230. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/postgresql_time_index.py +0 -0
  231. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/postgresql_time_index_delete.py +0 -0
  232. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/postgresql_time_index_queries.py +0 -0
  233. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/postgresql_time_index_stats.py +0 -0
  234. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/postgresql_time_index_write.py +0 -0
  235. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/source_validation.py +0 -0
  236. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/sqlite_connection.py +0 -0
  237. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/sqlite_introspection.py +0 -0
  238. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/adapters/table_cursor.py +0 -0
  239. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/catalog.py +0 -0
  240. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/catalog_ddl.py +0 -0
  241. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/catalog_types.py +0 -0
  242. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/contracts.py +0 -0
  243. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/hosted.py +0 -0
  244. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/hosted_access.py +0 -0
  245. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/migration_connection.py +0 -0
  246. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/native.py +0 -0
  247. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/operations.py +0 -0
  248. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/pages.py +0 -0
  249. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/postgresql_access.py +0 -0
  250. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/registry.py +0 -0
  251. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/relation_tables.py +0 -0
  252. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/relational.py +0 -0
  253. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/restricted_sql.py +0 -0
  254. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/sqlite_access.py +0 -0
  255. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/streaming.py +0 -0
  256. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/backends/timescale.py +0 -0
  257. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/contracts/__init__.py +0 -0
  258. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/contracts/relation_import.py +0 -0
  259. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/contracts/storage_layouts.py +0 -0
  260. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/contracts/table_contracts.py +0 -0
  261. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/contracts/values.py +0 -0
  262. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/domain/__init__.py +0 -0
  263. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/domain/catalog_rules.py +0 -0
  264. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/domain/data_source_rules.py +0 -0
  265. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/domain/index_statistics.py +0 -0
  266. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/domain/label_rules.py +0 -0
  267. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/domain/permission_rules.py +0 -0
  268. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/domain/update_constants.py +0 -0
  269. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/integrations/__init__.py +0 -0
  270. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/integrations/catalog_data_sources.py +0 -0
  271. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/integrations/credential_keys.py +0 -0
  272. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/integrations/credential_store.py +0 -0
  273. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/integrations/data_source_provider.py +0 -0
  274. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/integrations/local_credentials.py +0 -0
  275. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/integrations/local_workspace.py +0 -0
  276. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/integrations/platform_principals.py +0 -0
  277. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/integrations/run_logs.py +0 -0
  278. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/integrations/runtime_binding.py +0 -0
  279. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/integrations/runtime_data_sources.py +0 -0
  280. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/integrations/source_validation.py +0 -0
  281. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/migrations/__init__.py +0 -0
  282. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/migrations/env.py +0 -0
  283. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/migrations/script.py.mako +0 -0
  284. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/migrations/versions/0001_initial.py +0 -0
  285. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/migrations/versions/0002_security_model.py +0 -0
  286. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/migrations/versions/0003_run_log_capture.py +0 -0
  287. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/migrations/versions/0004_historical_run_graphs.py +0 -0
  288. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/migrations/versions/0005_database_access.py +0 -0
  289. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/migrations/versions/0006_local_credentials.py +0 -0
  290. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/migrations/versions/0007_external_relation_names.py +0 -0
  291. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/migrations/versions/0008_upload_receipts.py +0 -0
  292. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/migrations/versions/0009_timescale_policies.py +0 -0
  293. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/migrations/versions/0010_cascade_targets.py +0 -0
  294. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/migrations/versions/__init__.py +0 -0
  295. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/operations/__init__.py +0 -0
  296. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/operations/bootstrap_migrations.py +0 -0
  297. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/operations/catalog_schema.py +0 -0
  298. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/operations/create_table.py +0 -0
  299. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/operations/finalize_managed.py +0 -0
  300. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/operations/import_relations.py +0 -0
  301. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/operations/introspect_table.py +0 -0
  302. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/operations/read_time_index.py +0 -0
  303. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/operations/register_catalog.py +0 -0
  304. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/operations/search_documents.py +0 -0
  305. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/__init__.py +0 -0
  306. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/cascade.py +0 -0
  307. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/catalog.py +0 -0
  308. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/database.py +0 -0
  309. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/grants.py +0 -0
  310. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/impact.py +0 -0
  311. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/labels.py +0 -0
  312. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/locking.py +0 -0
  313. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/models.py +0 -0
  314. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/physical_operations.py +0 -0
  315. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/projections.py +0 -0
  316. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/run_graphs.py +0 -0
  317. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/schema_graph.py +0 -0
  318. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/sqlite_types.py +0 -0
  319. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/table_body_filter.py +0 -0
  320. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/table_queries.py +0 -0
  321. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/table_response.py +0 -0
  322. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/update_graph.py +0 -0
  323. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/update_pipeline.py +0 -0
  324. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/updates.py +0 -0
  325. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/persistence/upload_receipts.py +0 -0
  326. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/backend/presentation/data_source_summary.py +0 -0
  327. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/metatables/__init__.py +0 -0
  328. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/metatables/configuration.yaml +0 -0
  329. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/api/metatables/main.py +0 -0
  330. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/cli/__init__.py +0 -0
  331. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/cli/admin_install.py +0 -0
  332. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/cli/app.py +0 -0
  333. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/cli/filters.py +0 -0
  334. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/cli/local.py +0 -0
  335. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/cli/migrations.py +0 -0
  336. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/cli/project.py +0 -0
  337. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/cli/skills.py +0 -0
  338. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/compiled_sql/__init__.py +0 -0
  339. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/compiled_sql/mssql.py +0 -0
  340. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/compiled_sql/v1.py +0 -0
  341. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/dtype_codec.py +0 -0
  342. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/endpoint.py +0 -0
  343. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/README.md +0 -0
  344. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/__init__.py +0 -0
  345. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/bounded_reader.py +0 -0
  346. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/data_sources/README.md +0 -0
  347. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/data_sources/mssql.json +0 -0
  348. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/data_sources/mysql.json +0 -0
  349. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/data_sources/postgresql.json +0 -0
  350. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/data_sources/register.py +0 -0
  351. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/external_table.py +0 -0
  352. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/local_app/README.md +0 -0
  353. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/local_app/__init__.py +0 -0
  354. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/local_app/__main__.py +0 -0
  355. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/local_app/migrations/__init__.py +0 -0
  356. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/local_app/migrations/env.py +0 -0
  357. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/local_app/migrations/script.py.mako +0 -0
  358. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/local_app/migrations/versions/metatables_local_example/0001.py +0 -0
  359. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/local_app/tables.py +0 -0
  360. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/query.py +0 -0
  361. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/quickstart.py +0 -0
  362. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/reader.py +0 -0
  363. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/scripts/__init__.py +0 -0
  364. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/scripts/setup_metatables.py +0 -0
  365. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tables.py +0 -0
  366. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/README.md +0 -0
  367. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/__init__.py +0 -0
  368. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/__main__.py +0 -0
  369. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/data/README.md +0 -0
  370. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/data/yahoo_spy_qqq_iwm_2026-06-15_2026-07-17.csv +0 -0
  371. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/frames.py +0 -0
  372. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/migrations/__init__.py +0 -0
  373. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/migrations/env.py +0 -0
  374. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/migrations/registry.py +0 -0
  375. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/migrations/script.py.mako +0 -0
  376. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/migrations/versions/__init__.py +0 -0
  377. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0001_create_market_tutorial_tables.py +0 -0
  378. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/0002_create_rolling_volatility.py +0 -0
  379. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/migrations/versions/metatables_market_tutorial/__init__.py +0 -0
  380. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/operations.py +0 -0
  381. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/tables.py +0 -0
  382. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/tutorial/updaters.py +0 -0
  383. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/examples/updater.py +0 -0
  384. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/future_registry.py +0 -0
  385. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/hashing.py +0 -0
  386. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/instrumentation.py +0 -0
  387. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/local_connection.py +0 -0
  388. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/local_files.py +0 -0
  389. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/local_run_logs.py +0 -0
  390. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/log_contract.py +0 -0
  391. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/migrations/__init__.py +0 -0
  392. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/migrations/alembic.py +0 -0
  393. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/migrations/connection.py +0 -0
  394. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/migrations/env.py +0 -0
  395. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/migrations/provider.py +0 -0
  396. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/migrations/registry.py +0 -0
  397. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/migrations/runner.py +0 -0
  398. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/migrations/scaffold.py +0 -0
  399. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/migrations/sqlite.py +0 -0
  400. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/migrations/templates/__init__.py +0 -0
  401. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/migrations/templates/env.py.mako +0 -0
  402. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/migrations/templates/script.py.mako +0 -0
  403. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/migrations/tls.py +0 -0
  404. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/models.py +0 -0
  405. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/pydantic_metadata.py +0 -0
  406. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/run_logging.py +0 -0
  407. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/runtime.py +0 -0
  408. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/runtime_context.py +0 -0
  409. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/schema_names.py +0 -0
  410. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/sqlalchemy_contracts.py +0 -0
  411. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/storage_layout_contract.py +0 -0
  412. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/time_index_table_refs.py +0 -0
  413. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/transfer.py +0 -0
  414. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/transport.py +0 -0
  415. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/update_configuration_contract.py +0 -0
  416. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/updaters/__init__.py +0 -0
  417. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/updaters/configuration.py +0 -0
  418. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/updaters/dependencies.py +0 -0
  419. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/updaters/managers.py +0 -0
  420. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/updaters/namespacing.py +0 -0
  421. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/updaters/runner.py +0 -0
  422. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/updaters/updaters.py +0 -0
  423. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/updaters/utils.py +0 -0
  424. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/src/metatables/upload.py +0 -0
  425. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/auth/test_bootstrap_failure_cause.py +0 -0
  426. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/auth/test_data_source_identity.py +0 -0
  427. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/auth/test_development_client.py +0 -0
  428. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/auth/test_hosted_environment_target.py +0 -0
  429. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/auth/test_runtime_bootstrap.py +0 -0
  430. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/auth/test_runtime_database.py +0 -0
  431. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/auth/test_runtime_selection.py +0 -0
  432. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/auth/test_runtime_storage_binding.py +0 -0
  433. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/auth/test_source_passwords.py +0 -0
  434. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/catalog/test_catalog_foundation.py +0 -0
  435. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/catalog/test_contract_projection.py +0 -0
  436. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/catalog/test_database_config.py +0 -0
  437. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/catalog/test_index_statistics.py +0 -0
  438. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/catalog/test_migration.py +0 -0
  439. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/contracts/capabilities.json +0 -0
  440. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/contracts/client_signatures.json +0 -0
  441. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/contracts/database_operations.json +0 -0
  442. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/contracts/test_bounded_transfer.py +0 -0
  443. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/contracts/test_compiler_runtime_source.py +0 -0
  444. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/contracts/test_relation_batching.py +0 -0
  445. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/contracts/test_relation_import.py +0 -0
  446. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/contracts/test_storage_layouts.py +0 -0
  447. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/contracts/test_table_contracts.py +0 -0
  448. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/Dockerfile +0 -0
  449. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/Dockerfile.dockerignore +0 -0
  450. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/__init__.py +0 -0
  451. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/conftest.py +0 -0
  452. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/provider/__init__.py +0 -0
  453. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/provider/env.py +0 -0
  454. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/provider/versions/0001_measurement.py +0 -0
  455. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/test_api_contract.py +0 -0
  456. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/test_application_migration.py +0 -0
  457. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/test_bootstrap_recovery.py +0 -0
  458. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/test_catalog_contract.py +0 -0
  459. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/test_credential_catalog.py +0 -0
  460. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/test_physical_contract.py +0 -0
  461. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/test_relation_import.py +0 -0
  462. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/test_runtime_bootstrap.py +0 -0
  463. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/test_sql_security.py +0 -0
  464. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_backend/test_update_client.py +0 -0
  465. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_operations/test_physical_operations.py +0 -0
  466. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_operations/test_postgresql_operations.py +0 -0
  467. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/database_operations/test_runtime_and_temporal.py +0 -0
  468. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/documentation/test_project_checks.py +0 -0
  469. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_admin_installation.py +0 -0
  470. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_api_endpoint.py +0 -0
  471. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_application_owned_migrations.py +0 -0
  472. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_catalog_outage.py +0 -0
  473. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_client_api_contract.py +0 -0
  474. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_client_api_coverage.py +0 -0
  475. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_client_migration_scaffold.py +0 -0
  476. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_client_migration_tls.py +0 -0
  477. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_client_package.py +0 -0
  478. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_client_signatures.py +0 -0
  479. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_client_value_behaviors.py +0 -0
  480. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_data_source_registry.py +0 -0
  481. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_local_actor_client_api.py +0 -0
  482. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_local_cli_workflow.py +0 -0
  483. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_local_client_selection.py +0 -0
  484. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_managed_finalize_client_api.py +0 -0
  485. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_namespaces_admin_http.py +0 -0
  486. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_public_imports.py +0 -0
  487. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_remaining_client_routes.py +0 -0
  488. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_run_graphs.py +0 -0
  489. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_run_logs.py +0 -0
  490. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_runtime_upgrade.py +0 -0
  491. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_sdk_local_startup.py +0 -0
  492. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_table_delete_client_api.py +0 -0
  493. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_table_filter_client_api.py +0 -0
  494. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_table_introspection_client_api.py +0 -0
  495. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_table_patch_client_api.py +0 -0
  496. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_table_search_document_api.py +0 -0
  497. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_table_stats_api.py +0 -0
  498. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_table_update_pipeline.py +0 -0
  499. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_table_updates_http.py +0 -0
  500. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_time_index_delete_client_api.py +0 -0
  501. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_time_index_reads_client_api.py +0 -0
  502. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_timescale_policies_client_api.py +0 -0
  503. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_update_batch_client_api.py +0 -0
  504. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_update_chunk_insert_client_api.py +0 -0
  505. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_update_dependency_priority_client_api.py +0 -0
  506. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_update_index_statistics_client_api.py +0 -0
  507. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/e2e/test_update_registration_client_api.py +0 -0
  508. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/examples/test_documented_examples.py +0 -0
  509. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/examples/test_postgresql_examples.py +0 -0
  510. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/examples/test_setup_launch.py +0 -0
  511. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/examples/test_tutorial.py +0 -0
  512. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/integrations/test_credential_store.py +0 -0
  513. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/integrations/test_data_source_rules.py +0 -0
  514. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/integrations/test_local_data_sources.py +0 -0
  515. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/integrations/test_local_run_logs.py +0 -0
  516. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/integrations/test_postgresql_connection.py +0 -0
  517. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/integrations/test_postgresql_sql.py +0 -0
  518. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/integrations/test_postgresql_tables.py +0 -0
  519. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/integrations/test_postgresql_time_index_queries.py +0 -0
  520. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/integrations/test_source_validation.py +0 -0
  521. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/integrations/test_sqlite_operations.py +0 -0
  522. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/labels/test_labels.py +0 -0
  523. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/operations/test_create_table_operation.py +0 -0
  524. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/operations/test_create_table_postgres.py +0 -0
  525. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/operations/test_physical_operation_journal.py +0 -0
  526. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/operations/test_register_catalog.py +0 -0
  527. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/operations/test_search_documents.py +0 -0
  528. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/operations/test_timescale_policies.py +0 -0
  529. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/packaging/test_client_skills.py +0 -0
  530. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/packaging/test_dev_release_version.py +0 -0
  531. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/packaging/test_distribution_sources.py +0 -0
  532. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/packaging/test_editable_build.py +0 -0
  533. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/packaging/test_installed_distribution.py +0 -0
  534. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/permissions/test_governed_sql_scope.py +0 -0
  535. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/permissions/test_local_actor_membership.py +0 -0
  536. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/permissions/test_migration_boundary.py +0 -0
  537. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/permissions/test_namespace_grants.py +0 -0
  538. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/permissions/test_security_api.py +0 -0
  539. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/permissions/test_table_body_filter.py +0 -0
  540. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/permissions/test_table_grants.py +0 -0
  541. {mainsequence_metatable-0.1.20.dev32 → mainsequence_metatable-0.1.21}/tests/permissions/test_table_queries.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence-metatable
3
- Version: 0.1.20.dev32
3
+ Version: 0.1.21
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
@@ -0,0 +1,99 @@
1
+ # ADR 0017: Hosted caller identity through the SDK request identity
2
+
3
+ Date: 2026-10-04
4
+
5
+ Status: Accepted.
6
+
7
+ Implementation status: implemented for 0.1.21. Tests cover the hosted entrypoint's
8
+ launcher declaration, genuine EdDSA caller assertions verified by the SDK, rejected
9
+ callers, Local isolation, and PodDeploymentOrchestrator's own launcher run against
10
+ the deployed entrypoint. A hosted rollout has not yet been verified.
11
+
12
+ Owner: MetaTables API. The SDK owns caller verification
13
+ ([SDK 9.0.6 ADR 0036: Request-scoped logged user](https://github.com/mainsequence-sdk/mainsequence-sdk/blob/v9.0.6/docs/adr/0036-request-scoped-logged-user.md));
14
+ the platform's FastAPI launcher owns the startup check.
15
+
16
+ Related decisions: [ADR 0001](0001-unified-api-storage-and-local-sqlite.md) (one API
17
+ execution path, with Local for development), [ADR 0002](0002-application-administration-and-table-ownership.md)
18
+ (admission and platform facts) and [ADR 0007](0007-database-enforced-table-access.md)
19
+ (the API authenticates the caller; the database enforces grants).
20
+
21
+ ## Context
22
+
23
+ Since 2026-09-28 the platform's FastAPI launcher serves an application only when
24
+ `app.state.mainsequence_request_identity` declares the installed SDK integration,
25
+ the deployment's caller mode (`assertion` when hosted) and its public ingress
26
+ (`FASTAPI_PUBLIC_INGRESS`). The SDK's `install_request_identity(app)` sets that
27
+ declaration. MetaTables verified caller assertions itself, in its admission
28
+ dependency, and never installed the integration. Every hosted revision after
29
+ 0.1.13 therefore stopped at startup with "Application request identity is not
30
+ installed" while traffic stayed on the 0.1.13 revision
31
+ ([#34](https://github.com/mainsequence-projects/MetaTables/issues/34)).
32
+
33
+ ## Decision
34
+
35
+ - The application factory installs the SDK request identity once, after mounting
36
+ every route, for the hosted runtime only. Its middleware is the outermost
37
+ application middleware, so callers are verified before local admission,
38
+ transfer limits or any route.
39
+ - It installs it when the process carries the platform's caller-authentication
40
+ configuration: any of `MAINSEQUENCE_CALLER_AUTH_MODE`, `APP_NAME`,
41
+ `FASTAPI_PUBLIC_BASE_URL`, `MAINSEQUENCE_CALLER_ASSERTION_ISSUER` or
42
+ `MAINSEQUENCE_CALLER_ASSERTION_JWKS_URL`. The SDK and the launcher select their
43
+ mode from the same variables, and every hosted deployment carries them.
44
+ - The hosted API accepts only platform caller assertions. If the SDK would select
45
+ another mode, creating the app fails; incomplete trust configuration also fails
46
+ at startup. Without any of these variables nothing is installed, no caller is
47
+ ever bound, and admission rejects every caller with 401.
48
+ - The SDK verifies each assertion once, before the route: missing or invalid proof
49
+ is 401 and unavailable key discovery is 503. Admission takes the caller's User UID
50
+ from `User.get_logged_user()` and the verified target Environment from the request
51
+ state the SDK records. It no longer reads the assertion header or calls the
52
+ verifier. The SDK verifier keeps no replay record, so assertions are not
53
+ single-use; a second verification would only repeat key discovery and could
54
+ disagree at the expiry boundary.
55
+ - Local and developer runtimes never install it. The SDK's local mode requires a
56
+ Bearer token on every request and validates it against the platform, while Local
57
+ admits requests through its loopback listener and the launcher's private token
58
+ with the developer's SDK user resolved at startup. Local clients send no Bearer
59
+ token, so the SDK would reject every Local request. `metatables serve --local`
60
+ runs its own uvicorn worker, which the platform launcher never checks.
61
+ - `metatables.api.app.main:app` is created on first access. Importing the factory,
62
+ as the Local worker and the hosted entrypoint do, builds no extra app and cannot
63
+ fail because a shell carries a platform variable.
64
+ - MetaTables declares no anonymous route. The SDK copies the deployment's
65
+ `FASTAPI_PUBLIC_INGRESS` into the declaration unchanged; every other route,
66
+ including `/`, `/docs` and `/openapi.json`, requires a caller.
67
+ - The direct verifier dependency, `metatables.api.app.auth.caller_assertions`, is
68
+ removed so that no route can verify an assertion a second time.
69
+
70
+ ## Consequences
71
+
72
+ - Who may call what is unchanged. The caller is still the User in a platform-signed
73
+ assertion for this release and Environment. Admin and Team facts, the one-hour
74
+ fact cache, table and namespace grants and database enforcement are unchanged.
75
+ Unsigned User headers, the runtime's own SDK account and Bearer tokens never
76
+ identify a hosted caller.
77
+ - New hosted revisions pass the launcher's check and can roll out. The SDK
78
+ requirement stays `mainsequence>=9.0.6,<10`, which provides the integration.
79
+ - Hosted routes without an admission dependency (`/` and the OpenAPI pages) now also
80
+ require a verified caller; the platform ingress already authenticated those
81
+ requests. A numeric `X-User-Id` header is rejected with 401.
82
+ - The SDK answers rejected callers itself with `{"detail": ...}`, so MetaTables'
83
+ error handler no longer logs them. The launcher's request log records each
84
+ request's authentication outcome.
85
+ - The SDK and the launcher look for public ingress routes among the app's top-level
86
+ routes. FastAPI 0.142 keeps included routers unflattened, so a route mounted
87
+ through a router cannot be declared public; startup would refuse it. MetaTables
88
+ declares none.
89
+
90
+ ## Verification
91
+
92
+ `tests/auth/test_request_identity.py` imports the deployed entrypoint under a
93
+ simulated hosted environment and checks its declaration, verifies genuine EdDSA
94
+ assertions signed with a test key served as the platform's key document, and checks
95
+ rejected callers, a key outage, the other runtimes and the refused modes. With
96
+ `PYTHONPATH` naming PodDeploymentOrchestrator's `src` directory, it also runs that
97
+ launcher's `require_request_identity` and `serve_fastapi` against the entrypoint.
98
+ `tests/auth/test_local_mode.py` shows Local admission is unchanged when a shell
99
+ carries hosted variables, and that the SDK's local mode would reject Local clients.
@@ -37,3 +37,4 @@ decisions belong in the SDK repository and are linked as dependencies.
37
37
  | [0014: System migrations in the deployment workflow](api/0014-main-sequence-release-jobs-and-production-migrations.md) | Accepted; implemented on development; hosted verification pending | A Main Sequence Job verifies, migrates and registers the declared runtime database from the candidate image before each API rollout, including the first. |
38
38
  | [0015: TimescaleDB compression and retention policies](api/0015-timescale-compression-and-retention-policies.md) | Accepted; implemented on branch; TimescaleDB verification pending | Time-index tables on TimescaleDB become hypertables; Writers set compression and retention through the API/Admin; Timescale keeps the jobs, and the Admin shows their status. |
39
39
  | [0016: Impact pre-flight for cascades and deletes](api/0016-impact-preflight.md) | Accepted; implemented; container engine verification pending | `get_impact` returns what a row delete, key update or table drop reaches, every blocker and whether the caller may write each table, from the planner the confirmed delete runs; cascade effects never block. Projects render it in their own UIs. |
40
+ | [0017: Hosted caller identity through the SDK request identity](api/0017-hosted-request-identity.md) | Accepted; implemented for 0.1.21; hosted rollout verification pending | The hosted API installs the SDK request identity that the platform launcher requires; the SDK verifies each caller assertion once and admission reads `User.get_logged_user()`. Local keeps its loopback token admission. |
@@ -5,11 +5,22 @@ Reader/Writer ownership, live namespace inheritance, and sharing endpoints.
5
5
 
6
6
  ## Hosted requests
7
7
 
8
- The API's request boundary calls the verifier from the `mainsequence` SDK for
9
- platform-signed caller assertions. The SDK owns issuer, key discovery, claim,
10
- request-target, signature, and expiry verification. MetaTables only maps
11
- its verified identity and exceptions into request context and HTTP responses.
12
- Unsigned user headers are not identity evidence.
8
+ The hosted API installs the `mainsequence` SDK's request identity once, when it is
9
+ created; the platform's FastAPI launcher requires it before serving a deployment
10
+ ([ADR 0017](../adr/api/0017-hosted-request-identity.md)). The SDK verifies the
11
+ platform-signed caller assertion before any route runs and owns issuer, key
12
+ discovery, claim, request-target, signature, and expiry verification. It answers a
13
+ missing or invalid assertion with 401 and unavailable key discovery with 503.
14
+ Admission then reads the caller from `User.get_logged_user()` and never verifies the
15
+ assertion again. Unsigned user headers, Bearer tokens and the runtime's own SDK
16
+ account are not identity evidence.
17
+
18
+ The API installs the integration when the process carries the platform's
19
+ caller-assertion configuration, as every hosted deployment does, and accepts no
20
+ other SDK mode. Once it is installed, every route not declared in the deployment's
21
+ `FASTAPI_PUBLIC_INGRESS` requires a caller, including `/` and the OpenAPI pages;
22
+ MetaTables declares no anonymous route. A hosted API started without that
23
+ configuration installs nothing, and admission rejects every caller.
13
24
 
14
25
  After verification, the API reads the admitted User through the SDK to obtain
15
26
  current admin status and active Team UIDs. It evaluates table/namespace grants
@@ -26,7 +37,9 @@ A local server binds only a loopback listener supplied by `metatables serve
26
37
  one-hour fact cache used by subsequent requests. Each request checks
27
38
  loopback peer, exact Host, the private local process token, and browser-origin
28
39
  policy. Hosted caller assertions are rejected in local mode; request headers
29
- cannot choose an authentication mode or supply another user.
40
+ cannot choose an authentication mode or supply another user. Local does not install
41
+ the SDK request identity, whose local mode would require a platform Bearer token on
42
+ every request.
30
43
 
31
44
  `METATABLES_LOCAL_ALLOWED_ORIGINS` lists exact loopback browser origins with ports.
32
45
  The default permits no browser-origin write requests. Native requests without
@@ -201,9 +201,19 @@ responsibility.
201
201
  Hosted sources require a password Secret to derive per-User database credentials.
202
202
  MySQL global mandatory roles are unsupported. Registration admits ordinary tables
203
203
  only; it does not transfer external ownership. Privileged routines and triggers
204
- must not provide owner access, and registered foreign keys must use `RESTRICT` or
205
- `NO ACTION`. Setup and schema changes verify these safeguards, while the database
206
- checks permissions during each query. See [security](../security/index.md).
204
+ must not provide owner access. Setup and schema changes verify these safeguards,
205
+ while the database checks permissions during each query. See
206
+ [security](../security/index.md).
207
+
208
+ Registered foreign keys may use any referential action, including `CASCADE`,
209
+ `SET NULL` and `SET DEFAULT`. The database runs a cascade as the table owner,
210
+ authorized by the referencing table's own foreign key, so writing a referenced
211
+ table needs no access to the tables that reference it. Local SQLite runtimes are
212
+ the exception: SQLite's authorizer cannot tell a foreign-key action from the
213
+ caller's own statement, so a local delete or key update on a referenced table
214
+ fails unless the caller can access every referencing table. See
215
+ [ADR 0007](../adr/api/0007-database-enforced-table-access.md#sqlite) and
216
+ [ADR 0016](../adr/api/0016-impact-preflight.md).
207
217
 
208
218
  MySQL uses `pyformat` parameters and SQL Server uses ordered `qmark` parameters.
209
219
  Both share the normal compiled SQL endpoint and limits. SQL Server upserts use a
@@ -281,7 +281,6 @@
281
281
  "type": "object"
282
282
  },
283
283
  "CredentialStoreDescriptor": {
284
- "additionalProperties": false,
285
284
  "properties": {
286
285
  "error": {
287
286
  "anyOf": [
@@ -765,7 +764,6 @@
765
764
  "type": "object"
766
765
  },
767
766
  "HostedEnvironment": {
768
- "additionalProperties": false,
769
767
  "properties": {
770
768
  "is_production": {
771
769
  "anyOf": [
@@ -2894,7 +2892,6 @@
2894
2892
  "type": "object"
2895
2893
  },
2896
2894
  "RuntimeBootstrapDescriptor": {
2897
- "additionalProperties": false,
2898
2895
  "properties": {
2899
2896
  "active": {
2900
2897
  "title": "Active",
@@ -3035,7 +3032,6 @@
3035
3032
  "type": "object"
3036
3033
  },
3037
3034
  "RuntimeContext": {
3038
- "additionalProperties": false,
3039
3035
  "properties": {
3040
3036
  "api_endpoint": {
3041
3037
  "default": "",
@@ -4355,7 +4351,6 @@
4355
4351
  "type": "object"
4356
4352
  },
4357
4353
  "TransferLimits": {
4358
- "additionalProperties": false,
4359
4354
  "properties": {
4360
4355
  "chunk_receipts": {
4361
4356
  "default": true,
@@ -11,7 +11,7 @@ require running another service locally.
11
11
  Install in your application's Python environment on macOS or Linux:
12
12
 
13
13
  ```bash
14
- python -m pip install "mainsequence-metatable==0.1.20" "mainsequence==9.0.6"
14
+ python -m pip install "mainsequence-metatable==0.1.21" "mainsequence==9.0.6"
15
15
  mainsequence login
16
16
  metatables init --local
17
17
  metatables serve --local --admin
@@ -20,9 +20,9 @@ metatables serve --local --admin
20
20
  Run from an application Git checkout with a commit and an `origin` remote. Python
21
21
  3.13+ is required. Admin also needs Node.js 22.12+ (or 20.19+) and npm. The package
22
22
  requires published `mainsequence>=9.0.6,<10`; no SDK checkout is needed.
23
- The next stable release is MetaTables 0.1.20, paired with published SDK 9.0.6.
23
+ The next stable release is MetaTables 0.1.21, paired with published SDK 9.0.6.
24
24
  The pinned command above applies after that stable release is published; before
25
- then, install the exact `0.1.20.devN` artifact produced by the development publishing
25
+ then, install the exact `0.1.21.devN` artifact produced by the development publishing
26
26
  workflow alongside `mainsequence==9.0.6`. SDK 8 is outside this release's
27
27
  dependency range.
28
28
  `python -m metatables.sdk_compat` checks the required SDK interfaces without network
@@ -39,11 +39,17 @@ distribution.
39
39
 
40
40
  CI installs dependencies from `uv.lock` and PyPI. An editable SDK checkout cannot
41
41
  substitute for the published SDK in a release. The selected SDK artifact must
42
- provide ordinary `Secret.get_by_uid`, independent Git source context, and
43
- `CallerAssertionVerifier.from_environment`.
44
-
45
- The next MetaTables stable release is `0.1.20`; its supported SDK range is
46
- `mainsequence>=9.0.6,<10`. Development builds use `0.1.20.devN`.
42
+ provide ordinary `Secret.get_by_uid`, independent Git source context,
43
+ `CallerAssertionVerifier.from_environment`, and the FastAPI request identity:
44
+ `mainsequence.server.fastapi.install_request_identity` and `User.get_logged_user`.
45
+
46
+ The next MetaTables stable release is `0.1.21`; its supported SDK range is
47
+ `mainsequence>=9.0.6,<10`. Development builds use `0.1.21.devN`.
48
+ 0.1.21 is the first release whose hosted API installs the SDK request identity.
49
+ Since 2026-09-28 the platform's FastAPI launcher refuses an app without it, so a new
50
+ hosted API revision needs 0.1.21
51
+ ([#34](https://github.com/mainsequence-projects/MetaTables/issues/34),
52
+ [ADR 0017](../adr/api/0017-hosted-request-identity.md)).
47
53
  The minimum and lockfile now select published SDK `9.0.6`. SDK 9.0.4 is the first
48
54
  whose caller-assertion verifier accepts the platform's EdDSA (Ed25519) caller
49
55
  assertions; earlier SDKs verify only RS256, so a hosted API built with them cannot
@@ -30,6 +30,22 @@ scaffold/TLS tests, and executable example tests. Loopback tests need permission
30
30
  to bind local sockets. Tests inject identity and SDK responses where appropriate;
31
31
  they do not claim a hosted SDK deployment has been verified.
32
32
 
33
+ ## Hosted request identity
34
+
35
+ The `platform_caller_assertions` fixture simulates a hosted deployment's trust
36
+ configuration and signs genuine EdDSA caller assertions that the SDK verifies.
37
+ `tests/auth/test_request_identity.py` also runs PodDeploymentOrchestrator's
38
+ `require_request_identity` and `serve_fastapi` against the deployed entrypoint when
39
+ that launcher is importable; otherwise those two tests are skipped:
40
+
41
+ ```bash
42
+ PYTHONPATH=/path/to/PodDeploymentOrchestrator/src python -m pytest -q tests/auth/test_request_identity.py
43
+ ```
44
+
45
+ The suite removes platform caller-authentication variables inherited from the
46
+ shell. These checks do not establish a hosted rollout
47
+ ([ADR 0017](../adr/api/0017-hosted-request-identity.md)).
48
+
33
49
  ## Local CLI workflow
34
50
 
35
51
  Focused manual checks for ADR 0011:
@@ -31,7 +31,8 @@ Shared deployments use `local_mode_available: false`; the developer checkout use
31
31
  `true`. The launcher always runs Local; see [Local only](local-runtime.md#local-only).
32
32
 
33
33
  Configure the API’s SDK session for ordinary platform Secret access and supply
34
- trusted caller-verifier settings. Use the SDK's own configuration contract;
34
+ the platform's caller-assertion trust configuration, which the SDK request identity
35
+ reads ([ADR 0017](../adr/api/0017-hosted-request-identity.md)). Use the SDK's own configuration contract;
35
36
  MetaTables passes no user-supplied issuer, key URL, or target scope to verification.
36
37
  The [SDK capability check](../client/installation-and-connection.md) establishes
37
38
  interface availability, not deployment credentials or network readiness.
@@ -31,8 +31,11 @@ deployment; resolve duplicates within it. Hosted clients leave
31
31
  `METATABLES_API_URL` unset; that variable accepts only loopback development URLs.
32
32
 
33
33
  Serve `metatables.api.app.main:app` with hosted execution and one runtime DataSource. Start one
34
- worker per runtime instance, configure the ordinary SDK session and caller verifier,
35
- and set `local_mode_available: false` in `configuration.yaml` on shared deployments.
34
+ worker per runtime instance, configure the ordinary SDK session and the platform's
35
+ caller-assertion trust configuration (`MAINSEQUENCE_CALLER_AUTH_MODE=assertion`,
36
+ `MAINSEQUENCE_CALLER_ASSERTION_ISSUER`, `MAINSEQUENCE_CALLER_ASSERTION_JWKS_URL`,
37
+ `APP_NAME` and `MAINSEQUENCE_ORGANIZATION_ENVIRONMENT_UID`), and set
38
+ `local_mode_available: false` in `configuration.yaml` on shared deployments.
36
39
 
37
40
  ```bash
38
41
  uvicorn metatables.api.app.main:app --host 0.0.0.0 --port 18473
@@ -42,6 +45,13 @@ The ingress must provide signed caller assertions. Unsigned User UIDs and the
42
45
  runtime's own workload token cannot identify the human requesting a table
43
46
  operation. The SDK verifies caller proof; MetaTables applies local resource policy.
44
47
 
48
+ The app installs the SDK request identity when it is created, and the platform's
49
+ FastAPI launcher checks that declaration before it serves a revision
50
+ ([ADR 0017](../adr/api/0017-hosted-request-identity.md)). Releases before 0.1.21 do
51
+ not install it, so the launcher refuses their new hosted revisions. Without the
52
+ trust configuration the app installs nothing and admits no caller; an incomplete
53
+ configuration stops startup.
54
+
45
55
  ## Declare the runtime database
46
56
 
47
57
  The deployment configuration is `src/metatables/api/metatables/configuration.yaml`,
@@ -97,9 +97,11 @@ choice, not an authorization mechanism.
97
97
 
98
98
  The platform User response must supply `is_organization_admin` and
99
99
  `active_team_uids`; use the compatible published SDK prerequisite described in
100
- [installation](../client/installation-and-connection.md). Hosted admission verifies
101
- the existing signed caller assertion, then obtains that User's facts through the
102
- SDK User detail operation. Local admission resolves facts for the running SDK user.
100
+ [installation](../client/installation-and-connection.md). In hosted mode the SDK
101
+ request identity verifies the existing signed caller assertion; admission takes that
102
+ User from `User.get_logged_user()` and obtains the User's facts through the SDK User
103
+ detail operation ([ADR 0017](../adr/api/0017-hosted-request-identity.md)). Local
104
+ admission resolves facts for the running SDK user.
103
105
  The deployment's existing User-directory access must permit that lookup.
104
106
 
105
107
  The API caches successful User facts for one hour per caller and runtime. Startup
@@ -83,3 +83,4 @@ nav:
83
83
  - "0014: System migrations in the deployment workflow": adr/api/0014-main-sequence-release-jobs-and-production-migrations.md
84
84
  - "0015: TimescaleDB compression and retention policies": adr/api/0015-timescale-compression-and-retention-policies.md
85
85
  - "0016: Impact pre-flight": adr/api/0016-impact-preflight.md
86
+ - "0017: Hosted request identity": adr/api/0017-hosted-request-identity.md
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence-metatable"
7
- version = "0.1.20.dev32"
7
+ version = "0.1.21"
8
8
  description = "Main Sequence MetaTables Python client and standalone API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -20,6 +20,7 @@ SDK_MODULES = frozenset({
20
20
  'mainsequence.client.models_user', 'mainsequence.client.utils', 'mainsequence.client.value_sets',
21
21
  'mainsequence.cli.config', 'mainsequence.code_repository_context',
22
22
  'mainsequence.instrumentation', 'mainsequence.logconf', 'mainsequence.server.caller_assertions',
23
+ 'mainsequence.server.fastapi',
23
24
  })
24
25
  SHARED_MODULES = frozenset({'metatables.local_connection', 'metatables.local_files', 'metatables.sdk_compat', 'metatables.update_configuration_contract',
25
26
  'metatables.transfer_contract', 'metatables.runtime_contract', 'metatables.log_contract', 'metatables.local_run_logs',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence-metatable
3
- Version: 0.1.20.dev32
3
+ Version: 0.1.21
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
@@ -31,6 +31,7 @@ docs/adr/api/0013-application-owned-migrations.md
31
31
  docs/adr/api/0014-main-sequence-release-jobs-and-production-migrations.md
32
32
  docs/adr/api/0015-timescale-compression-and-retention-policies.md
33
33
  docs/adr/api/0016-impact-preflight.md
34
+ docs/adr/api/0017-hosted-request-identity.md
34
35
  docs/adr/client/0003-api-endpoint-resolution.md
35
36
  docs/adr/client/0011-cli-local-development-with-managed-admin.md
36
37
  docs/api/authentication-and-errors.md
@@ -183,7 +184,6 @@ src/metatables/api/app/source_passwords.py
183
184
  src/metatables/api/app/transfer.py
184
185
  src/metatables/api/app/auth/__init__.py
185
186
  src/metatables/api/app/auth/boundary.py
186
- src/metatables/api/app/auth/caller_assertions.py
187
187
  src/metatables/api/app/auth/local_actor.py
188
188
  src/metatables/api/app/routes/__init__.py
189
189
  src/metatables/api/app/routes/column_search.py
@@ -412,12 +412,12 @@ src/metatables/updaters/updaters.py
412
412
  src/metatables/updaters/utils.py
413
413
  tests/conftest.py
414
414
  tests/auth/test_bootstrap_failure_cause.py
415
- tests/auth/test_caller_assertions.py
416
415
  tests/auth/test_data_source_identity.py
417
416
  tests/auth/test_development_client.py
418
417
  tests/auth/test_hosted_environment_target.py
419
418
  tests/auth/test_local_mode.py
420
419
  tests/auth/test_platform_fact_cache.py
420
+ tests/auth/test_request_identity.py
421
421
  tests/auth/test_runtime_bootstrap.py
422
422
  tests/auth/test_runtime_database.py
423
423
  tests/auth/test_runtime_scaffold.py
@@ -436,6 +436,7 @@ tests/contracts/test_bounded_transfer.py
436
436
  tests/contracts/test_compiler_runtime_source.py
437
437
  tests/contracts/test_relation_batching.py
438
438
  tests/contracts/test_relation_import.py
439
+ tests/contracts/test_runtime_contract_compat.py
439
440
  tests/contracts/test_storage_layouts.py
440
441
  tests/contracts/test_table_contracts.py
441
442
  tests/database_backend/Dockerfile
@@ -1,4 +1,4 @@
1
- """Shared request admission for hosted assertions and local SDK identity."""
1
+ """Shared request admission for hosted callers and local SDK identity."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -7,12 +7,6 @@ from uuid import UUID
7
7
 
8
8
  from fastapi import Depends, HTTPException, Request
9
9
 
10
- from metatables.api.app.auth.caller_assertions import (
11
- ASSERTION_HEADER,
12
- CallerAssertionUnavailable,
13
- InvalidCallerAssertion,
14
- configured_verifier,
15
- )
16
10
  from metatables.api.app.runtime import RuntimeState
17
11
  from metatables.api.backend.domain.permission_rules import TrustedActorFacts
18
12
 
@@ -43,25 +37,32 @@ def admit_request(request: Request) -> AdmittedCaller:
43
37
  user_uid=state.identity.user_uid, active_team_uids=teams, is_admin=admin,
44
38
  environment_uid=UUID(environment_uid) if environment_uid else None,
45
39
  )
46
- assertion = request.headers.get(ASSERTION_HEADER)
47
- if assertion is None:
48
- raise HTTPException(status_code=401, detail="Caller assertion is required.")
49
- try:
50
- caller = configured_verifier().verify(assertion)
51
- except InvalidCallerAssertion as exc:
52
- raise HTTPException(status_code=401, detail="Invalid caller assertion.") from exc
53
- except CallerAssertionUnavailable as exc:
54
- raise HTTPException(status_code=503, detail="Caller authentication is unavailable.") from exc
55
- user_uid = UUID(caller.user_uid)
40
+ user_uid = logged_user_uid()
56
41
  teams, admin = state.actor_facts_cache.get(
57
42
  (False, user_uid), lambda: sdk_actor_facts(user_uid, local=False),
58
43
  )
44
+ # The verified assertion's target, recorded by the SDK request identity.
45
+ environment_uid = getattr(request.state, "organization_environment_uid", None)
59
46
  return AdmittedCaller(
60
- user_uid=UUID(caller.user_uid), active_team_uids=teams, is_admin=admin,
61
- environment_uid=UUID(caller.environment_uid) if getattr(caller, "environment_uid", None) else None,
47
+ user_uid=user_uid, active_team_uids=teams, is_admin=admin,
48
+ environment_uid=UUID(environment_uid) if environment_uid else None,
62
49
  )
63
50
 
64
51
 
52
+ def logged_user_uid() -> UUID:
53
+ """Return the caller that the SDK request identity verified for this request.
54
+
55
+ The SDK verifies the platform-signed caller assertion once, before any route
56
+ runs, and answers missing or invalid proof itself. When no caller is bound, for
57
+ example on a hosted API started without the platform's trust configuration,
58
+ admission fails; there is no header or process-account fallback.
59
+ """
60
+ from mainsequence.client import RequestIdentityError, User
61
+ try:
62
+ return UUID(User.get_logged_user().uid)
63
+ except RequestIdentityError:
64
+ raise HTTPException(status_code=401, detail="Caller assertion is required.") from None
65
+
65
66
 
66
67
  def platform_facts(identity):
67
68
  """Consume facts supplied by SDK User responses for the already verified caller."""
@@ -1,5 +1,6 @@
1
1
  """MetaTables API application and route composition."""
2
2
 
3
+ import os
3
4
  from contextlib import asynccontextmanager
4
5
  from uuid import UUID
5
6
 
@@ -7,6 +8,7 @@ from fastapi import Depends, FastAPI, HTTPException, Request
7
8
  from fastapi.exception_handlers import http_exception_handler
8
9
  from fastapi.responses import JSONResponse
9
10
  from fastapi.routing import APIRoute
11
+ from mainsequence.server.fastapi import install_request_identity
10
12
  from sqlalchemy.orm import Session
11
13
  from starlette.exceptions import HTTPException as StarletteHTTPException
12
14
 
@@ -100,6 +102,38 @@ def time_index_aliases(router):
100
102
 
101
103
  from metatables.api.app.routes.update_crud import router as update_crud_router
102
104
 
105
+ # The platform projects caller-assertion trust configuration into every hosted
106
+ # FastAPI deployment. The SDK request identity and the platform launcher select
107
+ # their caller-authentication mode from these variables (ADR 0017).
108
+ PLATFORM_CALLER_AUTHENTICATION = (
109
+ "MAINSEQUENCE_CALLER_AUTH_MODE",
110
+ "APP_NAME",
111
+ "FASTAPI_PUBLIC_BASE_URL",
112
+ "MAINSEQUENCE_CALLER_ASSERTION_ISSUER",
113
+ "MAINSEQUENCE_CALLER_ASSERTION_JWKS_URL",
114
+ )
115
+
116
+
117
+ def install_hosted_request_identity(service: FastAPI, config: RuntimeConfig) -> None:
118
+ """Install the SDK request identity once on the platform-served hosted API.
119
+
120
+ Local and developer runtimes admit requests through their loopback listener and
121
+ private launcher token, with the SDK user resolved at startup; they never install
122
+ it. The hosted API installs it when the platform's caller-authentication
123
+ configuration is present and accepts only signed caller assertions. Without that
124
+ configuration no caller is ever bound, so admission rejects every caller.
125
+ """
126
+ if config.local_mode or config.developer_mode:
127
+ return
128
+ if not any(os.environ.get(name) for name in PLATFORM_CALLER_AUTHENTICATION):
129
+ return
130
+ install_request_identity(service)
131
+ if service.state.mainsequence_request_identity["mode"] != "assertion":
132
+ raise RuntimeError(
133
+ "The hosted MetaTables API accepts only platform caller assertions. "
134
+ "Use 'metatables serve --local' for local development."
135
+ )
136
+
103
137
 
104
138
  def create_app(config: RuntimeConfig | None = None) -> FastAPI:
105
139
  configure_logging()
@@ -223,7 +257,21 @@ def create_app(config: RuntimeConfig | None = None) -> FastAPI:
223
257
  async def hello() -> dict[str, str]:
224
258
  return {"message": "Hello, world!"}
225
259
 
260
+ # Installed last, its middleware is the outermost application middleware:
261
+ # callers are verified before local admission, transfer limits or any route.
262
+ install_hosted_request_identity(service, selected)
226
263
  return service
227
264
 
228
265
 
229
- app = create_app()
266
+ def __getattr__(name: str) -> FastAPI:
267
+ """Create the default app served as ``metatables.api.app.main:app`` on first use.
268
+
269
+ Importing the factory, as the local worker, the hosted entrypoint and the
270
+ reference scripts do, therefore builds no unused app and installs no request
271
+ identity in processes that never serve it.
272
+ """
273
+ if name != "app":
274
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
275
+ service = create_app()
276
+ globals()["app"] = service
277
+ return service
@@ -1,4 +1,9 @@
1
- """Pure runtime descriptor schema shared by the API and clients."""
1
+ """Pure runtime descriptor schema shared by the API and clients.
2
+
3
+ Clients parse these from the API's response. They ignore fields they do not know,
4
+ so a client can talk to an API that is older or newer than itself; a breaking
5
+ change belongs in a new field or contract version, never in a field's removal.
6
+ """
2
7
 
3
8
  from typing import Literal
4
9
 
@@ -10,7 +15,7 @@ class DataSourceResolutionError(RuntimeError):
10
15
 
11
16
 
12
17
  class HostedEnvironment(BaseModel):
13
- model_config = ConfigDict(extra="forbid", frozen=True)
18
+ model_config = ConfigDict(extra="ignore", frozen=True)
14
19
  uid: str | None
15
20
  status: Literal["verified", "not_found", "unavailable", "not_configured"]
16
21
  name: str | None = None
@@ -19,7 +24,7 @@ class HostedEnvironment(BaseModel):
19
24
 
20
25
 
21
26
  class RuntimeBootstrapDescriptor(BaseModel):
22
- model_config = ConfigDict(extra="forbid", frozen=True)
27
+ model_config = ConfigDict(extra="ignore", frozen=True)
23
28
  status: Literal["unconfigured", "migration_required", "registration_required", "migrating", "ready", "incompatible", "unavailable"]
24
29
  error: str | None = None
25
30
  candidate: dict | None = None
@@ -36,7 +41,7 @@ class RuntimeBootstrapDescriptor(BaseModel):
36
41
 
37
42
 
38
43
  class CredentialStoreDescriptor(BaseModel):
39
- model_config = ConfigDict(extra="forbid", frozen=True)
44
+ model_config = ConfigDict(extra="ignore", frozen=True)
40
45
  provider: Literal["unconfigured", "sdk_secrets", "local_encrypted"]
41
46
  status: Literal["uninitialized", "unavailable", "ready", "managed"]
42
47
  error: str | None = None
@@ -50,7 +55,7 @@ class RuntimeContext(BaseModel):
50
55
  credential_store: CredentialStoreDescriptor | None = None
51
56
  is_admin: bool = False
52
57
  user_uid: str | None = None
53
- model_config = ConfigDict(extra="forbid", frozen=True)
58
+ model_config = ConfigDict(extra="ignore", frozen=True)
54
59
  git_source: dict[str, str] | None
55
60
  local_mode: bool = False
56
61
  local_mode_available: bool = False
@@ -21,10 +21,15 @@ def require_sdk_capabilities(*, server: bool = False) -> None:
21
21
  from mainsequence.server.caller_assertions import CallerAssertionVerifier
22
22
  if not callable(getattr(CallerAssertionVerifier, "from_environment", None)):
23
23
  raise ImportError("CallerAssertionVerifier.from_environment is unavailable")
24
+ from mainsequence.client import RequestIdentityError
25
+ from mainsequence.server.fastapi import install_request_identity
26
+ if not (callable(install_request_identity) and issubclass(RequestIdentityError, Exception)
27
+ and callable(getattr(User, "get_logged_user", None))):
28
+ raise ImportError("SDK FastAPI request identity is unavailable")
24
29
  except ImportError as exc:
25
30
  raise ImportError(
26
31
  "MetaTables requires a compatible mainsequence SDK with platform Secrets "
27
- "and caller-assertion verification. Install a compatible SDK artifact or the documented local checkout; "
32
+ "and FastAPI request identity. Install a compatible SDK artifact or the documented local checkout; "
28
33
  "see docs/client/installation-and-connection.md."
29
34
  ) from exc
30
35
 
@@ -12,7 +12,7 @@ logger = logging.getLogger(__name__)
12
12
 
13
13
 
14
14
  class TransferLimits(BaseModel):
15
- model_config = ConfigDict(frozen=True, extra="forbid")
15
+ model_config = ConfigDict(frozen=True, extra="ignore")
16
16
 
17
17
  version: int = 1
18
18
  max_page_rows: int = Field(default=10_000, ge=1, le=10_000)