autocontext 0.3.4__tar.gz → 0.3.6__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.
- {autocontext-0.3.4 → autocontext-0.3.6}/.gitignore +4 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/PKG-INFO +2 -2
- {autocontext-0.3.4 → autocontext-0.3.6}/README.md +1 -1
- {autocontext-0.3.4 → autocontext-0.3.6}/pyproject.toml +1 -1
- autocontext-0.3.6/src/autocontext/blobstore/__init__.py +15 -0
- autocontext-0.3.6/src/autocontext/blobstore/factory.py +38 -0
- autocontext-0.3.6/src/autocontext/blobstore/hf_bucket.py +227 -0
- autocontext-0.3.6/src/autocontext/blobstore/local.py +98 -0
- autocontext-0.3.6/src/autocontext/blobstore/ref.py +52 -0
- autocontext-0.3.6/src/autocontext/blobstore/registry.py +45 -0
- autocontext-0.3.6/src/autocontext/blobstore/store.py +94 -0
- autocontext-0.3.6/src/autocontext/bootstrap/__init__.py +18 -0
- autocontext-0.3.6/src/autocontext/bootstrap/collector.py +283 -0
- autocontext-0.3.6/src/autocontext/bootstrap/redactor.py +99 -0
- autocontext-0.3.6/src/autocontext/bootstrap/renderer.py +56 -0
- autocontext-0.3.6/src/autocontext/bootstrap/snapshot.py +117 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/config/settings.py +111 -40
- autocontext-0.3.6/src/autocontext/evidence/__init__.py +20 -0
- autocontext-0.3.6/src/autocontext/evidence/manifest.py +52 -0
- autocontext-0.3.6/src/autocontext/evidence/materializer.py +327 -0
- autocontext-0.3.6/src/autocontext/evidence/tracker.py +68 -0
- autocontext-0.3.6/src/autocontext/evidence/workspace.py +84 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/stage_preflight.py +63 -16
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/stage_types.py +4 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/stages.py +40 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/mcp/knowledge_tools.py +32 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/mcp/server.py +115 -52
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/mcp/tools.py +12 -5
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/prompts/context_budget.py +19 -5
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/prompts/templates.py +57 -123
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/codegen.py +40 -31
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/spec.py +1 -0
- autocontext-0.3.6/src/autocontext/scenarios/families.py +256 -0
- autocontext-0.3.6/src/autocontext/scenarios/family_contracts.py +134 -0
- autocontext-0.3.6/src/autocontext/security/__init__.py +12 -0
- autocontext-0.3.6/src/autocontext/security/scanner.py +176 -0
- autocontext-0.3.6/src/autocontext/sharing/__init__.py +25 -0
- autocontext-0.3.6/src/autocontext/sharing/attestation.py +46 -0
- autocontext-0.3.6/src/autocontext/sharing/bundle.py +84 -0
- autocontext-0.3.6/src/autocontext/sharing/collector.py +94 -0
- autocontext-0.3.6/src/autocontext/sharing/pipeline.py +133 -0
- autocontext-0.3.6/src/autocontext/sharing/publishers/__init__.py +1 -0
- autocontext-0.3.6/src/autocontext/sharing/publishers/gist.py +64 -0
- autocontext-0.3.6/src/autocontext/sharing/publishers/hf.py +76 -0
- autocontext-0.3.6/src/autocontext/sharing/redactor.py +173 -0
- autocontext-0.3.6/src/autocontext/sharing/review.py +75 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/simulation/engine.py +189 -78
- autocontext-0.3.6/src/autocontext/simulation/helpers.py +84 -0
- autocontext-0.3.6/tests/test_blob_store.py +335 -0
- autocontext-0.3.6/tests/test_bootstrap_snapshot.py +218 -0
- autocontext-0.3.6/tests/test_detect_family_prefers_explicit.py +206 -0
- autocontext-0.3.6/tests/test_evidence_workspace.py +327 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_generation_stages.py +64 -0
- autocontext-0.3.6/tests/test_loop_integration_snapshot_evidence.py +240 -0
- autocontext-0.3.6/tests/test_scenario_behavioral_contract.py +121 -0
- autocontext-0.3.6/tests/test_secret_scanner.py +257 -0
- autocontext-0.3.6/tests/test_sharing.py +393 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_simulate_command.py +122 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/uv.lock +725 -584
- autocontext-0.3.4/src/autocontext/scenarios/families.py +0 -227
- {autocontext-0.3.4 → autocontext-0.3.6}/assets/banner.svg +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/assets/banner.txt +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/assets/whats_new.txt +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/demo_data/README.md +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/docs/agent-integration.md +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/docs/mlx-training.md +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/docs/sandbox.md +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/001_initial.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/002_phase3_phase7.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/003_agent_subagent_metadata.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/004_knowledge_inheritance.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/005_ecosystem_provider_tracking.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/006_human_feedback.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/007_task_queue.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/008_staged_validation.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/009_generation_timing.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/010_consultation_log.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/010_session_notebook.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/011_monitors.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/012_research_hub.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/013_generation_dimension_summary.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/014_scoring_backend_metadata.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/migrations/015_match_replay.sql +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/pyrightconfig.json +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/smoke_test.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/smoke_test_loop.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agentos/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agentos/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/agent_sdk_client.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/analyst.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/architect.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/coach.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/competitor.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/contracts.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/curator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/feedback_loops.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/hint_feedback.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/llm_client.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/model_router.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/orchestrator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/parsers.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/pipeline_adapter.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/provider_bridge.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/role_router.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/skeptic.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/subagent_runtime.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/translator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/translator_simplification.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/agents/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/aggregate_runner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/calibration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/clustering.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/correlation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/credit_assignment.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/extractor.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/facets.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/issue_generator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/issue_store.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/regression_fixtures.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/rubric_drift.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/run_trace.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/store.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/taxonomy.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/timeline_inspector.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/analytics/trace_reporter.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/artifacts/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/artifacts/models.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/banner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/cli.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/concepts.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/config/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/config/presets.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/config/tuning_bounds.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/consultation/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/consultation/runner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/consultation/stage.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/consultation/triggers.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/consultation/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/evaluation/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/evaluation/ab_runner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/evaluation/ab_stats.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/action_filter.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/agent_task_evolution.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/ast_safety.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/bias_probes.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/evaluator_guardrail.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/executors/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/executors/base.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/executors/local.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/executors/monty.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/executors/primeintellect.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/executors/ssh.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/harness_coverage.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/harness_loader.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/harness_synthesizer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/harness_tester.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/improvement_loop.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/judge.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/judge_executor.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/objective_verification.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/output_cleaner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/phased_execution.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/policy_executor.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/policy_refinement.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/rubric_calibration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/rubric_coherence.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/sample_states.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/strategy_validator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/supervisor.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/task_runner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/trajectory_harness.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/execution/verification_dataset.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/adapt/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/adapt/applicator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/adapt/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/audit/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/audit/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/audit/writer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/core/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/core/controller.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/core/events.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/core/llm_client.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/core/output_parser.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/core/subagent.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/core/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/cost/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/cost/calculator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/cost/tracker.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/cost/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/evaluation/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/evaluation/dimensional.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/evaluation/failure_report.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/evaluation/protocol.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/evaluation/runner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/evaluation/scenario_evaluator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/evaluation/self_play.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/evaluation/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/meta/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/meta/advisor.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/meta/collector.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/meta/profiler.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/meta/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/meta_optimizer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/optimizer/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/optimizer/pareto.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/orchestration/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/orchestration/dag.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/orchestration/engine.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/orchestration/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/pipeline/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/pipeline/advancement.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/pipeline/gate.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/pipeline/holdout.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/pipeline/objective_guardrail.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/pipeline/retry_context.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/pipeline/trend_gate.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/pipeline/validity_gate.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/repl/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/repl/monty_worker.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/repl/session.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/repl/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/repl/worker.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/scoring/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/scoring/backends.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/scoring/elo.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/storage/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/storage/versioned_store.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/validation/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/validation/staged.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/harness/validation/stages.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/integrations/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/integrations/primeintellect/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/integrations/primeintellect/client.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/integrations/ssh/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/integrations/ssh/client.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/integrations/ssh/config.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/coherence.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/dead_end_manager.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/evidence_freshness.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/export.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/fresh_start.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/harness_quality.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/hint_volume.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/lessons.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/mutation_log.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/normalized_metrics.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/package.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/progress.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/protocol.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/rapid_gate.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/report.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/research_hub.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/search.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/solver.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/stagnation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/trajectory.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/tuning.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/knowledge/weakness.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/controller.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/cost_control.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/ecosystem_runner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/events.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/exploration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/generation_pipeline.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/generation_runner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/hypothesis_tree.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/presets.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/refinement_prompt.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/stage_helpers/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/stage_helpers/context_loaders.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/stage_helpers/dimensions.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/stage_helpers/exploration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/stage_helpers/freshness.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/stage_helpers/persistence_helpers.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/stage_helpers/tournament_prep.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/stage_prevalidation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/stage_probe.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/stage_staged_validation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/stage_tree_search.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/startup_verification.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/loop/tournament_helpers.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/mcp/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/mcp/_base.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/mcp/agent_task_tools.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/mcp/artifact_tools.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/mcp/distill_tools.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/mcp/monitor_tools.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/mcp/sandbox.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/monitor/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/monitor/engine.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/monitor/evaluators.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/monitor/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/notebook/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/notebook/context_provider.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/notebook/injection.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/notebook/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/notifications/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/notifications/base.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/notifications/callback.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/notifications/composite.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/notifications/http.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/notifications/slack.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/notifications/stdout.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/openclaw/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/openclaw/adapters.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/openclaw/agent_adapter.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/openclaw/discovery.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/openclaw/distill.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/openclaw/models.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/openclaw/skill.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/preflight.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/prompts/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/providers/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/providers/anthropic.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/providers/base.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/providers/callable_wrapper.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/providers/mlx_provider.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/providers/openai_compat.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/providers/registry.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/providers/retry.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/providers/scenario_routing.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/research/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/research/consultation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/research/evaluation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/research/persistence.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/research/prompt_wiring.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/research/runtime.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/research/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/rlm/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/rlm/context_loader.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/rlm/prompts.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/rlm/repl_worker.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/rlm/session.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/rlm/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/runtimes/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/runtimes/base.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/runtimes/claude_cli.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/runtimes/codex_cli.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/runtimes/direct_api.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/runtimes/hermes_cli.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/runtimes/pi_artifacts.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/runtimes/pi_cli.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/runtimes/pi_rpc.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/agent_task.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/artifact_editing.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/base.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/capabilities.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/coordination.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/_family_creator_shim.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/agent_task_codegen.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/agent_task_creator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/agent_task_designer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/agent_task_revision.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/agent_task_spec.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/agent_task_validator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/artifact_editing_codegen.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/artifact_editing_creator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/artifact_editing_designer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/artifact_editing_spec.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/coordination_codegen.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/coordination_creator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/coordination_designer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/coordination_spec.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/creator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/creator_registry.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/designer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/family_classifier.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/family_pipeline.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/generic_creator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/investigation_codegen.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/investigation_creator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/investigation_designer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/investigation_spec.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/loader.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/naming.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/negotiation_codegen.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/negotiation_creator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/negotiation_designer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/negotiation_spec.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/operator_loop_codegen.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/operator_loop_creator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/operator_loop_designer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/operator_loop_spec.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/registry.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/schema_evolution_codegen.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/schema_evolution_creator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/schema_evolution_designer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/schema_evolution_spec.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/simulation_codegen.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/simulation_creator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/simulation_designer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/simulation_spec.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/spec_auto_heal.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/tool_fragility_codegen.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/tool_fragility_creator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/tool_fragility_designer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/tool_fragility_spec.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/validator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/workflow_codegen.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/workflow_creator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/workflow_designer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/custom/workflow_spec.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/grid_ctf/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/grid_ctf/scenario.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/investigation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/negotiation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/operator_loop.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/othello.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/schema_evolution.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/simulation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/templates/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/templates/content-generation/README.md +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/templates/content-generation/example_input.json +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/templates/content-generation/example_output.json +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/templates/content-generation/spec.yaml +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/templates/prompt-optimization/README.md +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/templates/prompt-optimization/example_input.json +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/templates/prompt-optimization/example_output.json +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/templates/prompt-optimization/spec.yaml +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/templates/rag-accuracy/README.md +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/templates/rag-accuracy/example_input.json +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/templates/rag-accuracy/example_output.json +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/templates/rag-accuracy/spec.yaml +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/tool_fragility.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/type_registry.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/workflow.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/scenarios/world_state.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/sdk.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/sdk_models.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/server/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/server/app.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/server/changelog.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/server/cockpit_api.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/server/hub_api.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/server/knowledge_api.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/server/monitor_api.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/server/notebook_api.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/server/openclaw_api.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/server/protocol.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/server/run_manager.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/server/writeup.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/session/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/session/action_labels.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/session/context_pressure.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/session/coordinator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/session/living_docs.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/session/memory_consolidation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/session/progress_digest.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/session/remote_bridge.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/session/skill_registry.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/session/store.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/session/supervisor.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/session/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/simulation/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/simulation/export.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/storage/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/storage/artifacts.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/storage/bootstrap_schema.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/storage/buffered_writer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/storage/row_types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/storage/sqlite_store.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/training/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/training/autoresearch/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/training/autoresearch/prepare.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/training/autoresearch/program.md +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/training/autoresearch/program.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/training/autoresearch/train.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/training/backends.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/training/export.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/training/model_registry.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/training/runner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/training/types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/util/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/src/autocontext/util/json_io.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/conftest.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_ab_runner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_ab_stats.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_action_filter.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_action_filter_integration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_action_labels.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_advancement_contract.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_agent_e2e.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_agent_live_e2e.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_agent_sdk_client.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_agent_sdk_integration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_agent_task.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_agent_task_export.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_agent_task_multi_gen.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_agent_task_pipeline.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_agentos_adapter.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_aggregate_facets.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_analysis_injection.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_anthropic_client_retry.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_api_key_fallback.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_architect_dag_changes.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_architect_tool_updates.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_architect_tools.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_artifact_contracts.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_artifact_editing.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_artifact_harness.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_ast_safety.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_auto_sample_input.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_backpressure.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_backpressure_trend.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_banner_sync.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_buffered_artifacts.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_buffered_writer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_cli_ab_test.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_cli_agent_task.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_cli_backport.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_cli_error_output.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_cli_json.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_cli_preset.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_coach_competitor_hints.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_cockpit.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_cockpit_consultation_integration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_cockpit_notebook_integration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_code_strategies.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_code_strategies_e2e.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_codex_cli_runtime.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_config_adaptive.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_constraint_prompts.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_consultation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_context_budget.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_context_preparation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_context_pressure.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_coordinator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_correlation_issues.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_cost_control_and_presets.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_credit_assignment.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_cross_run_inheritance.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_curator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_curator_integration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_custom_scenario_spec.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_dag_apply.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_dag_mutation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_dead_end_registry.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_dead_end_wiring.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_derive_name.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_designer_calibration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_dict_type_consistency.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_dimension_pinning.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_dimension_threshold.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_dimensional_scoring.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_disagreement.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_discovery_scenario_type.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_distill_jobs.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_ecosystem_convergence.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_ecosystem_integration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_ecosystem_runner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_elo.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_enumerate_grid_ctf.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_enumerate_legal_actions.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_enumerate_othello.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_eval_provider_wiring.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_event_subscribers.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_exploration_mechanisms.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_export_cli.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_export_skill_md.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_factual_confidence.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_failure_recovery_lessons.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_failure_report.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_family_classifier.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_family_pipeline.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_feedback_loops.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_freshness_and_fixtures.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_gate_taxonomy.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_generation_pipeline.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_generic_creator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/__init__.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_adapt_applicator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_adapt_types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_audit_types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_audit_writer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_controller.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_cost_calculator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_cost_tracker.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_cost_types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_elo.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_eval_runner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_eval_types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_evaluator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_events.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_gate.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_llm_client.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_meta_advisor.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_meta_collector.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_meta_optimizer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_meta_profiler.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_meta_types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_output_parser.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_pipeline_engine.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_repl_session.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_repl_types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_repl_worker.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_retry_context.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_role_dag.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_scenario_evaluator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_subagent.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_trend_gate.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_types.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_harness_versioned_store.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness/test_output_parser_adoption.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness_coverage.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness_inheritance.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness_loader.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness_mode.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness_model_demotion.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness_quality.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness_synthesizer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness_tester.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_harness_versioning.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_hermes_gateway.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_hermes_protocol_alignment.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_hermes_runtime.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_hint_feedback.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_hint_persistence.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_hint_volume_control.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_holdout_evaluation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_hub_api.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_human_feedback.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_hypothesis_tree.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_improvement_loop.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_improvement_loop_resilience.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_integration_docs.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_integration_improvement.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_intent_validation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_interface_conventions.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_investigation_actions_coerce.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_investigation_workflow.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_judge.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_judge_rubrics.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_knowledge_api.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_knowledge_coherence.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_lesson_applicability.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_living_docs.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_loop_controller.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_match_export.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_mcp_agent_tasks.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_mcp_server.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_mcp_tools.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_memory_consolidation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_mlx_provider.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_model_registry.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_model_router.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_model_router_integration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_module_size_limits.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_monitor.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_monty_e2e.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_monty_executor.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_monty_live.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_monty_repl_integration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_monty_repl_live.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_monty_repl_settings.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_monty_repl_wiring.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_monty_repl_worker.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_monty_settings.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_multi_gen_stall.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_mutation_log.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_negotiation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_negotiation_verification.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_new_scenario_cli.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_normalized_metrics.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_notebook_wiring.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_notifications.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_objective_guardrail.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_objective_verification.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_openai_agent_provider.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_openclaw_adapters.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_openclaw_agent_adapter.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_openclaw_discovery.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_openclaw_operations.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_openclaw_skill.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_operator_loop_coordination.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_operator_loop_unsupported.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_orchestrator_feedback.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_output_cleaner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_param_type_conventions.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_pareto_optimizer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_per_role_provider.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_phased_execution.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_pi_artifacts.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_pi_cli_runtime.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_pi_protocol_alignment.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_pi_provider_surface.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_pi_rpc.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_pi_smoke.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_pipeline_adapter.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_pipeline_wiring.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_policy_executor.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_policy_refinement.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_policy_refinement_integration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_preflight.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_prepare_mlx.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_preset_named.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_presets.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_prevalidation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_primeintellect_client.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_probe_pipeline.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_program_template.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_progress_digests.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_progress_json.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_protocol.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_protocol_parity.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_provider_retry.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_providers.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_pydantic_migration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_rapid_exploration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_refinement_prompt.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_remote_bridge.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_remove_hardcoded_models.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_removed_backpressure_modules.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_removed_harness_modules.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_replay_narrative_flow.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_research_adapter.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_research_consultation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_research_eval.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_research_hub.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_research_persistence.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_research_prompt_wiring.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_research_protocol.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_research_runtime.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_restore_versioning.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_retry_learning.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_retry_provider.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_revise_output_fix.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_rlm_competitor.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_rlm_context_loader.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_rlm_integration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_rlm_repl_worker.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_rlm_session.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_role_router.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_rubric_calibration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_rubric_coherence.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_rubric_drift_calibration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_run_trace.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_runner_integration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_runtimes.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_sample_states.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_sandbox.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_scenario_capabilities.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_scenario_creator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_scenario_dispatch.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_scenario_families.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_scenario_routing.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_scenario_templates.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_scenario_type_completeness.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_scenarios.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_schema_evolution_tool_fragility.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_score_trajectory.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_scoring_backends.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_sdk.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_seed_tools.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_self_play.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_serde_conventions.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_server_health.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_service_layer.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_session_notebook.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_session_report_wiring.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_session_reports.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_session_runtime.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_session_supervisor.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_settings_cleanup.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_shared_tools.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_simulate_bug_fixes.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_simulation_contract.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_skeptic.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_skill_consolidation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_skill_registry.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_smoke_judge.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_sqlite_store.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_sqlite_store_bootstrap.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_ssh_executor.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_stage_preflight.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_stage_probe.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_stage_staged_validation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_stage_tree_search.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_staged_runner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_staged_validation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_staged_validation_storage.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_stages_enriched_retry.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_stagnation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_startup_verification.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_strategy_package.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_strategy_package_cli.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_strategy_translator.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_task_metrics.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_task_queue_priority.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_task_runner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_time_budget.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_timeline_inspector.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_tool_context_full.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_tool_validation.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_tournament_helpers.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_trace_reporter.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_train_mlx.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_train_summary.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_training_backend.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_training_export.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_training_init.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_training_pi_provider.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_training_runner.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_trajectory_harness.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_translator_simplification.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_trend_gate_integration.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_two_tier_tournament.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_typed_contracts.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_typed_dict_rows.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_validity_gate.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_verification_dataset.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_weakness_reports.py +0 -0
- {autocontext-0.3.4 → autocontext-0.3.6}/tests/test_world_state.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: autocontext
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.6
|
|
4
4
|
Summary: autocontext control plane for iterative strategy evolution.
|
|
5
5
|
Project-URL: Homepage, https://github.com/greyhaven-ai/autocontext
|
|
6
6
|
Project-URL: Repository, https://github.com/greyhaven-ai/autocontext
|
|
@@ -60,7 +60,7 @@ The intended use is to hand the harness a real task in plain language, let it so
|
|
|
60
60
|
pip install autocontext
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
-
The current PyPI release line is `autocontext==0.3.
|
|
63
|
+
The current PyPI release line is `autocontext==0.3.6`.
|
|
64
64
|
The PyPI package name is now `autocontext`. The CLI entrypoint remains `autoctx`.
|
|
65
65
|
|
|
66
66
|
## Working Directory
|
|
@@ -10,7 +10,7 @@ The intended use is to hand the harness a real task in plain language, let it so
|
|
|
10
10
|
pip install autocontext
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
The current PyPI release line is `autocontext==0.3.
|
|
13
|
+
The current PyPI release line is `autocontext==0.3.6`.
|
|
14
14
|
The PyPI package name is now `autocontext`. The CLI entrypoint remains `autoctx`.
|
|
15
15
|
|
|
16
16
|
## Working Directory
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Deduplicated bucket-backed blob store (AC-518)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from autocontext.blobstore.factory import create_blob_store
|
|
6
|
+
from autocontext.blobstore.ref import BlobRef
|
|
7
|
+
from autocontext.blobstore.registry import BlobRegistry
|
|
8
|
+
from autocontext.blobstore.store import BlobStore
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"BlobRef",
|
|
12
|
+
"BlobRegistry",
|
|
13
|
+
"BlobStore",
|
|
14
|
+
"create_blob_store",
|
|
15
|
+
]
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""BlobStore factory (AC-518)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from autocontext.blobstore.store import BlobStore
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def create_blob_store(
|
|
11
|
+
backend: str,
|
|
12
|
+
root: str = "",
|
|
13
|
+
repo_id: str = "",
|
|
14
|
+
cache_dir: str = "",
|
|
15
|
+
**kwargs: object,
|
|
16
|
+
) -> BlobStore:
|
|
17
|
+
"""Create a BlobStore backend from configuration.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
backend: "local" or "hf_bucket"
|
|
21
|
+
root: Root directory for local backend
|
|
22
|
+
repo_id: HF repo ID for hf_bucket backend
|
|
23
|
+
cache_dir: Local cache directory for hf_bucket backend
|
|
24
|
+
"""
|
|
25
|
+
if backend == "local":
|
|
26
|
+
from autocontext.blobstore.local import LocalBlobStore
|
|
27
|
+
|
|
28
|
+
return LocalBlobStore(root=Path(root))
|
|
29
|
+
|
|
30
|
+
if backend == "hf_bucket":
|
|
31
|
+
from autocontext.blobstore.hf_bucket import HfBucketStore
|
|
32
|
+
|
|
33
|
+
return HfBucketStore(
|
|
34
|
+
repo_id=repo_id,
|
|
35
|
+
cache_dir=Path(cache_dir) if cache_dir else Path(root) / ".hf_cache",
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
raise ValueError(f"Unknown blob store backend: {backend!r}. Available: 'local', 'hf_bucket'")
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"""Hugging Face Bucket blob store backend (AC-518).
|
|
2
|
+
|
|
3
|
+
Wraps ``huggingface-cli`` for upload/download. Uses a local cache
|
|
4
|
+
directory for hydrated blobs.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import hashlib
|
|
10
|
+
import json
|
|
11
|
+
import logging
|
|
12
|
+
import subprocess
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
from autocontext.blobstore.store import BlobStore, normalize_blob_key, prefix_matches, resolve_blob_path
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
_INDEX_KEY = ".autocontext/blob_index.json"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class HfBucketStore(BlobStore):
|
|
23
|
+
"""HF Buckets backend using huggingface-cli."""
|
|
24
|
+
|
|
25
|
+
def __init__(self, repo_id: str, cache_dir: Path, repo_type: str = "dataset") -> None:
|
|
26
|
+
self.repo_id = repo_id
|
|
27
|
+
self.cache_dir = cache_dir
|
|
28
|
+
self.repo_type = repo_type
|
|
29
|
+
self.cache_dir.mkdir(parents=True, exist_ok=True)
|
|
30
|
+
|
|
31
|
+
def put(self, key: str, data: bytes) -> str:
|
|
32
|
+
normalized_key = normalize_blob_key(key)
|
|
33
|
+
# Write to local cache first, then upload
|
|
34
|
+
cache_path = resolve_blob_path(self.cache_dir, normalized_key)
|
|
35
|
+
cache_path.parent.mkdir(parents=True, exist_ok=True)
|
|
36
|
+
cache_path.write_bytes(data)
|
|
37
|
+
digest = "sha256:" + hashlib.sha256(data).hexdigest()
|
|
38
|
+
|
|
39
|
+
self._run_hf_command(
|
|
40
|
+
[
|
|
41
|
+
"huggingface-cli",
|
|
42
|
+
"upload",
|
|
43
|
+
self.repo_id,
|
|
44
|
+
str(cache_path),
|
|
45
|
+
normalized_key,
|
|
46
|
+
"--repo-type",
|
|
47
|
+
self.repo_type,
|
|
48
|
+
]
|
|
49
|
+
)
|
|
50
|
+
index = self._load_index()[1]
|
|
51
|
+
index[normalized_key] = {
|
|
52
|
+
"size_bytes": len(data),
|
|
53
|
+
"digest": digest,
|
|
54
|
+
"content_type": _guess_content_type(normalized_key),
|
|
55
|
+
}
|
|
56
|
+
self._save_index(index)
|
|
57
|
+
return digest
|
|
58
|
+
|
|
59
|
+
def get(self, key: str) -> bytes | None:
|
|
60
|
+
normalized_key = normalize_blob_key(key)
|
|
61
|
+
# Try cache first
|
|
62
|
+
cache_path = resolve_blob_path(self.cache_dir, normalized_key)
|
|
63
|
+
if cache_path.is_file():
|
|
64
|
+
return cache_path.read_bytes()
|
|
65
|
+
|
|
66
|
+
index_available, index = self._load_index()
|
|
67
|
+
if index_available and normalized_key not in index:
|
|
68
|
+
return None
|
|
69
|
+
|
|
70
|
+
# Download from remote
|
|
71
|
+
try:
|
|
72
|
+
cache_path.parent.mkdir(parents=True, exist_ok=True)
|
|
73
|
+
self._run_hf_command(
|
|
74
|
+
[
|
|
75
|
+
"huggingface-cli",
|
|
76
|
+
"download",
|
|
77
|
+
self.repo_id,
|
|
78
|
+
normalized_key,
|
|
79
|
+
"--repo-type",
|
|
80
|
+
self.repo_type,
|
|
81
|
+
"--local-dir",
|
|
82
|
+
str(cache_path.parent),
|
|
83
|
+
]
|
|
84
|
+
)
|
|
85
|
+
if cache_path.is_file():
|
|
86
|
+
return cache_path.read_bytes()
|
|
87
|
+
except (RuntimeError, OSError):
|
|
88
|
+
pass
|
|
89
|
+
return None
|
|
90
|
+
|
|
91
|
+
def head(self, key: str) -> dict[str, Any] | None:
|
|
92
|
+
normalized_key = normalize_blob_key(key)
|
|
93
|
+
cache_path = resolve_blob_path(self.cache_dir, normalized_key)
|
|
94
|
+
if cache_path.is_file():
|
|
95
|
+
data = cache_path.read_bytes()
|
|
96
|
+
return {
|
|
97
|
+
"size_bytes": len(data),
|
|
98
|
+
"digest": "sha256:" + hashlib.sha256(data).hexdigest(),
|
|
99
|
+
"content_type": _guess_content_type(normalized_key),
|
|
100
|
+
}
|
|
101
|
+
index_available, index = self._load_index()
|
|
102
|
+
if index_available:
|
|
103
|
+
metadata = index.get(normalized_key)
|
|
104
|
+
if metadata is not None:
|
|
105
|
+
return dict(metadata)
|
|
106
|
+
return None
|
|
107
|
+
|
|
108
|
+
def list_prefix(self, prefix: str) -> list[str]:
|
|
109
|
+
index_available, index = self._load_index()
|
|
110
|
+
if index_available:
|
|
111
|
+
return sorted(key for key in index if prefix_matches(key, prefix))
|
|
112
|
+
|
|
113
|
+
# Fall back to local cache listing if index is unavailable.
|
|
114
|
+
try:
|
|
115
|
+
base = self.cache_dir / prefix.replace("\\", "/")
|
|
116
|
+
parent = base.parent if not base.is_dir() else base
|
|
117
|
+
if not parent.is_dir():
|
|
118
|
+
return []
|
|
119
|
+
return [
|
|
120
|
+
p.relative_to(self.cache_dir).as_posix()
|
|
121
|
+
for p in sorted(parent.rglob("*"))
|
|
122
|
+
if p.is_file() and prefix_matches(p.relative_to(self.cache_dir).as_posix(), prefix)
|
|
123
|
+
]
|
|
124
|
+
except Exception:
|
|
125
|
+
return []
|
|
126
|
+
|
|
127
|
+
def delete(self, key: str) -> bool:
|
|
128
|
+
normalized_key = normalize_blob_key(key)
|
|
129
|
+
cache_path = resolve_blob_path(self.cache_dir, normalized_key)
|
|
130
|
+
index_available, index = self._load_index()
|
|
131
|
+
existed = normalized_key in index if index_available else False
|
|
132
|
+
if index_available and normalized_key in index:
|
|
133
|
+
del index[normalized_key]
|
|
134
|
+
self._save_index(index)
|
|
135
|
+
self._delete_remote_file(normalized_key)
|
|
136
|
+
if cache_path.is_file():
|
|
137
|
+
cache_path.unlink()
|
|
138
|
+
existed = True
|
|
139
|
+
return existed
|
|
140
|
+
|
|
141
|
+
def _load_index(self) -> tuple[bool, dict[str, dict[str, Any]]]:
|
|
142
|
+
index_path = resolve_blob_path(self.cache_dir, _INDEX_KEY)
|
|
143
|
+
if not index_path.is_file():
|
|
144
|
+
try:
|
|
145
|
+
self._run_hf_command(
|
|
146
|
+
[
|
|
147
|
+
"huggingface-cli",
|
|
148
|
+
"download",
|
|
149
|
+
self.repo_id,
|
|
150
|
+
_INDEX_KEY,
|
|
151
|
+
"--repo-type",
|
|
152
|
+
self.repo_type,
|
|
153
|
+
"--local-dir",
|
|
154
|
+
str(index_path.parent),
|
|
155
|
+
]
|
|
156
|
+
)
|
|
157
|
+
except (RuntimeError, OSError):
|
|
158
|
+
return False, {}
|
|
159
|
+
if not index_path.is_file():
|
|
160
|
+
return False, {}
|
|
161
|
+
try:
|
|
162
|
+
data = json.loads(index_path.read_text(encoding="utf-8"))
|
|
163
|
+
except (json.JSONDecodeError, OSError):
|
|
164
|
+
logger.warning("failed to parse HF blob index for %s", self.repo_id)
|
|
165
|
+
return False, {}
|
|
166
|
+
if not isinstance(data, dict):
|
|
167
|
+
return False, {}
|
|
168
|
+
index: dict[str, dict[str, Any]] = {}
|
|
169
|
+
for key, metadata in data.items():
|
|
170
|
+
if isinstance(key, str) and isinstance(metadata, dict):
|
|
171
|
+
index[key] = dict(metadata)
|
|
172
|
+
return True, index
|
|
173
|
+
|
|
174
|
+
def _save_index(self, index: dict[str, dict[str, Any]]) -> None:
|
|
175
|
+
index_path = resolve_blob_path(self.cache_dir, _INDEX_KEY)
|
|
176
|
+
index_path.parent.mkdir(parents=True, exist_ok=True)
|
|
177
|
+
index_path.write_text(json.dumps(index, indent=2, sort_keys=True), encoding="utf-8")
|
|
178
|
+
self._run_hf_command(
|
|
179
|
+
[
|
|
180
|
+
"huggingface-cli",
|
|
181
|
+
"upload",
|
|
182
|
+
self.repo_id,
|
|
183
|
+
str(index_path),
|
|
184
|
+
_INDEX_KEY,
|
|
185
|
+
"--repo-type",
|
|
186
|
+
self.repo_type,
|
|
187
|
+
]
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
def _delete_remote_file(self, key: str) -> None:
|
|
191
|
+
try:
|
|
192
|
+
self._run_hf_command(
|
|
193
|
+
[
|
|
194
|
+
"huggingface-cli",
|
|
195
|
+
"repo-files",
|
|
196
|
+
"delete",
|
|
197
|
+
self.repo_id,
|
|
198
|
+
key,
|
|
199
|
+
"--repo-type",
|
|
200
|
+
self.repo_type,
|
|
201
|
+
]
|
|
202
|
+
)
|
|
203
|
+
except RuntimeError:
|
|
204
|
+
logger.info("remote delete not available for %s in %s", key, self.repo_id)
|
|
205
|
+
|
|
206
|
+
def _run_hf_command(self, cmd: list[str]) -> str:
|
|
207
|
+
result = subprocess.run(
|
|
208
|
+
cmd,
|
|
209
|
+
capture_output=True,
|
|
210
|
+
text=True,
|
|
211
|
+
timeout=60,
|
|
212
|
+
)
|
|
213
|
+
if result.returncode != 0:
|
|
214
|
+
raise RuntimeError(f"HF command failed: {result.stderr.strip()}")
|
|
215
|
+
return result.stdout.strip()
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def _guess_content_type(key: str) -> str:
|
|
219
|
+
if key.endswith(".json"):
|
|
220
|
+
return "application/json"
|
|
221
|
+
if key.endswith(".ndjson"):
|
|
222
|
+
return "application/x-ndjson"
|
|
223
|
+
if key.endswith(".md"):
|
|
224
|
+
return "text/markdown"
|
|
225
|
+
if key.endswith(".txt"):
|
|
226
|
+
return "text/plain"
|
|
227
|
+
return "application/octet-stream"
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"""Local filesystem blob store — content-addressed by SHA256 (AC-518)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import shutil
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from autocontext.blobstore.store import BlobStore, prefix_matches, resolve_blob_path
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class LocalBlobStore(BlobStore):
|
|
14
|
+
"""Content-addressed local filesystem backend.
|
|
15
|
+
|
|
16
|
+
Blobs are stored at ``root/<key>`` and their SHA256 digest is
|
|
17
|
+
computed on write. The same content stored under different keys
|
|
18
|
+
will have the same digest but occupy separate files (simplicity
|
|
19
|
+
over dedup for the local backend).
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def __init__(self, root: Path) -> None:
|
|
23
|
+
self.root = root
|
|
24
|
+
self.root.mkdir(parents=True, exist_ok=True)
|
|
25
|
+
|
|
26
|
+
def put(self, key: str, data: bytes) -> str:
|
|
27
|
+
digest = _sha256(data)
|
|
28
|
+
path = resolve_blob_path(self.root, key)
|
|
29
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
30
|
+
path.write_bytes(data)
|
|
31
|
+
return digest
|
|
32
|
+
|
|
33
|
+
def get(self, key: str) -> bytes | None:
|
|
34
|
+
path = resolve_blob_path(self.root, key)
|
|
35
|
+
if not path.is_file():
|
|
36
|
+
return None
|
|
37
|
+
return path.read_bytes()
|
|
38
|
+
|
|
39
|
+
def head(self, key: str) -> dict[str, Any] | None:
|
|
40
|
+
path = resolve_blob_path(self.root, key)
|
|
41
|
+
if not path.is_file():
|
|
42
|
+
return None
|
|
43
|
+
data = path.read_bytes()
|
|
44
|
+
return {
|
|
45
|
+
"size_bytes": len(data),
|
|
46
|
+
"digest": _sha256(data),
|
|
47
|
+
"content_type": _guess_content_type(key),
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
def list_prefix(self, prefix: str) -> list[str]:
|
|
51
|
+
prefix_path = self.root / prefix.replace("\\", "/")
|
|
52
|
+
base = prefix_path.parent if not prefix_path.is_dir() else prefix_path
|
|
53
|
+
if not base.is_dir():
|
|
54
|
+
return []
|
|
55
|
+
results: list[str] = []
|
|
56
|
+
for path in sorted(base.rglob("*")):
|
|
57
|
+
if path.is_file():
|
|
58
|
+
rel = path.relative_to(self.root).as_posix()
|
|
59
|
+
if prefix_matches(rel, prefix):
|
|
60
|
+
results.append(rel)
|
|
61
|
+
return results
|
|
62
|
+
|
|
63
|
+
def delete(self, key: str) -> bool:
|
|
64
|
+
path = resolve_blob_path(self.root, key)
|
|
65
|
+
if not path.is_file():
|
|
66
|
+
return False
|
|
67
|
+
path.unlink()
|
|
68
|
+
return True
|
|
69
|
+
|
|
70
|
+
def put_file(self, key: str, path: Path) -> str:
|
|
71
|
+
dest = resolve_blob_path(self.root, key)
|
|
72
|
+
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
73
|
+
shutil.copy2(str(path), str(dest))
|
|
74
|
+
return _sha256(dest.read_bytes())
|
|
75
|
+
|
|
76
|
+
def get_file(self, key: str, dest: Path) -> bool:
|
|
77
|
+
src = resolve_blob_path(self.root, key)
|
|
78
|
+
if not src.is_file():
|
|
79
|
+
return False
|
|
80
|
+
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
81
|
+
shutil.copy2(str(src), str(dest))
|
|
82
|
+
return True
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _sha256(data: bytes) -> str:
|
|
86
|
+
return "sha256:" + hashlib.sha256(data).hexdigest()
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _guess_content_type(key: str) -> str:
|
|
90
|
+
if key.endswith(".json"):
|
|
91
|
+
return "application/json"
|
|
92
|
+
if key.endswith(".ndjson"):
|
|
93
|
+
return "application/x-ndjson"
|
|
94
|
+
if key.endswith(".md"):
|
|
95
|
+
return "text/markdown"
|
|
96
|
+
if key.endswith(".txt"):
|
|
97
|
+
return "text/plain"
|
|
98
|
+
return "application/octet-stream"
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""BlobRef — structured artifact locator (AC-518)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass(slots=True)
|
|
11
|
+
class BlobRef:
|
|
12
|
+
"""Reference to a blob artifact with optional local and remote locations."""
|
|
13
|
+
|
|
14
|
+
kind: str # "trace", "checkpoint", "report", "model", "export", ...
|
|
15
|
+
digest: str # "sha256:<hex>"
|
|
16
|
+
size_bytes: int
|
|
17
|
+
local_path: str = ""
|
|
18
|
+
remote_uri: str = "" # e.g. "hf://org/repo/blobs/key"
|
|
19
|
+
content_type: str = ""
|
|
20
|
+
created_at: str = ""
|
|
21
|
+
retention_class: str = "" # "ephemeral", "durable", "archive"
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
def is_hydrated(self) -> bool:
|
|
25
|
+
"""True if the blob is available locally."""
|
|
26
|
+
return bool(self.local_path) and Path(self.local_path).exists()
|
|
27
|
+
|
|
28
|
+
def to_dict(self) -> dict[str, Any]:
|
|
29
|
+
return {
|
|
30
|
+
"kind": self.kind,
|
|
31
|
+
"digest": self.digest,
|
|
32
|
+
"size_bytes": self.size_bytes,
|
|
33
|
+
"local_path": self.local_path,
|
|
34
|
+
"remote_uri": self.remote_uri,
|
|
35
|
+
"content_type": self.content_type,
|
|
36
|
+
"created_at": self.created_at,
|
|
37
|
+
"retention_class": self.retention_class,
|
|
38
|
+
"is_hydrated": self.is_hydrated,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def from_dict(cls, data: dict[str, Any]) -> BlobRef:
|
|
43
|
+
return cls(
|
|
44
|
+
kind=data.get("kind", ""),
|
|
45
|
+
digest=data.get("digest", ""),
|
|
46
|
+
size_bytes=data.get("size_bytes", 0),
|
|
47
|
+
local_path=data.get("local_path", ""),
|
|
48
|
+
remote_uri=data.get("remote_uri", ""),
|
|
49
|
+
content_type=data.get("content_type", ""),
|
|
50
|
+
created_at=data.get("created_at", ""),
|
|
51
|
+
retention_class=data.get("retention_class", ""),
|
|
52
|
+
)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""BlobRegistry — tracks BlobRefs by run + artifact name (AC-518)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from autocontext.blobstore.ref import BlobRef
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class BlobRegistry:
|
|
13
|
+
"""In-memory registry of BlobRefs, persistable to JSON."""
|
|
14
|
+
|
|
15
|
+
def __init__(self) -> None:
|
|
16
|
+
self._entries: dict[str, dict[str, BlobRef]] = {} # run_id → {name → ref}
|
|
17
|
+
|
|
18
|
+
def register(self, run_id: str, name: str, ref: BlobRef) -> None:
|
|
19
|
+
if run_id not in self._entries:
|
|
20
|
+
self._entries[run_id] = {}
|
|
21
|
+
self._entries[run_id][name] = ref
|
|
22
|
+
|
|
23
|
+
def lookup(self, run_id: str, name: str) -> BlobRef | None:
|
|
24
|
+
return self._entries.get(run_id, {}).get(name)
|
|
25
|
+
|
|
26
|
+
def list_for_run(self, run_id: str) -> list[BlobRef]:
|
|
27
|
+
return list(self._entries.get(run_id, {}).values())
|
|
28
|
+
|
|
29
|
+
def save(self, path: Path) -> None:
|
|
30
|
+
data: dict[str, Any] = {}
|
|
31
|
+
for run_id, entries in self._entries.items():
|
|
32
|
+
data[run_id] = {name: ref.to_dict() for name, ref in entries.items()}
|
|
33
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
34
|
+
path.write_text(json.dumps(data, indent=2), encoding="utf-8")
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def load(cls, path: Path) -> BlobRegistry:
|
|
38
|
+
registry = cls()
|
|
39
|
+
if not path.is_file():
|
|
40
|
+
return registry
|
|
41
|
+
data = json.loads(path.read_text(encoding="utf-8"))
|
|
42
|
+
for run_id, entries in data.items():
|
|
43
|
+
for name, ref_dict in entries.items():
|
|
44
|
+
registry.register(run_id, name, BlobRef.from_dict(ref_dict))
|
|
45
|
+
return registry
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""BlobStore abstract base class (AC-518).
|
|
2
|
+
|
|
3
|
+
Backend-agnostic interface for large artifact storage. Implementations
|
|
4
|
+
must handle put/get/head/list/delete of opaque byte blobs keyed by
|
|
5
|
+
string paths.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from abc import ABC, abstractmethod
|
|
11
|
+
from pathlib import Path, PurePosixPath, PureWindowsPath
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BlobStore(ABC):
|
|
16
|
+
"""Abstract blob storage backend."""
|
|
17
|
+
|
|
18
|
+
@abstractmethod
|
|
19
|
+
def put(self, key: str, data: bytes) -> str:
|
|
20
|
+
"""Store bytes at key. Returns digest string (e.g. 'sha256:...')."""
|
|
21
|
+
|
|
22
|
+
@abstractmethod
|
|
23
|
+
def get(self, key: str) -> bytes | None:
|
|
24
|
+
"""Retrieve bytes by key. Returns None if not found."""
|
|
25
|
+
|
|
26
|
+
@abstractmethod
|
|
27
|
+
def head(self, key: str) -> dict[str, Any] | None:
|
|
28
|
+
"""Return metadata (size_bytes, digest, content_type) or None."""
|
|
29
|
+
|
|
30
|
+
@abstractmethod
|
|
31
|
+
def list_prefix(self, prefix: str) -> list[str]:
|
|
32
|
+
"""List all keys matching a prefix."""
|
|
33
|
+
|
|
34
|
+
@abstractmethod
|
|
35
|
+
def delete(self, key: str) -> bool:
|
|
36
|
+
"""Delete a key. Returns True if deleted, False if not found."""
|
|
37
|
+
|
|
38
|
+
def put_file(self, key: str, path: Path) -> str:
|
|
39
|
+
"""Store a file at key. Default: read and delegate to put()."""
|
|
40
|
+
return self.put(key, path.read_bytes())
|
|
41
|
+
|
|
42
|
+
def get_file(self, key: str, dest: Path) -> bool:
|
|
43
|
+
"""Retrieve a blob to a file. Returns True on success."""
|
|
44
|
+
data = self.get(key)
|
|
45
|
+
if data is None:
|
|
46
|
+
return False
|
|
47
|
+
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
48
|
+
dest.write_bytes(data)
|
|
49
|
+
return True
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def normalize_blob_key(key: str, *, allow_empty: bool = False) -> str:
|
|
53
|
+
"""Normalize a blob key and reject absolute or escaping paths."""
|
|
54
|
+
if not key:
|
|
55
|
+
if allow_empty:
|
|
56
|
+
return ""
|
|
57
|
+
raise ValueError("blob key must not be empty")
|
|
58
|
+
|
|
59
|
+
for path_cls in (PurePosixPath, PureWindowsPath):
|
|
60
|
+
candidate = path_cls(key)
|
|
61
|
+
if candidate.is_absolute():
|
|
62
|
+
raise ValueError(f"invalid blob key: {key!r}")
|
|
63
|
+
|
|
64
|
+
normalized = key.replace("\\", "/")
|
|
65
|
+
parts = [part for part in PurePosixPath(normalized).parts if part not in ("", ".")]
|
|
66
|
+
if any(part == ".." for part in parts):
|
|
67
|
+
raise ValueError(f"invalid blob key: {key!r}")
|
|
68
|
+
|
|
69
|
+
joined = "/".join(parts)
|
|
70
|
+
if not joined and not allow_empty:
|
|
71
|
+
raise ValueError("blob key must not be empty")
|
|
72
|
+
return joined
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def resolve_blob_path(root: Path, key: str) -> Path:
|
|
76
|
+
"""Resolve a normalized key under root and reject directory escapes."""
|
|
77
|
+
normalized = normalize_blob_key(key)
|
|
78
|
+
root_resolved = root.resolve()
|
|
79
|
+
candidate = (root / normalized).resolve()
|
|
80
|
+
try:
|
|
81
|
+
candidate.relative_to(root_resolved)
|
|
82
|
+
except ValueError as exc:
|
|
83
|
+
raise ValueError(f"invalid blob key: {key!r}") from exc
|
|
84
|
+
return candidate
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def prefix_matches(key: str, prefix: str) -> bool:
|
|
88
|
+
"""Return True if a normalized key matches a normalized prefix."""
|
|
89
|
+
normalized_prefix = normalize_blob_key(prefix, allow_empty=True)
|
|
90
|
+
if not normalized_prefix:
|
|
91
|
+
return True
|
|
92
|
+
if prefix.endswith(("/", "\\")):
|
|
93
|
+
return key == normalized_prefix or key.startswith(normalized_prefix + "/")
|
|
94
|
+
return key.startswith(normalized_prefix)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Environment snapshot bootstrapping (AC-503)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from autocontext.bootstrap.collector import collect_snapshot
|
|
6
|
+
from autocontext.bootstrap.redactor import RedactionConfig, redact_snapshot
|
|
7
|
+
from autocontext.bootstrap.renderer import render_full_json, render_prompt_section
|
|
8
|
+
from autocontext.bootstrap.snapshot import EnvironmentSnapshot, PackageInfo
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"EnvironmentSnapshot",
|
|
12
|
+
"PackageInfo",
|
|
13
|
+
"collect_snapshot",
|
|
14
|
+
"RedactionConfig",
|
|
15
|
+
"redact_snapshot",
|
|
16
|
+
"render_prompt_section",
|
|
17
|
+
"render_full_json",
|
|
18
|
+
]
|