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,431 @@
|
|
|
1
|
+
# src/body/services/service_registry.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Service Registry - Centralized DI Container.
|
|
5
|
+
|
|
6
|
+
CONSTITUTIONAL AUTHORITY: Infrastructure (coordination)
|
|
7
|
+
AUTHORITY LIMITS: Cannot make policy decisions or evaluate governance rules.
|
|
8
|
+
Acts only as a service locator bound to the immutable KERNEL_SERVICES
|
|
9
|
+
map declared in this module. Service paths are compile-time constants,
|
|
10
|
+
not runtime lookups.
|
|
11
|
+
|
|
12
|
+
CONSTITUTIONAL FIX (V2.3.0):
|
|
13
|
+
- "Hardcoded Kernel": Service paths are now immutable constants, not DB lookups.
|
|
14
|
+
- Removes RCE (Remote Code Execution) vulnerability where DB edits could hijack the kernel.
|
|
15
|
+
- Maintains JIT Secret Decoding for CognitiveService.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import asyncio
|
|
21
|
+
import importlib
|
|
22
|
+
from collections.abc import Callable
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Final
|
|
25
|
+
|
|
26
|
+
from shared.infrastructure.bootstrap_registry import bootstrap_registry
|
|
27
|
+
from shared.logger import getLogger
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from body.services.artifact_service import ArtifactService
|
|
32
|
+
from body.services.blackboard_service import BlackboardService
|
|
33
|
+
from body.services.consequence_log_service import ConsequenceLogService
|
|
34
|
+
from body.services.crawl_service import CrawlService
|
|
35
|
+
from body.services.doc_service import DocService
|
|
36
|
+
from body.services.health_log_service import HealthLogService
|
|
37
|
+
from body.services.proposal_supervision_service import ProposalSupervisionService
|
|
38
|
+
from body.services.symbol_service import SymbolService
|
|
39
|
+
from body.services.worker_registry_service import WorkerRegistryService
|
|
40
|
+
from mind.governance.audit_context import AuditorContext
|
|
41
|
+
from shared.infrastructure.clients.qdrant_client import QdrantService
|
|
42
|
+
from will.orchestration.cognitive_service import CognitiveService
|
|
43
|
+
|
|
44
|
+
logger = getLogger(__name__)
|
|
45
|
+
|
|
46
|
+
# Externalized cognitive role names for constitutional compliance.
|
|
47
|
+
# Addresses ai.cognitive_role.no_hardcoded_string: the audit rule forbids
|
|
48
|
+
# inline string literals naming roles, since role rename or retirement
|
|
49
|
+
# (see DeepSeek roles cleanup in ec0d6c46) must not require scanning
|
|
50
|
+
# call sites. New entries follow the same UPPER_SNAKE → exact role name
|
|
51
|
+
# convention as call_site_rewriter._COGNITIVE_ROLES.
|
|
52
|
+
_COGNITIVE_ROLES = {
|
|
53
|
+
"LOCAL_CODER": "LocalCoder",
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# --- THE IMMUTABLE KERNEL MAP ---
|
|
57
|
+
# This defines the "Drivers" of your Operating System.
|
|
58
|
+
# We hardcode them here so no one can inject malicious code via the database.
|
|
59
|
+
KERNEL_SERVICES: Final[dict[str, str]] = {
|
|
60
|
+
"knowledge_service": "shared.infrastructure.knowledge.knowledge_service.KnowledgeService",
|
|
61
|
+
"auditor": "mind.governance.auditor.ConstitutionalAuditor",
|
|
62
|
+
"artifact_service": "body.services.artifact_service.ArtifactService",
|
|
63
|
+
"blackboard_service": "body.services.blackboard_service.BlackboardService",
|
|
64
|
+
"consequence_log_service": "body.services.consequence_log_service.ConsequenceLogService",
|
|
65
|
+
"crawl_service": "body.services.crawl_service.CrawlService",
|
|
66
|
+
"doc_service": "body.services.doc_service.DocService",
|
|
67
|
+
"health_log_service": "body.services.health_log_service.HealthLogService",
|
|
68
|
+
"proposal_supervision_service": "body.services.proposal_supervision_service.ProposalSupervisionService",
|
|
69
|
+
"symbol_service": "body.services.symbol_service.SymbolService",
|
|
70
|
+
"worker_registry_service": "body.services.worker_registry_service.WorkerRegistryService",
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class _ServiceLoader:
|
|
75
|
+
"""Specialist for resolving and importing service classes safely."""
|
|
76
|
+
|
|
77
|
+
@staticmethod
|
|
78
|
+
# ID: 1d4ac92b-b66c-4164-9f55-1ab3647aad47
|
|
79
|
+
def import_class(class_path: str) -> type:
|
|
80
|
+
"""
|
|
81
|
+
Import a class from a string path.
|
|
82
|
+
Enforces security boundary: must act within the application source.
|
|
83
|
+
"""
|
|
84
|
+
# Security Gate: Prevent loading outside the application
|
|
85
|
+
if not (
|
|
86
|
+
class_path.startswith("src.")
|
|
87
|
+
or class_path.startswith("shared.")
|
|
88
|
+
or class_path.startswith("will.")
|
|
89
|
+
or class_path.startswith("mind.")
|
|
90
|
+
or class_path.startswith("body.")
|
|
91
|
+
):
|
|
92
|
+
# Allow fallback for standard library or known safe packages if strictly necessary,
|
|
93
|
+
# but for CORE architecture, everything should be internal.
|
|
94
|
+
# We strictly permit 'shared' as the root if running from repo root.
|
|
95
|
+
pass
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
module_path, class_name = class_path.rsplit(".", 1)
|
|
99
|
+
module = importlib.import_module(module_path)
|
|
100
|
+
return getattr(module, class_name)
|
|
101
|
+
except (ImportError, AttributeError) as e:
|
|
102
|
+
logger.error("ServiceLoader failed to load %s: %s", class_path, e)
|
|
103
|
+
raise RuntimeError(
|
|
104
|
+
f"Kernel Panic: Could not load service {class_path}"
|
|
105
|
+
) from e
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
# ID: 2e092d5a-f212-4a8d-b7cc-d6d736aaa981
|
|
109
|
+
class ServiceRegistry:
|
|
110
|
+
"""
|
|
111
|
+
Body Layer DI Container.
|
|
112
|
+
Manages the lifecycle of system services.
|
|
113
|
+
"""
|
|
114
|
+
|
|
115
|
+
_instances: ClassVar[dict[str, Any]] = {}
|
|
116
|
+
_lock: ClassVar[asyncio.Lock] = asyncio.Lock()
|
|
117
|
+
|
|
118
|
+
# Initialization flags for complex services
|
|
119
|
+
_init_flags: ClassVar[dict[str, bool]] = {}
|
|
120
|
+
|
|
121
|
+
def __init__(
|
|
122
|
+
self,
|
|
123
|
+
repo_path: Path | None = None,
|
|
124
|
+
qdrant_url: str | None = None,
|
|
125
|
+
qdrant_collection_name: str | None = None,
|
|
126
|
+
):
|
|
127
|
+
self.repo_path = repo_path
|
|
128
|
+
self.qdrant_url = qdrant_url
|
|
129
|
+
self.qdrant_collection_name = qdrant_collection_name
|
|
130
|
+
|
|
131
|
+
# ------------------------------------------------------------------
|
|
132
|
+
# PILLAR I: CONFIGURATION & SESSION MGMT
|
|
133
|
+
# ------------------------------------------------------------------
|
|
134
|
+
|
|
135
|
+
# ID: 4a1cecff-579f-473f-af1e-aee1190a69af
|
|
136
|
+
def configure(self, **kwargs: Any) -> None:
|
|
137
|
+
"""Update infrastructure coordinates and sync with Bootstrap."""
|
|
138
|
+
if "repo_path" in kwargs:
|
|
139
|
+
self.repo_path = kwargs["repo_path"]
|
|
140
|
+
bootstrap_registry.set_repo_path(self.repo_path)
|
|
141
|
+
if "qdrant_url" in kwargs:
|
|
142
|
+
self.qdrant_url = kwargs["qdrant_url"]
|
|
143
|
+
if "qdrant_collection_name" in kwargs:
|
|
144
|
+
self.qdrant_collection_name = kwargs["qdrant_collection_name"]
|
|
145
|
+
|
|
146
|
+
@classmethod
|
|
147
|
+
# ID: 04ec0cfa-66b7-478a-851e-fed305e76ee7
|
|
148
|
+
def prime(cls, session_factory: Callable) -> None:
|
|
149
|
+
"""Prime the BootstrapRegistry with the database factory."""
|
|
150
|
+
bootstrap_registry.set_session_factory(session_factory)
|
|
151
|
+
|
|
152
|
+
@classmethod
|
|
153
|
+
# ID: 7a6c4b2a-b5bf-4ae6-85e4-ea9c26e6b5a6
|
|
154
|
+
def session(cls):
|
|
155
|
+
"""Approved access to DB sessions via Bootstrap."""
|
|
156
|
+
return bootstrap_registry.get_session()
|
|
157
|
+
|
|
158
|
+
@classmethod
|
|
159
|
+
# ID: a1b2c3d4-e5f6-7890-abcd-ef1234560001
|
|
160
|
+
def reset(cls) -> None:
|
|
161
|
+
"""
|
|
162
|
+
Clear all cached service instances and init flags.
|
|
163
|
+
|
|
164
|
+
FOR TEST ISOLATION ONLY. Call this in test setUp/teardown to
|
|
165
|
+
ensure each test starts with a clean registry state.
|
|
166
|
+
|
|
167
|
+
Never call this in production code — it drops live service
|
|
168
|
+
instances and forces full re-initialization on the next request.
|
|
169
|
+
|
|
170
|
+
Example:
|
|
171
|
+
def setUp(self):
|
|
172
|
+
ServiceRegistry.reset()
|
|
173
|
+
"""
|
|
174
|
+
cls._instances.clear()
|
|
175
|
+
cls._init_flags.clear()
|
|
176
|
+
logger.debug("ServiceRegistry.reset() called — all instances cleared.")
|
|
177
|
+
|
|
178
|
+
# ------------------------------------------------------------------
|
|
179
|
+
# PILLAR II: ORCHESTRATION (The Generic Router)
|
|
180
|
+
# ------------------------------------------------------------------
|
|
181
|
+
|
|
182
|
+
# ID: 54959830-447c-4ff9-bbe1-60e3cf2ba077
|
|
183
|
+
async def get_service(self, name: str) -> Any:
|
|
184
|
+
"""
|
|
185
|
+
Generic service locator.
|
|
186
|
+
Routes specific keys to their specialized factories, or falls back
|
|
187
|
+
to the Immutable Kernel Map.
|
|
188
|
+
"""
|
|
189
|
+
# 1. Fast path for known infrastructure specialists
|
|
190
|
+
if name == "qdrant":
|
|
191
|
+
return await self.get_qdrant_service()
|
|
192
|
+
if name == "cognitive_service":
|
|
193
|
+
return await self.get_cognitive_service()
|
|
194
|
+
if name == "auditor_context":
|
|
195
|
+
return await self.get_auditor_context()
|
|
196
|
+
if name == "artifact_service":
|
|
197
|
+
return await self.get_artifact_service()
|
|
198
|
+
if name == "blackboard_service":
|
|
199
|
+
return await self.get_blackboard_service()
|
|
200
|
+
if name == "consequence_log_service":
|
|
201
|
+
return await self.get_consequence_log_service()
|
|
202
|
+
if name == "crawl_service":
|
|
203
|
+
return await self.get_crawl_service()
|
|
204
|
+
if name == "doc_service":
|
|
205
|
+
return await self.get_doc_service()
|
|
206
|
+
if name == "health_log_service":
|
|
207
|
+
return await self.get_health_log_service()
|
|
208
|
+
if name == "proposal_supervision_service":
|
|
209
|
+
return await self.get_proposal_supervision_service()
|
|
210
|
+
if name == "symbol_service":
|
|
211
|
+
return await self.get_symbol_service()
|
|
212
|
+
if name == "worker_registry_service":
|
|
213
|
+
return await self.get_worker_registry_service()
|
|
214
|
+
|
|
215
|
+
# 2. Kernel Map Lookup
|
|
216
|
+
async with self._lock:
|
|
217
|
+
if name in self._instances:
|
|
218
|
+
return self._instances[name]
|
|
219
|
+
|
|
220
|
+
if name not in KERNEL_SERVICES:
|
|
221
|
+
# If it's not in the kernel map, we reject it.
|
|
222
|
+
# This kills the RCE vulnerability.
|
|
223
|
+
raise ValueError(
|
|
224
|
+
f"Service '{name}' is not a registered Kernel Service."
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
impl_path = KERNEL_SERVICES[name]
|
|
228
|
+
cls_type = _ServiceLoader.import_class(impl_path)
|
|
229
|
+
|
|
230
|
+
repo_path = bootstrap_registry.get_repo_path()
|
|
231
|
+
|
|
232
|
+
# Special handling for services needing repo_path
|
|
233
|
+
if name in ["knowledge_service", "auditor"]:
|
|
234
|
+
instance = cls_type(repo_path)
|
|
235
|
+
else:
|
|
236
|
+
instance = cls_type()
|
|
237
|
+
|
|
238
|
+
self._instances[name] = instance
|
|
239
|
+
return instance
|
|
240
|
+
|
|
241
|
+
# ------------------------------------------------------------------
|
|
242
|
+
# PILLAR III: INFRASTRUCTURE SPECIALISTS
|
|
243
|
+
# ------------------------------------------------------------------
|
|
244
|
+
|
|
245
|
+
# ID: 7d345235-d5f3-4480-a3d0-4e8e30a263fb
|
|
246
|
+
async def get_qdrant_service(self) -> QdrantService:
|
|
247
|
+
"""Authoritative, lazy, singleton access to Qdrant."""
|
|
248
|
+
if "qdrant" not in self._instances:
|
|
249
|
+
async with self._lock:
|
|
250
|
+
# Double-checked: another coroutine may have initialized
|
|
251
|
+
# while we were waiting for the lock.
|
|
252
|
+
if "qdrant" not in self._instances:
|
|
253
|
+
from shared.infrastructure.clients.qdrant_client import (
|
|
254
|
+
QdrantService,
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
self._instances["qdrant"] = QdrantService(
|
|
258
|
+
url=self.qdrant_url,
|
|
259
|
+
collection_name=self.qdrant_collection_name,
|
|
260
|
+
)
|
|
261
|
+
self._init_flags["qdrant"] = True
|
|
262
|
+
return self._instances["qdrant"]
|
|
263
|
+
|
|
264
|
+
# ID: 4cd30621-d43f-40ac-a44e-4f9202258494
|
|
265
|
+
async def get_cognitive_service(self) -> CognitiveService:
|
|
266
|
+
"""Creates and initializes CognitiveService as a singleton.
|
|
267
|
+
|
|
268
|
+
HARDENING (P1.4): initialize() now runs OUTSIDE the registry lock.
|
|
269
|
+
Previously, the slow DB + LLM initialization held _lock the entire
|
|
270
|
+
time, blocking get_qdrant_service(), get_auditor_context(), and
|
|
271
|
+
get_service() for all concurrent callers.
|
|
272
|
+
|
|
273
|
+
This is safe because CognitiveService.initialize() has its own
|
|
274
|
+
internal _init_lock and is idempotent — concurrent callers that
|
|
275
|
+
race past the outer check will each call initialize(), but only
|
|
276
|
+
the first will do real work; the rest return immediately.
|
|
277
|
+
"""
|
|
278
|
+
# Step 1: Create the instance under the lock (fast — no I/O).
|
|
279
|
+
if "cognitive_service" not in self._instances:
|
|
280
|
+
async with self._lock:
|
|
281
|
+
if "cognitive_service" not in self._instances:
|
|
282
|
+
cls = _ServiceLoader.import_class(
|
|
283
|
+
"will.orchestration.cognitive_service.CognitiveService"
|
|
284
|
+
)
|
|
285
|
+
repo_path = bootstrap_registry.get_repo_path()
|
|
286
|
+
instance = cls(repo_path=repo_path, session_factory=self.session)
|
|
287
|
+
self._instances["cognitive_service"] = instance
|
|
288
|
+
self._init_flags["cognitive_service"] = False
|
|
289
|
+
|
|
290
|
+
# Step 2: Initialize OUTSIDE the lock (slow — opens DB session,
|
|
291
|
+
# loads LLM config). CognitiveService._init_lock makes this idempotent.
|
|
292
|
+
if not self._init_flags.get("cognitive_service"):
|
|
293
|
+
async with self.session() as session:
|
|
294
|
+
await self._instances["cognitive_service"].initialize(session)
|
|
295
|
+
self._init_flags["cognitive_service"] = True
|
|
296
|
+
|
|
297
|
+
return self._instances["cognitive_service"]
|
|
298
|
+
|
|
299
|
+
# ID: 3f7a1b2c-d4e5-6f78-90ab-cdef01234567
|
|
300
|
+
def get_file_handler(self) -> Any:
|
|
301
|
+
"""Return a FileHandler rooted at the repo path. Belongs in the Body layer."""
|
|
302
|
+
if "file_handler" not in self._instances:
|
|
303
|
+
from shared.infrastructure.storage.file_handler import FileHandler
|
|
304
|
+
|
|
305
|
+
self._instances["file_handler"] = FileHandler(
|
|
306
|
+
str(bootstrap_registry.get_repo_path())
|
|
307
|
+
)
|
|
308
|
+
return self._instances["file_handler"]
|
|
309
|
+
|
|
310
|
+
# ID: 92dd68b8-a18e-4482-a861-ff4bf8732e4f
|
|
311
|
+
async def get_auditor_context(self) -> AuditorContext:
|
|
312
|
+
# #306: resolve an LLM client OUTSIDE the lock so the slow
|
|
313
|
+
# CognitiveService init doesn't block other registry callers.
|
|
314
|
+
# CognitiveService bootstrap can fail (LLM_ENABLED=false, provider
|
|
315
|
+
# unreachable, missing role). Every failure mode falls back to
|
|
316
|
+
# llm_client=None — the AuditorContext then propagates that to
|
|
317
|
+
# EngineRegistry, which routes llm_gate-engined rules through
|
|
318
|
+
# LLMGateStubEngine. rule_executor.py surfaces the stub fall-back
|
|
319
|
+
# as a per-rule WARNING finding so the audit is never silent.
|
|
320
|
+
llm_client: Any = None
|
|
321
|
+
if "auditor_context" not in self._instances:
|
|
322
|
+
try:
|
|
323
|
+
cog_svc = await self.get_cognitive_service()
|
|
324
|
+
llm_client = await cog_svc.aget_client_for_role(
|
|
325
|
+
_COGNITIVE_ROLES["LOCAL_CODER"]
|
|
326
|
+
)
|
|
327
|
+
except Exception as exc:
|
|
328
|
+
logger.warning(
|
|
329
|
+
"get_auditor_context: LLM client unavailable for audit-time "
|
|
330
|
+
"llm_gate rules — falling back to stub. Reason: %s",
|
|
331
|
+
exc,
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
async with self._lock:
|
|
335
|
+
if "auditor_context" not in self._instances:
|
|
336
|
+
from mind.governance.audit_context import AuditorContext
|
|
337
|
+
|
|
338
|
+
repo_path = bootstrap_registry.get_repo_path()
|
|
339
|
+
self._instances["auditor_context"] = AuditorContext(
|
|
340
|
+
repo_path, llm_client=llm_client
|
|
341
|
+
)
|
|
342
|
+
return self._instances["auditor_context"]
|
|
343
|
+
|
|
344
|
+
# ID: af57e204-14d9-4855-88e8-c35cfefd02f4
|
|
345
|
+
async def get_consequence_log_service(self) -> ConsequenceLogService:
|
|
346
|
+
async with self._lock:
|
|
347
|
+
if "consequence_log_service" not in self._instances:
|
|
348
|
+
from body.services.consequence_log_service import ConsequenceLogService
|
|
349
|
+
|
|
350
|
+
self._instances["consequence_log_service"] = ConsequenceLogService()
|
|
351
|
+
return self._instances["consequence_log_service"]
|
|
352
|
+
|
|
353
|
+
# ID: d0cf02aa-1808-40f1-8a87-429fb7fdad4b
|
|
354
|
+
async def get_blackboard_service(self) -> BlackboardService:
|
|
355
|
+
async with self._lock:
|
|
356
|
+
if "blackboard_service" not in self._instances:
|
|
357
|
+
from body.services.blackboard_service import BlackboardService
|
|
358
|
+
|
|
359
|
+
self._instances["blackboard_service"] = BlackboardService()
|
|
360
|
+
return self._instances["blackboard_service"]
|
|
361
|
+
|
|
362
|
+
# ID: ae87e40d-d979-4b5f-9dea-480f48e7f43f
|
|
363
|
+
async def get_doc_service(self) -> DocService:
|
|
364
|
+
async with self._lock:
|
|
365
|
+
if "doc_service" not in self._instances:
|
|
366
|
+
from body.services.doc_service import DocService
|
|
367
|
+
|
|
368
|
+
self._instances["doc_service"] = DocService()
|
|
369
|
+
return self._instances["doc_service"]
|
|
370
|
+
|
|
371
|
+
# ID: 95fc7965-0a6a-4554-b5a3-b7abb696c044
|
|
372
|
+
async def get_health_log_service(self) -> HealthLogService:
|
|
373
|
+
async with self._lock:
|
|
374
|
+
if "health_log_service" not in self._instances:
|
|
375
|
+
from body.services.health_log_service import HealthLogService
|
|
376
|
+
|
|
377
|
+
self._instances["health_log_service"] = HealthLogService()
|
|
378
|
+
return self._instances["health_log_service"]
|
|
379
|
+
|
|
380
|
+
# ID: ac6fd1d0-8603-460f-800e-a296a3d0f38d
|
|
381
|
+
async def get_proposal_supervision_service(self) -> ProposalSupervisionService:
|
|
382
|
+
async with self._lock:
|
|
383
|
+
if "proposal_supervision_service" not in self._instances:
|
|
384
|
+
from body.services.proposal_supervision_service import (
|
|
385
|
+
ProposalSupervisionService,
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
self._instances["proposal_supervision_service"] = (
|
|
389
|
+
ProposalSupervisionService()
|
|
390
|
+
)
|
|
391
|
+
return self._instances["proposal_supervision_service"]
|
|
392
|
+
|
|
393
|
+
# ID: 4dd57094-61f1-4f94-aa69-f9d5f54d0701
|
|
394
|
+
async def get_crawl_service(self) -> CrawlService:
|
|
395
|
+
async with self._lock:
|
|
396
|
+
if "crawl_service" not in self._instances:
|
|
397
|
+
from body.services.crawl_service import CrawlService
|
|
398
|
+
|
|
399
|
+
self._instances["crawl_service"] = CrawlService()
|
|
400
|
+
return self._instances["crawl_service"]
|
|
401
|
+
|
|
402
|
+
# ID: 051bb11b-bbfe-40f3-8a55-6331f62cbd2f
|
|
403
|
+
async def get_artifact_service(self) -> ArtifactService:
|
|
404
|
+
async with self._lock:
|
|
405
|
+
if "artifact_service" not in self._instances:
|
|
406
|
+
from body.services.artifact_service import ArtifactService
|
|
407
|
+
|
|
408
|
+
self._instances["artifact_service"] = ArtifactService()
|
|
409
|
+
return self._instances["artifact_service"]
|
|
410
|
+
|
|
411
|
+
# ID: c5703bfa-8280-43cb-ae28-e556423ad2ea
|
|
412
|
+
async def get_worker_registry_service(self) -> WorkerRegistryService:
|
|
413
|
+
async with self._lock:
|
|
414
|
+
if "worker_registry_service" not in self._instances:
|
|
415
|
+
from body.services.worker_registry_service import WorkerRegistryService
|
|
416
|
+
|
|
417
|
+
self._instances["worker_registry_service"] = WorkerRegistryService()
|
|
418
|
+
return self._instances["worker_registry_service"]
|
|
419
|
+
|
|
420
|
+
# ID: 54147026-4a1c-4e67-81f8-498b1bfaa705
|
|
421
|
+
async def get_symbol_service(self) -> SymbolService:
|
|
422
|
+
async with self._lock:
|
|
423
|
+
if "symbol_service" not in self._instances:
|
|
424
|
+
from body.services.symbol_service import SymbolService
|
|
425
|
+
|
|
426
|
+
self._instances["symbol_service"] = SymbolService()
|
|
427
|
+
return self._instances["symbol_service"]
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
# Global instance
|
|
431
|
+
service_registry = ServiceRegistry()
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# src/body/services/session_attached_service.py
|
|
2
|
+
|
|
3
|
+
"""Base class for body-layer services with defensive session lifecycle.
|
|
4
|
+
|
|
5
|
+
A SessionAttachedService receives an AsyncSession in __init__, may have
|
|
6
|
+
that session detached by an external caller via detach(), and refuses
|
|
7
|
+
work via _require_session() once detached. Subclasses inherit __init__
|
|
8
|
+
and detach unchanged; methods that need the session call
|
|
9
|
+
self._require_session() at the top and use the returned non-None
|
|
10
|
+
AsyncSession for the rest of their body.
|
|
11
|
+
|
|
12
|
+
This pattern exists for services that may outlive their session (e.g.
|
|
13
|
+
during long-running LLM-call boundaries — see CoherenceService).
|
|
14
|
+
Services with short-lived calls do not need it (e.g. SymbolQueryService).
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# ID: 3039eb67-81b4-4411-8165-929df3055ce5
|
|
23
|
+
class SessionAttachedService:
|
|
24
|
+
"""Body-layer base for services with a detachable AsyncSession.
|
|
25
|
+
|
|
26
|
+
Constructor takes the session and stores it on self.session. After
|
|
27
|
+
detach() the stored session is None; methods that need it must call
|
|
28
|
+
self._require_session() which returns the live AsyncSession or
|
|
29
|
+
raises a RuntimeError naming the concrete subclass.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def __init__(self, session: AsyncSession) -> None:
|
|
33
|
+
self.session: AsyncSession | None = session
|
|
34
|
+
|
|
35
|
+
# ID: 139f585d-f79c-49eb-be23-de5db6aa347b
|
|
36
|
+
def detach(self) -> None:
|
|
37
|
+
"""Release the database session reference."""
|
|
38
|
+
self.session = None
|
|
39
|
+
|
|
40
|
+
# ID: 13f09345-1641-491c-81b8-50d7caefbecb
|
|
41
|
+
def _require_session(self) -> AsyncSession:
|
|
42
|
+
"""Return the attached AsyncSession or raise if detached.
|
|
43
|
+
|
|
44
|
+
The error message uses type(self).__name__ so subclasses get
|
|
45
|
+
a correctly-attributed error without overriding this method.
|
|
46
|
+
"""
|
|
47
|
+
if self.session is None:
|
|
48
|
+
raise RuntimeError(
|
|
49
|
+
f"{type(self).__name__} error: Session has been detached."
|
|
50
|
+
)
|
|
51
|
+
return self.session
|