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.
Files changed (162) hide show
  1. {mainsequence-4.4.13 → mainsequence-4.4.16}/PKG-INFO +1 -1
  2. mainsequence-4.4.16/agent_scaffold/skills/a2a_communication/SKILL.md +120 -0
  3. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/api.py +177 -11
  4. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/cli.py +594 -36
  5. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/config.py +130 -0
  6. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/agent_runtime_models.py +754 -35
  7. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence.egg-info/PKG-INFO +1 -1
  8. {mainsequence-4.4.13 → mainsequence-4.4.16}/pyproject.toml +1 -1
  9. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_cli.py +434 -17
  10. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_filter_normalization.py +562 -9
  11. mainsequence-4.4.13/agent_scaffold/skills/a2a_communication/SKILL.md +0 -301
  12. {mainsequence-4.4.13 → mainsequence-4.4.16}/LICENSE +0 -0
  13. {mainsequence-4.4.13 → mainsequence-4.4.16}/README.md +0 -0
  14. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/AGENTS.md +0 -0
  15. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  16. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
  17. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  18. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  19. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/widgets/app_components/SKILL.md +0 -0
  20. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/widgets/tables/SKILL.md +0 -0
  21. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/widgets/tabular_transform/SKILL.md +0 -0
  22. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  23. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  24. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  25. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  26. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  27. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  28. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  29. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  30. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  31. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
  32. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  33. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  34. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  35. {mainsequence-4.4.13 → mainsequence-4.4.16}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  36. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/__init__.py +0 -0
  37. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/__main__.py +0 -0
  38. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/bootstrap.py +0 -0
  39. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/__init__.py +0 -0
  40. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/browser_auth.py +0 -0
  41. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/docker_utils.py +0 -0
  42. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/doctor.py +0 -0
  43. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/local_ops.py +0 -0
  44. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/migrations.py +0 -0
  45. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/model_filters.py +0 -0
  46. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/project_status.py +0 -0
  47. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/pydantic_cli.py +0 -0
  48. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/sdk_utils.py +0 -0
  49. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/ssh_utils.py +0 -0
  50. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/cli/ui.py +0 -0
  51. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/__init__.py +0 -0
  52. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/base.py +0 -0
  53. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/client.py +0 -0
  54. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/__init__.py +0 -0
  55. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/app_component.py +0 -0
  56. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/connections.py +0 -0
  57. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/__init__.py +0 -0
  58. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/adapter_from_api.py +0 -0
  59. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/response_mapping.py +0 -0
  60. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/table_visuals.py +0 -0
  61. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/tabular.py +0 -0
  62. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/contracts/ui.py +0 -0
  63. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/data_models.py +0 -0
  64. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/providers/__init__.py +0 -0
  65. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/providers/adapter_from_api.py +0 -0
  66. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/__init__.py +0 -0
  67. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/bindings.py +0 -0
  68. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/connection_query.py +0 -0
  69. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/registry.py +0 -0
  70. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/table.py +0 -0
  71. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/widgets/tabular_transform.py +0 -0
  72. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/workspace.py +0 -0
  73. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  74. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/workspaces/__init__.py +0 -0
  75. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/workspaces/documents.py +0 -0
  76. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/command_center/workspaces/mounted_widgets.py +0 -0
  77. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/compute_validation.py +0 -0
  78. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  79. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  80. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  81. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  82. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/dtype_codec.py +0 -0
  83. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/exceptions.py +0 -0
  84. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/fastapi/__init__.py +0 -0
  85. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/fastapi/auth.py +0 -0
  86. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/metatables/__init__.py +0 -0
  87. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/metatables/core.py +0 -0
  88. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/models_foundry.py +0 -0
  89. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/models_helpers.py +0 -0
  90. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/models_user.py +0 -0
  91. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/client/utils.py +0 -0
  92. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/defaults.py +0 -0
  93. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/instrumentation/__init__.py +0 -0
  94. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/instrumentation/utils.py +0 -0
  95. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/logconf.py +0 -0
  96. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/__init__.py +0 -0
  97. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/__main__.py +0 -0
  98. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  99. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  100. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
  101. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
  102. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
  103. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/models.py +0 -0
  104. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
  105. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
  106. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
  107. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
  108. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/future_registry.py +0 -0
  109. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/hashing.py +0 -0
  110. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  111. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  112. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/env.py +0 -0
  113. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/provider.py +0 -0
  114. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/registry.py +0 -0
  115. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  116. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  117. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  118. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  119. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  120. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/schema_names.py +0 -0
  121. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  122. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/runtime_flags.py +0 -0
  123. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence/scaffold_skills.py +0 -0
  124. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence.egg-info/SOURCES.txt +0 -0
  125. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence.egg-info/dependency_links.txt +0 -0
  126. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence.egg-info/entry_points.txt +0 -0
  127. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence.egg-info/requires.txt +0 -0
  128. {mainsequence-4.4.13 → mainsequence-4.4.16}/mainsequence.egg-info/top_level.txt +0 -0
  129. {mainsequence-4.4.13 → mainsequence-4.4.16}/setup.cfg +0 -0
  130. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_auth_precedence.py +0 -0
  131. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_build_operations_hashing.py +0 -0
  132. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_cli_browser_auth.py +0 -0
  133. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_cli_migrations.py +0 -0
  134. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_client.py +0 -0
  135. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_command_center_app_component_models.py +0 -0
  136. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_command_center_data_models.py +0 -0
  137. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_command_center_models.py +0 -0
  138. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_command_center_table_contracts.py +0 -0
  139. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_command_center_tabular_transform.py +0 -0
  140. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_data_access_mixin_dimension_audit.py +0 -0
  141. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_data_node_storage_dimension_queries.py +0 -0
  142. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_data_node_update_flow.py +0 -0
  143. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_dependency_extras.py +0 -0
  144. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_duckdb_interface_dimensions.py +0 -0
  145. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_instrumentation.py +0 -0
  146. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_logconf.py +0 -0
  147. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_meta_table_migrations.py +0 -0
  148. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_meta_tables_client_models.py +0 -0
  149. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  150. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_models_user_request_bound_auth.py +0 -0
  151. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_pod_project_resolution.py +0 -0
  152. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_project_batch_jobs_from_file.py +0 -0
  153. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_run_configuration.py +0 -0
  154. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_scaffold_skills.py +0 -0
  155. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_schema_names.py +0 -0
  156. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_secret_client_model.py +0 -0
  157. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_source_table_configuration.py +0 -0
  158. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_sqlite_interface_dimensions.py +0 -0
  159. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_update_runner_uid_runtime.py +0 -0
  160. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_update_statistics.py +0 -0
  161. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_update_uid_guards.py +0 -0
  162. {mainsequence-4.4.13 → mainsequence-4.4.16}/tests/test_workspace_snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 4.4.13
3
+ Version: 4.4.16
4
4
  Summary: Main Sequence SDK
5
5
  Author-email: Main Sequence GmbH <dev@main-sequence.io>
6
6
  License: MainSequence GmbH SDK License Agreement
@@ -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), timeout=timeout
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 = 60,
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 = 60,
1384
- runtime_ready_poll_interval_seconds: float = 2,
1385
- poll_task_until_stable: 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,
1386
1405
  timeout: int | None = None,
1387
1406
  ) -> dict[str, Any]:
1388
1407
  """
1389
- Send an A2A request to one existing agent session through SDK client model.
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
  *,