devops-bot-sdk 1.6.51__tar.gz → 1.6.53__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.
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/PKG-INFO +1 -1
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/devops_bot_sdk.egg-info/PKG-INFO +1 -1
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/devops_bot_sdk.egg-info/SOURCES.txt +1 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/__init__.py +2 -2
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/collectors/macos_eslogger.py +11 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/setup_manager.py +3 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/updater.py +31 -4
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/vps_health.py +17 -1
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_activity_macos.py +31 -0
- devops_bot_sdk-1.6.53/tests/test_updater_pep668.py +53 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_vps_health.py +11 -2
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/README.md +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/devops_bot_sdk.egg-info/dependency_links.txt +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/devops_bot_sdk.egg-info/entry_points.txt +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/devops_bot_sdk.egg-info/requires.txt +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/devops_bot_sdk.egg-info/top_level.txt +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/pyproject.toml +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/__init__.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/classifier.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/collectors/__init__.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/collectors/common.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/collectors/linux_auditd.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/collectors/windows_eventlog.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/models.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/os_setup.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/recorder.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/redact.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/settings.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/shipper.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/activity/spool.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agentd.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/__init__.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/activity.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/builder.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/chat.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/connectors.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/engines/__init__.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/engines/claude_code.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/engines/http.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/engines/mcp.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/engines/n8n.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/engines/shell.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/integrations.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/inventory.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/library/__init__.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/manifest.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/prompt_studio.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/prompt_template.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/prompt_vars.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/run_log.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/schedules.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/secrets.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/ticket_run.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/usage.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/agents/varstore.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/browser_profile.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/cli.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/client.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/collectors/__init__.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/collectors/files.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/collectors/process.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/collectors/screenshot.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/config.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/crucial.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/departments.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/design_verify/__init__.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/design_verify/assets.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/design_verify/bootstrap.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/design_verify/browser.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/design_verify/compare.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/design_verify/loop.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/estimator.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/exceptions.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/firewall.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/formats.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/git_ops.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/github_fetch.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/github_ingest.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/graph_recon.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/graphify.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/hooks/__init__.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/hooks/crucial_guard.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/intake.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ipc/__init__.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ipc/electron_bridge.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ipc/handlers.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/journal.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/local_exec.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/memory_guard.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/models/__init__.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/models/envelope.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/models/requests.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/models/responses.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/models/snapshots.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/phase_timer.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/plan_run.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/platform_compat.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/prd_progress.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/proof_readers.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/providers.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/py.typed +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/resume.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/router.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/run_auto.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/scheduler.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/self_report.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/self_report_local.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/sse.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/swagger.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/task_file.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/task_types.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/test.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/test_pipeline.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ticket_fields.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/tiers/__init__.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/tiers/mini_agent.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/__init__.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/api.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/dashboard.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/health.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/ip_allowlist.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/jobs.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/models.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/runner.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/security.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/server.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/service.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/session.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/agents.html +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/app.js +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/chat.html +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/custom-agents.html +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/default-agents.html +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/index.html +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/report.html +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/runs.html +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/schedules.html +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/setup.html +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/styles.css +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/static/tickets.html +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/ui/swagger.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/url_access.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/sdk/write_hook.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/setup.cfg +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_activity_collectors.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_activity_core.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_activity_os_setup.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_activity_pipeline.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_activity.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_activity_tracking.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_chat_features.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_listing.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_prompt_async.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_prompt_models.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_run_ticket.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_schedules.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agent_workspace_settings.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_agents_connectors_builder.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_allowed_tools_config.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_auto_agent_dispatch.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_browser_profile.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_cheap_tier.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_client_jira_projects.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_config_token_diagnostics.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_configure_token_owner.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_console_encoding.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_crash_recovery.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_departments.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_done_transition.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_epic_decompose_run.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_epic_inherited_agent_id.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_epic_session_isolation.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_estimator.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_firewall_open_on_update.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_formats.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_git_action.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_github_fetch.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_github_ingest.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_graph_recon.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_graphify_build.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_graphify_hook_install.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_health.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_intake_job_outcome.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_intake_plan_review.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_journal.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_local_exec_provider.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_mcp_route_contract.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_memory_guard.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_phase_timer.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_plan_new_command.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_plan_run_activity.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_pr_identity.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_prd_artifact.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_project_path_resolution.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_proof_readers.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_providers.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_recon_session_isolation.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_resume.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_router.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_run_auto_agent_only.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_run_outputs.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_run_verdict_is_honest.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_schedule_api.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_schedule_outputs_and_plans.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_scheduler.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_self_report.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_service_token_warning.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_stale_panel_restart.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_swagger_command.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_task_file_and_plan_run.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_task_file_format_doc.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_ticket_fields.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_ticket_run_resolve_by_id.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_ticket_speed_fixes.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_tier_flag_parity.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_ui_gate.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_ui_lifespan.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_update_timer.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_updater_extras.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_updater_reports_the_truth.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_url_access.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_windows_loop_identity.py +0 -0
- {devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/tests/test_write_hook.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""AgentOS Desktop SDK — thin HTTPS/SSE client for the Electron app.
|
|
2
2
|
|
|
3
|
-
Version: 1.6.
|
|
3
|
+
Version: 1.6.52
|
|
4
4
|
|
|
5
5
|
Public surface:
|
|
6
6
|
BackendClient.from_config() — create client from ~/.agentos/config.toml
|
|
@@ -34,7 +34,7 @@ Rules:
|
|
|
34
34
|
- All data egress through submit_webhook only
|
|
35
35
|
"""
|
|
36
36
|
|
|
37
|
-
__version__ = "1.6.
|
|
37
|
+
__version__ = "1.6.53" # SINGLE SOURCE OF TRUTH — bump on every change; pyproject,
|
|
38
38
|
__author__ = "AgentOS" # sdk.client.SDK_VERSION and the UI server version all read this.
|
|
39
39
|
|
|
40
40
|
from sdk.client import BackendClient
|
|
@@ -167,6 +167,17 @@ class EsloggerParser:
|
|
|
167
167
|
def flush(self) -> None:
|
|
168
168
|
"""Nothing is buffered — every eslogger line is a whole event."""
|
|
169
169
|
|
|
170
|
+
def flush_older_than(self, cutoff: float) -> None:
|
|
171
|
+
"""No-op, for the same reason as :meth:`flush`: nothing is held.
|
|
172
|
+
|
|
173
|
+
:class:`EsloggerCollector` reuses :class:`AuditdCollector`'s tail loop, which
|
|
174
|
+
calls this on the parser every poll to close auditd events whose trailing
|
|
175
|
+
records never arrived. An eslogger line is already a whole event, so there is
|
|
176
|
+
nothing to time-flush — but the method MUST exist, or the shared loop raises
|
|
177
|
+
``AttributeError`` on its first idle poll and the whole collector thread dies
|
|
178
|
+
before a single event is recorded (the tail starts at EOF, so the very first
|
|
179
|
+
poll reads nothing and goes straight here)."""
|
|
180
|
+
|
|
170
181
|
# ── sessions ─────────────────────────────────────────────────────────────
|
|
171
182
|
|
|
172
183
|
def _asid_session(self, asid: int, ts: float) -> str:
|
|
@@ -102,9 +102,12 @@ async def reinstall_sdk(upgrade: bool = True):
|
|
|
102
102
|
which is the managed ``agentsystem`` venv in normal operation. Used by
|
|
103
103
|
``/setup`` for a repair/reinstall.
|
|
104
104
|
"""
|
|
105
|
+
from sdk.updater import _pip_flags
|
|
106
|
+
|
|
105
107
|
argv = [sys.executable, "-m", "pip", "install"]
|
|
106
108
|
if upgrade:
|
|
107
109
|
argv.append("--upgrade")
|
|
110
|
+
argv += _pip_flags()
|
|
108
111
|
argv.append(SDK_GIT_SPEC)
|
|
109
112
|
|
|
110
113
|
yield f"$ {' '.join(argv)}\n"
|
|
@@ -8,7 +8,8 @@ Upgrade priority:
|
|
|
8
8
|
(backend returns the user's stored GitHub OAuth token — no extra config)
|
|
9
9
|
4. PyPI dist name as last resort
|
|
10
10
|
|
|
11
|
-
Adds --break-system-packages automatically on
|
|
11
|
+
Adds --break-system-packages automatically on any externally-managed Python
|
|
12
|
+
(PEP 668: Ubuntu 22.04+/Debian 12+, Homebrew Python on macOS).
|
|
12
13
|
Disable entirely with AGENTOS_NO_UPDATE=1.
|
|
13
14
|
"""
|
|
14
15
|
from __future__ import annotations
|
|
@@ -54,9 +55,35 @@ def _with_extras(target: str) -> str:
|
|
|
54
55
|
|
|
55
56
|
# ── Platform helpers ──────────────────────────────────────────────────────────
|
|
56
57
|
|
|
58
|
+
def _externally_managed() -> bool:
|
|
59
|
+
"""True when pip will refuse this interpreter under PEP 668.
|
|
60
|
+
|
|
61
|
+
The marker is an ``EXTERNALLY-MANAGED`` file in the stdlib directory, and a
|
|
62
|
+
venv is exempt. Checking for it, rather than the OS, is what covers Homebrew
|
|
63
|
+
Python on macOS: a Mac VPS on ``/opt/homebrew/.../python3.14`` was refused on
|
|
64
|
+
every upgrade attempt and stayed on an old version indefinitely, because the
|
|
65
|
+
flag below used to be added on Linux only.
|
|
66
|
+
"""
|
|
67
|
+
if sys.prefix != getattr(sys, "base_prefix", sys.prefix):
|
|
68
|
+
return False
|
|
69
|
+
try:
|
|
70
|
+
import sysconfig
|
|
71
|
+
return os.path.isfile(
|
|
72
|
+
os.path.join(sysconfig.get_path("stdlib"), "EXTERNALLY-MANAGED"))
|
|
73
|
+
except Exception: # noqa: BLE001 — an unreadable layout is not "managed"
|
|
74
|
+
return False
|
|
75
|
+
|
|
76
|
+
|
|
57
77
|
def _pip_flags() -> list[str]:
|
|
58
|
-
"""--break-system-packages
|
|
59
|
-
|
|
78
|
+
"""--break-system-packages where PEP 668 applies; empty elsewhere.
|
|
79
|
+
|
|
80
|
+
Linux keeps the flag unconditionally, as before (every supported distro pip
|
|
81
|
+
accepts it). Elsewhere it is added only when the marker is present, since an
|
|
82
|
+
old pip that predates PEP 668 rejects the option outright.
|
|
83
|
+
"""
|
|
84
|
+
if platform.system() == "Linux" or _externally_managed():
|
|
85
|
+
return ["--break-system-packages"]
|
|
86
|
+
return []
|
|
60
87
|
|
|
61
88
|
|
|
62
89
|
def _vtuple(v: str) -> tuple:
|
|
@@ -589,7 +616,7 @@ def _report(result: UpgradeResult, latest: str | None) -> None:
|
|
|
589
616
|
_say(f" pip said: {result.detail}")
|
|
590
617
|
_say(" fix it by hand with:\n"
|
|
591
618
|
f' "{sys.executable}" -m pip install --upgrade --force-reinstall '
|
|
592
|
-
f'--no-cache-dir "{_DIST}{_EXTRAS}"')
|
|
619
|
+
f'--no-cache-dir {" ".join(_pip_flags() + [""])}"{_DIST}{_EXTRAS}"')
|
|
593
620
|
return
|
|
594
621
|
|
|
595
622
|
if result.ran:
|
|
@@ -33,6 +33,7 @@ ping just waits for the next tick.
|
|
|
33
33
|
from __future__ import annotations
|
|
34
34
|
|
|
35
35
|
import asyncio
|
|
36
|
+
import ipaddress
|
|
36
37
|
import logging
|
|
37
38
|
import os
|
|
38
39
|
import socket
|
|
@@ -120,6 +121,21 @@ def _outbound_ip() -> str:
|
|
|
120
121
|
pass
|
|
121
122
|
|
|
122
123
|
|
|
124
|
+
def _is_public(ip: str) -> bool:
|
|
125
|
+
"""Only a globally-routable address may overwrite the allocation's IP.
|
|
126
|
+
|
|
127
|
+
Behind NAT (an AWS instance, a laptop on Wi-Fi) the route-to-internet address
|
|
128
|
+
is private — ``172.31.x.x``, ``192.168.x.x`` — and sending it replaced the
|
|
129
|
+
VPS's real public IP on ``contabo_allocation``, after which the backend could
|
|
130
|
+
no longer reach the panel at all. Omitting the key leaves the stored value
|
|
131
|
+
alone, the same rule every other unavailable metric here follows.
|
|
132
|
+
"""
|
|
133
|
+
try:
|
|
134
|
+
return bool(ip) and ipaddress.ip_address(ip).is_global
|
|
135
|
+
except ValueError:
|
|
136
|
+
return False
|
|
137
|
+
|
|
138
|
+
|
|
123
139
|
def _bandwidth_used_mb() -> float | None:
|
|
124
140
|
"""Total bytes in+out since boot, in MB. None when psutil is unavailable.
|
|
125
141
|
|
|
@@ -183,7 +199,7 @@ def build_payload(health: dict | None = None) -> dict:
|
|
|
183
199
|
payload["bandwidthUsed"] = bw # MB, cumulative
|
|
184
200
|
|
|
185
201
|
ip = _outbound_ip()
|
|
186
|
-
if ip:
|
|
202
|
+
if _is_public(ip):
|
|
187
203
|
payload["ipAddress"] = ip
|
|
188
204
|
|
|
189
205
|
return payload
|
|
@@ -158,6 +158,37 @@ class TestParser:
|
|
|
158
158
|
c = M.EsloggerCollector(str(log), parser=_parser(), state_file=tmp_path / "st.json")
|
|
159
159
|
assert c._state == tmp_path / "st.json"
|
|
160
160
|
|
|
161
|
+
def test_tail_loop_records_events_and_does_not_crash_on_an_idle_poll(
|
|
162
|
+
self, tmp_path, monkeypatch
|
|
163
|
+
):
|
|
164
|
+
"""Regression: EsloggerCollector reuses AuditdCollector's tail loop, which calls
|
|
165
|
+
``parser.flush_older_than`` on EVERY poll. EsloggerParser was missing it, so the
|
|
166
|
+
collector thread died with AttributeError on its first (idle) poll — the tail
|
|
167
|
+
starts at EOF, so the first poll reads nothing and goes straight to that call —
|
|
168
|
+
and not a single event was ever recorded (SDK v1.6.52 on the Mac VPS)."""
|
|
169
|
+
from sdk.activity.collectors import linux_auditd as L
|
|
170
|
+
|
|
171
|
+
log = tmp_path / "es.ndjson"
|
|
172
|
+
log.write_text(_exec(1, ["old"], tty="/dev/ttys001") + "\n") # pre-install: not backfilled
|
|
173
|
+
collector = M.EsloggerCollector(
|
|
174
|
+
str(log), parser=_parser(), state_file=tmp_path / "st.json", poll_s=0,
|
|
175
|
+
)
|
|
176
|
+
calls = {"n": 0}
|
|
177
|
+
|
|
178
|
+
def fake_sleep(_):
|
|
179
|
+
calls["n"] += 1
|
|
180
|
+
if calls["n"] == 1: # new activity lands after the first, empty poll
|
|
181
|
+
with log.open("a") as fh:
|
|
182
|
+
fh.write(_exec(2, ["whoami"], tty="/dev/ttys001") + "\n")
|
|
183
|
+
else:
|
|
184
|
+
collector.stop()
|
|
185
|
+
|
|
186
|
+
monkeypatch.setattr(L.time, "sleep", fake_sleep)
|
|
187
|
+
collector.run() # before the fix: raises AttributeError out of the loop
|
|
188
|
+
|
|
189
|
+
_, events = _queued()
|
|
190
|
+
assert [e["command"] for e in events] == ["whoami"]
|
|
191
|
+
|
|
161
192
|
|
|
162
193
|
# ─────────────────────────────── setup ───────────────────────────────
|
|
163
194
|
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""PEP 668 is a property of the interpreter, not of Linux.
|
|
2
|
+
|
|
3
|
+
Homebrew Python on macOS ships an EXTERNALLY-MANAGED marker, and the updater
|
|
4
|
+
used to add --break-system-packages on Linux only — so a Mac VPS was refused on
|
|
5
|
+
every upgrade path and stayed on an old SDK indefinitely.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import sys
|
|
10
|
+
|
|
11
|
+
from sdk import updater
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _stdlib(monkeypatch, tmp_path, *, marker: bool, venv: bool = False):
|
|
15
|
+
import sysconfig
|
|
16
|
+
if marker:
|
|
17
|
+
(tmp_path / "EXTERNALLY-MANAGED").write_text("[externally-managed]\n")
|
|
18
|
+
monkeypatch.setattr(sysconfig, "get_path", lambda name: str(tmp_path))
|
|
19
|
+
monkeypatch.setattr(sys, "base_prefix", "/base" if venv else sys.prefix)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_homebrew_macos_gets_the_flag(monkeypatch, tmp_path):
|
|
23
|
+
monkeypatch.setattr(updater.platform, "system", lambda: "Darwin")
|
|
24
|
+
_stdlib(monkeypatch, tmp_path, marker=True)
|
|
25
|
+
assert updater._pip_flags() == ["--break-system-packages"]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_unmanaged_macos_python_does_not(monkeypatch, tmp_path):
|
|
29
|
+
"""An old pip that predates PEP 668 rejects the option outright."""
|
|
30
|
+
monkeypatch.setattr(updater.platform, "system", lambda: "Darwin")
|
|
31
|
+
_stdlib(monkeypatch, tmp_path, marker=False)
|
|
32
|
+
assert updater._pip_flags() == []
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_a_venv_is_exempt(monkeypatch, tmp_path):
|
|
36
|
+
monkeypatch.setattr(updater.platform, "system", lambda: "Windows")
|
|
37
|
+
_stdlib(monkeypatch, tmp_path, marker=True, venv=True)
|
|
38
|
+
assert updater._pip_flags() == []
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_linux_keeps_the_flag_unconditionally(monkeypatch, tmp_path):
|
|
42
|
+
monkeypatch.setattr(updater.platform, "system", lambda: "Linux")
|
|
43
|
+
_stdlib(monkeypatch, tmp_path, marker=False)
|
|
44
|
+
assert updater._pip_flags() == ["--break-system-packages"]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def test_the_hand_fix_hint_carries_the_flag(monkeypatch, tmp_path, capsys):
|
|
48
|
+
monkeypatch.setattr(updater.platform, "system", lambda: "Darwin")
|
|
49
|
+
_stdlib(monkeypatch, tmp_path, marker=True)
|
|
50
|
+
res = updater.UpgradeResult(before="1.6.44", after="1.6.44", changed=False,
|
|
51
|
+
ran=True, detail="externally-managed-environment")
|
|
52
|
+
updater._report(res, latest="1.6.51")
|
|
53
|
+
assert "--break-system-packages" in capsys.readouterr().out
|
|
@@ -73,7 +73,7 @@ class TestBuildPayload:
|
|
|
73
73
|
def test_maps_every_field(self, monkeypatch):
|
|
74
74
|
monkeypatch.delenv("AGENTOS_VPS_HEALTH_STATUS", raising=False)
|
|
75
75
|
monkeypatch.setattr(vps_health, "_bandwidth_used_mb", lambda: 1024.5)
|
|
76
|
-
monkeypatch.setattr(vps_health, "_outbound_ip", lambda: "
|
|
76
|
+
monkeypatch.setattr(vps_health, "_outbound_ip", lambda: "77.68.16.238")
|
|
77
77
|
|
|
78
78
|
p = vps_health.build_payload(_HEALTH)
|
|
79
79
|
|
|
@@ -85,7 +85,7 @@ class TestBuildPayload:
|
|
|
85
85
|
assert p["diskUsage"] == 30.2
|
|
86
86
|
assert p["totalDisk"] == 500.0
|
|
87
87
|
assert p["bandwidthUsed"] == 1024.5
|
|
88
|
-
assert p["ipAddress"] == "
|
|
88
|
+
assert p["ipAddress"] == "77.68.16.238"
|
|
89
89
|
assert p["uptimeSeconds"] == 86400
|
|
90
90
|
# ISO-8601 with millis + Z, as the backend sample shows.
|
|
91
91
|
assert p["lastPingedAt"].endswith("Z") and "T" in p["lastPingedAt"]
|
|
@@ -118,6 +118,15 @@ class TestBuildPayload:
|
|
|
118
118
|
"totalDisk", "uptimeSeconds", "bandwidthUsed", "ipAddress"):
|
|
119
119
|
assert absent not in p
|
|
120
120
|
|
|
121
|
+
@pytest.mark.parametrize("ip", ["172.31.44.234", "192.168.18.16", "10.0.0.5",
|
|
122
|
+
"127.0.0.1", "not-an-ip"])
|
|
123
|
+
def test_a_private_ip_never_overwrites_the_allocation(self, monkeypatch, ip):
|
|
124
|
+
"""Behind NAT the outbound address is private; sending it replaced the
|
|
125
|
+
VPS's public IP and left the backend unable to reach the panel."""
|
|
126
|
+
monkeypatch.setattr(vps_health, "_bandwidth_used_mb", lambda: None)
|
|
127
|
+
monkeypatch.setattr(vps_health, "_outbound_ip", lambda: ip)
|
|
128
|
+
assert "ipAddress" not in vps_health.build_payload(_HEALTH)
|
|
129
|
+
|
|
121
130
|
|
|
122
131
|
class _FakeClient:
|
|
123
132
|
def __init__(self, ok: bool = True) -> None:
|
|
File without changes
|
{devops_bot_sdk-1.6.51 → devops_bot_sdk-1.6.53}/devops_bot_sdk.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|