mainsequence 3.19.3__tar.gz → 3.19.6__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.3 → mainsequence-3.19.6}/PKG-INFO +3 -1
  2. {mainsequence-3.19.3 → mainsequence-3.19.6}/README.md +2 -0
  3. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/AGENTS.md +2 -2
  4. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/command_center/workspace_builder/SKILL.md +16 -9
  5. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/project_to_agent/SKILL.md +1 -1
  6. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/api.py +54 -6
  7. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/cli.py +36 -70
  8. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/local_ops.py +6 -12
  9. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/command_center/workspace.py +1 -1
  10. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/models_helpers.py +3 -13
  11. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence.egg-info/PKG-INFO +3 -1
  12. {mainsequence-3.19.3 → mainsequence-3.19.6}/pyproject.toml +1 -1
  13. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_cli.py +64 -46
  14. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_project_batch_jobs_from_file.py +43 -0
  15. {mainsequence-3.19.3 → mainsequence-3.19.6}/LICENSE +0 -0
  16. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/a2a_communication/SKILL.md +0 -0
  17. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/application_surfaces/api_surfaces/SKILL.md +0 -0
  18. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/command_center/adapter_from_api/SKILL.md +0 -0
  19. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/command_center/api_mock_prototyping/SKILL.md +0 -0
  20. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/command_center/app_components/SKILL.md +0 -0
  21. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/command_center/connections/SKILL.md +0 -0
  22. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/command_center/workspace_analysis/SKILL.md +0 -0
  23. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/command_center/workspace_design/SKILL.md +0 -0
  24. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/dashboards/streamlit/SKILL.md +0 -0
  25. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/data_access/exploration/SKILL.md +0 -0
  26. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/data_publishing/data_nodes/SKILL.md +0 -0
  27. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/data_publishing/simple_tables/SKILL.md +0 -0
  28. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/maintenance/bug_auditor/SKILL.md +0 -0
  29. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/maintenance/local_journal/SKILL.md +0 -0
  30. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/markets_platform/assets_and_translation/SKILL.md +0 -0
  31. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/markets_platform/instruments_and_pricing/SKILL.md +0 -0
  32. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/markets_platform/virtualfundbuilder/SKILL.md +0 -0
  33. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/platform_operations/access_control_and_sharing/SKILL.md +0 -0
  34. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/platform_operations/orchestration_and_releases/SKILL.md +0 -0
  35. {mainsequence-3.19.3 → mainsequence-3.19.6}/agent_scaffold/skills/project_builder/SKILL.md +0 -0
  36. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/__init__.py +0 -0
  37. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/__main__.py +0 -0
  38. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/bootstrap.py +0 -0
  39. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/__init__.py +0 -0
  40. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/browser_auth.py +0 -0
  41. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/config.py +0 -0
  42. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/docker_utils.py +0 -0
  43. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/doctor.py +0 -0
  44. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/model_filters.py +0 -0
  45. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/project_status.py +0 -0
  46. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/pydantic_cli.py +0 -0
  47. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/sdk_utils.py +0 -0
  48. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/ssh_utils.py +0 -0
  49. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/cli/ui.py +0 -0
  50. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/__init__.py +0 -0
  51. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/agent_runtime_models.py +0 -0
  52. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/base.py +0 -0
  53. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/client.py +0 -0
  54. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/command_center/__init__.py +0 -0
  55. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/command_center/app_component.py +0 -0
  56. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/command_center/connections.py +0 -0
  57. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/command_center/data_models.py +0 -0
  58. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/command_center/workspace_snapshot.py +0 -0
  59. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/data_sources_interfaces/__init__.py +0 -0
  60. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/data_sources_interfaces/duckdb.py +0 -0
  61. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/data_sources_interfaces/timescale.py +0 -0
  62. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/exceptions.py +0 -0
  63. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/fastapi/__init__.py +0 -0
  64. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/fastapi/auth.py +0 -0
  65. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/models_simple_tables.py +0 -0
  66. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/models_tdag.py +0 -0
  67. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/models_user.py +0 -0
  68. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/models_vam.py +0 -0
  69. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/client/utils.py +0 -0
  70. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/compute_validation.py +0 -0
  71. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/__init__.py +0 -0
  72. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/__init__.py +0 -0
  73. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/config.toml +0 -0
  74. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/favicon.png +0 -0
  75. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/image_1_base64.txt +0 -0
  76. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/image_2_base64.txt +0 -0
  77. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/image_3_base64.txt +0 -0
  78. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/image_4_base64.txt +0 -0
  79. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/image_5_base64.txt +0 -0
  80. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/assets/logo.png +0 -0
  81. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/components/__init__.py +0 -0
  82. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/components/asset_select.py +0 -0
  83. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/components/date_settings.py +0 -0
  84. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/components/logged_user.py +0 -0
  85. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/core/__init__.py +0 -0
  86. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/core/theme.py +0 -0
  87. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/instruments/__init__.py +0 -0
  88. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/instruments/streamlit_form_factory.py +0 -0
  89. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/pages/__init__.py +0 -0
  90. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/dashboards/streamlit/scaffold.py +0 -0
  91. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/defaults.py +0 -0
  92. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instrumentation/__init__.py +0 -0
  93. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instrumentation/utils.py +0 -0
  94. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/__init__.py +0 -0
  95. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/data_interface/__init__.py +0 -0
  96. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/data_interface/data_interface.py +0 -0
  97. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/__init__.py +0 -0
  98. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/base_instrument.py +0 -0
  99. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/bond.py +0 -0
  100. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/callability.py +0 -0
  101. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/interest_rate_swap.py +0 -0
  102. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/json_codec.py +0 -0
  103. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/position.py +0 -0
  104. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/instruments/ql_fields.py +0 -0
  105. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/interest_rates/__init__.py +0 -0
  106. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/interest_rates/etl/__init__.py +0 -0
  107. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/interest_rates/etl/curve_codec.py +0 -0
  108. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/interest_rates/etl/nodes.py +0 -0
  109. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/interest_rates/etl/registry.py +0 -0
  110. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/pricing_models/__init__.py +0 -0
  111. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/pricing_models/bond_pricer.py +0 -0
  112. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/pricing_models/indices.py +0 -0
  113. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/pricing_models/indices_builders.py +0 -0
  114. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/pricing_models/swap_pricer.py +0 -0
  115. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/settings.py +0 -0
  116. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/instruments/utils.py +0 -0
  117. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/logconf.py +0 -0
  118. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/runtime_flags.py +0 -0
  119. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/__init__.py +0 -0
  120. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/__main__.py +0 -0
  121. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/base_persist_managers.py +0 -0
  122. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/config.py +0 -0
  123. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/configuration_models.py +0 -0
  124. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/__init__.py +0 -0
  125. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/build_operations.py +0 -0
  126. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/data_nodes.py +0 -0
  127. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/filters.py +0 -0
  128. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/models.py +0 -0
  129. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/namespacing.py +0 -0
  130. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/persist_managers.py +0 -0
  131. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/run_operations.py +0 -0
  132. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/data_nodes/utils.py +0 -0
  133. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/filters.py +0 -0
  134. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/future_registry.py +0 -0
  135. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/pydantic_metadata.py +0 -0
  136. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/simple_tables/__init__.py +0 -0
  137. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/simple_tables/filters.py +0 -0
  138. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/simple_tables/models.py +0 -0
  139. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/simple_tables/persist_managers.py +0 -0
  140. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/simple_tables/schema.py +0 -0
  141. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/simple_tables/table_nodes.py +0 -0
  142. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/tdag/utils.py +0 -0
  143. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/__init__.py +0 -0
  144. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/__init__.py +0 -0
  145. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/data_nodes/__init__.py +0 -0
  146. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/data_nodes/external_weights.py +0 -0
  147. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/data_nodes/intraday_trend.py +0 -0
  148. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/data_nodes/market_cap.py +0 -0
  149. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/data_nodes/mock_signal.py +0 -0
  150. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/data_nodes/portfolio_replicator.py +0 -0
  151. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/prices/__init__.py +0 -0
  152. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/prices/data_nodes.py +0 -0
  153. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/prices/utils.py +0 -0
  154. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/__init__.py +0 -0
  155. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/contrib/rebalance_strategies/rebalance_strategies.py +0 -0
  156. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/enums.py +0 -0
  157. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/models.py +0 -0
  158. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/portfolio_nodes.py +0 -0
  159. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/resource_factory/__init__.py +0 -0
  160. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/resource_factory/rebalance_factory.py +0 -0
  161. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/resource_factory/signal_factory.py +0 -0
  162. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence/virtualfundbuilder/utils.py +0 -0
  163. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence.egg-info/SOURCES.txt +0 -0
  164. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence.egg-info/dependency_links.txt +0 -0
  165. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence.egg-info/entry_points.txt +0 -0
  166. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence.egg-info/requires.txt +0 -0
  167. {mainsequence-3.19.3 → mainsequence-3.19.6}/mainsequence.egg-info/top_level.txt +0 -0
  168. {mainsequence-3.19.3 → mainsequence-3.19.6}/setup.cfg +0 -0
  169. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_auth_precedence.py +0 -0
  170. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_build_operations_hashing.py +0 -0
  171. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_cli_browser_auth.py +0 -0
  172. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_client.py +0 -0
  173. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_command_center_app_component_models.py +0 -0
  174. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_command_center_data_models.py +0 -0
  175. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_command_center_models.py +0 -0
  176. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_dependency_extras.py +0 -0
  177. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_filter_normalization.py +0 -0
  178. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_instruments.py +0 -0
  179. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_logconf.py +0 -0
  180. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_logged_user_components.py +0 -0
  181. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_models_user_request_bound_auth.py +0 -0
  182. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_pod_project_resolution.py +0 -0
  183. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_run_configuration.py +0 -0
  184. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_simple_tables_configuration_hashing.py +0 -0
  185. {mainsequence-3.19.3 → mainsequence-3.19.6}/tests/test_simple_tables_persistence.py +0 -0
  186. {mainsequence-3.19.3 → mainsequence-3.19.6}/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.3
3
+ Version: 3.19.6
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
@@ -154,6 +154,7 @@ Recommended entry points:
154
154
  - [Working With Simple Tables](docs/tutorial/working_with_simple_tables.md)
155
155
  - [Create Your First API](docs/tutorial/create_your_first_api.md)
156
156
  - [Role-Based Access Control](docs/tutorial/role_based_access_control.md)
157
+ - [Turn Your Project Into an Agent](docs/tutorial/project_to_agent.md)
157
158
  - Knowledge:
158
159
  - [Data Nodes](docs/knowledge/data_nodes.md)
159
160
  - [Command Center](docs/knowledge/command_center/index.md)
@@ -209,6 +210,7 @@ From there, the normal learning path is:
209
210
  4. understand sharing and RBAC
210
211
  5. schedule jobs
211
212
  6. build dashboards or downstream consumers
213
+ 7. package the project as an agent-facing surface when the repository is ready
212
214
 
213
215
  ## Installation for development
214
216
 
@@ -64,6 +64,7 @@ Recommended entry points:
64
64
  - [Working With Simple Tables](docs/tutorial/working_with_simple_tables.md)
65
65
  - [Create Your First API](docs/tutorial/create_your_first_api.md)
66
66
  - [Role-Based Access Control](docs/tutorial/role_based_access_control.md)
67
+ - [Turn Your Project Into an Agent](docs/tutorial/project_to_agent.md)
67
68
  - Knowledge:
68
69
  - [Data Nodes](docs/knowledge/data_nodes.md)
69
70
  - [Command Center](docs/knowledge/command_center/index.md)
@@ -119,6 +120,7 @@ From there, the normal learning path is:
119
120
  4. understand sharing and RBAC
120
121
  5. schedule jobs
121
122
  6. build dashboards or downstream consumers
123
+ 7. package the project as an agent-facing surface when the repository is ready
122
124
 
123
125
  ## Installation for development
124
126
 
@@ -18,9 +18,9 @@ uses them to update only the Main Sequence section below.
18
18
  ## Main Sequence Instructions
19
19
 
20
20
  Before any non-trivial Main Sequence work, verify that this Main Sequence section matches the
21
- latest installed `agent_scaffold/AGENTS.md` template and that
21
+ latest installed `AGENTS.md` template and that
22
22
  `.agents/skills/mainsequence/project_builder/SKILL.md` matches the latest installed
23
- `agent_scaffold/skills/project_builder/SKILL.md`; if either local file does not match, update it
23
+ `.agents/skills/project_builder/SKILL.md`; if either local file does not match, update it
24
24
  before proceeding.
25
25
 
26
26
  Canonical Main Sequence documentation root:
@@ -69,25 +69,32 @@ This skill must not claim ownership of:
69
69
 
70
70
  0. If widget selection, layout narrative, or visualization strategy is not already decided, use:
71
71
  - `.agents/skills/mainsequence/command_center/workspace_design/SKILL.md`
72
- 1. Verify the widget catalog through the CLI:
72
+ 1. If the workspace may use connection-backed source widgets, inspect the available connections through the CLI first:
73
+ - `mainsequence cc connection list --json`
74
+ - identify the target connection instance `uid`
75
+ - `mainsequence cc connection detail <CONNECTION_UID> --json`
76
+ - `mainsequence cc connection_type list --json`
77
+ - identify the target connection `type_id`
78
+ - `mainsequence cc connection_type detail <TYPE_ID> --json`
79
+ 2. Verify the widget catalog through the CLI:
73
80
  - `mainsequence cc registered_widget_type list --json`
74
81
  - identify the target `widget_id`
75
82
  - `mainsequence cc registered_widget_type detail <WIDGET_ID> --json`
76
- 2. The SDK client models in `mainsequence/client/command_center/`:
83
+ 3. The SDK client models in `mainsequence/client/command_center/`:
77
84
  - `workspace.py`
78
85
  - `connections.py` when source widgets depend on backend-owned connections
79
86
  - `data_models.py`
80
87
  - `app_component.py` when the workspace contains AppComponent widgets or editable form payloads
81
- 3. `docs/knowledge/command_center/workspaces.md`
82
- 4. the local Main Sequence docs/models/examples in this repository that define the widget payloads being mounted
83
- 5. the current CLI docs if the task uses CLI workflow
88
+ 4. `docs/knowledge/command_center/workspaces.md`
89
+ 5. the local Main Sequence docs/models/examples in this repository that define the widget payloads being mounted
90
+ 6. the current CLI docs if the task uses CLI workflow
84
91
 
85
92
  If the workspace contains AppComponent widgets, also read:
86
93
 
87
- 6. `docs/knowledge/command_center/forms.md`
88
- 7. `docs/knowledge/command_center/widget_data_contracts.md`
89
- 8. `.agents/skills/mainsequence/platform_operations/orchestration_and_releases/SKILL.md` when mounted widgets depend on project APIs that must be usable from Command Center
90
- 9. `.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md` when the workspace should validate an AppComponent/API contract in `mock-json` mode before deployment
94
+ 7. `docs/knowledge/command_center/forms.md`
95
+ 8. `docs/knowledge/command_center/widget_data_contracts.md`
96
+ 9. `.agents/skills/mainsequence/platform_operations/orchestration_and_releases/SKILL.md` when mounted widgets depend on project APIs that must be usable from Command Center
97
+ 10. `.agents/skills/mainsequence/command_center/api_mock_prototyping/SKILL.md` when the workspace should validate an AppComponent/API contract in `mock-json` mode before deployment
91
98
 
92
99
  ## Command Center Mental Model
93
100
 
@@ -14,7 +14,7 @@ This skill must only be used for adding agentic capabilities to an existing proj
14
14
  - Create the required files and folders for agentic capabilities.
15
15
  - Verify that the project has the required local agent configuration files.
16
16
  - Verify that the project has skills that are aligned with its CLI capabilities.
17
-
17
+ - Important: This skill does not require creation of any agent defintion. Do not create an agents folder nor an agent.py build around the project capabilities and .agents skills this is a coding agent setup!
18
18
  ## This Skill Must Not Claim
19
19
 
20
20
  - That it knows how to build the entire project unless the work is directly related to adding agentic capabilities.
@@ -18,6 +18,7 @@ import importlib
18
18
  import json
19
19
  import os
20
20
  import re
21
+ import shlex
21
22
  from typing import Any
22
23
  from urllib.parse import urlencode
23
24
 
@@ -2374,8 +2375,8 @@ def create_project_resource_release(
2374
2375
  Create a resource release via SDK client model.
2375
2376
 
2376
2377
  Single source of truth:
2377
- - delegates to `ProjectResource.create_dashboard()`, `ProjectResource.create_agent()`,
2378
- or `ProjectResource.create_fastapi()`
2378
+ - delegates to `ProjectResource.create_dashboard()` or
2379
+ `ProjectResource.create_fastapi()`
2379
2380
  - which in turn use `ResourceRelease.create()`
2380
2381
  """
2381
2382
  tokens = get_tokens()
@@ -2437,12 +2438,11 @@ def create_project_resource_release(
2437
2438
 
2438
2439
  create_method_name = {
2439
2440
  "streamlit_dashboard": "create_dashboard",
2440
- "agent": "create_agent",
2441
2441
  "fastapi": "create_fastapi",
2442
2442
  }.get(str(release_kind).strip())
2443
2443
  if not create_method_name:
2444
2444
  raise ApiError(
2445
- "release_kind must be one of: 'streamlit_dashboard', 'agent', 'fastapi'."
2445
+ "release_kind must be one of: 'streamlit_dashboard', 'fastapi'."
2446
2446
  )
2447
2447
 
2448
2448
  create_method = getattr(resource, create_method_name, None)
@@ -4679,6 +4679,30 @@ def schedule_batch_project_jobs(
4679
4679
  os.environ[k] = v
4680
4680
 
4681
4681
 
4682
+ def get_project_job(
4683
+ job_id: int | str,
4684
+ *,
4685
+ timeout: int | None = None,
4686
+ ) -> dict[str, Any]:
4687
+ """
4688
+ Retrieve one project job via SDK client model.
4689
+ """
4690
+ try:
4691
+ job = _run_sdk_model_operation(
4692
+ module_name="mainsequence.client.models_helpers",
4693
+ class_name="Job",
4694
+ operation=lambda ClientJob: ClientJob.get(pk=int(job_id), timeout=timeout),
4695
+ )
4696
+ return _sdk_object_to_dict(job)
4697
+ except Exception as e:
4698
+ err_name = type(e).__name__
4699
+ if err_name == "NotFoundError":
4700
+ raise ApiError(f"Job not found: {job_id}") from e
4701
+ if isinstance(e, (ApiError, NotLoggedIn)):
4702
+ raise
4703
+ raise ApiError(f"Project job fetch failed: {e}") from e
4704
+
4705
+
4682
4706
  def run_project_job(
4683
4707
  job_id: int | str,
4684
4708
  *,
@@ -4738,11 +4762,35 @@ def run_project_job(
4738
4762
 
4739
4763
  job = ClientJob.get(pk=int(job_id), timeout=timeout)
4740
4764
  payload = job.run_job(timeout=timeout, command_args=command_args)
4765
+ effective_tokens: list[str] = []
4766
+ execution_path = str(getattr(job, "execution_path", "") or "").strip()
4767
+ app_name = str(getattr(job, "app_name", "") or "").strip()
4768
+ if execution_path:
4769
+ effective_tokens.append(execution_path)
4770
+ elif app_name:
4771
+ effective_tokens.append(f"app:{app_name}")
4772
+ if command_args:
4773
+ effective_tokens.extend(str(arg) for arg in command_args)
4774
+ effective_run = shlex.join(effective_tokens) if effective_tokens else None
4741
4775
  if isinstance(payload, dict):
4776
+ if effective_run:
4777
+ payload.setdefault("effective_run", effective_run)
4778
+ if command_args is not None:
4779
+ payload.setdefault("command_args", list(command_args))
4742
4780
  return payload
4743
4781
  if hasattr(payload, "model_dump"):
4744
- return payload.model_dump()
4745
- return {"job_id": int(job_id)}
4782
+ payload = payload.model_dump()
4783
+ if effective_run:
4784
+ payload.setdefault("effective_run", effective_run)
4785
+ if command_args is not None:
4786
+ payload.setdefault("command_args", list(command_args))
4787
+ return payload
4788
+ out = {"job_id": int(job_id)}
4789
+ if effective_run:
4790
+ out["effective_run"] = effective_run
4791
+ if command_args is not None:
4792
+ out["command_args"] = list(command_args)
4793
+ return out
4746
4794
 
4747
4795
  except Exception as e:
4748
4796
  err_name = type(e).__name__
@@ -31,6 +31,7 @@ import os
31
31
  import pathlib
32
32
  import platform
33
33
  import re
34
+ import shlex
34
35
  import shutil
35
36
  import subprocess
36
37
  import sys
@@ -114,6 +115,7 @@ from .api import (
114
115
  get_project,
115
116
  get_project_data_node_updates,
116
117
  get_project_image,
118
+ get_project_job,
117
119
  get_project_job_run_logs,
118
120
  get_projects,
119
121
  get_registered_widget_type,
@@ -432,12 +434,10 @@ JOB_RUN_STATUS_PENDING = "PENDING"
432
434
  JOB_RUN_STATUS_RUNNING = "RUNNING"
433
435
  RESOURCE_RELEASE_RESOURCE_TYPE_MAP = {
434
436
  "streamlit_dashboard": "dashboard",
435
- "agent": "agent",
436
437
  "fastapi": "fastapi",
437
438
  }
438
439
  RESOURCE_RELEASE_LABEL_MAP = {
439
440
  "streamlit_dashboard": "dashboard release",
440
- "agent": "agent release",
441
441
  "fastapi": "FastAPI release",
442
442
  }
443
443
  LIST_FILTER_OPTION_HELP = (
@@ -8834,42 +8834,6 @@ def project_project_resource_create_dashboard_cmd(
8834
8834
  )
8835
8835
 
8836
8836
 
8837
- @project_project_resource_group.command("create_agent")
8838
- def project_project_resource_create_agent_cmd(
8839
- project_id: int | None = typer.Argument(None, help="Project ID. Defaults to local .env when omitted."),
8840
- resource_id: int | None = typer.Option(None, "--resource-id", help="Project resource ID."),
8841
- path: str | None = typer.Option(None, "--path", help="Project repository path (default: current project)"),
8842
- related_image_id: int | None = typer.Option(None, "--related-image-id", help="Project image ID."),
8843
- readme_resource_id: int | None = typer.Option(None, "--readme-resource-id", help="Optional README resource ID."),
8844
- cpu_request: str | None = typer.Option(None, "--cpu-request", help="CPU request (accepts 0.5 or 500m; default: 0.25)."),
8845
- memory_request: str | None = typer.Option(None, "--memory-request", help="Memory request (accepts 1 or 1Gi; default: 0.5)."),
8846
- gpu_request: str | None = typer.Option(None, "--gpu-request", help="GPU request count."),
8847
- gpu_type: str | None = typer.Option(None, "--gpu-type", help="GPU accelerator type."),
8848
- spot: bool | None = typer.Option(None, "--spot/--no-spot", help="Whether to prefer spot capacity."),
8849
- timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
8850
- ):
8851
- """
8852
- Create an agent release from a project resource.
8853
-
8854
- The command first lets the user select a project image and then filters resources so
8855
- only resources with `repo_commit_sha == related_image.project_repo_hash` are eligible.
8856
- """
8857
- _project_resource_release_create_impl(
8858
- release_kind="agent",
8859
- project_id=project_id,
8860
- resource_id=resource_id,
8861
- path=path,
8862
- related_image_id=related_image_id,
8863
- readme_resource_id=readme_resource_id,
8864
- cpu_request=cpu_request,
8865
- memory_request=memory_request,
8866
- gpu_request=gpu_request,
8867
- gpu_type=gpu_type,
8868
- spot=spot,
8869
- timeout=timeout,
8870
- )
8871
-
8872
-
8873
8837
  @project_project_resource_group.command("create_fastapi")
8874
8838
  def project_project_resource_create_fastapi_cmd(
8875
8839
  project_id: int | None = typer.Argument(None, help="Project ID. Defaults to local .env when omitted."),
@@ -8977,30 +8941,6 @@ def project_project_resource_delete_dashboard_cmd(
8977
8941
  )
8978
8942
 
8979
8943
 
8980
- @project_project_resource_group.command("delete_agent")
8981
- def project_project_resource_delete_agent_cmd(
8982
- release_id: int = typer.Argument(..., help="Agent resource release ID."),
8983
- yes: bool = typer.Option(False, "--yes", help="Delete without confirmation."),
8984
- timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
8985
- ):
8986
- """
8987
- Delete an agent resource release.
8988
-
8989
- Examples
8990
- --------
8991
- ```bash
8992
- mainsequence project project_resource delete_agent 601
8993
- mainsequence project project_resource delete_agent 601 --yes
8994
- ```
8995
- """
8996
- _project_resource_release_delete_impl(
8997
- release_id=release_id,
8998
- expected_release_kind="agent",
8999
- yes=yes,
9000
- timeout=timeout,
9001
- )
9002
-
9003
-
9004
8944
  @project_project_resource_group.command("delete_fastapi")
9005
8945
  def project_project_resource_delete_fastapi_cmd(
9006
8946
  release_id: int = typer.Argument(..., help="FastAPI resource release ID."),
@@ -9574,10 +9514,14 @@ def project_jobs_list_cmd(
9574
9514
  @project_jobs_group.command("run")
9575
9515
  def project_jobs_run_cmd(
9576
9516
  job_id: int = pydantic_argument(JOB_MODEL_REF, "id", ..., help="Job ID to run."),
9517
+ passthrough_args: list[str] | None = typer.Argument(
9518
+ None,
9519
+ help="Additional per-run args after `--`, for example `mainsequence project jobs run 91 -- --name demo`.",
9520
+ ),
9577
9521
  command_args: list[str] | None = typer.Option(
9578
9522
  None,
9579
- "--command",
9580
- help="Per-run command argument. Repeat to send a list of strings to Job.run_job().",
9523
+ "--arg",
9524
+ help="Append one per-run arg to the saved job entrypoint. Repeatable. Does not replace the saved execution_path or app_name.",
9581
9525
  ),
9582
9526
  timeout: int | None = typer.Option(None, "--timeout", help="Request timeout in seconds"),
9583
9527
  ):
@@ -9585,21 +9529,43 @@ def project_jobs_run_cmd(
9585
9529
  Run a project job immediately.
9586
9530
 
9587
9531
  Uses SDK client `Job.run_job()` as the single source of truth.
9532
+ Per-run args are appended to the saved job entrypoint; they do not replace it.
9588
9533
 
9589
9534
  Examples
9590
9535
  --------
9591
9536
  ```bash
9592
9537
  mainsequence project jobs run 91
9593
- mainsequence project jobs run 91 --command python --command -m --command jobs.daily
9538
+ mainsequence project jobs run 91 --arg demo-from-cli
9539
+ mainsequence project jobs run 91 -- --name demo-from-cli
9594
9540
  mainsequence project jobs run 91 --timeout 60
9595
9541
  ```
9596
9542
  """
9597
9543
  _require_login()
9598
9544
 
9545
+ merged_command_args = list(command_args or [])
9546
+ if passthrough_args:
9547
+ merged_command_args.extend(str(arg) for arg in passthrough_args)
9548
+
9549
+ try:
9550
+ job_payload = get_project_job(job_id, timeout=timeout)
9551
+ except ApiError as e:
9552
+ error(f"Project job fetch failed: {e}")
9553
+ raise typer.Exit(1) from e
9554
+
9555
+ entrypoint = str(job_payload.get("execution_path") or "").strip()
9556
+ if not entrypoint:
9557
+ app_name = str(job_payload.get("app_name") or "").strip()
9558
+ if app_name:
9559
+ entrypoint = f"app:{app_name}"
9560
+
9561
+ if entrypoint:
9562
+ effective_tokens = [entrypoint, *merged_command_args]
9563
+ info(f"Effective run: {shlex.join(effective_tokens)}")
9564
+
9599
9565
  try:
9600
9566
  payload = run_project_job(
9601
9567
  job_id=job_id,
9602
- command_args=list(command_args) if command_args else None,
9568
+ command_args=merged_command_args or None,
9603
9569
  timeout=timeout,
9604
9570
  )
9605
9571
  except ApiError as e:
@@ -10625,7 +10591,7 @@ def project_refresh_token(
10625
10591
  def project_freeze_env(
10626
10592
  project_id: int | None = typer.Argument(None, help="Project ID"),
10627
10593
  path: str | None = typer.Option(None, "--path", help="Project directory"),
10628
- ensure_uv: bool = typer.Option(True, "--ensure-uv/--no-ensure-uv", help="Install uv into .venv if missing"),
10594
+ ensure_uv: bool = typer.Option(True, "--ensure-uv/--no-ensure-uv", help="Allow resolving uv from PATH when it is not present inside .venv."),
10629
10595
  ):
10630
10596
  """
10631
10597
  Export pinned dependencies into `requirements.txt` using `uv`.
@@ -10637,7 +10603,7 @@ def project_freeze_env(
10637
10603
  path:
10638
10604
  Explicit local path.
10639
10605
  ensure_uv:
10640
- Install `uv` in `.venv` if missing.
10606
+ Allow resolving `uv` from PATH when it is not present inside `.venv`.
10641
10607
 
10642
10608
  Examples
10643
10609
  --------
@@ -10736,7 +10702,7 @@ def project_sync(
10736
10702
  raise typer.Exit(1)
10737
10703
 
10738
10704
  steps = [
10739
- "pip install uv (in .venv)",
10705
+ "resolve uv executable",
10740
10706
  f"uv version --bump {bump}",
10741
10707
  "uv lock",
10742
10708
  "uv sync",
@@ -11045,7 +11011,7 @@ def project_update_sdk(
11045
11011
  ensure_venv(project_dir)
11046
11012
 
11047
11013
  steps = [
11048
- "pip install uv (in .venv)",
11014
+ "resolve uv executable",
11049
11015
  "uv lock --upgrade-package mainsequence",
11050
11016
  "uv sync",
11051
11017
  ]
@@ -13,6 +13,7 @@ Local operations shared by several commands:
13
13
 
14
14
  import os
15
15
  import pathlib
16
+ import shutil
16
17
  import subprocess
17
18
  import sys
18
19
  from dataclasses import dataclass
@@ -62,7 +63,7 @@ def ensure_venv(project_dir: pathlib.Path) -> VenvPaths:
62
63
 
63
64
  def ensure_uv_installed(project_dir: pathlib.Path, upgrade: bool = True) -> pathlib.Path:
64
65
  """
65
- Ensure uv is installed inside the project's .venv.
66
+ Resolve a usable uv executable for the project workflow.
66
67
 
67
68
  Returns:
68
69
  Path to uv executable
@@ -71,18 +72,11 @@ def ensure_uv_installed(project_dir: pathlib.Path, upgrade: bool = True) -> path
71
72
  if vp.uv and vp.uv.exists():
72
73
  return vp.uv
73
74
 
74
- args = [str(vp.python), "-m", "pip", "install"]
75
- if upgrade:
76
- args.append("--upgrade")
77
- args.append("uv")
78
- r = subprocess.run(args, cwd=str(project_dir))
79
- if r.returncode != 0:
80
- raise RuntimeError("Failed to install uv into the virtual environment.")
75
+ uv_bin = shutil.which("uv")
76
+ if uv_bin:
77
+ return pathlib.Path(uv_bin)
81
78
 
82
- vp = venv_paths(project_dir)
83
- if not vp.uv or not vp.uv.exists():
84
- raise RuntimeError("uv installed but executable not found in .venv.")
85
- return vp.uv
79
+ raise RuntimeError("uv executable not found. Install uv and ensure it is available in PATH.")
86
80
 
87
81
 
88
82
  def run_cmd(cmd: list[str], cwd: pathlib.Path, env: dict[str, str] | None = None) -> subprocess.CompletedProcess:
@@ -101,7 +101,7 @@ class Workspace(LabelableObjectMixin, ShareableObjectMixin, CommandCenterBaseObj
101
101
  description="Free-form workspace description.",
102
102
  )
103
103
  type: WorkspaceType = Field(default=WorkspaceType.WORKSPACE)
104
- public_url:str=Field(description="Public URL for workspace endpoint if exists.", default="")
104
+ public_url:str| None =Field(description="Public URL for workspace endpoint if exists.", default=None)
105
105
  created_at:datetime=Field()
106
106
  labels: list[str] = Field(
107
107
  default_factory=list,
@@ -728,7 +728,7 @@ class Job(BaseObjectOrm, BasePydanticModel):
728
728
 
729
729
  payload: dict[str, Any] = {}
730
730
  if command_args is not None:
731
- payload["command_args"] = command_args
731
+ payload["json"] = {"command_args": list(command_args)}
732
732
 
733
733
  r = make_request(
734
734
  s=s,
@@ -954,10 +954,10 @@ class ProjectResource(BaseObjectOrm, BasePydanticModel):
954
954
  description="Display name of the resource discovered in the project's repository.",
955
955
  examples=["analytics_dashboard.py"],
956
956
  )
957
- resource_type: Literal["dashboard", "agent", "fastapi", "markdown"] | None = Field(
957
+ resource_type: Literal["dashboard", "fastapi", "markdown"] | None = Field(
958
958
  None,
959
959
  title="Resource Type",
960
- description="Type of the project resource. Allowed values are `dashboard`, `agent`, `fastapi`, and `markdown`.",
960
+ description="Type of the project resource. Allowed values are `dashboard`, `fastapi`, and `markdown`.",
961
961
  examples=["dashboard", "fastapi", "markdown"],
962
962
  )
963
963
  code: str | None = Field(
@@ -1027,15 +1027,6 @@ class ProjectResource(BaseObjectOrm, BasePydanticModel):
1027
1027
  **kwargs,
1028
1028
  )
1029
1029
 
1030
- def create_agent(self, timeout=None, files=None, *args, **kwargs) -> ResourceRelease:
1031
- return self._create_release(
1032
- ResourceReleaseKind.AGENT,
1033
- timeout,
1034
- files,
1035
- *args,
1036
- **kwargs,
1037
- )
1038
-
1039
1030
  def create_fastapi(self, timeout=None, files=None, *args, **kwargs) -> ResourceRelease:
1040
1031
  return self._create_release(
1041
1032
  ResourceReleaseKind.FAST_API,
@@ -1048,7 +1039,6 @@ class ProjectResource(BaseObjectOrm, BasePydanticModel):
1048
1039
 
1049
1040
  class ResourceReleaseKind(str, Enum):
1050
1041
  STREAMLIT_DASHBOARD = "streamlit_dashboard"
1051
- AGENT = "agent"
1052
1042
  FAST_API = "fastapi"
1053
1043
 
1054
1044
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mainsequence
3
- Version: 3.19.3
3
+ Version: 3.19.6
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
@@ -154,6 +154,7 @@ Recommended entry points:
154
154
  - [Working With Simple Tables](docs/tutorial/working_with_simple_tables.md)
155
155
  - [Create Your First API](docs/tutorial/create_your_first_api.md)
156
156
  - [Role-Based Access Control](docs/tutorial/role_based_access_control.md)
157
+ - [Turn Your Project Into an Agent](docs/tutorial/project_to_agent.md)
157
158
  - Knowledge:
158
159
  - [Data Nodes](docs/knowledge/data_nodes.md)
159
160
  - [Command Center](docs/knowledge/command_center/index.md)
@@ -209,6 +210,7 @@ From there, the normal learning path is:
209
210
  4. understand sharing and RBAC
210
211
  5. schedule jobs
211
212
  6. build dashboards or downstream consumers
213
+ 7. package the project as an agent-facing surface when the repository is ready
212
214
 
213
215
  ## Installation for development
214
216
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "mainsequence"
7
- version = "3.19.3"
7
+ version = "3.19.6"
8
8
  description = "Main Sequence SDK "
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"