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.
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/PKG-INFO +2 -1
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/README.md +1 -0
- plato_sdk_v2-2.3.2/VERSION +1 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/agents/__init__.py +4 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/agents/logging.py +114 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/worlds/__init__.py +3 -1
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/worlds/base.py +276 -2
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/worlds/config.py +38 -1
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/worlds/runner.py +93 -43
- plato_sdk_v2-2.3.1/VERSION +0 -1
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/.claude/agents/sim-creator.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/.gitignore +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/.sandbox.yaml +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/BUILDING_SIMS.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/ci/CLAUDE.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/ci/deploy.sh +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/ci/lint.sh +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/ci/setup.sh +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/ci/version-bump.sh +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/AGENT_SPEC.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/CLI.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/GENERATING_SIM_SDKS.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/SIMULATOR_LIFECYCLE.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/SIM_CREATOR.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/cli/agent.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/cli/flows.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/cli/pm.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/cli/sandbox.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/cli/sims.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/cli/world.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/sim-creation-pipeline.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skill-restructure-plan.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/SIM-CREATION-ARCHITECTURE.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-config/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-creator/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-debugger/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-flow-audit/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-flow-clear/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-flow-mutations/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-flow-run/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-research/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-review/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-sandbox-login/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-sandbox-services/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-sandbox-start/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-sandbox-worker/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-snapshot/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-submit/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/skills/sim-validate/SKILL.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/testcommit +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/docs/unit.sh +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/agent_artifacts/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/agent_artifacts/archive_agent_artifact.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/agent_artifacts/create_agent_artifact.py +0 -0
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/agent_artifacts/get_agent_artifacts.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/cleanup_stale_vms.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/get_dispatchers.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/get_nodes_status.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/get_snapshot_lineage.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/get_snapshots_status.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/pause_resume_dispatchers.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/cluster/prefetch_snapshot.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/backup.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/cleanup.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/close.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/close_async.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/create.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/create_batch.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/create_simulator.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/evaluate_session.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/generate_mutations.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/generate_mutations_single.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_active_session.py +0 -0
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_cdp_url.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_flows.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_interface_worker_info.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_job_info.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_job_status.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_job_worker_info.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_proxy_url.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_public_url.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_simulator_by_name.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_simulators.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_state.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/get_worker_ready.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/log_state_mutation.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/rescore_simulator_sessions.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/reset.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/score.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/send_heartbeat.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/env/update_simulator.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/create_test_case_review.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/evaluate_python.py +0 -0
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/get_scores_by_user.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/get_scoring.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/get_test_case_review.py +0 -0
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/evals/start_eval_from_git.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/create_gitea_repository.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/create_simulator_repository.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/delete_gitea_repository.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_accessible_simulators.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_gitea_credentials.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_gitea_repository.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_my_gitea_info.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_my_repositories.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_repository_branches.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_repository_contents.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_simulator_file_content.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_simulator_repository.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_simulator_repository_branches.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/gitea/get_simulator_repository_contents.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/jobs/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/jobs/get_job_by_id.py +0 -0
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/jobs/get_keepalive_jobs.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/jobs/list_jobs.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/jobs/update_job_status.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/create_annotator_assignment.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/create_org_api_key.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/create_org_policy.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/delete_org_api_key.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/delete_org_policy.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/get_annotator_assignments.py +0 -0
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/get_org_api_keys.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/get_org_policies.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/get_organization_concurrency_status.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/get_organization_members.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/update_annotator_assignment_stage.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/organization/update_organization_concurrency_limit.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/queue/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/queue/get_queue_status.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/queue/get_vm_detail.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/queue/get_vms.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/queue/get_workers.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/checkpoint_vm.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/close_vm.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/create_vm.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/execute_ssh_command.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/get_operation_events.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/healthy_services.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/healthy_worker.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/save_vm_snapshot.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/setup_root_access.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/setup_sandbox.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/sandbox/start_worker.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/analyze_labels.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/archive_session.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/archive_session_logs_endpoint.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/create_from_labels.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/create_session_from_browser.py +0 -0
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/create_session_from_har.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_env_recording.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_grouped_replay_sessions.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_logs_status.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_network_requests.py +0 -0
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_public_benchmark_sessions.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_replay_score_data.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_rrweb_actions.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_rrweb_events.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_screen_recording.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_session.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_session_replays.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_sessions.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_sessions_for_archival.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/get_ui_events.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/restore_session_logs.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/score_session_with_config.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/search_sessions_by_ids.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/set_session_output.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/update_session_public.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/session/update_session_testcase.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/add_simulator_review.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/batch_create_test_cases.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/batch_get_artifact_metadata.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_all_simulators_info.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_db_config.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_env_flows.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_plato_config.py +0 -0
- {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
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_simulator_by_name.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_simulator_id.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_simulator_info.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_simulator_version_details.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_simulator_versions.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_start_path.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/get_version_by_tag.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/list_simulators.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/list_simulators_by_org.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/list_simulators_status.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/register.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/update_simulator.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/update_simulator_status.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/simulator/update_tag.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/__init__.py +0 -0
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/archive_organization_testcase.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/archive_testcase.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/assign_testcase_to_organizations.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/auto_verify_testcase.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/bulk_archive_testcases.py +0 -0
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/create_testcase.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/create_testcase_set.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/delete_testcase_set.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/filter_human_recorder_testcases.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/generate_outcome_schema.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/generate_prediction.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/generate_prediction_from_steps.py +0 -0
- {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
- {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
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_human_recorder_testcases.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_merged_mutations.py +0 -0
- {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
- {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
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_testcase.py +0 -0
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_testcase_sets.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_testcases.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/get_testcases_in_set.py +0 -0
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/update_testcase.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v1/testcases/version_bump_testcase.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/get_agent_ecr_token.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/get_agent_schema.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/get_agent_versions.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/import_agent.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/list_docker_agents.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/lookup_agent_version.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/agents/register_docker_agent.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/artifacts/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/artifacts/get_artifact.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos/launch_job.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos_packages/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos_packages/get_package_versions.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos_packages/list_chronos_packages.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos_packages/lookup_package_version.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos_packages/register_chronos_package.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/chronos_packages/upload_chronos_package.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/cluster/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/cluster/get_node_config.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/checkpoint.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/close.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/connect_routing_info.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/connect_url.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/disk_snapshot.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/execute.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/get_flows.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/get_plato_config.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/log_for_job.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/make.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/public_url.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/reset.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/set_date.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/setup_sandbox.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/snapshot.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/snapshot_store.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/state.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/jobs/wait_for_ready.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/pypi/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/pypi/download_package.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/pypi/get_package_schema.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/pypi/package_index.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/pypi/simple_index.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/pypi/upload_package.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/create.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/deploy.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/get.py +0 -0
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/handle_import.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/list_releases.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/prep_release_assigned_testcases.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/releases/update.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/checkpoint.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/close.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/disk_snapshot.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/evaluate.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/execute.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_connect_url.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_presigned_url.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_public_url.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_s3_content.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_session_details.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_session_documents.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_session_flows.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_session_logs.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/get_session_plato_config.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/heartbeat.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/list_jobs.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/list_sessions.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/log_job_mutation.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/make.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/reset.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/set_date.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/setup_sandbox.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/snapshot.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/snapshot_store.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/state.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/upload_session_documents.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/sessions/wait_for_ready.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/user/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/v2/user/get_current_user.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/version/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/api/version/check.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/client.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/errors.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/models/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_generated/py.typed +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/cli.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/instruction.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/parser.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/python.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/instruction/helpers.py.jinja +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/instruction/init.py.jinja +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/python/api_init.py.jinja +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/python/client.py.jinja +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/python/endpoint.py.jinja +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/python/errors.py.jinja +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/python/package_init.py.jinja +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/python/tag_init.py.jinja +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/_sims_generator/templates/python/version_init.py.jinja +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/agents/base.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/agents/build.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/agents/config.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/agents/runner.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/agents/trajectory.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/create_agent.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/delete_agent.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/get_agent.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/get_agent_schema.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/get_agent_versions.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/list_agents.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/agents/lookup_agent.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/auth/__init__.py +0 -0
- {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
- {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
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/callback/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/callback/push_agent_logs.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/callback/update_agent_status.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/callback/upload_artifacts.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/callback/upload_logs_zip.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/callback/upload_trajectory.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/default/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/default/health.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/jobs/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/jobs/launch_job.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/registry/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/runtimes/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/runtimes/create_runtime.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/runtimes/delete_runtime.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/runtimes/get_runtime.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/runtimes/list_runtimes.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/runtimes/test_runtime.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/secrets/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/secrets/create_secret.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/secrets/delete_secret.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/secrets/get_secret.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/secrets/list_secrets.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/secrets/update_secret.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/sessions/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/sessions/get_session.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/sessions/get_session_logs.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/sessions/get_session_logs_download.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/sessions/list_sessions.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/status/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/status/get_status_api_status_get.py +0 -0
- {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
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/templates/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/templates/create_template.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/templates/delete_template.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/templates/get_template.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/templates/list_templates.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/templates/update_template.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/trajectories/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/trajectories/get_trajectory.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/trajectories/list_trajectories.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/worlds/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/worlds/create_world.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/worlds/delete_world.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/worlds/get_world.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/api/worlds/list_worlds.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/client.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/errors.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/models/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/chronos/py.typed +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/py.typed +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/sims/README.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/sims/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/sims/agent_helpers.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/sims/cli.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/sims/generate_clients.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/sims/registry.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/audit_ui.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/agent.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/main.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/pm.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/sandbox.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/sim.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/ssh.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/utils.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/verify.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli/world.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/cli.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/config.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/examples/doordash_tasks.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/examples/loadtest.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/examples/test_env.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/examples/test_env_custom_browser.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/examples/test_env_sync.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/examples/test_reuse_env.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/examples/test_run.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/exceptions.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/README.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/api-client.js +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/background.js +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/build-sdk.js +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/content.js +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/manifest.json +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/offscreen.html +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/offscreen.js +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/options.html +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/options.js +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/package-lock.json +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/package.json +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/plato-sdk-bundle.js +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/plato-sdk-bundle.js.map +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/popup.html +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/popup.js +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/review-panel.html +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/review-panel.js +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/review-success.html +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/review-success.js +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/session-active.html +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/session-active.js +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/session-ended.html +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/session-ended.js +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/session-setup.html +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/session-setup.js +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/sessions.html +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/sessions.js +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/extensions/envgen-recorder/styles.css +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/flow_executor.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/models/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/models/build_models.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/models/env.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/models/flow.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/models/sandbox.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/models/task.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/sandbox_sdk.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/sdk.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/sync_env.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/sync_flow_executor.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/sync_sdk.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v1/utils/proxytunnel.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/async_/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/async_/artifact.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/async_/client.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/async_/environment.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/async_/flow_executor.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/async_/session.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/models.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/sync/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/sync/artifact.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/sync/client.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/sync/environment.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/sync/flow_executor.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/sync/session.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/types.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/utils/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/utils/db_cleanup.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/utils/models.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/v2/utils/proxy_tunnel.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/worlds/README.md +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/plato/worlds/build_hook.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/pyproject.toml +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/scripts/get_all_artifact_targets.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/integration/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/integration/conftest.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/integration/test_browser_agent.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/integration/test_chronos_callback.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/integration/test_cleanup_snapshot.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/integration/test_code_world.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/integration/test_harbor_agent_runner.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/sims/__init__.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/sims/conftest.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/sims/test_agent_helpers.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/test_heartbeat_keepalive.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/test_session_serialization.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/test_set_date.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/test_v2_imports.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/test_v2_multisim_integration.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/test_v2_session.py +0 -0
- {plato_sdk_v2-2.3.1 → plato_sdk_v2-2.3.2}/tests/test_version.py +0 -0
- {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.
|
|
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
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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:
|