mainsequence 4.4.2__tar.gz → 4.4.4__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 (138) hide show
  1. {mainsequence-4.4.2/mainsequence.egg-info → mainsequence-4.4.4}/PKG-INFO +1 -1
  2. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/agent_runtime_models.py +16 -0
  3. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/data_nodes/persist_managers.py +2 -2
  4. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/migrations/__init__.py +0 -2
  5. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/sqlalchemy_contracts.py +4 -44
  6. {mainsequence-4.4.2 → mainsequence-4.4.4/mainsequence.egg-info}/PKG-INFO +1 -1
  7. {mainsequence-4.4.2 → mainsequence-4.4.4}/pyproject.toml +1 -1
  8. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_filter_normalization.py +8 -1
  9. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_meta_tables_sqlalchemy_contracts.py +12 -7
  10. {mainsequence-4.4.2 → mainsequence-4.4.4}/LICENSE +0 -0
  11. {mainsequence-4.4.2 → mainsequence-4.4.4}/README.md +0 -0
  12. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/AGENTS.md +0 -0
  13. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
  14. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  15. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
  16. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  17. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
  18. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  19. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  20. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  21. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  22. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  23. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  24. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  25. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  26. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  27. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  28. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
  29. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  30. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  31. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  32. {mainsequence-4.4.2 → mainsequence-4.4.4}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  33. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/__init__.py +0 -0
  34. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/__main__.py +0 -0
  35. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/bootstrap.py +0 -0
  36. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/__init__.py +0 -0
  37. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/api.py +0 -0
  38. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/browser_auth.py +0 -0
  39. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/cli.py +0 -0
  40. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/config.py +0 -0
  41. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/docker_utils.py +0 -0
  42. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/doctor.py +0 -0
  43. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/local_ops.py +0 -0
  44. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/migrations.py +0 -0
  45. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/model_filters.py +0 -0
  46. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/project_status.py +0 -0
  47. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/pydantic_cli.py +0 -0
  48. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/sdk_utils.py +0 -0
  49. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/ssh_utils.py +0 -0
  50. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/cli/ui.py +0 -0
  51. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/__init__.py +0 -0
  52. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/base.py +0 -0
  53. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/client.py +0 -0
  54. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/command_center/__init__.py +0 -0
  55. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/command_center/app_component.py +0 -0
  56. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/command_center/connections.py +0 -0
  57. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/command_center/data_models.py +0 -0
  58. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/command_center/workspace.py +0 -0
  59. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  60. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/compute_validation.py +0 -0
  61. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  62. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  63. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  64. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  65. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/dtype_codec.py +0 -0
  66. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/exceptions.py +0 -0
  67. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/fastapi/__init__.py +0 -0
  68. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/fastapi/auth.py +0 -0
  69. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/metatables/__init__.py +0 -0
  70. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/metatables/core.py +0 -0
  71. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/models_foundry.py +0 -0
  72. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/models_helpers.py +0 -0
  73. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/models_user.py +0 -0
  74. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/client/utils.py +0 -0
  75. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/defaults.py +0 -0
  76. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/instrumentation/__init__.py +0 -0
  77. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/instrumentation/utils.py +0 -0
  78. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/logconf.py +0 -0
  79. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/__init__.py +0 -0
  80. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/__main__.py +0 -0
  81. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  82. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  83. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
  84. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
  85. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
  86. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/data_nodes/models.py +0 -0
  87. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
  88. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
  89. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
  90. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/future_registry.py +0 -0
  91. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/hashing.py +0 -0
  92. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  93. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/migrations/env.py +0 -0
  94. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/migrations/provider.py +0 -0
  95. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/migrations/registry.py +0 -0
  96. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  97. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  98. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  99. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  100. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  101. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/meta_tables/schema_names.py +0 -0
  102. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence/runtime_flags.py +0 -0
  103. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence.egg-info/SOURCES.txt +0 -0
  104. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence.egg-info/dependency_links.txt +0 -0
  105. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence.egg-info/entry_points.txt +0 -0
  106. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence.egg-info/requires.txt +0 -0
  107. {mainsequence-4.4.2 → mainsequence-4.4.4}/mainsequence.egg-info/top_level.txt +0 -0
  108. {mainsequence-4.4.2 → mainsequence-4.4.4}/setup.cfg +0 -0
  109. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_auth_precedence.py +0 -0
  110. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_build_operations_hashing.py +0 -0
  111. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_cli.py +0 -0
  112. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_cli_browser_auth.py +0 -0
  113. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_cli_migrations.py +0 -0
  114. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_client.py +0 -0
  115. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_command_center_app_component_models.py +0 -0
  116. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_command_center_data_models.py +0 -0
  117. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_command_center_models.py +0 -0
  118. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_data_access_mixin_dimension_audit.py +0 -0
  119. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_data_node_storage_dimension_queries.py +0 -0
  120. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_data_node_update_flow.py +0 -0
  121. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_dependency_extras.py +0 -0
  122. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_duckdb_interface_dimensions.py +0 -0
  123. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_instrumentation.py +0 -0
  124. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_logconf.py +0 -0
  125. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_meta_table_migrations.py +0 -0
  126. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_meta_tables_client_models.py +0 -0
  127. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_models_user_request_bound_auth.py +0 -0
  128. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_pod_project_resolution.py +0 -0
  129. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_project_batch_jobs_from_file.py +0 -0
  130. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_run_configuration.py +0 -0
  131. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_schema_names.py +0 -0
  132. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_secret_client_model.py +0 -0
  133. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_source_table_configuration.py +0 -0
  134. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_sqlite_interface_dimensions.py +0 -0
  135. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_update_runner_uid_runtime.py +0 -0
  136. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_update_statistics.py +0 -0
  137. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_update_uid_guards.py +0 -0
  138. {mainsequence-4.4.2 → mainsequence-4.4.4}/tests/test_workspace_snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.4.2
3
+ Version: 4.4.4
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
@@ -126,6 +126,18 @@ class Agent(ShareableObjectMixin, BaseObjectOrm, BasePydanticModel):
126
126
  None,
127
127
  description="Timestamp of the most recent session recorded for this agent.",
128
128
  )
129
+ has_agent_service: bool = Field(
130
+ False,
131
+ description="Whether the backend resolved this agent to a typed coding-agent service.",
132
+ )
133
+ agent_service_uid: str | None = Field(
134
+ None,
135
+ description="Public UID of the resolved typed coding-agent service, if one exists.",
136
+ )
137
+ agent_service_automatic_deployment: bool | None = Field(
138
+ None,
139
+ description="Service-level automatic deployment flag for the resolved typed coding-agent service.",
140
+ )
129
141
 
130
142
  @classmethod
131
143
  def get_by_agent_unique_id(cls, agent_unique_id: str, *, timeout=None) -> Agent:
@@ -416,6 +428,10 @@ class AgentSession(BaseObjectOrm, BasePydanticModel):
416
428
  agent_uid: str | None = Field(None, description="Public UID of the agent definition used for this session.")
417
429
  created_by_user_uid: str | None = Field(None, description="Public UID of the actor who created the session.")
418
430
  parent_session_uid: str | None = Field(None, description="Public UID of the parent session, if any.")
431
+ name: str = Field(
432
+ "",
433
+ description="Optional human-readable session name for UI and user-facing history.",
434
+ )
419
435
  created_by_user: int | None = Field(
420
436
  None,
421
437
  exclude=True,
@@ -26,7 +26,7 @@ from mainsequence.client.metatables import (
26
26
  )
27
27
  from mainsequence.instrumentation import tracer
28
28
  from mainsequence.logconf import logger
29
- from mainsequence.meta_tables import PlatformTimeIndexMetaTable
29
+ from mainsequence.meta_tables import PlatformTimeIndexMetaTable, compute_metatable_contract_hash
30
30
 
31
31
  from .. import future_registry
32
32
 
@@ -240,7 +240,7 @@ def _storage_table_identity_summary(storage_table: type[PlatformTimeIndexMetaTab
240
240
  if identifier not in (None, ""):
241
241
  parts.append(f"identifier={identifier!r}")
242
242
  try:
243
- contract_hash = storage_table.get_storage_hash()
243
+ contract_hash = compute_metatable_contract_hash(storage_table)
244
244
  except Exception:
245
245
  contract_hash = None
246
246
  if contract_hash not in (None, ""):
@@ -452,7 +452,6 @@ class AlembicMetaTableMigration:
452
452
  request = model.build_registration_request(
453
453
  data_source_uid=data_source_uid,
454
454
  provisioning={"create_table": create_table, "if_not_exists": True},
455
- enforce_storage_hash_name=False,
456
455
  )
457
456
  request.schema_management = schema_management
458
457
  meta_table_cls = _metatable_resource_class_for_model(model)
@@ -624,7 +623,6 @@ class AlembicMetaTableMigration:
624
623
  request = model.build_registration_request(
625
624
  data_source_uid=data_source_uid,
626
625
  identifier=table_name,
627
- enforce_storage_hash_name=False,
628
626
  )
629
627
 
630
628
  resource_cls = _metatable_resource_class_for_model(model)
@@ -90,15 +90,11 @@ def _configured_storage_hash_for_model(
90
90
  *,
91
91
  namespace: str | None = None,
92
92
  schema: str | None = None,
93
- hash_namespace: str | None = None,
94
- extra_hash_components: Mapping[str, Any] | None = None,
95
93
  ) -> str:
96
94
  return compute_metatable_contract_hash(
97
95
  model_or_table,
98
96
  namespace=namespace,
99
97
  schema=schema,
100
- hash_namespace=hash_namespace,
101
- extra_components=extra_hash_components,
102
98
  )
103
99
 
104
100
 
@@ -122,11 +118,9 @@ def compute_metatable_contract_hash(
122
118
  resolved_schema = _resolve_schema(table, schema=schema)
123
119
  resolved_namespace = _resolve_namespace(model_or_table, namespace=namespace)
124
120
  resolved_hash_namespace = _resolve_hash_namespace(
125
- model_or_table,
126
121
  hash_namespace=hash_namespace,
127
122
  )
128
123
  resolved_extra_hash_components = _resolve_extra_hash_components(
129
- model_or_table,
130
124
  extra_hash_components=extra_components,
131
125
  )
132
126
  table_storage_identity = _configured_table_storage_identity(model_or_table, table=table)
@@ -164,9 +158,8 @@ def _time_index_mapper_args(cls: type[Any]) -> dict[str, list[Any]]:
164
158
  class PlatformManagedMetaTable:
165
159
  """SQLAlchemy declarative base mixin for platform-managed MetaTables.
166
160
 
167
- The class derives the logical storage hash from storage-relevant metadata
168
- plus the SQLAlchemy table storage shape, builds the platform registration
169
- request, and registers the MetaTable through TS Manager. Binding records the
161
+ The class builds the platform registration request from SQLAlchemy table
162
+ metadata and registers the MetaTable through TS Manager. Binding records the
170
163
  returned MetaTable UID and storage metadata while preserving the authored
171
164
  SQLAlchemy table name.
172
165
  """
@@ -180,8 +173,6 @@ class PlatformManagedMetaTable:
180
173
  __metatable_provisioning__: ClassVar[Mapping[str, Any] | None] = None
181
174
  __metatable_protect_from_deletion__: ClassVar[bool | None] = None
182
175
  __metatable_introspect__: ClassVar[bool | None] = None
183
- __metatable_hash_namespace__: ClassVar[str | None] = None
184
- __metatable_extra_hash_components__: ClassVar[Mapping[str, Any] | None] = None
185
176
 
186
177
  @classmethod
187
178
  def __table_cls__(cls, *args: Any, **kwargs: Any) -> Any:
@@ -217,9 +208,6 @@ class PlatformManagedMetaTable:
217
208
  protect_from_deletion: bool | None = None,
218
209
  provisioning: Mapping[str, Any] | None = None,
219
210
  introspect: bool | None = None,
220
- hash_namespace: str | None = None,
221
- extra_hash_components: Mapping[str, Any] | None = None,
222
- enforce_storage_hash_name: bool = True,
223
211
  ) -> MetaTableRegistrationRequest:
224
212
  resolved_data_source_uid = _resolve_model_data_source_uid(
225
213
  cls,
@@ -236,9 +224,6 @@ class PlatformManagedMetaTable:
236
224
  protect_from_deletion=protect_from_deletion,
237
225
  provisioning=provisioning,
238
226
  introspect=introspect,
239
- hash_namespace=hash_namespace,
240
- extra_hash_components=extra_hash_components,
241
- enforce_storage_hash_name=enforce_storage_hash_name,
242
227
  )
243
228
 
244
229
  @classmethod
@@ -300,10 +285,6 @@ class PlatformManagedMetaTable:
300
285
  )
301
286
  return _coerce_optional_uid(data_source_uid)
302
287
 
303
- @classmethod
304
- def get_storage_hash(cls) -> str:
305
- return compute_metatable_contract_hash(cls)
306
-
307
288
  @classmethod
308
289
  def get_physical_table_name(cls) -> str | None:
309
290
  physical_table_name = getattr(cls, "__metatable_physical_table_name__", None)
@@ -385,9 +366,6 @@ class PlatformTimeIndexMetaTable(PlatformManagedMetaTable):
385
366
  labels: Sequence[str] | None = None,
386
367
  protect_from_deletion: bool | None = None,
387
368
  provisioning: Mapping[str, Any] | None = None,
388
- hash_namespace: str | None = None,
389
- extra_hash_components: Mapping[str, Any] | None = None,
390
- enforce_storage_hash_name: bool = True,
391
369
  time_index_name: str | None = None,
392
370
  index_names: Sequence[str] | None = None,
393
371
  storage_layout: Mapping[str, Any] | None = None,
@@ -406,9 +384,6 @@ class PlatformTimeIndexMetaTable(PlatformManagedMetaTable):
406
384
  labels=labels,
407
385
  protect_from_deletion=protect_from_deletion,
408
386
  provisioning=provisioning,
409
- hash_namespace=hash_namespace,
410
- extra_hash_components=extra_hash_components,
411
- enforce_storage_hash_name=enforce_storage_hash_name,
412
387
  time_index_name=time_index_name,
413
388
  index_names=index_names,
414
389
  storage_layout=storage_layout,
@@ -502,9 +477,6 @@ def time_indexed_registration_request_from_sqlalchemy_model(
502
477
  protect_from_deletion: bool | None = None,
503
478
  provisioning: Mapping[str, Any] | None = None,
504
479
  schema: str | None = None,
505
- hash_namespace: str | None = None,
506
- extra_hash_components: Mapping[str, Any] | None = None,
507
- enforce_storage_hash_name: bool = True,
508
480
  time_index_name: str | None = None,
509
481
  index_names: Sequence[str] | None = None,
510
482
  storage_layout: Mapping[str, Any] | None = None,
@@ -612,9 +584,6 @@ def platform_managed_registration_request_from_sqlalchemy_model(
612
584
  provisioning: Mapping[str, Any] | None = None,
613
585
  introspect: bool | None = None,
614
586
  schema: str | None = None,
615
- hash_namespace: str | None = None,
616
- extra_hash_components: Mapping[str, Any] | None = None,
617
- enforce_storage_hash_name: bool = True,
618
587
  ) -> MetaTableRegistrationRequest:
619
588
  table = _resolve_table(model_or_table)
620
589
  resolved_schema = _resolve_schema(table, schema=schema)
@@ -667,8 +636,6 @@ def external_registered_registration_request_from_sqlalchemy_model(
667
636
  protect_from_deletion: bool = False,
668
637
  introspect: bool = True,
669
638
  schema: str | None = None,
670
- hash_namespace: str | None = None,
671
- extra_hash_components: Mapping[str, Any] | None = None,
672
639
  ) -> MetaTableRegistrationRequest:
673
640
  table = _resolve_table(model_or_table)
674
641
  resolved_schema = _resolve_schema(table, schema=schema)
@@ -1059,24 +1026,17 @@ def _resolve_bool_metadata(
1059
1026
  return bool(resolved_value)
1060
1027
 
1061
1028
 
1062
- def _resolve_hash_namespace(model_or_table: Any, *, hash_namespace: str | None) -> str | None:
1029
+ def _resolve_hash_namespace(*, hash_namespace: str | None) -> str | None:
1063
1030
  if hash_namespace is not None:
1064
1031
  return hash_namespace
1065
- resolved_hash_namespace = getattr(model_or_table, "__metatable_hash_namespace__", None)
1066
- if resolved_hash_namespace in (None, ""):
1067
- return None
1068
- return str(resolved_hash_namespace)
1032
+ return None
1069
1033
 
1070
1034
 
1071
1035
  def _resolve_extra_hash_components(
1072
- model_or_table: Any,
1073
1036
  *,
1074
1037
  extra_hash_components: Mapping[str, Any] | None,
1075
1038
  ) -> dict[str, Any] | None:
1076
1039
  resolved: dict[str, Any] = {}
1077
- class_components = getattr(model_or_table, "__metatable_extra_hash_components__", None)
1078
- if isinstance(class_components, Mapping):
1079
- resolved.update(dict(class_components))
1080
1040
  if isinstance(extra_hash_components, Mapping):
1081
1041
  resolved.update(dict(extra_hash_components))
1082
1042
  return resolved or None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.4.2
3
+ Version: 4.4.4
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence"
7
- version = "4.4.2"
7
+ version = "4.4.4"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1318,12 +1318,17 @@ def test_agent_runtime_models_deserialize_backend_uid_payloads():
1318
1318
  "llm_thinking": "medium",
1319
1319
  "runtime_config": {"temperature": 0},
1320
1320
  "configuration": {"mode": "analysis"},
1321
- "metadata": {"owner": "quant"},
1322
1321
  "last_session_at": "2026-01-01T00:00:00Z",
1322
+ "has_agent_service": True,
1323
+ "agent_service_uid": service_uid,
1324
+ "agent_service_automatic_deployment": True,
1323
1325
  }
1324
1326
  )
1325
1327
  assert agent.uid == agent_uid
1326
1328
  assert agent.agent_unique_id == "research-copilot"
1329
+ assert agent.has_agent_service is True
1330
+ assert agent.agent_service_uid == service_uid
1331
+ assert agent.agent_service_automatic_deployment is True
1327
1332
 
1328
1333
  search_result = agent_models_mod.AgentSemanticSearchResult.model_validate(
1329
1334
  {
@@ -1347,6 +1352,7 @@ def test_agent_runtime_models_deserialize_backend_uid_payloads():
1347
1352
  "agent_type": "custom",
1348
1353
  "created_by_user_uid": user_uid,
1349
1354
  "parent_session_uid": None,
1355
+ "name": "Research follow-up",
1350
1356
  "status": "running",
1351
1357
  "runtime_state": "running",
1352
1358
  "working": True,
@@ -1371,6 +1377,7 @@ def test_agent_runtime_models_deserialize_backend_uid_payloads():
1371
1377
  )
1372
1378
  assert session.uid == session_uid
1373
1379
  assert session.agent_uid == agent_uid
1380
+ assert session.name == "Research follow-up"
1374
1381
 
1375
1382
  orchestrator = agent_models_mod.UserOrchestratorAgentService.model_validate(
1376
1383
  {
@@ -1108,7 +1108,6 @@ def test_platform_managed_omits_foreign_key_contracts():
1108
1108
 
1109
1109
  request = Asset.build_registration_request(
1110
1110
  data_source_uid="dddddddd-dddd-4ddd-8ddd-dddddddddddd",
1111
- enforce_storage_hash_name=False,
1112
1111
  )
1113
1112
 
1114
1113
  assert not hasattr(request.table_contract, "foreign_keys")
@@ -1184,7 +1183,6 @@ def test_platform_managed_metatable_register_delegates_to_meta_table_register(mo
1184
1183
  assert Account.get_meta_table() is registered
1185
1184
  assert Account.get_meta_table_uid() == "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa"
1186
1185
  assert Account.get_data_source_uid() == "dddddddd-dddd-4ddd-8ddd-dddddddddddd"
1187
- assert Account.get_storage_hash() == _configured_storage_hash(Account)
1188
1186
  assert Account.get_physical_table_name() == "example_assets__account"
1189
1187
  assert Account.__table__.name == "example_assets__account"
1190
1188
  assert captured["timeout"] == 15
@@ -1508,7 +1506,6 @@ def test_time_index_meta_table_register_posts_to_dynamic_table_endpoint(monkeypa
1508
1506
  assert AccountHoldings.get_meta_table() is registered
1509
1507
  assert AccountHoldings.get_time_index_meta_table() is registered
1510
1508
  assert AccountHoldings.get_meta_table_uid() == "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa"
1511
- assert AccountHoldings.get_storage_hash() == _configured_storage_hash(AccountHoldings)
1512
1509
  assert AccountHoldings.get_physical_table_name() == "example_assets__account_holdings"
1513
1510
  assert AccountHoldings.__table__.name == "example_assets__account_holdings"
1514
1511
  assert captured["r_type"] == "POST"
@@ -1675,7 +1672,7 @@ def test_ensure_registered_storage_table_reports_duplicate_matches(monkeypatch):
1675
1672
  assert "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb" in message
1676
1673
 
1677
1674
 
1678
- def test_time_index_storage_name_hash_component_separates_identical_table_shapes():
1675
+ def test_contract_hash_extra_components_are_explicit_utility_inputs():
1679
1676
  columns_a = [
1680
1677
  FakeColumn("time_index", DateTime(timezone=True), nullable=False),
1681
1678
  FakeColumn("random_number", String(255), nullable=False),
@@ -1698,12 +1695,20 @@ def test_time_index_storage_name_hash_component_separates_identical_table_shapes
1698
1695
  namespace="mainsequence.examples",
1699
1696
  identifier="daily_random_addition_project",
1700
1697
  )
1701
- RandomNumber.__metatable_extra_hash_components__ = {"storage_name": "daily_random_number"}
1702
- RandomAddition.__metatable_extra_hash_components__ = {"storage_name": "daily_random_addition"}
1703
1698
 
1704
1699
  random_number_storage_hash = _configured_storage_hash(RandomNumber)
1705
1700
  random_addition_storage_hash = _configured_storage_hash(RandomAddition)
1706
1701
  assert random_number_storage_hash != random_addition_storage_hash
1702
+ assert (
1703
+ sqlalchemy_contracts.compute_metatable_contract_hash(
1704
+ RandomNumber,
1705
+ extra_components={"storage_name": "daily_random_number"},
1706
+ )
1707
+ != sqlalchemy_contracts.compute_metatable_contract_hash(
1708
+ RandomNumber,
1709
+ extra_components={"storage_name": "daily_random_addition"},
1710
+ )
1711
+ )
1707
1712
 
1708
1713
  request = time_indexed_registration_request_from_sqlalchemy_model(
1709
1714
  RandomNumber,
@@ -1901,7 +1906,7 @@ def test_platform_managed_register_preserves_authored_sqlalchemy_table_name(
1901
1906
 
1902
1907
  _assert_omits_storage_hash(captured["request"])
1903
1908
  assert captured["request"].table_contract.physical.table_name == "example_assets__account"
1904
- assert Account.get_storage_hash() == storage_hash
1909
+ assert _configured_storage_hash(Account) == storage_hash
1905
1910
  assert Account.get_physical_table_name() == "example_assets__account"
1906
1911
  assert Account.__table__.name == "example_assets__account"
1907
1912
  assert Account.__table__.schema is None
File without changes
File without changes
File without changes