empathy-framework 4.6.6__py3-none-any.whl → 4.7.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.
Files changed (273) hide show
  1. empathy_framework-4.7.1.dist-info/METADATA +690 -0
  2. empathy_framework-4.7.1.dist-info/RECORD +379 -0
  3. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/top_level.txt +1 -2
  4. empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
  5. empathy_llm_toolkit/agent_factory/__init__.py +6 -6
  6. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
  7. empathy_llm_toolkit/agents_md/__init__.py +22 -0
  8. empathy_llm_toolkit/agents_md/loader.py +218 -0
  9. empathy_llm_toolkit/agents_md/parser.py +271 -0
  10. empathy_llm_toolkit/agents_md/registry.py +307 -0
  11. empathy_llm_toolkit/commands/__init__.py +51 -0
  12. empathy_llm_toolkit/commands/context.py +375 -0
  13. empathy_llm_toolkit/commands/loader.py +301 -0
  14. empathy_llm_toolkit/commands/models.py +231 -0
  15. empathy_llm_toolkit/commands/parser.py +371 -0
  16. empathy_llm_toolkit/commands/registry.py +429 -0
  17. empathy_llm_toolkit/config/__init__.py +8 -8
  18. empathy_llm_toolkit/config/unified.py +3 -7
  19. empathy_llm_toolkit/context/__init__.py +22 -0
  20. empathy_llm_toolkit/context/compaction.py +455 -0
  21. empathy_llm_toolkit/context/manager.py +434 -0
  22. empathy_llm_toolkit/hooks/__init__.py +24 -0
  23. empathy_llm_toolkit/hooks/config.py +306 -0
  24. empathy_llm_toolkit/hooks/executor.py +289 -0
  25. empathy_llm_toolkit/hooks/registry.py +302 -0
  26. empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
  27. empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
  28. empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
  29. empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
  30. empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
  31. empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
  32. empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
  33. empathy_llm_toolkit/learning/__init__.py +30 -0
  34. empathy_llm_toolkit/learning/evaluator.py +438 -0
  35. empathy_llm_toolkit/learning/extractor.py +514 -0
  36. empathy_llm_toolkit/learning/storage.py +560 -0
  37. empathy_llm_toolkit/providers.py +4 -11
  38. empathy_llm_toolkit/security/__init__.py +17 -17
  39. empathy_llm_toolkit/utils/tokens.py +2 -5
  40. empathy_os/__init__.py +202 -70
  41. empathy_os/cache_monitor.py +5 -3
  42. empathy_os/cli/__init__.py +11 -55
  43. empathy_os/cli/__main__.py +29 -15
  44. empathy_os/cli/commands/inspection.py +21 -12
  45. empathy_os/cli/commands/memory.py +4 -12
  46. empathy_os/cli/commands/profiling.py +198 -0
  47. empathy_os/cli/commands/utilities.py +27 -7
  48. empathy_os/cli.py +28 -57
  49. empathy_os/cli_unified.py +525 -1164
  50. empathy_os/cost_tracker.py +9 -3
  51. empathy_os/dashboard/server.py +200 -2
  52. empathy_os/hot_reload/__init__.py +7 -7
  53. empathy_os/hot_reload/config.py +6 -7
  54. empathy_os/hot_reload/integration.py +35 -35
  55. empathy_os/hot_reload/reloader.py +57 -57
  56. empathy_os/hot_reload/watcher.py +28 -28
  57. empathy_os/hot_reload/websocket.py +2 -2
  58. empathy_os/memory/__init__.py +11 -4
  59. empathy_os/memory/claude_memory.py +1 -1
  60. empathy_os/memory/cross_session.py +8 -12
  61. empathy_os/memory/edges.py +6 -6
  62. empathy_os/memory/file_session.py +770 -0
  63. empathy_os/memory/graph.py +30 -30
  64. empathy_os/memory/nodes.py +6 -6
  65. empathy_os/memory/short_term.py +15 -9
  66. empathy_os/memory/unified.py +606 -140
  67. empathy_os/meta_workflows/agent_creator.py +3 -9
  68. empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
  69. empathy_os/meta_workflows/form_engine.py +6 -18
  70. empathy_os/meta_workflows/intent_detector.py +64 -24
  71. empathy_os/meta_workflows/models.py +3 -1
  72. empathy_os/meta_workflows/pattern_learner.py +13 -31
  73. empathy_os/meta_workflows/plan_generator.py +55 -47
  74. empathy_os/meta_workflows/session_context.py +2 -3
  75. empathy_os/meta_workflows/workflow.py +20 -51
  76. empathy_os/models/cli.py +2 -2
  77. empathy_os/models/tasks.py +1 -2
  78. empathy_os/models/telemetry.py +4 -1
  79. empathy_os/models/token_estimator.py +3 -1
  80. empathy_os/monitoring/alerts.py +938 -9
  81. empathy_os/monitoring/alerts_cli.py +346 -183
  82. empathy_os/orchestration/execution_strategies.py +12 -29
  83. empathy_os/orchestration/pattern_learner.py +20 -26
  84. empathy_os/orchestration/real_tools.py +6 -15
  85. empathy_os/platform_utils.py +2 -1
  86. empathy_os/plugins/__init__.py +2 -2
  87. empathy_os/plugins/base.py +64 -64
  88. empathy_os/plugins/registry.py +32 -32
  89. empathy_os/project_index/index.py +49 -15
  90. empathy_os/project_index/models.py +1 -2
  91. empathy_os/project_index/reports.py +1 -1
  92. empathy_os/project_index/scanner.py +1 -0
  93. empathy_os/redis_memory.py +10 -7
  94. empathy_os/resilience/__init__.py +1 -1
  95. empathy_os/resilience/health.py +10 -10
  96. empathy_os/routing/__init__.py +7 -7
  97. empathy_os/routing/chain_executor.py +37 -37
  98. empathy_os/routing/classifier.py +36 -36
  99. empathy_os/routing/smart_router.py +40 -40
  100. empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
  101. empathy_os/scaffolding/__init__.py +8 -8
  102. empathy_os/scaffolding/__main__.py +1 -1
  103. empathy_os/scaffolding/cli.py +28 -28
  104. empathy_os/socratic/__init__.py +3 -19
  105. empathy_os/socratic/ab_testing.py +25 -36
  106. empathy_os/socratic/blueprint.py +38 -38
  107. empathy_os/socratic/cli.py +34 -20
  108. empathy_os/socratic/collaboration.py +30 -28
  109. empathy_os/socratic/domain_templates.py +9 -1
  110. empathy_os/socratic/embeddings.py +17 -13
  111. empathy_os/socratic/engine.py +135 -70
  112. empathy_os/socratic/explainer.py +70 -60
  113. empathy_os/socratic/feedback.py +24 -19
  114. empathy_os/socratic/forms.py +15 -10
  115. empathy_os/socratic/generator.py +51 -35
  116. empathy_os/socratic/llm_analyzer.py +25 -23
  117. empathy_os/socratic/mcp_server.py +99 -159
  118. empathy_os/socratic/session.py +19 -13
  119. empathy_os/socratic/storage.py +98 -67
  120. empathy_os/socratic/success.py +38 -27
  121. empathy_os/socratic/visual_editor.py +51 -39
  122. empathy_os/socratic/web_ui.py +99 -66
  123. empathy_os/telemetry/cli.py +3 -1
  124. empathy_os/telemetry/usage_tracker.py +1 -3
  125. empathy_os/test_generator/__init__.py +3 -3
  126. empathy_os/test_generator/cli.py +28 -28
  127. empathy_os/test_generator/generator.py +64 -66
  128. empathy_os/test_generator/risk_analyzer.py +11 -11
  129. empathy_os/vscode_bridge 2.py +173 -0
  130. empathy_os/vscode_bridge.py +173 -0
  131. empathy_os/workflows/__init__.py +212 -120
  132. empathy_os/workflows/batch_processing.py +8 -24
  133. empathy_os/workflows/bug_predict.py +1 -1
  134. empathy_os/workflows/code_review.py +20 -5
  135. empathy_os/workflows/code_review_pipeline.py +13 -8
  136. empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
  137. empathy_os/workflows/manage_documentation.py +1 -0
  138. empathy_os/workflows/orchestrated_health_check.py +6 -11
  139. empathy_os/workflows/orchestrated_release_prep.py +3 -3
  140. empathy_os/workflows/pr_review.py +18 -10
  141. empathy_os/workflows/progressive/README 2.md +454 -0
  142. empathy_os/workflows/progressive/__init__ 2.py +92 -0
  143. empathy_os/workflows/progressive/__init__.py +2 -12
  144. empathy_os/workflows/progressive/cli 2.py +242 -0
  145. empathy_os/workflows/progressive/cli.py +14 -37
  146. empathy_os/workflows/progressive/core 2.py +488 -0
  147. empathy_os/workflows/progressive/core.py +12 -12
  148. empathy_os/workflows/progressive/orchestrator 2.py +701 -0
  149. empathy_os/workflows/progressive/orchestrator.py +166 -144
  150. empathy_os/workflows/progressive/reports 2.py +528 -0
  151. empathy_os/workflows/progressive/reports.py +22 -31
  152. empathy_os/workflows/progressive/telemetry 2.py +280 -0
  153. empathy_os/workflows/progressive/telemetry.py +8 -14
  154. empathy_os/workflows/progressive/test_gen 2.py +514 -0
  155. empathy_os/workflows/progressive/test_gen.py +29 -48
  156. empathy_os/workflows/progressive/workflow 2.py +628 -0
  157. empathy_os/workflows/progressive/workflow.py +31 -70
  158. empathy_os/workflows/release_prep.py +21 -6
  159. empathy_os/workflows/release_prep_crew.py +1 -0
  160. empathy_os/workflows/secure_release.py +13 -6
  161. empathy_os/workflows/security_audit.py +8 -3
  162. empathy_os/workflows/test_coverage_boost_crew.py +3 -2
  163. empathy_os/workflows/test_maintenance_crew.py +1 -0
  164. empathy_os/workflows/test_runner.py +16 -12
  165. empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
  166. empathy_software_plugin/cli.py +0 -122
  167. patterns/README.md +119 -0
  168. patterns/__init__.py +95 -0
  169. patterns/behavior.py +298 -0
  170. patterns/code_review_memory.json +441 -0
  171. patterns/core.py +97 -0
  172. patterns/debugging.json +3763 -0
  173. patterns/empathy.py +268 -0
  174. patterns/health_check_memory.json +505 -0
  175. patterns/input.py +161 -0
  176. patterns/memory_graph.json +8 -0
  177. patterns/refactoring_memory.json +1113 -0
  178. patterns/registry.py +663 -0
  179. patterns/security_memory.json +8 -0
  180. patterns/structural.py +415 -0
  181. patterns/validation.py +194 -0
  182. coach_wizards/__init__.py +0 -45
  183. coach_wizards/accessibility_wizard.py +0 -91
  184. coach_wizards/api_wizard.py +0 -91
  185. coach_wizards/base_wizard.py +0 -209
  186. coach_wizards/cicd_wizard.py +0 -91
  187. coach_wizards/code_reviewer_README.md +0 -60
  188. coach_wizards/code_reviewer_wizard.py +0 -180
  189. coach_wizards/compliance_wizard.py +0 -91
  190. coach_wizards/database_wizard.py +0 -91
  191. coach_wizards/debugging_wizard.py +0 -91
  192. coach_wizards/documentation_wizard.py +0 -91
  193. coach_wizards/generate_wizards.py +0 -347
  194. coach_wizards/localization_wizard.py +0 -173
  195. coach_wizards/migration_wizard.py +0 -91
  196. coach_wizards/monitoring_wizard.py +0 -91
  197. coach_wizards/observability_wizard.py +0 -91
  198. coach_wizards/performance_wizard.py +0 -91
  199. coach_wizards/prompt_engineering_wizard.py +0 -661
  200. coach_wizards/refactoring_wizard.py +0 -91
  201. coach_wizards/scaling_wizard.py +0 -90
  202. coach_wizards/security_wizard.py +0 -92
  203. coach_wizards/testing_wizard.py +0 -91
  204. empathy_framework-4.6.6.dist-info/METADATA +0 -1597
  205. empathy_framework-4.6.6.dist-info/RECORD +0 -410
  206. empathy_llm_toolkit/wizards/__init__.py +0 -43
  207. empathy_llm_toolkit/wizards/base_wizard.py +0 -364
  208. empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
  209. empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
  210. empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
  211. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
  212. empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
  213. empathy_os/wizard_factory_cli.py +0 -170
  214. empathy_software_plugin/wizards/__init__.py +0 -42
  215. empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
  216. empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
  217. empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
  218. empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
  219. empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
  220. empathy_software_plugin/wizards/base_wizard.py +0 -288
  221. empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
  222. empathy_software_plugin/wizards/code_review_wizard.py +0 -604
  223. empathy_software_plugin/wizards/debugging/__init__.py +0 -50
  224. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
  225. empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
  226. empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
  227. empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
  228. empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
  229. empathy_software_plugin/wizards/debugging/verification.py +0 -369
  230. empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
  231. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
  232. empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
  233. empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
  234. empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
  235. empathy_software_plugin/wizards/performance/__init__.py +0 -9
  236. empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
  237. empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
  238. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
  239. empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
  240. empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
  241. empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
  242. empathy_software_plugin/wizards/security/__init__.py +0 -32
  243. empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
  244. empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
  245. empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
  246. empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
  247. empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
  248. empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
  249. empathy_software_plugin/wizards/testing/__init__.py +0 -27
  250. empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
  251. empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
  252. empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
  253. empathy_software_plugin/wizards/testing_wizard.py +0 -274
  254. wizards/__init__.py +0 -82
  255. wizards/admission_assessment_wizard.py +0 -644
  256. wizards/care_plan.py +0 -321
  257. wizards/clinical_assessment.py +0 -769
  258. wizards/discharge_planning.py +0 -77
  259. wizards/discharge_summary_wizard.py +0 -468
  260. wizards/dosage_calculation.py +0 -497
  261. wizards/incident_report_wizard.py +0 -454
  262. wizards/medication_reconciliation.py +0 -85
  263. wizards/nursing_assessment.py +0 -171
  264. wizards/patient_education.py +0 -654
  265. wizards/quality_improvement.py +0 -705
  266. wizards/sbar_report.py +0 -324
  267. wizards/sbar_wizard.py +0 -608
  268. wizards/shift_handoff_wizard.py +0 -535
  269. wizards/soap_note_wizard.py +0 -679
  270. wizards/treatment_plan.py +0 -15
  271. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/WHEEL +0 -0
  272. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/entry_points.txt +0 -0
  273. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,438 @@
1
+ """Session Evaluator for Continuous Learning
2
+
3
+ Evaluates sessions to determine if they contain learnable patterns.
4
+ Identifies high-value sessions worth analyzing for pattern extraction.
5
+
6
+ Architectural patterns inspired by everything-claude-code by Affaan Mustafa.
7
+ See: https://github.com/affaan-m/everything-claude-code (MIT License)
8
+ See: ACKNOWLEDGMENTS.md for full attribution.
9
+
10
+ Copyright 2025 Smart AI Memory, LLC
11
+ Licensed under Fair Source 0.9
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import logging
17
+ import re
18
+ from dataclasses import dataclass, field
19
+ from enum import Enum
20
+ from typing import TYPE_CHECKING, Any
21
+
22
+ if TYPE_CHECKING:
23
+ from empathy_llm_toolkit.state import CollaborationState
24
+
25
+ logger = logging.getLogger(__name__)
26
+
27
+
28
+ class SessionQuality(Enum):
29
+ """Quality rating for a session."""
30
+
31
+ EXCELLENT = "excellent" # High learning value
32
+ GOOD = "good" # Worth extracting patterns
33
+ AVERAGE = "average" # Some value
34
+ POOR = "poor" # Limited learning value
35
+ SKIP = "skip" # Don't process
36
+
37
+
38
+ @dataclass
39
+ class SessionMetrics:
40
+ """Metrics computed for a session."""
41
+
42
+ interaction_count: int = 0
43
+ user_corrections: int = 0
44
+ successful_resolutions: int = 0
45
+ trust_delta: float = 0.0
46
+ empathy_level_avg: float = 0.0
47
+ error_mentions: int = 0
48
+ workaround_mentions: int = 0
49
+ preference_signals: int = 0
50
+ session_duration_minutes: float = 0.0
51
+
52
+ def to_dict(self) -> dict[str, Any]:
53
+ """Convert to dictionary."""
54
+ return {
55
+ "interaction_count": self.interaction_count,
56
+ "user_corrections": self.user_corrections,
57
+ "successful_resolutions": self.successful_resolutions,
58
+ "trust_delta": self.trust_delta,
59
+ "empathy_level_avg": self.empathy_level_avg,
60
+ "error_mentions": self.error_mentions,
61
+ "workaround_mentions": self.workaround_mentions,
62
+ "preference_signals": self.preference_signals,
63
+ "session_duration_minutes": self.session_duration_minutes,
64
+ }
65
+
66
+
67
+ @dataclass
68
+ class EvaluationResult:
69
+ """Result of session evaluation."""
70
+
71
+ quality: SessionQuality
72
+ score: float # 0.0 to 1.0
73
+ metrics: SessionMetrics
74
+ learnable_topics: list[str] = field(default_factory=list)
75
+ recommended_extraction: bool = False
76
+ reasoning: str = ""
77
+
78
+ def to_dict(self) -> dict[str, Any]:
79
+ """Convert to dictionary."""
80
+ return {
81
+ "quality": self.quality.value,
82
+ "score": self.score,
83
+ "metrics": self.metrics.to_dict(),
84
+ "learnable_topics": self.learnable_topics,
85
+ "recommended_extraction": self.recommended_extraction,
86
+ "reasoning": self.reasoning,
87
+ }
88
+
89
+
90
+ class SessionEvaluator:
91
+ """Evaluates sessions for learning potential.
92
+
93
+ Analyzes collaboration sessions to determine if they contain
94
+ patterns worth extracting for continuous learning.
95
+ """
96
+
97
+ # Patterns indicating user corrections
98
+ CORRECTION_PATTERNS = [
99
+ r"actually[,\s]",
100
+ r"i meant",
101
+ r"no[,\s]+i",
102
+ r"that's not what i",
103
+ r"let me clarify",
104
+ r"to be clear",
105
+ r"what i really",
106
+ r"i should have said",
107
+ r"correction:",
108
+ ]
109
+
110
+ # Patterns indicating errors/debugging
111
+ ERROR_PATTERNS = [
112
+ r"error",
113
+ r"exception",
114
+ r"failed",
115
+ r"doesn't work",
116
+ r"not working",
117
+ r"broken",
118
+ r"bug",
119
+ r"issue",
120
+ r"problem",
121
+ r"crash",
122
+ ]
123
+
124
+ # Patterns indicating workarounds
125
+ WORKAROUND_PATTERNS = [
126
+ r"workaround",
127
+ r"instead[,\s]",
128
+ r"alternative",
129
+ r"hack",
130
+ r"trick",
131
+ r"bypass",
132
+ r"work around",
133
+ r"quick fix",
134
+ ]
135
+
136
+ # Patterns indicating preferences
137
+ PREFERENCE_PATTERNS = [
138
+ r"i prefer",
139
+ r"i like",
140
+ r"i don't like",
141
+ r"i always",
142
+ r"i never",
143
+ r"my style",
144
+ r"usually i",
145
+ r"please always",
146
+ r"please don't",
147
+ ]
148
+
149
+ # Patterns indicating successful resolution
150
+ SUCCESS_PATTERNS = [
151
+ r"that works",
152
+ r"perfect",
153
+ r"thanks",
154
+ r"great",
155
+ r"solved",
156
+ r"fixed",
157
+ r"working now",
158
+ r"exactly what i",
159
+ ]
160
+
161
+ def __init__(
162
+ self,
163
+ min_interactions: int = 3,
164
+ min_score_for_extraction: float = 0.4,
165
+ ):
166
+ """Initialize the evaluator.
167
+
168
+ Args:
169
+ min_interactions: Minimum interactions for evaluation
170
+ min_score_for_extraction: Minimum score to recommend extraction
171
+ """
172
+ self._min_interactions = min_interactions
173
+ self._min_score_for_extraction = min_score_for_extraction
174
+
175
+ # Compile patterns
176
+ self._correction_re = self._compile_patterns(self.CORRECTION_PATTERNS)
177
+ self._error_re = self._compile_patterns(self.ERROR_PATTERNS)
178
+ self._workaround_re = self._compile_patterns(self.WORKAROUND_PATTERNS)
179
+ self._preference_re = self._compile_patterns(self.PREFERENCE_PATTERNS)
180
+ self._success_re = self._compile_patterns(self.SUCCESS_PATTERNS)
181
+
182
+ def _compile_patterns(self, patterns: list[str]) -> re.Pattern:
183
+ """Compile patterns into a single regex."""
184
+ combined = "|".join(f"({p})" for p in patterns)
185
+ return re.compile(combined, re.IGNORECASE)
186
+
187
+ def evaluate(
188
+ self,
189
+ state: CollaborationState,
190
+ ) -> EvaluationResult:
191
+ """Evaluate a collaboration session.
192
+
193
+ Args:
194
+ state: The collaboration state to evaluate
195
+
196
+ Returns:
197
+ EvaluationResult with quality rating and metrics
198
+ """
199
+ # Compute metrics
200
+ metrics = self._compute_metrics(state)
201
+
202
+ # Determine learnable topics
203
+ topics = self._identify_topics(state, metrics)
204
+
205
+ # Calculate score
206
+ score = self._calculate_score(metrics, len(topics))
207
+
208
+ # Determine quality
209
+ quality = self._score_to_quality(score)
210
+
211
+ # Build reasoning
212
+ reasoning = self._build_reasoning(metrics, topics, score)
213
+
214
+ return EvaluationResult(
215
+ quality=quality,
216
+ score=score,
217
+ metrics=metrics,
218
+ learnable_topics=topics,
219
+ recommended_extraction=score >= self._min_score_for_extraction,
220
+ reasoning=reasoning,
221
+ )
222
+
223
+ def _compute_metrics(self, state: CollaborationState) -> SessionMetrics:
224
+ """Compute session metrics."""
225
+ metrics = SessionMetrics()
226
+
227
+ metrics.interaction_count = len(state.interactions)
228
+
229
+ if metrics.interaction_count == 0:
230
+ return metrics
231
+
232
+ # Calculate duration
233
+ if state.interactions:
234
+ first = state.interactions[0].timestamp
235
+ last = state.interactions[-1].timestamp
236
+ duration = (last - first).total_seconds() / 60.0
237
+ metrics.session_duration_minutes = duration
238
+
239
+ # Calculate trust delta
240
+ if state.trust_trajectory:
241
+ initial = state.trust_trajectory[0] if state.trust_trajectory else 0.5
242
+ final = state.trust_level
243
+ metrics.trust_delta = final - initial
244
+
245
+ # Calculate average empathy level
246
+ if state.level_history:
247
+ metrics.empathy_level_avg = sum(state.level_history) / len(state.level_history)
248
+ else:
249
+ metrics.empathy_level_avg = state.current_level
250
+
251
+ # Analyze user messages
252
+ for interaction in state.interactions:
253
+ if interaction.role != "user":
254
+ continue
255
+
256
+ content_lower = interaction.content.lower()
257
+
258
+ # Count corrections
259
+ if self._correction_re.search(content_lower):
260
+ metrics.user_corrections += 1
261
+
262
+ # Count error mentions
263
+ if self._error_re.search(content_lower):
264
+ metrics.error_mentions += 1
265
+
266
+ # Count workaround mentions
267
+ if self._workaround_re.search(content_lower):
268
+ metrics.workaround_mentions += 1
269
+
270
+ # Count preference signals
271
+ if self._preference_re.search(content_lower):
272
+ metrics.preference_signals += 1
273
+
274
+ # Count successful resolutions
275
+ if self._success_re.search(content_lower):
276
+ metrics.successful_resolutions += 1
277
+
278
+ return metrics
279
+
280
+ def _identify_topics(
281
+ self,
282
+ state: CollaborationState,
283
+ metrics: SessionMetrics,
284
+ ) -> list[str]:
285
+ """Identify learnable topics from the session."""
286
+ topics = []
287
+
288
+ if metrics.user_corrections > 0:
289
+ topics.append("user_corrections")
290
+
291
+ if metrics.error_mentions > 0 and metrics.successful_resolutions > 0:
292
+ topics.append("error_resolution")
293
+
294
+ if metrics.workaround_mentions > 0:
295
+ topics.append("workarounds")
296
+
297
+ if metrics.preference_signals > 0:
298
+ topics.append("preferences")
299
+
300
+ # Check for project-specific patterns
301
+ if self._has_project_specific_content(state):
302
+ topics.append("project_specific")
303
+
304
+ return topics
305
+
306
+ def _has_project_specific_content(self, state: CollaborationState) -> bool:
307
+ """Check if session contains project-specific content."""
308
+ # Look for file paths, function names, etc.
309
+ project_indicators = [
310
+ r"\.(py|js|ts|tsx|jsx|go|rs|java|cpp|c|h)\b", # File extensions
311
+ r"def\s+\w+", # Python functions
312
+ r"function\s+\w+", # JS functions
313
+ r"class\s+\w+", # Class definitions
314
+ r"import\s+", # Imports
315
+ r"from\s+\w+\s+import", # Python imports
316
+ ]
317
+
318
+ project_re = re.compile("|".join(project_indicators), re.IGNORECASE)
319
+
320
+ for interaction in state.interactions:
321
+ if project_re.search(interaction.content):
322
+ return True
323
+
324
+ return False
325
+
326
+ def _calculate_score(
327
+ self,
328
+ metrics: SessionMetrics,
329
+ topic_count: int,
330
+ ) -> float:
331
+ """Calculate overall learning score."""
332
+ score = 0.0
333
+
334
+ # Base score from interaction count
335
+ if metrics.interaction_count >= self._min_interactions:
336
+ score += 0.1
337
+
338
+ # Corrections are highly valuable
339
+ if metrics.user_corrections > 0:
340
+ score += min(metrics.user_corrections * 0.15, 0.3)
341
+
342
+ # Error resolutions are valuable
343
+ if metrics.error_mentions > 0 and metrics.successful_resolutions > 0:
344
+ resolution_rate = metrics.successful_resolutions / max(metrics.error_mentions, 1)
345
+ score += resolution_rate * 0.2
346
+
347
+ # Workarounds are valuable
348
+ if metrics.workaround_mentions > 0:
349
+ score += min(metrics.workaround_mentions * 0.1, 0.2)
350
+
351
+ # Preferences help personalization
352
+ if metrics.preference_signals > 0:
353
+ score += min(metrics.preference_signals * 0.05, 0.1)
354
+
355
+ # Topic diversity bonus
356
+ score += topic_count * 0.05
357
+
358
+ # Trust increase indicates good interactions
359
+ if metrics.trust_delta > 0:
360
+ score += min(metrics.trust_delta * 0.2, 0.1)
361
+
362
+ # Penalize very short sessions
363
+ if metrics.interaction_count < self._min_interactions:
364
+ score *= 0.5
365
+
366
+ return min(score, 1.0)
367
+
368
+ def _score_to_quality(self, score: float) -> SessionQuality:
369
+ """Convert score to quality rating."""
370
+ if score >= 0.7:
371
+ return SessionQuality.EXCELLENT
372
+ elif score >= 0.5:
373
+ return SessionQuality.GOOD
374
+ elif score >= 0.3:
375
+ return SessionQuality.AVERAGE
376
+ elif score >= 0.1:
377
+ return SessionQuality.POOR
378
+ else:
379
+ return SessionQuality.SKIP
380
+
381
+ def _build_reasoning(
382
+ self,
383
+ metrics: SessionMetrics,
384
+ topics: list[str],
385
+ score: float,
386
+ ) -> str:
387
+ """Build human-readable reasoning."""
388
+ parts = []
389
+
390
+ if metrics.user_corrections > 0:
391
+ parts.append(f"{metrics.user_corrections} user correction(s) found")
392
+
393
+ if metrics.successful_resolutions > 0:
394
+ parts.append(f"{metrics.successful_resolutions} successful resolution(s)")
395
+
396
+ if metrics.workaround_mentions > 0:
397
+ parts.append(f"{metrics.workaround_mentions} workaround(s) discussed")
398
+
399
+ if metrics.preference_signals > 0:
400
+ parts.append(f"{metrics.preference_signals} preference signal(s)")
401
+
402
+ if topics:
403
+ parts.append(f"Learnable topics: {', '.join(topics)}")
404
+
405
+ if not parts:
406
+ parts.append("Limited learning signals detected")
407
+
408
+ return "; ".join(parts) + f". Score: {score:.2f}"
409
+
410
+ def should_extract_patterns(
411
+ self,
412
+ state: CollaborationState,
413
+ ) -> bool:
414
+ """Quick check if patterns should be extracted.
415
+
416
+ Args:
417
+ state: Collaboration state to check
418
+
419
+ Returns:
420
+ True if extraction is recommended
421
+ """
422
+ result = self.evaluate(state)
423
+ return result.recommended_extraction
424
+
425
+ def get_extraction_priority(
426
+ self,
427
+ state: CollaborationState,
428
+ ) -> int:
429
+ """Get extraction priority (higher = more important).
430
+
431
+ Args:
432
+ state: Collaboration state to evaluate
433
+
434
+ Returns:
435
+ Priority from 0-100
436
+ """
437
+ result = self.evaluate(state)
438
+ return int(result.score * 100)