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,480 @@
|
|
|
1
|
+
# src/will/phases/code_generation_phase.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Code Generation Phase - Intelligent Reflex Pipe.
|
|
5
|
+
|
|
6
|
+
For ``refactor_modularity`` workflows the LLM no longer writes split code.
|
|
7
|
+
Instead it produces a ``SplitPlan`` (boundary decisions only) and
|
|
8
|
+
``ModularitySplitter`` performs all file work deterministically.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import ast
|
|
14
|
+
import json
|
|
15
|
+
import time
|
|
16
|
+
from dataclasses import asdict
|
|
17
|
+
from typing import TYPE_CHECKING, Any
|
|
18
|
+
|
|
19
|
+
from body.atomic.modularity_splitter import ModularitySplitter, SplitResult
|
|
20
|
+
from body.atomic.split_plan import SplitPlan, SplitPlanError
|
|
21
|
+
from body.services.file_service import FileService
|
|
22
|
+
from shared.ai.prompt_model import PromptModel
|
|
23
|
+
from shared.infrastructure.context.limb_workspace import LimbWorkspace
|
|
24
|
+
from shared.infrastructure.context.service import ContextService
|
|
25
|
+
from shared.logger import getLogger
|
|
26
|
+
from shared.models.workflow_models import DetailedPlan, DetailedPlanStep, PhaseResult
|
|
27
|
+
from will.orchestration.decision_tracer import DecisionTracer
|
|
28
|
+
from will.test_generation.sandbox import PytestSandboxRunner
|
|
29
|
+
|
|
30
|
+
from .code_generation.artifact_saver import ArtifactSaver
|
|
31
|
+
from .code_generation.code_sensor import CodeSensor
|
|
32
|
+
from .code_generation.file_path_extractor import FilePathExtractor
|
|
33
|
+
from .code_generation.work_directory_manager import WorkDirectoryManager
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
if TYPE_CHECKING:
|
|
37
|
+
from shared.context import CoreContext
|
|
38
|
+
from will.agents.coder_agent import CoderAgent
|
|
39
|
+
from will.orchestration.workflow_orchestrator import WorkflowContext
|
|
40
|
+
|
|
41
|
+
logger = getLogger(__name__)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _serialize_detailed_plan(detailed_plan: DetailedPlan) -> dict:
|
|
45
|
+
"""Serialize DetailedPlan dataclass to JSON-safe dict."""
|
|
46
|
+
return asdict(detailed_plan)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# ID: 1f1383bb-136d-4403-b359-73c7eae6b355
|
|
50
|
+
class CodeGenerationPhase:
|
|
51
|
+
"""
|
|
52
|
+
Code Generation Phase Component.
|
|
53
|
+
|
|
54
|
+
Orchestrates the Intelligent Reflex Loop. Now injects the
|
|
55
|
+
ActionExecutor via CoreContext into the agent layer.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
def __init__(self, core_context: CoreContext) -> None:
|
|
59
|
+
"""
|
|
60
|
+
Initialize code generation phase.
|
|
61
|
+
"""
|
|
62
|
+
self.context = core_context
|
|
63
|
+
self.tracer = DecisionTracer(
|
|
64
|
+
path_resolver=core_context.path_resolver,
|
|
65
|
+
agent_name="CodeGenerationPhase",
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
self.file_service = FileService(core_context.git_service.repo_path)
|
|
69
|
+
|
|
70
|
+
self.execution_sensor = PytestSandboxRunner(
|
|
71
|
+
file_handler=core_context.file_handler,
|
|
72
|
+
repo_root=str(core_context.git_service.repo_path),
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
self.work_dir_manager = WorkDirectoryManager(self.file_service)
|
|
76
|
+
self.artifact_saver = ArtifactSaver(self.file_service)
|
|
77
|
+
self.code_sensor = CodeSensor(self.execution_sensor)
|
|
78
|
+
self.path_extractor = FilePathExtractor()
|
|
79
|
+
|
|
80
|
+
# ID: e884ad19-65fd-451c-84aa-004494b56a6b
|
|
81
|
+
async def execute(self, context: WorkflowContext) -> PhaseResult:
|
|
82
|
+
"""Execute the reflexive loop with multi-modal sensation."""
|
|
83
|
+
start_time = time.perf_counter()
|
|
84
|
+
|
|
85
|
+
plan = context.results.get("planning", {}).get("execution_plan", [])
|
|
86
|
+
if not plan:
|
|
87
|
+
return PhaseResult(
|
|
88
|
+
name="code_generation", ok=False, error="No plan provided"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# ----- Deterministic split path for modularity refactors ----------
|
|
92
|
+
if context.workflow_type == "refactor_modularity":
|
|
93
|
+
return await self._execute_deterministic_split(context, start_time)
|
|
94
|
+
|
|
95
|
+
logger.info("Starting Intelligent Reflex Loop for %d steps...", len(plan))
|
|
96
|
+
|
|
97
|
+
# 1. Create the Shadow Truth (Limb Workspace)
|
|
98
|
+
workspace = LimbWorkspace(self.context.git_service.repo_path)
|
|
99
|
+
|
|
100
|
+
# 2. Split-Brain Resolution - Localize ContextService to the Workspace:
|
|
101
|
+
global_ctx_svc = self.context.context_service
|
|
102
|
+
|
|
103
|
+
# Fork the senses
|
|
104
|
+
localized_context_service = ContextService(
|
|
105
|
+
qdrant_client=global_ctx_svc._qdrant_client,
|
|
106
|
+
cognitive_service=global_ctx_svc._cognitive_service,
|
|
107
|
+
config=global_ctx_svc.config,
|
|
108
|
+
project_root=str(self.context.git_service.repo_path),
|
|
109
|
+
session_factory=self.context.registry.session,
|
|
110
|
+
workspace=workspace,
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
logger.info(
|
|
114
|
+
"✅ ContextService localized to LimbWorkspace (Shadow Truth enabled)"
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
# Lazy imports reduce cross-layer coupling
|
|
118
|
+
from will.agents.coder_agent import CoderAgent
|
|
119
|
+
from will.orchestration.prompt_pipeline import PromptPipeline
|
|
120
|
+
|
|
121
|
+
# 3. Initialize Agent with the Localized Senses
|
|
122
|
+
coder = CoderAgent(
|
|
123
|
+
cognitive_service=self.context.cognitive_service,
|
|
124
|
+
executor=self.context.action_executor,
|
|
125
|
+
prompt_pipeline=PromptPipeline(self.context.git_service.repo_path),
|
|
126
|
+
auditor_context=self.context.auditor_context,
|
|
127
|
+
repo_root=self.context.git_service.repo_path,
|
|
128
|
+
context_service=localized_context_service, # <--- Passing the localized service
|
|
129
|
+
workspace=workspace,
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
# Create work directory for artifacts
|
|
133
|
+
work_dir_rel = self.work_dir_manager.create_session_directory(context.goal)
|
|
134
|
+
|
|
135
|
+
# Process each task
|
|
136
|
+
detailed_steps = await self._process_tasks(plan, coder, workspace, context.goal)
|
|
137
|
+
|
|
138
|
+
if not detailed_steps:
|
|
139
|
+
return PhaseResult(
|
|
140
|
+
name="code_generation",
|
|
141
|
+
ok=False,
|
|
142
|
+
error="No executable (mutating) steps were processed.",
|
|
143
|
+
duration_sec=time.perf_counter() - start_time,
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
# Save all generated artifacts
|
|
147
|
+
self.artifact_saver.save_generation_artifacts(
|
|
148
|
+
detailed_steps, work_dir_rel, context.goal
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
# Calculate success rate
|
|
152
|
+
success_count = sum(
|
|
153
|
+
1 for s in detailed_steps if not s.metadata.get("generation_failed")
|
|
154
|
+
)
|
|
155
|
+
success_rate = success_count / len(detailed_steps)
|
|
156
|
+
detailed_plan = DetailedPlan(
|
|
157
|
+
goal=context.goal,
|
|
158
|
+
steps=detailed_steps,
|
|
159
|
+
)
|
|
160
|
+
detailed_plan_dict = _serialize_detailed_plan(detailed_plan)
|
|
161
|
+
|
|
162
|
+
return PhaseResult(
|
|
163
|
+
name="code_generation",
|
|
164
|
+
ok=success_rate >= 0.8,
|
|
165
|
+
data={
|
|
166
|
+
"detailed_plan": detailed_plan,
|
|
167
|
+
"detailed_plan_dict": detailed_plan_dict,
|
|
168
|
+
"success_rate": success_rate,
|
|
169
|
+
"total_steps": len(detailed_steps),
|
|
170
|
+
"successful_steps": success_count,
|
|
171
|
+
"work_directory": work_dir_rel,
|
|
172
|
+
},
|
|
173
|
+
duration_sec=time.perf_counter() - start_time,
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
async def _process_tasks(
|
|
177
|
+
self,
|
|
178
|
+
plan: list,
|
|
179
|
+
coder: CoderAgent,
|
|
180
|
+
workspace: LimbWorkspace,
|
|
181
|
+
goal: str,
|
|
182
|
+
) -> list[DetailedPlanStep]:
|
|
183
|
+
"""
|
|
184
|
+
Process execution plan tasks using the reflexive agent.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
plan: Execution plan from planning phase
|
|
188
|
+
coder: CoderAgent instance
|
|
189
|
+
workspace: LimbWorkspace for simulated execution
|
|
190
|
+
goal: Overall refactoring goal
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
List of detailed plan steps with code and metadata
|
|
194
|
+
"""
|
|
195
|
+
detailed_steps = []
|
|
196
|
+
|
|
197
|
+
for i, task in enumerate(plan, 1):
|
|
198
|
+
# Skip tasks without params
|
|
199
|
+
if not hasattr(task, "params"):
|
|
200
|
+
continue
|
|
201
|
+
|
|
202
|
+
# Extract file_path (fixed — no nested loop anymore)
|
|
203
|
+
file_path = self.path_extractor.extract(task, i)
|
|
204
|
+
if not file_path:
|
|
205
|
+
logger.warning(
|
|
206
|
+
"Skipping task with no file_path: %s",
|
|
207
|
+
getattr(task, "step", str(task)),
|
|
208
|
+
)
|
|
209
|
+
continue
|
|
210
|
+
|
|
211
|
+
logger.info("Processing task: %s", getattr(task, "step", str(task)))
|
|
212
|
+
|
|
213
|
+
# Generate or repair code (Reflex #1)
|
|
214
|
+
code = await coder.generate_or_repair(task, goal)
|
|
215
|
+
|
|
216
|
+
# Sense code (Reflex #2)
|
|
217
|
+
sensation = await self.code_sensor.sense(code, file_path, workspace)
|
|
218
|
+
|
|
219
|
+
# Add max_repair_attempts to metadata
|
|
220
|
+
metadata = {
|
|
221
|
+
"sensation": sensation,
|
|
222
|
+
"max_repair_attempts": 3,
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
# If sensation shows pain, attempt repair
|
|
226
|
+
if not sensation.get("passed", True):
|
|
227
|
+
pain_signal = sensation.get("error", "Unknown error")
|
|
228
|
+
logger.warning("Pain detected: %s", pain_signal)
|
|
229
|
+
|
|
230
|
+
current_code = code
|
|
231
|
+
|
|
232
|
+
for attempt in range(metadata["max_repair_attempts"]):
|
|
233
|
+
logger.info(
|
|
234
|
+
"Repair attempt %d/%d...",
|
|
235
|
+
attempt + 1,
|
|
236
|
+
metadata["max_repair_attempts"],
|
|
237
|
+
)
|
|
238
|
+
repaired_code = await coder.generate_or_repair(
|
|
239
|
+
task, goal, pain_signal=pain_signal, previous_code=current_code
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
# Re-sense
|
|
243
|
+
sensation = await self.code_sensor.sense(
|
|
244
|
+
repaired_code, file_path, workspace
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
if sensation.get("passed"):
|
|
248
|
+
code = repaired_code
|
|
249
|
+
metadata["repair_succeeded"] = True
|
|
250
|
+
metadata["repair_attempts"] = attempt + 1
|
|
251
|
+
break
|
|
252
|
+
|
|
253
|
+
# Advance both signal and base code for next attempt
|
|
254
|
+
pain_signal = sensation.get("error", "Unknown error")
|
|
255
|
+
current_code = repaired_code
|
|
256
|
+
|
|
257
|
+
if not sensation.get("passed"):
|
|
258
|
+
metadata["repair_failed"] = True
|
|
259
|
+
metadata["generation_failed"] = True
|
|
260
|
+
|
|
261
|
+
# Build step via from_execution_task so generated code is injected
|
|
262
|
+
# into params. file.create and file.edit require params["code"] to
|
|
263
|
+
# be present — the old manual construction was bypassing this.
|
|
264
|
+
generated_code = code if not metadata.get("generation_failed") else None
|
|
265
|
+
step = DetailedPlanStep.from_execution_task(task, code=generated_code)
|
|
266
|
+
|
|
267
|
+
# Attach metadata
|
|
268
|
+
step.metadata = metadata
|
|
269
|
+
detailed_steps.append(step)
|
|
270
|
+
|
|
271
|
+
return detailed_steps
|
|
272
|
+
|
|
273
|
+
# ------------------------------------------------------------------
|
|
274
|
+
# Deterministic split path (refactor_modularity)
|
|
275
|
+
# ------------------------------------------------------------------
|
|
276
|
+
|
|
277
|
+
_SPLIT_PLAN_SYSTEM_PROMPT = (
|
|
278
|
+
"You are a modularization planner. You receive a Python source file "
|
|
279
|
+
"and its already-identified responsibility clusters. Your ONLY job is "
|
|
280
|
+
"to produce a SplitPlan as JSON. Do not write any code. Do not "
|
|
281
|
+
"explain anything outside the JSON."
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
_SPLIT_PLAN_USER_TEMPLATE = """\
|
|
285
|
+
Responsibility clusters already identified:
|
|
286
|
+
{clusters}
|
|
287
|
+
|
|
288
|
+
File: {source_file}
|
|
289
|
+
|
|
290
|
+
Actual symbols in this file (use ONLY these exact names):
|
|
291
|
+
{actual_symbols}
|
|
292
|
+
|
|
293
|
+
Source (for reference — do NOT rewrite it):
|
|
294
|
+
```python
|
|
295
|
+
{source_code}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
Produce JSON matching exactly this schema:
|
|
299
|
+
{{
|
|
300
|
+
"source_file": "...",
|
|
301
|
+
"new_package_name": "...",
|
|
302
|
+
"modules": [
|
|
303
|
+
{{
|
|
304
|
+
"module_name": "snake_case_name",
|
|
305
|
+
"symbols": ["SymbolName", "function_name"],
|
|
306
|
+
"rationale": "one sentence"
|
|
307
|
+
}}
|
|
308
|
+
]
|
|
309
|
+
}}
|
|
310
|
+
|
|
311
|
+
Rules:
|
|
312
|
+
- Every top-level class and function must appear in exactly one module
|
|
313
|
+
- module_name must be a valid Python identifier
|
|
314
|
+
- At least 2 modules required
|
|
315
|
+
- new_package_name should match the original filename without .py
|
|
316
|
+
|
|
317
|
+
CRITICAL: Your response must be ONLY the JSON object.
|
|
318
|
+
No explanation. No markdown. No text before or after.
|
|
319
|
+
No ```json fences. Start your response with {{ and end with }}.
|
|
320
|
+
"""
|
|
321
|
+
|
|
322
|
+
# ID: c3a1b2d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d
|
|
323
|
+
async def _execute_deterministic_split(
|
|
324
|
+
self, context: WorkflowContext, start_time: float
|
|
325
|
+
) -> PhaseResult:
|
|
326
|
+
"""LLM decides boundaries only; AST machinery does all file work."""
|
|
327
|
+
plan = context.results.get("planning", {}).get("execution_plan", [])
|
|
328
|
+
repo_root = self.context.git_service.repo_path
|
|
329
|
+
|
|
330
|
+
logger.info(
|
|
331
|
+
"Deterministic split path: %d plan step(s) for refactor_modularity",
|
|
332
|
+
len(plan),
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
split_results: list[dict[str, Any]] = []
|
|
336
|
+
|
|
337
|
+
for task in plan:
|
|
338
|
+
file_path_str = getattr(getattr(task, "params", None), "file_path", None)
|
|
339
|
+
if not file_path_str:
|
|
340
|
+
continue
|
|
341
|
+
|
|
342
|
+
source_path = repo_root / file_path_str
|
|
343
|
+
if not source_path.exists():
|
|
344
|
+
logger.warning("Source file not found: %s", source_path)
|
|
345
|
+
continue
|
|
346
|
+
|
|
347
|
+
source_code = source_path.read_text(encoding="utf-8")
|
|
348
|
+
|
|
349
|
+
# --- Extract actual symbol names from AST --------------------
|
|
350
|
+
tree = ast.parse(source_code, filename=file_path_str)
|
|
351
|
+
actual_symbols = [
|
|
352
|
+
node.name
|
|
353
|
+
for node in ast.iter_child_nodes(tree)
|
|
354
|
+
if isinstance(
|
|
355
|
+
node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)
|
|
356
|
+
)
|
|
357
|
+
]
|
|
358
|
+
|
|
359
|
+
# --- Gather responsibility clusters from earlier phases -------
|
|
360
|
+
clusters_raw = context.results.get("planning", {}).get("clusters", [])
|
|
361
|
+
clusters_text = (
|
|
362
|
+
json.dumps(clusters_raw, indent=2)
|
|
363
|
+
if clusters_raw
|
|
364
|
+
else "No pre-identified clusters available. Infer from the source."
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
# --- Ask the LLM for boundary decisions only ------------------
|
|
368
|
+
split_plan_result = await self._request_split_plan(
|
|
369
|
+
source_file=file_path_str,
|
|
370
|
+
source_code=source_code,
|
|
371
|
+
clusters_text=clusters_text,
|
|
372
|
+
actual_symbols=actual_symbols,
|
|
373
|
+
)
|
|
374
|
+
|
|
375
|
+
if split_plan_result is None:
|
|
376
|
+
split_results.append(
|
|
377
|
+
{
|
|
378
|
+
"file": file_path_str,
|
|
379
|
+
"ok": False,
|
|
380
|
+
"error": "LLM failed to produce a valid SplitPlan",
|
|
381
|
+
}
|
|
382
|
+
)
|
|
383
|
+
continue
|
|
384
|
+
|
|
385
|
+
# --- Deterministic split via AST ------------------------------
|
|
386
|
+
splitter = ModularitySplitter()
|
|
387
|
+
try:
|
|
388
|
+
result: SplitResult = splitter.split(source_path, split_plan_result)
|
|
389
|
+
except SplitPlanError as exc:
|
|
390
|
+
logger.error("Split failed for %s: %s", file_path_str, exc)
|
|
391
|
+
split_results.append(
|
|
392
|
+
{
|
|
393
|
+
"file": file_path_str,
|
|
394
|
+
"ok": False,
|
|
395
|
+
"error": str(exc),
|
|
396
|
+
}
|
|
397
|
+
)
|
|
398
|
+
continue
|
|
399
|
+
|
|
400
|
+
split_results.append(
|
|
401
|
+
{
|
|
402
|
+
"file": file_path_str,
|
|
403
|
+
"ok": True,
|
|
404
|
+
"split_result": result,
|
|
405
|
+
"plan": split_plan_result,
|
|
406
|
+
}
|
|
407
|
+
)
|
|
408
|
+
|
|
409
|
+
ok = any(r.get("ok") for r in split_results)
|
|
410
|
+
|
|
411
|
+
return PhaseResult(
|
|
412
|
+
name="code_generation",
|
|
413
|
+
ok=ok,
|
|
414
|
+
data={
|
|
415
|
+
"deterministic_split": True,
|
|
416
|
+
"split_results": split_results,
|
|
417
|
+
},
|
|
418
|
+
duration_sec=time.perf_counter() - start_time,
|
|
419
|
+
)
|
|
420
|
+
|
|
421
|
+
# ID: f1e2d3c4-b5a6-4789-0abc-def012345678
|
|
422
|
+
async def _request_split_plan(
|
|
423
|
+
self,
|
|
424
|
+
source_file: str,
|
|
425
|
+
source_code: str,
|
|
426
|
+
clusters_text: str,
|
|
427
|
+
actual_symbols: list[str],
|
|
428
|
+
) -> SplitPlan | None:
|
|
429
|
+
"""Ask the LLM for a SplitPlan JSON; parse and validate it.
|
|
430
|
+
|
|
431
|
+
Returns None if the LLM response is unparseable or invalid.
|
|
432
|
+
"""
|
|
433
|
+
user_prompt = self._SPLIT_PLAN_USER_TEMPLATE.format(
|
|
434
|
+
clusters=clusters_text,
|
|
435
|
+
source_file=source_file,
|
|
436
|
+
source_code=source_code,
|
|
437
|
+
actual_symbols=", ".join(actual_symbols),
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
try:
|
|
441
|
+
model = PromptModel.load("code_generation_task_step_prompt")
|
|
442
|
+
client = await self.context.cognitive_service.aget_client_for_role(
|
|
443
|
+
model._artifact.manifest.role
|
|
444
|
+
)
|
|
445
|
+
raw_response = await model.invoke(
|
|
446
|
+
context={
|
|
447
|
+
"task_step": (self._SPLIT_PLAN_SYSTEM_PROMPT + "\n\n" + user_prompt)
|
|
448
|
+
},
|
|
449
|
+
client=client,
|
|
450
|
+
user_id="deterministic_split_planner",
|
|
451
|
+
)
|
|
452
|
+
|
|
453
|
+
# Extract JSON from response (may be wrapped in ```json fences)
|
|
454
|
+
json_str = self._extract_json(raw_response)
|
|
455
|
+
plan = SplitPlan.from_llm_json(json_str)
|
|
456
|
+
logger.info(
|
|
457
|
+
"SplitPlan validated: %d modules for %s",
|
|
458
|
+
len(plan.modules),
|
|
459
|
+
source_file,
|
|
460
|
+
)
|
|
461
|
+
return plan
|
|
462
|
+
|
|
463
|
+
except SplitPlanError as exc:
|
|
464
|
+
logger.error("SplitPlan validation failed: %s", exc)
|
|
465
|
+
return None
|
|
466
|
+
except Exception as exc:
|
|
467
|
+
logger.error("SplitPlan request failed: %s", exc)
|
|
468
|
+
return None
|
|
469
|
+
|
|
470
|
+
@staticmethod
|
|
471
|
+
def _extract_json(text: str) -> str:
|
|
472
|
+
"""Strip markdown code fences to expose raw JSON."""
|
|
473
|
+
stripped = text.strip()
|
|
474
|
+
if stripped.startswith("```"):
|
|
475
|
+
# Remove opening fence (```json or ```)
|
|
476
|
+
first_newline = stripped.index("\n")
|
|
477
|
+
stripped = stripped[first_newline + 1 :]
|
|
478
|
+
if stripped.endswith("```"):
|
|
479
|
+
stripped = stripped[:-3]
|
|
480
|
+
return stripped.strip()
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# src/will/phases/execution_phase.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Execution Phase - Applies generated code to filesystem
|
|
5
|
+
|
|
6
|
+
Takes DetailedPlan from CODE_GENERATION phase and executes it
|
|
7
|
+
using ExecutionAgent, respecting write mode and constitutional boundaries.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import time
|
|
13
|
+
from typing import TYPE_CHECKING
|
|
14
|
+
|
|
15
|
+
from body.atomic.executor import ActionExecutor
|
|
16
|
+
from shared.logger import getLogger
|
|
17
|
+
from shared.models.workflow_models import PhaseResult
|
|
18
|
+
from will.agents.execution_agent import ExecutionAgent
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from shared.context import CoreContext
|
|
23
|
+
from will.orchestration.workflow_orchestrator import WorkflowContext
|
|
24
|
+
|
|
25
|
+
logger = getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# ID: 1f2e3d4c-5b6a-7890-cdef-1234567890ab
|
|
29
|
+
class ExecutionPhase:
|
|
30
|
+
"""
|
|
31
|
+
Execution phase - applies generated code to filesystem.
|
|
32
|
+
|
|
33
|
+
Constitutional guarantees:
|
|
34
|
+
- Respects write=False (dry-run mode)
|
|
35
|
+
- Uses ActionExecutor for all filesystem operations
|
|
36
|
+
- Captures files_written for downstream phases
|
|
37
|
+
- Returns success only if all critical steps succeed
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
def __init__(self, context: CoreContext):
|
|
41
|
+
self.context = context
|
|
42
|
+
|
|
43
|
+
# ID: 2a3b4c5d-6e7f-8901-abcd-ef1234567890
|
|
44
|
+
async def execute(self, ctx: WorkflowContext) -> PhaseResult:
|
|
45
|
+
"""Execute the detailed plan from CODE_GENERATION phase."""
|
|
46
|
+
start = time.time()
|
|
47
|
+
|
|
48
|
+
# Extract detailed_plan from previous phase
|
|
49
|
+
code_gen_data = ctx.results.get("code_generation", {})
|
|
50
|
+
|
|
51
|
+
# Deterministic split path: ModularitySplitter produced SplitResults
|
|
52
|
+
# that still need to be written to disk.
|
|
53
|
+
if code_gen_data.get("deterministic_split"):
|
|
54
|
+
split_results = code_gen_data.get("split_results", [])
|
|
55
|
+
return await self._execute_deterministic_split(
|
|
56
|
+
split_results, ctx.write, start
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
detailed_plan = code_gen_data.get("detailed_plan")
|
|
60
|
+
|
|
61
|
+
if not detailed_plan:
|
|
62
|
+
return PhaseResult(
|
|
63
|
+
name="execution",
|
|
64
|
+
ok=False,
|
|
65
|
+
error="No detailed_plan found from code_generation phase",
|
|
66
|
+
duration_sec=time.time() - start,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# Respect write mode from workflow context
|
|
70
|
+
if not ctx.write:
|
|
71
|
+
logger.info("Dry-run mode: Simulating execution without writing files")
|
|
72
|
+
return PhaseResult(
|
|
73
|
+
name="execution",
|
|
74
|
+
ok=True,
|
|
75
|
+
data={
|
|
76
|
+
"dry_run": True,
|
|
77
|
+
"steps_planned": len(detailed_plan.steps),
|
|
78
|
+
"files_written": [],
|
|
79
|
+
},
|
|
80
|
+
duration_sec=time.time() - start,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
# Execute the plan using ExecutionAgent
|
|
84
|
+
logger.info("🚀 Executing %d steps...", len(detailed_plan.steps))
|
|
85
|
+
|
|
86
|
+
executor = ActionExecutor(self.context)
|
|
87
|
+
agent = ExecutionAgent(executor=executor, write=ctx.write)
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
exec_results = await agent.execute_plan(detailed_plan)
|
|
91
|
+
|
|
92
|
+
duration = time.time() - start
|
|
93
|
+
|
|
94
|
+
# ExecutionResults now has simple structure: success, files_written, errors, warnings
|
|
95
|
+
return PhaseResult(
|
|
96
|
+
name="execution",
|
|
97
|
+
ok=exec_results.success,
|
|
98
|
+
data={
|
|
99
|
+
"files_written": exec_results.files_written,
|
|
100
|
+
"errors_count": len(exec_results.errors),
|
|
101
|
+
"warnings_count": len(exec_results.warnings),
|
|
102
|
+
},
|
|
103
|
+
error=(
|
|
104
|
+
""
|
|
105
|
+
if exec_results.success
|
|
106
|
+
else f"{len(exec_results.errors)} errors occurred"
|
|
107
|
+
),
|
|
108
|
+
duration_sec=duration,
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
except Exception as e:
|
|
112
|
+
logger.error("Execution phase crashed: %s", e, exc_info=True)
|
|
113
|
+
return PhaseResult(
|
|
114
|
+
name="execution",
|
|
115
|
+
ok=False,
|
|
116
|
+
error=f"Execution crashed: {e}",
|
|
117
|
+
duration_sec=time.time() - start,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
# ID: 7c8d9e0f-1a2b-3c4d-5e6f-7a8b9c0d1e2f
|
|
121
|
+
async def _execute_deterministic_split(
|
|
122
|
+
self,
|
|
123
|
+
split_results: list[dict],
|
|
124
|
+
write: bool,
|
|
125
|
+
start: float,
|
|
126
|
+
) -> PhaseResult:
|
|
127
|
+
"""Write SplitResult files to disk and remove the original source."""
|
|
128
|
+
file_handler = self.context.file_handler
|
|
129
|
+
repo_root = self.context.git_service.repo_path
|
|
130
|
+
files_written: list[str] = []
|
|
131
|
+
files_deleted: list[str] = []
|
|
132
|
+
|
|
133
|
+
for entry in split_results:
|
|
134
|
+
if not entry.get("ok"):
|
|
135
|
+
continue
|
|
136
|
+
|
|
137
|
+
split_result = entry.get("split_result")
|
|
138
|
+
if split_result is None:
|
|
139
|
+
continue
|
|
140
|
+
|
|
141
|
+
if not write:
|
|
142
|
+
for file_path, _content in split_result.files:
|
|
143
|
+
logger.info("Dry-run: would write %s", file_path)
|
|
144
|
+
if split_result.original_path.exists():
|
|
145
|
+
logger.info("Dry-run: would delete %s", split_result.original_path)
|
|
146
|
+
continue
|
|
147
|
+
|
|
148
|
+
# Write each new module file
|
|
149
|
+
for file_path, content in split_result.files:
|
|
150
|
+
rel_path = str(file_path.relative_to(repo_root))
|
|
151
|
+
file_handler.write_runtime_text(rel_path, content)
|
|
152
|
+
files_written.append(rel_path)
|
|
153
|
+
logger.info("Wrote split module: %s", rel_path)
|
|
154
|
+
|
|
155
|
+
# Delete the original monolith file
|
|
156
|
+
if split_result.original_path.exists():
|
|
157
|
+
rel_original = str(split_result.original_path.relative_to(repo_root))
|
|
158
|
+
file_handler.remove_file(rel_original)
|
|
159
|
+
files_deleted.append(rel_original)
|
|
160
|
+
logger.info("Deleted original: %s", rel_original)
|
|
161
|
+
|
|
162
|
+
if not write:
|
|
163
|
+
return PhaseResult(
|
|
164
|
+
name="execution",
|
|
165
|
+
ok=True,
|
|
166
|
+
data={"dry_run": True, "files_written": []},
|
|
167
|
+
duration_sec=time.time() - start,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
return PhaseResult(
|
|
171
|
+
name="execution",
|
|
172
|
+
ok=bool(files_written),
|
|
173
|
+
data={
|
|
174
|
+
"deterministic_split": True,
|
|
175
|
+
"files_written": files_written,
|
|
176
|
+
"files_deleted": files_deleted,
|
|
177
|
+
},
|
|
178
|
+
duration_sec=time.time() - start,
|
|
179
|
+
)
|