devops-bot-sdk 1.6.71__tar.gz → 1.6.73__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.71 → devops_bot_sdk-1.6.73}/PKG-INFO +1 -1
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/devops_bot_sdk.egg-info/PKG-INFO +1 -1
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/__init__.py +2 -2
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/activity/collectors/windows_eventlog.py +68 -8
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/activity/os_setup.py +4 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_activity_collectors.py +52 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/README.md +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/devops_bot_sdk.egg-info/SOURCES.txt +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/devops_bot_sdk.egg-info/dependency_links.txt +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/devops_bot_sdk.egg-info/entry_points.txt +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/devops_bot_sdk.egg-info/requires.txt +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/devops_bot_sdk.egg-info/top_level.txt +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/pyproject.toml +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/activity/__init__.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/activity/classifier.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/activity/collectors/__init__.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/activity/collectors/common.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/activity/collectors/linux_auditd.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/activity/collectors/macos_eslogger.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/activity/models.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/activity/recorder.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/activity/redact.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/activity/settings.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/activity/shipper.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/activity/spool.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agentd.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/__init__.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/activity.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/builder.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/chat.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/connectors.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/engines/__init__.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/engines/claude_code.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/engines/http.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/engines/mcp.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/engines/n8n.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/engines/shell.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/integrations.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/inventory.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/library/__init__.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/manifest.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/prompt_studio.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/prompt_template.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/prompt_vars.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/run_log.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/schedules.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/secrets.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/ticket_run.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/usage.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/agents/varstore.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/browser_profile.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/cli.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/client.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/collectors/__init__.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/collectors/files.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/collectors/process.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/collectors/screenshot.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/config.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/crucial.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/custom_agents.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/departments.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/design_verify/__init__.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/design_verify/assets.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/design_verify/bootstrap.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/design_verify/browser.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/design_verify/compare.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/design_verify/loop.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/estimator.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/exceptions.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/firewall.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/formats.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/git_ops.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/github_fetch.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/github_ingest.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/graph_recon.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/graphify.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/hooks/__init__.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/hooks/crucial_guard.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/intake.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ipc/__init__.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ipc/electron_bridge.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ipc/handlers.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/journal.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/local_exec.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/memory_guard.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/models/__init__.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/models/envelope.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/models/requests.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/models/responses.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/models/snapshots.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/phase_timer.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/plan_run.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/platform_compat.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/prd_progress.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/proof_readers.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/providers.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/py.typed +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/resume.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/router.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/run_auto.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/schedule_tickets.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/scheduler.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/self_report.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/self_report_local.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/sse.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/swagger.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/task_file.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/task_types.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/test.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/test_pipeline.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ticket_fields.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/tickets.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/tiers/__init__.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/tiers/mini_agent.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/__init__.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/api.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/dashboard.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/health.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/ip_allowlist.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/jobs.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/models.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/runner.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/security.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/server.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/service.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/session.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/setup_manager.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/static/agents.html +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/static/app.js +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/static/chat.html +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/static/custom-agents.html +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/static/default-agents.html +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/static/index.html +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/static/report.html +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/static/runs.html +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/static/schedules.html +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/static/setup.html +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/static/styles.css +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/static/tickets.html +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/ui/swagger.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/updater.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/url_access.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/vendor/aidraftsman-cli-0.1.0.tgz +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/vps_health.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/vps_identity.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/sdk/write_hook.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/setup.cfg +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_activity_core.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_activity_live_tracking.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_activity_macos.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_activity_os_setup.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_activity_pipeline.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_agent_activity.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_agent_activity_tracking.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_agent_chat_features.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_agent_crud_cli.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_agent_listing.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_agent_prompt_async.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_agent_prompt_models.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_agent_run_ticket.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_agent_schedules.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_agent_workspace_settings.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_agents_connectors_builder.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_allowed_tools_config.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_auto_agent_dispatch.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_browser_profile.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_cheap_tier.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_client_jira_projects.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_config_token_diagnostics.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_configure_token_owner.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_console_encoding.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_crash_recovery.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_departments.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_done_transition.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_epic_decompose_run.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_epic_inherited_agent_id.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_epic_session_isolation.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_estimator.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_fallback_cli.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_firewall_open_on_update.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_formats.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_git_action.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_github_fetch.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_github_ingest.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_graph_recon.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_graphify_build.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_graphify_hook_install.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_health.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_intake_job_outcome.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_intake_plan_review.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_journal.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_local_exec_provider.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_mcp_route_contract.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_memory_guard.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_phase_timer.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_plan_new_command.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_plan_run_activity.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_pr_identity.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_prd_artifact.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_project_path_resolution.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_proof_readers.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_providers.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_recon_session_isolation.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_resume.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_router.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_run_auto_agent_only.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_run_outputs.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_run_verdict_is_honest.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_schedule_api.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_schedule_outputs_and_plans.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_schedule_tickets.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_scheduler.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_scheduler_transient_retry.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_self_report.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_service_token_warning.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_stale_panel_restart.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_swagger_command.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_task_file_and_plan_run.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_task_file_format_doc.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_ticket_cli.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_ticket_fields.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_ticket_run_resolve_by_id.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_ticket_speed_fixes.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_tier_flag_parity.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_ui_gate.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_ui_lifespan.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_update_timer.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_updater_extras.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_updater_pep668.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_updater_reports_the_truth.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_url_access.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_vps_health.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_vps_only_reporting.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_windows_loop_identity.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/tests/test_windows_task_paths.py +0 -0
- {devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/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.73
|
|
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.73" # 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
|
|
@@ -9,6 +9,14 @@ docs/ACTIVITY_AUDIT.md). Events used:
|
|
|
9
9
|
4624 logon → LOGIN event + the interactive session (types 2/10/11)
|
|
10
10
|
4634 / 4647 logoff → LOGOUT event, session closed
|
|
11
11
|
4625 failed logon → LOGIN event, action ``login.failed``
|
|
12
|
+
4778 RDP session reconnected → LOGIN event ``rdp.reconnect`` + the RDP session
|
|
13
|
+
4779 RDP session disconnected→ LOGOUT event ``rdp.disconnect``, session closed
|
|
14
|
+
|
|
15
|
+
4778/4779 matter more than 4624 in practice: people leave their remote desktop
|
|
16
|
+
session open and reconnect to it, which writes NO new 4624 type-10 logon. Without
|
|
17
|
+
them a VPS used all day showed no session at all, and every command its person ran
|
|
18
|
+
had no session to inherit — the fleet recorded 6 RDP sessions in two days.
|
|
19
|
+
They need the "Other Logon/Logoff Events" audit subcategory (``os_setup``).
|
|
12
20
|
|
|
13
21
|
The event parser and the processor are pure; only :class:`WindowsEventLogCollector`
|
|
14
22
|
touches the OS. Processes created by SYSTEM / LOCAL SERVICE / NETWORK SERVICE are
|
|
@@ -50,7 +58,7 @@ from sdk.activity.models import (
|
|
|
50
58
|
logger = logging.getLogger("sdk.activity.collectors.windows")
|
|
51
59
|
|
|
52
60
|
_NS = "{http://schemas.microsoft.com/win/2004/08/events/event}"
|
|
53
|
-
EVENT_IDS = (4688, 4624, 4634, 4647, 4625)
|
|
61
|
+
EVENT_IDS = (4688, 4624, 4634, 4647, 4625, 4778, 4779)
|
|
54
62
|
_MAX_PID_CACHE = 20_000
|
|
55
63
|
#: Executables the collector itself spawns to poll the log.
|
|
56
64
|
_OWN_TOOLS = ("wevtutil.exe",)
|
|
@@ -117,6 +125,11 @@ def _hex(value: str | None) -> int:
|
|
|
117
125
|
return 0
|
|
118
126
|
|
|
119
127
|
|
|
128
|
+
def _remote(ip: str) -> str | None:
|
|
129
|
+
"""A client address worth recording; ``None`` for blanks and loopback."""
|
|
130
|
+
return ip if ip and ip not in ("-", "::1", "127.0.0.1", "LOCAL") else None
|
|
131
|
+
|
|
132
|
+
|
|
120
133
|
def _is_person(user: str) -> bool:
|
|
121
134
|
upper = user.upper()
|
|
122
135
|
return bool(user) and not user.endswith("$") and upper not in _NON_PERSON_USERS \
|
|
@@ -153,6 +166,10 @@ class WindowsEventProcessor:
|
|
|
153
166
|
self._logoff(ev)
|
|
154
167
|
elif ev.event_id == 4625:
|
|
155
168
|
self._failed_logon(ev)
|
|
169
|
+
elif ev.event_id == 4778:
|
|
170
|
+
self._rdp_reconnect(ev)
|
|
171
|
+
elif ev.event_id == 4779:
|
|
172
|
+
self._rdp_disconnect(ev)
|
|
156
173
|
except Exception as exc: # noqa: BLE001 — one bad record must not stop the poll
|
|
157
174
|
logger.warning("eventlog: could not process %s/%s: %s", ev.event_id, ev.record_id, exc)
|
|
158
175
|
|
|
@@ -170,22 +187,65 @@ class WindowsEventProcessor:
|
|
|
170
187
|
if kind is None or not _is_person(user):
|
|
171
188
|
return
|
|
172
189
|
logon_id = d.get("TargetLogonId", "").lower()
|
|
173
|
-
|
|
174
|
-
|
|
190
|
+
remote = _remote(d.get("IpAddress", ""))
|
|
191
|
+
key, run_id = self._open_session(logon_id, user, kind, remote, ev.time)
|
|
192
|
+
recorder.record_event(ActivityEvent(
|
|
193
|
+
os=Os.WINDOWS, source=Source.WIN_EVENTLOG, category=Category.LOGIN, action="login",
|
|
194
|
+
occurredAt=ev.time, sessionKey=key, osUser=user, target=remote,
|
|
195
|
+
agentRunId=run_id, metadata={"logonType": logon_type},
|
|
196
|
+
))
|
|
197
|
+
|
|
198
|
+
def _open_session(
|
|
199
|
+
self, logon_id: str, user: str, kind: SessionKind, remote: str | None, when: float,
|
|
200
|
+
) -> tuple[str, str | None]:
|
|
201
|
+
"""Start a person's session for ``logon_id``; returns (session key, agent run id)."""
|
|
175
202
|
verdict = classify(ProcessFacts(
|
|
176
203
|
login_kind=kind, has_tty=True, is_agent_os_user=self._is_agent_user(user),
|
|
177
204
|
))
|
|
178
|
-
key = f"win:{logon_id}:{int(
|
|
205
|
+
key = f"win:{logon_id}:{int(when)}"
|
|
179
206
|
info = self._book.ensure(
|
|
180
|
-
key, started=
|
|
207
|
+
key, started=when, verdict=verdict, kind=kind, os_user=user, remote_ip=remote,
|
|
181
208
|
)
|
|
182
209
|
self._logons[logon_id] = key
|
|
183
210
|
self._kinds[logon_id] = kind
|
|
211
|
+
return key, info.agent_run_id
|
|
212
|
+
|
|
213
|
+
def _rdp_reconnect(self, ev: WinEvent) -> None:
|
|
214
|
+
"""4778: someone came back to an existing desktop session — they are here now.
|
|
215
|
+
|
|
216
|
+
The logon id is the ORIGINAL logon's, so processes the person starts from here
|
|
217
|
+
on carry it as their ``SubjectLogonId`` and inherit this session.
|
|
218
|
+
"""
|
|
219
|
+
d = ev.data
|
|
220
|
+
user = d.get("AccountName", "")
|
|
221
|
+
logon_id = d.get("LogonID", "").lower()
|
|
222
|
+
if not logon_id or not _is_person(user):
|
|
223
|
+
return
|
|
224
|
+
remote = _remote(d.get("ClientAddress", ""))
|
|
225
|
+
key = self._logons.get(logon_id)
|
|
226
|
+
run_id = None
|
|
227
|
+
if key is None:
|
|
228
|
+
key, run_id = self._open_session(logon_id, user, SessionKind.RDP, remote, ev.time)
|
|
184
229
|
recorder.record_event(ActivityEvent(
|
|
185
|
-
os=Os.WINDOWS, source=Source.WIN_EVENTLOG, category=Category.LOGIN,
|
|
186
|
-
occurredAt=ev.time, sessionKey=key, osUser=user,
|
|
187
|
-
|
|
230
|
+
os=Os.WINDOWS, source=Source.WIN_EVENTLOG, category=Category.LOGIN,
|
|
231
|
+
action="rdp.reconnect", occurredAt=ev.time, sessionKey=key, osUser=user,
|
|
232
|
+
target=remote, agentRunId=run_id,
|
|
233
|
+
metadata={"clientName": d.get("ClientName") or None},
|
|
234
|
+
))
|
|
235
|
+
|
|
236
|
+
def _rdp_disconnect(self, ev: WinEvent) -> None:
|
|
237
|
+
"""4779: the person left the desktop; the logon itself lives on until 4634."""
|
|
238
|
+
logon_id = ev.data.get("LogonID", "").lower()
|
|
239
|
+
key = self._logons.pop(logon_id, None)
|
|
240
|
+
self._kinds.pop(logon_id, None)
|
|
241
|
+
if not key:
|
|
242
|
+
return
|
|
243
|
+
recorder.record_event(ActivityEvent(
|
|
244
|
+
os=Os.WINDOWS, source=Source.WIN_EVENTLOG, category=Category.LOGOUT,
|
|
245
|
+
action="rdp.disconnect", occurredAt=ev.time, sessionKey=key,
|
|
246
|
+
osUser=ev.data.get("AccountName") or None,
|
|
188
247
|
))
|
|
248
|
+
self._book.end(key, ev.time)
|
|
189
249
|
|
|
190
250
|
def _logoff(self, ev: WinEvent) -> None:
|
|
191
251
|
logon_id = ev.data.get("TargetLogonId", "").lower()
|
|
@@ -79,6 +79,9 @@ _WIN_SUBCATEGORIES = (
|
|
|
79
79
|
("Process Creation", ("/success:enable",)),
|
|
80
80
|
("Logon", ("/success:enable", "/failure:enable")),
|
|
81
81
|
("Logoff", ("/success:enable",)),
|
|
82
|
+
# 4778/4779 — RDP reconnect / disconnect. Most people reconnect to an open
|
|
83
|
+
# desktop rather than log on afresh, so without this nobody is ever "there".
|
|
84
|
+
("Other Logon/Logoff Events", ("/success:enable",)),
|
|
82
85
|
)
|
|
83
86
|
_WIN_CMDLINE_KEY = r"HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit"
|
|
84
87
|
_WIN_CMDLINE_VALUE = "ProcessCreationIncludeCmdLine_Enabled"
|
|
@@ -87,6 +90,7 @@ _WIN_MANUAL = (
|
|
|
87
90
|
'auditpol /set /subcategory:"Process Creation" /success:enable\n'
|
|
88
91
|
'auditpol /set /subcategory:"Logon" /success:enable /failure:enable\n'
|
|
89
92
|
'auditpol /set /subcategory:"Logoff" /success:enable\n'
|
|
93
|
+
'auditpol /set /subcategory:"Other Logon/Logoff Events" /success:enable\n'
|
|
90
94
|
f"reg add {_WIN_CMDLINE_KEY} /v {_WIN_CMDLINE_VALUE} /t REG_DWORD /d 1 /f\n"
|
|
91
95
|
f"wevtutil sl Security /ms:{_WIN_LOG_BYTES}\n"
|
|
92
96
|
f"then add {AUDIT_FLAG}=1 to %USERPROFILE%\\.agentos\\.env and restart the panel"
|
|
@@ -507,6 +507,58 @@ class TestWindowsProcessing:
|
|
|
507
507
|
assert (events[0]["action"], events[0]["severity"], events[0]["target"]) == (
|
|
508
508
|
"login.failed", "WARNING", "198.51.100.9")
|
|
509
509
|
|
|
510
|
+
RECONNECT = dict(AccountName="alice", AccountDomain="WIN-HOST", LogonID="0xabc123",
|
|
511
|
+
SessionName="RDP-Tcp#3", ClientName="ALICE-LAPTOP",
|
|
512
|
+
ClientAddress="203.0.113.7")
|
|
513
|
+
|
|
514
|
+
def test_an_rdp_reconnect_is_a_human_session_its_commands_inherit(self):
|
|
515
|
+
"""People reconnect to an open desktop; no fresh 4624 is written for it."""
|
|
516
|
+
_win(
|
|
517
|
+
_xml(4778, 1, **self.RECONNECT),
|
|
518
|
+
_xml(4688, 2, NewProcessId="0x200", ProcessId="0x100", SubjectUserName="alice",
|
|
519
|
+
SubjectLogonId="0xabc123", NewProcessName="C:\\x\\chrome.exe"),
|
|
520
|
+
)
|
|
521
|
+
sessions, events = _queued()
|
|
522
|
+
s = sessions[0]
|
|
523
|
+
assert s["externalKey"].startswith("win:0xabc123:")
|
|
524
|
+
assert (s["kind"], s["actorType"], s["remoteIp"], s["osUser"]) == (
|
|
525
|
+
"RDP", "HUMAN", "203.0.113.7", "alice")
|
|
526
|
+
login, cmd = events
|
|
527
|
+
assert (login["category"], login["action"], login["sessionKey"]) == (
|
|
528
|
+
"LOGIN", "rdp.reconnect", s["externalKey"])
|
|
529
|
+
assert login["metadata"] == {"clientName": "ALICE-LAPTOP"}
|
|
530
|
+
assert (cmd["sessionKey"], cmd["actorType"]) == (s["externalKey"], "HUMAN")
|
|
531
|
+
|
|
532
|
+
def test_an_rdp_disconnect_closes_the_session(self):
|
|
533
|
+
_win(_xml(4778, 1, **self.RECONNECT),
|
|
534
|
+
_xml(4779, 2, **self.RECONNECT))
|
|
535
|
+
sessions, events = _queued()
|
|
536
|
+
assert "endedAt" in sessions[0]
|
|
537
|
+
assert (events[-1]["category"], events[-1]["action"]) == ("LOGOUT", "rdp.disconnect")
|
|
538
|
+
|
|
539
|
+
def test_a_reconnect_inside_a_session_we_already_track_reuses_it(self):
|
|
540
|
+
_win(_xml(4624, 1, **self.LOGON),
|
|
541
|
+
_xml(4778, 2, **self.RECONNECT))
|
|
542
|
+
sessions, events = _queued()
|
|
543
|
+
assert len(sessions) == 1
|
|
544
|
+
assert {e["sessionKey"] for e in events} == {sessions[0]["externalKey"]}
|
|
545
|
+
|
|
546
|
+
def test_disconnect_then_reconnect_opens_a_new_session(self):
|
|
547
|
+
_win(_xml(4778, 1, **self.RECONNECT),
|
|
548
|
+
_xml(4779, 2, time="2026-10-09T12:10:00Z", **self.RECONNECT),
|
|
549
|
+
_xml(4778, 3, time="2026-10-09T13:00:00Z", **self.RECONNECT))
|
|
550
|
+
sessions, _ = _queued()
|
|
551
|
+
assert len({s["externalKey"] for s in sessions}) == 2
|
|
552
|
+
|
|
553
|
+
@pytest.mark.parametrize("user", ["SYSTEM", "WIN-HOST$", "DWM-2", ""])
|
|
554
|
+
def test_a_reconnect_by_a_non_person_is_ignored(self, user):
|
|
555
|
+
_win(_xml(4778, 1, **{**self.RECONNECT, "AccountName": user}))
|
|
556
|
+
assert _queued() == ([], [])
|
|
557
|
+
|
|
558
|
+
def test_a_disconnect_for_an_unknown_logon_is_ignored(self):
|
|
559
|
+
_win(_xml(4779, 1, **self.RECONNECT))
|
|
560
|
+
assert _queued() == ([], [])
|
|
561
|
+
|
|
510
562
|
def test_a_secret_on_the_command_line_is_redacted(self):
|
|
511
563
|
_win(_xml(4624, 1, **self.LOGON),
|
|
512
564
|
_xml(4688, 2, NewProcessId="0x200", ProcessId="0x100", SubjectUserName="alice",
|
|
File without changes
|
|
File without changes
|
{devops_bot_sdk-1.6.71 → devops_bot_sdk-1.6.73}/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
|
|
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
|