empathy-framework 4.6.6__py3-none-any.whl → 4.7.0__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 (247) hide show
  1. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/METADATA +7 -6
  2. empathy_framework-4.7.0.dist-info/RECORD +354 -0
  3. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/top_level.txt +0 -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.py +173 -0
  130. empathy_os/workflows/__init__.py +212 -120
  131. empathy_os/workflows/batch_processing.py +8 -24
  132. empathy_os/workflows/bug_predict.py +1 -1
  133. empathy_os/workflows/code_review.py +20 -5
  134. empathy_os/workflows/code_review_pipeline.py +13 -8
  135. empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
  136. empathy_os/workflows/manage_documentation.py +1 -0
  137. empathy_os/workflows/orchestrated_health_check.py +6 -11
  138. empathy_os/workflows/orchestrated_release_prep.py +3 -3
  139. empathy_os/workflows/pr_review.py +18 -10
  140. empathy_os/workflows/progressive/__init__.py +2 -12
  141. empathy_os/workflows/progressive/cli.py +14 -37
  142. empathy_os/workflows/progressive/core.py +12 -12
  143. empathy_os/workflows/progressive/orchestrator.py +166 -144
  144. empathy_os/workflows/progressive/reports.py +22 -31
  145. empathy_os/workflows/progressive/telemetry.py +8 -14
  146. empathy_os/workflows/progressive/test_gen.py +29 -48
  147. empathy_os/workflows/progressive/workflow.py +31 -70
  148. empathy_os/workflows/release_prep.py +21 -6
  149. empathy_os/workflows/release_prep_crew.py +1 -0
  150. empathy_os/workflows/secure_release.py +13 -6
  151. empathy_os/workflows/security_audit.py +8 -3
  152. empathy_os/workflows/test_coverage_boost_crew.py +3 -2
  153. empathy_os/workflows/test_maintenance_crew.py +1 -0
  154. empathy_os/workflows/test_runner.py +16 -12
  155. empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
  156. empathy_software_plugin/cli.py +0 -122
  157. coach_wizards/__init__.py +0 -45
  158. coach_wizards/accessibility_wizard.py +0 -91
  159. coach_wizards/api_wizard.py +0 -91
  160. coach_wizards/base_wizard.py +0 -209
  161. coach_wizards/cicd_wizard.py +0 -91
  162. coach_wizards/code_reviewer_README.md +0 -60
  163. coach_wizards/code_reviewer_wizard.py +0 -180
  164. coach_wizards/compliance_wizard.py +0 -91
  165. coach_wizards/database_wizard.py +0 -91
  166. coach_wizards/debugging_wizard.py +0 -91
  167. coach_wizards/documentation_wizard.py +0 -91
  168. coach_wizards/generate_wizards.py +0 -347
  169. coach_wizards/localization_wizard.py +0 -173
  170. coach_wizards/migration_wizard.py +0 -91
  171. coach_wizards/monitoring_wizard.py +0 -91
  172. coach_wizards/observability_wizard.py +0 -91
  173. coach_wizards/performance_wizard.py +0 -91
  174. coach_wizards/prompt_engineering_wizard.py +0 -661
  175. coach_wizards/refactoring_wizard.py +0 -91
  176. coach_wizards/scaling_wizard.py +0 -90
  177. coach_wizards/security_wizard.py +0 -92
  178. coach_wizards/testing_wizard.py +0 -91
  179. empathy_framework-4.6.6.dist-info/RECORD +0 -410
  180. empathy_llm_toolkit/wizards/__init__.py +0 -43
  181. empathy_llm_toolkit/wizards/base_wizard.py +0 -364
  182. empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
  183. empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
  184. empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
  185. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
  186. empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
  187. empathy_os/wizard_factory_cli.py +0 -170
  188. empathy_software_plugin/wizards/__init__.py +0 -42
  189. empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
  190. empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
  191. empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
  192. empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
  193. empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
  194. empathy_software_plugin/wizards/base_wizard.py +0 -288
  195. empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
  196. empathy_software_plugin/wizards/code_review_wizard.py +0 -604
  197. empathy_software_plugin/wizards/debugging/__init__.py +0 -50
  198. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
  199. empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
  200. empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
  201. empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
  202. empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
  203. empathy_software_plugin/wizards/debugging/verification.py +0 -369
  204. empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
  205. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
  206. empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
  207. empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
  208. empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
  209. empathy_software_plugin/wizards/performance/__init__.py +0 -9
  210. empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
  211. empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
  212. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
  213. empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
  214. empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
  215. empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
  216. empathy_software_plugin/wizards/security/__init__.py +0 -32
  217. empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
  218. empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
  219. empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
  220. empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
  221. empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
  222. empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
  223. empathy_software_plugin/wizards/testing/__init__.py +0 -27
  224. empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
  225. empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
  226. empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
  227. empathy_software_plugin/wizards/testing_wizard.py +0 -274
  228. wizards/__init__.py +0 -82
  229. wizards/admission_assessment_wizard.py +0 -644
  230. wizards/care_plan.py +0 -321
  231. wizards/clinical_assessment.py +0 -769
  232. wizards/discharge_planning.py +0 -77
  233. wizards/discharge_summary_wizard.py +0 -468
  234. wizards/dosage_calculation.py +0 -497
  235. wizards/incident_report_wizard.py +0 -454
  236. wizards/medication_reconciliation.py +0 -85
  237. wizards/nursing_assessment.py +0 -171
  238. wizards/patient_education.py +0 -654
  239. wizards/quality_improvement.py +0 -705
  240. wizards/sbar_report.py +0 -324
  241. wizards/sbar_wizard.py +0 -608
  242. wizards/shift_handoff_wizard.py +0 -535
  243. wizards/soap_note_wizard.py +0 -679
  244. wizards/treatment_plan.py +0 -15
  245. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/WHEEL +0 -0
  246. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/entry_points.txt +0 -0
  247. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.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)