synth-ai 0.18.2.dev610__tar.gz → 0.18.2.dev612__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.dev610/synth_ai.egg-info → synth_ai-0.18.2.dev612}/PKG-INFO +1 -1
  2. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/pyproject.toml +1 -1
  3. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/research_intern.py +126 -6
  4. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/workspace_inputs.py +1 -2
  5. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/__init__.py +30 -16
  6. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/research_intern.py +164 -99
  7. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/operations.py +37 -0
  8. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/public.py +34 -16
  9. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/research_intern.py +249 -4
  10. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612/synth_ai.egg-info}/PKG-INFO +1 -1
  11. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/LICENSE +0 -0
  12. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/MANIFEST.in +0 -0
  13. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/README.md +0 -0
  14. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/setup.cfg +0 -0
  15. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/README.md +0 -0
  16. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/__init__.py +0 -0
  17. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/__main__.py +0 -0
  18. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/cli/AGENTS.md +0 -0
  19. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/cli/README.md +0 -0
  20. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/cli/__init__.py +0 -0
  21. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/cli/__main__.py +0 -0
  22. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/cli/main.py +0 -0
  23. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/cli/research.py +0 -0
  24. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/cli/research_environments.py +0 -0
  25. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/cli/research_image_releases.py +0 -0
  26. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/cli/research_projects.py +0 -0
  27. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/client.py +0 -0
  28. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/README.md +0 -0
  29. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/__init__.py +0 -0
  30. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/auth/__init__.py +0 -0
  31. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/auth/credentials.py +0 -0
  32. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/contracts/__init__.py +0 -0
  33. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/contracts/json_value.py +0 -0
  34. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/contracts/pagination.py +0 -0
  35. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/errors.py +0 -0
  36. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/http/__init__.py +0 -0
  37. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/http/async_transport.py +0 -0
  38. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/http/request.py +0 -0
  39. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/http/retry.py +0 -0
  40. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/http/streaming.py +0 -0
  41. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/http/transport.py +0 -0
  42. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/research/__init__.py +0 -0
  43. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/utils/__init__.py +0 -0
  44. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/utils/env.py +0 -0
  45. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/utils/log_filter.py +0 -0
  46. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/utils/paths.py +0 -0
  47. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/core/utils/urls.py +0 -0
  48. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/README.md +0 -0
  49. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/__init__.py +0 -0
  50. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/__main__.py +0 -0
  51. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/objective_tools.py +0 -0
  52. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/registry.py +0 -0
  53. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/request_models.py +0 -0
  54. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/server.py +0 -0
  55. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/__init__.py +0 -0
  56. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/approvals.py +0 -0
  57. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/artifacts.py +0 -0
  58. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/datasets.py +0 -0
  59. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/environments.py +0 -0
  60. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/exports.py +0 -0
  61. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/factories.py +0 -0
  62. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/factory_results.py +0 -0
  63. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/files.py +0 -0
  64. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/image_releases.py +0 -0
  65. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/integrations.py +0 -0
  66. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/logs.py +0 -0
  67. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/models.py +0 -0
  68. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/outputs.py +0 -0
  69. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/policy_schemas.py +0 -0
  70. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/progress.py +0 -0
  71. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/project_data.py +0 -0
  72. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/projects.py +0 -0
  73. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/prs.py +0 -0
  74. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/readiness.py +0 -0
  75. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/repos.py +0 -0
  76. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/resources.py +0 -0
  77. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/runs.py +0 -0
  78. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/trained_models.py +0 -0
  79. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/usage.py +0 -0
  80. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/mcp/research/tools/visuals.py +0 -0
  81. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/py.typed +0 -0
  82. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/README.md +0 -0
  83. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/__init__.py +0 -0
  84. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/pagination.py +0 -0
  85. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/__init__.py +0 -0
  86. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/_internal/__init__.py +0 -0
  87. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/_internal/crypto.py +0 -0
  88. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/_internal/env.py +0 -0
  89. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/_internal/urls.py +0 -0
  90. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/account.py +0 -0
  91. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/advanced.py +0 -0
  92. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/advanced_factories.py +0 -0
  93. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/advanced_swarms.py +0 -0
  94. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/artifacts.py +0 -0
  95. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/auth.py +0 -0
  96. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/client.py +0 -0
  97. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/_activity_wire.py +0 -0
  98. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/_environment_wire.py +0 -0
  99. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/_transcript_wire.py +0 -0
  100. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/_wire.py +0 -0
  101. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/activity.py +0 -0
  102. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/activity_items.py +0 -0
  103. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/actor_images.py +0 -0
  104. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/billing.py +0 -0
  105. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/canonical_usage.py +0 -0
  106. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/checkpoints.py +0 -0
  107. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/cloud_deployment_claims.py +0 -0
  108. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/cloud_deployments.py +0 -0
  109. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/common.py +0 -0
  110. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/dataset_revisions.py +0 -0
  111. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/deliveries.py +0 -0
  112. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/dev_environment_evidence.py +0 -0
  113. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/economics.py +0 -0
  114. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/environment_manifest.py +0 -0
  115. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/environments.py +0 -0
  116. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/evidence.py +0 -0
  117. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/factories.py +0 -0
  118. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/factory_evidence.py +0 -0
  119. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/factory_lenses.py +0 -0
  120. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/factory_operations.py +0 -0
  121. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/factory_role_receipts.py +0 -0
  122. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/failure.py +0 -0
  123. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/image_releases.py +0 -0
  124. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/limit_evidence.py +0 -0
  125. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/local_execution_profile.py +0 -0
  126. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/operator_evidence.py +0 -0
  127. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/project.py +0 -0
  128. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/project_data.py +0 -0
  129. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/project_runtime.py +0 -0
  130. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/project_workspace.py +0 -0
  131. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/project_workspace_evidence.py +0 -0
  132. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/projects.py +0 -0
  133. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/promotions.py +0 -0
  134. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/run_authority.py +0 -0
  135. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/run_control.py +0 -0
  136. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/run_diagnostics.py +0 -0
  137. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/run_events.py +0 -0
  138. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/run_execution.py +0 -0
  139. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/run_launch.py +0 -0
  140. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/run_observability.py +0 -0
  141. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/run_state.py +0 -0
  142. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/run_timeline.py +0 -0
  143. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/runtime_image.py +0 -0
  144. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/runtime_intent.py +0 -0
  145. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/runtime_stream.py +0 -0
  146. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/runtime_stream_snapshot.py +0 -0
  147. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/scientific_integrity.py +0 -0
  148. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_actor_models.py +0 -0
  149. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_actor_policy_data.py +0 -0
  150. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_agent_harnesses.py +0 -0
  151. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_agent_kinds.py +0 -0
  152. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_agent_models.py +0 -0
  153. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_branching.py +0 -0
  154. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_credential_providers.py +0 -0
  155. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_environment_kinds.py +0 -0
  156. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_evidence_obligations.py +0 -0
  157. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_funding_sources.py +0 -0
  158. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_horizons.py +0 -0
  159. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_host_kinds.py +0 -0
  160. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_inference_providers.py +0 -0
  161. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_network_topology.py +0 -0
  162. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_providers.py +0 -0
  163. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_resource_kinds.py +0 -0
  164. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_roles.py +0 -0
  165. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_run_policy.py +0 -0
  166. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_runbooks.py +0 -0
  167. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_runnable_project.py +0 -0
  168. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_runtime_kinds.py +0 -0
  169. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_tool_providers.py +0 -0
  170. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/smr_work_modes.py +0 -0
  171. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/status.py +0 -0
  172. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/swarms.py +0 -0
  173. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/tag.py +0 -0
  174. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/traces.py +0 -0
  175. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/transcript.py +0 -0
  176. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/types.py +0 -0
  177. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/usage.py +0 -0
  178. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/visuals.py +0 -0
  179. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/wire_models.py +0 -0
  180. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/wire_models_README.md +0 -0
  181. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/work_products.py +0 -0
  182. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/contracts/workspaces.py +0 -0
  183. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/economics.py +0 -0
  184. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/efforts.py +0 -0
  185. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/environments.py +0 -0
  186. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/errors.py +0 -0
  187. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/events.py +0 -0
  188. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/experiments.py +0 -0
  189. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/facade.py +0 -0
  190. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/factories.py +0 -0
  191. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/factory_storage.py +0 -0
  192. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/image_releases.py +0 -0
  193. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/knowledge.py +0 -0
  194. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/models.py +0 -0
  195. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/project_data.py +0 -0
  196. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/project_deliveries.py +0 -0
  197. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/project_workspaces.py +0 -0
  198. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/projects.py +0 -0
  199. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/readouts.py +0 -0
  200. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/secrets.py +0 -0
  201. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/README.md +0 -0
  202. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/__init__.py +0 -0
  203. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/_base.py +0 -0
  204. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/_client_helpers.py +0 -0
  205. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/_run_authority_mixin.py +0 -0
  206. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/approvals.py +0 -0
  207. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/billing.py +0 -0
  208. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/client.py +0 -0
  209. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/cloud_deployments.py +0 -0
  210. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/config.py +0 -0
  211. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/cost.py +0 -0
  212. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/datasets.py +0 -0
  213. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/dev_environments.py +0 -0
  214. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/environments.py +0 -0
  215. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/exports.py +0 -0
  216. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/factories.py +0 -0
  217. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/factory_evidence.py +0 -0
  218. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/files.py +0 -0
  219. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/github.py +0 -0
  220. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/image_releases.py +0 -0
  221. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/images.py +0 -0
  222. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/logs.py +0 -0
  223. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/models.py +0 -0
  224. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/outputs.py +0 -0
  225. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/progress.py +0 -0
  226. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/project.py +0 -0
  227. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/projects.py +0 -0
  228. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/prs.py +0 -0
  229. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/readiness.py +0 -0
  230. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/repositories.py +0 -0
  231. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/runs.py +0 -0
  232. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/secrets.py +0 -0
  233. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/setup.py +0 -0
  234. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/tag.py +0 -0
  235. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/trained_models.py +0 -0
  236. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/transport.py +0 -0
  237. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/usage.py +0 -0
  238. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/work_products.py +0 -0
  239. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/session/workspace_inputs.py +0 -0
  240. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/swarms.py +0 -0
  241. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/traces.py +0 -0
  242. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/transport/__init__.py +0 -0
  243. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/transport/http.py +0 -0
  244. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/transport/pagination.py +0 -0
  245. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/version.py +0 -0
  246. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/visuals.py +0 -0
  247. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai/sdk/research/wiki.py +0 -0
  248. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai.egg-info/SOURCES.txt +0 -0
  249. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai.egg-info/dependency_links.txt +0 -0
  250. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai.egg-info/entry_points.txt +0 -0
  251. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/synth_ai.egg-info/requires.txt +0 -0
  252. {synth_ai-0.18.2.dev610 → synth_ai-0.18.2.dev612}/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.dev610
3
+ Version: 0.18.2.dev612
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.2.dev610"
3
+ version = "0.18.2.dev612"
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"
@@ -25,6 +25,7 @@ from synth_ai.sdk.research.contracts.research_intern import (
25
25
  InternAsyncEnsureRequest,
26
26
  InternAsyncInstructionKind,
27
27
  InternAsyncInstructionRequest,
28
+ InternCrossMetaThreadMessageCreateRequest,
28
29
  InternRuntimeOutcome,
29
30
  InternSyncCommandKind,
30
31
  InternSyncCommandRequest,
@@ -140,7 +141,52 @@ def build_research_intern_tools(
140
141
 
141
142
  def intern_sync_list(args: JSONDict) -> list[JSONDict]:
142
143
  with client_from_args(args) as client:
143
- return _wire_list(client.intern.sync_.list(limit=optional_int(args, "limit") or 100))
144
+ return _wire_list(client.intern.sync_.branches())
145
+
146
+ def intern_sync_branches(args: JSONDict) -> list[JSONDict]:
147
+ with client_from_args(args) as client:
148
+ return _wire_list(client.intern.sync_.branches())
149
+
150
+ def intern_meta_threads(args: JSONDict) -> list[JSONDict]:
151
+ with client_from_args(args) as client:
152
+ return _wire_list(client.intern.meta_threads.list())
153
+
154
+ def intern_meta_segments(args: JSONDict) -> list[JSONDict]:
155
+ with client_from_args(args) as client:
156
+ return _wire_list(
157
+ client.intern.meta_threads.segments(require_string(args, "meta_thread_id"))
158
+ )
159
+
160
+ def intern_meta_messages(args: JSONDict) -> list[JSONDict]:
161
+ with client_from_args(args) as client:
162
+ return _wire_list(
163
+ client.intern.meta_threads.messages(
164
+ require_string(args, "meta_thread_id"),
165
+ limit=optional_int(args, "limit") or 200,
166
+ )
167
+ )
168
+
169
+ def intern_meta_send(args: JSONDict) -> JSONDict:
170
+ request = InternCrossMetaThreadMessageCreateRequest.model_validate(
171
+ _request_payload(
172
+ args,
173
+ (
174
+ "message_id",
175
+ "source_meta_thread_id",
176
+ "destination_meta_thread_id",
177
+ "kind",
178
+ "idempotency_key",
179
+ "payload",
180
+ "linked_message_id",
181
+ "sync_session_id",
182
+ "segment_id",
183
+ "resolution",
184
+ "summary",
185
+ ),
186
+ )
187
+ )
188
+ with client_from_args(args) as client:
189
+ return client.intern.meta_threads.send(request).to_wire()
144
190
 
145
191
  def intern_sync_get(args: JSONDict) -> JSONDict:
146
192
  with client_from_args(args) as client:
@@ -755,6 +801,76 @@ def build_research_intern_tools(
755
801
  "sync_session_id": {"type": "string", "minLength": 1},
756
802
  }
757
803
  tools = [
804
+ ToolDefinition(
805
+ name="intern_meta_threads",
806
+ description="List the Intern's one Sync and one Async meta-thread.",
807
+ input_schema=tool_schema({}, required=[]),
808
+ handler=intern_meta_threads,
809
+ required_scopes=READ_SCOPES,
810
+ ),
811
+ ToolDefinition(
812
+ name="intern_meta_segments",
813
+ description="List head, live, and sealed segments for one meta-thread.",
814
+ input_schema=tool_schema(
815
+ {"meta_thread_id": {"type": "string", "minLength": 1}},
816
+ required=["meta_thread_id"],
817
+ ),
818
+ handler=intern_meta_segments,
819
+ required_scopes=READ_SCOPES,
820
+ ),
821
+ ToolDefinition(
822
+ name="intern_meta_messages",
823
+ description="List durable cross-lane messages visible to one meta-thread.",
824
+ input_schema=tool_schema(
825
+ {
826
+ "meta_thread_id": {"type": "string", "minLength": 1},
827
+ "limit": {"type": "integer", "minimum": 1, "maximum": 500},
828
+ },
829
+ required=["meta_thread_id"],
830
+ ),
831
+ handler=intern_meta_messages,
832
+ required_scopes=READ_SCOPES,
833
+ ),
834
+ ToolDefinition(
835
+ name="intern_meta_send",
836
+ description="Send one exact durable Sync-to-Async protocol object.",
837
+ input_schema=tool_schema(
838
+ {
839
+ "message_id": {"type": "string", "minLength": 1},
840
+ "source_meta_thread_id": {"type": "string", "minLength": 1},
841
+ "destination_meta_thread_id": {"type": "string", "minLength": 1},
842
+ "kind": {
843
+ "type": "string",
844
+ "enum": [
845
+ "request_decision",
846
+ "open_branch_ack",
847
+ "decision_resolved",
848
+ "steer",
849
+ "note",
850
+ ],
851
+ },
852
+ "idempotency_key": {"type": "string", "minLength": 1},
853
+ "payload": {"type": "object"},
854
+ "linked_message_id": {"type": "string"},
855
+ "sync_session_id": {"type": "string"},
856
+ "segment_id": {"type": "string"},
857
+ "resolution": {
858
+ "type": "string",
859
+ "enum": ["completed", "denied", "superseded"],
860
+ },
861
+ "summary": {"type": "string", "maxLength": 4000},
862
+ },
863
+ required=[
864
+ "message_id",
865
+ "source_meta_thread_id",
866
+ "destination_meta_thread_id",
867
+ "kind",
868
+ "idempotency_key",
869
+ ],
870
+ ),
871
+ handler=intern_meta_send,
872
+ required_scopes=WRITE_SCOPES,
873
+ ),
758
874
  ToolDefinition(
759
875
  name="intern_sync_create",
760
876
  description="Create or replay one durable operator-present Sync session.",
@@ -774,13 +890,17 @@ def build_research_intern_tools(
774
890
  handler=intern_sync_create,
775
891
  required_scopes=WRITE_SCOPES,
776
892
  ),
893
+ ToolDefinition(
894
+ name="intern_sync_branches",
895
+ description="List the Sync head plus every live or sealed branch.",
896
+ input_schema=tool_schema({}, required=[]),
897
+ handler=intern_sync_branches,
898
+ required_scopes=READ_SCOPES,
899
+ ),
777
900
  ToolDefinition(
778
901
  name="intern_sync_list",
779
- description="List a bounded page of durable Sync Intern sessions.",
780
- input_schema=tool_schema(
781
- {"limit": {"type": "integer", "minimum": 1, "maximum": 500}},
782
- required=[],
783
- ),
902
+ description="Compatibility alias of intern_sync_branches.",
903
+ input_schema=tool_schema({}, required=[]),
784
904
  handler=intern_sync_list,
785
905
  required_scopes=READ_SCOPES,
786
906
  ),
@@ -212,8 +212,7 @@ def build_workspace_input_tools(
212
212
  "Confirm an already-pushed workspace commit through project "
213
213
  "authority and return the typed WorkspacePushConfirmationReceipt "
214
214
  "-- the done signal for coding agents driving workspace ingress "
215
- "over MCP. If the project is bound to an open Sync session, the "
216
- "backend also auto-records a kit-association receipt server-side."
215
+ "over MCP."
217
216
  ),
218
217
  input_schema=tool_schema(
219
218
  {
@@ -275,6 +275,7 @@ from synth_ai.sdk.research.contracts.research_intern import (
275
275
  DataBindingResponse,
276
276
  DatasetRevisionCreateRequest,
277
277
  DatasetRevisionResponse,
278
+ InternAgentConfig,
278
279
  InternAsyncBlocker,
279
280
  InternAsyncCheckpoint,
280
281
  InternAsyncCommandKind,
@@ -291,6 +292,17 @@ from synth_ai.sdk.research.contracts.research_intern import (
291
292
  InternAsyncRuntime,
292
293
  InternAsyncRuntimeBudget,
293
294
  InternAsyncStatus,
295
+ InternCrossMetaThreadMessage,
296
+ InternCrossMetaThreadMessageCreateRequest,
297
+ InternCrossMetaThreadMessageKind,
298
+ InternCrossMetaThreadMessageResolution,
299
+ InternMetaHandoff,
300
+ InternMetaHandoffStatus,
301
+ InternMetaThread,
302
+ InternMetaThreadKind,
303
+ InternMetaThreadLifecycle,
304
+ InternMetaThreadSegment,
305
+ InternMetaThreadSegmentStatus,
294
306
  InternRuntimeBinding,
295
307
  InternRuntimeOutcome,
296
308
  InternSyncCommandKind,
@@ -350,15 +362,10 @@ from synth_ai.sdk.research.contracts.research_intern import (
350
362
  ResearchInternTurnRequest,
351
363
  ResearchInternTurnResponse,
352
364
  ResearchInternTurnStatus,
353
- SyncKitAssociatedFile,
354
- SyncKitAssociationReceipt,
355
- SyncKitIngressKind,
356
- SyncKitIngressObservation,
357
- SyncKitIngressSource,
358
- SyncKitReadiness,
359
- SyncTemplateProvisionedResource,
360
- SyncTemplateProvisioningReceipt,
361
365
  SyncTracePublicationReceipt,
366
+ SyncWorkspaceRunReceipt,
367
+ SyncWorkspaceSnapshotIdentity,
368
+ SyncWorkspaceSnapshotKind,
362
369
  )
363
370
  from synth_ai.sdk.research.contracts.runtime_stream import (
364
371
  SwarmEvent,
@@ -839,6 +846,18 @@ __all__ = [
839
846
  "InternAsyncRuntime",
840
847
  "InternAsyncRuntimeBudget",
841
848
  "InternAsyncStatus",
849
+ "InternAgentConfig",
850
+ "InternCrossMetaThreadMessage",
851
+ "InternCrossMetaThreadMessageCreateRequest",
852
+ "InternCrossMetaThreadMessageKind",
853
+ "InternCrossMetaThreadMessageResolution",
854
+ "InternMetaHandoff",
855
+ "InternMetaHandoffStatus",
856
+ "InternMetaThread",
857
+ "InternMetaThreadKind",
858
+ "InternMetaThreadLifecycle",
859
+ "InternMetaThreadSegment",
860
+ "InternMetaThreadSegmentStatus",
842
861
  "InternRuntimeBinding",
843
862
  "InternRuntimeOutcome",
844
863
  "InternSyncCommandKind",
@@ -934,15 +953,10 @@ __all__ = [
934
953
  "SwarmTerminalOutcomeMissingError",
935
954
  "SwarmEnvironment",
936
955
  "SwarmUsage",
937
- "SyncKitAssociatedFile",
938
- "SyncKitAssociationReceipt",
939
- "SyncKitIngressKind",
940
- "SyncKitIngressObservation",
941
- "SyncKitIngressSource",
942
- "SyncKitReadiness",
943
- "SyncTemplateProvisionedResource",
944
- "SyncTemplateProvisioningReceipt",
945
956
  "SyncTracePublicationReceipt",
957
+ "SyncWorkspaceRunReceipt",
958
+ "SyncWorkspaceSnapshotIdentity",
959
+ "SyncWorkspaceSnapshotKind",
946
960
  "TaskId",
947
961
  "TranscriptCursor",
948
962
  "TranscriptCursorKind",
@@ -144,6 +144,128 @@ class ResearchInternResponse(_StrictContract):
144
144
  updated_at: datetime
145
145
 
146
146
 
147
+ class InternMetaThreadKind(StrEnum):
148
+ SYNC = "sync"
149
+ ASYNC = "async"
150
+
151
+
152
+ class InternMetaThreadLifecycle(StrEnum):
153
+ ACTIVE = "active"
154
+ ARCHIVED = "archived"
155
+
156
+
157
+ class InternMetaThreadSegmentStatus(StrEnum):
158
+ LIVE = "live"
159
+ SEALED = "sealed"
160
+
161
+
162
+ class InternMetaHandoffStatus(StrEnum):
163
+ SEALED = "sealed"
164
+ MERGED = "merged"
165
+
166
+
167
+ class InternCrossMetaThreadMessageKind(StrEnum):
168
+ REQUEST_DECISION = "request_decision"
169
+ OPEN_BRANCH_ACK = "open_branch_ack"
170
+ DECISION_RESOLVED = "decision_resolved"
171
+ STEER = "steer"
172
+ NOTE = "note"
173
+
174
+
175
+ class InternCrossMetaThreadMessageResolution(StrEnum):
176
+ COMPLETED = "completed"
177
+ DENIED = "denied"
178
+ SUPERSEDED = "superseded"
179
+
180
+
181
+ class InternAgentConfig(_StrictContract):
182
+ agent_role: str
183
+ harness: str
184
+ model: str
185
+ reasoning_effort: str
186
+ segment_role: str | None = None
187
+ harness_command: str | None = None
188
+ workspace_root: str | None = None
189
+
190
+
191
+ class InternMetaThread(_StrictContract):
192
+ schema_version: Literal["smr.meta-thread.v1"]
193
+ meta_thread_id: str
194
+ organization_id: str
195
+ research_intern_id: str
196
+ kind: InternMetaThreadKind
197
+ lifecycle: InternMetaThreadLifecycle
198
+ head_segment_id: str
199
+ created_at: datetime
200
+ updated_at: datetime
201
+
202
+
203
+ class InternMetaThreadSegment(_StrictContract):
204
+ schema_version: Literal["smr.meta-thread-segment.v1"]
205
+ segment_id: str
206
+ meta_thread_id: str
207
+ parent_segment_id: str | None = None
208
+ lane_runtime_id: str | None = None
209
+ agent_config: InternAgentConfig | None = None
210
+ status: InternMetaThreadSegmentStatus
211
+ opened_at: datetime
212
+ sealed_at: datetime | None = None
213
+ linked_message_id: str | None = None
214
+ handoff_id: str | None = None
215
+ is_head: bool = False
216
+
217
+
218
+ class InternMetaHandoff(_StrictContract):
219
+ schema_version: Literal["smr.meta-handoff.v1"]
220
+ handoff_id: str
221
+ meta_thread_id: str
222
+ source_segment_id: str
223
+ summary: str
224
+ evidence_references: tuple[str, ...] = ()
225
+ agent_config: InternAgentConfig | None = None
226
+ status: InternMetaHandoffStatus
227
+ created_at: datetime
228
+ sealed_at: datetime
229
+ merged_at: datetime | None = None
230
+
231
+
232
+ class InternCrossMetaThreadMessageCreateRequest(_StrictContract):
233
+ schema_version: Literal["smr.cross-meta-thread-message-create.v1"] = (
234
+ "smr.cross-meta-thread-message-create.v1"
235
+ )
236
+ message_id: str = Field(min_length=1, max_length=512)
237
+ source_meta_thread_id: str = Field(min_length=1, max_length=512)
238
+ destination_meta_thread_id: str = Field(min_length=1, max_length=512)
239
+ kind: InternCrossMetaThreadMessageKind
240
+ idempotency_key: str = Field(min_length=1, max_length=512)
241
+ payload: dict[str, Any] = Field(default_factory=dict)
242
+ linked_message_id: str | None = None
243
+ sync_session_id: str | None = None
244
+ segment_id: str | None = None
245
+ resolution: InternCrossMetaThreadMessageResolution | None = None
246
+ summary: str | None = Field(default=None, max_length=4_000)
247
+
248
+
249
+ class InternCrossMetaThreadMessage(_StrictContract):
250
+ schema_version: Literal["smr.cross-meta-thread-message.v1"]
251
+ message_id: str
252
+ organization_id: str
253
+ research_intern_id: str
254
+ source_meta_thread_id: str
255
+ source_kind: InternMetaThreadKind
256
+ destination_meta_thread_id: str
257
+ destination_kind: InternMetaThreadKind
258
+ kind: InternCrossMetaThreadMessageKind
259
+ idempotency_key: str
260
+ payload: dict[str, Any] = Field(default_factory=dict)
261
+ linked_message_id: str | None = None
262
+ sync_session_id: str | None = None
263
+ segment_id: str | None = None
264
+ resolution: InternCrossMetaThreadMessageResolution | None = None
265
+ summary: str | None = None
266
+ created_at: datetime
267
+
268
+
147
269
  class InternRuntimeBinding(_StrictContract):
148
270
  factory_id: str | None = None
149
271
  project_id: str | None = None
@@ -188,40 +310,9 @@ class InternSyncSessionCreateRequest(_StrictContract):
188
310
  binding: InternRuntimeBinding = Field(default_factory=InternRuntimeBinding)
189
311
  metadata: dict[str, Any] = Field(default_factory=dict)
190
312
  execution_mode: Literal["fast", "standard", "deep"] = "standard"
191
- task_template: str | None = Field(default=None, min_length=1, max_length=128)
192
313
  objective_bounds: dict[str, Any] | None = None
193
314
 
194
315
 
195
- class SyncTemplateProvisionedResource(_StrictContract):
196
- """One resource decision made while provisioning a task template."""
197
-
198
- resource_kind: Literal[
199
- "project",
200
- "factory",
201
- "factory_project_link",
202
- "effort",
203
- "intern_factory_membership",
204
- "run",
205
- ]
206
- status: Literal["created", "reused", "unsupported"]
207
- resource_id: str | None = None
208
- error_code: str | None = None
209
-
210
-
211
- class SyncTemplateProvisioningReceipt(_StrictContract):
212
- """Durable record of what starting from a task template provisioned.
213
-
214
- The backend mints this receipt inside the session-create transaction and
215
- stamps it into the session projection; the SDK only ever observes it.
216
- """
217
-
218
- schema_version: Literal["smr.intern-sync-template-provisioning.v1"]
219
- task_template: str
220
- binding: InternRuntimeBinding
221
- resources: tuple[SyncTemplateProvisionedResource, ...]
222
- provisioned_at: datetime
223
-
224
-
225
316
  class SyncTracePublicationReceipt(_StrictContract):
226
317
  """Read-only receipt for the server-side terminal Trace V5 publication.
227
318
 
@@ -247,76 +338,59 @@ class SyncTracePublicationReceipt(_StrictContract):
247
338
  published_at: datetime | None = None
248
339
 
249
340
 
250
- SyncKitIngressKind = Literal[
251
- "website_upload",
252
- "sdk_upload",
253
- "git_push",
254
- "project_files",
341
+ SyncWorkspaceSnapshotKind = Literal[
342
+ "internal_git_head",
343
+ "stored_file_digest_set",
344
+ "internal_git_head_with_stored_files",
255
345
  ]
256
346
 
257
- SyncKitIngressObservation = Literal[
258
- "stored_file_write",
259
- "push_confirmation",
260
- "upload_url_issuance",
261
- ]
262
-
263
-
264
- class SyncKitAssociatedFile(_StrictContract):
265
- """One file observed in a kit ingress, with whatever identity was available."""
266
-
267
- path: str
268
- digest: str | None = Field(default=None, pattern=r"^sha256:[0-9a-f]{64}$")
269
- size_bytes: int | None = Field(default=None, ge=0)
270
- stored_file_id: str | None = None
271
-
272
347
 
273
- class SyncKitIngressSource(_StrictContract):
274
- """Source identity of one kit ingress, per ingress kind."""
348
+ class SyncWorkspaceSnapshotIdentity(_StrictContract):
349
+ """Provable project workspace identity captured when a run is triggered."""
275
350
 
351
+ schema_version: Literal["smr.intern-sync-workspace-snapshot.v1"] = (
352
+ "smr.intern-sync-workspace-snapshot.v1"
353
+ )
354
+ kind: SyncWorkspaceSnapshotKind
276
355
  commit_sha: str | None = None
277
- archive_key: str | None = None
278
- workspace_archive_id: str | None = None
279
- push_confirmation_receipt_id: str | None = None
280
- upload_batch_id: str | None = None
281
- dataset_ref: str | None = None
282
- stored_file_ids: tuple[str, ...] = ()
356
+ inventory_digest: str | None = Field(default=None, pattern=r"^sha256:[0-9a-f]{64}$")
357
+ file_count: int | None = Field(default=None, ge=1)
358
+ captured_at: datetime
283
359
 
360
+ @model_validator(mode="after")
361
+ def require_identity_per_kind(self) -> SyncWorkspaceSnapshotIdentity:
362
+ if self.kind == "internal_git_head" and not self.commit_sha:
363
+ raise ValueError("internal_git_head snapshot requires commit_sha")
364
+ if self.kind == "stored_file_digest_set" and (
365
+ not self.inventory_digest or not self.file_count
366
+ ):
367
+ raise ValueError(
368
+ "stored_file_digest_set snapshot requires the inventory digest and file count"
369
+ )
370
+ if self.kind == "internal_git_head_with_stored_files" and (
371
+ not self.commit_sha or not self.inventory_digest or not self.file_count
372
+ ):
373
+ raise ValueError(
374
+ "internal_git_head_with_stored_files snapshot requires commit_sha, "
375
+ "the inventory digest, and file count"
376
+ )
377
+ return self
284
378
 
285
- class SyncKitAssociationReceipt(_StrictContract):
286
- """Durable record that a kit ingress landed while this session was open.
287
379
 
288
- The backend mints this receipt as a server-side effect of observing an
289
- upload, push, or file write on a project bound to an open Sync session.
290
- Clients never mint it; they observe it on the session projection.
291
- """
380
+ class SyncWorkspaceRunReceipt(_StrictContract):
381
+ """Server-minted proof of the project workspace used to trigger one run."""
292
382
 
293
- schema_version: Literal["smr.intern-sync-kit-association.v1"]
294
- receipt_id: str
383
+ schema_version: Literal["smr.intern-sync-workspace-run.v1"] = "smr.intern-sync-workspace-run.v1"
384
+ run_id: str
295
385
  sync_session_id: str
296
386
  project_id: str
297
- ingress_kind: SyncKitIngressKind
298
- observed_via: SyncKitIngressObservation
299
- files: tuple[SyncKitAssociatedFile, ...] = ()
300
- source: SyncKitIngressSource
301
- open_session_count: int = Field(ge=1)
302
- associated_at: datetime
303
-
304
-
305
- class SyncKitReadiness(_StrictContract):
306
- """Read-only kit completeness projection for a template-bound session."""
307
-
308
- schema_version: Literal["smr.intern-sync-kit-readiness.v1"]
309
- status: Literal["ready", "incomplete"]
310
- task_template: str
311
- kit_contract: str
312
- required_files: tuple[str, ...]
313
- present_files: tuple[str, ...] = ()
314
- missing_files: tuple[str, ...] = ()
315
- checked_at: datetime
387
+ experiment_id: str | None = None
388
+ workspace: SyncWorkspaceSnapshotIdentity
389
+ recorded_at: datetime
316
390
 
317
391
 
318
392
  class InternSyncSession(_StrictContract):
319
- schema_version: Literal["smr.intern-sync-session.v1"]
393
+ schema_version: Literal["smr.intern-sync-session.v1"] = "smr.intern-sync-session.v1"
320
394
  sync_session_id: str
321
395
  research_intern_id: str
322
396
  org_id: str
@@ -333,18 +407,11 @@ class InternSyncSession(_StrictContract):
333
407
  outcome: InternRuntimeOutcome | None = None
334
408
  failure_code: str | None = None
335
409
  temporal_workflow_id: str
336
- execution_mode: Literal["fast", "standard", "deep"] = "standard"
410
+ execution_mode: Literal["fast", "standard", "deep"]
337
411
  execution_profile_id: Literal["intern_sync"] = "intern_sync"
338
- # Server-minted projection stamps. Old backends omit them entirely; new
339
- # backends stamp them once the corresponding effect lands. The SDK only
340
- # observes these receipts — the backend remains the minting authority.
341
- task_template: str | None = None
342
- provisioning: SyncTemplateProvisioningReceipt | None = None
343
412
  trace_publication: SyncTracePublicationReceipt | None = None
344
- kit_associations: tuple[SyncKitAssociationReceipt, ...] = ()
345
- kit_readiness: SyncKitReadiness | None = None
346
413
  visuals: tuple[dict[str, Any], ...] = ()
347
- kit_state_receipts: tuple[dict[str, Any], ...] = ()
414
+ workspace_run_receipts: tuple[SyncWorkspaceRunReceipt, ...] = ()
348
415
  experiments: tuple[dict[str, Any], ...] = ()
349
416
  harness_bundle_available: bool = False
350
417
  created_at: datetime
@@ -406,13 +473,11 @@ class InternSyncDeployPacket(_StrictContract):
406
473
  schema_version: Literal["smr.intern-sync-deploy-packet.v1"]
407
474
  sync_session_id: str
408
475
  project_id: str
409
- task_template: str | None = None
410
476
  auth_scheme: Literal["bearer"]
411
477
  auth_env_var: Literal["SYNTH_API_KEY"]
412
- required_paths: tuple[str, ...] = ()
413
478
  endpoints: tuple[InternSyncDeployPacketEndpoint, ...]
414
479
  done_signal: Literal["workspace_confirm_push"]
415
- image_kind: Literal["craftax_eval"]
480
+ image_kind: Literal["project_default"]
416
481
  instructions: str
417
482
 
418
483
 
@@ -97,6 +97,43 @@ RESEARCH_OPERATIONS = {
97
97
  mutation=True,
98
98
  idempotent=True,
99
99
  ),
100
+ _operation(
101
+ "list_intern_meta_threads",
102
+ HttpMethod.GET,
103
+ "/smr/research-intern/meta-threads",
104
+ idempotent=True,
105
+ ),
106
+ _operation(
107
+ "get_intern_meta_thread",
108
+ HttpMethod.GET,
109
+ "/smr/research-intern/meta-threads/{meta_thread_id}",
110
+ idempotent=True,
111
+ ),
112
+ _operation(
113
+ "list_intern_meta_thread_segments",
114
+ HttpMethod.GET,
115
+ "/smr/research-intern/meta-threads/{meta_thread_id}/segments",
116
+ idempotent=True,
117
+ ),
118
+ _operation(
119
+ "list_intern_meta_thread_handoffs",
120
+ HttpMethod.GET,
121
+ "/smr/research-intern/meta-threads/{meta_thread_id}/handoffs",
122
+ idempotent=True,
123
+ ),
124
+ _operation(
125
+ "list_intern_meta_thread_messages",
126
+ HttpMethod.GET,
127
+ "/smr/research-intern/meta-threads/{meta_thread_id}/messages",
128
+ idempotent=True,
129
+ ),
130
+ _operation(
131
+ "create_intern_meta_thread_message",
132
+ HttpMethod.POST,
133
+ "/smr/research-intern/meta-threads/messages",
134
+ mutation=True,
135
+ idempotent=True,
136
+ ),
100
137
  _operation(
101
138
  "list_intern_runtime_events",
102
139
  HttpMethod.GET,