cli-agent-runner 0.2.17__tar.gz → 0.2.19__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.
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.github/workflows/ci.yml +8 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.vulture-whitelist.py +5 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/BACKLOG.md +35 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/CHANGELOG.md +37 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/CONTRIBUTING.md +4 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/PKG-INFO +4 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/README.md +1 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/README.zh.md +1 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/__init__.py +25 -5
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_docgen.py +97 -1
- cli_agent_runner-0.2.19/agent_runner/_emit/__init__.py +103 -0
- cli_agent_runner-0.2.19/agent_runner/_emit/agent.py +231 -0
- cli_agent_runner-0.2.19/agent_runner/_emit/memory.py +236 -0
- cli_agent_runner-0.2.19/agent_runner/_emit/rounds.py +189 -0
- cli_agent_runner-0.2.19/agent_runner/_emit/serve.py +193 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_monitor_detectors.py +18 -12
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_monitor_state.py +44 -32
- cli_agent_runner-0.2.19/agent_runner/_plugin_scan.py +128 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_resolve.py +1 -1
- cli_agent_runner-0.2.19/agent_runner/_round_outcome.py +255 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_round_support.py +1 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_serve_policy.py +44 -20
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_substrate.py +2 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_throttle.py +60 -194
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_version.py +2 -2
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/agent_runtime.py +23 -7
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/api.py +96 -80
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/api_types.py +1 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/claude_rate_limit.py +5 -5
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/default_dirty_handler.py +1 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/gemini.py +1 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/kimi.py +1 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/pi.py +3 -3
- cli_agent_runner-0.2.19/agent_runner/cli/_serve_cgroup.py +273 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/_serve_round.py +107 -61
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/common.py +23 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/events_cmd.py +29 -7
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/monitor_cmd.py +16 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/round_cmd.py +7 -10
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/serve_cmd.py +48 -25
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/clock.py +2 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/config/errors.py +1 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/config/models.py +10 -10
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/config/validators.py +1 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/defenses.py +2 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/events.py +49 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/hooks.py +6 -7
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/http_progress.py +7 -5
- cli_agent_runner-0.2.19/agent_runner/metrics.py +458 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/migrations.py +3 -3
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/monitor.py +28 -11
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/remote_relay.py +18 -2
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/runner.py +10 -5
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/schedule.py +2 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/service_unit.py +7 -9
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/startup_check.py +1 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/vcs_state.py +3 -3
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/build.sh +21 -4
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/README.md +1 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/architecture.md +7 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/configuration.md +3 -2
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/long-running-agents.md +9 -4
- cli_agent_runner-0.2.19/docs/memory-efficiency.md +244 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/migrations/0.2.md +28 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/runbook.md +82 -18
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/pyproject.toml +12 -2
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/_test_helpers.py +64 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/contract/test_public_api_surface.py +2 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_auto_stop_e2e.py +58 -16
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_bounded_run.py +18 -3
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_dirty_handler_seam.py +13 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_grace_kill_emission.py +25 -8
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_run_one_round_with_fake_agent.py +31 -7
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_serve_loop.py +10 -2
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_spawn_round_mem_floor.py +115 -26
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/_event_scan.py +5 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_architecture.py +108 -7
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_doc_claims_match_ssot.py +20 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_docs_generated.py +2 -0
- cli_agent_runner-0.2.19/tests/invariants/test_import_footprint.py +214 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_no_internal_refs.py +13 -2
- cli_agent_runner-0.2.19/tests/invariants/test_no_price_logic.py +51 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_no_vacuous_invariants.py +3 -0
- cli_agent_runner-0.2.19/tests/invariants/test_no_version_refs.py +173 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_peek_schema_version.py +5 -2
- cli_agent_runner-0.2.19/tests/invariants/test_round_alloc_growth.py +127 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_timeout_budget_invariant.py +24 -4
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_agent_runtime.py +37 -10
- cli_agent_runner-0.2.19/tests/unit/test_agent_runtime_grace.py +505 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_agent_runtime_marker_scan.py +10 -4
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_agent_runtime_progress.py +19 -6
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_agent_runtime_reap.py +55 -5
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_observation.py +2 -2
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_service.py +51 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_auto_stop_gating.py +13 -2
- cli_agent_runner-0.2.19/tests/unit/test_cgroup_probe.py +451 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_cli_service_peek_monitor.py +16 -10
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_docgen.py +87 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_events.py +38 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_events_cmd.py +9 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_events_jsonl_decode.py +1 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_git_timeout.py +6 -2
- cli_agent_runner-0.2.19/tests/unit/test_http_progress_epoch.py +20 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_init_entry_points.py +50 -31
- cli_agent_runner-0.2.19/tests/unit/test_metrics_cgroup_usage.py +83 -0
- cli_agent_runner-0.2.19/tests/unit/test_metrics_swap.py +21 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_detect_rate_limit.py +42 -0
- cli_agent_runner-0.2.19/tests/unit/test_monitor_loop.py +155 -0
- cli_agent_runner-0.2.19/tests/unit/test_monitor_on_alert.py +104 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_remote.py +159 -6
- cli_agent_runner-0.2.19/tests/unit/test_plugin_scan_parity.py +188 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_round_outcome.py +11 -5
- cli_agent_runner-0.2.19/tests/unit/test_round_outcome_agent_axis.py +116 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_runner.py +1 -1
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_mem_gate.py +1 -1
- cli_agent_runner-0.2.19/tests/unit/test_serve_round_cgroup_spine.py +187 -0
- cli_agent_runner-0.2.19/tests/unit/test_serve_round_oom_killed.py +198 -0
- cli_agent_runner-0.2.19/tests/unit/test_serve_round_terminate.py +32 -0
- cli_agent_runner-0.2.19/tests/unit/test_throttle_epoch_bound.py +77 -0
- cli_agent_runner-0.2.17/agent_runner/_emit.py +0 -757
- cli_agent_runner-0.2.17/agent_runner/metrics.py +0 -268
- cli_agent_runner-0.2.17/tests/unit/test_agent_runtime_grace.py +0 -359
- cli_agent_runner-0.2.17/tests/unit/test_cgroup_probe.py +0 -233
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.codecov.yml +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.github/workflows/release.yml +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/.gitignore +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/CODE_OF_CONDUCT.md +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/LICENSE +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/SECURITY.md +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_monitor_registry.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_redact.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/_registry.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/__init__.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/_constants.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/builtin_plugins/codewhale.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/__init__.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/__main__.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/init_cmd.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/install_cmd.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/migrate_cmd.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/peek_cmd.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/service_cmd.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/cli/upgrade_cmd.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/config/__init__.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/config/loader.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/config/parsers.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/context_store.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/host_health.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/lifecycle.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/phase_select.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/presets/__init__.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/presets/aider.toml +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/presets/claude.toml +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/presets/codewhale.toml +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/presets/gemini.toml +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/presets/kimi.toml +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/presets/pi.toml +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/prompt_loader.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/round_log.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/round_view.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/agent_runner/scaffold.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/commands.md +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/events.md +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/plugins.md +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/quickstart.md +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/recipes/aider.md +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/recipes/codewhale.md +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/recipes/kimi.md +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/recipes/pi.md +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/docs/thesis.md +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/__init__.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/_clock.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/conftest.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/contract/__init__.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/e2e/__init__.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/e2e/conftest.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/e2e/test_e2e_graceful_stop.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/e2e/test_e2e_install_systemd.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/e2e/test_e2e_monitor_remote.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/e2e/test_e2e_round_lifecycle.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/fixtures/cli-real-output/claude-2.1.143-assistant-tool-use.jsonl +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/fixtures/cli-real-output/claude-2.1.143-result-event.jsonl +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/fixtures/cli-real-output/gemini-0.42.0-result-event.jsonl +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/generate_vulture_whitelist.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/__init__.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_context_enricher_namespacing.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_fresh_eyes_signal.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_install_dry_run.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_monitor_seeded.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_plugin_detector_loaded.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_plugin_owned_paths.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_plugin_real_flow.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_prompt_delivery_stdin.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_scaffold_presets.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_spawn_round_wedged.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_substrate_fingerprint.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/integration/test_transient_error_backoff.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/__init__.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/_docs.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_atomic_write_enforced.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_authored_facts_declared.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_auto_stop_policy_ssot.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_catalogs.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_classification_ssot.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_config_error_consistency.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_config_value_set_ssot.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_dataclass_fields_have_producers.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_doc_builtin_plugins.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_doc_cli_claims.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_doc_operator_surface.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_doc_test_pointers_exist.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_doc_transient_error_claims.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_doc_usage_event_fields.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_docs_index_complete.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_entry_points_resolve.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_event_int_coercion.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_event_kind_registry.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_event_kinds_ssot.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_events_doc_contract.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_gen_blocks_name_their_source.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_hook_contract_docs.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_layer_2_loop_size.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_migrations_registry_ssot.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_module_boundaries.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_module_sizes.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_monitor_self_exclusion.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_no_ai_signatures.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_no_pytest_skip_on_parse_fail.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_no_raw_time.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_phase_select_stateless.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_plugins_config_stable.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_readme_zh_is_pointer.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_repo_constants_patched_in_tests.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_round_log_decode_boundary.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_round_num_single_source.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_round_result_stable.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_set_diff_for_auto_tool_classification.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_stash_uses_sha_not_index.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_upstream_schema_canary.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/invariants/test_vulture_whitelist_generated.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/literate/__init__.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/literate/parser.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/literate/test_parser.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/literate/test_quickstart.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/__init__.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_agent_runtime_signal_name.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_assemble_prompt.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_events_stream.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_install.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_read_round_num.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_resolve_phase.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_api_types.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_catalogs.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_claude_error_detector.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_claude_foreign_schema.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_cli.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_cli_common.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_cli_init_install.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_cli_main_boundary.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_cli_monitor_http.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_cli_upgrade.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_codewhale_code_precedence.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_codewhale_plugin.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_coerce_int_poison.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_fresh_eyes.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_max_rounds.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_nested_strictness.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_prompt_delivery.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_schedule.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_stop_file.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_strictness.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_substrate_fingerprint_paths.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_config_transient_error_action.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_context_store.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_control_char_config.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_default_dirty_handler.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_defenses.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_detect_hung_latch.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_detector_isolation.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_detector_protocol.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_dirty_handlers.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_effective_throttle_view.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_emit_config_migrated.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_emit_schedule.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_emit_schedule_phase_skipped.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_events_cmd_rollover.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_events_cmd_tail.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_example_dirty_handler.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_example_plugin.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_exit_cause.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_exit_classifier.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_fresh_eyes_trigger.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_gemini_plugin.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_hook_failure_isolation.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_hook_redact_order.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_hooks.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_host_health.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_http_progress.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_interruptible_sleep_should_stop.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_kimi_plugin.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_lifecycle.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_metrics.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_migrate_cmd.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_migrations.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_assembly.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_cmd_severity.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_dedup_identity.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_dedup_rearm.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_detect_anomaly_repetitive.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_detect_supervisor_stale.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_detectors.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_event_tail.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_round_deferred_stale.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_monitor_schedule_pause.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_network_blip_signal_guard.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_open_round_log.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_orphan_chain_single_pass.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_outer_round_ceiling.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_peek_argparse.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_peek_project_isolation.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_peek_schedule.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_peek_select.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_phase_agent_launch.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_phase_profiles.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_phase_select.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_pi_plugin.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_plugin_constants.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_presets.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_primary_prompt_file_home.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_prompt_loader.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_read_json_hardening.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_redact.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_resolve.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_round_cmd.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_round_cmd_sigterm.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_round_log_helpers.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_round_view.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_runner_sidecar_ordering.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_runner_throttle.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_scaffold.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_schedule.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_cmd_bounded.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_config_broken.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_crash_loop.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_phase_schedule.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_policy.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_round.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_round_log.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_schedule_gate.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_sentinel.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_serve_startup_hooks.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_service_mode.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_service_unit.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_startup_battery_exit.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_startup_check.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_substrate.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_supervisor_stale_self_blind.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_throttle_back_off_ladder.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_throttle_plugin_classification.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_upgrade_migrate.py +0 -0
- {cli_agent_runner-0.2.17 → cli_agent_runner-0.2.19}/tests/unit/test_vcs_state.py +0 -0
|
@@ -92,7 +92,14 @@ jobs:
|
|
|
92
92
|
# `| tail` would swallow the exit code and let dead code through.
|
|
93
93
|
run: vulture
|
|
94
94
|
- name: tests with coverage
|
|
95
|
-
|
|
95
|
+
# Two passes so `serial` tests (install process-wide signal handlers /
|
|
96
|
+
# self-signals -- unsafe to share an xdist worker process) still run
|
|
97
|
+
# every time: parallel set + serial set == the full suite, mirroring
|
|
98
|
+
# ./build.sh test. pytest-cov 7.x auto-combines worker coverage data.
|
|
99
|
+
run: |
|
|
100
|
+
pytest -q --ignore=tests/e2e --ignore=tests/literate \
|
|
101
|
+
-n auto --dist worksteal -m "not serial" --cov --cov-report=xml --cov-report=term
|
|
102
|
+
pytest -q --ignore=tests/e2e --ignore=tests/literate -m serial --cov --cov-append --cov-report=xml --cov-report=term
|
|
96
103
|
- name: docs CI gate
|
|
97
104
|
run: |
|
|
98
105
|
python -m agent_runner._docgen
|
|
@@ -13,12 +13,16 @@ log_dir
|
|
|
13
13
|
offsets
|
|
14
14
|
buffer
|
|
15
15
|
|
|
16
|
-
# agent_runner.
|
|
16
|
+
# agent_runner._round_outcome.RoundOutcome
|
|
17
17
|
mem_terminated
|
|
18
18
|
usage_capable
|
|
19
19
|
newest_usage_ts
|
|
20
20
|
newest_substrate_before_ts
|
|
21
21
|
latest_transient_per_agent
|
|
22
|
+
ran_agent
|
|
23
|
+
usage_capable_by_agent
|
|
24
|
+
newest_usage_ts_by_agent
|
|
25
|
+
backoff_exponent_by_agent
|
|
22
26
|
|
|
23
27
|
# agent_runner.agent_runtime.RunResult
|
|
24
28
|
exit_code
|
|
@@ -88,3 +88,38 @@ just succeeded in the same repo).
|
|
|
88
88
|
Deferred because closing it is a naming decision, not cleanup: no event kind
|
|
89
89
|
carries the meaning "stashed but ref lost" (`orphan_stash_failed` would be wrong
|
|
90
90
|
— the stash exists). Left as-is until that kind is designed.
|
|
91
|
+
|
|
92
|
+
## `_monitor_loop_iter`'s three fail-open guards are hand-duplicated
|
|
93
|
+
|
|
94
|
+
`api._monitor_loop_iter` wraps the startup `monitor_started` emit, the
|
|
95
|
+
per-tick poll, and `on_alert`'s per-alert dispatch each in its own
|
|
96
|
+
`try/except Exception: warnings.warn(...)` block so a crash in any one of the
|
|
97
|
+
three never ends monitor supervision. The three guards are structurally
|
|
98
|
+
identical (catch, format a `type(e).__name__: {e}` warning, keep the loop
|
|
99
|
+
alive) but hand-copied rather than sharing one implementation; `on_alert`'s
|
|
100
|
+
own `emit()` closure already shows the pattern for factoring a shared guard.
|
|
101
|
+
|
|
102
|
+
Collapsing them to one shared guard is behavior-preserving — it must not
|
|
103
|
+
change which failures warn vs which propagate, nor the specific fallback
|
|
104
|
+
each site takes on failure (sleep-and-retry after a poll failure,
|
|
105
|
+
`verdict = "failed"` after an `on_alert` failure). Slated for 0.2.19.
|
|
106
|
+
|
|
107
|
+
## `oom_kill_delta` is named differently on its two events — NEEDS_DESIGN, DEFERRED to 0.3
|
|
108
|
+
|
|
109
|
+
The same cgroup `memory.events.oom_kill` delta is emitted under two
|
|
110
|
+
different field names depending on which event carries it: `round_cgroup_memory`
|
|
111
|
+
reports it as `events_oom_kill_delta` (matching its sibling counters
|
|
112
|
+
`events_high_delta`/`events_max_delta`/`events_oom_delta`), while
|
|
113
|
+
`round_oom_killed` — folded from the same scan, no second sysfs read —
|
|
114
|
+
reports the identical value as bare `oom_kill_delta`. A reader correlating
|
|
115
|
+
the two events for the same round has to know the same quantity carries two
|
|
116
|
+
names.
|
|
117
|
+
|
|
118
|
+
Renaming either side is a change to a published event field name — part of
|
|
119
|
+
the peek/event JSON contract — so which name becomes canonical (and whether
|
|
120
|
+
it lands as a rename or an additive alias) needs a decision, not a silent
|
|
121
|
+
swap. Tagged NEEDS_DESIGN. Deferred to 0.3's event-model canonicalization
|
|
122
|
+
(see [[project-03-direction]]) rather than reconciled standalone in 0.2.19 —
|
|
123
|
+
0.3 is already renaming/unifying event fields wholesale, and settling this
|
|
124
|
+
name now risks a double-rename (once here, again when 0.3's canonical model
|
|
125
|
+
lands). No field name changes in code until that decision is made.
|
|
@@ -5,6 +5,43 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.2.19] - 2026-09-09
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- `monitor --host` relay now drains cleanly on SIGTERM — tears down its ssh child group and exits 0 — instead of dying immediately, matching `serve`'s stop-signal behavior.
|
|
12
|
+
- Internal structure, behavior-identical: `_emit.py` split into an `_emit/` package (domain submodules behind a facade); the cgroup-pressure spine carved out of `cli/_serve_round.py` into `cli/_serve_cgroup.py`.
|
|
13
|
+
- The give-up exit-code table in the runbook is now generated from code instead of hand-copied; detector/defense counts and the `peek` schema version are now invariant-pinned against the same source.
|
|
14
|
+
- Internal hardening: the monitor's fail-open guards are unified into one implementation; `kill`'s systemd-user SIGKILL escalation shares the same bounded poll `serve` uses; the cgroup pressure spine resolves its bounding ancestor once per round instead of on every tick; a single-implementation `Protocol` was collapsed to its concrete type; a process's stored child-name no longer passes an attacker-rewritable `argv[0]` through unbounded; plugin discovery now scans legacy egg-info installs and handles entry points with an extras suffix.
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
- Docs: the `agent_usage_recorded` plugin list corrected to claude/gemini/codewhale/pi (kimi's built-in plugin emits no token counters).
|
|
18
|
+
|
|
19
|
+
### Notes
|
|
20
|
+
- Not breaking: no `agent-runner migrate` step, no systemd unit change. The relay's SIGTERM-drain above is the one behavior change in this release — anyone relying on the relay's old immediate-exit-on-SIGTERM will now see it drain instead.
|
|
21
|
+
- `oom_kill_delta`'s two-different-field-names inconsistency is deferred to 0.3's event-model work rather than reconciled here, to avoid a double-rename.
|
|
22
|
+
|
|
23
|
+
## [0.2.18] - 2026-09-08
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
- Cgroup pressure spine: `round_cgroup_memory` emits once per round (when this process's cgroup has a finite `memory.max`) with peak `memory.current`/`memory.swap.current` and `memory.events` counter deltas over the round — pressure becomes visible before it trips a give-up verdict.
|
|
27
|
+
- `round_oom_killed`: a pointer-only event (never round-log content) when the kernel cgroup-OOM-kills a round; the round still exits 137 and counts toward the crash streak exactly as before — this only names the cause.
|
|
28
|
+
- `host_cgroup_memory_limit` gains four advisory fields (`swap_total_bytes`, `swap_cap_pct`, `memory_high`, `advisory`) computed once at serve startup, plus a swap-plausibility guard on the cgroup-defer decision.
|
|
29
|
+
- Docs: a real-RAM ledger, a zram worked example, and a commented `# MemoryHigh` hint (with the PSI-floor interaction warning).
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
- Per-agent no-progress verdict: a usageless round on a never-emits-usage CLI is no longer misread as stalled in a mixed `[phases]` config.
|
|
33
|
+
- Fail-open hardening: the monitor no longer crashes on the stop/classify path (an emit error, a poisoned epoch field, or an unreapable round now degrade instead of raising).
|
|
34
|
+
- `kill` now escalates SIGTERM to SIGKILL under systemd-user after the grace window, matching the docs.
|
|
35
|
+
|
|
36
|
+
### Changed
|
|
37
|
+
- Plugin discovery scans `entry_points.txt` directly with a metadata parity fallback, ahead of 0.3's group growth.
|
|
38
|
+
- Internal cleanup: `RoundOutcome` carved into `_round_outcome`, constants single-sourced, lazy `hashlib`/`zoneinfo` behind an import-footprint gate, a tenet-3 price-blind invariant, plus test-speed work (parallel gate + faster inner loop).
|
|
39
|
+
|
|
40
|
+
### Notes
|
|
41
|
+
- Not breaking: no `agent-runner migrate` step, no systemd unit change; `peek --json` gains the two new event kinds above, existing kinds unchanged.
|
|
42
|
+
|
|
43
|
+
See `docs/migrations/0.2.md`.
|
|
44
|
+
|
|
8
45
|
## [0.2.17] - 2026-09-05
|
|
9
46
|
|
|
10
47
|
### Changed
|
|
@@ -105,7 +105,10 @@ drifts.
|
|
|
105
105
|
|
|
106
106
|
## Tests
|
|
107
107
|
|
|
108
|
-
- Unit + integration: `pytest
|
|
108
|
+
- Unit + integration (parallel gate): `./build.sh test` — pytest-xdist
|
|
109
|
+
(`-n $AR_TEST_JOBS`, default `auto`) plus a serial pass for tests that
|
|
110
|
+
install process-wide signal handlers. Never set `AR_TEST_JOBS` above 2 on a
|
|
111
|
+
constrained host (e.g. a 462MB Pi).
|
|
109
112
|
- Literate quickstart: `./build.sh literate`
|
|
110
113
|
- Pi e2e (opt-in): `AGENT_RUNNER_E2E_PI=1 pytest tests/e2e/` (needs a `pi`
|
|
111
114
|
ssh alias; not run in CI).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: cli-agent-runner
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.19
|
|
4
4
|
Summary: Restart-on-exit supervisor for autonomous CLI agents
|
|
5
5
|
Project-URL: Homepage, https://github.com/wan9yu/cli-agent-runner
|
|
6
6
|
Project-URL: Documentation, https://github.com/wan9yu/cli-agent-runner#readme
|
|
@@ -27,6 +27,8 @@ Requires-Python: >=3.11
|
|
|
27
27
|
Requires-Dist: psutil>=5.9
|
|
28
28
|
Provides-Extra: dev
|
|
29
29
|
Requires-Dist: pytest-cov>=5; extra == 'dev'
|
|
30
|
+
Requires-Dist: pytest-timeout>=2.3; extra == 'dev'
|
|
31
|
+
Requires-Dist: pytest-xdist>=3.8; extra == 'dev'
|
|
30
32
|
Requires-Dist: pytest>=8; extra == 'dev'
|
|
31
33
|
Requires-Dist: ruff<0.17,>=0.16; extra == 'dev'
|
|
32
34
|
Requires-Dist: vulture>=2.13; extra == 'dev'
|
|
@@ -150,6 +152,7 @@ your laptop closed. Full relay + SSH-trust mechanics:
|
|
|
150
152
|
- [`docs/configuration.md`](docs/configuration.md) — `agent-runner.toml` schema
|
|
151
153
|
- [`docs/runbook.md`](docs/runbook.md) — operator troubleshooting (OAuth, disk, orphan)
|
|
152
154
|
- [`docs/architecture.md`](docs/architecture.md) — 3-layer model, defenses-as-data
|
|
155
|
+
- [`docs/memory-efficiency.md`](docs/memory-efficiency.md) — supervisor memory footprint, measured release over release
|
|
153
156
|
|
|
154
157
|
## Development
|
|
155
158
|
|
|
@@ -114,6 +114,7 @@ your laptop closed. Full relay + SSH-trust mechanics:
|
|
|
114
114
|
- [`docs/configuration.md`](docs/configuration.md) — `agent-runner.toml` schema
|
|
115
115
|
- [`docs/runbook.md`](docs/runbook.md) — operator troubleshooting (OAuth, disk, orphan)
|
|
116
116
|
- [`docs/architecture.md`](docs/architecture.md) — 3-layer model, defenses-as-data
|
|
117
|
+
- [`docs/memory-efficiency.md`](docs/memory-efficiency.md) — supervisor memory footprint, measured release over release
|
|
117
118
|
|
|
118
119
|
## Development
|
|
119
120
|
|
|
@@ -27,16 +27,36 @@ def _load_plugins_from_group(group: str) -> None:
|
|
|
27
27
|
|
|
28
28
|
Called at package import. A broken plugin must not crash the supervisor;
|
|
29
29
|
each failure surfaces as a ``UserWarning``.
|
|
30
|
+
|
|
31
|
+
Discovery goes through the ``entry_points.txt`` scanner (cheaper than a
|
|
32
|
+
fresh ``importlib.metadata.entry_points()`` scan per group per process;
|
|
33
|
+
see ``_plugin_scan``), with a hard fallback to ``importlib.metadata`` on
|
|
34
|
+
any parse failure. Loading a plugin means only importing its module and
|
|
35
|
+
resolving its attribute — same as ``EntryPoint.load()`` — since every
|
|
36
|
+
built-in plugin registers itself as a module-top side effect (documented
|
|
37
|
+
in docs/plugins.md); this loader never instantiates or calls the target.
|
|
30
38
|
"""
|
|
39
|
+
import importlib
|
|
40
|
+
import sys
|
|
31
41
|
import warnings
|
|
32
|
-
from importlib.metadata import entry_points
|
|
33
42
|
|
|
34
|
-
|
|
43
|
+
from agent_runner._plugin_scan import scan_entry_points
|
|
44
|
+
|
|
45
|
+
for name, value in scan_entry_points(sys.path, group):
|
|
35
46
|
try:
|
|
36
|
-
|
|
47
|
+
# An entry-point value may carry a trailing extras marker
|
|
48
|
+
# (``module:attr [extra1,extra2]``); importlib.metadata.EntryPoint's
|
|
49
|
+
# own module/attr grammar excludes "[", so anything from the first
|
|
50
|
+
# "[" onward is always extras, never part of the path — strip it
|
|
51
|
+
# before resolving, or it glues onto attr_path and breaks getattr().
|
|
52
|
+
module_path, _, attr_path = value.partition("[")[0].rstrip().partition(":")
|
|
53
|
+
mod = importlib.import_module(module_path)
|
|
54
|
+
target = mod
|
|
55
|
+
for attr in filter(None, attr_path.split(".")):
|
|
56
|
+
target = getattr(target, attr)
|
|
37
57
|
except Exception as e:
|
|
38
58
|
warnings.warn(
|
|
39
|
-
f"failed to load {group} plugin {
|
|
59
|
+
f"failed to load {group} plugin {name!r}: {e}",
|
|
40
60
|
stacklevel=3,
|
|
41
61
|
)
|
|
42
62
|
|
|
@@ -80,7 +100,7 @@ def apply_plugin_disable(names: list[str]) -> None:
|
|
|
80
100
|
registered plugin (typo catcher; tolerates cross-env config drift).
|
|
81
101
|
|
|
82
102
|
Plugin packages still load at import time — this removes from the registries
|
|
83
|
-
that the runner and peek consult. Side effects from
|
|
103
|
+
that the runner and peek consult. Side effects from loading (module-level
|
|
84
104
|
imports, etc.) have already happened by the time this runs.
|
|
85
105
|
|
|
86
106
|
Known limitation: vcs_state._PLUGIN_OWNED_PATHS lacks per-plugin name
|
|
@@ -16,6 +16,7 @@ import typing
|
|
|
16
16
|
from collections.abc import Callable
|
|
17
17
|
from pathlib import Path
|
|
18
18
|
|
|
19
|
+
from agent_runner import _serve_policy
|
|
19
20
|
from agent_runner.cli.init_cmd import _preset_names
|
|
20
21
|
from agent_runner.config import (
|
|
21
22
|
AgentConfig,
|
|
@@ -30,7 +31,14 @@ from agent_runner.config import (
|
|
|
30
31
|
VcsConfig,
|
|
31
32
|
)
|
|
32
33
|
from agent_runner.defenses import catalog
|
|
33
|
-
from agent_runner.events import
|
|
34
|
+
from agent_runner.events import (
|
|
35
|
+
CONFIG_BROKEN,
|
|
36
|
+
CRASH_LOOP,
|
|
37
|
+
KNOWN_EVENT_KINDS,
|
|
38
|
+
MEM_LOOP,
|
|
39
|
+
MEM_LOOP_PERSISTENT,
|
|
40
|
+
STALLED_NO_PROGRESS,
|
|
41
|
+
)
|
|
34
42
|
from agent_runner.monitor import AUTO_STOP_ALERTS, KNOWN_ALERT_KINDS
|
|
35
43
|
|
|
36
44
|
# (toml_section_name, dataclass, nested_sub_sections). Nesting is an EXPLICIT
|
|
@@ -156,6 +164,84 @@ def render_event_kinds_list() -> str:
|
|
|
156
164
|
return "\n".join(f"- `{k}`" for k in sorted(KNOWN_EVENT_KINDS))
|
|
157
165
|
|
|
158
166
|
|
|
167
|
+
def _giveup_verdict_rows() -> list[tuple[str, int, bool]]:
|
|
168
|
+
"""``(verdict, exit_code, in_restart_prevent)`` rows for serve's five
|
|
169
|
+
give-up verdicts, in the order the runbook's Symptom section lists them.
|
|
170
|
+
|
|
171
|
+
The verdict->code mapping itself is CONTROL FLOW in
|
|
172
|
+
``cli/_serve_round.post_round_verdicts`` (a chain of ``if``/``return``,
|
|
173
|
+
not a dict), so it is mirrored here by hand rather than imported — the
|
|
174
|
+
four exit-code integers are imported from ``_serve_policy``, the actual
|
|
175
|
+
code SSOT, so a constant change here is caught by ``./build.sh docs``
|
|
176
|
+
producing a diff. The third column is DERIVED from
|
|
177
|
+
``_serve_policy.RESTART_PREVENT_EXIT_CODES`` (the same single source
|
|
178
|
+
``service_unit.py`` renders from) rather than hand-typed per row.
|
|
179
|
+
"""
|
|
180
|
+
verdict_codes = [
|
|
181
|
+
(CONFIG_BROKEN, _serve_policy.PERMANENT_CONFIG_EXIT),
|
|
182
|
+
(CRASH_LOOP, _serve_policy.CRASH_LOOP_EXIT),
|
|
183
|
+
(STALLED_NO_PROGRESS, _serve_policy.CRASH_LOOP_EXIT),
|
|
184
|
+
(MEM_LOOP_PERSISTENT, _serve_policy.MEM_LOOP_PERSISTENT_EXIT),
|
|
185
|
+
(MEM_LOOP, _serve_policy.MEM_LOOP_EXIT),
|
|
186
|
+
]
|
|
187
|
+
return [
|
|
188
|
+
(verdict, code, code in _serve_policy.RESTART_PREVENT_EXIT_CODES)
|
|
189
|
+
for verdict, code in verdict_codes
|
|
190
|
+
]
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def render_giveup_exit_codes_table() -> str:
|
|
194
|
+
"""Verdict -> exit-code -> ``RestartPreventExitStatus`` membership table
|
|
195
|
+
for serve's give-up breakers. 5 verdicts map to only 4 distinct codes:
|
|
196
|
+
``stalled_no_progress`` reuses ``crash_loop``'s 75 rather than minting its
|
|
197
|
+
own (same give-up verdict — "an unknown failure kept recurring, stop for
|
|
198
|
+
real" — reached via a different signal)."""
|
|
199
|
+
lines = ["| Verdict | Exit code | `RestartPreventExitStatus`? |", "|---|---|---|"]
|
|
200
|
+
seen_codes: dict[int, str] = {}
|
|
201
|
+
for verdict, code, stays_stopped in _giveup_verdict_rows():
|
|
202
|
+
shares = f" (shares `{seen_codes[code]}`'s exit code)" if code in seen_codes else ""
|
|
203
|
+
seen_codes.setdefault(code, verdict)
|
|
204
|
+
behavior = "yes — stays stopped" if stays_stopped else "no — restarts (break-then-restart)"
|
|
205
|
+
lines.append(f"| `{verdict}` | `{code}`{shares} | {behavior} |")
|
|
206
|
+
return "\n".join(lines)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def render_giveup_systemd_example() -> str:
|
|
210
|
+
"""The ``systemd unit pattern recommendations`` fenced example.
|
|
211
|
+
|
|
212
|
+
``RestartPreventExitStatus`` lists the three DELIBERATE give-up codes
|
|
213
|
+
(config_broken/crash_loop/mem_loop_persistent), derived from
|
|
214
|
+
``_serve_policy.RESTART_PREVENT_EXIT_CODES`` — the same single source
|
|
215
|
+
``service_unit.py`` renders from; ``mem_loop``'s 71 is deliberately
|
|
216
|
+
excluded so systemd respawns to retry. The second comment line's
|
|
217
|
+
leading padding is derived from the first line's own length (not
|
|
218
|
+
hand-counted) so the two ``#`` columns always line up even if a future
|
|
219
|
+
exit code changes ``prevent``'s width."""
|
|
220
|
+
prevent = " ".join(str(c) for c in _serve_policy.RESTART_PREVENT_EXIT_CODES)
|
|
221
|
+
header = f"RestartPreventExitStatus={prevent} "
|
|
222
|
+
return (
|
|
223
|
+
"```ini\n"
|
|
224
|
+
"# Prod (infinite supervisor) — current default\n"
|
|
225
|
+
"[Service]\n"
|
|
226
|
+
"ExecStart=... serve --config /etc/agent-runner.toml\n"
|
|
227
|
+
"Restart=on-failure\n"
|
|
228
|
+
f"{header}"
|
|
229
|
+
f"# config_broken ({_serve_policy.PERMANENT_CONFIG_EXIT}) / "
|
|
230
|
+
f"crash_loop ({_serve_policy.CRASH_LOOP_EXIT}) / "
|
|
231
|
+
f"mem_loop_persistent ({_serve_policy.MEM_LOOP_PERSISTENT_EXIT}) stay stopped\n"
|
|
232
|
+
f"{' ' * len(header)}"
|
|
233
|
+
f"# mem_loop ({_serve_policy.MEM_LOOP_EXIT}) is NOT listed here — it restarts\n"
|
|
234
|
+
"RestartSec=3\n"
|
|
235
|
+
"\n"
|
|
236
|
+
"# Bounded job\n"
|
|
237
|
+
"[Service]\n"
|
|
238
|
+
"ExecStart=... serve --config /etc/test.toml --max-rounds 10\n"
|
|
239
|
+
"Restart=on-failure\n"
|
|
240
|
+
"RestartSec=5\n"
|
|
241
|
+
"```"
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
|
|
159
245
|
def _render_migrate_transforms() -> str:
|
|
160
246
|
"""Bullet list of the transforms `agent-runner migrate` applies, from the registry.
|
|
161
247
|
A few entries carry a `parsed -> str` describe (so the manual report can name the
|
|
@@ -265,6 +351,16 @@ RENDERERS: dict[str, Renderer] = {
|
|
|
265
351
|
"migrate-transforms": Renderer(
|
|
266
352
|
_render_migrate_transforms, "agent_runner/migrations.py MIGRATIONS"
|
|
267
353
|
),
|
|
354
|
+
"giveup-exit-codes": Renderer(
|
|
355
|
+
render_giveup_exit_codes_table,
|
|
356
|
+
"agent_runner/_serve_policy.py exit-code constants + "
|
|
357
|
+
"cli/_serve_round.py post_round_verdicts's verdict->code map",
|
|
358
|
+
),
|
|
359
|
+
"giveup-systemd-example": Renderer(
|
|
360
|
+
render_giveup_systemd_example,
|
|
361
|
+
"agent_runner/_serve_policy.py exit-code constants "
|
|
362
|
+
"(service_unit.py's RestartPreventExitStatus mirrors these same three)",
|
|
363
|
+
),
|
|
268
364
|
}
|
|
269
365
|
RENDERERS.update(
|
|
270
366
|
{
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""Event emission wrappers — extracted from api.py for module-size hygiene.
|
|
2
|
+
|
|
3
|
+
Public facade over the ``_emit`` package: every sibling module in
|
|
4
|
+
``agent_runner`` (and every test) imports from ``agent_runner._emit``
|
|
5
|
+
directly, never from ``agent_runner._emit.<submodule>`` — this file is the
|
|
6
|
+
one place a name crosses that boundary. All wrappers are re-exported from
|
|
7
|
+
agent_runner.api for backward compatibility; plugins and supervisor should
|
|
8
|
+
continue importing from agent_runner.api (e.g.
|
|
9
|
+
``from agent_runner.api import emit_transient_error_detected``).
|
|
10
|
+
|
|
11
|
+
Each wrapper exists to keep cli/serve_cmd.py from importing agent_runner.events
|
|
12
|
+
directly — preserves the module-boundary architecture invariant. Local-import pattern
|
|
13
|
+
inside each wrapper body keeps agent_runner.api import-cheap.
|
|
14
|
+
|
|
15
|
+
Submodules are organised by domain: ``serve`` (supervisor control plane +
|
|
16
|
+
config/schedule lifecycle), ``rounds`` (one round's own lifecycle),
|
|
17
|
+
``memory`` (host/cgroup memory pressure), ``agent`` (the agent axis — plugin
|
|
18
|
+
reports + throttle response).
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from agent_runner._emit.agent import ( # noqa: F401 — public re-export
|
|
24
|
+
emit_agent_auth_error_detected,
|
|
25
|
+
emit_agent_usage_recorded,
|
|
26
|
+
emit_anomaly_repetitive_tool,
|
|
27
|
+
emit_transient_error_backoff_capped,
|
|
28
|
+
emit_transient_error_detected,
|
|
29
|
+
emit_transient_error_recovered,
|
|
30
|
+
)
|
|
31
|
+
from agent_runner._emit.memory import ( # noqa: F401 — public re-export
|
|
32
|
+
emit_host_cgroup_memory_limit,
|
|
33
|
+
emit_mem_pressure_deferred_to_cgroup,
|
|
34
|
+
emit_round_cgroup_memory,
|
|
35
|
+
emit_round_deferred,
|
|
36
|
+
emit_round_mem_critical_sample,
|
|
37
|
+
emit_round_mem_terminated,
|
|
38
|
+
emit_round_oom_killed,
|
|
39
|
+
emit_round_resumed,
|
|
40
|
+
)
|
|
41
|
+
from agent_runner._emit.rounds import ( # noqa: F401 — public re-export
|
|
42
|
+
emit_fresh_eyes_round_triggered,
|
|
43
|
+
emit_round_grace_extended,
|
|
44
|
+
emit_round_grace_kill,
|
|
45
|
+
emit_round_logs_prune_deferred,
|
|
46
|
+
emit_round_progress,
|
|
47
|
+
emit_round_substrate_after,
|
|
48
|
+
emit_round_substrate_before,
|
|
49
|
+
emit_round_supervisor_wedged,
|
|
50
|
+
emit_stale_index_lock_cleared,
|
|
51
|
+
)
|
|
52
|
+
from agent_runner._emit.serve import ( # noqa: F401 — public re-export
|
|
53
|
+
emit_config_broken,
|
|
54
|
+
emit_config_migrated,
|
|
55
|
+
emit_crash_loop,
|
|
56
|
+
emit_max_rounds_reached,
|
|
57
|
+
emit_mem_loop,
|
|
58
|
+
emit_mem_loop_persistent,
|
|
59
|
+
emit_rate_limit_stop,
|
|
60
|
+
emit_schedule_paused,
|
|
61
|
+
emit_schedule_phase_skipped,
|
|
62
|
+
emit_schedule_resumed,
|
|
63
|
+
emit_stalled_no_progress,
|
|
64
|
+
emit_stop_file_detected,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
__all__ = [
|
|
68
|
+
"emit_agent_auth_error_detected",
|
|
69
|
+
"emit_agent_usage_recorded",
|
|
70
|
+
"emit_anomaly_repetitive_tool",
|
|
71
|
+
"emit_config_broken",
|
|
72
|
+
"emit_config_migrated",
|
|
73
|
+
"emit_crash_loop",
|
|
74
|
+
"emit_fresh_eyes_round_triggered",
|
|
75
|
+
"emit_host_cgroup_memory_limit",
|
|
76
|
+
"emit_max_rounds_reached",
|
|
77
|
+
"emit_mem_loop",
|
|
78
|
+
"emit_mem_loop_persistent",
|
|
79
|
+
"emit_mem_pressure_deferred_to_cgroup",
|
|
80
|
+
"emit_rate_limit_stop",
|
|
81
|
+
"emit_round_cgroup_memory",
|
|
82
|
+
"emit_round_deferred",
|
|
83
|
+
"emit_round_grace_extended",
|
|
84
|
+
"emit_round_grace_kill",
|
|
85
|
+
"emit_round_logs_prune_deferred",
|
|
86
|
+
"emit_round_mem_critical_sample",
|
|
87
|
+
"emit_round_mem_terminated",
|
|
88
|
+
"emit_round_oom_killed",
|
|
89
|
+
"emit_round_progress",
|
|
90
|
+
"emit_round_resumed",
|
|
91
|
+
"emit_round_substrate_after",
|
|
92
|
+
"emit_round_substrate_before",
|
|
93
|
+
"emit_round_supervisor_wedged",
|
|
94
|
+
"emit_schedule_paused",
|
|
95
|
+
"emit_schedule_phase_skipped",
|
|
96
|
+
"emit_schedule_resumed",
|
|
97
|
+
"emit_stale_index_lock_cleared",
|
|
98
|
+
"emit_stalled_no_progress",
|
|
99
|
+
"emit_stop_file_detected",
|
|
100
|
+
"emit_transient_error_backoff_capped",
|
|
101
|
+
"emit_transient_error_detected",
|
|
102
|
+
"emit_transient_error_recovered",
|
|
103
|
+
]
|