devops-bot-sdk 1.7.8__tar.gz → 1.7.36__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.8 → devops_bot_sdk-1.7.36}/PKG-INFO +3 -1
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/devops_bot_sdk.egg-info/PKG-INFO +3 -1
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/devops_bot_sdk.egg-info/SOURCES.txt +20 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/devops_bot_sdk.egg-info/requires.txt +3 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/pyproject.toml +6 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/__init__.py +2 -2
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agentd.py +35 -12
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/schedules.py +56 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/cli.py +535 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/config.py +3 -0
- devops_bot_sdk-1.7.36/sdk/faqs.py +94 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/git_ops.py +73 -14
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/graph_recon.py +4 -1
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/graphify.py +17 -3
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/helpdesk_kb.md +154 -1
- devops_bot_sdk-1.7.36/sdk/instructions_template.py +374 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ipc/handlers.py +125 -19
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/log_colors.py +20 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/run_auto.py +102 -3
- devops_bot_sdk-1.7.36/sdk/schedule_timeline.py +171 -0
- devops_bot_sdk-1.7.36/sdk/scope_plan.py +148 -0
- devops_bot_sdk-1.7.36/sdk/ticket_bulk.py +214 -0
- devops_bot_sdk-1.7.36/sdk/ticket_plan.py +571 -0
- devops_bot_sdk-1.7.36/sdk/ticket_pools.py +354 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/tickets.py +36 -5
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/api.py +200 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/dashboard.py +34 -9
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/models.py +80 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/service.py +173 -23
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/static/agents.html +1 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/static/app.js +1423 -65
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/static/chat.html +1 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/static/custom-agents.html +1 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/static/default-agents.html +1 -0
- devops_bot_sdk-1.7.36/sdk/ui/static/faqs.html +38 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/static/help.html +8 -5
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/static/index.html +1 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/static/report.html +1 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/static/runs.html +2 -1
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/static/schedules.html +34 -13
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/static/setup.html +1 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/static/styles.css +385 -6
- devops_bot_sdk-1.7.36/sdk/ui/static/tickets.html +405 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/updater.py +22 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_agent_run_ticket.py +62 -0
- devops_bot_sdk-1.7.36/tests/test_faqs.py +46 -0
- devops_bot_sdk-1.7.36/tests/test_graph_off_by_default.py +27 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_graph_recon.py +6 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_graphify_build.py +6 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_graphify_hook_install.py +6 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_infographic_data.py +1 -1
- devops_bot_sdk-1.7.36/tests/test_instructions_template.py +158 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_mcp_route_contract.py +9 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_parallel_tickets.py +1 -1
- devops_bot_sdk-1.7.36/tests/test_pool_pr_modes.py +143 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_prd_artifact.py +6 -0
- devops_bot_sdk-1.7.36/tests/test_quiet_run_log.py +40 -0
- devops_bot_sdk-1.7.36/tests/test_schedule_timeline.py +115 -0
- devops_bot_sdk-1.7.36/tests/test_theme_switch.py +35 -0
- devops_bot_sdk-1.7.36/tests/test_ticket_bulk.py +194 -0
- devops_bot_sdk-1.7.36/tests/test_ticket_detail_view.py +51 -0
- devops_bot_sdk-1.7.36/tests/test_ticket_plan.py +262 -0
- devops_bot_sdk-1.7.36/tests/test_ticket_pools.py +252 -0
- devops_bot_sdk-1.7.36/tests/test_ui_no_native_dialogs.py +18 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_update_timer.py +121 -3
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_windows_task_paths.py +3 -0
- devops_bot_sdk-1.7.8/sdk/ui/static/tickets.html +0 -120
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/README.md +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/devops_bot_sdk.egg-info/dependency_links.txt +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/devops_bot_sdk.egg-info/entry_points.txt +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/devops_bot_sdk.egg-info/top_level.txt +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/activity/__init__.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/activity/classifier.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/activity/collectors/__init__.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/activity/collectors/common.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/activity/collectors/linux_auditd.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/activity/collectors/macos_eslogger.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/activity/collectors/windows_eventlog.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/activity/models.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/activity/os_setup.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/activity/recorder.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/activity/redact.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/activity/settings.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/activity/shipper.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/activity/spool.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agent_sharing.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/__init__.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/activity.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/builder.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/chat.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/connectors.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/engines/__init__.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/engines/claude_code.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/engines/http.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/engines/mcp.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/engines/n8n.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/engines/shell.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/integrations.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/inventory.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/library/__init__.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/manifest.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/prompt_studio.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/prompt_template.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/prompt_vars.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/run_log.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/secrets.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/ticket_run.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/usage.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/agents/varstore.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/browser_profile.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/claude_usage.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/client.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/collectors/__init__.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/collectors/files.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/collectors/process.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/collectors/screenshot.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/crucial.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/custom_agents.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/deferred_tickets.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/departments.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/design_verify/__init__.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/design_verify/assets.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/design_verify/bootstrap.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/design_verify/browser.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/design_verify/compare.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/design_verify/loop.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/estimator.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/exceptions.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/fallback_handoff.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/firewall.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/formats.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/github_fetch.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/github_ingest.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/help_actions.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/helpdesk.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/hooks/__init__.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/hooks/crucial_guard.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/intake.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ipc/__init__.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ipc/electron_bridge.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/journal.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/local_exec.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/memory_guard.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/model_policy.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/models/__init__.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/models/envelope.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/models/requests.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/models/responses.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/models/snapshots.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/phase_timer.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/plan_run.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/platform_compat.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/prd_progress.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/proof_readers.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/providers.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/py.typed +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/resume.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/router.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/schedule_tickets.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/scheduler.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/self_report.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/self_report_local.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/sse.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/swagger.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/task_file.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/task_types.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/test.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/test_pipeline.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ticket_board.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ticket_fields.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/tiers/__init__.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/tiers/mini_agent.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/__init__.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/health.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/ip_allowlist.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/jobs.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/runner.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/security.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/server.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/session.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/setup_manager.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/ui/swagger.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/url_access.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/vps_health.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/vps_identity.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/sdk/write_hook.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/setup.cfg +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_activity_claude_runs.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_activity_collectors.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_activity_core.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_activity_live_tracking.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_activity_macos.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_activity_os_setup.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_activity_pipeline.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_agent_activity.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_agent_activity_tracking.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_agent_chat_features.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_agent_crud_cli.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_agent_listing.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_agent_prompt_async.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_agent_prompt_models.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_agent_schedules.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_agent_sharing.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_agent_workspace_settings.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_agents_connectors_builder.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_allowed_tools_config.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_approval_park.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_auto_agent_dispatch.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_auto_ticket_queue.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_browser_profile.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_cheap_tier.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_claude_usage_gate.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_client_jira_projects.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_config_token_diagnostics.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_configure_token_owner.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_console_encoding.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_crash_recovery.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_create_safe_retry.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_deferred_tickets.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_departments.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_done_transition.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_epic_decompose_run.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_epic_inherited_agent_id.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_epic_session_isolation.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_estimator.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_fallback_cli.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_fallback_cli_upgrade.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_firewall_open_on_update.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_formats.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_git_action.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_github_fetch.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_github_ingest.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_health.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_help_actions.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_help_attachments.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_help_questions.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_helpdesk.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_intake_job_outcome.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_intake_plan_review.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_journal.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_limit_fallback_handoff.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_local_exec_provider.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_log_colors_backlog.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_memory_guard.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_model_policy.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_panel_help.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_panel_ticket_schedules.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_phase_timer.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_plan_new_command.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_plan_run_activity.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_pr_identity.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_project_path_resolution.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_proof_readers.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_providers.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_recon_session_isolation.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_resume.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_router.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_run_auto_agent_only.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_run_outputs.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_run_verdict_is_honest.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_schedule_api.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_schedule_outputs_and_plans.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_schedule_tickets.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_scheduler.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_scheduler_transient_retry.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_self_report.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_service_token_warning.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_stale_panel_restart.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_swagger_command.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_task_file_and_plan_run.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_task_file_format_doc.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_ticket_board.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_ticket_cli.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_ticket_fields.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_ticket_run_resolve_by_id.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_ticket_schedule_and_agent.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_ticket_speed_fixes.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_tier_flag_parity.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_ui_gate.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_ui_lifespan.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_updater_extras.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_updater_ignores_cwd.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_updater_pep668.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_updater_reports_the_truth.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_url_access.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_vps_health.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_vps_only_reporting.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_windows_loop_identity.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_windows_panel_task.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_windows_stop_and_pidfile.py +0 -0
- {devops_bot_sdk-1.7.8 → devops_bot_sdk-1.7.36}/tests/test_write_hook.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devops-bot-sdk
|
|
3
|
-
Version: 1.7.
|
|
3
|
+
Version: 1.7.36
|
|
4
4
|
Summary: DevOps Bot Desktop SDK — thin client for the AgentOS Electron desktop app
|
|
5
5
|
Author: noumanaziz2128
|
|
6
6
|
License-Expression: LicenseRef-Proprietary
|
|
@@ -22,6 +22,8 @@ Requires-Dist: fastapi>=0.110; extra == "ui"
|
|
|
22
22
|
Requires-Dist: uvicorn>=0.29; extra == "ui"
|
|
23
23
|
Requires-Dist: psutil>=5.9; extra == "ui"
|
|
24
24
|
Requires-Dist: python-multipart>=0.0.9; extra == "ui"
|
|
25
|
+
Provides-Extra: ui-e2e
|
|
26
|
+
Requires-Dist: playwright>=1.45; extra == "ui-e2e"
|
|
25
27
|
Provides-Extra: all
|
|
26
28
|
Requires-Dist: Pillow>=10.0; extra == "all"
|
|
27
29
|
Requires-Dist: psutil>=5.9; extra == "all"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devops-bot-sdk
|
|
3
|
-
Version: 1.7.
|
|
3
|
+
Version: 1.7.36
|
|
4
4
|
Summary: DevOps Bot Desktop SDK — thin client for the AgentOS Electron desktop app
|
|
5
5
|
Author: noumanaziz2128
|
|
6
6
|
License-Expression: LicenseRef-Proprietary
|
|
@@ -22,6 +22,8 @@ Requires-Dist: fastapi>=0.110; extra == "ui"
|
|
|
22
22
|
Requires-Dist: uvicorn>=0.29; extra == "ui"
|
|
23
23
|
Requires-Dist: psutil>=5.9; extra == "ui"
|
|
24
24
|
Requires-Dist: python-multipart>=0.0.9; extra == "ui"
|
|
25
|
+
Provides-Extra: ui-e2e
|
|
26
|
+
Requires-Dist: playwright>=1.45; extra == "ui-e2e"
|
|
25
27
|
Provides-Extra: all
|
|
26
28
|
Requires-Dist: Pillow>=10.0; extra == "all"
|
|
27
29
|
Requires-Dist: psutil>=5.9; extra == "all"
|
|
@@ -21,6 +21,7 @@ sdk/departments.py
|
|
|
21
21
|
sdk/estimator.py
|
|
22
22
|
sdk/exceptions.py
|
|
23
23
|
sdk/fallback_handoff.py
|
|
24
|
+
sdk/faqs.py
|
|
24
25
|
sdk/firewall.py
|
|
25
26
|
sdk/formats.py
|
|
26
27
|
sdk/git_ops.py
|
|
@@ -31,6 +32,7 @@ sdk/graphify.py
|
|
|
31
32
|
sdk/help_actions.py
|
|
32
33
|
sdk/helpdesk.py
|
|
33
34
|
sdk/helpdesk_kb.md
|
|
35
|
+
sdk/instructions_template.py
|
|
34
36
|
sdk/intake.py
|
|
35
37
|
sdk/journal.py
|
|
36
38
|
sdk/local_exec.py
|
|
@@ -48,7 +50,9 @@ sdk/resume.py
|
|
|
48
50
|
sdk/router.py
|
|
49
51
|
sdk/run_auto.py
|
|
50
52
|
sdk/schedule_tickets.py
|
|
53
|
+
sdk/schedule_timeline.py
|
|
51
54
|
sdk/scheduler.py
|
|
55
|
+
sdk/scope_plan.py
|
|
52
56
|
sdk/self_report.py
|
|
53
57
|
sdk/self_report_local.py
|
|
54
58
|
sdk/sse.py
|
|
@@ -58,7 +62,10 @@ sdk/task_types.py
|
|
|
58
62
|
sdk/test.py
|
|
59
63
|
sdk/test_pipeline.py
|
|
60
64
|
sdk/ticket_board.py
|
|
65
|
+
sdk/ticket_bulk.py
|
|
61
66
|
sdk/ticket_fields.py
|
|
67
|
+
sdk/ticket_plan.py
|
|
68
|
+
sdk/ticket_pools.py
|
|
62
69
|
sdk/tickets.py
|
|
63
70
|
sdk/updater.py
|
|
64
71
|
sdk/url_access.py
|
|
@@ -144,6 +151,7 @@ sdk/ui/static/app.js
|
|
|
144
151
|
sdk/ui/static/chat.html
|
|
145
152
|
sdk/ui/static/custom-agents.html
|
|
146
153
|
sdk/ui/static/default-agents.html
|
|
154
|
+
sdk/ui/static/faqs.html
|
|
147
155
|
sdk/ui/static/help.html
|
|
148
156
|
sdk/ui/static/index.html
|
|
149
157
|
sdk/ui/static/report.html
|
|
@@ -193,11 +201,13 @@ tests/test_epic_session_isolation.py
|
|
|
193
201
|
tests/test_estimator.py
|
|
194
202
|
tests/test_fallback_cli.py
|
|
195
203
|
tests/test_fallback_cli_upgrade.py
|
|
204
|
+
tests/test_faqs.py
|
|
196
205
|
tests/test_firewall_open_on_update.py
|
|
197
206
|
tests/test_formats.py
|
|
198
207
|
tests/test_git_action.py
|
|
199
208
|
tests/test_github_fetch.py
|
|
200
209
|
tests/test_github_ingest.py
|
|
210
|
+
tests/test_graph_off_by_default.py
|
|
201
211
|
tests/test_graph_recon.py
|
|
202
212
|
tests/test_graphify_build.py
|
|
203
213
|
tests/test_graphify_hook_install.py
|
|
@@ -207,6 +217,7 @@ tests/test_help_attachments.py
|
|
|
207
217
|
tests/test_help_questions.py
|
|
208
218
|
tests/test_helpdesk.py
|
|
209
219
|
tests/test_infographic_data.py
|
|
220
|
+
tests/test_instructions_template.py
|
|
210
221
|
tests/test_intake_job_outcome.py
|
|
211
222
|
tests/test_intake_plan_review.py
|
|
212
223
|
tests/test_journal.py
|
|
@@ -222,11 +233,13 @@ tests/test_parallel_tickets.py
|
|
|
222
233
|
tests/test_phase_timer.py
|
|
223
234
|
tests/test_plan_new_command.py
|
|
224
235
|
tests/test_plan_run_activity.py
|
|
236
|
+
tests/test_pool_pr_modes.py
|
|
225
237
|
tests/test_pr_identity.py
|
|
226
238
|
tests/test_prd_artifact.py
|
|
227
239
|
tests/test_project_path_resolution.py
|
|
228
240
|
tests/test_proof_readers.py
|
|
229
241
|
tests/test_providers.py
|
|
242
|
+
tests/test_quiet_run_log.py
|
|
230
243
|
tests/test_recon_session_isolation.py
|
|
231
244
|
tests/test_resume.py
|
|
232
245
|
tests/test_router.py
|
|
@@ -236,6 +249,7 @@ tests/test_run_verdict_is_honest.py
|
|
|
236
249
|
tests/test_schedule_api.py
|
|
237
250
|
tests/test_schedule_outputs_and_plans.py
|
|
238
251
|
tests/test_schedule_tickets.py
|
|
252
|
+
tests/test_schedule_timeline.py
|
|
239
253
|
tests/test_scheduler.py
|
|
240
254
|
tests/test_scheduler_transient_retry.py
|
|
241
255
|
tests/test_self_report.py
|
|
@@ -244,15 +258,21 @@ tests/test_stale_panel_restart.py
|
|
|
244
258
|
tests/test_swagger_command.py
|
|
245
259
|
tests/test_task_file_and_plan_run.py
|
|
246
260
|
tests/test_task_file_format_doc.py
|
|
261
|
+
tests/test_theme_switch.py
|
|
247
262
|
tests/test_ticket_board.py
|
|
263
|
+
tests/test_ticket_bulk.py
|
|
248
264
|
tests/test_ticket_cli.py
|
|
265
|
+
tests/test_ticket_detail_view.py
|
|
249
266
|
tests/test_ticket_fields.py
|
|
267
|
+
tests/test_ticket_plan.py
|
|
268
|
+
tests/test_ticket_pools.py
|
|
250
269
|
tests/test_ticket_run_resolve_by_id.py
|
|
251
270
|
tests/test_ticket_schedule_and_agent.py
|
|
252
271
|
tests/test_ticket_speed_fixes.py
|
|
253
272
|
tests/test_tier_flag_parity.py
|
|
254
273
|
tests/test_ui_gate.py
|
|
255
274
|
tests/test_ui_lifespan.py
|
|
275
|
+
tests/test_ui_no_native_dialogs.py
|
|
256
276
|
tests/test_update_timer.py
|
|
257
277
|
tests/test_updater_extras.py
|
|
258
278
|
tests/test_updater_ignores_cwd.py
|
|
@@ -41,6 +41,9 @@ ui = [
|
|
|
41
41
|
# raises at request time without it, so it belongs in [ui]
|
|
42
42
|
# alongside fastapi rather than in an optional extra.
|
|
43
43
|
]
|
|
44
|
+
ui-e2e = [
|
|
45
|
+
"playwright>=1.45", # tests/ui_e2e — headless-Chromium panel tests (then: python -m playwright install chromium)
|
|
46
|
+
]
|
|
44
47
|
all = [
|
|
45
48
|
"Pillow>=10.0",
|
|
46
49
|
"psutil>=5.9",
|
|
@@ -60,6 +63,9 @@ agentos-swagger = "sdk.swagger:main" # where /docs is + can you reach it
|
|
|
60
63
|
Homepage = "https://agentos.io"
|
|
61
64
|
Repository = "https://github.com/consultancy-outfit/DevOpsBot-SDK"
|
|
62
65
|
|
|
66
|
+
[tool.pytest.ini_options]
|
|
67
|
+
markers = ["ui_e2e: headless-Chromium control-panel tests (need the ui-e2e extra; skipped without it)"]
|
|
68
|
+
|
|
63
69
|
[tool.setuptools.dynamic]
|
|
64
70
|
version = { attr = "sdk.__version__" } # bump sdk/__init__.py → wheel + client + server all follow
|
|
65
71
|
|
|
@@ -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.36
|
|
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.36" # 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
|
|
@@ -359,21 +359,41 @@ async def _dispatch_agent_run(
|
|
|
359
359
|
manifest.integrations, available, env=secret_env,
|
|
360
360
|
)
|
|
361
361
|
|
|
362
|
-
#
|
|
363
|
-
#
|
|
364
|
-
#
|
|
365
|
-
#
|
|
366
|
-
|
|
362
|
+
# {{variables}}, most specific first: explicit run-time values (UI/API/CLI) win
|
|
363
|
+
# over the attached ticket's fields, which win over the values last saved for
|
|
364
|
+
# this agent (sdk/agents/varstore.py — what the panel's Run used). Nothing here
|
|
365
|
+
# is persisted. A person-started run (auto_approve) that would still leave a
|
|
366
|
+
# placeholder unfilled is REFUSED up front: the agent cannot do the work, so it
|
|
367
|
+
# would only spend a run asking for the values (ticket-instructions-writer,
|
|
368
|
+
# 2026-10-27, got literal {{ticket_key}} / {{repos_root}}).
|
|
369
|
+
from sdk.agents import varstore as agent_varstore
|
|
370
|
+
|
|
367
371
|
names = extract_variables(manifest.prompt)
|
|
368
|
-
|
|
369
|
-
|
|
372
|
+
used_inputs: dict[str, str] = {}
|
|
373
|
+
if names:
|
|
374
|
+
saved = {k: v for k, v in agent_varstore.load_vars(manifest.name).items()
|
|
375
|
+
if k in names and str(v).strip()}
|
|
376
|
+
values = dict(saved)
|
|
377
|
+
if task:
|
|
378
|
+
values.update({k: v for k, v in values_from_ticket(names, task).items() if str(v).strip()})
|
|
370
379
|
if extra_variables:
|
|
371
|
-
values
|
|
380
|
+
values.update({k: str(v) for k, v in extra_variables.items() if str(v).strip()})
|
|
372
381
|
resolved_prompt, missing = substitute_variables(manifest.prompt, values)
|
|
373
|
-
if
|
|
382
|
+
used_inputs = {k: v for k, v in values.items() if k in names}
|
|
383
|
+
if missing and auto_approve:
|
|
384
|
+
outcome["status"] = "missing_inputs"
|
|
385
|
+
outcome["missing"] = missing
|
|
386
|
+
outcome["error"] = (
|
|
387
|
+
f"'{manifest.name}' needs {', '.join(missing)} — fill "
|
|
388
|
+
f"{'it' if len(missing) == 1 else 'them'} in, or pick a ticket that has "
|
|
389
|
+
f"{'it' if len(missing) == 1 else 'them'}. Nothing was run."
|
|
390
|
+
)
|
|
391
|
+
logger.info("agentd.missing_inputs agent=%s missing=%s", manifest.name, missing)
|
|
392
|
+
return outcome
|
|
393
|
+
if used_inputs:
|
|
374
394
|
logger.info(
|
|
375
|
-
"agentd.vars_filled agent=%s filled=%s missing=%s",
|
|
376
|
-
manifest.name, sorted(
|
|
395
|
+
"agentd.vars_filled agent=%s filled=%s from_saved=%s missing=%s",
|
|
396
|
+
manifest.name, sorted(used_inputs), sorted(saved), sorted(missing),
|
|
377
397
|
)
|
|
378
398
|
manifest = manifest.model_copy(update={"prompt": resolved_prompt})
|
|
379
399
|
|
|
@@ -455,9 +475,12 @@ async def _dispatch_agent_run(
|
|
|
455
475
|
from sdk.agents.engines import claude_code as claude_code_engine
|
|
456
476
|
from sdk.agents import run_log
|
|
457
477
|
|
|
458
|
-
|
|
478
|
+
# A person pressed Run (auto_approve) → "run"; only an unattended
|
|
479
|
+
# trigger without a ticket is "scheduled".
|
|
480
|
+
_kind = "ticket" if task else ("run" if auto_approve else "scheduled")
|
|
459
481
|
_log_path = run_log.start_run(
|
|
460
482
|
manifest.name, scope="custom", engine=manifest.engine, kind=_kind,
|
|
483
|
+
variables=used_inputs or None,
|
|
461
484
|
)
|
|
462
485
|
run_log.log_line(_log_path, f"task_id={task_id}")
|
|
463
486
|
|
|
@@ -411,6 +411,7 @@ def mark_result(schedule_id: str, *, ok: bool, status: str = "",
|
|
|
411
411
|
if schedule is None:
|
|
412
412
|
return None
|
|
413
413
|
schedule["last_status"] = status or ("ok" if ok else "failed")
|
|
414
|
+
_append_history(schedule, ok=ok, output_file=output_file)
|
|
414
415
|
if output_file:
|
|
415
416
|
schedule["last_output_file"] = output_file
|
|
416
417
|
if delivered_to:
|
|
@@ -431,6 +432,61 @@ def mark_result(schedule_id: str, *, ok: bool, status: str = "",
|
|
|
431
432
|
return schedule
|
|
432
433
|
|
|
433
434
|
|
|
435
|
+
# Every outcome mark_result records, one JSON line each, so the Schedules page can
|
|
436
|
+
# show what ran before the latest run. Not ``*.json``: list_schedules globs those.
|
|
437
|
+
HISTORY_NAME = "history.jsonl"
|
|
438
|
+
HISTORY_MAX_LINES = 5000
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
def history_path() -> Path:
|
|
442
|
+
return SCHEDULES_DIR / HISTORY_NAME
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
def _append_history(schedule: dict, *, ok: bool, output_file: str = "") -> None:
|
|
446
|
+
"""Best-effort: a history failure never affects the run or the schedule."""
|
|
447
|
+
row = {
|
|
448
|
+
"at": datetime.now(timezone.utc).isoformat(timespec="seconds"),
|
|
449
|
+
"fired_at": schedule.get("last_fire_at") or "",
|
|
450
|
+
"schedule_id": schedule.get("schedule_id") or "",
|
|
451
|
+
"agent": schedule.get("agent") or "",
|
|
452
|
+
"kind": schedule.get("kind") or "agent",
|
|
453
|
+
"ok": bool(ok),
|
|
454
|
+
"status": schedule.get("last_status") or "",
|
|
455
|
+
"output_file": output_file or "",
|
|
456
|
+
}
|
|
457
|
+
try:
|
|
458
|
+
path = history_path()
|
|
459
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
460
|
+
with path.open("a", encoding="utf-8") as fh:
|
|
461
|
+
fh.write(json.dumps(row, ensure_ascii=False) + "\n")
|
|
462
|
+
if path.stat().st_size > HISTORY_MAX_LINES * 400: # trim rarely, keep the newest
|
|
463
|
+
lines = path.read_text(encoding="utf-8").splitlines()[-HISTORY_MAX_LINES:]
|
|
464
|
+
path.write_text("\n".join(lines) + "\n", encoding="utf-8")
|
|
465
|
+
except OSError as exc:
|
|
466
|
+
logger.debug("schedules.history_write_failed err=%s", exc)
|
|
467
|
+
|
|
468
|
+
|
|
469
|
+
def read_history(since: datetime | None = None) -> list[dict]:
|
|
470
|
+
"""Recorded outcomes, oldest first (optionally only those at/after ``since``)."""
|
|
471
|
+
out: list[dict] = []
|
|
472
|
+
try:
|
|
473
|
+
lines = history_path().read_text(encoding="utf-8").splitlines()
|
|
474
|
+
except OSError:
|
|
475
|
+
return out
|
|
476
|
+
for line in lines:
|
|
477
|
+
try:
|
|
478
|
+
row = json.loads(line)
|
|
479
|
+
except ValueError:
|
|
480
|
+
continue
|
|
481
|
+
if not isinstance(row, dict):
|
|
482
|
+
continue
|
|
483
|
+
at = _parse_iso(row.get("fired_at")) or _parse_iso(row.get("at"))
|
|
484
|
+
if at is None or (since is not None and at < since):
|
|
485
|
+
continue
|
|
486
|
+
out.append(row)
|
|
487
|
+
return out
|
|
488
|
+
|
|
489
|
+
|
|
434
490
|
def for_agent(agent: str) -> list[dict]:
|
|
435
491
|
return [s for s in list_schedules() if s.get("agent") == agent]
|
|
436
492
|
|