synth-ai 0.18.1.dev596__tar.gz → 0.18.1.dev597__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 (254) hide show
  1. {synth_ai-0.18.1.dev596/synth_ai.egg-info → synth_ai-0.18.1.dev597}/PKG-INFO +1 -1
  2. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/pyproject.toml +1 -1
  3. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/__init__.py +90 -0
  4. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/server.py +50 -7
  5. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/__init__.py +2 -0
  6. synth_ai-0.18.1.dev597/synth_ai/mcp/research/tools/research_intern.py +838 -0
  7. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/usage.py +10 -3
  8. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/__init__.py +50 -0
  9. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/canonical_usage.py +95 -11
  10. synth_ai-0.18.1.dev597/synth_ai/sdk/research/contracts/limit_evidence.py +406 -0
  11. synth_ai-0.18.1.dev597/synth_ai/sdk/research/contracts/research_intern.py +791 -0
  12. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/wire_models.py +20 -0
  13. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/errors.py +82 -0
  14. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/operations.py +90 -0
  15. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/public.py +84 -0
  16. synth_ai-0.18.1.dev597/synth_ai/sdk/research/research_intern.py +4100 -0
  17. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/__init__.py +61 -0
  18. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/client.py +46 -4
  19. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/runs.py +44 -4
  20. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/usage.py +52 -4
  21. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/transport/http.py +21 -0
  22. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597/synth_ai.egg-info}/PKG-INFO +1 -1
  23. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai.egg-info/SOURCES.txt +2 -0
  24. synth_ai-0.18.1.dev596/synth_ai/sdk/research/contracts/research_intern.py +0 -394
  25. synth_ai-0.18.1.dev596/synth_ai/sdk/research/research_intern.py +0 -1330
  26. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/LICENSE +0 -0
  27. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/MANIFEST.in +0 -0
  28. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/README.md +0 -0
  29. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/setup.cfg +0 -0
  30. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/README.md +0 -0
  31. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/__main__.py +0 -0
  32. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/cli/AGENTS.md +0 -0
  33. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/cli/README.md +0 -0
  34. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/cli/__init__.py +0 -0
  35. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/cli/__main__.py +0 -0
  36. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/cli/main.py +0 -0
  37. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/cli/research.py +0 -0
  38. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/cli/research_environments.py +0 -0
  39. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/cli/research_image_releases.py +0 -0
  40. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/cli/research_projects.py +0 -0
  41. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/client.py +0 -0
  42. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/README.md +0 -0
  43. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/__init__.py +0 -0
  44. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/auth/__init__.py +0 -0
  45. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/auth/credentials.py +0 -0
  46. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/contracts/__init__.py +0 -0
  47. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/contracts/json_value.py +0 -0
  48. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/contracts/pagination.py +0 -0
  49. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/errors.py +0 -0
  50. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/http/__init__.py +0 -0
  51. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/http/async_transport.py +0 -0
  52. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/http/request.py +0 -0
  53. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/http/retry.py +0 -0
  54. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/http/streaming.py +0 -0
  55. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/http/transport.py +0 -0
  56. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/research/__init__.py +0 -0
  57. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/utils/__init__.py +0 -0
  58. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/utils/env.py +0 -0
  59. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/utils/log_filter.py +0 -0
  60. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/utils/paths.py +0 -0
  61. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/core/utils/urls.py +0 -0
  62. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/README.md +0 -0
  63. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/__init__.py +0 -0
  64. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/__main__.py +0 -0
  65. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/objective_tools.py +0 -0
  66. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/registry.py +0 -0
  67. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/request_models.py +0 -0
  68. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/approvals.py +0 -0
  69. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/artifacts.py +0 -0
  70. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/datasets.py +0 -0
  71. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/environments.py +0 -0
  72. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/exports.py +0 -0
  73. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/factories.py +0 -0
  74. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/factory_results.py +0 -0
  75. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/files.py +0 -0
  76. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/image_releases.py +0 -0
  77. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/integrations.py +0 -0
  78. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/logs.py +0 -0
  79. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/models.py +0 -0
  80. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/outputs.py +0 -0
  81. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
  82. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/progress.py +0 -0
  83. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/project_data.py +0 -0
  84. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/projects.py +0 -0
  85. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/prs.py +0 -0
  86. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/readiness.py +0 -0
  87. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/repos.py +0 -0
  88. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/resources.py +0 -0
  89. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/runs.py +0 -0
  90. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/trained_models.py +0 -0
  91. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/visuals.py +0 -0
  92. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/mcp/research/tools/workspace_inputs.py +0 -0
  93. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/py.typed +0 -0
  94. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/README.md +0 -0
  95. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/__init__.py +0 -0
  96. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/pagination.py +0 -0
  97. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/__init__.py +0 -0
  98. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/_internal/__init__.py +0 -0
  99. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/_internal/crypto.py +0 -0
  100. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/_internal/env.py +0 -0
  101. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/_internal/urls.py +0 -0
  102. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/account.py +0 -0
  103. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/advanced.py +0 -0
  104. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/advanced_factories.py +0 -0
  105. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/advanced_swarms.py +0 -0
  106. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/artifacts.py +0 -0
  107. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/auth.py +0 -0
  108. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/client.py +0 -0
  109. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
  110. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
  111. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
  112. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/_wire.py +0 -0
  113. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/activity.py +0 -0
  114. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
  115. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
  116. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/billing.py +0 -0
  117. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
  118. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
  119. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
  120. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/common.py +0 -0
  121. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
  122. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
  123. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
  124. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/economics.py +0 -0
  125. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
  126. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/environments.py +0 -0
  127. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/evidence.py +0 -0
  128. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/factories.py +0 -0
  129. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
  130. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
  131. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/factory_operations.py +0 -0
  132. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
  133. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/failure.py +0 -0
  134. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
  135. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
  136. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
  137. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/project.py +0 -0
  138. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/project_data.py +0 -0
  139. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
  140. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
  141. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
  142. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/projects.py +0 -0
  143. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/promotions.py +0 -0
  144. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
  145. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/run_control.py +0 -0
  146. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
  147. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/run_events.py +0 -0
  148. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
  149. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
  150. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
  151. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/run_state.py +0 -0
  152. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
  153. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/runtime_image.py +0 -0
  154. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
  155. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
  156. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
  157. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
  158. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
  159. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
  160. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
  161. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
  162. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
  163. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
  164. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
  165. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
  166. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
  167. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
  168. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
  169. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
  170. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
  171. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
  172. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_providers.py +0 -0
  173. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
  174. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
  175. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_run_policy.py +0 -0
  176. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
  177. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
  178. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
  179. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
  180. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
  181. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/status.py +0 -0
  182. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/swarms.py +0 -0
  183. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/tag.py +0 -0
  184. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/traces.py +0 -0
  185. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/transcript.py +0 -0
  186. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/types.py +0 -0
  187. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/usage.py +0 -0
  188. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/visuals.py +0 -0
  189. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/wire_models_README.md +0 -0
  190. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/work_products.py +0 -0
  191. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/contracts/workspaces.py +0 -0
  192. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/economics.py +0 -0
  193. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/efforts.py +0 -0
  194. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/environments.py +0 -0
  195. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/events.py +0 -0
  196. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/experiments.py +0 -0
  197. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/facade.py +0 -0
  198. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/factories.py +0 -0
  199. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/factory_storage.py +0 -0
  200. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/image_releases.py +0 -0
  201. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/knowledge.py +0 -0
  202. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/models.py +0 -0
  203. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/project_data.py +0 -0
  204. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/project_deliveries.py +0 -0
  205. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/project_workspaces.py +0 -0
  206. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/projects.py +0 -0
  207. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/readouts.py +0 -0
  208. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/secrets.py +0 -0
  209. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/README.md +0 -0
  210. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/_base.py +0 -0
  211. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/_client_helpers.py +0 -0
  212. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/_run_authority_mixin.py +0 -0
  213. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/approvals.py +0 -0
  214. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/billing.py +0 -0
  215. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
  216. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/config.py +0 -0
  217. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/cost.py +0 -0
  218. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/datasets.py +0 -0
  219. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/dev_environments.py +0 -0
  220. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/environments.py +0 -0
  221. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/exports.py +0 -0
  222. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/factories.py +0 -0
  223. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
  224. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/files.py +0 -0
  225. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/github.py +0 -0
  226. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/image_releases.py +0 -0
  227. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/images.py +0 -0
  228. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/logs.py +0 -0
  229. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/models.py +0 -0
  230. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/outputs.py +0 -0
  231. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/progress.py +0 -0
  232. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/project.py +0 -0
  233. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/projects.py +0 -0
  234. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/prs.py +0 -0
  235. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/readiness.py +0 -0
  236. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/repositories.py +0 -0
  237. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/secrets.py +0 -0
  238. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/setup.py +0 -0
  239. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/tag.py +0 -0
  240. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/trained_models.py +0 -0
  241. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/transport.py +0 -0
  242. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/work_products.py +0 -0
  243. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
  244. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/swarms.py +0 -0
  245. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/traces.py +0 -0
  246. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/transport/__init__.py +0 -0
  247. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/transport/pagination.py +0 -0
  248. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/version.py +0 -0
  249. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/visuals.py +0 -0
  250. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai/sdk/research/wiki.py +0 -0
  251. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai.egg-info/dependency_links.txt +0 -0
  252. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai.egg-info/entry_points.txt +0 -0
  253. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/synth_ai.egg-info/requires.txt +0 -0
  254. {synth_ai-0.18.1.dev596 → synth_ai-0.18.1.dev597}/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.1.dev596
3
+ Version: 0.18.1.dev597
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "synth-ai"
3
- version = "0.18.1.dev596"
3
+ version = "0.18.1.dev597"
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"
@@ -37,6 +37,7 @@ except _PackageNotFoundError:
37
37
 
38
38
 
39
39
  __all__ = [
40
+ "AsyncResearchInternReactiveSession",
40
41
  "AsyncSynthClient",
41
42
  "DataBindingCreateRequest",
42
43
  "DatasetRevisionCreateRequest",
@@ -52,6 +53,8 @@ __all__ = [
52
53
  "FactoryRoleReceiptRuntimeEvidence",
53
54
  "FactoryStorageAuthorityResponse",
54
55
  "ResearchApiError",
56
+ "MagiDecisionKind",
57
+ "MagiDecisionReceiptResponse",
55
58
  "MagiDecisionRequest",
56
59
  "MagiMode",
57
60
  "ProjectComputerCleanupReceiptResponse",
@@ -69,14 +72,29 @@ __all__ = [
69
72
  "ResearchConcurrentRunLimitExceededError",
70
73
  "ResearchInsufficientCreditsError",
71
74
  "ResearchLimitExceededError",
75
+ "ResearchLimitExtensionGuardedResumeBlockedError",
76
+ "ResearchLimitExtensionIdempotencyConflictError",
77
+ "ResearchLimitRevisionConflictError",
72
78
  "ResearchProjectCreateRequest",
73
79
  "ResearchInternProvisionRequest",
80
+ "ResearchInternReactiveSession",
81
+ "ResearchInternEventStreamCursor",
82
+ "ResearchInternEventStreamEvent",
83
+ "ResearchInternEventStreamHeartbeat",
74
84
  "ResearchInternResponse",
85
+ "ResearchInternSessionCreateRequest",
86
+ "ResearchInternSessionResponse",
75
87
  "ResearchInternStatus",
88
+ "ResearchInternTracePublicationRequest",
89
+ "ResearchInternTracePublicationResponse",
90
+ "ResearchInternTurnControl",
91
+ "ResearchInternTurnRequest",
92
+ "ResearchInternTurnResponse",
76
93
  "ResearchSwarmLaunchRequest",
77
94
  "ResearchSwarmState",
78
95
  "ResearchVisual",
79
96
  "ResearchVisualPage",
97
+ "ResearchUnsafeLimitExtensionError",
80
98
  "ResearchVisualPatchRequest",
81
99
  "ResearchVisualPromotionRequest",
82
100
  "ResearchVisualVersions",
@@ -84,6 +102,10 @@ __all__ = [
84
102
  ]
85
103
 
86
104
  _EXPORTS: dict[str, tuple[str, str]] = {
105
+ "AsyncResearchInternReactiveSession": (
106
+ "synth_ai.sdk.research.research_intern",
107
+ "AsyncResearchInternReactiveSession",
108
+ ),
87
109
  "DataBindingCreateRequest": (
88
110
  "synth_ai.sdk.research.contracts",
89
111
  "DataBindingCreateRequest",
@@ -140,6 +162,14 @@ _EXPORTS: dict[str, tuple[str, str]] = {
140
162
  "synth_ai.sdk.research.contracts",
141
163
  "MagiDecisionRequest",
142
164
  ),
165
+ "MagiDecisionKind": (
166
+ "synth_ai.sdk.research.contracts",
167
+ "MagiDecisionKind",
168
+ ),
169
+ "MagiDecisionReceiptResponse": (
170
+ "synth_ai.sdk.research.contracts",
171
+ "MagiDecisionReceiptResponse",
172
+ ),
143
173
  "MagiMode": ("synth_ai.sdk.research.contracts", "MagiMode"),
144
174
  "ProjectComputerCleanupReceiptResponse": (
145
175
  "synth_ai.sdk.research.contracts",
@@ -195,6 +225,22 @@ _EXPORTS: dict[str, tuple[str, str]] = {
195
225
  "ResearchInsufficientCreditsError",
196
226
  ),
197
227
  "ResearchLimitExceededError": ("synth_ai.sdk.research.errors", "ResearchLimitExceededError"),
228
+ "ResearchLimitExtensionGuardedResumeBlockedError": (
229
+ "synth_ai.sdk.research.errors",
230
+ "ResearchLimitExtensionGuardedResumeBlockedError",
231
+ ),
232
+ "ResearchLimitExtensionIdempotencyConflictError": (
233
+ "synth_ai.sdk.research.errors",
234
+ "ResearchLimitExtensionIdempotencyConflictError",
235
+ ),
236
+ "ResearchLimitRevisionConflictError": (
237
+ "synth_ai.sdk.research.errors",
238
+ "ResearchLimitRevisionConflictError",
239
+ ),
240
+ "ResearchUnsafeLimitExtensionError": (
241
+ "synth_ai.sdk.research.errors",
242
+ "ResearchUnsafeLimitExtensionError",
243
+ ),
198
244
  "SmrApiError": ("synth_ai.sdk.research.errors", "ResearchApiError"),
199
245
  "SmrConcurrentRunLimitExceededError": (
200
246
  "synth_ai.sdk.research.errors",
@@ -214,14 +260,58 @@ _EXPORTS: dict[str, tuple[str, str]] = {
214
260
  "synth_ai.sdk.research.contracts",
215
261
  "ResearchInternProvisionRequest",
216
262
  ),
263
+ "ResearchInternReactiveSession": (
264
+ "synth_ai.sdk.research.research_intern",
265
+ "ResearchInternReactiveSession",
266
+ ),
267
+ "ResearchInternEventStreamCursor": (
268
+ "synth_ai.sdk.research.contracts",
269
+ "ResearchInternEventStreamCursor",
270
+ ),
271
+ "ResearchInternEventStreamEvent": (
272
+ "synth_ai.sdk.research.contracts",
273
+ "ResearchInternEventStreamEvent",
274
+ ),
275
+ "ResearchInternEventStreamHeartbeat": (
276
+ "synth_ai.sdk.research.contracts",
277
+ "ResearchInternEventStreamHeartbeat",
278
+ ),
217
279
  "ResearchInternResponse": (
218
280
  "synth_ai.sdk.research.contracts",
219
281
  "ResearchInternResponse",
220
282
  ),
283
+ "ResearchInternSessionCreateRequest": (
284
+ "synth_ai.sdk.research.contracts",
285
+ "ResearchInternSessionCreateRequest",
286
+ ),
287
+ "ResearchInternSessionResponse": (
288
+ "synth_ai.sdk.research.contracts",
289
+ "ResearchInternSessionResponse",
290
+ ),
221
291
  "ResearchInternStatus": (
222
292
  "synth_ai.sdk.research.contracts",
223
293
  "ResearchInternStatus",
224
294
  ),
295
+ "ResearchInternTracePublicationRequest": (
296
+ "synth_ai.sdk.research.contracts",
297
+ "ResearchInternTracePublicationRequest",
298
+ ),
299
+ "ResearchInternTracePublicationResponse": (
300
+ "synth_ai.sdk.research.contracts",
301
+ "ResearchInternTracePublicationResponse",
302
+ ),
303
+ "ResearchInternTurnControl": (
304
+ "synth_ai.sdk.research.contracts",
305
+ "ResearchInternTurnControl",
306
+ ),
307
+ "ResearchInternTurnRequest": (
308
+ "synth_ai.sdk.research.contracts",
309
+ "ResearchInternTurnRequest",
310
+ ),
311
+ "ResearchInternTurnResponse": (
312
+ "synth_ai.sdk.research.contracts",
313
+ "ResearchInternTurnResponse",
314
+ ),
225
315
  "ResearchSwarmLaunchRequest": (
226
316
  "synth_ai.sdk.research.contracts",
227
317
  "ResearchSwarmLaunchRequest",
@@ -6,6 +6,8 @@ import json
6
6
  import os
7
7
  import sys
8
8
  from dataclasses import asdict, is_dataclass
9
+ from datetime import date, datetime, time
10
+ from enum import Enum
9
11
  from typing import Any
10
12
 
11
13
  from synth_ai.core.errors import SynthError
@@ -54,6 +56,7 @@ from synth_ai.mcp.research.tools.projects import build_project_tools
54
56
  from synth_ai.mcp.research.tools.prs import build_pr_tools
55
57
  from synth_ai.mcp.research.tools.readiness import build_readiness_tools
56
58
  from synth_ai.mcp.research.tools.repos import build_repo_tools
59
+ from synth_ai.mcp.research.tools.research_intern import build_research_intern_tools
57
60
  from synth_ai.mcp.research.tools.resources import build_resource_tools
58
61
  from synth_ai.mcp.research.tools.runs import build_run_tools
59
62
  from synth_ai.mcp.research.tools.trained_models import build_trained_model_tools
@@ -92,6 +95,7 @@ def _optional_int_default(args: JSONDict, name: str, default: int) -> int:
92
95
 
93
96
  _STABLE_TOOL_NAMES = frozenset(
94
97
  {
98
+ "research_append_research_intern_event",
95
99
  "research_archive_factory",
96
100
  "research_archive_project",
97
101
  "research_branch_run_from_checkpoint",
@@ -156,6 +160,27 @@ _STABLE_TOOL_NAMES = frozenset(
156
160
  "research_upload_workspace_files",
157
161
  "research_watch_run_events",
158
162
  "research_attach_source_repo",
163
+ "research_attach_research_intern_factory",
164
+ "research_close_research_intern_session",
165
+ "research_create_research_intern_session",
166
+ "research_exchange_research_intern_turn",
167
+ "research_get_research_intern",
168
+ "research_get_research_intern_acceptance_receipt",
169
+ "research_get_research_intern_decision",
170
+ "research_get_research_intern_session",
171
+ "research_list_research_intern_acceptance_receipts",
172
+ "research_list_research_intern_decisions",
173
+ "research_list_research_intern_events",
174
+ "research_list_research_intern_factories",
175
+ "research_list_research_intern_sessions",
176
+ "research_provision_research_intern",
177
+ "research_publish_research_intern_acceptance_receipt",
178
+ "research_publish_research_intern_session_trace",
179
+ "research_record_research_intern_decision",
180
+ "research_run_research_intern_turn",
181
+ "research_sync_research_intern_session",
182
+ "research_update_research_intern",
183
+ "research_watch_research_intern_events",
159
184
  }
160
185
  )
161
186
 
@@ -285,13 +310,26 @@ def _optional_string_tuple_arg(args: JSONDict, key: str) -> tuple[str, ...]:
285
310
 
286
311
  def _mcp_jsonable(value: Any) -> Any:
287
312
  if is_dataclass(value):
288
- return asdict(value)
289
- if isinstance(value, list):
290
- return [_mcp_jsonable(item) for item in value]
291
- if isinstance(value, tuple):
313
+ return _mcp_jsonable(asdict(value))
314
+ if isinstance(value, Enum):
315
+ return _mcp_jsonable(value.value)
316
+ if isinstance(value, (datetime, date, time)):
317
+ return value.isoformat()
318
+ if isinstance(value, (list, tuple)):
292
319
  return [_mcp_jsonable(item) for item in value]
293
320
  if isinstance(value, dict):
294
321
  return {str(key): _mcp_jsonable(item) for key, item in value.items()}
322
+ if isinstance(value, (set, frozenset)):
323
+ normalized = [_mcp_jsonable(item) for item in value]
324
+ return sorted(
325
+ normalized,
326
+ key=lambda item: json.dumps(
327
+ item,
328
+ ensure_ascii=False,
329
+ sort_keys=True,
330
+ separators=(",", ":"),
331
+ ),
332
+ )
295
333
  return value
296
334
 
297
335
 
@@ -411,6 +449,7 @@ class ResearchMcpServer:
411
449
  *build_model_tools(self),
412
450
  *build_output_tools(self),
413
451
  *build_readiness_tools(self),
452
+ *build_research_intern_tools(self._core_client_from_args),
414
453
  *build_resource_tools(self),
415
454
  *build_run_tools(self),
416
455
  *build_progress_tools(self),
@@ -1326,9 +1365,13 @@ class ResearchMcpServer:
1326
1365
  )
1327
1366
  limit_value = self._optional_float_arg(args, "limit_value")
1328
1367
  additional_value = self._optional_float_arg(args, "additional_value")
1329
- resolve_blockers = optional_bool(args, "resolve_blockers", default=True)
1330
- resume = optional_bool(args, "resume", default=True)
1368
+ expected_revision = optional_int(args, "expected_revision")
1369
+ if expected_revision is None or expected_revision < 1:
1370
+ raise ValueError("expected_revision must be an integer greater than or equal to 1")
1371
+ resolve_blockers = optional_bool(args, "resolve_blockers", default=False)
1372
+ resume = optional_bool(args, "resume", default=False)
1331
1373
  kwargs = {
1374
+ "expected_revision": expected_revision,
1332
1375
  "limit_value": limit_value,
1333
1376
  "additional_value": additional_value,
1334
1377
  "reason": optional_string(args, "reason"),
@@ -2722,7 +2765,7 @@ class ResearchMcpServer:
2722
2765
  arguments = params.get("arguments")
2723
2766
  if arguments is not None and not isinstance(arguments, dict):
2724
2767
  raise RpcError(-32602, "tools/call arguments must be an object")
2725
- result = self.call_tool(tool_name, arguments)
2768
+ result = _mcp_jsonable(self.call_tool(tool_name, arguments))
2726
2769
  return {
2727
2770
  "jsonrpc": "2.0",
2728
2771
  "id": request_id,
@@ -13,6 +13,7 @@ from synth_ai.mcp.research.tools.project_data import build_project_data_tools
13
13
  from synth_ai.mcp.research.tools.projects import build_project_tools
14
14
  from synth_ai.mcp.research.tools.prs import build_pr_tools
15
15
  from synth_ai.mcp.research.tools.readiness import build_readiness_tools
16
+ from synth_ai.mcp.research.tools.research_intern import build_research_intern_tools
16
17
  from synth_ai.mcp.research.tools.repos import build_repo_tools
17
18
  from synth_ai.mcp.research.tools.runs import build_run_tools
18
19
  from synth_ai.mcp.research.tools.visuals import build_visual_tools
@@ -32,6 +33,7 @@ __all__ = [
32
33
  "build_project_tools",
33
34
  "build_pr_tools",
34
35
  "build_readiness_tools",
36
+ "build_research_intern_tools",
35
37
  "build_repo_tools",
36
38
  "build_run_tools",
37
39
  "build_visual_tools",