mainsequence 3.19.3__tar.gz → 3.19.6__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.19.3 → mainsequence-3.19.6}/PKG-INFO +3 -1
- {mainsequence-3.19.3 → mainsequence-3.19.6}/README.md +2 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/AGENTS.md +2 -2
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +16 -9
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/project_to_agent/SKILL.md +1 -1
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/api.py +54 -6
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/cli.py +36 -70
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/local_ops.py +6 -12
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/command_center/workspace.py +1 -1
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/models_helpers.py +3 -13
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence.egg-info/PKG-INFO +3 -1
- {mainsequence-3.19.3 → mainsequence-3.19.6}/pyproject.toml +1 -1
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_cli.py +64 -46
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_project_batch_jobs_from_file.py +43 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/LICENSE +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/data_publishing/simple_tables/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/maintenance/local_journal/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/markets_platform/assets_and_translation/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/markets_platform/instruments_and_pricing/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/markets_platform/virtualfundbuilder/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/__main__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/bootstrap.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/config.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/project_status.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/ui.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/agent_runtime_models.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/base.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/client.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/command_center/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/command_center/app_component.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/command_center/connections.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/command_center/data_models.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/data_sources_interfaces/timescale.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/fastapi/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/fastapi/auth.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/models_simple_tables.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/models_tdag.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/models_user.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/models_vam.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/utils.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/compute_validation.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/config.toml +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/favicon.png +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/image_1_base64.txt +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/image_2_base64.txt +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/image_3_base64.txt +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/image_4_base64.txt +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/image_5_base64.txt +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/logo.png +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/components/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/components/asset_select.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/components/date_settings.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/components/logged_user.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/core/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/core/theme.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/instruments/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/instruments/streamlit_form_factory.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/pages/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/scaffold.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/defaults.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instrumentation/utils.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/data_interface/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/data_interface/data_interface.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/base_instrument.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/bond.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/callability.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/interest_rate_swap.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/json_codec.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/position.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/ql_fields.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/interest_rates/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/interest_rates/etl/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/interest_rates/etl/curve_codec.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/interest_rates/etl/nodes.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/interest_rates/etl/registry.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/pricing_models/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/pricing_models/bond_pricer.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/pricing_models/indices.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/pricing_models/indices_builders.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/pricing_models/swap_pricer.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/settings.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/utils.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/logconf.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/__main__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/base_persist_managers.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/config.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/configuration_models.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/build_operations.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/data_nodes.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/filters.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/models.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/namespacing.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/persist_managers.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/run_operations.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/utils.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/filters.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/future_registry.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/pydantic_metadata.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/simple_tables/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/simple_tables/filters.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/simple_tables/models.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/simple_tables/persist_managers.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/simple_tables/schema.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/simple_tables/table_nodes.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/utils.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/data_nodes/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/data_nodes/external_weights.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/data_nodes/intraday_trend.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/data_nodes/market_cap.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/data_nodes/mock_signal.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/data_nodes/portfolio_replicator.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/prices/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/prices/utils.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/rebalance_strategies.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/enums.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/models.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/portfolio_nodes.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/resource_factory/__init__.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/resource_factory/rebalance_factory.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/resource_factory/signal_factory.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/utils.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence.egg-info/SOURCES.txt +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence.egg-info/entry_points.txt +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/setup.cfg +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_auth_precedence.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_build_operations_hashing.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_client.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_command_center_app_component_models.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_command_center_data_models.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_command_center_models.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_dependency_extras.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_filter_normalization.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_instruments.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_logconf.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_logged_user_components.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_models_user_request_bound_auth.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_pod_project_resolution.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_run_configuration.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_simple_tables_configuration_hashing.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_simple_tables_persistence.py +0 -0
- {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_workspace_snapshot.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mainsequence
|
|
3
|
-
Version: 3.19.
|
|
3
|
+
Version: 3.19.6
|
|
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
|
|
@@ -154,6 +154,7 @@ Recommended entry points:
|
|
|
154
154
|
- [Working With Simple Tables](docs/tutorial/working_with_simple_tables.md)
|
|
155
155
|
- [Create Your First API](docs/tutorial/create_your_first_api.md)
|
|
156
156
|
- [Role-Based Access Control](docs/tutorial/role_based_access_control.md)
|
|
157
|
+
- [Turn Your Project Into an Agent](docs/tutorial/project_to_agent.md)
|
|
157
158
|
- Knowledge:
|
|
158
159
|
- [Data Nodes](docs/knowledge/data_nodes.md)
|
|
159
160
|
- [Command Center](docs/knowledge/command_center/index.md)
|
|
@@ -209,6 +210,7 @@ From there, the normal learning path is:
|
|
|
209
210
|
4. understand sharing and RBAC
|
|
210
211
|
5. schedule jobs
|
|
211
212
|
6. build dashboards or downstream consumers
|
|
213
|
+
7. package the project as an agent-facing surface when the repository is ready
|
|
212
214
|
|
|
213
215
|
## Installation for development
|
|
214
216
|
|
|
@@ -64,6 +64,7 @@ Recommended entry points:
|
|
|
64
64
|
- [Working With Simple Tables](docs/tutorial/working_with_simple_tables.md)
|
|
65
65
|
- [Create Your First API](docs/tutorial/create_your_first_api.md)
|
|
66
66
|
- [Role-Based Access Control](docs/tutorial/role_based_access_control.md)
|
|
67
|
+
- [Turn Your Project Into an Agent](docs/tutorial/project_to_agent.md)
|
|
67
68
|
- Knowledge:
|
|
68
69
|
- [Data Nodes](docs/knowledge/data_nodes.md)
|
|
69
70
|
- [Command Center](docs/knowledge/command_center/index.md)
|
|
@@ -119,6 +120,7 @@ From there, the normal learning path is:
|
|
|
119
120
|
4. understand sharing and RBAC
|
|
120
121
|
5. schedule jobs
|
|
121
122
|
6. build dashboards or downstream consumers
|
|
123
|
+
7. package the project as an agent-facing surface when the repository is ready
|
|
122
124
|
|
|
123
125
|
## Installation for development
|
|
124
126
|
|
|
@@ -18,9 +18,9 @@ uses them to update only the Main Sequence section below.
|
|
|
18
18
|
## Main Sequence Instructions
|
|
19
19
|
|
|
20
20
|
Before any non-trivial Main Sequence work, verify that this Main Sequence section matches the
|
|
21
|
-
latest installed `
|
|
21
|
+
latest installed `AGENTS.md` template and that
|
|
22
22
|
`.agents/skills/mainsequence/project_builder/SKILL.md` matches the latest installed
|
|
23
|
-
|
|
23
|
+
`.agents/skills/project_builder/SKILL.md`; if either local file does not match, update it
|
|
24
24
|
before proceeding.
|
|
25
25
|
|
|
26
26
|
Canonical Main Sequence documentation root:
|
|
@@ -69,25 +69,32 @@ This skill must not claim ownership of:
|
|
|
69
69
|
|
|
70
70
|
0. If widget selection, layout narrative, or visualization strategy is not already decided, use:
|
|
71
71
|
- `.agents/skills/mainsequence/command_center/workspace_design/SKILL.md`
|
|
72
|
-
1.
|
|
72
|
+
1. If the workspace may use connection-backed source widgets, inspect the available connections through the CLI first:
|
|
73
|
+
- `mainsequence cc connection list --json`
|
|
74
|
+
- identify the target connection instance `uid`
|
|
75
|
+
- `mainsequence cc connection detail <CONNECTION_UID> --json`
|
|
76
|
+
- `mainsequence cc connection_type list --json`
|
|
77
|
+
- identify the target connection `type_id`
|
|
78
|
+
- `mainsequence cc connection_type detail <TYPE_ID> --json`
|
|
79
|
+
2. Verify the widget catalog through the CLI:
|
|
73
80
|
- `mainsequence cc registered_widget_type list --json`
|
|
74
81
|
- identify the target `widget_id`
|
|
75
82
|
- `mainsequence cc registered_widget_type detail <WIDGET_ID> --json`
|
|
76
|
-
|
|
83
|
+
3. The SDK client models in `mainsequence/client/command_center/`:
|
|
77
84
|
- `workspace.py`
|
|
78
85
|
- `connections.py` when source widgets depend on backend-owned connections
|
|
79
86
|
- `data_models.py`
|
|
80
87
|
- `app_component.py` when the workspace contains AppComponent widgets or editable form payloads
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
88
|
+
4. `docs/knowledge/command_center/workspaces.md`
|
|
89
|
+
5. the local Main Sequence docs/models/examples in this repository that define the widget payloads being mounted
|
|
90
|
+
6. the current CLI docs if the task uses CLI workflow
|
|
84
91
|
|
|
85
92
|
If the workspace contains AppComponent widgets, also read:
|
|
86
93
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
94
|
+
7. `docs/knowledge/command_center/forms.md`
|
|
95
|
+
8. `docs/knowledge/command_center/widget_data_contracts.md`
|
|
96
|
+
9. `.agents/skills/mainsequence/platform_operations/orchestration_and_releases/SKILL.md` when mounted widgets depend on project APIs that must be usable from Command Center
|
|
97
|
+
10. `.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md` when the workspace should validate an AppComponent/API contract in `mock-json` mode before deployment
|
|
91
98
|
|
|
92
99
|
## Command Center Mental Model
|
|
93
100
|
|
|
@@ -14,7 +14,7 @@ This skill must only be used for adding agentic capabilities to an existing proj
|
|
|
14
14
|
- Create the required files and folders for agentic capabilities.
|
|
15
15
|
- Verify that the project has the required local agent configuration files.
|
|
16
16
|
- Verify that the project has skills that are aligned with its CLI capabilities.
|
|
17
|
-
|
|
17
|
+
- Important: This skill does not require creation of any agent defintion. Do not create an agents folder nor an agent.py build around the project capabilities and .agents skills this is a coding agent setup!
|
|
18
18
|
## This Skill Must Not Claim
|
|
19
19
|
|
|
20
20
|
- That it knows how to build the entire project unless the work is directly related to adding agentic capabilities.
|
|
@@ -18,6 +18,7 @@ import importlib
|
|
|
18
18
|
import json
|
|
19
19
|
import os
|
|
20
20
|
import re
|
|
21
|
+
import shlex
|
|
21
22
|
from typing import Any
|
|
22
23
|
from urllib.parse import urlencode
|
|
23
24
|
|
|
@@ -2374,8 +2375,8 @@ def create_project_resource_release(
|
|
|
2374
2375
|
Create a resource release via SDK client model.
|
|
2375
2376
|
|
|
2376
2377
|
Single source of truth:
|
|
2377
|
-
- delegates to `ProjectResource.create_dashboard()
|
|
2378
|
-
|
|
2378
|
+
- delegates to `ProjectResource.create_dashboard()` or
|
|
2379
|
+
`ProjectResource.create_fastapi()`
|
|
2379
2380
|
- which in turn use `ResourceRelease.create()`
|
|
2380
2381
|
"""
|
|
2381
2382
|
tokens = get_tokens()
|
|
@@ -2437,12 +2438,11 @@ def create_project_resource_release(
|
|
|
2437
2438
|
|
|
2438
2439
|
create_method_name = {
|
|
2439
2440
|
"streamlit_dashboard": "create_dashboard",
|
|
2440
|
-
"agent": "create_agent",
|
|
2441
2441
|
"fastapi": "create_fastapi",
|
|
2442
2442
|
}.get(str(release_kind).strip())
|
|
2443
2443
|
if not create_method_name:
|
|
2444
2444
|
raise ApiError(
|
|
2445
|
-
"release_kind must be one of: 'streamlit_dashboard', '
|
|
2445
|
+
"release_kind must be one of: 'streamlit_dashboard', 'fastapi'."
|
|
2446
2446
|
)
|
|
2447
2447
|
|
|
2448
2448
|
create_method = getattr(resource, create_method_name, None)
|
|
@@ -4679,6 +4679,30 @@ def schedule_batch_project_jobs(
|
|
|
4679
4679
|
os.environ[k] = v
|
|
4680
4680
|
|
|
4681
4681
|
|
|
4682
|
+
def get_project_job(
|
|
4683
|
+
job_id: int | str,
|
|
4684
|
+
*,
|
|
4685
|
+
timeout: int | None = None,
|
|
4686
|
+
) -> dict[str, Any]:
|
|
4687
|
+
"""
|
|
4688
|
+
Retrieve one project job via SDK client model.
|
|
4689
|
+
"""
|
|
4690
|
+
try:
|
|
4691
|
+
job = _run_sdk_model_operation(
|
|
4692
|
+
module_name="mainsequence.client.models_helpers",
|
|
4693
|
+
class_name="Job",
|
|
4694
|
+
operation=lambda ClientJob: ClientJob.get(pk=int(job_id), timeout=timeout),
|
|
4695
|
+
)
|
|
4696
|
+
return _sdk_object_to_dict(job)
|
|
4697
|
+
except Exception as e:
|
|
4698
|
+
err_name = type(e).__name__
|
|
4699
|
+
if err_name == "NotFoundError":
|
|
4700
|
+
raise ApiError(f"Job not found: {job_id}") from e
|
|
4701
|
+
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
4702
|
+
raise
|
|
4703
|
+
raise ApiError(f"Project job fetch failed: {e}") from e
|
|
4704
|
+
|
|
4705
|
+
|
|
4682
4706
|
def run_project_job(
|
|
4683
4707
|
job_id: int | str,
|
|
4684
4708
|
*,
|
|
@@ -4738,11 +4762,35 @@ def run_project_job(
|
|
|
4738
4762
|
|
|
4739
4763
|
job = ClientJob.get(pk=int(job_id), timeout=timeout)
|
|
4740
4764
|
payload = job.run_job(timeout=timeout, command_args=command_args)
|
|
4765
|
+
effective_tokens: list[str] = []
|
|
4766
|
+
execution_path = str(getattr(job, "execution_path", "") or "").strip()
|
|
4767
|
+
app_name = str(getattr(job, "app_name", "") or "").strip()
|
|
4768
|
+
if execution_path:
|
|
4769
|
+
effective_tokens.append(execution_path)
|
|
4770
|
+
elif app_name:
|
|
4771
|
+
effective_tokens.append(f"app:{app_name}")
|
|
4772
|
+
if command_args:
|
|
4773
|
+
effective_tokens.extend(str(arg) for arg in command_args)
|
|
4774
|
+
effective_run = shlex.join(effective_tokens) if effective_tokens else None
|
|
4741
4775
|
if isinstance(payload, dict):
|
|
4776
|
+
if effective_run:
|
|
4777
|
+
payload.setdefault("effective_run", effective_run)
|
|
4778
|
+
if command_args is not None:
|
|
4779
|
+
payload.setdefault("command_args", list(command_args))
|
|
4742
4780
|
return payload
|
|
4743
4781
|
if hasattr(payload, "model_dump"):
|
|
4744
|
-
|
|
4745
|
-
|
|
4782
|
+
payload = payload.model_dump()
|
|
4783
|
+
if effective_run:
|
|
4784
|
+
payload.setdefault("effective_run", effective_run)
|
|
4785
|
+
if command_args is not None:
|
|
4786
|
+
payload.setdefault("command_args", list(command_args))
|
|
4787
|
+
return payload
|
|
4788
|
+
out = {"job_id": int(job_id)}
|
|
4789
|
+
if effective_run:
|
|
4790
|
+
out["effective_run"] = effective_run
|
|
4791
|
+
if command_args is not None:
|
|
4792
|
+
out["command_args"] = list(command_args)
|
|
4793
|
+
return out
|
|
4746
4794
|
|
|
4747
4795
|
except Exception as e:
|
|
4748
4796
|
err_name = type(e).__name__
|
|
@@ -31,6 +31,7 @@ import os
|
|
|
31
31
|
import pathlib
|
|
32
32
|
import platform
|
|
33
33
|
import re
|
|
34
|
+
import shlex
|
|
34
35
|
import shutil
|
|
35
36
|
import subprocess
|
|
36
37
|
import sys
|
|
@@ -114,6 +115,7 @@ from .api import (
|
|
|
114
115
|
get_project,
|
|
115
116
|
get_project_data_node_updates,
|
|
116
117
|
get_project_image,
|
|
118
|
+
get_project_job,
|
|
117
119
|
get_project_job_run_logs,
|
|
118
120
|
get_projects,
|
|
119
121
|
get_registered_widget_type,
|
|
@@ -432,12 +434,10 @@ JOB_RUN_STATUS_PENDING = "PENDING"
|
|
|
432
434
|
JOB_RUN_STATUS_RUNNING = "RUNNING"
|
|
433
435
|
RESOURCE_RELEASE_RESOURCE_TYPE_MAP = {
|
|
434
436
|
"streamlit_dashboard": "dashboard",
|
|
435
|
-
"agent": "agent",
|
|
436
437
|
"fastapi": "fastapi",
|
|
437
438
|
}
|
|
438
439
|
RESOURCE_RELEASE_LABEL_MAP = {
|
|
439
440
|
"streamlit_dashboard": "dashboard release",
|
|
440
|
-
"agent": "agent release",
|
|
441
441
|
"fastapi": "FastAPI release",
|
|
442
442
|
}
|
|
443
443
|
LIST_FILTER_OPTION_HELP = (
|
|
@@ -8834,42 +8834,6 @@ def project_project_resource_create_dashboard_cmd(
|
|
|
8834
8834
|
)
|
|
8835
8835
|
|
|
8836
8836
|
|
|
8837
|
-
@project_project_resource_group.command("create_agent")
|
|
8838
|
-
def project_project_resource_create_agent_cmd(
|
|
8839
|
-
project_id: int | None = typer.Argument(None, help="Project ID. Defaults to local .env when omitted."),
|
|
8840
|
-
resource_id: int | None = typer.Option(None, "--resource-id", help="Project resource ID."),
|
|
8841
|
-
path: str | None = typer.Option(None, "--path", help="Project repository path (default: current project)"),
|
|
8842
|
-
related_image_id: int | None = typer.Option(None, "--related-image-id", help="Project image ID."),
|
|
8843
|
-
readme_resource_id: int | None = typer.Option(None, "--readme-resource-id", help="Optional README resource ID."),
|
|
8844
|
-
cpu_request: str | None = typer.Option(None, "--cpu-request", help="CPU request (accepts 0.5 or 500m; default: 0.25)."),
|
|
8845
|
-
memory_request: str | None = typer.Option(None, "--memory-request", help="Memory request (accepts 1 or 1Gi; default: 0.5)."),
|
|
8846
|
-
gpu_request: str | None = typer.Option(None, "--gpu-request", help="GPU request count."),
|
|
8847
|
-
gpu_type: str | None = typer.Option(None, "--gpu-type", help="GPU accelerator type."),
|
|
8848
|
-
spot: bool | None = typer.Option(None, "--spot/--no-spot", help="Whether to prefer spot capacity."),
|
|
8849
|
-
timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
|
|
8850
|
-
):
|
|
8851
|
-
"""
|
|
8852
|
-
Create an agent release from a project resource.
|
|
8853
|
-
|
|
8854
|
-
The command first lets the user select a project image and then filters resources so
|
|
8855
|
-
only resources with `repo_commit_sha == related_image.project_repo_hash` are eligible.
|
|
8856
|
-
"""
|
|
8857
|
-
_project_resource_release_create_impl(
|
|
8858
|
-
release_kind="agent",
|
|
8859
|
-
project_id=project_id,
|
|
8860
|
-
resource_id=resource_id,
|
|
8861
|
-
path=path,
|
|
8862
|
-
related_image_id=related_image_id,
|
|
8863
|
-
readme_resource_id=readme_resource_id,
|
|
8864
|
-
cpu_request=cpu_request,
|
|
8865
|
-
memory_request=memory_request,
|
|
8866
|
-
gpu_request=gpu_request,
|
|
8867
|
-
gpu_type=gpu_type,
|
|
8868
|
-
spot=spot,
|
|
8869
|
-
timeout=timeout,
|
|
8870
|
-
)
|
|
8871
|
-
|
|
8872
|
-
|
|
8873
8837
|
@project_project_resource_group.command("create_fastapi")
|
|
8874
8838
|
def project_project_resource_create_fastapi_cmd(
|
|
8875
8839
|
project_id: int | None = typer.Argument(None, help="Project ID. Defaults to local .env when omitted."),
|
|
@@ -8977,30 +8941,6 @@ def project_project_resource_delete_dashboard_cmd(
|
|
|
8977
8941
|
)
|
|
8978
8942
|
|
|
8979
8943
|
|
|
8980
|
-
@project_project_resource_group.command("delete_agent")
|
|
8981
|
-
def project_project_resource_delete_agent_cmd(
|
|
8982
|
-
release_id: int = typer.Argument(..., help="Agent resource release ID."),
|
|
8983
|
-
yes: bool = typer.Option(False, "--yes", help="Delete without confirmation."),
|
|
8984
|
-
timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
|
|
8985
|
-
):
|
|
8986
|
-
"""
|
|
8987
|
-
Delete an agent resource release.
|
|
8988
|
-
|
|
8989
|
-
Examples
|
|
8990
|
-
--------
|
|
8991
|
-
```bash
|
|
8992
|
-
mainsequence project project_resource delete_agent 601
|
|
8993
|
-
mainsequence project project_resource delete_agent 601 --yes
|
|
8994
|
-
```
|
|
8995
|
-
"""
|
|
8996
|
-
_project_resource_release_delete_impl(
|
|
8997
|
-
release_id=release_id,
|
|
8998
|
-
expected_release_kind="agent",
|
|
8999
|
-
yes=yes,
|
|
9000
|
-
timeout=timeout,
|
|
9001
|
-
)
|
|
9002
|
-
|
|
9003
|
-
|
|
9004
8944
|
@project_project_resource_group.command("delete_fastapi")
|
|
9005
8945
|
def project_project_resource_delete_fastapi_cmd(
|
|
9006
8946
|
release_id: int = typer.Argument(..., help="FastAPI resource release ID."),
|
|
@@ -9574,10 +9514,14 @@ def project_jobs_list_cmd(
|
|
|
9574
9514
|
@project_jobs_group.command("run")
|
|
9575
9515
|
def project_jobs_run_cmd(
|
|
9576
9516
|
job_id: int = pydantic_argument(JOB_MODEL_REF, "id", ..., help="Job ID to run."),
|
|
9517
|
+
passthrough_args: list[str] | None = typer.Argument(
|
|
9518
|
+
None,
|
|
9519
|
+
help="Additional per-run args after `--`, for example `mainsequence project jobs run 91 -- --name demo`.",
|
|
9520
|
+
),
|
|
9577
9521
|
command_args: list[str] | None = typer.Option(
|
|
9578
9522
|
None,
|
|
9579
|
-
"--
|
|
9580
|
-
help="
|
|
9523
|
+
"--arg",
|
|
9524
|
+
help="Append one per-run arg to the saved job entrypoint. Repeatable. Does not replace the saved execution_path or app_name.",
|
|
9581
9525
|
),
|
|
9582
9526
|
timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
|
|
9583
9527
|
):
|
|
@@ -9585,21 +9529,43 @@ def project_jobs_run_cmd(
|
|
|
9585
9529
|
Run a project job immediately.
|
|
9586
9530
|
|
|
9587
9531
|
Uses SDK client `Job.run_job()` as the single source of truth.
|
|
9532
|
+
Per-run args are appended to the saved job entrypoint; they do not replace it.
|
|
9588
9533
|
|
|
9589
9534
|
Examples
|
|
9590
9535
|
--------
|
|
9591
9536
|
```bash
|
|
9592
9537
|
mainsequence project jobs run 91
|
|
9593
|
-
mainsequence project jobs run 91 --
|
|
9538
|
+
mainsequence project jobs run 91 --arg demo-from-cli
|
|
9539
|
+
mainsequence project jobs run 91 -- --name demo-from-cli
|
|
9594
9540
|
mainsequence project jobs run 91 --timeout 60
|
|
9595
9541
|
```
|
|
9596
9542
|
"""
|
|
9597
9543
|
_require_login()
|
|
9598
9544
|
|
|
9545
|
+
merged_command_args = list(command_args or [])
|
|
9546
|
+
if passthrough_args:
|
|
9547
|
+
merged_command_args.extend(str(arg) for arg in passthrough_args)
|
|
9548
|
+
|
|
9549
|
+
try:
|
|
9550
|
+
job_payload = get_project_job(job_id, timeout=timeout)
|
|
9551
|
+
except ApiError as e:
|
|
9552
|
+
error(f"Project job fetch failed: {e}")
|
|
9553
|
+
raise typer.Exit(1) from e
|
|
9554
|
+
|
|
9555
|
+
entrypoint = str(job_payload.get("execution_path") or "").strip()
|
|
9556
|
+
if not entrypoint:
|
|
9557
|
+
app_name = str(job_payload.get("app_name") or "").strip()
|
|
9558
|
+
if app_name:
|
|
9559
|
+
entrypoint = f"app:{app_name}"
|
|
9560
|
+
|
|
9561
|
+
if entrypoint:
|
|
9562
|
+
effective_tokens = [entrypoint, *merged_command_args]
|
|
9563
|
+
info(f"Effective run: {shlex.join(effective_tokens)}")
|
|
9564
|
+
|
|
9599
9565
|
try:
|
|
9600
9566
|
payload = run_project_job(
|
|
9601
9567
|
job_id=job_id,
|
|
9602
|
-
command_args=
|
|
9568
|
+
command_args=merged_command_args or None,
|
|
9603
9569
|
timeout=timeout,
|
|
9604
9570
|
)
|
|
9605
9571
|
except ApiError as e:
|
|
@@ -10625,7 +10591,7 @@ def project_refresh_token(
|
|
|
10625
10591
|
def project_freeze_env(
|
|
10626
10592
|
project_id: int | None = typer.Argument(None, help="Project ID"),
|
|
10627
10593
|
path: str | None = typer.Option(None, "--path", help="Project directory"),
|
|
10628
|
-
ensure_uv: bool = typer.Option(True, "--ensure-uv/--no-ensure-uv", help="
|
|
10594
|
+
ensure_uv: bool = typer.Option(True, "--ensure-uv/--no-ensure-uv", help="Allow resolving uv from PATH when it is not present inside .venv."),
|
|
10629
10595
|
):
|
|
10630
10596
|
"""
|
|
10631
10597
|
Export pinned dependencies into `requirements.txt` using `uv`.
|
|
@@ -10637,7 +10603,7 @@ def project_freeze_env(
|
|
|
10637
10603
|
path:
|
|
10638
10604
|
Explicit local path.
|
|
10639
10605
|
ensure_uv:
|
|
10640
|
-
|
|
10606
|
+
Allow resolving `uv` from PATH when it is not present inside `.venv`.
|
|
10641
10607
|
|
|
10642
10608
|
Examples
|
|
10643
10609
|
--------
|
|
@@ -10736,7 +10702,7 @@ def project_sync(
|
|
|
10736
10702
|
raise typer.Exit(1)
|
|
10737
10703
|
|
|
10738
10704
|
steps = [
|
|
10739
|
-
"
|
|
10705
|
+
"resolve uv executable",
|
|
10740
10706
|
f"uv version --bump {bump}",
|
|
10741
10707
|
"uv lock",
|
|
10742
10708
|
"uv sync",
|
|
@@ -11045,7 +11011,7 @@ def project_update_sdk(
|
|
|
11045
11011
|
ensure_venv(project_dir)
|
|
11046
11012
|
|
|
11047
11013
|
steps = [
|
|
11048
|
-
"
|
|
11014
|
+
"resolve uv executable",
|
|
11049
11015
|
"uv lock --upgrade-package mainsequence",
|
|
11050
11016
|
"uv sync",
|
|
11051
11017
|
]
|
|
@@ -13,6 +13,7 @@ Local operations shared by several commands:
|
|
|
13
13
|
|
|
14
14
|
import os
|
|
15
15
|
import pathlib
|
|
16
|
+
import shutil
|
|
16
17
|
import subprocess
|
|
17
18
|
import sys
|
|
18
19
|
from dataclasses import dataclass
|
|
@@ -62,7 +63,7 @@ def ensure_venv(project_dir: pathlib.Path) -> VenvPaths:
|
|
|
62
63
|
|
|
63
64
|
def ensure_uv_installed(project_dir: pathlib.Path, upgrade: bool = True) -> pathlib.Path:
|
|
64
65
|
"""
|
|
65
|
-
|
|
66
|
+
Resolve a usable uv executable for the project workflow.
|
|
66
67
|
|
|
67
68
|
Returns:
|
|
68
69
|
Path to uv executable
|
|
@@ -71,18 +72,11 @@ def ensure_uv_installed(project_dir: pathlib.Path, upgrade: bool = True) -> path
|
|
|
71
72
|
if vp.uv and vp.uv.exists():
|
|
72
73
|
return vp.uv
|
|
73
74
|
|
|
74
|
-
|
|
75
|
-
if
|
|
76
|
-
|
|
77
|
-
args.append("uv")
|
|
78
|
-
r = subprocess.run(args, cwd=str(project_dir))
|
|
79
|
-
if r.returncode != 0:
|
|
80
|
-
raise RuntimeError("Failed to install uv into the virtual environment.")
|
|
75
|
+
uv_bin = shutil.which("uv")
|
|
76
|
+
if uv_bin:
|
|
77
|
+
return pathlib.Path(uv_bin)
|
|
81
78
|
|
|
82
|
-
|
|
83
|
-
if not vp.uv or not vp.uv.exists():
|
|
84
|
-
raise RuntimeError("uv installed but executable not found in .venv.")
|
|
85
|
-
return vp.uv
|
|
79
|
+
raise RuntimeError("uv executable not found. Install uv and ensure it is available in PATH.")
|
|
86
80
|
|
|
87
81
|
|
|
88
82
|
def run_cmd(cmd: list[str], cwd: pathlib.Path, env: dict[str, str] | None = None) -> subprocess.CompletedProcess:
|
|
@@ -101,7 +101,7 @@ class Workspace(LabelableObjectMixin, ShareableObjectMixin, CommandCenterBaseObj
|
|
|
101
101
|
description="Free-form workspace description.",
|
|
102
102
|
)
|
|
103
103
|
type: WorkspaceType = Field(default=WorkspaceType.WORKSPACE)
|
|
104
|
-
public_url:str=Field(description="Public URL for workspace endpoint if exists.", default=
|
|
104
|
+
public_url:str| None =Field(description="Public URL for workspace endpoint if exists.", default=None)
|
|
105
105
|
created_at:datetime=Field()
|
|
106
106
|
labels: list[str] = Field(
|
|
107
107
|
default_factory=list,
|
|
@@ -728,7 +728,7 @@ class Job(BaseObjectOrm, BasePydanticModel):
|
|
|
728
728
|
|
|
729
729
|
payload: dict[str, Any] = {}
|
|
730
730
|
if command_args is not None:
|
|
731
|
-
payload["
|
|
731
|
+
payload["json"] = {"command_args": list(command_args)}
|
|
732
732
|
|
|
733
733
|
r = make_request(
|
|
734
734
|
s=s,
|
|
@@ -954,10 +954,10 @@ class ProjectResource(BaseObjectOrm, BasePydanticModel):
|
|
|
954
954
|
description="Display name of the resource discovered in the project's repository.",
|
|
955
955
|
examples=["analytics_dashboard.py"],
|
|
956
956
|
)
|
|
957
|
-
resource_type: Literal["dashboard",
|
|
957
|
+
resource_type: Literal["dashboard", "fastapi", "markdown"] | None = Field(
|
|
958
958
|
None,
|
|
959
959
|
title="Resource Type",
|
|
960
|
-
description="Type of the project resource. Allowed values are `dashboard`,
|
|
960
|
+
description="Type of the project resource. Allowed values are `dashboard`, `fastapi`, and `markdown`.",
|
|
961
961
|
examples=["dashboard", "fastapi", "markdown"],
|
|
962
962
|
)
|
|
963
963
|
code: str | None = Field(
|
|
@@ -1027,15 +1027,6 @@ class ProjectResource(BaseObjectOrm, BasePydanticModel):
|
|
|
1027
1027
|
**kwargs,
|
|
1028
1028
|
)
|
|
1029
1029
|
|
|
1030
|
-
def create_agent(self, timeout=None, files=None, *args, **kwargs) -> ResourceRelease:
|
|
1031
|
-
return self._create_release(
|
|
1032
|
-
ResourceReleaseKind.AGENT,
|
|
1033
|
-
timeout,
|
|
1034
|
-
files,
|
|
1035
|
-
*args,
|
|
1036
|
-
**kwargs,
|
|
1037
|
-
)
|
|
1038
|
-
|
|
1039
1030
|
def create_fastapi(self, timeout=None, files=None, *args, **kwargs) -> ResourceRelease:
|
|
1040
1031
|
return self._create_release(
|
|
1041
1032
|
ResourceReleaseKind.FAST_API,
|
|
@@ -1048,7 +1039,6 @@ class ProjectResource(BaseObjectOrm, BasePydanticModel):
|
|
|
1048
1039
|
|
|
1049
1040
|
class ResourceReleaseKind(str, Enum):
|
|
1050
1041
|
STREAMLIT_DASHBOARD = "streamlit_dashboard"
|
|
1051
|
-
AGENT = "agent"
|
|
1052
1042
|
FAST_API = "fastapi"
|
|
1053
1043
|
|
|
1054
1044
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mainsequence
|
|
3
|
-
Version: 3.19.
|
|
3
|
+
Version: 3.19.6
|
|
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
|
|
@@ -154,6 +154,7 @@ Recommended entry points:
|
|
|
154
154
|
- [Working With Simple Tables](docs/tutorial/working_with_simple_tables.md)
|
|
155
155
|
- [Create Your First API](docs/tutorial/create_your_first_api.md)
|
|
156
156
|
- [Role-Based Access Control](docs/tutorial/role_based_access_control.md)
|
|
157
|
+
- [Turn Your Project Into an Agent](docs/tutorial/project_to_agent.md)
|
|
157
158
|
- Knowledge:
|
|
158
159
|
- [Data Nodes](docs/knowledge/data_nodes.md)
|
|
159
160
|
- [Command Center](docs/knowledge/command_center/index.md)
|
|
@@ -209,6 +210,7 @@ From there, the normal learning path is:
|
|
|
209
210
|
4. understand sharing and RBAC
|
|
210
211
|
5. schedule jobs
|
|
211
212
|
6. build dashboards or downstream consumers
|
|
213
|
+
7. package the project as an agent-facing surface when the repository is ready
|
|
212
214
|
|
|
213
215
|
## Installation for development
|
|
214
216
|
|