mainsequence 4.4.12__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.12/mainsequence.egg-info → mainsequence-4.4.16}/PKG-INFO +1 -1
- mainsequence-4.4.16/agent_scaffold/skills/a2a_communication/SKILL.md +120 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/api.py +253 -15
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/cli.py +830 -13
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/config.py +130 -0
- mainsequence-4.4.16/mainsequence/client/agent_runtime_models.py +1595 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16/mainsequence.egg-info}/PKG-INFO +1 -1
- {mainsequence-4.4.12 → mainsequence-4.4.16}/pyproject.toml +1 -1
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_cli.py +636 -11
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_filter_normalization.py +760 -2
- mainsequence-4.4.12/agent_scaffold/skills/a2a_communication/SKILL.md +0 -157
- mainsequence-4.4.12/mainsequence/client/agent_runtime_models.py +0 -677
- {mainsequence-4.4.12 → mainsequence-4.4.16}/LICENSE +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/README.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/AGENTS.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/widgets/app_components/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/widgets/tables/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/widgets/tabular_transform/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/__main__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/bootstrap.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/browser_auth.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/docker_utils.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/doctor.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/local_ops.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/migrations.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/model_filters.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/project_status.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/pydantic_cli.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/sdk_utils.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/ssh_utils.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/cli/ui.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/base.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/client.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/app_component.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/connections.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/adapter_from_api.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/response_mapping.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/table_visuals.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/tabular.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/ui.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/data_models.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/providers/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/providers/adapter_from_api.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/bindings.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/connection_query.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/registry.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/table.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/tabular_transform.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/workspace.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/workspaces/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/workspaces/documents.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/command_center/workspaces/mounted_widgets.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/compute_validation.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/dtype_codec.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/exceptions.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/fastapi/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/fastapi/auth.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/metatables/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/metatables/core.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/models_foundry.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/models_helpers.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/models_user.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/client/utils.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/defaults.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/instrumentation/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/instrumentation/utils.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/logconf.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/__main__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/models.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/future_registry.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/hashing.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/alembic.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/env.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/provider.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/registry.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/schema_names.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/runtime_flags.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence/scaffold_skills.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence.egg-info/SOURCES.txt +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence.egg-info/dependency_links.txt +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence.egg-info/entry_points.txt +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence.egg-info/requires.txt +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/mainsequence.egg-info/top_level.txt +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/setup.cfg +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_auth_precedence.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_build_operations_hashing.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_cli_browser_auth.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_cli_migrations.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_client.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_command_center_app_component_models.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_command_center_data_models.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_command_center_models.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_command_center_table_contracts.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_command_center_tabular_transform.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_data_access_mixin_dimension_audit.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_data_node_storage_dimension_queries.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_data_node_update_flow.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_dependency_extras.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_duckdb_interface_dimensions.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_instrumentation.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_logconf.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_meta_table_migrations.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_meta_tables_client_models.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_models_user_request_bound_auth.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_pod_project_resolution.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_project_batch_jobs_from_file.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_run_configuration.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_scaffold_skills.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_schema_names.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_secret_client_model.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_source_table_configuration.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_sqlite_interface_dimensions.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_update_runner_uid_runtime.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_update_statistics.py +0 -0
- {mainsequence-4.4.12 → mainsequence-4.4.16}/tests/test_update_uid_guards.py +0 -0
- {mainsequence-4.4.12 → 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)}
|
|
@@ -598,11 +613,7 @@ def get_logged_user_details() -> dict[str, Any]:
|
|
|
598
613
|
try:
|
|
599
614
|
who = authed("GET", AUTH_PATHS["ping"])
|
|
600
615
|
data = who.json() if who.ok else {}
|
|
601
|
-
user_uid = (
|
|
602
|
-
data.get("uid")
|
|
603
|
-
or (data.get("user") or {}).get("uid")
|
|
604
|
-
or data.get("user_uid")
|
|
605
|
-
)
|
|
616
|
+
user_uid = data.get("uid") or (data.get("user") or {}).get("uid") or data.get("user_uid")
|
|
606
617
|
if user_uid in (None, ""):
|
|
607
618
|
raise ApiError("Could not determine the authenticated user uid.")
|
|
608
619
|
|
|
@@ -1270,7 +1281,9 @@ def list_agent_sessions(
|
|
|
1270
1281
|
raise ApiError(f"Agent not found for agent_unique_id={agent_unique_id!r}") from e
|
|
1271
1282
|
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1272
1283
|
raise
|
|
1273
|
-
raise ApiError(
|
|
1284
|
+
raise ApiError(
|
|
1285
|
+
f"Agent lookup failed for agent_unique_id={agent_unique_id!r}: {e}"
|
|
1286
|
+
) from e
|
|
1274
1287
|
|
|
1275
1288
|
resolved_agent = _sdk_object_to_dict(agent)
|
|
1276
1289
|
resolved_agent_uid = str(resolved_agent.get("uid") or "").strip()
|
|
@@ -1322,6 +1335,7 @@ def get_agent_session(
|
|
|
1322
1335
|
def resolve_agent_session_runtime_access(
|
|
1323
1336
|
agent_session_uid: str,
|
|
1324
1337
|
*,
|
|
1338
|
+
wait_for_runtime: bool = False,
|
|
1325
1339
|
timeout: int | None = None,
|
|
1326
1340
|
) -> dict[str, Any]:
|
|
1327
1341
|
"""
|
|
@@ -1332,7 +1346,9 @@ def resolve_agent_session_runtime_access(
|
|
|
1332
1346
|
module_name="mainsequence.client.agent_runtime_models",
|
|
1333
1347
|
class_name="AgentSession",
|
|
1334
1348
|
operation=lambda ClientAgentSession: ClientAgentSession.resolve_runtime_access(
|
|
1335
|
-
str(agent_session_uid),
|
|
1349
|
+
str(agent_session_uid),
|
|
1350
|
+
wait_for_runtime=wait_for_runtime,
|
|
1351
|
+
timeout=timeout,
|
|
1336
1352
|
),
|
|
1337
1353
|
)
|
|
1338
1354
|
return _sdk_object_to_dict(runtime_access)
|
|
@@ -1345,6 +1361,224 @@ def resolve_agent_session_runtime_access(
|
|
|
1345
1361
|
raise ApiError(f"Agent session runtime access resolve failed: {e}") from e
|
|
1346
1362
|
|
|
1347
1363
|
|
|
1364
|
+
def wait_agent_session_runtime_ready(
|
|
1365
|
+
agent_session_uid: str,
|
|
1366
|
+
*,
|
|
1367
|
+
timeout_seconds: float = DEFAULT_AGENT_RUNTIME_READY_TIMEOUT_SECONDS,
|
|
1368
|
+
timeout: int | None = None,
|
|
1369
|
+
) -> dict[str, Any]:
|
|
1370
|
+
"""
|
|
1371
|
+
Wait for one agent session runtime through SDK client model.
|
|
1372
|
+
"""
|
|
1373
|
+
try:
|
|
1374
|
+
ready = _run_sdk_model_operation(
|
|
1375
|
+
module_name="mainsequence.client.agent_runtime_models",
|
|
1376
|
+
class_name="AgentSession",
|
|
1377
|
+
operation=lambda ClientAgentSession: ClientAgentSession.wait_until_runtime_ready(
|
|
1378
|
+
str(agent_session_uid),
|
|
1379
|
+
timeout_seconds=timeout_seconds,
|
|
1380
|
+
timeout=timeout,
|
|
1381
|
+
),
|
|
1382
|
+
)
|
|
1383
|
+
return _sdk_object_to_dict(ready)
|
|
1384
|
+
except Exception as e:
|
|
1385
|
+
err_name = type(e).__name__
|
|
1386
|
+
if err_name == "NotFoundError":
|
|
1387
|
+
raise ApiError(f"Agent session not found: {agent_session_uid}") from e
|
|
1388
|
+
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1389
|
+
raise
|
|
1390
|
+
raise ApiError(f"Agent session runtime readiness failed: {e}") from e
|
|
1391
|
+
|
|
1392
|
+
|
|
1393
|
+
def send_agent_session_a2a_chat(
|
|
1394
|
+
agent_session_uid: str,
|
|
1395
|
+
*,
|
|
1396
|
+
message: str | None = None,
|
|
1397
|
+
a2a_payload: dict[str, Any] | None = None,
|
|
1398
|
+
wait_for_runtime: bool = True,
|
|
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,
|
|
1405
|
+
timeout: int | None = None,
|
|
1406
|
+
) -> dict[str, Any]:
|
|
1407
|
+
"""
|
|
1408
|
+
Send an A2A request through the legacy backend compatibility endpoint.
|
|
1409
|
+
"""
|
|
1410
|
+
try:
|
|
1411
|
+
chat = _run_sdk_model_operation(
|
|
1412
|
+
module_name="mainsequence.client.agent_runtime_models",
|
|
1413
|
+
class_name="AgentSession",
|
|
1414
|
+
operation=lambda ClientAgentSession: ClientAgentSession.send_a2a_chat(
|
|
1415
|
+
str(agent_session_uid),
|
|
1416
|
+
message=message,
|
|
1417
|
+
a2a_payload=a2a_payload,
|
|
1418
|
+
wait_for_runtime=wait_for_runtime,
|
|
1419
|
+
runtime_ready_timeout_seconds=runtime_ready_timeout_seconds,
|
|
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,
|
|
1425
|
+
timeout=timeout,
|
|
1426
|
+
),
|
|
1427
|
+
)
|
|
1428
|
+
return _sdk_object_to_dict(chat)
|
|
1429
|
+
except Exception as e:
|
|
1430
|
+
err_name = type(e).__name__
|
|
1431
|
+
if err_name == "NotFoundError":
|
|
1432
|
+
raise ApiError(f"Agent session not found: {agent_session_uid}") from e
|
|
1433
|
+
if isinstance(e, (ApiError, NotLoggedIn)):
|
|
1434
|
+
raise
|
|
1435
|
+
raise ApiError(f"Agent session A2A chat failed: {e}") from e
|
|
1436
|
+
|
|
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
|
+
|
|
1348
1582
|
def list_agent_users_can_view(
|
|
1349
1583
|
agent_uid: str,
|
|
1350
1584
|
*,
|
|
@@ -3280,11 +3514,11 @@ def _adapter_from_api_public_config_payload(
|
|
|
3280
3514
|
dedupe_in_flight: bool | None = None,
|
|
3281
3515
|
) -> dict[str, Any]:
|
|
3282
3516
|
public_config_model = _adapter_from_api_public_config_model()
|
|
3283
|
-
normalized_api_base_url =
|
|
3517
|
+
normalized_api_base_url = (
|
|
3518
|
+
api_base_url.strip() if isinstance(api_base_url, str) else api_base_url
|
|
3519
|
+
)
|
|
3284
3520
|
normalized_debug_api_base_url = (
|
|
3285
|
-
debug_api_base_url.strip()
|
|
3286
|
-
if isinstance(debug_api_base_url, str)
|
|
3287
|
-
else debug_api_base_url
|
|
3521
|
+
debug_api_base_url.strip() if isinstance(debug_api_base_url, str) else debug_api_base_url
|
|
3288
3522
|
)
|
|
3289
3523
|
normalized_api_base_url = normalized_api_base_url or None
|
|
3290
3524
|
normalized_debug_api_base_url = normalized_debug_api_base_url or None
|
|
@@ -3328,7 +3562,9 @@ def _adapter_from_api_public_config_payload(
|
|
|
3328
3562
|
try:
|
|
3329
3563
|
if public_config is not None:
|
|
3330
3564
|
payload = dict(public_config)
|
|
3331
|
-
payload.update(
|
|
3565
|
+
payload.update(
|
|
3566
|
+
{key: value for key, value in alias_updates.items() if value is not None}
|
|
3567
|
+
)
|
|
3332
3568
|
config = public_config_model.model_validate(payload)
|
|
3333
3569
|
elif normalized_debug_api_base_url is not None:
|
|
3334
3570
|
config = public_config_model.direct(
|
|
@@ -3347,7 +3583,9 @@ def _adapter_from_api_public_config_payload(
|
|
|
3347
3583
|
"Adapter from API public config is required. Provide api_base_url, "
|
|
3348
3584
|
"debug_api_base_url, or public_config."
|
|
3349
3585
|
)
|
|
3350
|
-
payload.update(
|
|
3586
|
+
payload.update(
|
|
3587
|
+
{key: value for key, value in alias_updates.items() if value is not None}
|
|
3588
|
+
)
|
|
3351
3589
|
config = public_config_model.model_validate(payload)
|
|
3352
3590
|
except ApiError:
|
|
3353
3591
|
raise
|