mainsequence 4.2.39__tar.gz → 4.3.0__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 (129) hide show
  1. {mainsequence-4.2.39/mainsequence.egg-info → mainsequence-4.3.0}/PKG-INFO +1 -1
  2. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +20 -20
  3. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +7 -3
  4. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/api.py +25 -25
  5. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/cli.py +10 -10
  6. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/migrations.py +2 -2
  7. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/base.py +1 -1
  8. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/dtype_codec.py +12 -2
  9. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/metatables/core.py +25 -24
  10. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/instrumentation/utils.py +7 -3
  11. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/__init__.py +1 -1
  12. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/data_nodes/build_operations.py +11 -11
  13. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/data_nodes/data_nodes.py +34 -16
  14. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/data_nodes/persist_managers.py +66 -27
  15. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/migrations.py +32 -4
  16. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/sqlalchemy_contracts.py +94 -37
  17. {mainsequence-4.2.39 → mainsequence-4.3.0/mainsequence.egg-info}/PKG-INFO +1 -1
  18. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence.egg-info/SOURCES.txt +1 -0
  19. {mainsequence-4.2.39 → mainsequence-4.3.0}/pyproject.toml +1 -1
  20. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_build_operations_hashing.py +19 -13
  21. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_cli.py +8 -8
  22. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_data_access_mixin_dimension_audit.py +54 -3
  23. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_data_node_storage_dimension_queries.py +8 -8
  24. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_data_node_update_flow.py +2 -2
  25. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_filter_normalization.py +17 -17
  26. mainsequence-4.3.0/tests/test_instrumentation.py +16 -0
  27. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_meta_table_migrations.py +72 -6
  28. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_meta_tables_client_models.py +3 -3
  29. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_meta_tables_sqlalchemy_contracts.py +135 -30
  30. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_pod_project_resolution.py +6 -6
  31. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_run_configuration.py +43 -25
  32. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_source_table_configuration.py +4 -4
  33. {mainsequence-4.2.39 → mainsequence-4.3.0}/LICENSE +0 -0
  34. {mainsequence-4.2.39 → mainsequence-4.3.0}/README.md +0 -0
  35. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/AGENTS.md +0 -0
  36. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
  37. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  38. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
  39. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  40. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
  41. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  42. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  43. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  44. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  45. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  46. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  47. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  48. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
  49. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  50. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  51. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  52. {mainsequence-4.2.39 → mainsequence-4.3.0}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  53. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/__init__.py +0 -0
  54. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/__main__.py +0 -0
  55. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/bootstrap.py +0 -0
  56. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/__init__.py +0 -0
  57. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/browser_auth.py +0 -0
  58. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/config.py +0 -0
  59. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/docker_utils.py +0 -0
  60. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/doctor.py +0 -0
  61. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/local_ops.py +0 -0
  62. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/model_filters.py +0 -0
  63. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/project_status.py +0 -0
  64. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/pydantic_cli.py +0 -0
  65. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/sdk_utils.py +0 -0
  66. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/ssh_utils.py +0 -0
  67. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/cli/ui.py +0 -0
  68. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/__init__.py +0 -0
  69. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/agent_runtime_models.py +0 -0
  70. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/client.py +0 -0
  71. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/command_center/__init__.py +0 -0
  72. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/command_center/app_component.py +0 -0
  73. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/command_center/connections.py +0 -0
  74. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/command_center/data_models.py +0 -0
  75. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/command_center/workspace.py +0 -0
  76. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  77. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/compute_validation.py +0 -0
  78. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  79. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  80. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  81. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  82. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/exceptions.py +0 -0
  83. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/fastapi/__init__.py +0 -0
  84. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/fastapi/auth.py +0 -0
  85. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/metatables/__init__.py +0 -0
  86. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/models_foundry.py +0 -0
  87. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/models_helpers.py +0 -0
  88. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/models_user.py +0 -0
  89. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/client/utils.py +0 -0
  90. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/defaults.py +0 -0
  91. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/instrumentation/__init__.py +0 -0
  92. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/logconf.py +0 -0
  93. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/__main__.py +0 -0
  94. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  95. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  96. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
  97. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/data_nodes/models.py +0 -0
  98. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
  99. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
  100. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
  101. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/future_registry.py +0 -0
  102. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/hashing.py +0 -0
  103. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  104. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/meta_tables/schema_names.py +0 -0
  105. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence/runtime_flags.py +0 -0
  106. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence.egg-info/dependency_links.txt +0 -0
  107. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence.egg-info/entry_points.txt +0 -0
  108. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence.egg-info/requires.txt +0 -0
  109. {mainsequence-4.2.39 → mainsequence-4.3.0}/mainsequence.egg-info/top_level.txt +0 -0
  110. {mainsequence-4.2.39 → mainsequence-4.3.0}/setup.cfg +0 -0
  111. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_auth_precedence.py +0 -0
  112. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_cli_browser_auth.py +0 -0
  113. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_cli_migrations.py +0 -0
  114. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_client.py +0 -0
  115. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_command_center_app_component_models.py +0 -0
  116. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_command_center_data_models.py +0 -0
  117. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_command_center_models.py +0 -0
  118. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_dependency_extras.py +0 -0
  119. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_duckdb_interface_dimensions.py +0 -0
  120. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_logconf.py +0 -0
  121. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_models_user_request_bound_auth.py +0 -0
  122. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_project_batch_jobs_from_file.py +0 -0
  123. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_schema_names.py +0 -0
  124. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_secret_client_model.py +0 -0
  125. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_sqlite_interface_dimensions.py +0 -0
  126. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_update_runner_uid_runtime.py +0 -0
  127. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_update_statistics.py +0 -0
  128. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_update_uid_guards.py +0 -0
  129. {mainsequence-4.2.39 → mainsequence-4.3.0}/tests/test_workspace_snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.2.39
3
+ Version: 4.3.0
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License: MainSequence GmbH SDK License Agreement
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mainsequence-data-nodes
3
- description: Use this skill when the task is about producing, changing, validating, or reviewing Main Sequence DataNode update processes. This skill owns DataNode update configuration, dependencies, update logic, hashing, namespaces, and validation against a PlatformTimeIndexMetaData storage contract. It does not own generic MetaTable governance, Alembic migration execution, API route contracts, scheduling, sharing policy, or storage registration internals.
3
+ description: Use this skill when the task is about producing, changing, validating, or reviewing Main Sequence DataNode update processes. This skill owns DataNode update configuration, dependencies, update logic, hashing, namespaces, and validation against a PlatformTimeIndexMetaTable storage contract. It does not own generic MetaTable governance, Alembic migration execution, API route contracts, scheduling, sharing policy, or storage registration internals.
4
4
  ---
5
5
 
6
6
  # Main Sequence Data Nodes
@@ -10,12 +10,12 @@ description: Use this skill when the task is about producing, changing, validati
10
10
  Use this skill when the task changes a DataNode producer.
11
11
 
12
12
  A DataNode is an update process. It is not the canonical storage model. Storage
13
- is defined by a `PlatformTimeIndexMetaData` SQLAlchemy model. Physical schema
13
+ is defined by a `PlatformTimeIndexMetaTable` SQLAlchemy model. Physical schema
14
14
  evolution is handled with Alembic, not a DataNode storage subclass.
15
15
 
16
16
  Canonical workflow:
17
17
 
18
- 1. Define a `PlatformTimeIndexMetaData` storage class.
18
+ 1. Define a `PlatformTimeIndexMetaTable` storage class.
19
19
  2. Construct the DataNode with `config=...` and `storage_table=StorageClass`.
20
20
  3. Let the SDK register the output storage class automatically when needed.
21
21
  4. Return a DataFrame from `update()` that matches the storage class contract.
@@ -32,7 +32,7 @@ Canonical workflow:
32
32
  - `update()`
33
33
  - `prepare_update_statistics()`
34
34
  - design single-index or multidimensional time-first DataFrame outputs
35
- - validate output shape against a `PlatformTimeIndexMetaData` storage contract
35
+ - validate output shape against a `PlatformTimeIndexMetaTable` storage contract
36
36
  - define explicit `hash_namespace(...)` validation strategy
37
37
  - write or review DataNode smoke tests
38
38
  - decide whether a consumer should use `APIDataNode`
@@ -77,7 +77,7 @@ If the task depends on one of those areas, route it explicitly instead of guessi
77
77
  Before changing code, collect or infer:
78
78
 
79
79
  - dataset meaning
80
- - `PlatformTimeIndexMetaData` output storage class, or the class to create
80
+ - `PlatformTimeIndexMetaTable` output storage class, or the class to create
81
81
  - expected time index and identity index shape
82
82
  - expected columns and dtypes from the storage class
83
83
  - upstream dependencies
@@ -139,7 +139,7 @@ import datetime
139
139
  from sqlalchemy import DateTime, Float, MetaData
140
140
  from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
141
141
 
142
- from mainsequence.meta_tables import PlatformTimeIndexMetaData, schema_table_name
142
+ from mainsequence.meta_tables import PlatformTimeIndexMetaTable, schema_table_name
143
143
 
144
144
  PROJECT_NAME = "<project_name>"
145
145
  PRICES_TABLE_NAME = schema_table_name(PROJECT_NAME, "prices")
@@ -149,7 +149,7 @@ class Base(DeclarativeBase):
149
149
  metadata = MetaData()
150
150
 
151
151
 
152
- class PricesTable(PlatformTimeIndexMetaData, Base):
152
+ class PricesTable(PlatformTimeIndexMetaTable, Base):
153
153
  __tablename__ = PRICES_TABLE_NAME
154
154
  __metatable_namespace__ = "<domain_namespace>"
155
155
  __metatable_identifier__ = "<project_name>.<table_identifier>"
@@ -191,13 +191,13 @@ MetaTable migration provider and run `mainsequence migrations upgrade --provider
191
191
  ... head`. Do not call `PricesTable.register()` directly and do not rely on
192
192
  DataNode construction to register storage tables.
193
193
 
194
- `__index_names__` is the full DataNode storage grain. `PlatformTimeIndexMetaData`
194
+ `__index_names__` is the full DataNode storage grain. `PlatformTimeIndexMetaTable`
195
195
  automatically adds a SQLAlchemy unique index over that tuple before Alembic
196
196
  autogenerate runs. Do not manually repeat the full grain unique index in
197
197
  `__table_args__`; add ordinary SQLAlchemy `Index(...)` entries only for
198
198
  additional lookup/performance paths.
199
199
 
200
- `PlatformTimeIndexMetaData.register()` remains SDK plumbing for the migration
200
+ `PlatformTimeIndexMetaTable.register()` remains SDK plumbing for the migration
201
201
  workflow. Do not manually attach an existing UID, reconstruct a generic
202
202
  `MetaTable`, or use manual bind helpers as an authoring step.
203
203
 
@@ -206,7 +206,7 @@ workflow. Do not manually attach an existing UID, reconstruct a generic
206
206
  The DataNode constructor should accept:
207
207
 
208
208
  - a `DataNodeConfiguration`
209
- - a `storage_table: type[PlatformTimeIndexMetaData]`
209
+ - a `storage_table: type[PlatformTimeIndexMetaTable]`
210
210
  - optional `hash_namespace`
211
211
 
212
212
  The constructor `storage_table` is the output storage contract. Keep it out of
@@ -215,11 +215,11 @@ migration workflow before the node is constructed or run.
215
215
 
216
216
  If the DataNode needs to select another DataNode's storage table as a
217
217
  dependency, put that dependency storage reference in the config as
218
- `type[PlatformTimeIndexMetaData]`. Do not add an extra constructor argument for
218
+ `type[PlatformTimeIndexMetaTable]`. Do not add an extra constructor argument for
219
219
  dependency storage tables. Config values of this type are hashed by the bound
220
- `TimeIndexMetaData.uid` from `StorageClass.__time_index_metadata__`. If the
221
- class is not yet bound, config serialization must fail and tell the user to run
222
- the migration workflow.
220
+ `TimeIndexMetaTable.uid` from `StorageClass.get_time_index_meta_table()`. If
221
+ the class is not yet bound, config serialization must fail and tell the user to
222
+ run the migration workflow.
223
223
 
224
224
  Do not accept `test_node`. It has been removed. Use explicit
225
225
  `hash_namespace(...)` or `hash_namespace="..."`.
@@ -232,7 +232,7 @@ from typing import ClassVar
232
232
  from pydantic import Field
233
233
 
234
234
  from mainsequence.meta_tables import DataNode, DataNodeConfiguration
235
- from mainsequence.meta_tables import PlatformTimeIndexMetaData
235
+ from mainsequence.meta_tables import PlatformTimeIndexMetaTable
236
236
 
237
237
 
238
238
  class PricesConfig(DataNodeConfiguration):
@@ -248,7 +248,7 @@ class PricesUpdate(DataNode):
248
248
  def __init__(
249
249
  self,
250
250
  config: PricesConfig,
251
- storage_table: type[PlatformTimeIndexMetaData],
251
+ storage_table: type[PlatformTimeIndexMetaTable],
252
252
  *,
253
253
  hash_namespace: str | None = None,
254
254
  ):
@@ -375,7 +375,7 @@ Time index must be datetime64[ns, UTC]
375
375
  ```
376
376
 
377
377
  Use Alembic from the first version when a DataNode storage table must support
378
- physical schema evolution. Keep the `PlatformTimeIndexMetaData` catalog model as
378
+ physical schema evolution. Keep the `PlatformTimeIndexMetaTable` catalog model as
379
379
  the SDK storage contract, apply Alembic-rendered SQL through the migration
380
380
  workflow, then register or refresh the MetaTable catalog binding separately.
381
381
 
@@ -390,7 +390,7 @@ Do not construct dependency graphs dynamically inside `update()`.
390
390
 
391
391
  ### 8. Foreign Keys Belong To SQLAlchemy And Alembic
392
392
 
393
- For new code, model foreign keys on the `PlatformTimeIndexMetaData` storage
393
+ For new code, model foreign keys on the `PlatformTimeIndexMetaTable` storage
394
394
  class, or route the storage work to the MetaTable skill. When a DataNode storage
395
395
  table needs a platform-managed FK, use normal SQLAlchemy `ForeignKey(...)` /
396
396
  `ForeignKeyConstraint(...)` metadata on the storage class. Prefer
@@ -439,14 +439,14 @@ When reviewing an existing DataNode, look for:
439
439
  - hidden dependency creation inside `update()`
440
440
  - invalid identity-indexed output shape
441
441
  - `time_index` dtype that is not exactly `datetime64[ns, UTC]`
442
- - DataFrame columns that do not match the `PlatformTimeIndexMetaData` class
442
+ - DataFrame columns that do not match the `PlatformTimeIndexMetaTable` class
443
443
 
444
444
  ## Validation Checklist
445
445
 
446
446
  Do not claim success until you have checked:
447
447
 
448
448
  - the relevant docs were read first
449
- - output storage is a `PlatformTimeIndexMetaData` class that the SDK can register
449
+ - output storage is a `PlatformTimeIndexMetaTable` class that the SDK can register
450
450
  - storage has an intention-rich `__metatable_description__`
451
451
  - every storage column has an intention-rich `info.description`
452
452
  - the DataNode constructor requires `storage_table`
@@ -134,10 +134,14 @@ SQLAlchemy table name.
134
134
 
135
135
  When a platform-managed table must support in-place contract migrations from its
136
136
  first version, use Alembic. Keep the SDK model as a normal
137
- `PlatformManagedMetaTable` or `PlatformTimeIndexMetaData` catalog contract, and
137
+ `PlatformManagedMetaTable` or `PlatformTimeIndexMetaTable` catalog contract, and
138
138
  apply physical schema changes through the Alembic migration workflow.
139
139
 
140
- Schema must come from SQLAlchemy table metadata, usually `__table_args__ = {"schema": "public"}` or the tuple form ending in `{"schema": ...}`. Do not add a separate MetaTable-specific schema attribute.
140
+ Default-schema tables must leave SQLAlchemy `Table.schema` unset; do not write
141
+ `__table_args__ = {"schema": "public"}` for the default PostgreSQL schema. Set
142
+ schema metadata only for non-default schemas, using `__table_args__ = {"schema":
143
+ "custom_schema"}` or the tuple form ending in `{"schema": ...}`. Do not add a
144
+ separate MetaTable-specific schema attribute.
141
145
 
142
146
  Always declare `__metatable_description__` on the model. The description must
143
147
  explain the table's business intention, row grain, and expected use, not only
@@ -246,7 +250,7 @@ Use this pattern:
246
250
  ```python
247
251
  account_uid: Mapped[uuid.UUID] = mapped_column(
248
252
  Uuid,
249
- ForeignKey("public.sdk_examples__account.uid", ondelete="RESTRICT"),
253
+ ForeignKey("sdk_examples__account.uid", ondelete="RESTRICT"),
250
254
  nullable=False,
251
255
  )
252
256
  ```
@@ -2729,12 +2729,12 @@ def list_data_node_storages(
2729
2729
  List data node storages via SDK client model.
2730
2730
 
2731
2731
  Single source of truth:
2732
- - delegates filtering and payload parsing to `TimeIndexMetaData.filter()`
2732
+ - delegates filtering and payload parsing to `TimeIndexMetaTable.filter()`
2733
2733
  """
2734
2734
  try:
2735
2735
  storages = _run_sdk_model_operation(
2736
2736
  module_name="mainsequence.client.metatables",
2737
- class_name="TimeIndexMetaData",
2737
+ class_name="TimeIndexMetaTable",
2738
2738
  operation=lambda ClientDataNodeStorage: ClientDataNodeStorage.filter(
2739
2739
  timeout=timeout,
2740
2740
  **dict(filters or {}),
@@ -3198,12 +3198,12 @@ def data_node_storage_description_search(
3198
3198
 
3199
3199
  Single source of truth:
3200
3200
  - delegates search behavior and payload parsing to
3201
- `TimeIndexMetaData.description_search()`
3201
+ `TimeIndexMetaTable.description_search()`
3202
3202
  """
3203
3203
  try:
3204
3204
  payload = _run_sdk_model_operation(
3205
3205
  module_name="mainsequence.client.metatables",
3206
- class_name="TimeIndexMetaData",
3206
+ class_name="TimeIndexMetaTable",
3207
3207
  operation=lambda ClientDataNodeStorage: ClientDataNodeStorage.description_search(
3208
3208
  q,
3209
3209
  q_embedding=q_embedding,
@@ -3232,12 +3232,12 @@ def data_node_storage_column_search(
3232
3232
 
3233
3233
  Single source of truth:
3234
3234
  - delegates search behavior and payload parsing to
3235
- `TimeIndexMetaData.column_search()`
3235
+ `TimeIndexMetaTable.column_search()`
3236
3236
  """
3237
3237
  try:
3238
3238
  payload = _run_sdk_model_operation(
3239
3239
  module_name="mainsequence.client.metatables",
3240
- class_name="TimeIndexMetaData",
3240
+ class_name="TimeIndexMetaTable",
3241
3241
  operation=lambda ClientDataNodeStorage: ClientDataNodeStorage.column_search(
3242
3242
  q,
3243
3243
  **dict(filters or {}),
@@ -3992,12 +3992,12 @@ def get_data_node_storage(
3992
3992
  Retrieve one data node storage via SDK client model.
3993
3993
 
3994
3994
  Single source of truth:
3995
- - delegates detail fetching and payload parsing to `TimeIndexMetaData.get()`
3995
+ - delegates detail fetching and payload parsing to `TimeIndexMetaTable.get()`
3996
3996
  """
3997
3997
  try:
3998
3998
  storage = _run_sdk_model_operation(
3999
3999
  module_name="mainsequence.client.metatables",
4000
- class_name="TimeIndexMetaData",
4000
+ class_name="TimeIndexMetaTable",
4001
4001
  operation=lambda ClientDataNodeStorage: ClientDataNodeStorage.get(
4002
4002
  uid=str(storage_uid),
4003
4003
  timeout=timeout,
@@ -4052,7 +4052,7 @@ def refresh_data_node_storage_search_index(
4052
4052
  Refresh one data node storage search index via SDK client model.
4053
4053
 
4054
4054
  Single source of truth:
4055
- - delegates the refresh call to `TimeIndexMetaData.refresh_table_search_index()`
4055
+ - delegates the refresh call to `TimeIndexMetaTable.refresh_table_search_index()`
4056
4056
  """
4057
4057
  try:
4058
4058
 
@@ -4067,7 +4067,7 @@ def refresh_data_node_storage_search_index(
4067
4067
 
4068
4068
  return _run_sdk_model_operation(
4069
4069
  module_name="mainsequence.client.metatables",
4070
- class_name="TimeIndexMetaData",
4070
+ class_name="TimeIndexMetaTable",
4071
4071
  operation=_refresh,
4072
4072
  )
4073
4073
  except Exception as e:
@@ -4097,7 +4097,7 @@ def run_data_node_storage_query(
4097
4097
 
4098
4098
  return _run_sdk_model_operation(
4099
4099
  module_name="mainsequence.client.metatables",
4100
- class_name="TimeIndexMetaData",
4100
+ class_name="TimeIndexMetaTable",
4101
4101
  operation=_run_query,
4102
4102
  )
4103
4103
  except Exception as e:
@@ -4122,7 +4122,7 @@ def delete_data_node_storage(
4122
4122
  Delete one data node storage via SDK client model.
4123
4123
 
4124
4124
  Single source of truth:
4125
- - delegates deletion and destroy query params to `TimeIndexMetaData.delete()`
4125
+ - delegates deletion and destroy query params to `TimeIndexMetaTable.delete()`
4126
4126
  """
4127
4127
  try:
4128
4128
 
@@ -4140,7 +4140,7 @@ def delete_data_node_storage(
4140
4140
 
4141
4141
  return _run_sdk_model_operation(
4142
4142
  module_name="mainsequence.client.metatables",
4143
- class_name="TimeIndexMetaData",
4143
+ class_name="TimeIndexMetaTable",
4144
4144
  operation=_delete,
4145
4145
  )
4146
4146
  except Exception as e:
@@ -4195,7 +4195,7 @@ def list_data_node_storage_users_can_view(
4195
4195
  """
4196
4196
  return _get_shareable_object_access_state(
4197
4197
  module_name="mainsequence.client.metatables",
4198
- class_name="TimeIndexMetaData",
4198
+ class_name="TimeIndexMetaTable",
4199
4199
  object_id=storage_uid,
4200
4200
  object_lookup_field="uid",
4201
4201
  accessor_name="can_view",
@@ -4231,7 +4231,7 @@ def list_data_node_storage_users_can_edit(
4231
4231
  """
4232
4232
  return _get_shareable_object_access_state(
4233
4233
  module_name="mainsequence.client.metatables",
4234
- class_name="TimeIndexMetaData",
4234
+ class_name="TimeIndexMetaTable",
4235
4235
  object_id=storage_uid,
4236
4236
  object_lookup_field="uid",
4237
4237
  accessor_name="can_edit",
@@ -4268,7 +4268,7 @@ def add_data_node_storage_user_to_view(
4268
4268
  """
4269
4269
  return _mutate_shareable_object_access(
4270
4270
  module_name="mainsequence.client.metatables",
4271
- class_name="TimeIndexMetaData",
4271
+ class_name="TimeIndexMetaTable",
4272
4272
  object_id=storage_uid,
4273
4273
  object_lookup_field="uid",
4274
4274
  action_name="add_to_view",
@@ -4308,7 +4308,7 @@ def add_data_node_storage_user_to_edit(
4308
4308
  """
4309
4309
  return _mutate_shareable_object_access(
4310
4310
  module_name="mainsequence.client.metatables",
4311
- class_name="TimeIndexMetaData",
4311
+ class_name="TimeIndexMetaTable",
4312
4312
  object_id=storage_uid,
4313
4313
  object_lookup_field="uid",
4314
4314
  action_name="add_to_edit",
@@ -4348,7 +4348,7 @@ def remove_data_node_storage_user_from_view(
4348
4348
  """
4349
4349
  return _mutate_shareable_object_access(
4350
4350
  module_name="mainsequence.client.metatables",
4351
- class_name="TimeIndexMetaData",
4351
+ class_name="TimeIndexMetaTable",
4352
4352
  object_id=storage_uid,
4353
4353
  object_lookup_field="uid",
4354
4354
  action_name="remove_from_view",
@@ -4388,7 +4388,7 @@ def remove_data_node_storage_user_from_edit(
4388
4388
  """
4389
4389
  return _mutate_shareable_object_access(
4390
4390
  module_name="mainsequence.client.metatables",
4391
- class_name="TimeIndexMetaData",
4391
+ class_name="TimeIndexMetaTable",
4392
4392
  object_id=storage_uid,
4393
4393
  object_lookup_field="uid",
4394
4394
  action_name="remove_from_edit",
@@ -4425,7 +4425,7 @@ def add_data_node_storage_team_to_view(
4425
4425
  ) -> dict[str, Any]:
4426
4426
  return _mutate_shareable_object_team_access(
4427
4427
  module_name="mainsequence.client.metatables",
4428
- class_name="TimeIndexMetaData",
4428
+ class_name="TimeIndexMetaTable",
4429
4429
  object_id=storage_uid,
4430
4430
  object_lookup_field="uid",
4431
4431
  action_name="add_team_to_view",
@@ -4459,7 +4459,7 @@ def add_data_node_storage_team_to_edit(
4459
4459
  ) -> dict[str, Any]:
4460
4460
  return _mutate_shareable_object_team_access(
4461
4461
  module_name="mainsequence.client.metatables",
4462
- class_name="TimeIndexMetaData",
4462
+ class_name="TimeIndexMetaTable",
4463
4463
  object_id=storage_uid,
4464
4464
  object_lookup_field="uid",
4465
4465
  action_name="add_team_to_edit",
@@ -4493,7 +4493,7 @@ def remove_data_node_storage_team_from_view(
4493
4493
  ) -> dict[str, Any]:
4494
4494
  return _mutate_shareable_object_team_access(
4495
4495
  module_name="mainsequence.client.metatables",
4496
- class_name="TimeIndexMetaData",
4496
+ class_name="TimeIndexMetaTable",
4497
4497
  object_id=storage_uid,
4498
4498
  object_lookup_field="uid",
4499
4499
  action_name="remove_team_from_view",
@@ -4527,7 +4527,7 @@ def remove_data_node_storage_team_from_edit(
4527
4527
  ) -> dict[str, Any]:
4528
4528
  return _mutate_shareable_object_team_access(
4529
4529
  module_name="mainsequence.client.metatables",
4530
- class_name="TimeIndexMetaData",
4530
+ class_name="TimeIndexMetaTable",
4531
4531
  object_id=storage_uid,
4532
4532
  object_lookup_field="uid",
4533
4533
  action_name="remove_team_from_edit",
@@ -4563,7 +4563,7 @@ def add_data_node_storage_labels(
4563
4563
 
4564
4564
  return _mutate_labelable_object_labels(
4565
4565
  module_name="mainsequence.client.metatables",
4566
- class_name="TimeIndexMetaData",
4566
+ class_name="TimeIndexMetaTable",
4567
4567
  object_id=storage_uid,
4568
4568
  object_lookup_field="uid",
4569
4569
  action_name="add_label",
@@ -4601,7 +4601,7 @@ def remove_data_node_storage_labels(
4601
4601
 
4602
4602
  return _mutate_labelable_object_labels(
4603
4603
  module_name="mainsequence.client.metatables",
4604
- class_name="TimeIndexMetaData",
4604
+ class_name="TimeIndexMetaTable",
4605
4605
  object_id=storage_uid,
4606
4606
  object_lookup_field="uid",
4607
4607
  action_name="remove_label",
@@ -423,7 +423,7 @@ CRONTAB_SCHEDULE_MODEL_REF = "mainsequence.client.models_helpers.CrontabSchedule
423
423
  JOB_RUN_MODEL_REF = "mainsequence.client.models_helpers.JobRun"
424
424
  PROJECT_IMAGE_MODEL_REF = "mainsequence.client.models_foundry.ProjectImage"
425
425
  PROJECT_RESOURCE_MODEL_REF = "mainsequence.client.models_helpers.ProjectResource"
426
- DATA_NODE_STORAGE_MODEL_REF = "mainsequence.client.metatables.TimeIndexMetaData"
426
+ DATA_NODE_STORAGE_MODEL_REF = "mainsequence.client.metatables.TimeIndexMetaTable"
427
427
  META_TABLE_MODEL_REF = "mainsequence.client.metatables.MetaTable"
428
428
  CONSTANT_MODEL_REF = "mainsequence.client.models_foundry.Constant"
429
429
  SECRET_MODEL_REF = "mainsequence.client.models_foundry.Secret"
@@ -7445,7 +7445,7 @@ def data_node_storage_list_cmd(
7445
7445
  """
7446
7446
  List data node storages visible to the authenticated user.
7447
7447
 
7448
- Uses SDK client `TimeIndexMetaData.filter()` as the single source of truth.
7448
+ Uses SDK client `TimeIndexMetaTable.filter()` as the single source of truth.
7449
7449
 
7450
7450
  Parameters
7451
7451
  ----------
@@ -7482,7 +7482,7 @@ def data_node_storage_detail_cmd(
7482
7482
  `physical_index_plan` when the backend exposes them on the source table
7483
7483
  configuration.
7484
7484
 
7485
- Uses SDK client `TimeIndexMetaData.get()` as the single source of truth.
7485
+ Uses SDK client `TimeIndexMetaTable.get()` as the single source of truth.
7486
7486
 
7487
7487
  Parameters
7488
7488
  ----------
@@ -7522,7 +7522,7 @@ def data_node_storage_refresh_search_index_cmd(
7522
7522
  """
7523
7523
  Refresh the semantic search index for one data node storage.
7524
7524
 
7525
- Uses SDK client `TimeIndexMetaData.refresh_table_search_index()` as the single source of truth.
7525
+ Uses SDK client `TimeIndexMetaTable.refresh_table_search_index()` as the single source of truth.
7526
7526
 
7527
7527
  Examples
7528
7528
  --------
@@ -7596,8 +7596,8 @@ def data_node_storage_search_cmd(
7596
7596
  """
7597
7597
  Search data node storages by description metadata, column metadata, or both.
7598
7598
 
7599
- Uses SDK client `TimeIndexMetaData.description_search()` and
7600
- `TimeIndexMetaData.column_search()` as the single sources of truth.
7599
+ Uses SDK client `TimeIndexMetaTable.description_search()` and
7600
+ `TimeIndexMetaTable.column_search()` as the single sources of truth.
7601
7601
 
7602
7602
  Examples
7603
7603
  --------
@@ -7769,7 +7769,7 @@ def data_node_storage_column_search_cmd(
7769
7769
  """
7770
7770
  Search data node storages by column metadata.
7771
7771
 
7772
- Uses SDK client `TimeIndexMetaData.column_search()` as the single source of truth.
7772
+ Uses SDK client `TimeIndexMetaTable.column_search()` as the single source of truth.
7773
7773
 
7774
7774
  Examples
7775
7775
  --------
@@ -7831,7 +7831,7 @@ def data_node_storage_delete_cmd(
7831
7831
  timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
7832
7832
  ):
7833
7833
  """
7834
- Delete one data node storage using the SDK client `TimeIndexMetaData.delete()` path.
7834
+ Delete one data node storage using the SDK client `TimeIndexMetaTable.delete()` path.
7835
7835
 
7836
7836
  The command always requires typed verification before the delete call is executed.
7837
7837
 
@@ -7861,7 +7861,7 @@ def data_node_storage_can_view_cmd(
7861
7861
  """
7862
7862
  List users who can view one data node storage.
7863
7863
 
7864
- Uses the SDK `ShareableObjectMixin.can_view()` path through the `TimeIndexMetaData` model.
7864
+ Uses the SDK `ShareableObjectMixin.can_view()` path through the `TimeIndexMetaTable` model.
7865
7865
 
7866
7866
  Examples
7867
7867
  --------
@@ -7887,7 +7887,7 @@ def data_node_storage_can_edit_cmd(
7887
7887
  """
7888
7888
  List users who can edit one data node storage.
7889
7889
 
7890
- Uses the SDK `ShareableObjectMixin.can_edit()` path through the `TimeIndexMetaData` model.
7890
+ Uses the SDK `ShareableObjectMixin.can_edit()` path through the `TimeIndexMetaTable` model.
7891
7891
 
7892
7892
  Examples
7893
7893
  --------
@@ -16,7 +16,7 @@ import typer
16
16
  from mainsequence.client.metatables import (
17
17
  DynamicTableDataSource,
18
18
  DynamicTableDataSourceMigrationConnectionRequest,
19
- TimeIndexMetaData,
19
+ TimeIndexMetaTable,
20
20
  )
21
21
  from mainsequence.meta_tables.migrations import (
22
22
  AlembicMetaTableMigration,
@@ -348,7 +348,7 @@ def _collection_create_endpoint_for_items(items: Sequence[Any]) -> str:
348
348
 
349
349
 
350
350
  def _collection_create_endpoint_for_item(item: Any) -> str:
351
- if isinstance(item, TimeIndexMetaData):
351
+ if isinstance(item, TimeIndexMetaTable):
352
352
  return DYNAMIC_TABLE_COLLECTION_ENDPOINT
353
353
  if _item_value(item, "time_index_name") not in (None, ""):
354
354
  return DYNAMIC_TABLE_COLLECTION_ENDPOINT
@@ -83,7 +83,7 @@ class BaseObjectOrm:
83
83
  "Scheduler": "ts_manager/scheduler",
84
84
  "MultiIndexMetadata": "orm/multi_index_metadata",
85
85
  "ContinuousAggMultiIndex": "ts_manager/cont_agg_multi_ind",
86
- "TimeIndexMetaData": "ts_manager/dynamic_table",
86
+ "TimeIndexMetaTable": "ts_manager/dynamic_table",
87
87
  "LocalTimeSerieNodesMethods": "ts_manager/local_time_serie",
88
88
  "DataNodeUpdate": "ts_manager/local_time_serie",
89
89
  "DataNodeUpdateDetails": "ts_manager/local_time_serie_update_details",
@@ -83,9 +83,19 @@ def normalize_dtype_token(
83
83
  )
84
84
  return LOCAL_DATETIME_NAIVE
85
85
 
86
- if lowered in {"object", "str", "string", "text", "varchar", "char", "unicode"}:
86
+ if lowered in {
87
+ "object",
88
+ "str",
89
+ "string",
90
+ "text",
91
+ "varchar",
92
+ "char",
93
+ "character",
94
+ "character varying",
95
+ "unicode",
96
+ }:
87
97
  return STRING
88
- if "varchar" in lowered:
98
+ if "varchar" in lowered or lowered.startswith(("character varying", "character(")):
89
99
  return STRING
90
100
  if compact in {"uuid", "uuidtype", "uuid_", "postgresqluuid"}:
91
101
  return UUID_TOKEN