mainsequence 4.4.20__tar.gz → 4.4.21__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 (161) hide show
  1. {mainsequence-4.4.20/mainsequence.egg-info → mainsequence-4.4.21}/PKG-INFO +1 -1
  2. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/a2a_communication/SKILL.md +38 -10
  3. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/api.py +18 -37
  4. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/cli.py +125 -132
  5. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/agent_runtime_models.py +39 -888
  6. {mainsequence-4.4.20 → mainsequence-4.4.21/mainsequence.egg-info}/PKG-INFO +1 -1
  7. {mainsequence-4.4.20 → mainsequence-4.4.21}/pyproject.toml +1 -1
  8. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_cli.py +145 -177
  9. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_filter_normalization.py +68 -798
  10. {mainsequence-4.4.20 → mainsequence-4.4.21}/LICENSE +0 -0
  11. {mainsequence-4.4.20 → mainsequence-4.4.21}/README.md +0 -0
  12. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/AGENTS.md +0 -0
  13. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  14. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
  15. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  16. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  17. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/command_center/widgets/app_components/SKILL.md +0 -0
  18. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/command_center/widgets/tables/SKILL.md +0 -0
  19. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/command_center/widgets/tabular_transform/SKILL.md +0 -0
  20. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  21. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  22. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  23. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  24. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  25. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  26. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/data_publishing/meta_table_migrations/SKILL.md +0 -0
  27. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/data_publishing/meta_tables/SKILL.md +0 -0
  28. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  29. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/ms-markets/SKILL.md +0 -0
  30. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  31. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  32. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  33. {mainsequence-4.4.20 → mainsequence-4.4.21}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  34. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/__init__.py +0 -0
  35. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/__main__.py +0 -0
  36. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/bootstrap.py +0 -0
  37. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/__init__.py +0 -0
  38. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/browser_auth.py +0 -0
  39. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/config.py +0 -0
  40. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/docker_utils.py +0 -0
  41. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/doctor.py +0 -0
  42. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/local_ops.py +0 -0
  43. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/migrations.py +0 -0
  44. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/model_filters.py +0 -0
  45. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/project_status.py +0 -0
  46. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/pydantic_cli.py +0 -0
  47. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/sdk_utils.py +0 -0
  48. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/ssh_utils.py +0 -0
  49. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/cli/ui.py +0 -0
  50. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/__init__.py +0 -0
  51. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/base.py +0 -0
  52. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/client.py +0 -0
  53. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/__init__.py +0 -0
  54. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/app_component.py +0 -0
  55. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/connections.py +0 -0
  56. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/contracts/__init__.py +0 -0
  57. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/contracts/adapter_from_api.py +0 -0
  58. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/contracts/response_mapping.py +0 -0
  59. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/contracts/table_visuals.py +0 -0
  60. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/contracts/tabular.py +0 -0
  61. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/contracts/ui.py +0 -0
  62. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/data_models.py +0 -0
  63. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/providers/__init__.py +0 -0
  64. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/providers/adapter_from_api.py +0 -0
  65. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/widgets/__init__.py +0 -0
  66. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/widgets/bindings.py +0 -0
  67. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/widgets/connection_query.py +0 -0
  68. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/widgets/registry.py +0 -0
  69. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/widgets/table.py +0 -0
  70. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/widgets/tabular_transform.py +0 -0
  71. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/workspace.py +0 -0
  72. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  73. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/workspaces/__init__.py +0 -0
  74. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/workspaces/documents.py +0 -0
  75. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/command_center/workspaces/mounted_widgets.py +0 -0
  76. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/compute_validation.py +0 -0
  77. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  78. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  79. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/data_sources_interfaces/local_paths.py +0 -0
  80. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/data_sources_interfaces/sqlite.py +0 -0
  81. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/dtype_codec.py +0 -0
  82. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/exceptions.py +0 -0
  83. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/fastapi/__init__.py +0 -0
  84. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/fastapi/auth.py +0 -0
  85. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/metatables/__init__.py +0 -0
  86. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/metatables/core.py +0 -0
  87. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/models_foundry.py +0 -0
  88. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/models_helpers.py +0 -0
  89. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/models_user.py +0 -0
  90. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/client/utils.py +0 -0
  91. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/defaults.py +0 -0
  92. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/instrumentation/__init__.py +0 -0
  93. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/instrumentation/utils.py +0 -0
  94. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/logconf.py +0 -0
  95. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/__init__.py +0 -0
  96. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/__main__.py +0 -0
  97. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/compiled_sql/__init__.py +0 -0
  98. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/compiled_sql/v1.py +0 -0
  99. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/data_nodes/__init__.py +0 -0
  100. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/data_nodes/build_operations.py +0 -0
  101. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/data_nodes/data_nodes.py +0 -0
  102. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/data_nodes/models.py +0 -0
  103. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/data_nodes/namespacing.py +0 -0
  104. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/data_nodes/persist_managers.py +0 -0
  105. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/data_nodes/run_operations.py +0 -0
  106. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/data_nodes/utils.py +0 -0
  107. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/future_registry.py +0 -0
  108. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/hashing.py +0 -0
  109. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/migrations/__init__.py +0 -0
  110. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/migrations/alembic.py +0 -0
  111. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/migrations/env.py +0 -0
  112. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/migrations/provider.py +0 -0
  113. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/migrations/registry.py +0 -0
  114. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/migrations/scaffold.py +0 -0
  115. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/migrations/templates/__init__.py +0 -0
  116. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/migrations/templates/env.py.mako +0 -0
  117. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/migrations/templates/script.py.mako +0 -0
  118. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/pydantic_metadata.py +0 -0
  119. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/schema_names.py +0 -0
  120. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/meta_tables/sqlalchemy_contracts.py +0 -0
  121. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/runtime_flags.py +0 -0
  122. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence/scaffold_skills.py +0 -0
  123. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence.egg-info/SOURCES.txt +0 -0
  124. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence.egg-info/dependency_links.txt +0 -0
  125. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence.egg-info/entry_points.txt +0 -0
  126. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence.egg-info/requires.txt +0 -0
  127. {mainsequence-4.4.20 → mainsequence-4.4.21}/mainsequence.egg-info/top_level.txt +0 -0
  128. {mainsequence-4.4.20 → mainsequence-4.4.21}/setup.cfg +0 -0
  129. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_auth_precedence.py +0 -0
  130. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_build_operations_hashing.py +0 -0
  131. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_cli_browser_auth.py +0 -0
  132. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_cli_migrations.py +0 -0
  133. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_client.py +0 -0
  134. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_command_center_app_component_models.py +0 -0
  135. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_command_center_data_models.py +0 -0
  136. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_command_center_models.py +0 -0
  137. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_command_center_table_contracts.py +0 -0
  138. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_command_center_tabular_transform.py +0 -0
  139. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_data_access_mixin_dimension_audit.py +0 -0
  140. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_data_node_storage_dimension_queries.py +0 -0
  141. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_data_node_update_flow.py +0 -0
  142. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_dependency_extras.py +0 -0
  143. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_duckdb_interface_dimensions.py +0 -0
  144. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_instrumentation.py +0 -0
  145. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_logconf.py +0 -0
  146. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_meta_table_migrations.py +0 -0
  147. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_meta_tables_client_models.py +0 -0
  148. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_meta_tables_sqlalchemy_contracts.py +0 -0
  149. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_models_user_request_bound_auth.py +0 -0
  150. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_pod_project_resolution.py +0 -0
  151. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_project_batch_jobs_from_file.py +0 -0
  152. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_run_configuration.py +0 -0
  153. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_scaffold_skills.py +0 -0
  154. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_schema_names.py +0 -0
  155. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_secret_client_model.py +0 -0
  156. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_source_table_configuration.py +0 -0
  157. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_sqlite_interface_dimensions.py +0 -0
  158. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_update_runner_uid_runtime.py +0 -0
  159. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_update_statistics.py +0 -0
  160. {mainsequence-4.4.20 → mainsequence-4.4.21}/tests/test_update_uid_guards.py +0 -0
  161. {mainsequence-4.4.20 → mainsequence-4.4.21}/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.20
3
+ Version: 4.4.21
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
@@ -5,8 +5,8 @@ description: Canonical guidance for discovering agents and sending session-scope
5
5
 
6
6
  # A2A Communication
7
7
 
8
- Use this skill when you need to discover another agent or send a bounded A2A
9
- request to an existing target `AgentSession`.
8
+ Use this skill when you need to discover another agent, create or resolve a
9
+ target `AgentSession`, and send a bounded A2A request.
10
10
 
11
11
  ## Canonical CLI Path
12
12
 
@@ -17,7 +17,7 @@ internally and sends a standard A2A message.
17
17
 
18
18
  - When the user asks which agents can help.
19
19
  - When another agent may be better suited to answer or assist.
20
- - Before sending a request to an existing target agent session.
20
+ - Before sending a request to a target agent session.
21
21
  - When a request explicitly arrives through the A2A channel.
22
22
 
23
23
  ## Core Rules
@@ -42,13 +42,40 @@ mainsequence agent search "<discoveryPrompt>" --limit 10 --json
42
42
  4. Treat the CLI output as authoritative.
43
43
  5. Prefer the highest `combined_score` when present.
44
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.
45
+ Include agent name, agent UID, and a short capability summary.
46
46
 
47
47
  ## Target Session
48
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.
49
+ After selecting the target agent, create or resolve a target session:
50
+
51
+ ```bash
52
+ mainsequence agent session get_or_create \
53
+ <target_agent_uid> \
54
+ --handle-unique-id <stable_handle_unique_id> \
55
+ --name "<human_readable_session_name>" \
56
+ --json
57
+ ```
58
+
59
+ Use the returned session `uid` as the target `AgentSession` UID.
60
+
61
+ If this A2A request originates from an existing caller session, include the
62
+ parent session UID:
63
+
64
+ ```bash
65
+ mainsequence agent session get_or_create \
66
+ <target_agent_uid> \
67
+ --handle-unique-id <stable_handle_unique_id> \
68
+ --parent-session-uid <caller_agent_session_uid> \
69
+ --name "<human_readable_session_name>" \
70
+ --json
71
+ ```
72
+
73
+ Handle rules:
74
+
75
+ - Repetitive workflow: use a stable semantic handle, for example `portfolio-review-q2-2026`.
76
+ - One-off delegation: use a fresh task-specific handle, for example `a2a-risk-summary-<uuid>`.
77
+ - Retry of the same session creation step: reuse the same handle.
78
+ - New user turn in the same target session: reuse the returned session UID, not a new handle.
52
79
 
53
80
  ## Send A2A Chat
54
81
 
@@ -93,9 +120,10 @@ mainsequence agent session a2a send \
93
120
  1. Build the discovery prompt.
94
121
  2. Run `mainsequence agent search "<discoveryPrompt>" --limit <n> --json`.
95
122
  3. Select the target agent.
96
- 4. Get the target `AgentSession` UID.
97
- 5. Run `mainsequence agent session a2a send <target_agent_session_uid> ...`.
98
- 6. Parse `message.parts` from the CLI output.
123
+ 4. Create or resolve the target session with `mainsequence agent session get_or_create`.
124
+ 5. Use the returned session `uid`.
125
+ 6. Run `mainsequence agent session a2a send <target_agent_session_uid> ...`.
126
+ 7. Parse `message.parts` from the CLI output.
99
127
 
100
128
  ## Role-Specific Behavior
101
129
 
@@ -1141,59 +1141,40 @@ def delete_agent(
1141
1141
  raise ApiError(f"Agent deletion failed: {e}") from e
1142
1142
 
1143
1143
 
1144
- def allocate_agent_a2a_target_session(
1144
+ def get_or_create_agent_session(
1145
1145
  agent_uid: str,
1146
1146
  *,
1147
- caller_agent_session_uid: str,
1147
+ session_uid: str | None = None,
1148
1148
  handle_unique_id: str | None = None,
1149
+ name: str | None = None,
1150
+ parent_session_uid: str | None = None,
1151
+ llm_provider: str | None = None,
1152
+ llm_model: str | None = None,
1153
+ llm_thinking: str | None = None,
1149
1154
  timeout: int | None = None,
1150
1155
  ) -> dict[str, Any]:
1151
1156
  """
1152
- Allocate or reuse the delegated A2A target session for one agent via SDK client model.
1157
+ Get an existing session by UID, or get/create one by handle via SDK client model.
1153
1158
  """
1154
1159
  try:
1155
1160
 
1156
- def _allocate(ClientAgent):
1161
+ def _get_or_create(ClientAgent):
1157
1162
  agent = ClientAgent.get_by_uid(str(agent_uid), timeout=timeout)
1158
- return agent.allocate_a2a_target_session(
1159
- caller_agent_session_uid=str(caller_agent_session_uid),
1163
+ return agent.get_or_create_session(
1164
+ session_uid=session_uid,
1160
1165
  handle_unique_id=handle_unique_id,
1166
+ name=name,
1167
+ parent_session_uid=parent_session_uid,
1168
+ llm_provider=llm_provider,
1169
+ llm_model=llm_model,
1170
+ llm_thinking=llm_thinking,
1161
1171
  timeout=timeout,
1162
1172
  )
1163
1173
 
1164
- payload = _run_sdk_model_operation(
1165
- module_name="mainsequence.client.agent_runtime_models",
1166
- class_name="Agent",
1167
- operation=_allocate,
1168
- )
1169
- return _sdk_object_to_dict(payload)
1170
- except Exception as e:
1171
- err_name = type(e).__name__
1172
- if err_name == "NotFoundError":
1173
- raise ApiError(f"Agent not found: {agent_uid}") from e
1174
- if isinstance(e, (ApiError, NotLoggedIn)):
1175
- raise
1176
- raise ApiError(f"Agent A2A target session allocation failed: {e}") from e
1177
-
1178
-
1179
- def get_agent_latest_session(
1180
- agent_uid: str,
1181
- *,
1182
- timeout: int | None = None,
1183
- ) -> dict[str, Any]:
1184
- """
1185
- Retrieve the latest session for one agent via SDK client model.
1186
- """
1187
- try:
1188
-
1189
- def _get_latest(ClientAgent):
1190
- agent = ClientAgent.get_by_uid(str(agent_uid), timeout=timeout)
1191
- return agent.get_latest_session(timeout=timeout)
1192
-
1193
1174
  session = _run_sdk_model_operation(
1194
1175
  module_name="mainsequence.client.agent_runtime_models",
1195
1176
  class_name="Agent",
1196
- operation=_get_latest,
1177
+ operation=_get_or_create,
1197
1178
  )
1198
1179
  return _sdk_object_to_dict(session)
1199
1180
  except Exception as e:
@@ -1202,7 +1183,7 @@ def get_agent_latest_session(
1202
1183
  raise ApiError(f"Agent not found: {agent_uid}") from e
1203
1184
  if isinstance(e, (ApiError, NotLoggedIn)):
1204
1185
  raise
1205
- raise ApiError(f"Agent latest session fetch failed: {e}") from e
1186
+ raise ApiError(f"Agent session get-or-create failed: {e}") from e
1206
1187
 
1207
1188
 
1208
1189
  def list_agent_sessions(
@@ -83,7 +83,6 @@ from .api import (
83
83
  add_team_user_to_edit,
84
84
  add_team_user_to_view,
85
85
  add_workspace_labels,
86
- allocate_agent_a2a_target_session,
87
86
  create_adapter_from_api_connection,
88
87
  create_agent,
89
88
  create_constant,
@@ -108,7 +107,6 @@ from .api import (
108
107
  delete_secret,
109
108
  delete_workspace,
110
109
  get_agent,
111
- get_agent_latest_session,
112
110
  get_agent_run,
113
111
  get_agent_session,
114
112
  get_connection_instance,
@@ -118,6 +116,7 @@ from .api import (
118
116
  get_data_node_storage,
119
117
  get_logged_user_details,
120
118
  get_meta_table,
119
+ get_or_create_agent_session,
121
120
  get_organization_team,
122
121
  get_project,
123
122
  get_project_data_node_updates,
@@ -3543,12 +3542,6 @@ def _format_agent_run_details(agent_run_payload: dict[str, object]) -> list[tupl
3543
3542
  ]
3544
3543
 
3545
3544
 
3546
- def _format_agent_session_ref_label(session_ref: object) -> str:
3547
- if isinstance(session_ref, dict):
3548
- return str(session_ref.get("uid") or "-")
3549
- return str(session_ref or "-")
3550
-
3551
-
3552
3545
  def _format_agent_session_preview(
3553
3546
  agent_session_payload: dict[str, object],
3554
3547
  ) -> list[tuple[str, str]]:
@@ -3583,18 +3576,7 @@ def _format_agent_session_details(
3583
3576
  ),
3584
3577
  ("Usage Summary", _format_json_value(agent_session_payload.get("usage_summary"))),
3585
3578
  ("Session Metadata", _format_json_value(agent_session_payload.get("session_metadata"))),
3586
- ]
3587
-
3588
-
3589
- def _format_agent_a2a_allocation_preview(
3590
- allocation_payload: dict[str, object],
3591
- ) -> list[tuple[str, str]]:
3592
- session_payload = allocation_payload.get("session")
3593
- return [
3594
- ("Handle Unique ID", str(allocation_payload.get("handle_unique_id") or "-")),
3595
- ("Agent Session UID", str(allocation_payload.get("agent_session_uid") or "-")),
3596
- ("Allocation State", str(allocation_payload.get("allocation_state") or "-")),
3597
- ("Session", _format_agent_session_ref_label(session_payload)),
3579
+ ("Bound Handle", _format_json_value(agent_session_payload.get("bound_handle"))),
3598
3580
  ]
3599
3581
 
3600
3582
 
@@ -3833,59 +3815,6 @@ def _agent_delete_impl(
3833
3815
  print_kv("Deleted Agent", _format_agent_preview(deleted))
3834
3816
 
3835
3817
 
3836
- def _agent_allocate_a2a_target_session_impl(
3837
- *,
3838
- agent_uid: str,
3839
- caller_agent_session_uid: str,
3840
- handle_unique_id: str | None,
3841
- timeout: int | None,
3842
- ) -> None:
3843
- _require_login()
3844
-
3845
- try:
3846
- allocation_payload = allocate_agent_a2a_target_session(
3847
- agent_uid,
3848
- caller_agent_session_uid=caller_agent_session_uid,
3849
- handle_unique_id=handle_unique_id,
3850
- timeout=timeout,
3851
- )
3852
- except ApiError as e:
3853
- error(f"Agent A2A target session allocation failed: {e}")
3854
- raise typer.Exit(1) from e
3855
-
3856
- if _emit_json(allocation_payload):
3857
- return
3858
-
3859
- success(f"Agent A2A target session allocated: agent_uid={agent_uid}")
3860
- print_kv(
3861
- "A2A Target Session Allocation", _format_agent_a2a_allocation_preview(allocation_payload)
3862
- )
3863
- session_payload = allocation_payload.get("session")
3864
- if isinstance(session_payload, dict):
3865
- print_kv("Agent Session", _format_agent_session_preview(session_payload))
3866
- print_kv("Agent Session Details", _format_agent_session_details(session_payload))
3867
-
3868
-
3869
- def _agent_get_latest_session_impl(
3870
- *,
3871
- agent_uid: str,
3872
- timeout: int | None,
3873
- ) -> None:
3874
- _require_login()
3875
-
3876
- try:
3877
- agent_session_payload = get_agent_latest_session(agent_uid, timeout=timeout)
3878
- except ApiError as e:
3879
- error(f"Agent latest session fetch failed: {e}")
3880
- raise typer.Exit(1) from e
3881
-
3882
- if _emit_json(agent_session_payload):
3883
- return
3884
-
3885
- print_kv("Agent Session", _format_agent_session_preview(agent_session_payload))
3886
- print_kv("Agent Session Details", _format_agent_session_details(agent_session_payload))
3887
-
3888
-
3889
3818
  def _extract_standard_a2a_message_text(payload: dict[str, object]) -> str:
3890
3819
  response_message = payload.get("message")
3891
3820
  if not isinstance(response_message, dict):
@@ -3950,6 +3879,64 @@ def _agent_session_a2a_send_impl(
3950
3879
  typer.echo(json.dumps(response_payload, indent=2))
3951
3880
 
3952
3881
 
3882
+ def _agent_session_get_or_create_impl(
3883
+ *,
3884
+ agent_uid: str,
3885
+ session_uid: str | None,
3886
+ handle_unique_id: str | None,
3887
+ name: str | None,
3888
+ parent_session_uid: str | None,
3889
+ llm_provider: str | None,
3890
+ llm_model: str | None,
3891
+ llm_thinking: str | None,
3892
+ timeout: int | None,
3893
+ ) -> None:
3894
+ resolved_session_uid = str(session_uid or "").strip() if session_uid is not None else ""
3895
+ resolved_handle_unique_id = (
3896
+ str(handle_unique_id or "").strip() if handle_unique_id is not None else ""
3897
+ )
3898
+ if bool(resolved_session_uid) == bool(resolved_handle_unique_id):
3899
+ error("Provide exactly one of --session-uid or --handle-unique-id.")
3900
+ raise typer.Exit(1)
3901
+
3902
+ creation_options = {
3903
+ "--name": name,
3904
+ "--parent-session-uid": parent_session_uid,
3905
+ "--llm-provider": llm_provider,
3906
+ "--llm-model": llm_model,
3907
+ "--llm-thinking": llm_thinking,
3908
+ }
3909
+ if resolved_session_uid and any(value is not None for value in creation_options.values()):
3910
+ provided = ", ".join(key for key, value in creation_options.items() if value is not None)
3911
+ error(f"Creation options require --handle-unique-id, not --session-uid: {provided}.")
3912
+ raise typer.Exit(1)
3913
+
3914
+ _require_login()
3915
+
3916
+ try:
3917
+ agent_session_payload = get_or_create_agent_session(
3918
+ agent_uid,
3919
+ session_uid=resolved_session_uid or None,
3920
+ handle_unique_id=resolved_handle_unique_id or None,
3921
+ name=name,
3922
+ parent_session_uid=parent_session_uid,
3923
+ llm_provider=llm_provider,
3924
+ llm_model=llm_model,
3925
+ llm_thinking=llm_thinking,
3926
+ timeout=timeout,
3927
+ )
3928
+ except ApiError as e:
3929
+ error(f"Agent session get-or-create failed: {e}")
3930
+ raise typer.Exit(1) from e
3931
+
3932
+ if _emit_json(agent_session_payload):
3933
+ return
3934
+
3935
+ success(f"Agent session resolved: uid={agent_session_payload.get('uid') or '-'}")
3936
+ print_kv("Agent Session", _format_agent_session_preview(agent_session_payload))
3937
+ print_kv("Agent Session Details", _format_agent_session_details(agent_session_payload))
3938
+
3939
+
3953
3940
  def _agent_session_list_impl(
3954
3941
  *,
3955
3942
  agent_uid: str | None,
@@ -6580,105 +6567,111 @@ def agent_delete_cmd(
6580
6567
  _agent_delete_impl(agent_uid=agent_uid, timeout=timeout)
6581
6568
 
6582
6569
 
6583
- @agent.command("allocate_a2a_target_session")
6584
- def agent_allocate_a2a_target_session_cmd(
6585
- agent_uid: str = pydantic_argument(
6586
- AGENT_MODEL_REF,
6587
- "uid",
6588
- ...,
6589
- help="Agent UID.",
6590
- ),
6591
- caller_agent_session_uid: str = pydantic_argument(
6570
+ @agent_session_group.command("list")
6571
+ def agent_session_list_cmd(
6572
+ agent_uid: str | None = pydantic_option(
6592
6573
  AGENT_SESSION_MODEL_REF,
6593
- "uid",
6594
- ...,
6595
- help="Caller agent session UID.",
6596
- ),
6597
- handle_unique_id: str | None = typer.Option(
6574
+ "agent_uid",
6598
6575
  None,
6599
- "--handle-unique-id",
6600
- help="Optional delegated-session handle to reuse an existing target session on retries.",
6576
+ "--agent-uid",
6577
+ help="Agent UID to scope the session list.",
6578
+ ),
6579
+ filter_entries: list[str] | None = typer.Option(None, "--filter", help=LIST_FILTER_OPTION_HELP),
6580
+ show_filters: bool = typer.Option(
6581
+ False, "--show-filters", help="Show the filters supported by this list command and exit."
6601
6582
  ),
6602
6583
  timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
6603
6584
  ):
6604
6585
  """
6605
- Allocate or reuse the delegated A2A target session for one agent.
6586
+ List agent sessions, optionally scoped to one agent.
6606
6587
 
6607
- Uses SDK client `Agent.allocate_a2a_target_session()` as the single source of truth.
6588
+ Uses SDK client `AgentSession.filter()` as the single source of truth.
6608
6589
 
6609
6590
  Examples
6610
6591
  --------
6611
6592
  ```bash
6612
- mainsequence agent allocate_a2a_target_session e0e75693-4110-464c-93e0-82c7fd9c9a23 3f1cc452-43ec-49cb-b2ba-87dbac164d29
6613
- mainsequence agent allocate_a2a_target_session e0e75693-4110-464c-93e0-82c7fd9c9a23 3f1cc452-43ec-49cb-b2ba-87dbac164d29 --handle-unique-id delegated-handle-1 --timeout 60
6593
+ mainsequence agent session list
6594
+ mainsequence agent session list --agent-uid e0e75693-4110-464c-93e0-82c7fd9c9a23
6595
+ mainsequence agent session list --agent-uid e0e75693-4110-464c-93e0-82c7fd9c9a23 --filter status=running
6614
6596
  ```
6615
6597
  """
6616
- _agent_allocate_a2a_target_session_impl(
6598
+ _agent_session_list_impl(
6617
6599
  agent_uid=agent_uid,
6618
- caller_agent_session_uid=caller_agent_session_uid,
6619
- handle_unique_id=handle_unique_id,
6620
6600
  timeout=timeout,
6601
+ filter_entries=filter_entries,
6602
+ show_filters=show_filters,
6621
6603
  )
6622
6604
 
6623
6605
 
6624
- @agent.command("get_latest_session")
6625
- def agent_get_latest_session_cmd(
6606
+ @agent_session_group.command("get_or_create")
6607
+ def agent_session_get_or_create_cmd(
6626
6608
  agent_uid: str = pydantic_argument(
6627
6609
  AGENT_MODEL_REF,
6628
6610
  "uid",
6629
6611
  ...,
6630
6612
  help="Agent UID.",
6631
6613
  ),
6632
- timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
6633
- ):
6634
- """
6635
- Retrieve the latest session recorded for one agent.
6636
-
6637
- Uses SDK client `Agent.get_latest_session()` as the single source of truth.
6638
-
6639
- Examples
6640
- --------
6641
- ```bash
6642
- mainsequence agent get_latest_session e0e75693-4110-464c-93e0-82c7fd9c9a23
6643
- mainsequence agent get_latest_session e0e75693-4110-464c-93e0-82c7fd9c9a23 --timeout 60
6644
- ```
6645
- """
6646
- _agent_get_latest_session_impl(agent_uid=agent_uid, timeout=timeout)
6647
-
6648
-
6649
- @agent_session_group.command("list")
6650
- def agent_session_list_cmd(
6651
- agent_uid: str | None = pydantic_option(
6614
+ session_uid: str | None = pydantic_option(
6652
6615
  AGENT_SESSION_MODEL_REF,
6653
- "agent_uid",
6616
+ "uid",
6654
6617
  None,
6655
- "--agent-uid",
6656
- help="Agent UID to scope the session list.",
6618
+ "--session-uid",
6619
+ help="Existing agent session UID to resolve for this agent.",
6657
6620
  ),
6658
- filter_entries: list[str] | None = typer.Option(None, "--filter", help=LIST_FILTER_OPTION_HELP),
6659
- show_filters: bool = typer.Option(
6660
- False, "--show-filters", help="Show the filters supported by this list command and exit."
6621
+ handle_unique_id: str | None = typer.Option(
6622
+ None,
6623
+ "--handle-unique-id",
6624
+ help="Reusable session handle key to get or create a session.",
6625
+ ),
6626
+ name: str | None = typer.Option(
6627
+ None,
6628
+ "--name",
6629
+ help="Human-readable session display name used when creating a handle-backed session.",
6630
+ ),
6631
+ parent_session_uid: str | None = typer.Option(
6632
+ None,
6633
+ "--parent-session-uid",
6634
+ help="Parent or origin agent session UID used when creating a handle-backed session.",
6635
+ ),
6636
+ llm_provider: str | None = typer.Option(
6637
+ None,
6638
+ "--llm-provider",
6639
+ help="Session LLM provider override used when creating a handle-backed session.",
6640
+ ),
6641
+ llm_model: str | None = typer.Option(
6642
+ None,
6643
+ "--llm-model",
6644
+ help="Session LLM model override used when creating a handle-backed session.",
6645
+ ),
6646
+ llm_thinking: str | None = typer.Option(
6647
+ None,
6648
+ "--llm-thinking",
6649
+ help="Session thinking/reasoning override used when creating a handle-backed session.",
6661
6650
  ),
6662
6651
  timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
6663
6652
  ):
6664
6653
  """
6665
- List agent sessions, optionally scoped to one agent.
6654
+ Get an existing agent session by UID, or get/create one by handle.
6666
6655
 
6667
- Uses SDK client `AgentSession.filter()` as the single source of truth.
6656
+ Sends exactly one lookup key to the backend: `session_uid` or `handle_unique_id`.
6668
6657
 
6669
6658
  Examples
6670
6659
  --------
6671
6660
  ```bash
6672
- mainsequence agent session list
6673
- mainsequence agent session list --agent-uid e0e75693-4110-464c-93e0-82c7fd9c9a23
6674
- mainsequence agent session list --agent-uid e0e75693-4110-464c-93e0-82c7fd9c9a23 --filter status=running
6661
+ mainsequence agent session get_or_create e0e75693-4110-464c-93e0-82c7fd9c9a23 --session-uid 3f1cc452-43ec-49cb-b2ba-87dbac164d29
6662
+ mainsequence agent session get_or_create e0e75693-4110-464c-93e0-82c7fd9c9a23 --handle-unique-id portfolio-review-q2-2026 --name "Quarterly portfolio review"
6675
6663
  ```
6676
6664
  """
6677
- _agent_session_list_impl(
6665
+ _agent_session_get_or_create_impl(
6678
6666
  agent_uid=agent_uid,
6667
+ session_uid=session_uid,
6668
+ handle_unique_id=handle_unique_id,
6669
+ name=name,
6670
+ parent_session_uid=parent_session_uid,
6671
+ llm_provider=llm_provider,
6672
+ llm_model=llm_model,
6673
+ llm_thinking=llm_thinking,
6679
6674
  timeout=timeout,
6680
- filter_entries=filter_entries,
6681
- show_filters=show_filters,
6682
6675
  )
6683
6676
 
6684
6677