agent-lifecycle-kit 2.17.0__tar.gz → 2.18.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.18.0}/PKG-INFO +3 -3
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/README.md +2 -2
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/pyproject.toml +1 -1
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/_version.py +1 -1
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/external_check.py +5 -8
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/process.py +2 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/process_control.py +33 -2
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/worktree_identity.py +8 -10
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/changesets/git.py +23 -21
- agent_lifecycle_kit-2.18.0/src/agent_lifecycle/changesets/git_io.py +358 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/changesets/snapshot.py +8 -14
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/agent_plugin_qualification_schemas.py +34 -10
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/ed25519.py +11 -4
- agent_lifecycle_kit-2.18.0/src/agent_lifecycle/contracts/launch_qualification.py +105 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/redaction.py +34 -1
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/agent_plugin_qualification.py +73 -17
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/inspection.py +18 -4
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/inspection_common.py +64 -12
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/inspection_opencode.py +100 -44
- agent_lifecycle_kit-2.18.0/src/agent_lifecycle/host_protocol/opencode_compatibility.py +153 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/neutrality/authority.py +30 -4
- agent_lifecycle_kit-2.18.0/src/agent_lifecycle/neutrality/git_objects.py +208 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/reporting/change_summary.py +29 -26
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0/src/agent_lifecycle_kit.egg-info}/PKG-INFO +3 -3
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle_kit.egg-info/SOURCES.txt +2 -0
- 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 → agent_lifecycle_kit-2.18.0}/LICENSE +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/NOTICE +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/benchmarks/reference-tasks/README.md +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/benchmarks/reference-tasks/manifest.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/benchmarks/reference-tasks/rt01-planning/oracle.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/benchmarks/reference-tasks/rt01-planning/task.md +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/benchmarks/reference-tasks/rt02-architecture-review/oracle.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/benchmarks/reference-tasks/rt02-architecture-review/task.md +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/benchmarks/reference-tasks/rt03-bug-forensics/oracle.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/benchmarks/reference-tasks/rt03-bug-forensics/task.md +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/benchmarks/reference-tasks/rt04-s1-managed-task/oracle.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/benchmarks/reference-tasks/rt04-s1-managed-task/task.md +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/benchmarks/reference-tasks/rt05-s2-evidence-task/oracle.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/benchmarks/reference-tasks/rt05-s2-evidence-task/task.md +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/setup.cfg +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/__main__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/closing_resource_admission.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/closing_resource_policy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/closing_resource_recovery.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/closing_resources.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/contracts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/declared_ledger.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/declared_ledger_legacy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/declared_ledger_records.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/host_bridge.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/input_fit.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/journal.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/normalization.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/opening_balances.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/profile_schema.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/source_usage_context.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/support_profiles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/workflow_authority_store.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/workflow_state_store.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/accounting/workflow_store.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/agent_plugin_probe.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/attempt_authority.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/bootstrap_r11.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/codex_exact_prompt.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/codex_input_diagnostics.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/codex_prompt_preparation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/codex_source_exposure.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/codex_source_subject.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/contracts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/env.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/external_jobs.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/immutable_input.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/input_lifecycle.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/launch_execution.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/launch_preflight.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/launcher.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/lifecycle_control.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/limited_native_evidence.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/local_launch_profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/managed_process.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/ordinary_audit.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/planning_launch.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/planning_session.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/private_input.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/process_capture.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/process_groups.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/process_telemetry.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/qualification.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/redaction.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/session_store.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/source_review_contracts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/source_review_history.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/source_review_inputs.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/source_review_preparation_records.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/source_review_roles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/source_review_shards.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/source_review_support.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/source_review_transcript.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/start_input.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/start_receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/start_routing.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/task_intake.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/unified_start.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/windows_pipe.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/adapter_sessions/workflow_bridge.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/audit/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/audit/bug_forensics.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/audit/delta.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/audit/domain_language.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/audit/external_checks.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/audit/implementation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/audit/ownership.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/audit/package.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/audit/proof_chain.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/audit/proof_findings.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/audit/proof_integrity.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/audit/review_verdict.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/audit/security_analysis.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/benchmarks/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/benchmarks/comparison.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/benchmarks/contracts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/benchmarks/evaluator.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/benchmarks/oracles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/benchmarks/qualification.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/benchmarks/reporting.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/benchmarks/stratification.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/changesets/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/adapter.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/benchmarks.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/command_registry.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/dispatch.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/dispatch_adapters.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/dispatch_audit.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/dispatch_contracts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/dispatch_lifecycle.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/dispatch_metrics.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/dispatch_observability.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/dispatch_planning.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/dispatch_research.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/errors.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/followup.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/host_launch.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/lifecycle_parsers.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/main.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/metrics_parser.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/observability_parsers.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/parsers.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/plan_lock_commands.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/planning_parsers.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/policy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/progress_hooks.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/project.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/research.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/start.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/strategy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/workflow_task_parsers.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/cli/worktree.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/compiler/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/compiler/output_contract.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/compiler/phase_packets.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/compiler/small_model_packets.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/compiler/task_packets.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/context/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/context/checkpoint_store.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/context/checkpoints.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/context/episode_retrieval.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/context/external_memory.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/context/profiles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/context/rendering.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/context/thread_bridge_context.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/adapter_contract_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/adapter_event_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/adapter_session_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/adapter_task_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/audit_optimization_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/audit_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/authority_io.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/authority_text.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/benchmark_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/bounded_json.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/bug_forensics_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/canonical.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/closing_resource_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/closing_window_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/compatibility.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/context_checkpoint_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/context_model_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/core_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/cross_check_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/deadline_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/deadlines.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/domain_language.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/domain_language_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/errors.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/evidence_import_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/evidence_receipt_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/execution_strategy_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/external_check_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/external_job_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/finding_check_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/goal_validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/host_capability_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/immutable_input_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/implementation_audit_validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/import_dialect_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/independent_evidence_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/legacy_runner_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/lifecycle_action_catalog.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/lifecycle_control_definitions.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/lifecycle_control_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/lifecycle_control_validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/local_launch_validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/metric_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/model_classes.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/multi_run_view_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/ownership_paths.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/paths.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/performance_limits.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/persistence.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/phase_packet_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/plan_contract_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/plan_delta_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/plan_manifest_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/planning_launch_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/policy_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/private_storage.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/process_execution_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/process_lock.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/process_redaction.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/progress_bridge_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/progress_hook_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/project_profile_preset_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/project_profile_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/proof_integrity_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/proof_validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/public_locators.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/quality_modes.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/release_accounting_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/release_contract_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/research_evidence_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/review_mesh_recommendation_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/review_mesh_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/review_quality_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/review_round_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/review_verdict.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/reviewer_identity_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/runner_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/runner_worktree_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/sandbox_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/schema_builders.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/scoped_usage_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/security_analysis_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/statistical_evidence_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/status_goal_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/structured_result_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/task_template_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/thread_bridge_schema_definitions.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/thread_bridge_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/thread_bridge_validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/token_estimation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/usage_export_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/validation_ladder_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/windows_security.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/workflow_artifact_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/workflow_authority.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/workflow_authority_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/workflow_authorization_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/workflow_continuation_batch_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/workflow_continuation_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/workflow_economics_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/workflow_run_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/contracts/workflow_state_schemas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/data/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/data/profiles/external-checks/declared-dependencies.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/data/profiles/external-checks/import-boundaries.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/data/profiles/external-checks/module-dependencies.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/data/profiles/lifecycle-baselines.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/data/profiles/model-routing-profile.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.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.18.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.18.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.18.0}/src/agent_lifecycle/data/profiles/risk-execution-policy.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/data/profiles/small-context-profile.v1.json +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/diagnostics/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/diagnostics/bundles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/diagnostics/installation_catalog.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/diagnostics/readiness.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/evidence_index/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/evidence_index/core.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/evidence_index/episode_index.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/evidence_index/external_context.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/followup/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/followup/records.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/freeze/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/freeze/locks.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/freeze/package_integrity.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/goal/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/goal/records.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/goal/view.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/acp_capability.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/capabilities.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/context_events.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/contracts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/event_capture.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/events.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/external_jobs.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/inspection_claude.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/inspection_codex.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/inspection_cursor.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/inspection_gemini_cli.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/inspection_hermes.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/inspection_kimi_code.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/inspection_profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/inspection_qwen_code.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/lifecycle_control.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/lifecycle_control_qualification.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/lifecycle_gate.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/process_port.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/sandbox_receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/scaffold.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/structured_results.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/thread_bridge.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/usage_normalizers.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/host_protocol/validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/imports/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/imports/agentskills_profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/imports/bmad_profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/imports/constitution_adr.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/imports/dialect_profiles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/imports/external_agent.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/imports/external_dialects.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/imports/external_workflow.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/imports/multi_markdown.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/imports/openspec_profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/imports/planning.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/imports/security_findings.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/imports/spec_kit_profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/imports/spec_kitty_profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/metrics/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/metrics/audit_efficiency.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/metrics/audit_optimization.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/metrics/audit_samples.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/metrics/cost_collection.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/metrics/costs.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/metrics/outcome_index.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/metrics/phase_resources.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/metrics/recommendations.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/metrics/regression_signals.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/metrics/release_accounting.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/metrics/usage_export.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/metrics/workflow_economics.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/migration/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/migration/legacy_runner.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/model_routing/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/model_routing/profiles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/model_routing/receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/model_routing/resolver.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/neutrality/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/neutrality/__main__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/neutrality/canonical.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/neutrality/cli.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/neutrality/ed25519.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/neutrality/errors.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/neutrality/gate.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/neutrality/matching.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/neutrality/paths.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/neutrality/policy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/neutrality/receipt.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/neutrality/scanner.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/neutrality/test_runner.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/planning/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/planning/acceptance_markdown.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/planning/completeness.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/planning/continuity.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/planning/deltas.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/planning/manifest_contract.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/planning/prerequisites.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/planning/task_compatibility.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/planning/templates.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/planning/tiering.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/planning/traceability.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/planning/validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/planning/verification.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/policy/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/policy/adaptive_lifecycle.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/policy/apply.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/policy/execution_strategy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/policy/proposals.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/policy/quality_floor.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/policy/risk_execution.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/policy/runtime_receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/policy/thread_bridge.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/project/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/project/domain_language.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/project/guidance.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/project/merge.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/project/presets.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/project/principles.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/project/profile.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/py.typed +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/quality/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/quality/bug_forensics.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/quality/bug_forensics_advisor.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/quality/bug_forensics_recipes.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/quality/cross_check.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/quality/dependency_impact.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/quality/external_checks.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/quality/failure_classification.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/quality/packs.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/quality/security_analysis.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/quality/validation_ladder.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/reporting/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/reporting/attention.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/reporting/event_feed.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/reporting/execution_resources.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/reporting/multi_run.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/reporting/progress_bridge.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/reporting/progress_hooks.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/reporting/progress_terminal.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/reporting/progress_view.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/reporting/status_view.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/reporting/usage_export.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/research/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/research/evidence.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/research/provenance.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/research/validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/resources.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/review/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/review/provenance.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/review/validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/review_mesh/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/review_mesh/assignments.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/review_mesh/contracts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/review_mesh/independence.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/review_mesh/operator_templates.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/review_mesh/quorum.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/review_mesh/recommendation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/review_mesh/results.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/review_mesh/synthesis.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/review_mesh/validation_helpers.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/runner/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/runner/core.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/runner/sandbox_receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/specification/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/specification/completion_check.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/specification/completion_gate.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/specification/completion_signal.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/specification/validation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/artifacts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/audit_evidence.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/authorization.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/budget_decisions.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/budget_policy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/budget_receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/bug_forensics_gates.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/checkpoint_gate.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/closing_policy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/closing_window.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/continuation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/continuation_batch.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/controller.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/deadline_guards.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/events.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/final_proof_integrity.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/finalization.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/gates.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/immutable_input.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/implementation_audit_gate.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/initialization.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/leases.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/limited_usage.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/lineage.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/managed_runner.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/model_usage.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/next_action.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/operation_kernel.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/plan_adoption.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/query.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/review_mesh_gate.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/reviews.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/risk_execution_gate.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/run.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/run_transitions.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/sandbox_policy.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/sandbox_receipts.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/selectors.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/state.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/task_outcomes.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/task_start.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/task_transitions.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/transactions.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/workflow/transition_contract.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/worktree/__init__.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle/worktree/isolation.py +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle_kit.egg-info/dependency_links.txt +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.0}/src/agent_lifecycle_kit.egg-info/entry_points.txt +0 -0
- {agent_lifecycle_kit-2.17.0 → agent_lifecycle_kit-2.18.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.18.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.18.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.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.18.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.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.18.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.18.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.18.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"]
|