agent-lifecycle-kit 1.63.2__tar.gz → 1.65.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-1.63.2/src/agent_lifecycle_kit.egg-info → agent_lifecycle_kit-1.65.0}/PKG-INFO +3 -3
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/README.md +2 -2
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/pyproject.toml +1 -1
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/_version.py +1 -1
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/adapter_sessions/session_store.py +2 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/adapter_sessions/unified_start.py +7 -4
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/dispatch.py +1 -1
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/dispatch_observability.py +124 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/parsers.py +42 -0
- agent_lifecycle_kit-1.65.0/src/agent_lifecycle/context/__init__.py +47 -0
- agent_lifecycle_kit-1.65.0/src/agent_lifecycle/context/checkpoint_store.py +198 -0
- agent_lifecycle_kit-1.65.0/src/agent_lifecycle/context/checkpoints.py +378 -0
- agent_lifecycle_kit-1.65.0/src/agent_lifecycle/context/thread_bridge_context.py +93 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/compatibility.py +10 -0
- agent_lifecycle_kit-1.65.0/src/agent_lifecycle/contracts/context_checkpoint_schemas.py +163 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/project_profile_schemas.py +35 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/redaction.py +14 -1
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/schemas.py +4 -0
- agent_lifecycle_kit-1.65.0/src/agent_lifecycle/contracts/thread_bridge_schemas.py +734 -0
- agent_lifecycle_kit-1.65.0/src/agent_lifecycle/host_protocol/context_events.py +122 -0
- agent_lifecycle_kit-1.65.0/src/agent_lifecycle/host_protocol/thread_bridge.py +60 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/policy/__init__.py +15 -6
- agent_lifecycle_kit-1.65.0/src/agent_lifecycle/policy/thread_bridge.py +337 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/project/merge.py +15 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/project/profile.py +11 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/review_mesh/__init__.py +4 -1
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/review_mesh/assignments.py +24 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/review_mesh/results.py +27 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/__init__.py +6 -0
- agent_lifecycle_kit-1.65.0/src/agent_lifecycle/workflow/checkpoint_gate.py +196 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/operation_kernel.py +9 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/plan_adoption.py +2 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0/src/agent_lifecycle_kit.egg-info}/PKG-INFO +3 -3
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle_kit.egg-info/SOURCES.txt +9 -0
- agent_lifecycle_kit-1.63.2/src/agent_lifecycle/context/__init__.py +0 -20
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/LICENSE +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/NOTICE +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/benchmarks/reference-tasks/README.md +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/benchmarks/reference-tasks/manifest.json +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/benchmarks/reference-tasks/rt01-planning/oracle.json +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/benchmarks/reference-tasks/rt01-planning/task.md +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/benchmarks/reference-tasks/rt02-architecture-review/oracle.json +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/benchmarks/reference-tasks/rt02-architecture-review/task.md +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/benchmarks/reference-tasks/rt03-bug-forensics/oracle.json +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/benchmarks/reference-tasks/rt03-bug-forensics/task.md +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/benchmarks/reference-tasks/rt04-s1-managed-task/oracle.json +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/benchmarks/reference-tasks/rt04-s1-managed-task/task.md +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/benchmarks/reference-tasks/rt05-s2-evidence-task/oracle.json +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/benchmarks/reference-tasks/rt05-s2-evidence-task/task.md +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/setup.cfg +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/__main__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/adapter_sessions/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/adapter_sessions/contracts.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/adapter_sessions/env.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/adapter_sessions/launcher.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/adapter_sessions/local_launch_profile.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/adapter_sessions/planning_launch.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/adapter_sessions/planning_session.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/adapter_sessions/process.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/adapter_sessions/qualification.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/adapter_sessions/redaction.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/adapter_sessions/task_intake.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/adapter_sessions/workflow_bridge.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/audit/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/audit/bug_forensics.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/audit/implementation.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/audit/ownership.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/audit/package.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/audit/proof_integrity.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/audit/review_verdict.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/benchmarks/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/benchmarks/comparison.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/benchmarks/contracts.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/benchmarks/evaluator.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/benchmarks/oracles.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/benchmarks/reporting.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/changesets/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/changesets/git.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/adapter.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/benchmarks.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/dispatch_adapters.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/dispatch_contracts.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/dispatch_lifecycle.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/dispatch_planning.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/followup.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/host_launch.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/main.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/metrics_parser.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/policy.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/progress_hooks.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/project.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/start.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/strategy.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/worktree.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/compiler/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/compiler/small_model_packets.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/compiler/task_packets.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/context/episode_retrieval.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/context/external_memory.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/context/profiles.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/context/rendering.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/adapter_contract_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/adapter_event_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/adapter_session_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/adapter_task_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/audit_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/benchmark_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/bug_forensics_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/canonical.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/context_model_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/core_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/cross_check_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/errors.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/evidence_import_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/execution_strategy_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/host_capability_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/import_dialect_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/metric_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/paths.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/plan_contract_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/planning_launch_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/policy_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/progress_bridge_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/progress_hook_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/proof_integrity_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/release_contract_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/review_mesh_recommendation_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/review_mesh_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/review_quality_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/review_verdict.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/runner_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/runner_worktree_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/sandbox_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/schema_builders.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/status_goal_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/task_template_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/contracts/usage_export_schemas.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/diagnostics/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/diagnostics/bundles.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/diagnostics/installation_catalog.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/diagnostics/readiness.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/evidence_index/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/evidence_index/core.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/evidence_index/episode_index.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/evidence_index/external_context.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/followup/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/followup/records.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/freeze/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/freeze/locks.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/goal/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/goal/records.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/goal/view.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/acp_capability.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/capabilities.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/contracts.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/event_capture.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/events.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/inspection.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/inspection_claude.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/inspection_codex.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/inspection_common.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/inspection_cursor.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/inspection_gemini_cli.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/inspection_hermes.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/inspection_kimi_code.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/inspection_opencode.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/inspection_qwen_code.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/receipts.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/scaffold.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/usage_normalizers.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/host_protocol/validation.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/imports/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/imports/agentskills_profile.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/imports/bmad_profile.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/imports/constitution_adr.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/imports/dialect_profiles.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/imports/external_agent.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/imports/external_dialects.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/imports/external_workflow.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/imports/multi_markdown.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/imports/openspec_profile.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/imports/planning.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/imports/spec_kit_profile.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/imports/spec_kitty_profile.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/metrics/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/metrics/cost_collection.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/metrics/costs.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/metrics/outcome_index.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/metrics/phase_resources.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/metrics/recommendations.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/metrics/regression_signals.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/metrics/usage_export.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/model_routing/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/model_routing/profiles.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/model_routing/receipts.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/model_routing/resolver.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/neutrality/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/neutrality/__main__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/neutrality/authority.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/neutrality/canonical.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/neutrality/cli.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/neutrality/ed25519.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/neutrality/errors.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/neutrality/gate.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/neutrality/paths.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/neutrality/policy.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/neutrality/receipt.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/neutrality/scanner.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/neutrality/test_runner.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/planning/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/planning/acceptance_markdown.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/planning/completeness.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/planning/continuity.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/planning/task_compatibility.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/planning/templates.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/planning/tiering.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/planning/validation.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/policy/adaptive_lifecycle.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/policy/apply.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/policy/execution_strategy.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/policy/proposals.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/policy/quality_floor.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/policy/risk_execution.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/policy/runtime_receipts.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/project/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/project/guidance.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/py.typed +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/quality/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/quality/bug_forensics.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/quality/bug_forensics_advisor.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/quality/bug_forensics_recipes.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/quality/cross_check.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/quality/failure_classification.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/quality/packs.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/reporting/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/reporting/change_summary.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/reporting/event_feed.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/reporting/progress_bridge.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/reporting/progress_hooks.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/reporting/progress_terminal.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/reporting/progress_view.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/reporting/status_view.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/reporting/usage_export.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/review/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/review/validation.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/review_mesh/contracts.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/review_mesh/operator_templates.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/review_mesh/quorum.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/review_mesh/recommendation.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/review_mesh/synthesis.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/runner/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/runner/attempt_snapshots.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/runner/core.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/runner/sandbox_receipts.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/specification/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/specification/completion_check.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/specification/completion_gate.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/specification/completion_signal.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/specification/validation.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/artifacts.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/budget_decisions.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/budget_policy.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/budget_receipts.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/bug_forensics_gates.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/controller.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/events.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/final_proof_integrity.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/finalization.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/gates.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/implementation_audit_gate.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/leases.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/lineage.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/managed_runner.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/model_usage.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/next_action.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/query.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/review_mesh_gate.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/reviews.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/risk_execution_gate.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/run_transitions.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/sandbox_policy.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/selectors.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/state.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/workflow/task_transitions.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/worktree/__init__.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/worktree/isolation.py +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle_kit.egg-info/dependency_links.txt +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle_kit.egg-info/entry_points.txt +0 -0
- {agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle_kit.egg-info/top_level.txt +0 -0
{agent_lifecycle_kit-1.63.2/src/agent_lifecycle_kit.egg-info → agent_lifecycle_kit-1.65.0}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-lifecycle-kit
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.65.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
|
|
@@ -61,7 +61,7 @@ and start a task with:
|
|
|
61
61
|
agent-lifecycle start --adapter <adapter-id> --file task.md
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
The published [PyPI package](https://pypi.org/project/agent-lifecycle-kit/) supports Python 3.11-3.14; install it with `python -m pip install agent-lifecycle-kit==1.
|
|
64
|
+
The published [PyPI package](https://pypi.org/project/agent-lifecycle-kit/) supports Python 3.11-3.14; install it with `python -m pip install agent-lifecycle-kit==1.65.0`. The optional [thread bridge](docs/reference/optional-thread-bridge.md) imports adapter-owned thread results as non-authoritative context.
|
|
65
65
|
Use [Quickstart](docs/guides/quickstart.md) for the first task and [Commands by task](docs/guides/commands-by-task.md) for detailed operations.
|
|
66
66
|
Continue with [task workflows](docs/guides/how-alk-works.md) and
|
|
67
67
|
[project profile init](docs/reference/project-workflow-profile.md),
|
|
@@ -69,7 +69,7 @@ Continue with [task workflows](docs/guides/how-alk-works.md) and
|
|
|
69
69
|
[Lifecycle task scenarios](docs/guides/lifecycle-cookbook.md). The [planning-only](docs/reference/planning-only-launch.md)
|
|
70
70
|
and [qualified frozen-task](docs/reference/qualified-host-launch.md) guides define launch boundaries.
|
|
71
71
|
See [System architecture](docs/architecture/system-architecture.md), [Project comparison](docs/reference/project-comparison.md),
|
|
72
|
-
and [Документация на русском](docs/ru/README.md).
|
|
72
|
+
[context checkpoints](docs/reference/context-checkpoints.md), and [Документация на русском](docs/ru/README.md).
|
|
73
73
|
|
|
74
74
|
## What it gives you
|
|
75
75
|
- A finish-oriented lifecycle: plan, execute, review, and prove the result.
|
|
@@ -39,7 +39,7 @@ and start a task with:
|
|
|
39
39
|
agent-lifecycle start --adapter <adapter-id> --file task.md
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
The published [PyPI package](https://pypi.org/project/agent-lifecycle-kit/) supports Python 3.11-3.14; install it with `python -m pip install agent-lifecycle-kit==1.
|
|
42
|
+
The published [PyPI package](https://pypi.org/project/agent-lifecycle-kit/) supports Python 3.11-3.14; install it with `python -m pip install agent-lifecycle-kit==1.65.0`. The optional [thread bridge](docs/reference/optional-thread-bridge.md) imports adapter-owned thread results as non-authoritative context.
|
|
43
43
|
Use [Quickstart](docs/guides/quickstart.md) for the first task and [Commands by task](docs/guides/commands-by-task.md) for detailed operations.
|
|
44
44
|
Continue with [task workflows](docs/guides/how-alk-works.md) and
|
|
45
45
|
[project profile init](docs/reference/project-workflow-profile.md),
|
|
@@ -47,7 +47,7 @@ Continue with [task workflows](docs/guides/how-alk-works.md) and
|
|
|
47
47
|
[Lifecycle task scenarios](docs/guides/lifecycle-cookbook.md). The [planning-only](docs/reference/planning-only-launch.md)
|
|
48
48
|
and [qualified frozen-task](docs/reference/qualified-host-launch.md) guides define launch boundaries.
|
|
49
49
|
See [System architecture](docs/architecture/system-architecture.md), [Project comparison](docs/reference/project-comparison.md),
|
|
50
|
-
and [Документация на русском](docs/ru/README.md).
|
|
50
|
+
[context checkpoints](docs/reference/context-checkpoints.md), and [Документация на русском](docs/ru/README.md).
|
|
51
51
|
|
|
52
52
|
## What it gives you
|
|
53
53
|
- A finish-oriented lifecycle: plan, execute, review, and prove the result.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "agent-lifecycle-kit"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.65.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"
|
|
@@ -32,6 +32,7 @@ def create_session(
|
|
|
32
32
|
session_root: Path | None = None,
|
|
33
33
|
state_identity: dict[str, Any] | None = None,
|
|
34
34
|
managed_workflow_proof: dict[str, Any] | None = None,
|
|
35
|
+
context_checkpoint_policy: dict[str, Any] | None = None,
|
|
35
36
|
) -> dict[str, Any]:
|
|
36
37
|
session_id = uuid.uuid4().hex
|
|
37
38
|
session = {
|
|
@@ -46,6 +47,7 @@ def create_session(
|
|
|
46
47
|
},
|
|
47
48
|
"stateIdentity": state_identity,
|
|
48
49
|
"managedWorkflowProof": managed_workflow_proof,
|
|
50
|
+
"contextCheckpointPolicy": context_checkpoint_policy,
|
|
49
51
|
"secretValuesStored": False,
|
|
50
52
|
"nativeConfigWritten": False,
|
|
51
53
|
}
|
|
@@ -224,7 +224,7 @@ def _resume(*, adapter_id: str, session_id: str, session_root: Path | None) -> d
|
|
|
224
224
|
requested_mode="auto",
|
|
225
225
|
action="BLOCKED",
|
|
226
226
|
input_summary=input_summary,
|
|
227
|
-
delegate_summary=_resume_summary(receipt),
|
|
227
|
+
delegate_summary=_resume_summary(receipt, session=session),
|
|
228
228
|
blockers=_blocker_summaries(receipt.get("blockers")),
|
|
229
229
|
)
|
|
230
230
|
return build_lifecycle_start_receipt(
|
|
@@ -233,7 +233,7 @@ def _resume(*, adapter_id: str, session_id: str, session_root: Path | None) -> d
|
|
|
233
233
|
requested_mode="auto",
|
|
234
234
|
action="RESUME",
|
|
235
235
|
input_summary=input_summary,
|
|
236
|
-
delegate_summary=_resume_summary(receipt),
|
|
236
|
+
delegate_summary=_resume_summary(receipt, session=session),
|
|
237
237
|
lifecycle_coverage_claimed=status == "PASS" and bool(receipt.get("lifecycleCoverageClaimed")),
|
|
238
238
|
)
|
|
239
239
|
|
|
@@ -997,8 +997,8 @@ def _task_summary(receipt: dict[str, Any]) -> dict[str, Any]:
|
|
|
997
997
|
}
|
|
998
998
|
|
|
999
999
|
|
|
1000
|
-
def _resume_summary(receipt: dict[str, Any]) -> dict[str, Any]:
|
|
1001
|
-
|
|
1000
|
+
def _resume_summary(receipt: dict[str, Any], *, session: dict[str, Any] | None = None) -> dict[str, Any]:
|
|
1001
|
+
summary = {
|
|
1002
1002
|
"schemaVersion": receipt.get("schemaVersion"),
|
|
1003
1003
|
"status": receipt.get("status"),
|
|
1004
1004
|
"lineageStatus": receipt.get("lineageStatus"),
|
|
@@ -1006,6 +1006,9 @@ def _resume_summary(receipt: dict[str, Any]) -> dict[str, Any]:
|
|
|
1006
1006
|
"lifecycleCoverageClaimed": bool(receipt.get("lifecycleCoverageClaimed")),
|
|
1007
1007
|
"receiptDigest": receipt.get("receiptDigest"),
|
|
1008
1008
|
}
|
|
1009
|
+
if session and isinstance(session.get("contextCheckpointPolicy"), dict):
|
|
1010
|
+
summary["contextCheckpointPolicy"] = session["contextCheckpointPolicy"]
|
|
1011
|
+
return summary
|
|
1009
1012
|
|
|
1010
1013
|
|
|
1011
1014
|
def _claims_execution(receipt: dict[str, Any]) -> bool:
|
{agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/dispatch.py
RENAMED
|
@@ -38,7 +38,7 @@ def dispatch(args: argparse.Namespace, remainder: list[str]) -> dict[str, Any] |
|
|
|
38
38
|
return dispatch_contracts(args)
|
|
39
39
|
if args.command in {"workflow", "audit", "runner"}:
|
|
40
40
|
return dispatch_lifecycle(args)
|
|
41
|
-
if args.command in {"report", "context", "goal", "model", "metrics"}:
|
|
41
|
+
if args.command in {"report", "context", "goal", "model", "metrics", "thread"}:
|
|
42
42
|
return dispatch_observability(args)
|
|
43
43
|
if args.command in {"tier", "specification", "plan", "task"}:
|
|
44
44
|
return dispatch_planning(args)
|
|
@@ -7,8 +7,15 @@ from pathlib import Path
|
|
|
7
7
|
from typing import Any
|
|
8
8
|
|
|
9
9
|
from agent_lifecycle.context import check_context, load_context_profile, render_context
|
|
10
|
+
from agent_lifecycle.context.checkpoint_store import restore_context_checkpoint, write_context_checkpoint
|
|
11
|
+
from agent_lifecycle.context.checkpoints import build_context_checkpoint
|
|
10
12
|
from agent_lifecycle.context.external_memory import build_episode_retrieval_with_external_context, import_external_memory_context
|
|
11
13
|
from agent_lifecycle.contracts import LifecycleError, canonical_digest, read_json_object, write_json_create
|
|
14
|
+
from agent_lifecycle.host_protocol.thread_bridge import (
|
|
15
|
+
prepare_thread_context_import,
|
|
16
|
+
prepare_thread_request,
|
|
17
|
+
validate_thread_exchange,
|
|
18
|
+
)
|
|
12
19
|
from agent_lifecycle.goal import build_goal_progress_view, build_objective_snapshot, update_goal_record, validate_goal_record
|
|
13
20
|
from agent_lifecycle.metrics import (
|
|
14
21
|
build_lifecycle_cost_summary,
|
|
@@ -58,9 +65,60 @@ def dispatch_observability(args: argparse.Namespace) -> dict[str, Any] | str:
|
|
|
58
65
|
return _dispatch_model(args)
|
|
59
66
|
if args.command == "metrics":
|
|
60
67
|
return _dispatch_metrics(args)
|
|
68
|
+
if args.command == "thread":
|
|
69
|
+
return _dispatch_thread(args)
|
|
61
70
|
raise LifecycleError("command-not-implemented", "observability command is not implemented")
|
|
62
71
|
|
|
63
72
|
|
|
73
|
+
def _dispatch_thread(args: argparse.Namespace) -> dict[str, Any]:
|
|
74
|
+
if args.thread_command == "request":
|
|
75
|
+
operation_id = args.operation_id or f"thread-{args.operation}"
|
|
76
|
+
scope = args.scope or ("project" if args.operation in {"list", "create"} else "explicit-target")
|
|
77
|
+
target: dict[str, Any] = {"scope": scope}
|
|
78
|
+
if args.target_hash:
|
|
79
|
+
target["targetHash"] = args.target_hash
|
|
80
|
+
payload = {"text": args.text} if args.text is not None else {}
|
|
81
|
+
request = prepare_thread_request(
|
|
82
|
+
operation=args.operation,
|
|
83
|
+
operation_id=operation_id,
|
|
84
|
+
target=target,
|
|
85
|
+
payload=payload,
|
|
86
|
+
idempotency_key=args.idempotency_key,
|
|
87
|
+
limits={"maxImportedBytes": args.max_bytes, "maxImportedTokens": args.max_tokens},
|
|
88
|
+
phase=args.phase,
|
|
89
|
+
)
|
|
90
|
+
write_json_create(Path(args.out), request)
|
|
91
|
+
return request
|
|
92
|
+
if args.thread_command == "import":
|
|
93
|
+
request = read_json_object(Path(args.request), label="thread operation request")
|
|
94
|
+
receipt = read_json_object(Path(args.receipt), label="thread operation receipt")
|
|
95
|
+
validation = validate_thread_exchange(request, receipt)
|
|
96
|
+
if validation["status"] != "PASS":
|
|
97
|
+
raise LifecycleError(
|
|
98
|
+
"thread-exchange-invalid",
|
|
99
|
+
"thread request and receipt lineage validation failed",
|
|
100
|
+
{"validation": validation},
|
|
101
|
+
)
|
|
102
|
+
limits = request.get("limits") if isinstance(request.get("limits"), dict) else {}
|
|
103
|
+
imported = prepare_thread_context_import(
|
|
104
|
+
operation_id=request["operationId"],
|
|
105
|
+
source_receipt_digest=receipt["receiptDigest"],
|
|
106
|
+
content=receipt.get("result", {}),
|
|
107
|
+
source={
|
|
108
|
+
"kind": "host-thread",
|
|
109
|
+
"sourceId": args.source_id or "redacted",
|
|
110
|
+
"citation": args.citation or "operator-provided",
|
|
111
|
+
"operation": request["operation"],
|
|
112
|
+
"status": receipt["status"],
|
|
113
|
+
},
|
|
114
|
+
max_imported_bytes=int(limits.get("maxImportedBytes", 32768)),
|
|
115
|
+
max_imported_tokens=int(limits.get("maxImportedTokens", 2048)),
|
|
116
|
+
)
|
|
117
|
+
write_json_create(Path(args.out), imported)
|
|
118
|
+
return imported
|
|
119
|
+
raise LifecycleError("command-not-implemented", "thread command is not implemented")
|
|
120
|
+
|
|
121
|
+
|
|
64
122
|
def _dispatch_report(args: argparse.Namespace) -> dict[str, Any] | str:
|
|
65
123
|
if args.report_command == "status-view":
|
|
66
124
|
payload = build_status_view(
|
|
@@ -176,9 +234,75 @@ def _dispatch_context(args: argparse.Namespace) -> dict[str, Any]:
|
|
|
176
234
|
if args.out:
|
|
177
235
|
write_json_create(Path(args.out), payload)
|
|
178
236
|
return payload
|
|
237
|
+
if args.context_command == "checkpoint":
|
|
238
|
+
return _dispatch_context_checkpoint(args)
|
|
239
|
+
if args.context_command == "restore":
|
|
240
|
+
state = read_json_object(Path(args.state), label="workflow state")
|
|
241
|
+
payload = restore_context_checkpoint(
|
|
242
|
+
Path(args.checkpoint),
|
|
243
|
+
state=state,
|
|
244
|
+
session_id=args.session,
|
|
245
|
+
target_tokens=args.target_tokens,
|
|
246
|
+
)
|
|
247
|
+
if args.out:
|
|
248
|
+
write_json_create(Path(args.out), payload)
|
|
249
|
+
if payload.get("status") == "BLOCKED":
|
|
250
|
+
raise LifecycleError(
|
|
251
|
+
"context-restore-blocked",
|
|
252
|
+
"context checkpoint cannot be restored against the current workflow state",
|
|
253
|
+
{"continuation": payload},
|
|
254
|
+
)
|
|
255
|
+
return payload
|
|
179
256
|
raise LifecycleError("command-not-implemented", "context command is not implemented")
|
|
180
257
|
|
|
181
258
|
|
|
259
|
+
def _dispatch_context_checkpoint(args: argparse.Namespace) -> dict[str, Any]:
|
|
260
|
+
state = read_json_object(Path(args.state), label="workflow state")
|
|
261
|
+
manifest = read_json_object(Path(args.plan), label="context checkpoint plan")
|
|
262
|
+
input_payload = read_json_object(Path(args.input), label="context checkpoint input")
|
|
263
|
+
reason = str(args.reason)
|
|
264
|
+
mode = args.capture_mode
|
|
265
|
+
reason_mode = {
|
|
266
|
+
"native-hook": "NATIVE_HOOK",
|
|
267
|
+
"milestone": "MILESTONE",
|
|
268
|
+
"agent-requested": "AGENT_REQUESTED",
|
|
269
|
+
"unavailable": "UNAVAILABLE",
|
|
270
|
+
}.get(reason.lower().replace("_", "-"))
|
|
271
|
+
if mode is None and reason_mode:
|
|
272
|
+
mode = reason_mode
|
|
273
|
+
if mode is None:
|
|
274
|
+
mode = "AGENT_REQUESTED"
|
|
275
|
+
target = Path(args.out) if args.out else Path(".alk/context/checkpoints") / "checkpoint.json"
|
|
276
|
+
root = target.parent
|
|
277
|
+
_require_checkpoint_output_root(root)
|
|
278
|
+
summary = dict(input_payload)
|
|
279
|
+
capture_evidence = summary.pop("nativeHookEvidence", None) if mode == "NATIVE_HOOK" else None
|
|
280
|
+
checkpoint = build_context_checkpoint(
|
|
281
|
+
session_id=args.session,
|
|
282
|
+
run_id=str(state.get("runId", "run")),
|
|
283
|
+
adapter_id=str(args.adapter or input_payload.get("adapterId") or state.get("adapterId") or "unknown-adapter"),
|
|
284
|
+
package_id=str(manifest.get("package", {}).get("id") or state.get("packageId") or "unknown-package"),
|
|
285
|
+
plan_revision=int(manifest.get("planRevision", state.get("planRevision", 1))),
|
|
286
|
+
plan_digest=canonical_digest(manifest),
|
|
287
|
+
state_revision=int(state.get("stateRevision", 1)),
|
|
288
|
+
source_revision=str(state.get("sourceRevision", "unknown-source")),
|
|
289
|
+
capture_mode=mode,
|
|
290
|
+
reason=reason,
|
|
291
|
+
summary=summary,
|
|
292
|
+
capture_evidence=capture_evidence,
|
|
293
|
+
checkpoint_id=target.stem if args.out else None,
|
|
294
|
+
created_at=str(state.get("updatedAt") or "1970-01-01T00:00:00Z"),
|
|
295
|
+
)
|
|
296
|
+
stored = write_context_checkpoint(checkpoint, root=root)
|
|
297
|
+
return {**checkpoint, "storage": stored}
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def _require_checkpoint_output_root(root: Path) -> None:
|
|
301
|
+
resolved = root.resolve()
|
|
302
|
+
if ".alk" not in resolved.parts or not resolved.name == "checkpoints":
|
|
303
|
+
raise LifecycleError("context-checkpoint-output-root-invalid", "checkpoint output must remain in a .alk/context/checkpoints directory")
|
|
304
|
+
|
|
305
|
+
|
|
182
306
|
def _dispatch_goal(args: argparse.Namespace) -> dict[str, Any] | str:
|
|
183
307
|
record = read_json_object(Path(args.record), label="goal record")
|
|
184
308
|
if args.goal_command == "check":
|
{agent_lifecycle_kit-1.63.2 → agent_lifecycle_kit-1.65.0}/src/agent_lifecycle/cli/parsers.py
RENAMED
|
@@ -38,6 +38,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
38
38
|
_add_workflow_parser(subparsers)
|
|
39
39
|
_add_audit_parser(subparsers)
|
|
40
40
|
_add_context_parser(subparsers)
|
|
41
|
+
_add_thread_parser(subparsers)
|
|
41
42
|
_add_goal_parser(subparsers)
|
|
42
43
|
add_followup_parser(subparsers)
|
|
43
44
|
add_worktree_parser(subparsers)
|
|
@@ -610,6 +611,47 @@ def _add_context_parser(subparsers: argparse._SubParsersAction[argparse.Argument
|
|
|
610
611
|
episode_retrieve.add_argument("--max-external-context-hints", type=int, default=4)
|
|
611
612
|
episode_retrieve.add_argument("--target-tokens", type=int, default=2048)
|
|
612
613
|
episode_retrieve.add_argument("--out")
|
|
614
|
+
checkpoint = context_sub.add_parser("checkpoint", help="write a bounded context checkpoint")
|
|
615
|
+
checkpoint.add_argument("--session", required=True)
|
|
616
|
+
checkpoint.add_argument("--state", required=True)
|
|
617
|
+
checkpoint.add_argument("--plan", required=True)
|
|
618
|
+
checkpoint.add_argument("--input", required=True)
|
|
619
|
+
checkpoint.add_argument("--reason", required=True)
|
|
620
|
+
checkpoint.add_argument(
|
|
621
|
+
"--capture-mode",
|
|
622
|
+
choices=["NATIVE_HOOK", "MILESTONE", "AGENT_REQUESTED", "UNAVAILABLE"],
|
|
623
|
+
default=None,
|
|
624
|
+
)
|
|
625
|
+
checkpoint.add_argument("--adapter")
|
|
626
|
+
checkpoint.add_argument("--out")
|
|
627
|
+
restore = context_sub.add_parser("restore", help="restore a bounded context continuation")
|
|
628
|
+
restore.add_argument("--checkpoint", required=True)
|
|
629
|
+
restore.add_argument("--state", required=True)
|
|
630
|
+
restore.add_argument("--session")
|
|
631
|
+
restore.add_argument("--target-tokens", type=int, default=2048)
|
|
632
|
+
restore.add_argument("--out")
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
def _add_thread_parser(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) -> None:
|
|
636
|
+
thread = subparsers.add_parser("thread", help="prepare optional host-thread bridge artifacts")
|
|
637
|
+
thread_sub = thread.add_subparsers(dest="thread_command", required=True)
|
|
638
|
+
request = thread_sub.add_parser("request", help="prepare a bounded thread operation request")
|
|
639
|
+
request.add_argument("--operation", choices=["read", "list", "send", "create"], required=True)
|
|
640
|
+
request.add_argument("--operation-id")
|
|
641
|
+
request.add_argument("--scope", choices=["explicit-target", "project", "workflow"])
|
|
642
|
+
request.add_argument("--target-hash")
|
|
643
|
+
request.add_argument("--text")
|
|
644
|
+
request.add_argument("--idempotency-key")
|
|
645
|
+
request.add_argument("--phase")
|
|
646
|
+
request.add_argument("--max-bytes", type=int, default=32768)
|
|
647
|
+
request.add_argument("--max-tokens", type=int, default=2048)
|
|
648
|
+
request.add_argument("--out", required=True)
|
|
649
|
+
import_result = thread_sub.add_parser("import", help="validate a host receipt and import bounded context")
|
|
650
|
+
import_result.add_argument("--request", required=True)
|
|
651
|
+
import_result.add_argument("--receipt", required=True)
|
|
652
|
+
import_result.add_argument("--source-id")
|
|
653
|
+
import_result.add_argument("--citation")
|
|
654
|
+
import_result.add_argument("--out", required=True)
|
|
613
655
|
|
|
614
656
|
|
|
615
657
|
def _add_goal_parser(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) -> None:
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""Compact context rendering for small-context hosts."""
|
|
2
|
+
|
|
3
|
+
from agent_lifecycle.context.profiles import load_context_profile, validate_context_profile
|
|
4
|
+
from agent_lifecycle.context.rendering import check_context, render_context
|
|
5
|
+
from agent_lifecycle.context.checkpoints import (
|
|
6
|
+
build_context_checkpoint,
|
|
7
|
+
require_context_checkpoint_pass,
|
|
8
|
+
validate_context_checkpoint,
|
|
9
|
+
)
|
|
10
|
+
from agent_lifecycle.context.checkpoint_store import (
|
|
11
|
+
list_context_checkpoints,
|
|
12
|
+
load_context_checkpoint,
|
|
13
|
+
restore_context_checkpoint,
|
|
14
|
+
write_context_checkpoint,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"build_episode_context",
|
|
19
|
+
"check_context",
|
|
20
|
+
"build_context_checkpoint",
|
|
21
|
+
"load_context_profile",
|
|
22
|
+
"list_context_checkpoints",
|
|
23
|
+
"load_context_checkpoint",
|
|
24
|
+
"render_context",
|
|
25
|
+
"restore_context_checkpoint",
|
|
26
|
+
"require_context_checkpoint_pass",
|
|
27
|
+
"validate_context_checkpoint",
|
|
28
|
+
"validate_context_profile",
|
|
29
|
+
"write_context_checkpoint",
|
|
30
|
+
"import_thread_context",
|
|
31
|
+
"build_thread_episode_context",
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def __getattr__(name: str):
|
|
36
|
+
if name == "build_episode_context":
|
|
37
|
+
from agent_lifecycle.context.episode_retrieval import build_episode_context
|
|
38
|
+
|
|
39
|
+
return build_episode_context
|
|
40
|
+
if name in {"import_thread_context", "build_thread_episode_context"}:
|
|
41
|
+
from agent_lifecycle.context.thread_bridge_context import build_thread_episode_context, import_thread_context
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
"import_thread_context": import_thread_context,
|
|
45
|
+
"build_thread_episode_context": build_thread_episode_context,
|
|
46
|
+
}[name]
|
|
47
|
+
raise AttributeError(name)
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"""Contained local storage and bounded restoration for context checkpoints."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from agent_lifecycle.contracts import LifecycleError, canonical_bytes, canonical_digest, read_json_object
|
|
10
|
+
from agent_lifecycle.contracts.redaction import redact_value
|
|
11
|
+
from agent_lifecycle.context.checkpoints import (
|
|
12
|
+
CHECKPOINT_SCHEMA,
|
|
13
|
+
DEFAULT_MAX_CHECKPOINT_BYTES,
|
|
14
|
+
DEFAULT_TARGET_TOKENS,
|
|
15
|
+
require_context_checkpoint_pass,
|
|
16
|
+
validate_context_checkpoint,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
DEFAULT_CHECKPOINT_ROOT = Path(".alk/context/checkpoints")
|
|
20
|
+
MAX_CHECKPOINTS_PER_RUN = 64
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def checkpoint_path(checkpoint_id: str, *, root: Path | None = None) -> Path:
|
|
24
|
+
"""Return a path contained by the configured checkpoint directory."""
|
|
25
|
+
|
|
26
|
+
if not isinstance(checkpoint_id, str) or not checkpoint_id or checkpoint_id in {".", ".."}:
|
|
27
|
+
raise LifecycleError("context-checkpoint-id-invalid", "checkpoint id is required")
|
|
28
|
+
if "/" in checkpoint_id or "\\" in checkpoint_id or "\x00" in checkpoint_id:
|
|
29
|
+
raise LifecycleError("context-checkpoint-id-invalid", "checkpoint id must be a single path component")
|
|
30
|
+
directory = root or DEFAULT_CHECKPOINT_ROOT
|
|
31
|
+
path = directory / f"{checkpoint_id}.json"
|
|
32
|
+
if not path.resolve().is_relative_to(directory.resolve()):
|
|
33
|
+
raise LifecycleError("context-checkpoint-path-escape", "checkpoint path escapes the checkpoint root")
|
|
34
|
+
return path
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def write_context_checkpoint(
|
|
38
|
+
checkpoint: dict[str, Any],
|
|
39
|
+
*,
|
|
40
|
+
root: Path | None = None,
|
|
41
|
+
max_checkpoints_per_run: int = MAX_CHECKPOINTS_PER_RUN,
|
|
42
|
+
) -> dict[str, Any]:
|
|
43
|
+
"""Write a checkpoint once and retain only the latest bounded set per run."""
|
|
44
|
+
|
|
45
|
+
validation = validate_context_checkpoint(checkpoint)
|
|
46
|
+
require_context_checkpoint_pass(validation)
|
|
47
|
+
path = checkpoint_path(str(checkpoint["checkpointId"]), root=root)
|
|
48
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
49
|
+
data = canonical_bytes(checkpoint) + b"\n"
|
|
50
|
+
created = not path.exists()
|
|
51
|
+
if not created:
|
|
52
|
+
existing = read_json_object(path, label="existing context checkpoint")
|
|
53
|
+
if canonical_digest(existing) != canonical_digest(checkpoint):
|
|
54
|
+
raise LifecycleError("context-checkpoint-conflict", "checkpoint id already contains a different artifact")
|
|
55
|
+
else:
|
|
56
|
+
_write_atomic(path, data)
|
|
57
|
+
_retain_latest(path.parent, run_id=str(checkpoint["runId"]), limit=max_checkpoints_per_run)
|
|
58
|
+
return {
|
|
59
|
+
"status": "PASS",
|
|
60
|
+
"path": path.as_posix(),
|
|
61
|
+
"checkpointId": checkpoint["checkpointId"],
|
|
62
|
+
"checkpointDigest": checkpoint["checkpointDigest"],
|
|
63
|
+
"created": created,
|
|
64
|
+
"retentionPolicy": "retain-latest-with-explicit-delete",
|
|
65
|
+
"maxCheckpointsPerRun": max_checkpoints_per_run,
|
|
66
|
+
"productionPromotionClaimed": False,
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def load_context_checkpoint(checkpoint_id: str, *, root: Path | None = None) -> dict[str, Any]:
|
|
71
|
+
return read_json_object(checkpoint_path(checkpoint_id, root=root), label="context checkpoint")
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def list_context_checkpoints(*, root: Path | None = None, run_id: str | None = None) -> list[dict[str, Any]]:
|
|
75
|
+
directory = (root or DEFAULT_CHECKPOINT_ROOT).resolve()
|
|
76
|
+
if not directory.exists():
|
|
77
|
+
return []
|
|
78
|
+
if not directory.is_dir():
|
|
79
|
+
raise LifecycleError("context-checkpoint-root-invalid", "checkpoint root is not a directory")
|
|
80
|
+
result: list[dict[str, Any]] = []
|
|
81
|
+
for path in sorted(directory.glob("*.json")):
|
|
82
|
+
if not path.resolve().is_relative_to(directory):
|
|
83
|
+
raise LifecycleError("context-checkpoint-path-escape", "checkpoint listing escaped the checkpoint root")
|
|
84
|
+
value = read_json_object(path, label="context checkpoint")
|
|
85
|
+
if run_id is None or value.get("runId") == run_id:
|
|
86
|
+
result.append(value)
|
|
87
|
+
return sorted(result, key=lambda item: (str(item.get("createdAt", "")), str(item.get("checkpointId", ""))))
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def restore_context_checkpoint(
|
|
91
|
+
checkpoint_path_value: Path,
|
|
92
|
+
*,
|
|
93
|
+
state: dict[str, Any],
|
|
94
|
+
session_id: str | None = None,
|
|
95
|
+
target_tokens: int = DEFAULT_TARGET_TOKENS,
|
|
96
|
+
max_checkpoint_bytes: int = DEFAULT_MAX_CHECKPOINT_BYTES,
|
|
97
|
+
) -> dict[str, Any]:
|
|
98
|
+
"""Return a bounded continuation packet after checking current lineage."""
|
|
99
|
+
|
|
100
|
+
checkpoint = read_json_object(checkpoint_path_value, label="context checkpoint")
|
|
101
|
+
expected = _lineage_from_state(state, session_id=session_id)
|
|
102
|
+
validation = validate_context_checkpoint(
|
|
103
|
+
checkpoint,
|
|
104
|
+
expected_lineage=expected,
|
|
105
|
+
max_checkpoint_bytes=max_checkpoint_bytes,
|
|
106
|
+
target_tokens=target_tokens,
|
|
107
|
+
)
|
|
108
|
+
if validation["status"] == "FAIL":
|
|
109
|
+
return {
|
|
110
|
+
"schemaVersion": "agent-context-continuation.v1",
|
|
111
|
+
"status": "BLOCKED",
|
|
112
|
+
"checkpointId": checkpoint.get("checkpointId"),
|
|
113
|
+
"validation": validation,
|
|
114
|
+
"implementationAuthorized": False,
|
|
115
|
+
"proofAuthority": "none",
|
|
116
|
+
"productionPromotionClaimed": False,
|
|
117
|
+
}
|
|
118
|
+
summary, redaction_applied = redact_value(checkpoint["summary"])
|
|
119
|
+
if redaction_applied:
|
|
120
|
+
return {
|
|
121
|
+
"schemaVersion": "agent-context-continuation.v1",
|
|
122
|
+
"status": "BLOCKED",
|
|
123
|
+
"checkpointId": checkpoint.get("checkpointId"),
|
|
124
|
+
"validation": {
|
|
125
|
+
**validation,
|
|
126
|
+
"status": "FAIL",
|
|
127
|
+
"blockers": [{"code": "context-restore-unredacted-sensitive-input"}],
|
|
128
|
+
},
|
|
129
|
+
"implementationAuthorized": False,
|
|
130
|
+
"proofAuthority": "none",
|
|
131
|
+
"productionPromotionClaimed": False,
|
|
132
|
+
}
|
|
133
|
+
continuation = {
|
|
134
|
+
"schemaVersion": "agent-context-continuation.v1",
|
|
135
|
+
"status": "PASS",
|
|
136
|
+
"checkpointId": checkpoint["checkpointId"],
|
|
137
|
+
"checkpointDigest": checkpoint["checkpointDigest"],
|
|
138
|
+
"lineage": {
|
|
139
|
+
key: checkpoint[key]
|
|
140
|
+
for key in ("sessionId", "runId", "adapterId", "packageId", "planRevision", "planDigest", "stateRevision", "sourceRevision")
|
|
141
|
+
},
|
|
142
|
+
"captureMode": checkpoint["captureMode"],
|
|
143
|
+
"summary": summary,
|
|
144
|
+
"referencedArtifacts": checkpoint["referencedArtifacts"],
|
|
145
|
+
"implementationAuthorized": False,
|
|
146
|
+
"proofAuthority": "none",
|
|
147
|
+
"contextLimits": {"targetTokens": target_tokens, "maxBytes": max_checkpoint_bytes},
|
|
148
|
+
"validationDigest": validation["validationDigest"],
|
|
149
|
+
"productionPromotionClaimed": False,
|
|
150
|
+
}
|
|
151
|
+
continuation["continuationDigest"] = canonical_digest(continuation)
|
|
152
|
+
if (len(canonical_bytes(continuation)) + 3) // 4 > target_tokens * 2:
|
|
153
|
+
return {
|
|
154
|
+
"schemaVersion": "agent-context-continuation.v1",
|
|
155
|
+
"status": "BLOCKED",
|
|
156
|
+
"checkpointId": checkpoint.get("checkpointId"),
|
|
157
|
+
"validation": {
|
|
158
|
+
**validation,
|
|
159
|
+
"status": "FAIL",
|
|
160
|
+
"blockers": [{"code": "context-restore-token-limit"}],
|
|
161
|
+
},
|
|
162
|
+
"implementationAuthorized": False,
|
|
163
|
+
"proofAuthority": "none",
|
|
164
|
+
"productionPromotionClaimed": False,
|
|
165
|
+
}
|
|
166
|
+
return continuation
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _lineage_from_state(state: dict[str, Any], *, session_id: str | None) -> dict[str, Any]:
|
|
170
|
+
fields = ("runId", "packageId", "planRevision", "planDigest", "stateRevision", "sourceRevision")
|
|
171
|
+
expected = {key: state.get(key) for key in fields if key in state}
|
|
172
|
+
if session_id is not None:
|
|
173
|
+
expected["sessionId"] = session_id
|
|
174
|
+
return expected
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def _retain_latest(directory: Path, *, run_id: str, limit: int) -> None:
|
|
178
|
+
if not isinstance(limit, int) or limit < 1 or limit > MAX_CHECKPOINTS_PER_RUN:
|
|
179
|
+
raise LifecycleError("context-checkpoint-retention-invalid", "retention limit must be between 1 and 64")
|
|
180
|
+
items = list_context_checkpoints(root=directory, run_id=run_id)
|
|
181
|
+
for item in items[:-limit]:
|
|
182
|
+
path = checkpoint_path(str(item["checkpointId"]), root=directory)
|
|
183
|
+
if path.resolve().is_relative_to(directory.resolve()):
|
|
184
|
+
path.unlink()
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def _write_atomic(path: Path, data: bytes) -> None:
|
|
188
|
+
temporary = path.with_name(f".{path.name}.{os.getpid()}.tmp")
|
|
189
|
+
flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL
|
|
190
|
+
try:
|
|
191
|
+
with os.fdopen(os.open(temporary, flags, 0o644), "wb") as handle:
|
|
192
|
+
handle.write(data)
|
|
193
|
+
handle.flush()
|
|
194
|
+
os.fsync(handle.fileno())
|
|
195
|
+
os.replace(temporary, path)
|
|
196
|
+
finally:
|
|
197
|
+
if temporary.exists():
|
|
198
|
+
temporary.unlink()
|