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,261 @@
|
|
|
1
|
+
# src/will/agents/planner_agent.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
The PlannerAgent is responsible for decomposing a high-level user goal
|
|
5
|
+
into a concrete, step-by-step execution plan.
|
|
6
|
+
|
|
7
|
+
CONSTITUTIONAL ENHANCEMENT (V2.3.0):
|
|
8
|
+
"Legal Counsel": Now performs RAG (Retrieval Augmented Generation) against
|
|
9
|
+
the Constitution before planning.
|
|
10
|
+
The Planner searches the 'core_policies' vector collection for rules relevant
|
|
11
|
+
to the specific user goal and injects them into the prompt.
|
|
12
|
+
Prevents "Trial by Fire" (proposing illegal plans that get blocked by the Body).
|
|
13
|
+
|
|
14
|
+
HARDENING (V2.3.0):
|
|
15
|
+
- Removed non-deterministic random cleanup to satisfy P1.2.
|
|
16
|
+
- Cleaned imports to reduce layer leakage.
|
|
17
|
+
- Memory cleanup is now an explicit CLI command only (core-admin cleanup memory).
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import json
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
from body.atomic.registry import action_registry
|
|
26
|
+
from shared.ai.prompt_model import PromptModel
|
|
27
|
+
from shared.infrastructure.clients.qdrant_client import QdrantService
|
|
28
|
+
from shared.logger import getLogger
|
|
29
|
+
from shared.models import ExecutionTask, PlanExecutionError
|
|
30
|
+
from shared.path_resolver import PathResolver
|
|
31
|
+
from will.agents.base_planner import build_planning_prompt, parse_and_validate_plan
|
|
32
|
+
from will.orchestration.cognitive_service import CognitiveService
|
|
33
|
+
from will.orchestration.decision_tracer import DecisionTracer
|
|
34
|
+
from will.tools.policy_vectorizer import PolicyVectorizer
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
logger = getLogger(__name__)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# ID: c0bf833c-f3a2-4508-8cd0-1d6474eebb4d
|
|
41
|
+
class PlannerAgent:
|
|
42
|
+
"""Decomposes goals into constitutionally-aligned executable plans."""
|
|
43
|
+
|
|
44
|
+
def __init__(
|
|
45
|
+
self,
|
|
46
|
+
cognitive_service: CognitiveService,
|
|
47
|
+
repo_path: Path,
|
|
48
|
+
qdrant_service: QdrantService | None = None,
|
|
49
|
+
max_retries: int = 3,
|
|
50
|
+
):
|
|
51
|
+
self.cognitive_service = cognitive_service
|
|
52
|
+
self.repo_path = repo_path
|
|
53
|
+
self.max_retries = max_retries
|
|
54
|
+
self.tracer = DecisionTracer()
|
|
55
|
+
|
|
56
|
+
# PolicyVectorizer requires qdrant_service ? degrade gracefully if absent
|
|
57
|
+
if qdrant_service is not None:
|
|
58
|
+
self.policy_vectorizer = PolicyVectorizer(
|
|
59
|
+
repo_root=repo_path,
|
|
60
|
+
cognitive_service=cognitive_service,
|
|
61
|
+
qdrant_service=qdrant_service,
|
|
62
|
+
)
|
|
63
|
+
else:
|
|
64
|
+
self.policy_vectorizer = None
|
|
65
|
+
logger.warning("PlannerAgent: Qdrant not available, policy RAG disabled.")
|
|
66
|
+
|
|
67
|
+
# Load PromptModel artifact once
|
|
68
|
+
self.plan_goal_model = PromptModel.load("plan_goal")
|
|
69
|
+
|
|
70
|
+
# ID: 52208224-fea7-4d79-baee-d3b07d634624
|
|
71
|
+
async def create_execution_plan(
|
|
72
|
+
self, goal: str, reconnaissance_report: str = ""
|
|
73
|
+
) -> list[ExecutionTask]:
|
|
74
|
+
"""
|
|
75
|
+
Creates an execution plan from a user goal and a reconnaissance report.
|
|
76
|
+
|
|
77
|
+
CONSTITUTIONAL COMPLIANCE:
|
|
78
|
+
- P1.2: Pure planning ? no side effects, no random, no cleanup calls.
|
|
79
|
+
- Legal Counsel: Fetches relevant constitutional rules via RAG before planning.
|
|
80
|
+
- Tracing: Records decision for every plan created (planning.trace_mandatory).
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
goal: High-level user goal
|
|
84
|
+
reconnaissance_report: Optional context from ReconnaissanceAgent
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
List of ExecutionTask objects representing the plan
|
|
88
|
+
"""
|
|
89
|
+
# LEGAL COUNSEL: Fetch relevant constitutional rules for this goal
|
|
90
|
+
constitutional_context = await self._fetch_constitutional_context(goal)
|
|
91
|
+
|
|
92
|
+
# Load QA constraints from policy files
|
|
93
|
+
qa_constraints = self._load_qa_constraints()
|
|
94
|
+
|
|
95
|
+
# Enrich the reconnaissance report with constitutional rules and QA requirements
|
|
96
|
+
enriched_recon = (
|
|
97
|
+
f"{reconnaissance_report}\n{constitutional_context}\n{qa_constraints}"
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# Build action descriptions from the live Registry
|
|
101
|
+
actions = action_registry.list_all()
|
|
102
|
+
action_descriptions = json.dumps(
|
|
103
|
+
[
|
|
104
|
+
{
|
|
105
|
+
"action_id": a.action_id,
|
|
106
|
+
"description": a.description,
|
|
107
|
+
"impact": a.impact_level,
|
|
108
|
+
}
|
|
109
|
+
for a in actions
|
|
110
|
+
],
|
|
111
|
+
indent=2,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Load the planning prompt template
|
|
115
|
+
path_resolver = PathResolver(self.repo_path)
|
|
116
|
+
try:
|
|
117
|
+
prompt_dir = path_resolver.prompt("planner_agent")
|
|
118
|
+
prompt_template = (prompt_dir / "system.txt").read_text(encoding="utf-8")
|
|
119
|
+
except FileNotFoundError:
|
|
120
|
+
logger.error(
|
|
121
|
+
"Constitutional prompt 'planner_agent/system.txt' missing from var/prompts/"
|
|
122
|
+
)
|
|
123
|
+
raise
|
|
124
|
+
|
|
125
|
+
prompt = build_planning_prompt(
|
|
126
|
+
path_resolver=PathResolver(self.repo_path),
|
|
127
|
+
goal=goal,
|
|
128
|
+
action_descriptions_str=action_descriptions,
|
|
129
|
+
reconnaissance_report=enriched_recon,
|
|
130
|
+
prompt_template=prompt_template,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
client = await self.cognitive_service.aget_client_for_role(
|
|
134
|
+
self.plan_goal_model._artifact.manifest.role
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
for attempt in range(self.max_retries):
|
|
138
|
+
logger.info(
|
|
139
|
+
"? Planning execution steps (Attempt %d/%d)...",
|
|
140
|
+
attempt + 1,
|
|
141
|
+
self.max_retries,
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
response_text = await self.plan_goal_model.invoke(
|
|
145
|
+
context={
|
|
146
|
+
"prompt": prompt,
|
|
147
|
+
"goal": goal,
|
|
148
|
+
"action_descriptions_str": action_descriptions,
|
|
149
|
+
"reconnaissance_report": enriched_recon,
|
|
150
|
+
},
|
|
151
|
+
client=client,
|
|
152
|
+
user_id="planner_agent",
|
|
153
|
+
)
|
|
154
|
+
if response_text:
|
|
155
|
+
try:
|
|
156
|
+
plan = parse_and_validate_plan(response_text)
|
|
157
|
+
|
|
158
|
+
# MANDATORY TRACING: Record the final plan decision (planning.trace_mandatory)
|
|
159
|
+
self.tracer.record(
|
|
160
|
+
agent=self.__class__.__name__,
|
|
161
|
+
decision_type="task_execution",
|
|
162
|
+
rationale=(
|
|
163
|
+
"Decomposed goal into actionable steps "
|
|
164
|
+
"based on Constitution and QA standards"
|
|
165
|
+
),
|
|
166
|
+
chosen_action=f"Generated plan with {len(plan)} steps",
|
|
167
|
+
context={"goal": goal, "steps": len(plan)},
|
|
168
|
+
confidence=0.9,
|
|
169
|
+
)
|
|
170
|
+
return plan
|
|
171
|
+
|
|
172
|
+
except PlanExecutionError as e:
|
|
173
|
+
logger.warning(
|
|
174
|
+
"Plan validation failed on attempt %d: %s", attempt + 1, e
|
|
175
|
+
)
|
|
176
|
+
if attempt == self.max_retries - 1:
|
|
177
|
+
raise
|
|
178
|
+
|
|
179
|
+
self.tracer.record(
|
|
180
|
+
agent=self.__class__.__name__,
|
|
181
|
+
decision_type="task_execution",
|
|
182
|
+
rationale=(
|
|
183
|
+
"Exhausted retries without producing a response; returning empty plan"
|
|
184
|
+
),
|
|
185
|
+
chosen_action="Returned empty plan after exhausted retries",
|
|
186
|
+
context={"goal": goal, "steps": 0, "attempts": self.max_retries},
|
|
187
|
+
confidence=0.0,
|
|
188
|
+
)
|
|
189
|
+
return []
|
|
190
|
+
|
|
191
|
+
# ID: b3e7f1a2-5c9d-4e8f-a2b6-c8d1e4f7a3b9
|
|
192
|
+
async def _fetch_constitutional_context(self, goal: str) -> str:
|
|
193
|
+
"""
|
|
194
|
+
Performs RAG against the Constitution for rules relevant to this goal.
|
|
195
|
+
|
|
196
|
+
This is the "Legal Counsel" step: the planner consults constitutional
|
|
197
|
+
rules before proposing a plan, preventing illegal proposals.
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
goal: The planning goal to search against
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
Formatted string of relevant constitutional rules, or empty string
|
|
204
|
+
"""
|
|
205
|
+
try:
|
|
206
|
+
policy_hits = await self.policy_vectorizer.search_policies(
|
|
207
|
+
query=goal, limit=5
|
|
208
|
+
)
|
|
209
|
+
if not policy_hits:
|
|
210
|
+
return ""
|
|
211
|
+
|
|
212
|
+
rules_text = "\n### Relevant Constitutional Rules\n"
|
|
213
|
+
for hit in policy_hits:
|
|
214
|
+
payload = hit.get("payload", {})
|
|
215
|
+
rule_id = payload.get("rule_id", "unknown")
|
|
216
|
+
statement = payload.get("statement", "")
|
|
217
|
+
enforcement = payload.get("enforcement", "reporting")
|
|
218
|
+
rules_text += f"- [{enforcement.upper()}] {rule_id}: {statement}\n"
|
|
219
|
+
|
|
220
|
+
return rules_text
|
|
221
|
+
|
|
222
|
+
except Exception as e:
|
|
223
|
+
# Legal Counsel failure is non-fatal ? plan without it, log the gap
|
|
224
|
+
logger.warning(
|
|
225
|
+
"Constitutional context fetch failed (planning without RAG): %s", e
|
|
226
|
+
)
|
|
227
|
+
return ""
|
|
228
|
+
|
|
229
|
+
# ID: d4f8e2c1-b7a5-9e3f-c6d2-a1f4e7b9c3d5
|
|
230
|
+
def _load_qa_constraints(self) -> str:
|
|
231
|
+
"""
|
|
232
|
+
Loads QA constraints from constitutional policy files.
|
|
233
|
+
|
|
234
|
+
Uses PathResolver (injected via repo_path) instead of importing
|
|
235
|
+
settings directly, to comply with architecture.boundary.settings_access.
|
|
236
|
+
"""
|
|
237
|
+
import json
|
|
238
|
+
|
|
239
|
+
import yaml
|
|
240
|
+
|
|
241
|
+
path_resolver = PathResolver(self.repo_path)
|
|
242
|
+
|
|
243
|
+
for policy_name in ["purity", "quality_assurance"]:
|
|
244
|
+
try:
|
|
245
|
+
qa_path = path_resolver.policy(policy_name)
|
|
246
|
+
if qa_path.exists():
|
|
247
|
+
content = qa_path.read_text(encoding="utf-8")
|
|
248
|
+
data = (
|
|
249
|
+
json.loads(content)
|
|
250
|
+
if qa_path.suffix == ".json"
|
|
251
|
+
else yaml.safe_load(content)
|
|
252
|
+
)
|
|
253
|
+
rules = data.get("rules", [])
|
|
254
|
+
return (
|
|
255
|
+
f"\n### Quality Assurance Targets\n"
|
|
256
|
+
f"{json.dumps(rules, indent=2)}"
|
|
257
|
+
)
|
|
258
|
+
except Exception:
|
|
259
|
+
continue
|
|
260
|
+
|
|
261
|
+
return "\n### Quality Assurance Targets\n- Ensure 75%+ test coverage."
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# src/will/agents/resource_selector.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Mind Reader: Applies constitutional rules for resource selection.
|
|
5
|
+
Stateless - just applies rules from Mind to select best resource.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
|
|
12
|
+
from shared.infrastructure.database.models import (
|
|
13
|
+
CognitiveRole,
|
|
14
|
+
LlmResource,
|
|
15
|
+
RoleResourceAssignment,
|
|
16
|
+
)
|
|
17
|
+
from shared.logger import getLogger
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
logger = getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# ID: 208f325a-f664-4f3d-9ad3-7b481e1414f9
|
|
24
|
+
class ResourceSelector:
|
|
25
|
+
"""
|
|
26
|
+
Stateless rule applier: Given roles and resources from Mind,
|
|
27
|
+
select the best match based on constitutional rules.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
@staticmethod
|
|
31
|
+
# ID: 3398db27-785f-4e20-bf33-bd962c8ef8c8
|
|
32
|
+
def select_resource_for_role(
|
|
33
|
+
role_name: str,
|
|
34
|
+
roles: list[CognitiveRole],
|
|
35
|
+
resources: list[LlmResource],
|
|
36
|
+
assignments: list[RoleResourceAssignment] | None = None,
|
|
37
|
+
system_operating_mode: str = "local_only",
|
|
38
|
+
) -> LlmResource | None:
|
|
39
|
+
"""
|
|
40
|
+
Apply Mind rules to select resource for role.
|
|
41
|
+
Pure function - no state, no side effects.
|
|
42
|
+
|
|
43
|
+
ADR-052 Phase 3: the role→resource override now arrives via
|
|
44
|
+
``assignments`` (the role_resource_assignments table), not via
|
|
45
|
+
the dropped ``cognitive_roles.assigned_resource`` column. The
|
|
46
|
+
primary assignment is the active row at ``priority=1`` for the
|
|
47
|
+
role. When ``assignments`` is ``None`` or empty, the selector
|
|
48
|
+
falls back to qualified-by-capability scoring.
|
|
49
|
+
|
|
50
|
+
ADR-052 principle #6 (#333): resources are filtered by locality
|
|
51
|
+
against the effective operating mode — ``role.operating_mode``
|
|
52
|
+
if set, otherwise ``system_operating_mode`` — before any
|
|
53
|
+
assignment lookup or capability check.
|
|
54
|
+
"""
|
|
55
|
+
role = next((r for r in roles if r.role == role_name), None)
|
|
56
|
+
if not role:
|
|
57
|
+
logger.error("Role '%s' not found in Mind", role_name)
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
effective_mode = role.operating_mode or system_operating_mode
|
|
61
|
+
resources = ResourceSelector._filter_by_locality(
|
|
62
|
+
resources, effective_mode, role_name
|
|
63
|
+
)
|
|
64
|
+
if not resources:
|
|
65
|
+
logger.error(
|
|
66
|
+
"No resources match locality for role '%s' under operating_mode='%s'",
|
|
67
|
+
role_name,
|
|
68
|
+
effective_mode,
|
|
69
|
+
)
|
|
70
|
+
return None
|
|
71
|
+
|
|
72
|
+
primary = _primary_assignment(role_name, assignments)
|
|
73
|
+
if primary is not None:
|
|
74
|
+
resource = next((r for r in resources if r.name == primary), None)
|
|
75
|
+
if resource:
|
|
76
|
+
logger.debug(
|
|
77
|
+
"Using assigned resource '%s' for '%s'", resource.name, role_name
|
|
78
|
+
)
|
|
79
|
+
return resource
|
|
80
|
+
|
|
81
|
+
qualified = [r for r in resources if ResourceSelector._is_qualified(r, role)]
|
|
82
|
+
if not qualified:
|
|
83
|
+
logger.error("No qualified resources for role '%s'", role_name)
|
|
84
|
+
return None
|
|
85
|
+
best = min(qualified, key=ResourceSelector._score_resource)
|
|
86
|
+
logger.info("Selected '%s' for '%s' (lowest cost)", best.name, role_name)
|
|
87
|
+
return best
|
|
88
|
+
|
|
89
|
+
@staticmethod
|
|
90
|
+
# ID: d4e7b2a9-3c5f-4862-9d1c-7e8b5a2f4c6d
|
|
91
|
+
def select_resources_for_role(
|
|
92
|
+
role_name: str,
|
|
93
|
+
roles: list[CognitiveRole],
|
|
94
|
+
resources: list[LlmResource],
|
|
95
|
+
assignments: list[RoleResourceAssignment] | None = None,
|
|
96
|
+
system_operating_mode: str = "local_only",
|
|
97
|
+
) -> list[LlmResource]:
|
|
98
|
+
"""
|
|
99
|
+
Plural counterpart to ``select_resource_for_role`` — return every
|
|
100
|
+
qualified resource for the role ordered by ``_score_resource``
|
|
101
|
+
(lowest cost first), with the assigned resource at position 0 if
|
|
102
|
+
present and resolvable by name.
|
|
103
|
+
|
|
104
|
+
Used by callers that need a fallback chain rather than a single
|
|
105
|
+
best match. Returns an empty list if the role is unknown.
|
|
106
|
+
|
|
107
|
+
Mirrors the singular function's semantic that an explicit
|
|
108
|
+
assignment is honored even if it does not satisfy
|
|
109
|
+
``_is_qualified`` — assignment is a deliberate governor override.
|
|
110
|
+
|
|
111
|
+
ADR-052 Phase 3: ``assignments`` (the role_resource_assignments
|
|
112
|
+
table) replaces the dropped ``cognitive_roles.assigned_resource``
|
|
113
|
+
column as the source of the override.
|
|
114
|
+
|
|
115
|
+
ADR-052 principle #6 (#333): resources are filtered by locality
|
|
116
|
+
against the effective operating mode — ``role.operating_mode``
|
|
117
|
+
if set, otherwise ``system_operating_mode`` — before assignment
|
|
118
|
+
lookup or capability scoring.
|
|
119
|
+
"""
|
|
120
|
+
role = next((r for r in roles if r.role == role_name), None)
|
|
121
|
+
if not role:
|
|
122
|
+
logger.error("Role '%s' not found in Mind", role_name)
|
|
123
|
+
return []
|
|
124
|
+
|
|
125
|
+
effective_mode = role.operating_mode or system_operating_mode
|
|
126
|
+
resources = ResourceSelector._filter_by_locality(
|
|
127
|
+
resources, effective_mode, role_name
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
qualified = [r for r in resources if ResourceSelector._is_qualified(r, role)]
|
|
131
|
+
ordered = sorted(qualified, key=ResourceSelector._score_resource)
|
|
132
|
+
|
|
133
|
+
primary = _primary_assignment(role_name, assignments)
|
|
134
|
+
if primary is not None:
|
|
135
|
+
assigned = next((r for r in resources if r.name == primary), None)
|
|
136
|
+
if assigned:
|
|
137
|
+
ordered = [assigned] + [r for r in ordered if r.name != assigned.name]
|
|
138
|
+
|
|
139
|
+
return ordered
|
|
140
|
+
|
|
141
|
+
@staticmethod
|
|
142
|
+
# ID: 59b27757-64e3-46b6-9e51-ca01f753e48e
|
|
143
|
+
def _filter_by_locality(
|
|
144
|
+
resources: list[LlmResource],
|
|
145
|
+
effective_mode: str,
|
|
146
|
+
role_name: str,
|
|
147
|
+
) -> list[LlmResource]:
|
|
148
|
+
"""
|
|
149
|
+
Filter ``resources`` by locality against ``effective_mode``
|
|
150
|
+
(ADR-052 principle #6 / #333).
|
|
151
|
+
|
|
152
|
+
- ``local_only`` → keep ``locality == 'local'`` only
|
|
153
|
+
- ``remote_only`` → keep ``locality == 'remote'`` only
|
|
154
|
+
- ``hybrid`` → keep all
|
|
155
|
+
- any other mode → fail closed; treat as ``local_only``
|
|
156
|
+
|
|
157
|
+
Resources with ``None`` or unrecognised ``locality`` are treated
|
|
158
|
+
as ``'local'`` (matches the ``server_default`` on the column).
|
|
159
|
+
|
|
160
|
+
Excluded resource names are logged at INFO level.
|
|
161
|
+
"""
|
|
162
|
+
kept: list[LlmResource] = []
|
|
163
|
+
excluded: list[str] = []
|
|
164
|
+
for r in resources:
|
|
165
|
+
locality = r.locality if r.locality in ("local", "remote") else "local"
|
|
166
|
+
if effective_mode == "hybrid":
|
|
167
|
+
kept.append(r)
|
|
168
|
+
elif effective_mode == "remote_only":
|
|
169
|
+
if locality == "remote":
|
|
170
|
+
kept.append(r)
|
|
171
|
+
else:
|
|
172
|
+
excluded.append(r.name)
|
|
173
|
+
else:
|
|
174
|
+
# local_only (default) plus any unrecognised mode fail closed to local
|
|
175
|
+
if locality == "local":
|
|
176
|
+
kept.append(r)
|
|
177
|
+
else:
|
|
178
|
+
excluded.append(r.name)
|
|
179
|
+
|
|
180
|
+
if excluded:
|
|
181
|
+
logger.info(
|
|
182
|
+
"Locality filter excluded %d resource(s) for role '%s' "
|
|
183
|
+
"under operating_mode='%s': %s",
|
|
184
|
+
len(excluded),
|
|
185
|
+
role_name,
|
|
186
|
+
effective_mode,
|
|
187
|
+
", ".join(excluded),
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
return kept
|
|
191
|
+
|
|
192
|
+
@staticmethod
|
|
193
|
+
def _is_qualified(resource: LlmResource, role: CognitiveRole) -> bool:
|
|
194
|
+
"""Check if resource capabilities match role requirements."""
|
|
195
|
+
res_caps = (
|
|
196
|
+
json.loads(resource.provided_capabilities)
|
|
197
|
+
if isinstance(resource.provided_capabilities, str)
|
|
198
|
+
else resource.provided_capabilities or []
|
|
199
|
+
)
|
|
200
|
+
req_caps = (
|
|
201
|
+
json.loads(role.required_capabilities)
|
|
202
|
+
if isinstance(role.required_capabilities, str)
|
|
203
|
+
else role.required_capabilities or []
|
|
204
|
+
)
|
|
205
|
+
return set(req_caps).issubset(set(res_caps))
|
|
206
|
+
|
|
207
|
+
@staticmethod
|
|
208
|
+
def _score_resource(resource: LlmResource) -> int:
|
|
209
|
+
"""Lower is better (cost optimization)."""
|
|
210
|
+
md = (
|
|
211
|
+
json.loads(resource.performance_metadata)
|
|
212
|
+
if isinstance(resource.performance_metadata, str)
|
|
213
|
+
else resource.performance_metadata or {}
|
|
214
|
+
)
|
|
215
|
+
return int(md.get("cost_rating", 3))
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def _primary_assignment(
|
|
219
|
+
role_name: str,
|
|
220
|
+
assignments: list[RoleResourceAssignment] | None,
|
|
221
|
+
) -> str | None:
|
|
222
|
+
"""Return the resource name of the active priority=1 assignment, if any."""
|
|
223
|
+
if not assignments:
|
|
224
|
+
return None
|
|
225
|
+
for a in assignments:
|
|
226
|
+
if a.role == role_name and a.priority == 1 and a.is_active:
|
|
227
|
+
return a.resource
|
|
228
|
+
return None
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# src/will/agents/strategic_auditor/__init__.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
StrategicAuditor — CORE's self-awareness agent.
|
|
5
|
+
|
|
6
|
+
Public API: import StrategicAuditor and StrategicCampaign from here.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from will.agents.strategic_auditor.agent import StrategicAuditor
|
|
12
|
+
from will.agents.strategic_auditor.models import RootCauseCluster, StrategicCampaign
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
__all__ = ["RootCauseCluster", "StrategicAuditor", "StrategicCampaign"]
|