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
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# src/will/agents/conversational/helpers.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Helper functions for ConversationalAgent.
|
|
5
|
+
Contains pure functions extracted from the main agent class.
|
|
6
|
+
|
|
7
|
+
V2 (v2.2.0): RequestInterpreter now handles intent parsing and keyword extraction.
|
|
8
|
+
These helpers focus on bridging TaskStructure → ContextBuilder and formatting.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from shared.infrastructure.intent.operational_config import load_operational_config
|
|
16
|
+
from shared.logger import getLogger
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
logger = getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
_CFG = load_operational_config().misc
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _build_llm_prompt(
|
|
25
|
+
user_message: str,
|
|
26
|
+
context_package: dict[str, Any],
|
|
27
|
+
format_context_items_func,
|
|
28
|
+
task_context: str = "",
|
|
29
|
+
) -> str:
|
|
30
|
+
"""
|
|
31
|
+
Build the prompt to send to the LLM.
|
|
32
|
+
|
|
33
|
+
Includes:
|
|
34
|
+
- System context about CORE
|
|
35
|
+
- Task interpretation metadata (if provided)
|
|
36
|
+
- The extracted context package
|
|
37
|
+
- The user's question
|
|
38
|
+
- Instructions for the LLM
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
user_message: Original user query
|
|
42
|
+
context_package: Minimal context from ContextBuilder
|
|
43
|
+
format_context_items_func: Function to format context items
|
|
44
|
+
task_context: Optional task interpretation metadata from RequestInterpreter
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
Complete prompt for LLM
|
|
48
|
+
"""
|
|
49
|
+
# Extract key info from context package
|
|
50
|
+
context_items = context_package.get("context", [])
|
|
51
|
+
num_items = len(context_items)
|
|
52
|
+
|
|
53
|
+
# Format context items for the LLM
|
|
54
|
+
formatted_context = format_context_items_func(context_items)
|
|
55
|
+
|
|
56
|
+
# Build prompt with optional task context
|
|
57
|
+
task_section = f"\n{task_context}\n" if task_context else ""
|
|
58
|
+
|
|
59
|
+
prompt = f"""You are CORE's conversational assistant, helping a developer understand their codebase.
|
|
60
|
+
|
|
61
|
+
The developer asked: "{user_message}"
|
|
62
|
+
{task_section}
|
|
63
|
+
I've extracted {num_items} relevant pieces of context from the codebase:
|
|
64
|
+
|
|
65
|
+
{formatted_context}
|
|
66
|
+
|
|
67
|
+
Please provide a clear, concise answer to their question based on this context.
|
|
68
|
+
|
|
69
|
+
Instructions:
|
|
70
|
+
- Focus on answering their specific question
|
|
71
|
+
- Use code examples from the context when helpful
|
|
72
|
+
- Be conversational and friendly
|
|
73
|
+
- If the context doesn't contain enough information, say so
|
|
74
|
+
- Keep your response under 500 words
|
|
75
|
+
|
|
76
|
+
Your response:"""
|
|
77
|
+
|
|
78
|
+
return prompt
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _format_context_items(items: list[dict[str, Any]]) -> str:
|
|
82
|
+
"""
|
|
83
|
+
Format context items into readable text for LLM.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
items: List of context items from ContextPackage
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
Formatted string representation with structure and code
|
|
90
|
+
"""
|
|
91
|
+
if not items:
|
|
92
|
+
return "(No specific context found - the question may be too general)"
|
|
93
|
+
|
|
94
|
+
formatted = []
|
|
95
|
+
for i, item in enumerate(items, 1):
|
|
96
|
+
name = item.get("name", "Unknown")
|
|
97
|
+
item_type = item.get("item_type", "unknown")
|
|
98
|
+
path = item.get("path", "")
|
|
99
|
+
summary = item.get("summary", "")
|
|
100
|
+
content = item.get("content", "")
|
|
101
|
+
|
|
102
|
+
formatted.append(f"--- Context Item {i}: {name} ({item_type}) ---")
|
|
103
|
+
if path:
|
|
104
|
+
formatted.append(f"Location: {path}")
|
|
105
|
+
if summary:
|
|
106
|
+
formatted.append(f"Summary: {summary}")
|
|
107
|
+
if content:
|
|
108
|
+
# Truncate very long content
|
|
109
|
+
if len(content) > _CFG.conversation_max_content_chars:
|
|
110
|
+
content = (
|
|
111
|
+
content[: _CFG.conversation_max_content_chars] + "\n... (truncated)"
|
|
112
|
+
)
|
|
113
|
+
formatted.append(f"Code:\n{content}")
|
|
114
|
+
formatted.append("") # Blank line between items
|
|
115
|
+
|
|
116
|
+
return "\n".join(formatted)
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
# src/will/agents/execution_agent.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
ExecutionAgent - The Contractor: Executes validated code blueprints.
|
|
5
|
+
|
|
6
|
+
Constitutional Role:
|
|
7
|
+
- Applies DetailedPlans created by the SpecificationAgent
|
|
8
|
+
- Enforces write-permission boundaries
|
|
9
|
+
- Returns what was written for audit trails
|
|
10
|
+
- Respects atomic actions for all mutations
|
|
11
|
+
|
|
12
|
+
PHASE 1 ENHANCEMENT:
|
|
13
|
+
- Now captures files_written during execution
|
|
14
|
+
- Enables crate extraction and post-execution inspection
|
|
15
|
+
- Provides source-of-truth for what changed
|
|
16
|
+
|
|
17
|
+
UNIX PHILOSOPHY ENHANCEMENT:
|
|
18
|
+
- Test generation failures don't block refactoring workflows
|
|
19
|
+
- Refactoring job: Make code modular (even if tests break)
|
|
20
|
+
- Testing job: Regenerate tests AFTER (separate workflow)
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import time
|
|
26
|
+
from typing import TYPE_CHECKING
|
|
27
|
+
|
|
28
|
+
from shared.action_types import ActionResult
|
|
29
|
+
from shared.logger import getLogger
|
|
30
|
+
from shared.models.workflow_models import DetailedPlan, ExecutionResults
|
|
31
|
+
from will.agents.traced_agent_mixin import TracedAgentMixin
|
|
32
|
+
from will.orchestration.decision_tracer import DecisionTracer
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
if TYPE_CHECKING:
|
|
36
|
+
from body.atomic.executor import ActionExecutor
|
|
37
|
+
|
|
38
|
+
logger = getLogger(__name__)
|
|
39
|
+
|
|
40
|
+
# Params that are meaningful only for file mutation actions.
|
|
41
|
+
# fix.* and sync.* actions operate repo-wide and must not receive these.
|
|
42
|
+
_FILE_SCOPED_PARAMS = frozenset(
|
|
43
|
+
{"file_path", "code", "symbol_name", "justification", "tag"}
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
# Action prefixes whose implementations do not accept file-scoped params.
|
|
47
|
+
_REPO_WIDE_PREFIXES = ("fix.", "sync.")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _params_to_dict(params) -> dict:
|
|
51
|
+
"""
|
|
52
|
+
Safely convert step params to a plain dict.
|
|
53
|
+
|
|
54
|
+
Handles both TaskParams (Pydantic model) and plain dicts — defensive
|
|
55
|
+
because DetailedPlanStep.params is typed as dict[str, Any] but the
|
|
56
|
+
pipeline may pass TaskParams objects.
|
|
57
|
+
"""
|
|
58
|
+
if params is None:
|
|
59
|
+
return {}
|
|
60
|
+
if hasattr(params, "model_dump"):
|
|
61
|
+
return params.model_dump(exclude_none=True)
|
|
62
|
+
if isinstance(params, dict):
|
|
63
|
+
return params
|
|
64
|
+
return {}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _strip_params_for_action(action_id: str, params_dict: dict) -> dict:
|
|
68
|
+
"""
|
|
69
|
+
Remove file-scoped params that repo-wide actions do not accept.
|
|
70
|
+
|
|
71
|
+
fix.* and sync.* actions (fix.imports, fix.format, sync.db, etc.)
|
|
72
|
+
operate on the whole repo and have no file_path parameter in their
|
|
73
|
+
signatures. Passing these causes a TypeError at invocation time.
|
|
74
|
+
"""
|
|
75
|
+
if any(action_id.startswith(prefix) for prefix in _REPO_WIDE_PREFIXES):
|
|
76
|
+
return {k: v for k, v in params_dict.items() if k not in _FILE_SCOPED_PARAMS}
|
|
77
|
+
return params_dict
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# ID: a1b2c3d4-e5f6-7890-abcd-ef0123456789
|
|
81
|
+
class ExecutionAgent(TracedAgentMixin):
|
|
82
|
+
"""
|
|
83
|
+
The Contractor: Executes validated code blueprints.
|
|
84
|
+
|
|
85
|
+
Skips steps that failed code generation and enforces
|
|
86
|
+
constitutional write-permission boundaries.
|
|
87
|
+
|
|
88
|
+
ENHANCED: Captures files_written for crate extraction.
|
|
89
|
+
|
|
90
|
+
UNIX PHILOSOPHY: Test failures are advisory during refactoring.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
def __init__(self, executor: ActionExecutor, write: bool = False):
|
|
94
|
+
"""
|
|
95
|
+
Initialize the ExecutionAgent.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
executor: The ActionExecutor (The Body's Gateway).
|
|
99
|
+
write: Whether to apply changes (True) or simulate (False).
|
|
100
|
+
"""
|
|
101
|
+
self.executor = executor
|
|
102
|
+
self.write = write
|
|
103
|
+
self.tracer = DecisionTracer()
|
|
104
|
+
|
|
105
|
+
logger.info(
|
|
106
|
+
"ExecutionAgent initialized (Contractor Mode: write=%s)", self.write
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
# ID: b2c3d4e5-f678-90ab-cdef-0123456789ab
|
|
110
|
+
async def execute_plan(
|
|
111
|
+
self,
|
|
112
|
+
detailed_plan: DetailedPlan,
|
|
113
|
+
) -> ExecutionResults:
|
|
114
|
+
"""
|
|
115
|
+
Execute a DetailedPlan step-by-step.
|
|
116
|
+
|
|
117
|
+
Returns simple ExecutionResults matching the dataclass definition.
|
|
118
|
+
"""
|
|
119
|
+
start_time = time.time()
|
|
120
|
+
|
|
121
|
+
logger.info(
|
|
122
|
+
"🗂️ Construction Phase: Applying %d spec-validated steps...",
|
|
123
|
+
detailed_plan.step_count,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
results: list[ActionResult] = []
|
|
127
|
+
success_count = 0
|
|
128
|
+
failure_count = 0
|
|
129
|
+
aborted_at_step: int | None = None
|
|
130
|
+
|
|
131
|
+
# PHASE 1 ENHANCEMENT: Capture files as they're written
|
|
132
|
+
files_written: dict[str, str] = {}
|
|
133
|
+
|
|
134
|
+
for i, step in enumerate(detailed_plan.steps, 1):
|
|
135
|
+
logger.info(
|
|
136
|
+
" [Step %d/%d] Executing: %s...",
|
|
137
|
+
i,
|
|
138
|
+
detailed_plan.step_count,
|
|
139
|
+
step.description,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
# Check if Step was marked as failed during Engineering phase
|
|
143
|
+
if step.metadata.get("generation_failed", False):
|
|
144
|
+
error_msg = step.metadata.get("error", "Code generation failed")
|
|
145
|
+
logger.warning(
|
|
146
|
+
" ↳ ⚠️ Skipping step - code generation failed: %s", error_msg
|
|
147
|
+
)
|
|
148
|
+
result = ActionResult(
|
|
149
|
+
action_id=step.action,
|
|
150
|
+
ok=False,
|
|
151
|
+
data={
|
|
152
|
+
"error": error_msg,
|
|
153
|
+
"error_type": "CodeGenerationFailed",
|
|
154
|
+
"skipped": True,
|
|
155
|
+
},
|
|
156
|
+
duration_sec=0.0,
|
|
157
|
+
)
|
|
158
|
+
results.append(result)
|
|
159
|
+
failure_count += 1
|
|
160
|
+
|
|
161
|
+
# UNIX PHILOSOPHY FIX: Test failures don't block refactoring
|
|
162
|
+
# Tests are regenerated AFTER code is modular
|
|
163
|
+
is_test_step = (
|
|
164
|
+
"test" in step.action.lower() or "test" in step.description.lower()
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
if step.is_critical and not is_test_step:
|
|
168
|
+
aborted_at_step = i
|
|
169
|
+
logger.error("🛑 Critical step failed during generation. Aborting.")
|
|
170
|
+
break
|
|
171
|
+
elif is_test_step:
|
|
172
|
+
logger.info(
|
|
173
|
+
" ↳ 📋 Test generation failed (expected during refactoring) - continuing..."
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
continue
|
|
177
|
+
|
|
178
|
+
# Execute the step
|
|
179
|
+
result = await self._execute_step(step, i)
|
|
180
|
+
results.append(result)
|
|
181
|
+
|
|
182
|
+
if result.ok:
|
|
183
|
+
success_count += 1
|
|
184
|
+
logger.info(" ↳ ✅ Step outcome: Success")
|
|
185
|
+
|
|
186
|
+
# PHASE 1 ENHANCEMENT: Capture file content if this was a file creation
|
|
187
|
+
if step.action in ("file.create", "file.edit"):
|
|
188
|
+
params_dict = _params_to_dict(step.params)
|
|
189
|
+
file_path = params_dict.get("file_path", "")
|
|
190
|
+
if file_path and "code" in params_dict:
|
|
191
|
+
files_written[file_path] = params_dict["code"]
|
|
192
|
+
else:
|
|
193
|
+
failure_count += 1
|
|
194
|
+
error_msg = result.data.get("error", "Unknown error")
|
|
195
|
+
logger.error(" ↳ ❌ Step failed: %s", error_msg)
|
|
196
|
+
|
|
197
|
+
# UNIX PHILOSOPHY FIX: Test failures don't block refactoring
|
|
198
|
+
is_test_step = (
|
|
199
|
+
"test" in step.action.lower() or "test" in step.description.lower()
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
if step.is_critical and not is_test_step:
|
|
203
|
+
aborted_at_step = i
|
|
204
|
+
logger.error("🛑 Critical step failed. Aborting construction.")
|
|
205
|
+
break
|
|
206
|
+
elif is_test_step:
|
|
207
|
+
logger.info(
|
|
208
|
+
" ↳ 📋 Test step failed (expected during refactoring) - continuing..."
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
duration = time.time() - start_time
|
|
212
|
+
|
|
213
|
+
logger.info(
|
|
214
|
+
"🏁 Execution Result: %s (%d success, %d failure) in %.2fs",
|
|
215
|
+
"✅ CLEAN" if failure_count == 0 else "❌ DIRTY",
|
|
216
|
+
success_count,
|
|
217
|
+
failure_count,
|
|
218
|
+
duration,
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
self.tracer.record(
|
|
222
|
+
agent="ExecutionAgent",
|
|
223
|
+
decision_type="plan_execution",
|
|
224
|
+
rationale=f"Executed blueprint for: {detailed_plan.goal}",
|
|
225
|
+
chosen_action="Sequential construction",
|
|
226
|
+
context={
|
|
227
|
+
"steps": len(results),
|
|
228
|
+
"success": success_count,
|
|
229
|
+
"fail": failure_count,
|
|
230
|
+
"write_mode": self.write,
|
|
231
|
+
"files_captured": len(files_written),
|
|
232
|
+
},
|
|
233
|
+
confidence=1.0 if failure_count == 0 else 0.4,
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
# Build error and warning lists from results
|
|
237
|
+
errors = []
|
|
238
|
+
warnings = []
|
|
239
|
+
|
|
240
|
+
for result in results:
|
|
241
|
+
if not result.ok:
|
|
242
|
+
error_msg = result.data.get("error", "Unknown error")
|
|
243
|
+
errors.append(error_msg)
|
|
244
|
+
|
|
245
|
+
# Extract warnings if present
|
|
246
|
+
if "warnings" in result.data:
|
|
247
|
+
warnings.extend(result.data["warnings"])
|
|
248
|
+
|
|
249
|
+
# Return simple ExecutionResults matching the dataclass
|
|
250
|
+
return ExecutionResults(
|
|
251
|
+
success=failure_count == 0,
|
|
252
|
+
files_written=list(files_written.keys()),
|
|
253
|
+
errors=errors,
|
|
254
|
+
warnings=warnings,
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
# ID: c3d4e5f6-789a-bcde-f012-3456789abcde
|
|
258
|
+
async def _execute_step(
|
|
259
|
+
self,
|
|
260
|
+
step, # DetailedPlanStep
|
|
261
|
+
step_number: int,
|
|
262
|
+
) -> ActionResult:
|
|
263
|
+
"""
|
|
264
|
+
Invokes the ActionExecutor for a single atomic action.
|
|
265
|
+
|
|
266
|
+
CONSTITUTIONAL NOTE: This is an internal orchestration method, NOT an
|
|
267
|
+
atomic action. Governance is enforced by ActionExecutor.execute() which
|
|
268
|
+
issues the governance token for each action it dispatches. Decorating
|
|
269
|
+
this method with @atomic_action would require a token that doesn't exist
|
|
270
|
+
at call time, causing GovernanceBypassError.
|
|
271
|
+
"""
|
|
272
|
+
try:
|
|
273
|
+
params_dict = _params_to_dict(step.params)
|
|
274
|
+
params_dict = _strip_params_for_action(step.action, params_dict)
|
|
275
|
+
|
|
276
|
+
result = await self.executor.execute(
|
|
277
|
+
action_id=step.action,
|
|
278
|
+
write=self.write,
|
|
279
|
+
**params_dict,
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
return result
|
|
283
|
+
|
|
284
|
+
except Exception as e:
|
|
285
|
+
logger.error("Execution Exception in step %d: %s", step_number, e)
|
|
286
|
+
return ActionResult(
|
|
287
|
+
action_id=step.action,
|
|
288
|
+
ok=False,
|
|
289
|
+
data={
|
|
290
|
+
"error": str(e),
|
|
291
|
+
"error_type": type(e).__name__,
|
|
292
|
+
},
|
|
293
|
+
duration_sec=0.0,
|
|
294
|
+
)
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# src/will/agents/governance_mixin.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Governance Mixin for AI Agents.
|
|
5
|
+
|
|
6
|
+
Provides constitutional validation for all autonomous operations. This mixin
|
|
7
|
+
allows any agent in the Will layer to check governance before executing actions.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from body.services.constitutional_validator import (
|
|
16
|
+
ApprovalType,
|
|
17
|
+
GovernanceDecision,
|
|
18
|
+
RiskTier,
|
|
19
|
+
can_execute_autonomously,
|
|
20
|
+
)
|
|
21
|
+
from shared.logger import getLogger
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
logger = getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
# ID: 373bbf3b-d13e-468d-813b-5fb8de77bb59
|
|
29
|
+
class GovernanceContext:
|
|
30
|
+
"""Context information for governance decisions."""
|
|
31
|
+
|
|
32
|
+
filepath: str
|
|
33
|
+
action: str
|
|
34
|
+
agent_id: str
|
|
35
|
+
additional_context: dict[str, Any] | None = None
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# ID: dd255352-e203-47e2-9e33-d19cf4317e62
|
|
39
|
+
class GovernanceMixin:
|
|
40
|
+
"""
|
|
41
|
+
Mixin that adds constitutional governance to any agent.
|
|
42
|
+
|
|
43
|
+
Usage:
|
|
44
|
+
class MyAgent(GovernanceMixin):
|
|
45
|
+
async def do_something(self, filepath: str):
|
|
46
|
+
decision = await self.check_governance(
|
|
47
|
+
filepath, "modify_file"
|
|
48
|
+
)
|
|
49
|
+
if not decision.allowed:
|
|
50
|
+
return f"Blocked: {decision.rationale}"
|
|
51
|
+
# ... proceed with action
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
# ID: e97f31ce-2c86-4b11-b271-68bd8208d7d1
|
|
55
|
+
async def check_governance(
|
|
56
|
+
self,
|
|
57
|
+
filepath: str,
|
|
58
|
+
action: str,
|
|
59
|
+
agent_id: str | None = None,
|
|
60
|
+
context: dict[str, Any] | None = None,
|
|
61
|
+
) -> GovernanceDecision:
|
|
62
|
+
"""
|
|
63
|
+
Check if action is allowed by constitutional governance.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
filepath: Target file path
|
|
67
|
+
action: Action to perform
|
|
68
|
+
agent_id: Identifier of the agent requesting action
|
|
69
|
+
context: Additional context for governance decision
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
GovernanceDecision with allowed/rationale/violations
|
|
73
|
+
"""
|
|
74
|
+
gov_context = context or {}
|
|
75
|
+
gov_context["filepath"] = filepath
|
|
76
|
+
if agent_id:
|
|
77
|
+
gov_context["agent_id"] = agent_id
|
|
78
|
+
decision = can_execute_autonomously(filepath, action, gov_context)
|
|
79
|
+
self._log_governance_decision(filepath, action, decision)
|
|
80
|
+
return decision
|
|
81
|
+
|
|
82
|
+
def _log_governance_decision(
|
|
83
|
+
self, filepath: str, action: str, decision: GovernanceDecision
|
|
84
|
+
):
|
|
85
|
+
"""Log governance decision for audit trail."""
|
|
86
|
+
if decision.allowed:
|
|
87
|
+
logger.info(
|
|
88
|
+
"✅ Governance: %s on %s",
|
|
89
|
+
action,
|
|
90
|
+
filepath,
|
|
91
|
+
extra={
|
|
92
|
+
"governance_decision": "allowed",
|
|
93
|
+
"risk_tier": decision.risk_tier.name,
|
|
94
|
+
"approval_type": decision.approval_type.value,
|
|
95
|
+
"filepath": filepath,
|
|
96
|
+
"action": action,
|
|
97
|
+
},
|
|
98
|
+
)
|
|
99
|
+
else:
|
|
100
|
+
logger.warning(
|
|
101
|
+
"🚫 Governance: %s on %s - BLOCKED",
|
|
102
|
+
action,
|
|
103
|
+
filepath,
|
|
104
|
+
extra={
|
|
105
|
+
"governance_decision": "blocked",
|
|
106
|
+
"risk_tier": decision.risk_tier.name,
|
|
107
|
+
"filepath": filepath,
|
|
108
|
+
"action": action,
|
|
109
|
+
"violations": decision.violations,
|
|
110
|
+
"rationale": decision.rationale,
|
|
111
|
+
},
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# ID: e6c46fa0-3a89-4354-892d-9be7ae047e68
|
|
115
|
+
def format_governance_response(self, decision: GovernanceDecision) -> str:
|
|
116
|
+
"""Format governance decision for user display."""
|
|
117
|
+
if decision.allowed:
|
|
118
|
+
if decision.approval_type == ApprovalType.AUTONOMOUS:
|
|
119
|
+
return "✅ Action approved for autonomous execution"
|
|
120
|
+
elif decision.approval_type == ApprovalType.VALIDATION_ONLY:
|
|
121
|
+
return "✅ Action approved (will validate after execution)"
|
|
122
|
+
emoji = "⚠️" if decision.risk_tier == RiskTier.ELEVATED else "🚫"
|
|
123
|
+
msg = f"{emoji} Action blocked by constitutional governance\n"
|
|
124
|
+
msg += f" Reason: {decision.rationale}\n"
|
|
125
|
+
msg += f" Risk Level: {decision.risk_tier.name}\n"
|
|
126
|
+
approval_display = decision.approval_type.value.replace("_", " ")
|
|
127
|
+
msg += f" Required: {approval_display.title()}"
|
|
128
|
+
if decision.violations:
|
|
129
|
+
msg += "\n Violations:\n"
|
|
130
|
+
for violation in decision.violations:
|
|
131
|
+
msg += f" • {violation}\n"
|
|
132
|
+
return msg
|