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.
- {mainsequence-3.18.3 → mainsequence-3.18.5}/PKG-INFO +1 -1
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/cli.py +74 -24
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/config.py +4 -2
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/client.py +3 -1
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/command_center/workspace_snapshot.py +3 -1
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/models_user.py +2 -1
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/utils.py +4 -3
- mainsequence-3.18.5/mainsequence/defaults.py +3 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/logconf.py +2 -1
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence.egg-info/PKG-INFO +1 -1
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence.egg-info/SOURCES.txt +1 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/pyproject.toml +1 -1
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_cli.py +78 -16
- {mainsequence-3.18.3 → mainsequence-3.18.5}/LICENSE +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/README.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/AGENTS.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/data_publishing/simple_tables/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/maintenance/local_journal/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/markets_platform/assets_and_translation/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/markets_platform/instruments_and_pricing/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/markets_platform/virtualfundbuilder/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/__main__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/bootstrap.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/api.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/local_ops.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/project_status.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/cli/ui.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/agent.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/agent_runtime_models.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/base.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/command_center/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/command_center/app_component.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/command_center/data_models.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/command_center/workspace.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/data_sources_interfaces/timescale.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/fastapi/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/fastapi/auth.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/models_helpers.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/models_simple_tables.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/models_tdag.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/models_vam.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/compute_validation.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/config.toml +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/favicon.png +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/image_1_base64.txt +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/image_2_base64.txt +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/image_3_base64.txt +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/image_4_base64.txt +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/image_5_base64.txt +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/assets/logo.png +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/components/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/components/asset_select.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/components/date_settings.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/components/logged_user.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/core/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/core/theme.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/instruments/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/instruments/streamlit_form_factory.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/pages/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/dashboards/streamlit/scaffold.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instrumentation/utils.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/data_interface/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/data_interface/data_interface.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/base_instrument.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/bond.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/callability.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/interest_rate_swap.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/json_codec.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/position.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/instruments/ql_fields.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/interest_rates/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/interest_rates/etl/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/interest_rates/etl/curve_codec.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/interest_rates/etl/nodes.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/interest_rates/etl/registry.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/pricing_models/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/pricing_models/bond_pricer.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/pricing_models/indices.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/pricing_models/indices_builders.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/pricing_models/swap_pricer.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/settings.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/instruments/utils.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/__main__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/base_persist_managers.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/config.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/configuration_models.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/build_operations.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/data_nodes.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/filters.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/models.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/namespacing.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/persist_managers.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/run_operations.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/data_nodes/utils.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/filters.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/future_registry.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/pydantic_metadata.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/simple_tables/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/simple_tables/filters.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/simple_tables/models.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/simple_tables/persist_managers.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/simple_tables/schema.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/simple_tables/table_nodes.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/tdag/utils.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/data_nodes/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/data_nodes/external_weights.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/data_nodes/intraday_trend.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/data_nodes/market_cap.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/data_nodes/mock_signal.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/data_nodes/portfolio_replicator.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/prices/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/prices/utils.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/rebalance_strategies.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/enums.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/models.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/portfolio_nodes.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/resource_factory/__init__.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/resource_factory/rebalance_factory.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/resource_factory/signal_factory.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/virtualfundbuilder/utils.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence.egg-info/entry_points.txt +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/setup.cfg +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_auth_precedence.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_build_operations_hashing.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_client.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_command_center_app_component_models.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_command_center_models.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_dependency_extras.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_filter_normalization.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_instruments.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_logconf.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_logged_user_components.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_models_user_request_bound_auth.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_pod_project_resolution.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_project_batch_jobs_from_file.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_run_configuration.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_simple_tables_configuration_hashing.py +0 -0
- {mainsequence-3.18.3 → mainsequence-3.18.5}/tests/test_simple_tables_persistence.py +0 -0
|
@@ -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
|
-
|
|
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)
|
|
2143
|
+
normalized_backend = cfg.normalize_backend_url(effective_backend_input)
|
|
2142
2144
|
|
|
2143
|
-
if
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
2213
|
-
|
|
2214
|
-
|
|
2215
|
-
|
|
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
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
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.
|
|
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
|
|
2883
|
+
Backend base URL.
|
|
2887
2884
|
|
|
2888
2885
|
Examples
|
|
2889
2886
|
--------
|
|
2890
2887
|
```bash
|
|
2891
|
-
mainsequence settings set-backend
|
|
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", "
|
|
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
|
|
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
|
|
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
|
{mainsequence-3.18.3 → mainsequence-3.18.5}/mainsequence/client/command_center/workspace_snapshot.py
RENAMED
|
@@ -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 ==
|
|
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=[
|
|
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
|
|
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
|
|
76
|
-
"use `mainsequence login
|
|
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
|
|
|
@@ -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
|
|
74
|
+
or STANDARD_BACKEND_URL
|
|
74
75
|
).rstrip("/")
|
|
75
76
|
|
|
76
77
|
def _auth_headers() -> tuple[CaseInsensitiveDict, bool]:
|
|
@@ -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
|
-
|
|
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(
|
|
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
|
|
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, "
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
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(
|
|
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
|
|
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, "
|
|
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, "
|
|
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, "
|
|
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, "
|
|
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, "
|
|
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, "
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/dashboards/streamlit/SKILL.md
RENAMED
|
File without changes
|
{mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/data_access/exploration/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md
RENAMED
|
File without changes
|
{mainsequence-3.18.3 → mainsequence-3.18.5}/agent_scaffold/skills/maintenance/local_journal/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|