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,309 @@
|
|
|
1
|
+
# src/shared/infrastructure/vector/adapters/constitutional_adapter.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Constitutional Adapter - Constitution/Policies/Standards Vectorization
|
|
5
|
+
|
|
6
|
+
Orchestrates transformation of constitutional documents into VectorizableItems
|
|
7
|
+
for semantic search.
|
|
8
|
+
|
|
9
|
+
CONSTITUTIONAL COMPLIANCE:
|
|
10
|
+
- Uses IntentRepository as SSOT for all .intent/ access
|
|
11
|
+
- NO direct filesystem crawling
|
|
12
|
+
- Delegates discovery and loading to IntentRepository
|
|
13
|
+
- Pure orchestration: IntentRepository → chunker → item_builder → VectorizableItems
|
|
14
|
+
|
|
15
|
+
Architecture (Mind-Body-Will):
|
|
16
|
+
Mind (IntentRepository): Knows where files are, loads them
|
|
17
|
+
Body (ConstitutionalAdapter): Orchestrates transformation
|
|
18
|
+
Will (VectorIndexService): Stores vectors for semantic search
|
|
19
|
+
|
|
20
|
+
Modular Design:
|
|
21
|
+
- constitutional/chunker: Document chunking logic
|
|
22
|
+
- constitutional/item_builder: VectorizableItem construction
|
|
23
|
+
- constitutional/doc_key_resolver: Canonical key computation
|
|
24
|
+
- This module: Orchestration only
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
from pathlib import Path
|
|
30
|
+
from typing import ClassVar
|
|
31
|
+
|
|
32
|
+
from shared.infrastructure.intent.intent_repository import (
|
|
33
|
+
IntentRepository,
|
|
34
|
+
PolicyRef,
|
|
35
|
+
get_intent_repository,
|
|
36
|
+
)
|
|
37
|
+
from shared.infrastructure.vector.adapters.constitutional.item_builder import (
|
|
38
|
+
data_to_items,
|
|
39
|
+
)
|
|
40
|
+
from shared.logger import getLogger
|
|
41
|
+
from shared.models.vector_models import VectorizableItem
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
logger = getLogger(__name__)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# ID: bd536b63-ab28-435d-bdd6-bdd4d90b33f0
|
|
48
|
+
class ConstitutionalAdapter:
|
|
49
|
+
"""
|
|
50
|
+
Adapts constitutional files into vectorizable items.
|
|
51
|
+
|
|
52
|
+
CONSTITUTIONAL BOUNDARY:
|
|
53
|
+
- ALL .intent/ access goes through IntentRepository
|
|
54
|
+
- NO direct filesystem operations
|
|
55
|
+
- Pure orchestration: PolicyRef + document data → VectorizableItem
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
_EXTENSIONS: ClassVar[tuple[str, ...]] = (".json", ".yaml", ".yml")
|
|
59
|
+
|
|
60
|
+
def __init__(self, intent_repository: IntentRepository | None = None):
|
|
61
|
+
"""
|
|
62
|
+
Initialize adapter.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
intent_repository: Optional IntentRepository instance.
|
|
66
|
+
If None, uses singleton from get_intent_repository().
|
|
67
|
+
"""
|
|
68
|
+
self.intent_repo = intent_repository or get_intent_repository()
|
|
69
|
+
self.intent_repo.initialize() # Ensure index is built
|
|
70
|
+
|
|
71
|
+
logger.debug(
|
|
72
|
+
"ConstitutionalAdapter initialized (intent_root=%s)", self.intent_repo.root
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
# -------------------------------------------------------------------------
|
|
76
|
+
# Public conversion APIs
|
|
77
|
+
# -------------------------------------------------------------------------
|
|
78
|
+
|
|
79
|
+
# ID: 7d7f430c-fd4b-4b99-9e35-76a28b93b492
|
|
80
|
+
def policies_to_items(self) -> list[VectorizableItem]:
|
|
81
|
+
"""
|
|
82
|
+
Convert all executable governance policies into vector items.
|
|
83
|
+
|
|
84
|
+
Uses IntentRepository to discover policies from:
|
|
85
|
+
- .intent/policies/
|
|
86
|
+
- .intent/standards/
|
|
87
|
+
- .intent/rules/
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
List of VectorizableItem objects ready for indexing
|
|
91
|
+
"""
|
|
92
|
+
policy_refs = self.intent_repo.list_policies()
|
|
93
|
+
return self._process_policy_refs(
|
|
94
|
+
policy_refs, doc_type="policy", key_root="policies"
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# ID: 5beb285c-cec2-4d2b-8107-4c948e62d818
|
|
98
|
+
def patterns_to_items(self) -> list[VectorizableItem]:
|
|
99
|
+
"""
|
|
100
|
+
Convert architecture patterns into vector items.
|
|
101
|
+
|
|
102
|
+
Filters policies for those under */architecture/* paths.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
List of VectorizableItem objects for patterns
|
|
106
|
+
"""
|
|
107
|
+
all_refs = self.intent_repo.list_policies()
|
|
108
|
+
|
|
109
|
+
# Filter for patterns under architecture subdirectories
|
|
110
|
+
pattern_refs = [
|
|
111
|
+
ref
|
|
112
|
+
for ref in all_refs
|
|
113
|
+
if "/architecture/" in str(ref.path).replace("\\", "/")
|
|
114
|
+
]
|
|
115
|
+
|
|
116
|
+
if not pattern_refs:
|
|
117
|
+
logger.info("No architecture pattern files found")
|
|
118
|
+
return []
|
|
119
|
+
|
|
120
|
+
return self._process_policy_refs(
|
|
121
|
+
pattern_refs,
|
|
122
|
+
doc_type="pattern",
|
|
123
|
+
key_root="policies", # Patterns are policies
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
# ID: a048dee6-165e-4f74-bd20-8dcacf87125f
|
|
127
|
+
def constitution_to_items(self) -> list[VectorizableItem]:
|
|
128
|
+
"""
|
|
129
|
+
Convert constitution documents into vector items.
|
|
130
|
+
|
|
131
|
+
Processes files from .intent/constitution/ directory.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
List of VectorizableItem objects for constitution
|
|
135
|
+
"""
|
|
136
|
+
return self._process_constitution_dir()
|
|
137
|
+
|
|
138
|
+
# ID: 6d5a1ee7-ebc0-44cd-bcaf-b30045d73547
|
|
139
|
+
def standards_to_items(self) -> list[VectorizableItem]:
|
|
140
|
+
"""
|
|
141
|
+
Convert standards documents into vector items.
|
|
142
|
+
|
|
143
|
+
NOTE: Standards are already included in policies_to_items()
|
|
144
|
+
since IntentRepository searches ["policies", "standards", "rules"].
|
|
145
|
+
This method exists for backward compatibility and explicit standards querying.
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
List of VectorizableItem objects for standards
|
|
149
|
+
"""
|
|
150
|
+
all_refs = self.intent_repo.list_policies()
|
|
151
|
+
|
|
152
|
+
# Filter for standards only (path starts with standards/)
|
|
153
|
+
standards_refs = [
|
|
154
|
+
ref for ref in all_refs if str(ref.policy_id).startswith("standards/")
|
|
155
|
+
]
|
|
156
|
+
|
|
157
|
+
if not standards_refs:
|
|
158
|
+
logger.info("No standards files found")
|
|
159
|
+
return []
|
|
160
|
+
|
|
161
|
+
return self._process_policy_refs(
|
|
162
|
+
standards_refs, doc_type="standard", key_root="standards"
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
# ID: bb43de2b-45e4-4889-aa23-c0bcd965d73d
|
|
166
|
+
def enforcement_policies_to_items(self) -> list[VectorizableItem]:
|
|
167
|
+
"""Backward compatibility alias for policies_to_items()."""
|
|
168
|
+
return self.policies_to_items()
|
|
169
|
+
|
|
170
|
+
# -------------------------------------------------------------------------
|
|
171
|
+
# Processing - Uses IntentRepository data
|
|
172
|
+
# -------------------------------------------------------------------------
|
|
173
|
+
|
|
174
|
+
def _process_policy_refs(
|
|
175
|
+
self,
|
|
176
|
+
policy_refs: list[PolicyRef],
|
|
177
|
+
*,
|
|
178
|
+
doc_type: str,
|
|
179
|
+
key_root: str,
|
|
180
|
+
) -> list[VectorizableItem]:
|
|
181
|
+
"""
|
|
182
|
+
Process PolicyRef objects from IntentRepository into VectorizableItems.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
policy_refs: List of PolicyRef from IntentRepository
|
|
186
|
+
doc_type: Document type (policy, pattern, standard)
|
|
187
|
+
key_root: Root for key generation (policies, standards)
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
List of VectorizableItem objects
|
|
191
|
+
"""
|
|
192
|
+
if not policy_refs:
|
|
193
|
+
logger.info("No %s files to process", doc_type)
|
|
194
|
+
return []
|
|
195
|
+
|
|
196
|
+
logger.info("Processing %s %s file(s)", len(policy_refs), doc_type)
|
|
197
|
+
|
|
198
|
+
items: list[VectorizableItem] = []
|
|
199
|
+
for ref in policy_refs:
|
|
200
|
+
try:
|
|
201
|
+
# Load document through IntentRepository (SSOT)
|
|
202
|
+
data = self.intent_repo.load_document(ref.path)
|
|
203
|
+
|
|
204
|
+
if not isinstance(data, dict):
|
|
205
|
+
logger.warning(
|
|
206
|
+
"Skipping non-dict document: %s (type=%s)",
|
|
207
|
+
ref.path,
|
|
208
|
+
type(data).__name__,
|
|
209
|
+
)
|
|
210
|
+
continue
|
|
211
|
+
|
|
212
|
+
# Transform to VectorizableItems (delegates to item_builder)
|
|
213
|
+
file_items = data_to_items(
|
|
214
|
+
data,
|
|
215
|
+
ref.path,
|
|
216
|
+
doc_type,
|
|
217
|
+
key_root=key_root,
|
|
218
|
+
intent_root=self.intent_repo.root,
|
|
219
|
+
)
|
|
220
|
+
items.extend(file_items)
|
|
221
|
+
|
|
222
|
+
except Exception as exc:
|
|
223
|
+
logger.exception(
|
|
224
|
+
"Failed to process %s (%s): %s", ref.path, doc_type, exc
|
|
225
|
+
)
|
|
226
|
+
continue
|
|
227
|
+
|
|
228
|
+
logger.info(
|
|
229
|
+
"Generated %s item(s) from %s file(s)", len(items), len(policy_refs)
|
|
230
|
+
)
|
|
231
|
+
return items
|
|
232
|
+
|
|
233
|
+
def _process_constitution_dir(self) -> list[VectorizableItem]:
|
|
234
|
+
"""
|
|
235
|
+
Process constitution directory files.
|
|
236
|
+
|
|
237
|
+
Constitution files are not indexed by IntentRepository's policy index,
|
|
238
|
+
so we use direct directory resolution through IntentRepository.root.
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
List of VectorizableItem objects
|
|
242
|
+
"""
|
|
243
|
+
constitution_dir = self.intent_repo.root / "constitution"
|
|
244
|
+
|
|
245
|
+
if not constitution_dir.exists():
|
|
246
|
+
logger.warning("Constitution directory not found: %s", constitution_dir)
|
|
247
|
+
return []
|
|
248
|
+
|
|
249
|
+
files = self._collect_files(constitution_dir, recursive=True)
|
|
250
|
+
if not files:
|
|
251
|
+
logger.info("No constitution files found")
|
|
252
|
+
return []
|
|
253
|
+
|
|
254
|
+
logger.info("Processing %s constitution file(s)", len(files))
|
|
255
|
+
|
|
256
|
+
items: list[VectorizableItem] = []
|
|
257
|
+
for file_path in files:
|
|
258
|
+
try:
|
|
259
|
+
# Load through IntentRepository for consistency
|
|
260
|
+
data = self.intent_repo.load_document(file_path)
|
|
261
|
+
|
|
262
|
+
if not isinstance(data, dict):
|
|
263
|
+
logger.warning(
|
|
264
|
+
"Skipping non-dict document: %s (type=%s)",
|
|
265
|
+
file_path,
|
|
266
|
+
type(data).__name__,
|
|
267
|
+
)
|
|
268
|
+
continue
|
|
269
|
+
|
|
270
|
+
# Transform to VectorizableItems (delegates to item_builder)
|
|
271
|
+
file_items = data_to_items(
|
|
272
|
+
data,
|
|
273
|
+
file_path,
|
|
274
|
+
doc_type="constitution",
|
|
275
|
+
key_root="constitution",
|
|
276
|
+
intent_root=self.intent_repo.root,
|
|
277
|
+
)
|
|
278
|
+
items.extend(file_items)
|
|
279
|
+
|
|
280
|
+
except Exception as exc:
|
|
281
|
+
logger.exception(
|
|
282
|
+
"Failed to process constitution file %s: %s", file_path, exc
|
|
283
|
+
)
|
|
284
|
+
continue
|
|
285
|
+
|
|
286
|
+
logger.info("Generated %s item(s) from %s file(s)", len(items), len(files))
|
|
287
|
+
return items
|
|
288
|
+
|
|
289
|
+
def _collect_files(self, directory: Path, recursive: bool) -> list[Path]:
|
|
290
|
+
"""
|
|
291
|
+
Collect JSON/YAML files from directory.
|
|
292
|
+
|
|
293
|
+
This is only used for constitution directory since those files
|
|
294
|
+
are not in the policy index.
|
|
295
|
+
|
|
296
|
+
Args:
|
|
297
|
+
directory: Directory to scan
|
|
298
|
+
recursive: Whether to scan recursively
|
|
299
|
+
|
|
300
|
+
Returns:
|
|
301
|
+
Sorted list of file paths
|
|
302
|
+
"""
|
|
303
|
+
collected: set[Path] = set()
|
|
304
|
+
for ext in self._EXTENSIONS:
|
|
305
|
+
if recursive:
|
|
306
|
+
collected.update(p for p in directory.rglob(f"*{ext}") if p.is_file())
|
|
307
|
+
else:
|
|
308
|
+
collected.update(p for p in directory.glob(f"*{ext}") if p.is_file())
|
|
309
|
+
return sorted(collected)
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# src/shared/infrastructure/vector/adapters/specs_adapter.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Specs Adapter - .specs/ Markdown Vectorization
|
|
5
|
+
|
|
6
|
+
Converts human-authored specification documents under .specs/ into
|
|
7
|
+
VectorizableItems for semantic search.
|
|
8
|
+
|
|
9
|
+
CONSTITUTIONAL COMPLIANCE:
|
|
10
|
+
- Uses SpecsRepository as SSOT for all .specs/ access
|
|
11
|
+
- NO direct filesystem crawling or raw Path reads
|
|
12
|
+
- Pure orchestration: SpecsRepository → chunker → VectorizableItems
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import hashlib
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
from shared.infrastructure.intent.operational_config import load_operational_config
|
|
21
|
+
from shared.infrastructure.specs.specs_repository import (
|
|
22
|
+
SpecsRepository,
|
|
23
|
+
get_specs_repository,
|
|
24
|
+
)
|
|
25
|
+
from shared.logger import getLogger
|
|
26
|
+
from shared.models.vector_models import VectorizableItem
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
logger = getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
_CFG_CHK = load_operational_config().chunking
|
|
32
|
+
|
|
33
|
+
_COLLECTION_NAME = "core_specs"
|
|
34
|
+
_DOC_TYPE = "specs"
|
|
35
|
+
_SOURCE = "specs"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# ID: a7f3c91d-2b84-4e5a-9c1f-6d2e8a4b9c03
|
|
39
|
+
class SpecsAdapter:
|
|
40
|
+
"""
|
|
41
|
+
Adapts .specs/ markdown documents into vectorizable items.
|
|
42
|
+
|
|
43
|
+
All filesystem access is mediated by SpecsRepository; this class
|
|
44
|
+
performs pure orchestration and chunking.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
# ID: b8e4d2a0-3c95-4f6b-ad28-7e3f9b5ca104
|
|
48
|
+
def __init__(self, specs_repository: SpecsRepository | None = None) -> None:
|
|
49
|
+
"""
|
|
50
|
+
Args:
|
|
51
|
+
specs_repository: Optional SpecsRepository instance.
|
|
52
|
+
Defaults to the singleton from get_specs_repository().
|
|
53
|
+
"""
|
|
54
|
+
self.specs_repo = specs_repository or get_specs_repository()
|
|
55
|
+
logger.debug("SpecsAdapter initialized (specs_root=%s)", self.specs_repo.root)
|
|
56
|
+
|
|
57
|
+
# ID: c9f5e3b1-4da6-4a7c-be39-8f40ac6db215
|
|
58
|
+
def docs_to_items(self, subdir: str = "") -> list[VectorizableItem]:
|
|
59
|
+
"""
|
|
60
|
+
Convert markdown documents under .specs/ into VectorizableItems.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
subdir: Optional subdirectory (relative to .specs/ root) to scope
|
|
64
|
+
the scan, e.g. "papers", "northstar", "requirements".
|
|
65
|
+
Empty string scans the entire .specs/ tree.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
List of VectorizableItem objects ready for indexing into
|
|
69
|
+
the "core_specs" collection.
|
|
70
|
+
"""
|
|
71
|
+
files = self.specs_repo.list_files(subdir=subdir, suffix=".md")
|
|
72
|
+
if not files:
|
|
73
|
+
logger.info(
|
|
74
|
+
"No .specs/ markdown files found (subdir=%r)", subdir or "<root>"
|
|
75
|
+
)
|
|
76
|
+
return []
|
|
77
|
+
|
|
78
|
+
logger.info("Processing %s spec document(s)", len(files))
|
|
79
|
+
|
|
80
|
+
items: list[VectorizableItem] = []
|
|
81
|
+
specs_root = self.specs_repo.root
|
|
82
|
+
for abs_path in files:
|
|
83
|
+
try:
|
|
84
|
+
rel_path = abs_path.relative_to(specs_root)
|
|
85
|
+
except ValueError:
|
|
86
|
+
logger.warning(
|
|
87
|
+
"Skipping spec outside specs root: %s (root=%s)",
|
|
88
|
+
abs_path,
|
|
89
|
+
specs_root,
|
|
90
|
+
)
|
|
91
|
+
continue
|
|
92
|
+
|
|
93
|
+
doc_id = str(rel_path).replace("\\", "/")
|
|
94
|
+
try:
|
|
95
|
+
text = self.specs_repo.load_text(rel_path)
|
|
96
|
+
except Exception as exc:
|
|
97
|
+
logger.exception("Failed to load spec %s: %s", doc_id, exc)
|
|
98
|
+
continue
|
|
99
|
+
|
|
100
|
+
file_items = self._build_items_for_file(doc_id, rel_path, text)
|
|
101
|
+
items.extend(file_items)
|
|
102
|
+
|
|
103
|
+
logger.info("Generated %s item(s) from %s spec file(s)", len(items), len(files))
|
|
104
|
+
return items
|
|
105
|
+
|
|
106
|
+
# ID: d0a6f4c2-5eb7-4b8d-cf4a-9051bd7ec326
|
|
107
|
+
def _build_items_for_file(
|
|
108
|
+
self, doc_id: str, rel_path: Path, text: str
|
|
109
|
+
) -> list[VectorizableItem]:
|
|
110
|
+
"""Chunk a single markdown document and wrap each chunk as an item."""
|
|
111
|
+
body = text.strip()
|
|
112
|
+
if not body:
|
|
113
|
+
return []
|
|
114
|
+
|
|
115
|
+
chunks = self._chunk_markdown(body, rel_path.stem)
|
|
116
|
+
|
|
117
|
+
items: list[VectorizableItem] = []
|
|
118
|
+
for idx, (section, content) in enumerate(chunks):
|
|
119
|
+
clean = content.strip()
|
|
120
|
+
if not clean:
|
|
121
|
+
continue
|
|
122
|
+
|
|
123
|
+
item_id = f"{doc_id}:{idx}"
|
|
124
|
+
payload = {
|
|
125
|
+
"doc_id": doc_id,
|
|
126
|
+
"doc_type": _DOC_TYPE,
|
|
127
|
+
"source": _SOURCE,
|
|
128
|
+
"source_path": f".specs/{doc_id}",
|
|
129
|
+
"section": section,
|
|
130
|
+
"content_sha256": hashlib.sha256(clean.encode("utf-8")).hexdigest(),
|
|
131
|
+
"text": clean,
|
|
132
|
+
}
|
|
133
|
+
items.append(VectorizableItem(item_id=item_id, text=clean, payload=payload))
|
|
134
|
+
|
|
135
|
+
return items
|
|
136
|
+
|
|
137
|
+
# ID: e1b705d3-6fc8-4c9e-d05b-a162ce8fd437
|
|
138
|
+
def _chunk_markdown(
|
|
139
|
+
self, text: str, filename_section: str
|
|
140
|
+
) -> list[tuple[str, str]]:
|
|
141
|
+
"""
|
|
142
|
+
Split markdown into (section, content) pairs.
|
|
143
|
+
|
|
144
|
+
Small documents return a single chunk labelled with the filename stem.
|
|
145
|
+
Larger documents are split on "## " headings; preamble before the first
|
|
146
|
+
heading becomes its own chunk labelled with the filename stem.
|
|
147
|
+
"""
|
|
148
|
+
if len(text) <= _CFG_CHK.max_chunk_chars:
|
|
149
|
+
return [(filename_section, text)]
|
|
150
|
+
|
|
151
|
+
sections: list[tuple[str, str]] = []
|
|
152
|
+
current_section = filename_section
|
|
153
|
+
current_lines: list[str] = []
|
|
154
|
+
|
|
155
|
+
for line in text.splitlines():
|
|
156
|
+
if line.startswith("## "):
|
|
157
|
+
if current_lines:
|
|
158
|
+
sections.append((current_section, "\n".join(current_lines).strip()))
|
|
159
|
+
current_section = line[3:].strip() or filename_section
|
|
160
|
+
current_lines = [line]
|
|
161
|
+
else:
|
|
162
|
+
current_lines.append(line)
|
|
163
|
+
|
|
164
|
+
if current_lines:
|
|
165
|
+
sections.append((current_section, "\n".join(current_lines).strip()))
|
|
166
|
+
|
|
167
|
+
non_empty = [(s, c) for s, c in sections if c]
|
|
168
|
+
if not non_empty:
|
|
169
|
+
return [(filename_section, text)]
|
|
170
|
+
|
|
171
|
+
return non_empty
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# src/shared/infrastructure/vector/cognitive_adapter.py
|
|
2
|
+
"""
|
|
3
|
+
CognitiveService Adapter for VectorIndexService
|
|
4
|
+
|
|
5
|
+
Adapts CognitiveService to the Embeddable protocol so it can be used
|
|
6
|
+
with VectorIndexService for smart deduplication.
|
|
7
|
+
|
|
8
|
+
This allows constitutional vectorization to use the same embedding provider
|
|
9
|
+
as code vectorization (database-configured LLM) instead of requiring
|
|
10
|
+
separate local embedding settings.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from shared.logger import getLogger
|
|
16
|
+
from shared.protocols.cognitive import CognitiveProtocol
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
logger = getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# ID: b4c348a3-9d0e-4079-a6bd-eb93be95686f
|
|
23
|
+
class CognitiveEmbedderAdapter:
|
|
24
|
+
"""
|
|
25
|
+
Adapts CognitiveService to the Embeddable protocol.
|
|
26
|
+
|
|
27
|
+
This allows VectorIndexService to use CognitiveService for embeddings,
|
|
28
|
+
enabling constitutional documents to use the same embedding provider
|
|
29
|
+
as code symbols (database-configured, not environment-based).
|
|
30
|
+
|
|
31
|
+
Usage:
|
|
32
|
+
cognitive_service = await registry.get_cognitive_service()
|
|
33
|
+
embedder = CognitiveEmbedderAdapter(cognitive_service)
|
|
34
|
+
|
|
35
|
+
service = VectorIndexService(
|
|
36
|
+
qdrant_service=qdrant,
|
|
37
|
+
collection_name="core_policies",
|
|
38
|
+
embedder=embedder # ← Inject CognitiveService!
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# Now uses smart deduplication + database-configured embeddings
|
|
42
|
+
await service.index_items(policy_items)
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(self, cognitive_service: CognitiveProtocol):
|
|
46
|
+
"""
|
|
47
|
+
Initialize adapter.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
cognitive_service: Initialized CognitiveService instance
|
|
51
|
+
"""
|
|
52
|
+
self._cognitive_service = cognitive_service
|
|
53
|
+
logger.debug("CognitiveEmbedderAdapter initialized")
|
|
54
|
+
|
|
55
|
+
# ID: d494615f-51d5-4796-a62a-ddf9e3e7bda3
|
|
56
|
+
async def get_embedding(self, text: str) -> list[float]:
|
|
57
|
+
"""
|
|
58
|
+
Generate embedding using CognitiveService.
|
|
59
|
+
|
|
60
|
+
This delegates to cognitive_service.get_embedding_for_code() which
|
|
61
|
+
uses the database-configured LLM provider.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
text: Text to embed
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Embedding vector as list of floats
|
|
68
|
+
|
|
69
|
+
Raises:
|
|
70
|
+
RuntimeError: If embedding generation fails
|
|
71
|
+
"""
|
|
72
|
+
try:
|
|
73
|
+
embedding = await self._cognitive_service.get_embedding_for_code(text)
|
|
74
|
+
|
|
75
|
+
if not embedding:
|
|
76
|
+
raise RuntimeError("CognitiveService returned empty embedding")
|
|
77
|
+
|
|
78
|
+
return embedding
|
|
79
|
+
|
|
80
|
+
except Exception as e:
|
|
81
|
+
logger.error("Failed to generate embedding via CognitiveService: %s", e)
|
|
82
|
+
raise RuntimeError(f"Embedding generation failed: {e}") from e
|
|
83
|
+
|
|
84
|
+
# ID: 3a8f2e74-9c1d-4b85-a047-6e5f9c2a8d13
|
|
85
|
+
async def get_embeddings_batch(self, texts: list[str]) -> list[list[float]]:
|
|
86
|
+
"""
|
|
87
|
+
Batch-generate embeddings for a list of texts (#461).
|
|
88
|
+
|
|
89
|
+
Delegates to cognitive_service.get_embeddings_for_code_batch().
|
|
90
|
+
Single round-trip to the embedding endpoint when the underlying
|
|
91
|
+
provider supports it (Ollama 0.4+); other providers fall back
|
|
92
|
+
to looped single-input calls (correct, not faster).
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
texts: Texts to embed, in order.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
Embedding vectors aligned to input order.
|
|
99
|
+
|
|
100
|
+
Raises:
|
|
101
|
+
RuntimeError: If embedding generation fails for the batch.
|
|
102
|
+
"""
|
|
103
|
+
if not texts:
|
|
104
|
+
return []
|
|
105
|
+
try:
|
|
106
|
+
embeddings = await self._cognitive_service.get_embeddings_for_code_batch(
|
|
107
|
+
texts
|
|
108
|
+
)
|
|
109
|
+
if len(embeddings) != len(texts):
|
|
110
|
+
raise RuntimeError(
|
|
111
|
+
f"CognitiveService returned {len(embeddings)} embeddings "
|
|
112
|
+
f"for {len(texts)} inputs — batch response misalignment"
|
|
113
|
+
)
|
|
114
|
+
return embeddings
|
|
115
|
+
except Exception as e:
|
|
116
|
+
logger.error(
|
|
117
|
+
"Failed to generate batch embeddings via CognitiveService: %s", e
|
|
118
|
+
)
|
|
119
|
+
raise RuntimeError(f"Batch embedding generation failed: {e}") from e
|