devops-bot-sdk 1.7.47__tar.gz → 1.7.50__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.7.47 → devops_bot_sdk-1.7.50}/PKG-INFO +1 -1
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/devops_bot_sdk.egg-info/PKG-INFO +1 -1
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/devops_bot_sdk.egg-info/SOURCES.txt +4 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/__init__.py +2 -2
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agentd.py +6 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/cli.py +22 -1
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/help_data/areas.json +16 -16
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/help_data/commands.json +10 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/help_data/releases.json +20 -0
- devops_bot_sdk-1.7.50/sdk/help_data/snapshot.json +17 -0
- devops_bot_sdk-1.7.50/sdk/install_marker.py +175 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ipc/handlers.py +20 -4
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/local_exec.py +146 -10
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/run_auto.py +6 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/server.py +6 -0
- devops_bot_sdk-1.7.50/tests/test_fallback_folder_changes.py +39 -0
- devops_bot_sdk-1.7.50/tests/test_fallback_parity.py +127 -0
- devops_bot_sdk-1.7.50/tests/test_install_marker.py +169 -0
- devops_bot_sdk-1.7.47/sdk/help_data/snapshot.json +0 -17
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/README.md +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/devops_bot_sdk.egg-info/dependency_links.txt +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/devops_bot_sdk.egg-info/entry_points.txt +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/devops_bot_sdk.egg-info/requires.txt +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/devops_bot_sdk.egg-info/top_level.txt +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/pyproject.toml +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/activity/__init__.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/activity/classifier.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/activity/collectors/__init__.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/activity/collectors/common.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/activity/collectors/linux_auditd.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/activity/collectors/macos_eslogger.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/activity/collectors/windows_eventlog.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/activity/models.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/activity/os_setup.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/activity/recorder.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/activity/redact.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/activity/settings.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/activity/shipper.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/activity/spool.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agent_sharing.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/__init__.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/activity.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/builder.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/chat.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/connectors.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/engines/__init__.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/engines/claude_code.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/engines/http.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/engines/mcp.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/engines/n8n.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/engines/shell.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/integrations.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/inventory.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/library/__init__.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/manifest.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/prompt_studio.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/prompt_template.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/prompt_vars.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/run_log.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/schedules.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/secrets.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/ticket_run.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/usage.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/agents/varstore.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/browser_profile.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/claude_usage.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/client.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/collectors/__init__.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/collectors/files.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/collectors/process.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/collectors/screenshot.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/config.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/crucial.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/custom_agents.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/deferred_tickets.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/departments.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/design_verify/__init__.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/design_verify/assets.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/design_verify/bootstrap.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/design_verify/browser.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/design_verify/compare.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/design_verify/loop.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/estimator.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/exceptions.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/fallback_handoff.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/faqs.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/firewall.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/formats.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/git_ops.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/github_fetch.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/github_ingest.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/graph_recon.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/graphify.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/help_actions.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/help_data/help.json +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/help_data/pages.json +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/helpdesk.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/helpdesk_kb.md +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/hooks/__init__.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/hooks/crucial_guard.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/instructions_template.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/intake.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ipc/__init__.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ipc/electron_bridge.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/journal.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/log_colors.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/memory_guard.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/model_policy.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/models/__init__.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/models/envelope.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/models/requests.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/models/responses.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/models/snapshots.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/phase_timer.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/plan_run.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/platform_compat.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/prd_progress.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/proof_readers.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/providers.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/py.typed +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/resume.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/router.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/schedule_tickets.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/schedule_timeline.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/scheduler.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/scope_plan.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/self_report.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/self_report_local.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/sse.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/swagger.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/task_file.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/task_types.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/test.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/test_env.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/test_pipeline.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ticket_board.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ticket_bulk.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ticket_fields.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ticket_plan.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ticket_pools.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/tickets.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/tiers/__init__.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/tiers/mini_agent.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/__init__.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/api.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/dashboard.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/health.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/ip_allowlist.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/jobs.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/models.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/runner.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/security.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/service.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/session.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/setup_manager.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/static/agents.html +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/static/app.js +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/static/chat.html +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/static/custom-agents.html +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/static/default-agents.html +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/static/faqs.html +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/static/help.html +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/static/index.html +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/static/report.html +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/static/runs.html +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/static/schedules.html +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/static/setup.html +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/static/styles.css +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/static/tickets.html +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/ui/swagger.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/updater.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/url_access.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/vps_health.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/vps_identity.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/sdk/write_hook.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/setup.cfg +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_activity_claude_runs.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_activity_collectors.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_activity_core.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_activity_live_tracking.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_activity_macos.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_activity_os_setup.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_activity_pipeline.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_agent_activity.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_agent_activity_tracking.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_agent_chat_features.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_agent_crud_cli.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_agent_listing.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_agent_prompt_async.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_agent_prompt_models.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_agent_run_ticket.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_agent_schedules.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_agent_sharing.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_agent_workspace_settings.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_agents_connectors_builder.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_allowed_tools_config.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_approval_park.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_auto_agent_dispatch.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_auto_ticket_queue.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_backend_only_allowlist.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_browser_profile.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_cheap_tier.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_claude_usage_gate.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_client_jira_projects.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_config_token_diagnostics.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_configure_token_owner.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_console_encoding.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_crash_recovery.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_create_safe_retry.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_deferred_tickets.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_departments.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_done_transition.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_epic_decompose_run.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_epic_inherited_agent_id.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_epic_session_isolation.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_estimator.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_fallback_cli.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_fallback_cli_upgrade.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_fallback_rate_limit.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_faqs.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_firewall_open_on_update.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_formats.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_git_action.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_github_fetch.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_github_ingest.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_graph_off_by_default.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_graph_recon.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_graphify_build.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_graphify_hook_install.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_health.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_help_actions.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_help_attachments.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_help_questions.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_helpdesk.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_infographic_data.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_instructions_template.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_intake_job_outcome.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_intake_plan_review.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_journal.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_limit_fallback_handoff.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_local_exec_provider.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_log_colors_backlog.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_mcp_route_contract.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_memory_guard.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_model_policy.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_panel_help.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_panel_ticket_schedules.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_parallel_tickets.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_phase_timer.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_plan_ahead.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_plan_new_command.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_plan_run_activity.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_pool_pr_modes.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_pr_identity.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_prd_artifact.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_project_path_resolution.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_proof_readers.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_providers.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_quiet_run_log.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_recon_session_isolation.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_resume.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_router.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_run_auto_agent_only.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_run_outputs.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_run_verdict_is_honest.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_schedule_api.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_schedule_outputs_and_plans.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_schedule_tickets.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_schedule_timeline.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_scheduler.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_scheduler_transient_retry.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_self_report.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_service_token_warning.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_stale_panel_restart.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_swagger_command.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_task_file_and_plan_run.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_task_file_format_doc.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_theme_switch.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_ticket_board.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_ticket_bulk.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_ticket_cli.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_ticket_detail_view.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_ticket_fields.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_ticket_plan.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_ticket_pools.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_ticket_run_resolve_by_id.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_ticket_schedule_and_agent.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_ticket_speed_fixes.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_tier_flag_parity.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_ui_bruteforce_guard.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_ui_gate.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_ui_lifespan.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_ui_no_native_dialogs.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_update_timer.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_updater_extras.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_updater_ignores_cwd.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_updater_pep668.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_updater_reports_the_truth.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_url_access.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_version_flag.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_vps_health.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_vps_only_reporting.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_windows_loop_identity.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_windows_panel_task.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_windows_stop_and_pidfile.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_windows_task_paths.py +0 -0
- {devops_bot_sdk-1.7.47 → devops_bot_sdk-1.7.50}/tests/test_write_hook.py +0 -0
|
@@ -32,6 +32,7 @@ sdk/graphify.py
|
|
|
32
32
|
sdk/help_actions.py
|
|
33
33
|
sdk/helpdesk.py
|
|
34
34
|
sdk/helpdesk_kb.md
|
|
35
|
+
sdk/install_marker.py
|
|
35
36
|
sdk/instructions_template.py
|
|
36
37
|
sdk/intake.py
|
|
37
38
|
sdk/journal.py
|
|
@@ -209,6 +210,8 @@ tests/test_epic_session_isolation.py
|
|
|
209
210
|
tests/test_estimator.py
|
|
210
211
|
tests/test_fallback_cli.py
|
|
211
212
|
tests/test_fallback_cli_upgrade.py
|
|
213
|
+
tests/test_fallback_folder_changes.py
|
|
214
|
+
tests/test_fallback_parity.py
|
|
212
215
|
tests/test_fallback_rate_limit.py
|
|
213
216
|
tests/test_faqs.py
|
|
214
217
|
tests/test_firewall_open_on_update.py
|
|
@@ -226,6 +229,7 @@ tests/test_help_attachments.py
|
|
|
226
229
|
tests/test_help_questions.py
|
|
227
230
|
tests/test_helpdesk.py
|
|
228
231
|
tests/test_infographic_data.py
|
|
232
|
+
tests/test_install_marker.py
|
|
229
233
|
tests/test_instructions_template.py
|
|
230
234
|
tests/test_intake_job_outcome.py
|
|
231
235
|
tests/test_intake_plan_review.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""AgentOS Desktop SDK — thin HTTPS/SSE client for the Electron app.
|
|
2
2
|
|
|
3
|
-
Version: 1.7.
|
|
3
|
+
Version: 1.7.50
|
|
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.7.
|
|
37
|
+
__version__ = "1.7.50" # 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
|
|
@@ -854,6 +854,12 @@ def main() -> None:
|
|
|
854
854
|
from sdk.platform_compat import ensure_macos_fork_safety, ensure_utf8_stdio
|
|
855
855
|
ensure_utf8_stdio()
|
|
856
856
|
|
|
857
|
+
# Record where this installation's scripts live (~/.agentos/install.json) so
|
|
858
|
+
# external tools (e.g. over a minimal-PATH SSH session) can find the CLI.
|
|
859
|
+
# Never raises, never prints; rewrites only when something changed.
|
|
860
|
+
from sdk.install_marker import record_install_location
|
|
861
|
+
record_install_location()
|
|
862
|
+
|
|
857
863
|
# macOS: keep the background daemon from aborting ("Python quit unexpectedly")
|
|
858
864
|
# when it does networking after the double-fork. May re-exec once; must run
|
|
859
865
|
# before any fork or objc-linked import.
|
|
@@ -8,6 +8,14 @@ the "verb".
|
|
|
8
8
|
|
|
9
9
|
Command surface:
|
|
10
10
|
|
|
11
|
+
agentos where [--json]
|
|
12
|
+
Where THIS installation lives: the directory holding the agentos /
|
|
13
|
+
agentos-auto scripts (bin_dir), the Python running it, the SDK version,
|
|
14
|
+
and the path of ~/.agentos/install.json — which every entry point keeps
|
|
15
|
+
current and this command refreshes. For external tools (the AI Draftsman
|
|
16
|
+
DevOps Bot SDK connector) that reach the machine over a minimal-PATH SSH
|
|
17
|
+
session. See sdk.install_marker.
|
|
18
|
+
|
|
11
19
|
agentos configure [--rotate]
|
|
12
20
|
Store (or replace) the co_<uuid>_<hex> backend token. See
|
|
13
21
|
sdk.config.configure_cli.
|
|
@@ -173,6 +181,12 @@ def main() -> None:
|
|
|
173
181
|
from sdk.platform_compat import ensure_utf8_stdio
|
|
174
182
|
ensure_utf8_stdio()
|
|
175
183
|
|
|
184
|
+
# Record where this installation's scripts live (~/.agentos/install.json) so
|
|
185
|
+
# external tools (e.g. over a minimal-PATH SSH session) can find the CLI.
|
|
186
|
+
# Never raises, never prints; rewrites only when something changed.
|
|
187
|
+
from sdk.install_marker import record_install_location
|
|
188
|
+
record_install_location()
|
|
189
|
+
|
|
176
190
|
argv = sys.argv[1:]
|
|
177
191
|
if not argv:
|
|
178
192
|
_print_usage()
|
|
@@ -185,6 +199,12 @@ def main() -> None:
|
|
|
185
199
|
print(version_line())
|
|
186
200
|
return
|
|
187
201
|
|
|
202
|
+
if noun == "where":
|
|
203
|
+
# Where this installation lives (bin_dir, python, version) + the path of
|
|
204
|
+
# ~/.agentos/install.json, which it refreshes. `--json` for machines.
|
|
205
|
+
from sdk.install_marker import where_cli
|
|
206
|
+
sys.exit(where_cli(rest))
|
|
207
|
+
|
|
188
208
|
if noun == "configure":
|
|
189
209
|
from sdk.config import configure_cli
|
|
190
210
|
configure_cli(rotate="--rotate" in sys.argv)
|
|
@@ -274,9 +294,10 @@ def main() -> None:
|
|
|
274
294
|
|
|
275
295
|
|
|
276
296
|
def _print_usage() -> None:
|
|
277
|
-
print("usage: agentos <configure|chat|agent|ticket|integration|default-agents|agentd|github|report|browser|fallback|help|doctor|firewall|allow-ip|activity-setup|swagger> ...")
|
|
297
|
+
print("usage: agentos <where|configure|chat|agent|ticket|integration|default-agents|agentd|github|report|browser|fallback|help|doctor|firewall|allow-ip|activity-setup|swagger> ...")
|
|
278
298
|
print()
|
|
279
299
|
print(' agentos version (or --version) # installed SDK version, Python and install path')
|
|
300
|
+
print(' agentos where [--json] # bin dir of agentos/agentos-auto, python, version; refreshes ~/.agentos/install.json')
|
|
280
301
|
print(' agentos help "<your problem>" [--file PATH]… # DevOps Bot Help: reads your logs + the SDK (+ screenshots/logs you attach)')
|
|
281
302
|
print(" agentos doctor # collect a diagnostics bundle to send to your admin (no AI)")
|
|
282
303
|
print(" agentos configure [--rotate]")
|
|
@@ -35,6 +35,15 @@
|
|
|
35
35
|
"latest_pr": 183,
|
|
36
36
|
"latest_date": "2026-10-28"
|
|
37
37
|
},
|
|
38
|
+
{
|
|
39
|
+
"area": "AI fallback",
|
|
40
|
+
"changes_30d": 4,
|
|
41
|
+
"features_30d": 2,
|
|
42
|
+
"fixes_30d": 2,
|
|
43
|
+
"latest": "AI Draftsman fallback resumes, fails loudly when blocked, sees non-git edits",
|
|
44
|
+
"latest_pr": 192,
|
|
45
|
+
"latest_date": "2026-11-04"
|
|
46
|
+
},
|
|
38
47
|
{
|
|
39
48
|
"area": "Windows",
|
|
40
49
|
"changes_30d": 4,
|
|
@@ -45,13 +54,13 @@
|
|
|
45
54
|
"latest_date": "2026-10-24"
|
|
46
55
|
},
|
|
47
56
|
{
|
|
48
|
-
"area": "
|
|
49
|
-
"changes_30d":
|
|
50
|
-
"features_30d":
|
|
51
|
-
"fixes_30d":
|
|
52
|
-
"latest": "
|
|
53
|
-
"latest_pr":
|
|
54
|
-
"latest_date": "2026-
|
|
57
|
+
"area": "Agents",
|
|
58
|
+
"changes_30d": 2,
|
|
59
|
+
"features_30d": 1,
|
|
60
|
+
"fixes_30d": 0,
|
|
61
|
+
"latest": "record install location in ~/.agentos/install.json + agentos where",
|
|
62
|
+
"latest_pr": 191,
|
|
63
|
+
"latest_date": "2026-11-03"
|
|
55
64
|
},
|
|
56
65
|
{
|
|
57
66
|
"area": "Schedules",
|
|
@@ -62,15 +71,6 @@
|
|
|
62
71
|
"latest_pr": 163,
|
|
63
72
|
"latest_date": "2026-10-23"
|
|
64
73
|
},
|
|
65
|
-
{
|
|
66
|
-
"area": "Agents",
|
|
67
|
-
"changes_30d": 1,
|
|
68
|
-
"features_30d": 0,
|
|
69
|
-
"fixes_30d": 0,
|
|
70
|
-
"latest": "APPR-539: [ST0135] Early years educator - Course Orchestrator + 69 item agents",
|
|
71
|
-
"latest_pr": 146,
|
|
72
|
-
"latest_date": "2026-10-20"
|
|
73
|
-
},
|
|
74
74
|
{
|
|
75
75
|
"area": "Daemon",
|
|
76
76
|
"changes_30d": 1,
|
|
@@ -19,6 +19,16 @@
|
|
|
19
19
|
"doc": "https://github.com/consultancy-outfit/DevOpsBot-SDK/blob/main/docs/COMMANDS.md",
|
|
20
20
|
"id": "agentos version"
|
|
21
21
|
},
|
|
22
|
+
{
|
|
23
|
+
"command": "agentos where",
|
|
24
|
+
"syntax": "agentos where [--json]",
|
|
25
|
+
"program": "agentos",
|
|
26
|
+
"area": "Other",
|
|
27
|
+
"description": "bin dir of agentos/agentos-auto, python, version + ~/.agentos/install.json (refreshed)",
|
|
28
|
+
"valid": true,
|
|
29
|
+
"doc": "https://github.com/consultancy-outfit/DevOpsBot-SDK/blob/main/docs/COMMANDS.md",
|
|
30
|
+
"id": "agentos where"
|
|
31
|
+
},
|
|
22
32
|
{
|
|
23
33
|
"command": "agentos agent",
|
|
24
34
|
"syntax": "agentos agent list",
|
|
@@ -1,4 +1,24 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"pr": 192,
|
|
4
|
+
"date": "2026-11-04",
|
|
5
|
+
"merged_at": "2026-11-04T14:03:12+05:00",
|
|
6
|
+
"type": "Fix",
|
|
7
|
+
"area": "AI fallback",
|
|
8
|
+
"title": "AI Draftsman fallback resumes, fails loudly when blocked, sees non-git edits",
|
|
9
|
+
"version": "1.7.50",
|
|
10
|
+
"url": "https://github.com/consultancy-outfit/DevOpsBot-SDK/pull/192"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"pr": 191,
|
|
14
|
+
"date": "2026-11-03",
|
|
15
|
+
"merged_at": "2026-11-03T14:46:05+05:00",
|
|
16
|
+
"type": "Feature",
|
|
17
|
+
"area": "Agents",
|
|
18
|
+
"title": "record install location in ~/.agentos/install.json + agentos where",
|
|
19
|
+
"version": "1.7.48",
|
|
20
|
+
"url": "https://github.com/consultancy-outfit/DevOpsBot-SDK/pull/191"
|
|
21
|
+
},
|
|
2
22
|
{
|
|
3
23
|
"pr": 190,
|
|
4
24
|
"date": "2026-10-30",
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"version": "1.7.50",
|
|
4
|
+
"commit": "4f370e5",
|
|
5
|
+
"pushed_at": "2026-11-04T14:03:12+05:00",
|
|
6
|
+
"generated_at": "2026-11-04T09:04:20+00:00",
|
|
7
|
+
"commands": 60,
|
|
8
|
+
"commands_invalid": 0,
|
|
9
|
+
"commands_undocumented": 0,
|
|
10
|
+
"panel_pages": 11,
|
|
11
|
+
"tests": 2624,
|
|
12
|
+
"prs_7d": 10,
|
|
13
|
+
"prs_30d": 44,
|
|
14
|
+
"features_30d": 13,
|
|
15
|
+
"fixes_30d": 19
|
|
16
|
+
}
|
|
17
|
+
]
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"""Record where THIS installation's console scripts live: ``~/.agentos/install.json``.
|
|
2
|
+
|
|
3
|
+
Why: tools outside the SDK (the AI Draftsman "DevOps Bot SDK" connector, which
|
|
4
|
+
SSHes in and runs ``agentos …`` / ``agentos-auto …``) need to find the CLI. A
|
|
5
|
+
non-interactive SSH session usually has a minimal PATH, and the SDK may be
|
|
6
|
+
installed globally (system pip, ``pip --user`` → ``~/.local/bin``, pipx) or in a
|
|
7
|
+
virtualenv anywhere on disk (the bootstrap's ``~/agentsystem/venv``, a project's
|
|
8
|
+
``.venv``). The SDK is the one thing that knows where it is, so it writes it down
|
|
9
|
+
every time one of its entry points starts:
|
|
10
|
+
|
|
11
|
+
{"bin_dir": "...", "python": "...", "version": "...", "written_at": "..."}
|
|
12
|
+
|
|
13
|
+
``bin_dir`` is the directory holding the ``agentos`` and ``agentos-auto`` scripts.
|
|
14
|
+
It is NOT symlink-resolved: in a venv ``bin/python`` is a symlink to the base
|
|
15
|
+
interpreter, and resolving it would point at a directory with no ``agentos`` in it.
|
|
16
|
+
|
|
17
|
+
Contract: :func:`record_install_location` never raises and never prints — a
|
|
18
|
+
read-only home, a full disk or a missing directory must not break any command.
|
|
19
|
+
The file is rewritten only when something other than ``written_at`` changed, so
|
|
20
|
+
startup stays cheap. Override the directory with ``AGENTOS_HOME`` (the same
|
|
21
|
+
override ``sdk.journal`` and ``sdk.providers`` honour).
|
|
22
|
+
"""
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import json
|
|
26
|
+
import os
|
|
27
|
+
import sys
|
|
28
|
+
import sysconfig
|
|
29
|
+
from datetime import datetime, timezone
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
from typing import Any
|
|
32
|
+
|
|
33
|
+
MARKER_NAME = "install.json"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _agentos_dir() -> Path:
|
|
37
|
+
return Path(os.environ.get("AGENTOS_HOME") or (Path.home() / ".agentos"))
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def marker_path() -> Path:
|
|
41
|
+
"""Where the marker lives (``$AGENTOS_HOME/install.json``, default ``~/.agentos``)."""
|
|
42
|
+
return _agentos_dir() / MARKER_NAME
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _script_names() -> tuple[str, ...]:
|
|
46
|
+
return ("agentos.exe", "agentos") if os.name == "nt" else ("agentos",)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _has_agentos(directory: Path) -> bool:
|
|
50
|
+
try:
|
|
51
|
+
return any((directory / name).is_file() for name in _script_names())
|
|
52
|
+
except OSError:
|
|
53
|
+
return False
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _abs_dir(path: str | os.PathLike[str]) -> Path:
|
|
57
|
+
# Absolute, normalised — but NOT symlink-resolved (keeps venv paths intact).
|
|
58
|
+
return Path(os.path.abspath(os.fspath(path)))
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _sysconfig_script_dirs() -> list[Path]:
|
|
62
|
+
dirs: list[Path] = []
|
|
63
|
+
try:
|
|
64
|
+
p = sysconfig.get_path("scripts")
|
|
65
|
+
if p:
|
|
66
|
+
dirs.append(_abs_dir(p))
|
|
67
|
+
except (KeyError, ValueError, OSError):
|
|
68
|
+
pass
|
|
69
|
+
try:
|
|
70
|
+
scheme = sysconfig.get_preferred_scheme("user")
|
|
71
|
+
except (KeyError, ValueError, AttributeError):
|
|
72
|
+
scheme = f"{os.name}_user"
|
|
73
|
+
try:
|
|
74
|
+
p = sysconfig.get_path("scripts", scheme)
|
|
75
|
+
if p:
|
|
76
|
+
dirs.append(_abs_dir(p))
|
|
77
|
+
except (KeyError, ValueError, OSError):
|
|
78
|
+
pass
|
|
79
|
+
return dirs
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def detect_bin_dir(argv0: str | None = None) -> Path:
|
|
83
|
+
"""The directory containing this installation's ``agentos`` script.
|
|
84
|
+
|
|
85
|
+
(a) the directory of ``argv[0]`` when it holds ``agentos``; else (b) the
|
|
86
|
+
interpreter's scripts dir, then the user-scheme scripts dir (``pip --user``),
|
|
87
|
+
first one holding ``agentos``; else (c) the directory of ``sys.executable``.
|
|
88
|
+
"""
|
|
89
|
+
if argv0 is None:
|
|
90
|
+
argv0 = sys.argv[0] if sys.argv else ""
|
|
91
|
+
if argv0:
|
|
92
|
+
try:
|
|
93
|
+
candidate = _abs_dir(argv0).parent
|
|
94
|
+
if _has_agentos(candidate):
|
|
95
|
+
return candidate
|
|
96
|
+
except (OSError, ValueError):
|
|
97
|
+
pass
|
|
98
|
+
for candidate in _sysconfig_script_dirs():
|
|
99
|
+
if _has_agentos(candidate):
|
|
100
|
+
return candidate
|
|
101
|
+
return _abs_dir(sys.executable or "python").parent
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def current_install(argv0: str | None = None) -> dict[str, Any]:
|
|
105
|
+
"""The marker's content, minus ``written_at``."""
|
|
106
|
+
from sdk import __version__
|
|
107
|
+
return {
|
|
108
|
+
"bin_dir": str(detect_bin_dir(argv0)),
|
|
109
|
+
"python": sys.executable,
|
|
110
|
+
"version": __version__,
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def _read(path: Path) -> dict[str, Any] | None:
|
|
115
|
+
try:
|
|
116
|
+
data = json.loads(path.read_text(encoding="utf-8"))
|
|
117
|
+
return data if isinstance(data, dict) else None
|
|
118
|
+
except (OSError, ValueError):
|
|
119
|
+
return None
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def record_install_location(path: Path | None = None,
|
|
123
|
+
argv0: str | None = None) -> dict[str, Any] | None:
|
|
124
|
+
"""Write ``install.json`` if it is missing or stale. Never raises, never prints.
|
|
125
|
+
|
|
126
|
+
Returns the record now on disk (or the one that would have been written, when
|
|
127
|
+
the write failed), or ``None`` if even detection failed.
|
|
128
|
+
"""
|
|
129
|
+
try:
|
|
130
|
+
target = path if path is not None else marker_path()
|
|
131
|
+
info = current_install(argv0)
|
|
132
|
+
existing = _read(target)
|
|
133
|
+
if existing is not None and all(existing.get(k) == v for k, v in info.items()) \
|
|
134
|
+
and existing.get("written_at"):
|
|
135
|
+
return existing
|
|
136
|
+
record = dict(info)
|
|
137
|
+
record["written_at"] = datetime.now(timezone.utc).isoformat(timespec="seconds")
|
|
138
|
+
try:
|
|
139
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
140
|
+
tmp = target.with_name(f".{target.name}.{os.getpid()}.tmp")
|
|
141
|
+
try:
|
|
142
|
+
tmp.write_text(json.dumps(record, indent=2) + "\n", encoding="utf-8")
|
|
143
|
+
try:
|
|
144
|
+
os.chmod(tmp, 0o644)
|
|
145
|
+
except OSError:
|
|
146
|
+
pass
|
|
147
|
+
os.replace(tmp, target)
|
|
148
|
+
finally:
|
|
149
|
+
try:
|
|
150
|
+
if tmp.exists():
|
|
151
|
+
tmp.unlink()
|
|
152
|
+
except OSError:
|
|
153
|
+
pass
|
|
154
|
+
except OSError:
|
|
155
|
+
pass
|
|
156
|
+
return record
|
|
157
|
+
except Exception: # noqa: BLE001 — must never break a command
|
|
158
|
+
return None
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def where_cli(argv: list[str]) -> int:
|
|
162
|
+
"""``agentos where [--json]``: where this installation lives (refreshes install.json)."""
|
|
163
|
+
record = record_install_location() or {}
|
|
164
|
+
try:
|
|
165
|
+
path = str(marker_path())
|
|
166
|
+
except Exception: # noqa: BLE001
|
|
167
|
+
path = ""
|
|
168
|
+
if "--json" in argv:
|
|
169
|
+
print(json.dumps(record, indent=2))
|
|
170
|
+
return 0
|
|
171
|
+
print(f"bin_dir: {record.get('bin_dir', '')}")
|
|
172
|
+
print(f"python: {record.get('python', '')}")
|
|
173
|
+
print(f"version: {record.get('version', '')}")
|
|
174
|
+
print(f"install.json: {path}")
|
|
175
|
+
return 0
|
|
@@ -3125,7 +3125,10 @@ async def _code_one_repo(
|
|
|
3125
3125
|
and not result.get("auth_expired"):
|
|
3126
3126
|
errored = not result.get("ok")
|
|
3127
3127
|
# "did real work happen?" — actual Write/Edit count, not files merely read.
|
|
3128
|
-
|
|
3128
|
+
# `ad` (the fallback CLI) streams no tool events, so _write_count stays
|
|
3129
|
+
# 0 on it — its folder diff (files_changed) is the evidence there.
|
|
3130
|
+
empty = (result.get("ok") and _write_count == 0
|
|
3131
|
+
and not result.get("files_changed"))
|
|
3129
3132
|
if not (errored or empty):
|
|
3130
3133
|
break
|
|
3131
3134
|
repair += 1
|
|
@@ -3300,8 +3303,13 @@ async def _code_one_repo(
|
|
|
3300
3303
|
# have errored out.
|
|
3301
3304
|
if not result.get("ok"):
|
|
3302
3305
|
issues.append(f"run errored: {(result.get('error') or 'failed')[:160]}")
|
|
3303
|
-
elif _write_count == 0:
|
|
3304
|
-
|
|
3306
|
+
elif _write_count == 0 and not result.get("files_changed"):
|
|
3307
|
+
# Say what the agent itself reported: "produced no files" alone gave
|
|
3308
|
+
# the operator nothing to act on (e.g. a fallback run that could not
|
|
3309
|
+
# run the script needed to edit a binary .xlsx).
|
|
3310
|
+
said = " ".join(str(result.get("result") or "").split())
|
|
3311
|
+
issues.append("task produced no files/deliverables"
|
|
3312
|
+
+ (f" — agent said: {said[-240:]}" if said else ""))
|
|
3305
3313
|
if issues:
|
|
3306
3314
|
await send(Envelope(
|
|
3307
3315
|
type="step_update", thread_id=thread_id,
|
|
@@ -3556,7 +3564,10 @@ async def handle_pipeline_approve(
|
|
|
3556
3564
|
type=Envelope.TYPE_ERROR, thread_id=thread_id,
|
|
3557
3565
|
data={"code": "LOCAL_EXEC_INCOMPLETE", "message": err[:300], "task_id": task_id},
|
|
3558
3566
|
).model_dump())
|
|
3559
|
-
|
|
3567
|
+
# Tell the ticket loop too: it used to see None here, count the ticket as
|
|
3568
|
+
# carried through, and print "✓ completed — 1/1" under a ticket it had
|
|
3569
|
+
# just moved to Backlog.
|
|
3570
|
+
return {"status": "incomplete", "task_id": task_id, "error": err[:300]}
|
|
3560
3571
|
|
|
3561
3572
|
# Surface deliberate no-ops so a skipped repo is transparent, not invisible.
|
|
3562
3573
|
if out_of_scope:
|
|
@@ -5817,6 +5828,11 @@ async def _run_one_task_steps(
|
|
|
5817
5828
|
send,
|
|
5818
5829
|
)
|
|
5819
5830
|
|
|
5831
|
+
# Ran, but non-compliant (no deliverable, no push/PR …): the handler
|
|
5832
|
+
# already moved it to Backlog and said why — it was NOT carried through.
|
|
5833
|
+
if isinstance(outcome, dict) and outcome.get("status") == "incomplete":
|
|
5834
|
+
return "skipped"
|
|
5835
|
+
|
|
5820
5836
|
# ── Claude CLI auth expired ────────────────────────────────────
|
|
5821
5837
|
# The runner's `claude` login lapsed. Waiting won't fix it, so we
|
|
5822
5838
|
# PAUSE (not drain-to-Backlog): keep the ticket In Progress, alert
|