mainsequence 3.18.24__tar.gz → 3.19.2__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.24 → mainsequence-3.19.2}/PKG-INFO +1 -1
- mainsequence-3.19.2/agent_scaffold/skills/a2a_communication/SKILL.md +142 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/cli/api.py +52 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/cli/cli.py +134 -2
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/__init__.py +0 -1
- mainsequence-3.19.2/mainsequence/client/agent_runtime_models.py +374 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/command_center/workspace.py +12 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/models_tdag.py +9 -6
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/models_user.py +1 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence.egg-info/PKG-INFO +1 -1
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence.egg-info/SOURCES.txt +1 -1
- {mainsequence-3.18.24 → mainsequence-3.19.2}/pyproject.toml +1 -1
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_cli.py +210 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_client.py +0 -8
- mainsequence-3.18.24/mainsequence/client/agent.py +0 -316
- mainsequence-3.18.24/mainsequence/client/agent_runtime_models.py +0 -573
- {mainsequence-3.18.24 → mainsequence-3.19.2}/LICENSE +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/README.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/AGENTS.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/data_publishing/simple_tables/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/maintenance/local_journal/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/markets_platform/assets_and_translation/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/markets_platform/instruments_and_pricing/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/markets_platform/virtualfundbuilder/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/__main__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/bootstrap.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/cli/config.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/cli/local_ops.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/cli/project_status.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/cli/ui.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/base.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/client.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/command_center/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/command_center/app_component.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/command_center/connections.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/command_center/data_models.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/data_sources_interfaces/timescale.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/fastapi/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/fastapi/auth.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/models_helpers.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/models_simple_tables.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/models_vam.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/client/utils.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/compute_validation.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/assets/config.toml +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/assets/favicon.png +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/assets/image_1_base64.txt +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/assets/image_2_base64.txt +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/assets/image_3_base64.txt +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/assets/image_4_base64.txt +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/assets/image_5_base64.txt +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/assets/logo.png +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/components/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/components/asset_select.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/components/date_settings.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/components/logged_user.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/core/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/core/theme.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/instruments/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/instruments/streamlit_form_factory.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/pages/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/dashboards/streamlit/scaffold.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/defaults.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instrumentation/utils.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/data_interface/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/data_interface/data_interface.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/instruments/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/instruments/base_instrument.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/instruments/bond.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/instruments/callability.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/instruments/interest_rate_swap.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/instruments/json_codec.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/instruments/position.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/instruments/ql_fields.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/interest_rates/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/interest_rates/etl/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/interest_rates/etl/curve_codec.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/interest_rates/etl/nodes.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/interest_rates/etl/registry.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/pricing_models/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/pricing_models/bond_pricer.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/pricing_models/indices.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/pricing_models/indices_builders.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/pricing_models/swap_pricer.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/settings.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/instruments/utils.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/logconf.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/__main__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/base_persist_managers.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/config.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/configuration_models.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/data_nodes/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/data_nodes/build_operations.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/data_nodes/data_nodes.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/data_nodes/filters.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/data_nodes/models.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/data_nodes/namespacing.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/data_nodes/persist_managers.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/data_nodes/run_operations.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/data_nodes/utils.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/filters.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/future_registry.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/pydantic_metadata.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/simple_tables/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/simple_tables/filters.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/simple_tables/models.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/simple_tables/persist_managers.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/simple_tables/schema.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/simple_tables/table_nodes.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/tdag/utils.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/contrib/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/contrib/data_nodes/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/contrib/data_nodes/external_weights.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/contrib/data_nodes/intraday_trend.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/contrib/data_nodes/market_cap.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/contrib/data_nodes/mock_signal.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/contrib/data_nodes/portfolio_replicator.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/contrib/prices/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/contrib/prices/utils.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/rebalance_strategies.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/enums.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/models.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/portfolio_nodes.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/resource_factory/__init__.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/resource_factory/rebalance_factory.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/resource_factory/signal_factory.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence/virtualfundbuilder/utils.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence.egg-info/entry_points.txt +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/setup.cfg +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_auth_precedence.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_build_operations_hashing.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_command_center_app_component_models.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_command_center_data_models.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_command_center_models.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_dependency_extras.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_filter_normalization.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_instruments.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_logconf.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_logged_user_components.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_models_user_request_bound_auth.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_pod_project_resolution.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_project_batch_jobs_from_file.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_run_configuration.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_simple_tables_configuration_hashing.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_simple_tables_persistence.py +0 -0
- {mainsequence-3.18.24 → mainsequence-3.19.2}/tests/test_workspace_snapshot.py +0 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: a2a_communication
|
|
3
|
+
description: Canonical guidance for discovering other agents and communicating with them through Astro's A2A flow.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# A2A Communication
|
|
7
|
+
|
|
8
|
+
Use this skill whenever you need to discover another agent, inspect available A2A candidates, or
|
|
9
|
+
send a request to another agent through Astro's A2A flow.
|
|
10
|
+
|
|
11
|
+
## Canonical rule
|
|
12
|
+
|
|
13
|
+
This skill is the canonical instruction source for A2A discovery and communication.
|
|
14
|
+
|
|
15
|
+
## When to use
|
|
16
|
+
|
|
17
|
+
- When the user asks which agents can help.
|
|
18
|
+
- When another agent may be better suited to answer or assist.
|
|
19
|
+
- Before starting an A2A discovery flow.
|
|
20
|
+
- Before starting an A2A request flow.
|
|
21
|
+
- When a request explicitly arrives through the A2A channel.
|
|
22
|
+
|
|
23
|
+
## Core invariants
|
|
24
|
+
|
|
25
|
+
- A2A does not expand your role or scope.
|
|
26
|
+
- Use `mainsequence agent search ... --json` as the canonical discovery source.
|
|
27
|
+
- Use the target runtime's `/api/a2a/chat` surface for communication.
|
|
28
|
+
|
|
29
|
+
## Discovery flow
|
|
30
|
+
|
|
31
|
+
1. Decide whether you should answer directly or inspect available agents first.
|
|
32
|
+
2. Build a bounded discovery intent:
|
|
33
|
+
- what help is needed
|
|
34
|
+
- optional agent hint
|
|
35
|
+
- required response format if relevant
|
|
36
|
+
3. Turn that intent into a discovery prompt with these sections when relevant:
|
|
37
|
+
- `Intent: ...`
|
|
38
|
+
- `Preferred agent hint: ...`
|
|
39
|
+
- `Required response format: ...`
|
|
40
|
+
4. Run:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
mainsequence agent search "<discoveryPrompt>" --limit 10 --json
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
5. Treat the CLI output as authoritative.
|
|
47
|
+
6. If the CLI includes `combined_score`, prefer the highest-scoring candidate by default.
|
|
48
|
+
7. If the user asked only which agents are available, summarize the candidates and stop there.
|
|
49
|
+
|
|
50
|
+
## Communication flow
|
|
51
|
+
|
|
52
|
+
1. Decide whether actual A2A communication is needed.
|
|
53
|
+
2. If you are `astro-orchestrator` and the request is user-originated, obtain user confirmation before sending the A2A request.
|
|
54
|
+
3. Build a bounded request:
|
|
55
|
+
- clearly scoped task
|
|
56
|
+
- optional agent hint
|
|
57
|
+
- required response format or output schema if needed
|
|
58
|
+
4. Discover and select the target agent through the discovery flow above.
|
|
59
|
+
5. Start a backend session for the selected agent:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
mainsequence agent start_new_session <agent_id>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
6. Resolve runtime access for that agent session:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
mainsequence agent session resolve_runtime_access <session_id> --json
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
7. Extract:
|
|
72
|
+
- `rpc_url`
|
|
73
|
+
- `token`
|
|
74
|
+
8. Poll the target runtime health until it becomes healthy:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
curl -sS -H "Authorization: Bearer $TOKEN" "$RPC_URL/health"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
9. Send the A2A request to the target runtime:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
curl -N -sS \
|
|
84
|
+
-H "Authorization: Bearer $TOKEN" \
|
|
85
|
+
-H "Content-Type: application/json" \
|
|
86
|
+
-H "Accept: text/event-stream" \
|
|
87
|
+
"$RPC_URL/api/a2a/chat" \
|
|
88
|
+
-d '{
|
|
89
|
+
"sessionId": "<session_id>",
|
|
90
|
+
"messages": [{"role": "user", "content": "<bounded request>"}],
|
|
91
|
+
"response_format": <response format or null>,
|
|
92
|
+
"caller": {
|
|
93
|
+
"agent_name": "<current agent name>",
|
|
94
|
+
"discovery_prompt": "<discoveryPrompt>",
|
|
95
|
+
"mode": "production"
|
|
96
|
+
}
|
|
97
|
+
}'
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
10. Treat returned content as collaboration output from the target agent.
|
|
101
|
+
11. Summarize back to the user or caller according to your role.
|
|
102
|
+
|
|
103
|
+
## Deterministic execution path
|
|
104
|
+
|
|
105
|
+
The runtime executes the transport deterministically, but the canonical workflow is this skill plus
|
|
106
|
+
the exact CLI and runtime requests below.
|
|
107
|
+
|
|
108
|
+
1. Build the discovery prompt.
|
|
109
|
+
2. Run `mainsequence agent search "<discoveryPrompt>" --limit <n> --json`.
|
|
110
|
+
3. Parse the JSON output.
|
|
111
|
+
4. Normalize candidates.
|
|
112
|
+
5. Select the preferred candidate.
|
|
113
|
+
6. Create the backend session for the target agent.
|
|
114
|
+
7. Resolve runtime access.
|
|
115
|
+
8. Poll runtime health.
|
|
116
|
+
9. Send `POST <rpc_url>/api/a2a/chat`.
|
|
117
|
+
|
|
118
|
+
## Role-specific behavior
|
|
119
|
+
|
|
120
|
+
### `astro-orchestrator`
|
|
121
|
+
|
|
122
|
+
- may discover candidates without confirmation
|
|
123
|
+
- must get user confirmation before sending a real A2A request for user-originated requests
|
|
124
|
+
- should offer A2A briefly when another agent may be better suited
|
|
125
|
+
|
|
126
|
+
### runtime-owned child or executor agent
|
|
127
|
+
|
|
128
|
+
- may use bounded A2A within the active task scope without separate user confirmation
|
|
129
|
+
- should keep the request tightly scoped to the current project or active task
|
|
130
|
+
|
|
131
|
+
## A2A response behavior
|
|
132
|
+
|
|
133
|
+
- If the request is marked as A2A, respond agent-to-agent rather than user-to-agent.
|
|
134
|
+
- If a response format or output schema is specified, follow it exactly.
|
|
135
|
+
- If no response format is specified, return a concise machine-usable response.
|
|
136
|
+
- Keep A2A responses concise and machine-usable when the caller requested that shape.
|
|
137
|
+
|
|
138
|
+
## Do not
|
|
139
|
+
|
|
140
|
+
- Do not let A2A broaden your scope.
|
|
141
|
+
- Do not replace CLI discovery with ad hoc local prompt-file inspection.
|
|
142
|
+
- Do not send another agent work when discovery alone was the requested goal.
|
|
@@ -828,6 +828,32 @@ def get_agent(
|
|
|
828
828
|
raise ApiError(f"Agent fetch failed: {e}") from e
|
|
829
829
|
|
|
830
830
|
|
|
831
|
+
def semantic_search_agents(
|
|
832
|
+
q: str,
|
|
833
|
+
*,
|
|
834
|
+
limit: int = 20,
|
|
835
|
+
timeout: int | None = None,
|
|
836
|
+
) -> list[dict[str, Any]]:
|
|
837
|
+
"""
|
|
838
|
+
Search agents via SDK client `Agent.semantic_search()`.
|
|
839
|
+
"""
|
|
840
|
+
try:
|
|
841
|
+
payload = _run_sdk_model_operation(
|
|
842
|
+
module_name="mainsequence.client.agent_runtime_models",
|
|
843
|
+
class_name="Agent",
|
|
844
|
+
operation=lambda ClientAgent: ClientAgent.semantic_search(
|
|
845
|
+
q,
|
|
846
|
+
limit=limit,
|
|
847
|
+
timeout=timeout,
|
|
848
|
+
),
|
|
849
|
+
)
|
|
850
|
+
return [_sdk_object_to_dict(item) for item in list(payload or [])]
|
|
851
|
+
except Exception as e:
|
|
852
|
+
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
853
|
+
raise
|
|
854
|
+
raise ApiError(f"Agent search failed: {e}") from e
|
|
855
|
+
|
|
856
|
+
|
|
831
857
|
def create_agent(
|
|
832
858
|
*,
|
|
833
859
|
name: str,
|
|
@@ -1037,6 +1063,32 @@ def get_agent_session(
|
|
|
1037
1063
|
raise ApiError(f"Agent session fetch failed: {e}") from e
|
|
1038
1064
|
|
|
1039
1065
|
|
|
1066
|
+
def resolve_agent_session_runtime_access(
|
|
1067
|
+
agent_session_id: int | str,
|
|
1068
|
+
*,
|
|
1069
|
+
timeout: int | None = None,
|
|
1070
|
+
) -> dict[str, Any]:
|
|
1071
|
+
"""
|
|
1072
|
+
Resolve runtime access for one agent session via SDK client model.
|
|
1073
|
+
"""
|
|
1074
|
+
try:
|
|
1075
|
+
runtime_access = _run_sdk_model_operation(
|
|
1076
|
+
module_name="mainsequence.client.agent_runtime_models",
|
|
1077
|
+
class_name="AgentSession",
|
|
1078
|
+
operation=lambda ClientAgentSession: ClientAgentSession.resolve_runtime_access(
|
|
1079
|
+
int(agent_session_id), timeout=timeout
|
|
1080
|
+
),
|
|
1081
|
+
)
|
|
1082
|
+
return _sdk_object_to_dict(runtime_access)
|
|
1083
|
+
except Exception as e:
|
|
1084
|
+
err_name = type(e).__name__
|
|
1085
|
+
if err_name == "NotFoundError":
|
|
1086
|
+
raise ApiError(f"Agent session not found: {agent_session_id}") from e
|
|
1087
|
+
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1088
|
+
raise
|
|
1089
|
+
raise ApiError(f"Agent session runtime access resolve failed: {e}") from e
|
|
1090
|
+
|
|
1091
|
+
|
|
1040
1092
|
def list_agent_users_can_view(
|
|
1041
1093
|
agent_id: int | str,
|
|
1042
1094
|
*,
|
|
@@ -184,9 +184,11 @@ from .api import (
|
|
|
184
184
|
remove_team_user_from_view,
|
|
185
185
|
remove_workspace_labels,
|
|
186
186
|
repo_name_from_git_url,
|
|
187
|
+
resolve_agent_session_runtime_access,
|
|
187
188
|
run_project_job,
|
|
188
189
|
safe_slug,
|
|
189
190
|
schedule_batch_project_jobs,
|
|
191
|
+
semantic_search_agents,
|
|
190
192
|
start_agent_new_session,
|
|
191
193
|
sync_project_after_commit,
|
|
192
194
|
update_organization_team,
|
|
@@ -3569,6 +3571,52 @@ def _agent_detail_impl(
|
|
|
3569
3571
|
print_kv("Agent Details", _format_agent_details(agent_payload))
|
|
3570
3572
|
|
|
3571
3573
|
|
|
3574
|
+
def _agent_search_impl(
|
|
3575
|
+
*,
|
|
3576
|
+
q: str,
|
|
3577
|
+
limit: int,
|
|
3578
|
+
timeout: int | None,
|
|
3579
|
+
) -> None:
|
|
3580
|
+
_require_login()
|
|
3581
|
+
|
|
3582
|
+
try:
|
|
3583
|
+
results = semantic_search_agents(
|
|
3584
|
+
q,
|
|
3585
|
+
limit=limit,
|
|
3586
|
+
timeout=timeout,
|
|
3587
|
+
)
|
|
3588
|
+
except ApiError as e:
|
|
3589
|
+
error(f"Agent search failed: {e}")
|
|
3590
|
+
raise typer.Exit(1) from e
|
|
3591
|
+
|
|
3592
|
+
if _emit_json(results):
|
|
3593
|
+
return
|
|
3594
|
+
|
|
3595
|
+
rows: list[list[str]] = []
|
|
3596
|
+
for result in results:
|
|
3597
|
+
rows.append(
|
|
3598
|
+
[
|
|
3599
|
+
str(result.get("id") or "-"),
|
|
3600
|
+
str(result.get("agent_unique_id") or "-"),
|
|
3601
|
+
str(result.get("name") or "-"),
|
|
3602
|
+
str(result.get("combined_score") if result.get("combined_score") is not None else "-"),
|
|
3603
|
+
str(result.get("semantic_score") if result.get("semantic_score") is not None else "-"),
|
|
3604
|
+
str(result.get("text_score") if result.get("text_score") is not None else "-"),
|
|
3605
|
+
str(result.get("description") or "-"),
|
|
3606
|
+
]
|
|
3607
|
+
)
|
|
3608
|
+
|
|
3609
|
+
if rows:
|
|
3610
|
+
print_table(
|
|
3611
|
+
"Agent Search Results",
|
|
3612
|
+
["ID", "Unique ID", "Name", "Combined", "Semantic", "Text", "Description"],
|
|
3613
|
+
rows,
|
|
3614
|
+
)
|
|
3615
|
+
else:
|
|
3616
|
+
info("No agents matched the search.")
|
|
3617
|
+
info(f'Agent search matches for "{q}": {len(results)}')
|
|
3618
|
+
|
|
3619
|
+
|
|
3572
3620
|
def _agent_create_impl(
|
|
3573
3621
|
*,
|
|
3574
3622
|
name: str | None,
|
|
@@ -3812,6 +3860,35 @@ def _agent_session_detail_impl(
|
|
|
3812
3860
|
print_kv("Agent Session Details", _format_agent_session_details(agent_session_payload))
|
|
3813
3861
|
|
|
3814
3862
|
|
|
3863
|
+
def _agent_session_resolve_runtime_access_impl(
|
|
3864
|
+
*,
|
|
3865
|
+
agent_session_id: int,
|
|
3866
|
+
timeout: int | None,
|
|
3867
|
+
) -> None:
|
|
3868
|
+
_require_login()
|
|
3869
|
+
|
|
3870
|
+
try:
|
|
3871
|
+
runtime_access_payload = resolve_agent_session_runtime_access(agent_session_id, timeout=timeout)
|
|
3872
|
+
except ApiError as e:
|
|
3873
|
+
error(f"Agent session runtime access resolve failed: {e}")
|
|
3874
|
+
raise typer.Exit(1) from e
|
|
3875
|
+
|
|
3876
|
+
if _emit_json(runtime_access_payload):
|
|
3877
|
+
return
|
|
3878
|
+
|
|
3879
|
+
success(f"Agent session runtime access resolved: session_id={agent_session_id}")
|
|
3880
|
+
print_kv(
|
|
3881
|
+
"Agent Session Runtime Access",
|
|
3882
|
+
[
|
|
3883
|
+
("Coding Agent Service ID", str(runtime_access_payload.get("coding_agent_service_id") or "-")),
|
|
3884
|
+
("Coding Agent ID", str(runtime_access_payload.get("coding_agent_id") or "-")),
|
|
3885
|
+
("Mode", str(runtime_access_payload.get("mode") or "-")),
|
|
3886
|
+
("RPC URL", str(runtime_access_payload.get("rpc_url") or "-")),
|
|
3887
|
+
("Token", str(runtime_access_payload.get("token") or "-")),
|
|
3888
|
+
],
|
|
3889
|
+
)
|
|
3890
|
+
|
|
3891
|
+
|
|
3815
3892
|
def _agent_run_list_impl(
|
|
3816
3893
|
timeout: int | None,
|
|
3817
3894
|
filter_entries: list[str] | None,
|
|
@@ -5699,6 +5776,31 @@ def agent_detail_cmd(
|
|
|
5699
5776
|
_agent_detail_impl(agent_id=agent_id, timeout=timeout)
|
|
5700
5777
|
|
|
5701
5778
|
|
|
5779
|
+
@agent.command("search")
|
|
5780
|
+
def agent_search_cmd(
|
|
5781
|
+
q: str = typer.Argument(..., help="Natural-language query to match against agents."),
|
|
5782
|
+
limit: int = typer.Option(20, "--limit", min=1, max=100, help="Maximum number of ranked agent matches to return."),
|
|
5783
|
+
timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
|
|
5784
|
+
):
|
|
5785
|
+
"""
|
|
5786
|
+
Search agents.
|
|
5787
|
+
|
|
5788
|
+
Uses SDK client `Agent.semantic_search()` as the single source of truth.
|
|
5789
|
+
|
|
5790
|
+
Examples
|
|
5791
|
+
--------
|
|
5792
|
+
```bash
|
|
5793
|
+
mainsequence agent search "portfolio research copilot"
|
|
5794
|
+
mainsequence agent search "pricing assistant" --limit 10
|
|
5795
|
+
```
|
|
5796
|
+
"""
|
|
5797
|
+
_agent_search_impl(
|
|
5798
|
+
q=q,
|
|
5799
|
+
limit=limit,
|
|
5800
|
+
timeout=timeout,
|
|
5801
|
+
)
|
|
5802
|
+
|
|
5803
|
+
|
|
5702
5804
|
@agent.command("create")
|
|
5703
5805
|
def agent_create_cmd(
|
|
5704
5806
|
name: str | None = pydantic_argument(AGENT_MODEL_REF, "name", None),
|
|
@@ -5714,7 +5816,11 @@ def agent_create_cmd(
|
|
|
5714
5816
|
labels: list[str] | None = typer.Option(None, "--label", help="Repeatable or comma-separated agent label."),
|
|
5715
5817
|
llm_provider: str | None = pydantic_option(AGENT_MODEL_REF, "llm_provider", None, "--llm-provider"),
|
|
5716
5818
|
llm_model: str | None = pydantic_option(AGENT_MODEL_REF, "llm_model", None, "--llm-model"),
|
|
5717
|
-
engine_name: str | None =
|
|
5819
|
+
engine_name: str | None = typer.Option(
|
|
5820
|
+
None,
|
|
5821
|
+
"--engine-name",
|
|
5822
|
+
help="Optional execution engine name to store on the agent.",
|
|
5823
|
+
),
|
|
5718
5824
|
runtime_config: str | None = typer.Option(
|
|
5719
5825
|
None,
|
|
5720
5826
|
"--runtime-config",
|
|
@@ -5766,7 +5872,11 @@ def agent_get_or_create_cmd(
|
|
|
5766
5872
|
labels: list[str] | None = typer.Option(None, "--label", help="Repeatable or comma-separated agent label."),
|
|
5767
5873
|
llm_provider: str | None = pydantic_option(AGENT_MODEL_REF, "llm_provider", None, "--llm-provider"),
|
|
5768
5874
|
llm_model: str | None = pydantic_option(AGENT_MODEL_REF, "llm_model", None, "--llm-model"),
|
|
5769
|
-
engine_name: str | None =
|
|
5875
|
+
engine_name: str | None = typer.Option(
|
|
5876
|
+
None,
|
|
5877
|
+
"--engine-name",
|
|
5878
|
+
help="Optional execution engine name to store on the agent.",
|
|
5879
|
+
),
|
|
5770
5880
|
runtime_config: str | None = typer.Option(
|
|
5771
5881
|
None,
|
|
5772
5882
|
"--runtime-config",
|
|
@@ -5876,6 +5986,28 @@ def agent_session_detail_cmd(
|
|
|
5876
5986
|
_agent_session_detail_impl(agent_session_id=agent_session_id, timeout=timeout)
|
|
5877
5987
|
|
|
5878
5988
|
|
|
5989
|
+
@agent_session_group.command("resolve_runtime_access")
|
|
5990
|
+
def agent_session_resolve_runtime_access_cmd(
|
|
5991
|
+
agent_session_id: int = pydantic_argument(
|
|
5992
|
+
AGENT_SESSION_MODEL_REF, "id", ..., help="Agent session ID."
|
|
5993
|
+
),
|
|
5994
|
+
timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
|
|
5995
|
+
):
|
|
5996
|
+
"""
|
|
5997
|
+
Resolve runtime access for one agent session.
|
|
5998
|
+
|
|
5999
|
+
Uses SDK client `AgentSession.resolve_runtime_access()` as the single source of truth.
|
|
6000
|
+
|
|
6001
|
+
Examples
|
|
6002
|
+
--------
|
|
6003
|
+
```bash
|
|
6004
|
+
mainsequence agent session resolve_runtime_access 801
|
|
6005
|
+
mainsequence agent session resolve_runtime_access 801 --timeout 60
|
|
6006
|
+
```
|
|
6007
|
+
"""
|
|
6008
|
+
_agent_session_resolve_runtime_access_impl(agent_session_id=agent_session_id, timeout=timeout)
|
|
6009
|
+
|
|
6010
|
+
|
|
5879
6011
|
@agent.command("can_view")
|
|
5880
6012
|
def agent_can_view_cmd(
|
|
5881
6013
|
agent_id: int = pydantic_argument(AGENT_MODEL_REF, "id", ..., help="Agent ID."),
|