mainsequence 8.1.20.dev13__tar.gz → 8.1.20.dev15__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 (144) hide show
  1. {mainsequence-8.1.20.dev13/mainsequence.egg-info → mainsequence-8.1.20.dev15}/PKG-INFO +1 -1
  2. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/agent_runtime_models.py +50 -42
  3. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/github_issues.py +8 -3
  4. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/metatables/core.py +6 -5
  5. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/models_foundry.py +3 -2
  6. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/models_helpers.py +73 -51
  7. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/models_user.py +4 -3
  8. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/observability.py +14 -9
  9. mainsequence-8.1.20.dev15/mainsequence/client/value_sets.py +164 -0
  10. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15/mainsequence.egg-info}/PKG-INFO +1 -1
  11. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence.egg-info/SOURCES.txt +2 -0
  12. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/pyproject.toml +1 -1
  13. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_code_repository_branch_contract.py +14 -3
  14. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_filter_normalization.py +19 -6
  15. mainsequence-8.1.20.dev15/tests/test_tolerant_value_sets.py +273 -0
  16. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/LICENSE +0 -0
  17. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/MANIFEST.in +0 -0
  18. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/README.md +0 -0
  19. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/agent_scaffold/AGENTS.md +0 -0
  20. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/agent_scaffold/skills/a2a_sdk_execution/SKILL.md +0 -0
  21. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  22. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  23. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  24. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  25. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/agent_scaffold/skills/data_publishing/time_index_table_updates/SKILL.md +0 -0
  26. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  27. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/agent_scaffold/skills/maintenance/code_repository_maintenance/SKILL.md +0 -0
  28. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  29. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  30. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/agent_scaffold/skills/sdk_code_repository_execution/SKILL.md +0 -0
  31. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/__init__.py +0 -0
  32. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/__main__.py +0 -0
  33. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/bootstrap.py +0 -0
  34. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/__init__.py +0 -0
  35. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/api.py +0 -0
  36. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/browser_auth.py +0 -0
  37. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/cli.py +0 -0
  38. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/code_repository_status.py +0 -0
  39. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/config.py +0 -0
  40. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/docker_utils.py +0 -0
  41. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/doctor.py +0 -0
  42. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/local_ops.py +0 -0
  43. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/migrations.py +0 -0
  44. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/model_filters.py +0 -0
  45. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/pydantic_cli.py +0 -0
  46. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/sdk_utils.py +0 -0
  47. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/ssh_utils.py +0 -0
  48. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/cli/ui.py +0 -0
  49. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/__init__.py +0 -0
  50. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/base.py +0 -0
  51. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/client.py +0 -0
  52. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/compute_validation.py +0 -0
  53. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  54. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  55. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  56. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  57. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/dtype_codec.py +0 -0
  58. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/exceptions.py +0 -0
  59. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/metatables/__init__.py +0 -0
  60. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/client/utils.py +0 -0
  61. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/code_repository_context.py +0 -0
  62. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/code_repository_skills.py +0 -0
  63. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/defaults.py +0 -0
  64. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/instrumentation/__init__.py +0 -0
  65. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/instrumentation/utils.py +0 -0
  66. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/logconf.py +0 -0
  67. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/__init__.py +0 -0
  68. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/__main__.py +0 -0
  69. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  70. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  71. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/future_registry.py +0 -0
  72. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/hashing.py +0 -0
  73. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  74. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  75. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/migrations/env.py +0 -0
  76. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/migrations/provider.py +0 -0
  77. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/migrations/registry.py +0 -0
  78. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  79. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  80. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  81. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  82. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  83. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/schema_names.py +0 -0
  84. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  85. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/time_index_table_refs.py +0 -0
  86. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/time_index_table_updates/__init__.py +0 -0
  87. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/time_index_table_updates/configuration.py +0 -0
  88. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/time_index_table_updates/dependencies.py +0 -0
  89. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/time_index_table_updates/managers.py +0 -0
  90. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/time_index_table_updates/namespacing.py +0 -0
  91. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/time_index_table_updates/runner.py +0 -0
  92. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/time_index_table_updates/updaters.py +0 -0
  93. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/meta_tables/time_index_table_updates/utils.py +0 -0
  94. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/repository_identity_security.py +0 -0
  95. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/runtime_flags.py +0 -0
  96. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence/scaffold_skills.py +0 -0
  97. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence.egg-info/dependency_links.txt +0 -0
  98. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence.egg-info/entry_points.txt +0 -0
  99. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence.egg-info/requires.txt +0 -0
  100. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/mainsequence.egg-info/top_level.txt +0 -0
  101. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/setup.cfg +0 -0
  102. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/fixtures/time_index_table_update_hash_v2_golden.json +0 -0
  103. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_auth_precedence.py +0 -0
  104. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_canonical_api_route_contract.py +0 -0
  105. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_cli.py +0 -0
  106. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_cli_browser_auth.py +0 -0
  107. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_cli_migrations.py +0 -0
  108. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_client.py +0 -0
  109. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_code_repository_batch_jobs_from_file.py +0 -0
  110. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_code_repository_documentation_contract.py +0 -0
  111. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_code_repository_runtime_context.py +0 -0
  112. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_code_repository_skills.py +0 -0
  113. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_dependency_extras.py +0 -0
  114. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_dev_release_version.py +0 -0
  115. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_duckdb_interface_dimensions.py +0 -0
  116. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_environment_resource_context.py +0 -0
  117. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_environment_response_contracts.py +0 -0
  118. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_github_issues_client.py +0 -0
  119. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_instrumentation.py +0 -0
  120. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_local_ops.py +0 -0
  121. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_logconf.py +0 -0
  122. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_meta_table_migrations.py +0 -0
  123. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_meta_tables_client_models.py +0 -0
  124. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  125. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_models_user_request_bound_auth.py +0 -0
  126. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_notification_uid_contract.py +0 -0
  127. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_observability_client.py +0 -0
  128. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_pod_project_resolution.py +0 -0
  129. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_scaffold_skills.py +0 -0
  130. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_schema_names.py +0 -0
  131. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_secret_client_model.py +0 -0
  132. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_source_table_configuration.py +0 -0
  133. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_sqlite_interface_dimensions.py +0 -0
  134. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_ssh_utils.py +0 -0
  135. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_time_index_table_access_dimension_audit.py +0 -0
  136. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_time_index_table_dimension_queries.py +0 -0
  137. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_time_index_table_update_configuration.py +0 -0
  138. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_time_index_table_update_configuration_client.py +0 -0
  139. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_time_index_table_update_flow.py +0 -0
  140. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_time_index_table_update_hard_cut.py +0 -0
  141. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_tolerant_response_reading.py +0 -0
  142. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_update_runner_uid_runtime.py +0 -0
  143. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/tests/test_update_statistics.py +0 -0
  144. {mainsequence-8.1.20.dev13 → mainsequence-8.1.20.dev15}/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.dev13
3
+ Version: 8.1.20.dev15
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License-Expression: LicenseRef-MainSequence-Proprietary
@@ -6,7 +6,6 @@ import json
6
6
  import pathlib
7
7
  import time
8
8
  import uuid
9
- from enum import Enum
10
9
  from typing import Any, ClassVar, Literal
11
10
 
12
11
  import requests
@@ -31,6 +30,7 @@ from .observability import (
31
30
  PublicLogLevel,
32
31
  )
33
32
  from .utils import make_request, serialize_to_json
33
+ from .value_sets import OpenStrEnum, OpenValueSet
34
34
 
35
35
  DEFAULT_AGENT_SESSION_LONG_REQUEST_TIMEOUT = (5.0, 900.0)
36
36
  DEFAULT_AGENT_RUNTIME_ACCESS_CACHE_TTL_SECONDS = 60.0
@@ -50,7 +50,7 @@ MIN_RUNTIME_INTERACTION_RETRY_SECONDS = 0.5
50
50
  MAX_RUNTIME_INTERACTION_RETRY_SECONDS = 30.0
51
51
 
52
52
 
53
- class AgentSessionStatus(str, Enum):
53
+ class AgentSessionStatus(OpenStrEnum):
54
54
  PENDING = "pending"
55
55
  RUNNING = "running"
56
56
  COMPLETED = "completed"
@@ -58,7 +58,7 @@ class AgentSessionStatus(str, Enum):
58
58
  CANCELED = "canceled"
59
59
 
60
60
 
61
- class A2AResponseKind(str, Enum):
61
+ class A2AResponseKind(OpenStrEnum):
62
62
  MESSAGE = "message"
63
63
  TASK = "task"
64
64
 
@@ -121,12 +121,12 @@ class A2AMessageSendResult(BasePydanticModel):
121
121
  return A2AResponseKind.TASK if self.task is not None else A2AResponseKind.MESSAGE
122
122
 
123
123
 
124
- class AgentHarnessKind(str, Enum):
124
+ class AgentHarnessKind(OpenStrEnum):
125
125
  PI = "pi"
126
126
  TAU = "tau"
127
127
 
128
128
 
129
- class AgentHarnessProtocol(str, Enum):
129
+ class AgentHarnessProtocol(OpenStrEnum):
130
130
  PI_CHECKPOINT_V1 = "pi-checkpoint-v1"
131
131
  TAU_SESSION_V1 = "tau-session-v1"
132
132
 
@@ -136,13 +136,15 @@ class AgentRuntimeUpdateRemediation(BasePydanticModel):
136
136
 
137
137
 
138
138
  class AgentRuntimeUpdate(BasePydanticModel):
139
- state: Literal[
140
- "current",
141
- "update_required",
142
- "updating",
143
- "update_failed",
144
- "not_deployed",
145
- "unknown",
139
+ state: OpenValueSet[
140
+ Literal[
141
+ "current",
142
+ "update_required",
143
+ "updating",
144
+ "update_failed",
145
+ "not_deployed",
146
+ "unknown",
147
+ ]
146
148
  ]
147
149
  needs_redeploy: bool | None
148
150
  remediation: AgentRuntimeUpdateRemediation | None
@@ -279,7 +281,7 @@ class AgentRuntimeInteractionNotice(BasePydanticModel):
279
281
  class AgentRuntimeInteractionAction(BasePydanticModel):
280
282
  model_config = ConfigDict(extra="allow")
281
283
 
282
- type: Literal["update_agent_runtime", "retry_runtime_wake"]
284
+ type: OpenValueSet[Literal["update_agent_runtime", "retry_runtime_wake"]]
283
285
  label: str
284
286
  confirmation_message: str
285
287
  interaction_revision: str
@@ -299,16 +301,18 @@ class AgentRuntimeInteractionOperation(BasePydanticModel):
299
301
  class AgentRuntimeInteraction(BasePydanticModel):
300
302
  model_config = ConfigDict(extra="allow")
301
303
 
302
- state: Literal[
303
- "ready",
304
- "warning",
305
- "checking",
306
- "starting",
307
- "waking",
308
- "update_required",
309
- "updating",
310
- "update_failed",
311
- "unavailable",
304
+ state: OpenValueSet[
305
+ Literal[
306
+ "ready",
307
+ "warning",
308
+ "checking",
309
+ "starting",
310
+ "waking",
311
+ "update_required",
312
+ "updating",
313
+ "update_failed",
314
+ "unavailable",
315
+ ]
312
316
  ]
313
317
  can_submit: bool
314
318
  notice: AgentRuntimeInteractionNotice | None
@@ -324,29 +328,33 @@ class AgentRuntimePresenceReplicas(BasePydanticModel):
324
328
 
325
329
  class AgentRuntimePresenceWake(BasePydanticModel):
326
330
  operation_uid: str
327
- state: Literal[
328
- "requested",
329
- "in_progress",
330
- "serving",
331
- "failed",
332
- "expired",
333
- "superseded",
331
+ state: OpenValueSet[
332
+ Literal[
333
+ "requested",
334
+ "in_progress",
335
+ "serving",
336
+ "failed",
337
+ "expired",
338
+ "superseded",
339
+ ]
334
340
  ]
335
341
  requested_at: str
336
342
  deadline_at: str
337
343
 
338
344
 
339
345
  class AgentRuntimePresence(BasePydanticModel):
340
- phase: Literal[
341
- "not_deployed",
342
- "observing",
343
- "idle",
344
- "provisioning",
345
- "pulling_image",
346
- "starting",
347
- "serving",
348
- "redeploying",
349
- "failed",
346
+ phase: OpenValueSet[
347
+ Literal[
348
+ "not_deployed",
349
+ "observing",
350
+ "idle",
351
+ "provisioning",
352
+ "pulling_image",
353
+ "starting",
354
+ "serving",
355
+ "redeploying",
356
+ "failed",
357
+ ]
350
358
  ]
351
359
  replicas: AgentRuntimePresenceReplicas
352
360
  detail: str
@@ -361,7 +369,7 @@ class AgentSessionRuntimeAccess(BasePydanticModel):
361
369
  None,
362
370
  description="Canonical public UID of the coding-agent service that owns the runtime.",
363
371
  )
364
- mode: Literal["token", "unavailable"] = Field(
372
+ mode: OpenValueSet[Literal["token", "unavailable"]] = Field(
365
373
  "token",
366
374
  description="Runtime access mode returned by the backend.",
367
375
  )
@@ -862,7 +870,7 @@ class TauAgentSessionInsightsSession(BasePydanticModel):
862
870
  agent_session_id: str = Field(..., alias="agentSessionId")
863
871
  session_id: str | None = Field(None, alias="sessionId")
864
872
  thread_id: str | None = Field(None, alias="threadId")
865
- status: Literal["running", "completed", "error"]
873
+ status: OpenValueSet[Literal["running", "completed", "error"]]
866
874
  started_at: datetime.datetime | None = Field(None, alias="startedAt")
867
875
  updated_at: datetime.datetime | None = Field(None, alias="updatedAt")
868
876
  last_error: str | None = Field(None, alias="lastError")
@@ -11,11 +11,16 @@ from . import utils as client_utils
11
11
  from .base import BasePydanticModel
12
12
  from .exceptions import raise_for_response
13
13
  from .utils import make_request
14
+ from .value_sets import OpenValueSet
14
15
 
15
16
  GitHubIssueState = Literal["open", "closed"]
16
17
  GitHubIssueStateReason = Literal["completed", "not_planned", "reopened"]
17
- GitHubIssueOperationType = Literal["create_issue", "update_issue", "create_comment"]
18
- GitHubIssueOperationStatus = Literal["pending", "succeeded", "failed", "unknown"]
18
+ GitHubIssueOperationType = OpenValueSet[
19
+ Literal["create_issue", "update_issue", "create_comment"]
20
+ ]
21
+ GitHubIssueOperationStatus = OpenValueSet[
22
+ Literal["pending", "succeeded", "failed", "unknown"]
23
+ ]
19
24
 
20
25
  _IDEMPOTENCY_KEY_PATTERN = re.compile(r"^[A-Za-z0-9._:-]+$")
21
26
 
@@ -115,7 +120,7 @@ class _GitHubIssueProjection(BasePydanticModel):
115
120
  issue_number: int
116
121
  html_url: str
117
122
  title: str
118
- state: GitHubIssueState
123
+ state: OpenValueSet[GitHubIssueState]
119
124
  state_reason: str | None
120
125
  created_at: datetime.datetime
121
126
  updated_at: datetime.datetime
@@ -61,6 +61,7 @@ from ..utils import (
61
61
  make_request,
62
62
  serialize_to_json,
63
63
  )
64
+ from ..value_sets import OpenValueSet
64
65
 
65
66
  DUCK_DB = "duck_db"
66
67
  SQLITE = "sqlite"
@@ -1059,7 +1060,7 @@ class MetaTableCascadeDeletedMetaTable(BasePydanticModel):
1059
1060
  meta_table_uid: str
1060
1061
  physical_schema: str | None = None
1061
1062
  physical_table_name: str | None = None
1062
- management_mode: MetaTableManagementMode
1063
+ management_mode: OpenValueSet[MetaTableManagementMode]
1063
1064
  physical_table_drop_scheduled: bool
1064
1065
  physical_table_drop_cascade: bool
1065
1066
  schema_management_protection_overridden: bool
@@ -1109,7 +1110,7 @@ class DataSource(BasePydanticModel, BaseObjectOrm):
1109
1110
  )
1110
1111
  class_type: str | None = None
1111
1112
  status: str | None = None
1112
- storage_access_mode: StorageAccessMode | None = Field(
1113
+ storage_access_mode: OpenValueSet[StorageAccessMode] | None = Field(
1113
1114
  default="read_write",
1114
1115
  description="Runtime storage access gate: read_write, read_only, or disabled.",
1115
1116
  )
@@ -1369,9 +1370,9 @@ class MetaTable(
1369
1370
  namespace: str | None = None
1370
1371
  description: str | None = None
1371
1372
  labels: list[str] = Field(default_factory=list)
1372
- management_mode: MetaTableManagementMode
1373
- provisioning_status: Literal["reserved", "active"] = "active"
1374
- schema_management_mode: MetaTableSchemaManagementMode = "backend_managed"
1373
+ management_mode: OpenValueSet[MetaTableManagementMode]
1374
+ provisioning_status: OpenValueSet[Literal["reserved", "active"]] = "active"
1375
+ schema_management_mode: OpenValueSet[MetaTableSchemaManagementMode] = "backend_managed"
1375
1376
  schema_management: dict[str, Any] = Field(default_factory=dict)
1376
1377
  migration_package: str | None = None
1377
1378
  migration_namespace: str | None = None
@@ -30,6 +30,7 @@ from .metatables import DataSource as _DataSource
30
30
  from .utils import (
31
31
  make_request,
32
32
  )
33
+ from .value_sets import OpenValueSet
33
34
 
34
35
  if TYPE_CHECKING:
35
36
  from .github_issues import GitHubIssueMutationResult, GitHubIssuePage, GitHubIssueState
@@ -508,7 +509,7 @@ class CodeRepositoryBranch(BasePydanticModel, BaseObjectOrm):
508
509
  github_repository_binding_uid: str | None = None
509
510
  latest_git_version: str = ""
510
511
  is_initialized: bool
511
- provisioning_status: Literal["CREATING", "READY", "FAILED"]
512
+ provisioning_status: OpenValueSet[Literal["CREATING", "READY", "FAILED"]]
512
513
  provisioning_job_run_uid: str | None
513
514
  provisioning_error_code: str
514
515
  provisioning_error_detail: str
@@ -726,7 +727,7 @@ class GitHubRepositoryBinding(BasePydanticModel, BaseObjectOrm):
726
727
 
727
728
 
728
729
  class CodeRepositoryImageSourceProvenance(BasePydanticModel):
729
- verification_state: Literal["verified", "unverified", "building", "failed"]
730
+ verification_state: OpenValueSet[Literal["verified", "unverified", "building", "failed"]]
730
731
  code_repository_uid: str | None = None
731
732
  code_repository_branch_uid: str | None = None
732
733
  github_repository_binding_uid: str | None = None
@@ -5,7 +5,6 @@ import json
5
5
  import time
6
6
  from collections.abc import Collection
7
7
  from decimal import Decimal
8
- from enum import Enum
9
8
  from pathlib import PurePosixPath
10
9
  from typing import Any, ClassVar, Literal
11
10
  from uuid import UUID
@@ -41,6 +40,7 @@ from .observability import (
41
40
  PublicLogLevel,
42
41
  )
43
42
  from .utils import make_request
43
+ from .value_sets import OpenStrEnum, OpenValueSet
44
44
 
45
45
 
46
46
  def get_model_class(model_class: str):
@@ -1156,27 +1156,34 @@ class CodeRepositoryResource(CurrentCodeRepositoryBranchCollectionMixin, BaseObj
1156
1156
  )
1157
1157
 
1158
1158
 
1159
- class ResourceReleaseKind(str, Enum):
1159
+ class ResourceReleaseKind(OpenStrEnum):
1160
+ """The backend's canonical release-kind vocabulary.
1161
+
1162
+ Open (ADR 0033): a kind a later backend adds is read as sent, rather than
1163
+ failing the release that carries it and the listing that release is in.
1164
+ """
1165
+
1160
1166
  AGENT = "agent"
1161
1167
  FAST_API = "fastapi"
1168
+ HARNESS_AGENT = "harness_agent"
1162
1169
  STATIC_SITE = "static_site"
1163
1170
 
1164
1171
 
1165
1172
  class ResourceReleaseRuntimeRouting(BasePydanticModel):
1166
- state: Literal["routable", "unavailable"]
1173
+ state: OpenValueSet[Literal["routable", "unavailable"]]
1167
1174
  active_revision_uid: str | None = None
1168
1175
 
1169
1176
 
1170
1177
  class ResourceReleaseRuntimeNotice(BasePydanticModel):
1171
1178
  code: str
1172
- severity: Literal["info", "warning", "error"]
1179
+ severity: OpenValueSet[Literal["info", "warning", "error"]]
1173
1180
  title: str
1174
1181
  message: str
1175
1182
 
1176
1183
 
1177
1184
  class ResourceReleaseRuntimeOperation(BasePydanticModel):
1178
1185
  uid: str
1179
- status: Literal["queued", "running", "succeeded", "failed", "superseded"]
1186
+ status: OpenValueSet[Literal["queued", "running", "succeeded", "failed", "superseded"]]
1180
1187
  created_at: datetime.datetime
1181
1188
  started_at: datetime.datetime | None = None
1182
1189
  finished_at: datetime.datetime | None = None
@@ -1184,7 +1191,7 @@ class ResourceReleaseRuntimeOperation(BasePydanticModel):
1184
1191
 
1185
1192
 
1186
1193
  class ResourceReleaseRuntimeAdmission(BasePydanticModel):
1187
- state: Literal["ready", "waking", "unavailable"]
1194
+ state: OpenValueSet[Literal["ready", "waking", "unavailable"]]
1188
1195
  can_request: bool
1189
1196
  notice: ResourceReleaseRuntimeNotice | None = None
1190
1197
  operation: ResourceReleaseRuntimeOperation | None = None
@@ -1198,24 +1205,28 @@ class ResourceReleaseRuntimeReplicas(BasePydanticModel):
1198
1205
 
1199
1206
  class ResourceReleaseRuntimeWake(BasePydanticModel):
1200
1207
  operation_uid: str
1201
- state: Literal[
1202
- "requested", "in_progress", "serving", "failed", "expired", "superseded"
1208
+ state: OpenValueSet[
1209
+ Literal[
1210
+ "requested", "in_progress", "serving", "failed", "expired", "superseded"
1211
+ ]
1203
1212
  ]
1204
1213
  requested_at: datetime.datetime
1205
1214
  deadline_at: datetime.datetime
1206
1215
 
1207
1216
 
1208
1217
  class ResourceReleaseRuntimePresence(BasePydanticModel):
1209
- phase: Literal[
1210
- "not_deployed",
1211
- "idle",
1212
- "observing",
1213
- "provisioning",
1214
- "pulling_image",
1215
- "starting",
1216
- "serving",
1217
- "redeploying",
1218
- "failed",
1218
+ phase: OpenValueSet[
1219
+ Literal[
1220
+ "not_deployed",
1221
+ "idle",
1222
+ "observing",
1223
+ "provisioning",
1224
+ "pulling_image",
1225
+ "starting",
1226
+ "serving",
1227
+ "redeploying",
1228
+ "failed",
1229
+ ]
1219
1230
  ]
1220
1231
  replicas: ResourceReleaseRuntimeReplicas
1221
1232
  detail: str
@@ -1225,7 +1236,9 @@ class ResourceReleaseRuntimePresence(BasePydanticModel):
1225
1236
 
1226
1237
  class ResourceReleaseRuntimeAccess(BasePydanticModel):
1227
1238
  resource_release_uid: str
1228
- release_kind: Literal["fastapi", "harness_agent"]
1239
+ # The canonical vocabulary ResourceRelease.release_kind reads (#119): this
1240
+ # payload names a release kind, so it names it the same way.
1241
+ release_kind: ResourceReleaseKind
1229
1242
  routing: ResourceReleaseRuntimeRouting
1230
1243
  runtime_access: ResourceReleaseRuntimeAdmission
1231
1244
  runtime_presence: ResourceReleaseRuntimePresence
@@ -1512,11 +1525,14 @@ class ResourceRelease(
1512
1525
  normalized_release_kind = release_kind.value
1513
1526
  else:
1514
1527
  normalized_release_kind = Job._normalize_str(release_kind)
1515
- allowed_release_kinds = {kind.value for kind in ResourceReleaseKind}
1516
- if normalized_release_kind not in allowed_release_kinds:
1517
- raise ValueError(
1518
- "release_kind must be one of: " + ", ".join(sorted(allowed_release_kinds)) + "."
1519
- )
1528
+ # What the SDK sends stays closed (ADR 0033). ResourceReleaseKind reads an
1529
+ # undeclared kind out of a response, but iterating it yields only the kinds
1530
+ # this release declares, so a kind built here is still checked against them.
1531
+ allowed_release_kinds = {kind.value for kind in ResourceReleaseKind}
1532
+ if normalized_release_kind not in allowed_release_kinds:
1533
+ raise ValueError(
1534
+ "release_kind must be one of: " + ", ".join(sorted(allowed_release_kinds)) + "."
1535
+ )
1520
1536
 
1521
1537
  normalized_compute = Job._validate_and_normalize_compute_fields(
1522
1538
  cpu_request=cpu_request,
@@ -1617,26 +1633,30 @@ class DeploymentRunStep(BaseModel):
1617
1633
  sequence: PositiveInt
1618
1634
  key: str
1619
1635
  name: str = ""
1620
- kind: Literal[
1621
- "source",
1622
- "image_build",
1623
- "validation",
1624
- "runtime_deploy",
1625
- "runtime_readiness",
1626
- "publish",
1627
- "cleanup",
1628
- "orchestration",
1636
+ kind: OpenValueSet[
1637
+ Literal[
1638
+ "source",
1639
+ "image_build",
1640
+ "validation",
1641
+ "runtime_deploy",
1642
+ "runtime_readiness",
1643
+ "publish",
1644
+ "cleanup",
1645
+ "orchestration",
1646
+ ]
1629
1647
  ]
1630
1648
  required: bool = True
1631
- state: Literal[
1632
- "pending",
1633
- "running",
1634
- "succeeded",
1635
- "failed",
1636
- "cancelled",
1637
- "skipped",
1638
- "blocked",
1639
- "superseded",
1649
+ state: OpenValueSet[
1650
+ Literal[
1651
+ "pending",
1652
+ "running",
1653
+ "succeeded",
1654
+ "failed",
1655
+ "cancelled",
1656
+ "skipped",
1657
+ "blocked",
1658
+ "superseded",
1659
+ ]
1640
1660
  ]
1641
1661
  outcome: str = ""
1642
1662
  artifact_context: dict[str, Any] = Field(default_factory=dict)
@@ -1658,12 +1678,14 @@ class DeploymentRunBillingComponents(BasePydanticModel):
1658
1678
  image_registry_service: Decimal | None = Field(max_digits=18, decimal_places=6)
1659
1679
 
1660
1680
 
1661
- DeploymentRunPricingState = Literal[
1662
- "priced",
1663
- "partial",
1664
- "pending",
1665
- "unavailable",
1666
- "failed",
1681
+ DeploymentRunPricingState = OpenValueSet[
1682
+ Literal[
1683
+ "priced",
1684
+ "partial",
1685
+ "pending",
1686
+ "unavailable",
1687
+ "failed",
1688
+ ]
1667
1689
  ]
1668
1690
 
1669
1691
 
@@ -1700,14 +1722,14 @@ class DeploymentRunLogEntry(BaseModel):
1700
1722
  timestamp: datetime.datetime | None = None
1701
1723
  step_uid: str | None = None
1702
1724
  source: str
1703
- stream: Literal["stdout", "stderr"]
1704
- level: Literal["debug", "info", "warning", "error"]
1725
+ stream: OpenValueSet[Literal["stdout", "stderr"]]
1726
+ level: OpenValueSet[Literal["debug", "info", "warning", "error"]]
1705
1727
  text: str = ""
1706
1728
 
1707
1729
 
1708
1730
  class DeploymentRunLogSource(BaseModel):
1709
1731
  source: str
1710
- state: Literal["pending", "available", "partial", "expired", "unavailable"]
1732
+ state: OpenValueSet[Literal["pending", "available", "partial", "expired", "unavailable"]]
1711
1733
 
1712
1734
 
1713
1735
  class DeploymentRunLogPage(BaseModel):
@@ -22,6 +22,7 @@ from .utils import (
22
22
  DEFAULT_TIMEOUT,
23
23
  make_request,
24
24
  )
25
+ from .value_sets import OpenValueSet
25
26
 
26
27
  _CURRENT_AUTH_HEADERS: ContextVar[Mapping[str, Any] | None] = ContextVar(
27
28
  "_CURRENT_AUTH_HEADERS",
@@ -528,7 +529,7 @@ class Notification(DetailActionObjectMixin, BasePydanticModel, UserApiBaseObject
528
529
  title="Notification UID",
529
530
  description="Stable public unique identifier of the notification.",
530
531
  )
531
- source: Literal["system", "organization"] | None = Field(
532
+ source: OpenValueSet[Literal["system", "organization"]] | None = Field(
532
533
  None,
533
534
  title="Notification Source",
534
535
  description="Source scope of the notification.",
@@ -544,7 +545,7 @@ class Notification(DetailActionObjectMixin, BasePydanticModel, UserApiBaseObject
544
545
  title="Source Organization UID",
545
546
  description="Public UID of the organization that owns the notification.",
546
547
  )
547
- type: Literal["UR", "IM", "IN"] = Field(
548
+ type: OpenValueSet[Literal["UR", "IM", "IN"]] = Field(
548
549
  "IN",
549
550
  title="Notification Type",
550
551
  description="Stored notification priority code.",
@@ -914,7 +915,7 @@ class ShareableAccessState(BasePydanticModel):
914
915
  description="Backend object type identifier for the shareable object.",
915
916
  examples=["tdag.constant"],
916
917
  )
917
- access_level: Literal["view", "edit"] = Field(
918
+ access_level: OpenValueSet[Literal["view", "edit"]] = Field(
918
919
  ...,
919
920
  title="Access Level",
920
921
  description="Permission level represented by this access-state payload.",
@@ -10,6 +10,7 @@ from pydantic import ConfigDict, Field
10
10
  from .base import BasePydanticModel
11
11
  from .exceptions import ApiError, raise_for_response
12
12
  from .utils import make_request
13
+ from .value_sets import OpenValueSet
13
14
 
14
15
  PublicLogLevel = Literal[
15
16
  "debug",
@@ -55,7 +56,7 @@ class OwnerLogRow(BasePydanticModel):
55
56
  time: int | float | None = None
56
57
  timestamp: str | None = None
57
58
  severity: str | None = None
58
- level: PublicLogLevel | None = None
59
+ level: OpenValueSet[PublicLogLevel] | None = None
59
60
  source: str | None = None
60
61
  event: str | None = None
61
62
  event_id: str | None = None
@@ -110,16 +111,18 @@ class OwnerLogPage(BasePydanticModel):
110
111
  class EnvironmentLogSearchRow(OwnerLogRow):
111
112
  """One sanitized row returned by an Environment-scoped collection search."""
112
113
 
113
- owner_type: Literal[
114
- "deployment_run",
115
- "job_run",
116
- "resource_release",
117
- "agent",
118
- "agent_session",
114
+ owner_type: OpenValueSet[
115
+ Literal[
116
+ "deployment_run",
117
+ "job_run",
118
+ "resource_release",
119
+ "agent",
120
+ "agent_session",
121
+ ]
119
122
  ]
120
123
  owner_uid: str
121
124
  occurred_at: datetime.datetime
122
- level: PublicLogLevel
125
+ level: OpenValueSet[PublicLogLevel]
123
126
 
124
127
 
125
128
  class EnvironmentLogSearchPage(BasePydanticModel):
@@ -134,7 +137,9 @@ class EnvironmentLogSearchPage(BasePydanticModel):
134
137
  result_limit: int = Field(ge=0)
135
138
  next_cursor: str | None = None
136
139
  truncated: bool
137
- truncation_reason: Literal["page_limit", "result_limit", "candidate_limit"] | None = None
140
+ truncation_reason: (
141
+ OpenValueSet[Literal["page_limit", "result_limit", "candidate_limit"]] | None
142
+ ) = None
138
143
  rows: list[EnvironmentLogSearchRow] = Field(default_factory=list)
139
144
 
140
145