mainsequence 3.18.24__tar.gz → 3.19.2__tar.gz

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