plato-sdk-v2 2.3.6__tar.gz → 2.3.8__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 (531) hide show
  1. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/PKG-INFO +1 -2
  2. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/README.md +0 -1
  3. plato_sdk_v2-2.3.8/VERSION +1 -0
  4. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/agents/otel.py +77 -87
  5. plato_sdk_v2-2.3.8/plato/agents/runner.py +183 -0
  6. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/cli/sandbox.py +5 -2
  7. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/cli/ssh.py +21 -14
  8. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/cli/utils.py +32 -12
  9. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/worlds/base.py +103 -92
  10. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/worlds/runner.py +33 -15
  11. plato_sdk_v2-2.3.6/VERSION +0 -1
  12. plato_sdk_v2-2.3.6/plato/agents/runner.py +0 -346
  13. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/.claude/agents/sim-creator.md +0 -0
  14. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/.gitignore +0 -0
  15. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/.sandbox.yaml +0 -0
  16. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/BUILDING_SIMS.md +0 -0
  17. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/ci/CLAUDE.md +0 -0
  18. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/ci/deploy.sh +0 -0
  19. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/ci/lint.sh +0 -0
  20. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/ci/setup.sh +0 -0
  21. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/ci/version-bump.sh +0 -0
  22. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/AGENT_SPEC.md +0 -0
  23. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/CLI.md +0 -0
  24. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/GENERATING_SIM_SDKS.md +0 -0
  25. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/SIMULATOR_LIFECYCLE.md +0 -0
  26. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/SIM_CREATOR.md +0 -0
  27. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/cli/agent.md +0 -0
  28. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/cli/flows.md +0 -0
  29. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/cli/pm.md +0 -0
  30. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/cli/sandbox.md +0 -0
  31. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/cli/sims.md +0 -0
  32. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/cli/world.md +0 -0
  33. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/sim-creation-pipeline.md +0 -0
  34. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skill-restructure-plan.md +0 -0
  35. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/SIM-CREATION-ARCHITECTURE.md +0 -0
  36. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-config/SKILL.md +0 -0
  37. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-creator/SKILL.md +0 -0
  38. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-debugger/SKILL.md +0 -0
  39. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-flow-audit/SKILL.md +0 -0
  40. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-flow-clear/SKILL.md +0 -0
  41. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-flow-mutations/SKILL.md +0 -0
  42. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-flow-run/SKILL.md +0 -0
  43. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-research/SKILL.md +0 -0
  44. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-review/SKILL.md +0 -0
  45. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-sandbox-login/SKILL.md +0 -0
  46. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-sandbox-services/SKILL.md +0 -0
  47. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-sandbox-start/SKILL.md +0 -0
  48. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-sandbox-worker/SKILL.md +0 -0
  49. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-snapshot/SKILL.md +0 -0
  50. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-submit/SKILL.md +0 -0
  51. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/skills/sim-validate/SKILL.md +0 -0
  52. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/testcommit +0 -0
  53. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/docs/unit.sh +0 -0
  54. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/__init__.py +0 -0
  55. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/__init__.py +0 -0
  56. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/__init__.py +0 -0
  57. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/__init__.py +0 -0
  58. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/agent_artifacts/__init__.py +0 -0
  59. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/agent_artifacts/archive_agent_artifact.py +0 -0
  60. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/agent_artifacts/create_agent_artifact.py +0 -0
  61. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/agent_artifacts/get_agent_artifact_by_public_id.py +0 -0
  62. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/agent_artifacts/get_agent_artifacts.py +0 -0
  63. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/cluster/__init__.py +0 -0
  64. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/cluster/cleanup_stale_vms.py +0 -0
  65. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/cluster/get_dispatchers.py +0 -0
  66. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/cluster/get_nodes_status.py +0 -0
  67. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/cluster/get_snapshot_lineage.py +0 -0
  68. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/cluster/get_snapshots_status.py +0 -0
  69. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/cluster/pause_resume_dispatchers.py +0 -0
  70. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/cluster/prefetch_snapshot.py +0 -0
  71. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/__init__.py +0 -0
  72. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/backup.py +0 -0
  73. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/cleanup.py +0 -0
  74. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/close.py +0 -0
  75. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/close_async.py +0 -0
  76. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/create.py +0 -0
  77. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/create_batch.py +0 -0
  78. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/create_simulator.py +0 -0
  79. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/evaluate_session.py +0 -0
  80. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/generate_mutations.py +0 -0
  81. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/generate_mutations_single.py +0 -0
  82. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/get_active_session.py +0 -0
  83. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/get_app_sim_worker_info.py +0 -0
  84. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/get_cdp_url.py +0 -0
  85. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/get_flows.py +0 -0
  86. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/get_interface_worker_info.py +0 -0
  87. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/get_job_info.py +0 -0
  88. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/get_job_status.py +0 -0
  89. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/get_job_worker_info.py +0 -0
  90. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/get_proxy_url.py +0 -0
  91. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/get_public_url.py +0 -0
  92. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/get_simulator_by_name.py +0 -0
  93. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/get_simulators.py +0 -0
  94. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/get_state.py +0 -0
  95. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/get_worker_ready.py +0 -0
  96. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/log_state_mutation.py +0 -0
  97. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/rescore_simulator_sessions.py +0 -0
  98. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/reset.py +0 -0
  99. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/score.py +0 -0
  100. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/send_heartbeat.py +0 -0
  101. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/env/update_simulator.py +0 -0
  102. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/evals/__init__.py +0 -0
  103. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/evals/create_test_case_review.py +0 -0
  104. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/evals/evaluate_python.py +0 -0
  105. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/evals/get_all_test_case_reviews.py +0 -0
  106. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/evals/get_scores_by_user.py +0 -0
  107. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/evals/get_scoring.py +0 -0
  108. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/evals/get_test_case_review.py +0 -0
  109. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/evals/human_in_the_loop_scoring.py +0 -0
  110. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/evals/start_eval_from_git.py +0 -0
  111. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/__init__.py +0 -0
  112. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/create_gitea_repository.py +0 -0
  113. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/create_simulator_repository.py +0 -0
  114. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/delete_gitea_repository.py +0 -0
  115. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/get_accessible_simulators.py +0 -0
  116. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/get_gitea_credentials.py +0 -0
  117. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/get_gitea_repository.py +0 -0
  118. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/get_my_gitea_info.py +0 -0
  119. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/get_my_repositories.py +0 -0
  120. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/get_repository_branches.py +0 -0
  121. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/get_repository_contents.py +0 -0
  122. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/get_simulator_file_content.py +0 -0
  123. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/get_simulator_repository.py +0 -0
  124. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/get_simulator_repository_branches.py +0 -0
  125. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/gitea/get_simulator_repository_contents.py +0 -0
  126. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/jobs/__init__.py +0 -0
  127. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/jobs/get_job_by_id.py +0 -0
  128. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/jobs/get_jobs_by_group_id.py +0 -0
  129. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/jobs/get_keepalive_jobs.py +0 -0
  130. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/jobs/list_jobs.py +0 -0
  131. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/jobs/update_job_status.py +0 -0
  132. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/organization/__init__.py +0 -0
  133. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/organization/create_annotator_assignment.py +0 -0
  134. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/organization/create_org_api_key.py +0 -0
  135. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/organization/create_org_policy.py +0 -0
  136. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/organization/delete_org_api_key.py +0 -0
  137. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/organization/delete_org_policy.py +0 -0
  138. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/organization/get_annotator_assignments.py +0 -0
  139. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/organization/get_org_api_key_policies.py +0 -0
  140. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/organization/get_org_api_keys.py +0 -0
  141. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/organization/get_org_policies.py +0 -0
  142. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/organization/get_organization_concurrency_status.py +0 -0
  143. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/organization/get_organization_members.py +0 -0
  144. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/organization/update_annotator_assignment_stage.py +0 -0
  145. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/organization/update_organization_concurrency_limit.py +0 -0
  146. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/queue/__init__.py +0 -0
  147. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/queue/get_queue_status.py +0 -0
  148. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/queue/get_vm_detail.py +0 -0
  149. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/queue/get_vms.py +0 -0
  150. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/queue/get_workers.py +0 -0
  151. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/sandbox/__init__.py +0 -0
  152. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/sandbox/checkpoint_vm.py +0 -0
  153. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/sandbox/close_vm.py +0 -0
  154. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/sandbox/create_vm.py +0 -0
  155. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/sandbox/execute_ssh_command.py +0 -0
  156. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/sandbox/get_operation_events.py +0 -0
  157. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/sandbox/healthy_services.py +0 -0
  158. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/sandbox/healthy_worker.py +0 -0
  159. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/sandbox/save_vm_snapshot.py +0 -0
  160. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/sandbox/setup_root_access.py +0 -0
  161. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/sandbox/setup_sandbox.py +0 -0
  162. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/sandbox/start_worker.py +0 -0
  163. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/__init__.py +0 -0
  164. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/analyze_labels.py +0 -0
  165. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/archive_session.py +0 -0
  166. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/archive_session_logs_endpoint.py +0 -0
  167. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/create_from_labels.py +0 -0
  168. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/create_session_from_browser.py +0 -0
  169. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/create_session_from_env_recording.py +0 -0
  170. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/create_session_from_har.py +0 -0
  171. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_env_recording.py +0 -0
  172. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_grouped_replay_sessions.py +0 -0
  173. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_logs_status.py +0 -0
  174. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_network_requests.py +0 -0
  175. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_next_session_for_annotator.py +0 -0
  176. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_public_benchmark_sessions.py +0 -0
  177. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_replay_score_data.py +0 -0
  178. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_rrweb_actions.py +0 -0
  179. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_rrweb_events.py +0 -0
  180. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_screen_recording.py +0 -0
  181. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_session.py +0 -0
  182. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_session_replays.py +0 -0
  183. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_sessions.py +0 -0
  184. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_sessions_for_archival.py +0 -0
  185. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/get_ui_events.py +0 -0
  186. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/restore_session_logs.py +0 -0
  187. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/score_session_with_config.py +0 -0
  188. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/search_sessions_by_ids.py +0 -0
  189. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/set_session_output.py +0 -0
  190. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/update_session_public.py +0 -0
  191. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/session/update_session_testcase.py +0 -0
  192. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/__init__.py +0 -0
  193. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/add_simulator_review.py +0 -0
  194. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/batch_create_test_cases.py +0 -0
  195. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/batch_get_artifact_metadata.py +0 -0
  196. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/get_all_simulators_info.py +0 -0
  197. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/get_db_config.py +0 -0
  198. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/get_env_flows.py +0 -0
  199. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/get_plato_config.py +0 -0
  200. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/get_sessions_batch_by_job_groups.py +0 -0
  201. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/get_sessions_by_job_group.py +0 -0
  202. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/get_simulator_by_name.py +0 -0
  203. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/get_simulator_id.py +0 -0
  204. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/get_simulator_info.py +0 -0
  205. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/get_simulator_version_details.py +0 -0
  206. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/get_simulator_versions.py +0 -0
  207. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/get_start_path.py +0 -0
  208. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/get_version_by_tag.py +0 -0
  209. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/list_simulators.py +0 -0
  210. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/list_simulators_by_org.py +0 -0
  211. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/list_simulators_status.py +0 -0
  212. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/register.py +0 -0
  213. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/update_simulator.py +0 -0
  214. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/update_simulator_status.py +0 -0
  215. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/simulator/update_tag.py +0 -0
  216. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/__init__.py +0 -0
  217. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/archive_organization_test_case_assignments.py +0 -0
  218. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/archive_organization_testcase.py +0 -0
  219. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/archive_testcase.py +0 -0
  220. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/assign_testcase_to_organizations.py +0 -0
  221. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/auto_verify_testcase.py +0 -0
  222. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/bulk_archive_testcases.py +0 -0
  223. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/convert_text_to_structured_data.py +0 -0
  224. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/create_testcase.py +0 -0
  225. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/create_testcase_set.py +0 -0
  226. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/delete_testcase_set.py +0 -0
  227. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/filter_human_recorder_testcases.py +0 -0
  228. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/generate_outcome_schema.py +0 -0
  229. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/generate_prediction.py +0 -0
  230. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/generate_prediction_from_steps.py +0 -0
  231. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/generate_scoring_config_from_sessions.py +0 -0
  232. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/generate_state_mutations_config_route.py +0 -0
  233. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/get_human_recorder_tab_counts.py +0 -0
  234. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/get_human_recorder_testcases.py +0 -0
  235. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/get_merged_mutations.py +0 -0
  236. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/get_mutation_groups_for_testcase.py +0 -0
  237. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/get_next_testcase_for_scoring.py +0 -0
  238. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/get_organization_test_case_assignments.py +0 -0
  239. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/get_testcase.py +0 -0
  240. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/get_testcase_metadata_for_scoring.py +0 -0
  241. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/get_testcase_sets.py +0 -0
  242. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/get_testcases.py +0 -0
  243. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/get_testcases_in_set.py +0 -0
  244. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/mark_organization_test_case_completed.py +0 -0
  245. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/update_testcase.py +0 -0
  246. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v1/testcases/version_bump_testcase.py +0 -0
  247. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/__init__.py +0 -0
  248. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/agents/__init__.py +0 -0
  249. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/agents/get_agent_ecr_token.py +0 -0
  250. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/agents/get_agent_schema.py +0 -0
  251. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/agents/get_agent_versions.py +0 -0
  252. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/agents/import_agent.py +0 -0
  253. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/agents/list_docker_agents.py +0 -0
  254. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/agents/lookup_agent_version.py +0 -0
  255. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/agents/register_docker_agent.py +0 -0
  256. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/artifacts/__init__.py +0 -0
  257. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/artifacts/get_artifact.py +0 -0
  258. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/chronos/__init__.py +0 -0
  259. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/chronos/launch_job.py +0 -0
  260. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/chronos_packages/__init__.py +0 -0
  261. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/chronos_packages/get_package_versions.py +0 -0
  262. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/chronos_packages/list_chronos_packages.py +0 -0
  263. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/chronos_packages/lookup_package_version.py +0 -0
  264. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/chronos_packages/register_chronos_package.py +0 -0
  265. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/chronos_packages/upload_chronos_package.py +0 -0
  266. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/cluster/__init__.py +0 -0
  267. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/cluster/get_node_config.py +0 -0
  268. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/__init__.py +0 -0
  269. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/checkpoint.py +0 -0
  270. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/close.py +0 -0
  271. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/connect_routing_info.py +0 -0
  272. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/connect_url.py +0 -0
  273. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/disk_snapshot.py +0 -0
  274. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/execute.py +0 -0
  275. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/get_flows.py +0 -0
  276. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/get_plato_config.py +0 -0
  277. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/log_for_job.py +0 -0
  278. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/make.py +0 -0
  279. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/public_url.py +0 -0
  280. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/reset.py +0 -0
  281. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/set_date.py +0 -0
  282. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/setup_sandbox.py +0 -0
  283. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/snapshot.py +0 -0
  284. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/snapshot_store.py +0 -0
  285. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/state.py +0 -0
  286. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/jobs/wait_for_ready.py +0 -0
  287. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/pypi/__init__.py +0 -0
  288. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/pypi/download_package.py +0 -0
  289. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/pypi/get_package_schema.py +0 -0
  290. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/pypi/package_index.py +0 -0
  291. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/pypi/simple_index.py +0 -0
  292. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/pypi/upload_package.py +0 -0
  293. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/releases/__init__.py +0 -0
  294. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/releases/create.py +0 -0
  295. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/releases/deploy.py +0 -0
  296. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/releases/get.py +0 -0
  297. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/releases/handle_get_existing_public_ids.py +0 -0
  298. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/releases/handle_import.py +0 -0
  299. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/releases/list_releases.py +0 -0
  300. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/releases/prep_release_assigned_testcases.py +0 -0
  301. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/releases/update.py +0 -0
  302. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/__init__.py +0 -0
  303. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/checkpoint.py +0 -0
  304. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/close.py +0 -0
  305. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/disk_snapshot.py +0 -0
  306. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/evaluate.py +0 -0
  307. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/execute.py +0 -0
  308. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/get_connect_url.py +0 -0
  309. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/get_presigned_url.py +0 -0
  310. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/get_public_url.py +0 -0
  311. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/get_s3_content.py +0 -0
  312. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/get_session_details.py +0 -0
  313. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/get_session_documents.py +0 -0
  314. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/get_session_flows.py +0 -0
  315. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/get_session_logs.py +0 -0
  316. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/get_session_plato_config.py +0 -0
  317. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/heartbeat.py +0 -0
  318. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/list_jobs.py +0 -0
  319. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/list_sessions.py +0 -0
  320. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/log_job_mutation.py +0 -0
  321. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/make.py +0 -0
  322. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/reset.py +0 -0
  323. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/set_date.py +0 -0
  324. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/setup_sandbox.py +0 -0
  325. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/snapshot.py +0 -0
  326. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/snapshot_store.py +0 -0
  327. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/state.py +0 -0
  328. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/upload_session_documents.py +0 -0
  329. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/sessions/wait_for_ready.py +0 -0
  330. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/user/__init__.py +0 -0
  331. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/v2/user/get_current_user.py +0 -0
  332. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/version/__init__.py +0 -0
  333. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/api/version/check.py +0 -0
  334. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/client.py +0 -0
  335. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/errors.py +0 -0
  336. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/models/__init__.py +0 -0
  337. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_generated/py.typed +0 -0
  338. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_sims_generator/__init__.py +0 -0
  339. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_sims_generator/cli.py +0 -0
  340. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_sims_generator/instruction.py +0 -0
  341. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_sims_generator/parser.py +0 -0
  342. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_sims_generator/python.py +0 -0
  343. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_sims_generator/templates/instruction/helpers.py.jinja +0 -0
  344. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_sims_generator/templates/instruction/init.py.jinja +0 -0
  345. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_sims_generator/templates/python/api_init.py.jinja +0 -0
  346. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_sims_generator/templates/python/client.py.jinja +0 -0
  347. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_sims_generator/templates/python/endpoint.py.jinja +0 -0
  348. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_sims_generator/templates/python/errors.py.jinja +0 -0
  349. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_sims_generator/templates/python/package_init.py.jinja +0 -0
  350. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_sims_generator/templates/python/tag_init.py.jinja +0 -0
  351. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/_sims_generator/templates/python/version_init.py.jinja +0 -0
  352. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/agents/__init__.py +0 -0
  353. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/agents/artifacts.py +0 -0
  354. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/agents/base.py +0 -0
  355. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/agents/build.py +0 -0
  356. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/agents/config.py +0 -0
  357. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/agents/trajectory.py +0 -0
  358. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/__init__.py +0 -0
  359. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/__init__.py +0 -0
  360. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/agents/__init__.py +0 -0
  361. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/agents/create_agent.py +0 -0
  362. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/agents/delete_agent.py +0 -0
  363. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/agents/get_agent.py +0 -0
  364. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/agents/get_agent_schema.py +0 -0
  365. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/agents/get_agent_versions.py +0 -0
  366. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/agents/list_agents.py +0 -0
  367. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/agents/lookup_agent.py +0 -0
  368. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/auth/__init__.py +0 -0
  369. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/auth/debug_auth_api_auth_debug_get.py +0 -0
  370. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/auth/get_auth_status_api_auth_status_get.py +0 -0
  371. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/auth/get_current_user_route_api_auth_me_get.py +0 -0
  372. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/default/__init__.py +0 -0
  373. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/default/health.py +0 -0
  374. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/jobs/__init__.py +0 -0
  375. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/jobs/launch_job.py +0 -0
  376. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/registry/__init__.py +0 -0
  377. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/registry/get_agent_schema_api_registry_agents__agent_name__schema_get.py +0 -0
  378. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/registry/get_agent_versions_api_registry_agents__agent_name__versions_get.py +0 -0
  379. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/registry/get_world_schema_api_registry_worlds__package_name__schema_get.py +0 -0
  380. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/registry/get_world_versions_api_registry_worlds__package_name__versions_get.py +0 -0
  381. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/registry/list_registry_agents_api_registry_agents_get.py +0 -0
  382. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/registry/list_registry_worlds_api_registry_worlds_get.py +0 -0
  383. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/runtimes/__init__.py +0 -0
  384. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/runtimes/create_runtime.py +0 -0
  385. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/runtimes/delete_runtime.py +0 -0
  386. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/runtimes/get_runtime.py +0 -0
  387. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/runtimes/list_runtimes.py +0 -0
  388. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/runtimes/test_runtime.py +0 -0
  389. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/secrets/__init__.py +0 -0
  390. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/secrets/create_secret.py +0 -0
  391. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/secrets/delete_secret.py +0 -0
  392. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/secrets/get_secret.py +0 -0
  393. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/secrets/list_secrets.py +0 -0
  394. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/secrets/update_secret.py +0 -0
  395. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/sessions/__init__.py +0 -0
  396. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/sessions/get_session.py +0 -0
  397. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/sessions/get_session_logs.py +0 -0
  398. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/sessions/get_session_logs_download.py +0 -0
  399. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/sessions/list_sessions.py +0 -0
  400. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/status/__init__.py +0 -0
  401. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/status/get_status_api_status_get.py +0 -0
  402. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/status/get_version_info_api_version_get.py +0 -0
  403. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/templates/__init__.py +0 -0
  404. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/templates/create_template.py +0 -0
  405. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/templates/delete_template.py +0 -0
  406. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/templates/get_template.py +0 -0
  407. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/templates/list_templates.py +0 -0
  408. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/templates/update_template.py +0 -0
  409. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/trajectories/__init__.py +0 -0
  410. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/trajectories/get_trajectory.py +0 -0
  411. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/trajectories/list_trajectories.py +0 -0
  412. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/worlds/__init__.py +0 -0
  413. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/worlds/create_world.py +0 -0
  414. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/worlds/delete_world.py +0 -0
  415. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/worlds/get_world.py +0 -0
  416. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/api/worlds/list_worlds.py +0 -0
  417. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/client.py +0 -0
  418. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/errors.py +0 -0
  419. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/models/__init__.py +0 -0
  420. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/chronos/py.typed +0 -0
  421. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/py.typed +0 -0
  422. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/sims/README.md +0 -0
  423. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/sims/__init__.py +0 -0
  424. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/sims/agent_helpers.py +0 -0
  425. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/sims/cli.py +0 -0
  426. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/sims/generate_clients.py +0 -0
  427. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/sims/registry.py +0 -0
  428. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/__init__.py +0 -0
  429. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/audit_ui.py +0 -0
  430. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/cli/__init__.py +0 -0
  431. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/cli/agent.py +0 -0
  432. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/cli/main.py +0 -0
  433. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/cli/pm.py +0 -0
  434. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/cli/verify.py +0 -0
  435. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/cli/world.py +0 -0
  436. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/cli.py +0 -0
  437. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/config.py +0 -0
  438. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/examples/doordash_tasks.py +0 -0
  439. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/examples/loadtest.py +0 -0
  440. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/examples/test_env.py +0 -0
  441. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/examples/test_env_custom_browser.py +0 -0
  442. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/examples/test_env_sync.py +0 -0
  443. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/examples/test_reuse_env.py +0 -0
  444. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/examples/test_run.py +0 -0
  445. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/exceptions.py +0 -0
  446. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/README.md +0 -0
  447. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/api-client.js +0 -0
  448. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/background.js +0 -0
  449. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/build-sdk.js +0 -0
  450. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/content.js +0 -0
  451. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/manifest.json +0 -0
  452. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/offscreen.html +0 -0
  453. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/offscreen.js +0 -0
  454. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/options.html +0 -0
  455. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/options.js +0 -0
  456. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/package-lock.json +0 -0
  457. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/package.json +0 -0
  458. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/plato-sdk-bundle.js +0 -0
  459. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/plato-sdk-bundle.js.map +0 -0
  460. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/popup.html +0 -0
  461. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/popup.js +0 -0
  462. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/review-panel.html +0 -0
  463. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/review-panel.js +0 -0
  464. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/review-success.html +0 -0
  465. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/review-success.js +0 -0
  466. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/session-active.html +0 -0
  467. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/session-active.js +0 -0
  468. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/session-ended.html +0 -0
  469. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/session-ended.js +0 -0
  470. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/session-setup.html +0 -0
  471. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/session-setup.js +0 -0
  472. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/sessions.html +0 -0
  473. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/sessions.js +0 -0
  474. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/extensions/envgen-recorder/styles.css +0 -0
  475. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/flow_executor.py +0 -0
  476. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/models/__init__.py +0 -0
  477. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/models/build_models.py +0 -0
  478. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/models/env.py +0 -0
  479. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/models/flow.py +0 -0
  480. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/models/sandbox.py +0 -0
  481. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/models/task.py +0 -0
  482. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/sandbox_sdk.py +0 -0
  483. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/sdk.py +0 -0
  484. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/sync_env.py +0 -0
  485. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/sync_flow_executor.py +0 -0
  486. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/sync_sdk.py +0 -0
  487. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v1/utils/proxytunnel.py +0 -0
  488. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/__init__.py +0 -0
  489. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/async_/__init__.py +0 -0
  490. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/async_/artifact.py +0 -0
  491. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/async_/client.py +0 -0
  492. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/async_/environment.py +0 -0
  493. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/async_/flow_executor.py +0 -0
  494. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/async_/session.py +0 -0
  495. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/models.py +0 -0
  496. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/sync/__init__.py +0 -0
  497. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/sync/artifact.py +0 -0
  498. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/sync/client.py +0 -0
  499. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/sync/environment.py +0 -0
  500. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/sync/flow_executor.py +0 -0
  501. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/sync/session.py +0 -0
  502. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/types.py +0 -0
  503. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/utils/__init__.py +0 -0
  504. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/utils/db_cleanup.py +0 -0
  505. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/utils/models.py +0 -0
  506. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/v2/utils/proxy_tunnel.py +0 -0
  507. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/worlds/README.md +0 -0
  508. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/worlds/__init__.py +0 -0
  509. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/worlds/build_hook.py +0 -0
  510. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/plato/worlds/config.py +0 -0
  511. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/pyproject.toml +0 -0
  512. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/scripts/get_all_artifact_targets.py +0 -0
  513. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/__init__.py +0 -0
  514. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/integration/__init__.py +0 -0
  515. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/integration/conftest.py +0 -0
  516. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/integration/test_browser_agent.py +0 -0
  517. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/integration/test_chronos_callback.py +0 -0
  518. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/integration/test_cleanup_snapshot.py +0 -0
  519. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/integration/test_code_world.py +0 -0
  520. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/integration/test_harbor_agent_runner.py +0 -0
  521. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/sims/__init__.py +0 -0
  522. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/sims/conftest.py +0 -0
  523. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/sims/test_agent_helpers.py +0 -0
  524. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/test_heartbeat_keepalive.py +0 -0
  525. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/test_session_serialization.py +0 -0
  526. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/test_set_date.py +0 -0
  527. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/test_v2_imports.py +0 -0
  528. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/test_v2_multisim_integration.py +0 -0
  529. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/test_v2_session.py +0 -0
  530. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/tests/test_version.py +0 -0
  531. {plato_sdk_v2-2.3.6 → plato_sdk_v2-2.3.8}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plato-sdk-v2
3
- Version: 2.3.6
3
+ Version: 2.3.8
4
4
  Summary: Python SDK for the Plato API
5
5
  Author-email: Plato <support@plato.so>
6
6
  License-Expression: MIT
@@ -47,7 +47,6 @@ Description-Content-Type: text/markdown
47
47
 
48
48
  # Plato Python SDK
49
49
 
50
-
51
50
  Python SDK for the Plato platform. Uses [Harbor](https://harborframework.com) for agent execution.
52
51
 
53
52
  ## Installation
@@ -1,6 +1,5 @@
1
1
  # Plato Python SDK
2
2
 
3
-
4
3
  Python SDK for the Plato platform. Uses [Harbor](https://harborframework.com) for agent execution.
5
4
 
6
5
  ## Installation
@@ -0,0 +1 @@
1
+ 2.3.8
@@ -1,7 +1,7 @@
1
1
  """OpenTelemetry integration for Plato agents and worlds.
2
2
 
3
- Provides tracing and logging utilities using OpenTelemetry SDK. Traces and logs
4
- are sent directly to the Chronos OTLP endpoint.
3
+ Provides tracing utilities using OpenTelemetry SDK. Traces are sent directly
4
+ to the Chronos OTLP endpoint.
5
5
 
6
6
  Usage:
7
7
  from plato.agents.otel import init_tracing, get_tracer, shutdown_tracing
@@ -19,11 +19,6 @@ Usage:
19
19
  span.set_attribute("key", "value")
20
20
  # ... do work ...
21
21
 
22
- # All Python logging is automatically sent to Chronos
23
- import logging
24
- logger = logging.getLogger(__name__)
25
- logger.info("This will appear in the trajectory viewer!")
26
-
27
22
  # Cleanup
28
23
  shutdown_tracing()
29
24
  """
@@ -39,74 +34,44 @@ _module_logger = logging.getLogger(__name__)
39
34
 
40
35
  # Global state
41
36
  _tracer_provider = None
42
- _logging_handler = None
43
37
  _initialized = False
38
+ _log_handler = None
44
39
 
45
40
 
46
- class OTelLoggingHandler(logging.Handler):
47
- """Logging handler that emits OTel spans for log messages.
41
+ class OTelSpanLogHandler(logging.Handler):
42
+ """Logging handler that creates OTel spans for log messages.
48
43
 
49
- Each log message becomes a span with:
50
- - span.type: "log"
51
- - log.level: DEBUG/INFO/WARNING/ERROR/CRITICAL
52
- - content: the log message
53
- - source: the logger name
44
+ Converts Python log records to OTel spans with log attributes.
54
45
  """
55
46
 
56
- def __init__(self, tracer_name: str = "plato.logging"):
57
- super().__init__()
58
- self._tracer_name = tracer_name
59
- # Filter out noisy loggers
60
- self._ignored_loggers = {
61
- "httpx",
62
- "httpcore",
63
- "urllib3",
64
- "asyncio",
65
- "opentelemetry",
66
- "plato.agents.otel", # Avoid recursion
67
- }
47
+ def __init__(self, tracer: Tracer, level: int = logging.INFO):
48
+ super().__init__(level)
49
+ self.tracer = tracer
68
50
 
69
51
  def emit(self, record: logging.LogRecord) -> None:
70
52
  """Emit a log record as an OTel span."""
71
- # Skip ignored loggers
72
- logger_name = record.name
73
- for ignored in self._ignored_loggers:
74
- if logger_name.startswith(ignored):
75
- return
76
-
77
53
  try:
78
- tracer = trace.get_tracer(self._tracer_name)
79
-
80
- # Format the message
81
- try:
82
- msg = self.format(record)
83
- except Exception:
84
- msg = record.getMessage()
85
-
54
+ # Debug: print that we're emitting a log span
55
+ print(f"[OTel] Emitting log span: {record.name} - {record.getMessage()[:100]}")
86
56
  # Create a span for the log message
87
- with tracer.start_as_current_span(
88
- f"log.{record.levelname.lower()}",
89
- end_on_exit=True,
90
- ) as span:
91
- span.set_attribute("span.type", "log")
57
+ with self.tracer.start_as_current_span(f"log.{record.levelname.lower()}") as span:
92
58
  span.set_attribute("log.level", record.levelname)
93
- span.set_attribute("content", msg)
94
- span.set_attribute("source", logger_name)
59
+ span.set_attribute("log.message", record.getMessage())
60
+ span.set_attribute("log.logger", record.name)
61
+ span.set_attribute("source", "world")
62
+ span.set_attribute("content", record.getMessage()[:1000])
95
63
 
96
- # Add extra context if available
97
64
  if record.funcName:
98
65
  span.set_attribute("log.function", record.funcName)
99
- if record.pathname:
100
- span.set_attribute("log.file", record.pathname)
101
66
  if record.lineno:
102
- span.set_attribute("log.line", record.lineno)
67
+ span.set_attribute("log.lineno", record.lineno)
103
68
 
104
- # If there's an exception, record it
105
- if record.exc_info and record.exc_info[1]:
106
- span.record_exception(record.exc_info[1])
69
+ # Mark errors
70
+ if record.levelno >= logging.ERROR:
71
+ span.set_attribute("error", True)
107
72
 
108
73
  except Exception:
109
- # Don't let logging failures break the application
74
+ # Don't let logging errors crash the application
110
75
  pass
111
76
 
112
77
 
@@ -114,66 +79,82 @@ def init_tracing(
114
79
  service_name: str,
115
80
  session_id: str,
116
81
  otlp_endpoint: str,
117
- capture_logging: bool = True,
118
- log_level: int = logging.INFO,
82
+ parent_trace_id: str | None = None,
83
+ parent_span_id: str | None = None,
119
84
  ) -> None:
120
- """Initialize OpenTelemetry tracing and optionally capture Python logging.
85
+ """Initialize OpenTelemetry tracing.
121
86
 
122
87
  Args:
123
88
  service_name: Name of the service (e.g., world name or agent name)
124
89
  session_id: Chronos session ID (added as resource attribute)
125
90
  otlp_endpoint: Chronos OTLP endpoint (e.g., http://chronos/api/otel)
126
- capture_logging: If True, install handler to capture Python logs as OTel spans
127
- log_level: Minimum log level to capture (default: INFO)
91
+ parent_trace_id: Optional parent trace ID for linking (hex string)
92
+ parent_span_id: Optional parent span ID for linking (hex string)
128
93
  """
129
- global _tracer_provider, _logging_handler, _initialized
94
+ global _tracer_provider, _initialized, _log_handler
130
95
 
131
96
  if _initialized:
132
97
  _module_logger.debug("Tracing already initialized")
133
98
  return
134
99
 
135
100
  try:
101
+ from opentelemetry import context as context_api
136
102
  from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
137
103
  OTLPSpanExporter,
138
104
  )
139
105
  from opentelemetry.sdk.resources import Resource
140
106
  from opentelemetry.sdk.trace import TracerProvider
141
- from opentelemetry.sdk.trace.export import BatchSpanProcessor
107
+ from opentelemetry.sdk.trace.export import SimpleSpanProcessor
108
+ from opentelemetry.trace import NonRecordingSpan, SpanContext, TraceFlags
142
109
 
143
110
  # Create resource with session ID
144
111
  resource = Resource.create(
145
112
  {
146
113
  "service.name": service_name,
147
- "session.id": session_id,
114
+ "plato.session.id": session_id,
148
115
  }
149
116
  )
150
117
 
151
118
  # Create tracer provider
152
119
  _tracer_provider = TracerProvider(resource=resource)
153
120
 
154
- # Add OTLP exporter pointing to Chronos
121
+ # Add OTLP exporter pointing to Chronos (use SimpleSpanProcessor for immediate export)
155
122
  otlp_exporter = OTLPSpanExporter(endpoint=f"{otlp_endpoint.rstrip('/')}/v1/traces")
156
- _tracer_provider.add_span_processor(BatchSpanProcessor(otlp_exporter))
123
+ _tracer_provider.add_span_processor(SimpleSpanProcessor(otlp_exporter))
157
124
 
158
125
  # Set as global tracer provider
159
126
  trace.set_tracer_provider(_tracer_provider)
160
127
 
161
- _initialized = True
128
+ # If parent context is provided, set it as the current context
129
+ # This allows new spans to automatically link to the parent
130
+ if parent_trace_id and parent_span_id:
131
+ parent_context = SpanContext(
132
+ trace_id=int(parent_trace_id, 16),
133
+ span_id=int(parent_span_id, 16),
134
+ is_remote=True,
135
+ trace_flags=TraceFlags(0x01), # Sampled
136
+ )
137
+ parent_span = NonRecordingSpan(parent_context)
138
+ ctx = trace.set_span_in_context(parent_span)
139
+ context_api.attach(ctx)
140
+ print(f"[OTel] Using parent context: trace_id={parent_trace_id}, span_id={parent_span_id}")
141
+
142
+ # Add OTel logging handler to capture logs from plato SDK
143
+ tracer = trace.get_tracer(service_name)
144
+ _log_handler = OTelSpanLogHandler(tracer, level=logging.INFO)
145
+
146
+ # Add handler to plato loggers (worlds and agents)
147
+ # Set level to INFO to ensure logs propagate from child loggers
148
+ plato_logger = logging.getLogger("plato")
149
+ plato_logger.setLevel(logging.INFO)
150
+ plato_logger.addHandler(_log_handler)
151
+ print(
152
+ f"[OTel] Added log handler to 'plato' logger (level={plato_logger.level}, handlers={len(plato_logger.handlers)})"
153
+ )
162
154
 
163
- # Install logging handler to capture Python logs
164
- if capture_logging:
165
- _logging_handler = OTelLoggingHandler()
166
- _logging_handler.setLevel(log_level)
167
- # Add to root logger to capture all logs
168
- logging.getLogger().addHandler(_logging_handler)
155
+ _initialized = True
169
156
 
170
- # Use print to ensure this shows regardless of logging config
171
157
  print(f"[OTel] Tracing initialized: service={service_name}, session={session_id}, endpoint={otlp_endpoint}")
172
- _module_logger.info(
173
- f"OTel tracing initialized: service={service_name}, "
174
- f"session={session_id}, endpoint={otlp_endpoint}, "
175
- f"capture_logging={capture_logging}"
176
- )
177
158
 
178
159
  except ImportError as e:
179
160
  print(f"[OTel] OpenTelemetry SDK not installed: {e}")
@@ -184,16 +165,17 @@ def init_tracing(
184
165
 
185
166
 
186
167
  def shutdown_tracing() -> None:
187
- """Shutdown the tracer provider, flush spans, and remove logging handler."""
188
- global _tracer_provider, _logging_handler, _initialized
168
+ """Shutdown the tracer provider and flush spans."""
169
+ global _tracer_provider, _initialized, _log_handler
189
170
 
190
- # Remove logging handler first
191
- if _logging_handler:
171
+ # Remove log handler
172
+ if _log_handler:
192
173
  try:
193
- logging.getLogger().removeHandler(_logging_handler)
174
+ plato_logger = logging.getLogger("plato")
175
+ plato_logger.removeHandler(_log_handler)
194
176
  except Exception:
195
177
  pass
196
- _logging_handler = None
178
+ _log_handler = None
197
179
 
198
180
  if _tracer_provider:
199
181
  try:
@@ -229,6 +211,8 @@ def instrument(service_name: str = "plato-agent") -> Tracer:
229
211
  Reads the following env vars:
230
212
  - OTEL_EXPORTER_OTLP_ENDPOINT: Chronos OTLP endpoint (required for tracing)
231
213
  - SESSION_ID: Chronos session ID (default: "local")
214
+ - OTEL_TRACE_ID: Parent trace ID for linking spans (optional)
215
+ - OTEL_PARENT_SPAN_ID: Parent span ID for linking spans (optional)
232
216
 
233
217
  If OTEL_EXPORTER_OTLP_ENDPOINT is not set, returns a no-op tracer.
234
218
 
@@ -242,17 +226,23 @@ def instrument(service_name: str = "plato-agent") -> Tracer:
242
226
 
243
227
  otel_endpoint = os.environ.get("OTEL_EXPORTER_OTLP_ENDPOINT")
244
228
  session_id = os.environ.get("SESSION_ID", "local")
229
+ parent_trace_id = os.environ.get("OTEL_TRACE_ID")
230
+ parent_span_id = os.environ.get("OTEL_PARENT_SPAN_ID")
231
+
232
+ print(f"[OTel] instrument() called: service={service_name}, endpoint={otel_endpoint}, session={session_id}")
245
233
 
246
234
  if not otel_endpoint:
247
235
  # Return default tracer (no-op if no provider configured)
236
+ print("[OTel] No OTEL_EXPORTER_OTLP_ENDPOINT set, returning no-op tracer")
248
237
  return trace.get_tracer(service_name)
249
238
 
250
- # Initialize tracing
239
+ # Initialize tracing with parent context if provided
251
240
  init_tracing(
252
241
  service_name=service_name,
253
242
  session_id=session_id,
254
243
  otlp_endpoint=otel_endpoint,
255
- capture_logging=True,
244
+ parent_trace_id=parent_trace_id,
245
+ parent_span_id=parent_span_id,
256
246
  )
257
247
 
258
248
  return trace.get_tracer(service_name)
@@ -0,0 +1,183 @@
1
+ """Agent runner - run agents in Docker containers.
2
+
3
+ Agents emit their own OTel spans for trajectory events. This runner:
4
+ 1. Runs agents in Docker containers
5
+ 2. Streams stdout/stderr for logging
6
+ 3. Passes OTel environment variables for trace context propagation
7
+ 4. Uploads artifacts to S3 when complete
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import asyncio
13
+ import json
14
+ import logging
15
+ import os
16
+ import platform
17
+ import tempfile
18
+
19
+ from opentelemetry import trace
20
+
21
+ from plato.agents.artifacts import upload_artifacts
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ async def run_agent(
27
+ image: str,
28
+ config: dict,
29
+ secrets: dict[str, str],
30
+ instruction: str,
31
+ workspace: str,
32
+ logs_dir: str | None = None,
33
+ pull: bool = True,
34
+ ) -> None:
35
+ """Run an agent in a Docker container.
36
+
37
+ Args:
38
+ image: Docker image URI
39
+ config: Agent configuration dict
40
+ secrets: Secret values (API keys, etc.)
41
+ instruction: Task instruction for the agent
42
+ workspace: Host directory to mount as /workspace
43
+ logs_dir: Host directory for logs (temp dir if None)
44
+ pull: Whether to pull the image first
45
+
46
+ Note: Agents handle their own OTel tracing. This runner only passes
47
+ the trace context (TRACEPARENT) so agent spans link to the parent step.
48
+ """
49
+ logs_dir = logs_dir or tempfile.mkdtemp(prefix="agent_logs_")
50
+
51
+ # Get session info from environment variables
52
+ session_id = os.environ.get("SESSION_ID")
53
+ otel_url = os.environ.get("OTEL_EXPORTER_OTLP_ENDPOINT")
54
+ upload_url = os.environ.get("UPLOAD_URL")
55
+
56
+ # Pull image if requested
57
+ if pull:
58
+ pull_proc = await asyncio.create_subprocess_exec(
59
+ "docker",
60
+ "pull",
61
+ image,
62
+ stdout=asyncio.subprocess.PIPE,
63
+ stderr=asyncio.subprocess.STDOUT,
64
+ )
65
+ await pull_proc.wait()
66
+
67
+ # Setup
68
+ os.makedirs(os.path.join(logs_dir, "agent"), exist_ok=True)
69
+ config_file = tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False)
70
+ json.dump(config, config_file)
71
+ config_file.close()
72
+
73
+ try:
74
+ # Build docker command
75
+ docker_cmd = ["docker", "run", "--rm", "--privileged"]
76
+
77
+ # Determine if we need host networking
78
+ use_host_network = False
79
+ is_macos = platform.system() == "Darwin"
80
+
81
+ if not is_macos:
82
+ try:
83
+ proc = await asyncio.create_subprocess_exec(
84
+ "iptables",
85
+ "-L",
86
+ "-n",
87
+ stdout=asyncio.subprocess.DEVNULL,
88
+ stderr=asyncio.subprocess.DEVNULL,
89
+ )
90
+ await proc.wait()
91
+ has_iptables = proc.returncode == 0
92
+ except (FileNotFoundError, PermissionError):
93
+ has_iptables = False
94
+
95
+ use_host_network = not has_iptables
96
+
97
+ if use_host_network:
98
+ docker_cmd.extend(["--network=host", "--add-host=localhost:127.0.0.1"])
99
+
100
+ docker_cmd.extend(
101
+ [
102
+ "-v",
103
+ f"{workspace}:/workspace",
104
+ "-v",
105
+ f"{logs_dir}:/logs",
106
+ "-v",
107
+ f"{config_file.name}:/config.json:ro",
108
+ "-v",
109
+ "/var/run/docker.sock:/var/run/docker.sock",
110
+ "-w",
111
+ "/workspace",
112
+ ]
113
+ )
114
+
115
+ # Pass session info to agent
116
+ if otel_url:
117
+ traces_endpoint = f"{otel_url.rstrip('/')}/v1/traces"
118
+ docker_cmd.extend(["-e", f"OTEL_EXPORTER_OTLP_ENDPOINT={otel_url}"])
119
+ docker_cmd.extend(["-e", f"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT={traces_endpoint}"])
120
+ docker_cmd.extend(["-e", "OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf"])
121
+ if session_id:
122
+ docker_cmd.extend(["-e", f"SESSION_ID={session_id}"])
123
+ if upload_url:
124
+ docker_cmd.extend(["-e", f"UPLOAD_URL={upload_url}"])
125
+
126
+ # Pass trace context to agent for parent linking
127
+ # Agent spans will be children of the current step span
128
+ current_span = trace.get_current_span()
129
+ span_context = current_span.get_span_context()
130
+ if span_context.is_valid:
131
+ trace_id = format(span_context.trace_id, "032x")
132
+ span_id = format(span_context.span_id, "016x")
133
+ # W3C Trace Context format for TRACEPARENT
134
+ traceparent = f"00-{trace_id}-{span_id}-01"
135
+ docker_cmd.extend(
136
+ [
137
+ "-e",
138
+ f"TRACEPARENT={traceparent}",
139
+ "-e",
140
+ f"OTEL_TRACE_ID={trace_id}",
141
+ "-e",
142
+ f"OTEL_PARENT_SPAN_ID={span_id}",
143
+ ]
144
+ )
145
+
146
+ for key, value in secrets.items():
147
+ docker_cmd.extend(["-e", f"{key.upper()}={value}"])
148
+
149
+ docker_cmd.append(image)
150
+
151
+ # Pass instruction via CLI arg
152
+ docker_cmd.extend(["--instruction", instruction])
153
+
154
+ # Run container - agents emit their own OTel spans
155
+ process = await asyncio.create_subprocess_exec(
156
+ *docker_cmd,
157
+ stdout=asyncio.subprocess.PIPE,
158
+ stderr=asyncio.subprocess.STDOUT,
159
+ )
160
+
161
+ # Capture output for error reporting
162
+ output_lines: list[str] = []
163
+ assert process.stdout is not None
164
+ while True:
165
+ line = await process.stdout.readline()
166
+ if not line:
167
+ break
168
+ decoded_line = line.decode().rstrip()
169
+ output_lines.append(decoded_line)
170
+
171
+ await process.wait()
172
+
173
+ exit_code = process.returncode or 0
174
+ if exit_code != 0:
175
+ error_context = "\n".join(output_lines[-50:]) if output_lines else "No output captured"
176
+ raise RuntimeError(f"Agent failed with exit code {exit_code}\n\nAgent output:\n{error_context}")
177
+
178
+ finally:
179
+ os.unlink(config_file.name)
180
+
181
+ # Upload artifacts if we have upload URL configured
182
+ if upload_url:
183
+ await upload_artifacts(upload_url, logs_dir)
@@ -131,6 +131,9 @@ def sandbox_start(
131
131
  timeout: int = typer.Option(1800, "--timeout", help="VM lifetime in seconds (default: 30 minutes)"),
132
132
  no_reset: bool = typer.Option(False, "--no-reset", help="Skip initial reset after ready"),
133
133
  json_output: bool = typer.Option(False, "--json", "-j", help="Output as JSON"),
134
+ working_dir: Path = typer.Option(
135
+ None, "--working-dir", "-w", help="Working directory for .sandbox.yaml and .plato/"
136
+ ),
134
137
  ):
135
138
  """
136
139
  Start a sandbox environment.
@@ -377,7 +380,7 @@ def sandbox_start(
377
380
  console.print("[cyan] Generating SSH key pair...[/cyan]")
378
381
 
379
382
  base_url = os.getenv("PLATO_BASE_URL", "https://plato.so")
380
- ssh_info = setup_ssh_for_sandbox(base_url, job_id, username=ssh_username)
383
+ ssh_info = setup_ssh_for_sandbox(base_url, job_id, username=ssh_username, working_dir=working_dir)
381
384
  ssh_host = ssh_info["ssh_host"]
382
385
  ssh_config_path = ssh_info["config_path"]
383
386
  ssh_private_key_path = ssh_info["private_key_path"]
@@ -489,7 +492,7 @@ def sandbox_start(
489
492
  # Add heartbeat PID
490
493
  if heartbeat_pid:
491
494
  state["heartbeat_pid"] = heartbeat_pid
492
- save_sandbox_state(state)
495
+ save_sandbox_state(state, working_dir)
493
496
 
494
497
  # Close the plato client (heartbeat process keeps session alive)
495
498
  plato.close()
@@ -9,21 +9,21 @@ from cryptography.hazmat.primitives import serialization
9
9
  from cryptography.hazmat.primitives.asymmetric import ed25519
10
10
 
11
11
 
12
- def get_plato_dir() -> Path:
12
+ def get_plato_dir(working_dir: Path | str | None = None) -> Path:
13
13
  """Get the directory for plato config/SSH files.
14
14
 
15
- Uses /workspace/.plato if /workspace exists (container environment),
16
- otherwise uses ~/.plato (local development).
15
+ Args:
16
+ working_dir: If provided, returns working_dir/.plato (for container/agent use).
17
+ If None, returns ~/.plato (local development).
17
18
  """
18
- workspace = Path("/workspace")
19
- if workspace.exists() and workspace.is_dir():
20
- return workspace / ".plato"
19
+ if working_dir is not None:
20
+ return Path(working_dir) / ".plato"
21
21
  return Path.home() / ".plato"
22
22
 
23
23
 
24
- def get_next_sandbox_number() -> int:
24
+ def get_next_sandbox_number(working_dir: Path | str | None = None) -> int:
25
25
  """Find next available sandbox number by checking existing config files."""
26
- plato_dir = get_plato_dir()
26
+ plato_dir = get_plato_dir(working_dir)
27
27
  if not plato_dir.exists():
28
28
  return 1
29
29
 
@@ -41,13 +41,13 @@ def get_next_sandbox_number() -> int:
41
41
  return max_num + 1
42
42
 
43
43
 
44
- def generate_ssh_key_pair(sandbox_num: int) -> tuple[str, str]:
44
+ def generate_ssh_key_pair(sandbox_num: int, working_dir: Path | str | None = None) -> tuple[str, str]:
45
45
  """
46
46
  Generate a new ed25519 SSH key pair for a specific sandbox.
47
47
 
48
48
  Returns (public_key_str, private_key_path).
49
49
  """
50
- plato_dir = get_plato_dir()
50
+ plato_dir = get_plato_dir(working_dir)
51
51
  plato_dir.mkdir(mode=0o700, exist_ok=True)
52
52
 
53
53
  private_key_path = plato_dir / f"ssh_{sandbox_num}_key"
@@ -136,6 +136,7 @@ def create_ssh_config(
136
136
  username: str,
137
137
  private_key_path: str,
138
138
  sandbox_num: int,
139
+ working_dir: Path | str | None = None,
139
140
  ) -> str:
140
141
  """
141
142
  Create a temporary SSH config file for a specific sandbox.
@@ -172,7 +173,7 @@ def create_ssh_config(
172
173
  TCPKeepAlive yes
173
174
  """
174
175
 
175
- plato_dir = get_plato_dir()
176
+ plato_dir = get_plato_dir(working_dir)
176
177
  plato_dir.mkdir(mode=0o700, exist_ok=True)
177
178
 
178
179
  config_path = plato_dir / f"ssh_{sandbox_num}.conf"
@@ -182,7 +183,12 @@ def create_ssh_config(
182
183
  return str(config_path)
183
184
 
184
185
 
185
- def setup_ssh_for_sandbox(base_url: str, job_public_id: str, username: str = "plato") -> dict:
186
+ def setup_ssh_for_sandbox(
187
+ base_url: str,
188
+ job_public_id: str,
189
+ username: str = "plato",
190
+ working_dir: Path | str | None = None,
191
+ ) -> dict:
186
192
  """
187
193
  Set up SSH access for a sandbox - generates keys and creates config.
188
194
 
@@ -190,14 +196,14 @@ def setup_ssh_for_sandbox(base_url: str, job_public_id: str, username: str = "pl
190
196
 
191
197
  Returns dict with: ssh_host, config_path, public_key, private_key_path
192
198
  """
193
- sandbox_num = get_next_sandbox_number()
199
+ sandbox_num = get_next_sandbox_number(working_dir)
194
200
  ssh_host = f"sandbox-{sandbox_num}"
195
201
 
196
202
  # Choose random port between 2200 and 2299
197
203
  local_port = random.randint(2200, 2299)
198
204
 
199
205
  # Generate SSH key pair
200
- public_key, private_key_path = generate_ssh_key_pair(sandbox_num)
206
+ public_key, private_key_path = generate_ssh_key_pair(sandbox_num, working_dir)
201
207
 
202
208
  # Create SSH config file
203
209
  config_path = create_ssh_config(
@@ -208,6 +214,7 @@ def setup_ssh_for_sandbox(base_url: str, job_public_id: str, username: str = "pl
208
214
  username=username,
209
215
  private_key_path=private_key_path,
210
216
  sandbox_num=sandbox_num,
217
+ working_dir=working_dir,
211
218
  )
212
219
 
213
220
  return {