synth-ai 0.18.2.dev602__tar.gz → 0.18.2.dev605__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 (252) hide show
  1. {synth_ai-0.18.2.dev602/synth_ai.egg-info → synth_ai-0.18.2.dev605}/PKG-INFO +2 -2
  2. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/README.md +1 -1
  3. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/pyproject.toml +1 -1
  4. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/client.py +6 -0
  5. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/research_intern.py +36 -4
  6. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/client.py +10 -2
  7. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/facade.py +2 -0
  8. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/public.py +2 -0
  9. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/research_intern.py +118 -7
  10. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605/synth_ai.egg-info}/PKG-INFO +2 -2
  11. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/LICENSE +0 -0
  12. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/MANIFEST.in +0 -0
  13. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/setup.cfg +0 -0
  14. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/README.md +0 -0
  15. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/__init__.py +0 -0
  16. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/__main__.py +0 -0
  17. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/cli/AGENTS.md +0 -0
  18. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/cli/README.md +0 -0
  19. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/cli/__init__.py +0 -0
  20. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/cli/__main__.py +0 -0
  21. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/cli/main.py +0 -0
  22. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/cli/research.py +0 -0
  23. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/cli/research_environments.py +0 -0
  24. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/cli/research_image_releases.py +0 -0
  25. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/cli/research_projects.py +0 -0
  26. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/README.md +0 -0
  27. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/__init__.py +0 -0
  28. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/auth/__init__.py +0 -0
  29. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/auth/credentials.py +0 -0
  30. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/contracts/__init__.py +0 -0
  31. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/contracts/json_value.py +0 -0
  32. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/contracts/pagination.py +0 -0
  33. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/errors.py +0 -0
  34. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/http/__init__.py +0 -0
  35. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/http/async_transport.py +0 -0
  36. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/http/request.py +0 -0
  37. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/http/retry.py +0 -0
  38. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/http/streaming.py +0 -0
  39. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/http/transport.py +0 -0
  40. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/research/__init__.py +0 -0
  41. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/utils/__init__.py +0 -0
  42. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/utils/env.py +0 -0
  43. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/utils/log_filter.py +0 -0
  44. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/utils/paths.py +0 -0
  45. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/core/utils/urls.py +0 -0
  46. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/README.md +0 -0
  47. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/__init__.py +0 -0
  48. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/__main__.py +0 -0
  49. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/objective_tools.py +0 -0
  50. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/registry.py +0 -0
  51. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/request_models.py +0 -0
  52. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/server.py +0 -0
  53. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/__init__.py +0 -0
  54. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/approvals.py +0 -0
  55. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/artifacts.py +0 -0
  56. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/datasets.py +0 -0
  57. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/environments.py +0 -0
  58. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/exports.py +0 -0
  59. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/factories.py +0 -0
  60. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/factory_results.py +0 -0
  61. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/files.py +0 -0
  62. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/image_releases.py +0 -0
  63. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/integrations.py +0 -0
  64. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/logs.py +0 -0
  65. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/models.py +0 -0
  66. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/outputs.py +0 -0
  67. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
  68. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/progress.py +0 -0
  69. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/project_data.py +0 -0
  70. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/projects.py +0 -0
  71. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/prs.py +0 -0
  72. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/readiness.py +0 -0
  73. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/repos.py +0 -0
  74. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/resources.py +0 -0
  75. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/runs.py +0 -0
  76. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/trained_models.py +0 -0
  77. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/usage.py +0 -0
  78. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/visuals.py +0 -0
  79. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/mcp/research/tools/workspace_inputs.py +0 -0
  80. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/py.typed +0 -0
  81. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/README.md +0 -0
  82. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/__init__.py +0 -0
  83. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/pagination.py +0 -0
  84. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/__init__.py +0 -0
  85. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/_internal/__init__.py +0 -0
  86. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/_internal/crypto.py +0 -0
  87. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/_internal/env.py +0 -0
  88. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/_internal/urls.py +0 -0
  89. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/account.py +0 -0
  90. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/advanced.py +0 -0
  91. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/advanced_factories.py +0 -0
  92. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/advanced_swarms.py +0 -0
  93. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/artifacts.py +0 -0
  94. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/auth.py +0 -0
  95. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/__init__.py +0 -0
  96. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
  97. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
  98. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
  99. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/_wire.py +0 -0
  100. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/activity.py +0 -0
  101. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
  102. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
  103. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/billing.py +0 -0
  104. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/canonical_usage.py +0 -0
  105. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
  106. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
  107. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
  108. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/common.py +0 -0
  109. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
  110. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
  111. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
  112. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/economics.py +0 -0
  113. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
  114. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/environments.py +0 -0
  115. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/evidence.py +0 -0
  116. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/factories.py +0 -0
  117. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
  118. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
  119. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/factory_operations.py +0 -0
  120. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
  121. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/failure.py +0 -0
  122. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
  123. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/limit_evidence.py +0 -0
  124. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
  125. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
  126. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/project.py +0 -0
  127. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/project_data.py +0 -0
  128. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
  129. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
  130. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
  131. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/projects.py +0 -0
  132. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/promotions.py +0 -0
  133. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/research_intern.py +0 -0
  134. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
  135. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/run_control.py +0 -0
  136. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
  137. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/run_events.py +0 -0
  138. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
  139. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
  140. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
  141. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/run_state.py +0 -0
  142. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
  143. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/runtime_image.py +0 -0
  144. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
  145. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
  146. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
  147. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
  148. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
  149. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
  150. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
  151. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
  152. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
  153. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
  154. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
  155. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
  156. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
  157. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
  158. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
  159. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
  160. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
  161. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
  162. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_providers.py +0 -0
  163. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
  164. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
  165. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_run_policy.py +0 -0
  166. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
  167. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
  168. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
  169. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
  170. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
  171. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/status.py +0 -0
  172. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/swarms.py +0 -0
  173. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/tag.py +0 -0
  174. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/traces.py +0 -0
  175. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/transcript.py +0 -0
  176. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/types.py +0 -0
  177. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/usage.py +0 -0
  178. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/visuals.py +0 -0
  179. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/wire_models.py +0 -0
  180. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/wire_models_README.md +0 -0
  181. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/work_products.py +0 -0
  182. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/contracts/workspaces.py +0 -0
  183. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/economics.py +0 -0
  184. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/efforts.py +0 -0
  185. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/environments.py +0 -0
  186. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/errors.py +0 -0
  187. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/events.py +0 -0
  188. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/experiments.py +0 -0
  189. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/factories.py +0 -0
  190. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/factory_storage.py +0 -0
  191. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/image_releases.py +0 -0
  192. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/knowledge.py +0 -0
  193. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/models.py +0 -0
  194. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/operations.py +0 -0
  195. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/project_data.py +0 -0
  196. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/project_deliveries.py +0 -0
  197. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/project_workspaces.py +0 -0
  198. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/projects.py +0 -0
  199. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/readouts.py +0 -0
  200. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/secrets.py +0 -0
  201. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/README.md +0 -0
  202. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/__init__.py +0 -0
  203. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/_base.py +0 -0
  204. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/_client_helpers.py +0 -0
  205. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/_run_authority_mixin.py +0 -0
  206. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/approvals.py +0 -0
  207. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/billing.py +0 -0
  208. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/client.py +0 -0
  209. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
  210. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/config.py +0 -0
  211. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/cost.py +0 -0
  212. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/datasets.py +0 -0
  213. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/dev_environments.py +0 -0
  214. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/environments.py +0 -0
  215. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/exports.py +0 -0
  216. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/factories.py +0 -0
  217. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
  218. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/files.py +0 -0
  219. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/github.py +0 -0
  220. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/image_releases.py +0 -0
  221. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/images.py +0 -0
  222. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/logs.py +0 -0
  223. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/models.py +0 -0
  224. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/outputs.py +0 -0
  225. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/progress.py +0 -0
  226. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/project.py +0 -0
  227. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/projects.py +0 -0
  228. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/prs.py +0 -0
  229. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/readiness.py +0 -0
  230. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/repositories.py +0 -0
  231. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/runs.py +0 -0
  232. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/secrets.py +0 -0
  233. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/setup.py +0 -0
  234. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/tag.py +0 -0
  235. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/trained_models.py +0 -0
  236. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/transport.py +0 -0
  237. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/usage.py +0 -0
  238. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/work_products.py +0 -0
  239. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
  240. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/swarms.py +0 -0
  241. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/traces.py +0 -0
  242. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/transport/__init__.py +0 -0
  243. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/transport/http.py +0 -0
  244. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/transport/pagination.py +0 -0
  245. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/version.py +0 -0
  246. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/visuals.py +0 -0
  247. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai/sdk/research/wiki.py +0 -0
  248. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai.egg-info/SOURCES.txt +0 -0
  249. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai.egg-info/dependency_links.txt +0 -0
  250. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai.egg-info/entry_points.txt +0 -0
  251. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/synth_ai.egg-info/requires.txt +0 -0
  252. {synth_ai-0.18.2.dev602 → synth_ai-0.18.2.dev605}/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.18.2.dev602
3
+ Version: 0.18.2.dev605
4
4
  Summary: Python SDK and CLI for Synth Managed Research and Research Factory
5
5
  Author-email: Synth AI <josh@usesynth.ai>
6
6
  License-Expression: MIT
@@ -27,7 +27,7 @@ Dynamic: license-file
27
27
 
28
28
  # Synth AI SDK
29
29
 
30
- <!-- CI release pins: PyPI-0.18.1-orange synth-ai==0.18.1 -->
30
+ <!-- CI release pins: PyPI-0.18.2-orange synth-ai==0.18.2 -->
31
31
 
32
32
  [![PyPI version](https://img.shields.io/pypi/v/synth-ai.svg)](https://pypi.org/project/synth-ai/)
33
33
  [![License](https://img.shields.io/pypi/l/synth-ai.svg)](https://pypi.org/project/synth-ai/)
@@ -1,6 +1,6 @@
1
1
  # Synth AI SDK
2
2
 
3
- <!-- CI release pins: PyPI-0.18.1-orange synth-ai==0.18.1 -->
3
+ <!-- CI release pins: PyPI-0.18.2-orange synth-ai==0.18.2 -->
4
4
 
5
5
  [![PyPI version](https://img.shields.io/pypi/v/synth-ai.svg)](https://pypi.org/project/synth-ai/)
6
6
  [![License](https://img.shields.io/pypi/l/synth-ai.svg)](https://pypi.org/project/synth-ai/)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "synth-ai"
3
- version = "0.18.2.dev602"
3
+ version = "0.18.2.dev605"
4
4
  description = "Python SDK and CLI for Synth Managed Research and Research Factory"
5
5
  authors = [{name = "Synth AI", email = "josh@usesynth.ai"}]
6
6
  license = "MIT"
@@ -34,10 +34,12 @@ class SynthClient:
34
34
  api_key: str | None = None,
35
35
  base_url: str | None = None,
36
36
  timeout_seconds: float = 30.0,
37
+ allow_legacy_intern_sessions: bool = False,
37
38
  ) -> None:
38
39
  self.api_key = _resolve_api_key(api_key)
39
40
  self.base_url = _resolve_base_url(base_url)
40
41
  self.timeout_seconds = timeout_seconds
42
+ self.allow_legacy_intern_sessions = allow_legacy_intern_sessions
41
43
  self._research_client: ResearchClient | None = None
42
44
 
43
45
  @property
@@ -50,6 +52,7 @@ class SynthClient:
50
52
  api_key=self.api_key,
51
53
  base_url=self.base_url,
52
54
  timeout_seconds=self.timeout_seconds,
55
+ allow_legacy_intern_sessions=self.allow_legacy_intern_sessions,
53
56
  )
54
57
  return self._research_client
55
58
 
@@ -75,10 +78,12 @@ class AsyncSynthClient:
75
78
  api_key: str | None = None,
76
79
  base_url: str | None = None,
77
80
  timeout_seconds: float = 30.0,
81
+ allow_legacy_intern_sessions: bool = False,
78
82
  ) -> None:
79
83
  self.api_key = _resolve_api_key(api_key)
80
84
  self.base_url = _resolve_base_url(base_url)
81
85
  self.timeout_seconds = timeout_seconds
86
+ self.allow_legacy_intern_sessions = allow_legacy_intern_sessions
82
87
  self._async_research_client: AsyncResearchClient | None = None
83
88
 
84
89
  @property
@@ -91,6 +96,7 @@ class AsyncSynthClient:
91
96
  api_key=self.api_key,
92
97
  base_url=self.base_url,
93
98
  timeout_seconds=self.timeout_seconds,
99
+ allow_legacy_intern_sessions=self.allow_legacy_intern_sessions,
94
100
  )
95
101
  return self._async_research_client
96
102
 
@@ -12,7 +12,12 @@ from synth_ai.mcp.research.registry import (
12
12
  ToolDefinition,
13
13
  tool_schema,
14
14
  )
15
- from synth_ai.mcp.research.request_models import optional_int, optional_string, require_int, require_string
15
+ from synth_ai.mcp.research.request_models import (
16
+ optional_int,
17
+ optional_string,
18
+ require_int,
19
+ require_string,
20
+ )
16
21
  from synth_ai.sdk.research.client import Client as ResearchClient
17
22
  from synth_ai.sdk.research.contracts.research_intern import (
18
23
  InternAsyncCommandKind,
@@ -35,11 +40,35 @@ from synth_ai.sdk.research.contracts.research_intern import (
35
40
  ResearchInternTracePublicationRequest,
36
41
  ResearchInternTurnRequest,
37
42
  )
38
- from synth_ai.sdk.research.research_intern import ResearchInternEventCursor
43
+ from synth_ai.sdk.research.research_intern import (
44
+ ResearchInternEventCursor,
45
+ legacy_intern_sessions_enabled,
46
+ )
39
47
 
40
48
  CoreClientFactory = Callable[[JSONDict], ResearchClient]
41
49
  _RESEARCH_INTERN_EVENT_SEQUENCE_MAX = 2**31 - 1
42
50
 
51
+ #: MCP tools that drive the legacy ``/smr/research-intern/sessions`` plane.
52
+ #: They are excluded from registration unless the environment explicitly opts
53
+ #: in via ``SYNTH_ALLOW_LEGACY_INTERN_SESSIONS=1``; QA treats any legacy
54
+ #: ``/sessions`` hit as a hard fail, so the default surface is sync-sessions
55
+ #: only (``intern_sync_*`` / ``intern_async_*``).
56
+ LEGACY_INTERN_SESSION_TOOL_NAMES = frozenset(
57
+ {
58
+ "research_append_research_intern_event",
59
+ "research_close_research_intern_session",
60
+ "research_create_research_intern_session",
61
+ "research_exchange_research_intern_turn",
62
+ "research_get_research_intern_session",
63
+ "research_list_research_intern_events",
64
+ "research_list_research_intern_sessions",
65
+ "research_publish_research_intern_session_trace",
66
+ "research_run_research_intern_turn",
67
+ "research_sync_research_intern_session",
68
+ "research_watch_research_intern_events",
69
+ }
70
+ )
71
+
43
72
 
44
73
  def _request_payload(args: JSONDict, names: tuple[str, ...]) -> JSONDict:
45
74
  return {name: args[name] for name in names if name in args}
@@ -725,7 +754,7 @@ def build_research_intern_tools(
725
754
  sync_selector: JSONDict = {
726
755
  "sync_session_id": {"type": "string", "minLength": 1},
727
756
  }
728
- return [
757
+ tools = [
729
758
  ToolDefinition(
730
759
  name="intern_sync_create",
731
760
  description="Create or replay one durable operator-present Sync session.",
@@ -1598,6 +1627,9 @@ def build_research_intern_tools(
1598
1627
  required_scopes=READ_SCOPES,
1599
1628
  ),
1600
1629
  ]
1630
+ if not legacy_intern_sessions_enabled():
1631
+ tools = [tool for tool in tools if tool.name not in LEGACY_INTERN_SESSION_TOOL_NAMES]
1632
+ return tools
1601
1633
 
1602
1634
 
1603
- __all__ = ["build_research_intern_tools"]
1635
+ __all__ = ["LEGACY_INTERN_SESSION_TOOL_NAMES", "build_research_intern_tools"]
@@ -45,6 +45,7 @@ class Client:
45
45
  api_key: str | None = None,
46
46
  base_url: str | None = None,
47
47
  timeout_seconds: float = 30.0,
48
+ allow_legacy_intern_sessions: bool = False,
48
49
  ) -> None:
49
50
  self._credential = resolve_api_credential(api_key)
50
51
  self._transport = HttpTransport(
@@ -53,7 +54,10 @@ class Client:
53
54
  timeout_seconds=timeout_seconds,
54
55
  )
55
56
  self.projects = ProjectsAPI(self._transport)
56
- self.intern = ResearchInternAPI(self._transport)
57
+ self.intern = ResearchInternAPI(
58
+ self._transport,
59
+ allow_legacy_intern_sessions=allow_legacy_intern_sessions,
60
+ )
57
61
  self.swarms = SwarmsAPI(self._transport)
58
62
  self.factories = FactoriesAPI(self._transport)
59
63
  self.environments = EnvironmentsAPI(self._transport)
@@ -115,6 +119,7 @@ class AsyncClient:
115
119
  api_key: str | None = None,
116
120
  base_url: str | None = None,
117
121
  timeout_seconds: float = 30.0,
122
+ allow_legacy_intern_sessions: bool = False,
118
123
  ) -> None:
119
124
  self._credential = resolve_api_credential(api_key)
120
125
  self._transport = AsyncHttpTransport(
@@ -123,7 +128,10 @@ class AsyncClient:
123
128
  timeout_seconds=timeout_seconds,
124
129
  )
125
130
  self.projects = AsyncProjectsAPI(self._transport)
126
- self.intern = AsyncResearchInternAPI(self._transport)
131
+ self.intern = AsyncResearchInternAPI(
132
+ self._transport,
133
+ allow_legacy_intern_sessions=allow_legacy_intern_sessions,
134
+ )
127
135
  self.swarms = AsyncSwarmsAPI(self._transport)
128
136
  self.factories = AsyncFactoriesAPI(self._transport)
129
137
  self.environments = AsyncEnvironmentsAPI(self._transport)
@@ -115,6 +115,7 @@ class Client:
115
115
  api_key: str,
116
116
  base_url: str,
117
117
  timeout_seconds: float = 120.0,
118
+ allow_legacy_intern_sessions: bool = False,
118
119
  ) -> None:
119
120
  self.api_key = api_key
120
121
  self.base_url = base_url
@@ -123,6 +124,7 @@ class Client:
123
124
  api_key=api_key,
124
125
  base_url=base_url,
125
126
  timeout_seconds=timeout_seconds,
127
+ allow_legacy_intern_sessions=allow_legacy_intern_sessions,
126
128
  )
127
129
  self._session: ResearchSession | None = None
128
130
  self._advanced: ResearchAdvancedAPI | None = None
@@ -413,6 +413,7 @@ from synth_ai.sdk.research.research_intern import (
413
413
  AsyncResearchInternReactiveSession,
414
414
  AsyncResearchInternSessionsAPI,
415
415
  AsyncResearchInternSyncRuntimeAPI,
416
+ LegacyInternSessionsDisabledError,
416
417
  ProjectComputerAPI,
417
418
  ProjectDataBindingsAPI,
418
419
  ResearchInternAcceptanceReceiptsAPI,
@@ -489,6 +490,7 @@ __all__ = [
489
490
  "InternSyncSession",
490
491
  "InternSyncSessionCreateRequest",
491
492
  "InternSyncStatus",
493
+ "LegacyInternSessionsDisabledError",
492
494
  "FactoryStorageAuthorityResponse",
493
495
  "MAGI_CANONICAL_USER_BY_MODE",
494
496
  "MagiActuationStatus",
@@ -4,6 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
  import builtins
7
+ import os
7
8
  import time
8
9
  from collections.abc import AsyncIterator, Iterator
9
10
  from dataclasses import dataclass
@@ -963,15 +964,66 @@ class ResearchInternTurnFailedError(RuntimeError):
963
964
  self.terminal_event = terminal_event
964
965
 
965
966
 
967
+ LEGACY_INTERN_SESSIONS_ENV = "SYNTH_ALLOW_LEGACY_INTERN_SESSIONS"
968
+
969
+
970
+ def legacy_intern_sessions_enabled() -> bool:
971
+ """Whether the environment explicitly opted in to the legacy sessions plane."""
972
+ return str(os.getenv(LEGACY_INTERN_SESSIONS_ENV) or "").strip().lower() in {
973
+ "1",
974
+ "true",
975
+ "yes",
976
+ }
977
+
978
+
979
+ class LegacyInternSessionsDisabledError(RuntimeError):
980
+ """The legacy ``/smr/research-intern/sessions`` plane is disabled by default.
981
+
982
+ QA for the Sync Intern release treats any legacy ``/sessions`` hit as a hard
983
+ fail, so the plane requires an explicit opt-in instead of being callable by
984
+ default. Use the ``/smr/research-intern/sync-sessions`` plane (``intern.sync_``
985
+ on the SDK, ``intern_sync_*`` / ``intern_async_*`` MCP tools) instead.
986
+ """
987
+
988
+ def __init__(self, operation: str) -> None:
989
+ super().__init__(
990
+ f"Legacy Research Intern sessions operation {operation!r} is disabled. "
991
+ "Use the /smr/research-intern/sync-sessions plane instead "
992
+ "(client.intern.sync_ / client.intern.async_, or the intern_sync_* / "
993
+ "intern_async_* MCP tools). To explicitly opt back in, construct the "
994
+ "client with allow_legacy_intern_sessions=True or set "
995
+ f"{LEGACY_INTERN_SESSIONS_ENV}=1."
996
+ )
997
+ self.operation = operation
998
+
999
+
966
1000
  class ResearchInternSessionsAPI:
967
- """Durable reactive sessions and their ordered event logs."""
1001
+ """Durable reactive sessions and their ordered event logs.
1002
+
1003
+ Legacy plane: every method requires the explicit
1004
+ ``allow_legacy_intern_sessions`` / ``SYNTH_ALLOW_LEGACY_INTERN_SESSIONS``
1005
+ opt-in and raises :class:`LegacyInternSessionsDisabledError` otherwise.
1006
+ """
968
1007
 
969
- def __init__(self, transport: HttpTransport, owner: ResearchInternAPI) -> None:
1008
+ def __init__(
1009
+ self,
1010
+ transport: HttpTransport,
1011
+ owner: ResearchInternAPI,
1012
+ *,
1013
+ allow_legacy: bool = False,
1014
+ ) -> None:
970
1015
  self._transport = transport
971
1016
  self._owner = owner
1017
+ self._allow_legacy = allow_legacy
1018
+
1019
+ def _require_legacy_enabled(self, operation: str) -> None:
1020
+ if self._allow_legacy or legacy_intern_sessions_enabled():
1021
+ return
1022
+ raise LegacyInternSessionsDisabledError(operation)
972
1023
 
973
1024
  def create(self, request: ResearchInternSessionCreateRequest) -> ResearchInternSessionResponse:
974
1025
  """Create or replay one durable Intern session."""
1026
+ self._require_legacy_enabled("create")
975
1027
  session = ResearchInternSessionResponse.from_wire(
976
1028
  self._transport.execute(
977
1029
  _request(
@@ -993,6 +1045,7 @@ class ResearchInternSessionsAPI:
993
1045
 
994
1046
  def list(self, *, limit: int = 100) -> tuple[ResearchInternSessionResponse, ...]:
995
1047
  """List a bounded page of Intern sessions."""
1048
+ self._require_legacy_enabled("list")
996
1049
  return _sessions(
997
1050
  self._transport.execute(
998
1051
  _request(
@@ -1005,6 +1058,7 @@ class ResearchInternSessionsAPI:
1005
1058
 
1006
1059
  def retrieve(self, session_id: str) -> ResearchInternSessionResponse:
1007
1060
  """Retrieve one Intern session by stable identity."""
1061
+ self._require_legacy_enabled("retrieve")
1008
1062
  session = ResearchInternSessionResponse.from_wire(
1009
1063
  self._transport.execute(
1010
1064
  _request(
@@ -1023,6 +1077,7 @@ class ResearchInternSessionsAPI:
1023
1077
  request: ResearchInternEventAppendRequest,
1024
1078
  ) -> ResearchInternEventResponse:
1025
1079
  """Append one optimistic-concurrency-fenced event."""
1080
+ self._require_legacy_enabled("append_event")
1026
1081
  event = ResearchInternEventResponse.from_wire(
1027
1082
  self._transport.execute(
1028
1083
  _request(
@@ -1049,6 +1104,7 @@ class ResearchInternSessionsAPI:
1049
1104
  limit: int = 100,
1050
1105
  ) -> tuple[ResearchInternEventResponse, ...]:
1051
1106
  """Observe an ordered, bounded page after one reconnect sequence."""
1107
+ self._require_legacy_enabled("list_events")
1052
1108
  if (
1053
1109
  isinstance(after_sequence, bool)
1054
1110
  or not isinstance(after_sequence, int)
@@ -1096,6 +1152,7 @@ class ResearchInternSessionsAPI:
1096
1152
  timeout_seconds: float = 30.0,
1097
1153
  ) -> Iterator[ResearchInternEventStreamPayload]:
1098
1154
  """Stream typed backend-owned frames from one exact reconnect cursor."""
1155
+ self._require_legacy_enabled("stream_events")
1099
1156
  validator = _ResearchInternEventStreamValidator(
1100
1157
  session_id,
1101
1158
  cursor=cursor,
@@ -1123,6 +1180,7 @@ class ResearchInternSessionsAPI:
1123
1180
  timeout_seconds: float = 30.0,
1124
1181
  ) -> ResearchInternEventStreamObservation:
1125
1182
  """Wait with explicit bounds, reconnecting only from durable SSE cursors."""
1183
+ self._require_legacy_enabled("watch")
1126
1184
  _stream_bound(event_count_max, name="event_count_max", maximum=500)
1127
1185
  _stream_bound(frame_count_max, name="frame_count_max", maximum=5_000)
1128
1186
  _stream_bound(reconnect_count_max, name="reconnect_count_max", maximum=20)
@@ -1208,6 +1266,7 @@ class ResearchInternSessionsAPI:
1208
1266
  limit: int = 200,
1209
1267
  ) -> ResearchInternSessionSyncResponse:
1210
1268
  """Project a bounded page of canonical runtime transcript events."""
1269
+ self._require_legacy_enabled("sync")
1211
1270
  response = ResearchInternSessionSyncResponse.from_wire(
1212
1271
  self._transport.execute(
1213
1272
  _request(
@@ -1232,6 +1291,7 @@ class ResearchInternSessionsAPI:
1232
1291
  request: ResearchInternTurnRequest,
1233
1292
  ) -> ResearchInternTurnResponse:
1234
1293
  """Submit one canonical real-runtime operator turn."""
1294
+ self._require_legacy_enabled("turn")
1235
1295
  response = ResearchInternTurnResponse.from_wire(
1236
1296
  self._transport.execute(
1237
1297
  _request(
@@ -1258,6 +1318,7 @@ class ResearchInternSessionsAPI:
1258
1318
  request: ResearchInternSessionCloseRequest,
1259
1319
  ) -> ResearchInternSessionResponse:
1260
1320
  """Close one exact session generation and retain its event history."""
1321
+ self._require_legacy_enabled("close")
1261
1322
  session = ResearchInternSessionResponse.from_wire(
1262
1323
  self._transport.execute(
1263
1324
  _request(
@@ -1280,6 +1341,7 @@ class ResearchInternSessionsAPI:
1280
1341
  request: ResearchInternTracePublicationRequest,
1281
1342
  ) -> ResearchInternTracePublicationResponse:
1282
1343
  """Publish the terminal event chain through backend Trace V5 authority."""
1344
+ self._require_legacy_enabled("publish_trace")
1283
1345
  response = ResearchInternTracePublicationResponse.from_wire(
1284
1346
  self._transport.execute(
1285
1347
  _request(
@@ -1302,6 +1364,7 @@ class ResearchInternSessionsAPI:
1302
1364
  request: ResearchInternSessionCreateRequest,
1303
1365
  ) -> ResearchInternReactiveSession:
1304
1366
  """Create a reconnectable reactive view over one backend session."""
1367
+ self._require_legacy_enabled("create_reactive")
1305
1368
  session = self.create(request)
1306
1369
  return ResearchInternReactiveSession(
1307
1370
  self._owner,
@@ -1316,6 +1379,7 @@ class ResearchInternSessionsAPI:
1316
1379
  cursor: ResearchInternEventCursor | None = None,
1317
1380
  ) -> ResearchInternReactiveSession:
1318
1381
  """Reconnect to a session from an exact previously returned cursor."""
1382
+ self._require_legacy_enabled("connect")
1319
1383
  session = self.retrieve(session_id)
1320
1384
  reconnect_cursor = cursor or ResearchInternEventCursor(session_id=session_id)
1321
1385
  if reconnect_cursor.session_id != session_id:
@@ -2549,13 +2613,22 @@ class ResearchInternAsyncRuntimeAPI:
2549
2613
  class ResearchInternAPI:
2550
2614
  """One durable organization Intern and its many Factory memberships."""
2551
2615
 
2552
- def __init__(self, transport: HttpTransport) -> None:
2616
+ def __init__(
2617
+ self,
2618
+ transport: HttpTransport,
2619
+ *,
2620
+ allow_legacy_intern_sessions: bool = False,
2621
+ ) -> None:
2553
2622
  self._transport = transport
2554
2623
  self.sync_ = ResearchInternSyncRuntimeAPI(transport)
2555
2624
  self.async_ = ResearchInternAsyncRuntimeAPI(transport)
2556
2625
  self.factories = ResearchInternFactoriesAPI(transport)
2557
2626
  self.decisions = ResearchInternDecisionsAPI(transport)
2558
- self.sessions = ResearchInternSessionsAPI(transport, self)
2627
+ self.sessions = ResearchInternSessionsAPI(
2628
+ transport,
2629
+ self,
2630
+ allow_legacy=allow_legacy_intern_sessions,
2631
+ )
2559
2632
  self.acceptance_receipts = ResearchInternAcceptanceReceiptsAPI(transport)
2560
2633
 
2561
2634
  def provision(
@@ -3325,21 +3398,35 @@ class AsyncResearchInternDecisionsAPI:
3325
3398
 
3326
3399
 
3327
3400
  class AsyncResearchInternSessionsAPI:
3328
- """Native asynchronous Intern session and event-log operations."""
3401
+ """Native asynchronous Intern session and event-log operations.
3402
+
3403
+ Legacy plane: every method requires the explicit
3404
+ ``allow_legacy_intern_sessions`` / ``SYNTH_ALLOW_LEGACY_INTERN_SESSIONS``
3405
+ opt-in and raises :class:`LegacyInternSessionsDisabledError` otherwise.
3406
+ """
3329
3407
 
3330
3408
  def __init__(
3331
3409
  self,
3332
3410
  transport: AsyncHttpTransport,
3333
3411
  owner: AsyncResearchInternAPI,
3412
+ *,
3413
+ allow_legacy: bool = False,
3334
3414
  ) -> None:
3335
3415
  self._transport = transport
3336
3416
  self._owner = owner
3417
+ self._allow_legacy = allow_legacy
3418
+
3419
+ def _require_legacy_enabled(self, operation: str) -> None:
3420
+ if self._allow_legacy or legacy_intern_sessions_enabled():
3421
+ return
3422
+ raise LegacyInternSessionsDisabledError(operation)
3337
3423
 
3338
3424
  async def create(
3339
3425
  self,
3340
3426
  request: ResearchInternSessionCreateRequest,
3341
3427
  ) -> ResearchInternSessionResponse:
3342
3428
  """Create or replay one durable Intern session."""
3429
+ self._require_legacy_enabled("create")
3343
3430
  session = ResearchInternSessionResponse.from_wire(
3344
3431
  await self._transport.execute(
3345
3432
  _request(
@@ -3361,6 +3448,7 @@ class AsyncResearchInternSessionsAPI:
3361
3448
 
3362
3449
  async def list(self, *, limit: int = 100) -> tuple[ResearchInternSessionResponse, ...]:
3363
3450
  """List a bounded page of Intern sessions."""
3451
+ self._require_legacy_enabled("list")
3364
3452
  return _sessions(
3365
3453
  await self._transport.execute(
3366
3454
  _request(
@@ -3373,6 +3461,7 @@ class AsyncResearchInternSessionsAPI:
3373
3461
 
3374
3462
  async def retrieve(self, session_id: str) -> ResearchInternSessionResponse:
3375
3463
  """Retrieve one Intern session by stable identity."""
3464
+ self._require_legacy_enabled("retrieve")
3376
3465
  session = ResearchInternSessionResponse.from_wire(
3377
3466
  await self._transport.execute(
3378
3467
  _request(
@@ -3391,6 +3480,7 @@ class AsyncResearchInternSessionsAPI:
3391
3480
  request: ResearchInternEventAppendRequest,
3392
3481
  ) -> ResearchInternEventResponse:
3393
3482
  """Append one optimistic-concurrency-fenced event."""
3483
+ self._require_legacy_enabled("append_event")
3394
3484
  event = ResearchInternEventResponse.from_wire(
3395
3485
  await self._transport.execute(
3396
3486
  _request(
@@ -3417,6 +3507,7 @@ class AsyncResearchInternSessionsAPI:
3417
3507
  limit: int = 100,
3418
3508
  ) -> tuple[ResearchInternEventResponse, ...]:
3419
3509
  """Observe an ordered, bounded page after one reconnect sequence."""
3510
+ self._require_legacy_enabled("list_events")
3420
3511
  if (
3421
3512
  isinstance(after_sequence, bool)
3422
3513
  or not isinstance(after_sequence, int)
@@ -3464,6 +3555,7 @@ class AsyncResearchInternSessionsAPI:
3464
3555
  timeout_seconds: float = 30.0,
3465
3556
  ) -> AsyncIterator[ResearchInternEventStreamPayload]:
3466
3557
  """Stream typed backend-owned frames from one exact reconnect cursor."""
3558
+ self._require_legacy_enabled("stream_events")
3467
3559
  validator = _ResearchInternEventStreamValidator(
3468
3560
  session_id,
3469
3561
  cursor=cursor,
@@ -3491,6 +3583,7 @@ class AsyncResearchInternSessionsAPI:
3491
3583
  timeout_seconds: float = 30.0,
3492
3584
  ) -> ResearchInternEventStreamObservation:
3493
3585
  """Wait with explicit bounds, reconnecting only from durable SSE cursors."""
3586
+ self._require_legacy_enabled("watch")
3494
3587
  _stream_bound(event_count_max, name="event_count_max", maximum=500)
3495
3588
  _stream_bound(frame_count_max, name="frame_count_max", maximum=5_000)
3496
3589
  _stream_bound(reconnect_count_max, name="reconnect_count_max", maximum=20)
@@ -3580,6 +3673,7 @@ class AsyncResearchInternSessionsAPI:
3580
3673
  limit: int = 200,
3581
3674
  ) -> ResearchInternSessionSyncResponse:
3582
3675
  """Project a bounded page of canonical runtime transcript events."""
3676
+ self._require_legacy_enabled("sync")
3583
3677
  response = ResearchInternSessionSyncResponse.from_wire(
3584
3678
  await self._transport.execute(
3585
3679
  _request(
@@ -3604,6 +3698,7 @@ class AsyncResearchInternSessionsAPI:
3604
3698
  request: ResearchInternTurnRequest,
3605
3699
  ) -> ResearchInternTurnResponse:
3606
3700
  """Submit one canonical real-runtime operator turn."""
3701
+ self._require_legacy_enabled("turn")
3607
3702
  response = ResearchInternTurnResponse.from_wire(
3608
3703
  await self._transport.execute(
3609
3704
  _request(
@@ -3630,6 +3725,7 @@ class AsyncResearchInternSessionsAPI:
3630
3725
  request: ResearchInternSessionCloseRequest,
3631
3726
  ) -> ResearchInternSessionResponse:
3632
3727
  """Close one exact session generation and retain its event history."""
3728
+ self._require_legacy_enabled("close")
3633
3729
  session = ResearchInternSessionResponse.from_wire(
3634
3730
  await self._transport.execute(
3635
3731
  _request(
@@ -3652,6 +3748,7 @@ class AsyncResearchInternSessionsAPI:
3652
3748
  request: ResearchInternTracePublicationRequest,
3653
3749
  ) -> ResearchInternTracePublicationResponse:
3654
3750
  """Publish the terminal event chain through backend Trace V5 authority."""
3751
+ self._require_legacy_enabled("publish_trace")
3655
3752
  response = ResearchInternTracePublicationResponse.from_wire(
3656
3753
  await self._transport.execute(
3657
3754
  _request(
@@ -3674,6 +3771,7 @@ class AsyncResearchInternSessionsAPI:
3674
3771
  request: ResearchInternSessionCreateRequest,
3675
3772
  ) -> AsyncResearchInternReactiveSession:
3676
3773
  """Create an asynchronously reconnectable view over one backend session."""
3774
+ self._require_legacy_enabled("create_reactive")
3677
3775
  session = await self.create(request)
3678
3776
  return AsyncResearchInternReactiveSession(
3679
3777
  self._owner,
@@ -3688,6 +3786,7 @@ class AsyncResearchInternSessionsAPI:
3688
3786
  cursor: ResearchInternEventCursor | None = None,
3689
3787
  ) -> AsyncResearchInternReactiveSession:
3690
3788
  """Reconnect asynchronously from one exact previously returned cursor."""
3789
+ self._require_legacy_enabled("connect")
3691
3790
  session = await self.retrieve(session_id)
3692
3791
  reconnect_cursor = cursor or ResearchInternEventCursor(session_id=session_id)
3693
3792
  if reconnect_cursor.session_id != session_id:
@@ -4314,13 +4413,22 @@ class AsyncResearchInternAsyncRuntimeAPI:
4314
4413
  class AsyncResearchInternAPI:
4315
4414
  """Native asynchronous organization Research Intern operations."""
4316
4415
 
4317
- def __init__(self, transport: AsyncHttpTransport) -> None:
4416
+ def __init__(
4417
+ self,
4418
+ transport: AsyncHttpTransport,
4419
+ *,
4420
+ allow_legacy_intern_sessions: bool = False,
4421
+ ) -> None:
4318
4422
  self._transport = transport
4319
4423
  self.sync_ = AsyncResearchInternSyncRuntimeAPI(transport)
4320
4424
  self.async_ = AsyncResearchInternAsyncRuntimeAPI(transport)
4321
4425
  self.factories = AsyncResearchInternFactoriesAPI(transport)
4322
4426
  self.decisions = AsyncResearchInternDecisionsAPI(transport)
4323
- self.sessions = AsyncResearchInternSessionsAPI(transport, self)
4427
+ self.sessions = AsyncResearchInternSessionsAPI(
4428
+ transport,
4429
+ self,
4430
+ allow_legacy=allow_legacy_intern_sessions,
4431
+ )
4324
4432
  self.acceptance_receipts = AsyncResearchInternAcceptanceReceiptsAPI(transport)
4325
4433
 
4326
4434
  async def provision(
@@ -5253,6 +5361,8 @@ __all__ = [
5253
5361
  "AsyncResearchInternFactoriesAPI",
5254
5362
  "AsyncResearchInternReactiveSession",
5255
5363
  "AsyncResearchInternSessionsAPI",
5364
+ "LEGACY_INTERN_SESSIONS_ENV",
5365
+ "LegacyInternSessionsDisabledError",
5256
5366
  "ProjectComputerAPI",
5257
5367
  "ProjectDataBindingsAPI",
5258
5368
  "ResearchInternAcceptanceReceiptsAPI",
@@ -5269,4 +5379,5 @@ __all__ = [
5269
5379
  "ResearchInternReactiveSession",
5270
5380
  "ResearchInternSessionsAPI",
5271
5381
  "ResearchInternTurnFailedError",
5382
+ "legacy_intern_sessions_enabled",
5272
5383
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synth-ai
3
- Version: 0.18.2.dev602
3
+ Version: 0.18.2.dev605
4
4
  Summary: Python SDK and CLI for Synth Managed Research and Research Factory
5
5
  Author-email: Synth AI <josh@usesynth.ai>
6
6
  License-Expression: MIT
@@ -27,7 +27,7 @@ Dynamic: license-file
27
27
 
28
28
  # Synth AI SDK
29
29
 
30
- <!-- CI release pins: PyPI-0.18.1-orange synth-ai==0.18.1 -->
30
+ <!-- CI release pins: PyPI-0.18.2-orange synth-ai==0.18.2 -->
31
31
 
32
32
  [![PyPI version](https://img.shields.io/pypi/v/synth-ai.svg)](https://pypi.org/project/synth-ai/)
33
33
  [![License](https://img.shields.io/pypi/l/synth-ai.svg)](https://pypi.org/project/synth-ai/)