devops-bot-sdk 1.6.47__tar.gz → 1.6.48__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.47 → devops_bot_sdk-1.6.48}/PKG-INFO +1 -1
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/devops_bot_sdk.egg-info/PKG-INFO +1 -1
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/__init__.py +2 -2
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/activity/os_setup.py +39 -9
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_activity_os_setup.py +35 -5
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/README.md +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/devops_bot_sdk.egg-info/SOURCES.txt +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/devops_bot_sdk.egg-info/dependency_links.txt +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/devops_bot_sdk.egg-info/entry_points.txt +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/devops_bot_sdk.egg-info/requires.txt +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/devops_bot_sdk.egg-info/top_level.txt +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/pyproject.toml +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/activity/__init__.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/activity/classifier.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/activity/collectors/__init__.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/activity/collectors/common.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/activity/collectors/linux_auditd.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/activity/collectors/macos_eslogger.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/activity/collectors/windows_eventlog.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/activity/models.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/activity/recorder.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/activity/redact.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/activity/settings.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/activity/shipper.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/activity/spool.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agentd.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/__init__.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/activity.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/builder.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/chat.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/connectors.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/engines/__init__.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/engines/claude_code.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/engines/http.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/engines/mcp.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/engines/n8n.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/engines/shell.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/integrations.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/inventory.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/library/__init__.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/manifest.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/prompt_studio.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/prompt_template.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/prompt_vars.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/run_log.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/schedules.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/secrets.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/ticket_run.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/usage.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/agents/varstore.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/browser_profile.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/cli.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/client.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/collectors/__init__.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/collectors/files.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/collectors/process.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/collectors/screenshot.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/config.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/crucial.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/departments.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/design_verify/__init__.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/design_verify/assets.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/design_verify/bootstrap.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/design_verify/browser.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/design_verify/compare.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/design_verify/loop.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/estimator.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/exceptions.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/firewall.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/formats.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/git_ops.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/github_fetch.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/github_ingest.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/graph_recon.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/graphify.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/hooks/__init__.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/hooks/crucial_guard.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/intake.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ipc/__init__.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ipc/electron_bridge.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ipc/handlers.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/journal.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/local_exec.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/memory_guard.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/models/__init__.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/models/envelope.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/models/requests.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/models/responses.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/models/snapshots.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/phase_timer.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/plan_run.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/platform_compat.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/prd_progress.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/proof_readers.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/providers.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/py.typed +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/resume.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/router.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/run_auto.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/scheduler.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/self_report.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/self_report_local.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/sse.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/swagger.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/task_file.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/task_types.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/test.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/test_pipeline.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ticket_fields.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/tiers/__init__.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/tiers/mini_agent.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/__init__.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/api.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/dashboard.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/health.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/ip_allowlist.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/jobs.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/models.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/runner.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/security.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/server.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/service.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/session.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/setup_manager.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/static/agents.html +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/static/app.js +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/static/chat.html +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/static/custom-agents.html +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/static/default-agents.html +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/static/index.html +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/static/report.html +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/static/runs.html +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/static/schedules.html +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/static/setup.html +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/static/styles.css +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/static/tickets.html +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/ui/swagger.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/updater.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/url_access.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/vps_health.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/sdk/write_hook.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/setup.cfg +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_activity_collectors.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_activity_core.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_activity_macos.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_activity_pipeline.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_agent_activity.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_agent_activity_tracking.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_agent_chat_features.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_agent_listing.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_agent_prompt_async.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_agent_prompt_models.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_agent_run_ticket.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_agent_schedules.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_agent_workspace_settings.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_agents_connectors_builder.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_allowed_tools_config.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_auto_agent_dispatch.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_browser_profile.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_cheap_tier.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_client_jira_projects.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_config_token_diagnostics.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_configure_token_owner.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_console_encoding.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_crash_recovery.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_departments.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_done_transition.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_epic_decompose_run.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_epic_inherited_agent_id.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_epic_session_isolation.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_estimator.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_firewall_open_on_update.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_formats.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_git_action.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_github_fetch.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_github_ingest.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_graph_recon.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_graphify_build.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_graphify_hook_install.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_health.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_intake_job_outcome.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_intake_plan_review.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_journal.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_local_exec_provider.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_mcp_route_contract.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_memory_guard.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_phase_timer.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_plan_new_command.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_plan_run_activity.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_pr_identity.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_prd_artifact.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_project_path_resolution.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_proof_readers.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_providers.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_recon_session_isolation.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_resume.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_router.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_run_auto_agent_only.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_run_outputs.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_run_verdict_is_honest.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_schedule_api.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_schedule_outputs_and_plans.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_scheduler.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_self_report.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_service_token_warning.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_swagger_command.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_task_file_and_plan_run.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_task_file_format_doc.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_ticket_fields.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_ticket_run_resolve_by_id.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_ticket_speed_fixes.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_tier_flag_parity.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_ui_gate.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_ui_lifespan.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_update_timer.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_updater_extras.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_updater_reports_the_truth.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_url_access.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_vps_health.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/tests/test_windows_loop_identity.py +0 -0
- {devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/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.48
|
|
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.48" # 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
|
|
@@ -535,9 +535,12 @@ def ensure(apply: bool = True) -> tuple[bool, str]:
|
|
|
535
535
|
return False, "" # set up already (by hand, or by an earlier run)
|
|
536
536
|
if apply and sysname == "linux" and _sudo_without_password():
|
|
537
537
|
return _ensure_via_sudo()
|
|
538
|
+
import shlex
|
|
539
|
+
|
|
540
|
+
cmd = " ".join(shlex.quote(a) for a in _privileged_argv())
|
|
538
541
|
return False, ("activity audit is not set up — human activity on this VPS is "
|
|
539
|
-
f"not being recorded. Run once:\n sudo {
|
|
540
|
-
|
|
542
|
+
f"not being recorded. Run once:\n sudo {cmd}\nor by hand:\n"
|
|
543
|
+
+ manual)
|
|
541
544
|
|
|
542
545
|
step = {"linux": _ensure_linux, "windows": _ensure_windows, "darwin": _ensure_macos}
|
|
543
546
|
_, done, err = step[sysname]()
|
|
@@ -575,7 +578,7 @@ def _ensure_via_sudo() -> tuple[bool, str]:
|
|
|
575
578
|
installation is what runs — never whatever ``agentos`` is first on root's PATH.
|
|
576
579
|
"""
|
|
577
580
|
before = settings.audit_enabled()
|
|
578
|
-
rc, out = _run(["sudo", "-n",
|
|
581
|
+
rc, out = _run(["sudo", "-n", *_privileged_argv()], timeout=1800)
|
|
579
582
|
lines = [ln.strip() for ln in out.splitlines() if ln.strip()]
|
|
580
583
|
# cli() prints the outcome first ("activity audit …") and a restart hint after it.
|
|
581
584
|
last = next((ln for ln in lines if ln.startswith("activity audit")), lines[-1] if lines else "")
|
|
@@ -587,12 +590,39 @@ def _ensure_via_sudo() -> tuple[bool, str]:
|
|
|
587
590
|
("activity audit enabled (via sudo)" if changed else ""))
|
|
588
591
|
|
|
589
592
|
|
|
590
|
-
def
|
|
591
|
-
"""
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
593
|
+
def _import_path() -> str:
|
|
594
|
+
"""This process's import path, for the root child.
|
|
595
|
+
|
|
596
|
+
A ``pip install --user`` puts the SDK and its dependencies in the USER's site
|
|
597
|
+
directory (``~/.local/lib/pythonX.Y/site-packages``), which root's interpreter
|
|
598
|
+
never looks in. So ``sudo python3 -m sdk.activity.os_setup`` failed with
|
|
599
|
+
``No module named 'sdk'``, and ``sudo agentos`` failed the same way even with a
|
|
600
|
+
full path. Handing the child exactly the path this process imports from makes it
|
|
601
|
+
import what we import: a --user install, a venv or an editable checkout alike.
|
|
602
|
+
(It runs as root from user-writable directories. That grants nothing, because
|
|
603
|
+
it only happens for a user who already has root through sudo.)
|
|
604
|
+
"""
|
|
605
|
+
# Not the caller's working directory (``-m`` puts it on sys.path): a root child
|
|
606
|
+
# has no business importing whatever happens to sit in the folder someone ran the
|
|
607
|
+
# panel from. Kept only when the SDK itself lives there (an editable checkout).
|
|
608
|
+
sdk_home = str(Path(__file__).resolve().parents[2])
|
|
609
|
+
cwd = os.getcwd()
|
|
610
|
+
seen: list[str] = []
|
|
611
|
+
for p in sys.path:
|
|
612
|
+
if not p or not os.path.isdir(p):
|
|
613
|
+
continue
|
|
614
|
+
p = os.path.abspath(p)
|
|
615
|
+
if p == cwd and p != sdk_home:
|
|
616
|
+
continue
|
|
617
|
+
if p not in seen:
|
|
618
|
+
seen.append(p)
|
|
619
|
+
return os.pathsep.join(seen)
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
def _privileged_argv() -> list[str]:
|
|
623
|
+
"""The command (minus ``sudo``) that runs the privileged half: same interpreter,
|
|
624
|
+
same import path, through ``env`` so ``sudo``'s environment reset cannot drop it."""
|
|
625
|
+
return ["env", f"PYTHONPATH={_import_path()}", sys.executable, "-m", "sdk.activity.os_setup"]
|
|
596
626
|
|
|
597
627
|
|
|
598
628
|
def cli(argv: list[str]) -> int:
|
|
@@ -233,7 +233,11 @@ def test_unprivileged_with_passwordless_sudo_sets_itself_up(box, monkeypatch, tm
|
|
|
233
233
|
monkeypatch.setattr(O, "_run", run)
|
|
234
234
|
|
|
235
235
|
changed, msg = O.ensure()
|
|
236
|
-
assert calls ==
|
|
236
|
+
assert len(calls) == 1
|
|
237
|
+
cmd = calls[0]
|
|
238
|
+
assert cmd[:3] == ["sudo", "-n", "env"]
|
|
239
|
+
assert cmd[3].startswith("PYTHONPATH=")
|
|
240
|
+
assert cmd[4:] == [O.sys.executable, "-m", "sdk.activity.os_setup"]
|
|
237
241
|
assert changed is True
|
|
238
242
|
assert msg.startswith("activity audit enabled")
|
|
239
243
|
|
|
@@ -247,13 +251,16 @@ def test_a_failing_sudo_run_is_reported_not_raised(box, monkeypatch):
|
|
|
247
251
|
assert changed is False and "incomplete" in msg and "audit rules did not load" in msg
|
|
248
252
|
|
|
249
253
|
|
|
250
|
-
def
|
|
254
|
+
def test_sudo_with_a_password_prints_one_command_that_root_can_actually_run(box, monkeypatch):
|
|
255
|
+
"""`sudo agentos activity-setup` cannot work for a --user install: root neither
|
|
256
|
+
finds `agentos` nor can import `sdk`. The hint carries the interpreter and path."""
|
|
251
257
|
monkeypatch.setattr(O, "_is_privileged", lambda: False)
|
|
252
258
|
monkeypatch.setattr(O, "_sudo_without_password", lambda: False)
|
|
253
|
-
monkeypatch.setattr(O, "
|
|
259
|
+
monkeypatch.setattr(O, "_import_path", lambda: "/home/umer/.local/lib/python3.12/site-packages")
|
|
254
260
|
changed, msg = O.ensure()
|
|
255
261
|
assert changed is False
|
|
256
|
-
assert "sudo
|
|
262
|
+
assert ("sudo env PYTHONPATH=/home/umer/.local/lib/python3.12/site-packages "
|
|
263
|
+
f"{O.sys.executable} -m sdk.activity.os_setup") in msg
|
|
257
264
|
|
|
258
265
|
|
|
259
266
|
def test_flag_on_but_log_unreadable_is_not_treated_as_set_up(box, monkeypatch):
|
|
@@ -264,7 +271,7 @@ def test_flag_on_but_log_unreadable_is_not_treated_as_set_up(box, monkeypatch):
|
|
|
264
271
|
tried = []
|
|
265
272
|
monkeypatch.setattr(O, "_sudo_without_password", lambda: tried.append(1) or False)
|
|
266
273
|
_, msg = O.ensure()
|
|
267
|
-
assert tried and "activity
|
|
274
|
+
assert tried and "-m sdk.activity.os_setup" in msg
|
|
268
275
|
|
|
269
276
|
|
|
270
277
|
def test_sudo_is_never_tried_on_a_check(box, monkeypatch):
|
|
@@ -281,3 +288,26 @@ def test_privileged_without_sudo_is_a_root_panel_and_never_a_guessed_user(monkey
|
|
|
281
288
|
assert O._panel_user() is None
|
|
282
289
|
monkeypatch.setenv("SUDO_USER", "root")
|
|
283
290
|
assert O._panel_user() is None
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def test_the_root_child_can_import_the_sdk_without_site_packages(tmp_path):
|
|
294
|
+
"""Regression for a `pip install --user` box: under sudo, root's interpreter does
|
|
295
|
+
not see the user's site-packages (`No module named 'sdk'`). `-S` drops site-packages
|
|
296
|
+
the same way, so with only the PYTHONPATH we hand over, the import must succeed."""
|
|
297
|
+
import subprocess
|
|
298
|
+
|
|
299
|
+
argv = O._privileged_argv()
|
|
300
|
+
env = {"PATH": "/usr/bin:/bin", argv[1].split("=", 1)[0]: argv[1].split("=", 1)[1]}
|
|
301
|
+
proc = subprocess.run(
|
|
302
|
+
[argv[2], "-S", "-c", "import sdk.activity.os_setup"],
|
|
303
|
+
cwd=tmp_path, env=env, capture_output=True, text=True, timeout=60,
|
|
304
|
+
)
|
|
305
|
+
assert proc.returncode == 0, proc.stderr
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def test_the_working_directory_is_not_handed_to_root(tmp_path, monkeypatch):
|
|
309
|
+
monkeypatch.chdir(tmp_path)
|
|
310
|
+
monkeypatch.setattr(O.sys, "path", [str(tmp_path), "", *O.sys.path])
|
|
311
|
+
parts = O._import_path().split(O.os.pathsep)
|
|
312
|
+
assert str(tmp_path) not in parts
|
|
313
|
+
assert len(parts) == len(set(parts))
|
|
File without changes
|
|
File without changes
|
{devops_bot_sdk-1.6.47 → devops_bot_sdk-1.6.48}/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
|