mainsequence 3.19.8__tar.gz → 3.19.10__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 (186) hide show
  1. {mainsequence-3.19.8 → mainsequence-3.19.10}/PKG-INFO +1 -1
  2. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/a2a_communication/SKILL.md +19 -6
  3. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/cli/api.py +14 -8
  4. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/cli/cli.py +51 -15
  5. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/agent_runtime_models.py +69 -13
  6. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/models_user.py +6 -1
  7. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence.egg-info/PKG-INFO +1 -1
  8. {mainsequence-3.19.8 → mainsequence-3.19.10}/pyproject.toml +1 -1
  9. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_cli.py +59 -22
  10. {mainsequence-3.19.8 → mainsequence-3.19.10}/LICENSE +0 -0
  11. {mainsequence-3.19.8 → mainsequence-3.19.10}/README.md +0 -0
  12. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/AGENTS.md +0 -0
  13. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  14. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
  15. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  16. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
  17. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  18. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  19. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  20. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  21. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  22. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  23. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  24. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/data_publishing/simple_tables/SKILL.md +0 -0
  25. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  26. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/maintenance/local_journal/SKILL.md +0 -0
  27. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/markets_platform/assets_and_translation/SKILL.md +0 -0
  28. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/markets_platform/instruments_and_pricing/SKILL.md +0 -0
  29. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/markets_platform/virtualfundbuilder/SKILL.md +0 -0
  30. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  31. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  32. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  33. {mainsequence-3.19.8 → mainsequence-3.19.10}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  34. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/__init__.py +0 -0
  35. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/__main__.py +0 -0
  36. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/bootstrap.py +0 -0
  37. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/cli/__init__.py +0 -0
  38. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/cli/browser_auth.py +0 -0
  39. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/cli/config.py +0 -0
  40. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/cli/docker_utils.py +0 -0
  41. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/cli/doctor.py +0 -0
  42. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/cli/local_ops.py +0 -0
  43. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/cli/model_filters.py +0 -0
  44. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/cli/project_status.py +0 -0
  45. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/cli/pydantic_cli.py +0 -0
  46. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/cli/sdk_utils.py +0 -0
  47. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/cli/ssh_utils.py +0 -0
  48. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/cli/ui.py +0 -0
  49. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/__init__.py +0 -0
  50. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/base.py +0 -0
  51. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/client.py +0 -0
  52. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/command_center/__init__.py +0 -0
  53. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/command_center/app_component.py +0 -0
  54. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/command_center/connections.py +0 -0
  55. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/command_center/data_models.py +0 -0
  56. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/command_center/workspace.py +0 -0
  57. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  58. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  59. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  60. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/data_sources_interfaces/timescale.py +0 -0
  61. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/exceptions.py +0 -0
  62. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/fastapi/__init__.py +0 -0
  63. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/fastapi/auth.py +0 -0
  64. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/models_helpers.py +0 -0
  65. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/models_simple_tables.py +0 -0
  66. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/models_tdag.py +0 -0
  67. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/models_vam.py +0 -0
  68. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/client/utils.py +0 -0
  69. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/compute_validation.py +0 -0
  70. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/__init__.py +0 -0
  71. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/__init__.py +0 -0
  72. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/assets/config.toml +0 -0
  73. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/assets/favicon.png +0 -0
  74. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/assets/image_1_base64.txt +0 -0
  75. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/assets/image_2_base64.txt +0 -0
  76. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/assets/image_3_base64.txt +0 -0
  77. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/assets/image_4_base64.txt +0 -0
  78. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/assets/image_5_base64.txt +0 -0
  79. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/assets/logo.png +0 -0
  80. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/components/__init__.py +0 -0
  81. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/components/asset_select.py +0 -0
  82. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/components/date_settings.py +0 -0
  83. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/components/logged_user.py +0 -0
  84. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/core/__init__.py +0 -0
  85. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/core/theme.py +0 -0
  86. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/instruments/__init__.py +0 -0
  87. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/instruments/streamlit_form_factory.py +0 -0
  88. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/pages/__init__.py +0 -0
  89. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/dashboards/streamlit/scaffold.py +0 -0
  90. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/defaults.py +0 -0
  91. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instrumentation/__init__.py +0 -0
  92. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instrumentation/utils.py +0 -0
  93. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/__init__.py +0 -0
  94. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/data_interface/__init__.py +0 -0
  95. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/data_interface/data_interface.py +0 -0
  96. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/instruments/__init__.py +0 -0
  97. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/instruments/base_instrument.py +0 -0
  98. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/instruments/bond.py +0 -0
  99. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/instruments/callability.py +0 -0
  100. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/instruments/interest_rate_swap.py +0 -0
  101. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/instruments/json_codec.py +0 -0
  102. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/instruments/position.py +0 -0
  103. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/instruments/ql_fields.py +0 -0
  104. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/interest_rates/__init__.py +0 -0
  105. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/interest_rates/etl/__init__.py +0 -0
  106. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/interest_rates/etl/curve_codec.py +0 -0
  107. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/interest_rates/etl/nodes.py +0 -0
  108. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/interest_rates/etl/registry.py +0 -0
  109. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/pricing_models/__init__.py +0 -0
  110. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/pricing_models/bond_pricer.py +0 -0
  111. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/pricing_models/indices.py +0 -0
  112. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/pricing_models/indices_builders.py +0 -0
  113. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/pricing_models/swap_pricer.py +0 -0
  114. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/settings.py +0 -0
  115. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/instruments/utils.py +0 -0
  116. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/logconf.py +0 -0
  117. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/runtime_flags.py +0 -0
  118. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/__init__.py +0 -0
  119. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/__main__.py +0 -0
  120. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/base_persist_managers.py +0 -0
  121. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/config.py +0 -0
  122. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/configuration_models.py +0 -0
  123. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/data_nodes/__init__.py +0 -0
  124. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/data_nodes/build_operations.py +0 -0
  125. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/data_nodes/data_nodes.py +0 -0
  126. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/data_nodes/filters.py +0 -0
  127. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/data_nodes/models.py +0 -0
  128. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/data_nodes/namespacing.py +0 -0
  129. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/data_nodes/persist_managers.py +0 -0
  130. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/data_nodes/run_operations.py +0 -0
  131. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/data_nodes/utils.py +0 -0
  132. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/filters.py +0 -0
  133. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/future_registry.py +0 -0
  134. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/pydantic_metadata.py +0 -0
  135. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/simple_tables/__init__.py +0 -0
  136. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/simple_tables/filters.py +0 -0
  137. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/simple_tables/models.py +0 -0
  138. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/simple_tables/persist_managers.py +0 -0
  139. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/simple_tables/schema.py +0 -0
  140. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/simple_tables/table_nodes.py +0 -0
  141. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/tdag/utils.py +0 -0
  142. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/__init__.py +0 -0
  143. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/contrib/__init__.py +0 -0
  144. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/contrib/data_nodes/__init__.py +0 -0
  145. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/contrib/data_nodes/external_weights.py +0 -0
  146. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/contrib/data_nodes/intraday_trend.py +0 -0
  147. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/contrib/data_nodes/market_cap.py +0 -0
  148. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/contrib/data_nodes/mock_signal.py +0 -0
  149. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/contrib/data_nodes/portfolio_replicator.py +0 -0
  150. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/contrib/prices/__init__.py +0 -0
  151. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py +0 -0
  152. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/contrib/prices/utils.py +0 -0
  153. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/__init__.py +0 -0
  154. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/rebalance_strategies.py +0 -0
  155. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/enums.py +0 -0
  156. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/models.py +0 -0
  157. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/portfolio_nodes.py +0 -0
  158. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/resource_factory/__init__.py +0 -0
  159. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/resource_factory/rebalance_factory.py +0 -0
  160. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/resource_factory/signal_factory.py +0 -0
  161. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence/virtualfundbuilder/utils.py +0 -0
  162. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence.egg-info/SOURCES.txt +0 -0
  163. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence.egg-info/dependency_links.txt +0 -0
  164. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence.egg-info/entry_points.txt +0 -0
  165. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence.egg-info/requires.txt +0 -0
  166. {mainsequence-3.19.8 → mainsequence-3.19.10}/mainsequence.egg-info/top_level.txt +0 -0
  167. {mainsequence-3.19.8 → mainsequence-3.19.10}/setup.cfg +0 -0
  168. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_auth_precedence.py +0 -0
  169. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_build_operations_hashing.py +0 -0
  170. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_cli_browser_auth.py +0 -0
  171. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_client.py +0 -0
  172. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_command_center_app_component_models.py +0 -0
  173. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_command_center_data_models.py +0 -0
  174. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_command_center_models.py +0 -0
  175. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_dependency_extras.py +0 -0
  176. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_filter_normalization.py +0 -0
  177. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_instruments.py +0 -0
  178. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_logconf.py +0 -0
  179. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_logged_user_components.py +0 -0
  180. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_models_user_request_bound_auth.py +0 -0
  181. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_pod_project_resolution.py +0 -0
  182. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_project_batch_jobs_from_file.py +0 -0
  183. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_run_configuration.py +0 -0
  184. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_simple_tables_configuration_hashing.py +0 -0
  185. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_simple_tables_persistence.py +0 -0
  186. {mainsequence-3.19.8 → mainsequence-3.19.10}/tests/test_workspace_snapshot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 3.19.8
3
+ Version: 3.19.10
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
@@ -56,12 +56,24 @@ mainsequence agent search "<discoveryPrompt>" --limit 10 --json
56
56
  - optional agent hint
57
57
  - required response format or output schema if needed
58
58
  4. Discover and select the target agent through the discovery flow above.
59
- 5. Start a backend session for the selected agent:
59
+ 5. Start or reuse the delegated backend session for the selected agent:
60
60
 
61
61
  ```bash
62
- mainsequence agent start_new_session <agent_id>
62
+ mainsequence agent allocate_a2a_target_session <agent_id>
63
63
  ```
64
64
 
65
+ 5.1 Treat the allocation response as canonical. Persist both:
66
+ - `handle_unique_id`
67
+ - `agent_session_id`
68
+
69
+ 5.2 `handle_unique_id` is the stable delegated-conversation reuse key and must be kept.
70
+ - If the delegated conversation is new, call `allocate_a2a_target_session` without a handle.
71
+ - The backend will generate and return a new `handle_unique_id`; persist it immediately.
72
+ - If you retry because of timeout, disconnect, health-check delay, stream restart, or runtime error recovery, call `allocate_a2a_target_session` again with that same `handle_unique_id`.
73
+ - Reusing the same handle tells the backend to return the same delegated `AgentSession` instead of allocating a sibling session for the same work.
74
+ - Do not drop, replace, or regenerate the handle while the delegated conversation is still the same.
75
+ - Allocate a fresh handle only when you intentionally want a new delegated conversation.
76
+
65
77
  6. Resolve runtime access for that agent session:
66
78
 
67
79
  ```bash
@@ -110,10 +122,11 @@ the exact CLI and runtime requests below.
110
122
  3. Parse the JSON output.
111
123
  4. Normalize candidates.
112
124
  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`.
125
+ 6. Allocate or reuse the delegated backend session for the target agent.
126
+ 7. Persist and reuse the returned `handle_unique_id` for the same delegated conversation.
127
+ 8. Resolve runtime access.
128
+ 9. Poll runtime health.
129
+ 10. Send `POST <rpc_url>/api/a2a/chat`.
117
130
 
118
131
  ## Role-specific behavior
119
132
 
@@ -988,32 +988,38 @@ def delete_agent(
988
988
  raise ApiError(f"Agent deletion failed: {e}") from e
989
989
 
990
990
 
991
- def start_agent_new_session(
991
+ def allocate_agent_a2a_target_session(
992
992
  agent_id: int | str,
993
993
  *,
994
+ caller_agent_session_id: int | str,
995
+ handle_unique_id: str | None = None,
994
996
  timeout: int | None = None,
995
997
  ) -> dict[str, Any]:
996
998
  """
997
- Start a new session for one agent via SDK client model.
999
+ Allocate or reuse the delegated A2A target session for one agent via SDK client model.
998
1000
  """
999
1001
  try:
1000
- def _start(ClientAgent):
1002
+ def _allocate(ClientAgent):
1001
1003
  agent = ClientAgent.get(pk=int(agent_id), timeout=timeout)
1002
- return agent.start_new_session(timeout=timeout)
1004
+ return agent.allocate_a2a_target_session(
1005
+ caller_agent_session_id=int(caller_agent_session_id),
1006
+ handle_unique_id=handle_unique_id,
1007
+ timeout=timeout,
1008
+ )
1003
1009
 
1004
- session = _run_sdk_model_operation(
1010
+ payload = _run_sdk_model_operation(
1005
1011
  module_name="mainsequence.client.agent_runtime_models",
1006
1012
  class_name="Agent",
1007
- operation=_start,
1013
+ operation=_allocate,
1008
1014
  )
1009
- return _sdk_object_to_dict(session)
1015
+ return _sdk_object_to_dict(payload)
1010
1016
  except Exception as e:
1011
1017
  err_name = type(e).__name__
1012
1018
  if err_name == "NotFoundError":
1013
1019
  raise ApiError(f"Agent not found: {agent_id}") from e
1014
1020
  if isinstance(e, (ApiError, NotLoggedIn)):
1015
1021
  raise
1016
- raise ApiError(f"Agent session start failed: {e}") from e
1022
+ raise ApiError(f"Agent A2A target session allocation failed: {e}") from e
1017
1023
 
1018
1024
 
1019
1025
  def get_agent_latest_session(
@@ -77,6 +77,7 @@ from .api import (
77
77
  add_team_user_to_edit,
78
78
  add_team_user_to_view,
79
79
  add_workspace_labels,
80
+ allocate_agent_a2a_target_session,
80
81
  create_agent,
81
82
  create_constant,
82
83
  create_organization_team,
@@ -191,7 +192,6 @@ from .api import (
191
192
  schedule_batch_project_jobs,
192
193
  search_projects,
193
194
  semantic_search_agents,
194
- start_agent_new_session,
195
195
  sync_project_after_commit,
196
196
  update_organization_team,
197
197
  update_workspace,
@@ -3458,6 +3458,16 @@ def _format_agent_session_details(agent_session_payload: dict[str, object]) -> l
3458
3458
  ]
3459
3459
 
3460
3460
 
3461
+ def _format_agent_a2a_allocation_preview(allocation_payload: dict[str, object]) -> list[tuple[str, str]]:
3462
+ session_payload = allocation_payload.get("session")
3463
+ return [
3464
+ ("Handle Unique ID", str(allocation_payload.get("handle_unique_id") or "-")),
3465
+ ("Agent Session ID", str(allocation_payload.get("agent_session_id") or "-")),
3466
+ ("Allocation State", str(allocation_payload.get("allocation_state") or "-")),
3467
+ ("Session", _format_agent_session_ref_label(session_payload)),
3468
+ ]
3469
+
3470
+
3461
3471
  def _agent_list_impl(
3462
3472
  timeout: int | None,
3463
3473
  filter_entries: list[str] | None,
@@ -3751,25 +3761,35 @@ def _agent_delete_impl(
3751
3761
  print_kv("Deleted Agent", _format_agent_preview(deleted))
3752
3762
 
3753
3763
 
3754
- def _agent_start_new_session_impl(
3764
+ def _agent_allocate_a2a_target_session_impl(
3755
3765
  *,
3756
3766
  agent_id: int,
3767
+ caller_agent_session_id: int,
3768
+ handle_unique_id: str | None,
3757
3769
  timeout: int | None,
3758
3770
  ) -> None:
3759
3771
  _require_login()
3760
3772
 
3761
3773
  try:
3762
- agent_session_payload = start_agent_new_session(agent_id, timeout=timeout)
3774
+ allocation_payload = allocate_agent_a2a_target_session(
3775
+ agent_id,
3776
+ caller_agent_session_id=caller_agent_session_id,
3777
+ handle_unique_id=handle_unique_id,
3778
+ timeout=timeout,
3779
+ )
3763
3780
  except ApiError as e:
3764
- error(f"Agent session start failed: {e}")
3781
+ error(f"Agent A2A target session allocation failed: {e}")
3765
3782
  raise typer.Exit(1) from e
3766
3783
 
3767
- if _emit_json(agent_session_payload):
3784
+ if _emit_json(allocation_payload):
3768
3785
  return
3769
3786
 
3770
- success(f"Agent session started: agent_id={agent_id}")
3771
- print_kv("Agent Session", _format_agent_session_preview(agent_session_payload))
3772
- print_kv("Agent Session Details", _format_agent_session_details(agent_session_payload))
3787
+ success(f"Agent A2A target session allocated: agent_id={agent_id}")
3788
+ print_kv("A2A Target Session Allocation", _format_agent_a2a_allocation_preview(allocation_payload))
3789
+ session_payload = allocation_payload.get("session")
3790
+ if isinstance(session_payload, dict):
3791
+ print_kv("Agent Session", _format_agent_session_preview(session_payload))
3792
+ print_kv("Agent Session Details", _format_agent_session_details(session_payload))
3773
3793
 
3774
3794
 
3775
3795
  def _agent_get_latest_session_impl(
@@ -5876,24 +5896,40 @@ def agent_delete_cmd(
5876
5896
  _agent_delete_impl(agent_id=agent_id, timeout=timeout)
5877
5897
 
5878
5898
 
5879
- @agent.command("start_new_session")
5880
- def agent_start_new_session_cmd(
5899
+ @agent.command("allocate_a2a_target_session")
5900
+ def agent_allocate_a2a_target_session_cmd(
5881
5901
  agent_id: int = pydantic_argument(AGENT_MODEL_REF, "id", ..., help="Agent ID."),
5902
+ caller_agent_session_id: int = pydantic_argument(
5903
+ AGENT_SESSION_MODEL_REF,
5904
+ "id",
5905
+ ...,
5906
+ help="Caller agent session ID.",
5907
+ ),
5908
+ handle_unique_id: str | None = typer.Option(
5909
+ None,
5910
+ "--handle-unique-id",
5911
+ help="Optional delegated-session handle to reuse an existing target session on retries.",
5912
+ ),
5882
5913
  timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
5883
5914
  ):
5884
5915
  """
5885
- Start a new session for one agent and return the created agent session.
5916
+ Allocate or reuse the delegated A2A target session for one agent.
5886
5917
 
5887
- Uses SDK client `Agent.start_new_session()` as the single source of truth.
5918
+ Uses SDK client `Agent.allocate_a2a_target_session()` as the single source of truth.
5888
5919
 
5889
5920
  Examples
5890
5921
  --------
5891
5922
  ```bash
5892
- mainsequence agent start_new_session 12
5893
- mainsequence agent start_new_session 12 --timeout 60
5923
+ mainsequence agent allocate_a2a_target_session 12 801
5924
+ mainsequence agent allocate_a2a_target_session 12 801 --handle-unique-id delegated-handle-1 --timeout 60
5894
5925
  ```
5895
5926
  """
5896
- _agent_start_new_session_impl(agent_id=agent_id, timeout=timeout)
5927
+ _agent_allocate_a2a_target_session_impl(
5928
+ agent_id=agent_id,
5929
+ caller_agent_session_id=caller_agent_session_id,
5930
+ handle_unique_id=handle_unique_id,
5931
+ timeout=timeout,
5932
+ )
5897
5933
 
5898
5934
 
5899
5935
  @agent.command("get_latest_session")
@@ -176,30 +176,86 @@ class Agent(ShareableObjectMixin, BaseObjectOrm, BasePydanticModel):
176
176
 
177
177
  return [AgentSemanticSearchResult(**item) for item in data]
178
178
 
179
- def start_new_session(self, timeout=None, **kwargs):
179
+
180
+
181
+ def allocate_a2a_target_session(
182
+ self,
183
+ *,
184
+ caller_agent_session_id: int | AgentSession,
185
+ handle_unique_id: str | None = None,
186
+ timeout=None,
187
+ ) -> dict[str, Any]:
180
188
  """
181
- Start a new session for this agent and return the created `AgentSession`.
189
+ Allocate or reuse the delegated target session for this target `Agent`.
182
190
 
183
- Keyword arguments are sent as session-creation overrides on top of the
184
- agent defaults, so callers can pass values such as `thread_id`,
185
- `runtime_session_id`, `external_session_id`,
186
- `runtime_config_snapshot`, or explicit runtime fields.
191
+ Hits:
192
+ POST <detail_url>allocate-a2a-target-session/
193
+
194
+ Request contract:
195
+ - `caller_agent_session_id` is required and identifies the session that is
196
+ delegating work to this target agent.
197
+ - `handle_unique_id` is optional on the first call.
198
+ - when `handle_unique_id` is omitted, the backend creates a delegated
199
+ `AgentSessionHandle`, generates a new `handle_unique_id`, allocates the target
200
+ session, and returns that `handle_unique_id` in the response.
201
+ - when `handle_unique_id` is provided, the backend reuses the same delegated
202
+ handle and therefore the same target session for retries, reconnects, and
203
+ repeated calls for the same delegated conversation.
204
+
205
+ Why this is preferred over `start_new_session()` for A2A communication:
206
+ - `start_new_session()` always creates a brand-new `AgentSession`.
207
+ - A2A communication needs an idempotent control-plane allocation step so that
208
+ transport retries or stream reconnects do not silently create sibling target
209
+ sessions.
210
+ - `allocate_a2a_target_session()` makes the delegated conversation reusable by
211
+ returning a stable `handle_unique_id` that the caller can keep and send again.
212
+
213
+ Response contract:
214
+ - `handle_unique_id`: stable delegated-session reuse key.
215
+ - `agent_session_id`: allocated target session primary key.
216
+ - `allocation_state`: `created_new` or `reused_existing`.
217
+ - `session`: full canonical backend `AgentSession` payload for the target side.
218
+
219
+ Typical usage:
220
+ 1. first call: send only `caller_agent_session_id`
221
+ 2. persist the returned `handle_unique_id`
222
+ 3. later retries for the same delegated task: resend that `handle_unique_id`
223
+ 4. intentionally fresh delegated conversation: omit the old handle and let the
224
+ backend allocate a new one
187
225
  """
188
- url = f"{self.get_detail_url()}start_new_session/"
189
- payload: dict[str, Any] = {}
190
- if kwargs:
191
- payload["json"] = serialize_to_json(kwargs)
226
+ if isinstance(caller_agent_session_id, AgentSession):
227
+ resolved_caller_session_id = getattr(caller_agent_session_id, 'id', None)
228
+ else:
229
+ resolved_caller_session_id = caller_agent_session_id
230
+
231
+ if resolved_caller_session_id is None:
232
+ raise ValueError(
233
+ 'caller_agent_session_id must be an AgentSession or a session id'
234
+ )
235
+
236
+ resolved_handle_unique_id = str(handle_unique_id or '').strip()
237
+
238
+ body = {
239
+ 'caller_agent_session_id': int(resolved_caller_session_id),
240
+ }
241
+ if resolved_handle_unique_id:
242
+ body['handle_unique_id'] = resolved_handle_unique_id
243
+
244
+ url = f"{self.get_detail_url()}allocate-a2a-target-session/"
245
+ payload = {
246
+ 'json': serialize_to_json(body)
247
+ }
192
248
  response = make_request(
193
249
  s=self.build_session(),
194
250
  loaders=self.LOADERS,
195
- r_type="POST",
251
+ r_type='POST',
196
252
  url=url,
197
253
  payload=payload,
198
254
  time_out=timeout,
199
255
  )
200
- if response.status_code != 201:
256
+ if response.status_code not in (200, 201):
201
257
  raise_for_response(response, payload=payload)
202
- return AgentSession(**response.json())
258
+ return response.json()
203
259
 
204
260
  def get_latest_session(self, timeout=None):
205
261
  """
@@ -863,7 +863,12 @@ class User(UserApiBaseObjectOrm, BasePydanticModel):
863
863
  description="Unique identifier of the user.",
864
864
  examples=[42],
865
865
  )
866
- profile_picture:Any | None = Field()
866
+ profile_picture: str | None = Field(
867
+ None,
868
+ title="Profile Picture URL",
869
+ description="Absolute or relative URL of the user's profile picture when one is set.",
870
+ examples=["https://api.example.com/media/user_profile_pictures/avatar.png"],
871
+ )
867
872
  is_verified: bool | None = Field(
868
873
  None,
869
874
  title="Is Verified",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 3.19.8
3
+ Version: 3.19.10
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence"
7
- version = "3.19.8"
7
+ version = "3.19.10"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1468,7 +1468,7 @@ def test_get_or_create_agent_uses_client_model(cli_mod, monkeypatch):
1468
1468
  assert out["id"] == 12
1469
1469
 
1470
1470
 
1471
- def test_start_agent_new_session_uses_client_model(cli_mod, monkeypatch):
1471
+ def test_allocate_agent_a2a_target_session_uses_client_model(cli_mod, monkeypatch):
1472
1472
  api_mod = importlib.import_module("mainsequence.cli.api")
1473
1473
  captured = {}
1474
1474
 
@@ -1495,9 +1495,22 @@ def test_start_agent_new_session_uses_client_model(cli_mod, monkeypatch):
1495
1495
  captured["timeout"] = timeout
1496
1496
 
1497
1497
  class _Agent:
1498
- def start_new_session(self, timeout=None):
1499
- captured["start_new_session_timeout"] = timeout
1500
- return FakeAgentSession()
1498
+ def allocate_a2a_target_session(
1499
+ self,
1500
+ *,
1501
+ caller_agent_session_id,
1502
+ handle_unique_id=None,
1503
+ timeout=None,
1504
+ ):
1505
+ captured["caller_agent_session_id"] = caller_agent_session_id
1506
+ captured["handle_unique_id"] = handle_unique_id
1507
+ captured["allocate_timeout"] = timeout
1508
+ return {
1509
+ "handle_unique_id": "delegated-handle-1",
1510
+ "agent_session_id": 801,
1511
+ "allocation_state": "created_new",
1512
+ "session": FakeAgentSession().model_dump(),
1513
+ }
1501
1514
 
1502
1515
  return _Agent()
1503
1516
 
@@ -1505,15 +1518,24 @@ def test_start_agent_new_session_uses_client_model(cli_mod, monkeypatch):
1505
1518
 
1506
1519
  monkeypatch.setattr(api_mod, "_run_sdk_model_operation", _run_sdk_model_operation)
1507
1520
 
1508
- out = api_mod.start_agent_new_session(12, timeout=16)
1521
+ out = api_mod.allocate_agent_a2a_target_session(
1522
+ 12,
1523
+ caller_agent_session_id=700,
1524
+ handle_unique_id="delegated-handle-1",
1525
+ timeout=16,
1526
+ )
1509
1527
  assert captured == {
1510
1528
  "module_name": "mainsequence.client.agent_runtime_models",
1511
1529
  "class_name": "Agent",
1512
1530
  "pk": 12,
1513
1531
  "timeout": 16,
1514
- "start_new_session_timeout": 16,
1532
+ "caller_agent_session_id": 700,
1533
+ "handle_unique_id": "delegated-handle-1",
1534
+ "allocate_timeout": 16,
1515
1535
  }
1516
- assert out["id"] == 801
1536
+ assert out["agent_session_id"] == 801
1537
+ assert out["allocation_state"] == "created_new"
1538
+ assert out["handle_unique_id"] == "delegated-handle-1"
1517
1539
 
1518
1540
 
1519
1541
  def test_get_agent_latest_session_uses_client_model(cli_mod, monkeypatch):
@@ -6614,28 +6636,43 @@ def test_agent_get_or_create_parses_json_fields(cli_mod, runner, monkeypatch):
6614
6636
  assert "Agent resolved via get_or_create: Research Copilot" in result.output
6615
6637
 
6616
6638
 
6617
- def test_agent_start_new_session(cli_mod, runner, monkeypatch):
6639
+ def test_agent_allocate_a2a_target_session(cli_mod, runner, monkeypatch):
6618
6640
  monkeypatch.setattr(cli_mod, "_require_login", lambda: {"username": "u"})
6619
6641
  monkeypatch.setattr(
6620
6642
  cli_mod,
6621
- "start_agent_new_session",
6622
- lambda agent_id, timeout=None: {
6623
- "id": 801,
6624
- "agent": {"id": agent_id, "name": "Research Copilot"},
6625
- "status": "pending",
6626
- "started_at": "2026-04-11T09:15:00Z",
6627
- "llm_provider": "openai",
6628
- "llm_model": "gpt-5.4",
6629
- "engine_name": "codex",
6630
- "thread_id": "thread-123",
6631
- "runtime_config_snapshot": {"temperature": 0},
6632
- "session_metadata": {"origin": "cli"},
6643
+ "allocate_agent_a2a_target_session",
6644
+ lambda agent_id, caller_agent_session_id, handle_unique_id=None, timeout=None: {
6645
+ "handle_unique_id": handle_unique_id or "delegated-handle-1",
6646
+ "agent_session_id": 801,
6647
+ "allocation_state": "created_new",
6648
+ "session": {
6649
+ "id": 801,
6650
+ "agent": {"id": agent_id, "name": "Research Copilot"},
6651
+ "status": "pending",
6652
+ "started_at": "2026-04-11T09:15:00Z",
6653
+ "llm_provider": "openai",
6654
+ "llm_model": "gpt-5.4",
6655
+ "engine_name": "codex",
6656
+ "thread_id": "thread-123",
6657
+ "runtime_config_snapshot": {"temperature": 0},
6658
+ "session_metadata": {
6659
+ "origin": "cli",
6660
+ "caller_agent_session_id": caller_agent_session_id,
6661
+ "handle_unique_id": handle_unique_id or "delegated-handle-1",
6662
+ },
6663
+ },
6633
6664
  },
6634
6665
  )
6635
6666
 
6636
- result = runner.invoke(cli_mod.app, ["agent", "start_new_session", "12"])
6667
+ result = runner.invoke(
6668
+ cli_mod.app,
6669
+ ["agent", "allocate_a2a_target_session", "12", "700"],
6670
+ )
6637
6671
  assert result.exit_code == 0
6638
- assert "Agent session started: agent_id=12" in result.output
6672
+ assert "Agent A2A target session allocated: agent_id=12" in result.output
6673
+ assert "A2A Target Session Allocation" in result.output
6674
+ assert "delegated-handle-1" in result.output
6675
+ assert "created_new" in result.output
6639
6676
  assert "Agent Session Details" in result.output
6640
6677
  assert "thread-123" in result.output
6641
6678
  assert "temperature" in result.output
File without changes
File without changes