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,434 @@
1
+ """Context Manager for Empathy Framework
2
+
3
+ Orchestrates context compaction, state preservation, and restoration.
4
+ Integrates with the hook system to handle compaction events automatically.
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
+ from pathlib import Path
18
+ from typing import TYPE_CHECKING, Any
19
+
20
+ from empathy_llm_toolkit.context.compaction import (
21
+ CompactionStateManager,
22
+ CompactState,
23
+ PatternSummary,
24
+ SBARHandoff,
25
+ )
26
+
27
+ if TYPE_CHECKING:
28
+ from empathy_llm_toolkit.state import CollaborationState, UserPattern
29
+
30
+ logger = logging.getLogger(__name__)
31
+
32
+
33
+ class ContextManager:
34
+ """Manages context compaction and restoration for the Empathy Framework.
35
+
36
+ This class coordinates:
37
+ - Converting CollaborationState to CompactState for preservation
38
+ - Restoring state after context window resets
39
+ - Generating restoration prompts
40
+ - Handling SBAR handoffs for work continuity
41
+ """
42
+
43
+ def __init__(
44
+ self,
45
+ storage_dir: str | Path = ".empathy/compact_states",
46
+ token_threshold: int = 50, # Percentage at which to suggest compaction
47
+ auto_save: bool = True,
48
+ ):
49
+ """Initialize the ContextManager.
50
+
51
+ Args:
52
+ storage_dir: Directory for state persistence
53
+ token_threshold: Token usage percentage to trigger compaction suggestions
54
+ auto_save: Whether to auto-save state on compaction
55
+ """
56
+ self._state_manager = CompactionStateManager(storage_dir=storage_dir)
57
+ self._token_threshold = token_threshold
58
+ self._auto_save = auto_save
59
+ self._current_session_id: str = ""
60
+ self._current_phase: str = ""
61
+ self._completed_phases: list[str] = []
62
+ self._pending_handoff: SBARHandoff | None = None
63
+
64
+ @property
65
+ def session_id(self) -> str:
66
+ """Get current session ID."""
67
+ return self._current_session_id
68
+
69
+ @session_id.setter
70
+ def session_id(self, value: str) -> None:
71
+ """Set current session ID."""
72
+ self._current_session_id = value
73
+
74
+ @property
75
+ def current_phase(self) -> str:
76
+ """Get current work phase."""
77
+ return self._current_phase
78
+
79
+ @current_phase.setter
80
+ def current_phase(self, value: str) -> None:
81
+ """Set current work phase."""
82
+ self._current_phase = value
83
+
84
+ def complete_phase(self, phase: str) -> None:
85
+ """Mark a phase as completed.
86
+
87
+ Args:
88
+ phase: Name of the completed phase
89
+ """
90
+ if phase not in self._completed_phases:
91
+ self._completed_phases.append(phase)
92
+ logger.debug(f"Completed phase: {phase}")
93
+
94
+ def set_handoff(
95
+ self,
96
+ situation: str,
97
+ background: str,
98
+ assessment: str,
99
+ recommendation: str,
100
+ priority: str = "normal",
101
+ **metadata: Any,
102
+ ) -> SBARHandoff:
103
+ """Set a pending handoff for work continuity.
104
+
105
+ Uses SBAR format for clear communication:
106
+ - Situation: What's happening now
107
+ - Background: Relevant context
108
+ - Assessment: Current understanding
109
+ - Recommendation: Suggested next action
110
+
111
+ Args:
112
+ situation: Current situation description
113
+ background: Relevant background information
114
+ assessment: Current assessment
115
+ recommendation: Recommended next action
116
+ priority: Priority level (low, normal, high, critical)
117
+ **metadata: Additional metadata
118
+
119
+ Returns:
120
+ The created SBARHandoff
121
+ """
122
+ self._pending_handoff = SBARHandoff(
123
+ situation=situation,
124
+ background=background,
125
+ assessment=assessment,
126
+ recommendation=recommendation,
127
+ priority=priority,
128
+ metadata=metadata,
129
+ )
130
+ return self._pending_handoff
131
+
132
+ def clear_handoff(self) -> None:
133
+ """Clear the pending handoff after it's been addressed."""
134
+ self._pending_handoff = None
135
+
136
+ def extract_compact_state(
137
+ self,
138
+ collaboration_state: CollaborationState,
139
+ ) -> CompactState:
140
+ """Extract CompactState from full CollaborationState.
141
+
142
+ Converts the rich collaboration state into a compact form
143
+ suitable for preservation through context resets.
144
+
145
+ Args:
146
+ collaboration_state: Full collaboration state
147
+
148
+ Returns:
149
+ Compact state for preservation
150
+ """
151
+ # Convert patterns to summaries
152
+ pattern_summaries = [
153
+ self._pattern_to_summary(p)
154
+ for p in collaboration_state.detected_patterns[:10] # Top 10
155
+ ]
156
+
157
+ # Extract key preferences (limit to essentials)
158
+ key_preferences = self._extract_key_preferences(collaboration_state.preferences)
159
+
160
+ return CompactState(
161
+ user_id=collaboration_state.user_id,
162
+ trust_level=collaboration_state.trust_level,
163
+ empathy_level=collaboration_state.current_level,
164
+ detected_patterns=pattern_summaries,
165
+ session_id=self._current_session_id,
166
+ current_phase=self._current_phase,
167
+ completed_phases=list(self._completed_phases),
168
+ pending_handoff=self._pending_handoff,
169
+ interaction_count=len(collaboration_state.interactions),
170
+ successful_actions=collaboration_state.successful_actions,
171
+ failed_actions=collaboration_state.failed_actions,
172
+ preferences=key_preferences,
173
+ )
174
+
175
+ def _pattern_to_summary(self, pattern: UserPattern) -> PatternSummary:
176
+ """Convert UserPattern to PatternSummary.
177
+
178
+ Args:
179
+ pattern: Full pattern object
180
+
181
+ Returns:
182
+ Compact pattern summary
183
+ """
184
+ return PatternSummary(
185
+ pattern_type=pattern.pattern_type.value,
186
+ trigger=pattern.trigger,
187
+ action=pattern.action,
188
+ confidence=pattern.confidence,
189
+ occurrences=pattern.occurrences,
190
+ )
191
+
192
+ def _extract_key_preferences(
193
+ self,
194
+ preferences: dict[str, Any],
195
+ max_items: int = 10,
196
+ ) -> dict[str, Any]:
197
+ """Extract key preferences for compaction.
198
+
199
+ Filters and limits preferences to essential items.
200
+
201
+ Args:
202
+ preferences: Full preferences dict
203
+ max_items: Maximum items to include
204
+
205
+ Returns:
206
+ Filtered preferences dict
207
+ """
208
+ # Priority keys to always include if present
209
+ priority_keys = {
210
+ "response_style",
211
+ "code_style",
212
+ "verbosity",
213
+ "confirmation_level",
214
+ "tool_usage",
215
+ "language",
216
+ "timezone",
217
+ }
218
+
219
+ result: dict[str, Any] = {}
220
+
221
+ # Add priority keys first
222
+ for key in priority_keys:
223
+ if key in preferences:
224
+ result[key] = preferences[key]
225
+ if len(result) >= max_items:
226
+ return result
227
+
228
+ # Add remaining keys up to limit
229
+ for key, value in preferences.items():
230
+ if key not in result:
231
+ # Skip complex nested structures
232
+ if isinstance(value, (str, int, float, bool)):
233
+ result[key] = value
234
+ elif isinstance(value, list) and len(value) <= 5:
235
+ result[key] = value
236
+
237
+ if len(result) >= max_items:
238
+ break
239
+
240
+ return result
241
+
242
+ def save_for_compaction(
243
+ self,
244
+ collaboration_state: CollaborationState,
245
+ ) -> Path:
246
+ """Save state for upcoming compaction.
247
+
248
+ Called before context compaction to preserve state.
249
+
250
+ Args:
251
+ collaboration_state: Current collaboration state
252
+
253
+ Returns:
254
+ Path to saved state file
255
+ """
256
+ compact_state = self.extract_compact_state(collaboration_state)
257
+ return self._state_manager.save_state(compact_state)
258
+
259
+ def restore_state(self, user_id: str) -> CompactState | None:
260
+ """Restore the most recent state for a user.
261
+
262
+ Args:
263
+ user_id: User identifier
264
+
265
+ Returns:
266
+ Most recent CompactState or None
267
+ """
268
+ state = self._state_manager.load_latest_state(user_id)
269
+
270
+ if state:
271
+ # Restore session tracking
272
+ self._current_session_id = state.session_id
273
+ self._current_phase = state.current_phase
274
+ self._completed_phases = list(state.completed_phases)
275
+ self._pending_handoff = state.pending_handoff
276
+
277
+ logger.info(f"Restored state for user {user_id}")
278
+
279
+ return state
280
+
281
+ def restore_by_session(self, session_id: str) -> CompactState | None:
282
+ """Restore state for a specific session.
283
+
284
+ Args:
285
+ session_id: Session identifier
286
+
287
+ Returns:
288
+ CompactState for session or None
289
+ """
290
+ state = self._state_manager.load_state_by_session(session_id)
291
+
292
+ if state:
293
+ self._current_session_id = state.session_id
294
+ self._current_phase = state.current_phase
295
+ self._completed_phases = list(state.completed_phases)
296
+ self._pending_handoff = state.pending_handoff
297
+
298
+ logger.info(f"Restored state for session {session_id}")
299
+
300
+ return state
301
+
302
+ def generate_restoration_prompt(self, user_id: str) -> str | None:
303
+ """Generate a restoration prompt for session continuity.
304
+
305
+ Loads the most recent state and formats it as a prompt
306
+ that can be injected at session start.
307
+
308
+ Args:
309
+ user_id: User identifier
310
+
311
+ Returns:
312
+ Formatted restoration prompt or None if no state
313
+ """
314
+ state = self.restore_state(user_id)
315
+
316
+ if not state:
317
+ return None
318
+
319
+ return state.format_restoration_prompt()
320
+
321
+ def should_suggest_compaction(
322
+ self,
323
+ token_usage_percent: float,
324
+ message_count: int | None = None,
325
+ ) -> bool:
326
+ """Determine if compaction should be suggested.
327
+
328
+ Args:
329
+ token_usage_percent: Current token usage as percentage (0-100)
330
+ message_count: Optional message count for additional heuristic
331
+
332
+ Returns:
333
+ True if compaction should be suggested
334
+ """
335
+ # Primary check: token usage
336
+ if token_usage_percent >= self._token_threshold:
337
+ return True
338
+
339
+ # Secondary check: message count (if provided)
340
+ if message_count and message_count >= 50:
341
+ return True
342
+
343
+ return False
344
+
345
+ def get_compaction_message(
346
+ self,
347
+ token_usage_percent: float,
348
+ ) -> str:
349
+ """Generate a compaction suggestion message.
350
+
351
+ Args:
352
+ token_usage_percent: Current token usage percentage
353
+
354
+ Returns:
355
+ Formatted suggestion message
356
+ """
357
+ return (
358
+ f"Context usage at {token_usage_percent:.0f}%. "
359
+ "Consider running `/compact` to preserve state and free context space. "
360
+ "Your collaboration state, trust level, and detected patterns will be preserved."
361
+ )
362
+
363
+ def apply_state_to_collaboration(
364
+ self,
365
+ compact_state: CompactState,
366
+ collaboration_state: CollaborationState,
367
+ ) -> None:
368
+ """Apply restored CompactState to CollaborationState.
369
+
370
+ Updates a CollaborationState with values from a restored CompactState.
371
+
372
+ Args:
373
+ compact_state: State to restore from
374
+ collaboration_state: State to update
375
+ """
376
+ # Restore trust level
377
+ collaboration_state.trust_level = compact_state.trust_level
378
+
379
+ # Restore empathy level
380
+ collaboration_state.current_level = compact_state.empathy_level
381
+
382
+ # Restore counters
383
+ collaboration_state.successful_actions = compact_state.successful_actions
384
+ collaboration_state.failed_actions = compact_state.failed_actions
385
+
386
+ # Restore preferences
387
+ collaboration_state.preferences.update(compact_state.preferences)
388
+
389
+ # Note: Patterns and interactions are not restored from compact state
390
+ # as the full state would be needed for those
391
+
392
+ logger.info(
393
+ f"Applied compact state to collaboration: "
394
+ f"trust={compact_state.trust_level:.2f}, "
395
+ f"level={compact_state.empathy_level}"
396
+ )
397
+
398
+ def get_state_summary(self, user_id: str) -> dict[str, Any] | None:
399
+ """Get a summary of saved states for a user.
400
+
401
+ Args:
402
+ user_id: User identifier
403
+
404
+ Returns:
405
+ Summary dict or None if no states
406
+ """
407
+ states = self._state_manager.get_all_states(user_id)
408
+
409
+ if not states:
410
+ return None
411
+
412
+ latest = states[0]
413
+
414
+ return {
415
+ "user_id": user_id,
416
+ "states_count": len(states),
417
+ "latest_saved": latest.saved_at,
418
+ "latest_trust_level": latest.trust_level,
419
+ "latest_empathy_level": latest.empathy_level,
420
+ "latest_session_id": latest.session_id,
421
+ "patterns_count": len(latest.detected_patterns),
422
+ "has_pending_handoff": latest.pending_handoff is not None,
423
+ }
424
+
425
+ def clear_states(self, user_id: str) -> int:
426
+ """Clear all saved states for a user.
427
+
428
+ Args:
429
+ user_id: User identifier
430
+
431
+ Returns:
432
+ Number of states cleared
433
+ """
434
+ return self._state_manager.clear_user_states(user_id)
@@ -0,0 +1,24 @@
1
+ """Hook System for Empathy Framework
2
+
3
+ Event-driven automation system for Empathy Framework.
4
+ Supports PreToolUse, PostToolUse, SessionStart, SessionEnd, PreCompact, and Stop events.
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
11
+ Licensed under Fair Source License 0.9
12
+ """
13
+
14
+ from empathy_llm_toolkit.hooks.config import HookConfig, HookDefinition, HookEvent
15
+ from empathy_llm_toolkit.hooks.executor import HookExecutor
16
+ from empathy_llm_toolkit.hooks.registry import HookRegistry
17
+
18
+ __all__ = [
19
+ "HookConfig",
20
+ "HookDefinition",
21
+ "HookEvent",
22
+ "HookExecutor",
23
+ "HookRegistry",
24
+ ]