empathy-framework 2.4.0__py3-none-any.whl → 3.8.2__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.
- coach_wizards/__init__.py +13 -12
- coach_wizards/accessibility_wizard.py +12 -12
- coach_wizards/api_wizard.py +12 -12
- coach_wizards/base_wizard.py +26 -20
- coach_wizards/cicd_wizard.py +15 -13
- coach_wizards/code_reviewer_README.md +60 -0
- coach_wizards/code_reviewer_wizard.py +180 -0
- coach_wizards/compliance_wizard.py +12 -12
- coach_wizards/database_wizard.py +12 -12
- coach_wizards/debugging_wizard.py +12 -12
- coach_wizards/documentation_wizard.py +12 -12
- coach_wizards/generate_wizards.py +1 -2
- coach_wizards/localization_wizard.py +101 -19
- coach_wizards/migration_wizard.py +12 -12
- coach_wizards/monitoring_wizard.py +12 -12
- coach_wizards/observability_wizard.py +12 -12
- coach_wizards/performance_wizard.py +12 -12
- coach_wizards/prompt_engineering_wizard.py +661 -0
- coach_wizards/refactoring_wizard.py +12 -12
- coach_wizards/scaling_wizard.py +12 -12
- coach_wizards/security_wizard.py +12 -12
- coach_wizards/testing_wizard.py +12 -12
- empathy_framework-3.8.2.dist-info/METADATA +1176 -0
- empathy_framework-3.8.2.dist-info/RECORD +333 -0
- empathy_framework-3.8.2.dist-info/entry_points.txt +22 -0
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/top_level.txt +5 -1
- empathy_healthcare_plugin/__init__.py +1 -2
- empathy_healthcare_plugin/monitors/__init__.py +9 -0
- empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
- empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
- empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
- empathy_llm_toolkit/__init__.py +7 -7
- empathy_llm_toolkit/agent_factory/__init__.py +53 -0
- empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
- empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
- empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
- empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
- empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
- empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
- empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
- empathy_llm_toolkit/agent_factory/base.py +305 -0
- empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
- empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
- empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
- empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
- empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
- empathy_llm_toolkit/agent_factory/decorators.py +286 -0
- empathy_llm_toolkit/agent_factory/factory.py +558 -0
- empathy_llm_toolkit/agent_factory/framework.py +192 -0
- empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
- empathy_llm_toolkit/agent_factory/resilient.py +320 -0
- empathy_llm_toolkit/claude_memory.py +14 -15
- empathy_llm_toolkit/cli/__init__.py +8 -0
- empathy_llm_toolkit/cli/sync_claude.py +487 -0
- empathy_llm_toolkit/code_health.py +186 -28
- empathy_llm_toolkit/config/__init__.py +29 -0
- empathy_llm_toolkit/config/unified.py +295 -0
- empathy_llm_toolkit/contextual_patterns.py +11 -12
- empathy_llm_toolkit/core.py +168 -53
- empathy_llm_toolkit/git_pattern_extractor.py +17 -13
- empathy_llm_toolkit/levels.py +6 -13
- empathy_llm_toolkit/pattern_confidence.py +14 -18
- empathy_llm_toolkit/pattern_resolver.py +10 -12
- empathy_llm_toolkit/pattern_summary.py +16 -14
- empathy_llm_toolkit/providers.py +194 -28
- empathy_llm_toolkit/routing/__init__.py +32 -0
- empathy_llm_toolkit/routing/model_router.py +362 -0
- empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
- empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
- empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
- empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
- empathy_llm_toolkit/security/README.md +262 -0
- empathy_llm_toolkit/security/__init__.py +62 -0
- empathy_llm_toolkit/security/audit_logger.py +929 -0
- empathy_llm_toolkit/security/audit_logger_example.py +152 -0
- empathy_llm_toolkit/security/pii_scrubber.py +640 -0
- empathy_llm_toolkit/security/secrets_detector.py +678 -0
- empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
- empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
- empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
- empathy_llm_toolkit/session_status.py +20 -22
- empathy_llm_toolkit/state.py +28 -21
- empathy_llm_toolkit/wizards/__init__.py +38 -0
- empathy_llm_toolkit/wizards/base_wizard.py +364 -0
- empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
- empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
- empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
- empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
- empathy_os/__init__.py +125 -84
- empathy_os/adaptive/__init__.py +13 -0
- empathy_os/adaptive/task_complexity.py +127 -0
- empathy_os/{monitoring.py → agent_monitoring.py} +28 -28
- empathy_os/cache/__init__.py +117 -0
- empathy_os/cache/base.py +166 -0
- empathy_os/cache/dependency_manager.py +253 -0
- empathy_os/cache/hash_only.py +248 -0
- empathy_os/cache/hybrid.py +390 -0
- empathy_os/cache/storage.py +282 -0
- empathy_os/cli.py +1516 -70
- empathy_os/cli_unified.py +597 -0
- empathy_os/config/__init__.py +63 -0
- empathy_os/config/xml_config.py +239 -0
- empathy_os/config.py +95 -37
- empathy_os/coordination.py +72 -68
- empathy_os/core.py +94 -107
- empathy_os/cost_tracker.py +74 -55
- empathy_os/dashboard/__init__.py +15 -0
- empathy_os/dashboard/server.py +743 -0
- empathy_os/discovery.py +17 -14
- empathy_os/emergence.py +21 -22
- empathy_os/exceptions.py +18 -30
- empathy_os/feedback_loops.py +30 -33
- empathy_os/levels.py +32 -35
- empathy_os/leverage_points.py +31 -32
- empathy_os/logging_config.py +19 -16
- empathy_os/memory/__init__.py +195 -0
- empathy_os/memory/claude_memory.py +466 -0
- empathy_os/memory/config.py +224 -0
- empathy_os/memory/control_panel.py +1298 -0
- empathy_os/memory/edges.py +179 -0
- empathy_os/memory/graph.py +567 -0
- empathy_os/memory/long_term.py +1194 -0
- empathy_os/memory/nodes.py +179 -0
- empathy_os/memory/redis_bootstrap.py +540 -0
- empathy_os/memory/security/__init__.py +31 -0
- empathy_os/memory/security/audit_logger.py +930 -0
- empathy_os/memory/security/pii_scrubber.py +640 -0
- empathy_os/memory/security/secrets_detector.py +678 -0
- empathy_os/memory/short_term.py +2119 -0
- empathy_os/memory/storage/__init__.py +15 -0
- empathy_os/memory/summary_index.py +583 -0
- empathy_os/memory/unified.py +619 -0
- empathy_os/metrics/__init__.py +12 -0
- empathy_os/metrics/prompt_metrics.py +190 -0
- empathy_os/models/__init__.py +136 -0
- empathy_os/models/__main__.py +13 -0
- empathy_os/models/cli.py +655 -0
- empathy_os/models/empathy_executor.py +354 -0
- empathy_os/models/executor.py +252 -0
- empathy_os/models/fallback.py +671 -0
- empathy_os/models/provider_config.py +563 -0
- empathy_os/models/registry.py +382 -0
- empathy_os/models/tasks.py +302 -0
- empathy_os/models/telemetry.py +548 -0
- empathy_os/models/token_estimator.py +378 -0
- empathy_os/models/validation.py +274 -0
- empathy_os/monitoring/__init__.py +52 -0
- empathy_os/monitoring/alerts.py +23 -0
- empathy_os/monitoring/alerts_cli.py +268 -0
- empathy_os/monitoring/multi_backend.py +271 -0
- empathy_os/monitoring/otel_backend.py +363 -0
- empathy_os/optimization/__init__.py +19 -0
- empathy_os/optimization/context_optimizer.py +272 -0
- empathy_os/pattern_library.py +30 -29
- empathy_os/persistence.py +35 -37
- empathy_os/platform_utils.py +261 -0
- empathy_os/plugins/__init__.py +28 -0
- empathy_os/plugins/base.py +361 -0
- empathy_os/plugins/registry.py +268 -0
- empathy_os/project_index/__init__.py +30 -0
- empathy_os/project_index/cli.py +335 -0
- empathy_os/project_index/crew_integration.py +430 -0
- empathy_os/project_index/index.py +425 -0
- empathy_os/project_index/models.py +501 -0
- empathy_os/project_index/reports.py +473 -0
- empathy_os/project_index/scanner.py +538 -0
- empathy_os/prompts/__init__.py +61 -0
- empathy_os/prompts/config.py +77 -0
- empathy_os/prompts/context.py +177 -0
- empathy_os/prompts/parser.py +285 -0
- empathy_os/prompts/registry.py +313 -0
- empathy_os/prompts/templates.py +208 -0
- empathy_os/redis_config.py +144 -58
- empathy_os/redis_memory.py +79 -77
- empathy_os/resilience/__init__.py +56 -0
- empathy_os/resilience/circuit_breaker.py +256 -0
- empathy_os/resilience/fallback.py +179 -0
- empathy_os/resilience/health.py +300 -0
- empathy_os/resilience/retry.py +209 -0
- empathy_os/resilience/timeout.py +135 -0
- empathy_os/routing/__init__.py +43 -0
- empathy_os/routing/chain_executor.py +433 -0
- empathy_os/routing/classifier.py +217 -0
- empathy_os/routing/smart_router.py +234 -0
- empathy_os/routing/wizard_registry.py +307 -0
- empathy_os/templates.py +19 -14
- empathy_os/trust/__init__.py +28 -0
- empathy_os/trust/circuit_breaker.py +579 -0
- empathy_os/trust_building.py +67 -58
- empathy_os/validation/__init__.py +19 -0
- empathy_os/validation/xml_validator.py +281 -0
- empathy_os/wizard_factory_cli.py +170 -0
- empathy_os/{workflows.py → workflow_commands.py} +131 -37
- empathy_os/workflows/__init__.py +360 -0
- empathy_os/workflows/base.py +1660 -0
- empathy_os/workflows/bug_predict.py +962 -0
- empathy_os/workflows/code_review.py +960 -0
- empathy_os/workflows/code_review_adapters.py +310 -0
- empathy_os/workflows/code_review_pipeline.py +720 -0
- empathy_os/workflows/config.py +600 -0
- empathy_os/workflows/dependency_check.py +648 -0
- empathy_os/workflows/document_gen.py +1069 -0
- empathy_os/workflows/documentation_orchestrator.py +1205 -0
- empathy_os/workflows/health_check.py +679 -0
- empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
- empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
- empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
- empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
- empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
- empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
- empathy_os/workflows/manage_documentation.py +804 -0
- empathy_os/workflows/new_sample_workflow1.py +146 -0
- empathy_os/workflows/new_sample_workflow1_README.md +150 -0
- empathy_os/workflows/perf_audit.py +687 -0
- empathy_os/workflows/pr_review.py +748 -0
- empathy_os/workflows/progress.py +445 -0
- empathy_os/workflows/progress_server.py +322 -0
- empathy_os/workflows/refactor_plan.py +693 -0
- empathy_os/workflows/release_prep.py +808 -0
- empathy_os/workflows/research_synthesis.py +404 -0
- empathy_os/workflows/secure_release.py +585 -0
- empathy_os/workflows/security_adapters.py +297 -0
- empathy_os/workflows/security_audit.py +1046 -0
- empathy_os/workflows/step_config.py +234 -0
- empathy_os/workflows/test5.py +125 -0
- empathy_os/workflows/test5_README.md +158 -0
- empathy_os/workflows/test_gen.py +1855 -0
- empathy_os/workflows/test_lifecycle.py +526 -0
- empathy_os/workflows/test_maintenance.py +626 -0
- empathy_os/workflows/test_maintenance_cli.py +590 -0
- empathy_os/workflows/test_maintenance_crew.py +821 -0
- empathy_os/workflows/xml_enhanced_crew.py +285 -0
- empathy_software_plugin/__init__.py +1 -2
- empathy_software_plugin/cli/__init__.py +120 -0
- empathy_software_plugin/cli/inspect.py +362 -0
- empathy_software_plugin/cli.py +49 -27
- empathy_software_plugin/plugin.py +4 -8
- empathy_software_plugin/wizards/__init__.py +42 -0
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
- empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
- empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
- empathy_software_plugin/wizards/base_wizard.py +288 -0
- empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
- empathy_software_plugin/wizards/code_review_wizard.py +606 -0
- empathy_software_plugin/wizards/debugging/__init__.py +50 -0
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
- empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
- empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
- empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
- empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
- empathy_software_plugin/wizards/debugging/verification.py +369 -0
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
- empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
- empathy_software_plugin/wizards/performance/__init__.py +9 -0
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
- empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
- empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
- empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
- empathy_software_plugin/wizards/security/__init__.py +32 -0
- empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
- empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
- empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
- empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
- empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
- empathy_software_plugin/wizards/testing/__init__.py +27 -0
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
- empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
- empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
- empathy_software_plugin/wizards/testing_wizard.py +274 -0
- hot_reload/README.md +473 -0
- hot_reload/__init__.py +62 -0
- hot_reload/config.py +84 -0
- hot_reload/integration.py +228 -0
- hot_reload/reloader.py +298 -0
- hot_reload/watcher.py +179 -0
- hot_reload/websocket.py +176 -0
- scaffolding/README.md +589 -0
- scaffolding/__init__.py +35 -0
- scaffolding/__main__.py +14 -0
- scaffolding/cli.py +240 -0
- test_generator/__init__.py +38 -0
- test_generator/__main__.py +14 -0
- test_generator/cli.py +226 -0
- test_generator/generator.py +325 -0
- test_generator/risk_analyzer.py +216 -0
- workflow_patterns/__init__.py +33 -0
- workflow_patterns/behavior.py +249 -0
- workflow_patterns/core.py +76 -0
- workflow_patterns/output.py +99 -0
- workflow_patterns/registry.py +255 -0
- workflow_patterns/structural.py +288 -0
- workflow_scaffolding/__init__.py +11 -0
- workflow_scaffolding/__main__.py +12 -0
- workflow_scaffolding/cli.py +206 -0
- workflow_scaffolding/generator.py +265 -0
- agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
- agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
- agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
- agents/compliance_anticipation_agent.py +0 -1427
- agents/epic_integration_wizard.py +0 -541
- agents/trust_building_behaviors.py +0 -891
- empathy_framework-2.4.0.dist-info/METADATA +0 -485
- empathy_framework-2.4.0.dist-info/RECORD +0 -102
- empathy_framework-2.4.0.dist-info/entry_points.txt +0 -6
- empathy_llm_toolkit/htmlcov/status.json +0 -1
- empathy_llm_toolkit/security/htmlcov/status.json +0 -1
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"""Smart Router
|
|
2
|
+
|
|
3
|
+
Intelligent dispatcher that analyzes developer input and routes
|
|
4
|
+
to the appropriate wizard(s) using LLM classification.
|
|
5
|
+
|
|
6
|
+
Copyright 2025 Smart AI Memory, LLC
|
|
7
|
+
Licensed under Fair Source 0.9
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from .classifier import ClassificationResult, HaikuClassifier
|
|
14
|
+
from .wizard_registry import WizardInfo, WizardRegistry
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class RoutingDecision:
|
|
19
|
+
"""Decision from the smart router."""
|
|
20
|
+
|
|
21
|
+
primary_wizard: str
|
|
22
|
+
secondary_wizards: list[str] = field(default_factory=list)
|
|
23
|
+
confidence: float = 0.0
|
|
24
|
+
reasoning: str = ""
|
|
25
|
+
suggested_chain: list[str] = field(default_factory=list)
|
|
26
|
+
context: dict[str, Any] = field(default_factory=dict)
|
|
27
|
+
|
|
28
|
+
# Metadata
|
|
29
|
+
classification_method: str = "llm" # llm, keyword, manual
|
|
30
|
+
request_summary: str = ""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class SmartRouter:
|
|
34
|
+
"""Routes developer requests to appropriate wizard(s).
|
|
35
|
+
|
|
36
|
+
Uses LLM classification (Haiku) to understand natural language
|
|
37
|
+
requests and route them to the best wizard(s).
|
|
38
|
+
|
|
39
|
+
Usage:
|
|
40
|
+
router = SmartRouter()
|
|
41
|
+
|
|
42
|
+
# Async routing (preferred - uses LLM)
|
|
43
|
+
decision = await router.route("Fix the security issue in auth.py")
|
|
44
|
+
print(f"Primary: {decision.primary_wizard}")
|
|
45
|
+
print(f"Confidence: {decision.confidence}")
|
|
46
|
+
|
|
47
|
+
# Sync routing (keyword fallback)
|
|
48
|
+
decision = router.route_sync("Optimize database queries")
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
def __init__(self, api_key: str | None = None):
|
|
52
|
+
"""Initialize the smart router.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
api_key: Optional Anthropic API key for LLM classification
|
|
56
|
+
|
|
57
|
+
"""
|
|
58
|
+
self._registry = WizardRegistry()
|
|
59
|
+
self._classifier = HaikuClassifier(api_key=api_key)
|
|
60
|
+
|
|
61
|
+
async def route(
|
|
62
|
+
self,
|
|
63
|
+
request: str,
|
|
64
|
+
context: dict[str, Any] | None = None,
|
|
65
|
+
) -> RoutingDecision:
|
|
66
|
+
"""Route a request to the appropriate wizard(s).
|
|
67
|
+
|
|
68
|
+
Uses LLM classification for accurate natural language understanding.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
request: Developer's natural language request
|
|
72
|
+
context: Optional context (current file, project info, etc.)
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
RoutingDecision with wizard recommendations
|
|
76
|
+
|
|
77
|
+
"""
|
|
78
|
+
# Classify the request
|
|
79
|
+
classification = await self._classifier.classify(
|
|
80
|
+
request=request,
|
|
81
|
+
context=context,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# Build suggested chain based on wizard triggers
|
|
85
|
+
suggested_chain = self._build_chain(classification)
|
|
86
|
+
|
|
87
|
+
# Merge extracted context
|
|
88
|
+
merged_context = {**(context or {}), **classification.extracted_context}
|
|
89
|
+
|
|
90
|
+
return RoutingDecision(
|
|
91
|
+
primary_wizard=classification.primary_wizard,
|
|
92
|
+
secondary_wizards=classification.secondary_wizards,
|
|
93
|
+
confidence=classification.confidence,
|
|
94
|
+
reasoning=classification.reasoning,
|
|
95
|
+
suggested_chain=suggested_chain,
|
|
96
|
+
context=merged_context,
|
|
97
|
+
classification_method="llm",
|
|
98
|
+
request_summary=request[:100],
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
def route_sync(
|
|
102
|
+
self,
|
|
103
|
+
request: str,
|
|
104
|
+
context: dict[str, Any] | None = None,
|
|
105
|
+
) -> RoutingDecision:
|
|
106
|
+
"""Synchronous routing using keyword matching.
|
|
107
|
+
|
|
108
|
+
Faster but less accurate than LLM classification.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
request: Developer's request
|
|
112
|
+
context: Optional context
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
RoutingDecision with wizard recommendations
|
|
116
|
+
|
|
117
|
+
"""
|
|
118
|
+
classification = self._classifier.classify_sync(
|
|
119
|
+
request=request,
|
|
120
|
+
context=context,
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
suggested_chain = self._build_chain(classification)
|
|
124
|
+
|
|
125
|
+
return RoutingDecision(
|
|
126
|
+
primary_wizard=classification.primary_wizard,
|
|
127
|
+
secondary_wizards=classification.secondary_wizards,
|
|
128
|
+
confidence=classification.confidence,
|
|
129
|
+
reasoning=classification.reasoning,
|
|
130
|
+
suggested_chain=suggested_chain,
|
|
131
|
+
context=context or {},
|
|
132
|
+
classification_method="keyword",
|
|
133
|
+
request_summary=request[:100],
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
def _build_chain(self, classification: ClassificationResult) -> list[str]:
|
|
137
|
+
"""Build suggested wizard chain based on triggers."""
|
|
138
|
+
chain = [classification.primary_wizard]
|
|
139
|
+
|
|
140
|
+
# Add secondary wizards to chain
|
|
141
|
+
for secondary in classification.secondary_wizards:
|
|
142
|
+
if secondary not in chain:
|
|
143
|
+
chain.append(secondary)
|
|
144
|
+
|
|
145
|
+
# Check for auto-chain triggers from primary wizard
|
|
146
|
+
triggers = self._registry.get_chain_triggers(classification.primary_wizard)
|
|
147
|
+
for trigger in triggers:
|
|
148
|
+
next_wizard = trigger.get("next")
|
|
149
|
+
if next_wizard and next_wizard not in chain:
|
|
150
|
+
chain.append(next_wizard)
|
|
151
|
+
|
|
152
|
+
return chain
|
|
153
|
+
|
|
154
|
+
def get_wizard_info(self, name: str) -> WizardInfo | None:
|
|
155
|
+
"""Get information about a specific wizard."""
|
|
156
|
+
return self._registry.get(name)
|
|
157
|
+
|
|
158
|
+
def list_wizards(self) -> list[WizardInfo]:
|
|
159
|
+
"""List all available wizards."""
|
|
160
|
+
return self._registry.list_all()
|
|
161
|
+
|
|
162
|
+
def suggest_for_file(self, file_path: str) -> list[str]:
|
|
163
|
+
"""Suggest wizards based on file type.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
file_path: Path to the file
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
List of suggested wizard names
|
|
170
|
+
|
|
171
|
+
"""
|
|
172
|
+
suggestions = []
|
|
173
|
+
|
|
174
|
+
# Get file extension
|
|
175
|
+
ext = "." + file_path.rsplit(".", 1)[-1] if "." in file_path else ""
|
|
176
|
+
filename = file_path.rsplit("/", 1)[-1]
|
|
177
|
+
|
|
178
|
+
for wizard in self._registry.list_all():
|
|
179
|
+
if ext in wizard.handles_file_types or filename in wizard.handles_file_types:
|
|
180
|
+
suggestions.append(wizard.name)
|
|
181
|
+
|
|
182
|
+
# Default suggestions if no matches
|
|
183
|
+
if not suggestions:
|
|
184
|
+
suggestions = ["code-review", "security-audit"]
|
|
185
|
+
|
|
186
|
+
return suggestions
|
|
187
|
+
|
|
188
|
+
def suggest_for_error(self, error_type: str) -> list[str]:
|
|
189
|
+
"""Suggest wizards based on error type.
|
|
190
|
+
|
|
191
|
+
Args:
|
|
192
|
+
error_type: Type of error (e.g., "TypeError", "SecurityError")
|
|
193
|
+
|
|
194
|
+
Returns:
|
|
195
|
+
List of suggested wizard names
|
|
196
|
+
|
|
197
|
+
"""
|
|
198
|
+
error_lower = error_type.lower()
|
|
199
|
+
|
|
200
|
+
# Map error types to wizards
|
|
201
|
+
error_wizard_map = {
|
|
202
|
+
"security": ["security-audit", "code-review"],
|
|
203
|
+
"type": ["code-review", "bug-predict"],
|
|
204
|
+
"null": ["bug-predict", "test-gen"],
|
|
205
|
+
"undefined": ["bug-predict", "test-gen"],
|
|
206
|
+
"timeout": ["perf-audit", "bug-predict"],
|
|
207
|
+
"memory": ["perf-audit", "code-review"],
|
|
208
|
+
"import": ["dependency-check", "code-review"],
|
|
209
|
+
"permission": ["security-audit", "code-review"],
|
|
210
|
+
"syntax": ["code-review"],
|
|
211
|
+
"test": ["test-gen", "bug-predict"],
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
for keyword, wizards in error_wizard_map.items():
|
|
215
|
+
if keyword in error_lower:
|
|
216
|
+
return wizards
|
|
217
|
+
|
|
218
|
+
return ["bug-predict", "code-review"]
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
# Convenience function for quick routing
|
|
222
|
+
async def quick_route(request: str, context: dict | None = None) -> RoutingDecision:
|
|
223
|
+
"""Quick routing helper.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
request: Developer request
|
|
227
|
+
context: Optional context
|
|
228
|
+
|
|
229
|
+
Returns:
|
|
230
|
+
RoutingDecision
|
|
231
|
+
|
|
232
|
+
"""
|
|
233
|
+
router = SmartRouter()
|
|
234
|
+
return await router.route(request, context)
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
"""Wizard Registry
|
|
2
|
+
|
|
3
|
+
Central registry of available wizards with their descriptions,
|
|
4
|
+
capabilities, and auto-chain rules.
|
|
5
|
+
|
|
6
|
+
Copyright 2025 Smart AI Memory, LLC
|
|
7
|
+
Licensed under Fair Source 0.9
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from collections.abc import Callable
|
|
11
|
+
from dataclasses import dataclass, field
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class WizardInfo:
|
|
17
|
+
"""Information about a registered wizard."""
|
|
18
|
+
|
|
19
|
+
name: str
|
|
20
|
+
description: str
|
|
21
|
+
keywords: list[str] # Keywords for classification
|
|
22
|
+
|
|
23
|
+
# Classification hints
|
|
24
|
+
primary_domain: str = "" # security, performance, testing, etc.
|
|
25
|
+
handles_file_types: list[str] = field(default_factory=list)
|
|
26
|
+
complexity: str = "medium" # low, medium, high
|
|
27
|
+
|
|
28
|
+
# Chaining configuration
|
|
29
|
+
auto_chain: bool = False
|
|
30
|
+
chain_triggers: list[dict[str, Any]] = field(default_factory=list)
|
|
31
|
+
|
|
32
|
+
# Optional wizard class or factory
|
|
33
|
+
wizard_class: type | None = None
|
|
34
|
+
factory: Callable[..., Any] | None = None
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# Default wizard registry
|
|
38
|
+
WIZARD_REGISTRY: dict[str, WizardInfo] = {
|
|
39
|
+
# Workflows (cost-optimized pipelines)
|
|
40
|
+
"security-audit": WizardInfo(
|
|
41
|
+
name="security-audit",
|
|
42
|
+
description="Analyze code for security vulnerabilities, injection risks, compliance",
|
|
43
|
+
keywords=[
|
|
44
|
+
"security",
|
|
45
|
+
"vulnerability",
|
|
46
|
+
"injection",
|
|
47
|
+
"xss",
|
|
48
|
+
"sql",
|
|
49
|
+
"auth",
|
|
50
|
+
"authentication",
|
|
51
|
+
"authorization",
|
|
52
|
+
"sensitive",
|
|
53
|
+
"credential",
|
|
54
|
+
"password",
|
|
55
|
+
"secret",
|
|
56
|
+
"owasp",
|
|
57
|
+
"cve",
|
|
58
|
+
"exploit",
|
|
59
|
+
],
|
|
60
|
+
primary_domain="security",
|
|
61
|
+
handles_file_types=[".py", ".js", ".ts", ".java", ".go", ".rb"],
|
|
62
|
+
auto_chain=True,
|
|
63
|
+
chain_triggers=[
|
|
64
|
+
{"condition": "high_severity_count > 0", "next": "dependency-check"},
|
|
65
|
+
{"condition": "vulnerability_type == 'injection'", "next": "code-review"},
|
|
66
|
+
],
|
|
67
|
+
),
|
|
68
|
+
"code-review": WizardInfo(
|
|
69
|
+
name="code-review",
|
|
70
|
+
description="Review code for quality, best practices, maintainability, and bugs",
|
|
71
|
+
keywords=[
|
|
72
|
+
"review",
|
|
73
|
+
"code",
|
|
74
|
+
"quality",
|
|
75
|
+
"lint",
|
|
76
|
+
"style",
|
|
77
|
+
"convention",
|
|
78
|
+
"best practice",
|
|
79
|
+
"maintainability",
|
|
80
|
+
"readable",
|
|
81
|
+
"clean",
|
|
82
|
+
"refactor",
|
|
83
|
+
"smell",
|
|
84
|
+
],
|
|
85
|
+
primary_domain="quality",
|
|
86
|
+
handles_file_types=[".py", ".js", ".ts", ".java", ".go", ".rb", ".cpp", ".c"],
|
|
87
|
+
auto_chain=True,
|
|
88
|
+
chain_triggers=[
|
|
89
|
+
{"condition": "has_complexity_issues", "next": "refactor-plan"},
|
|
90
|
+
],
|
|
91
|
+
),
|
|
92
|
+
"bug-predict": WizardInfo(
|
|
93
|
+
name="bug-predict",
|
|
94
|
+
description="Predict potential bugs based on code patterns and historical data",
|
|
95
|
+
keywords=[
|
|
96
|
+
"bug",
|
|
97
|
+
"error",
|
|
98
|
+
"crash",
|
|
99
|
+
"exception",
|
|
100
|
+
"fail",
|
|
101
|
+
"broken",
|
|
102
|
+
"fix",
|
|
103
|
+
"issue",
|
|
104
|
+
"problem",
|
|
105
|
+
"defect",
|
|
106
|
+
"null",
|
|
107
|
+
"undefined",
|
|
108
|
+
],
|
|
109
|
+
primary_domain="debugging",
|
|
110
|
+
auto_chain=True,
|
|
111
|
+
chain_triggers=[
|
|
112
|
+
{"condition": "risk_score > 0.7", "next": "test-gen"},
|
|
113
|
+
],
|
|
114
|
+
),
|
|
115
|
+
"perf-audit": WizardInfo(
|
|
116
|
+
name="perf-audit",
|
|
117
|
+
description="Analyze code for performance issues, bottlenecks, optimizations",
|
|
118
|
+
keywords=[
|
|
119
|
+
"performance",
|
|
120
|
+
"perf",
|
|
121
|
+
"slow",
|
|
122
|
+
"fast",
|
|
123
|
+
"speed",
|
|
124
|
+
"optimize",
|
|
125
|
+
"bottleneck",
|
|
126
|
+
"memory",
|
|
127
|
+
"cpu",
|
|
128
|
+
"latency",
|
|
129
|
+
"throughput",
|
|
130
|
+
"cache",
|
|
131
|
+
"profile",
|
|
132
|
+
],
|
|
133
|
+
primary_domain="performance",
|
|
134
|
+
auto_chain=True,
|
|
135
|
+
chain_triggers=[
|
|
136
|
+
{"condition": "hotspot_count > 5", "next": "refactor-plan"},
|
|
137
|
+
],
|
|
138
|
+
),
|
|
139
|
+
"refactor-plan": WizardInfo(
|
|
140
|
+
name="refactor-plan",
|
|
141
|
+
description="Plan code refactoring to improve structure, reduce complexity",
|
|
142
|
+
keywords=[
|
|
143
|
+
"refactor",
|
|
144
|
+
"restructure",
|
|
145
|
+
"reorganize",
|
|
146
|
+
"simplify",
|
|
147
|
+
"complexity",
|
|
148
|
+
"architecture",
|
|
149
|
+
"design",
|
|
150
|
+
"pattern",
|
|
151
|
+
"clean",
|
|
152
|
+
],
|
|
153
|
+
primary_domain="architecture",
|
|
154
|
+
auto_chain=False, # Require approval for refactoring
|
|
155
|
+
),
|
|
156
|
+
"test-gen": WizardInfo(
|
|
157
|
+
name="test-gen",
|
|
158
|
+
description="Generate test cases and improve test coverage",
|
|
159
|
+
keywords=[
|
|
160
|
+
"test",
|
|
161
|
+
"testing",
|
|
162
|
+
"unit",
|
|
163
|
+
"integration",
|
|
164
|
+
"coverage",
|
|
165
|
+
"pytest",
|
|
166
|
+
"jest",
|
|
167
|
+
"mock",
|
|
168
|
+
"assert",
|
|
169
|
+
"spec",
|
|
170
|
+
],
|
|
171
|
+
primary_domain="testing",
|
|
172
|
+
handles_file_types=[".py", ".js", ".ts", ".java"],
|
|
173
|
+
auto_chain=True,
|
|
174
|
+
chain_triggers=[
|
|
175
|
+
{"condition": "coverage_low", "next": "bug-predict"},
|
|
176
|
+
],
|
|
177
|
+
),
|
|
178
|
+
"doc-gen": WizardInfo(
|
|
179
|
+
name="doc-gen",
|
|
180
|
+
description="Generate documentation from code including API docs, READMEs, and guides",
|
|
181
|
+
keywords=[
|
|
182
|
+
"document",
|
|
183
|
+
"doc",
|
|
184
|
+
"readme",
|
|
185
|
+
"api",
|
|
186
|
+
"explain",
|
|
187
|
+
"describe",
|
|
188
|
+
"comment",
|
|
189
|
+
"docstring",
|
|
190
|
+
"jsdoc",
|
|
191
|
+
],
|
|
192
|
+
primary_domain="documentation",
|
|
193
|
+
auto_chain=False,
|
|
194
|
+
),
|
|
195
|
+
"dependency-check": WizardInfo(
|
|
196
|
+
name="dependency-check",
|
|
197
|
+
description="Audit dependencies for vulnerabilities, updates, and license issues",
|
|
198
|
+
keywords=[
|
|
199
|
+
"dependency",
|
|
200
|
+
"package",
|
|
201
|
+
"npm",
|
|
202
|
+
"pip",
|
|
203
|
+
"library",
|
|
204
|
+
"version",
|
|
205
|
+
"update",
|
|
206
|
+
"outdated",
|
|
207
|
+
"license",
|
|
208
|
+
"vulnerability",
|
|
209
|
+
],
|
|
210
|
+
primary_domain="dependencies",
|
|
211
|
+
handles_file_types=["requirements.txt", "package.json", "pyproject.toml", "Cargo.toml"],
|
|
212
|
+
auto_chain=True,
|
|
213
|
+
chain_triggers=[
|
|
214
|
+
{"condition": "critical_vuln_count > 0", "next": "security-audit"},
|
|
215
|
+
],
|
|
216
|
+
),
|
|
217
|
+
"release-prep": WizardInfo(
|
|
218
|
+
name="release-prep",
|
|
219
|
+
description="Pre-release quality gate with health checks, security scan, and changelog",
|
|
220
|
+
keywords=[
|
|
221
|
+
"release",
|
|
222
|
+
"deploy",
|
|
223
|
+
"publish",
|
|
224
|
+
"ship",
|
|
225
|
+
"version",
|
|
226
|
+
"changelog",
|
|
227
|
+
"ready",
|
|
228
|
+
"production",
|
|
229
|
+
],
|
|
230
|
+
primary_domain="release",
|
|
231
|
+
auto_chain=False, # Always require approval
|
|
232
|
+
),
|
|
233
|
+
"research": WizardInfo(
|
|
234
|
+
name="research",
|
|
235
|
+
description="Research and synthesize information from multiple sources",
|
|
236
|
+
keywords=[
|
|
237
|
+
"research",
|
|
238
|
+
"investigate",
|
|
239
|
+
"explore",
|
|
240
|
+
"analyze",
|
|
241
|
+
"study",
|
|
242
|
+
"understand",
|
|
243
|
+
"learn",
|
|
244
|
+
"compare",
|
|
245
|
+
],
|
|
246
|
+
primary_domain="research",
|
|
247
|
+
auto_chain=False,
|
|
248
|
+
),
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
class WizardRegistry:
|
|
253
|
+
"""Registry for managing available wizards.
|
|
254
|
+
|
|
255
|
+
Usage:
|
|
256
|
+
registry = WizardRegistry()
|
|
257
|
+
info = registry.get("security-audit")
|
|
258
|
+
all_wizards = registry.list_all()
|
|
259
|
+
"""
|
|
260
|
+
|
|
261
|
+
def __init__(self):
|
|
262
|
+
"""Initialize with default wizards."""
|
|
263
|
+
self._wizards: dict[str, WizardInfo] = dict(WIZARD_REGISTRY)
|
|
264
|
+
|
|
265
|
+
def register(self, info: WizardInfo) -> None:
|
|
266
|
+
"""Register a new wizard."""
|
|
267
|
+
self._wizards[info.name] = info
|
|
268
|
+
|
|
269
|
+
def get(self, name: str) -> WizardInfo | None:
|
|
270
|
+
"""Get wizard info by name."""
|
|
271
|
+
return self._wizards.get(name)
|
|
272
|
+
|
|
273
|
+
def list_all(self) -> list[WizardInfo]:
|
|
274
|
+
"""List all registered wizards."""
|
|
275
|
+
return list(self._wizards.values())
|
|
276
|
+
|
|
277
|
+
def find_by_domain(self, domain: str) -> list[WizardInfo]:
|
|
278
|
+
"""Find wizards by primary domain."""
|
|
279
|
+
return [w for w in self._wizards.values() if w.primary_domain == domain]
|
|
280
|
+
|
|
281
|
+
def find_by_keyword(self, keyword: str) -> list[WizardInfo]:
|
|
282
|
+
"""Find wizards that handle a keyword."""
|
|
283
|
+
keyword = keyword.lower()
|
|
284
|
+
return [
|
|
285
|
+
w for w in self._wizards.values() if any(keyword in kw.lower() for kw in w.keywords)
|
|
286
|
+
]
|
|
287
|
+
|
|
288
|
+
def get_descriptions_for_classification(self) -> dict[str, str]:
|
|
289
|
+
"""Get wizard name to description mapping for LLM classification."""
|
|
290
|
+
return {
|
|
291
|
+
name: f"{info.description} (domain: {info.primary_domain})"
|
|
292
|
+
for name, info in self._wizards.items()
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
def get_chain_triggers(self, wizard_name: str) -> list[dict[str, Any]]:
|
|
296
|
+
"""Get auto-chain triggers for a wizard."""
|
|
297
|
+
info = self._wizards.get(wizard_name)
|
|
298
|
+
if info and info.auto_chain:
|
|
299
|
+
return info.chain_triggers
|
|
300
|
+
return []
|
|
301
|
+
|
|
302
|
+
def unregister(self, name: str) -> bool:
|
|
303
|
+
"""Remove a wizard from the registry."""
|
|
304
|
+
if name in self._wizards:
|
|
305
|
+
del self._wizards[name]
|
|
306
|
+
return True
|
|
307
|
+
return False
|
empathy_os/templates.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Template Starters for Empathy Framework
|
|
1
|
+
"""Template Starters for Empathy Framework
|
|
3
2
|
|
|
4
3
|
Scaffold new projects with Empathy pre-configured for different use cases.
|
|
5
4
|
|
|
@@ -14,9 +13,10 @@ Licensed under Fair Source License 0.9
|
|
|
14
13
|
"""
|
|
15
14
|
|
|
16
15
|
from pathlib import Path
|
|
16
|
+
from typing import Any
|
|
17
17
|
|
|
18
18
|
# Template definitions
|
|
19
|
-
TEMPLATES = {
|
|
19
|
+
TEMPLATES: dict[str, dict[str, Any]] = {
|
|
20
20
|
"minimal": {
|
|
21
21
|
"name": "Minimal",
|
|
22
22
|
"description": "Just the Empathy config files - add to existing project",
|
|
@@ -618,10 +618,12 @@ def list_templates() -> list:
|
|
|
618
618
|
|
|
619
619
|
|
|
620
620
|
def scaffold_project(
|
|
621
|
-
template_name: str,
|
|
621
|
+
template_name: str,
|
|
622
|
+
project_name: str,
|
|
623
|
+
target_dir: str | None = None,
|
|
624
|
+
force: bool = False,
|
|
622
625
|
) -> dict:
|
|
623
|
-
"""
|
|
624
|
-
Create a new project from a template.
|
|
626
|
+
"""Create a new project from a template.
|
|
625
627
|
|
|
626
628
|
Args:
|
|
627
629
|
template_name: Template ID (minimal, python-cli, python-fastapi, python-agent)
|
|
@@ -631,6 +633,7 @@ def scaffold_project(
|
|
|
631
633
|
|
|
632
634
|
Returns:
|
|
633
635
|
Dict with created files and status
|
|
636
|
+
|
|
634
637
|
"""
|
|
635
638
|
if template_name not in TEMPLATES:
|
|
636
639
|
return {
|
|
@@ -647,7 +650,7 @@ def scaffold_project(
|
|
|
647
650
|
if any(target.iterdir()):
|
|
648
651
|
return {
|
|
649
652
|
"success": False,
|
|
650
|
-
"error": f"Directory '{target}'
|
|
653
|
+
"error": f"Directory '{target}' exists and is not empty. Use --force to overwrite.",
|
|
651
654
|
}
|
|
652
655
|
|
|
653
656
|
# Create directory
|
|
@@ -660,7 +663,10 @@ def scaffold_project(
|
|
|
660
663
|
|
|
661
664
|
# Create files
|
|
662
665
|
created_files = []
|
|
663
|
-
|
|
666
|
+
files = template["files"]
|
|
667
|
+
if not isinstance(files, dict):
|
|
668
|
+
return {"success": False, "error": "Invalid template structure"}
|
|
669
|
+
for file_path, content in files.items():
|
|
664
670
|
# Replace placeholders in path
|
|
665
671
|
actual_path = file_path.replace("{{project_name}}", project_name)
|
|
666
672
|
|
|
@@ -738,9 +744,8 @@ def cmd_new(args):
|
|
|
738
744
|
print(f" $ {step}")
|
|
739
745
|
print()
|
|
740
746
|
return 0
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
return 1
|
|
747
|
+
print(f"\n Error: {result['error']}")
|
|
748
|
+
if "available" in result:
|
|
749
|
+
print(f" Available templates: {', '.join(result['available'])}")
|
|
750
|
+
print()
|
|
751
|
+
return 1
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Trust Management Module
|
|
2
|
+
|
|
3
|
+
Cross-domain transfer of reliability patterns to human-AI trust management.
|
|
4
|
+
Implements Level 5 (Systems Thinking) capability.
|
|
5
|
+
|
|
6
|
+
Pattern Source: Circuit Breaker (reliability/circuit_breaker.py)
|
|
7
|
+
Transfer: Protect user trust like protecting system stability
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from .circuit_breaker import (
|
|
11
|
+
TrustCircuitBreaker,
|
|
12
|
+
TrustConfig,
|
|
13
|
+
TrustDamageEvent,
|
|
14
|
+
TrustDamageType,
|
|
15
|
+
TrustRecoveryEvent,
|
|
16
|
+
TrustState,
|
|
17
|
+
create_trust_breaker,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"TrustCircuitBreaker",
|
|
22
|
+
"TrustConfig",
|
|
23
|
+
"TrustDamageEvent",
|
|
24
|
+
"TrustDamageType",
|
|
25
|
+
"TrustRecoveryEvent",
|
|
26
|
+
"TrustState",
|
|
27
|
+
"create_trust_breaker",
|
|
28
|
+
]
|