plato-sdk-v2 2.6.1__tar.gz → 2.7.0__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.6.1 → plato_sdk_v2-2.7.0}/PKG-INFO +1 -1
- plato_sdk_v2-2.7.0/VERSION +1 -0
- plato_sdk_v2-2.7.0/examples/test.py +236 -0
- plato_sdk_v2-2.7.0/examples/test_proxy_ssh.py +152 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/__init__.py +1 -1
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/__init__.py +2 -1
- plato_sdk_v2-2.7.0/plato/_generated/api/v2/networks/__init__.py +23 -0
- plato_sdk_v2-2.7.0/plato/_generated/api/v2/networks/add_member.py +75 -0
- plato_sdk_v2-2.7.0/plato/_generated/api/v2/networks/create_network.py +70 -0
- plato_sdk_v2-2.7.0/plato/_generated/api/v2/networks/delete_network.py +68 -0
- plato_sdk_v2-2.7.0/plato/_generated/api/v2/networks/get_network.py +69 -0
- plato_sdk_v2-2.7.0/plato/_generated/api/v2/networks/list_members.py +69 -0
- plato_sdk_v2-2.7.0/plato/_generated/api/v2/networks/list_networks.py +74 -0
- plato_sdk_v2-2.7.0/plato/_generated/api/v2/networks/remove_member.py +73 -0
- plato_sdk_v2-2.7.0/plato/_generated/api/v2/networks/update_member.py +80 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/__init__.py +4 -0
- plato_sdk_v2-2.7.0/plato/_generated/api/v2/sessions/add_ssh_key.py +81 -0
- plato_sdk_v2-2.7.0/plato/_generated/api/v2/sessions/connect_network.py +89 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/models/__init__.py +150 -24
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/cli/agent.py +45 -52
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/cli/chronos.py +46 -58
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/cli/main.py +14 -25
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/cli/pm.py +37 -92
- plato_sdk_v2-2.7.0/plato/v1/cli/proxy.py +343 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/cli/sandbox.py +305 -385
- plato_sdk_v2-2.7.0/plato/v1/cli/ssh.py +71 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/cli/verify.py +79 -55
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/cli/world.py +13 -12
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/async_/client.py +24 -2
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/async_/session.py +48 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/sync/client.py +24 -2
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/sync/session.py +48 -0
- plato_sdk_v2-2.6.1/VERSION +0 -1
- plato_sdk_v2-2.6.1/plato/v1/cli/ssh.py +0 -226
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/.claude/agents/sim-creator.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/.gitignore +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/BUILDING_SIMS.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/README.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/ci/CLAUDE.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/ci/deploy.sh +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/ci/lint.sh +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/ci/setup.sh +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/ci/version-bump.sh +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/AGENT_SPEC.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/CLI.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/GENERATING_SIM_SDKS.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/SIMULATOR_LIFECYCLE.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/SIM_CREATOR.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/cli/agent.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/cli/flows.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/cli/pm.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/cli/sandbox.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/cli/sims.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/cli/world.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/sim-creation-pipeline.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skill-restructure-plan.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/SIM-CREATION-ARCHITECTURE.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-config/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-creator/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-debugger/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-flow-audit/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-flow-clear/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-flow-mutations/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-flow-run/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-research/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-review/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-sandbox-login/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-sandbox-services/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-sandbox-start/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-sandbox-worker/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-snapshot/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-submit/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/skills/sim-validate/SKILL.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/testcommit +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/docs/unit.sh +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/agent_artifacts/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/agent_artifacts/archive_agent_artifact.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/agent_artifacts/create_agent_artifact.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/agent_artifacts/get_agent_artifact_by_public_id.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/agent_artifacts/get_agent_artifacts.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/cluster/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/cluster/cleanup_stale_vms.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/cluster/get_dispatchers.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/cluster/get_nodes_status.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/cluster/get_snapshot_lineage.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/cluster/get_snapshots_status.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/cluster/pause_resume_dispatchers.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/cluster/prefetch_snapshot.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/backup.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/cleanup.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/close.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/close_async.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/create.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/create_batch.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/create_simulator.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/evaluate_session.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/generate_mutations.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/generate_mutations_single.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/get_active_session.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/get_app_sim_worker_info.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/get_cdp_url.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/get_flows.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/get_interface_worker_info.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/get_job_info.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/get_job_status.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/get_job_worker_info.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/get_proxy_url.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/get_public_url.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/get_simulator_by_name.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/get_simulators.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/get_state.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/get_worker_ready.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/log_state_mutation.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/rescore_simulator_sessions.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/reset.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/score.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/send_heartbeat.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/env/update_simulator.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/evals/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/evals/create_test_case_review.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/evals/evaluate_python.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/evals/get_all_test_case_reviews.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/evals/get_scores_by_user.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/evals/get_scoring.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/evals/get_test_case_review.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/evals/human_in_the_loop_scoring.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/evals/start_eval_from_git.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/create_gitea_repository.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/create_simulator_repository.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/delete_gitea_repository.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/get_accessible_simulators.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/get_gitea_credentials.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/get_gitea_repository.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/get_my_gitea_info.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/get_my_repositories.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/get_repository_branches.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/get_repository_contents.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/get_simulator_file_content.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/get_simulator_repository.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/get_simulator_repository_branches.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/gitea/get_simulator_repository_contents.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/jobs/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/jobs/get_job_by_id.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/jobs/get_jobs_by_group_id.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/jobs/get_keepalive_jobs.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/jobs/list_jobs.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/jobs/update_job_status.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/organization/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/organization/create_annotator_assignment.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/organization/create_org_api_key.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/organization/create_org_policy.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/organization/delete_org_api_key.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/organization/delete_org_policy.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/organization/get_annotator_assignments.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/organization/get_org_api_key_policies.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/organization/get_org_api_keys.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/organization/get_org_policies.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/organization/get_organization_concurrency_status.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/organization/get_organization_members.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/organization/update_annotator_assignment_stage.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/organization/update_organization_concurrency_limit.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/queue/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/queue/get_queue_status.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/queue/get_vm_detail.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/queue/get_vms.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/queue/get_workers.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/sandbox/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/sandbox/checkpoint_vm.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/sandbox/close_vm.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/sandbox/create_vm.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/sandbox/execute_ssh_command.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/sandbox/get_operation_events.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/sandbox/healthy_services.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/sandbox/healthy_worker.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/sandbox/save_vm_snapshot.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/sandbox/setup_root_access.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/sandbox/setup_sandbox.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/sandbox/start_worker.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/analyze_labels.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/archive_session.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/archive_session_logs_endpoint.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/create_from_labels.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/create_session_from_browser.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/create_session_from_env_recording.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/create_session_from_har.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_env_recording.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_grouped_replay_sessions.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_logs_status.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_network_requests.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_next_session_for_annotator.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_public_benchmark_sessions.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_replay_score_data.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_rrweb_actions.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_rrweb_events.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_screen_recording.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_session.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_session_replays.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_sessions.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_sessions_for_archival.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/get_ui_events.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/restore_session_logs.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/score_session_with_config.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/search_sessions_by_ids.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/set_session_output.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/update_session_public.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/session/update_session_testcase.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/add_simulator_review.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/batch_create_test_cases.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/batch_get_artifact_metadata.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/get_all_simulators_info.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/get_db_config.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/get_env_flows.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/get_plato_config.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/get_sessions_batch_by_job_groups.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/get_sessions_by_job_group.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/get_simulator_by_name.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/get_simulator_id.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/get_simulator_info.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/get_simulator_version_details.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/get_simulator_versions.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/get_start_path.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/get_version_by_tag.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/list_simulators.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/list_simulators_by_org.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/list_simulators_status.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/register.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/update_simulator.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/update_simulator_status.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/simulator/update_tag.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/archive_organization_test_case_assignments.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/archive_organization_testcase.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/archive_testcase.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/assign_testcase_to_organizations.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/auto_verify_testcase.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/bulk_archive_testcases.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/convert_text_to_structured_data.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/create_testcase.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/create_testcase_set.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/delete_testcase_set.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/filter_human_recorder_testcases.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/generate_outcome_schema.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/generate_prediction.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/generate_prediction_from_steps.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/generate_scoring_config_from_sessions.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/generate_state_mutations_config_route.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/get_human_recorder_tab_counts.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/get_human_recorder_testcases.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/get_merged_mutations.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/get_mutation_groups_for_testcase.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/get_next_testcase_for_scoring.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/get_organization_test_case_assignments.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/get_testcase.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/get_testcase_metadata_for_scoring.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/get_testcase_sets.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/get_testcases.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/get_testcases_in_set.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/mark_organization_test_case_completed.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/update_testcase.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v1/testcases/version_bump_testcase.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/agents/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/agents/get_agent_ecr_token.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/agents/get_agent_schema.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/agents/get_agent_versions.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/agents/import_agent.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/agents/list_docker_agents.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/agents/lookup_agent_version.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/agents/register_docker_agent.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/artifacts/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/artifacts/get_artifact.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/chronos/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/chronos/launch_job.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/chronos_packages/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/chronos_packages/get_package_versions.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/chronos_packages/list_chronos_packages.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/chronos_packages/lookup_package_version.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/chronos_packages/register_chronos_package.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/chronos_packages/upload_chronos_package.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/cluster/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/cluster/get_node_config.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/checkpoint.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/close.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/connect_routing_info.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/connect_url.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/disk_snapshot.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/execute.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/get_flows.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/get_plato_config.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/log_for_job.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/make.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/public_url.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/reset.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/set_date.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/setup_sandbox.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/snapshot.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/snapshot_store.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/state.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/jobs/wait_for_ready.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/pypi/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/pypi/download_package.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/pypi/get_package_schema.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/pypi/package_index.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/pypi/simple_index.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/pypi/upload_package.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/releases/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/releases/create.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/releases/deploy.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/releases/get.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/releases/handle_get_existing_public_ids.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/releases/handle_import.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/releases/list_releases.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/releases/prep_release_assigned_testcases.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/releases/update.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/checkpoint.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/close.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/disk_snapshot.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/evaluate.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/execute.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/get_connect_url.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/get_presigned_url.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/get_public_url.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/get_s3_content.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/get_session_details.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/get_session_documents.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/get_session_flows.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/get_session_logs.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/get_session_plato_config.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/heartbeat.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/list_jobs.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/list_sessions.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/log_job_mutation.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/make.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/reset.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/set_date.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/setup_sandbox.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/snapshot.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/snapshot_store.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/state.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/upload_session_documents.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/sessions/wait_for_ready.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/user/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/v2/user/get_current_user.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/version/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/api/version/check.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/client.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/errors.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_generated/py.typed +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_sims_generator/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_sims_generator/cli.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_sims_generator/instruction.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_sims_generator/parser.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_sims_generator/python.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_sims_generator/templates/instruction/helpers.py.jinja +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_sims_generator/templates/instruction/init.py.jinja +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_sims_generator/templates/python/api_init.py.jinja +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_sims_generator/templates/python/client.py.jinja +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_sims_generator/templates/python/endpoint.py.jinja +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_sims_generator/templates/python/errors.py.jinja +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_sims_generator/templates/python/package_init.py.jinja +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_sims_generator/templates/python/tag_init.py.jinja +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/_sims_generator/templates/python/version_init.py.jinja +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/agents/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/agents/artifacts.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/agents/base.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/agents/build.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/agents/config.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/agents/otel.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/agents/runner.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/agents/trajectory.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/admin/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/admin/clear_database_api_admin_clear_db_post.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/admin/sync_agents_api_admin_sync_agents_post.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/admin/sync_all_api_admin_sync_all_post.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/admin/sync_runtimes_api_admin_sync_runtimes_post.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/admin/sync_worlds_api_admin_sync_worlds_post.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/agents/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/agents/create_agent.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/agents/delete_agent.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/agents/get_agent.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/agents/get_agent_schema.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/agents/get_agent_versions.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/agents/list_agents.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/agents/lookup_agent.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/auth/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/auth/debug_auth_api_auth_debug_get.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/auth/get_auth_status_api_auth_status_get.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/auth/get_current_user_route_api_auth_me_get.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/checkpoints/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/checkpoints/list_checkpoints.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/checkpoints/preview_checkpoint.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/default/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/default/health.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/events/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/events/get_session_event.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/events/list_session_events.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/jobs/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/jobs/launch_job.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/otel/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/otel/get_session_traces_api_otel_sessions__session_id__traces_get.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/otel/receive_traces_api_otel_v1_traces_post.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/registry/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/registry/get_agent_schema_api_registry_agents__agent_name__schema_get.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/registry/get_agent_versions_api_registry_agents__agent_name__versions_get.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/registry/get_world_schema_api_registry_worlds__package_name__schema_get.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/registry/get_world_versions_api_registry_worlds__package_name__versions_get.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/registry/list_registry_agents_api_registry_agents_get.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/registry/list_registry_worlds_api_registry_worlds_get.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/runtimes/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/runtimes/create_runtime.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/runtimes/delete_runtime.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/runtimes/get_runtime.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/runtimes/get_runtime_logs.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/runtimes/list_runtimes.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/runtimes/test_runtime.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/secrets/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/secrets/create_secret.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/secrets/delete_secret.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/secrets/get_secret.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/secrets/list_secrets.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/secrets/update_secret.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/sessions/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/sessions/close_session.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/sessions/complete_session.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/sessions/create_session.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/sessions/get_session.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/sessions/get_session_bash_logs_download.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/sessions/get_session_envs.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/sessions/get_session_live_logs.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/sessions/get_session_logs.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/sessions/get_session_logs_download.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/sessions/get_session_status.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/sessions/list_sessions.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/sessions/list_tags.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/sessions/update_session_tags.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/status/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/status/get_status_api_status_get.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/status/get_version_info_api_version_get.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/templates/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/templates/create_template.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/templates/delete_template.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/templates/get_template.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/templates/list_templates.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/templates/update_template.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/trajectories/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/trajectories/get_trajectory.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/trajectories/list_trajectories.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/worlds/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/worlds/create_world.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/worlds/delete_world.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/worlds/get_world.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/api/worlds/list_worlds.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/client.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/errors.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/models/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/chronos/py.typed +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/py.typed +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/sims/README.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/sims/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/sims/agent_helpers.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/sims/cli.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/sims/generate_clients.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/sims/registry.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/audit_ui.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/cli/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/cli/templates/world-runner.Dockerfile +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/cli/utils.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/cli.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/config.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/examples/doordash_tasks.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/examples/loadtest.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/examples/test_env.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/examples/test_env_custom_browser.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/examples/test_env_sync.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/examples/test_reuse_env.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/examples/test_run.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/exceptions.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/README.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/api-client.js +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/background.js +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/build-sdk.js +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/content.js +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/manifest.json +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/offscreen.html +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/offscreen.js +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/options.html +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/options.js +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/package-lock.json +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/package.json +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/plato-sdk-bundle.js +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/plato-sdk-bundle.js.map +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/popup.html +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/popup.js +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/review-panel.html +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/review-panel.js +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/review-success.html +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/review-success.js +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/session-active.html +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/session-active.js +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/session-ended.html +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/session-ended.js +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/session-setup.html +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/session-setup.js +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/sessions.html +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/sessions.js +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/extensions/envgen-recorder/styles.css +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/flow_executor.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/models/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/models/build_models.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/models/env.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/models/flow.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/models/sandbox.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/models/task.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/sandbox_sdk.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/sdk.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/sync_env.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/sync_flow_executor.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/sync_sdk.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v1/utils/proxytunnel.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/async_/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/async_/artifact.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/async_/chronos.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/async_/environment.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/async_/flow_executor.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/models.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/sync/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/sync/artifact.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/sync/chronos.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/sync/environment.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/sync/flow_executor.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/types.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/utils/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/utils/db_cleanup.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/utils/models.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/v2/utils/proxy_tunnel.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/worlds/README.md +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/worlds/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/worlds/base.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/worlds/build_hook.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/worlds/config.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/plato/worlds/runner.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/pyproject.toml +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/scripts/get_all_artifact_targets.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/integration/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/integration/conftest.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/integration/test_browser_agent.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/integration/test_chronos_callback.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/integration/test_cleanup_snapshot.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/integration/test_code_world.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/integration/test_harbor_agent_runner.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/sims/__init__.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/sims/conftest.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/sims/test_agent_helpers.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/test_heartbeat_keepalive.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/test_session_serialization.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/test_set_date.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/test_v2_imports.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/test_v2_multisim_integration.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/test_v2_session.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/tests/test_version.py +0 -0
- {plato_sdk_v2-2.6.1 → plato_sdk_v2-2.7.0}/uv.lock +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.7.0
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"""Simple example of creating two VMs from resources with a network.
|
|
2
|
+
|
|
3
|
+
This script demonstrates:
|
|
4
|
+
1. Creating a Plato session with two VMs from resources
|
|
5
|
+
2. Waiting for VMs to be ready (worker allocation)
|
|
6
|
+
3. Connecting VMs to WireGuard network via connect_network endpoint
|
|
7
|
+
4. Testing VM-to-VM TCP connectivity with Redis over WireGuard
|
|
8
|
+
|
|
9
|
+
Run with: python test.py
|
|
10
|
+
Requires: PLATO_API_KEY environment variable
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import logging
|
|
14
|
+
import os
|
|
15
|
+
import time
|
|
16
|
+
|
|
17
|
+
from dotenv import load_dotenv
|
|
18
|
+
|
|
19
|
+
from plato.v2 import Env, Plato
|
|
20
|
+
from plato.v2.types import SimConfigCompute
|
|
21
|
+
|
|
22
|
+
load_dotenv()
|
|
23
|
+
|
|
24
|
+
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def main():
|
|
29
|
+
# Check for API key
|
|
30
|
+
if not os.environ.get("PLATO_API_KEY"):
|
|
31
|
+
logger.error("PLATO_API_KEY environment variable not set")
|
|
32
|
+
return
|
|
33
|
+
|
|
34
|
+
plato = Plato()
|
|
35
|
+
session = None
|
|
36
|
+
|
|
37
|
+
try:
|
|
38
|
+
logger.info("=" * 60)
|
|
39
|
+
logger.info("WIREGUARD NETWORK TCP (REDIS) CONNECTIVITY TEST")
|
|
40
|
+
logger.info("=" * 60)
|
|
41
|
+
|
|
42
|
+
# 1. Define resource configurations for the VMs
|
|
43
|
+
vm1_config = SimConfigCompute(cpus=2, memory=4096, disk=10000)
|
|
44
|
+
vm2_config = SimConfigCompute(cpus=2, memory=4096, disk=10000)
|
|
45
|
+
|
|
46
|
+
# 2. Create session with two VMs from resources
|
|
47
|
+
logger.info("[1/8] Creating session with two VMs...")
|
|
48
|
+
session = plato.sessions.create(
|
|
49
|
+
envs=[
|
|
50
|
+
Env.resource("vm1", sim_config=vm1_config, alias="vm1"),
|
|
51
|
+
Env.resource("vm2", sim_config=vm2_config, alias="vm2"),
|
|
52
|
+
],
|
|
53
|
+
timeout=600,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
logger.info(f"Session created: {session.session_id}")
|
|
57
|
+
logger.info(f"Environments: {len(session.envs)}")
|
|
58
|
+
|
|
59
|
+
# Get env references
|
|
60
|
+
vm1 = session.envs[0] if session.envs[0].alias == "vm1" else session.envs[1]
|
|
61
|
+
vm2 = session.envs[1] if session.envs[0].alias == "vm1" else session.envs[0]
|
|
62
|
+
|
|
63
|
+
for env in session.envs:
|
|
64
|
+
logger.info(f" - {env.alias}: job_id={env.job_id}")
|
|
65
|
+
|
|
66
|
+
# 3. Connect VMs to WireGuard network
|
|
67
|
+
logger.info("[2/8] Connecting VMs to WireGuard network...")
|
|
68
|
+
|
|
69
|
+
connect_result = session.connect_network()
|
|
70
|
+
logger.info(f" Network connected: success={connect_result.get('success')}")
|
|
71
|
+
logger.info(f" Subnet: {connect_result.get('subnet')}")
|
|
72
|
+
for job_id, success in connect_result.get("results", {}).items():
|
|
73
|
+
logger.info(f" {job_id}: {'OK' if success else 'FAILED'}")
|
|
74
|
+
|
|
75
|
+
# 4. Get WireGuard IPs
|
|
76
|
+
logger.info("[3/8] Getting WireGuard IPs...")
|
|
77
|
+
|
|
78
|
+
vm1_wg_ip = vm1.execute("ip -4 addr show wg0 | grep inet | awk '{print $2}' | cut -d/ -f1").stdout.strip()
|
|
79
|
+
vm2_wg_ip = vm2.execute("ip -4 addr show wg0 | grep inet | awk '{print $2}' | cut -d/ -f1").stdout.strip()
|
|
80
|
+
|
|
81
|
+
logger.info(f" vm1 WireGuard IP: {vm1_wg_ip}")
|
|
82
|
+
logger.info(f" vm2 WireGuard IP: {vm2_wg_ip}")
|
|
83
|
+
|
|
84
|
+
# 5. Install Redis on both VMs
|
|
85
|
+
logger.info("[4/8] Installing Redis on VMs...")
|
|
86
|
+
|
|
87
|
+
# Install Redis on vm1
|
|
88
|
+
logger.info(" Installing Redis on vm1...")
|
|
89
|
+
vm1.execute("apt-get update -qq && apt-get install -y -qq redis-server", timeout=120)
|
|
90
|
+
|
|
91
|
+
# Install Redis on vm2
|
|
92
|
+
logger.info(" Installing Redis on vm2...")
|
|
93
|
+
vm2.execute("apt-get update -qq && apt-get install -y -qq redis-server", timeout=120)
|
|
94
|
+
|
|
95
|
+
# 6. Configure and start Redis servers
|
|
96
|
+
logger.info("[5/8] Configuring and starting Redis servers...")
|
|
97
|
+
|
|
98
|
+
# Configure Redis on vm1 to bind to all interfaces
|
|
99
|
+
vm1.execute("sed -i 's/^bind 127.0.0.1/bind 0.0.0.0/' /etc/redis/redis.conf")
|
|
100
|
+
vm1.execute("sed -i 's/^protected-mode yes/protected-mode no/' /etc/redis/redis.conf")
|
|
101
|
+
vm1.execute("systemctl restart redis-server")
|
|
102
|
+
logger.info(" Redis started on vm1 (port 6379)")
|
|
103
|
+
|
|
104
|
+
# Configure Redis on vm2 to bind to all interfaces
|
|
105
|
+
vm2.execute("sed -i 's/^bind 127.0.0.1/bind 0.0.0.0/' /etc/redis/redis.conf")
|
|
106
|
+
vm2.execute("sed -i 's/^protected-mode yes/protected-mode no/' /etc/redis/redis.conf")
|
|
107
|
+
vm2.execute("systemctl restart redis-server")
|
|
108
|
+
logger.info(" Redis started on vm2 (port 6379)")
|
|
109
|
+
|
|
110
|
+
# Give Redis time to start
|
|
111
|
+
time.sleep(2)
|
|
112
|
+
|
|
113
|
+
# Verify Redis is running locally
|
|
114
|
+
vm1_redis_check = vm1.execute("redis-cli ping")
|
|
115
|
+
vm2_redis_check = vm2.execute("redis-cli ping")
|
|
116
|
+
|
|
117
|
+
if "PONG" in vm1_redis_check.stdout:
|
|
118
|
+
logger.info(" OK: vm1 Redis responding locally")
|
|
119
|
+
else:
|
|
120
|
+
logger.error(f" FAIL: vm1 Redis not responding: {vm1_redis_check.stdout}")
|
|
121
|
+
return
|
|
122
|
+
|
|
123
|
+
if "PONG" in vm2_redis_check.stdout:
|
|
124
|
+
logger.info(" OK: vm2 Redis responding locally")
|
|
125
|
+
else:
|
|
126
|
+
logger.error(f" FAIL: vm2 Redis not responding: {vm2_redis_check.stdout}")
|
|
127
|
+
return
|
|
128
|
+
|
|
129
|
+
# 7. Set keys on each Redis
|
|
130
|
+
logger.info("[6/8] Setting Redis keys...")
|
|
131
|
+
|
|
132
|
+
vm1.execute("redis-cli SET hostname vm1")
|
|
133
|
+
vm1.execute("redis-cli SET message 'Hello from VM1'")
|
|
134
|
+
logger.info(" Set keys on vm1: hostname=vm1, message='Hello from VM1'")
|
|
135
|
+
|
|
136
|
+
vm2.execute("redis-cli SET hostname vm2")
|
|
137
|
+
vm2.execute("redis-cli SET message 'Hello from VM2'")
|
|
138
|
+
logger.info(" Set keys on vm2: hostname=vm2, message='Hello from VM2'")
|
|
139
|
+
|
|
140
|
+
# 8. Test TCP connectivity - connect to remote Redis over WireGuard
|
|
141
|
+
logger.info("[7/8] Testing TCP connectivity (Redis over WireGuard)...")
|
|
142
|
+
|
|
143
|
+
# Test vm1 -> vm2's Redis
|
|
144
|
+
logger.info(f" Testing TCP from vm1 to vm2 Redis ({vm2_wg_ip}:6379)...")
|
|
145
|
+
|
|
146
|
+
vm1_to_vm2_ping = vm1.execute(f"redis-cli -h {vm2_wg_ip} ping")
|
|
147
|
+
vm1_to_vm2_hostname = vm1.execute(f"redis-cli -h {vm2_wg_ip} GET hostname")
|
|
148
|
+
vm1_to_vm2_message = vm1.execute(f"redis-cli -h {vm2_wg_ip} GET message")
|
|
149
|
+
|
|
150
|
+
if "PONG" in vm1_to_vm2_ping.stdout:
|
|
151
|
+
logger.info(" OK: vm1 -> vm2 Redis PING successful")
|
|
152
|
+
else:
|
|
153
|
+
logger.error(f" FAIL: vm1 -> vm2 Redis PING failed: {vm1_to_vm2_ping.stdout} {vm1_to_vm2_ping.stderr}")
|
|
154
|
+
|
|
155
|
+
if "vm2" in vm1_to_vm2_hostname.stdout:
|
|
156
|
+
logger.info(f" OK: vm1 -> vm2 Redis GET hostname = {vm1_to_vm2_hostname.stdout.strip()}")
|
|
157
|
+
else:
|
|
158
|
+
logger.error(f" FAIL: vm1 -> vm2 Redis GET hostname failed: {vm1_to_vm2_hostname.stdout}")
|
|
159
|
+
|
|
160
|
+
if "Hello from VM2" in vm1_to_vm2_message.stdout:
|
|
161
|
+
logger.info(f" OK: vm1 -> vm2 Redis GET message = {vm1_to_vm2_message.stdout.strip()}")
|
|
162
|
+
else:
|
|
163
|
+
logger.error(f" FAIL: vm1 -> vm2 Redis GET message failed: {vm1_to_vm2_message.stdout}")
|
|
164
|
+
|
|
165
|
+
# Test vm2 -> vm1's Redis
|
|
166
|
+
logger.info(f" Testing TCP from vm2 to vm1 Redis ({vm1_wg_ip}:6379)...")
|
|
167
|
+
|
|
168
|
+
vm2_to_vm1_ping = vm2.execute(f"redis-cli -h {vm1_wg_ip} ping")
|
|
169
|
+
vm2_to_vm1_hostname = vm2.execute(f"redis-cli -h {vm1_wg_ip} GET hostname")
|
|
170
|
+
vm2_to_vm1_message = vm2.execute(f"redis-cli -h {vm1_wg_ip} GET message")
|
|
171
|
+
|
|
172
|
+
if "PONG" in vm2_to_vm1_ping.stdout:
|
|
173
|
+
logger.info(" OK: vm2 -> vm1 Redis PING successful")
|
|
174
|
+
else:
|
|
175
|
+
logger.error(f" FAIL: vm2 -> vm1 Redis PING failed: {vm2_to_vm1_ping.stdout} {vm2_to_vm1_ping.stderr}")
|
|
176
|
+
|
|
177
|
+
if "vm1" in vm2_to_vm1_hostname.stdout:
|
|
178
|
+
logger.info(f" OK: vm2 -> vm1 Redis GET hostname = {vm2_to_vm1_hostname.stdout.strip()}")
|
|
179
|
+
else:
|
|
180
|
+
logger.error(f" FAIL: vm2 -> vm1 Redis GET hostname failed: {vm2_to_vm1_hostname.stdout}")
|
|
181
|
+
|
|
182
|
+
if "Hello from VM1" in vm2_to_vm1_message.stdout:
|
|
183
|
+
logger.info(f" OK: vm2 -> vm1 Redis GET message = {vm2_to_vm1_message.stdout.strip()}")
|
|
184
|
+
else:
|
|
185
|
+
logger.error(f" FAIL: vm2 -> vm1 Redis GET message failed: {vm2_to_vm1_message.stdout}")
|
|
186
|
+
|
|
187
|
+
# 9. Test ping connectivity as sanity check
|
|
188
|
+
logger.info("[8/8] Testing ping connectivity...")
|
|
189
|
+
|
|
190
|
+
ping_result = vm1.execute(f"ping -c 3 -W 5 {vm2_wg_ip}")
|
|
191
|
+
if ping_result.exit_code == 0:
|
|
192
|
+
logger.info(" OK: vm1 -> vm2 ping successful!")
|
|
193
|
+
else:
|
|
194
|
+
logger.error(" FAIL: vm1 -> vm2 ping failed!")
|
|
195
|
+
|
|
196
|
+
# Summary
|
|
197
|
+
logger.info("")
|
|
198
|
+
logger.info("=" * 60)
|
|
199
|
+
logger.info("TEST SUMMARY")
|
|
200
|
+
logger.info("=" * 60)
|
|
201
|
+
logger.info(f"Session ID: {session.session_id}")
|
|
202
|
+
logger.info(f"vm1 WireGuard IP: {vm1_wg_ip}")
|
|
203
|
+
logger.info(f"vm2 WireGuard IP: {vm2_wg_ip}")
|
|
204
|
+
|
|
205
|
+
# Final connectivity check
|
|
206
|
+
tcp_ok = (
|
|
207
|
+
"PONG" in vm1_to_vm2_ping.stdout
|
|
208
|
+
and "vm2" in vm1_to_vm2_hostname.stdout
|
|
209
|
+
and "PONG" in vm2_to_vm1_ping.stdout
|
|
210
|
+
and "vm1" in vm2_to_vm1_hostname.stdout
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
if tcp_ok:
|
|
214
|
+
logger.info("RESULT: WireGuard TCP (Redis) connectivity WORKING!")
|
|
215
|
+
else:
|
|
216
|
+
logger.error("RESULT: WireGuard TCP (Redis) connectivity FAILED!")
|
|
217
|
+
|
|
218
|
+
logger.info("=" * 60)
|
|
219
|
+
|
|
220
|
+
except Exception as e:
|
|
221
|
+
logger.error(f"ERROR: {e}")
|
|
222
|
+
import traceback
|
|
223
|
+
|
|
224
|
+
traceback.print_exc()
|
|
225
|
+
raise
|
|
226
|
+
|
|
227
|
+
finally:
|
|
228
|
+
if session:
|
|
229
|
+
logger.info("Closing session...")
|
|
230
|
+
session.close()
|
|
231
|
+
plato.close()
|
|
232
|
+
logger.info("Cleanup complete.")
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
if __name__ == "__main__":
|
|
236
|
+
main()
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Test SSH via WireGuard proxy gateway.
|
|
3
|
+
|
|
4
|
+
Creates a blank VM, connects it to the WireGuard network, and tests SSH access
|
|
5
|
+
through the proxy gateway.
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
export PLATO_API_KEY=your-key
|
|
9
|
+
export PLATO_PROXY_HOST=gateway.plato.so
|
|
10
|
+
export PLATO_PROXY_PORT=443
|
|
11
|
+
python test_proxy_ssh.py
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
import os
|
|
16
|
+
import subprocess
|
|
17
|
+
import sys
|
|
18
|
+
import time
|
|
19
|
+
|
|
20
|
+
from dotenv import load_dotenv
|
|
21
|
+
|
|
22
|
+
from plato.v2 import Env, Plato
|
|
23
|
+
from plato.v2.types import SimConfigCompute
|
|
24
|
+
|
|
25
|
+
load_dotenv()
|
|
26
|
+
|
|
27
|
+
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
|
|
28
|
+
logger = logging.getLogger(__name__)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_ssh_connection(job_id: str, proxy_host: str, proxy_port: int) -> bool:
|
|
32
|
+
"""Test SSH connection via proxy gateway."""
|
|
33
|
+
sni = f"{job_id}--22.{proxy_host}"
|
|
34
|
+
|
|
35
|
+
# Use openssl s_client to test TLS connection
|
|
36
|
+
cmd = ["openssl", "s_client", "-connect", f"{proxy_host}:{proxy_port}", "-servername", sni, "-verify_quiet"]
|
|
37
|
+
|
|
38
|
+
logger.info(f"Testing TLS connection to {proxy_host}:{proxy_port} with SNI={sni}")
|
|
39
|
+
|
|
40
|
+
try:
|
|
41
|
+
result = subprocess.run(cmd, input=b"", capture_output=True, timeout=10)
|
|
42
|
+
if b"CONNECTED" in result.stderr or result.returncode == 0:
|
|
43
|
+
logger.info("TLS connection successful!")
|
|
44
|
+
return True
|
|
45
|
+
else:
|
|
46
|
+
logger.error(f"TLS connection failed: {result.stderr.decode()[:200]}")
|
|
47
|
+
return False
|
|
48
|
+
except subprocess.TimeoutExpired:
|
|
49
|
+
logger.error("TLS connection timed out")
|
|
50
|
+
return False
|
|
51
|
+
except Exception as e:
|
|
52
|
+
logger.error(f"TLS connection error: {e}")
|
|
53
|
+
return False
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def main():
|
|
57
|
+
# Check environment
|
|
58
|
+
api_key = os.environ.get("PLATO_API_KEY")
|
|
59
|
+
if not api_key:
|
|
60
|
+
logger.error("PLATO_API_KEY not set")
|
|
61
|
+
return 1
|
|
62
|
+
|
|
63
|
+
proxy_host = os.environ.get("PLATO_PROXY_HOST", "gateway.plato.so")
|
|
64
|
+
proxy_port = int(os.environ.get("PLATO_PROXY_PORT", "443"))
|
|
65
|
+
|
|
66
|
+
logger.info("=" * 60)
|
|
67
|
+
logger.info("WIREGUARD PROXY SSH TEST")
|
|
68
|
+
logger.info("=" * 60)
|
|
69
|
+
logger.info(f"Proxy: {proxy_host}:{proxy_port}")
|
|
70
|
+
|
|
71
|
+
plato = Plato()
|
|
72
|
+
session = None
|
|
73
|
+
|
|
74
|
+
try:
|
|
75
|
+
# 1. Create blank VM
|
|
76
|
+
logger.info("[1/4] Creating blank VM...")
|
|
77
|
+
vm_config = SimConfigCompute(cpus=2, memory=2048, disk=10000)
|
|
78
|
+
|
|
79
|
+
session = plato.sessions.create(
|
|
80
|
+
envs=[Env.resource("test-vm", sim_config=vm_config, alias="test-vm")],
|
|
81
|
+
timeout=600,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
job_id = session.envs[0].job_id
|
|
85
|
+
logger.info(f" Session: {session.session_id}")
|
|
86
|
+
logger.info(f" Job ID: {job_id}")
|
|
87
|
+
|
|
88
|
+
# 2. Connect to WireGuard network
|
|
89
|
+
logger.info("[2/4] Connecting to WireGuard network...")
|
|
90
|
+
result = session.connect_network()
|
|
91
|
+
|
|
92
|
+
success = result.get("success", False)
|
|
93
|
+
subnet = result.get("subnet", "unknown")
|
|
94
|
+
|
|
95
|
+
logger.info(f" Success: {success}")
|
|
96
|
+
logger.info(f" Subnet: {subnet}")
|
|
97
|
+
|
|
98
|
+
if not success:
|
|
99
|
+
logger.error("Failed to connect network!")
|
|
100
|
+
return 1
|
|
101
|
+
|
|
102
|
+
# 3. Get WireGuard IP from VM
|
|
103
|
+
logger.info("[3/4] Getting VM WireGuard IP...")
|
|
104
|
+
vm = session.envs[0]
|
|
105
|
+
wg_ip = vm.execute("ip -4 addr show wg0 | grep inet | awk '{print $2}' | cut -d/ -f1").stdout.strip()
|
|
106
|
+
logger.info(f" VM WireGuard IP: {wg_ip}")
|
|
107
|
+
|
|
108
|
+
# 4. Test SSH via proxy
|
|
109
|
+
logger.info("[4/4] Testing SSH via proxy gateway...")
|
|
110
|
+
ssh_ok = test_ssh_connection(job_id, proxy_host, proxy_port)
|
|
111
|
+
|
|
112
|
+
# Summary
|
|
113
|
+
logger.info("")
|
|
114
|
+
logger.info("=" * 60)
|
|
115
|
+
logger.info("RESULTS")
|
|
116
|
+
logger.info("=" * 60)
|
|
117
|
+
logger.info(f"Job ID: {job_id}")
|
|
118
|
+
logger.info(f"WireGuard IP: {wg_ip}")
|
|
119
|
+
logger.info(f"SSH Test: {'PASS' if ssh_ok else 'FAIL'}")
|
|
120
|
+
logger.info("")
|
|
121
|
+
logger.info("To SSH manually:")
|
|
122
|
+
logger.info(f" export PLATO_PROXY_HOST={proxy_host}")
|
|
123
|
+
logger.info(f" export PLATO_PROXY_PORT={proxy_port}")
|
|
124
|
+
logger.info(f" plato ssh {job_id} --no-verify")
|
|
125
|
+
logger.info("")
|
|
126
|
+
logger.info("Session alive for 600 seconds. Press Ctrl+C to exit early.")
|
|
127
|
+
logger.info("=" * 60)
|
|
128
|
+
|
|
129
|
+
# Keep alive for manual testing
|
|
130
|
+
try:
|
|
131
|
+
time.sleep(600)
|
|
132
|
+
except KeyboardInterrupt:
|
|
133
|
+
logger.info("\nInterrupted")
|
|
134
|
+
|
|
135
|
+
return 0 if ssh_ok else 1
|
|
136
|
+
|
|
137
|
+
except Exception as e:
|
|
138
|
+
logger.error(f"Error: {e}")
|
|
139
|
+
import traceback
|
|
140
|
+
|
|
141
|
+
traceback.print_exc()
|
|
142
|
+
return 1
|
|
143
|
+
|
|
144
|
+
finally:
|
|
145
|
+
if session:
|
|
146
|
+
logger.info("Closing session...")
|
|
147
|
+
session.close()
|
|
148
|
+
plato.close()
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
if __name__ == "__main__":
|
|
152
|
+
sys.exit(main())
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""API version module."""
|
|
2
2
|
|
|
3
|
-
from . import agents, artifacts, chronos, chronos_packages, cluster, jobs, pypi, releases, sessions, user
|
|
3
|
+
from . import agents, artifacts, chronos, chronos_packages, cluster, jobs, networks, pypi, releases, sessions, user
|
|
4
4
|
|
|
5
5
|
__all__ = [
|
|
6
6
|
"agents",
|
|
@@ -9,6 +9,7 @@ __all__ = [
|
|
|
9
9
|
"chronos_packages",
|
|
10
10
|
"cluster",
|
|
11
11
|
"jobs",
|
|
12
|
+
"networks",
|
|
12
13
|
"pypi",
|
|
13
14
|
"releases",
|
|
14
15
|
"sessions",
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""API endpoints."""
|
|
2
|
+
|
|
3
|
+
from . import (
|
|
4
|
+
add_member,
|
|
5
|
+
create_network,
|
|
6
|
+
delete_network,
|
|
7
|
+
get_network,
|
|
8
|
+
list_members,
|
|
9
|
+
list_networks,
|
|
10
|
+
remove_member,
|
|
11
|
+
update_member,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"list_networks",
|
|
16
|
+
"create_network",
|
|
17
|
+
"get_network",
|
|
18
|
+
"delete_network",
|
|
19
|
+
"list_members",
|
|
20
|
+
"add_member",
|
|
21
|
+
"update_member",
|
|
22
|
+
"remove_member",
|
|
23
|
+
]
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"""Add Member"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
import httpx
|
|
8
|
+
|
|
9
|
+
from plato._generated.errors import raise_for_status
|
|
10
|
+
from plato._generated.models import AddMemberRequest, NetworkMemberResponse
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _build_request_args(
|
|
14
|
+
session_id: str,
|
|
15
|
+
body: AddMemberRequest,
|
|
16
|
+
authorization: str | None = None,
|
|
17
|
+
x_api_key: str | None = None,
|
|
18
|
+
) -> dict[str, Any]:
|
|
19
|
+
"""Build request arguments."""
|
|
20
|
+
url = f"/api/v2/networks/{session_id}/members"
|
|
21
|
+
|
|
22
|
+
headers: dict[str, str] = {}
|
|
23
|
+
if authorization is not None:
|
|
24
|
+
headers["authorization"] = authorization
|
|
25
|
+
if x_api_key is not None:
|
|
26
|
+
headers["X-API-Key"] = x_api_key
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
"method": "POST",
|
|
30
|
+
"url": url,
|
|
31
|
+
"json": body.model_dump(mode="json", exclude_none=True),
|
|
32
|
+
"headers": headers,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def sync(
|
|
37
|
+
client: httpx.Client,
|
|
38
|
+
session_id: str,
|
|
39
|
+
body: AddMemberRequest,
|
|
40
|
+
authorization: str | None = None,
|
|
41
|
+
x_api_key: str | None = None,
|
|
42
|
+
) -> NetworkMemberResponse:
|
|
43
|
+
"""Add a member (job/VM) to a network."""
|
|
44
|
+
|
|
45
|
+
request_args = _build_request_args(
|
|
46
|
+
session_id=session_id,
|
|
47
|
+
body=body,
|
|
48
|
+
authorization=authorization,
|
|
49
|
+
x_api_key=x_api_key,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
response = client.request(**request_args)
|
|
53
|
+
raise_for_status(response)
|
|
54
|
+
return NetworkMemberResponse.model_validate(response.json())
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
async def asyncio(
|
|
58
|
+
client: httpx.AsyncClient,
|
|
59
|
+
session_id: str,
|
|
60
|
+
body: AddMemberRequest,
|
|
61
|
+
authorization: str | None = None,
|
|
62
|
+
x_api_key: str | None = None,
|
|
63
|
+
) -> NetworkMemberResponse:
|
|
64
|
+
"""Add a member (job/VM) to a network."""
|
|
65
|
+
|
|
66
|
+
request_args = _build_request_args(
|
|
67
|
+
session_id=session_id,
|
|
68
|
+
body=body,
|
|
69
|
+
authorization=authorization,
|
|
70
|
+
x_api_key=x_api_key,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
response = await client.request(**request_args)
|
|
74
|
+
raise_for_status(response)
|
|
75
|
+
return NetworkMemberResponse.model_validate(response.json())
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""Create Network"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
import httpx
|
|
8
|
+
|
|
9
|
+
from plato._generated.errors import raise_for_status
|
|
10
|
+
from plato._generated.models import CreateNetworkRequest, CreateNetworkResponse
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _build_request_args(
|
|
14
|
+
body: CreateNetworkRequest,
|
|
15
|
+
authorization: str | None = None,
|
|
16
|
+
x_api_key: str | None = None,
|
|
17
|
+
) -> dict[str, Any]:
|
|
18
|
+
"""Build request arguments."""
|
|
19
|
+
url = "/api/v2/networks/"
|
|
20
|
+
|
|
21
|
+
headers: dict[str, str] = {}
|
|
22
|
+
if authorization is not None:
|
|
23
|
+
headers["authorization"] = authorization
|
|
24
|
+
if x_api_key is not None:
|
|
25
|
+
headers["X-API-Key"] = x_api_key
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
"method": "POST",
|
|
29
|
+
"url": url,
|
|
30
|
+
"json": body.model_dump(mode="json", exclude_none=True),
|
|
31
|
+
"headers": headers,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def sync(
|
|
36
|
+
client: httpx.Client,
|
|
37
|
+
body: CreateNetworkRequest,
|
|
38
|
+
authorization: str | None = None,
|
|
39
|
+
x_api_key: str | None = None,
|
|
40
|
+
) -> CreateNetworkResponse:
|
|
41
|
+
"""Create a new isolated network for a session."""
|
|
42
|
+
|
|
43
|
+
request_args = _build_request_args(
|
|
44
|
+
body=body,
|
|
45
|
+
authorization=authorization,
|
|
46
|
+
x_api_key=x_api_key,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
response = client.request(**request_args)
|
|
50
|
+
raise_for_status(response)
|
|
51
|
+
return CreateNetworkResponse.model_validate(response.json())
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
async def asyncio(
|
|
55
|
+
client: httpx.AsyncClient,
|
|
56
|
+
body: CreateNetworkRequest,
|
|
57
|
+
authorization: str | None = None,
|
|
58
|
+
x_api_key: str | None = None,
|
|
59
|
+
) -> CreateNetworkResponse:
|
|
60
|
+
"""Create a new isolated network for a session."""
|
|
61
|
+
|
|
62
|
+
request_args = _build_request_args(
|
|
63
|
+
body=body,
|
|
64
|
+
authorization=authorization,
|
|
65
|
+
x_api_key=x_api_key,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
response = await client.request(**request_args)
|
|
69
|
+
raise_for_status(response)
|
|
70
|
+
return CreateNetworkResponse.model_validate(response.json())
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""Delete Network"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
import httpx
|
|
8
|
+
|
|
9
|
+
from plato._generated.errors import raise_for_status
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _build_request_args(
|
|
13
|
+
session_id: str,
|
|
14
|
+
authorization: str | None = None,
|
|
15
|
+
x_api_key: str | None = None,
|
|
16
|
+
) -> dict[str, Any]:
|
|
17
|
+
"""Build request arguments."""
|
|
18
|
+
url = f"/api/v2/networks/{session_id}"
|
|
19
|
+
|
|
20
|
+
headers: dict[str, str] = {}
|
|
21
|
+
if authorization is not None:
|
|
22
|
+
headers["authorization"] = authorization
|
|
23
|
+
if x_api_key is not None:
|
|
24
|
+
headers["X-API-Key"] = x_api_key
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
"method": "DELETE",
|
|
28
|
+
"url": url,
|
|
29
|
+
"headers": headers,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def sync(
|
|
34
|
+
client: httpx.Client,
|
|
35
|
+
session_id: str,
|
|
36
|
+
authorization: str | None = None,
|
|
37
|
+
x_api_key: str | None = None,
|
|
38
|
+
) -> dict[str, Any]:
|
|
39
|
+
"""Delete/terminate a network."""
|
|
40
|
+
|
|
41
|
+
request_args = _build_request_args(
|
|
42
|
+
session_id=session_id,
|
|
43
|
+
authorization=authorization,
|
|
44
|
+
x_api_key=x_api_key,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
response = client.request(**request_args)
|
|
48
|
+
raise_for_status(response)
|
|
49
|
+
return response.json()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
async def asyncio(
|
|
53
|
+
client: httpx.AsyncClient,
|
|
54
|
+
session_id: str,
|
|
55
|
+
authorization: str | None = None,
|
|
56
|
+
x_api_key: str | None = None,
|
|
57
|
+
) -> dict[str, Any]:
|
|
58
|
+
"""Delete/terminate a network."""
|
|
59
|
+
|
|
60
|
+
request_args = _build_request_args(
|
|
61
|
+
session_id=session_id,
|
|
62
|
+
authorization=authorization,
|
|
63
|
+
x_api_key=x_api_key,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
response = await client.request(**request_args)
|
|
67
|
+
raise_for_status(response)
|
|
68
|
+
return response.json()
|