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
api/cli/client.py
ADDED
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
# src/api/cli/client.py
|
|
2
|
+
|
|
3
|
+
"""Thin async HTTP client for the CORE API (ADR-054).
|
|
4
|
+
|
|
5
|
+
CoreApiClient is a thin facade over twelve per-namespace sub-clients
|
|
6
|
+
(issue #360). Each sub-client owns the HTTP endpoint family for one
|
|
7
|
+
namespace (audit, fix, quality, coverage, refactor, inspect,
|
|
8
|
+
proposals, integration, census, sync, daemon, integrity) and uses
|
|
9
|
+
`self._facade._request` and `self._facade._poll_at_path` to share
|
|
10
|
+
the connection config and polling helpers that live on the facade.
|
|
11
|
+
|
|
12
|
+
The facade keeps the original 75 flat methods as delegating shims so
|
|
13
|
+
existing CLI call-sites continue to work unchanged. Namespaced access
|
|
14
|
+
via attributes (e.g. `client.coverage.coverage_gaps(...)`) is the
|
|
15
|
+
preferred form for new callers.
|
|
16
|
+
|
|
17
|
+
The sub-client attribute for the audit namespace is `audits` (plural)
|
|
18
|
+
to avoid collision with the existing `audit()` method.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import asyncio
|
|
24
|
+
from typing import Any
|
|
25
|
+
|
|
26
|
+
import httpx
|
|
27
|
+
|
|
28
|
+
from api.cli.audit_client import AuditClient
|
|
29
|
+
from api.cli.census_client import CensusClient
|
|
30
|
+
from api.cli.coverage_client import CoverageClient
|
|
31
|
+
from api.cli.daemon_client import DaemonClient
|
|
32
|
+
from api.cli.fix_client import FixClient
|
|
33
|
+
from api.cli.inspect_client import InspectClient
|
|
34
|
+
from api.cli.integration_client import IntegrationClient
|
|
35
|
+
from api.cli.integrity_client import IntegrityClient
|
|
36
|
+
from api.cli.proposals_client import ProposalsClient
|
|
37
|
+
from api.cli.quality_client import QualityClient
|
|
38
|
+
from api.cli.refactor_client import RefactorClient
|
|
39
|
+
from api.cli.sync_client import SyncClient
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
_DEFAULT_BASE_URL = "http://127.0.0.1:8000"
|
|
43
|
+
_DEFAULT_TIMEOUT_SECONDS = 30.0
|
|
44
|
+
_POLL_INTERVAL_SECONDS = 1.0
|
|
45
|
+
_POLL_TERMINAL_STATES = frozenset({"completed", "failed"})
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# ID: 03d88f8c-1a13-4901-a03c-52db4b5ee5b2
|
|
49
|
+
class CoreApiClient:
|
|
50
|
+
"""Async HTTP client targeting the loopback-bound CORE API.
|
|
51
|
+
|
|
52
|
+
ADR-054 D3 keeps the API loopback-only with no authentication for
|
|
53
|
+
Phase 1; this client mirrors that posture (no auth headers).
|
|
54
|
+
|
|
55
|
+
Internally a facade over twelve namespace sub-clients (see module
|
|
56
|
+
docstring). Existing flat methods are preserved as delegating
|
|
57
|
+
shims for backwards-compatible call sites.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
def __init__(self, base_url: str | None = None) -> None:
|
|
61
|
+
self.base_url = base_url or _DEFAULT_BASE_URL
|
|
62
|
+
self.timeout = _DEFAULT_TIMEOUT_SECONDS
|
|
63
|
+
self.audits = AuditClient(self)
|
|
64
|
+
self.fix = FixClient(self)
|
|
65
|
+
self.quality = QualityClient(self)
|
|
66
|
+
self.coverage = CoverageClient(self)
|
|
67
|
+
self.refactor = RefactorClient(self)
|
|
68
|
+
self.inspect = InspectClient(self)
|
|
69
|
+
self.proposals = ProposalsClient(self)
|
|
70
|
+
self.integration = IntegrationClient(self)
|
|
71
|
+
self.census = CensusClient(self)
|
|
72
|
+
self.sync = SyncClient(self)
|
|
73
|
+
self.daemon = DaemonClient(self)
|
|
74
|
+
self.integrity = IntegrityClient(self)
|
|
75
|
+
|
|
76
|
+
# ID: 77466c97-58c5-4ad2-8e5a-814396965f73
|
|
77
|
+
async def _request(self, method: str, path: str, **kwargs: Any) -> dict:
|
|
78
|
+
url = f"{self.base_url}{path}"
|
|
79
|
+
async with httpx.AsyncClient(timeout=self.timeout) as client:
|
|
80
|
+
response = await client.request(method, url, **kwargs)
|
|
81
|
+
response.raise_for_status()
|
|
82
|
+
return response.json()
|
|
83
|
+
|
|
84
|
+
# ID: 1205e380-4b68-4a53-b56d-0eec74896962
|
|
85
|
+
async def _poll_run(self, run_id: str, timeout_seconds: float = 300.0) -> dict:
|
|
86
|
+
"""Poll GET /v1/fix/runs/{run_id} until status is completed or failed.
|
|
87
|
+
|
|
88
|
+
Returns the terminal run payload. Raises TimeoutError if the run
|
|
89
|
+
does not reach a terminal state within `timeout_seconds`. Used by
|
|
90
|
+
CLIs over async /fix and /quality endpoints (ADR-055 D2/D3).
|
|
91
|
+
"""
|
|
92
|
+
return await self._poll_at_path(
|
|
93
|
+
f"/v1/fix/runs/{run_id}", timeout_seconds=timeout_seconds
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
# ID: c19f4d5e-2b7a-4f8e-bd03-6a8c5d1f9e02
|
|
97
|
+
async def _poll_at_path(self, path: str, timeout_seconds: float = 300.0) -> dict:
|
|
98
|
+
"""Poll an arbitrary `GET {path}` until status terminal.
|
|
99
|
+
|
|
100
|
+
Generalisation of `_poll_run` for Phase 3 resources whose poll
|
|
101
|
+
paths differ from /v1/fix/runs/ (e.g. /v1/coverage/runs/,
|
|
102
|
+
/v1/refactor/runs/, /v1/audit/remediations/).
|
|
103
|
+
"""
|
|
104
|
+
async with asyncio.timeout(timeout_seconds):
|
|
105
|
+
while True:
|
|
106
|
+
payload = await self._request("GET", path)
|
|
107
|
+
if payload.get("status") in _POLL_TERMINAL_STATES:
|
|
108
|
+
return payload
|
|
109
|
+
await asyncio.sleep(_POLL_INTERVAL_SECONDS)
|
|
110
|
+
|
|
111
|
+
# -- /proposals (ProposalsClient) ----------------------------------
|
|
112
|
+
|
|
113
|
+
# ID: daf8f641-0358-4298-8465-af1d1c09e221
|
|
114
|
+
async def create_proposal(self, *args: Any, **kwargs: Any) -> dict:
|
|
115
|
+
"""POST /v1/proposals — see ProposalsClient.create_proposal."""
|
|
116
|
+
return await self.proposals.create_proposal(*args, **kwargs)
|
|
117
|
+
|
|
118
|
+
# ID: 36434e12-c232-4452-9ff5-c0690263804f
|
|
119
|
+
async def list_proposals(self, *args: Any, **kwargs: Any) -> dict:
|
|
120
|
+
"""GET /v1/proposals — see ProposalsClient.list_proposals."""
|
|
121
|
+
return await self.proposals.list_proposals(*args, **kwargs)
|
|
122
|
+
|
|
123
|
+
# ID: 2e321d91-d4e6-45ff-834c-a7394fe47fa0
|
|
124
|
+
async def get_proposal(self, *args: Any, **kwargs: Any) -> dict:
|
|
125
|
+
"""GET /v1/proposals/{id} — see ProposalsClient.get_proposal."""
|
|
126
|
+
return await self.proposals.get_proposal(*args, **kwargs)
|
|
127
|
+
|
|
128
|
+
# ID: 4223e0c4-41e1-4105-9b9a-b65d52b616d9
|
|
129
|
+
async def approve_proposal(self, *args: Any, **kwargs: Any) -> dict:
|
|
130
|
+
"""POST /v1/proposals/{id}/approve — see ProposalsClient.approve_proposal."""
|
|
131
|
+
return await self.proposals.approve_proposal(*args, **kwargs)
|
|
132
|
+
|
|
133
|
+
# ID: 85d96758-f6f0-4162-a44f-32d7dd65bf5c
|
|
134
|
+
async def reject_proposal(self, *args: Any, **kwargs: Any) -> dict:
|
|
135
|
+
"""POST /v1/proposals/{id}/reject — see ProposalsClient.reject_proposal."""
|
|
136
|
+
return await self.proposals.reject_proposal(*args, **kwargs)
|
|
137
|
+
|
|
138
|
+
# ID: f7f70b77-7766-4112-86d5-81d0bf6cd830
|
|
139
|
+
async def execute_proposal(self, *args: Any, **kwargs: Any) -> dict:
|
|
140
|
+
"""POST /v1/proposals/{id}/execute — see ProposalsClient.execute_proposal."""
|
|
141
|
+
return await self.proposals.execute_proposal(*args, **kwargs)
|
|
142
|
+
|
|
143
|
+
# -- /integrate, /lint (IntegrationClient) ------------------------
|
|
144
|
+
|
|
145
|
+
# ID: 756d1f0f-7315-4fb9-9cd6-4ba14f92dd8a
|
|
146
|
+
async def integrate(self, *args: Any, **kwargs: Any) -> dict:
|
|
147
|
+
"""POST /v1/integrate — see IntegrationClient.integrate."""
|
|
148
|
+
return await self.integration.integrate(*args, **kwargs)
|
|
149
|
+
|
|
150
|
+
# ID: 77313481-4787-431c-944f-84a1ab44c594
|
|
151
|
+
async def lint(self, *args: Any, **kwargs: Any) -> dict:
|
|
152
|
+
"""POST /v1/lint — see IntegrationClient.lint."""
|
|
153
|
+
return await self.integration.lint(*args, **kwargs)
|
|
154
|
+
|
|
155
|
+
# -- /audit (AuditClient, attr=audits) ----------------------------
|
|
156
|
+
|
|
157
|
+
# ID: b67c3e8d-93d5-4307-a347-4a6d50ab768d
|
|
158
|
+
async def audit(self, *args: Any, **kwargs: Any) -> dict:
|
|
159
|
+
"""POST /v1/audit/runs — see AuditClient.audit."""
|
|
160
|
+
return await self.audits.audit(*args, **kwargs)
|
|
161
|
+
|
|
162
|
+
# ID: 7bcf37e9-4561-4132-93a4-b5c6d7e8f90a
|
|
163
|
+
async def audit_remediate(self, *args: Any, **kwargs: Any) -> dict:
|
|
164
|
+
"""POST /v1/audit/remediations — see AuditClient.audit_remediate."""
|
|
165
|
+
return await self.audits.audit_remediate(*args, **kwargs)
|
|
166
|
+
|
|
167
|
+
# ID: 8cd048fa-5672-4243-a4b5-c6d7e8f90a1b
|
|
168
|
+
async def get_audit_remediation_run(self, *args: Any, **kwargs: Any) -> dict:
|
|
169
|
+
"""GET /v1/audit/remediations/{run_id} — see AuditClient.get_audit_remediation_run."""
|
|
170
|
+
return await self.audits.get_audit_remediation_run(*args, **kwargs)
|
|
171
|
+
|
|
172
|
+
# ID: 9de1590b-6783-4354-b5c6-d7e8f90a1b2c
|
|
173
|
+
async def poll_audit_remediation_run(self, *args: Any, **kwargs: Any) -> dict:
|
|
174
|
+
"""Poll an audit remediation run — see AuditClient.poll_audit_remediation_run."""
|
|
175
|
+
return await self.audits.poll_audit_remediation_run(*args, **kwargs)
|
|
176
|
+
|
|
177
|
+
# -- /fix, /actions (FixClient) ------------------------------------
|
|
178
|
+
|
|
179
|
+
# ID: d4b48241-75a5-4e53-bc46-e80b0c8e36e5
|
|
180
|
+
async def list_fix_commands(self, *args: Any, **kwargs: Any) -> dict:
|
|
181
|
+
"""GET /v1/fix/commands — see FixClient.list_fix_commands."""
|
|
182
|
+
return await self.fix.list_fix_commands(*args, **kwargs)
|
|
183
|
+
|
|
184
|
+
# ID: ae1230d2-9f37-4e2f-9025-8b409a73ee32
|
|
185
|
+
async def list_actions(self, *args: Any, **kwargs: Any) -> dict:
|
|
186
|
+
"""GET /v1/actions — see FixClient.list_actions."""
|
|
187
|
+
return await self.fix.list_actions(*args, **kwargs)
|
|
188
|
+
|
|
189
|
+
# ID: cca11da8-9878-4c7e-9149-1972446a9d81
|
|
190
|
+
async def run_fix(self, *args: Any, **kwargs: Any) -> dict:
|
|
191
|
+
"""POST /v1/fix/run/{fix_id} — see FixClient.run_fix."""
|
|
192
|
+
return await self.fix.run_fix(*args, **kwargs)
|
|
193
|
+
|
|
194
|
+
# ID: b54035a3-7c41-452c-bd1d-2cb7c92e9214
|
|
195
|
+
async def fix_all(self, *args: Any, **kwargs: Any) -> dict:
|
|
196
|
+
"""POST /v1/fix/all — see FixClient.fix_all."""
|
|
197
|
+
return await self.fix.fix_all(*args, **kwargs)
|
|
198
|
+
|
|
199
|
+
# ID: 22c3d638-ed25-40a0-8aec-52c569e5e776
|
|
200
|
+
async def fix_modularity(self, *args: Any, **kwargs: Any) -> dict:
|
|
201
|
+
"""POST /v1/fix/modularity — see FixClient.fix_modularity."""
|
|
202
|
+
return await self.fix.fix_modularity(*args, **kwargs)
|
|
203
|
+
|
|
204
|
+
# ID: 4dcdaddd-1cd1-4561-9d1b-6e76637bada6
|
|
205
|
+
async def fix_ir(self, *args: Any, **kwargs: Any) -> dict:
|
|
206
|
+
"""POST /v1/fix/ir — see FixClient.fix_ir."""
|
|
207
|
+
return await self.fix.fix_ir(*args, **kwargs)
|
|
208
|
+
|
|
209
|
+
# ID: 42e18693-ee64-42e7-bf48-dd855f2f3463
|
|
210
|
+
async def get_fix_run(self, *args: Any, **kwargs: Any) -> dict:
|
|
211
|
+
"""GET /v1/fix/runs/{run_id} — see FixClient.get_fix_run."""
|
|
212
|
+
return await self.fix.get_fix_run(*args, **kwargs)
|
|
213
|
+
|
|
214
|
+
# -- /quality (QualityClient) --------------------------------------
|
|
215
|
+
|
|
216
|
+
# ID: 7863008f-424f-4e14-b461-eeb8b969291e
|
|
217
|
+
async def quality_imports(self, *args: Any, **kwargs: Any) -> dict:
|
|
218
|
+
"""POST /v1/quality/imports — see QualityClient.quality_imports."""
|
|
219
|
+
return await self.quality.quality_imports(*args, **kwargs)
|
|
220
|
+
|
|
221
|
+
# ID: e2563ebe-4fc9-45aa-91bc-a362ce637e95
|
|
222
|
+
async def quality_body_ui(self, *args: Any, **kwargs: Any) -> dict:
|
|
223
|
+
"""POST /v1/quality/body-ui — see QualityClient.quality_body_ui."""
|
|
224
|
+
return await self.quality.quality_body_ui(*args, **kwargs)
|
|
225
|
+
|
|
226
|
+
# ID: 4e6f1a2b-8c3d-47e9-a5b1-2d3f4c5a6b7d
|
|
227
|
+
async def quality_policy_coverage(self, *args: Any, **kwargs: Any) -> dict:
|
|
228
|
+
"""POST /v1/quality/policy-coverage — see QualityClient.quality_policy_coverage."""
|
|
229
|
+
return await self.quality.quality_policy_coverage(*args, **kwargs)
|
|
230
|
+
|
|
231
|
+
# ID: 0774cb34-3305-4fee-89b3-8f33bec667a9
|
|
232
|
+
async def quality_lint(self, *args: Any, **kwargs: Any) -> dict:
|
|
233
|
+
"""POST /v1/quality/lint — see QualityClient.quality_lint."""
|
|
234
|
+
return await self.quality.quality_lint(*args, **kwargs)
|
|
235
|
+
|
|
236
|
+
# ID: 1824000e-1ced-488b-a083-56e2e25529ec
|
|
237
|
+
async def quality_tests(self, *args: Any, **kwargs: Any) -> dict:
|
|
238
|
+
"""POST /v1/quality/tests — see QualityClient.quality_tests."""
|
|
239
|
+
return await self.quality.quality_tests(*args, **kwargs)
|
|
240
|
+
|
|
241
|
+
# ID: efdd8365-2deb-4093-b03e-fb5aa303647f
|
|
242
|
+
async def quality_system(self, *args: Any, **kwargs: Any) -> dict:
|
|
243
|
+
"""POST /v1/quality/system — see QualityClient.quality_system."""
|
|
244
|
+
return await self.quality.quality_system(*args, **kwargs)
|
|
245
|
+
|
|
246
|
+
# ID: d41045dd-54cb-4b72-897b-55ed29d3f305
|
|
247
|
+
async def quality_gates(self, *args: Any, **kwargs: Any) -> dict:
|
|
248
|
+
"""POST /v1/quality/gates — see QualityClient.quality_gates."""
|
|
249
|
+
return await self.quality.quality_gates(*args, **kwargs)
|
|
250
|
+
|
|
251
|
+
# -- /coverage, /tests/interactive (CoverageClient) ----------------
|
|
252
|
+
|
|
253
|
+
# ID: a8b2c4d6-1e3f-4a5b-6c7d-8e9f0a1b2c3d
|
|
254
|
+
async def coverage_check(self, *args: Any, **kwargs: Any) -> dict:
|
|
255
|
+
"""GET /v1/coverage/check — see CoverageClient.coverage_check."""
|
|
256
|
+
return await self.coverage.coverage_check(*args, **kwargs)
|
|
257
|
+
|
|
258
|
+
# ID: b9c3d5e7-2f4a-4b6c-7d8e-9f0a1b2c3d4e
|
|
259
|
+
async def coverage_report(self, *args: Any, **kwargs: Any) -> dict:
|
|
260
|
+
"""GET /v1/coverage/report — see CoverageClient.coverage_report."""
|
|
261
|
+
return await self.coverage.coverage_report(*args, **kwargs)
|
|
262
|
+
|
|
263
|
+
# ID: c0d4e6f8-3a5b-4c7d-8e9f-0a1b2c3d4e5f
|
|
264
|
+
async def coverage_targets(self, *args: Any, **kwargs: Any) -> dict:
|
|
265
|
+
"""GET /v1/coverage/targets — see CoverageClient.coverage_targets."""
|
|
266
|
+
return await self.coverage.coverage_targets(*args, **kwargs)
|
|
267
|
+
|
|
268
|
+
# ID: d1e5f7a9-4b6c-4d8e-9f0a-1b2c3d4e5f60
|
|
269
|
+
async def coverage_gaps(self, *args: Any, **kwargs: Any) -> dict:
|
|
270
|
+
"""GET /v1/coverage/gaps — see CoverageClient.coverage_gaps."""
|
|
271
|
+
return await self.coverage.coverage_gaps(*args, **kwargs)
|
|
272
|
+
|
|
273
|
+
# ID: e2f6a8b0-5c7d-4e9f-0a1b-2c3d4e5f6071
|
|
274
|
+
async def coverage_history(self, *args: Any, **kwargs: Any) -> dict:
|
|
275
|
+
"""GET /v1/coverage/history — see CoverageClient.coverage_history."""
|
|
276
|
+
return await self.coverage.coverage_history(*args, **kwargs)
|
|
277
|
+
|
|
278
|
+
# ID: f3a7b9c1-6d8e-4f0a-1b2c-3d4e5f607182
|
|
279
|
+
async def coverage_methods(self, *args: Any, **kwargs: Any) -> dict:
|
|
280
|
+
"""GET /v1/coverage/methods — see CoverageClient.coverage_methods."""
|
|
281
|
+
return await self.coverage.coverage_methods(*args, **kwargs)
|
|
282
|
+
|
|
283
|
+
# ID: 04b8c0d2-7e9f-4a1b-2c3d-4e5f60718293
|
|
284
|
+
async def coverage_generate(self, *args: Any, **kwargs: Any) -> dict:
|
|
285
|
+
"""POST /v1/coverage/generate — see CoverageClient.coverage_generate."""
|
|
286
|
+
return await self.coverage.coverage_generate(*args, **kwargs)
|
|
287
|
+
|
|
288
|
+
# ID: 15c9d1e3-8f0a-4b2c-3d4e-5f60718293a4
|
|
289
|
+
async def coverage_generate_batch(self, *args: Any, **kwargs: Any) -> dict:
|
|
290
|
+
"""POST /v1/coverage/generate:batch — see CoverageClient.coverage_generate_batch."""
|
|
291
|
+
return await self.coverage.coverage_generate_batch(*args, **kwargs)
|
|
292
|
+
|
|
293
|
+
# ID: 26dae2f4-9a1b-4c3d-4e5f-60718293a4b5
|
|
294
|
+
async def get_coverage_run(self, *args: Any, **kwargs: Any) -> dict:
|
|
295
|
+
"""GET /v1/coverage/runs/{run_id} — see CoverageClient.get_coverage_run."""
|
|
296
|
+
return await self.coverage.get_coverage_run(*args, **kwargs)
|
|
297
|
+
|
|
298
|
+
# ID: 37ebf3a5-0b2c-4d4e-5f60-718293a4b5c6
|
|
299
|
+
async def poll_coverage_run(self, *args: Any, **kwargs: Any) -> dict:
|
|
300
|
+
"""Poll a coverage run — see CoverageClient.poll_coverage_run."""
|
|
301
|
+
return await self.coverage.poll_coverage_run(*args, **kwargs)
|
|
302
|
+
|
|
303
|
+
# ID: 48fc04b6-1c3d-4e5f-6071-8293a4b5c6d7
|
|
304
|
+
async def tests_interactive(self, *args: Any, **kwargs: Any) -> dict:
|
|
305
|
+
"""POST /v1/tests/interactive — see CoverageClient.tests_interactive."""
|
|
306
|
+
return await self.coverage.tests_interactive(*args, **kwargs)
|
|
307
|
+
|
|
308
|
+
# -- /refactor (RefactorClient) ------------------------------------
|
|
309
|
+
|
|
310
|
+
# ID: 59ad15c7-2d4e-4f60-7182-93a4b5c6d7e8
|
|
311
|
+
async def refactor_threshold(self, *args: Any, **kwargs: Any) -> dict:
|
|
312
|
+
"""GET /v1/refactor/threshold — see RefactorClient.refactor_threshold."""
|
|
313
|
+
return await self.refactor.refactor_threshold(*args, **kwargs)
|
|
314
|
+
|
|
315
|
+
# ID: 6abe26d8-3e5f-4071-8293-a4b5c6d7e8f9
|
|
316
|
+
async def refactor_score(self, *args: Any, **kwargs: Any) -> dict:
|
|
317
|
+
"""GET /v1/refactor/score — see RefactorClient.refactor_score."""
|
|
318
|
+
return await self.refactor.refactor_score(*args, **kwargs)
|
|
319
|
+
|
|
320
|
+
# ID: 7bcf37e9-4f60-4182-93a4-b5c6d7e8f90a
|
|
321
|
+
async def refactor_candidates(self, *args: Any, **kwargs: Any) -> dict:
|
|
322
|
+
"""GET /v1/refactor/candidates — see RefactorClient.refactor_candidates."""
|
|
323
|
+
return await self.refactor.refactor_candidates(*args, **kwargs)
|
|
324
|
+
|
|
325
|
+
# ID: 8cd048fa-5071-4293-a4b5-c6d7e8f90a1b
|
|
326
|
+
async def refactor_stats(self, *args: Any, **kwargs: Any) -> dict:
|
|
327
|
+
"""GET /v1/refactor/stats — see RefactorClient.refactor_stats."""
|
|
328
|
+
return await self.refactor.refactor_stats(*args, **kwargs)
|
|
329
|
+
|
|
330
|
+
# ID: 9de1590b-6182-4304-b5c6-d7e8f90a1b2c
|
|
331
|
+
async def refactor_autonomous(self, *args: Any, **kwargs: Any) -> dict:
|
|
332
|
+
"""POST /v1/refactor/autonomous — see RefactorClient.refactor_autonomous."""
|
|
333
|
+
return await self.refactor.refactor_autonomous(*args, **kwargs)
|
|
334
|
+
|
|
335
|
+
# ID: aef26a1c-7293-4415-c6d7-e8f90a1b2c3d
|
|
336
|
+
async def get_refactor_run(self, *args: Any, **kwargs: Any) -> dict:
|
|
337
|
+
"""GET /v1/refactor/runs/{run_id} — see RefactorClient.get_refactor_run."""
|
|
338
|
+
return await self.refactor.get_refactor_run(*args, **kwargs)
|
|
339
|
+
|
|
340
|
+
# ID: bf037b2d-83a4-4526-d7e8-f90a1b2c3d4e
|
|
341
|
+
async def poll_refactor_run(self, *args: Any, **kwargs: Any) -> dict:
|
|
342
|
+
"""Poll a refactor run — see RefactorClient.poll_refactor_run."""
|
|
343
|
+
return await self.refactor.poll_refactor_run(*args, **kwargs)
|
|
344
|
+
|
|
345
|
+
# -- /status, /decisions, /refusals, /analysis, /components, /search (InspectClient) --
|
|
346
|
+
|
|
347
|
+
# ID: c0148c3e-94b5-4637-e8f9-0a1b2c3d4e5f
|
|
348
|
+
async def status_db(self, *args: Any, **kwargs: Any) -> dict:
|
|
349
|
+
"""GET /v1/status/db — see InspectClient.status_db."""
|
|
350
|
+
return await self.inspect.status_db(*args, **kwargs)
|
|
351
|
+
|
|
352
|
+
# ID: d1259d4f-a5c6-4748-f90a-1b2c3d4e5f60
|
|
353
|
+
async def status_drift(self, *args: Any, **kwargs: Any) -> dict:
|
|
354
|
+
"""GET /v1/status/drift — see InspectClient.status_drift."""
|
|
355
|
+
return await self.inspect.status_drift(*args, **kwargs)
|
|
356
|
+
|
|
357
|
+
# ID: e236ae50-b6d7-4859-0a1b-2c3d4e5f6071
|
|
358
|
+
async def decisions_list(self, *args: Any, **kwargs: Any) -> dict:
|
|
359
|
+
"""GET /v1/decisions — see InspectClient.decisions_list."""
|
|
360
|
+
return await self.inspect.decisions_list(*args, **kwargs)
|
|
361
|
+
|
|
362
|
+
# ID: f347bf61-c7e8-495a-1b2c-3d4e5f607182
|
|
363
|
+
async def decisions_patterns(self, *args: Any, **kwargs: Any) -> dict:
|
|
364
|
+
"""GET /v1/decisions/patterns — see InspectClient.decisions_patterns."""
|
|
365
|
+
return await self.inspect.decisions_patterns(*args, **kwargs)
|
|
366
|
+
|
|
367
|
+
# ID: 0458c072-d8f9-4a6b-2c3d-4e5f60718293
|
|
368
|
+
async def refusals_list(self, *args: Any, **kwargs: Any) -> dict:
|
|
369
|
+
"""GET /v1/refusals — see InspectClient.refusals_list."""
|
|
370
|
+
return await self.inspect.refusals_list(*args, **kwargs)
|
|
371
|
+
|
|
372
|
+
# ID: 1569d183-e90a-4b7c-3d4e-5f60718293a4
|
|
373
|
+
async def refusals_stats(self, *args: Any, **kwargs: Any) -> dict:
|
|
374
|
+
"""GET /v1/refusals/stats — see InspectClient.refusals_stats."""
|
|
375
|
+
return await self.inspect.refusals_stats(*args, **kwargs)
|
|
376
|
+
|
|
377
|
+
# ID: 267ae294-f01b-4c8d-4e5f-60718293a4b5
|
|
378
|
+
async def analysis_clusters(self, *args: Any, **kwargs: Any) -> dict:
|
|
379
|
+
"""GET /v1/analysis/clusters — see InspectClient.analysis_clusters."""
|
|
380
|
+
return await self.inspect.analysis_clusters(*args, **kwargs)
|
|
381
|
+
|
|
382
|
+
# ID: 378bf3a5-012c-4d9e-5f60-718293a4b5c6
|
|
383
|
+
async def analysis_duplicates(self, *args: Any, **kwargs: Any) -> dict:
|
|
384
|
+
"""GET /v1/analysis/duplicates — see InspectClient.analysis_duplicates."""
|
|
385
|
+
return await self.inspect.analysis_duplicates(*args, **kwargs)
|
|
386
|
+
|
|
387
|
+
# ID: 489c04b6-123d-4e0f-6071-8293a4b5c6d7
|
|
388
|
+
async def analysis_common_knowledge(self, *args: Any, **kwargs: Any) -> dict:
|
|
389
|
+
"""GET /v1/analysis/common-knowledge — see InspectClient.analysis_common_knowledge."""
|
|
390
|
+
return await self.inspect.analysis_common_knowledge(*args, **kwargs)
|
|
391
|
+
|
|
392
|
+
# ID: 59ad15c7-234e-4f10-7182-93a4b5c6d7e8
|
|
393
|
+
async def analysis_command_tree(self, *args: Any, **kwargs: Any) -> dict:
|
|
394
|
+
"""GET /v1/analysis/command-tree — see InspectClient.analysis_command_tree."""
|
|
395
|
+
return await self.inspect.analysis_command_tree(*args, **kwargs)
|
|
396
|
+
|
|
397
|
+
# ID: 6abe26d8-345f-4021-8293-a4b5c6d7e8f9
|
|
398
|
+
async def analysis_test_targets(self, *args: Any, **kwargs: Any) -> dict:
|
|
399
|
+
"""GET /v1/analysis/test-targets — see InspectClient.analysis_test_targets."""
|
|
400
|
+
return await self.inspect.analysis_test_targets(*args, **kwargs)
|
|
401
|
+
|
|
402
|
+
# ID: b347cf17-8caa-4c05-9853-4942b3d8c08f
|
|
403
|
+
async def inspect_components(self, *args: Any, **kwargs: Any) -> dict:
|
|
404
|
+
"""GET /v1/components — see InspectClient.inspect_components."""
|
|
405
|
+
return await self.inspect.inspect_components(*args, **kwargs)
|
|
406
|
+
|
|
407
|
+
# ID: dbf1dc9a-2a32-4319-94d4-d450c9a54836
|
|
408
|
+
async def inspect_search_capabilities(self, *args: Any, **kwargs: Any) -> dict:
|
|
409
|
+
"""GET /v1/search/capabilities — see InspectClient.inspect_search_capabilities."""
|
|
410
|
+
return await self.inspect.inspect_search_capabilities(*args, **kwargs)
|
|
411
|
+
|
|
412
|
+
# ID: 792970ef-a9d3-493d-9049-55d2cbfcf3b3
|
|
413
|
+
async def inspect_search_commands(self, *args: Any, **kwargs: Any) -> dict:
|
|
414
|
+
"""GET /v1/search/commands — see InspectClient.inspect_search_commands."""
|
|
415
|
+
return await self.inspect.inspect_search_commands(*args, **kwargs)
|
|
416
|
+
|
|
417
|
+
# -- /census (CensusClient) ----------------------------------------
|
|
418
|
+
|
|
419
|
+
# ID: 1a5b8c2d-3e4f-4567-89ab-cdef01234567
|
|
420
|
+
async def census_run(self, *args: Any, **kwargs: Any) -> dict:
|
|
421
|
+
"""POST /v1/census/runs — see CensusClient.census_run."""
|
|
422
|
+
return await self.census.census_run(*args, **kwargs)
|
|
423
|
+
|
|
424
|
+
# ID: 2b6c9d3e-4f5a-4678-9abc-def012345678
|
|
425
|
+
async def get_census_run(self, *args: Any, **kwargs: Any) -> dict:
|
|
426
|
+
"""GET /v1/census/runs/{run_id} — see CensusClient.get_census_run."""
|
|
427
|
+
return await self.census.get_census_run(*args, **kwargs)
|
|
428
|
+
|
|
429
|
+
# ID: 3c7d0e4f-5a6b-4789-abcd-ef0123456789
|
|
430
|
+
async def poll_census_run(self, *args: Any, **kwargs: Any) -> dict:
|
|
431
|
+
"""Poll a census run — see CensusClient.poll_census_run."""
|
|
432
|
+
return await self.census.poll_census_run(*args, **kwargs)
|
|
433
|
+
|
|
434
|
+
# ID: 4d8e1f5a-6b7c-489a-bcde-f01234567890
|
|
435
|
+
async def census_create_baseline(self, *args: Any, **kwargs: Any) -> dict:
|
|
436
|
+
"""POST /v1/census/baselines/{name} — see CensusClient.census_create_baseline."""
|
|
437
|
+
return await self.census.census_create_baseline(*args, **kwargs)
|
|
438
|
+
|
|
439
|
+
# ID: 5e9f2a6b-7c8d-490b-cdef-012345678901
|
|
440
|
+
async def census_list_baselines(self, *args: Any, **kwargs: Any) -> dict:
|
|
441
|
+
"""GET /v1/census/baselines — see CensusClient.census_list_baselines."""
|
|
442
|
+
return await self.census.census_list_baselines(*args, **kwargs)
|
|
443
|
+
|
|
444
|
+
# ID: 6a0b3c7d-8e9f-401c-def0-123456789012
|
|
445
|
+
async def census_diff(self, *args: Any, **kwargs: Any) -> dict:
|
|
446
|
+
"""GET /v1/census/diff — see CensusClient.census_diff."""
|
|
447
|
+
return await self.census.census_diff(*args, **kwargs)
|
|
448
|
+
|
|
449
|
+
# -- /sync (SyncClient) --------------------------------------------
|
|
450
|
+
|
|
451
|
+
# ID: 7b1c4d8e-9f0a-412d-ef01-234567890123
|
|
452
|
+
async def sync_knowledge_graph(self, *args: Any, **kwargs: Any) -> dict:
|
|
453
|
+
"""POST /v1/sync/knowledge-graph — see SyncClient.sync_knowledge_graph."""
|
|
454
|
+
return await self.sync.sync_knowledge_graph(*args, **kwargs)
|
|
455
|
+
|
|
456
|
+
# ID: 8c2d5e9f-0a1b-423e-f012-345678901234
|
|
457
|
+
async def sync_vectors(self, *args: Any, **kwargs: Any) -> dict:
|
|
458
|
+
"""POST /v1/sync/vectors — see SyncClient.sync_vectors."""
|
|
459
|
+
return await self.sync.sync_vectors(*args, **kwargs)
|
|
460
|
+
|
|
461
|
+
# ID: 9d3e6f0a-1b2c-434f-0123-456789012345
|
|
462
|
+
async def sync_code_vectors(self, *args: Any, **kwargs: Any) -> dict:
|
|
463
|
+
"""POST /v1/sync/code-vectors — see SyncClient.sync_code_vectors."""
|
|
464
|
+
return await self.sync.sync_code_vectors(*args, **kwargs)
|
|
465
|
+
|
|
466
|
+
# ID: 0e4f7a1b-2c3d-4450-1234-567890123456
|
|
467
|
+
async def sync_dev_sync(self, *args: Any, **kwargs: Any) -> dict:
|
|
468
|
+
"""POST /v1/sync/dev-sync — see SyncClient.sync_dev_sync."""
|
|
469
|
+
return await self.sync.sync_dev_sync(*args, **kwargs)
|
|
470
|
+
|
|
471
|
+
# ID: 1f5a8b2c-3d4e-4561-2345-678901234567
|
|
472
|
+
async def get_sync_run(self, *args: Any, **kwargs: Any) -> dict:
|
|
473
|
+
"""GET /v1/sync/runs/{run_id} — see SyncClient.get_sync_run."""
|
|
474
|
+
return await self.sync.get_sync_run(*args, **kwargs)
|
|
475
|
+
|
|
476
|
+
# ID: 2a6b9c3d-4e5f-4672-3456-789012345678
|
|
477
|
+
async def poll_sync_run(self, *args: Any, **kwargs: Any) -> dict:
|
|
478
|
+
"""Poll a sync run — see SyncClient.poll_sync_run."""
|
|
479
|
+
return await self.sync.poll_sync_run(*args, **kwargs)
|
|
480
|
+
|
|
481
|
+
# -- /integrity (IntegrityClient) ----------------------------------
|
|
482
|
+
|
|
483
|
+
# ID: 7ba84c02-f8a8-4895-befd-8e43e397cfbb
|
|
484
|
+
async def baseline(self, *args: Any, **kwargs: Any) -> dict:
|
|
485
|
+
"""POST /v1/integrity/baseline — see IntegrityClient.baseline."""
|
|
486
|
+
return await self.integrity.baseline(*args, **kwargs)
|
|
487
|
+
|
|
488
|
+
# ID: dc4b010a-8220-42e4-9d11-78613b6a2eb7
|
|
489
|
+
async def verify(self, *args: Any, **kwargs: Any) -> dict:
|
|
490
|
+
"""POST /v1/integrity/verify — see IntegrityClient.verify."""
|
|
491
|
+
return await self.integrity.verify(*args, **kwargs)
|
|
492
|
+
|
|
493
|
+
# -- /daemon (DaemonClient) ----------------------------------------
|
|
494
|
+
|
|
495
|
+
# ID: 3b7c0d4e-5f6a-4783-4567-890123456789
|
|
496
|
+
async def daemon_status(self, *args: Any, **kwargs: Any) -> dict:
|
|
497
|
+
"""GET /v1/daemon/status — see DaemonClient.daemon_status."""
|
|
498
|
+
return await self.daemon.daemon_status(*args, **kwargs)
|
|
499
|
+
|
|
500
|
+
# ID: 4c8d1e5f-6a7b-4894-5678-901234567890
|
|
501
|
+
async def daemon_start(self, *args: Any, **kwargs: Any) -> dict:
|
|
502
|
+
"""POST /v1/daemon/start — see DaemonClient.daemon_start."""
|
|
503
|
+
return await self.daemon.daemon_start(*args, **kwargs)
|
|
504
|
+
|
|
505
|
+
# ID: 5d9e2f6a-7b8c-49a5-6789-012345678901
|
|
506
|
+
async def daemon_stop(self, *args: Any, **kwargs: Any) -> dict:
|
|
507
|
+
"""POST /v1/daemon/stop — see DaemonClient.daemon_stop."""
|
|
508
|
+
return await self.daemon.daemon_stop(*args, **kwargs)
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# src/api/cli/coverage_client.py
|
|
2
|
+
|
|
3
|
+
"""Coverage namespace sub-client for CoreApiClient (issue #360).
|
|
4
|
+
|
|
5
|
+
Covers /v1/coverage/* and /v1/tests/interactive. Accessed via the
|
|
6
|
+
facade as `core_api_client.coverage`.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import TYPE_CHECKING
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from api.cli.client import CoreApiClient
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# ID: c7b169d0-f461-4e65-9633-f7b1becce3f6
|
|
19
|
+
class CoverageClient:
|
|
20
|
+
"""Sub-client for /coverage/* and /tests/interactive endpoints.
|
|
21
|
+
|
|
22
|
+
Constructed by and bound to a CoreApiClient facade; uses
|
|
23
|
+
`self._facade._request` for HTTP and `self._facade._poll_at_path`
|
|
24
|
+
for polling.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__(self, facade: CoreApiClient) -> None:
|
|
28
|
+
self._facade = facade
|
|
29
|
+
|
|
30
|
+
# ID: 6b94383f-e5df-426d-bffc-dda33108f230
|
|
31
|
+
async def coverage_check(self) -> dict:
|
|
32
|
+
"""GET /v1/coverage/check — constitutional coverage compliance check."""
|
|
33
|
+
return await self._facade._request("GET", "/v1/coverage/check", timeout=300.0)
|
|
34
|
+
|
|
35
|
+
# ID: 73677021-be1c-4add-b812-6b0191954bcd
|
|
36
|
+
async def coverage_report(
|
|
37
|
+
self, show_missing: bool = False, output_format: str = "text"
|
|
38
|
+
) -> dict:
|
|
39
|
+
"""GET /v1/coverage/report — pytest --cov report.
|
|
40
|
+
|
|
41
|
+
`output_format='text'` (default) returns the term report shape;
|
|
42
|
+
`output_format='html'` triggers `--cov-report=html` and returns
|
|
43
|
+
the `htmlcov/` path in `html_path` (#358).
|
|
44
|
+
"""
|
|
45
|
+
return await self._facade._request(
|
|
46
|
+
"GET",
|
|
47
|
+
"/v1/coverage/report",
|
|
48
|
+
params={"show_missing": show_missing, "format": output_format},
|
|
49
|
+
timeout=300.0,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# ID: 31762641-5b13-47a0-bf1a-68dc14d0c603
|
|
53
|
+
async def coverage_targets(self) -> dict:
|
|
54
|
+
"""GET /v1/coverage/targets — constitutional coverage targets."""
|
|
55
|
+
return await self._facade._request("GET", "/v1/coverage/targets")
|
|
56
|
+
|
|
57
|
+
# ID: 26fa1d84-8625-4f2b-a72f-ecf08157fc1d
|
|
58
|
+
async def coverage_gaps(self, threshold: float = 75.0, limit: int = 20) -> dict:
|
|
59
|
+
"""GET /v1/coverage/gaps — modules below threshold, ranked by deficit."""
|
|
60
|
+
return await self._facade._request(
|
|
61
|
+
"GET",
|
|
62
|
+
"/v1/coverage/gaps",
|
|
63
|
+
params={"threshold": threshold, "limit": limit},
|
|
64
|
+
timeout=300.0,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
# ID: 56ae27a0-5c75-4e23-9537-7c68c34d6795
|
|
68
|
+
async def coverage_history(self, limit: int = 30) -> dict:
|
|
69
|
+
"""GET /v1/coverage/history — recent coverage measurements."""
|
|
70
|
+
return await self._facade._request(
|
|
71
|
+
"GET", "/v1/coverage/history", params={"limit": limit}
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# ID: 63eeb7eb-27c0-4cbd-a546-bb563dc4310c
|
|
75
|
+
async def coverage_methods(self) -> dict:
|
|
76
|
+
"""GET /v1/coverage/methods — coverage method comparison descriptor."""
|
|
77
|
+
return await self._facade._request("GET", "/v1/coverage/methods")
|
|
78
|
+
|
|
79
|
+
# ID: 2f221d29-5a39-4466-b5a7-ad68565e6153
|
|
80
|
+
async def coverage_generate(self, target_file: str, write: bool = False) -> dict:
|
|
81
|
+
"""POST /v1/coverage/generate — single-file adaptive test generation."""
|
|
82
|
+
return await self._facade._request(
|
|
83
|
+
"POST",
|
|
84
|
+
"/v1/coverage/generate",
|
|
85
|
+
json={"target_file": target_file, "write": write},
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
# ID: 988d0251-117b-4938-86b8-ea0c8ad4956f
|
|
89
|
+
async def coverage_generate_batch(
|
|
90
|
+
self, priority: str = "all", write: bool = False
|
|
91
|
+
) -> dict:
|
|
92
|
+
"""POST /v1/coverage/generate:batch — prioritised batch generation."""
|
|
93
|
+
return await self._facade._request(
|
|
94
|
+
"POST",
|
|
95
|
+
"/v1/coverage/generate:batch",
|
|
96
|
+
json={"priority": priority, "write": write},
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# ID: d58f2fe7-c58b-442c-9f92-4a7ca0bf3aab
|
|
100
|
+
async def get_coverage_run(self, run_id: str) -> dict:
|
|
101
|
+
"""GET /v1/coverage/runs/{run_id} — fetch a coverage_runs row."""
|
|
102
|
+
return await self._facade._request("GET", f"/v1/coverage/runs/{run_id}")
|
|
103
|
+
|
|
104
|
+
# ID: 11e4f088-509b-4421-8eca-3a079dff76fe
|
|
105
|
+
async def poll_coverage_run(
|
|
106
|
+
self, run_id: str, timeout_seconds: float = 600.0
|
|
107
|
+
) -> dict:
|
|
108
|
+
"""Poll a coverage run until terminal. Test generation can be slow."""
|
|
109
|
+
return await self._facade._poll_at_path(
|
|
110
|
+
f"/v1/coverage/runs/{run_id}", timeout_seconds=timeout_seconds
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# ID: 2100735d-c584-4296-a71a-49c08e26c0f1
|
|
114
|
+
async def tests_interactive(self, target_file: str | None = None) -> dict:
|
|
115
|
+
"""POST /v1/tests/interactive — sync interactive test generation."""
|
|
116
|
+
return await self._facade._request(
|
|
117
|
+
"POST",
|
|
118
|
+
"/v1/tests/interactive",
|
|
119
|
+
json={"target_file": target_file},
|
|
120
|
+
timeout=600.0,
|
|
121
|
+
)
|
api/cli/daemon_client.py
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# src/api/cli/daemon_client.py
|
|
2
|
+
|
|
3
|
+
"""Daemon namespace sub-client for CoreApiClient (issue #360).
|
|
4
|
+
|
|
5
|
+
Covers /v1/daemon/* (ADR-058 D3). Accessed via the facade as
|
|
6
|
+
`core_api_client.daemon`.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import TYPE_CHECKING
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from api.cli.client import CoreApiClient
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# ID: 692aabbc-6659-4ba4-a137-bbc1c920c77f
|
|
19
|
+
class DaemonClient:
|
|
20
|
+
"""Sub-client for /daemon/* endpoints.
|
|
21
|
+
|
|
22
|
+
Constructed by and bound to a CoreApiClient facade; uses
|
|
23
|
+
`self._facade._request` for HTTP.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def __init__(self, facade: CoreApiClient) -> None:
|
|
27
|
+
self._facade = facade
|
|
28
|
+
|
|
29
|
+
# ID: 3db9fe94-a072-42b1-bb6f-4697266445c0
|
|
30
|
+
async def daemon_status(self) -> dict:
|
|
31
|
+
"""GET /v1/daemon/status — daemon liveness + per-worker health."""
|
|
32
|
+
return await self._facade._request("GET", "/v1/daemon/status")
|
|
33
|
+
|
|
34
|
+
# ID: fe391d8b-e92b-49a9-9392-0d520f8476ea
|
|
35
|
+
async def daemon_start(self) -> dict:
|
|
36
|
+
"""POST /v1/daemon/start — start core-daemon via systemctl."""
|
|
37
|
+
return await self._facade._request("POST", "/v1/daemon/start", json={})
|
|
38
|
+
|
|
39
|
+
# ID: 6d4ab8d7-ff36-4cd6-8917-43d7dd4afb57
|
|
40
|
+
async def daemon_stop(self) -> dict:
|
|
41
|
+
"""POST /v1/daemon/stop — schedule core-daemon stop (fire-and-forget)."""
|
|
42
|
+
return await self._facade._request("POST", "/v1/daemon/stop", json={})
|