synth-ai 0.22.2.dev678__tar.gz → 0.22.2.dev680__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 (343) hide show
  1. {synth_ai-0.22.2.dev678/synth_ai.egg-info → synth_ai-0.22.2.dev680}/PKG-INFO +1 -1
  2. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/openapi/research-v1.json +259 -0
  3. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/pyproject.toml +1 -1
  4. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/contributions.py +25 -1
  5. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/__init__.py +2 -0
  6. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/operations.py +30 -0
  7. synth_ai-0.22.2.dev680/synth_ai/sdk/research/contracts/swarm_controls.py +55 -0
  8. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/operations.py +10 -0
  9. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/swarms.py +118 -0
  10. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680/synth_ai.egg-info}/PKG-INFO +1 -1
  11. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai.egg-info/SOURCES.txt +1 -0
  12. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/LICENSE +0 -0
  13. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/MANIFEST.in +0 -0
  14. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/README.md +0 -0
  15. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/openapi/index-v1.json +0 -0
  16. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/openapi/messaging-v1.json +0 -0
  17. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/setup.cfg +0 -0
  18. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/setup.py +0 -0
  19. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/README.md +0 -0
  20. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/__init__.py +0 -0
  21. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/__main__.py +0 -0
  22. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/AGENTS.md +0 -0
  23. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/README.md +0 -0
  24. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/__init__.py +0 -0
  25. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/__main__.py +0 -0
  26. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/index.py +0 -0
  27. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/main.py +0 -0
  28. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/research.py +0 -0
  29. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/research_environments.py +0 -0
  30. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/research_image_releases.py +0 -0
  31. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/cli/research_projects.py +0 -0
  32. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/client.py +0 -0
  33. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/README.md +0 -0
  34. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/__init__.py +0 -0
  35. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/auth/__init__.py +0 -0
  36. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/auth/credentials.py +0 -0
  37. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/contracts/__init__.py +0 -0
  38. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/contracts/json_value.py +0 -0
  39. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/contracts/pagination.py +0 -0
  40. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/errors.py +0 -0
  41. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/http/__init__.py +0 -0
  42. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/http/async_transport.py +0 -0
  43. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/http/request.py +0 -0
  44. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/http/retry.py +0 -0
  45. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/http/streaming.py +0 -0
  46. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/http/transport.py +0 -0
  47. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/research/__init__.py +0 -0
  48. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/utils/__init__.py +0 -0
  49. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/utils/env.py +0 -0
  50. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/utils/log_filter.py +0 -0
  51. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/utils/paths.py +0 -0
  52. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/core/utils/urls.py +0 -0
  53. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/README.md +0 -0
  54. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/__init__.py +0 -0
  55. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/__main__.py +0 -0
  56. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/objective_tools.py +0 -0
  57. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/registry.py +0 -0
  58. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/request_models.py +0 -0
  59. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/server.py +0 -0
  60. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/__init__.py +0 -0
  61. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/approvals.py +0 -0
  62. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/artifacts.py +0 -0
  63. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/datasets.py +0 -0
  64. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/environments.py +0 -0
  65. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/exports.py +0 -0
  66. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/factories.py +0 -0
  67. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/factory_results.py +0 -0
  68. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/files.py +0 -0
  69. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/image_releases.py +0 -0
  70. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/index.py +0 -0
  71. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/index_qa.py +0 -0
  72. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/integrations.py +0 -0
  73. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/intern_program.py +0 -0
  74. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/local_files.py +0 -0
  75. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/logs.py +0 -0
  76. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/models.py +0 -0
  77. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/outputs.py +0 -0
  78. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
  79. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/progress.py +0 -0
  80. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/project_data.py +0 -0
  81. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/projects.py +0 -0
  82. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/prs.py +0 -0
  83. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/readiness.py +0 -0
  84. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/repos.py +0 -0
  85. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/research_intern.py +0 -0
  86. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/resource_reads.py +0 -0
  87. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/resources.py +0 -0
  88. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/runs.py +0 -0
  89. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/scientific_records.py +0 -0
  90. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/trained_models.py +0 -0
  91. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/usage.py +0 -0
  92. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/visuals.py +0 -0
  93. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/mcp/research/tools/workspace_inputs.py +0 -0
  94. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/pools.py +0 -0
  95. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/py.typed +0 -0
  96. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/README.md +0 -0
  97. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/__init__.py +0 -0
  98. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/AGENT_SETUP_PROMPT.md +0 -0
  99. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/README.md +0 -0
  100. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/__init__.py +0 -0
  101. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/agent_policy.py +0 -0
  102. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/artifacts.py +0 -0
  103. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/catalog.py +0 -0
  104. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/catalogue.py +0 -0
  105. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/classification.py +0 -0
  106. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/client.py +0 -0
  107. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/contracts.py +0 -0
  108. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/errors.py +0 -0
  109. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/forge_notices.py +0 -0
  110. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/intake.py +0 -0
  111. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/lifecycle.py +0 -0
  112. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/manifest.py +0 -0
  113. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/oauth.py +0 -0
  114. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/package.py +0 -0
  115. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/public.py +0 -0
  116. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/public_corpus.py +0 -0
  117. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/public_search.py +0 -0
  118. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/qa.py +0 -0
  119. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/qa_checks.py +0 -0
  120. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/qa_preflight.py +0 -0
  121. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/qa_reviews.py +0 -0
  122. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/research/__init__.py +0 -0
  123. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/research/build.py +0 -0
  124. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/research/capture.py +0 -0
  125. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/research/contracts.py +0 -0
  126. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/research/files.py +0 -0
  127. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/research/release.py +0 -0
  128. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/research_intake.py +0 -0
  129. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/retry.py +0 -0
  130. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/rights.py +0 -0
  131. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/scientific_provenance.py +0 -0
  132. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/scope_errors.py +0 -0
  133. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/scopes.py +0 -0
  134. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/search.py +0 -0
  135. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/submission.py +0 -0
  136. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/timeouts.py +0 -0
  137. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/transfer.py +0 -0
  138. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/upload_session.py +0 -0
  139. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/usage_accounting.py +0 -0
  140. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/value.py +0 -0
  141. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/index/wallet_search.py +0 -0
  142. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/messaging/README.md +0 -0
  143. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/messaging/__init__.py +0 -0
  144. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/messaging/client.py +0 -0
  145. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/messaging/contracts.py +0 -0
  146. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/optimizers/__init__.py +0 -0
  147. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/optimizers/client.py +0 -0
  148. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/optimizers/contracts.py +0 -0
  149. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/pagination.py +0 -0
  150. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/__init__.py +0 -0
  151. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/_internal/__init__.py +0 -0
  152. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/_internal/crypto.py +0 -0
  153. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/_internal/env.py +0 -0
  154. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/_internal/urls.py +0 -0
  155. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/account.py +0 -0
  156. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/advanced.py +0 -0
  157. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/advanced_factories.py +0 -0
  158. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/advanced_swarms.py +0 -0
  159. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/artifacts.py +0 -0
  160. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/auth.py +0 -0
  161. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/client.py +0 -0
  162. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/container_pools/__init__.py +0 -0
  163. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/container_pools/api.py +0 -0
  164. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/container_pools/contracts.py +0 -0
  165. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/container_pools/operations.py +0 -0
  166. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/container_pools/packaging.py +0 -0
  167. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
  168. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
  169. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
  170. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/_wire.py +0 -0
  171. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/activity.py +0 -0
  172. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
  173. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
  174. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/billing.py +0 -0
  175. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/canonical_usage.py +0 -0
  176. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
  177. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
  178. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
  179. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/common.py +0 -0
  180. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
  181. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
  182. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
  183. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/economics.py +0 -0
  184. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
  185. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/environments.py +0 -0
  186. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/evidence.py +0 -0
  187. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/factories.py +0 -0
  188. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
  189. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
  190. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/factory_operations.py +0 -0
  191. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
  192. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/failure.py +0 -0
  193. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/__init__.py +0 -0
  194. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/contracts.py +0 -0
  195. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/evaluation.py +0 -0
  196. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/exports.py +0 -0
  197. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/records.py +0 -0
  198. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/resources.py +0 -0
  199. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/forge/schema.py +0 -0
  200. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
  201. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/intern_blockers.py +0 -0
  202. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/intern_grants.py +0 -0
  203. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/intern_program.py +0 -0
  204. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/intern_resources.py +0 -0
  205. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/intern_usage.py +0 -0
  206. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/limit_evidence.py +0 -0
  207. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
  208. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
  209. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/project.py +0 -0
  210. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/project_data.py +0 -0
  211. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
  212. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
  213. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
  214. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/projects.py +0 -0
  215. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/promotions.py +0 -0
  216. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/research_intern.py +0 -0
  217. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/resource_reads.py +0 -0
  218. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/resource_settlement.py +0 -0
  219. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
  220. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_control.py +0 -0
  221. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
  222. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_events.py +0 -0
  223. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
  224. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
  225. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
  226. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_state.py +0 -0
  227. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
  228. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/runtime_image.py +0 -0
  229. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
  230. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
  231. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
  232. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
  233. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
  234. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
  235. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
  236. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
  237. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
  238. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
  239. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
  240. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
  241. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
  242. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
  243. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
  244. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
  245. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
  246. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
  247. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_providers.py +0 -0
  248. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
  249. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
  250. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_run_policy.py +0 -0
  251. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
  252. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
  253. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
  254. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
  255. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
  256. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/status.py +0 -0
  257. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/swarm_rollouts.py +0 -0
  258. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/swarms.py +0 -0
  259. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/tag.py +0 -0
  260. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/traces.py +0 -0
  261. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/transcript.py +0 -0
  262. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/types.py +0 -0
  263. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/usage.py +0 -0
  264. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/visuals.py +0 -0
  265. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/wire_models.py +0 -0
  266. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/wire_models_README.md +0 -0
  267. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/work_products.py +0 -0
  268. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/contracts/workspaces.py +0 -0
  269. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/economics.py +0 -0
  270. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/efforts.py +0 -0
  271. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/environments.py +0 -0
  272. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/errors.py +0 -0
  273. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/events.py +0 -0
  274. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/experiments.py +0 -0
  275. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/facade.py +0 -0
  276. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/factories.py +0 -0
  277. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/factory_storage.py +0 -0
  278. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/image_releases.py +0 -0
  279. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/intern_blockers.py +0 -0
  280. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/intern_program.py +0 -0
  281. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/knowledge.py +0 -0
  282. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/models.py +0 -0
  283. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/project_data.py +0 -0
  284. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/project_deliveries.py +0 -0
  285. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/project_workspaces.py +0 -0
  286. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/projects.py +0 -0
  287. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/public.py +0 -0
  288. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/readouts.py +0 -0
  289. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/research_intern.py +0 -0
  290. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/resource_reads.py +0 -0
  291. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/scientific_records.py +0 -0
  292. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/secrets.py +0 -0
  293. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/README.md +0 -0
  294. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/__init__.py +0 -0
  295. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/_base.py +0 -0
  296. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/_client_helpers.py +0 -0
  297. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/_run_authority_mixin.py +0 -0
  298. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/approvals.py +0 -0
  299. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/billing.py +0 -0
  300. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/client.py +0 -0
  301. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
  302. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/config.py +0 -0
  303. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/cost.py +0 -0
  304. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/datasets.py +0 -0
  305. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/dev_environments.py +0 -0
  306. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/environments.py +0 -0
  307. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/exports.py +0 -0
  308. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/factories.py +0 -0
  309. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
  310. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/files.py +0 -0
  311. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/github.py +0 -0
  312. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/image_releases.py +0 -0
  313. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/images.py +0 -0
  314. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/logs.py +0 -0
  315. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/models.py +0 -0
  316. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/outputs.py +0 -0
  317. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/progress.py +0 -0
  318. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/project.py +0 -0
  319. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/projects.py +0 -0
  320. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/prs.py +0 -0
  321. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/readiness.py +0 -0
  322. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/repositories.py +0 -0
  323. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/runs.py +0 -0
  324. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/secrets.py +0 -0
  325. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/setup.py +0 -0
  326. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/tag.py +0 -0
  327. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/trained_models.py +0 -0
  328. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/transport.py +0 -0
  329. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/usage.py +0 -0
  330. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/work_products.py +0 -0
  331. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
  332. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/surface_parity.py +0 -0
  333. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/traces.py +0 -0
  334. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/transport/__init__.py +0 -0
  335. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/transport/http.py +0 -0
  336. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/transport/pagination.py +0 -0
  337. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/version.py +0 -0
  338. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/visuals.py +0 -0
  339. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai/sdk/research/wiki.py +0 -0
  340. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai.egg-info/dependency_links.txt +0 -0
  341. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai.egg-info/entry_points.txt +0 -0
  342. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai.egg-info/requires.txt +0 -0
  343. {synth_ai-0.22.2.dev678 → synth_ai-0.22.2.dev680}/synth_ai.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synth-ai
3
- Version: 0.22.2.dev678
3
+ Version: 0.22.2.dev680
4
4
  Summary: Python SDK, CLI and MCP servers for Synth Index search and Swarms
5
5
  Author-email: Synth AI <josh@usesynth.ai>
6
6
  License-Expression: MIT
@@ -22119,6 +22119,131 @@
22119
22119
  "title": "SmrOpenEndedQuestionInlineCreateRequest",
22120
22120
  "type": "object"
22121
22121
  },
22122
+ "SmrOrchestraActionAnswerRequest": {
22123
+ "additionalProperties": false,
22124
+ "description": "Answer one Orchestra ``pending_questions[]`` action (``action_answer``).",
22125
+ "properties": {
22126
+ "idempotency_key": {
22127
+ "anyOf": [
22128
+ {
22129
+ "type": "string"
22130
+ },
22131
+ {
22132
+ "type": "null"
22133
+ }
22134
+ ],
22135
+ "title": "Idempotency Key"
22136
+ },
22137
+ "response_text": {
22138
+ "minLength": 1,
22139
+ "title": "Response Text",
22140
+ "type": "string"
22141
+ }
22142
+ },
22143
+ "required": [
22144
+ "response_text"
22145
+ ],
22146
+ "title": "SmrOrchestraActionAnswerRequest",
22147
+ "type": "object"
22148
+ },
22149
+ "SmrOrchestraOperationReceiptResponse": {
22150
+ "additionalProperties": false,
22151
+ "description": "Orchestra's write receipt for a public answer/steer (HTTP 202).\n\n``status`` is Orchestra's: ``accepted`` for a new write, ``duplicate`` for\na replay of the same ``operation_id`` with the same request.",
22152
+ "properties": {
22153
+ "action_id": {
22154
+ "anyOf": [
22155
+ {
22156
+ "type": "string"
22157
+ },
22158
+ {
22159
+ "type": "null"
22160
+ }
22161
+ ],
22162
+ "title": "Action Id"
22163
+ },
22164
+ "control_seq": {
22165
+ "anyOf": [
22166
+ {
22167
+ "type": "integer"
22168
+ },
22169
+ {
22170
+ "type": "null"
22171
+ }
22172
+ ],
22173
+ "title": "Control Seq"
22174
+ },
22175
+ "interaction_id": {
22176
+ "anyOf": [
22177
+ {
22178
+ "type": "string"
22179
+ },
22180
+ {
22181
+ "type": "null"
22182
+ }
22183
+ ],
22184
+ "title": "Interaction Id"
22185
+ },
22186
+ "kind": {
22187
+ "enum": [
22188
+ "action_answer",
22189
+ "steer"
22190
+ ],
22191
+ "title": "Kind",
22192
+ "type": "string"
22193
+ },
22194
+ "operation_id": {
22195
+ "title": "Operation Id",
22196
+ "type": "string"
22197
+ },
22198
+ "run_id": {
22199
+ "title": "Run Id",
22200
+ "type": "string"
22201
+ },
22202
+ "status": {
22203
+ "enum": [
22204
+ "accepted",
22205
+ "duplicate"
22206
+ ],
22207
+ "title": "Status",
22208
+ "type": "string"
22209
+ }
22210
+ },
22211
+ "required": [
22212
+ "run_id",
22213
+ "operation_id",
22214
+ "kind",
22215
+ "status"
22216
+ ],
22217
+ "title": "SmrOrchestraOperationReceiptResponse",
22218
+ "type": "object"
22219
+ },
22220
+ "SmrOrchestraSteerRequest": {
22221
+ "additionalProperties": false,
22222
+ "description": "Steer an orchestra-authority run (Orchestra ``RunControl::Steer``).",
22223
+ "properties": {
22224
+ "idempotency_key": {
22225
+ "anyOf": [
22226
+ {
22227
+ "type": "string"
22228
+ },
22229
+ {
22230
+ "type": "null"
22231
+ }
22232
+ ],
22233
+ "title": "Idempotency Key"
22234
+ },
22235
+ "message": {
22236
+ "minLength": 1,
22237
+ "title": "Message",
22238
+ "type": "string"
22239
+ }
22240
+ },
22241
+ "required": [
22242
+ "message"
22243
+ ],
22244
+ "title": "SmrOrchestraSteerRequest",
22245
+ "type": "object"
22246
+ },
22122
22247
  "SmrPatchVisualRequest": {
22123
22248
  "properties": {
22124
22249
  "summary": {
@@ -50558,6 +50683,78 @@
50558
50683
  ]
50559
50684
  }
50560
50685
  },
50686
+ "/smr/runs/{run_id}/actions/{action_id}/answer": {
50687
+ "post": {
50688
+ "description": "Answer an Orchestra ``pending_questions[]`` action on an orchestra run.",
50689
+ "operationId": "answer_run_action",
50690
+ "parameters": [
50691
+ {
50692
+ "in": "path",
50693
+ "name": "run_id",
50694
+ "required": true,
50695
+ "schema": {
50696
+ "title": "Run Id",
50697
+ "type": "string"
50698
+ }
50699
+ },
50700
+ {
50701
+ "in": "path",
50702
+ "name": "action_id",
50703
+ "required": true,
50704
+ "schema": {
50705
+ "minLength": 1,
50706
+ "title": "Action Id",
50707
+ "type": "string"
50708
+ }
50709
+ }
50710
+ ],
50711
+ "requestBody": {
50712
+ "content": {
50713
+ "application/json": {
50714
+ "schema": {
50715
+ "$ref": "#/components/schemas/SmrOrchestraActionAnswerRequest"
50716
+ }
50717
+ }
50718
+ },
50719
+ "required": true
50720
+ },
50721
+ "responses": {
50722
+ "202": {
50723
+ "content": {
50724
+ "application/json": {
50725
+ "schema": {
50726
+ "$ref": "#/components/schemas/SmrOrchestraOperationReceiptResponse"
50727
+ }
50728
+ }
50729
+ },
50730
+ "description": "Successful Response"
50731
+ },
50732
+ "404": {
50733
+ "description": "Run not found in the caller's organization."
50734
+ },
50735
+ "409": {
50736
+ "description": "run_not_orchestra_authority | terminal_run | answer_conflict | idempotency_conflict | orchestra_run_not_launched | project_archived"
50737
+ },
50738
+ "422": {
50739
+ "content": {
50740
+ "application/json": {
50741
+ "schema": {
50742
+ "$ref": "#/components/schemas/HTTPValidationError"
50743
+ }
50744
+ }
50745
+ },
50746
+ "description": "Validation Error"
50747
+ },
50748
+ "503": {
50749
+ "description": "orchestra_in_doubt | orchestra_unavailable (retryable)"
50750
+ }
50751
+ },
50752
+ "summary": "Answer Run Action",
50753
+ "tags": [
50754
+ "smr"
50755
+ ]
50756
+ }
50757
+ },
50561
50758
  "/smr/runs/{run_id}/activity": {
50562
50759
  "get": {
50563
50760
  "description": "Return typed bounded execution activity for a swarm.",
@@ -52050,6 +52247,68 @@
52050
52247
  ]
52051
52248
  }
52052
52249
  },
52250
+ "/smr/runs/{run_id}/steer": {
52251
+ "post": {
52252
+ "description": "Steer an orchestra-authority run (Orchestra ``RunControl::Steer``).",
52253
+ "operationId": "steer_run",
52254
+ "parameters": [
52255
+ {
52256
+ "in": "path",
52257
+ "name": "run_id",
52258
+ "required": true,
52259
+ "schema": {
52260
+ "title": "Run Id",
52261
+ "type": "string"
52262
+ }
52263
+ }
52264
+ ],
52265
+ "requestBody": {
52266
+ "content": {
52267
+ "application/json": {
52268
+ "schema": {
52269
+ "$ref": "#/components/schemas/SmrOrchestraSteerRequest"
52270
+ }
52271
+ }
52272
+ },
52273
+ "required": true
52274
+ },
52275
+ "responses": {
52276
+ "202": {
52277
+ "content": {
52278
+ "application/json": {
52279
+ "schema": {
52280
+ "$ref": "#/components/schemas/SmrOrchestraOperationReceiptResponse"
52281
+ }
52282
+ }
52283
+ },
52284
+ "description": "Successful Response"
52285
+ },
52286
+ "404": {
52287
+ "description": "Run not found in the caller's organization."
52288
+ },
52289
+ "409": {
52290
+ "description": "run_not_orchestra_authority | terminal_run | answer_conflict | idempotency_conflict | orchestra_run_not_launched | project_archived"
52291
+ },
52292
+ "422": {
52293
+ "content": {
52294
+ "application/json": {
52295
+ "schema": {
52296
+ "$ref": "#/components/schemas/HTTPValidationError"
52297
+ }
52298
+ }
52299
+ },
52300
+ "description": "Validation Error"
52301
+ },
52302
+ "503": {
52303
+ "description": "orchestra_in_doubt | orchestra_unavailable (retryable)"
52304
+ }
52305
+ },
52306
+ "summary": "Steer Run",
52307
+ "tags": [
52308
+ "smr"
52309
+ ]
52310
+ }
52311
+ },
52053
52312
  "/smr/runs/{run_id}/stop": {
52054
52313
  "post": {
52055
52314
  "operationId": "stop_run",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "synth-ai"
3
- version = "0.22.2.dev678"
3
+ version = "0.22.2.dev680"
4
4
  description = "Python SDK, CLI and MCP servers for Synth Index search and Swarms"
5
5
  keywords = ["synth", "index", "search", "citations", "research", "swarms", "mcp", "sdk"]
6
6
  authors = [{name = "Synth AI", email = "josh@usesynth.ai"}]
@@ -13,6 +13,7 @@ from uuid import UUID
13
13
  from pydantic import BeforeValidator, Field, StringConstraints, field_validator, model_validator
14
14
 
15
15
  from synth_ai.sdk.research.contracts.forge.contracts import ExactReference, Identifier
16
+ from synth_ai.sdk.research.contracts.forge.operations import RevisionReference
16
17
 
17
18
  from .artifacts import ArtifactPublicationPrepareResponse, ArtifactUuid
18
19
  from .contracts import ContributionReference, IndexContract
@@ -112,13 +113,36 @@ class ForgeResearchSource(IndexContract):
112
113
  return self
113
114
 
114
115
 
116
+ ARCHIVE_V3 = "forge.private-archive.v3"
117
+
118
+
115
119
  class ForgePublicResearchSource(ForgeResearchSource):
116
- """Exact private archive plus safe proposed public credit; backend decides release."""
120
+ """Exact private archive plus safe proposed public credit; backend decides release.
121
+
122
+ Mirrors backend ``packages/contributions/forge_release.py``. ``revision_reference``
123
+ (Forge decision 0001, ``forge.revision-reference.v1``) binds the selected export's
124
+ producer, operation and time, not only its payload; ``archive_schema_version`` names
125
+ the private archive version that carries those references (v3). The backend public
126
+ review policy refuses a Forge-origin public source that omits either
127
+ (``forge_revision_reference_required``, ``forge_archive_v3_required``); they stay
128
+ optional on the wire so older private registrations still decode.
129
+ """
117
130
 
118
131
  schema_version: Literal["synth.index.forge-source.v2"] = "synth.index.forge-source.v2"
119
132
  archive_publication_id: ArtifactUuid
120
133
  archive_manifest_digest_sha256: Digest
121
134
  public_provenance: PublicScientificProvenance
135
+ revision_reference: RevisionReference | None = None
136
+ archive_schema_version: Literal["forge.private-archive.v3"] | None = None
137
+
138
+ @model_validator(mode="after")
139
+ def provenance_pin_names_the_export(self):
140
+ if (
141
+ self.revision_reference is not None
142
+ and self.revision_reference.reference != self.export
143
+ ):
144
+ raise ValueError("revision reference must name the exported revision")
145
+ return self
122
146
 
123
147
 
124
148
  def _legacy_source_version(value):
@@ -428,6 +428,7 @@ from synth_ai.sdk.research.contracts.runtime_stream_snapshot import (
428
428
  RuntimeWorkersSnapshot,
429
429
  SwarmRuntimeSnapshot,
430
430
  )
431
+ from synth_ai.sdk.research.contracts.swarm_controls import SwarmControlReceipt
431
432
  from synth_ai.sdk.research.contracts.swarms import (
432
433
  ActiveActorModel,
433
434
  ActorHarness,
@@ -610,6 +611,7 @@ def __getattr__(name: str) -> object:
610
611
 
611
612
 
612
613
  __all__ = [
614
+ "SwarmControlReceipt",
613
615
  "AiCacheMode",
614
616
  "AiCachePolicy",
615
617
  "ActiveActorModel",
@@ -10,6 +10,7 @@ from .contracts import (
10
10
  Contract,
11
11
  Digest,
12
12
  ExactReference,
13
+ ForgeError,
13
14
  Identifier,
14
15
  Producer,
15
16
  Scope,
@@ -67,6 +68,35 @@ class RecordRevision(Contract):
67
68
  recorded_at: AwareDatetime
68
69
 
69
70
 
71
+ REVISION_REFERENCE_V1 = "forge.revision-reference.v1"
72
+
73
+
74
+ class RevisionReference(Contract):
75
+ """Exact identity of one complete retained revision, provenance included.
76
+
77
+ See docs/decisions/0001. ``reference.digest_sha256`` keeps its payload-only
78
+ meaning; ``document_digest_sha256`` binds producer, operation and time too.
79
+ It proves the document Forge recorded, not external producer attestation.
80
+ """
81
+
82
+ schema_version: Literal["forge.revision-reference.v1"] = REVISION_REFERENCE_V1
83
+ reference: ExactReference
84
+ document_digest_sha256: Digest
85
+
86
+
87
+ def revision_reference(record: RecordRevision) -> RevisionReference:
88
+ record = RecordRevision.model_validate(record.model_dump(mode="json"))
89
+ if (
90
+ record.reference.authority != "forge"
91
+ or record.reference.kind != record.payload.kind
92
+ or record.reference.digest_sha256 != contract_digest(record.payload)
93
+ ):
94
+ raise ForgeError("reference_conflict", "record differs from exact source bytes")
95
+ return RevisionReference(
96
+ reference=record.reference, document_digest_sha256=contract_digest(record)
97
+ )
98
+
99
+
70
100
  class PublicWrite(Contract):
71
101
  """Public intent; backend supplies authenticated producer and canonical scope."""
72
102
 
@@ -0,0 +1,55 @@
1
+ """Receipts for backend-owned native Swarm answer and steer operations.
2
+
3
+ # See: openapi/research-v1.json SmrOrchestraOperationReceiptResponse
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from dataclasses import dataclass
9
+ from typing import Literal, cast
10
+
11
+ from synth_ai.core.contracts.json_value import JsonValue
12
+ from synth_ai.sdk.research.contracts._wire import object_value, optional_text, required_text
13
+ from synth_ai.sdk.research.contracts.common import SwarmId
14
+
15
+ ControlKind = Literal["action_answer", "steer"]
16
+ ControlStatus = Literal["accepted", "duplicate"]
17
+
18
+
19
+ @dataclass(frozen=True, slots=True)
20
+ class SwarmControlReceipt:
21
+ """Durable acceptance acknowledgement; execution delivery remains asynchronous."""
22
+
23
+ swarm_id: SwarmId
24
+ operation_id: str
25
+ kind: ControlKind
26
+ status: ControlStatus
27
+ action_id: str | None = None
28
+ interaction_id: str | None = None
29
+ control_seq: int | None = None
30
+
31
+ @classmethod
32
+ def from_wire(cls, value: JsonValue) -> SwarmControlReceipt:
33
+ payload = object_value(value, operation_id="swarm control receipt")
34
+ required = {"run_id", "operation_id", "kind", "status"}
35
+ allowed = required | {"action_id", "interaction_id", "control_seq"}
36
+ if required - payload.keys() or payload.keys() - allowed:
37
+ raise ValueError("swarm control receipt fields drifted")
38
+ kind, status = required_text(payload, "kind"), required_text(payload, "status")
39
+ if kind not in ("action_answer", "steer") or status not in ("accepted", "duplicate"):
40
+ raise ValueError("swarm control receipt vocabulary drifted")
41
+ sequence = payload.get("control_seq")
42
+ if sequence is not None and (type(sequence) is not int or sequence < 0):
43
+ raise ValueError("swarm control sequence must be a non-negative integer")
44
+ return cls(
45
+ SwarmId(required_text(payload, "run_id")),
46
+ required_text(payload, "operation_id"),
47
+ cast(ControlKind, kind),
48
+ cast(ControlStatus, status),
49
+ optional_text(payload, "action_id"),
50
+ optional_text(payload, "interaction_id"),
51
+ cast(int | None, sequence),
52
+ )
53
+
54
+
55
+ __all__ = ["SwarmControlReceipt"]
@@ -22,6 +22,16 @@ def _operation(
22
22
  RESEARCH_OPERATIONS = {
23
23
  operation.operation_id: operation
24
24
  for operation in (
25
+ _operation(
26
+ "steer_run", HttpMethod.POST, "/smr/runs/{run_id}/steer", mutation=True, idempotent=True
27
+ ),
28
+ _operation(
29
+ "answer_run_action",
30
+ HttpMethod.POST,
31
+ "/smr/runs/{run_id}/actions/{action_id}/answer",
32
+ mutation=True,
33
+ idempotent=True,
34
+ ),
25
35
  _operation(
26
36
  "getExactDatasetRevision",
27
37
  HttpMethod.GET,
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
  import asyncio
6
6
  import time
7
7
  from collections.abc import AsyncIterator, Iterator, Mapping
8
+ from urllib.parse import quote
8
9
 
9
10
  from synth_ai.core.contracts.json_value import JsonObject, JsonValue
10
11
  from synth_ai.core.errors import SynthError
@@ -19,6 +20,7 @@ from synth_ai.sdk.research.contracts.common import (
19
20
  ProjectId,
20
21
  SwarmId,
21
22
  WorkProductId,
23
+ require_text,
22
24
  )
23
25
  from synth_ai.sdk.research.contracts.evidence import (
24
26
  ContentDisposition,
@@ -26,6 +28,7 @@ from synth_ai.sdk.research.contracts.evidence import (
26
28
  )
27
29
  from synth_ai.sdk.research.contracts.resource_settlement import RunResourceSettlement
28
30
  from synth_ai.sdk.research.contracts.status import SwarmStatus
31
+ from synth_ai.sdk.research.contracts.swarm_controls import SwarmControlReceipt
29
32
  from synth_ai.sdk.research.contracts.swarm_rollouts import SwarmRollout, swarm_rollouts_from_wire
30
33
  from synth_ai.sdk.research.contracts.swarms import (
31
34
  BranchResult,
@@ -100,6 +103,31 @@ def _stream_timeout(timeout_seconds: float | None) -> float | None:
100
103
  return timeout_seconds
101
104
 
102
105
 
106
+ def _control_body(field: str, text: str, idempotency_key: str | None) -> JsonObject:
107
+ if not isinstance(text, str) or not text.strip() or len(text.encode("utf-8")) > 16_384:
108
+ raise ValueError(f"{field} must be nonblank and at most 16384 UTF-8 bytes")
109
+ body: JsonObject = {field: text}
110
+ if idempotency_key is not None:
111
+ key = require_text(idempotency_key, field_name="idempotency_key")
112
+ if len(key) > 255:
113
+ raise ValueError("idempotency_key must be at most 255 characters")
114
+ body["idempotency_key"] = key
115
+ return body
116
+
117
+
118
+ def _control_receipt(
119
+ value: JsonValue, swarm_id: SwarmId, kind: str, action_id: str | None = None
120
+ ) -> SwarmControlReceipt:
121
+ receipt = SwarmControlReceipt.from_wire(value)
122
+ if (
123
+ receipt.swarm_id != swarm_id
124
+ or receipt.kind != kind
125
+ or (action_id is not None and receipt.action_id != action_id)
126
+ ):
127
+ raise ValueError("swarm control receipt does not match the request scope")
128
+ return receipt
129
+
130
+
103
131
  class SwarmHandle:
104
132
  """Handle returned when creating a Swarm."""
105
133
 
@@ -281,6 +309,18 @@ class SwarmHandle:
281
309
  timeout_seconds=timeout_seconds,
282
310
  )
283
311
 
312
+ def steer(self, message: str, *, idempotency_key: str | None = None) -> SwarmControlReceipt:
313
+ """Request native steering; acceptance is distinct from execution delivery."""
314
+ return self._api.steer(self.swarm_id, message, idempotency_key=idempotency_key)
315
+
316
+ def answer_action(
317
+ self, action_id: str, response_text: str, *, idempotency_key: str | None = None
318
+ ) -> SwarmControlReceipt:
319
+ """Answer the correlated action exposed by authoritative native history."""
320
+ return self._api.answer_action(
321
+ self.swarm_id, action_id, response_text, idempotency_key=idempotency_key
322
+ )
323
+
284
324
 
285
325
  class SwarmsAPI:
286
326
  """Swarm lifecycle operations."""
@@ -731,6 +771,38 @@ class SwarmsAPI:
731
771
  ):
732
772
  yield decode_swarm_event(event)
733
773
 
774
+ def steer(
775
+ self, swarm_id: SwarmId, message: str, *, idempotency_key: str | None = None
776
+ ) -> SwarmControlReceipt:
777
+ """Steer through the backend's native control ledger; reuse a key for retries."""
778
+ value = self._transport.execute(
779
+ _request(
780
+ "steer_run",
781
+ f"/smr/runs/{swarm_id}/steer",
782
+ body=_control_body("message", message, idempotency_key),
783
+ )
784
+ )
785
+ return _control_receipt(value, swarm_id, "steer")
786
+
787
+ def answer_action(
788
+ self,
789
+ swarm_id: SwarmId,
790
+ action_id: str,
791
+ response_text: str,
792
+ *,
793
+ idempotency_key: str | None = None,
794
+ ) -> SwarmControlReceipt:
795
+ """Answer a native action; changed bytes with the same key conflict server-side."""
796
+ action = require_text(action_id, field_name="action_id")
797
+ value = self._transport.execute(
798
+ _request(
799
+ "answer_run_action",
800
+ f"/smr/runs/{swarm_id}/actions/{quote(action, safe='')}/answer",
801
+ body=_control_body("response_text", response_text, idempotency_key),
802
+ )
803
+ )
804
+ return _control_receipt(value, swarm_id, "action_answer", action)
805
+
734
806
 
735
807
  class AsyncSwarmHandle:
736
808
  """Handle returned when creating a Swarm."""
@@ -918,6 +990,20 @@ class AsyncSwarmHandle:
918
990
  ):
919
991
  yield event
920
992
 
993
+ async def steer(
994
+ self, message: str, *, idempotency_key: str | None = None
995
+ ) -> SwarmControlReceipt:
996
+ """Request native steering; acceptance is distinct from execution delivery."""
997
+ return await self._api.steer(self.swarm_id, message, idempotency_key=idempotency_key)
998
+
999
+ async def answer_action(
1000
+ self, action_id: str, response_text: str, *, idempotency_key: str | None = None
1001
+ ) -> SwarmControlReceipt:
1002
+ """Answer the correlated action exposed by authoritative native history."""
1003
+ return await self._api.answer_action(
1004
+ self.swarm_id, action_id, response_text, idempotency_key=idempotency_key
1005
+ )
1006
+
921
1007
 
922
1008
  class AsyncSwarmsAPI:
923
1009
  """Swarm lifecycle operations."""
@@ -1340,6 +1426,38 @@ class AsyncSwarmsAPI:
1340
1426
  ):
1341
1427
  yield decode_swarm_event(event)
1342
1428
 
1429
+ async def steer(
1430
+ self, swarm_id: SwarmId, message: str, *, idempotency_key: str | None = None
1431
+ ) -> SwarmControlReceipt:
1432
+ """Steer through the backend's native control ledger; reuse a key for retries."""
1433
+ value = await self._transport.execute(
1434
+ _request(
1435
+ "steer_run",
1436
+ f"/smr/runs/{swarm_id}/steer",
1437
+ body=_control_body("message", message, idempotency_key),
1438
+ )
1439
+ )
1440
+ return _control_receipt(value, swarm_id, "steer")
1441
+
1442
+ async def answer_action(
1443
+ self,
1444
+ swarm_id: SwarmId,
1445
+ action_id: str,
1446
+ response_text: str,
1447
+ *,
1448
+ idempotency_key: str | None = None,
1449
+ ) -> SwarmControlReceipt:
1450
+ """Answer a native action; changed bytes with the same key conflict server-side."""
1451
+ action = require_text(action_id, field_name="action_id")
1452
+ value = await self._transport.execute(
1453
+ _request(
1454
+ "answer_run_action",
1455
+ f"/smr/runs/{swarm_id}/actions/{quote(action, safe='')}/answer",
1456
+ body=_control_body("response_text", response_text, idempotency_key),
1457
+ )
1458
+ )
1459
+ return _control_receipt(value, swarm_id, "action_answer", action)
1460
+
1343
1461
 
1344
1462
  ResearchSwarmHandle = SwarmHandle
1345
1463
  ResearchSwarmsAPI = SwarmsAPI
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synth-ai
3
- Version: 0.22.2.dev678
3
+ Version: 0.22.2.dev680
4
4
  Summary: Python SDK, CLI and MCP servers for Synth Index search and Swarms
5
5
  Author-email: Synth AI <josh@usesynth.ai>
6
6
  License-Expression: MIT
@@ -276,6 +276,7 @@ synth_ai/sdk/research/contracts/smr_runtime_kinds.py
276
276
  synth_ai/sdk/research/contracts/smr_tool_providers.py
277
277
  synth_ai/sdk/research/contracts/smr_work_modes.py
278
278
  synth_ai/sdk/research/contracts/status.py
279
+ synth_ai/sdk/research/contracts/swarm_controls.py
279
280
  synth_ai/sdk/research/contracts/swarm_rollouts.py
280
281
  synth_ai/sdk/research/contracts/swarms.py
281
282
  synth_ai/sdk/research/contracts/tag.py