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.
Files changed (329) hide show
  1. coach_wizards/__init__.py +13 -12
  2. coach_wizards/accessibility_wizard.py +12 -12
  3. coach_wizards/api_wizard.py +12 -12
  4. coach_wizards/base_wizard.py +26 -20
  5. coach_wizards/cicd_wizard.py +15 -13
  6. coach_wizards/code_reviewer_README.md +60 -0
  7. coach_wizards/code_reviewer_wizard.py +180 -0
  8. coach_wizards/compliance_wizard.py +12 -12
  9. coach_wizards/database_wizard.py +12 -12
  10. coach_wizards/debugging_wizard.py +12 -12
  11. coach_wizards/documentation_wizard.py +12 -12
  12. coach_wizards/generate_wizards.py +1 -2
  13. coach_wizards/localization_wizard.py +101 -19
  14. coach_wizards/migration_wizard.py +12 -12
  15. coach_wizards/monitoring_wizard.py +12 -12
  16. coach_wizards/observability_wizard.py +12 -12
  17. coach_wizards/performance_wizard.py +12 -12
  18. coach_wizards/prompt_engineering_wizard.py +661 -0
  19. coach_wizards/refactoring_wizard.py +12 -12
  20. coach_wizards/scaling_wizard.py +12 -12
  21. coach_wizards/security_wizard.py +12 -12
  22. coach_wizards/testing_wizard.py +12 -12
  23. empathy_framework-3.8.2.dist-info/METADATA +1176 -0
  24. empathy_framework-3.8.2.dist-info/RECORD +333 -0
  25. empathy_framework-3.8.2.dist-info/entry_points.txt +22 -0
  26. {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/top_level.txt +5 -1
  27. empathy_healthcare_plugin/__init__.py +1 -2
  28. empathy_healthcare_plugin/monitors/__init__.py +9 -0
  29. empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
  30. empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
  31. empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
  32. empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
  33. empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
  34. empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
  35. empathy_llm_toolkit/__init__.py +7 -7
  36. empathy_llm_toolkit/agent_factory/__init__.py +53 -0
  37. empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
  38. empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
  39. empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
  40. empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
  41. empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
  42. empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
  43. empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
  44. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
  45. empathy_llm_toolkit/agent_factory/base.py +305 -0
  46. empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
  47. empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
  48. empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
  49. empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
  50. empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
  51. empathy_llm_toolkit/agent_factory/decorators.py +286 -0
  52. empathy_llm_toolkit/agent_factory/factory.py +558 -0
  53. empathy_llm_toolkit/agent_factory/framework.py +192 -0
  54. empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
  55. empathy_llm_toolkit/agent_factory/resilient.py +320 -0
  56. empathy_llm_toolkit/claude_memory.py +14 -15
  57. empathy_llm_toolkit/cli/__init__.py +8 -0
  58. empathy_llm_toolkit/cli/sync_claude.py +487 -0
  59. empathy_llm_toolkit/code_health.py +186 -28
  60. empathy_llm_toolkit/config/__init__.py +29 -0
  61. empathy_llm_toolkit/config/unified.py +295 -0
  62. empathy_llm_toolkit/contextual_patterns.py +11 -12
  63. empathy_llm_toolkit/core.py +168 -53
  64. empathy_llm_toolkit/git_pattern_extractor.py +17 -13
  65. empathy_llm_toolkit/levels.py +6 -13
  66. empathy_llm_toolkit/pattern_confidence.py +14 -18
  67. empathy_llm_toolkit/pattern_resolver.py +10 -12
  68. empathy_llm_toolkit/pattern_summary.py +16 -14
  69. empathy_llm_toolkit/providers.py +194 -28
  70. empathy_llm_toolkit/routing/__init__.py +32 -0
  71. empathy_llm_toolkit/routing/model_router.py +362 -0
  72. empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
  73. empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
  74. empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
  75. empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
  76. empathy_llm_toolkit/security/README.md +262 -0
  77. empathy_llm_toolkit/security/__init__.py +62 -0
  78. empathy_llm_toolkit/security/audit_logger.py +929 -0
  79. empathy_llm_toolkit/security/audit_logger_example.py +152 -0
  80. empathy_llm_toolkit/security/pii_scrubber.py +640 -0
  81. empathy_llm_toolkit/security/secrets_detector.py +678 -0
  82. empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
  83. empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
  84. empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
  85. empathy_llm_toolkit/session_status.py +20 -22
  86. empathy_llm_toolkit/state.py +28 -21
  87. empathy_llm_toolkit/wizards/__init__.py +38 -0
  88. empathy_llm_toolkit/wizards/base_wizard.py +364 -0
  89. empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
  90. empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
  91. empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
  92. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
  93. empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
  94. empathy_os/__init__.py +125 -84
  95. empathy_os/adaptive/__init__.py +13 -0
  96. empathy_os/adaptive/task_complexity.py +127 -0
  97. empathy_os/{monitoring.py → agent_monitoring.py} +28 -28
  98. empathy_os/cache/__init__.py +117 -0
  99. empathy_os/cache/base.py +166 -0
  100. empathy_os/cache/dependency_manager.py +253 -0
  101. empathy_os/cache/hash_only.py +248 -0
  102. empathy_os/cache/hybrid.py +390 -0
  103. empathy_os/cache/storage.py +282 -0
  104. empathy_os/cli.py +1516 -70
  105. empathy_os/cli_unified.py +597 -0
  106. empathy_os/config/__init__.py +63 -0
  107. empathy_os/config/xml_config.py +239 -0
  108. empathy_os/config.py +95 -37
  109. empathy_os/coordination.py +72 -68
  110. empathy_os/core.py +94 -107
  111. empathy_os/cost_tracker.py +74 -55
  112. empathy_os/dashboard/__init__.py +15 -0
  113. empathy_os/dashboard/server.py +743 -0
  114. empathy_os/discovery.py +17 -14
  115. empathy_os/emergence.py +21 -22
  116. empathy_os/exceptions.py +18 -30
  117. empathy_os/feedback_loops.py +30 -33
  118. empathy_os/levels.py +32 -35
  119. empathy_os/leverage_points.py +31 -32
  120. empathy_os/logging_config.py +19 -16
  121. empathy_os/memory/__init__.py +195 -0
  122. empathy_os/memory/claude_memory.py +466 -0
  123. empathy_os/memory/config.py +224 -0
  124. empathy_os/memory/control_panel.py +1298 -0
  125. empathy_os/memory/edges.py +179 -0
  126. empathy_os/memory/graph.py +567 -0
  127. empathy_os/memory/long_term.py +1194 -0
  128. empathy_os/memory/nodes.py +179 -0
  129. empathy_os/memory/redis_bootstrap.py +540 -0
  130. empathy_os/memory/security/__init__.py +31 -0
  131. empathy_os/memory/security/audit_logger.py +930 -0
  132. empathy_os/memory/security/pii_scrubber.py +640 -0
  133. empathy_os/memory/security/secrets_detector.py +678 -0
  134. empathy_os/memory/short_term.py +2119 -0
  135. empathy_os/memory/storage/__init__.py +15 -0
  136. empathy_os/memory/summary_index.py +583 -0
  137. empathy_os/memory/unified.py +619 -0
  138. empathy_os/metrics/__init__.py +12 -0
  139. empathy_os/metrics/prompt_metrics.py +190 -0
  140. empathy_os/models/__init__.py +136 -0
  141. empathy_os/models/__main__.py +13 -0
  142. empathy_os/models/cli.py +655 -0
  143. empathy_os/models/empathy_executor.py +354 -0
  144. empathy_os/models/executor.py +252 -0
  145. empathy_os/models/fallback.py +671 -0
  146. empathy_os/models/provider_config.py +563 -0
  147. empathy_os/models/registry.py +382 -0
  148. empathy_os/models/tasks.py +302 -0
  149. empathy_os/models/telemetry.py +548 -0
  150. empathy_os/models/token_estimator.py +378 -0
  151. empathy_os/models/validation.py +274 -0
  152. empathy_os/monitoring/__init__.py +52 -0
  153. empathy_os/monitoring/alerts.py +23 -0
  154. empathy_os/monitoring/alerts_cli.py +268 -0
  155. empathy_os/monitoring/multi_backend.py +271 -0
  156. empathy_os/monitoring/otel_backend.py +363 -0
  157. empathy_os/optimization/__init__.py +19 -0
  158. empathy_os/optimization/context_optimizer.py +272 -0
  159. empathy_os/pattern_library.py +30 -29
  160. empathy_os/persistence.py +35 -37
  161. empathy_os/platform_utils.py +261 -0
  162. empathy_os/plugins/__init__.py +28 -0
  163. empathy_os/plugins/base.py +361 -0
  164. empathy_os/plugins/registry.py +268 -0
  165. empathy_os/project_index/__init__.py +30 -0
  166. empathy_os/project_index/cli.py +335 -0
  167. empathy_os/project_index/crew_integration.py +430 -0
  168. empathy_os/project_index/index.py +425 -0
  169. empathy_os/project_index/models.py +501 -0
  170. empathy_os/project_index/reports.py +473 -0
  171. empathy_os/project_index/scanner.py +538 -0
  172. empathy_os/prompts/__init__.py +61 -0
  173. empathy_os/prompts/config.py +77 -0
  174. empathy_os/prompts/context.py +177 -0
  175. empathy_os/prompts/parser.py +285 -0
  176. empathy_os/prompts/registry.py +313 -0
  177. empathy_os/prompts/templates.py +208 -0
  178. empathy_os/redis_config.py +144 -58
  179. empathy_os/redis_memory.py +79 -77
  180. empathy_os/resilience/__init__.py +56 -0
  181. empathy_os/resilience/circuit_breaker.py +256 -0
  182. empathy_os/resilience/fallback.py +179 -0
  183. empathy_os/resilience/health.py +300 -0
  184. empathy_os/resilience/retry.py +209 -0
  185. empathy_os/resilience/timeout.py +135 -0
  186. empathy_os/routing/__init__.py +43 -0
  187. empathy_os/routing/chain_executor.py +433 -0
  188. empathy_os/routing/classifier.py +217 -0
  189. empathy_os/routing/smart_router.py +234 -0
  190. empathy_os/routing/wizard_registry.py +307 -0
  191. empathy_os/templates.py +19 -14
  192. empathy_os/trust/__init__.py +28 -0
  193. empathy_os/trust/circuit_breaker.py +579 -0
  194. empathy_os/trust_building.py +67 -58
  195. empathy_os/validation/__init__.py +19 -0
  196. empathy_os/validation/xml_validator.py +281 -0
  197. empathy_os/wizard_factory_cli.py +170 -0
  198. empathy_os/{workflows.py → workflow_commands.py} +131 -37
  199. empathy_os/workflows/__init__.py +360 -0
  200. empathy_os/workflows/base.py +1660 -0
  201. empathy_os/workflows/bug_predict.py +962 -0
  202. empathy_os/workflows/code_review.py +960 -0
  203. empathy_os/workflows/code_review_adapters.py +310 -0
  204. empathy_os/workflows/code_review_pipeline.py +720 -0
  205. empathy_os/workflows/config.py +600 -0
  206. empathy_os/workflows/dependency_check.py +648 -0
  207. empathy_os/workflows/document_gen.py +1069 -0
  208. empathy_os/workflows/documentation_orchestrator.py +1205 -0
  209. empathy_os/workflows/health_check.py +679 -0
  210. empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
  211. empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
  212. empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
  213. empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
  214. empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
  215. empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
  216. empathy_os/workflows/manage_documentation.py +804 -0
  217. empathy_os/workflows/new_sample_workflow1.py +146 -0
  218. empathy_os/workflows/new_sample_workflow1_README.md +150 -0
  219. empathy_os/workflows/perf_audit.py +687 -0
  220. empathy_os/workflows/pr_review.py +748 -0
  221. empathy_os/workflows/progress.py +445 -0
  222. empathy_os/workflows/progress_server.py +322 -0
  223. empathy_os/workflows/refactor_plan.py +693 -0
  224. empathy_os/workflows/release_prep.py +808 -0
  225. empathy_os/workflows/research_synthesis.py +404 -0
  226. empathy_os/workflows/secure_release.py +585 -0
  227. empathy_os/workflows/security_adapters.py +297 -0
  228. empathy_os/workflows/security_audit.py +1046 -0
  229. empathy_os/workflows/step_config.py +234 -0
  230. empathy_os/workflows/test5.py +125 -0
  231. empathy_os/workflows/test5_README.md +158 -0
  232. empathy_os/workflows/test_gen.py +1855 -0
  233. empathy_os/workflows/test_lifecycle.py +526 -0
  234. empathy_os/workflows/test_maintenance.py +626 -0
  235. empathy_os/workflows/test_maintenance_cli.py +590 -0
  236. empathy_os/workflows/test_maintenance_crew.py +821 -0
  237. empathy_os/workflows/xml_enhanced_crew.py +285 -0
  238. empathy_software_plugin/__init__.py +1 -2
  239. empathy_software_plugin/cli/__init__.py +120 -0
  240. empathy_software_plugin/cli/inspect.py +362 -0
  241. empathy_software_plugin/cli.py +49 -27
  242. empathy_software_plugin/plugin.py +4 -8
  243. empathy_software_plugin/wizards/__init__.py +42 -0
  244. empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
  245. empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
  246. empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
  247. empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
  248. empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
  249. empathy_software_plugin/wizards/base_wizard.py +288 -0
  250. empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
  251. empathy_software_plugin/wizards/code_review_wizard.py +606 -0
  252. empathy_software_plugin/wizards/debugging/__init__.py +50 -0
  253. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
  254. empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
  255. empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
  256. empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
  257. empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
  258. empathy_software_plugin/wizards/debugging/verification.py +369 -0
  259. empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
  260. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
  261. empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
  262. empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
  263. empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
  264. empathy_software_plugin/wizards/performance/__init__.py +9 -0
  265. empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
  266. empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
  267. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
  268. empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
  269. empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
  270. empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
  271. empathy_software_plugin/wizards/security/__init__.py +32 -0
  272. empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
  273. empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
  274. empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
  275. empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
  276. empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
  277. empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
  278. empathy_software_plugin/wizards/testing/__init__.py +27 -0
  279. empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
  280. empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
  281. empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
  282. empathy_software_plugin/wizards/testing_wizard.py +274 -0
  283. hot_reload/README.md +473 -0
  284. hot_reload/__init__.py +62 -0
  285. hot_reload/config.py +84 -0
  286. hot_reload/integration.py +228 -0
  287. hot_reload/reloader.py +298 -0
  288. hot_reload/watcher.py +179 -0
  289. hot_reload/websocket.py +176 -0
  290. scaffolding/README.md +589 -0
  291. scaffolding/__init__.py +35 -0
  292. scaffolding/__main__.py +14 -0
  293. scaffolding/cli.py +240 -0
  294. test_generator/__init__.py +38 -0
  295. test_generator/__main__.py +14 -0
  296. test_generator/cli.py +226 -0
  297. test_generator/generator.py +325 -0
  298. test_generator/risk_analyzer.py +216 -0
  299. workflow_patterns/__init__.py +33 -0
  300. workflow_patterns/behavior.py +249 -0
  301. workflow_patterns/core.py +76 -0
  302. workflow_patterns/output.py +99 -0
  303. workflow_patterns/registry.py +255 -0
  304. workflow_patterns/structural.py +288 -0
  305. workflow_scaffolding/__init__.py +11 -0
  306. workflow_scaffolding/__main__.py +12 -0
  307. workflow_scaffolding/cli.py +206 -0
  308. workflow_scaffolding/generator.py +265 -0
  309. agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
  310. agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
  311. agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
  312. agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
  313. agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
  314. agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
  315. agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
  316. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
  317. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
  318. agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
  319. agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
  320. agents/compliance_anticipation_agent.py +0 -1427
  321. agents/epic_integration_wizard.py +0 -541
  322. agents/trust_building_behaviors.py +0 -891
  323. empathy_framework-2.4.0.dist-info/METADATA +0 -485
  324. empathy_framework-2.4.0.dist-info/RECORD +0 -102
  325. empathy_framework-2.4.0.dist-info/entry_points.txt +0 -6
  326. empathy_llm_toolkit/htmlcov/status.json +0 -1
  327. empathy_llm_toolkit/security/htmlcov/status.json +0 -1
  328. {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
  329. {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,4 @@
1
- """
2
- Empathy LLM - Core Wrapper
1
+ """Empathy LLM - Core Wrapper
3
2
 
4
3
  Main class that wraps any LLM provider with Empathy Framework levels.
5
4
 
@@ -7,6 +6,7 @@ Copyright 2025 Smart AI Memory, LLC
7
6
  Licensed under Fair Source 0.9
8
7
  """
9
8
 
9
+ import asyncio
10
10
  import logging
11
11
  import time
12
12
  from typing import Any
@@ -22,16 +22,21 @@ from empathy_os.memory import (
22
22
  )
23
23
 
24
24
  from .levels import EmpathyLevel
25
- from .providers import AnthropicProvider, BaseLLMProvider, LocalProvider, OpenAIProvider
25
+ from .providers import (
26
+ AnthropicProvider,
27
+ BaseLLMProvider,
28
+ GeminiProvider,
29
+ LocalProvider,
30
+ OpenAIProvider,
31
+ )
26
32
  from .routing import ModelRouter
27
- from .state import CollaborationState, UserPattern
33
+ from .state import CollaborationState, PatternType, UserPattern
28
34
 
29
35
  logger = logging.getLogger(__name__)
30
36
 
31
37
 
32
38
  class EmpathyLLM:
33
- """
34
- Wraps any LLM provider with Empathy Framework levels.
39
+ """Wraps any LLM provider with Empathy Framework levels.
35
40
 
36
41
  Automatically progresses from Level 1 (reactive) to Level 4 (anticipatory)
37
42
  based on user collaboration state.
@@ -85,6 +90,7 @@ class EmpathyLLM:
85
90
  ... user_input="Design the architecture",
86
91
  ... task_type="architectural_decision"
87
92
  ... )
93
+
88
94
  """
89
95
 
90
96
  def __init__(
@@ -101,8 +107,7 @@ class EmpathyLLM:
101
107
  enable_model_routing: bool = False,
102
108
  **kwargs,
103
109
  ):
104
- """
105
- Initialize EmpathyLLM.
110
+ """Initialize EmpathyLLM.
106
111
 
107
112
  Args:
108
113
  provider: "anthropic", "openai", or "local"
@@ -126,6 +131,7 @@ class EmpathyLLM:
126
131
  - CAPABLE (Sonnet): code generation, bug fixes, security review
127
132
  - PREMIUM (Opus): coordination, synthesis, architectural decisions
128
133
  **kwargs: Provider-specific options
134
+
129
135
  """
130
136
  self.target_level = target_level
131
137
  self.pattern_library = pattern_library or {}
@@ -157,7 +163,7 @@ class EmpathyLLM:
157
163
  self._cached_memory = self.claude_memory_loader.load_all_memory(project_root)
158
164
  logger.info(
159
165
  f"EmpathyLLM initialized with Claude memory: "
160
- f"{len(self._cached_memory)} chars loaded"
166
+ f"{len(self._cached_memory)} chars loaded",
161
167
  )
162
168
 
163
169
  # Initialize Phase 3 security controls (v1.8.0+)
@@ -173,7 +179,7 @@ class EmpathyLLM:
173
179
  logger.info(
174
180
  f"EmpathyLLM initialized: provider={provider}, target_level={target_level}, "
175
181
  f"security={'enabled' if enable_security else 'disabled'}, "
176
- f"model_routing={'enabled' if enable_model_routing else 'disabled'}"
182
+ f"model_routing={'enabled' if enable_model_routing else 'disabled'}",
177
183
  )
178
184
 
179
185
  def _initialize_security(self):
@@ -207,24 +213,30 @@ class EmpathyLLM:
207
213
  logger.info(f"Audit Logger initialized: {audit_log_dir}")
208
214
 
209
215
  def _create_provider(
210
- self, provider: str, api_key: str | None, model: str | None, **kwargs
216
+ self,
217
+ provider: str,
218
+ api_key: str | None,
219
+ model: str | None,
220
+ **kwargs,
211
221
  ) -> BaseLLMProvider:
212
222
  """Create appropriate provider instance"""
213
-
214
223
  if provider == "anthropic":
215
224
  return AnthropicProvider(
216
- api_key=api_key, model=model or "claude-sonnet-4-5-20250929", **kwargs
225
+ api_key=api_key,
226
+ model=model or "claude-sonnet-4-5-20250929",
227
+ **kwargs,
217
228
  )
218
- elif provider == "openai":
229
+ if provider == "openai":
219
230
  return OpenAIProvider(api_key=api_key, model=model or "gpt-4-turbo-preview", **kwargs)
220
- elif provider == "local":
231
+ if provider in ("google", "gemini"):
232
+ return GeminiProvider(api_key=api_key, model=model or "gemini-1.5-pro", **kwargs)
233
+ if provider == "local":
221
234
  return LocalProvider(
222
235
  endpoint=kwargs.get("endpoint", "http://localhost:11434"),
223
236
  model=model or "llama2",
224
237
  **kwargs,
225
238
  )
226
- else:
227
- raise ValueError(f"Unknown provider: {provider}")
239
+ raise ValueError(f"Unknown provider: {provider}")
228
240
 
229
241
  def _get_or_create_state(self, user_id: str) -> CollaborationState:
230
242
  """Get or create collaboration state for user"""
@@ -233,8 +245,7 @@ class EmpathyLLM:
233
245
  return self.states[user_id]
234
246
 
235
247
  def _determine_level(self, state: CollaborationState) -> int:
236
- """
237
- Determine which empathy level to use.
248
+ """Determine which empathy level to use.
238
249
 
239
250
  Progresses automatically based on state, up to target_level.
240
251
  """
@@ -251,8 +262,7 @@ class EmpathyLLM:
251
262
  return level
252
263
 
253
264
  def _build_system_prompt(self, level: int) -> str:
254
- """
255
- Build system prompt including Claude memory (if enabled).
265
+ """Build system prompt including Claude memory (if enabled).
256
266
 
257
267
  Claude memory is prepended to the level-specific prompt,
258
268
  so instructions from CLAUDE.md files affect all interactions.
@@ -262,6 +272,7 @@ class EmpathyLLM:
262
272
 
263
273
  Returns:
264
274
  Complete system prompt
275
+
265
276
  """
266
277
  level_prompt = EmpathyLevel.get_system_prompt(level)
267
278
 
@@ -273,14 +284,12 @@ class EmpathyLLM:
273
284
  # Empathy Framework Instructions
274
285
  {level_prompt}
275
286
 
276
- Follow the instructions from CLAUDE.md files above, then apply the Empathy Framework guidelines below.
287
+ Follow the CLAUDE.md instructions above, then apply the Empathy Framework below.
277
288
  """
278
- else:
279
- return level_prompt
289
+ return level_prompt
280
290
 
281
291
  def reload_memory(self):
282
- """
283
- Reload Claude memory files.
292
+ """Reload Claude memory files.
284
293
 
285
294
  Useful if CLAUDE.md files have been updated during runtime.
286
295
  Call this to pick up changes without restarting.
@@ -301,8 +310,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
301
310
  force_level: int | None = None,
302
311
  task_type: str | None = None,
303
312
  ) -> dict[str, Any]:
304
- """
305
- Main interaction method.
313
+ """Main interaction method.
306
314
 
307
315
  Automatically selects appropriate empathy level and responds.
308
316
 
@@ -336,6 +344,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
336
344
 
337
345
  Raises:
338
346
  SecurityError: If secrets detected and block_on_secrets=True
347
+
339
348
  """
340
349
  start_time = time.time()
341
350
  state = self._get_or_create_state(user_id)
@@ -358,7 +367,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
358
367
  "routed_tier": tier.value,
359
368
  }
360
369
  logger.info(
361
- f"Model routing: task={effective_task} -> model={routed_model} (tier={tier.value})"
370
+ f"Model routing: task={effective_task} -> model={routed_model} (tier={tier.value})",
362
371
  )
363
372
 
364
373
  # Initialize security tracking
@@ -374,7 +383,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
374
383
  security_metadata["pii_scrubbed"] = len(pii_detections) > 0
375
384
  if pii_detections:
376
385
  logger.info(
377
- f"PII detected for user {user_id}: {len(pii_detections)} items scrubbed"
386
+ f"PII detected for user {user_id}: {len(pii_detections)} items scrubbed",
378
387
  )
379
388
 
380
389
  # Phase 3: Security Pipeline (Step 2 - Secrets Detection)
@@ -386,7 +395,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
386
395
  block_on_secrets = self.security_config.get("block_on_secrets", True)
387
396
  logger.warning(
388
397
  f"Secrets detected for user {user_id}: {len(secrets_detections)} secrets, "
389
- f"blocking={block_on_secrets}"
398
+ f"blocking={block_on_secrets}",
390
399
  )
391
400
 
392
401
  # Log security violation
@@ -406,7 +415,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
406
415
  if block_on_secrets:
407
416
  raise SecurityError(
408
417
  f"Request blocked: {len(secrets_detections)} secret(s) detected in input. "
409
- f"Please remove sensitive credentials before submitting."
418
+ f"Please remove sensitive credentials before submitting.",
410
419
  )
411
420
 
412
421
  # Determine level to use
@@ -486,8 +495,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
486
495
  context: dict[str, Any],
487
496
  model_override: str | None = None,
488
497
  ) -> dict[str, Any]:
489
- """
490
- Level 1: Reactive - Simple Q&A
498
+ """Level 1: Reactive - Simple Q&A
491
499
 
492
500
  No memory, no patterns, just respond to question.
493
501
  """
@@ -515,8 +523,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
515
523
  context: dict[str, Any],
516
524
  model_override: str | None = None,
517
525
  ) -> dict[str, Any]:
518
- """
519
- Level 2: Guided - Ask clarifying questions
526
+ """Level 2: Guided - Ask clarifying questions
520
527
 
521
528
  Uses conversation history for context.
522
529
  """
@@ -552,8 +559,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
552
559
  context: dict[str, Any],
553
560
  model_override: str | None = None,
554
561
  ) -> dict[str, Any]:
555
- """
556
- Level 3: Proactive - Act on detected patterns
562
+ """Level 3: Proactive - Act on detected patterns
557
563
 
558
564
  Checks for matching patterns and acts proactively.
559
565
  """
@@ -565,9 +571,9 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
565
571
  prompt = f"""
566
572
  User said: "{user_input}"
567
573
 
568
- I've detected a pattern: When you {matching_pattern.trigger}, you typically {matching_pattern.action}.
574
+ Pattern detected: When you {matching_pattern.trigger}, you typically {matching_pattern.action}.
569
575
 
570
- Based on this pattern (confidence: {matching_pattern.confidence:.0%}), I'm proactively {matching_pattern.action}.
576
+ Confidence: {matching_pattern.confidence:.0%}. Proactively {matching_pattern.action}.
571
577
 
572
578
  [Provide the expected result/action]
573
579
 
@@ -589,8 +595,8 @@ Was this helpful? If not, I can adjust my pattern detection.
589
595
  proactive = False
590
596
  pattern_info = None
591
597
 
592
- # TODO: Run pattern detection in background
593
- # await self._detect_patterns_async(state)
598
+ # Run pattern detection in background (non-blocking)
599
+ asyncio.create_task(self._detect_patterns_async(state, user_input))
594
600
 
595
601
  generate_kwargs: dict[str, Any] = {
596
602
  "messages": messages,
@@ -620,8 +626,7 @@ Was this helpful? If not, I can adjust my pattern detection.
620
626
  context: dict[str, Any],
621
627
  model_override: str | None = None,
622
628
  ) -> dict[str, Any]:
623
- """
624
- Level 4: Anticipatory - Predict future needs
629
+ """Level 4: Anticipatory - Predict future needs
625
630
 
626
631
  Analyzes trajectory and alerts to future bottlenecks.
627
632
  """
@@ -633,7 +638,7 @@ COLLABORATION CONTEXT:
633
638
  - Total interactions: {len(state.interactions)}
634
639
  - Trust level: {state.trust_level:.2f}
635
640
  - Detected patterns: {len(state.detected_patterns)}
636
- - Success rate: {state.successful_actions / (state.successful_actions + state.failed_actions) if (state.successful_actions + state.failed_actions) > 0 else 0:.0%}
641
+ - Success rate: {state.success_rate:.0%}
637
642
 
638
643
  TASK:
639
644
  1. Respond to immediate request
@@ -681,8 +686,7 @@ Use anticipatory format:
681
686
  context: dict[str, Any],
682
687
  model_override: str | None = None,
683
688
  ) -> dict[str, Any]:
684
- """
685
- Level 5: Systems - Cross-domain pattern learning
689
+ """Level 5: Systems - Cross-domain pattern learning
686
690
 
687
691
  Leverages shared pattern library across domains.
688
692
  """
@@ -728,14 +732,125 @@ TASK:
728
732
  },
729
733
  }
730
734
 
731
- def update_trust(self, user_id: str, outcome: str, magnitude: float = 1.0):
735
+ async def _detect_patterns_async(
736
+ self,
737
+ state: CollaborationState,
738
+ current_input: str,
739
+ ) -> None:
740
+ """Detect user behavior patterns in background.
741
+
742
+ Analyzes conversation history to identify:
743
+ - Sequential patterns: User always does X then Y
744
+ - Preference patterns: User prefers certain formats/styles
745
+ - Temporal patterns: User does X at specific times
746
+ - Conditional patterns: When Z happens, user does X
747
+
748
+ This runs asynchronously to avoid blocking the main response.
749
+ Detected patterns enable Level 3 proactive interactions.
732
750
  """
733
- Update trust level based on interaction outcome.
751
+ try:
752
+ from datetime import datetime
753
+
754
+ interactions = state.interactions
755
+ if len(interactions) < 3:
756
+ # Need at least 3 interactions to detect patterns
757
+ return
758
+
759
+ # Analyze recent interactions for sequential patterns
760
+ recent = interactions[-10:] # Last 10 interactions
761
+ user_messages = [i for i in recent if i.role == "user"]
762
+
763
+ if len(user_messages) < 2:
764
+ return
765
+
766
+ # Pattern 1: Sequential patterns (X followed by Y)
767
+ for i in range(len(user_messages) - 1):
768
+ current = user_messages[i].content.lower()
769
+ next_msg = user_messages[i + 1].content.lower()
770
+
771
+ # Detect common sequential patterns
772
+ sequential_triggers = [
773
+ ("review", "fix"), # Review then fix
774
+ ("debug", "test"), # Debug then test
775
+ ("implement", "test"), # Implement then test
776
+ ("refactor", "review"), # Refactor then review
777
+ ]
778
+
779
+ for trigger, action in sequential_triggers:
780
+ if trigger in current and action in next_msg:
781
+ pattern = UserPattern(
782
+ pattern_type=PatternType.SEQUENTIAL,
783
+ trigger=trigger,
784
+ action=f"Typically follows with {action}",
785
+ confidence=0.6 + (0.1 * min(i, 3)), # Increase with occurrences
786
+ occurrences=1,
787
+ last_seen=datetime.now(),
788
+ context={"detected_from": "sequential_analysis"},
789
+ )
790
+ state.add_pattern(pattern)
791
+
792
+ # Pattern 2: Preference patterns
793
+ preference_indicators = {
794
+ "concise": "brief, concise responses",
795
+ "detailed": "comprehensive, detailed responses",
796
+ "example": "responses with examples",
797
+ "step by step": "step-by-step explanations",
798
+ "code": "code-focused responses",
799
+ }
800
+
801
+ for indicator, preference in preference_indicators.items():
802
+ occurrences = sum(1 for m in user_messages if indicator in m.content.lower())
803
+ if occurrences >= 2:
804
+ pattern = UserPattern(
805
+ pattern_type=PatternType.PREFERENCE,
806
+ trigger=indicator,
807
+ action=f"User prefers {preference}",
808
+ confidence=min(0.9, 0.5 + (0.1 * occurrences)),
809
+ occurrences=occurrences,
810
+ last_seen=datetime.now(),
811
+ context={"preference_type": indicator},
812
+ )
813
+ state.add_pattern(pattern)
814
+
815
+ # Pattern 3: Conditional patterns (error -> debug)
816
+ conditional_triggers = [
817
+ ("error", "debug", "When errors occur, user asks for debugging"),
818
+ ("failed", "fix", "When tests fail, user asks for fixes"),
819
+ ("slow", "optimize", "When performance issues arise, user asks for optimization"),
820
+ ]
821
+
822
+ for condition, response_keyword, description in conditional_triggers:
823
+ for i, msg in enumerate(user_messages[:-1]):
824
+ if condition in msg.content.lower():
825
+ next_msg = user_messages[i + 1].content.lower()
826
+ if response_keyword in next_msg:
827
+ pattern = UserPattern(
828
+ pattern_type=PatternType.CONDITIONAL,
829
+ trigger=condition,
830
+ action=description,
831
+ confidence=0.7,
832
+ occurrences=1,
833
+ last_seen=datetime.now(),
834
+ context={"condition": condition, "response": response_keyword},
835
+ )
836
+ state.add_pattern(pattern)
837
+
838
+ logger.debug(
839
+ f"Pattern detection complete. Detected {len(state.detected_patterns)} patterns.",
840
+ )
841
+
842
+ except Exception as e:
843
+ # Pattern detection should never break the main flow
844
+ logger.warning(f"Pattern detection error (non-critical): {e}")
845
+
846
+ def update_trust(self, user_id: str, outcome: str, magnitude: float = 1.0):
847
+ """Update trust level based on interaction outcome.
734
848
 
735
849
  Args:
736
850
  user_id: User identifier
737
851
  outcome: "success" or "failure"
738
852
  magnitude: How much to adjust (0.0 to 1.0)
853
+
739
854
  """
740
855
  state = self._get_or_create_state(user_id)
741
856
  state.update_trust(outcome, magnitude)
@@ -743,12 +858,12 @@ TASK:
743
858
  logger.info(f"Trust updated for {user_id}: {outcome} -> {state.trust_level:.2f}")
744
859
 
745
860
  def add_pattern(self, user_id: str, pattern: UserPattern):
746
- """
747
- Manually add a detected pattern.
861
+ """Manually add a detected pattern.
748
862
 
749
863
  Args:
750
864
  user_id: User identifier
751
865
  pattern: UserPattern instance
866
+
752
867
  """
753
868
  state = self._get_or_create_state(user_id)
754
869
  state.add_pattern(pattern)
@@ -756,14 +871,14 @@ TASK:
756
871
  logger.info(f"Pattern added for {user_id}: {pattern.pattern_type.value}")
757
872
 
758
873
  def get_statistics(self, user_id: str) -> dict[str, Any]:
759
- """
760
- Get collaboration statistics for user.
874
+ """Get collaboration statistics for user.
761
875
 
762
876
  Args:
763
877
  user_id: User identifier
764
878
 
765
879
  Returns:
766
880
  Dictionary with stats
881
+
767
882
  """
768
883
  state = self._get_or_create_state(user_id)
769
884
  return state.get_statistics()
@@ -1,5 +1,4 @@
1
- """
2
- Git Pattern Extractor
1
+ """Git Pattern Extractor
3
2
 
4
3
  Automatically detects bug fixes from git commits and creates
5
4
  draft pattern entries for review.
@@ -32,8 +31,7 @@ logger = logging.getLogger(__name__)
32
31
 
33
32
 
34
33
  class GitPatternExtractor:
35
- """
36
- Extracts bug fix patterns from git commits.
34
+ """Extracts bug fix patterns from git commits.
37
35
 
38
36
  Analyzes commit messages and diffs to detect common
39
37
  fix patterns, then creates draft pattern files.
@@ -104,14 +102,14 @@ class GitPatternExtractor:
104
102
  }
105
103
 
106
104
  def extract_from_recent_commits(self, num_commits: int = 1) -> list[dict[str, Any]]:
107
- """
108
- Extract patterns from recent git commits.
105
+ """Extract patterns from recent git commits.
109
106
 
110
107
  Args:
111
108
  num_commits: Number of recent commits to analyze
112
109
 
113
110
  Returns:
114
111
  List of detected pattern dicts
112
+
115
113
  """
116
114
  patterns = []
117
115
 
@@ -138,11 +136,11 @@ class GitPatternExtractor:
138
136
  return patterns
139
137
 
140
138
  def extract_from_staged(self) -> list[dict[str, Any]]:
141
- """
142
- Extract patterns from currently staged changes.
139
+ """Extract patterns from currently staged changes.
143
140
 
144
141
  Returns:
145
142
  List of detected pattern dicts
143
+
146
144
  """
147
145
  diff = self._get_staged_diff()
148
146
  if not diff:
@@ -158,14 +156,14 @@ class GitPatternExtractor:
158
156
  return self._analyze_diff(diff, commit_info)
159
157
 
160
158
  def save_pattern(self, pattern: dict[str, Any]) -> Path | None:
161
- """
162
- Save a detected pattern as a draft for review.
159
+ """Save a detected pattern as a draft for review.
163
160
 
164
161
  Args:
165
162
  pattern: Pattern dict from extraction
166
163
 
167
164
  Returns:
168
165
  Path to saved file, or None if failed
166
+
169
167
  """
170
168
  self.debugging_dir.mkdir(parents=True, exist_ok=True)
171
169
 
@@ -175,7 +173,7 @@ class GitPatternExtractor:
175
173
  "date": datetime.now().isoformat(),
176
174
  "file_path": pattern.get("file", "unknown"),
177
175
  "error_type": pattern.get("type", "unknown"),
178
- "error_message": f"Auto-detected from commit: {pattern.get('commit_message', '')[:100]}",
176
+ "error_message": f"From commit: {pattern.get('commit_message', '')[:80]}",
179
177
  "root_cause": "", # To be filled by user
180
178
  "fix_applied": pattern.get("description", ""),
181
179
  "fix_code": pattern.get("code_sample", ""),
@@ -201,6 +199,7 @@ class GitPatternExtractor:
201
199
  try:
202
200
  result = subprocess.run(
203
201
  ["git", "log", "-1", "--format=%H%n%s%n%an%n%aI", ref],
202
+ check=False,
204
203
  capture_output=True,
205
204
  text=True,
206
205
  timeout=5,
@@ -226,6 +225,7 @@ class GitPatternExtractor:
226
225
  try:
227
226
  result = subprocess.run(
228
227
  ["git", "diff", ref1, ref2],
228
+ check=False,
229
229
  capture_output=True,
230
230
  text=True,
231
231
  timeout=10,
@@ -239,6 +239,7 @@ class GitPatternExtractor:
239
239
  try:
240
240
  result = subprocess.run(
241
241
  ["git", "diff", "--cached"],
242
+ check=False,
242
243
  capture_output=True,
243
244
  text=True,
244
245
  timeout=10,
@@ -252,6 +253,7 @@ class GitPatternExtractor:
252
253
  try:
253
254
  result = subprocess.run(
254
255
  ["git", "config", key],
256
+ check=False,
255
257
  capture_output=True,
256
258
  text=True,
257
259
  timeout=5,
@@ -286,7 +288,9 @@ class GitPatternExtractor:
286
288
  # Process previous file
287
289
  if current_file and added_lines:
288
290
  file_patterns = self._detect_fix_patterns(
289
- current_file, added_lines, commit_info
291
+ current_file,
292
+ added_lines,
293
+ commit_info,
290
294
  )
291
295
  patterns.extend(file_patterns)
292
296
 
@@ -334,7 +338,7 @@ class GitPatternExtractor:
334
338
  "matches_count": len(matches),
335
339
  "author": commit_info.get("author", "unknown"),
336
340
  "date": commit_info.get("date", datetime.now().isoformat()),
337
- }
341
+ },
338
342
  )
339
343
 
340
344
  return detected
@@ -1,5 +1,4 @@
1
- """
2
- Empathy Level Definitions
1
+ """Empathy Level Definitions
3
2
 
4
3
  Defines behavior for each of the 5 empathy levels.
5
4
 
@@ -11,8 +10,7 @@ from enum import IntEnum
11
10
 
12
11
 
13
12
  class EmpathyLevel(IntEnum):
14
- """
15
- The 5 levels of AI-human collaboration empathy.
13
+ """The 5 levels of AI-human collaboration empathy.
16
14
 
17
15
  Each level builds on previous levels.
18
16
  """
@@ -38,7 +36,6 @@ class EmpathyLevel(IntEnum):
38
36
  @classmethod
39
37
  def get_system_prompt(cls, level: int) -> str:
40
38
  """Get system prompt for operating at specific level"""
41
-
42
39
  base = """You are an AI assistant using the Empathy Framework for collaboration.
43
40
 
44
41
  Your responses should be:
@@ -117,8 +114,7 @@ Pattern contribution:
117
114
 
118
115
  @classmethod
119
116
  def get_temperature_recommendation(cls, level: int) -> float:
120
- """
121
- Get recommended temperature for each level.
117
+ """Get recommended temperature for each level.
122
118
 
123
119
  Higher levels benefit from lower temperature (more focused).
124
120
  """
@@ -133,8 +129,7 @@ Pattern contribution:
133
129
 
134
130
  @classmethod
135
131
  def get_required_context(cls, level: int) -> dict[str, bool]:
136
- """
137
- Get context requirements for each level.
132
+ """Get context requirements for each level.
138
133
 
139
134
  Returns dict of {context_type: required}
140
135
  """
@@ -175,8 +170,7 @@ Pattern contribution:
175
170
 
176
171
  @classmethod
177
172
  def get_max_tokens_recommendation(cls, level: int) -> int:
178
- """
179
- Get recommended max_tokens for each level.
173
+ """Get recommended max_tokens for each level.
180
174
 
181
175
  Higher levels often need longer responses.
182
176
  """
@@ -190,8 +184,7 @@ Pattern contribution:
190
184
 
191
185
  @classmethod
192
186
  def should_use_json_mode(cls, level: int) -> bool:
193
- """
194
- Determine if JSON mode is beneficial for level.
187
+ """Determine if JSON mode is beneficial for level.
195
188
 
196
189
  Levels 4-5 benefit from structured output.
197
190
  """