plato-sdk-v2 2.3.1__tar.gz → 2.3.2__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 (536) hide show
  1. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/PKG-INFO +2 -1
  2. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/README.md +1 -0
  3. plato_sdk_v2-2.3.2/VERSION +1 -0
  4. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/agents/__init__.py +4 -0
  5. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/agents/logging.py +114 -0
  6. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/worlds/__init__.py +3 -1
  7. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/worlds/base.py +276 -2
  8. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/worlds/config.py +38 -1
  9. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/worlds/runner.py +93 -43
  10. plato_sdk_v2-2.3.1/VERSION +0 -1
  11. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/.claude/agents/sim-creator.md +0 -0
  12. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/.gitignore +0 -0
  13. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/.sandbox.yaml +0 -0
  14. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/BUILDING_SIMS.md +0 -0
  15. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/ci/CLAUDE.md +0 -0
  16. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/ci/deploy.sh +0 -0
  17. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/ci/lint.sh +0 -0
  18. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/ci/setup.sh +0 -0
  19. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/ci/version-bump.sh +0 -0
  20. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/AGENT_SPEC.md +0 -0
  21. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/CLI.md +0 -0
  22. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/GENERATING_SIM_SDKS.md +0 -0
  23. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/SIMULATOR_LIFECYCLE.md +0 -0
  24. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/SIM_CREATOR.md +0 -0
  25. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/cli/agent.md +0 -0
  26. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/cli/flows.md +0 -0
  27. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/cli/pm.md +0 -0
  28. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/cli/sandbox.md +0 -0
  29. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/cli/sims.md +0 -0
  30. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/cli/world.md +0 -0
  31. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/sim-creation-pipeline.md +0 -0
  32. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skill-restructure-plan.md +0 -0
  33. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/SIM-CREATION-ARCHITECTURE.md +0 -0
  34. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-config/SKILL.md +0 -0
  35. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-creator/SKILL.md +0 -0
  36. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-debugger/SKILL.md +0 -0
  37. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-flow-audit/SKILL.md +0 -0
  38. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-flow-clear/SKILL.md +0 -0
  39. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-flow-mutations/SKILL.md +0 -0
  40. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-flow-run/SKILL.md +0 -0
  41. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-research/SKILL.md +0 -0
  42. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-review/SKILL.md +0 -0
  43. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-sandbox-login/SKILL.md +0 -0
  44. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-sandbox-services/SKILL.md +0 -0
  45. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-sandbox-start/SKILL.md +0 -0
  46. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-sandbox-worker/SKILL.md +0 -0
  47. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-snapshot/SKILL.md +0 -0
  48. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-submit/SKILL.md +0 -0
  49. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-validate/SKILL.md +0 -0
  50. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/testcommit +0 -0
  51. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/unit.sh +0 -0
  52. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/__init__.py +0 -0
  53. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/__init__.py +0 -0
  54. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/__init__.py +0 -0
  55. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/__init__.py +0 -0
  56. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/agent_artifacts/__init__.py +0 -0
  57. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/agent_artifacts/archive_agent_artifact.py +0 -0
  58. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/agent_artifacts/create_agent_artifact.py +0 -0
  59. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/agent_artifacts/get_agent_artifact_by_public_id.py +0 -0
  60. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/agent_artifacts/get_agent_artifacts.py +0 -0
  61. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/__init__.py +0 -0
  62. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/cleanup_stale_vms.py +0 -0
  63. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/get_dispatchers.py +0 -0
  64. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/get_nodes_status.py +0 -0
  65. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/get_snapshot_lineage.py +0 -0
  66. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/get_snapshots_status.py +0 -0
  67. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/pause_resume_dispatchers.py +0 -0
  68. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/prefetch_snapshot.py +0 -0
  69. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/__init__.py +0 -0
  70. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/backup.py +0 -0
  71. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/cleanup.py +0 -0
  72. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/close.py +0 -0
  73. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/close_async.py +0 -0
  74. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/create.py +0 -0
  75. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/create_batch.py +0 -0
  76. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/create_simulator.py +0 -0
  77. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/evaluate_session.py +0 -0
  78. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/generate_mutations.py +0 -0
  79. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/generate_mutations_single.py +0 -0
  80. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_active_session.py +0 -0
  81. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_app_sim_worker_info.py +0 -0
  82. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_cdp_url.py +0 -0
  83. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_flows.py +0 -0
  84. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_interface_worker_info.py +0 -0
  85. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_job_info.py +0 -0
  86. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_job_status.py +0 -0
  87. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_job_worker_info.py +0 -0
  88. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_proxy_url.py +0 -0
  89. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_public_url.py +0 -0
  90. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_simulator_by_name.py +0 -0
  91. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_simulators.py +0 -0
  92. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_state.py +0 -0
  93. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_worker_ready.py +0 -0
  94. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/log_state_mutation.py +0 -0
  95. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/rescore_simulator_sessions.py +0 -0
  96. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/reset.py +0 -0
  97. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/score.py +0 -0
  98. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/send_heartbeat.py +0 -0
  99. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/update_simulator.py +0 -0
  100. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/__init__.py +0 -0
  101. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/create_test_case_review.py +0 -0
  102. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/evaluate_python.py +0 -0
  103. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/get_all_test_case_reviews.py +0 -0
  104. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/get_scores_by_user.py +0 -0
  105. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/get_scoring.py +0 -0
  106. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/get_test_case_review.py +0 -0
  107. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/human_in_the_loop_scoring.py +0 -0
  108. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/start_eval_from_git.py +0 -0
  109. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/__init__.py +0 -0
  110. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/create_gitea_repository.py +0 -0
  111. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/create_simulator_repository.py +0 -0
  112. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/delete_gitea_repository.py +0 -0
  113. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_accessible_simulators.py +0 -0
  114. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_gitea_credentials.py +0 -0
  115. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_gitea_repository.py +0 -0
  116. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_my_gitea_info.py +0 -0
  117. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_my_repositories.py +0 -0
  118. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_repository_branches.py +0 -0
  119. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_repository_contents.py +0 -0
  120. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_simulator_file_content.py +0 -0
  121. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_simulator_repository.py +0 -0
  122. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_simulator_repository_branches.py +0 -0
  123. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_simulator_repository_contents.py +0 -0
  124. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/jobs/__init__.py +0 -0
  125. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/jobs/get_job_by_id.py +0 -0
  126. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/jobs/get_jobs_by_group_id.py +0 -0
  127. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/jobs/get_keepalive_jobs.py +0 -0
  128. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/jobs/list_jobs.py +0 -0
  129. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/jobs/update_job_status.py +0 -0
  130. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/__init__.py +0 -0
  131. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/create_annotator_assignment.py +0 -0
  132. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/create_org_api_key.py +0 -0
  133. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/create_org_policy.py +0 -0
  134. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/delete_org_api_key.py +0 -0
  135. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/delete_org_policy.py +0 -0
  136. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/get_annotator_assignments.py +0 -0
  137. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/get_org_api_key_policies.py +0 -0
  138. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/get_org_api_keys.py +0 -0
  139. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/get_org_policies.py +0 -0
  140. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/get_organization_concurrency_status.py +0 -0
  141. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/get_organization_members.py +0 -0
  142. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/update_annotator_assignment_stage.py +0 -0
  143. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/update_organization_concurrency_limit.py +0 -0
  144. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/queue/__init__.py +0 -0
  145. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/queue/get_queue_status.py +0 -0
  146. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/queue/get_vm_detail.py +0 -0
  147. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/queue/get_vms.py +0 -0
  148. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/queue/get_workers.py +0 -0
  149. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/__init__.py +0 -0
  150. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/checkpoint_vm.py +0 -0
  151. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/close_vm.py +0 -0
  152. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/create_vm.py +0 -0
  153. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/execute_ssh_command.py +0 -0
  154. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/get_operation_events.py +0 -0
  155. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/healthy_services.py +0 -0
  156. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/healthy_worker.py +0 -0
  157. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/save_vm_snapshot.py +0 -0
  158. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/setup_root_access.py +0 -0
  159. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/setup_sandbox.py +0 -0
  160. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/start_worker.py +0 -0
  161. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/__init__.py +0 -0
  162. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/analyze_labels.py +0 -0
  163. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/archive_session.py +0 -0
  164. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/archive_session_logs_endpoint.py +0 -0
  165. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/create_from_labels.py +0 -0
  166. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/create_session_from_browser.py +0 -0
  167. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/create_session_from_env_recording.py +0 -0
  168. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/create_session_from_har.py +0 -0
  169. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_env_recording.py +0 -0
  170. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_grouped_replay_sessions.py +0 -0
  171. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_logs_status.py +0 -0
  172. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_network_requests.py +0 -0
  173. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_next_session_for_annotator.py +0 -0
  174. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_public_benchmark_sessions.py +0 -0
  175. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_replay_score_data.py +0 -0
  176. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_rrweb_actions.py +0 -0
  177. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_rrweb_events.py +0 -0
  178. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_screen_recording.py +0 -0
  179. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_session.py +0 -0
  180. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_session_replays.py +0 -0
  181. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_sessions.py +0 -0
  182. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_sessions_for_archival.py +0 -0
  183. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_ui_events.py +0 -0
  184. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/restore_session_logs.py +0 -0
  185. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/score_session_with_config.py +0 -0
  186. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/search_sessions_by_ids.py +0 -0
  187. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/set_session_output.py +0 -0
  188. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/update_session_public.py +0 -0
  189. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/update_session_testcase.py +0 -0
  190. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/__init__.py +0 -0
  191. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/add_simulator_review.py +0 -0
  192. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/batch_create_test_cases.py +0 -0
  193. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/batch_get_artifact_metadata.py +0 -0
  194. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_all_simulators_info.py +0 -0
  195. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_db_config.py +0 -0
  196. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_env_flows.py +0 -0
  197. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_plato_config.py +0 -0
  198. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_sessions_batch_by_job_groups.py +0 -0
  199. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_sessions_by_job_group.py +0 -0
  200. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_simulator_by_name.py +0 -0
  201. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_simulator_id.py +0 -0
  202. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_simulator_info.py +0 -0
  203. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_simulator_version_details.py +0 -0
  204. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_simulator_versions.py +0 -0
  205. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_start_path.py +0 -0
  206. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_version_by_tag.py +0 -0
  207. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/list_simulators.py +0 -0
  208. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/list_simulators_by_org.py +0 -0
  209. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/list_simulators_status.py +0 -0
  210. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/register.py +0 -0
  211. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/update_simulator.py +0 -0
  212. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/update_simulator_status.py +0 -0
  213. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/update_tag.py +0 -0
  214. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/__init__.py +0 -0
  215. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/archive_organization_test_case_assignments.py +0 -0
  216. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/archive_organization_testcase.py +0 -0
  217. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/archive_testcase.py +0 -0
  218. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/assign_testcase_to_organizations.py +0 -0
  219. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/auto_verify_testcase.py +0 -0
  220. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/bulk_archive_testcases.py +0 -0
  221. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/convert_text_to_structured_data.py +0 -0
  222. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/create_testcase.py +0 -0
  223. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/create_testcase_set.py +0 -0
  224. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/delete_testcase_set.py +0 -0
  225. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/filter_human_recorder_testcases.py +0 -0
  226. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/generate_outcome_schema.py +0 -0
  227. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/generate_prediction.py +0 -0
  228. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/generate_prediction_from_steps.py +0 -0
  229. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/generate_scoring_config_from_sessions.py +0 -0
  230. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/generate_state_mutations_config_route.py +0 -0
  231. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_human_recorder_tab_counts.py +0 -0
  232. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_human_recorder_testcases.py +0 -0
  233. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_merged_mutations.py +0 -0
  234. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_mutation_groups_for_testcase.py +0 -0
  235. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_next_testcase_for_scoring.py +0 -0
  236. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_organization_test_case_assignments.py +0 -0
  237. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_testcase.py +0 -0
  238. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_testcase_metadata_for_scoring.py +0 -0
  239. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_testcase_sets.py +0 -0
  240. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_testcases.py +0 -0
  241. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_testcases_in_set.py +0 -0
  242. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/mark_organization_test_case_completed.py +0 -0
  243. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/update_testcase.py +0 -0
  244. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/version_bump_testcase.py +0 -0
  245. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/__init__.py +0 -0
  246. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/__init__.py +0 -0
  247. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/get_agent_ecr_token.py +0 -0
  248. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/get_agent_schema.py +0 -0
  249. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/get_agent_versions.py +0 -0
  250. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/import_agent.py +0 -0
  251. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/list_docker_agents.py +0 -0
  252. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/lookup_agent_version.py +0 -0
  253. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/register_docker_agent.py +0 -0
  254. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/artifacts/__init__.py +0 -0
  255. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/artifacts/get_artifact.py +0 -0
  256. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos/__init__.py +0 -0
  257. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos/launch_job.py +0 -0
  258. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos_packages/__init__.py +0 -0
  259. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos_packages/get_package_versions.py +0 -0
  260. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos_packages/list_chronos_packages.py +0 -0
  261. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos_packages/lookup_package_version.py +0 -0
  262. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos_packages/register_chronos_package.py +0 -0
  263. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos_packages/upload_chronos_package.py +0 -0
  264. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/cluster/__init__.py +0 -0
  265. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/cluster/get_node_config.py +0 -0
  266. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/__init__.py +0 -0
  267. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/checkpoint.py +0 -0
  268. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/close.py +0 -0
  269. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/connect_routing_info.py +0 -0
  270. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/connect_url.py +0 -0
  271. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/disk_snapshot.py +0 -0
  272. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/execute.py +0 -0
  273. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/get_flows.py +0 -0
  274. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/get_plato_config.py +0 -0
  275. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/log_for_job.py +0 -0
  276. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/make.py +0 -0
  277. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/public_url.py +0 -0
  278. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/reset.py +0 -0
  279. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/set_date.py +0 -0
  280. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/setup_sandbox.py +0 -0
  281. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/snapshot.py +0 -0
  282. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/snapshot_store.py +0 -0
  283. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/state.py +0 -0
  284. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/wait_for_ready.py +0 -0
  285. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/pypi/__init__.py +0 -0
  286. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/pypi/download_package.py +0 -0
  287. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/pypi/get_package_schema.py +0 -0
  288. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/pypi/package_index.py +0 -0
  289. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/pypi/simple_index.py +0 -0
  290. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/pypi/upload_package.py +0 -0
  291. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/__init__.py +0 -0
  292. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/create.py +0 -0
  293. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/deploy.py +0 -0
  294. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/get.py +0 -0
  295. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/handle_get_existing_public_ids.py +0 -0
  296. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/handle_import.py +0 -0
  297. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/list_releases.py +0 -0
  298. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/prep_release_assigned_testcases.py +0 -0
  299. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/update.py +0 -0
  300. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/__init__.py +0 -0
  301. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/checkpoint.py +0 -0
  302. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/close.py +0 -0
  303. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/disk_snapshot.py +0 -0
  304. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/evaluate.py +0 -0
  305. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/execute.py +0 -0
  306. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_connect_url.py +0 -0
  307. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_presigned_url.py +0 -0
  308. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_public_url.py +0 -0
  309. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_s3_content.py +0 -0
  310. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_session_details.py +0 -0
  311. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_session_documents.py +0 -0
  312. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_session_flows.py +0 -0
  313. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_session_logs.py +0 -0
  314. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_session_plato_config.py +0 -0
  315. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/heartbeat.py +0 -0
  316. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/list_jobs.py +0 -0
  317. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/list_sessions.py +0 -0
  318. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/log_job_mutation.py +0 -0
  319. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/make.py +0 -0
  320. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/reset.py +0 -0
  321. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/set_date.py +0 -0
  322. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/setup_sandbox.py +0 -0
  323. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/snapshot.py +0 -0
  324. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/snapshot_store.py +0 -0
  325. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/state.py +0 -0
  326. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/upload_session_documents.py +0 -0
  327. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/wait_for_ready.py +0 -0
  328. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/user/__init__.py +0 -0
  329. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/user/get_current_user.py +0 -0
  330. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/version/__init__.py +0 -0
  331. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/version/check.py +0 -0
  332. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/client.py +0 -0
  333. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/errors.py +0 -0
  334. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/models/__init__.py +0 -0
  335. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/py.typed +0 -0
  336. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/__init__.py +0 -0
  337. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/cli.py +0 -0
  338. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/instruction.py +0 -0
  339. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/parser.py +0 -0
  340. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/python.py +0 -0
  341. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/instruction/helpers.py.jinja +0 -0
  342. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/instruction/init.py.jinja +0 -0
  343. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/python/api_init.py.jinja +0 -0
  344. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/python/client.py.jinja +0 -0
  345. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/python/endpoint.py.jinja +0 -0
  346. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/python/errors.py.jinja +0 -0
  347. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/python/package_init.py.jinja +0 -0
  348. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/python/tag_init.py.jinja +0 -0
  349. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/python/version_init.py.jinja +0 -0
  350. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/agents/base.py +0 -0
  351. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/agents/build.py +0 -0
  352. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/agents/config.py +0 -0
  353. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/agents/runner.py +0 -0
  354. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/agents/trajectory.py +0 -0
  355. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/__init__.py +0 -0
  356. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/__init__.py +0 -0
  357. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/__init__.py +0 -0
  358. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/create_agent.py +0 -0
  359. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/delete_agent.py +0 -0
  360. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/get_agent.py +0 -0
  361. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/get_agent_schema.py +0 -0
  362. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/get_agent_versions.py +0 -0
  363. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/list_agents.py +0 -0
  364. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/lookup_agent.py +0 -0
  365. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/auth/__init__.py +0 -0
  366. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/auth/debug_auth_api_auth_debug_get.py +0 -0
  367. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/auth/get_auth_status_api_auth_status_get.py +0 -0
  368. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/auth/get_current_user_route_api_auth_me_get.py +0 -0
  369. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/callback/__init__.py +0 -0
  370. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/callback/push_agent_logs.py +0 -0
  371. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/callback/update_agent_status.py +0 -0
  372. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/callback/upload_artifacts.py +0 -0
  373. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/callback/upload_logs_zip.py +0 -0
  374. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/callback/upload_trajectory.py +0 -0
  375. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/default/__init__.py +0 -0
  376. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/default/health.py +0 -0
  377. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/jobs/__init__.py +0 -0
  378. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/jobs/launch_job.py +0 -0
  379. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/registry/__init__.py +0 -0
  380. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/registry/get_agent_schema_api_registry_agents__agent_name__schema_get.py +0 -0
  381. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/registry/get_agent_versions_api_registry_agents__agent_name__versions_get.py +0 -0
  382. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/registry/get_world_schema_api_registry_worlds__package_name__schema_get.py +0 -0
  383. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/registry/get_world_versions_api_registry_worlds__package_name__versions_get.py +0 -0
  384. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/registry/list_registry_agents_api_registry_agents_get.py +0 -0
  385. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/registry/list_registry_worlds_api_registry_worlds_get.py +0 -0
  386. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/runtimes/__init__.py +0 -0
  387. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/runtimes/create_runtime.py +0 -0
  388. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/runtimes/delete_runtime.py +0 -0
  389. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/runtimes/get_runtime.py +0 -0
  390. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/runtimes/list_runtimes.py +0 -0
  391. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/runtimes/test_runtime.py +0 -0
  392. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/secrets/__init__.py +0 -0
  393. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/secrets/create_secret.py +0 -0
  394. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/secrets/delete_secret.py +0 -0
  395. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/secrets/get_secret.py +0 -0
  396. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/secrets/list_secrets.py +0 -0
  397. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/secrets/update_secret.py +0 -0
  398. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/sessions/__init__.py +0 -0
  399. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/sessions/get_session.py +0 -0
  400. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/sessions/get_session_logs.py +0 -0
  401. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/sessions/get_session_logs_download.py +0 -0
  402. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/sessions/list_sessions.py +0 -0
  403. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/status/__init__.py +0 -0
  404. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/status/get_status_api_status_get.py +0 -0
  405. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/status/get_version_info_api_version_get.py +0 -0
  406. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/templates/__init__.py +0 -0
  407. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/templates/create_template.py +0 -0
  408. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/templates/delete_template.py +0 -0
  409. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/templates/get_template.py +0 -0
  410. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/templates/list_templates.py +0 -0
  411. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/templates/update_template.py +0 -0
  412. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/trajectories/__init__.py +0 -0
  413. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/trajectories/get_trajectory.py +0 -0
  414. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/trajectories/list_trajectories.py +0 -0
  415. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/worlds/__init__.py +0 -0
  416. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/worlds/create_world.py +0 -0
  417. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/worlds/delete_world.py +0 -0
  418. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/worlds/get_world.py +0 -0
  419. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/worlds/list_worlds.py +0 -0
  420. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/client.py +0 -0
  421. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/errors.py +0 -0
  422. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/models/__init__.py +0 -0
  423. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/py.typed +0 -0
  424. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/py.typed +0 -0
  425. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/sims/README.md +0 -0
  426. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/sims/__init__.py +0 -0
  427. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/sims/agent_helpers.py +0 -0
  428. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/sims/cli.py +0 -0
  429. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/sims/generate_clients.py +0 -0
  430. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/sims/registry.py +0 -0
  431. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/__init__.py +0 -0
  432. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/audit_ui.py +0 -0
  433. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/__init__.py +0 -0
  434. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/agent.py +0 -0
  435. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/main.py +0 -0
  436. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/pm.py +0 -0
  437. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/sandbox.py +0 -0
  438. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/sim.py +0 -0
  439. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/ssh.py +0 -0
  440. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/utils.py +0 -0
  441. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/verify.py +0 -0
  442. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/world.py +0 -0
  443. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli.py +0 -0
  444. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/config.py +0 -0
  445. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/examples/doordash_tasks.py +0 -0
  446. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/examples/loadtest.py +0 -0
  447. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/examples/test_env.py +0 -0
  448. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/examples/test_env_custom_browser.py +0 -0
  449. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/examples/test_env_sync.py +0 -0
  450. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/examples/test_reuse_env.py +0 -0
  451. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/examples/test_run.py +0 -0
  452. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/exceptions.py +0 -0
  453. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/README.md +0 -0
  454. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/api-client.js +0 -0
  455. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/background.js +0 -0
  456. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/build-sdk.js +0 -0
  457. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/content.js +0 -0
  458. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/manifest.json +0 -0
  459. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/offscreen.html +0 -0
  460. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/offscreen.js +0 -0
  461. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/options.html +0 -0
  462. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/options.js +0 -0
  463. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/package-lock.json +0 -0
  464. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/package.json +0 -0
  465. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/plato-sdk-bundle.js +0 -0
  466. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/plato-sdk-bundle.js.map +0 -0
  467. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/popup.html +0 -0
  468. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/popup.js +0 -0
  469. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/review-panel.html +0 -0
  470. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/review-panel.js +0 -0
  471. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/review-success.html +0 -0
  472. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/review-success.js +0 -0
  473. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/session-active.html +0 -0
  474. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/session-active.js +0 -0
  475. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/session-ended.html +0 -0
  476. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/session-ended.js +0 -0
  477. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/session-setup.html +0 -0
  478. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/session-setup.js +0 -0
  479. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/sessions.html +0 -0
  480. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/sessions.js +0 -0
  481. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/styles.css +0 -0
  482. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/flow_executor.py +0 -0
  483. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/models/__init__.py +0 -0
  484. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/models/build_models.py +0 -0
  485. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/models/env.py +0 -0
  486. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/models/flow.py +0 -0
  487. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/models/sandbox.py +0 -0
  488. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/models/task.py +0 -0
  489. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/sandbox_sdk.py +0 -0
  490. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/sdk.py +0 -0
  491. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/sync_env.py +0 -0
  492. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/sync_flow_executor.py +0 -0
  493. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/sync_sdk.py +0 -0
  494. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/utils/proxytunnel.py +0 -0
  495. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/__init__.py +0 -0
  496. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/async_/__init__.py +0 -0
  497. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/async_/artifact.py +0 -0
  498. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/async_/client.py +0 -0
  499. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/async_/environment.py +0 -0
  500. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/async_/flow_executor.py +0 -0
  501. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/async_/session.py +0 -0
  502. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/models.py +0 -0
  503. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/sync/__init__.py +0 -0
  504. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/sync/artifact.py +0 -0
  505. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/sync/client.py +0 -0
  506. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/sync/environment.py +0 -0
  507. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/sync/flow_executor.py +0 -0
  508. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/sync/session.py +0 -0
  509. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/types.py +0 -0
  510. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/utils/__init__.py +0 -0
  511. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/utils/db_cleanup.py +0 -0
  512. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/utils/models.py +0 -0
  513. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/utils/proxy_tunnel.py +0 -0
  514. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/worlds/README.md +0 -0
  515. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/worlds/build_hook.py +0 -0
  516. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/pyproject.toml +0 -0
  517. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/scripts/get_all_artifact_targets.py +0 -0
  518. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/__init__.py +0 -0
  519. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/integration/__init__.py +0 -0
  520. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/integration/conftest.py +0 -0
  521. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/integration/test_browser_agent.py +0 -0
  522. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/integration/test_chronos_callback.py +0 -0
  523. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/integration/test_cleanup_snapshot.py +0 -0
  524. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/integration/test_code_world.py +0 -0
  525. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/integration/test_harbor_agent_runner.py +0 -0
  526. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/sims/__init__.py +0 -0
  527. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/sims/conftest.py +0 -0
  528. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/sims/test_agent_helpers.py +0 -0
  529. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/test_heartbeat_keepalive.py +0 -0
  530. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/test_session_serialization.py +0 -0
  531. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/test_set_date.py +0 -0
  532. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/test_v2_imports.py +0 -0
  533. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/test_v2_multisim_integration.py +0 -0
  534. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/test_v2_session.py +0 -0
  535. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/test_version.py +0 -0
  536. {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plato-sdk-v2
3
- Version: 2.3.1
3
+ Version: 2.3.2
4
4
  Summary: Python SDK for the Plato API
5
5
  Author-email: Plato <support@plato.so>
6
6
  License-Expression: MIT
@@ -44,6 +44,7 @@ Description-Content-Type: text/markdown
44
44
 
45
45
  # Plato Python SDK
46
46
 
47
+
47
48
  Python SDK for the Plato platform. Uses [Harbor](https://harborframework.com) for agent execution.
48
49
 
49
50
  ## Installation
@@ -1,5 +1,6 @@
1
1
  # Plato Python SDK
2
2
 
3
+
3
4
  Python SDK for the Plato platform. Uses [Harbor](https://harborframework.com) for agent execution.
4
5
 
5
6
  ## Installation
@@ -0,0 +1 @@
1
+ 2.3.2
@@ -85,6 +85,8 @@ __all__ = [
85
85
  "span",
86
86
  "log_event",
87
87
  "upload_artifacts",
88
+ "upload_artifact",
89
+ "upload_checkpoint",
88
90
  "reset_logging",
89
91
  ]
90
92
 
@@ -102,7 +104,9 @@ from plato.agents.logging import (
102
104
  log_event,
103
105
  reset_logging,
104
106
  span,
107
+ upload_artifact,
105
108
  upload_artifacts,
109
+ upload_checkpoint,
106
110
  )
107
111
  from plato.agents.runner import run_agent
108
112
  from plato.agents.trajectory import (
@@ -399,3 +399,117 @@ async def upload_artifacts(dir_path: str) -> str | None:
399
399
  except Exception as e:
400
400
  logger.warning(f"Failed to upload artifacts: {e}")
401
401
  return None
402
+
403
+
404
+ # =============================================================================
405
+ # Artifact Upload (Generic)
406
+ # =============================================================================
407
+
408
+
409
+ async def upload_artifact(
410
+ data: bytes,
411
+ artifact_type: str,
412
+ filename: str | None = None,
413
+ extra: dict[str, Any] | None = None,
414
+ ) -> dict[str, Any] | None:
415
+ """Upload an artifact to Chronos.
416
+
417
+ Artifacts are stored in S3 and linked to the session in the database.
418
+
419
+ Args:
420
+ data: Raw bytes of the artifact
421
+ artifact_type: Type of artifact (e.g., "state", "logs", "trajectory")
422
+ filename: Optional filename for the artifact
423
+ extra: Optional extra data to store with the artifact
424
+
425
+ Returns:
426
+ Dict with artifact_id and s3_url if successful, None otherwise.
427
+ """
428
+ chronos = _ChronosLogger._instance
429
+ if not chronos or not chronos.enabled:
430
+ return None
431
+
432
+ try:
433
+ data_base64 = base64.b64encode(data).decode("utf-8")
434
+ logger.info(f"Uploading artifact: type={artifact_type}, size={len(data)} bytes")
435
+ except Exception as e:
436
+ logger.warning(f"Failed to encode artifact: {e}")
437
+ return None
438
+
439
+ try:
440
+ async with httpx.AsyncClient(timeout=120.0) as client:
441
+ response = await client.post(
442
+ f"{chronos.callback_url}/artifact",
443
+ json={
444
+ "session_id": chronos.session_id,
445
+ "artifact_type": artifact_type,
446
+ "data_base64": data_base64,
447
+ "filename": filename,
448
+ "extra": extra or {},
449
+ },
450
+ )
451
+ if response.status_code == 200:
452
+ result = response.json()
453
+ logger.info(f"Uploaded artifact: {result}")
454
+ return result
455
+ else:
456
+ logger.warning(f"Failed to upload artifact: {response.status_code} {response.text}")
457
+ return None
458
+ except Exception as e:
459
+ logger.warning(f"Failed to upload artifact: {e}")
460
+ return None
461
+
462
+
463
+ # =============================================================================
464
+ # Checkpoint Upload
465
+ # =============================================================================
466
+
467
+
468
+ async def upload_checkpoint(
469
+ step_number: int,
470
+ env_snapshots: dict[str, str],
471
+ state_artifact_id: str | None = None,
472
+ extra: dict[str, Any] | None = None,
473
+ ) -> dict[str, Any] | None:
474
+ """Upload checkpoint data to Chronos.
475
+
476
+ A checkpoint includes:
477
+ - Environment snapshots (artifact IDs per env alias)
478
+ - State artifact (git bundle of /state directory)
479
+ - Extra data (step number, timestamp, etc.)
480
+
481
+ Args:
482
+ step_number: The step number when this checkpoint was created
483
+ env_snapshots: Dict mapping env alias to artifact_id
484
+ state_artifact_id: Artifact ID of the state bundle (from upload_artifact)
485
+ extra: Optional additional data
486
+
487
+ Returns:
488
+ Dict with checkpoint_id if successful, None otherwise.
489
+ """
490
+ chronos = _ChronosLogger._instance
491
+ if not chronos or not chronos.enabled:
492
+ return None
493
+
494
+ try:
495
+ async with httpx.AsyncClient(timeout=60.0) as client:
496
+ response = await client.post(
497
+ f"{chronos.callback_url}/checkpoint",
498
+ json={
499
+ "session_id": chronos.session_id,
500
+ "step_number": step_number,
501
+ "env_snapshots": env_snapshots,
502
+ "state_artifact_id": state_artifact_id,
503
+ "extra": extra or {},
504
+ },
505
+ )
506
+ if response.status_code == 200:
507
+ result = response.json()
508
+ logger.info(f"Uploaded checkpoint: step={step_number}, checkpoint_id={result.get('checkpoint_id')}")
509
+ return result
510
+ else:
511
+ logger.warning(f"Failed to upload checkpoint: {response.status_code} {response.text}")
512
+ return None
513
+ except Exception as e:
514
+ logger.warning(f"Failed to upload checkpoint: {e}")
515
+ return None
@@ -52,7 +52,7 @@ from plato.worlds.base import (
52
52
  get_world,
53
53
  register_world,
54
54
  )
55
- from plato.worlds.config import Agent, AgentConfig, Env, EnvConfig, RunConfig, Secret
55
+ from plato.worlds.config import Agent, AgentConfig, CheckpointConfig, Env, EnvConfig, RunConfig, Secret, StateConfig
56
56
  from plato.worlds.runner import run_world
57
57
 
58
58
  __all__ = [
@@ -66,6 +66,8 @@ __all__ = [
66
66
  "get_world",
67
67
  # Config
68
68
  "RunConfig",
69
+ "CheckpointConfig",
70
+ "StateConfig",
69
71
  "AgentConfig",
70
72
  "Agent",
71
73
  "Secret",
@@ -3,7 +3,9 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import logging
6
+ import subprocess
6
7
  from abc import ABC, abstractmethod
8
+ from pathlib import Path
7
9
  from typing import TYPE_CHECKING, Any, ClassVar, Generic, TypeVar, get_args, get_origin
8
10
 
9
11
  from pydantic import BaseModel, Field
@@ -18,6 +20,8 @@ from plato.agents.logging import init_logging as _init_chronos_logging
18
20
  from plato.agents.logging import log_event as _log_event
19
21
  from plato.agents.logging import reset_logging as _reset_chronos_logging
20
22
  from plato.agents.logging import span as _span
23
+ from plato.agents.logging import upload_artifact as _upload_artifact
24
+ from plato.agents.logging import upload_checkpoint as _upload_checkpoint
21
25
 
22
26
  logger = logging.getLogger(__name__)
23
27
 
@@ -195,6 +199,248 @@ class BaseWorld(ABC, Generic[ConfigT]):
195
199
  except Exception as e:
196
200
  self.logger.warning(f"Error stopping Plato heartbeat: {e}")
197
201
 
202
+ async def _create_checkpoint(self) -> dict[str, str] | None:
203
+ """Create a checkpoint snapshot of all environments (excluding configured envs).
204
+
205
+ Uses snapshot_store for efficient chunk-based deduplication.
206
+
207
+ Returns:
208
+ Dict mapping environment alias to artifact_id, or None if no session connected.
209
+ """
210
+ if not self.plato_session:
211
+ self.logger.warning("Cannot create checkpoint: Plato session not connected")
212
+ return None
213
+
214
+ exclude_envs = set(self.config.checkpoint.exclude_envs)
215
+ envs_to_snapshot = [env for env in self.plato_session.envs if env.alias not in exclude_envs]
216
+
217
+ if not envs_to_snapshot:
218
+ self.logger.info("No environments to checkpoint (all excluded)")
219
+ return {}
220
+
221
+ self.logger.info(
222
+ f"Creating checkpoint for {len(envs_to_snapshot)} environment(s): {[e.alias for e in envs_to_snapshot]}"
223
+ )
224
+
225
+ results: dict[str, str] = {}
226
+ for env in envs_to_snapshot:
227
+ try:
228
+ result = await env.snapshot_store()
229
+ artifact_id = result.artifact_id
230
+ results[env.alias] = artifact_id
231
+
232
+ # Check for success/error fields (available after SDK regeneration)
233
+ success = getattr(result, "success", True)
234
+ error = getattr(result, "error", None)
235
+
236
+ if not success or error:
237
+ self.logger.error(
238
+ f"Checkpoint failed for '{env.alias}': {error or 'unknown error'} (job_id={env.job_id})"
239
+ )
240
+ elif artifact_id:
241
+ self.logger.info(f"Checkpoint created for '{env.alias}': {artifact_id}")
242
+ else:
243
+ self.logger.warning(
244
+ f"Checkpoint for '{env.alias}' returned empty artifact_id (job_id={env.job_id})"
245
+ )
246
+ except Exception as e:
247
+ self.logger.error(f"Failed to checkpoint '{env.alias}': {e}")
248
+
249
+ return results
250
+
251
+ def _init_state_directory(self) -> None:
252
+ """Initialize the state directory as a git repository.
253
+
254
+ Creates the state directory if it doesn't exist and initializes it
255
+ as a git repository with an initial commit.
256
+ """
257
+ if not self.config.state.enabled:
258
+ return
259
+
260
+ state_path = Path(self.config.state.path)
261
+
262
+ # Create directory if it doesn't exist
263
+ if not state_path.exists():
264
+ state_path.mkdir(parents=True)
265
+ self.logger.info(f"Created state directory: {state_path}")
266
+
267
+ # Check if already a git repo
268
+ git_dir = state_path / ".git"
269
+ if git_dir.exists():
270
+ self.logger.info(f"State directory already initialized: {state_path}")
271
+ return
272
+
273
+ # Initialize git repo
274
+ try:
275
+ subprocess.run(
276
+ ["git", "init"],
277
+ cwd=state_path,
278
+ capture_output=True,
279
+ check=True,
280
+ )
281
+ # Create initial commit (even if empty)
282
+ subprocess.run(
283
+ ["git", "config", "user.email", "plato@plato.so"],
284
+ cwd=state_path,
285
+ capture_output=True,
286
+ check=True,
287
+ )
288
+ subprocess.run(
289
+ ["git", "config", "user.name", "Plato"],
290
+ cwd=state_path,
291
+ capture_output=True,
292
+ check=True,
293
+ )
294
+ # Add all files and create initial commit
295
+ subprocess.run(
296
+ ["git", "add", "-A"],
297
+ cwd=state_path,
298
+ capture_output=True,
299
+ check=True,
300
+ )
301
+ subprocess.run(
302
+ ["git", "commit", "--allow-empty", "-m", "Initial state"],
303
+ cwd=state_path,
304
+ capture_output=True,
305
+ check=True,
306
+ )
307
+ self.logger.info(f"Initialized git repo in state directory: {state_path}")
308
+ except subprocess.CalledProcessError as e:
309
+ self.logger.warning(f"Failed to initialize state git repo: {e.stderr}")
310
+
311
+ def _commit_state(self, message: str) -> bool:
312
+ """Commit current state directory changes.
313
+
314
+ Args:
315
+ message: Commit message
316
+
317
+ Returns:
318
+ True if commit was created (or no changes), False on error.
319
+ """
320
+ if not self.config.state.enabled:
321
+ return True
322
+
323
+ state_path = Path(self.config.state.path)
324
+ if not state_path.exists():
325
+ return True
326
+
327
+ try:
328
+ # Add all changes
329
+ subprocess.run(
330
+ ["git", "add", "-A"],
331
+ cwd=state_path,
332
+ capture_output=True,
333
+ check=True,
334
+ )
335
+ # Check if there are changes to commit
336
+ result = subprocess.run(
337
+ ["git", "status", "--porcelain"],
338
+ cwd=state_path,
339
+ capture_output=True,
340
+ text=True,
341
+ check=True,
342
+ )
343
+ if not result.stdout.strip():
344
+ self.logger.debug("No state changes to commit")
345
+ return True
346
+
347
+ # Commit changes
348
+ subprocess.run(
349
+ ["git", "commit", "-m", message],
350
+ cwd=state_path,
351
+ capture_output=True,
352
+ check=True,
353
+ )
354
+ self.logger.info(f"Committed state changes: {message}")
355
+ return True
356
+ except subprocess.CalledProcessError as e:
357
+ self.logger.warning(f"Failed to commit state: {e.stderr}")
358
+ return False
359
+
360
+ def _create_state_bundle(self) -> bytes | None:
361
+ """Create a git bundle of the state directory.
362
+
363
+ Returns:
364
+ Bundle bytes if successful, None otherwise.
365
+ """
366
+ if not self.config.state.enabled:
367
+ return None
368
+
369
+ state_path = Path(self.config.state.path)
370
+ if not state_path.exists():
371
+ return None
372
+
373
+ git_dir = state_path / ".git"
374
+ if not git_dir.exists():
375
+ self.logger.warning("State directory is not a git repository")
376
+ return None
377
+
378
+ try:
379
+ # Create bundle to stdout
380
+ result = subprocess.run(
381
+ ["git", "bundle", "create", "-", "--all"],
382
+ cwd=state_path,
383
+ capture_output=True,
384
+ check=True,
385
+ )
386
+ bundle_data = result.stdout
387
+ self.logger.info(f"Created state bundle: {len(bundle_data)} bytes")
388
+ return bundle_data
389
+ except subprocess.CalledProcessError as e:
390
+ self.logger.warning(f"Failed to create state bundle: {e.stderr}")
391
+ return None
392
+
393
+ async def _create_and_upload_checkpoint(self) -> dict[str, Any] | None:
394
+ """Create a full checkpoint including env snapshots and state bundle.
395
+
396
+ This method:
397
+ 1. Commits any pending state changes
398
+ 2. Creates env snapshots using snapshot_store
399
+ 3. Creates and uploads state bundle as an artifact
400
+ 4. Calls the checkpoint endpoint with all data
401
+
402
+ Returns:
403
+ Checkpoint result dict if successful, None otherwise.
404
+ """
405
+ # Commit state changes first
406
+ self._commit_state(f"Checkpoint at step {self._step_count}")
407
+
408
+ # Create env snapshots
409
+ env_snapshots = await self._create_checkpoint()
410
+ if env_snapshots is None:
411
+ env_snapshots = {}
412
+
413
+ # Create and upload state bundle
414
+ state_artifact_id: str | None = None
415
+ if self.config.state.enabled:
416
+ bundle_data = self._create_state_bundle()
417
+ if bundle_data:
418
+ result = await _upload_artifact(
419
+ data=bundle_data,
420
+ artifact_type="state",
421
+ filename=f"state_step_{self._step_count}.bundle",
422
+ extra={
423
+ "step_number": self._step_count,
424
+ "state_path": self.config.state.path,
425
+ },
426
+ )
427
+ if result:
428
+ state_artifact_id = result.get("artifact_id")
429
+ self.logger.info(f"Uploaded state artifact: {state_artifact_id}")
430
+
431
+ # Upload checkpoint with all data
432
+ checkpoint_result = await _upload_checkpoint(
433
+ step_number=self._step_count,
434
+ env_snapshots=env_snapshots,
435
+ state_artifact_id=state_artifact_id,
436
+ extra={
437
+ "world_name": self.name,
438
+ "world_version": self.get_version(),
439
+ },
440
+ )
441
+
442
+ return checkpoint_result
443
+
198
444
  def get_env(self, alias: str) -> Environment | None:
199
445
  """Get an environment by alias.
200
446
 
@@ -236,6 +482,9 @@ class BaseWorld(ABC, Generic[ConfigT]):
236
482
  Returns:
237
483
  Dict of environment variable name -> value
238
484
 
485
+ Raises:
486
+ ImportError: If a sim environment is configured but package is not installed.
487
+
239
488
  Example:
240
489
  env_vars = self.get_sim_env_vars()
241
490
  # Returns: {"AWS_ENDPOINT_URL": "https://...", "GITEA_URL": "https://...", ...}
@@ -263,7 +512,13 @@ class BaseWorld(ABC, Generic[ConfigT]):
263
512
  env_vars.update(sim_vars)
264
513
  self.logger.info(f"{package_name} env vars: {list(sim_vars.keys())}")
265
514
  except ImportError:
266
- self.logger.debug(f"{package_name} sim package not installed, skipping")
515
+ raise ImportError(
516
+ f"Environment '{env_alias}' is configured but 'plato.sims.{package_name}' "
517
+ f"package is not installed.\n\n"
518
+ f"Install sims packages:\n"
519
+ f' export INDEX_URL="https://__token__:${{PLATO_API_KEY}}@plato.so/api/v2/pypi/sims/simple/"\n'
520
+ f" uv pip install '.[sims]' --extra-index-url $INDEX_URL"
521
+ ) from None
267
522
  except Exception as e:
268
523
  self.logger.warning(f"Failed to get {package_name} env vars: {e}")
269
524
 
@@ -278,6 +533,9 @@ class BaseWorld(ABC, Generic[ConfigT]):
278
533
  Returns:
279
534
  Markdown string with instructions, or empty string if no sims configured.
280
535
 
536
+ Raises:
537
+ ImportError: If a sim environment is configured but package is not installed.
538
+
281
539
  Example:
282
540
  instructions = self.get_sim_instructions()
283
541
  # Returns markdown with LocalStack/Gitea setup instructions
@@ -306,7 +564,13 @@ class BaseWorld(ABC, Generic[ConfigT]):
306
564
  instructions_parts.append(instructions)
307
565
  self.logger.info(f"Added {package_name} instructions to prompt")
308
566
  except ImportError:
309
- self.logger.debug(f"{package_name} sim package not installed, skipping instructions")
567
+ raise ImportError(
568
+ f"Environment '{env_alias}' is configured but 'plato.sims.{package_name}' "
569
+ f"package is not installed.\n\n"
570
+ f"Install sims packages:\n"
571
+ f' export INDEX_URL="https://__token__:${{PLATO_API_KEY}}@plato.so/api/v2/pypi/sims/simple/"\n'
572
+ f" uv pip install '.[sims]' --extra-index-url $INDEX_URL"
573
+ ) from None
310
574
  except Exception as e:
311
575
  self.logger.warning(f"Failed to get {package_name} instructions: {e}")
312
576
 
@@ -363,6 +627,9 @@ The following services are available for your use:
363
627
 
364
628
  self.logger.info(f"Starting world '{self.name}'")
365
629
 
630
+ # Initialize state directory (creates git repo if needed)
631
+ self._init_state_directory()
632
+
366
633
  # Initialize the logging singleton for agents to use
367
634
  if config.callback_url and config.session_id:
368
635
  _init_chronos_logging(
@@ -415,6 +682,13 @@ The following services are available for your use:
415
682
 
416
683
  self.logger.info(f"Step {self._step_count}: done={result.done}")
417
684
 
685
+ # Create checkpoint if enabled and interval matches
686
+ # Note: The checkpoint event is created by the callback endpoint,
687
+ # so we don't need a span wrapper here (would create duplicates)
688
+ if self.config.checkpoint.enabled and self._step_count % self.config.checkpoint.interval == 0:
689
+ self.logger.info(f"Creating checkpoint after step {self._step_count}")
690
+ await self._create_and_upload_checkpoint()
691
+
418
692
  if result.done:
419
693
  break
420
694
 
@@ -72,6 +72,36 @@ class Env:
72
72
  self.required = required
73
73
 
74
74
 
75
+ class StateConfig(BaseModel):
76
+ """Configuration for world state persistence.
77
+
78
+ The state directory is a git-tracked directory that persists across checkpoints.
79
+ At each checkpoint, the state directory is git bundled and uploaded as an artifact.
80
+ On restore, bootstrap.sh downloads and unbundles the state before the world starts.
81
+
82
+ Attributes:
83
+ enabled: Whether to enable state persistence (default: True).
84
+ path: Path to the state directory (default: /state).
85
+ """
86
+
87
+ enabled: bool = True
88
+ path: str = "/state"
89
+
90
+
91
+ class CheckpointConfig(BaseModel):
92
+ """Configuration for automatic checkpointing during world execution.
93
+
94
+ Attributes:
95
+ enabled: Whether to enable automatic checkpoints after steps.
96
+ interval: Create checkpoint every N steps (default: 1 = every step).
97
+ exclude_envs: Environment aliases to exclude from checkpoints (default: ["runtime"]).
98
+ """
99
+
100
+ enabled: bool = True
101
+ interval: int = 1
102
+ exclude_envs: list[str] = Field(default_factory=lambda: ["runtime"])
103
+
104
+
75
105
  class RunConfig(BaseModel):
76
106
  """Base configuration for running a world.
77
107
 
@@ -98,6 +128,7 @@ class RunConfig(BaseModel):
98
128
  session_id: Unique Chronos session identifier
99
129
  callback_url: Callback URL for status updates
100
130
  plato_session: Serialized Plato session for connecting to existing VM session
131
+ checkpoint: Configuration for automatic checkpoints after steps
101
132
  """
102
133
 
103
134
  session_id: str = ""
@@ -108,6 +139,12 @@ class RunConfig(BaseModel):
108
139
  # This is the output of Session.dump() - used to restore session with Session.load()
109
140
  plato_session: SerializedSession | None = None
110
141
 
142
+ # Checkpoint configuration for automatic snapshots after steps
143
+ checkpoint: CheckpointConfig = Field(default_factory=CheckpointConfig)
144
+
145
+ # State persistence configuration
146
+ state: StateConfig = Field(default_factory=StateConfig)
147
+
111
148
  model_config = {"extra": "allow"}
112
149
 
113
150
  @classmethod
@@ -145,7 +182,7 @@ class RunConfig(BaseModel):
145
182
  envs = []
146
183
 
147
184
  # Skip runtime fields
148
- runtime_fields = {"session_id", "callback_url", "all_secrets", "plato_session"}
185
+ runtime_fields = {"session_id", "callback_url", "all_secrets", "plato_session", "checkpoint", "state"}
149
186
 
150
187
  for field_name, prop_schema in properties.items():
151
188
  if field_name in runtime_fields: