core-runtime 0.1.1__py3-none-any.whl
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.
- api/__init__.py +4 -0
- api/cli/__init__.py +10 -0
- api/cli/audit_client.py +92 -0
- api/cli/census_client.py +77 -0
- api/cli/client.py +508 -0
- api/cli/coverage_client.py +121 -0
- api/cli/daemon_client.py +42 -0
- api/cli/fix_client.py +101 -0
- api/cli/inspect_client.py +143 -0
- api/cli/integration_client.py +42 -0
- api/cli/integrity_client.py +45 -0
- api/cli/proposals_client.py +101 -0
- api/cli/quality_client.py +83 -0
- api/cli/refactor_client.py +82 -0
- api/cli/sync_client.py +106 -0
- api/dependencies.py +37 -0
- api/errors.py +74 -0
- api/main.py +88 -0
- api/v1/__init__.py +4 -0
- api/v1/audit_routes.py +302 -0
- api/v1/census_routes.py +207 -0
- api/v1/coverage_routes.py +352 -0
- api/v1/daemon_routes.py +86 -0
- api/v1/development_routes.py +70 -0
- api/v1/fix_routes.py +428 -0
- api/v1/inspect_routes.py +220 -0
- api/v1/integration_routes.py +56 -0
- api/v1/integrity_routes.py +72 -0
- api/v1/knowledge_routes.py +36 -0
- api/v1/lint_routes.py +40 -0
- api/v1/proposals_routes.py +267 -0
- api/v1/quality_routes.py +272 -0
- api/v1/refactor_routes.py +225 -0
- api/v1/sync_routes.py +261 -0
- body/__init__.py +4 -0
- body/analyzers/__init__.py +25 -0
- body/analyzers/base_analyzer.py +28 -0
- body/analyzers/constitutional_path_analyzer.py +63 -0
- body/analyzers/file_analyzer.py +211 -0
- body/analyzers/knowledge_graph_analyzer.py +86 -0
- body/analyzers/prompt_analyzer.py +155 -0
- body/analyzers/symbol_extractor.py +280 -0
- body/atomic/__init__.py +74 -0
- body/atomic/build_tests_action.py +354 -0
- body/atomic/check_actions.py +142 -0
- body/atomic/crate_ops.py +59 -0
- body/atomic/executor.py +470 -0
- body/atomic/file_ops.py +153 -0
- body/atomic/fix_actions.py +1142 -0
- body/atomic/import_resolver.py +200 -0
- body/atomic/metadata_ops.py +161 -0
- body/atomic/modularity_fix.py +839 -0
- body/atomic/modularity_splitter.py +521 -0
- body/atomic/proposal_lifecycle_actions.py +171 -0
- body/atomic/registry.py +326 -0
- body/atomic/remediate_cognitive_role.py +104 -0
- body/atomic/sandbox_lifecycle.py +252 -0
- body/atomic/split_plan.py +155 -0
- body/atomic/sync_actions/__init__.py +22 -0
- body/atomic/sync_actions/chunking_helpers.py +218 -0
- body/atomic/sync_actions/sync_actions.py +431 -0
- body/atomic/test_actions.py +47 -0
- body/autonomy/__init__.py +16 -0
- body/autonomy/audit_analyzer.py +343 -0
- body/autonomy/micro_proposal_executor.py +316 -0
- body/crate_processing/canary_executor.py +144 -0
- body/evaluators/__init__.py +27 -0
- body/evaluators/atomic_actions_evaluator.py +162 -0
- body/evaluators/atomic_actions_format.py +45 -0
- body/evaluators/atomic_actions_rules.py +278 -0
- body/evaluators/base_evaluator.py +67 -0
- body/evaluators/clarity_evaluator.py +83 -0
- body/evaluators/constitutional_evaluator.py +227 -0
- body/evaluators/failure_evaluator.py +136 -0
- body/evaluators/performance_evaluator.py +341 -0
- body/evaluators/security_evaluator.py +393 -0
- body/flows/__init__.py +33 -0
- body/flows/executor.py +275 -0
- body/flows/registry.py +272 -0
- body/flows/result.py +113 -0
- body/governance/__init__.py +29 -0
- body/governance/body_contracts_service.py +317 -0
- body/governance/code_validator.py +118 -0
- body/governance/engine_dispatcher.py +128 -0
- body/governance/intent_guard.py +592 -0
- body/governance/intent_pattern_validators.py +197 -0
- body/governance/key_management_service.py +100 -0
- body/governance/path_validator.py +187 -0
- body/governance/remediation_service.py +263 -0
- body/governance/runtime_validator.py +184 -0
- body/infrastructure/bootstrap.py +135 -0
- body/infrastructure/lifespan.py +85 -0
- body/infrastructure/repositories/__init__.py +1 -0
- body/infrastructure/repositories/decision_trace_repository.py +210 -0
- body/infrastructure/repositories/refusal_repository.py +294 -0
- body/introspection/__init__.py +4 -0
- body/introspection/capability_discovery_service.py +107 -0
- body/introspection/discovery/from_kgb.py +33 -0
- body/introspection/discovery/from_source_scan.py +40 -0
- body/introspection/discovery/loader.py +62 -0
- body/introspection/discovery/registry.py +22 -0
- body/introspection/discovery/semantics.py +21 -0
- body/introspection/discovery/sync.py +47 -0
- body/introspection/drift_detector.py +81 -0
- body/introspection/drift_service.py +48 -0
- body/introspection/export_vectors.py +133 -0
- body/introspection/generate_capability_docs.py +130 -0
- body/introspection/generate_correction_map.py +98 -0
- body/introspection/graph_analysis_service.py +66 -0
- body/introspection/knowledge_graph_service.py +170 -0
- body/introspection/semantic_clusterer.py +128 -0
- body/introspection/symbol_index_builder.py +244 -0
- body/introspection/sync/engine.py +92 -0
- body/introspection/sync/scanner.py +56 -0
- body/introspection/sync/visitor.py +83 -0
- body/introspection/sync_service.py +62 -0
- body/invokers/__init__.py +4 -0
- body/invokers/capability_invoker.py +4 -0
- body/maintenance/command_sync_service.py +73 -0
- body/maintenance/dotenv_sync_service.py +99 -0
- body/maintenance/idempotency_harness.py +70 -0
- body/maintenance/maintenance_service.py +123 -0
- body/maintenance/memory_cleanup_service.py +131 -0
- body/maintenance/refactor_settings_access.py +274 -0
- body/maintenance/scripts/__init__.py +5 -0
- body/maintenance/scripts/context_export.py +278 -0
- body/maintenance/scripts/vector_verify.py +73 -0
- body/maintenance/sync_vectors.py +338 -0
- body/models/__init__.py +4 -0
- body/project_lifecycle/__init__.py +4 -0
- body/project_lifecycle/bootstrap_service.py +157 -0
- body/project_lifecycle/definition_service.py +264 -0
- body/project_lifecycle/integration_service.py +113 -0
- body/project_lifecycle/scaffolding_service.py +187 -0
- body/quality/coverage_analyzer.py +177 -0
- body/repositories/__init__.py +4 -0
- body/self_healing/atomic_actions_fixer.py +113 -0
- body/self_healing/body_ui_fixer.py +193 -0
- body/self_healing/capability_parser.py +65 -0
- body/self_healing/code_style_service.py +51 -0
- body/self_healing/complexity_filter.py +70 -0
- body/self_healing/docstring_service.py +345 -0
- body/self_healing/duplicate_id_service.py +407 -0
- body/self_healing/duplicates_service.py +165 -0
- body/self_healing/handlers/__init__.py +1 -0
- body/self_healing/handlers/id_assignment_handler.py +201 -0
- body/self_healing/handlers/import_sorting_handler.py +181 -0
- body/self_healing/header_service.py +308 -0
- body/self_healing/id_tagging_service.py +227 -0
- body/self_healing/knowledge_consolidation_service.py +80 -0
- body/self_healing/logging_service.py +292 -0
- body/self_healing/owner_tagging_service.py +5 -0
- body/self_healing/placeholder_fixer_service.py +27 -0
- body/self_healing/prune_private_capabilities.py +144 -0
- body/self_healing/purge_legacy_tags_service.py +146 -0
- body/self_healing/remediation_models.py +238 -0
- body/self_healing/test_context/__init__.py +10 -0
- body/self_healing/test_context/detectors.py +74 -0
- body/self_healing/test_context/examples.py +53 -0
- body/self_healing/test_context/formatter.py +65 -0
- body/self_healing/test_context/metrics.py +62 -0
- body/self_healing/test_context/models.py +83 -0
- body/self_healing/test_context/parsers.py +70 -0
- body/self_healing/test_context_analyzer.py +79 -0
- body/self_healing/test_failure_analyzer.py +259 -0
- body/self_healing/test_target_analyzer.py +118 -0
- body/self_healing/vulture_healer.py +161 -0
- body/services/__init__.py +4 -0
- body/services/artifact_service.py +155 -0
- body/services/blackboard_service/__init__.py +22 -0
- body/services/blackboard_service/blackboard_claim_service.py +216 -0
- body/services/blackboard_service/blackboard_proposal_service.py +305 -0
- body/services/blackboard_service/blackboard_query_service.py +333 -0
- body/services/blackboard_service/blackboard_service.py +602 -0
- body/services/capabilities.py +51 -0
- body/services/cim/__init__.py +22 -0
- body/services/cim/baselines.py +102 -0
- body/services/cim/census_service.py +190 -0
- body/services/cim/cim_constants.py +116 -0
- body/services/cim/cim_path_utils.py +123 -0
- body/services/cim/diff.py +152 -0
- body/services/cim/history.py +94 -0
- body/services/cim/models.py +319 -0
- body/services/cim/policy.py +149 -0
- body/services/cim/scanners.py +332 -0
- body/services/coherence_service.py +552 -0
- body/services/consequence_log_service.py +189 -0
- body/services/constitutional_rule_loader.py +141 -0
- body/services/constitutional_validator.py +366 -0
- body/services/crate_creation_service.py +217 -0
- body/services/crate_processing_service.py +279 -0
- body/services/crawl_service/__init__.py +10 -0
- body/services/crawl_service/main_module.py +531 -0
- body/services/crawl_service/orchestrator.py +452 -0
- body/services/crawl_service/symbol_processing.py +279 -0
- body/services/database_service.py +242 -0
- body/services/doc_service.py +57 -0
- body/services/file_service.py +260 -0
- body/services/governance_claims_service.py +240 -0
- body/services/governance_init.py +41 -0
- body/services/health_log_service.py +167 -0
- body/services/intent_schema_validator.py +211 -0
- body/services/llm_client.py +87 -0
- body/services/mind_state_service.py +129 -0
- body/services/policy_expression_evaluator.py +154 -0
- body/services/proposal_supervision_service.py +187 -0
- body/services/representation_coherence_service.py +209 -0
- body/services/service_registry.py +431 -0
- body/services/session_attached_service.py +51 -0
- body/services/symbol_query_service.py +218 -0
- body/services/symbol_service.py +94 -0
- body/services/validation/__init__.py +14 -0
- body/services/validation/python_validator.py +89 -0
- body/services/validation/validation_policies.py +121 -0
- body/services/worker_registry_service.py +184 -0
- body/validators/__init__.py +1 -0
- body/validators/logic_conservation_validator.py +201 -0
- body/workers/call_site_rewriter.py +527 -0
- body/workers/prompt_artifact_writer.py +323 -0
- cli/__init__.py +4 -0
- cli/admin_cli.py +98 -0
- cli/cli_user.py +121 -0
- cli/commands/__init__.py +4 -0
- cli/commands/audit_reporter.py +272 -0
- cli/commands/check/__init__.py +115 -0
- cli/commands/check/audit.py +130 -0
- cli/commands/check/converters.py +129 -0
- cli/commands/check/diagnostics_commands.py +70 -0
- cli/commands/check/formatters.py +310 -0
- cli/commands/check/imports.py +73 -0
- cli/commands/check/quality.py +71 -0
- cli/commands/check/quality_gates.py +107 -0
- cli/commands/check/rule.py +136 -0
- cli/commands/check/utils.py +28 -0
- cli/commands/check_atomic_actions.py +167 -0
- cli/commands/components.py +66 -0
- cli/commands/coverage/__init__.py +22 -0
- cli/commands/coverage/analysis_commands.py +87 -0
- cli/commands/coverage/check_commands.py +173 -0
- cli/commands/coverage/generation_commands.py +155 -0
- cli/commands/coverage/services/__init__.py +15 -0
- cli/commands/coverage/services/coverage_checker.py +50 -0
- cli/commands/coverage/services/coverage_reporter.py +81 -0
- cli/commands/coverage/services/gaps_analyzer.py +114 -0
- cli/commands/daemon.py +908 -0
- cli/commands/develop.py +127 -0
- cli/commands/diagnostics.py +32 -0
- cli/commands/fix/__init__.py +84 -0
- cli/commands/fix/all_commands.py +94 -0
- cli/commands/fix/atomic_actions.py +48 -0
- cli/commands/fix/audit.py +146 -0
- cli/commands/fix/body_ui.py +93 -0
- cli/commands/fix/code_style.py +52 -0
- cli/commands/fix/db_tools.py +90 -0
- cli/commands/fix/fix_ir.py +79 -0
- cli/commands/fix/handler_discovery.py +54 -0
- cli/commands/fix/imports.py +55 -0
- cli/commands/fix/list_commands.py +54 -0
- cli/commands/fix/metadata.py +160 -0
- cli/commands/fix/modularity.py +88 -0
- cli/commands/fix/settings_access.py +65 -0
- cli/commands/fix_governed.py +103 -0
- cli/commands/fix_logging.py +24 -0
- cli/commands/governance.py +294 -0
- cli/commands/guard.py +125 -0
- cli/commands/inspect/__init__.py +79 -0
- cli/commands/inspect/_helpers.py +226 -0
- cli/commands/inspect/analysis.py +158 -0
- cli/commands/inspect/decisions.py +140 -0
- cli/commands/inspect/diagnostics.py +126 -0
- cli/commands/inspect/drift.py +100 -0
- cli/commands/inspect/patterns.py +102 -0
- cli/commands/inspect/refusals.py +211 -0
- cli/commands/inspect/repo_census.py +175 -0
- cli/commands/inspect/status.py +48 -0
- cli/commands/interactive_test.py +85 -0
- cli/commands/mind.py +49 -0
- cli/commands/refactor.py +234 -0
- cli/commands/refactor_support/__init__.py +7 -0
- cli/commands/refactor_support/analyzer.py +107 -0
- cli/commands/refactor_support/config.py +67 -0
- cli/commands/refactor_support/display.py +170 -0
- cli/commands/refactor_support/recommendations.py +55 -0
- cli/commands/run.py +60 -0
- cli/commands/search.py +103 -0
- cli/commands/status.py +86 -0
- cli/commands/submit.py +23 -0
- cli/interactive.py +177 -0
- cli/logic/__init__.py +7 -0
- cli/logic/agent.py +110 -0
- cli/logic/audit_capability_domains.py +106 -0
- cli/logic/audit_renderer.py +150 -0
- cli/logic/autonomy/actions.py +36 -0
- cli/logic/autonomy/views.py +116 -0
- cli/logic/body_contracts_checker.py +23 -0
- cli/logic/build.py +27 -0
- cli/logic/byor.py +148 -0
- cli/logic/capability.py +27 -0
- cli/logic/cli_utils.py +210 -0
- cli/logic/context.py +7 -0
- cli/logic/db.py +154 -0
- cli/logic/db_manage.py +22 -0
- cli/logic/decision_inspect_logic.py +62 -0
- cli/logic/diagnostics.py +148 -0
- cli/logic/diagnostics_policy.py +100 -0
- cli/logic/diagnostics_registry.py +165 -0
- cli/logic/duplicates.py +19 -0
- cli/logic/embeddings_cli.py +43 -0
- cli/logic/governance/__init__.py +16 -0
- cli/logic/governance/engine.py +216 -0
- cli/logic/governance/forensics_service.py +67 -0
- cli/logic/governance/limb_status_service.py +83 -0
- cli/logic/governance/renderer.py +115 -0
- cli/logic/governance/traceability_service.py +78 -0
- cli/logic/governance_logic.py +33 -0
- cli/logic/hub/__init__.py +14 -0
- cli/logic/hub/app.py +107 -0
- cli/logic/hub/formatter.py +29 -0
- cli/logic/hub/introspection.py +20 -0
- cli/logic/hub/repository.py +17 -0
- cli/logic/init.py +22 -0
- cli/logic/interactive_test/__init__.py +21 -0
- cli/logic/interactive_test/session.py +102 -0
- cli/logic/interactive_test/steps/__init__.py +23 -0
- cli/logic/interactive_test/steps/execution.py +53 -0
- cli/logic/interactive_test/steps/generation.py +88 -0
- cli/logic/interactive_test/steps/healing.py +79 -0
- cli/logic/interactive_test/steps/utils.py +31 -0
- cli/logic/interactive_test/steps/verification.py +71 -0
- cli/logic/interactive_test/ui.py +203 -0
- cli/logic/interactive_test/workflow.py +168 -0
- cli/logic/interactive_test_logic.py +41 -0
- cli/logic/knowledge.py +47 -0
- cli/logic/legacy_scan_logic.py +306 -0
- cli/logic/list_audits.py +49 -0
- cli/logic/log_audit.py +53 -0
- cli/logic/new.py +8 -0
- cli/logic/project_docs.py +28 -0
- cli/logic/reconcile.py +127 -0
- cli/logic/refusal_inspect_logic.py +208 -0
- cli/logic/report.py +47 -0
- cli/logic/status.py +47 -0
- cli/logic/symbol_drift.py +77 -0
- cli/logic/sync.py +48 -0
- cli/logic/sync_domains.py +72 -0
- cli/logic/sync_manifest.py +31 -0
- cli/logic/tools.py +133 -0
- cli/logic/utils_migration.py +43 -0
- cli/logic/validate.py +107 -0
- cli/logic/vector_drift.py +109 -0
- cli/logic/yaml_processor.py +5 -0
- cli/renderers/audit_detail.py +37 -0
- cli/renderers/audit_overview.py +39 -0
- cli/resources/__init__.py +27 -0
- cli/resources/admin/__init__.py +23 -0
- cli/resources/admin/coverage.py +63 -0
- cli/resources/admin/debt_scan.py +195 -0
- cli/resources/admin/forensics.py +97 -0
- cli/resources/admin/health.py +66 -0
- cli/resources/admin/hub.py +9 -0
- cli/resources/admin/meta.py +47 -0
- cli/resources/admin/patterns.py +28 -0
- cli/resources/admin/refusals.py +31 -0
- cli/resources/admin/self_check.py +175 -0
- cli/resources/admin/status.py +66 -0
- cli/resources/admin/summary.py +67 -0
- cli/resources/admin/traces.py +46 -0
- cli/resources/admin/validate_env.py +56 -0
- cli/resources/code/__init__.py +31 -0
- cli/resources/code/actions.py +48 -0
- cli/resources/code/audit.py +416 -0
- cli/resources/code/audit_duplicates.py +22 -0
- cli/resources/code/check_imports.py +75 -0
- cli/resources/code/check_ui.py +62 -0
- cli/resources/code/clarity.py +51 -0
- cli/resources/code/complexity.py +55 -0
- cli/resources/code/docstrings.py +51 -0
- cli/resources/code/fix_atomic.py +51 -0
- cli/resources/code/format.py +62 -0
- cli/resources/code/hub.py +10 -0
- cli/resources/code/integrity.py +75 -0
- cli/resources/code/lint.py +37 -0
- cli/resources/code/logging.py +49 -0
- cli/resources/code/refactor.py +32 -0
- cli/resources/code/test.py +30 -0
- cli/resources/coherence/__init__.py +13 -0
- cli/resources/coherence/check.py +111 -0
- cli/resources/coherence/hub.py +13 -0
- cli/resources/coherence/repair_counts.py +73 -0
- cli/resources/coherence/report.py +144 -0
- cli/resources/coherence/seed.py +297 -0
- cli/resources/coherence/supersede.py +124 -0
- cli/resources/coherence/triage.py +81 -0
- cli/resources/constitution/__init__.py +19 -0
- cli/resources/constitution/audit.py +49 -0
- cli/resources/constitution/query.py +45 -0
- cli/resources/constitution/status.py +34 -0
- cli/resources/constitution/validate.py +36 -0
- cli/resources/context/__init__.py +21 -0
- cli/resources/context/build.py +374 -0
- cli/resources/context/cache.py +156 -0
- cli/resources/context/explain.py +140 -0
- cli/resources/context/hub.py +11 -0
- cli/resources/context/search.py +114 -0
- cli/resources/database/__init__.py +13 -0
- cli/resources/database/cleanup.py +107 -0
- cli/resources/database/export.py +61 -0
- cli/resources/database/hub.py +11 -0
- cli/resources/database/migrate.py +57 -0
- cli/resources/database/status.py +101 -0
- cli/resources/database/sync.py +84 -0
- cli/resources/database/sync_env.py +76 -0
- cli/resources/database/sync_registry.py +48 -0
- cli/resources/dev/__init__.py +14 -0
- cli/resources/dev/hub.py +11 -0
- cli/resources/dev/refactor.py +92 -0
- cli/resources/dev/stability.py +60 -0
- cli/resources/dev/strategic_audit.py +113 -0
- cli/resources/dev/sync.py +51 -0
- cli/resources/dev/test.py +34 -0
- cli/resources/intent/__init__.py +11 -0
- cli/resources/intent/hub.py +9 -0
- cli/resources/intent/sync_vocabulary.py +396 -0
- cli/resources/project/__init__.py +19 -0
- cli/resources/project/docs.py +41 -0
- cli/resources/project/new.py +40 -0
- cli/resources/project/onboard.py +31 -0
- cli/resources/proposals/__init__.py +28 -0
- cli/resources/proposals/create.py +82 -0
- cli/resources/proposals/integrate.py +49 -0
- cli/resources/proposals/list.py +76 -0
- cli/resources/proposals/manage.py +117 -0
- cli/resources/runtime/__init__.py +9 -0
- cli/resources/runtime/health.py +925 -0
- cli/resources/secrets/__init__.py +10 -0
- cli/resources/secrets/hub.py +9 -0
- cli/resources/secrets/manage.py +309 -0
- cli/resources/symbols/__init__.py +13 -0
- cli/resources/symbols/audit.py +46 -0
- cli/resources/symbols/fix_ids.py +43 -0
- cli/resources/symbols/hub.py +11 -0
- cli/resources/symbols/resolve_duplicates.py +30 -0
- cli/resources/symbols/sync.py +39 -0
- cli/resources/symbols/tag.py +47 -0
- cli/resources/vectors/__init__.py +11 -0
- cli/resources/vectors/cleanup.py +95 -0
- cli/resources/vectors/hub.py +9 -0
- cli/resources/vectors/query.py +105 -0
- cli/resources/vectors/status.py +30 -0
- cli/resources/vectors/sync.py +57 -0
- cli/resources/vectors/sync_code.py +67 -0
- cli/resources/workers/__init__.py +13 -0
- cli/resources/workers/blackboard.py +253 -0
- cli/resources/workers/remediate.py +337 -0
- cli/resources/workers/run.py +140 -0
- cli/utils/__init__.py +32 -0
- cli/utils/annotation_formatter.py +154 -0
- cli/utils/decorators.py +184 -0
- cli/utils/display.py +79 -0
- cli/utils/exit_codes.py +59 -0
- cli/utils/helpers.py +34 -0
- cli/utils/prompts.py +21 -0
- core_runtime-0.1.1.dist-info/LICENSE +21 -0
- core_runtime-0.1.1.dist-info/METADATA +346 -0
- core_runtime-0.1.1.dist-info/RECORD +962 -0
- core_runtime-0.1.1.dist-info/WHEEL +4 -0
- core_runtime-0.1.1.dist-info/entry_points.txt +4 -0
- mind/__init__.py +4 -0
- mind/coherence/__init__.py +1 -0
- mind/coherence/checker.py +314 -0
- mind/coherence/checks/__init__.py +4 -0
- mind/coherence/checks/base.py +34 -0
- mind/coherence/checks/r1_scoped.py +228 -0
- mind/coherence/checks/row2_grounding.py +69 -0
- mind/coherence/checks/row3_citation.py +119 -0
- mind/coherence/checks/row4_naming.py +126 -0
- mind/coherence/checks/sameconcern.py +136 -0
- mind/coherence/checks/specgap.py +233 -0
- mind/coherence/checks/vocabulary.py +112 -0
- mind/coherence/llm_judge.py +207 -0
- mind/enforcement/audit.py +78 -0
- mind/governance/__init__.py +22 -0
- mind/governance/assumption_extractor.py +326 -0
- mind/governance/audit_context.py +520 -0
- mind/governance/audit_postprocessor.py +36 -0
- mind/governance/audit_report_writer.py +46 -0
- mind/governance/audit_types.py +98 -0
- mind/governance/auditor.py +179 -0
- mind/governance/authority_package_builder.py +502 -0
- mind/governance/constitutional_auditor_dynamic.py +362 -0
- mind/governance/enforcement/__init__.py +24 -0
- mind/governance/enforcement_loader.py +245 -0
- mind/governance/enforcement_methods.py +28 -0
- mind/governance/entry_point_policy.py +62 -0
- mind/governance/executable_rule.py +127 -0
- mind/governance/filtered_audit.py +272 -0
- mind/governance/finding_processor.py +76 -0
- mind/governance/meta_validator.py +259 -0
- mind/governance/micro_proposal_validator.py +169 -0
- mind/governance/policy_coverage_service.py +183 -0
- mind/governance/policy_rule.py +94 -0
- mind/governance/rule_conflict_detector.py +127 -0
- mind/governance/rule_executor.py +306 -0
- mind/governance/rule_extractor.py +376 -0
- mind/governance/stateless_audit.py +206 -0
- mind/governance/violation_report.py +136 -0
- mind/logic/engines/_knowledge_gate_duplication.py +117 -0
- mind/logic/engines/action_gate.py +76 -0
- mind/logic/engines/artifact_gate.py +1168 -0
- mind/logic/engines/ast_gate/__init__.py +9 -0
- mind/logic/engines/ast_gate/base.py +263 -0
- mind/logic/engines/ast_gate/checks/__init__.py +35 -0
- mind/logic/engines/ast_gate/checks/async_checks.py +276 -0
- mind/logic/engines/ast_gate/checks/capability_checks.py +197 -0
- mind/logic/engines/ast_gate/checks/conservation_checks.py +126 -0
- mind/logic/engines/ast_gate/checks/generic_checks.py +244 -0
- mind/logic/engines/ast_gate/checks/import_checks.py +164 -0
- mind/logic/engines/ast_gate/checks/knowledge_source_check.py +88 -0
- mind/logic/engines/ast_gate/checks/logging_checks.py +133 -0
- mind/logic/engines/ast_gate/checks/metadata_checks.py +242 -0
- mind/logic/engines/ast_gate/checks/modularity_checks.py +436 -0
- mind/logic/engines/ast_gate/checks/naming_checks.py +120 -0
- mind/logic/engines/ast_gate/checks/prompt_model_checks.py +83 -0
- mind/logic/engines/ast_gate/checks/protected_namespace_access_check.py +298 -0
- mind/logic/engines/ast_gate/checks/purity_checks.py +421 -0
- mind/logic/engines/ast_gate/checks/purity_enforcement_check.py +56 -0
- mind/logic/engines/ast_gate/checks/runtime_import_boundary.py +198 -0
- mind/logic/engines/ast_gate/checks/schema_conformance_checks.py +130 -0
- mind/logic/engines/ast_gate/engine.py +317 -0
- mind/logic/engines/ast_gate.py +19 -0
- mind/logic/engines/base.py +106 -0
- mind/logic/engines/cli_gate/__init__.py +25 -0
- mind/logic/engines/cli_gate/base_check.py +45 -0
- mind/logic/engines/cli_gate/checks/__init__.py +31 -0
- mind/logic/engines/cli_gate/checks/async_execution.py +65 -0
- mind/logic/engines/cli_gate/checks/dangerous_explicit.py +60 -0
- mind/logic/engines/cli_gate/checks/discovery_strict.py +167 -0
- mind/logic/engines/cli_gate/checks/help_required.py +43 -0
- mind/logic/engines/cli_gate/checks/no_duplicates.py +57 -0
- mind/logic/engines/cli_gate/checks/no_layer_exposure.py +48 -0
- mind/logic/engines/cli_gate/checks/resource_first.py +58 -0
- mind/logic/engines/cli_gate/checks/standard_verbs.py +50 -0
- mind/logic/engines/cli_gate/engine.py +211 -0
- mind/logic/engines/glob_gate.py +214 -0
- mind/logic/engines/knowledge_gate.py +410 -0
- mind/logic/engines/llm_gate.py +407 -0
- mind/logic/engines/llm_gate_stub.py +67 -0
- mind/logic/engines/passive_gate.py +45 -0
- mind/logic/engines/regex_gate.py +97 -0
- mind/logic/engines/registry.py +134 -0
- mind/logic/engines/runtime_gate.py +265 -0
- mind/logic/engines/taxonomy_gate.py +229 -0
- mind/logic/engines/workflow_gate/__init__.py +22 -0
- mind/logic/engines/workflow_gate/base_check.py +42 -0
- mind/logic/engines/workflow_gate/checks/__init__.py +32 -0
- mind/logic/engines/workflow_gate/checks/alignment.py +93 -0
- mind/logic/engines/workflow_gate/checks/audit.py +80 -0
- mind/logic/engines/workflow_gate/checks/canary.py +47 -0
- mind/logic/engines/workflow_gate/checks/coverage.py +74 -0
- mind/logic/engines/workflow_gate/checks/dead_code.py +53 -0
- mind/logic/engines/workflow_gate/checks/import_resolution.py +97 -0
- mind/logic/engines/workflow_gate/checks/linter.py +104 -0
- mind/logic/engines/workflow_gate/checks/quality.py +49 -0
- mind/logic/engines/workflow_gate/checks/ruff_format.py +99 -0
- mind/logic/engines/workflow_gate/checks/tests.py +81 -0
- mind/logic/engines/workflow_gate/engine.py +207 -0
- shared/__init__.py +32 -0
- shared/action_logger.py +61 -0
- shared/action_types.py +199 -0
- shared/activity_logging.py +149 -0
- shared/ai/constitutional_envelope.py +341 -0
- shared/ai/prompt_model.py +585 -0
- shared/ai/response_parser.py +191 -0
- shared/ast_utility.py +279 -0
- shared/atomic_action.py +117 -0
- shared/cli/__init__.py +6 -0
- shared/cli/app_introspection.py +134 -0
- shared/cli/command_meta.py +224 -0
- shared/cli_types.py +92 -0
- shared/component_primitive.py +216 -0
- shared/config.py +216 -0
- shared/config_loader.py +54 -0
- shared/context.py +113 -0
- shared/exceptions.py +100 -0
- shared/governance/__init__.py +9 -0
- shared/governance/coherence_harvester.py +258 -0
- shared/governance_token.py +77 -0
- shared/infrastructure/__init__.py +5 -0
- shared/infrastructure/adapters/__init__.py +5 -0
- shared/infrastructure/adapters/embedding_provider.py +66 -0
- shared/infrastructure/bootstrap_registry.py +57 -0
- shared/infrastructure/clients/__init__.py +5 -0
- shared/infrastructure/clients/qdrant_client.py +455 -0
- shared/infrastructure/config_service.py +382 -0
- shared/infrastructure/config_validator.py +70 -0
- shared/infrastructure/context/__init__.py +45 -0
- shared/infrastructure/context/builder.py +804 -0
- shared/infrastructure/context/cache.py +101 -0
- shared/infrastructure/context/database.py +205 -0
- shared/infrastructure/context/limb_workspace.py +134 -0
- shared/infrastructure/context/models.py +65 -0
- shared/infrastructure/context/providers/__init__.py +18 -0
- shared/infrastructure/context/providers/ast.py +211 -0
- shared/infrastructure/context/providers/db.py +165 -0
- shared/infrastructure/context/providers/vectors.py +195 -0
- shared/infrastructure/context/redactor.py +109 -0
- shared/infrastructure/context/serializers.py +144 -0
- shared/infrastructure/context/service.py +271 -0
- shared/infrastructure/context/validator.py +247 -0
- shared/infrastructure/database/models/__init__.py +80 -0
- shared/infrastructure/database/models/autonomous_proposals.py +83 -0
- shared/infrastructure/database/models/decision_traces.py +129 -0
- shared/infrastructure/database/models/governance.py +183 -0
- shared/infrastructure/database/models/knowledge.py +205 -0
- shared/infrastructure/database/models/learning.py +99 -0
- shared/infrastructure/database/models/llm_config.py +274 -0
- shared/infrastructure/database/models/operations.py +152 -0
- shared/infrastructure/database/models/refusals.py +147 -0
- shared/infrastructure/database/models/system.py +124 -0
- shared/infrastructure/database/models/vectors.py +113 -0
- shared/infrastructure/database/models/workers.py +96 -0
- shared/infrastructure/database/session_manager.py +166 -0
- shared/infrastructure/diagnostic_service.py +103 -0
- shared/infrastructure/events/__init__.py +5 -0
- shared/infrastructure/events/base.py +44 -0
- shared/infrastructure/events/bus.py +76 -0
- shared/infrastructure/git_service.py +385 -0
- shared/infrastructure/intent/action_risk.py +135 -0
- shared/infrastructure/intent/audit_verdict.py +131 -0
- shared/infrastructure/intent/autonomy_dirty_tree.py +104 -0
- shared/infrastructure/intent/canonical_enums.py +116 -0
- shared/infrastructure/intent/cognitive_roles.py +96 -0
- shared/infrastructure/intent/errors.py +13 -0
- shared/infrastructure/intent/filesystem_operations.py +359 -0
- shared/infrastructure/intent/intent_connector.py +157 -0
- shared/infrastructure/intent/intent_repository.py +707 -0
- shared/infrastructure/intent/intent_validator.py +248 -0
- shared/infrastructure/intent/operational_capabilities.py +470 -0
- shared/infrastructure/intent/operational_config.py +1343 -0
- shared/infrastructure/intent/operational_mode.py +66 -0
- shared/infrastructure/intent/task_type_phases.py +180 -0
- shared/infrastructure/intent/test_coverage_paths.py +181 -0
- shared/infrastructure/intent/vocabulary_projection.py +241 -0
- shared/infrastructure/knowledge/knowledge_service.py +155 -0
- shared/infrastructure/knowledge_graph_service.py +214 -0
- shared/infrastructure/llm/client.py +448 -0
- shared/infrastructure/llm/client_registry.py +153 -0
- shared/infrastructure/llm/fallback_client.py +144 -0
- shared/infrastructure/llm/providers/anthropic.py +113 -0
- shared/infrastructure/llm/providers/base.py +130 -0
- shared/infrastructure/llm/providers/ollama.py +265 -0
- shared/infrastructure/llm/providers/openai.py +168 -0
- shared/infrastructure/repositories/__init__.py +5 -0
- shared/infrastructure/repositories/db/__init__.py +5 -0
- shared/infrastructure/repositories/db/common.py +138 -0
- shared/infrastructure/repositories/db/engine.py +26 -0
- shared/infrastructure/repositories/db/migration_service.py +75 -0
- shared/infrastructure/repositories/db/status_service.py +61 -0
- shared/infrastructure/repositories/memory_repository.py +134 -0
- shared/infrastructure/repositories/symbol_definition_repository.py +170 -0
- shared/infrastructure/repositories/task_repository.py +59 -0
- shared/infrastructure/repositories/vector_link_repository.py +83 -0
- shared/infrastructure/rooted_repository.py +50 -0
- shared/infrastructure/secrets_service.py +317 -0
- shared/infrastructure/specs/__init__.py +9 -0
- shared/infrastructure/specs/specs_repository.py +100 -0
- shared/infrastructure/storage/file_classifier.py +32 -0
- shared/infrastructure/storage/file_handler.py +330 -0
- shared/infrastructure/storage/file_provider.py +233 -0
- shared/infrastructure/storage/integrity_service.py +108 -0
- shared/infrastructure/validation/black_formatter.py +41 -0
- shared/infrastructure/validation/quality.py +46 -0
- shared/infrastructure/validation/ruff_linter.py +104 -0
- shared/infrastructure/validation/syntax_checker.py +45 -0
- shared/infrastructure/validation/test_runner.py +167 -0
- shared/infrastructure/validation/yaml_validator.py +45 -0
- shared/infrastructure/vector/__init__.py +15 -0
- shared/infrastructure/vector/adapters/__init__.py +20 -0
- shared/infrastructure/vector/adapters/constitutional/__init__.py +26 -0
- shared/infrastructure/vector/adapters/constitutional/chunker.py +246 -0
- shared/infrastructure/vector/adapters/constitutional/doc_key_resolver.py +109 -0
- shared/infrastructure/vector/adapters/constitutional/item_builder.py +158 -0
- shared/infrastructure/vector/adapters/constitutional/utils.py +39 -0
- shared/infrastructure/vector/adapters/constitutional_adapter.py +309 -0
- shared/infrastructure/vector/adapters/specs_adapter.py +171 -0
- shared/infrastructure/vector/cognitive_adapter.py +119 -0
- shared/infrastructure/vector/vector_index_service.py +230 -0
- shared/logger.py +195 -0
- shared/models/__init__.py +47 -0
- shared/models/action_result.py +77 -0
- shared/models/audit_models.py +106 -0
- shared/models/audit_rendering.py +30 -0
- shared/models/capability_models.py +22 -0
- shared/models/constitutional_validation.py +185 -0
- shared/models/drift_models.py +24 -0
- shared/models/embedding_payload.py +45 -0
- shared/models/execution_models.py +71 -0
- shared/models/pattern_graph.py +62 -0
- shared/models/prompt_model.py +244 -0
- shared/models/refusal_result.py +294 -0
- shared/models/remediation.py +35 -0
- shared/models/validation_result.py +34 -0
- shared/models/vector_models.py +62 -0
- shared/models/workflow_models.py +242 -0
- shared/path_resolver.py +408 -0
- shared/path_utils.py +60 -0
- shared/processors/base_processor.py +171 -0
- shared/processors/yaml_processor.py +72 -0
- shared/protocols/__init__.py +21 -0
- shared/protocols/brain_services.py +35 -0
- shared/protocols/cognitive.py +35 -0
- shared/protocols/executor.py +47 -0
- shared/protocols/interpreter.py +24 -0
- shared/protocols/knowledge.py +21 -0
- shared/protocols/llm.py +25 -0
- shared/protocols/typer_protocols.py +37 -0
- shared/time.py +18 -0
- shared/universal.py +43 -0
- shared/utils/__init__.py +81 -0
- shared/utils/audit_grouping.py +50 -0
- shared/utils/common_knowledge.py +82 -0
- shared/utils/domain_mapper.py +61 -0
- shared/utils/embedding_utils.py +182 -0
- shared/utils/glob_match.py +93 -0
- shared/utils/header_tools.py +177 -0
- shared/utils/parallel_processor.py +60 -0
- shared/utils/parsing.py +189 -0
- shared/utils/path_utils.py +268 -0
- shared/utils/subprocess_utils.py +87 -0
- shared/workers/__init__.py +19 -0
- shared/workers/base.py +533 -0
- shared/workers/declaration_validator.py +124 -0
- shared/workers/loop_hold_telemetry.py +210 -0
- shared/workers/schedule.py +123 -0
- will/__init__.py +4 -0
- will/agents/__init__.py +4 -0
- will/agents/base_planner.py +133 -0
- will/agents/code_generation/__init__.py +15 -0
- will/agents/code_generation/code_generator.py +247 -0
- will/agents/code_generation/context_formatters.py +99 -0
- will/agents/code_generation/correction_engine.py +157 -0
- will/agents/code_generation/extraction.py +165 -0
- will/agents/code_generation/pattern_validator.py +264 -0
- will/agents/code_generation/prompt_builders.py +209 -0
- will/agents/coder_agent.py +229 -0
- will/agents/coder_agent_refusal_handler.py +168 -0
- will/agents/cognitive_orchestrator.py +152 -0
- will/agents/conversational/__init__.py +13 -0
- will/agents/conversational/agent.py +271 -0
- will/agents/conversational/factory.py +72 -0
- will/agents/conversational/helpers.py +116 -0
- will/agents/execution_agent.py +294 -0
- will/agents/governance_mixin.py +132 -0
- will/agents/planner_agent.py +261 -0
- will/agents/resource_selector.py +228 -0
- will/agents/strategic_auditor/__init__.py +15 -0
- will/agents/strategic_auditor/agent.py +199 -0
- will/agents/strategic_auditor/context_gatherer.py +586 -0
- will/agents/strategic_auditor/effects.py +136 -0
- will/agents/strategic_auditor/models.py +61 -0
- will/agents/strategic_auditor/reasoning.py +169 -0
- will/agents/tagger_agent.py +294 -0
- will/agents/traced_agent_mixin.py +33 -0
- will/autonomy/__init__.py +20 -0
- will/autonomy/autonomous_developer.py +127 -0
- will/autonomy/proposal.py +585 -0
- will/autonomy/proposal_execution_pipeline.py +264 -0
- will/autonomy/proposal_executor.py +410 -0
- will/autonomy/proposal_mapper.py +187 -0
- will/autonomy/proposal_repository.py +118 -0
- will/autonomy/proposal_service.py +251 -0
- will/autonomy/proposal_state_manager.py +239 -0
- will/deciders/__init__.py +9 -0
- will/deciders/governance_decider.py +207 -0
- will/governance/__init__.py +13 -0
- will/governance/audit_remediation_runner.py +197 -0
- will/governance/audit_runner.py +368 -0
- will/governance/census_runner.py +278 -0
- will/governance/coverage_runner.py +489 -0
- will/governance/daemon_runner.py +164 -0
- will/governance/fix_runner.py +693 -0
- will/governance/inspect_runner.py +521 -0
- will/governance/integrity_runner.py +66 -0
- will/governance/lint_runner.py +93 -0
- will/governance/refactor_runner.py +372 -0
- will/governance/sync_runner.py +186 -0
- will/interpreters/__init__.py +44 -0
- will/interpreters/cli_args_interpreter.py +106 -0
- will/interpreters/natural_language_interpreter.py +276 -0
- will/interpreters/request_interpreter.py +126 -0
- will/lifecycle/__init__.py +12 -0
- will/lifecycle/integration_runner.py +54 -0
- will/maintenance/metadata_scribe_service.py +64 -0
- will/orchestration/__init__.py +4 -0
- will/orchestration/cognitive_service.py +185 -0
- will/orchestration/decision_tracer.py +257 -0
- will/orchestration/intent_alignment.py +59 -0
- will/orchestration/intent_guard.py +20 -0
- will/orchestration/phase_registry.py +92 -0
- will/orchestration/process_orchestrator.py +270 -0
- will/orchestration/prompt_pipeline.py +174 -0
- will/orchestration/remediation_orchestrator.py +292 -0
- will/orchestration/self_correction_engine.py +154 -0
- will/orchestration/validation_pipeline.py +45 -0
- will/orchestration/workflow_orchestrator.py +277 -0
- will/phases/__init__.py +24 -0
- will/phases/audit_phase.py +152 -0
- will/phases/canary/pytest_runner.py +156 -0
- will/phases/canary/result_builder.py +130 -0
- will/phases/canary/test_discovery.py +104 -0
- will/phases/canary_validation_phase.py +188 -0
- will/phases/code_generation/artifact_saver.py +175 -0
- will/phases/code_generation/code_sensor.py +117 -0
- will/phases/code_generation/file_path_extractor.py +53 -0
- will/phases/code_generation/work_directory_manager.py +83 -0
- will/phases/code_generation_phase.py +480 -0
- will/phases/execution_phase.py +179 -0
- will/phases/interpret_phase.py +266 -0
- will/phases/load_phase.py +102 -0
- will/phases/parse_phase.py +117 -0
- will/phases/planning_phase.py +182 -0
- will/phases/runtime_phase.py +112 -0
- will/phases/sandbox_validation_phase.py +130 -0
- will/phases/style_check_phase.py +209 -0
- will/phases/test_generation_phase.py +159 -0
- will/self_healing/alignment/persistence.py +53 -0
- will/self_healing/alignment/sandbox.py +51 -0
- will/self_healing/alignment/specialists.py +165 -0
- will/self_healing/alignment_orchestrator.py +140 -0
- will/self_healing/audit_remediation_service.py +199 -0
- will/self_healing/batch_remediation_service.py +280 -0
- will/self_healing/capability_reconciliation_service.py +96 -0
- will/self_healing/capability_tagging_service.py +224 -0
- will/self_healing/clarity_service.py +204 -0
- will/self_healing/complexity_service.py +260 -0
- will/self_healing/context_aware_test_generator.py +298 -0
- will/self_healing/coverage_remediation_service.py +97 -0
- will/self_healing/coverage_watcher.py +192 -0
- will/self_healing/enrichment_service.py +211 -0
- will/self_healing/linelength_service.py +168 -0
- will/self_healing/modularity_remediation_service.py +203 -0
- will/self_healing/remediation_evidence_writer.py +144 -0
- will/self_healing/remediation_executor.py +113 -0
- will/self_healing/remediation_interpretation/__init__.py +1 -0
- will/self_healing/remediation_interpretation/file_context_assembler.py +383 -0
- will/self_healing/remediation_interpretation/file_role_detector.py +599 -0
- will/self_healing/remediation_interpretation/finding_normalizer.py +221 -0
- will/self_healing/remediation_interpretation/models.py +198 -0
- will/self_healing/remediation_interpretation/reasoning_brief_builder.py +235 -0
- will/self_healing/remediation_interpretation/responsibility_extractor.py +421 -0
- will/self_healing/remediation_interpretation/service.py +202 -0
- will/self_healing/remediation_interpretation/strategy_catalog.py +252 -0
- will/self_healing/remediation_interpretation/strategy_selector.py +395 -0
- will/self_healing/remediation_pattern_matcher.py +126 -0
- will/self_healing/simple_test_generator.py +252 -0
- will/self_healing/single_file_remediation.py +137 -0
- will/self_healing/test_generation/automatic_repair.py +377 -0
- will/self_healing/test_generation/code_extractor.py +238 -0
- will/self_healing/test_generation/context_builder.py +140 -0
- will/self_healing/test_generation/executor.py +64 -0
- will/self_healing/test_generation/failure_parser.py +37 -0
- will/self_healing/test_generation/generation_workflow.py +140 -0
- will/self_healing/test_generation/generator.py +283 -0
- will/self_healing/test_generation/llm_correction.py +160 -0
- will/self_healing/test_generation/repair_workflow.py +128 -0
- will/self_healing/test_generation/single_test_fixer.py +77 -0
- will/self_healing/test_generation/test_extractor.py +50 -0
- will/self_healing/test_generation/test_scorer.py +53 -0
- will/self_healing/test_generation/test_validator.py +64 -0
- will/self_healing/test_generator.py +12 -0
- will/strategists/__init__.py +46 -0
- will/strategists/base_strategist.py +29 -0
- will/strategists/clarity_strategist.py +55 -0
- will/strategists/complexity_strategist.py +55 -0
- will/strategists/fix_strategist.py +467 -0
- will/strategists/sync_strategist.py +369 -0
- will/strategists/test_strategist.py +140 -0
- will/strategists/validation_strategist.py +315 -0
- will/test_generation/__init__.py +46 -0
- will/test_generation/adaptive_test_generator.py +123 -0
- will/test_generation/artifacts.py +102 -0
- will/test_generation/harness_detection.py +103 -0
- will/test_generation/helpers/__init__.py +14 -0
- will/test_generation/helpers/context_extractor.py +100 -0
- will/test_generation/helpers/test_executor.py +230 -0
- will/test_generation/llm_output.py +62 -0
- will/test_generation/models.py +25 -0
- will/test_generation/persistence.py +248 -0
- will/test_generation/phases/__init__.py +16 -0
- will/test_generation/phases/generation_phase.py +150 -0
- will/test_generation/phases/load_phase.py +53 -0
- will/test_generation/phases/parse_phase.py +50 -0
- will/test_generation/prompt_engine.py +123 -0
- will/test_generation/result_aggregator.py +73 -0
- will/test_generation/sandbox.py +203 -0
- will/test_generation/strategy_link.py +56 -0
- will/test_generation/test_extractor.py +140 -0
- will/test_generation/validation.py +89 -0
- will/tools/__init__.py +13 -0
- will/tools/anchor_builder.py +111 -0
- will/tools/anchor_search.py +73 -0
- will/tools/anchors/discovery.py +55 -0
- will/tools/anchors/storage.py +32 -0
- will/tools/architectural_context_builder.py +94 -0
- will/tools/cognitive_toolbox.py +47 -0
- will/tools/context/code_snippet_extractor.py +83 -0
- will/tools/context/embedding_search.py +76 -0
- will/tools/context/formatter.py +87 -0
- will/tools/context/models.py +38 -0
- will/tools/context/query_builder.py +42 -0
- will/tools/context/retriever.py +182 -0
- will/tools/context/standards.py +53 -0
- will/tools/file_navigator.py +180 -0
- will/tools/layers.py +31 -0
- will/tools/module_anchor_generator.py +137 -0
- will/tools/module_descriptor.py +154 -0
- will/tools/policy_vectorizer.py +184 -0
- will/tools/symbol_finder.py +188 -0
- will/tools/tool_generator.py +103 -0
- will/workers/audit_ingest_worker.py +207 -0
- will/workers/audit_violation_filter.py +108 -0
- will/workers/audit_violation_normalizer.py +108 -0
- will/workers/audit_violation_sensor.py +370 -0
- will/workers/blackboard_shop_manager.py +280 -0
- will/workers/capability_tagger.py +153 -0
- will/workers/circuit_breaker.py +335 -0
- will/workers/coherence_sensor.py +212 -0
- will/workers/commit_reachability_auditor.py +135 -0
- will/workers/db_sync_worker.py +96 -0
- will/workers/governance_embedding/__init__.py +9 -0
- will/workers/governance_embedding/governance_embedder_worker.py +189 -0
- will/workers/intent_inspector.py +599 -0
- will/workers/observer_worker.py +158 -0
- will/workers/prompt_extractor_worker.py +241 -0
- will/workers/proposal_consumer_effects.py +216 -0
- will/workers/proposal_consumer_revival.py +131 -0
- will/workers/proposal_consumer_worker.py +271 -0
- will/workers/proposal_pipeline_shop_manager.py +273 -0
- will/workers/repo_crawler.py +171 -0
- will/workers/repo_embedding/__init__.py +18 -0
- will/workers/repo_embedding/helpers.py +245 -0
- will/workers/repo_embedding/repo_embedder_workers.py +163 -0
- will/workers/test_coverage_sensor.py +208 -0
- will/workers/test_remediator/__init__.py +12 -0
- will/workers/test_remediator/_operations.py +295 -0
- will/workers/test_remediator/worker.py +187 -0
- will/workers/test_runner_sensor.py +430 -0
- will/workers/violation_executor.py +496 -0
- will/workers/violation_remediator.py +394 -0
- will/workers/violation_remediator_blackboard.py +225 -0
- will/workers/violation_remediator_body/__init__.py +12 -0
- will/workers/violation_remediator_body/blackboard.py +139 -0
- will/workers/violation_remediator_body/ceremony.py +154 -0
- will/workers/violation_remediator_body/context.py +70 -0
- will/workers/violation_remediator_body/llm.py +112 -0
- will/workers/violation_remediator_body/models.py +35 -0
- will/workers/violation_remediator_body/worker.py +518 -0
- will/workers/violation_remediator_proposal.py +328 -0
- will/workers/worker_shop_manager.py +244 -0
- will/workflows/__init__.py +23 -0
- will/workflows/dev_sync_reporter.py +274 -0
- will/workflows/dev_sync_workflow.py +118 -0
api/v1/inspect_routes.py
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# src/api/v1/inspect_routes.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Inspect API endpoints (ADR-057 Phase 3, D3, D5).
|
|
5
|
+
|
|
6
|
+
Every endpoint here is read-only — no resource tables, no background
|
|
7
|
+
tasks. Endpoints live under six top-level namespaces (`/status`,
|
|
8
|
+
`/decisions`, `/refusals`, `/analysis`, `/components`, `/search`) so the
|
|
9
|
+
API surface mirrors the CLI command groups one-to-one. All six routers
|
|
10
|
+
are mounted under the `Inspect` OpenAPI tag — `inspect` is the logical
|
|
11
|
+
namespace name, not a URL prefix (per ADR-053 D4 amendment 2026-05-18).
|
|
12
|
+
|
|
13
|
+
CONSTITUTIONAL:
|
|
14
|
+
- Session access via api.dependencies.get_api_session only.
|
|
15
|
+
- CoreContext is read from request.app.state.core_context.
|
|
16
|
+
- body.* repositories / mind.* engines / will.* services are reached
|
|
17
|
+
through the will.governance.inspect_runner facade — no direct
|
|
18
|
+
imports here (architecture.api.no_body_bypass).
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from fastapi import APIRouter, Depends, Query, Request
|
|
24
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
25
|
+
|
|
26
|
+
from api.dependencies import get_api_session
|
|
27
|
+
from shared.context import CoreContext
|
|
28
|
+
from shared.logger import getLogger
|
|
29
|
+
from will.governance.inspect_runner import (
|
|
30
|
+
get_analysis_clusters,
|
|
31
|
+
get_analysis_command_tree,
|
|
32
|
+
get_analysis_common_knowledge,
|
|
33
|
+
get_analysis_duplicates,
|
|
34
|
+
get_analysis_test_targets,
|
|
35
|
+
get_components_list,
|
|
36
|
+
get_db_status,
|
|
37
|
+
get_decisions,
|
|
38
|
+
get_decisions_patterns,
|
|
39
|
+
get_drift_status,
|
|
40
|
+
get_refusals,
|
|
41
|
+
get_refusals_stats,
|
|
42
|
+
get_search_capabilities,
|
|
43
|
+
get_search_commands,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
logger = getLogger(__name__)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
# Each top-level namespace gets its own router. They are mounted together
|
|
51
|
+
# in api/main.py so the URL prefixes are preserved verbatim.
|
|
52
|
+
status_router = APIRouter(prefix="/status")
|
|
53
|
+
decisions_router = APIRouter(prefix="/decisions")
|
|
54
|
+
refusals_router = APIRouter(prefix="/refusals")
|
|
55
|
+
analysis_router = APIRouter(prefix="/analysis")
|
|
56
|
+
components_router = APIRouter(prefix="/components")
|
|
57
|
+
search_router = APIRouter(prefix="/search")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
# ---------- /status ------------------------------------------------------
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@status_router.get("/db")
|
|
64
|
+
# ID: 1c5d7e3f-4a6b-4c8d-9e0f-1a2b3c4d5e61
|
|
65
|
+
async def status_db(session: AsyncSession = Depends(get_api_session)) -> dict:
|
|
66
|
+
"""Return DB connection and schema state."""
|
|
67
|
+
return await get_db_status(session)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@status_router.get("/drift")
|
|
71
|
+
# ID: 2d6e8f4a-5b7c-4d9e-0f1a-2b3c4d5e6f72
|
|
72
|
+
async def status_drift(
|
|
73
|
+
request: Request,
|
|
74
|
+
scope: str = Query(default="all"),
|
|
75
|
+
) -> dict:
|
|
76
|
+
"""Return consolidated drift snapshot for symbols and/or vectors."""
|
|
77
|
+
core_context: CoreContext = request.app.state.core_context
|
|
78
|
+
return await get_drift_status(core_context, scope=scope)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
# ---------- /decisions ---------------------------------------------------
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@decisions_router.get("")
|
|
85
|
+
# ID: 3e7f9a5b-6c8d-4e0f-1a2b-3c4d5e6f7a83
|
|
86
|
+
async def decisions_list(
|
|
87
|
+
session_id: str | None = Query(default=None),
|
|
88
|
+
agent: str | None = Query(default=None),
|
|
89
|
+
pattern: str | None = Query(default=None),
|
|
90
|
+
limit: int = Query(default=50, ge=1, le=500),
|
|
91
|
+
) -> dict:
|
|
92
|
+
"""Return recent decision traces with optional filters."""
|
|
93
|
+
return await get_decisions(
|
|
94
|
+
session_id=session_id,
|
|
95
|
+
agent=agent,
|
|
96
|
+
pattern=pattern,
|
|
97
|
+
limit=limit,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
@decisions_router.get("/patterns")
|
|
102
|
+
# ID: 4f8a0b6c-7d9e-4f1a-2b3c-4d5e6f7a8b94
|
|
103
|
+
async def decisions_patterns(
|
|
104
|
+
days: int = Query(default=7, ge=1, le=365),
|
|
105
|
+
) -> dict:
|
|
106
|
+
"""Return pattern classification stats across the lookback window."""
|
|
107
|
+
return await get_decisions_patterns(days=days)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
# ---------- /refusals ----------------------------------------------------
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
@refusals_router.get("")
|
|
114
|
+
# ID: 5a9b1c7d-8e0f-4a2b-3c4d-5e6f7a8b9ca5
|
|
115
|
+
async def refusals_list(
|
|
116
|
+
refusal_type: str | None = Query(default=None, alias="type"),
|
|
117
|
+
session_id: str | None = Query(default=None, alias="session"),
|
|
118
|
+
limit: int = Query(default=50, ge=1, le=500),
|
|
119
|
+
) -> dict:
|
|
120
|
+
"""Return recent constitutional refusal records."""
|
|
121
|
+
return await get_refusals(
|
|
122
|
+
refusal_type=refusal_type,
|
|
123
|
+
session_id=session_id,
|
|
124
|
+
limit=limit,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
@refusals_router.get("/stats")
|
|
129
|
+
# ID: 6b0c2d8e-9f1a-4b3c-4d5e-6f7a8b9c0db6
|
|
130
|
+
async def refusals_stats(
|
|
131
|
+
days: int = Query(default=7, ge=1, le=365),
|
|
132
|
+
) -> dict:
|
|
133
|
+
"""Return refusal statistics grouped by type."""
|
|
134
|
+
return await get_refusals_stats(days=days)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
# ---------- /analysis ----------------------------------------------------
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@analysis_router.get("/clusters")
|
|
141
|
+
# ID: 7c1d3e9f-0a2b-4c4d-5e6f-7a8b9c0d1ec7
|
|
142
|
+
async def analysis_clusters(
|
|
143
|
+
limit: int = Query(default=25, ge=1, le=200),
|
|
144
|
+
) -> dict:
|
|
145
|
+
"""Return semantic capability clusters."""
|
|
146
|
+
return await get_analysis_clusters(limit=limit)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
@analysis_router.get("/duplicates")
|
|
150
|
+
# ID: 8d2e4f0a-1b3c-4d5e-6f7a-8b9c0d1e2fd8
|
|
151
|
+
async def analysis_duplicates(
|
|
152
|
+
request: Request,
|
|
153
|
+
threshold: float = Query(default=0.85, ge=0.0, le=1.0),
|
|
154
|
+
) -> dict:
|
|
155
|
+
"""Return semantic code duplication candidates."""
|
|
156
|
+
core_context: CoreContext = request.app.state.core_context
|
|
157
|
+
return await get_analysis_duplicates(core_context, threshold=threshold)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
@analysis_router.get("/common-knowledge")
|
|
161
|
+
# ID: 9e3f5a1b-2c4d-4e6f-7a8b-9c0d1e2f3ae9
|
|
162
|
+
async def analysis_common_knowledge(
|
|
163
|
+
limit: int = Query(default=25, ge=1, le=200),
|
|
164
|
+
) -> dict:
|
|
165
|
+
"""Return DRY-violation candidates."""
|
|
166
|
+
return await get_analysis_common_knowledge(limit=limit)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
@analysis_router.get("/command-tree")
|
|
170
|
+
# ID: 0f4a6b2c-3d5e-4f7a-8b9c-0d1e2f3a4bf0
|
|
171
|
+
async def analysis_command_tree(request: Request) -> dict:
|
|
172
|
+
"""Return the introspected CLI command hierarchy."""
|
|
173
|
+
core_context: CoreContext = request.app.state.core_context
|
|
174
|
+
return get_analysis_command_tree(core_context)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
@analysis_router.get("/test-targets")
|
|
178
|
+
# ID: 1a5b7c3d-4e6f-4a8b-9c0d-1e2f3a4b5ce1
|
|
179
|
+
async def analysis_test_targets(request: Request) -> dict:
|
|
180
|
+
"""Return SIMPLE / COMPLEX classification for in-scope source files."""
|
|
181
|
+
core_context: CoreContext = request.app.state.core_context
|
|
182
|
+
return get_analysis_test_targets(core_context)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
# ---------- /components --------------------------------------------------
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
@components_router.get("")
|
|
189
|
+
# ID: 3b094d1e-e473-4044-9f46-16f6870f3946
|
|
190
|
+
async def components_list(
|
|
191
|
+
filter_type: str | None = Query(default=None, alias="type"),
|
|
192
|
+
) -> dict:
|
|
193
|
+
"""Return the registered V2 component inventory across Mind/Body/Will."""
|
|
194
|
+
return get_components_list(filter_type=filter_type)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
# ---------- /search ------------------------------------------------------
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
@search_router.get("/capabilities")
|
|
201
|
+
# ID: 08ac8c57-ef92-4142-bf90-ba57bb0c6ce4
|
|
202
|
+
async def search_capabilities(
|
|
203
|
+
request: Request,
|
|
204
|
+
q: str = Query(..., min_length=1),
|
|
205
|
+
limit: int = Query(default=10, ge=1, le=200),
|
|
206
|
+
) -> dict:
|
|
207
|
+
"""Semantic capability search via the Will cognitive service."""
|
|
208
|
+
core_context: CoreContext = request.app.state.core_context
|
|
209
|
+
return await get_search_capabilities(core_context, q=q, limit=limit)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
@search_router.get("/commands")
|
|
213
|
+
# ID: 5c26c235-e80d-4da5-a942-f027fa7a087a
|
|
214
|
+
async def search_commands(
|
|
215
|
+
q: str = Query(..., min_length=1),
|
|
216
|
+
limit: int = Query(default=25, ge=1, le=200),
|
|
217
|
+
session: AsyncSession = Depends(get_api_session),
|
|
218
|
+
) -> dict:
|
|
219
|
+
"""Fuzzy substring search over the CLI command registry (ADR-057 D5)."""
|
|
220
|
+
return await get_search_commands(session, q=q, limit=limit)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# src/api/v1/integration_routes.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Integration API endpoint (ADR-054 Phase 1).
|
|
5
|
+
|
|
6
|
+
POST /v1/integrate stages, formats, lints, and commits the working
|
|
7
|
+
tree via will.lifecycle.integration_runner. Long-running but
|
|
8
|
+
synchronous from the caller's perspective — there is no run-id to
|
|
9
|
+
poll, so the CLI just awaits the response.
|
|
10
|
+
|
|
11
|
+
CONSTITUTIONAL:
|
|
12
|
+
- mind.* / body.* / shared.infrastructure.* are not imported here.
|
|
13
|
+
All work is delegated through will.lifecycle.integration_runner.
|
|
14
|
+
- CoreContext comes from request.app.state.core_context.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from fastapi import APIRouter, HTTPException, Request
|
|
20
|
+
from pydantic import BaseModel
|
|
21
|
+
|
|
22
|
+
from shared.context import CoreContext
|
|
23
|
+
from shared.logger import getLogger
|
|
24
|
+
from will.lifecycle.integration_runner import run_integration
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
logger = getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
router = APIRouter(prefix="/integrate")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# ID: fd724178-3586-48bb-a519-280de29821a3
|
|
34
|
+
class IntegrateRequest(BaseModel):
|
|
35
|
+
"""Body for POST /integrate."""
|
|
36
|
+
|
|
37
|
+
commit_message: str
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@router.post("")
|
|
41
|
+
# ID: 578732cb-c976-4577-a6ef-3024e24d9833
|
|
42
|
+
async def integrate(
|
|
43
|
+
payload: IntegrateRequest,
|
|
44
|
+
request: Request,
|
|
45
|
+
) -> dict:
|
|
46
|
+
"""Run the integration workflow (stage → format/lint → commit).
|
|
47
|
+
|
|
48
|
+
Returns 200 on success. Translates a failed workflow into a 502
|
|
49
|
+
so the CLI can render a clear error; the underlying exit_code is
|
|
50
|
+
surfaced in the detail object.
|
|
51
|
+
"""
|
|
52
|
+
core_context: CoreContext = request.app.state.core_context
|
|
53
|
+
result = await run_integration(core_context, payload.commit_message)
|
|
54
|
+
if not result["ok"]:
|
|
55
|
+
raise HTTPException(status_code=502, detail=result)
|
|
56
|
+
return result
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# src/api/v1/integrity_routes.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Integrity API endpoints (ADR-055 D6 follow-up — closes #353).
|
|
5
|
+
|
|
6
|
+
Two synchronous endpoints, both filesystem-only:
|
|
7
|
+
|
|
8
|
+
* POST /integrity/baseline — SHA256-fingerprint src/ and write a
|
|
9
|
+
baseline manifest under var/integrity/. Returns the relative
|
|
10
|
+
manifest path and file count.
|
|
11
|
+
* POST /integrity/verify — diff current src/ against a saved
|
|
12
|
+
baseline. Returns ok / errors / checked_at.
|
|
13
|
+
|
|
14
|
+
No core.integrity_runs persistence, no BackgroundTasks — operations
|
|
15
|
+
are fast (single-digit seconds) and self-contained. Closest precedent
|
|
16
|
+
is POST /fix/ir (also synchronous, also no persistence).
|
|
17
|
+
|
|
18
|
+
CONSTITUTIONAL:
|
|
19
|
+
- CoreContext is read from request.app.state.core_context.
|
|
20
|
+
- shared.infrastructure.* is reached through the
|
|
21
|
+
will.governance.integrity_runner facade — no direct imports here.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
from fastapi import APIRouter, Body, Request
|
|
27
|
+
from pydantic import BaseModel
|
|
28
|
+
|
|
29
|
+
from shared.context import CoreContext
|
|
30
|
+
from shared.logger import getLogger
|
|
31
|
+
from will.governance.integrity_runner import (
|
|
32
|
+
create_baseline,
|
|
33
|
+
verify_integrity,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
logger = getLogger(__name__)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
router = APIRouter(prefix="/integrity")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# ID: f3564baa-a7fb-4c21-a12d-25e06b416ea6
|
|
44
|
+
class IntegrityRequest(BaseModel):
|
|
45
|
+
"""Body for POST /integrity/baseline and POST /integrity/verify.
|
|
46
|
+
|
|
47
|
+
Empty body is valid and equivalent to label='default'.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
label: str = "default"
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@router.post("/baseline")
|
|
54
|
+
# ID: d93ed634-a710-4e61-ad28-88a5a35e1a0d
|
|
55
|
+
async def integrity_baseline(
|
|
56
|
+
request: Request,
|
|
57
|
+
payload: IntegrityRequest = Body(default_factory=IntegrityRequest),
|
|
58
|
+
) -> dict:
|
|
59
|
+
"""Create a SHA256 baseline of src/ and return path + file count."""
|
|
60
|
+
core_context: CoreContext = request.app.state.core_context
|
|
61
|
+
return create_baseline(core_context, payload.label)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@router.post("/verify")
|
|
65
|
+
# ID: 804f2a54-a7c5-4900-afe2-f43e6702a6ee
|
|
66
|
+
async def integrity_verify(
|
|
67
|
+
request: Request,
|
|
68
|
+
payload: IntegrityRequest = Body(default_factory=IntegrityRequest),
|
|
69
|
+
) -> dict:
|
|
70
|
+
"""Verify src/ against the named baseline and return ok / errors."""
|
|
71
|
+
core_context: CoreContext = request.app.state.core_context
|
|
72
|
+
return verify_integrity(core_context, payload.label)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# src/api/v1/knowledge_routes.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Knowledge API endpoints.
|
|
5
|
+
|
|
6
|
+
CONSTITUTIONAL FIX (architecture.api.no_direct_database_access):
|
|
7
|
+
Session dependency now routes through api.dependencies — the single
|
|
8
|
+
sanctioned provider for the API layer.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from fastapi import APIRouter, Depends
|
|
14
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
15
|
+
|
|
16
|
+
from api.dependencies import get_api_session
|
|
17
|
+
from shared.infrastructure.knowledge.knowledge_service import KnowledgeService
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
router = APIRouter(prefix="/knowledge")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@router.get("/capabilities")
|
|
24
|
+
# ID: 0016df93-d0e5-45b0-b5b8-8f4170de3d9d
|
|
25
|
+
async def list_capabilities(
|
|
26
|
+
session: AsyncSession = Depends(get_api_session),
|
|
27
|
+
) -> dict:
|
|
28
|
+
"""
|
|
29
|
+
Return known capabilities.
|
|
30
|
+
|
|
31
|
+
Tests expect a 200 on GET /v1/knowledge/capabilities and a JSON object
|
|
32
|
+
with a 'capabilities' key.
|
|
33
|
+
"""
|
|
34
|
+
service = KnowledgeService(session=session)
|
|
35
|
+
caps = await service.list_capabilities()
|
|
36
|
+
return {"capabilities": caps}
|
api/v1/lint_routes.py
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# src/api/v1/lint_routes.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Lint API endpoint (ADR-054 Phase 1).
|
|
5
|
+
|
|
6
|
+
POST /v1/lint runs `black --check` + `ruff check` against src/ and
|
|
7
|
+
tests/ via will.governance.lint_runner. The response always carries
|
|
8
|
+
per-tool stdout/stderr so the CLI can render the actual findings
|
|
9
|
+
even when the workflow reports non-zero.
|
|
10
|
+
|
|
11
|
+
CONSTITUTIONAL: no mind.* / body.* / shared.infrastructure.* imports
|
|
12
|
+
here; the lint subprocess work lives behind a Will facade.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from fastapi import APIRouter
|
|
18
|
+
|
|
19
|
+
from shared.logger import getLogger
|
|
20
|
+
from will.governance.lint_runner import run_lint
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
logger = getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
router = APIRouter(prefix="/lint")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@router.post("")
|
|
30
|
+
# ID: 923355cf-ad6d-446a-865f-539025a11428
|
|
31
|
+
async def lint_endpoint() -> dict:
|
|
32
|
+
"""Run black --check and ruff check on src/ and tests/.
|
|
33
|
+
|
|
34
|
+
Returns 200 with the structured result regardless of pass/fail —
|
|
35
|
+
the response's `ok` field carries the verdict, and `tools.*` carry
|
|
36
|
+
per-tool returncodes and captured output. This avoids the
|
|
37
|
+
"lint findings = HTTP error" anti-pattern; a clean lint and a
|
|
38
|
+
dirty lint are both successful API calls.
|
|
39
|
+
"""
|
|
40
|
+
return await run_lint()
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# src/api/v1/proposals_routes.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Proposals API endpoints (ADR-054 Phase 1).
|
|
5
|
+
|
|
6
|
+
Surfaces the core.autonomous_proposals state machine over HTTP so the
|
|
7
|
+
CLI (and other governor-direct clients) can migrate off direct
|
|
8
|
+
`will.*` / `shared.*` imports. The semantics — approval authority
|
|
9
|
+
closed-set, claim sentinel, dry-run vs write — are unchanged from the
|
|
10
|
+
CLI path; this module is a thin translation layer over
|
|
11
|
+
ProposalService and ProposalExecutor.
|
|
12
|
+
|
|
13
|
+
CONSTITUTIONAL:
|
|
14
|
+
- Session access goes through api.dependencies.get_api_session only.
|
|
15
|
+
- ProposalService is the facade; ProposalRepository and
|
|
16
|
+
ProposalStateManager are not imported here.
|
|
17
|
+
- CoreContext is read from request.app.state.core_context — never
|
|
18
|
+
constructed in routes.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from typing import Final
|
|
24
|
+
from uuid import UUID
|
|
25
|
+
|
|
26
|
+
from fastapi import APIRouter, Depends, HTTPException, Query, Request
|
|
27
|
+
from pydantic import BaseModel
|
|
28
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
29
|
+
|
|
30
|
+
from api.dependencies import get_api_session
|
|
31
|
+
from shared.context import CoreContext
|
|
32
|
+
from shared.logger import getLogger
|
|
33
|
+
from will.autonomy.proposal import (
|
|
34
|
+
Proposal,
|
|
35
|
+
ProposalAction,
|
|
36
|
+
ProposalScope,
|
|
37
|
+
ProposalStatus,
|
|
38
|
+
)
|
|
39
|
+
from will.autonomy.proposal_executor import ProposalExecutor
|
|
40
|
+
from will.autonomy.proposal_service import ProposalService
|
|
41
|
+
from will.autonomy.proposal_state_manager import ProposalNotFoundError
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
logger = getLogger(__name__)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# API claimer sentinel — distinct from CLI_CLAIMER_UUID
|
|
48
|
+
# (cli/resources/proposals/manage.py uses ...0001). Mirrors the ADR-017
|
|
49
|
+
# D4 pattern: governor-direct execution paths get a stable sentinel so
|
|
50
|
+
# claimed_by lineage is queryable per surface.
|
|
51
|
+
API_CLAIMER_UUID: Final[UUID] = UUID("00000000-0000-0000-0000-000000000002")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
router = APIRouter(prefix="/proposals")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# ID: 5103629b-96d2-4c2c-8217-df99555ed221
|
|
58
|
+
class ApproveRequest(BaseModel):
|
|
59
|
+
"""Body for POST /proposals/{id}/approve."""
|
|
60
|
+
|
|
61
|
+
approved_by: str
|
|
62
|
+
approval_authority: str
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# ID: 3a74ddce-87c2-4528-a2f4-5ec68d171ea0
|
|
66
|
+
class RejectRequest(BaseModel):
|
|
67
|
+
"""Body for POST /proposals/{id}/reject."""
|
|
68
|
+
|
|
69
|
+
reason: str
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
# ID: 57020012-ad90-461f-98d3-50f565b65294
|
|
73
|
+
class ExecuteRequest(BaseModel):
|
|
74
|
+
"""Body for POST /proposals/{id}/execute."""
|
|
75
|
+
|
|
76
|
+
write: bool = False
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# ID: 71caa34a-1661-4178-b982-626bff254539
|
|
80
|
+
class CreateProposalRequest(BaseModel):
|
|
81
|
+
"""Body for POST /proposals.
|
|
82
|
+
|
|
83
|
+
`write=False` is a dry-run: server builds the Proposal and computes
|
|
84
|
+
risk but does not persist. `write=True` persists via
|
|
85
|
+
ProposalService.create.
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
goal: str
|
|
89
|
+
actions: list[dict] = []
|
|
90
|
+
files: list[str] = []
|
|
91
|
+
created_by: str = "cli_operator"
|
|
92
|
+
write: bool = True
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@router.post("", status_code=201)
|
|
96
|
+
# ID: 9704145a-25f5-460c-81a9-fe1fa0b47d68
|
|
97
|
+
async def create_proposal(
|
|
98
|
+
payload: CreateProposalRequest,
|
|
99
|
+
session: AsyncSession = Depends(get_api_session),
|
|
100
|
+
) -> dict:
|
|
101
|
+
"""Create a new proposal.
|
|
102
|
+
|
|
103
|
+
Validates the action sequence, computes risk, and (when write=True)
|
|
104
|
+
persists via ProposalService.create. Returns the proposal's
|
|
105
|
+
`to_dict()` representation either way; in dry-run mode the row
|
|
106
|
+
is not flushed to the database.
|
|
107
|
+
"""
|
|
108
|
+
proposal_actions = [
|
|
109
|
+
ProposalAction(
|
|
110
|
+
action_id=a.get("action_id"),
|
|
111
|
+
flow_id=a.get("flow_id"),
|
|
112
|
+
parameters=a.get("parameters", {}),
|
|
113
|
+
order=a.get("order", i),
|
|
114
|
+
)
|
|
115
|
+
for i, a in enumerate(payload.actions)
|
|
116
|
+
]
|
|
117
|
+
proposal = Proposal(
|
|
118
|
+
goal=payload.goal,
|
|
119
|
+
actions=proposal_actions,
|
|
120
|
+
scope=ProposalScope(files=payload.files),
|
|
121
|
+
created_by=payload.created_by,
|
|
122
|
+
)
|
|
123
|
+
proposal.compute_risk()
|
|
124
|
+
|
|
125
|
+
if payload.write:
|
|
126
|
+
service = ProposalService(session)
|
|
127
|
+
await service.create(proposal)
|
|
128
|
+
await session.commit()
|
|
129
|
+
|
|
130
|
+
return {
|
|
131
|
+
"ok": True,
|
|
132
|
+
"persisted": payload.write,
|
|
133
|
+
"proposal": proposal.to_dict(),
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
@router.get("")
|
|
138
|
+
# ID: b6575d68-b902-4071-8497-76b053430fec
|
|
139
|
+
async def list_proposals(
|
|
140
|
+
status: str | None = Query(None, description="ProposalStatus value to filter by."),
|
|
141
|
+
limit: int = Query(50, ge=1),
|
|
142
|
+
session: AsyncSession = Depends(get_api_session),
|
|
143
|
+
) -> dict:
|
|
144
|
+
"""List proposals, optionally filtered by status.
|
|
145
|
+
|
|
146
|
+
When `status` is omitted, returns proposals awaiting approval.
|
|
147
|
+
"""
|
|
148
|
+
service = ProposalService(session)
|
|
149
|
+
|
|
150
|
+
if status is None:
|
|
151
|
+
proposals = await service.list_pending_approval(limit=limit)
|
|
152
|
+
else:
|
|
153
|
+
try:
|
|
154
|
+
parsed = ProposalStatus(status)
|
|
155
|
+
except ValueError as exc:
|
|
156
|
+
raise HTTPException(
|
|
157
|
+
status_code=400,
|
|
158
|
+
detail=(
|
|
159
|
+
f"Invalid status {status!r}; allowed: "
|
|
160
|
+
f"{[s.value for s in ProposalStatus]}"
|
|
161
|
+
),
|
|
162
|
+
) from exc
|
|
163
|
+
proposals = await service.list_by_status(parsed, limit=limit)
|
|
164
|
+
|
|
165
|
+
return {
|
|
166
|
+
"count": len(proposals),
|
|
167
|
+
"proposals": [p.to_dict() for p in proposals],
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
@router.get("/{proposal_id}")
|
|
172
|
+
# ID: f99b7ebf-5664-4642-9ac0-500b2fa56216
|
|
173
|
+
async def get_proposal(
|
|
174
|
+
proposal_id: str,
|
|
175
|
+
session: AsyncSession = Depends(get_api_session),
|
|
176
|
+
) -> dict:
|
|
177
|
+
"""Return a single proposal by id."""
|
|
178
|
+
service = ProposalService(session)
|
|
179
|
+
proposal = await service.get(proposal_id)
|
|
180
|
+
if proposal is None:
|
|
181
|
+
raise HTTPException(
|
|
182
|
+
status_code=404,
|
|
183
|
+
detail=f"Proposal not found: {proposal_id}",
|
|
184
|
+
)
|
|
185
|
+
return proposal.to_dict()
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
@router.post("/{proposal_id}/approve")
|
|
189
|
+
# ID: 499722f9-8c4c-4d04-99b2-aed56329c592
|
|
190
|
+
async def approve_proposal(
|
|
191
|
+
proposal_id: str,
|
|
192
|
+
payload: ApproveRequest,
|
|
193
|
+
session: AsyncSession = Depends(get_api_session),
|
|
194
|
+
) -> dict:
|
|
195
|
+
"""Approve a pending proposal.
|
|
196
|
+
|
|
197
|
+
`approval_authority` is non-omittable per URS NFR.5 and validated
|
|
198
|
+
against the proposal_approval_authority closed set inside
|
|
199
|
+
ProposalStateManager.approve.
|
|
200
|
+
"""
|
|
201
|
+
service = ProposalService(session)
|
|
202
|
+
try:
|
|
203
|
+
await service.approve(
|
|
204
|
+
proposal_id,
|
|
205
|
+
approved_by=payload.approved_by,
|
|
206
|
+
approval_authority=payload.approval_authority,
|
|
207
|
+
)
|
|
208
|
+
except ProposalNotFoundError as exc:
|
|
209
|
+
raise HTTPException(status_code=404, detail=str(exc)) from exc
|
|
210
|
+
except ValueError as exc:
|
|
211
|
+
raise HTTPException(status_code=400, detail=str(exc)) from exc
|
|
212
|
+
|
|
213
|
+
return {
|
|
214
|
+
"ok": True,
|
|
215
|
+
"proposal_id": proposal_id,
|
|
216
|
+
"status": ProposalStatus.APPROVED.value,
|
|
217
|
+
"approved_by": payload.approved_by,
|
|
218
|
+
"approval_authority": payload.approval_authority,
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
@router.post("/{proposal_id}/reject")
|
|
223
|
+
# ID: 5c3091dd-b88f-4ebf-8de5-285f24f90ef8
|
|
224
|
+
async def reject_proposal(
|
|
225
|
+
proposal_id: str,
|
|
226
|
+
payload: RejectRequest,
|
|
227
|
+
session: AsyncSession = Depends(get_api_session),
|
|
228
|
+
) -> dict:
|
|
229
|
+
"""Reject a proposal with a reason.
|
|
230
|
+
|
|
231
|
+
Per ADR-010 §7a, rejection is symmetric with mark_failed: findings
|
|
232
|
+
parked at deferred_to_proposal must be revived so they reach the
|
|
233
|
+
audit sensor for re-adjudication, otherwise they strand. Revival
|
|
234
|
+
flips them to awaiting_reaudit per ADR-045; the AuditViolationSensor
|
|
235
|
+
decides on the next cycle whether to release to 'open' or resolve.
|
|
236
|
+
"""
|
|
237
|
+
service = ProposalService(session)
|
|
238
|
+
try:
|
|
239
|
+
revived_count = await service.reject(proposal_id, reason=payload.reason)
|
|
240
|
+
except ProposalNotFoundError as exc:
|
|
241
|
+
raise HTTPException(status_code=404, detail=str(exc)) from exc
|
|
242
|
+
|
|
243
|
+
return {
|
|
244
|
+
"ok": True,
|
|
245
|
+
"proposal_id": proposal_id,
|
|
246
|
+
"status": ProposalStatus.REJECTED.value,
|
|
247
|
+
"reason": payload.reason,
|
|
248
|
+
"revived_count": revived_count,
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
@router.post("/{proposal_id}/execute")
|
|
253
|
+
# ID: aaa55146-21cc-4945-bb2e-d0e083dfd6ff
|
|
254
|
+
async def execute_proposal(
|
|
255
|
+
proposal_id: str,
|
|
256
|
+
payload: ExecuteRequest,
|
|
257
|
+
request: Request,
|
|
258
|
+
) -> dict:
|
|
259
|
+
"""Execute an approved proposal (governor-direct override).
|
|
260
|
+
|
|
261
|
+
Defaults to dry-run; pass `{"write": true}` to apply changes.
|
|
262
|
+
ProposalExecutor manages its own session via service_registry, so
|
|
263
|
+
no get_api_session dependency is required here.
|
|
264
|
+
"""
|
|
265
|
+
core_context: CoreContext = request.app.state.core_context
|
|
266
|
+
executor = ProposalExecutor(core_context)
|
|
267
|
+
return await executor.execute(proposal_id, API_CLAIMER_UUID, write=payload.write)
|