plato-sdk-v2 2.1.14__tar.gz → 2.1.15__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 (516) hide show
  1. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/PKG-INFO +1 -1
  2. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/agents/__init__.py +15 -6
  3. plato_sdk_v2-2.1.15/plato/agents/logging.py +401 -0
  4. plato_sdk_v2-2.1.15/plato/agents/runner.py +147 -0
  5. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/worlds/base.py +43 -174
  6. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/worlds/config.py +1 -1
  7. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/pyproject.toml +1 -1
  8. plato_sdk_v2-2.1.15/tests/integration/test_chronos_callback.py +412 -0
  9. plato_sdk_v2-2.1.15/tests/integration/test_code_world.py +67 -0
  10. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/uv.lock +1 -1
  11. plato_sdk_v2-2.1.14/plato/agents/callback.py +0 -332
  12. plato_sdk_v2-2.1.14/plato/agents/runner.py +0 -374
  13. plato_sdk_v2-2.1.14/tests/integration/test_chronos_callback.py +0 -317
  14. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/.claude/agents/sim-creator.md +0 -0
  15. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/.gitignore +0 -0
  16. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/.sandbox.yaml +0 -0
  17. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/BUILDING_SIMS.md +0 -0
  18. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/README.md +0 -0
  19. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/AGENT_SPEC.md +0 -0
  20. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/CLI.md +0 -0
  21. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/GENERATING_SIM_SDKS.md +0 -0
  22. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/SIMULATOR_LIFECYCLE.md +0 -0
  23. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/SIM_CREATOR.md +0 -0
  24. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/cli/agent.md +0 -0
  25. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/cli/flows.md +0 -0
  26. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/cli/pm.md +0 -0
  27. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/cli/sandbox.md +0 -0
  28. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/cli/sims.md +0 -0
  29. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/cli/world.md +0 -0
  30. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/skills/README.md +0 -0
  31. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/skills/SIM-CREATION-ARCHITECTURE.md +0 -0
  32. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/skills/sim-config-writer/SKILL.md +0 -0
  33. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/skills/sim-creator/SKILL.md +0 -0
  34. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/skills/sim-debugger/SKILL.md +0 -0
  35. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/skills/sim-flow-writer/SKILL.md +0 -0
  36. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/skills/sim-research/SKILL.md +0 -0
  37. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/skills/sim-reviewer/SKILL.md +0 -0
  38. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/skills/sim-sandbox-operator/SKILL.md +0 -0
  39. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/docs/skills/sim-validator/SKILL.md +0 -0
  40. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/__init__.py +0 -0
  41. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/__init__.py +0 -0
  42. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/__init__.py +0 -0
  43. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/__init__.py +0 -0
  44. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/agent_artifacts/__init__.py +0 -0
  45. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/agent_artifacts/archive_agent_artifact.py +0 -0
  46. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/agent_artifacts/create_agent_artifact.py +0 -0
  47. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/agent_artifacts/get_agent_artifact_by_public_id.py +0 -0
  48. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/agent_artifacts/get_agent_artifacts.py +0 -0
  49. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/cluster/__init__.py +0 -0
  50. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/cluster/cleanup_stale_vms.py +0 -0
  51. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/cluster/get_dispatchers.py +0 -0
  52. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/cluster/get_nodes_status.py +0 -0
  53. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/cluster/get_snapshot_lineage.py +0 -0
  54. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/cluster/get_snapshots_status.py +0 -0
  55. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/cluster/pause_resume_dispatchers.py +0 -0
  56. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/cluster/prefetch_snapshot.py +0 -0
  57. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/__init__.py +0 -0
  58. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/backup.py +0 -0
  59. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/cleanup.py +0 -0
  60. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/close.py +0 -0
  61. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/close_async.py +0 -0
  62. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/create.py +0 -0
  63. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/create_batch.py +0 -0
  64. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/create_simulator.py +0 -0
  65. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/evaluate_session.py +0 -0
  66. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/generate_mutations.py +0 -0
  67. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/generate_mutations_single.py +0 -0
  68. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/get_active_session.py +0 -0
  69. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/get_app_sim_worker_info.py +0 -0
  70. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/get_cdp_url.py +0 -0
  71. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/get_flows.py +0 -0
  72. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/get_interface_worker_info.py +0 -0
  73. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/get_job_info.py +0 -0
  74. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/get_job_status.py +0 -0
  75. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/get_job_worker_info.py +0 -0
  76. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/get_proxy_url.py +0 -0
  77. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/get_public_url.py +0 -0
  78. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/get_simulator_by_name.py +0 -0
  79. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/get_simulators.py +0 -0
  80. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/get_state.py +0 -0
  81. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/get_worker_ready.py +0 -0
  82. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/log_state_mutation.py +0 -0
  83. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/rescore_simulator_sessions.py +0 -0
  84. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/reset.py +0 -0
  85. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/score.py +0 -0
  86. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/send_heartbeat.py +0 -0
  87. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/env/update_simulator.py +0 -0
  88. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/evals/__init__.py +0 -0
  89. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/evals/create_test_case_review.py +0 -0
  90. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/evals/evaluate_python.py +0 -0
  91. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/evals/get_all_test_case_reviews.py +0 -0
  92. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/evals/get_scores_by_user.py +0 -0
  93. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/evals/get_scoring.py +0 -0
  94. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/evals/get_test_case_review.py +0 -0
  95. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/evals/human_in_the_loop_scoring.py +0 -0
  96. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/evals/start_eval_from_git.py +0 -0
  97. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/__init__.py +0 -0
  98. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/create_gitea_repository.py +0 -0
  99. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/create_simulator_repository.py +0 -0
  100. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/delete_gitea_repository.py +0 -0
  101. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/get_accessible_simulators.py +0 -0
  102. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/get_gitea_credentials.py +0 -0
  103. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/get_gitea_repository.py +0 -0
  104. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/get_my_gitea_info.py +0 -0
  105. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/get_my_repositories.py +0 -0
  106. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/get_repository_branches.py +0 -0
  107. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/get_repository_contents.py +0 -0
  108. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/get_simulator_file_content.py +0 -0
  109. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/get_simulator_repository.py +0 -0
  110. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/get_simulator_repository_branches.py +0 -0
  111. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/gitea/get_simulator_repository_contents.py +0 -0
  112. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/jobs/__init__.py +0 -0
  113. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/jobs/get_job_by_id.py +0 -0
  114. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/jobs/get_jobs_by_group_id.py +0 -0
  115. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/jobs/get_keepalive_jobs.py +0 -0
  116. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/jobs/list_jobs.py +0 -0
  117. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/jobs/update_job_status.py +0 -0
  118. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/organization/__init__.py +0 -0
  119. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/organization/create_annotator_assignment.py +0 -0
  120. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/organization/create_org_api_key.py +0 -0
  121. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/organization/create_org_policy.py +0 -0
  122. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/organization/delete_org_api_key.py +0 -0
  123. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/organization/delete_org_policy.py +0 -0
  124. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/organization/get_annotator_assignments.py +0 -0
  125. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/organization/get_org_api_key_policies.py +0 -0
  126. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/organization/get_org_api_keys.py +0 -0
  127. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/organization/get_org_policies.py +0 -0
  128. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/organization/get_organization_concurrency_status.py +0 -0
  129. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/organization/get_organization_members.py +0 -0
  130. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/organization/update_annotator_assignment_stage.py +0 -0
  131. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/organization/update_organization_concurrency_limit.py +0 -0
  132. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/queue/__init__.py +0 -0
  133. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/queue/get_queue_status.py +0 -0
  134. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/queue/get_vm_detail.py +0 -0
  135. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/queue/get_vms.py +0 -0
  136. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/queue/get_workers.py +0 -0
  137. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/sandbox/__init__.py +0 -0
  138. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/sandbox/checkpoint_vm.py +0 -0
  139. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/sandbox/close_vm.py +0 -0
  140. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/sandbox/create_vm.py +0 -0
  141. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/sandbox/execute_ssh_command.py +0 -0
  142. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/sandbox/get_operation_events.py +0 -0
  143. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/sandbox/healthy_services.py +0 -0
  144. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/sandbox/healthy_worker.py +0 -0
  145. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/sandbox/save_vm_snapshot.py +0 -0
  146. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/sandbox/setup_root_access.py +0 -0
  147. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/sandbox/setup_sandbox.py +0 -0
  148. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/sandbox/start_worker.py +0 -0
  149. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/__init__.py +0 -0
  150. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/analyze_labels.py +0 -0
  151. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/archive_session.py +0 -0
  152. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/archive_session_logs_endpoint.py +0 -0
  153. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/create_from_labels.py +0 -0
  154. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/create_session_from_browser.py +0 -0
  155. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/create_session_from_env_recording.py +0 -0
  156. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/create_session_from_har.py +0 -0
  157. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_env_recording.py +0 -0
  158. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_grouped_replay_sessions.py +0 -0
  159. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_logs_status.py +0 -0
  160. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_network_requests.py +0 -0
  161. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_next_session_for_annotator.py +0 -0
  162. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_public_benchmark_sessions.py +0 -0
  163. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_replay_score_data.py +0 -0
  164. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_rrweb_actions.py +0 -0
  165. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_rrweb_events.py +0 -0
  166. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_screen_recording.py +0 -0
  167. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_session.py +0 -0
  168. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_session_replays.py +0 -0
  169. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_sessions.py +0 -0
  170. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_sessions_for_archival.py +0 -0
  171. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/get_ui_events.py +0 -0
  172. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/restore_session_logs.py +0 -0
  173. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/score_session_with_config.py +0 -0
  174. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/search_sessions_by_ids.py +0 -0
  175. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/set_session_output.py +0 -0
  176. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/update_session_public.py +0 -0
  177. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/session/update_session_testcase.py +0 -0
  178. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/__init__.py +0 -0
  179. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/add_simulator_review.py +0 -0
  180. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/batch_create_test_cases.py +0 -0
  181. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/batch_get_artifact_metadata.py +0 -0
  182. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/get_all_simulators_info.py +0 -0
  183. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/get_db_config.py +0 -0
  184. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/get_env_flows.py +0 -0
  185. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/get_plato_config.py +0 -0
  186. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/get_sessions_batch_by_job_groups.py +0 -0
  187. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/get_sessions_by_job_group.py +0 -0
  188. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/get_simulator_by_name.py +0 -0
  189. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/get_simulator_id.py +0 -0
  190. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/get_simulator_info.py +0 -0
  191. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/get_simulator_version_details.py +0 -0
  192. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/get_simulator_versions.py +0 -0
  193. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/get_start_path.py +0 -0
  194. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/get_version_by_tag.py +0 -0
  195. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/list_simulators.py +0 -0
  196. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/list_simulators_by_org.py +0 -0
  197. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/list_simulators_status.py +0 -0
  198. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/register.py +0 -0
  199. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/update_simulator.py +0 -0
  200. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/update_simulator_status.py +0 -0
  201. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/simulator/update_tag.py +0 -0
  202. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/__init__.py +0 -0
  203. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/archive_organization_test_case_assignments.py +0 -0
  204. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/archive_organization_testcase.py +0 -0
  205. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/archive_testcase.py +0 -0
  206. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/assign_testcase_to_organizations.py +0 -0
  207. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/auto_verify_testcase.py +0 -0
  208. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/bulk_archive_testcases.py +0 -0
  209. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/convert_text_to_structured_data.py +0 -0
  210. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/create_testcase.py +0 -0
  211. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/create_testcase_set.py +0 -0
  212. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/delete_testcase_set.py +0 -0
  213. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/filter_human_recorder_testcases.py +0 -0
  214. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/generate_outcome_schema.py +0 -0
  215. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/generate_prediction.py +0 -0
  216. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/generate_prediction_from_steps.py +0 -0
  217. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/generate_scoring_config_from_sessions.py +0 -0
  218. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/generate_state_mutations_config_route.py +0 -0
  219. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/get_human_recorder_tab_counts.py +0 -0
  220. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/get_human_recorder_testcases.py +0 -0
  221. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/get_merged_mutations.py +0 -0
  222. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/get_mutation_groups_for_testcase.py +0 -0
  223. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/get_next_testcase_for_scoring.py +0 -0
  224. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/get_organization_test_case_assignments.py +0 -0
  225. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/get_testcase.py +0 -0
  226. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/get_testcase_metadata_for_scoring.py +0 -0
  227. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/get_testcase_sets.py +0 -0
  228. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/get_testcases.py +0 -0
  229. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/get_testcases_in_set.py +0 -0
  230. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/mark_organization_test_case_completed.py +0 -0
  231. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/update_testcase.py +0 -0
  232. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v1/testcases/version_bump_testcase.py +0 -0
  233. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/__init__.py +0 -0
  234. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/agents/__init__.py +0 -0
  235. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/agents/get_agent_ecr_token.py +0 -0
  236. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/agents/get_agent_schema.py +0 -0
  237. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/agents/get_agent_versions.py +0 -0
  238. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/agents/import_agent.py +0 -0
  239. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/agents/list_docker_agents.py +0 -0
  240. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/agents/lookup_agent_version.py +0 -0
  241. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/agents/register_docker_agent.py +0 -0
  242. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/artifacts/__init__.py +0 -0
  243. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/artifacts/get_artifact.py +0 -0
  244. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/chronos/__init__.py +0 -0
  245. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/chronos/launch_job.py +0 -0
  246. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/chronos_packages/__init__.py +0 -0
  247. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/chronos_packages/get_package_versions.py +0 -0
  248. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/chronos_packages/list_chronos_packages.py +0 -0
  249. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/chronos_packages/lookup_package_version.py +0 -0
  250. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/chronos_packages/register_chronos_package.py +0 -0
  251. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/chronos_packages/upload_chronos_package.py +0 -0
  252. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/cluster/__init__.py +0 -0
  253. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/cluster/get_node_config.py +0 -0
  254. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/__init__.py +0 -0
  255. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/checkpoint.py +0 -0
  256. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/close.py +0 -0
  257. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/connect_routing_info.py +0 -0
  258. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/connect_url.py +0 -0
  259. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/disk_snapshot.py +0 -0
  260. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/execute.py +0 -0
  261. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/get_flows.py +0 -0
  262. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/get_plato_config.py +0 -0
  263. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/log_for_job.py +0 -0
  264. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/make.py +0 -0
  265. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/public_url.py +0 -0
  266. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/reset.py +0 -0
  267. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/set_date.py +0 -0
  268. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/setup_sandbox.py +0 -0
  269. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/snapshot.py +0 -0
  270. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/snapshot_store.py +0 -0
  271. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/state.py +0 -0
  272. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/jobs/wait_for_ready.py +0 -0
  273. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/pypi/__init__.py +0 -0
  274. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/pypi/download_package.py +0 -0
  275. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/pypi/get_package_schema.py +0 -0
  276. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/pypi/package_index.py +0 -0
  277. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/pypi/simple_index.py +0 -0
  278. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/pypi/upload_package.py +0 -0
  279. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/releases/__init__.py +0 -0
  280. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/releases/create.py +0 -0
  281. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/releases/deploy.py +0 -0
  282. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/releases/get.py +0 -0
  283. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/releases/handle_get_existing_public_ids.py +0 -0
  284. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/releases/handle_import.py +0 -0
  285. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/releases/list_releases.py +0 -0
  286. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/releases/prep_release_assigned_testcases.py +0 -0
  287. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/releases/update.py +0 -0
  288. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/__init__.py +0 -0
  289. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/checkpoint.py +0 -0
  290. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/close.py +0 -0
  291. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/disk_snapshot.py +0 -0
  292. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/evaluate.py +0 -0
  293. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/execute.py +0 -0
  294. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/get_connect_url.py +0 -0
  295. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/get_presigned_url.py +0 -0
  296. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/get_public_url.py +0 -0
  297. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/get_s3_content.py +0 -0
  298. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/get_session_details.py +0 -0
  299. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/get_session_documents.py +0 -0
  300. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/get_session_flows.py +0 -0
  301. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/get_session_logs.py +0 -0
  302. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/get_session_plato_config.py +0 -0
  303. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/heartbeat.py +0 -0
  304. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/list_jobs.py +0 -0
  305. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/list_sessions.py +0 -0
  306. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/log_job_mutation.py +0 -0
  307. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/make.py +0 -0
  308. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/reset.py +0 -0
  309. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/set_date.py +0 -0
  310. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/setup_sandbox.py +0 -0
  311. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/snapshot.py +0 -0
  312. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/snapshot_store.py +0 -0
  313. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/state.py +0 -0
  314. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/upload_session_documents.py +0 -0
  315. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/sessions/wait_for_ready.py +0 -0
  316. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/user/__init__.py +0 -0
  317. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/v2/user/get_current_user.py +0 -0
  318. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/version/__init__.py +0 -0
  319. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/api/version/check.py +0 -0
  320. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/client.py +0 -0
  321. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/errors.py +0 -0
  322. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/models/__init__.py +0 -0
  323. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_generated/py.typed +0 -0
  324. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_sims_generator/__init__.py +0 -0
  325. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_sims_generator/cli.py +0 -0
  326. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_sims_generator/parser.py +0 -0
  327. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_sims_generator/python.py +0 -0
  328. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_sims_generator/templates/python/api_init.py.jinja +0 -0
  329. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_sims_generator/templates/python/client.py.jinja +0 -0
  330. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_sims_generator/templates/python/endpoint.py.jinja +0 -0
  331. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_sims_generator/templates/python/errors.py.jinja +0 -0
  332. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_sims_generator/templates/python/package_init.py.jinja +0 -0
  333. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_sims_generator/templates/python/tag_init.py.jinja +0 -0
  334. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/_sims_generator/templates/python/version_init.py.jinja +0 -0
  335. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/agents/base.py +0 -0
  336. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/agents/build.py +0 -0
  337. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/agents/config.py +0 -0
  338. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/agents/trajectory.py +0 -0
  339. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/__init__.py +0 -0
  340. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/__init__.py +0 -0
  341. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/agents/__init__.py +0 -0
  342. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/agents/create_agent.py +0 -0
  343. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/agents/delete_agent.py +0 -0
  344. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/agents/get_agent.py +0 -0
  345. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/agents/get_agent_schema.py +0 -0
  346. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/agents/get_agent_versions.py +0 -0
  347. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/agents/list_agents.py +0 -0
  348. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/agents/lookup_agent.py +0 -0
  349. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/auth/__init__.py +0 -0
  350. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/auth/debug_auth_api_auth_debug_get.py +0 -0
  351. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/auth/get_auth_status_api_auth_status_get.py +0 -0
  352. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/auth/get_current_user_route_api_auth_me_get.py +0 -0
  353. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/callback/__init__.py +0 -0
  354. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/callback/push_agent_logs.py +0 -0
  355. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/callback/update_agent_status.py +0 -0
  356. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/callback/upload_artifacts.py +0 -0
  357. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/callback/upload_logs_zip.py +0 -0
  358. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/callback/upload_trajectory.py +0 -0
  359. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/default/__init__.py +0 -0
  360. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/default/health.py +0 -0
  361. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/jobs/__init__.py +0 -0
  362. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/jobs/launch_job.py +0 -0
  363. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/registry/__init__.py +0 -0
  364. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/registry/get_agent_schema_api_registry_agents__agent_name__schema_get.py +0 -0
  365. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/registry/get_agent_versions_api_registry_agents__agent_name__versions_get.py +0 -0
  366. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/registry/get_world_schema_api_registry_worlds__package_name__schema_get.py +0 -0
  367. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/registry/get_world_versions_api_registry_worlds__package_name__versions_get.py +0 -0
  368. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/registry/list_registry_agents_api_registry_agents_get.py +0 -0
  369. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/registry/list_registry_worlds_api_registry_worlds_get.py +0 -0
  370. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/runtimes/__init__.py +0 -0
  371. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/runtimes/create_runtime.py +0 -0
  372. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/runtimes/delete_runtime.py +0 -0
  373. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/runtimes/get_runtime.py +0 -0
  374. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/runtimes/list_runtimes.py +0 -0
  375. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/runtimes/test_runtime.py +0 -0
  376. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/secrets/__init__.py +0 -0
  377. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/secrets/create_secret.py +0 -0
  378. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/secrets/delete_secret.py +0 -0
  379. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/secrets/get_secret.py +0 -0
  380. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/secrets/list_secrets.py +0 -0
  381. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/secrets/update_secret.py +0 -0
  382. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/sessions/__init__.py +0 -0
  383. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/sessions/get_session.py +0 -0
  384. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/sessions/get_session_logs.py +0 -0
  385. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/sessions/get_session_logs_download.py +0 -0
  386. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/sessions/list_sessions.py +0 -0
  387. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/status/__init__.py +0 -0
  388. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/status/get_status_api_status_get.py +0 -0
  389. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/status/get_version_info_api_version_get.py +0 -0
  390. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/templates/__init__.py +0 -0
  391. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/templates/create_template.py +0 -0
  392. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/templates/delete_template.py +0 -0
  393. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/templates/get_template.py +0 -0
  394. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/templates/list_templates.py +0 -0
  395. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/templates/update_template.py +0 -0
  396. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/trajectories/__init__.py +0 -0
  397. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/trajectories/get_trajectory.py +0 -0
  398. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/trajectories/list_trajectories.py +0 -0
  399. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/worlds/__init__.py +0 -0
  400. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/worlds/create_world.py +0 -0
  401. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/worlds/delete_world.py +0 -0
  402. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/worlds/get_world.py +0 -0
  403. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/api/worlds/list_worlds.py +0 -0
  404. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/client.py +0 -0
  405. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/errors.py +0 -0
  406. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/models/__init__.py +0 -0
  407. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/chronos/py.typed +0 -0
  408. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/py.typed +0 -0
  409. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/sims/README.md +0 -0
  410. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/sims/__init__.py +0 -0
  411. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/sims/agent_helpers.py +0 -0
  412. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/sims/cli.py +0 -0
  413. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/sims/generate_clients.py +0 -0
  414. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/sims/registry.py +0 -0
  415. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/__init__.py +0 -0
  416. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/audit_ui.py +0 -0
  417. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/cli/__init__.py +0 -0
  418. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/cli/agent.py +0 -0
  419. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/cli/main.py +0 -0
  420. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/cli/pm.py +0 -0
  421. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/cli/sandbox.py +0 -0
  422. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/cli/ssh.py +0 -0
  423. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/cli/utils.py +0 -0
  424. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/cli/world.py +0 -0
  425. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/cli.py +0 -0
  426. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/config.py +0 -0
  427. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/examples/doordash_tasks.py +0 -0
  428. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/examples/loadtest.py +0 -0
  429. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/examples/test_env.py +0 -0
  430. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/examples/test_env_custom_browser.py +0 -0
  431. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/examples/test_env_sync.py +0 -0
  432. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/examples/test_reuse_env.py +0 -0
  433. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/examples/test_run.py +0 -0
  434. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/exceptions.py +0 -0
  435. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/README.md +0 -0
  436. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/api-client.js +0 -0
  437. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/background.js +0 -0
  438. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/build-sdk.js +0 -0
  439. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/content.js +0 -0
  440. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/manifest.json +0 -0
  441. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/offscreen.html +0 -0
  442. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/offscreen.js +0 -0
  443. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/options.html +0 -0
  444. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/options.js +0 -0
  445. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/package-lock.json +0 -0
  446. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/package.json +0 -0
  447. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/plato-sdk-bundle.js +0 -0
  448. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/plato-sdk-bundle.js.map +0 -0
  449. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/popup.html +0 -0
  450. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/popup.js +0 -0
  451. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/review-panel.html +0 -0
  452. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/review-panel.js +0 -0
  453. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/review-success.html +0 -0
  454. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/review-success.js +0 -0
  455. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/session-active.html +0 -0
  456. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/session-active.js +0 -0
  457. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/session-ended.html +0 -0
  458. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/session-ended.js +0 -0
  459. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/session-setup.html +0 -0
  460. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/session-setup.js +0 -0
  461. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/sessions.html +0 -0
  462. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/sessions.js +0 -0
  463. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/extensions/envgen-recorder/styles.css +0 -0
  464. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/flow_executor.py +0 -0
  465. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/models/__init__.py +0 -0
  466. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/models/build_models.py +0 -0
  467. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/models/env.py +0 -0
  468. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/models/flow.py +0 -0
  469. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/models/sandbox.py +0 -0
  470. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/models/task.py +0 -0
  471. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/sandbox_sdk.py +0 -0
  472. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/sdk.py +0 -0
  473. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/sync_env.py +0 -0
  474. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/sync_flow_executor.py +0 -0
  475. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/sync_sdk.py +0 -0
  476. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v1/utils/proxytunnel.py +0 -0
  477. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/__init__.py +0 -0
  478. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/async_/__init__.py +0 -0
  479. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/async_/artifact.py +0 -0
  480. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/async_/client.py +0 -0
  481. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/async_/environment.py +0 -0
  482. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/async_/flow_executor.py +0 -0
  483. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/async_/session.py +0 -0
  484. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/models.py +0 -0
  485. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/sync/__init__.py +0 -0
  486. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/sync/artifact.py +0 -0
  487. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/sync/client.py +0 -0
  488. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/sync/environment.py +0 -0
  489. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/sync/flow_executor.py +0 -0
  490. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/sync/session.py +0 -0
  491. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/types.py +0 -0
  492. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/utils/__init__.py +0 -0
  493. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/utils/db_cleanup.py +0 -0
  494. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/utils/models.py +0 -0
  495. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/v2/utils/proxy_tunnel.py +0 -0
  496. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/worlds/README.md +0 -0
  497. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/worlds/__init__.py +0 -0
  498. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/worlds/build_hook.py +0 -0
  499. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/plato/worlds/runner.py +0 -0
  500. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/scripts/get_all_artifact_targets.py +0 -0
  501. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/__init__.py +0 -0
  502. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/integration/__init__.py +0 -0
  503. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/integration/conftest.py +0 -0
  504. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/integration/test_browser_agent.py +0 -0
  505. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/integration/test_cleanup_snapshot.py +0 -0
  506. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/integration/test_harbor_agent_runner.py +0 -0
  507. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/sims/__init__.py +0 -0
  508. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/sims/conftest.py +0 -0
  509. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/sims/test_agent_helpers.py +0 -0
  510. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/test_heartbeat_keepalive.py +0 -0
  511. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/test_session_serialization.py +0 -0
  512. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/test_set_date.py +0 -0
  513. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/test_v2_imports.py +0 -0
  514. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/test_v2_multisim_integration.py +0 -0
  515. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/test_v2_session.py +0 -0
  516. {plato_sdk_v2-2.1.14 → plato_sdk_v2-2.1.15}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plato-sdk-v2
3
- Version: 2.1.14
3
+ Version: 2.1.15
4
4
  Summary: Python SDK for the Plato API
5
5
  Author-email: Plato <support@plato.so>
6
6
  License-Expression: MIT
@@ -69,8 +69,7 @@ __all__ = [
69
69
  "get_agent",
70
70
  "get_registered_agents",
71
71
  # Runner
72
- "AgentRunner",
73
- "AgentRunResult",
72
+ "run_agent",
74
73
  # Trajectory (ATIF)
75
74
  "Trajectory",
76
75
  "Step",
@@ -81,8 +80,12 @@ __all__ = [
81
80
  "Metrics",
82
81
  "FinalMetrics",
83
82
  "SCHEMA_VERSION",
84
- # Callback
85
- "ChronosCallback",
83
+ # Logging
84
+ "init_logging",
85
+ "span",
86
+ "log_event",
87
+ "upload_artifacts",
88
+ "reset_logging",
86
89
  ]
87
90
 
88
91
  from plato.agents.base import (
@@ -93,9 +96,15 @@ from plato.agents.base import (
93
96
  register_agent,
94
97
  )
95
98
  from plato.agents.build import BuildConfig, load_build_config
96
- from plato.agents.callback import ChronosCallback
97
99
  from plato.agents.config import AgentConfig, Secret
98
- from plato.agents.runner import AgentRunner, AgentRunResult
100
+ from plato.agents.logging import (
101
+ init_logging,
102
+ log_event,
103
+ reset_logging,
104
+ span,
105
+ upload_artifacts,
106
+ )
107
+ from plato.agents.runner import run_agent
99
108
  from plato.agents.trajectory import (
100
109
  SCHEMA_VERSION,
101
110
  Agent,
@@ -0,0 +1,401 @@
1
+ """Chronos logging utilities.
2
+
3
+ Simple singleton-based logging for Chronos events and spans.
4
+
5
+ Usage:
6
+ from plato.agents.logging import init_logging, span, log_event, upload_logs
7
+
8
+ # Initialize once (typically in world setup)
9
+ init_logging(
10
+ callback_url="http://chronos/api/callback",
11
+ session_id="session-123",
12
+ )
13
+
14
+ # Use spans anywhere - parent tracking is automatic
15
+ async with span("clone_repo") as s:
16
+ s.log("Cloning...")
17
+
18
+ async with span("checkout"): # Automatically nested under clone_repo
19
+ s.log("Checking out...")
20
+
21
+ # Log events - parent is automatically the current span
22
+ await log_event(span_type="my_event", content="Something happened")
23
+
24
+ # Upload artifacts (zip of directory)
25
+ await upload_artifacts(dir_path="/path/to/logs")
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ import base64
31
+ import io
32
+ import logging
33
+ import zipfile
34
+ from datetime import datetime, timezone
35
+ from pathlib import Path
36
+ from typing import Any
37
+ from uuid import uuid4
38
+
39
+ import httpx
40
+
41
+ logger = logging.getLogger(__name__)
42
+
43
+
44
+ class _ChronosLogger:
45
+ """Internal singleton logger for Chronos events."""
46
+
47
+ _instance: _ChronosLogger | None = None
48
+
49
+ def __init__(
50
+ self,
51
+ callback_url: str,
52
+ session_id: str,
53
+ parent_event_id: str | None = None,
54
+ ):
55
+ self.callback_url = callback_url.rstrip("/")
56
+ self.session_id = session_id
57
+ self.parent_event_id = parent_event_id
58
+ self._current_span_id: str | None = None
59
+ self._enabled = bool(callback_url and session_id)
60
+
61
+ @property
62
+ def enabled(self) -> bool:
63
+ return self._enabled
64
+
65
+ @property
66
+ def current_parent_id(self) -> str | None:
67
+ """Get the current parent ID (current span or root parent)."""
68
+ return self._current_span_id or self.parent_event_id
69
+
70
+ async def log_event(
71
+ self,
72
+ span_type: str,
73
+ content: str = "",
74
+ source: str = "agent",
75
+ log_type: str | None = None,
76
+ step_number: int | None = None,
77
+ extra: dict[str, Any] | None = None,
78
+ event_id: str | None = None,
79
+ parent_id: str | None = None,
80
+ started_at: str | None = None,
81
+ ended_at: str | None = None,
82
+ ) -> bool:
83
+ """Log an event to Chronos."""
84
+ if not self._enabled:
85
+ return False
86
+
87
+ try:
88
+ async with httpx.AsyncClient(timeout=30.0) as client:
89
+ response = await client.post(
90
+ f"{self.callback_url}/event",
91
+ json={
92
+ "session_id": self.session_id,
93
+ "span_type": span_type,
94
+ "content": content,
95
+ "source": source,
96
+ "log_type": log_type,
97
+ "step_number": step_number,
98
+ "extra": extra,
99
+ "event_id": event_id,
100
+ "parent_id": parent_id,
101
+ "started_at": started_at,
102
+ "ended_at": ended_at,
103
+ },
104
+ )
105
+ if response.status_code == 200:
106
+ return True
107
+ else:
108
+ logger.warning(f"Failed to log event: {response.status_code} {response.text}")
109
+ return False
110
+ except Exception as e:
111
+ logger.warning(f"Failed to log event to Chronos: {e}")
112
+ return False
113
+
114
+
115
+ class SpanContext:
116
+ """Context manager for logging spans with automatic timing and nesting."""
117
+
118
+ def __init__(
119
+ self,
120
+ name: str,
121
+ span_type: str = "span",
122
+ source: str = "agent",
123
+ extra: dict[str, Any] | None = None,
124
+ ):
125
+ self._name = name
126
+ self._span_type = span_type
127
+ self._source = source
128
+ self._extra = extra or {}
129
+ self._event_id: str | None = None
130
+ self._started_at: datetime | None = None
131
+ self._child_logs: list[str] = []
132
+ self._previous_span_id: str | None = None
133
+
134
+ async def __aenter__(self) -> SpanContext:
135
+ """Log span start and set as current span."""
136
+ self._started_at = datetime.now(timezone.utc)
137
+ self._event_id = str(uuid4())
138
+
139
+ chronos = _ChronosLogger._instance
140
+ if chronos and chronos.enabled:
141
+ # Save previous span and set self as current
142
+ self._previous_span_id = chronos._current_span_id
143
+ parent_id = chronos.current_parent_id
144
+
145
+ await chronos.log_event(
146
+ span_type=self._span_type,
147
+ content=f"{self._name} started",
148
+ source=self._source,
149
+ event_id=self._event_id,
150
+ parent_id=parent_id,
151
+ started_at=self._started_at.isoformat(),
152
+ extra=self._extra,
153
+ )
154
+
155
+ # Set self as the current span for child events
156
+ chronos._current_span_id = self._event_id
157
+
158
+ return self
159
+
160
+ async def __aexit__(self, exc_type, exc_val, exc_tb) -> None:
161
+ """Log span end and restore previous span."""
162
+ ended_at = datetime.now(timezone.utc)
163
+ status = "failed" if exc_type else "completed"
164
+
165
+ chronos = _ChronosLogger._instance
166
+ if chronos and chronos.enabled:
167
+ # Restore previous span
168
+ chronos._current_span_id = self._previous_span_id
169
+ parent_id = self._previous_span_id or chronos.parent_event_id
170
+
171
+ # Update extra with any child logs
172
+ extra = {**self._extra}
173
+ if self._child_logs:
174
+ extra["logs"] = self._child_logs
175
+ if exc_type:
176
+ extra["error"] = str(exc_val)
177
+
178
+ await chronos.log_event(
179
+ span_type=self._span_type,
180
+ content=f"{self._name} {status}",
181
+ source=self._source,
182
+ event_id=self._event_id,
183
+ parent_id=parent_id,
184
+ started_at=self._started_at.isoformat() if self._started_at else None,
185
+ ended_at=ended_at.isoformat(),
186
+ extra=extra,
187
+ )
188
+
189
+ def log(self, message: str) -> None:
190
+ """Add a log message to the span."""
191
+ self._child_logs.append(message)
192
+ logger.info(f"[{self._name}] {message}")
193
+
194
+ def set_extra(self, data: dict[str, Any]) -> None:
195
+ """Update the span's extra data."""
196
+ self._extra.update(data)
197
+
198
+ @property
199
+ def event_id(self) -> str | None:
200
+ """Get the span's event ID (available after entering context)."""
201
+ return self._event_id
202
+
203
+
204
+ class _NoOpSpanContext:
205
+ """No-op span context when logging is not initialized."""
206
+
207
+ def __init__(self, name: str, **kwargs):
208
+ self._name = name
209
+ self._event_id = str(uuid4())
210
+
211
+ async def __aenter__(self) -> _NoOpSpanContext:
212
+ return self
213
+
214
+ async def __aexit__(self, exc_type, exc_val, exc_tb) -> None:
215
+ pass
216
+
217
+ def log(self, message: str) -> None:
218
+ logger.debug(f"[{self._name}] {message}")
219
+
220
+ def set_extra(self, data: dict[str, Any]) -> None:
221
+ pass
222
+
223
+ @property
224
+ def event_id(self) -> str | None:
225
+ return self._event_id
226
+
227
+
228
+ # =============================================================================
229
+ # Public API
230
+ # =============================================================================
231
+
232
+
233
+ def init_logging(
234
+ callback_url: str,
235
+ session_id: str,
236
+ parent_event_id: str | None = None,
237
+ ) -> None:
238
+ """Initialize Chronos logging.
239
+
240
+ Call this once at startup (e.g., in world.run()).
241
+
242
+ Args:
243
+ callback_url: Chronos callback URL (e.g., http://chronos/api/callback)
244
+ session_id: Chronos session ID
245
+ parent_event_id: Optional root parent event ID (e.g., step ID)
246
+ """
247
+ _ChronosLogger._instance = _ChronosLogger(
248
+ callback_url=callback_url,
249
+ session_id=session_id,
250
+ parent_event_id=parent_event_id,
251
+ )
252
+ logger.info(f"Chronos logging initialized: session={session_id}")
253
+
254
+
255
+ def set_parent_event_id(parent_event_id: str | None) -> None:
256
+ """Set the root parent event ID.
257
+
258
+ Useful for updating the parent when entering a new step.
259
+ """
260
+ if _ChronosLogger._instance:
261
+ _ChronosLogger._instance.parent_event_id = parent_event_id
262
+
263
+
264
+ def span(
265
+ name: str,
266
+ span_type: str = "span",
267
+ source: str = "agent",
268
+ extra: dict[str, Any] | None = None,
269
+ ) -> SpanContext | _NoOpSpanContext:
270
+ """Create a span context manager.
271
+
272
+ Usage:
273
+ async with span("my_operation") as s:
274
+ s.log("Starting...")
275
+ # nested spans work automatically
276
+ async with span("sub_operation"):
277
+ ...
278
+
279
+ Args:
280
+ name: Span name/description
281
+ span_type: Event type for the span
282
+ source: Event source (agent, world, system)
283
+ extra: Additional data
284
+
285
+ Returns:
286
+ SpanContext (or NoOpSpanContext if logging not initialized)
287
+ """
288
+ if _ChronosLogger._instance and _ChronosLogger._instance.enabled:
289
+ return SpanContext(
290
+ name=name,
291
+ span_type=span_type,
292
+ source=source,
293
+ extra=extra,
294
+ )
295
+ else:
296
+ return _NoOpSpanContext(name=name)
297
+
298
+
299
+ async def log_event(
300
+ span_type: str,
301
+ content: str = "",
302
+ source: str = "agent",
303
+ log_type: str | None = None,
304
+ extra: dict[str, Any] | None = None,
305
+ parent_id: str | None = None,
306
+ ) -> bool:
307
+ """Log a single event to Chronos.
308
+
309
+ For spans with timing, use span() instead.
310
+ """
311
+ chronos = _ChronosLogger._instance
312
+ if not chronos or not chronos.enabled:
313
+ return False
314
+
315
+ return await chronos.log_event(
316
+ span_type=span_type,
317
+ content=content,
318
+ source=source,
319
+ log_type=log_type,
320
+ extra=extra,
321
+ parent_id=parent_id or chronos.current_parent_id,
322
+ )
323
+
324
+
325
+ def is_logging_enabled() -> bool:
326
+ """Check if Chronos logging is enabled."""
327
+ return _ChronosLogger._instance is not None and _ChronosLogger._instance.enabled
328
+
329
+
330
+ def reset_logging() -> None:
331
+ """Reset the logger (mainly for testing)."""
332
+ _ChronosLogger._instance = None
333
+
334
+
335
+ # =============================================================================
336
+ # Logs Upload
337
+ # =============================================================================
338
+
339
+
340
+ def zip_directory(dir_path: str) -> bytes:
341
+ """Zip an entire directory.
342
+
343
+ Args:
344
+ dir_path: Path to the directory
345
+
346
+ Returns:
347
+ Zip file contents as bytes.
348
+ """
349
+ path = Path(dir_path)
350
+ buffer = io.BytesIO()
351
+
352
+ with zipfile.ZipFile(buffer, "w", zipfile.ZIP_DEFLATED) as zf:
353
+ for file_path in path.rglob("*"):
354
+ if file_path.is_file():
355
+ arcname = file_path.relative_to(path)
356
+ zf.write(file_path, arcname)
357
+
358
+ buffer.seek(0)
359
+ return buffer.read()
360
+
361
+
362
+ async def upload_artifacts(dir_path: str) -> str | None:
363
+ """Upload a directory as a zip to Chronos.
364
+
365
+ Args:
366
+ dir_path: Path to the directory to upload
367
+
368
+ Returns:
369
+ URL if successful, None otherwise.
370
+ """
371
+ chronos = _ChronosLogger._instance
372
+ if not chronos or not chronos.enabled:
373
+ return None
374
+
375
+ try:
376
+ zip_data = zip_directory(dir_path)
377
+ zip_base64 = base64.b64encode(zip_data).decode("utf-8")
378
+ logger.info(f"Zipped directory: {len(zip_data)} bytes")
379
+ except Exception as e:
380
+ logger.warning(f"Failed to zip directory: {e}")
381
+ return None
382
+
383
+ try:
384
+ async with httpx.AsyncClient(timeout=60.0) as client:
385
+ response = await client.post(
386
+ f"{chronos.callback_url}/logs-upload",
387
+ json={
388
+ "session_id": chronos.session_id,
389
+ "logs_base64": zip_base64,
390
+ },
391
+ )
392
+ if response.status_code == 200:
393
+ result = response.json()
394
+ logger.info(f"Uploaded artifacts: {result}")
395
+ return result.get("logs_url")
396
+ else:
397
+ logger.warning(f"Failed to upload artifacts: {response.status_code} {response.text}")
398
+ return None
399
+ except Exception as e:
400
+ logger.warning(f"Failed to upload artifacts: {e}")
401
+ return None
@@ -0,0 +1,147 @@
1
+ """Agent runner - run agents in Docker containers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import json
7
+ import logging
8
+ import os
9
+ import tempfile
10
+ from pathlib import Path
11
+
12
+ from plato.agents.logging import log_event, upload_artifacts
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ async def run_agent(
18
+ image: str,
19
+ config: dict,
20
+ secrets: dict[str, str],
21
+ instruction: str,
22
+ workspace: str,
23
+ logs_dir: str | None = None,
24
+ pull: bool = True,
25
+ ) -> None:
26
+ """Run an agent in a Docker container.
27
+
28
+ Args:
29
+ image: Docker image URI
30
+ config: Agent configuration dict
31
+ secrets: Secret values (API keys, etc.)
32
+ instruction: Task instruction for the agent
33
+ workspace: Host directory to mount as /workspace
34
+ logs_dir: Host directory for logs (temp dir if None)
35
+ pull: Whether to pull the image first
36
+ """
37
+ logs_dir = logs_dir or tempfile.mkdtemp(prefix="agent_logs_")
38
+ agent_name = image.split("/")[-1].split(":")[0]
39
+ logger.info(f"Starting agent: {agent_name} ({image})")
40
+
41
+ # Pull image if requested
42
+ if pull:
43
+ logger.info(f"Pulling image: {image}")
44
+ pull_proc = await asyncio.create_subprocess_exec(
45
+ "docker",
46
+ "pull",
47
+ image,
48
+ stdout=asyncio.subprocess.PIPE,
49
+ stderr=asyncio.subprocess.STDOUT,
50
+ )
51
+ await pull_proc.wait()
52
+
53
+ # Setup
54
+ os.makedirs(os.path.join(logs_dir, "agent"), exist_ok=True)
55
+ config_file = tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False)
56
+ json.dump(config, config_file)
57
+ config_file.close()
58
+
59
+ try:
60
+ # Build docker command
61
+ docker_cmd = ["docker", "run", "--rm"]
62
+
63
+ # Check if iptables is available for network isolation
64
+ try:
65
+ proc = await asyncio.create_subprocess_exec(
66
+ "iptables",
67
+ "-L",
68
+ "-n",
69
+ stdout=asyncio.subprocess.DEVNULL,
70
+ stderr=asyncio.subprocess.DEVNULL,
71
+ )
72
+ await proc.wait()
73
+ has_iptables = proc.returncode == 0
74
+ except (FileNotFoundError, PermissionError):
75
+ has_iptables = False
76
+
77
+ if not has_iptables:
78
+ docker_cmd.extend(["--network=host", "--add-host=localhost:127.0.0.1"])
79
+
80
+ docker_cmd.extend(
81
+ [
82
+ "-v",
83
+ f"{workspace}:/workspace",
84
+ "-v",
85
+ f"{logs_dir}:/logs",
86
+ "-v",
87
+ f"{config_file.name}:/config.json:ro",
88
+ "-w",
89
+ "/workspace",
90
+ ]
91
+ )
92
+
93
+ for key, value in secrets.items():
94
+ docker_cmd.extend(["-e", f"{key.upper()}={value}"])
95
+
96
+ docker_cmd.append(image)
97
+ docker_cmd.extend(["--instruction", instruction])
98
+
99
+ # Run container and stream output
100
+ process = await asyncio.create_subprocess_exec(
101
+ *docker_cmd,
102
+ stdout=asyncio.subprocess.PIPE,
103
+ stderr=asyncio.subprocess.STDOUT,
104
+ )
105
+
106
+ # Stream output line by line
107
+ assert process.stdout is not None
108
+ while True:
109
+ line = await process.stdout.readline()
110
+ if not line:
111
+ break
112
+ logger.info(f"[agent] {line.decode().rstrip()}")
113
+
114
+ await process.wait()
115
+
116
+ if process.returncode != 0:
117
+ raise RuntimeError(f"Agent failed with exit code {process.returncode}")
118
+
119
+ logger.info("Agent completed successfully")
120
+
121
+ finally:
122
+ os.unlink(config_file.name)
123
+
124
+ # Upload artifacts (no-ops if logging not initialized)
125
+ trajectory_path = Path(logs_dir) / "agent" / "trajectory.json"
126
+ if trajectory_path.exists():
127
+ try:
128
+ with open(trajectory_path) as f:
129
+ trajectory = json.load(f)
130
+ if isinstance(trajectory, dict) and "schema_version" in trajectory:
131
+ # Add agent image to trajectory
132
+ agent = trajectory.get("agent", {})
133
+ extra = agent.get("extra") or {}
134
+ extra["image"] = image
135
+ agent["extra"] = extra
136
+ trajectory["agent"] = agent
137
+
138
+ await log_event(
139
+ span_type="trajectory",
140
+ log_type="atif",
141
+ extra=trajectory,
142
+ source="agent",
143
+ )
144
+ except Exception as e:
145
+ logger.warning(f"Failed to load trajectory: {e}")
146
+
147
+ await upload_artifacts(logs_dir)