agent-lifecycle-kit 2.17.0__tar.gz → 2.19.0__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.
- {agent_lifecycle_kit-2.17.0/src/agent_lifecycle_kit.egg-info → agent_lifecycle_kit-2.19.0}/PKG-INFO +3 -3
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/README.md +2 -2
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/pyproject.toml +1 -1
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/_version.py +1 -1
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/external_check.py +5 -8
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/process.py +2 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/process_control.py +33 -2
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/worktree_identity.py +8 -10
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/changesets/git.py +23 -21
- agent_lifecycle_kit-2.19.0/src/agent_lifecycle/changesets/git_io.py +358 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/changesets/snapshot.py +8 -14
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/dispatch_contracts.py +9 -2
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/dispatch_planning.py +53 -22
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/lifecycle_parsers.py +4 -1
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/parsers.py +5 -83
- agent_lifecycle_kit-2.19.0/src/agent_lifecycle/cli/plan_lock_commands.py +306 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/planning_parsers.py +18 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/agent_plugin_qualification_schemas.py +34 -10
- agent_lifecycle_kit-2.19.0/src/agent_lifecycle/contracts/artifact_authoring_schemas.py +44 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/ed25519.py +11 -4
- agent_lifecycle_kit-2.19.0/src/agent_lifecycle/contracts/launch_qualification.py +105 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/redaction.py +34 -1
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/review_mesh_schemas.py +78 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/schemas.py +69 -3
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/agent_plugin_qualification.py +73 -17
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/inspection.py +18 -4
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/inspection_common.py +64 -12
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/inspection_opencode.py +100 -44
- agent_lifecycle_kit-2.19.0/src/agent_lifecycle/host_protocol/opencode_compatibility.py +153 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/neutrality/authority.py +30 -4
- agent_lifecycle_kit-2.19.0/src/agent_lifecycle/neutrality/git_objects.py +208 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/reporting/change_summary.py +29 -26
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/review_mesh/assignments.py +9 -0
- agent_lifecycle_kit-2.19.0/src/agent_lifecycle/review_mesh/operator_templates.py +791 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/review_mesh/results.py +44 -3
- agent_lifecycle_kit-2.19.0/src/agent_lifecycle/workflow/artifact_builders.py +164 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0/src/agent_lifecycle_kit.egg-info}/PKG-INFO +3 -3
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle_kit.egg-info/SOURCES.txt +4 -0
- agent_lifecycle_kit-2.17.0/src/agent_lifecycle/cli/plan_lock_commands.py +0 -96
- agent_lifecycle_kit-2.17.0/src/agent_lifecycle/contracts/launch_qualification.py +0 -47
- agent_lifecycle_kit-2.17.0/src/agent_lifecycle/neutrality/git_objects.py +0 -177
- agent_lifecycle_kit-2.17.0/src/agent_lifecycle/review_mesh/operator_templates.py +0 -320
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/LICENSE +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/NOTICE +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/benchmarks/reference-tasks/README.md +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/benchmarks/reference-tasks/manifest.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/benchmarks/reference-tasks/rt01-planning/oracle.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/benchmarks/reference-tasks/rt01-planning/task.md +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/benchmarks/reference-tasks/rt02-architecture-review/oracle.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/benchmarks/reference-tasks/rt02-architecture-review/task.md +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/benchmarks/reference-tasks/rt03-bug-forensics/oracle.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/benchmarks/reference-tasks/rt03-bug-forensics/task.md +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/benchmarks/reference-tasks/rt04-s1-managed-task/oracle.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/benchmarks/reference-tasks/rt04-s1-managed-task/task.md +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/benchmarks/reference-tasks/rt05-s2-evidence-task/oracle.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/benchmarks/reference-tasks/rt05-s2-evidence-task/task.md +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/setup.cfg +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/__main__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/closing_resource_admission.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/closing_resource_policy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/closing_resource_recovery.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/closing_resources.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/contracts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/declared_ledger.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/declared_ledger_legacy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/declared_ledger_records.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/host_bridge.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/input_fit.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/journal.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/normalization.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/opening_balances.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/profile_schema.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/source_usage_context.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/support_profiles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/workflow_authority_store.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/workflow_state_store.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/accounting/workflow_store.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/agent_plugin_probe.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/attempt_authority.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/bootstrap_r11.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/codex_exact_prompt.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/codex_input_diagnostics.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/codex_prompt_preparation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/codex_source_exposure.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/codex_source_subject.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/contracts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/env.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/external_jobs.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/immutable_input.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/input_lifecycle.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/launch_execution.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/launch_preflight.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/launcher.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/lifecycle_control.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/limited_native_evidence.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/local_launch_profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/managed_process.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/ordinary_audit.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/planning_launch.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/planning_session.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/private_input.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/process_capture.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/process_groups.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/process_telemetry.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/qualification.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/redaction.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/session_store.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/source_review_contracts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/source_review_history.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/source_review_inputs.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/source_review_preparation_records.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/source_review_roles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/source_review_shards.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/source_review_support.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/source_review_transcript.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/start_input.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/start_receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/start_routing.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/task_intake.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/unified_start.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/windows_pipe.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/adapter_sessions/workflow_bridge.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/audit/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/audit/bug_forensics.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/audit/delta.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/audit/domain_language.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/audit/external_checks.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/audit/implementation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/audit/ownership.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/audit/package.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/audit/proof_chain.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/audit/proof_findings.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/audit/proof_integrity.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/audit/review_verdict.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/audit/security_analysis.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/benchmarks/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/benchmarks/comparison.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/benchmarks/contracts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/benchmarks/evaluator.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/benchmarks/oracles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/benchmarks/qualification.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/benchmarks/reporting.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/benchmarks/stratification.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/changesets/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/adapter.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/benchmarks.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/command_registry.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/dispatch.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/dispatch_adapters.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/dispatch_audit.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/dispatch_lifecycle.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/dispatch_metrics.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/dispatch_observability.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/dispatch_research.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/errors.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/followup.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/host_launch.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/main.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/metrics_parser.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/observability_parsers.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/policy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/progress_hooks.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/project.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/research.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/start.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/strategy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/workflow_task_parsers.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/cli/worktree.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/compiler/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/compiler/output_contract.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/compiler/phase_packets.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/compiler/small_model_packets.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/compiler/task_packets.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/context/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/context/checkpoint_store.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/context/checkpoints.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/context/episode_retrieval.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/context/external_memory.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/context/profiles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/context/rendering.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/context/thread_bridge_context.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/adapter_contract_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/adapter_event_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/adapter_session_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/adapter_task_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/audit_optimization_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/audit_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/authority_io.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/authority_text.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/benchmark_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/bounded_json.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/bug_forensics_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/canonical.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/closing_resource_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/closing_window_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/compatibility.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/context_checkpoint_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/context_model_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/core_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/cross_check_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/deadline_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/deadlines.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/domain_language.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/domain_language_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/errors.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/evidence_import_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/evidence_receipt_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/execution_strategy_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/external_check_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/external_job_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/finding_check_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/goal_validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/host_capability_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/immutable_input_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/implementation_audit_validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/import_dialect_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/independent_evidence_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/legacy_runner_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/lifecycle_action_catalog.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/lifecycle_control_definitions.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/lifecycle_control_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/lifecycle_control_validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/local_launch_validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/metric_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/model_classes.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/multi_run_view_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/ownership_paths.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/paths.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/performance_limits.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/persistence.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/phase_packet_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/plan_contract_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/plan_delta_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/plan_manifest_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/planning_launch_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/policy_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/private_storage.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/process_execution_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/process_lock.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/process_redaction.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/progress_bridge_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/progress_hook_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/project_profile_preset_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/project_profile_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/proof_integrity_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/proof_validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/public_locators.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/quality_modes.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/release_accounting_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/release_contract_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/research_evidence_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/review_mesh_recommendation_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/review_quality_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/review_round_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/review_verdict.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/reviewer_identity_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/runner_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/runner_worktree_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/sandbox_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/schema_builders.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/scoped_usage_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/security_analysis_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/statistical_evidence_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/status_goal_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/structured_result_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/task_template_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/thread_bridge_schema_definitions.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/thread_bridge_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/thread_bridge_validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/token_estimation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/usage_export_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/validation_ladder_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/windows_security.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/workflow_artifact_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/workflow_authority.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/workflow_authority_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/workflow_authorization_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/workflow_continuation_batch_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/workflow_continuation_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/workflow_economics_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/workflow_run_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/contracts/workflow_state_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/data/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/data/profiles/external-checks/declared-dependencies.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/data/profiles/external-checks/import-boundaries.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/data/profiles/external-checks/module-dependencies.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/data/profiles/lifecycle-baselines.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/data/profiles/model-routing-profile.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/data/profiles/project-workflow-presets/feature-implementation.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/data/profiles/project-workflow-presets/quick-change.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/data/profiles/project-workflow-presets/research-review.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/data/profiles/risk-execution-policy.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/data/profiles/small-context-profile.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/diagnostics/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/diagnostics/bundles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/diagnostics/installation_catalog.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/diagnostics/readiness.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/evidence_index/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/evidence_index/core.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/evidence_index/episode_index.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/evidence_index/external_context.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/followup/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/followup/records.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/freeze/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/freeze/locks.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/freeze/package_integrity.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/goal/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/goal/records.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/goal/view.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/acp_capability.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/capabilities.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/context_events.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/contracts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/event_capture.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/events.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/external_jobs.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/inspection_claude.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/inspection_codex.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/inspection_cursor.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/inspection_gemini_cli.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/inspection_hermes.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/inspection_kimi_code.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/inspection_profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/inspection_qwen_code.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/lifecycle_control.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/lifecycle_control_qualification.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/lifecycle_gate.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/process_port.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/sandbox_receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/scaffold.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/structured_results.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/thread_bridge.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/usage_normalizers.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/host_protocol/validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/imports/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/imports/agentskills_profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/imports/bmad_profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/imports/constitution_adr.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/imports/dialect_profiles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/imports/external_agent.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/imports/external_dialects.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/imports/external_workflow.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/imports/multi_markdown.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/imports/openspec_profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/imports/planning.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/imports/security_findings.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/imports/spec_kit_profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/imports/spec_kitty_profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/metrics/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/metrics/audit_efficiency.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/metrics/audit_optimization.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/metrics/audit_samples.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/metrics/cost_collection.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/metrics/costs.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/metrics/outcome_index.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/metrics/phase_resources.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/metrics/recommendations.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/metrics/regression_signals.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/metrics/release_accounting.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/metrics/usage_export.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/metrics/workflow_economics.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/migration/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/migration/legacy_runner.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/model_routing/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/model_routing/profiles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/model_routing/receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/model_routing/resolver.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/neutrality/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/neutrality/__main__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/neutrality/canonical.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/neutrality/cli.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/neutrality/ed25519.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/neutrality/errors.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/neutrality/gate.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/neutrality/matching.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/neutrality/paths.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/neutrality/policy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/neutrality/receipt.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/neutrality/scanner.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/neutrality/test_runner.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/planning/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/planning/acceptance_markdown.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/planning/completeness.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/planning/continuity.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/planning/deltas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/planning/manifest_contract.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/planning/prerequisites.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/planning/task_compatibility.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/planning/templates.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/planning/tiering.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/planning/traceability.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/planning/validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/planning/verification.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/policy/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/policy/adaptive_lifecycle.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/policy/apply.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/policy/execution_strategy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/policy/proposals.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/policy/quality_floor.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/policy/risk_execution.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/policy/runtime_receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/policy/thread_bridge.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/project/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/project/domain_language.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/project/guidance.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/project/merge.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/project/presets.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/project/principles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/project/profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/py.typed +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/quality/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/quality/bug_forensics.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/quality/bug_forensics_advisor.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/quality/bug_forensics_recipes.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/quality/cross_check.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/quality/dependency_impact.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/quality/external_checks.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/quality/failure_classification.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/quality/packs.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/quality/security_analysis.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/quality/validation_ladder.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/reporting/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/reporting/attention.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/reporting/event_feed.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/reporting/execution_resources.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/reporting/multi_run.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/reporting/progress_bridge.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/reporting/progress_hooks.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/reporting/progress_terminal.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/reporting/progress_view.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/reporting/status_view.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/reporting/usage_export.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/research/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/research/evidence.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/research/provenance.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/research/validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/resources.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/review/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/review/provenance.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/review/validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/review_mesh/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/review_mesh/contracts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/review_mesh/independence.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/review_mesh/quorum.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/review_mesh/recommendation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/review_mesh/synthesis.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/review_mesh/validation_helpers.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/runner/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/runner/core.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/runner/sandbox_receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/specification/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/specification/completion_check.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/specification/completion_gate.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/specification/completion_signal.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/specification/validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/artifacts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/audit_evidence.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/authorization.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/budget_decisions.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/budget_policy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/budget_receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/bug_forensics_gates.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/checkpoint_gate.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/closing_policy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/closing_window.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/continuation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/continuation_batch.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/controller.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/deadline_guards.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/events.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/final_proof_integrity.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/finalization.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/gates.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/immutable_input.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/implementation_audit_gate.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/initialization.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/leases.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/limited_usage.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/lineage.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/managed_runner.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/model_usage.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/next_action.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/operation_kernel.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/plan_adoption.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/query.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/review_mesh_gate.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/reviews.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/risk_execution_gate.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/run.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/run_transitions.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/sandbox_policy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/sandbox_receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/selectors.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/state.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/task_outcomes.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/task_start.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/task_transitions.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/transactions.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/workflow/transition_contract.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/worktree/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/worktree/isolation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle_kit.egg-info/dependency_links.txt +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle_kit.egg-info/entry_points.txt +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle_kit.egg-info/top_level.txt +0 -0
{agent_lifecycle_kit-2.17.0/src/agent_lifecycle_kit.egg-info → agent_lifecycle_kit-2.19.0}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-lifecycle-kit
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.19.0
|
|
4
4
|
Summary: Provider-neutral lifecycle control layer that helps coding agents plan, execute, validate, and prove software tasks to completion.
|
|
5
5
|
Author: Agent Lifecycle Kit contributors
|
|
6
6
|
License: Apache-2.0
|
|
@@ -41,9 +41,9 @@ and secret handling stay in adapters or host-local profiles.
|
|
|
41
41
|
ALK provides a verifiable finish for external-agent work with proportionate control. It adds only the checks and evidence needed for the task; most of the time remains for research, implementation and product verification.
|
|
42
42
|
|
|
43
43
|
## Quick start
|
|
44
|
-
Start with [install ALK and make the first run](docs/guides/install-and-first-run.md). Release 2.17 strengthens [workflow validation and recovery](docs/reference/workflow-completeness.md). Release 2.16 introduced cumulative accounting within verified host capabilities; see [retention maintenance](docs/operations/retention-maintenance.md).
|
|
44
|
+
Start with [install ALK and make the first run](docs/guides/install-and-first-run.md). Release 2.19 adds [safe artifact authoring and planning preflight](docs/reference/safe-artifact-authoring.md), [bounded review handoff](docs/reference/review-mesh.md#bounded-review-handoff) and thin skills with complete references. Release 2.18 bounds process/Git diagnostics, hardens signing and distinguishes OpenCode 1.x/2.x compatibility ([adapter notes](docs/adapters/opencode.md)); 2.17 strengthens [workflow validation and recovery](docs/reference/workflow-completeness.md). Release 2.16 introduced cumulative accounting within verified host capabilities; see [retention maintenance](docs/operations/retention-maintenance.md).
|
|
45
45
|
|
|
46
|
-
It includes macOS, Linux and Windows instructions, Python 3.11-3.14, [PyPI](https://pypi.org/project/agent-lifecycle-kit/) installation with `python -m pip install agent-lifecycle-kit==2.
|
|
46
|
+
It includes macOS, Linux and Windows instructions, Python 3.11-3.14, [PyPI](https://pypi.org/project/agent-lifecycle-kit/) installation with `python -m pip install agent-lifecycle-kit==2.19.0`, and common `agent-lifecycle version` errors. See [2.15 migration notes](docs/reference/cli.md#migrating-authority-artifacts-to-215) and [authority boundaries](docs/reference/authority-artifact-boundaries.md).
|
|
47
47
|
|
|
48
48
|
For a quick start, run:
|
|
49
49
|
|
|
@@ -19,9 +19,9 @@ and secret handling stay in adapters or host-local profiles.
|
|
|
19
19
|
ALK provides a verifiable finish for external-agent work with proportionate control. It adds only the checks and evidence needed for the task; most of the time remains for research, implementation and product verification.
|
|
20
20
|
|
|
21
21
|
## Quick start
|
|
22
|
-
Start with [install ALK and make the first run](docs/guides/install-and-first-run.md). Release 2.17 strengthens [workflow validation and recovery](docs/reference/workflow-completeness.md). Release 2.16 introduced cumulative accounting within verified host capabilities; see [retention maintenance](docs/operations/retention-maintenance.md).
|
|
22
|
+
Start with [install ALK and make the first run](docs/guides/install-and-first-run.md). Release 2.19 adds [safe artifact authoring and planning preflight](docs/reference/safe-artifact-authoring.md), [bounded review handoff](docs/reference/review-mesh.md#bounded-review-handoff) and thin skills with complete references. Release 2.18 bounds process/Git diagnostics, hardens signing and distinguishes OpenCode 1.x/2.x compatibility ([adapter notes](docs/adapters/opencode.md)); 2.17 strengthens [workflow validation and recovery](docs/reference/workflow-completeness.md). Release 2.16 introduced cumulative accounting within verified host capabilities; see [retention maintenance](docs/operations/retention-maintenance.md).
|
|
23
23
|
|
|
24
|
-
It includes macOS, Linux and Windows instructions, Python 3.11-3.14, [PyPI](https://pypi.org/project/agent-lifecycle-kit/) installation with `python -m pip install agent-lifecycle-kit==2.
|
|
24
|
+
It includes macOS, Linux and Windows instructions, Python 3.11-3.14, [PyPI](https://pypi.org/project/agent-lifecycle-kit/) installation with `python -m pip install agent-lifecycle-kit==2.19.0`, and common `agent-lifecycle version` errors. See [2.15 migration notes](docs/reference/cli.md#migrating-authority-artifacts-to-215) and [authority boundaries](docs/reference/authority-artifact-boundaries.md).
|
|
25
25
|
|
|
26
26
|
For a quick start, run:
|
|
27
27
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "agent-lifecycle-kit"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.19.0"
|
|
8
8
|
description = "Provider-neutral lifecycle control layer that helps coding agents plan, execute, validate, and prove software tasks to completion."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11,<3.15"
|
|
@@ -6,7 +6,6 @@ import hashlib
|
|
|
6
6
|
import json
|
|
7
7
|
import os
|
|
8
8
|
import shutil
|
|
9
|
-
import subprocess
|
|
10
9
|
from datetime import UTC, datetime
|
|
11
10
|
from pathlib import Path
|
|
12
11
|
from typing import Any
|
|
@@ -15,6 +14,7 @@ from agent_lifecycle.adapter_sessions.env import resolve_launch_env
|
|
|
15
14
|
from agent_lifecycle.adapter_sessions.process import run_process
|
|
16
15
|
from agent_lifecycle.adapter_sessions.worktree_identity import capture_git_worktree_identity
|
|
17
16
|
from agent_lifecycle.audit.external_checks import audit_external_check_result
|
|
17
|
+
from agent_lifecycle.changesets.git_io import run_bounded_command
|
|
18
18
|
from agent_lifecycle.contracts import LifecycleError, canonical_digest, read_json_object
|
|
19
19
|
from agent_lifecycle.contracts.external_check_schemas import (
|
|
20
20
|
MAX_ARG_BYTES,
|
|
@@ -258,16 +258,13 @@ def _source_snapshot(root: Path, revision: str | None) -> dict[str, Any]:
|
|
|
258
258
|
|
|
259
259
|
def _source_paths(root: Path) -> list[str]:
|
|
260
260
|
try:
|
|
261
|
-
completed =
|
|
261
|
+
completed = run_bounded_command(
|
|
262
262
|
["git", "ls-files", "--cached", "--others", "--exclude-standard", "-z"],
|
|
263
263
|
cwd=root,
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
capture_output=True,
|
|
267
|
-
timeout=30,
|
|
268
|
-
check=False,
|
|
264
|
+
timeout_seconds=30,
|
|
265
|
+
max_stdout_bytes=MAX_SOURCE_FILE_LIST_BYTES,
|
|
269
266
|
)
|
|
270
|
-
except (OSError,
|
|
267
|
+
except (OSError, LifecycleError) as exc:
|
|
271
268
|
raise LifecycleError("external-check-source-unavailable", "source file set could not be captured") from exc
|
|
272
269
|
if completed.returncode != 0 or len(completed.stdout) > MAX_SOURCE_FILE_LIST_BYTES:
|
|
273
270
|
raise LifecycleError("external-check-source-unavailable", "source file set could not be captured")
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import math
|
|
5
6
|
import subprocess
|
|
6
7
|
import threading
|
|
7
8
|
from typing import Any
|
|
@@ -13,6 +14,7 @@ from agent_lifecycle.contracts.process_execution_schemas import build_process_ex
|
|
|
13
14
|
DEFAULT_OUTPUT_BYTES = 262_144
|
|
14
15
|
DEFAULT_CLEANUP_GRACE_SECONDS = 1.0
|
|
15
16
|
|
|
17
|
+
|
|
16
18
|
def _invalid_limit_failure(
|
|
17
19
|
*,
|
|
18
20
|
input_bytes: bytes,
|
|
@@ -23,7 +25,32 @@ def _invalid_limit_failure(
|
|
|
23
25
|
attempt_id: str | None,
|
|
24
26
|
adapter_id: str | None,
|
|
25
27
|
retry: dict[str, Any] | None,
|
|
28
|
+
timeout_seconds: float,
|
|
29
|
+
cleanup_grace_seconds: float,
|
|
26
30
|
) -> dict[str, Any] | None:
|
|
31
|
+
for name, value in (("timeout", timeout_seconds), ("cleanup-grace", cleanup_grace_seconds)):
|
|
32
|
+
if (
|
|
33
|
+
type(value) not in (int, float)
|
|
34
|
+
or not math.isfinite(value)
|
|
35
|
+
or value < 0
|
|
36
|
+
or (name == "timeout" and value == 0)
|
|
37
|
+
):
|
|
38
|
+
return _bounded_failure(
|
|
39
|
+
f"adapter-process-{name}-invalid",
|
|
40
|
+
input_bytes=len(input_bytes),
|
|
41
|
+
output_bytes=0,
|
|
42
|
+
process_started=False,
|
|
43
|
+
details={
|
|
44
|
+
"reason": (
|
|
45
|
+
"positive-finite-limit-required" if name == "timeout" else "nonnegative-finite-limit-required"
|
|
46
|
+
)
|
|
47
|
+
},
|
|
48
|
+
command_hash=command_hash,
|
|
49
|
+
operation_id=operation_id,
|
|
50
|
+
attempt_id=attempt_id,
|
|
51
|
+
adapter_id=adapter_id,
|
|
52
|
+
retry=retry,
|
|
53
|
+
)
|
|
27
54
|
if max_input_bytes is not None and len(input_bytes) > max_input_bytes:
|
|
28
55
|
return _bounded_failure(
|
|
29
56
|
"adapter-process-input-limit",
|
|
@@ -52,6 +79,7 @@ def _invalid_limit_failure(
|
|
|
52
79
|
)
|
|
53
80
|
return None
|
|
54
81
|
|
|
82
|
+
|
|
55
83
|
def _build_process_result(
|
|
56
84
|
process: subprocess.Popen[Any],
|
|
57
85
|
*,
|
|
@@ -75,8 +103,9 @@ def _build_process_result(
|
|
|
75
103
|
) -> dict[str, Any]:
|
|
76
104
|
stdout = capture.captures["stdout"].decode("utf-8", errors="replace")
|
|
77
105
|
stderr = capture.captures["stderr"].decode("utf-8", errors="replace")
|
|
78
|
-
|
|
79
|
-
|
|
106
|
+
safe_stdout, stdout_redacted = redact_process_text(stdout)
|
|
107
|
+
safe_stderr, stderr_redacted = redact_process_text(stderr)
|
|
108
|
+
stdout_tail, stderr_tail = safe_stdout[-2000:], safe_stderr[-2000:]
|
|
80
109
|
blockers = _process_blockers(
|
|
81
110
|
capture.output_limit_exceeded,
|
|
82
111
|
timed_out=timed_out,
|
|
@@ -132,6 +161,7 @@ def _build_process_result(
|
|
|
132
161
|
"blockers": blockers,
|
|
133
162
|
}
|
|
134
163
|
|
|
164
|
+
|
|
135
165
|
def _process_blockers(
|
|
136
166
|
output_limit_exceeded: threading.Event,
|
|
137
167
|
*,
|
|
@@ -155,6 +185,7 @@ def _process_blockers(
|
|
|
155
185
|
blockers.append({"code": "adapter-process-cleanup-unverified", "cleanup": cleanup})
|
|
156
186
|
return blockers
|
|
157
187
|
|
|
188
|
+
|
|
158
189
|
def _bounded_failure(
|
|
159
190
|
code: str,
|
|
160
191
|
*,
|
|
@@ -4,17 +4,18 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import hashlib
|
|
6
6
|
import os
|
|
7
|
-
import subprocess
|
|
8
7
|
import time
|
|
9
8
|
from pathlib import Path
|
|
10
9
|
from typing import Any
|
|
11
10
|
|
|
11
|
+
from agent_lifecycle.changesets.git_io import run_bounded_command
|
|
12
12
|
from agent_lifecycle.contracts import LifecycleError, canonical_digest
|
|
13
13
|
|
|
14
14
|
MAX_UNTRACKED_FILES = 100_000
|
|
15
15
|
MAX_UNTRACKED_BYTES = 4 * 1024 * 1024 * 1024
|
|
16
16
|
MAX_HASH_CHUNK_BYTES = 256 * 1024
|
|
17
17
|
MAX_CAPTURE_SECONDS = 120.0
|
|
18
|
+
MAX_GIT_CAPTURE_BYTES = 128 * 1024 * 1024
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
def capture_git_worktree_identity(project_root: Path) -> dict[str, Any]:
|
|
@@ -29,8 +30,8 @@ def capture_git_worktree_identity(project_root: Path) -> dict[str, Any]:
|
|
|
29
30
|
root = project_root.resolve()
|
|
30
31
|
deadline = time.monotonic() + MAX_CAPTURE_SECONDS
|
|
31
32
|
head = _git_bytes(root, ["rev-parse", "HEAD"], deadline).decode("ascii", errors="strict").strip()
|
|
32
|
-
staged = _git_bytes(root, ["diff", "--cached", "--binary", "--no-ext-diff"], deadline)
|
|
33
|
-
unstaged = _git_bytes(root, ["diff", "--binary", "--no-ext-diff"], deadline)
|
|
33
|
+
staged = _git_bytes(root, ["diff", "--cached", "--binary", "--no-ext-diff", "--no-textconv"], deadline)
|
|
34
|
+
unstaged = _git_bytes(root, ["diff", "--binary", "--no-ext-diff", "--no-textconv"], deadline)
|
|
34
35
|
submodules = _git_bytes(root, ["submodule", "status", "--recursive"], deadline)
|
|
35
36
|
untracked_raw = _git_bytes(root, ["ls-files", "--others", "--exclude-standard", "-z"], deadline)
|
|
36
37
|
names = sorted(item for item in untracked_raw.split(b"\0") if item)
|
|
@@ -131,16 +132,13 @@ def _git_bytes(root: Path, args: list[str], deadline: float) -> bytes:
|
|
|
131
132
|
if remaining <= 0:
|
|
132
133
|
raise LifecycleError("planning-worktree-identity-timeout", "Git identity capture exceeded its deadline")
|
|
133
134
|
try:
|
|
134
|
-
result =
|
|
135
|
+
result = run_bounded_command(
|
|
135
136
|
["git", *args],
|
|
136
137
|
cwd=root,
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
capture_output=True,
|
|
140
|
-
timeout=remaining,
|
|
141
|
-
check=False,
|
|
138
|
+
timeout_seconds=remaining,
|
|
139
|
+
max_stdout_bytes=MAX_GIT_CAPTURE_BYTES,
|
|
142
140
|
)
|
|
143
|
-
except (OSError,
|
|
141
|
+
except (OSError, LifecycleError) as exc:
|
|
144
142
|
raise LifecycleError(
|
|
145
143
|
"planning-worktree-identity-failed",
|
|
146
144
|
"Git identity capture failed closed",
|
{agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.19.0}/src/agent_lifecycle/changesets/git.py
RENAMED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
import subprocess
|
|
6
5
|
from pathlib import Path
|
|
7
6
|
|
|
7
|
+
from agent_lifecycle.changesets.git_io import run_bounded_command
|
|
8
8
|
from agent_lifecycle.contracts import LifecycleError
|
|
9
9
|
from agent_lifecycle.contracts.paths import normalize_git_revision, normalize_repo_path
|
|
10
10
|
|
|
@@ -63,20 +63,24 @@ def changed_files(cwd: Path, *, base: str | None = None) -> list[str]:
|
|
|
63
63
|
def resolve_revision(cwd: Path, revision: str, *, label: str = "revision") -> str:
|
|
64
64
|
value = normalize_git_revision(revision, label=label)
|
|
65
65
|
try:
|
|
66
|
-
completed =
|
|
66
|
+
completed = run_bounded_command(
|
|
67
67
|
["git", "rev-parse", "--verify", "--end-of-options", f"{value}^{{commit}}"],
|
|
68
68
|
cwd=cwd,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
text=True,
|
|
72
|
-
timeout=GIT_TIMEOUT_SECONDS,
|
|
69
|
+
timeout_seconds=GIT_TIMEOUT_SECONDS,
|
|
70
|
+
max_stdout_bytes=128,
|
|
73
71
|
)
|
|
74
|
-
except (OSError,
|
|
72
|
+
except (OSError, LifecycleError) as exc:
|
|
75
73
|
raise LifecycleError("invalid-git-revision", f"{label}: revision cannot be resolved") from exc
|
|
76
74
|
resolved = completed.stdout.strip().splitlines()
|
|
77
|
-
if len(resolved) != 1 or
|
|
75
|
+
if completed.returncode or len(resolved) != 1 or len(resolved[0]) not in (40, 64):
|
|
78
76
|
raise LifecycleError("invalid-git-revision", f"{label}: revision cannot be resolved")
|
|
79
|
-
|
|
77
|
+
try:
|
|
78
|
+
value = resolved[0].decode("ascii")
|
|
79
|
+
except UnicodeDecodeError as exc:
|
|
80
|
+
raise LifecycleError("invalid-git-revision", f"{label}: revision cannot be resolved") from exc
|
|
81
|
+
if any(char not in "0123456789abcdef" for char in value):
|
|
82
|
+
raise LifecycleError("invalid-git-revision", f"{label}: revision cannot be resolved")
|
|
83
|
+
return value
|
|
80
84
|
|
|
81
85
|
|
|
82
86
|
def _resolve_revision(cwd: Path, revision: str, *, label: str = "revision") -> str:
|
|
@@ -87,21 +91,19 @@ def _resolve_revision(cwd: Path, revision: str, *, label: str = "revision") -> s
|
|
|
87
91
|
|
|
88
92
|
def _git_paths(cwd: Path, argv: list[str]) -> list[str]:
|
|
89
93
|
try:
|
|
90
|
-
completed =
|
|
94
|
+
completed = run_bounded_command(
|
|
91
95
|
argv,
|
|
92
96
|
cwd=cwd,
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
timeout=GIT_TIMEOUT_SECONDS,
|
|
96
|
-
)
|
|
97
|
-
except (OSError, subprocess.CalledProcessError, subprocess.TimeoutExpired) as exc:
|
|
98
|
-
raise LifecycleError("git-command-failed", f"git command failed: {' '.join(argv)}") from exc
|
|
99
|
-
if len(completed.stdout) > MAX_GIT_OUTPUT_BYTES:
|
|
100
|
-
raise LifecycleError(
|
|
101
|
-
"git-output-limit",
|
|
102
|
-
"Git changed-file output exceeds the bounded snapshot limit",
|
|
103
|
-
{"maxBytes": MAX_GIT_OUTPUT_BYTES},
|
|
97
|
+
timeout_seconds=GIT_TIMEOUT_SECONDS,
|
|
98
|
+
max_stdout_bytes=MAX_GIT_OUTPUT_BYTES,
|
|
104
99
|
)
|
|
100
|
+
except LifecycleError as exc:
|
|
101
|
+
code = "git-output-limit" if exc.code == "bounded-process-output-limit" else "git-command-failed"
|
|
102
|
+
raise LifecycleError(code, "Git changed-file command failed closed") from exc
|
|
103
|
+
except OSError as exc:
|
|
104
|
+
raise LifecycleError("git-command-failed", "Git changed-file command could not start") from exc
|
|
105
|
+
if completed.returncode:
|
|
106
|
+
raise LifecycleError("git-command-failed", "Git changed-file command failed")
|
|
105
107
|
paths = []
|
|
106
108
|
for raw in completed.stdout.split(b"\0"):
|
|
107
109
|
if not raw:
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
"""Bounded, interruptible byte transport for local Git and inspection commands.
|
|
2
|
+
|
|
3
|
+
This module owns pipe reads and its direct subprocess. Adapter lifecycle,
|
|
4
|
+
qualification and process-group attestation remain at their existing owners.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import math
|
|
10
|
+
import os
|
|
11
|
+
import queue
|
|
12
|
+
import signal
|
|
13
|
+
import subprocess
|
|
14
|
+
import threading
|
|
15
|
+
import time
|
|
16
|
+
from collections.abc import Callable
|
|
17
|
+
from contextlib import suppress
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import IO
|
|
20
|
+
|
|
21
|
+
from agent_lifecycle.contracts import LifecycleError
|
|
22
|
+
|
|
23
|
+
_CHUNK_BYTES = 65536
|
|
24
|
+
_POLL_SECONDS = 0.02
|
|
25
|
+
_CLEANUP_SECONDS = 0.5
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _windows_cleanup(process: subprocess.Popen[bytes]) -> Callable[[], None] | None:
|
|
29
|
+
"""Retain a Job handle so a recursive local command can be reaped as a tree."""
|
|
30
|
+
if os.name != "nt":
|
|
31
|
+
return None
|
|
32
|
+
import ctypes
|
|
33
|
+
from ctypes import wintypes
|
|
34
|
+
|
|
35
|
+
win_dll = getattr(ctypes, "WinDLL", None)
|
|
36
|
+
if not callable(win_dll):
|
|
37
|
+
raise LifecycleError("bounded-process-group-unavailable", "Windows group API is unavailable")
|
|
38
|
+
kernel = win_dll("kernel32", use_last_error=True)
|
|
39
|
+
kernel.CreateJobObjectW.argtypes = [wintypes.LPVOID, wintypes.LPCWSTR]
|
|
40
|
+
kernel.CreateJobObjectW.restype = wintypes.HANDLE
|
|
41
|
+
kernel.AssignProcessToJobObject.argtypes = [wintypes.HANDLE, wintypes.HANDLE]
|
|
42
|
+
kernel.AssignProcessToJobObject.restype = wintypes.BOOL
|
|
43
|
+
kernel.TerminateJobObject.argtypes = [wintypes.HANDLE, wintypes.UINT]
|
|
44
|
+
kernel.TerminateJobObject.restype = wintypes.BOOL
|
|
45
|
+
kernel.CloseHandle.argtypes = [wintypes.HANDLE]
|
|
46
|
+
kernel.CloseHandle.restype = wintypes.BOOL
|
|
47
|
+
handle = kernel.CreateJobObjectW(None, None)
|
|
48
|
+
if not handle:
|
|
49
|
+
raise LifecycleError("bounded-process-group-unavailable", "Cannot own the Windows child group")
|
|
50
|
+
if not kernel.AssignProcessToJobObject(handle, getattr(process, "_handle", None)):
|
|
51
|
+
kernel.CloseHandle(handle)
|
|
52
|
+
raise LifecycleError("bounded-process-group-unavailable", "Cannot own the Windows child group")
|
|
53
|
+
|
|
54
|
+
def cleanup() -> None:
|
|
55
|
+
terminated = kernel.TerminateJobObject(handle, 1)
|
|
56
|
+
closed = kernel.CloseHandle(handle)
|
|
57
|
+
if not terminated or not closed:
|
|
58
|
+
raise LifecycleError("bounded-process-cleanup-failed", "Windows child group cleanup failed")
|
|
59
|
+
|
|
60
|
+
return cleanup
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class _PipeReader:
|
|
64
|
+
def __init__(self, owner: BoundedProcess, stream: IO[bytes], limit: int) -> None:
|
|
65
|
+
self.owner = owner
|
|
66
|
+
self.stream = stream
|
|
67
|
+
self.limit = limit
|
|
68
|
+
self.chunks: queue.Queue[bytes | None] = queue.Queue(maxsize=2)
|
|
69
|
+
self.buffer = bytearray()
|
|
70
|
+
self.eof = False
|
|
71
|
+
self.thread = threading.Thread(target=self._pump, name="alk-bounded-pipe", daemon=True)
|
|
72
|
+
|
|
73
|
+
def _pump(self) -> None:
|
|
74
|
+
total = 0
|
|
75
|
+
try:
|
|
76
|
+
while not self.owner.stopping.is_set():
|
|
77
|
+
data = os.read(self.stream.fileno(), min(_CHUNK_BYTES, self.limit - total + 1))
|
|
78
|
+
total += len(data)
|
|
79
|
+
if total > self.limit:
|
|
80
|
+
self.owner.fail("bounded-process-output-limit")
|
|
81
|
+
return
|
|
82
|
+
while not self.owner.stopping.is_set():
|
|
83
|
+
try:
|
|
84
|
+
self.chunks.put(data or None, timeout=_POLL_SECONDS)
|
|
85
|
+
break
|
|
86
|
+
except queue.Full:
|
|
87
|
+
continue
|
|
88
|
+
if not data:
|
|
89
|
+
return
|
|
90
|
+
except OSError:
|
|
91
|
+
if not self.owner.stopping.is_set():
|
|
92
|
+
self.owner.fail("bounded-process-read-failed")
|
|
93
|
+
|
|
94
|
+
def _fill(self) -> None:
|
|
95
|
+
while not self.eof:
|
|
96
|
+
self.owner.check()
|
|
97
|
+
try:
|
|
98
|
+
chunk = self.chunks.get(timeout=self.owner.remaining())
|
|
99
|
+
except queue.Empty:
|
|
100
|
+
continue
|
|
101
|
+
if chunk is None:
|
|
102
|
+
self.eof = True
|
|
103
|
+
else:
|
|
104
|
+
self.buffer.extend(chunk)
|
|
105
|
+
return
|
|
106
|
+
|
|
107
|
+
def readline(self, max_bytes: int) -> bytes:
|
|
108
|
+
while True:
|
|
109
|
+
self.owner.check()
|
|
110
|
+
end = self.buffer.find(b"\n")
|
|
111
|
+
size = end + 1 if end >= 0 else len(self.buffer)
|
|
112
|
+
if size > max_bytes:
|
|
113
|
+
raise LifecycleError("bounded-process-line-limit", "Process line exceeds its byte limit")
|
|
114
|
+
if end >= 0 or self.eof:
|
|
115
|
+
value = bytes(self.buffer[:size])
|
|
116
|
+
del self.buffer[:size]
|
|
117
|
+
return value
|
|
118
|
+
self._fill()
|
|
119
|
+
|
|
120
|
+
def read(self, size: int) -> bytes:
|
|
121
|
+
chunks: list[bytes] = []
|
|
122
|
+
remaining = size
|
|
123
|
+
while remaining:
|
|
124
|
+
self.owner.check()
|
|
125
|
+
if not self.buffer and not self.eof:
|
|
126
|
+
self._fill()
|
|
127
|
+
if not self.buffer:
|
|
128
|
+
break
|
|
129
|
+
value = bytes(self.buffer[:remaining])
|
|
130
|
+
del self.buffer[: len(value)]
|
|
131
|
+
chunks.append(value)
|
|
132
|
+
remaining -= len(value)
|
|
133
|
+
return b"".join(chunks)
|
|
134
|
+
|
|
135
|
+
def read_all(self) -> bytes:
|
|
136
|
+
chunks: list[bytes] = []
|
|
137
|
+
while True:
|
|
138
|
+
chunk = self.read(_CHUNK_BYTES)
|
|
139
|
+
if not chunk:
|
|
140
|
+
return b"".join(chunks)
|
|
141
|
+
chunks.append(chunk)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
class BoundedProcess:
|
|
145
|
+
"""Keep one absolute deadline across a streaming request/response session."""
|
|
146
|
+
|
|
147
|
+
def __init__(
|
|
148
|
+
self,
|
|
149
|
+
argv: list[str],
|
|
150
|
+
*,
|
|
151
|
+
cwd: Path,
|
|
152
|
+
deadline: float,
|
|
153
|
+
max_stdout_bytes: int,
|
|
154
|
+
max_stderr_bytes: int = 65536,
|
|
155
|
+
writable: bool = False,
|
|
156
|
+
) -> None:
|
|
157
|
+
if type(deadline) not in (int, float) or not math.isfinite(deadline) or deadline <= time.monotonic():
|
|
158
|
+
raise LifecycleError("bounded-process-timeout", "Process deadline is invalid or expired")
|
|
159
|
+
if not argv or any(not isinstance(value, str) or "\0" in value for value in argv):
|
|
160
|
+
raise LifecycleError("bounded-process-argv-invalid", "A shell-free argument vector is required")
|
|
161
|
+
if any(type(value) is not int or value < 1 for value in (max_stdout_bytes, max_stderr_bytes)):
|
|
162
|
+
raise LifecycleError("bounded-process-limit-invalid", "Positive byte limits are required")
|
|
163
|
+
self.deadline = deadline
|
|
164
|
+
self.closed = False
|
|
165
|
+
self.stopping = threading.Event()
|
|
166
|
+
self.failure: str | None = None
|
|
167
|
+
self.stderr = bytearray()
|
|
168
|
+
self.max_stderr_bytes = max_stderr_bytes
|
|
169
|
+
self.writes: queue.Queue[tuple[bytes | None, threading.Event]] = queue.Queue(maxsize=1)
|
|
170
|
+
env = dict(os.environ)
|
|
171
|
+
if Path(argv[0]).stem.lower() == "git":
|
|
172
|
+
env.update(GIT_NO_LAZY_FETCH="1", GIT_TERMINAL_PROMPT="0")
|
|
173
|
+
self.process = subprocess.Popen(
|
|
174
|
+
argv,
|
|
175
|
+
cwd=cwd,
|
|
176
|
+
env=env,
|
|
177
|
+
stdin=subprocess.PIPE if writable else subprocess.DEVNULL,
|
|
178
|
+
stdout=subprocess.PIPE,
|
|
179
|
+
stderr=subprocess.PIPE,
|
|
180
|
+
shell=False,
|
|
181
|
+
bufsize=0,
|
|
182
|
+
start_new_session=os.name == "posix",
|
|
183
|
+
)
|
|
184
|
+
self.threads: list[threading.Thread] = []
|
|
185
|
+
self.windows_cleanup: Callable[[], None] | None = None
|
|
186
|
+
try:
|
|
187
|
+
self.windows_cleanup = _windows_cleanup(self.process)
|
|
188
|
+
assert self.process.stdout is not None
|
|
189
|
+
self.stdout = _PipeReader(self, self.process.stdout, max_stdout_bytes)
|
|
190
|
+
self.threads.append(self.stdout.thread)
|
|
191
|
+
self.stdout.thread.start()
|
|
192
|
+
reader = threading.Thread(target=self._drain_stderr, name="alk-bounded-stderr", daemon=True)
|
|
193
|
+
self.threads.append(reader)
|
|
194
|
+
reader.start()
|
|
195
|
+
if writable:
|
|
196
|
+
writer = threading.Thread(target=self._write_requests, name="alk-bounded-input", daemon=True)
|
|
197
|
+
self.threads.append(writer)
|
|
198
|
+
writer.start()
|
|
199
|
+
except BaseException:
|
|
200
|
+
self.close()
|
|
201
|
+
raise
|
|
202
|
+
|
|
203
|
+
def fail(self, code: str) -> None:
|
|
204
|
+
if self.failure is None:
|
|
205
|
+
self.failure = code
|
|
206
|
+
|
|
207
|
+
def check(self) -> None:
|
|
208
|
+
if self.failure:
|
|
209
|
+
raise LifecycleError(self.failure, "Bounded process transport failed")
|
|
210
|
+
if time.monotonic() >= self.deadline:
|
|
211
|
+
raise LifecycleError("bounded-process-timeout", "Process exceeded its deadline")
|
|
212
|
+
|
|
213
|
+
def remaining(self) -> float:
|
|
214
|
+
self.check()
|
|
215
|
+
return min(_POLL_SECONDS, max(0.0001, self.deadline - time.monotonic()))
|
|
216
|
+
|
|
217
|
+
def _drain_stderr(self) -> None:
|
|
218
|
+
assert self.process.stderr is not None
|
|
219
|
+
try:
|
|
220
|
+
while not self.stopping.is_set():
|
|
221
|
+
data = os.read(
|
|
222
|
+
self.process.stderr.fileno(), min(_CHUNK_BYTES, self.max_stderr_bytes - len(self.stderr) + 1)
|
|
223
|
+
)
|
|
224
|
+
if not data:
|
|
225
|
+
return
|
|
226
|
+
if len(self.stderr) + len(data) > self.max_stderr_bytes:
|
|
227
|
+
self.fail("bounded-process-stderr-limit")
|
|
228
|
+
return
|
|
229
|
+
self.stderr.extend(data)
|
|
230
|
+
except OSError:
|
|
231
|
+
if not self.stopping.is_set():
|
|
232
|
+
self.fail("bounded-process-read-failed")
|
|
233
|
+
|
|
234
|
+
def _write_requests(self) -> None:
|
|
235
|
+
assert self.process.stdin is not None
|
|
236
|
+
while not self.stopping.is_set():
|
|
237
|
+
try:
|
|
238
|
+
data, done = self.writes.get(timeout=_POLL_SECONDS)
|
|
239
|
+
except queue.Empty:
|
|
240
|
+
continue
|
|
241
|
+
try:
|
|
242
|
+
if data is None:
|
|
243
|
+
self.process.stdin.close()
|
|
244
|
+
return
|
|
245
|
+
view = memoryview(data)
|
|
246
|
+
while view:
|
|
247
|
+
written = self.process.stdin.write(view.tobytes())
|
|
248
|
+
if not written:
|
|
249
|
+
raise BrokenPipeError
|
|
250
|
+
view = view[written:]
|
|
251
|
+
self.process.stdin.flush()
|
|
252
|
+
except (OSError, ValueError):
|
|
253
|
+
self.fail("bounded-process-write-failed")
|
|
254
|
+
return
|
|
255
|
+
finally:
|
|
256
|
+
done.set()
|
|
257
|
+
|
|
258
|
+
def write_request(self, data: bytes | None) -> None:
|
|
259
|
+
"""Deliver one small batch request, or close its input, under the same clock."""
|
|
260
|
+
if self.process.stdin is None or (data is not None and len(data) > 1024):
|
|
261
|
+
raise LifecycleError("bounded-process-request-invalid", "A bounded batch request is required")
|
|
262
|
+
done = threading.Event()
|
|
263
|
+
while True:
|
|
264
|
+
self.check()
|
|
265
|
+
try:
|
|
266
|
+
self.writes.put((data, done), timeout=self.remaining())
|
|
267
|
+
break
|
|
268
|
+
except queue.Full:
|
|
269
|
+
continue
|
|
270
|
+
while not done.wait(self.remaining()):
|
|
271
|
+
self.check()
|
|
272
|
+
self.check()
|
|
273
|
+
|
|
274
|
+
def wait(self) -> int:
|
|
275
|
+
while self.process.poll() is None:
|
|
276
|
+
time.sleep(self.remaining())
|
|
277
|
+
for thread in self.threads[1:2]:
|
|
278
|
+
while thread.is_alive():
|
|
279
|
+
thread.join(self.remaining())
|
|
280
|
+
self.check()
|
|
281
|
+
returncode = self.process.returncode
|
|
282
|
+
assert returncode is not None
|
|
283
|
+
return returncode
|
|
284
|
+
|
|
285
|
+
def close(self) -> None:
|
|
286
|
+
if self.closed:
|
|
287
|
+
return
|
|
288
|
+
self.closed = True
|
|
289
|
+
self.stopping.set()
|
|
290
|
+
cleanup_error: LifecycleError | None = None
|
|
291
|
+
if os.name == "posix":
|
|
292
|
+
with suppress(ProcessLookupError):
|
|
293
|
+
try:
|
|
294
|
+
os.killpg(self.process.pid, signal.SIGKILL)
|
|
295
|
+
except PermissionError:
|
|
296
|
+
# A reaped child must not prevent closing our descriptors.
|
|
297
|
+
# Reader shutdown below still refuses a pipe held by a survivor.
|
|
298
|
+
if self.process.poll() is None:
|
|
299
|
+
self.process.kill()
|
|
300
|
+
cleanup_error = LifecycleError(
|
|
301
|
+
"bounded-process-cleanup-failed",
|
|
302
|
+
"Child group signal was denied",
|
|
303
|
+
)
|
|
304
|
+
else:
|
|
305
|
+
if self.windows_cleanup is not None:
|
|
306
|
+
try:
|
|
307
|
+
self.windows_cleanup()
|
|
308
|
+
except LifecycleError as exc:
|
|
309
|
+
cleanup_error = exc
|
|
310
|
+
if self.process.poll() is None:
|
|
311
|
+
self.process.kill()
|
|
312
|
+
try:
|
|
313
|
+
self.process.wait(timeout=_CLEANUP_SECONDS)
|
|
314
|
+
except subprocess.TimeoutExpired as exc:
|
|
315
|
+
raise LifecycleError("bounded-process-cleanup-failed", "Process did not exit during cleanup") from exc
|
|
316
|
+
deadline = time.monotonic() + _CLEANUP_SECONDS
|
|
317
|
+
for thread in self.threads:
|
|
318
|
+
if thread.ident is not None:
|
|
319
|
+
thread.join(max(0.0, deadline - time.monotonic()))
|
|
320
|
+
if any(thread.is_alive() for thread in self.threads):
|
|
321
|
+
raise LifecycleError("bounded-process-cleanup-failed", "Process pipes did not finish during cleanup")
|
|
322
|
+
for stream in (self.process.stdin, self.process.stdout, self.process.stderr):
|
|
323
|
+
if stream is not None:
|
|
324
|
+
stream.close()
|
|
325
|
+
if cleanup_error is not None:
|
|
326
|
+
raise cleanup_error
|
|
327
|
+
|
|
328
|
+
def __enter__(self) -> BoundedProcess:
|
|
329
|
+
return self
|
|
330
|
+
|
|
331
|
+
def __exit__(self, *_exc: object) -> None:
|
|
332
|
+
self.close()
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
def run_bounded_command(
|
|
336
|
+
argv: list[str],
|
|
337
|
+
*,
|
|
338
|
+
cwd: Path,
|
|
339
|
+
timeout_seconds: float,
|
|
340
|
+
max_stdout_bytes: int,
|
|
341
|
+
max_stderr_bytes: int = 65536,
|
|
342
|
+
) -> subprocess.CompletedProcess[bytes]:
|
|
343
|
+
"""Capture a bounded command without allowing communicate() to grow unbounded."""
|
|
344
|
+
if type(timeout_seconds) not in (int, float) or not math.isfinite(timeout_seconds) or timeout_seconds <= 0:
|
|
345
|
+
raise LifecycleError("bounded-process-timeout-invalid", "A finite positive timeout is required")
|
|
346
|
+
with BoundedProcess(
|
|
347
|
+
argv,
|
|
348
|
+
cwd=cwd,
|
|
349
|
+
deadline=time.monotonic() + timeout_seconds,
|
|
350
|
+
max_stdout_bytes=max_stdout_bytes,
|
|
351
|
+
max_stderr_bytes=max_stderr_bytes,
|
|
352
|
+
) as transport:
|
|
353
|
+
stdout = transport.stdout.read_all()
|
|
354
|
+
returncode = transport.wait()
|
|
355
|
+
return subprocess.CompletedProcess(argv, returncode, stdout, bytes(transport.stderr))
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
__all__ = ["BoundedProcess", "run_bounded_command"]
|