mainsequence 3.19.8__tar.gz → 3.19.9__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.9}/PKG-INFO +1 -1
  2. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/a2a_communication/SKILL.md +1 -1
  3. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/cli/api.py +14 -8
  4. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/cli/cli.py +46 -15
  5. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/agent_runtime_models.py +54 -13
  6. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/models_user.py +6 -1
  7. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence.egg-info/PKG-INFO +1 -1
  8. {mainsequence-3.19.8 → mainsequence-3.19.9}/pyproject.toml +1 -1
  9. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_cli.py +55 -22
  10. {mainsequence-3.19.8 → mainsequence-3.19.9}/LICENSE +0 -0
  11. {mainsequence-3.19.8 → mainsequence-3.19.9}/README.md +0 -0
  12. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/AGENTS.md +0 -0
  13. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  14. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
  15. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  16. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
  17. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  18. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  19. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +0 -0
  20. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  21. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  22. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  23. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  24. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/data_publishing/simple_tables/SKILL.md +0 -0
  25. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  26. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/maintenance/local_journal/SKILL.md +0 -0
  27. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/markets_platform/assets_and_translation/SKILL.md +0 -0
  28. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/markets_platform/instruments_and_pricing/SKILL.md +0 -0
  29. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/markets_platform/virtualfundbuilder/SKILL.md +0 -0
  30. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  31. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  32. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  33. {mainsequence-3.19.8 → mainsequence-3.19.9}/agent_scaffold/skills/project_to_agent/SKILL.md +0 -0
  34. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/__init__.py +0 -0
  35. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/__main__.py +0 -0
  36. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/bootstrap.py +0 -0
  37. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/cli/__init__.py +0 -0
  38. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/cli/browser_auth.py +0 -0
  39. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/cli/config.py +0 -0
  40. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/cli/docker_utils.py +0 -0
  41. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/cli/doctor.py +0 -0
  42. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/cli/local_ops.py +0 -0
  43. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/cli/model_filters.py +0 -0
  44. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/cli/project_status.py +0 -0
  45. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/cli/pydantic_cli.py +0 -0
  46. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/cli/sdk_utils.py +0 -0
  47. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/cli/ssh_utils.py +0 -0
  48. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/cli/ui.py +0 -0
  49. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/__init__.py +0 -0
  50. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/base.py +0 -0
  51. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/client.py +0 -0
  52. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/command_center/__init__.py +0 -0
  53. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/command_center/app_component.py +0 -0
  54. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/command_center/connections.py +0 -0
  55. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/command_center/data_models.py +0 -0
  56. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/command_center/workspace.py +0 -0
  57. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  58. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  59. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  60. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/data_sources_interfaces/timescale.py +0 -0
  61. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/exceptions.py +0 -0
  62. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/fastapi/__init__.py +0 -0
  63. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/fastapi/auth.py +0 -0
  64. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/models_helpers.py +0 -0
  65. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/models_simple_tables.py +0 -0
  66. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/models_tdag.py +0 -0
  67. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/models_vam.py +0 -0
  68. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/client/utils.py +0 -0
  69. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/compute_validation.py +0 -0
  70. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/__init__.py +0 -0
  71. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/__init__.py +0 -0
  72. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/assets/config.toml +0 -0
  73. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/assets/favicon.png +0 -0
  74. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/assets/image_1_base64.txt +0 -0
  75. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/assets/image_2_base64.txt +0 -0
  76. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/assets/image_3_base64.txt +0 -0
  77. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/assets/image_4_base64.txt +0 -0
  78. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/assets/image_5_base64.txt +0 -0
  79. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/assets/logo.png +0 -0
  80. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/components/__init__.py +0 -0
  81. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/components/asset_select.py +0 -0
  82. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/components/date_settings.py +0 -0
  83. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/components/logged_user.py +0 -0
  84. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/core/__init__.py +0 -0
  85. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/core/theme.py +0 -0
  86. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/instruments/__init__.py +0 -0
  87. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/instruments/streamlit_form_factory.py +0 -0
  88. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/pages/__init__.py +0 -0
  89. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/dashboards/streamlit/scaffold.py +0 -0
  90. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/defaults.py +0 -0
  91. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instrumentation/__init__.py +0 -0
  92. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instrumentation/utils.py +0 -0
  93. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/__init__.py +0 -0
  94. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/data_interface/__init__.py +0 -0
  95. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/data_interface/data_interface.py +0 -0
  96. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/instruments/__init__.py +0 -0
  97. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/instruments/base_instrument.py +0 -0
  98. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/instruments/bond.py +0 -0
  99. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/instruments/callability.py +0 -0
  100. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/instruments/interest_rate_swap.py +0 -0
  101. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/instruments/json_codec.py +0 -0
  102. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/instruments/position.py +0 -0
  103. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/instruments/ql_fields.py +0 -0
  104. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/interest_rates/__init__.py +0 -0
  105. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/interest_rates/etl/__init__.py +0 -0
  106. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/interest_rates/etl/curve_codec.py +0 -0
  107. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/interest_rates/etl/nodes.py +0 -0
  108. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/interest_rates/etl/registry.py +0 -0
  109. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/pricing_models/__init__.py +0 -0
  110. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/pricing_models/bond_pricer.py +0 -0
  111. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/pricing_models/indices.py +0 -0
  112. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/pricing_models/indices_builders.py +0 -0
  113. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/pricing_models/swap_pricer.py +0 -0
  114. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/settings.py +0 -0
  115. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/instruments/utils.py +0 -0
  116. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/logconf.py +0 -0
  117. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/runtime_flags.py +0 -0
  118. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/__init__.py +0 -0
  119. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/__main__.py +0 -0
  120. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/base_persist_managers.py +0 -0
  121. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/config.py +0 -0
  122. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/configuration_models.py +0 -0
  123. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/data_nodes/__init__.py +0 -0
  124. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/data_nodes/build_operations.py +0 -0
  125. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/data_nodes/data_nodes.py +0 -0
  126. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/data_nodes/filters.py +0 -0
  127. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/data_nodes/models.py +0 -0
  128. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/data_nodes/namespacing.py +0 -0
  129. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/data_nodes/persist_managers.py +0 -0
  130. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/data_nodes/run_operations.py +0 -0
  131. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/data_nodes/utils.py +0 -0
  132. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/filters.py +0 -0
  133. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/future_registry.py +0 -0
  134. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/pydantic_metadata.py +0 -0
  135. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/simple_tables/__init__.py +0 -0
  136. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/simple_tables/filters.py +0 -0
  137. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/simple_tables/models.py +0 -0
  138. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/simple_tables/persist_managers.py +0 -0
  139. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/simple_tables/schema.py +0 -0
  140. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/simple_tables/table_nodes.py +0 -0
  141. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/tdag/utils.py +0 -0
  142. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/__init__.py +0 -0
  143. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/contrib/__init__.py +0 -0
  144. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/contrib/data_nodes/__init__.py +0 -0
  145. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/contrib/data_nodes/external_weights.py +0 -0
  146. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/contrib/data_nodes/intraday_trend.py +0 -0
  147. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/contrib/data_nodes/market_cap.py +0 -0
  148. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/contrib/data_nodes/mock_signal.py +0 -0
  149. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/contrib/data_nodes/portfolio_replicator.py +0 -0
  150. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/contrib/prices/__init__.py +0 -0
  151. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py +0 -0
  152. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/contrib/prices/utils.py +0 -0
  153. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/__init__.py +0 -0
  154. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/rebalance_strategies.py +0 -0
  155. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/enums.py +0 -0
  156. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/models.py +0 -0
  157. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/portfolio_nodes.py +0 -0
  158. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/resource_factory/__init__.py +0 -0
  159. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/resource_factory/rebalance_factory.py +0 -0
  160. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/resource_factory/signal_factory.py +0 -0
  161. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence/virtualfundbuilder/utils.py +0 -0
  162. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence.egg-info/SOURCES.txt +0 -0
  163. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence.egg-info/dependency_links.txt +0 -0
  164. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence.egg-info/entry_points.txt +0 -0
  165. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence.egg-info/requires.txt +0 -0
  166. {mainsequence-3.19.8 → mainsequence-3.19.9}/mainsequence.egg-info/top_level.txt +0 -0
  167. {mainsequence-3.19.8 → mainsequence-3.19.9}/setup.cfg +0 -0
  168. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_auth_precedence.py +0 -0
  169. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_build_operations_hashing.py +0 -0
  170. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_cli_browser_auth.py +0 -0
  171. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_client.py +0 -0
  172. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_command_center_app_component_models.py +0 -0
  173. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_command_center_data_models.py +0 -0
  174. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_command_center_models.py +0 -0
  175. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_dependency_extras.py +0 -0
  176. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_filter_normalization.py +0 -0
  177. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_instruments.py +0 -0
  178. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_logconf.py +0 -0
  179. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_logged_user_components.py +0 -0
  180. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_models_user_request_bound_auth.py +0 -0
  181. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_pod_project_resolution.py +0 -0
  182. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_project_batch_jobs_from_file.py +0 -0
  183. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_run_configuration.py +0 -0
  184. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_simple_tables_configuration_hashing.py +0 -0
  185. {mainsequence-3.19.8 → mainsequence-3.19.9}/tests/test_simple_tables_persistence.py +0 -0
  186. {mainsequence-3.19.8 → mainsequence-3.19.9}/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.9
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
@@ -59,7 +59,7 @@ mainsequence agent search "<discoveryPrompt>" --limit 10 --json
59
59
  5. Start a backend session for the selected agent:
60
60
 
61
61
  ```bash
62
- mainsequence agent start_new_session <agent_id>
62
+ mainsequence agent allocate_agent_a2a_target_session <agent_id>
63
63
  ```
64
64
 
65
65
  6. Resolve runtime access for that agent session:
@@ -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
+ a2a_correlation_id: str,
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
+ a2a_correlation_id=a2a_correlation_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,15 @@ 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
+ ("Agent Session ID", str(allocation_payload.get("agent_session_id") or "-")),
3465
+ ("Allocation State", str(allocation_payload.get("allocation_state") or "-")),
3466
+ ("Session", _format_agent_session_ref_label(session_payload)),
3467
+ ]
3468
+
3469
+
3461
3470
  def _agent_list_impl(
3462
3471
  timeout: int | None,
3463
3472
  filter_entries: list[str] | None,
@@ -3751,25 +3760,35 @@ def _agent_delete_impl(
3751
3760
  print_kv("Deleted Agent", _format_agent_preview(deleted))
3752
3761
 
3753
3762
 
3754
- def _agent_start_new_session_impl(
3763
+ def _agent_allocate_a2a_target_session_impl(
3755
3764
  *,
3756
3765
  agent_id: int,
3766
+ caller_agent_session_id: int,
3767
+ a2a_correlation_id: str,
3757
3768
  timeout: int | None,
3758
3769
  ) -> None:
3759
3770
  _require_login()
3760
3771
 
3761
3772
  try:
3762
- agent_session_payload = start_agent_new_session(agent_id, timeout=timeout)
3773
+ allocation_payload = allocate_agent_a2a_target_session(
3774
+ agent_id,
3775
+ caller_agent_session_id=caller_agent_session_id,
3776
+ a2a_correlation_id=a2a_correlation_id,
3777
+ timeout=timeout,
3778
+ )
3763
3779
  except ApiError as e:
3764
- error(f"Agent session start failed: {e}")
3780
+ error(f"Agent A2A target session allocation failed: {e}")
3765
3781
  raise typer.Exit(1) from e
3766
3782
 
3767
- if _emit_json(agent_session_payload):
3783
+ if _emit_json(allocation_payload):
3768
3784
  return
3769
3785
 
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))
3786
+ success(f"Agent A2A target session allocated: agent_id={agent_id}")
3787
+ print_kv("A2A Target Session Allocation", _format_agent_a2a_allocation_preview(allocation_payload))
3788
+ session_payload = allocation_payload.get("session")
3789
+ if isinstance(session_payload, dict):
3790
+ print_kv("Agent Session", _format_agent_session_preview(session_payload))
3791
+ print_kv("Agent Session Details", _format_agent_session_details(session_payload))
3773
3792
 
3774
3793
 
3775
3794
  def _agent_get_latest_session_impl(
@@ -5876,24 +5895,36 @@ def agent_delete_cmd(
5876
5895
  _agent_delete_impl(agent_id=agent_id, timeout=timeout)
5877
5896
 
5878
5897
 
5879
- @agent.command("start_new_session")
5880
- def agent_start_new_session_cmd(
5898
+ @agent.command("allocate_a2a_target_session")
5899
+ def agent_allocate_a2a_target_session_cmd(
5881
5900
  agent_id: int = pydantic_argument(AGENT_MODEL_REF, "id", ..., help="Agent ID."),
5901
+ caller_agent_session_id: int = pydantic_argument(
5902
+ AGENT_SESSION_MODEL_REF,
5903
+ "id",
5904
+ ...,
5905
+ help="Caller agent session ID.",
5906
+ ),
5907
+ a2a_correlation_id: str = typer.Argument(..., help="Stable correlation id for the delegated A2A task."),
5882
5908
  timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
5883
5909
  ):
5884
5910
  """
5885
- Start a new session for one agent and return the created agent session.
5911
+ Allocate or reuse the delegated A2A target session for one agent.
5886
5912
 
5887
- Uses SDK client `Agent.start_new_session()` as the single source of truth.
5913
+ Uses SDK client `Agent.allocate_a2a_target_session()` as the single source of truth.
5888
5914
 
5889
5915
  Examples
5890
5916
  --------
5891
5917
  ```bash
5892
- mainsequence agent start_new_session 12
5893
- mainsequence agent start_new_session 12 --timeout 60
5918
+ mainsequence agent allocate_a2a_target_session 12 801 delegation-step-1
5919
+ mainsequence agent allocate_a2a_target_session 12 801 delegation-step-1 --timeout 60
5894
5920
  ```
5895
5921
  """
5896
- _agent_start_new_session_impl(agent_id=agent_id, timeout=timeout)
5922
+ _agent_allocate_a2a_target_session_impl(
5923
+ agent_id=agent_id,
5924
+ caller_agent_session_id=caller_agent_session_id,
5925
+ a2a_correlation_id=a2a_correlation_id,
5926
+ timeout=timeout,
5927
+ )
5897
5928
 
5898
5929
 
5899
5930
  @agent.command("get_latest_session")
@@ -176,30 +176,71 @@ 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
+ a2a_correlation_id: str,
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 one logical A2A task.
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
+ Why prefer this over `start_new_session()` for A2A communication:
195
+ - `start_new_session()` always creates a brand-new `AgentSession`.
196
+ - `allocate_a2a_target_session()` is idempotent for delegated work and is keyed
197
+ by `(caller_agent_session_id, self.id, a2a_correlation_id)`.
198
+ - Retrying the same delegated task reuses the same target session instead of
199
+ silently creating a sibling conversation.
200
+ - This keeps reconnects, transport retries, and stream timeouts attached to the
201
+ same delegated session.
202
+ - If the caller wants a fresh delegated conversation, it should mint a new
203
+ `a2a_correlation_id` and call this method again.
204
+
205
+ Returns the canonical backend allocation payload:
206
+ - `agent_session_id`
207
+ - `allocation_state`
208
+ - `session`
187
209
  """
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)
210
+ if isinstance(caller_agent_session_id, AgentSession):
211
+ resolved_caller_session_id = getattr(caller_agent_session_id, 'id', None)
212
+ else:
213
+ resolved_caller_session_id = caller_agent_session_id
214
+
215
+ if resolved_caller_session_id is None:
216
+ raise ValueError(
217
+ 'caller_agent_session_id must be an AgentSession or a session id'
218
+ )
219
+
220
+ a2a_correlation_id = str(a2a_correlation_id or '').strip()
221
+ if not a2a_correlation_id:
222
+ raise ValueError('a2a_correlation_id is required')
223
+
224
+ url = f"{self.get_detail_url()}allocate-a2a-target-session/"
225
+ payload = {
226
+ 'json': serialize_to_json(
227
+ {
228
+ 'caller_agent_session_id': int(resolved_caller_session_id),
229
+ 'a2a_correlation_id': a2a_correlation_id,
230
+ }
231
+ )
232
+ }
192
233
  response = make_request(
193
234
  s=self.build_session(),
194
235
  loaders=self.LOADERS,
195
- r_type="POST",
236
+ r_type='POST',
196
237
  url=url,
197
238
  payload=payload,
198
239
  time_out=timeout,
199
240
  )
200
- if response.status_code != 201:
241
+ if response.status_code not in (200, 201):
201
242
  raise_for_response(response, payload=payload)
202
- return AgentSession(**response.json())
243
+ return response.json()
203
244
 
204
245
  def get_latest_session(self, timeout=None):
205
246
  """
@@ -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.9
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.9"
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,21 @@ 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
+ a2a_correlation_id,
1503
+ timeout=None,
1504
+ ):
1505
+ captured["caller_agent_session_id"] = caller_agent_session_id
1506
+ captured["a2a_correlation_id"] = a2a_correlation_id
1507
+ captured["allocate_timeout"] = timeout
1508
+ return {
1509
+ "agent_session_id": 801,
1510
+ "allocation_state": "created",
1511
+ "session": FakeAgentSession().model_dump(),
1512
+ }
1501
1513
 
1502
1514
  return _Agent()
1503
1515
 
@@ -1505,15 +1517,23 @@ def test_start_agent_new_session_uses_client_model(cli_mod, monkeypatch):
1505
1517
 
1506
1518
  monkeypatch.setattr(api_mod, "_run_sdk_model_operation", _run_sdk_model_operation)
1507
1519
 
1508
- out = api_mod.start_agent_new_session(12, timeout=16)
1520
+ out = api_mod.allocate_agent_a2a_target_session(
1521
+ 12,
1522
+ caller_agent_session_id=700,
1523
+ a2a_correlation_id="delegation-step-1",
1524
+ timeout=16,
1525
+ )
1509
1526
  assert captured == {
1510
1527
  "module_name": "mainsequence.client.agent_runtime_models",
1511
1528
  "class_name": "Agent",
1512
1529
  "pk": 12,
1513
1530
  "timeout": 16,
1514
- "start_new_session_timeout": 16,
1531
+ "caller_agent_session_id": 700,
1532
+ "a2a_correlation_id": "delegation-step-1",
1533
+ "allocate_timeout": 16,
1515
1534
  }
1516
- assert out["id"] == 801
1535
+ assert out["agent_session_id"] == 801
1536
+ assert out["allocation_state"] == "created"
1517
1537
 
1518
1538
 
1519
1539
  def test_get_agent_latest_session_uses_client_model(cli_mod, monkeypatch):
@@ -6614,28 +6634,41 @@ def test_agent_get_or_create_parses_json_fields(cli_mod, runner, monkeypatch):
6614
6634
  assert "Agent resolved via get_or_create: Research Copilot" in result.output
6615
6635
 
6616
6636
 
6617
- def test_agent_start_new_session(cli_mod, runner, monkeypatch):
6637
+ def test_agent_allocate_a2a_target_session(cli_mod, runner, monkeypatch):
6618
6638
  monkeypatch.setattr(cli_mod, "_require_login", lambda: {"username": "u"})
6619
6639
  monkeypatch.setattr(
6620
6640
  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"},
6641
+ "allocate_agent_a2a_target_session",
6642
+ lambda agent_id, caller_agent_session_id, a2a_correlation_id, timeout=None: {
6643
+ "agent_session_id": 801,
6644
+ "allocation_state": "created",
6645
+ "session": {
6646
+ "id": 801,
6647
+ "agent": {"id": agent_id, "name": "Research Copilot"},
6648
+ "status": "pending",
6649
+ "started_at": "2026-04-11T09:15:00Z",
6650
+ "llm_provider": "openai",
6651
+ "llm_model": "gpt-5.4",
6652
+ "engine_name": "codex",
6653
+ "thread_id": "thread-123",
6654
+ "runtime_config_snapshot": {"temperature": 0},
6655
+ "session_metadata": {
6656
+ "origin": "cli",
6657
+ "caller_agent_session_id": caller_agent_session_id,
6658
+ "a2a_correlation_id": a2a_correlation_id,
6659
+ },
6660
+ },
6633
6661
  },
6634
6662
  )
6635
6663
 
6636
- result = runner.invoke(cli_mod.app, ["agent", "start_new_session", "12"])
6664
+ result = runner.invoke(
6665
+ cli_mod.app,
6666
+ ["agent", "allocate_a2a_target_session", "12", "700", "delegation-step-1"],
6667
+ )
6637
6668
  assert result.exit_code == 0
6638
- assert "Agent session started: agent_id=12" in result.output
6669
+ assert "Agent A2A target session allocated: agent_id=12" in result.output
6670
+ assert "A2A Target Session Allocation" in result.output
6671
+ assert "created" in result.output
6639
6672
  assert "Agent Session Details" in result.output
6640
6673
  assert "thread-123" in result.output
6641
6674
  assert "temperature" in result.output
File without changes
File without changes
File without changes