mainsequence 4.4.13__tar.gz → 4.4.16__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-4.4.13 → mainsequence-4.4.16}/PKG-INFO +1 -1
- mainsequence-4.4.16/agent_scaffold/skills/a2a_communication/SKILL.md +120 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/api.py +177 -11
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/cli.py +594 -36
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/config.py +130 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/agent_runtime_models.py +754 -35
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence.egg-info/PKG-INFO +1 -1
- {mainsequence-4.4.13 → mainsequence-4.4.16}/pyproject.toml +1 -1
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_cli.py +434 -17
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_filter_normalization.py +562 -9
- mainsequence-4.4.13/agent_scaffold/skills/a2a_communication/SKILL.md +0 -301
- {mainsequence-4.4.13 → mainsequence-4.4.16}/LICENSE +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/README.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/AGENTS.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/widgets/app_components/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/widgets/tables/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/widgets/tabular_transform/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/__main__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/bootstrap.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/local_ops.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/migrations.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/project_status.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/ui.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/base.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/client.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/app_component.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/connections.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/adapter_from_api.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/response_mapping.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/table_visuals.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/tabular.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/ui.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/data_models.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/providers/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/providers/adapter_from_api.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/bindings.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/connection_query.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/registry.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/table.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/tabular_transform.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/workspace.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/workspaces/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/workspaces/documents.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/workspaces/mounted_widgets.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/compute_validation.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/dtype_codec.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/fastapi/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/fastapi/auth.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/metatables/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/metatables/core.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/models_foundry.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/models_helpers.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/models_user.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/utils.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/defaults.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/instrumentation/utils.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/logconf.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/__main__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/models.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/future_registry.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/hashing.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/alembic.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/env.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/provider.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/registry.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/schema_names.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/scaffold_skills.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence.egg-info/SOURCES.txt +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence.egg-info/entry_points.txt +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/setup.cfg +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_auth_precedence.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_build_operations_hashing.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_cli_migrations.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_client.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_command_center_app_component_models.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_command_center_data_models.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_command_center_models.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_command_center_table_contracts.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_command_center_tabular_transform.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_data_access_mixin_dimension_audit.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_data_node_storage_dimension_queries.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_data_node_update_flow.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_dependency_extras.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_duckdb_interface_dimensions.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_instrumentation.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_logconf.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_meta_table_migrations.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_meta_tables_client_models.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_models_user_request_bound_auth.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_pod_project_resolution.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_project_batch_jobs_from_file.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_run_configuration.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_scaffold_skills.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_schema_names.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_secret_client_model.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_source_table_configuration.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_sqlite_interface_dimensions.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_update_runner_uid_runtime.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_update_statistics.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_update_uid_guards.py +0 -0
- {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_workspace_snapshot.py +0 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: a2a_communication
|
|
3
|
+
description: Canonical guidance for discovering agents and sending session-scoped A2A requests through Main Sequence.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# A2A Communication
|
|
7
|
+
|
|
8
|
+
Use this skill when you need to discover another agent or send a bounded A2A
|
|
9
|
+
request to an existing target `AgentSession`.
|
|
10
|
+
|
|
11
|
+
## Canonical CLI Path
|
|
12
|
+
|
|
13
|
+
Use the standard A2A CLI send command. The CLI resolves the target runtime
|
|
14
|
+
internally and sends a standard A2A message.
|
|
15
|
+
|
|
16
|
+
## When To Use
|
|
17
|
+
|
|
18
|
+
- When the user asks which agents can help.
|
|
19
|
+
- When another agent may be better suited to answer or assist.
|
|
20
|
+
- Before sending a request to an existing target agent session.
|
|
21
|
+
- When a request explicitly arrives through the A2A channel.
|
|
22
|
+
|
|
23
|
+
## Core Rules
|
|
24
|
+
|
|
25
|
+
- A2A communication is scoped to an `AgentSession` UID.
|
|
26
|
+
- Use the target `AgentSession` UID for chat.
|
|
27
|
+
- Do not expose runtime credentials in prompts, logs, or user-facing answers.
|
|
28
|
+
- Do not use commands that require both target agent UID and target session UID for chat.
|
|
29
|
+
- Use `--strict-dictionary` when the target answer must be machine-parseable JSON.
|
|
30
|
+
- Do not send or request reasoning/thinking traces; standard A2A responses expose only message parts.
|
|
31
|
+
|
|
32
|
+
## Discovery Flow
|
|
33
|
+
|
|
34
|
+
1. Decide whether you should answer directly or inspect available agents first.
|
|
35
|
+
2. Build a bounded discovery prompt with the requested capability and expected output shape.
|
|
36
|
+
3. Run:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
mainsequence agent search "<discoveryPrompt>" --limit 10 --json
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
4. Treat the CLI output as authoritative.
|
|
43
|
+
5. Prefer the highest `combined_score` when present.
|
|
44
|
+
6. If the user asked only which agents are available, summarize the candidates and stop.
|
|
45
|
+
Include agent name, stable unique id, and a short capability summary.
|
|
46
|
+
|
|
47
|
+
## Target Session
|
|
48
|
+
|
|
49
|
+
Use an existing target `AgentSession` UID. If the target session UID is not
|
|
50
|
+
available, get it from the active task context or ask for it before sending A2A
|
|
51
|
+
messages.
|
|
52
|
+
|
|
53
|
+
## Send A2A Chat
|
|
54
|
+
|
|
55
|
+
For JSON-shaped answers, use:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
mainsequence agent session a2a send \
|
|
59
|
+
<target_agent_session_uid> \
|
|
60
|
+
--message "Return a JSON object with keys: summary, risk_level, next_action." \
|
|
61
|
+
--strict-dictionary
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
For plain text answers, use:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
mainsequence agent session a2a send \
|
|
68
|
+
<target_agent_session_uid> \
|
|
69
|
+
--message "Summarize the current portfolio drift."
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
For a second message to the same target session, send another chat command
|
|
73
|
+
with the same target `AgentSession` UID:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
mainsequence agent session a2a send \
|
|
77
|
+
<target_agent_session_uid> \
|
|
78
|
+
--message "Now identify the highest priority follow-up."
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Response Handling
|
|
82
|
+
|
|
83
|
+
- Parse the CLI output as the standard A2A JSON response.
|
|
84
|
+
- Consume only `message.parts` from the A2A response.
|
|
85
|
+
- Do not depend on reasoning, tool traces, runtime paths, or transport metadata.
|
|
86
|
+
|
|
87
|
+
## Deterministic Execution Path
|
|
88
|
+
|
|
89
|
+
1. Build the discovery prompt.
|
|
90
|
+
2. Run `mainsequence agent search "<discoveryPrompt>" --limit <n> --json`.
|
|
91
|
+
3. Select the target agent.
|
|
92
|
+
4. Get the target `AgentSession` UID.
|
|
93
|
+
5. Run `mainsequence agent session a2a send <target_agent_session_uid> ...`.
|
|
94
|
+
6. Parse `message.parts` from the CLI output.
|
|
95
|
+
|
|
96
|
+
## Role-Specific Behavior
|
|
97
|
+
|
|
98
|
+
### Orchestrator Agent
|
|
99
|
+
|
|
100
|
+
- May discover candidates without confirmation.
|
|
101
|
+
- Must get user confirmation before sending a real A2A request for user-originated requests.
|
|
102
|
+
- Should offer A2A briefly when another agent may be better suited.
|
|
103
|
+
|
|
104
|
+
### Runtime-Owned Child Or Executor Agent
|
|
105
|
+
|
|
106
|
+
- May use bounded A2A within the active task scope without separate user confirmation.
|
|
107
|
+
- Should keep the request tightly scoped to the current project or active task.
|
|
108
|
+
|
|
109
|
+
## A2A Response Behavior
|
|
110
|
+
|
|
111
|
+
- If the request is marked as A2A, respond agent-to-agent rather than user-to-agent.
|
|
112
|
+
- If a response format or output schema is specified, follow it exactly.
|
|
113
|
+
- If no response format is specified, return a concise machine-usable response.
|
|
114
|
+
|
|
115
|
+
## Do Not
|
|
116
|
+
|
|
117
|
+
- Do not let A2A broaden your scope.
|
|
118
|
+
- Do not replace CLI discovery with ad hoc local prompt-file inspection.
|
|
119
|
+
- Do not send another agent work when discovery alone was requested.
|
|
120
|
+
- Do not call lower-level transports or extract runtime credentials.
|
|
@@ -38,6 +38,8 @@ CLI_BROWSER_CLIENT_ID = "mainsequence-cli"
|
|
|
38
38
|
|
|
39
39
|
S = requests.Session()
|
|
40
40
|
S.headers.update({"Content-Type": "application/json"})
|
|
41
|
+
|
|
42
|
+
DEFAULT_AGENT_RUNTIME_READY_TIMEOUT_SECONDS = 900.0
|
|
41
43
|
_UNSET = object()
|
|
42
44
|
|
|
43
45
|
|
|
@@ -421,10 +423,23 @@ def _format_env_value(value: Any) -> str:
|
|
|
421
423
|
|
|
422
424
|
|
|
423
425
|
def _sdk_object_to_dict(obj: Any) -> dict[str, Any]:
|
|
426
|
+
def _strip_client_metadata(value: Any) -> Any:
|
|
427
|
+
if isinstance(value, dict):
|
|
428
|
+
return {
|
|
429
|
+
key: _strip_client_metadata(item)
|
|
430
|
+
for key, item in value.items()
|
|
431
|
+
if key != "orm_class"
|
|
432
|
+
}
|
|
433
|
+
if isinstance(value, list):
|
|
434
|
+
return [_strip_client_metadata(item) for item in value]
|
|
435
|
+
if isinstance(value, tuple):
|
|
436
|
+
return [_strip_client_metadata(item) for item in value]
|
|
437
|
+
return value
|
|
438
|
+
|
|
424
439
|
if isinstance(obj, dict):
|
|
425
|
-
return dict(obj)
|
|
440
|
+
return _strip_client_metadata(dict(obj))
|
|
426
441
|
if hasattr(obj, "model_dump"):
|
|
427
|
-
return obj.model_dump(mode="json")
|
|
442
|
+
return _strip_client_metadata(obj.model_dump(mode="json"))
|
|
428
443
|
if hasattr(obj, "uid"):
|
|
429
444
|
return {"uid": getattr(obj, "uid", None)}
|
|
430
445
|
return {"id": getattr(obj, "id", None)}
|
|
@@ -1320,6 +1335,7 @@ def get_agent_session(
|
|
|
1320
1335
|
def resolve_agent_session_runtime_access(
|
|
1321
1336
|
agent_session_uid: str,
|
|
1322
1337
|
*,
|
|
1338
|
+
wait_for_runtime: bool = False,
|
|
1323
1339
|
timeout: int | None = None,
|
|
1324
1340
|
) -> dict[str, Any]:
|
|
1325
1341
|
"""
|
|
@@ -1330,7 +1346,9 @@ def resolve_agent_session_runtime_access(
|
|
|
1330
1346
|
module_name="mainsequence.client.agent_runtime_models",
|
|
1331
1347
|
class_name="AgentSession",
|
|
1332
1348
|
operation=lambda ClientAgentSession: ClientAgentSession.resolve_runtime_access(
|
|
1333
|
-
str(agent_session_uid),
|
|
1349
|
+
str(agent_session_uid),
|
|
1350
|
+
wait_for_runtime=wait_for_runtime,
|
|
1351
|
+
timeout=timeout,
|
|
1334
1352
|
),
|
|
1335
1353
|
)
|
|
1336
1354
|
return _sdk_object_to_dict(runtime_access)
|
|
@@ -1346,8 +1364,7 @@ def resolve_agent_session_runtime_access(
|
|
|
1346
1364
|
def wait_agent_session_runtime_ready(
|
|
1347
1365
|
agent_session_uid: str,
|
|
1348
1366
|
*,
|
|
1349
|
-
timeout_seconds: float =
|
|
1350
|
-
poll_interval_seconds: float = 2,
|
|
1367
|
+
timeout_seconds: float = DEFAULT_AGENT_RUNTIME_READY_TIMEOUT_SECONDS,
|
|
1351
1368
|
timeout: int | None = None,
|
|
1352
1369
|
) -> dict[str, Any]:
|
|
1353
1370
|
"""
|
|
@@ -1360,7 +1377,6 @@ def wait_agent_session_runtime_ready(
|
|
|
1360
1377
|
operation=lambda ClientAgentSession: ClientAgentSession.wait_until_runtime_ready(
|
|
1361
1378
|
str(agent_session_uid),
|
|
1362
1379
|
timeout_seconds=timeout_seconds,
|
|
1363
|
-
poll_interval_seconds=poll_interval_seconds,
|
|
1364
1380
|
timeout=timeout,
|
|
1365
1381
|
),
|
|
1366
1382
|
)
|
|
@@ -1380,13 +1396,16 @@ def send_agent_session_a2a_chat(
|
|
|
1380
1396
|
message: str | None = None,
|
|
1381
1397
|
a2a_payload: dict[str, Any] | None = None,
|
|
1382
1398
|
wait_for_runtime: bool = True,
|
|
1383
|
-
runtime_ready_timeout_seconds: float =
|
|
1384
|
-
|
|
1385
|
-
|
|
1399
|
+
runtime_ready_timeout_seconds: float = DEFAULT_AGENT_RUNTIME_READY_TIMEOUT_SECONDS,
|
|
1400
|
+
poll_task_until_stable: bool | None = None,
|
|
1401
|
+
runtime_turn_timeout_seconds: float | None = None,
|
|
1402
|
+
omit_reasoning: bool | None = None,
|
|
1403
|
+
response_format: dict[str, Any] | None = None,
|
|
1404
|
+
json_repair: dict[str, Any] | None = None,
|
|
1386
1405
|
timeout: int | None = None,
|
|
1387
1406
|
) -> dict[str, Any]:
|
|
1388
1407
|
"""
|
|
1389
|
-
Send an A2A request
|
|
1408
|
+
Send an A2A request through the legacy backend compatibility endpoint.
|
|
1390
1409
|
"""
|
|
1391
1410
|
try:
|
|
1392
1411
|
chat = _run_sdk_model_operation(
|
|
@@ -1398,8 +1417,11 @@ def send_agent_session_a2a_chat(
|
|
|
1398
1417
|
a2a_payload=a2a_payload,
|
|
1399
1418
|
wait_for_runtime=wait_for_runtime,
|
|
1400
1419
|
runtime_ready_timeout_seconds=runtime_ready_timeout_seconds,
|
|
1401
|
-
runtime_ready_poll_interval_seconds=runtime_ready_poll_interval_seconds,
|
|
1402
1420
|
poll_task_until_stable=poll_task_until_stable,
|
|
1421
|
+
runtime_turn_timeout_seconds=runtime_turn_timeout_seconds,
|
|
1422
|
+
omit_reasoning=omit_reasoning,
|
|
1423
|
+
response_format=response_format,
|
|
1424
|
+
json_repair=json_repair,
|
|
1403
1425
|
timeout=timeout,
|
|
1404
1426
|
),
|
|
1405
1427
|
)
|
|
@@ -1413,6 +1435,150 @@ def send_agent_session_a2a_chat(
|
|
|
1413
1435
|
raise ApiError(f"Agent session A2A chat failed: {e}") from e
|
|
1414
1436
|
|
|
1415
1437
|
|
|
1438
|
+
def send_agent_session_a2a_message(
|
|
1439
|
+
agent_session_uid: str,
|
|
1440
|
+
*,
|
|
1441
|
+
message: str,
|
|
1442
|
+
strict_dictionary: bool = False,
|
|
1443
|
+
json_repair_attempts: int = 3,
|
|
1444
|
+
history_length: int = 0,
|
|
1445
|
+
return_immediately: bool = False,
|
|
1446
|
+
wait_for_runtime: bool = True,
|
|
1447
|
+
timeout: int | None = None,
|
|
1448
|
+
) -> dict[str, Any]:
|
|
1449
|
+
"""
|
|
1450
|
+
Send one standard A2A message through the target session runtime.
|
|
1451
|
+
"""
|
|
1452
|
+
try:
|
|
1453
|
+
payload = _run_sdk_model_operation(
|
|
1454
|
+
module_name="mainsequence.client.agent_runtime_models",
|
|
1455
|
+
class_name="AgentSession",
|
|
1456
|
+
operation=lambda ClientAgentSession: ClientAgentSession.send_a2a_message(
|
|
1457
|
+
str(agent_session_uid),
|
|
1458
|
+
message=message,
|
|
1459
|
+
strict_dictionary=strict_dictionary,
|
|
1460
|
+
json_repair_attempts=json_repair_attempts,
|
|
1461
|
+
history_length=history_length,
|
|
1462
|
+
return_immediately=return_immediately,
|
|
1463
|
+
wait_for_runtime=wait_for_runtime,
|
|
1464
|
+
timeout=timeout,
|
|
1465
|
+
),
|
|
1466
|
+
)
|
|
1467
|
+
return _sdk_object_to_dict(payload)
|
|
1468
|
+
except Exception as e:
|
|
1469
|
+
err_name = type(e).__name__
|
|
1470
|
+
if err_name == "NotFoundError":
|
|
1471
|
+
raise ApiError(f"Agent session not found: {agent_session_uid}") from e
|
|
1472
|
+
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1473
|
+
raise
|
|
1474
|
+
raise ApiError(f"Agent session A2A message send failed: {e}") from e
|
|
1475
|
+
|
|
1476
|
+
|
|
1477
|
+
def chat_agent_session_runtime(
|
|
1478
|
+
agent_session_uid: str,
|
|
1479
|
+
*,
|
|
1480
|
+
message: str,
|
|
1481
|
+
runtime_access: dict[str, Any] | None = None,
|
|
1482
|
+
wait_for_runtime: bool = True,
|
|
1483
|
+
runtime_turn_timeout_seconds: float | None = None,
|
|
1484
|
+
omit_reasoning: bool | None = True,
|
|
1485
|
+
response_format: dict[str, Any] | None = None,
|
|
1486
|
+
json_repair: dict[str, Any] | None = None,
|
|
1487
|
+
timeout: int | None = None,
|
|
1488
|
+
) -> dict[str, Any]:
|
|
1489
|
+
"""
|
|
1490
|
+
Send one message through the resolved A2A runtime chat stream.
|
|
1491
|
+
"""
|
|
1492
|
+
operation_kwargs: dict[str, Any] = {
|
|
1493
|
+
"message": message,
|
|
1494
|
+
"wait_for_runtime": wait_for_runtime,
|
|
1495
|
+
"runtime_turn_timeout_seconds": runtime_turn_timeout_seconds,
|
|
1496
|
+
"omit_reasoning": omit_reasoning,
|
|
1497
|
+
"response_format": response_format,
|
|
1498
|
+
"json_repair": json_repair,
|
|
1499
|
+
"timeout": timeout,
|
|
1500
|
+
}
|
|
1501
|
+
if runtime_access is not None:
|
|
1502
|
+
operation_kwargs["runtime_access"] = runtime_access
|
|
1503
|
+
try:
|
|
1504
|
+
payload = _run_sdk_model_operation(
|
|
1505
|
+
module_name="mainsequence.client.agent_runtime_models",
|
|
1506
|
+
class_name="AgentSession",
|
|
1507
|
+
operation=lambda ClientAgentSession: ClientAgentSession.a2a_chat(
|
|
1508
|
+
str(agent_session_uid),
|
|
1509
|
+
**operation_kwargs,
|
|
1510
|
+
),
|
|
1511
|
+
)
|
|
1512
|
+
return _sdk_object_to_dict(payload)
|
|
1513
|
+
except Exception as e:
|
|
1514
|
+
err_name = type(e).__name__
|
|
1515
|
+
if err_name == "NotFoundError":
|
|
1516
|
+
raise ApiError(f"Agent session not found: {agent_session_uid}") from e
|
|
1517
|
+
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1518
|
+
raise
|
|
1519
|
+
raise ApiError(f"Agent session runtime chat failed: {e}") from e
|
|
1520
|
+
|
|
1521
|
+
|
|
1522
|
+
def cancel_agent_session_runtime(
|
|
1523
|
+
agent_session_uid: str,
|
|
1524
|
+
*,
|
|
1525
|
+
reason: str = "client_requested",
|
|
1526
|
+
message: str | None = None,
|
|
1527
|
+
timeout: int | None = None,
|
|
1528
|
+
) -> dict[str, Any]:
|
|
1529
|
+
"""
|
|
1530
|
+
Cancel the active turn on the resolved A2A runtime.
|
|
1531
|
+
"""
|
|
1532
|
+
try:
|
|
1533
|
+
payload = _run_sdk_model_operation(
|
|
1534
|
+
module_name="mainsequence.client.agent_runtime_models",
|
|
1535
|
+
class_name="AgentSession",
|
|
1536
|
+
operation=lambda ClientAgentSession: ClientAgentSession.cancel_runtime(
|
|
1537
|
+
str(agent_session_uid),
|
|
1538
|
+
reason=reason,
|
|
1539
|
+
message=message,
|
|
1540
|
+
timeout=timeout,
|
|
1541
|
+
),
|
|
1542
|
+
)
|
|
1543
|
+
return _sdk_object_to_dict(payload)
|
|
1544
|
+
except Exception as e:
|
|
1545
|
+
err_name = type(e).__name__
|
|
1546
|
+
if err_name == "NotFoundError":
|
|
1547
|
+
raise ApiError(f"Agent session not found: {agent_session_uid}") from e
|
|
1548
|
+
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1549
|
+
raise
|
|
1550
|
+
raise ApiError(f"Agent session runtime cancel failed: {e}") from e
|
|
1551
|
+
|
|
1552
|
+
|
|
1553
|
+
def detach_agent_session_runtime(
|
|
1554
|
+
agent_session_uid: str,
|
|
1555
|
+
*,
|
|
1556
|
+
reason: str = "client_done",
|
|
1557
|
+
timeout: int | None = None,
|
|
1558
|
+
) -> dict[str, Any]:
|
|
1559
|
+
"""
|
|
1560
|
+
Detach the resolved A2A runtime for one agent session.
|
|
1561
|
+
"""
|
|
1562
|
+
try:
|
|
1563
|
+
payload = _run_sdk_model_operation(
|
|
1564
|
+
module_name="mainsequence.client.agent_runtime_models",
|
|
1565
|
+
class_name="AgentSession",
|
|
1566
|
+
operation=lambda ClientAgentSession: ClientAgentSession.detach_runtime(
|
|
1567
|
+
str(agent_session_uid),
|
|
1568
|
+
reason=reason,
|
|
1569
|
+
timeout=timeout,
|
|
1570
|
+
),
|
|
1571
|
+
)
|
|
1572
|
+
return _sdk_object_to_dict(payload)
|
|
1573
|
+
except Exception as e:
|
|
1574
|
+
err_name = type(e).__name__
|
|
1575
|
+
if err_name == "NotFoundError":
|
|
1576
|
+
raise ApiError(f"Agent session not found: {agent_session_uid}") from e
|
|
1577
|
+
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1578
|
+
raise
|
|
1579
|
+
raise ApiError(f"Agent session runtime detach failed: {e}") from e
|
|
1580
|
+
|
|
1581
|
+
|
|
1416
1582
|
def list_agent_users_can_view(
|
|
1417
1583
|
agent_uid: str,
|
|
1418
1584
|
*,
|