mainsequence 3.18.3__tar.gz → 3.18.5__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 (179) hide show
  1. {mainsequence-3.18.3 → mainsequence-3.18.5}/PKG-INFO +1 -1
  2. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/cli.py +74 -24
  3. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/config.py +4 -2
  4. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/client.py +3 -1
  5. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/command_center/workspace_snapshot.py +3 -1
  6. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/models_user.py +2 -1
  7. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/utils.py +4 -3
  8. mainsequence-3.18.5/mainsequence/defaults.py +3 -0
  9. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/logconf.py +2 -1
  10. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence.egg-info/PKG-INFO +1 -1
  11. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence.egg-info/SOURCES.txt +1 -0
  12. {mainsequence-3.18.3 → mainsequence-3.18.5}/pyproject.toml +1 -1
  13. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_cli.py +78 -16
  14. {mainsequence-3.18.3 → mainsequence-3.18.5}/LICENSE +0 -0
  15. {mainsequence-3.18.3 → mainsequence-3.18.5}/README.md +0 -0
  16. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/AGENTS.md +0 -0
  17. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  18. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  19. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
  20. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  21. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  22. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  23. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  24. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  25. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/data_publishing/simple_tables/SKILL.md +0 -0
  26. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  27. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/maintenance/local_journal/SKILL.md +0 -0
  28. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/markets_platform/assets_and_translation/SKILL.md +0 -0
  29. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/markets_platform/instruments_and_pricing/SKILL.md +0 -0
  30. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/markets_platform/virtualfundbuilder/SKILL.md +0 -0
  31. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  32. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  33. {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  34. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/__init__.py +0 -0
  35. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/__main__.py +0 -0
  36. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/bootstrap.py +0 -0
  37. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/__init__.py +0 -0
  38. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/api.py +0 -0
  39. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/browser_auth.py +0 -0
  40. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/docker_utils.py +0 -0
  41. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/doctor.py +0 -0
  42. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/local_ops.py +0 -0
  43. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/model_filters.py +0 -0
  44. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/project_status.py +0 -0
  45. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/pydantic_cli.py +0 -0
  46. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/sdk_utils.py +0 -0
  47. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/ssh_utils.py +0 -0
  48. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/ui.py +0 -0
  49. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/__init__.py +0 -0
  50. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/agent.py +0 -0
  51. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/agent_runtime_models.py +0 -0
  52. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/base.py +0 -0
  53. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/command_center/__init__.py +0 -0
  54. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/command_center/app_component.py +0 -0
  55. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/command_center/data_models.py +0 -0
  56. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/command_center/workspace.py +0 -0
  57. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  58. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  59. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/data_sources_interfaces/timescale.py +0 -0
  60. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/exceptions.py +0 -0
  61. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/fastapi/__init__.py +0 -0
  62. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/fastapi/auth.py +0 -0
  63. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/models_helpers.py +0 -0
  64. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/models_simple_tables.py +0 -0
  65. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/models_tdag.py +0 -0
  66. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/models_vam.py +0 -0
  67. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/compute_validation.py +0 -0
  68. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/__init__.py +0 -0
  69. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/__init__.py +0 -0
  70. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/config.toml +0 -0
  71. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/favicon.png +0 -0
  72. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/image_1_base64.txt +0 -0
  73. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/image_2_base64.txt +0 -0
  74. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/image_3_base64.txt +0 -0
  75. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/image_4_base64.txt +0 -0
  76. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/image_5_base64.txt +0 -0
  77. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/logo.png +0 -0
  78. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/components/__init__.py +0 -0
  79. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/components/asset_select.py +0 -0
  80. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/components/date_settings.py +0 -0
  81. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/components/logged_user.py +0 -0
  82. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/core/__init__.py +0 -0
  83. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/core/theme.py +0 -0
  84. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/instruments/__init__.py +0 -0
  85. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/instruments/streamlit_form_factory.py +0 -0
  86. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/pages/__init__.py +0 -0
  87. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/scaffold.py +0 -0
  88. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instrumentation/__init__.py +0 -0
  89. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instrumentation/utils.py +0 -0
  90. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/__init__.py +0 -0
  91. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/data_interface/__init__.py +0 -0
  92. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/data_interface/data_interface.py +0 -0
  93. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/__init__.py +0 -0
  94. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/base_instrument.py +0 -0
  95. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/bond.py +0 -0
  96. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/callability.py +0 -0
  97. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/interest_rate_swap.py +0 -0
  98. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/json_codec.py +0 -0
  99. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/position.py +0 -0
  100. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/ql_fields.py +0 -0
  101. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/interest_rates/__init__.py +0 -0
  102. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/interest_rates/etl/__init__.py +0 -0
  103. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/interest_rates/etl/curve_codec.py +0 -0
  104. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/interest_rates/etl/nodes.py +0 -0
  105. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/interest_rates/etl/registry.py +0 -0
  106. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/pricing_models/__init__.py +0 -0
  107. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/pricing_models/bond_pricer.py +0 -0
  108. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/pricing_models/indices.py +0 -0
  109. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/pricing_models/indices_builders.py +0 -0
  110. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/pricing_models/swap_pricer.py +0 -0
  111. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/settings.py +0 -0
  112. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/utils.py +0 -0
  113. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/runtime_flags.py +0 -0
  114. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/__init__.py +0 -0
  115. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/__main__.py +0 -0
  116. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/base_persist_managers.py +0 -0
  117. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/config.py +0 -0
  118. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/configuration_models.py +0 -0
  119. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/__init__.py +0 -0
  120. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/build_operations.py +0 -0
  121. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/data_nodes.py +0 -0
  122. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/filters.py +0 -0
  123. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/models.py +0 -0
  124. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/namespacing.py +0 -0
  125. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/persist_managers.py +0 -0
  126. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/run_operations.py +0 -0
  127. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/utils.py +0 -0
  128. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/filters.py +0 -0
  129. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/future_registry.py +0 -0
  130. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/pydantic_metadata.py +0 -0
  131. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/simple_tables/__init__.py +0 -0
  132. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/simple_tables/filters.py +0 -0
  133. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/simple_tables/models.py +0 -0
  134. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/simple_tables/persist_managers.py +0 -0
  135. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/simple_tables/schema.py +0 -0
  136. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/simple_tables/table_nodes.py +0 -0
  137. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/utils.py +0 -0
  138. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/__init__.py +0 -0
  139. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/__init__.py +0 -0
  140. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/data_nodes/__init__.py +0 -0
  141. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/data_nodes/external_weights.py +0 -0
  142. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/data_nodes/intraday_trend.py +0 -0
  143. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/data_nodes/market_cap.py +0 -0
  144. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/data_nodes/mock_signal.py +0 -0
  145. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/data_nodes/portfolio_replicator.py +0 -0
  146. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/prices/__init__.py +0 -0
  147. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py +0 -0
  148. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/prices/utils.py +0 -0
  149. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/__init__.py +0 -0
  150. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/rebalance_strategies.py +0 -0
  151. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/enums.py +0 -0
  152. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/models.py +0 -0
  153. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/portfolio_nodes.py +0 -0
  154. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/resource_factory/__init__.py +0 -0
  155. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/resource_factory/rebalance_factory.py +0 -0
  156. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/resource_factory/signal_factory.py +0 -0
  157. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/utils.py +0 -0
  158. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence.egg-info/dependency_links.txt +0 -0
  159. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence.egg-info/entry_points.txt +0 -0
  160. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence.egg-info/requires.txt +0 -0
  161. {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence.egg-info/top_level.txt +0 -0
  162. {mainsequence-3.18.3 → mainsequence-3.18.5}/setup.cfg +0 -0
  163. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_auth_precedence.py +0 -0
  164. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_build_operations_hashing.py +0 -0
  165. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_cli_browser_auth.py +0 -0
  166. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_client.py +0 -0
  167. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_command_center_app_component_models.py +0 -0
  168. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_command_center_models.py +0 -0
  169. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_dependency_extras.py +0 -0
  170. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_filter_normalization.py +0 -0
  171. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_instruments.py +0 -0
  172. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_logconf.py +0 -0
  173. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_logged_user_components.py +0 -0
  174. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_models_user_request_bound_auth.py +0 -0
  175. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_pod_project_resolution.py +0 -0
  176. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_project_batch_jobs_from_file.py +0 -0
  177. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_run_configuration.py +0 -0
  178. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_simple_tables_configuration_hashing.py +0 -0
  179. {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_simple_tables_persistence.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 3.18.3
3
+ Version: 3.18.5
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
@@ -2056,6 +2056,7 @@ def login(
2056
2056
  Persists auth tokens in the active CLI auth store so subsequent
2057
2057
  CLI invocations can run without re-authentication. Backend/base-folder
2058
2058
  overrides passed to `login` are scoped to the current terminal session.
2059
+ When no backend is provided, login defaults to the standard production backend.
2059
2060
 
2060
2061
  Interactive login uses browser-based authentication and finishes with
2061
2062
  standard JWT access/refresh tokens persisted by the CLI.
@@ -2119,7 +2120,8 @@ def login(
2119
2120
  if cfg.normalize_backend_url(backend) != cfg.normalize_backend_url(backend_option):
2120
2121
  error("Pass backend either positionally or with --backend, not both.")
2121
2122
  raise typer.Exit(1)
2122
- effective_backend_input = backend_option if backend_option is not None else backend
2123
+ explicit_backend_input = backend_option if backend_option is not None else backend
2124
+ effective_backend_input = explicit_backend_input if explicit_backend_input is not None else cfg.STANDARD_BACKEND_URL
2123
2125
 
2124
2126
  if projects_base and projects_base_option:
2125
2127
  if cfg.normalize_mainsequence_path(projects_base) != cfg.normalize_mainsequence_path(projects_base_option):
@@ -2138,24 +2140,23 @@ def login(
2138
2140
  raise typer.Exit(1)
2139
2141
 
2140
2142
  current_backend = cfg.backend_url()
2141
- normalized_backend = cfg.normalize_backend_url(effective_backend_input) if effective_backend_input else None
2143
+ normalized_backend = cfg.normalize_backend_url(effective_backend_input)
2142
2144
 
2143
- if normalized_backend and normalized_backend != current_backend:
2145
+ if explicit_backend_input is not None and normalized_backend != current_backend:
2144
2146
  if not effective_projects_base_input:
2145
2147
  error("When using a different backend, you must also specify a projects base folder.")
2146
2148
  raise typer.Exit(1)
2147
2149
 
2148
2150
  previous_backend_override = os.environ.get("MAIN_SEQUENCE_BACKEND_URL")
2149
- if normalized_backend:
2150
- os.environ["MAIN_SEQUENCE_BACKEND_URL"] = normalized_backend
2151
+ os.environ["MAIN_SEQUENCE_BACKEND_URL"] = normalized_backend
2151
2152
 
2152
2153
  try:
2153
2154
  if using_runtime_credential:
2154
- access = _exchange_runtime_credential_for_cli_login(normalized_backend or current_backend)
2155
+ access = _exchange_runtime_credential_for_cli_login(normalized_backend)
2155
2156
  persisted = cfg.save_tokens("", access, "")
2156
2157
  res = {
2157
2158
  "username": "",
2158
- "backend": normalized_backend or current_backend,
2159
+ "backend": normalized_backend,
2159
2160
  "access": access,
2160
2161
  "refresh": "",
2161
2162
  "persisted": bool(persisted),
@@ -2167,7 +2168,7 @@ def login(
2167
2168
  persisted = cfg.save_tokens("", (access_token or "").strip(), (refresh_token or "").strip())
2168
2169
  res = {
2169
2170
  "username": "",
2170
- "backend": normalized_backend or current_backend,
2171
+ "backend": normalized_backend,
2171
2172
  "access": (access_token or "").strip(),
2172
2173
  "refresh": (refresh_token or "").strip(),
2173
2174
  "persisted": bool(persisted),
@@ -2196,7 +2197,7 @@ def login(
2196
2197
 
2197
2198
  res = {
2198
2199
  "username": username,
2199
- "backend": normalized_backend or current_backend,
2200
+ "backend": normalized_backend,
2200
2201
  "access": access,
2201
2202
  "refresh": refresh,
2202
2203
  "persisted": bool(persisted),
@@ -2209,19 +2210,15 @@ def login(
2209
2210
  error(f"Login failed: {e}")
2210
2211
  raise typer.Exit(1) from e
2211
2212
  finally:
2212
- if normalized_backend:
2213
- if previous_backend_override is None:
2214
- os.environ.pop("MAIN_SEQUENCE_BACKEND_URL", None)
2215
- else:
2216
- os.environ["MAIN_SEQUENCE_BACKEND_URL"] = previous_backend_override
2213
+ if previous_backend_override is None:
2214
+ os.environ.pop("MAIN_SEQUENCE_BACKEND_URL", None)
2215
+ else:
2216
+ os.environ["MAIN_SEQUENCE_BACKEND_URL"] = previous_backend_override
2217
2217
 
2218
- if normalized_backend or effective_projects_base_input:
2219
- cfg.set_session_overrides(
2220
- backend_url=normalized_backend,
2221
- mainsequence_path=effective_projects_base_input,
2222
- )
2223
- else:
2224
- cfg.clear_session_overrides()
2218
+ cfg.set_session_overrides(
2219
+ backend_url=normalized_backend,
2220
+ mainsequence_path=effective_projects_base_input,
2221
+ )
2225
2222
 
2226
2223
  if export:
2227
2224
  access = (res.get("access") or "").replace('"', '\\"')
@@ -2875,7 +2872,7 @@ def settings_set_base(path: str = typer.Argument(..., help="New projects base fo
2875
2872
 
2876
2873
  @settings.command("set-backend")
2877
2874
  def settings_set_backend(
2878
- url: str = typer.Argument(..., help="Backend base URL, e.g. https://api.main-sequence.app")
2875
+ url: str = typer.Argument(..., help=f"Backend base URL, e.g. {cfg.STANDARD_BACKEND_URL}")
2879
2876
  ):
2880
2877
  """
2881
2878
  Set backend base URL used by CLI API calls.
@@ -2883,12 +2880,12 @@ def settings_set_backend(
2883
2880
  Parameters
2884
2881
  ----------
2885
2882
  url:
2886
- Backend base URL (for example `https://api.main-sequence.app`).
2883
+ Backend base URL.
2887
2884
 
2888
2885
  Examples
2889
2886
  --------
2890
2887
  ```bash
2891
- mainsequence settings set-backend https://api.main-sequence.app
2888
+ mainsequence settings set-backend <backend-url>
2892
2889
  ```
2893
2890
  """
2894
2891
  out = cfg.set_backend_url(url)
@@ -2897,6 +2894,59 @@ def settings_set_backend(
2897
2894
  success(f"Backend URL set to: {out.get('backend_url')}")
2898
2895
 
2899
2896
 
2897
+ def _settings_reset_impl() -> dict:
2898
+ """
2899
+ Reset persistent CLI settings to standard defaults and clear session overrides.
2900
+ """
2901
+ standard_backend = cfg.normalize_backend_url(cfg.STANDARD_BACKEND_URL)
2902
+ standard_base = cfg.normalize_mainsequence_path(cfg.DEFAULTS.get("mainsequence_path"))
2903
+ pathlib.Path(standard_base).mkdir(parents=True, exist_ok=True)
2904
+ out = cfg.set_config(
2905
+ {
2906
+ "backend_url": standard_backend,
2907
+ "mainsequence_path": standard_base,
2908
+ }
2909
+ )
2910
+ cfg.clear_session_overrides()
2911
+ return out
2912
+
2913
+
2914
+ @settings.command("reset")
2915
+ def settings_reset():
2916
+ """
2917
+ Reset CLI settings to standard defaults.
2918
+
2919
+ Resets backend URL to the standard production backend, base folder to the
2920
+ default `~/mainsequence`, and clears current terminal session overrides.
2921
+
2922
+ Examples
2923
+ --------
2924
+ ```bash
2925
+ mainsequence settings reset
2926
+ ```
2927
+ """
2928
+ out = _settings_reset_impl()
2929
+ if _emit_json(out):
2930
+ return
2931
+ success("Settings reset to standard defaults.")
2932
+ info(f"Backend URL: {out.get('backend_url')}")
2933
+ info(f"Projects base folder: {out.get('mainsequence_path')}")
2934
+
2935
+
2936
+ @settings.command("refresh")
2937
+ def settings_refresh():
2938
+ """
2939
+ Alias for `settings reset`.
2940
+
2941
+ Examples
2942
+ --------
2943
+ ```bash
2944
+ mainsequence settings refresh
2945
+ ```
2946
+ """
2947
+ settings_reset()
2948
+
2949
+
2900
2950
  # ---------- sdk group ----------
2901
2951
 
2902
2952
 
@@ -21,6 +21,8 @@ import subprocess
21
21
  import sys
22
22
  import time
23
23
 
24
+ from mainsequence.defaults import STANDARD_BACKEND_URL
25
+
24
26
  APP_NAME = "MainSequenceCLI"
25
27
 
26
28
 
@@ -62,7 +64,7 @@ KEYCHAIN_SERVICE = "MainSequenceCLI.auth"
62
64
  KEYCHAIN_ACCOUNT = "default"
63
65
 
64
66
  DEFAULTS = {
65
- "backend_url": os.environ.get("MAIN_SEQUENCE_BACKEND_URL", "https://api.main-sequence.app/"),
67
+ "backend_url": os.environ.get("MAIN_SEQUENCE_BACKEND_URL", f"{STANDARD_BACKEND_URL}/"),
66
68
  "mainsequence_path": str(pathlib.Path.home() / "mainsequence"),
67
69
  "version": 1,
68
70
  }
@@ -212,7 +214,7 @@ def set_backend_url(url: str) -> dict:
212
214
  Convenience helper to set backend_url in config.json.
213
215
 
214
216
  Args:
215
- url: Backend base URL (e.g. https://api.main-sequence.app)
217
+ url: Backend base URL.
216
218
 
217
219
  Returns:
218
220
  dict: updated config
@@ -7,6 +7,8 @@ from typing import Any
7
7
 
8
8
  import requests
9
9
 
10
+ from mainsequence.defaults import STANDARD_BACKEND_URL
11
+
10
12
  from .exceptions import raise_for_response
11
13
  from .utils import AuthLoaders, build_session
12
14
  from .utils import loaders as _global_loaders
@@ -19,7 +21,7 @@ class MainSequenceClientConfig:
19
21
  endpoint: str = (
20
22
  os.getenv("MAINSEQUENCE_ENDPOINT")
21
23
  or os.getenv("TDAG_ENDPOINT")
22
- or "https://api.main-sequence.app"
24
+ or STANDARD_BACKEND_URL
23
25
  )
24
26
  api_prefix: str = "/orm/api"
25
27
  # (connect, read) — align with your utils DEFAULT_TIMEOUT behavior
@@ -7,6 +7,8 @@ from pathlib import Path
7
7
  from typing import Any
8
8
  from urllib.parse import urlparse
9
9
 
10
+ from mainsequence.defaults import STANDARD_BACKEND_URL
11
+
10
12
  from ..client import MainSequenceClientConfig
11
13
  from ..utils import AuthLoaders
12
14
 
@@ -78,7 +80,7 @@ def _infer_command_center_url_from_endpoint(endpoint: str) -> str:
78
80
  if host in {"localhost", "127.0.0.1"}:
79
81
  return f"{scheme}://localhost:5173"
80
82
 
81
- if host == "api.main-sequence.app":
83
+ if host == (urlparse(STANDARD_BACKEND_URL).hostname or ""):
82
84
  return f"{scheme}://main-sequence.app"
83
85
 
84
86
  if host.startswith("api."):
@@ -8,6 +8,7 @@ from typing import Any, ClassVar, Literal
8
8
 
9
9
  from pydantic import Field
10
10
 
11
+ from mainsequence.defaults import STANDARD_BACKEND_URL
11
12
  from mainsequence.logconf import logger
12
13
 
13
14
  from .base import (
@@ -141,7 +142,7 @@ class Organization(BasePydanticModel):
141
142
  None,
142
143
  title="Organization URL",
143
144
  description="Optional public or internal URL for the organization.",
144
- examples=["https://api.main-sequence.app"],
145
+ examples=[STANDARD_BACKEND_URL],
145
146
  )
146
147
  organization_domain: str = Field(
147
148
  ...,
@@ -21,13 +21,14 @@ from requests.adapters import HTTPAdapter
21
21
  from requests.structures import CaseInsensitiveDict
22
22
  from urllib3.util.retry import Retry
23
23
 
24
+ from mainsequence.defaults import STANDARD_BACKEND_URL
24
25
  from mainsequence.logconf import logger
25
26
 
26
27
  # ---- Backend defaults (single source of truth) ----
27
28
  TDAG_ENDPOINT = (
28
29
  os.environ.get("TDAG_ENDPOINT")
29
30
  or os.environ.get("MAINSEQUENCE_ENDPOINT")
30
- or "https://api.main-sequence.app"
31
+ or STANDARD_BACKEND_URL
31
32
  )
32
33
  API_ENDPOINT = f"{TDAG_ENDPOINT}/orm/api"
33
34
  AUTH_ENDPOINT = TDAG_ENDPOINT.rstrip("/")
@@ -72,8 +73,8 @@ class AuthError(Exception):
72
73
  def _jwt_reauth_hint() -> str:
73
74
  return (
74
75
  " Refresh your credentials with `mainsequence logout` and "
75
- "`mainsequence login <email>`. If this code runs in a separate shell or IDE, "
76
- "use `mainsequence login <email> --export` and load the exported env vars there."
76
+ "`mainsequence login`. If this code runs in a separate shell or IDE, "
77
+ "use `mainsequence login --export` and load the exported env vars there."
77
78
  )
78
79
 
79
80
 
@@ -0,0 +1,3 @@
1
+ from __future__ import annotations
2
+
3
+ STANDARD_BACKEND_URL = "https://api.main-sequence.app"
@@ -17,6 +17,7 @@ from structlog.contextvars import bind_contextvars, unbind_contextvars
17
17
  from structlog.dev import ConsoleRenderer
18
18
  from structlog.stdlib import BoundLogger
19
19
 
20
+ from .defaults import STANDARD_BACKEND_URL
20
21
  from .instrumentation import OTelJSONRenderer
21
22
  from .runtime_flags import is_running_in_pod
22
23
 
@@ -70,7 +71,7 @@ def _request_job_startup_state(*, timeout_s: float = 10.0) -> dict[str, Any]:
70
71
  return (
71
72
  os.getenv("TDAG_ENDPOINT")
72
73
  or os.getenv("MAINSEQUENCE_ENDPOINT")
73
- or "https://api.main-sequence.app"
74
+ or STANDARD_BACKEND_URL
74
75
  ).rstrip("/")
75
76
 
76
77
  def _auth_headers() -> tuple[CaseInsensitiveDict, bool]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 3.18.3
3
+ Version: 3.18.5
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
@@ -23,6 +23,7 @@ mainsequence/__init__.py
23
23
  mainsequence/__main__.py
24
24
  mainsequence/bootstrap.py
25
25
  mainsequence/compute_validation.py
26
+ mainsequence/defaults.py
26
27
  mainsequence/logconf.py
27
28
  mainsequence/runtime_flags.py
28
29
  mainsequence.egg-info/PKG-INFO
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence"
7
- version = "3.18.3"
7
+ version = "3.18.5"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1540,6 +1540,46 @@ def test_settings_set_backend_json(cli_mod, runner, monkeypatch):
1540
1540
  assert payload["backend_url"] == "https://example.test"
1541
1541
 
1542
1542
 
1543
+ def test_settings_reset(cli_mod, runner, monkeypatch):
1544
+ captured = {}
1545
+ monkeypatch.setattr(
1546
+ cli_mod.cfg,
1547
+ "DEFAULTS",
1548
+ {"backend_url": f"{cli_mod.cfg.STANDARD_BACKEND_URL}/", "mainsequence_path": "/tmp/mainsequence", "version": 1},
1549
+ )
1550
+ monkeypatch.setattr(
1551
+ cli_mod.cfg,
1552
+ "set_config",
1553
+ lambda updates: captured.update(updates) or updates | {"updated_at": "2026-04-20T00:00:00Z"},
1554
+ )
1555
+ monkeypatch.setattr(cli_mod.cfg, "clear_session_overrides", lambda: captured.update(cleared=True))
1556
+
1557
+ result = runner.invoke(cli_mod.app, ["settings", "reset"])
1558
+ assert result.exit_code == 0
1559
+ assert captured["backend_url"] == cli_mod.cfg.STANDARD_BACKEND_URL
1560
+ assert captured["mainsequence_path"].endswith("/tmp/mainsequence")
1561
+ assert captured["cleared"] is True
1562
+ assert "Settings reset to standard defaults" in result.output
1563
+
1564
+
1565
+ def test_settings_refresh_alias(cli_mod, runner, monkeypatch):
1566
+ monkeypatch.setattr(
1567
+ cli_mod.cfg,
1568
+ "DEFAULTS",
1569
+ {"backend_url": f"{cli_mod.cfg.STANDARD_BACKEND_URL}/", "mainsequence_path": "/tmp/mainsequence", "version": 1},
1570
+ )
1571
+ monkeypatch.setattr(
1572
+ cli_mod.cfg,
1573
+ "set_config",
1574
+ lambda updates: updates | {"updated_at": "2026-04-20T00:00:00Z"},
1575
+ )
1576
+ monkeypatch.setattr(cli_mod.cfg, "clear_session_overrides", lambda: None)
1577
+
1578
+ result = runner.invoke(cli_mod.app, ["settings", "refresh"])
1579
+ assert result.exit_code == 0
1580
+ assert "Settings reset to standard defaults" in result.output
1581
+
1582
+
1543
1583
  def test_config_normalize_backend_url(cli_mod):
1544
1584
  assert cli_mod.cfg.normalize_backend_url("127.0.0.1:800") == "http://127.0.0.1:800"
1545
1585
  assert cli_mod.cfg.normalize_backend_url("localhost:8000") == "http://localhost:8000"
@@ -1582,7 +1622,7 @@ def test_config_session_overrides_do_not_persist(cli_mod, monkeypatch, tmp_path)
1582
1622
 
1583
1623
 
1584
1624
  def test_login_mocked(cli_mod, runner, monkeypatch):
1585
- cleared = {"called": False}
1625
+ session_override = {}
1586
1626
  monkeypatch.setattr(
1587
1627
  cli_mod,
1588
1628
  "login_via_browser",
@@ -1600,7 +1640,11 @@ def test_login_mocked(cli_mod, runner, monkeypatch):
1600
1640
  lambda: {"mainsequence_path": "/tmp/mainsequence"},
1601
1641
  )
1602
1642
  monkeypatch.setattr(cli_mod.cfg, "auth_persistence_label", lambda: "secure OS storage")
1603
- monkeypatch.setattr(cli_mod.cfg, "clear_session_overrides", lambda: cleared.update(called=True))
1643
+ monkeypatch.setattr(
1644
+ cli_mod.cfg,
1645
+ "set_session_overrides",
1646
+ lambda **kwargs: session_override.update(kwargs) or kwargs,
1647
+ )
1604
1648
  monkeypatch.setattr(
1605
1649
  cli_mod,
1606
1650
  "get_projects",
@@ -1616,7 +1660,11 @@ def test_login_mocked(cli_mod, runner, monkeypatch):
1616
1660
  assert "__ __" in result.output
1617
1661
  assert "Signed in as user@example.com" in result.output
1618
1662
  assert "Auth tokens are persisted in secure OS storage" in result.output
1619
- assert cleared["called"] is True
1663
+ assert cli_mod.cfg.STANDARD_BACKEND_URL in result.output
1664
+ assert session_override == {
1665
+ "backend_url": cli_mod.cfg.STANDARD_BACKEND_URL,
1666
+ "mainsequence_path": None,
1667
+ }
1620
1668
 
1621
1669
 
1622
1670
  def test_login_with_backend_override(cli_mod, runner, monkeypatch):
@@ -1736,7 +1784,7 @@ def test_login_export_env(cli_mod, runner, monkeypatch):
1736
1784
  "get_config",
1737
1785
  lambda: {"mainsequence_path": "/tmp/mainsequence"},
1738
1786
  )
1739
- monkeypatch.setattr(cli_mod.cfg, "clear_session_overrides", lambda: None)
1787
+ monkeypatch.setattr(cli_mod.cfg, "set_session_overrides", lambda **kwargs: kwargs)
1740
1788
  monkeypatch.setattr(
1741
1789
  cli_mod,
1742
1790
  "get_projects",
@@ -1755,7 +1803,7 @@ def test_login_export_env(cli_mod, runner, monkeypatch):
1755
1803
 
1756
1804
  def test_login_with_jwt_tokens(cli_mod, runner, monkeypatch):
1757
1805
  saved = {}
1758
- cleared = {"called": False}
1806
+ session_override = {}
1759
1807
 
1760
1808
  monkeypatch.setattr(
1761
1809
  cli_mod.cfg,
@@ -1770,7 +1818,11 @@ def test_login_with_jwt_tokens(cli_mod, runner, monkeypatch):
1770
1818
  lambda: {"mainsequence_path": "/tmp/mainsequence"},
1771
1819
  )
1772
1820
  monkeypatch.setattr(cli_mod.cfg, "auth_persistence_label", lambda: "local CLI auth storage")
1773
- monkeypatch.setattr(cli_mod.cfg, "clear_session_overrides", lambda: cleared.update(called=True))
1821
+ monkeypatch.setattr(
1822
+ cli_mod.cfg,
1823
+ "set_session_overrides",
1824
+ lambda **kwargs: session_override.update(kwargs) or kwargs,
1825
+ )
1774
1826
  monkeypatch.setattr(
1775
1827
  cli_mod,
1776
1828
  "get_projects",
@@ -1792,11 +1844,14 @@ def test_login_with_jwt_tokens(cli_mod, runner, monkeypatch):
1792
1844
  assert saved == {"username": "", "access": "acc-123", "refresh": "ref-456"}
1793
1845
  assert "Signed in with JWT tokens" in result.output
1794
1846
  assert "Auth tokens are persisted in local CLI auth storage" in result.output
1795
- assert cleared["called"] is True
1847
+ assert session_override == {
1848
+ "backend_url": cli_mod.cfg.STANDARD_BACKEND_URL,
1849
+ "mainsequence_path": None,
1850
+ }
1796
1851
 
1797
1852
 
1798
1853
  def test_login_runtime_credential_exchanges_token(cli_mod, runner, monkeypatch):
1799
- cleared = {"called": False}
1854
+ session_override = {}
1800
1855
  exchange = {"called": False}
1801
1856
  saved = {}
1802
1857
 
@@ -1825,7 +1880,11 @@ def test_login_runtime_credential_exchanges_token(cli_mod, runner, monkeypatch):
1825
1880
  lambda: {"mainsequence_path": "/tmp/mainsequence"},
1826
1881
  )
1827
1882
  monkeypatch.setattr(cli_mod.cfg, "auth_persistence_label", lambda: "local CLI auth storage")
1828
- monkeypatch.setattr(cli_mod.cfg, "clear_session_overrides", lambda: cleared.update(called=True))
1883
+ monkeypatch.setattr(
1884
+ cli_mod.cfg,
1885
+ "set_session_overrides",
1886
+ lambda **kwargs: session_override.update(kwargs) or kwargs,
1887
+ )
1829
1888
 
1830
1889
  result = runner.invoke(cli_mod.app, ["login"])
1831
1890
 
@@ -1837,7 +1896,10 @@ def test_login_runtime_credential_exchanges_token(cli_mod, runner, monkeypatch):
1837
1896
  assert "Signed in with runtime credential" in result.output
1838
1897
  assert "no CLI JWT refresh token exists" in result.output
1839
1898
  assert "re-exchange the runtime credential automatically" in result.output
1840
- assert cleared["called"] is True
1899
+ assert session_override == {
1900
+ "backend_url": cli_mod.cfg.STANDARD_BACKEND_URL,
1901
+ "mainsequence_path": None,
1902
+ }
1841
1903
 
1842
1904
 
1843
1905
  def test_login_runtime_credential_export(monkeypatch, cli_mod, runner):
@@ -1852,7 +1914,7 @@ def test_login_runtime_credential_export(monkeypatch, cli_mod, runner):
1852
1914
  "get_config",
1853
1915
  lambda: {"mainsequence_path": "/tmp/mainsequence"},
1854
1916
  )
1855
- monkeypatch.setattr(cli_mod.cfg, "clear_session_overrides", lambda: None)
1917
+ monkeypatch.setattr(cli_mod.cfg, "set_session_overrides", lambda **kwargs: kwargs)
1856
1918
 
1857
1919
  result = runner.invoke(cli_mod.app, ["login", "--export"])
1858
1920
 
@@ -2040,7 +2102,7 @@ def test_login_export_env_with_jwt_tokens_omits_username(cli_mod, runner, monkey
2040
2102
  "get_config",
2041
2103
  lambda: {"mainsequence_path": "/tmp/mainsequence"},
2042
2104
  )
2043
- monkeypatch.setattr(cli_mod.cfg, "clear_session_overrides", lambda: None)
2105
+ monkeypatch.setattr(cli_mod.cfg, "set_session_overrides", lambda **kwargs: kwargs)
2044
2106
 
2045
2107
  result = runner.invoke(
2046
2108
  cli_mod.app,
@@ -2078,7 +2140,7 @@ def test_login_warns_when_secure_persist_fails(cli_mod, runner, monkeypatch):
2078
2140
  )
2079
2141
  monkeypatch.setattr(cli_mod.cfg, "save_tokens", lambda username, access, refresh: False)
2080
2142
  monkeypatch.setattr(cli_mod.cfg, "auth_persistence_label", lambda: "secure OS storage")
2081
- monkeypatch.setattr(cli_mod.cfg, "clear_session_overrides", lambda: None)
2143
+ monkeypatch.setattr(cli_mod.cfg, "set_session_overrides", lambda **kwargs: kwargs)
2082
2144
  monkeypatch.setattr(
2083
2145
  cli_mod,
2084
2146
  "get_projects",
@@ -2111,7 +2173,7 @@ def test_login_does_not_fetch_projects_after_success(cli_mod, runner, monkeypatc
2111
2173
  lambda: {"mainsequence_path": "/tmp/mainsequence"},
2112
2174
  )
2113
2175
  monkeypatch.setattr(cli_mod.cfg, "auth_persistence_label", lambda: "local CLI auth storage")
2114
- monkeypatch.setattr(cli_mod.cfg, "clear_session_overrides", lambda: None)
2176
+ monkeypatch.setattr(cli_mod.cfg, "set_session_overrides", lambda **kwargs: kwargs)
2115
2177
  monkeypatch.setattr(
2116
2178
  cli_mod,
2117
2179
  "get_projects",
@@ -2135,7 +2197,7 @@ def test_jwt_login_does_not_fetch_projects_after_success(cli_mod, runner, monkey
2135
2197
  lambda: {"mainsequence_path": "/tmp/mainsequence"},
2136
2198
  )
2137
2199
  monkeypatch.setattr(cli_mod.cfg, "auth_persistence_label", lambda: "local CLI auth storage")
2138
- monkeypatch.setattr(cli_mod.cfg, "clear_session_overrides", lambda: None)
2200
+ monkeypatch.setattr(cli_mod.cfg, "set_session_overrides", lambda **kwargs: kwargs)
2139
2201
  monkeypatch.setattr(
2140
2202
  cli_mod,
2141
2203
  "get_projects",
@@ -2193,7 +2255,7 @@ def test_login_no_open_prints_authorize_url(cli_mod, runner, monkeypatch):
2193
2255
  lambda: {"mainsequence_path": "/tmp/mainsequence"},
2194
2256
  )
2195
2257
  monkeypatch.setattr(cli_mod.cfg, "auth_persistence_label", lambda: "local CLI auth storage")
2196
- monkeypatch.setattr(cli_mod.cfg, "clear_session_overrides", lambda: None)
2258
+ monkeypatch.setattr(cli_mod.cfg, "set_session_overrides", lambda **kwargs: kwargs)
2197
2259
  monkeypatch.setattr(cli_mod.cfg, "save_tokens", lambda username, access, refresh: True)
2198
2260
  monkeypatch.setattr(cli_mod, "get_current_user_profile", lambda: {"username": "user@example.com"})
2199
2261
 
File without changes
File without changes