mainsequence 8.1.20.dev7__tar.gz → 8.1.20.dev8__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 (142) hide show
  1. {mainsequence-8.1.20.dev7/mainsequence.egg-info → mainsequence-8.1.20.dev8}/PKG-INFO +1 -1
  2. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/cli.py +6 -2
  3. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/metatables/core.py +13 -30
  4. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8/mainsequence.egg-info}/PKG-INFO +1 -1
  5. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/pyproject.toml +1 -1
  6. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_cli.py +34 -0
  7. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_filter_normalization.py +3 -3
  8. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/LICENSE +0 -0
  9. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/MANIFEST.in +0 -0
  10. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/README.md +0 -0
  11. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/agent_scaffold/AGENTS.md +0 -0
  12. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/agent_scaffold/skills/a2a_sdk_execution/SKILL.md +0 -0
  13. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  14. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  15. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  16. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  17. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/agent_scaffold/skills/data_publishing/time_index_table_updates/SKILL.md +0 -0
  18. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  19. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/agent_scaffold/skills/maintenance/code_repository_maintenance/SKILL.md +0 -0
  20. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  21. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  22. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/agent_scaffold/skills/sdk_code_repository_execution/SKILL.md +0 -0
  23. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/__init__.py +0 -0
  24. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/__main__.py +0 -0
  25. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/bootstrap.py +0 -0
  26. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/__init__.py +0 -0
  27. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/api.py +0 -0
  28. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/browser_auth.py +0 -0
  29. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/code_repository_status.py +0 -0
  30. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/config.py +0 -0
  31. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/docker_utils.py +0 -0
  32. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/doctor.py +0 -0
  33. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/local_ops.py +0 -0
  34. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/migrations.py +0 -0
  35. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/model_filters.py +0 -0
  36. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/pydantic_cli.py +0 -0
  37. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/sdk_utils.py +0 -0
  38. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/ssh_utils.py +0 -0
  39. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/cli/ui.py +0 -0
  40. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/__init__.py +0 -0
  41. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/agent_runtime_models.py +0 -0
  42. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/base.py +0 -0
  43. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/client.py +0 -0
  44. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/compute_validation.py +0 -0
  45. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  46. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  47. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  48. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  49. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/dtype_codec.py +0 -0
  50. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/exceptions.py +0 -0
  51. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/github_issues.py +0 -0
  52. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/metatables/__init__.py +0 -0
  53. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/models_foundry.py +0 -0
  54. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/models_helpers.py +0 -0
  55. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/models_user.py +0 -0
  56. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/observability.py +0 -0
  57. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/client/utils.py +0 -0
  58. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/code_repository_context.py +0 -0
  59. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/code_repository_skills.py +0 -0
  60. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/defaults.py +0 -0
  61. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/instrumentation/__init__.py +0 -0
  62. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/instrumentation/utils.py +0 -0
  63. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/logconf.py +0 -0
  64. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/__init__.py +0 -0
  65. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/__main__.py +0 -0
  66. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  67. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  68. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/future_registry.py +0 -0
  69. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/hashing.py +0 -0
  70. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  71. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  72. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/migrations/env.py +0 -0
  73. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/migrations/provider.py +0 -0
  74. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/migrations/registry.py +0 -0
  75. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  76. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  77. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  78. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  79. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  80. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/schema_names.py +0 -0
  81. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  82. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/time_index_table_refs.py +0 -0
  83. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/time_index_table_updates/__init__.py +0 -0
  84. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/time_index_table_updates/configuration.py +0 -0
  85. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/time_index_table_updates/dependencies.py +0 -0
  86. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/time_index_table_updates/managers.py +0 -0
  87. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/time_index_table_updates/namespacing.py +0 -0
  88. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/time_index_table_updates/runner.py +0 -0
  89. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/time_index_table_updates/updaters.py +0 -0
  90. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/meta_tables/time_index_table_updates/utils.py +0 -0
  91. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/repository_identity_security.py +0 -0
  92. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/runtime_flags.py +0 -0
  93. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence/scaffold_skills.py +0 -0
  94. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence.egg-info/SOURCES.txt +0 -0
  95. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence.egg-info/dependency_links.txt +0 -0
  96. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence.egg-info/entry_points.txt +0 -0
  97. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence.egg-info/requires.txt +0 -0
  98. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/mainsequence.egg-info/top_level.txt +0 -0
  99. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/setup.cfg +0 -0
  100. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/fixtures/time_index_table_update_hash_v2_golden.json +0 -0
  101. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_auth_precedence.py +0 -0
  102. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_canonical_api_route_contract.py +0 -0
  103. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_cli_browser_auth.py +0 -0
  104. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_cli_migrations.py +0 -0
  105. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_client.py +0 -0
  106. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_code_repository_batch_jobs_from_file.py +0 -0
  107. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_code_repository_branch_contract.py +0 -0
  108. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_code_repository_documentation_contract.py +0 -0
  109. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_code_repository_runtime_context.py +0 -0
  110. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_code_repository_skills.py +0 -0
  111. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_dependency_extras.py +0 -0
  112. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_dev_release_version.py +0 -0
  113. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_duckdb_interface_dimensions.py +0 -0
  114. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_environment_resource_context.py +0 -0
  115. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_environment_response_contracts.py +0 -0
  116. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_github_issues_client.py +0 -0
  117. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_instrumentation.py +0 -0
  118. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_local_ops.py +0 -0
  119. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_logconf.py +0 -0
  120. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_meta_table_migrations.py +0 -0
  121. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_meta_tables_client_models.py +0 -0
  122. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  123. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_models_user_request_bound_auth.py +0 -0
  124. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_notification_uid_contract.py +0 -0
  125. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_observability_client.py +0 -0
  126. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_pod_project_resolution.py +0 -0
  127. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_scaffold_skills.py +0 -0
  128. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_schema_names.py +0 -0
  129. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_secret_client_model.py +0 -0
  130. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_source_table_configuration.py +0 -0
  131. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_sqlite_interface_dimensions.py +0 -0
  132. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_ssh_utils.py +0 -0
  133. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_time_index_table_access_dimension_audit.py +0 -0
  134. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_time_index_table_dimension_queries.py +0 -0
  135. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_time_index_table_update_configuration.py +0 -0
  136. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_time_index_table_update_configuration_client.py +0 -0
  137. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_time_index_table_update_flow.py +0 -0
  138. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_time_index_table_update_hard_cut.py +0 -0
  139. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_tolerant_response_reading.py +0 -0
  140. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_update_runner_uid_runtime.py +0 -0
  141. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_update_statistics.py +0 -0
  142. {mainsequence-8.1.20.dev7 → mainsequence-8.1.20.dev8}/tests/test_update_uid_guards.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 8.1.20.dev7
3
+ Version: 8.1.20.dev8
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: LicenseRef-MainSequence-Proprietary
@@ -5912,7 +5912,9 @@ def _meta_table_run_query_impl(
5912
5912
  try:
5913
5913
  payload = run_meta_table_query(meta_table_uid, sql, timeout=timeout)
5914
5914
  except ApiError as e:
5915
- error(f"MetaTable query failed: {e}")
5915
+ # The api layer already names the operation in the message; prefixing again
5916
+ # produces "MetaTable query failed: MetaTable query failed: ...".
5917
+ error(str(e))
5916
5918
  raise typer.Exit(1) from e
5917
5919
 
5918
5920
  ok = bool(payload.get("ok"))
@@ -5941,7 +5943,9 @@ def _time_index_table_run_query_impl(
5941
5943
  try:
5942
5944
  payload = run_time_index_table_query(table_uid, sql, timeout=timeout)
5943
5945
  except ApiError as e:
5944
- error(f"Time-index table query failed: {e}")
5946
+ # The api layer already names the operation in the message; prefixing again
5947
+ # produces "Time-index table query failed: Time-index table query failed: ...".
5948
+ error(str(e))
5945
5949
  raise typer.Exit(1) from e
5946
5950
 
5947
5951
  ok = bool(payload.get("ok"))
@@ -1904,35 +1904,18 @@ class MetaTable(
1904
1904
 
1905
1905
  cls = type(self)
1906
1906
  url = f"{cls.get_object_url().rstrip('/')}/{self._public_uid()}/run-query/"
1907
- if cls.ENDPOINT == "time-index-meta-tables":
1908
- session = cls.build_session()
1909
- old_content_type = session.headers.get("Content-Type")
1910
- session.headers["Content-Type"] = "text/plain"
1911
- try:
1912
- response = make_request(
1913
- s=session,
1914
- loaders=cls.LOADERS,
1915
- r_type="POST",
1916
- url=url,
1917
- payload={"data": sql},
1918
- time_out=timeout,
1919
- )
1920
- finally:
1921
- if old_content_type is None:
1922
- session.headers.pop("Content-Type", None)
1923
- else:
1924
- session.headers["Content-Type"] = old_content_type
1925
- error_payload = {"data": sql}
1926
- else:
1927
- response = make_request(
1928
- s=cls.build_session(),
1929
- loaders=cls.LOADERS,
1930
- r_type="POST",
1931
- url=url,
1932
- payload={"json": sql},
1933
- time_out=timeout,
1934
- )
1935
- error_payload = {"json": sql}
1907
+ # The backend reads the request body as the raw SQL string and parses it with
1908
+ # DRF's JSON parser, for every MetaTable endpoint. Sending a JSON string is the
1909
+ # only transport it accepts; a text/plain body is rejected with HTTP 415.
1910
+ payload = {"json": sql}
1911
+ response = make_request(
1912
+ s=cls.build_session(),
1913
+ loaders=cls.LOADERS,
1914
+ r_type="POST",
1915
+ url=url,
1916
+ payload=payload,
1917
+ time_out=timeout,
1918
+ )
1936
1919
 
1937
1920
  try:
1938
1921
  data = response.json()
@@ -1942,7 +1925,7 @@ class MetaTable(
1942
1925
  if isinstance(data, dict) and "ok" in data:
1943
1926
  return data
1944
1927
 
1945
- raise_for_response(response, payload=error_payload)
1928
+ raise_for_response(response, payload=payload)
1946
1929
  return response.json()
1947
1930
 
1948
1931
  @classmethod
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 8.1.20.dev7
3
+ Version: 8.1.20.dev8
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: LicenseRef-MainSequence-Proprietary
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence"
7
- version = "8.1.20.dev7"
7
+ version = "8.1.20.dev8"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -8197,6 +8197,40 @@ def test_time_index_table_run_query(cli_mod, runner, monkeypatch):
8197
8197
  assert '"value": 1' in result.output
8198
8198
 
8199
8199
 
8200
+ def test_time_index_table_run_query_error_is_not_double_prefixed(cli_mod, runner, monkeypatch):
8201
+ """The api layer already names the operation; the CLI must not prefix it again."""
8202
+ monkeypatch.setattr(cli_mod, "_require_login", lambda: {"username": "u"})
8203
+
8204
+ def _run_query(storage_uid, sql, *, timeout=None):
8205
+ raise cli_mod.ApiError(
8206
+ "Time-index table query failed: 415 POST "
8207
+ "http://127.0.0.1:8000/api/v1/time-index-meta-tables/abc/run-query/: "
8208
+ 'Unsupported media type "text/plain" in request.'
8209
+ )
8210
+
8211
+ monkeypatch.setattr(cli_mod, "run_time_index_table_query", _run_query)
8212
+
8213
+ result = runner.invoke(
8214
+ cli_mod.app,
8215
+ ["time-index-table", "run_query", "abc", "SELECT 1 AS value"],
8216
+ )
8217
+ assert result.exit_code == 1
8218
+ assert result.output.count("Time-index table query failed:") == 1
8219
+
8220
+
8221
+ def test_meta_table_run_query_error_is_not_double_prefixed(cli_mod, runner, monkeypatch):
8222
+ monkeypatch.setattr(cli_mod, "_require_login", lambda: {"username": "u"})
8223
+
8224
+ def _run_query(meta_table_uid, sql, *, timeout=None):
8225
+ raise cli_mod.ApiError("MetaTable query failed: boom")
8226
+
8227
+ monkeypatch.setattr(cli_mod, "run_meta_table_query", _run_query)
8228
+
8229
+ result = runner.invoke(cli_mod.app, ["meta-table", "run_query", "abc", "SELECT 1"])
8230
+ assert result.exit_code == 1
8231
+ assert result.output.count("MetaTable query failed:") == 1
8232
+
8233
+
8200
8234
  def test_meta_table_run_query(cli_mod, runner, monkeypatch):
8201
8235
  captured = {}
8202
8236
  monkeypatch.setattr(cli_mod, "_require_login", lambda: {"username": "u"})
@@ -803,7 +803,7 @@ def test_output_table_delete_after_date_accepts_index_coordinates(monkeypatch):
803
803
  }
804
804
 
805
805
 
806
- def test_output_table_run_query_posts_plain_text_sql(monkeypatch):
806
+ def test_output_table_run_query_posts_json_sql(monkeypatch):
807
807
  from mainsequence.client import metatables as models_metatables
808
808
 
809
809
  captured = {}
@@ -858,10 +858,10 @@ def test_output_table_run_query_posts_plain_text_sql(monkeypatch):
858
858
  assert result["ok"] is True
859
859
  assert result["dynamic_table_id"] == 714
860
860
  assert captured == {
861
- "headers": {"Content-Type": "text/plain"},
861
+ "headers": {"Content-Type": "application/json"},
862
862
  "r_type": "POST",
863
863
  "url": f"{models_metatables.TimeIndexMetaTable.get_object_url()}/714/run-query/",
864
- "payload": {"data": "SELECT * FROM my_table LIMIT 100"},
864
+ "payload": {"json": "SELECT * FROM my_table LIMIT 100"},
865
865
  "timeout": 30,
866
866
  }
867
867
  assert session.headers == {"Content-Type": "application/json"}