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
body/atomic/executor.py
ADDED
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
# src/body/atomic/executor.py
|
|
2
|
+
"""
|
|
3
|
+
Universal Action Executor - Constitutional Enforcement Gateway
|
|
4
|
+
|
|
5
|
+
This is the ONLY way actions are executed in CORE, whether:
|
|
6
|
+
- Human operator via CLI
|
|
7
|
+
- Workflow orchestrator via DevSyncWorkflow
|
|
8
|
+
|
|
9
|
+
Every action execution flows through this gateway, ensuring:
|
|
10
|
+
- Constitutional policy validation
|
|
11
|
+
- Impact level authorization
|
|
12
|
+
- Pre/post execution hooks
|
|
13
|
+
- Audit logging
|
|
14
|
+
- Consistent error handling
|
|
15
|
+
|
|
16
|
+
CRITICAL: This enforces the "single execution contract" principle.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import inspect
|
|
22
|
+
import json
|
|
23
|
+
import time
|
|
24
|
+
from typing import TYPE_CHECKING, Any
|
|
25
|
+
|
|
26
|
+
from sqlalchemy import text
|
|
27
|
+
|
|
28
|
+
from body.atomic.registry import ActionCategory, ActionDefinition, action_registry
|
|
29
|
+
from body.atomic.sandbox_lifecycle import SandboxLifecycle
|
|
30
|
+
from shared.action_types import ActionImpact, ActionResult
|
|
31
|
+
from shared.atomic_action import atomic_action
|
|
32
|
+
from shared.governance_token import authorize_execution
|
|
33
|
+
from shared.infrastructure.intent.action_risk import load_action_risk
|
|
34
|
+
from shared.logger import _current_run_id, getLogger
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
from shared.context import CoreContext
|
|
39
|
+
|
|
40
|
+
logger = getLogger(__name__)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# ID: b2c3d4e5-f6a7-8b9c-0d1e-2f3a4b5c6d7e
|
|
44
|
+
def _validate_action_result(action_id: str, result: Any) -> ActionResult:
|
|
45
|
+
"""
|
|
46
|
+
Validate action result against constitutional requirements.
|
|
47
|
+
|
|
48
|
+
Enforces .intent/rules/architecture/atomic_actions.json:
|
|
49
|
+
- atomic_actions.result_must_be_structured
|
|
50
|
+
- atomic_actions.no_governance_bypass
|
|
51
|
+
"""
|
|
52
|
+
if not isinstance(result, ActionResult):
|
|
53
|
+
logger.error(
|
|
54
|
+
"Constitutional violation detected at runtime: "
|
|
55
|
+
"Action '%s' returned type '%s' instead of ActionResult. "
|
|
56
|
+
"Rule: atomic_actions.no_governance_bypass. "
|
|
57
|
+
"Wrapping in error ActionResult.",
|
|
58
|
+
action_id,
|
|
59
|
+
type(result).__name__,
|
|
60
|
+
)
|
|
61
|
+
return ActionResult(
|
|
62
|
+
action_id=action_id,
|
|
63
|
+
ok=False,
|
|
64
|
+
data={
|
|
65
|
+
"error": "Constitutional violation",
|
|
66
|
+
"detail": f"Action returned {type(result).__name__} instead of ActionResult",
|
|
67
|
+
"rule_violated": "atomic_actions.no_governance_bypass",
|
|
68
|
+
"original_result": str(result)[:200],
|
|
69
|
+
},
|
|
70
|
+
duration_sec=0.0,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
if not isinstance(result.data, dict):
|
|
74
|
+
logger.error(
|
|
75
|
+
"Constitutional violation detected at runtime: "
|
|
76
|
+
"Action '%s' returned ActionResult with non-dict data (type: %s). "
|
|
77
|
+
"Rule: atomic_actions.result_must_be_structured. "
|
|
78
|
+
"Wrapping in error ActionResult.",
|
|
79
|
+
action_id,
|
|
80
|
+
type(result.data).__name__,
|
|
81
|
+
)
|
|
82
|
+
return ActionResult(
|
|
83
|
+
action_id=action_id,
|
|
84
|
+
ok=False,
|
|
85
|
+
data={
|
|
86
|
+
"error": "Constitutional violation",
|
|
87
|
+
"detail": f"ActionResult.data is {type(result.data).__name__} instead of dict",
|
|
88
|
+
"rule_violated": "atomic_actions.result_must_be_structured",
|
|
89
|
+
},
|
|
90
|
+
duration_sec=result.duration_sec,
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
return result
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
# ID: e1b46328-53d2-4abe-93e4-3b875d50300f
|
|
97
|
+
class ActionExecutor:
|
|
98
|
+
"""
|
|
99
|
+
Universal execution gateway for all atomic actions.
|
|
100
|
+
|
|
101
|
+
Architecture:
|
|
102
|
+
- Loads action definitions from registry
|
|
103
|
+
- Validates policies exist in constitution
|
|
104
|
+
- Checks impact authorization
|
|
105
|
+
- Executes pre/post hooks
|
|
106
|
+
- Provides audit trail
|
|
107
|
+
- Returns consistent ActionResult
|
|
108
|
+
|
|
109
|
+
Usage:
|
|
110
|
+
executor = ActionExecutor(core_context)
|
|
111
|
+
result = await executor.execute("fix.format", write=True)
|
|
112
|
+
"""
|
|
113
|
+
|
|
114
|
+
def __init__(self, core_context: CoreContext):
|
|
115
|
+
"""
|
|
116
|
+
Initialize executor with CORE context.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
core_context: CoreContext with all services
|
|
120
|
+
"""
|
|
121
|
+
import body.atomic # noqa: F401 — triggers action registration
|
|
122
|
+
|
|
123
|
+
self.core_context = core_context
|
|
124
|
+
self.registry = action_registry
|
|
125
|
+
self._sandbox = SandboxLifecycle(core_context)
|
|
126
|
+
|
|
127
|
+
# Overlay impact_level from .intent/enforcement/config/action_risk.yaml
|
|
128
|
+
# onto every registered ActionDefinition. @register_action no longer
|
|
129
|
+
# accepts impact_level — it is governed externally. See ADR-008.
|
|
130
|
+
risk_mapping = load_action_risk()
|
|
131
|
+
self.registry.apply_risk_config(risk_mapping)
|
|
132
|
+
|
|
133
|
+
logger.debug("ActionExecutor initialized")
|
|
134
|
+
|
|
135
|
+
@atomic_action(
|
|
136
|
+
action_id="action.execute",
|
|
137
|
+
intent="Atomic action for execute",
|
|
138
|
+
impact=ActionImpact.WRITE_CODE,
|
|
139
|
+
policies=["atomic_actions"],
|
|
140
|
+
)
|
|
141
|
+
# ID: 0724a464-ca71-4c53-878c-2c2d75dabcde
|
|
142
|
+
async def execute(
|
|
143
|
+
self,
|
|
144
|
+
action_id: str,
|
|
145
|
+
write: bool = False,
|
|
146
|
+
pre_execution_sha: str | None = None,
|
|
147
|
+
**params: Any,
|
|
148
|
+
) -> ActionResult:
|
|
149
|
+
"""
|
|
150
|
+
Execute an action with full constitutional governance.
|
|
151
|
+
|
|
152
|
+
1. Validates action exists in registry
|
|
153
|
+
2. Validates constitutional policies
|
|
154
|
+
3. Checks impact authorization
|
|
155
|
+
4. Runs pre-execution hooks
|
|
156
|
+
5. Executes the action (sandboxed in a git worktree if applicable)
|
|
157
|
+
6. Runs post-execution hooks
|
|
158
|
+
7. Records audit trail
|
|
159
|
+
|
|
160
|
+
Sandboxing (ADR-071 D2.2 Phase 2)
|
|
161
|
+
--------------------------------
|
|
162
|
+
When `pre_execution_sha` is supplied AND `write=True` AND the
|
|
163
|
+
action's ActionImpact is WRITE_CODE or WRITE_METADATA, the action
|
|
164
|
+
runs against a hermetic git worktree checked out at
|
|
165
|
+
`pre_execution_sha`. The scoped CoreContext has both `git_service`
|
|
166
|
+
and `file_handler` repointed at the worktree, so mutations land
|
|
167
|
+
inside the sandbox. On success, changed files are copy-propagated
|
|
168
|
+
back to the main tree under ADR-021's existing scope-binding (the
|
|
169
|
+
commit_paths call in proposal_execution_pipeline is unchanged).
|
|
170
|
+
On failure, the sandbox is discarded and the main tree is
|
|
171
|
+
untouched. CLI direct invocations leave `pre_execution_sha=None`
|
|
172
|
+
and pass through with no sandbox — D2.1's operational stop/start
|
|
173
|
+
protocol covers concurrent-human cases there.
|
|
174
|
+
"""
|
|
175
|
+
start_time = time.time()
|
|
176
|
+
|
|
177
|
+
# 1. Load definition from registry
|
|
178
|
+
definition = self.registry.get(action_id)
|
|
179
|
+
if not definition:
|
|
180
|
+
logger.error("Action not found in registry: %s", action_id)
|
|
181
|
+
return ActionResult(
|
|
182
|
+
action_id=action_id,
|
|
183
|
+
ok=False,
|
|
184
|
+
data={
|
|
185
|
+
"error": f"Action not found: {action_id}",
|
|
186
|
+
"available_actions": [
|
|
187
|
+
a.action_id for a in self.registry.list_all()
|
|
188
|
+
],
|
|
189
|
+
},
|
|
190
|
+
duration_sec=time.time() - start_time,
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
logger.info(
|
|
194
|
+
"Executing action: %s (write=%s, category=%s, impact=%s)",
|
|
195
|
+
action_id,
|
|
196
|
+
write,
|
|
197
|
+
definition.category.value,
|
|
198
|
+
definition.impact_level,
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
# 2. Validate constitutional policies
|
|
202
|
+
policy_validation = await self._validate_policies(definition)
|
|
203
|
+
if not policy_validation["ok"]:
|
|
204
|
+
logger.warning("Policy validation failed for %s", action_id)
|
|
205
|
+
return ActionResult(
|
|
206
|
+
action_id=action_id,
|
|
207
|
+
ok=False,
|
|
208
|
+
data={
|
|
209
|
+
"error": "Policy validation failed",
|
|
210
|
+
"details": policy_validation,
|
|
211
|
+
},
|
|
212
|
+
duration_sec=time.time() - start_time,
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
# 3. Check impact authorization
|
|
216
|
+
auth_check = self._check_authorization(definition, write)
|
|
217
|
+
if not auth_check["authorized"]:
|
|
218
|
+
logger.warning("Authorization failed for %s", action_id)
|
|
219
|
+
return ActionResult(
|
|
220
|
+
action_id=action_id,
|
|
221
|
+
ok=False,
|
|
222
|
+
data={
|
|
223
|
+
"error": "Authorization failed",
|
|
224
|
+
"details": auth_check,
|
|
225
|
+
},
|
|
226
|
+
duration_sec=time.time() - start_time,
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
# 4. Pre-execution hooks
|
|
230
|
+
await self._pre_execute_hooks(definition, write, params)
|
|
231
|
+
|
|
232
|
+
# 5. Execute action (sandboxed when ADR-071 D2.2 conditions hold)
|
|
233
|
+
exec_context, scoped_git = self._sandbox.build_execution_context(
|
|
234
|
+
definition, write, pre_execution_sha
|
|
235
|
+
)
|
|
236
|
+
try:
|
|
237
|
+
exec_params = self._prepare_params(
|
|
238
|
+
definition, write, params, context=exec_context
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
# --- Issue Governance Token ---
|
|
242
|
+
with authorize_execution(action_id):
|
|
243
|
+
raw_result = await definition.executor(**exec_params)
|
|
244
|
+
# --- End Governance Token ---
|
|
245
|
+
|
|
246
|
+
# CONSTITUTIONAL ENFORCEMENT: Validate result at runtime
|
|
247
|
+
result = _validate_action_result(action_id, raw_result)
|
|
248
|
+
|
|
249
|
+
if scoped_git is not None and result.ok:
|
|
250
|
+
self._sandbox.propagate_changes(scoped_git)
|
|
251
|
+
|
|
252
|
+
logger.info(
|
|
253
|
+
"Action %s completed: ok=%s, duration=%.2fs",
|
|
254
|
+
action_id,
|
|
255
|
+
result.ok,
|
|
256
|
+
result.duration_sec,
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
except Exception as e:
|
|
260
|
+
logger.error(
|
|
261
|
+
"Action %s failed with exception: %s", action_id, e, exc_info=True
|
|
262
|
+
)
|
|
263
|
+
result = ActionResult(
|
|
264
|
+
action_id=action_id,
|
|
265
|
+
ok=False,
|
|
266
|
+
data={
|
|
267
|
+
"error": str(e),
|
|
268
|
+
"error_type": type(e).__name__,
|
|
269
|
+
},
|
|
270
|
+
duration_sec=time.time() - start_time,
|
|
271
|
+
)
|
|
272
|
+
finally:
|
|
273
|
+
if scoped_git is not None:
|
|
274
|
+
scoped_git.cleanup()
|
|
275
|
+
|
|
276
|
+
# 6. Post-execution hooks
|
|
277
|
+
await self._post_execute_hooks(definition, result)
|
|
278
|
+
|
|
279
|
+
# 7. Audit logging
|
|
280
|
+
await self._audit_log(definition, result, write)
|
|
281
|
+
|
|
282
|
+
return result
|
|
283
|
+
|
|
284
|
+
# ID: 7d302f78-f0c6-4fe5-8273-11f85d53b2fb
|
|
285
|
+
async def _validate_policies(self, definition: ActionDefinition) -> dict[str, Any]:
|
|
286
|
+
"""
|
|
287
|
+
Validate that all referenced policies exist in the constitution.
|
|
288
|
+
|
|
289
|
+
CONSTITUTIONAL FIX (V2.3.0):
|
|
290
|
+
Queries Mind's in-memory IntentRepository index instead of
|
|
291
|
+
touching .intent/ filesystem via PathResolver.
|
|
292
|
+
"""
|
|
293
|
+
from shared.infrastructure.intent.intent_repository import (
|
|
294
|
+
get_intent_repository,
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
intent_repo = get_intent_repository()
|
|
298
|
+
indexed_policies = {p.policy_id for p in intent_repo.list_policies()}
|
|
299
|
+
|
|
300
|
+
missing = []
|
|
301
|
+
for policy_id in definition.policies:
|
|
302
|
+
if policy_id not in indexed_policies:
|
|
303
|
+
missing.append(policy_id)
|
|
304
|
+
|
|
305
|
+
if missing:
|
|
306
|
+
logger.warning(
|
|
307
|
+
"Action '%s' references unindexed policies: %s. "
|
|
308
|
+
"Available: %d indexed policies. "
|
|
309
|
+
"Policy IDs must use canonical format: rules/<domain>/<n>",
|
|
310
|
+
definition.action_id,
|
|
311
|
+
missing,
|
|
312
|
+
len(indexed_policies),
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
return {
|
|
316
|
+
"ok": len(missing) == 0,
|
|
317
|
+
"policies": definition.policies,
|
|
318
|
+
"missing": missing,
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
# ID: 238c67b1-eef2-436d-8013-091a6788368a
|
|
322
|
+
def _check_authorization(
|
|
323
|
+
self, definition: ActionDefinition, write: bool
|
|
324
|
+
) -> dict[str, Any]:
|
|
325
|
+
"""
|
|
326
|
+
DELIBERATE STUB — NOT AN OVERSIGHT.
|
|
327
|
+
|
|
328
|
+
Inline authorization is intentionally deferred. Enforcement is
|
|
329
|
+
delegated to the audit → consequence chain loop (ADR-015,
|
|
330
|
+
ADR-017, ADR-019). This method will be hardened when the
|
|
331
|
+
enforcement loop has produced sufficient ViolationExecutor
|
|
332
|
+
discovery data to define meaningful authorization policies.
|
|
333
|
+
|
|
334
|
+
Fill point: this method, single location. Interface contract is
|
|
335
|
+
already in place; only the policy evaluation body is missing.
|
|
336
|
+
"""
|
|
337
|
+
if definition.impact_level == "dangerous" and write:
|
|
338
|
+
logger.warning(
|
|
339
|
+
"Dangerous action %s requested in write mode — "
|
|
340
|
+
"authorization enforcement deferred to audit loop",
|
|
341
|
+
definition.action_id,
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
return {
|
|
345
|
+
"authorized": True,
|
|
346
|
+
"impact_level": definition.impact_level,
|
|
347
|
+
"write_mode": write,
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
# ID: 738ad11a-5848-49ce-a16d-2dfcbef8b763
|
|
351
|
+
async def _pre_execute_hooks(
|
|
352
|
+
self, definition: ActionDefinition, write: bool, params: dict[str, Any]
|
|
353
|
+
) -> None:
|
|
354
|
+
"""
|
|
355
|
+
Execute pre-execution hooks.
|
|
356
|
+
"""
|
|
357
|
+
logger.debug("Pre-execution hooks for %s", definition.action_id)
|
|
358
|
+
|
|
359
|
+
# ID: 3de2d9e3-b074-485d-98ad-06ea51e009e2
|
|
360
|
+
async def _post_execute_hooks(
|
|
361
|
+
self, definition: ActionDefinition, result: ActionResult
|
|
362
|
+
) -> None:
|
|
363
|
+
"""
|
|
364
|
+
Execute post-execution hooks.
|
|
365
|
+
"""
|
|
366
|
+
logger.debug("Post-execution hooks for %s", definition.action_id)
|
|
367
|
+
|
|
368
|
+
# ID: 454c8ccb-ece8-4ef8-baf1-13c9c19f4300
|
|
369
|
+
async def _audit_log(
|
|
370
|
+
self, definition: ActionDefinition, result: ActionResult, write: bool
|
|
371
|
+
) -> None:
|
|
372
|
+
"""
|
|
373
|
+
Log action execution to database audit trail (SSOT).
|
|
374
|
+
|
|
375
|
+
CONSTITUTIONAL FIX: session_id is read cleanly from _current_run_id
|
|
376
|
+
context var (imported at module level). Removed duplicate key and
|
|
377
|
+
broken __import__ hack from prior patch.
|
|
378
|
+
"""
|
|
379
|
+
try:
|
|
380
|
+
async with self.core_context.registry.session() as session:
|
|
381
|
+
async with session.begin():
|
|
382
|
+
stmt = text(
|
|
383
|
+
"""
|
|
384
|
+
INSERT INTO core.action_results
|
|
385
|
+
(action_type, ok, file_path, error_message, action_metadata, agent_id, duration_ms)
|
|
386
|
+
VALUES (:atype, :ok, :path, :err, :meta, :agent, :dur)
|
|
387
|
+
"""
|
|
388
|
+
)
|
|
389
|
+
# Prefer session_id from core_context, fall back to context var
|
|
390
|
+
session_id = getattr(
|
|
391
|
+
self.core_context, "session_id", None
|
|
392
|
+
) or _current_run_id.get(None)
|
|
393
|
+
|
|
394
|
+
await session.execute(
|
|
395
|
+
stmt,
|
|
396
|
+
{
|
|
397
|
+
"atype": definition.action_id,
|
|
398
|
+
"ok": result.ok,
|
|
399
|
+
"path": result.data.get("path")
|
|
400
|
+
or result.data.get("file_path"),
|
|
401
|
+
"err": result.data.get("error") if not result.ok else None,
|
|
402
|
+
"meta": json.dumps(
|
|
403
|
+
{
|
|
404
|
+
"write_mode": write,
|
|
405
|
+
"impact": definition.impact_level,
|
|
406
|
+
"session_id": session_id,
|
|
407
|
+
}
|
|
408
|
+
),
|
|
409
|
+
"agent": "ActionExecutor",
|
|
410
|
+
"dur": int(result.duration_sec * 1000),
|
|
411
|
+
},
|
|
412
|
+
)
|
|
413
|
+
except Exception as e:
|
|
414
|
+
logger.warning("Non-blocking audit log failure: %s", e)
|
|
415
|
+
|
|
416
|
+
# ID: eff3eded-b30d-49e0-b50c-3503a1b695af
|
|
417
|
+
def _prepare_params(
|
|
418
|
+
self,
|
|
419
|
+
definition: ActionDefinition,
|
|
420
|
+
write: bool,
|
|
421
|
+
params: dict[str, Any],
|
|
422
|
+
context: CoreContext | None = None,
|
|
423
|
+
) -> dict[str, Any]:
|
|
424
|
+
"""
|
|
425
|
+
Prepare parameters for action execution with smart injection.
|
|
426
|
+
|
|
427
|
+
`context` overrides the core_context injected into actions that
|
|
428
|
+
accept it. None means use self.core_context (the default for
|
|
429
|
+
unsandboxed pass-through); a scoped CoreContext is supplied by
|
|
430
|
+
_build_execution_context when ADR-071 D2.2 sandboxing applies.
|
|
431
|
+
"""
|
|
432
|
+
exec_params = {"write": write}
|
|
433
|
+
effective_context = context if context is not None else self.core_context
|
|
434
|
+
|
|
435
|
+
sig = inspect.signature(definition.executor)
|
|
436
|
+
if "core_context" in sig.parameters:
|
|
437
|
+
exec_params["core_context"] = effective_context
|
|
438
|
+
|
|
439
|
+
exec_params.update(params)
|
|
440
|
+
|
|
441
|
+
if definition.requires_db and not effective_context.db_available:
|
|
442
|
+
logger.warning(
|
|
443
|
+
"Action %s requires DB but it's not available", definition.action_id
|
|
444
|
+
)
|
|
445
|
+
|
|
446
|
+
if definition.requires_vectors and not effective_context.qdrant_service:
|
|
447
|
+
logger.warning(
|
|
448
|
+
"Action %s requires vectors but Qdrant is not available",
|
|
449
|
+
definition.action_id,
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
return exec_params
|
|
453
|
+
|
|
454
|
+
# ID: 118ed7f6-3a4f-4c31-b6a9-448727bbea76
|
|
455
|
+
def list_actions(
|
|
456
|
+
self, category: ActionCategory | None = None
|
|
457
|
+
) -> list[ActionDefinition]:
|
|
458
|
+
"""
|
|
459
|
+
List available actions, optionally filtered by category.
|
|
460
|
+
"""
|
|
461
|
+
if category:
|
|
462
|
+
return self.registry.get_by_category(category)
|
|
463
|
+
return self.registry.list_all()
|
|
464
|
+
|
|
465
|
+
# ID: 46e53493-d92c-402d-83c8-b9516d394f81
|
|
466
|
+
def get_action(self, action_id: str) -> ActionDefinition | None:
|
|
467
|
+
"""
|
|
468
|
+
Get action definition by ID.
|
|
469
|
+
"""
|
|
470
|
+
return self.registry.get(action_id)
|
body/atomic/file_ops.py
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# src/body/atomic/file_ops.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Atomic File Operations - Canonical implementation of filesystem mutations.
|
|
5
|
+
GOVERNED: Now enforces strict Syntax Validation and Metadata Finalization.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import ast
|
|
11
|
+
import time
|
|
12
|
+
from typing import TYPE_CHECKING
|
|
13
|
+
|
|
14
|
+
from body.atomic.registry import ActionCategory, register_action
|
|
15
|
+
from shared.action_types import ActionImpact, ActionResult
|
|
16
|
+
from shared.atomic_action import atomic_action
|
|
17
|
+
from shared.logger import getLogger
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from shared.context import CoreContext
|
|
22
|
+
|
|
23
|
+
logger = getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@register_action(
|
|
27
|
+
action_id="file.create",
|
|
28
|
+
description="Create a new file with validated content",
|
|
29
|
+
category=ActionCategory.BUILD,
|
|
30
|
+
policies=["rules/architecture/atomic_actions"],
|
|
31
|
+
)
|
|
32
|
+
@atomic_action(
|
|
33
|
+
action_id="file.create",
|
|
34
|
+
intent="Create a file with mandatory syntax validation",
|
|
35
|
+
impact=ActionImpact.WRITE_CODE,
|
|
36
|
+
policies=["atomic_actions"],
|
|
37
|
+
)
|
|
38
|
+
# ID: bfa655f7-1eed-4afe-a5d3-90e32ecb6fa5
|
|
39
|
+
async def action_create_file(
|
|
40
|
+
file_path: str, code: str, core_context: CoreContext, write: bool = False, **kwargs
|
|
41
|
+
) -> ActionResult:
|
|
42
|
+
"""Creates a file. Enforces strict pre-flight syntax and metadata checks."""
|
|
43
|
+
start = time.time()
|
|
44
|
+
try:
|
|
45
|
+
# 1. THE IRON GATE: Syntax Validation
|
|
46
|
+
# If this is a Python file, it MUST parse or we halt immediately.
|
|
47
|
+
if file_path.endswith(".py"):
|
|
48
|
+
try:
|
|
49
|
+
ast.parse(code)
|
|
50
|
+
except SyntaxError as e:
|
|
51
|
+
logger.error(
|
|
52
|
+
"\u274c CONSTITUTIONAL VIOLATION: AI generated invalid Python in %s",
|
|
53
|
+
file_path,
|
|
54
|
+
)
|
|
55
|
+
return ActionResult(
|
|
56
|
+
action_id="file.create",
|
|
57
|
+
ok=False,
|
|
58
|
+
data={
|
|
59
|
+
"error": "Syntax Error: Refusing to write invalid Python code.",
|
|
60
|
+
"details": str(e),
|
|
61
|
+
"line": e.lineno,
|
|
62
|
+
},
|
|
63
|
+
duration_sec=time.time() - start,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# 2. THE FINALIZER: Auto-Metadata
|
|
67
|
+
# If the write is approved, we ensure the 'Paperwork' is done.
|
|
68
|
+
# This is handled by the FileHandler inside the write_runtime_text call.
|
|
69
|
+
|
|
70
|
+
if write:
|
|
71
|
+
# We use the governed mutation surface
|
|
72
|
+
core_context.file_handler.write_runtime_text(file_path, code)
|
|
73
|
+
if core_context.git_service.is_git_repo():
|
|
74
|
+
core_context.git_service.add(file_path)
|
|
75
|
+
|
|
76
|
+
return ActionResult(
|
|
77
|
+
action_id="file.create",
|
|
78
|
+
ok=True,
|
|
79
|
+
data={
|
|
80
|
+
"path": file_path,
|
|
81
|
+
"written": write,
|
|
82
|
+
"status": "Verified & Persisted" if write else "Verified (Dry Run)",
|
|
83
|
+
},
|
|
84
|
+
duration_sec=time.time() - start,
|
|
85
|
+
impact=ActionImpact.WRITE_CODE,
|
|
86
|
+
)
|
|
87
|
+
except Exception as e:
|
|
88
|
+
return ActionResult(
|
|
89
|
+
action_id="file.create",
|
|
90
|
+
ok=False,
|
|
91
|
+
data={"error": str(e)},
|
|
92
|
+
duration_sec=time.time() - start,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@register_action(
|
|
97
|
+
action_id="file.edit",
|
|
98
|
+
description="Modify an existing file with validated code",
|
|
99
|
+
category=ActionCategory.FIX,
|
|
100
|
+
policies=["rules/architecture/atomic_actions"],
|
|
101
|
+
)
|
|
102
|
+
@atomic_action(
|
|
103
|
+
action_id="file.edit",
|
|
104
|
+
intent="Edit a file with mandatory syntax validation",
|
|
105
|
+
impact=ActionImpact.WRITE_CODE,
|
|
106
|
+
policies=["atomic_actions"],
|
|
107
|
+
)
|
|
108
|
+
# ID: 3044d199-3315-4e2c-8f0f-9e7cb630602f
|
|
109
|
+
async def action_edit_file(
|
|
110
|
+
file_path: str, code: str, core_context: CoreContext, write: bool = False, **kwargs
|
|
111
|
+
) -> ActionResult:
|
|
112
|
+
"""Edits a file. Reuses creation logic to ensure identical safety gates."""
|
|
113
|
+
return await action_create_file(file_path, code, core_context, write=write)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
@register_action(
|
|
117
|
+
action_id="file.read",
|
|
118
|
+
description="Read content from a file safely",
|
|
119
|
+
category=ActionCategory.CHECK,
|
|
120
|
+
policies=["rules/data/governance"],
|
|
121
|
+
)
|
|
122
|
+
@atomic_action(
|
|
123
|
+
action_id="file.read",
|
|
124
|
+
intent="Read file for context",
|
|
125
|
+
impact=ActionImpact.READ_ONLY,
|
|
126
|
+
policies=["atomic_actions"],
|
|
127
|
+
)
|
|
128
|
+
# ID: 63f1cf2a-b2c1-4886-8f74-89a81dbc95ff
|
|
129
|
+
async def action_read_file(
|
|
130
|
+
file_path: str, core_context: CoreContext, **kwargs
|
|
131
|
+
) -> ActionResult:
|
|
132
|
+
"""Reads a file from the repository."""
|
|
133
|
+
start = time.time()
|
|
134
|
+
try:
|
|
135
|
+
full_path = core_context.git_service.repo_path / file_path
|
|
136
|
+
if not full_path.exists():
|
|
137
|
+
raise FileNotFoundError(f"File not found: {file_path}")
|
|
138
|
+
|
|
139
|
+
content = full_path.read_text(encoding="utf-8")
|
|
140
|
+
return ActionResult(
|
|
141
|
+
action_id="file.read",
|
|
142
|
+
ok=True,
|
|
143
|
+
data={"content": content, "path": file_path},
|
|
144
|
+
duration_sec=time.time() - start,
|
|
145
|
+
impact=ActionImpact.READ_ONLY,
|
|
146
|
+
)
|
|
147
|
+
except Exception as e:
|
|
148
|
+
return ActionResult(
|
|
149
|
+
action_id="file.read",
|
|
150
|
+
ok=False,
|
|
151
|
+
data={"error": str(e)},
|
|
152
|
+
duration_sec=time.time() - start,
|
|
153
|
+
)
|