synth-ai 0.18.2.dev603__tar.gz → 0.18.2.dev606__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.dev603/synth_ai.egg-info → synth_ai-0.18.2.dev606}/PKG-INFO +2 -2
  2. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/README.md +1 -1
  3. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/pyproject.toml +1 -1
  4. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/client.py +6 -0
  5. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/research_intern.py +36 -4
  6. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/client.py +10 -2
  7. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/__init__.py +18 -0
  8. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/research_intern.py +131 -0
  9. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/facade.py +2 -0
  10. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/public.py +20 -0
  11. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/research_intern.py +118 -7
  12. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606/synth_ai.egg-info}/PKG-INFO +2 -2
  13. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/LICENSE +0 -0
  14. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/MANIFEST.in +0 -0
  15. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/setup.cfg +0 -0
  16. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/README.md +0 -0
  17. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/__init__.py +0 -0
  18. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/__main__.py +0 -0
  19. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/cli/AGENTS.md +0 -0
  20. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/cli/README.md +0 -0
  21. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/cli/__init__.py +0 -0
  22. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/cli/__main__.py +0 -0
  23. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/cli/main.py +0 -0
  24. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/cli/research.py +0 -0
  25. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/cli/research_environments.py +0 -0
  26. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/cli/research_image_releases.py +0 -0
  27. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/cli/research_projects.py +0 -0
  28. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/README.md +0 -0
  29. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/__init__.py +0 -0
  30. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/auth/__init__.py +0 -0
  31. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/auth/credentials.py +0 -0
  32. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/contracts/__init__.py +0 -0
  33. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/contracts/json_value.py +0 -0
  34. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/contracts/pagination.py +0 -0
  35. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/errors.py +0 -0
  36. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/http/__init__.py +0 -0
  37. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/http/async_transport.py +0 -0
  38. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/http/request.py +0 -0
  39. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/http/retry.py +0 -0
  40. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/http/streaming.py +0 -0
  41. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/http/transport.py +0 -0
  42. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/research/__init__.py +0 -0
  43. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/utils/__init__.py +0 -0
  44. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/utils/env.py +0 -0
  45. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/utils/log_filter.py +0 -0
  46. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/utils/paths.py +0 -0
  47. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/core/utils/urls.py +0 -0
  48. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/README.md +0 -0
  49. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/__init__.py +0 -0
  50. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/__main__.py +0 -0
  51. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/objective_tools.py +0 -0
  52. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/registry.py +0 -0
  53. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/request_models.py +0 -0
  54. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/server.py +0 -0
  55. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/__init__.py +0 -0
  56. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/approvals.py +0 -0
  57. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/artifacts.py +0 -0
  58. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/datasets.py +0 -0
  59. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/environments.py +0 -0
  60. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/exports.py +0 -0
  61. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/factories.py +0 -0
  62. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/factory_results.py +0 -0
  63. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/files.py +0 -0
  64. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/image_releases.py +0 -0
  65. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/integrations.py +0 -0
  66. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/logs.py +0 -0
  67. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/models.py +0 -0
  68. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/outputs.py +0 -0
  69. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
  70. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/progress.py +0 -0
  71. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/project_data.py +0 -0
  72. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/projects.py +0 -0
  73. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/prs.py +0 -0
  74. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/readiness.py +0 -0
  75. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/repos.py +0 -0
  76. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/resources.py +0 -0
  77. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/runs.py +0 -0
  78. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/trained_models.py +0 -0
  79. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/usage.py +0 -0
  80. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/visuals.py +0 -0
  81. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/mcp/research/tools/workspace_inputs.py +0 -0
  82. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/py.typed +0 -0
  83. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/README.md +0 -0
  84. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/__init__.py +0 -0
  85. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/pagination.py +0 -0
  86. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/__init__.py +0 -0
  87. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/_internal/__init__.py +0 -0
  88. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/_internal/crypto.py +0 -0
  89. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/_internal/env.py +0 -0
  90. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/_internal/urls.py +0 -0
  91. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/account.py +0 -0
  92. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/advanced.py +0 -0
  93. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/advanced_factories.py +0 -0
  94. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/advanced_swarms.py +0 -0
  95. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/artifacts.py +0 -0
  96. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/auth.py +0 -0
  97. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
  98. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
  99. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
  100. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/_wire.py +0 -0
  101. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/activity.py +0 -0
  102. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
  103. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
  104. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/billing.py +0 -0
  105. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/canonical_usage.py +0 -0
  106. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
  107. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
  108. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
  109. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/common.py +0 -0
  110. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
  111. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
  112. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
  113. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/economics.py +0 -0
  114. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
  115. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/environments.py +0 -0
  116. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/evidence.py +0 -0
  117. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/factories.py +0 -0
  118. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
  119. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
  120. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/factory_operations.py +0 -0
  121. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
  122. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/failure.py +0 -0
  123. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
  124. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/limit_evidence.py +0 -0
  125. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
  126. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
  127. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/project.py +0 -0
  128. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/project_data.py +0 -0
  129. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
  130. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
  131. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
  132. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/projects.py +0 -0
  133. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/promotions.py +0 -0
  134. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
  135. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/run_control.py +0 -0
  136. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
  137. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/run_events.py +0 -0
  138. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
  139. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
  140. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
  141. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/run_state.py +0 -0
  142. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
  143. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/runtime_image.py +0 -0
  144. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
  145. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
  146. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
  147. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
  148. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
  149. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
  150. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
  151. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
  152. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
  153. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
  154. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
  155. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
  156. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
  157. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
  158. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
  159. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
  160. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
  161. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
  162. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_providers.py +0 -0
  163. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
  164. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
  165. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_run_policy.py +0 -0
  166. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
  167. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
  168. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
  169. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
  170. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
  171. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/status.py +0 -0
  172. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/swarms.py +0 -0
  173. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/tag.py +0 -0
  174. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/traces.py +0 -0
  175. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/transcript.py +0 -0
  176. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/types.py +0 -0
  177. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/usage.py +0 -0
  178. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/visuals.py +0 -0
  179. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/wire_models.py +0 -0
  180. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/wire_models_README.md +0 -0
  181. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/work_products.py +0 -0
  182. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/contracts/workspaces.py +0 -0
  183. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/economics.py +0 -0
  184. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/efforts.py +0 -0
  185. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/environments.py +0 -0
  186. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/errors.py +0 -0
  187. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/events.py +0 -0
  188. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/experiments.py +0 -0
  189. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/factories.py +0 -0
  190. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/factory_storage.py +0 -0
  191. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/image_releases.py +0 -0
  192. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/knowledge.py +0 -0
  193. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/models.py +0 -0
  194. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/operations.py +0 -0
  195. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/project_data.py +0 -0
  196. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/project_deliveries.py +0 -0
  197. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/project_workspaces.py +0 -0
  198. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/projects.py +0 -0
  199. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/readouts.py +0 -0
  200. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/secrets.py +0 -0
  201. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/README.md +0 -0
  202. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/__init__.py +0 -0
  203. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/_base.py +0 -0
  204. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/_client_helpers.py +0 -0
  205. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/_run_authority_mixin.py +0 -0
  206. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/approvals.py +0 -0
  207. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/billing.py +0 -0
  208. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/client.py +0 -0
  209. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
  210. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/config.py +0 -0
  211. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/cost.py +0 -0
  212. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/datasets.py +0 -0
  213. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/dev_environments.py +0 -0
  214. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/environments.py +0 -0
  215. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/exports.py +0 -0
  216. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/factories.py +0 -0
  217. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
  218. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/files.py +0 -0
  219. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/github.py +0 -0
  220. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/image_releases.py +0 -0
  221. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/images.py +0 -0
  222. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/logs.py +0 -0
  223. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/models.py +0 -0
  224. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/outputs.py +0 -0
  225. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/progress.py +0 -0
  226. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/project.py +0 -0
  227. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/projects.py +0 -0
  228. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/prs.py +0 -0
  229. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/readiness.py +0 -0
  230. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/repositories.py +0 -0
  231. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/runs.py +0 -0
  232. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/secrets.py +0 -0
  233. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/setup.py +0 -0
  234. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/tag.py +0 -0
  235. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/trained_models.py +0 -0
  236. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/transport.py +0 -0
  237. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/usage.py +0 -0
  238. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/work_products.py +0 -0
  239. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
  240. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/swarms.py +0 -0
  241. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/traces.py +0 -0
  242. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/transport/__init__.py +0 -0
  243. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/transport/http.py +0 -0
  244. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/transport/pagination.py +0 -0
  245. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/version.py +0 -0
  246. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/visuals.py +0 -0
  247. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai/sdk/research/wiki.py +0 -0
  248. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai.egg-info/SOURCES.txt +0 -0
  249. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai.egg-info/dependency_links.txt +0 -0
  250. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai.egg-info/entry_points.txt +0 -0
  251. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/synth_ai.egg-info/requires.txt +0 -0
  252. {synth_ai-0.18.2.dev603 → synth_ai-0.18.2.dev606}/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.dev603
3
+ Version: 0.18.2.dev606
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.dev603"
3
+ version = "0.18.2.dev606"
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)
@@ -348,6 +348,15 @@ from synth_ai.sdk.research.contracts.research_intern import (
348
348
  ResearchInternTurnRequest,
349
349
  ResearchInternTurnResponse,
350
350
  ResearchInternTurnStatus,
351
+ SyncKitAssociatedFile,
352
+ SyncKitAssociationReceipt,
353
+ SyncKitIngressKind,
354
+ SyncKitIngressObservation,
355
+ SyncKitIngressSource,
356
+ SyncKitReadiness,
357
+ SyncTemplateProvisionedResource,
358
+ SyncTemplateProvisioningReceipt,
359
+ SyncTracePublicationReceipt,
351
360
  )
352
361
  from synth_ai.sdk.research.contracts.runtime_stream import (
353
362
  SwarmEvent,
@@ -921,6 +930,15 @@ __all__ = [
921
930
  "SwarmTerminalOutcomeMissingError",
922
931
  "SwarmEnvironment",
923
932
  "SwarmUsage",
933
+ "SyncKitAssociatedFile",
934
+ "SyncKitAssociationReceipt",
935
+ "SyncKitIngressKind",
936
+ "SyncKitIngressObservation",
937
+ "SyncKitIngressSource",
938
+ "SyncKitReadiness",
939
+ "SyncTemplateProvisionedResource",
940
+ "SyncTemplateProvisioningReceipt",
941
+ "SyncTracePublicationReceipt",
924
942
  "TaskId",
925
943
  "TranscriptCursor",
926
944
  "TranscriptCursorKind",
@@ -184,6 +184,129 @@ class InternSyncSessionCreateRequest(_StrictContract):
184
184
  metadata: dict[str, Any] = Field(default_factory=dict)
185
185
 
186
186
 
187
+ class SyncTemplateProvisionedResource(_StrictContract):
188
+ """One resource decision made while provisioning a task template."""
189
+
190
+ resource_kind: Literal[
191
+ "project",
192
+ "factory",
193
+ "factory_project_link",
194
+ "effort",
195
+ "intern_factory_membership",
196
+ "run",
197
+ ]
198
+ status: Literal["created", "reused", "unsupported"]
199
+ resource_id: str | None = None
200
+ error_code: str | None = None
201
+
202
+
203
+ class SyncTemplateProvisioningReceipt(_StrictContract):
204
+ """Durable record of what starting from a task template provisioned.
205
+
206
+ The backend mints this receipt inside the session-create transaction and
207
+ stamps it into the session projection; the SDK only ever observes it.
208
+ """
209
+
210
+ schema_version: Literal["smr.intern-sync-template-provisioning.v1"]
211
+ task_template: str
212
+ binding: InternRuntimeBinding
213
+ resources: tuple[SyncTemplateProvisionedResource, ...]
214
+ provisioned_at: datetime
215
+
216
+
217
+ class SyncTracePublicationReceipt(_StrictContract):
218
+ """Read-only receipt for the server-side terminal Trace V5 publication.
219
+
220
+ The backend publishes the durable Sync event chain as genuine Trace V5 as
221
+ an effect of the session reaching a terminal state. Clients never mint
222
+ this record; they observe it on the session projection after close.
223
+ """
224
+
225
+ schema_version: Literal["smr.intern-sync-trace-publication.v1"]
226
+ status: Literal["published", "failed"]
227
+ sync_session_id: str
228
+ runtime_kind: Literal["sync"]
229
+ state_generation: int = Field(ge=1)
230
+ event_count: int | None = Field(default=None, ge=1)
231
+ trace_id: str | None = None
232
+ trace_digest: str | None = Field(default=None, pattern=r"^sha256:[0-9a-f]{64}$")
233
+ capture_id: str | None = None
234
+ bundle_id: str | None = None
235
+ manifest_digest: str | None = Field(default=None, pattern=r"^sha256:[0-9a-f]{64}$")
236
+ publication_id: str | None = None
237
+ error_code: str | None = None
238
+ attempted_at: datetime
239
+ published_at: datetime | None = None
240
+
241
+
242
+ SyncKitIngressKind = Literal[
243
+ "website_upload",
244
+ "sdk_upload",
245
+ "git_push",
246
+ "project_files",
247
+ ]
248
+
249
+ SyncKitIngressObservation = Literal[
250
+ "stored_file_write",
251
+ "push_confirmation",
252
+ "upload_url_issuance",
253
+ ]
254
+
255
+
256
+ class SyncKitAssociatedFile(_StrictContract):
257
+ """One file observed in a kit ingress, with whatever identity was available."""
258
+
259
+ path: str
260
+ digest: str | None = Field(default=None, pattern=r"^sha256:[0-9a-f]{64}$")
261
+ size_bytes: int | None = Field(default=None, ge=0)
262
+ stored_file_id: str | None = None
263
+
264
+
265
+ class SyncKitIngressSource(_StrictContract):
266
+ """Source identity of one kit ingress, per ingress kind."""
267
+
268
+ commit_sha: str | None = None
269
+ archive_key: str | None = None
270
+ workspace_archive_id: str | None = None
271
+ push_confirmation_receipt_id: str | None = None
272
+ upload_batch_id: str | None = None
273
+ dataset_ref: str | None = None
274
+ stored_file_ids: tuple[str, ...] = ()
275
+
276
+
277
+ class SyncKitAssociationReceipt(_StrictContract):
278
+ """Durable record that a kit ingress landed while this session was open.
279
+
280
+ The backend mints this receipt as a server-side effect of observing an
281
+ upload, push, or file write on a project bound to an open Sync session.
282
+ Clients never mint it; they observe it on the session projection.
283
+ """
284
+
285
+ schema_version: Literal["smr.intern-sync-kit-association.v1"]
286
+ receipt_id: str
287
+ sync_session_id: str
288
+ project_id: str
289
+ ingress_kind: SyncKitIngressKind
290
+ observed_via: SyncKitIngressObservation
291
+ files: tuple[SyncKitAssociatedFile, ...] = ()
292
+ source: SyncKitIngressSource
293
+ open_session_count: int = Field(ge=1)
294
+ associated_at: datetime
295
+
296
+
297
+ class SyncKitReadiness(_StrictContract):
298
+ """Read-only kit completeness projection for a template-bound session."""
299
+
300
+ schema_version: Literal["smr.intern-sync-kit-readiness.v1"]
301
+ status: Literal["ready", "incomplete"]
302
+ task_template: str
303
+ kit_contract: str
304
+ required_files: tuple[str, ...]
305
+ present_files: tuple[str, ...] = ()
306
+ missing_files: tuple[str, ...] = ()
307
+ checked_at: datetime
308
+
309
+
187
310
  class InternSyncSession(_StrictContract):
188
311
  schema_version: Literal["smr.intern-sync-session.v1"]
189
312
  sync_session_id: str
@@ -200,6 +323,14 @@ class InternSyncSession(_StrictContract):
200
323
  outcome: InternRuntimeOutcome | None = None
201
324
  failure_code: str | None = None
202
325
  temporal_workflow_id: str
326
+ # Server-minted projection stamps. Old backends omit them entirely; new
327
+ # backends stamp them once the corresponding effect lands. The SDK only
328
+ # observes these receipts — the backend remains the minting authority.
329
+ task_template: str | None = None
330
+ provisioning: SyncTemplateProvisioningReceipt | None = None
331
+ trace_publication: SyncTracePublicationReceipt | None = None
332
+ kit_associations: tuple[SyncKitAssociationReceipt, ...] = ()
333
+ kit_readiness: SyncKitReadiness | None = None
203
334
  created_at: datetime
204
335
  updated_at: datetime
205
336
  closed_at: datetime | None = None
@@ -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
@@ -297,6 +297,15 @@ from synth_ai.sdk.research.contracts import (
297
297
  SwarmTranscriptEvent,
298
298
  SwarmTranscriptPage,
299
299
  SwarmUsage,
300
+ SyncKitAssociatedFile,
301
+ SyncKitAssociationReceipt,
302
+ SyncKitIngressKind,
303
+ SyncKitIngressObservation,
304
+ SyncKitIngressSource,
305
+ SyncKitReadiness,
306
+ SyncTemplateProvisionedResource,
307
+ SyncTemplateProvisioningReceipt,
308
+ SyncTracePublicationReceipt,
300
309
  TaskId,
301
310
  TokenCounts,
302
311
  TokenUsage,
@@ -413,6 +422,7 @@ from synth_ai.sdk.research.research_intern import (
413
422
  AsyncResearchInternReactiveSession,
414
423
  AsyncResearchInternSessionsAPI,
415
424
  AsyncResearchInternSyncRuntimeAPI,
425
+ LegacyInternSessionsDisabledError,
416
426
  ProjectComputerAPI,
417
427
  ProjectDataBindingsAPI,
418
428
  ResearchInternAcceptanceReceiptsAPI,
@@ -489,6 +499,7 @@ __all__ = [
489
499
  "InternSyncSession",
490
500
  "InternSyncSessionCreateRequest",
491
501
  "InternSyncStatus",
502
+ "LegacyInternSessionsDisabledError",
492
503
  "FactoryStorageAuthorityResponse",
493
504
  "MAGI_CANONICAL_USER_BY_MODE",
494
505
  "MagiActuationStatus",
@@ -754,6 +765,15 @@ __all__ = [
754
765
  "SwarmTranscriptEvent",
755
766
  "SwarmTranscriptPage",
756
767
  "SwarmUsage",
768
+ "SyncKitAssociatedFile",
769
+ "SyncKitAssociationReceipt",
770
+ "SyncKitIngressKind",
771
+ "SyncKitIngressObservation",
772
+ "SyncKitIngressSource",
773
+ "SyncKitReadiness",
774
+ "SyncTemplateProvisionedResource",
775
+ "SyncTemplateProvisioningReceipt",
776
+ "SyncTracePublicationReceipt",
757
777
  "TaskId",
758
778
  "ToolProvider",
759
779
  "TokenCounts",