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
- Multi-Agent Coordination for Distributed Memory Networks
1
+ """Multi-Agent Coordination for Distributed Memory Networks
3
2
 
4
3
  Provides conflict resolution and coordination primitives for multi-agent
5
4
  systems sharing pattern libraries.
@@ -63,7 +62,7 @@ class TeamPriorities:
63
62
  "performance": 0.7,
64
63
  "style": 0.5,
65
64
  "warning": 0.6,
66
- }
65
+ },
67
66
  )
68
67
 
69
68
  # Tag preferences (tags that should be prioritized)
@@ -71,8 +70,7 @@ class TeamPriorities:
71
70
 
72
71
 
73
72
  class ConflictResolver:
74
- """
75
- Resolves conflicts between patterns from different agents.
73
+ """Resolves conflicts between patterns from different agents.
76
74
 
77
75
  When multiple agents contribute patterns that address the same issue
78
76
  but recommend different approaches, the ConflictResolver determines
@@ -105,6 +103,7 @@ class ConflictResolver:
105
103
  ... context={"team_priority": "readability", "code_complexity": "high"}
106
104
  ... )
107
105
  >>> print(f"Winner: {resolution.winning_pattern.name}")
106
+
108
107
  """
109
108
 
110
109
  def __init__(
@@ -112,12 +111,12 @@ class ConflictResolver:
112
111
  default_strategy: ResolutionStrategy = ResolutionStrategy.WEIGHTED_SCORE,
113
112
  team_priorities: TeamPriorities | None = None,
114
113
  ):
115
- """
116
- Initialize the ConflictResolver.
114
+ """Initialize the ConflictResolver.
117
115
 
118
116
  Args:
119
117
  default_strategy: Strategy to use when not specified
120
118
  team_priorities: Team-configured priorities for resolution
119
+
121
120
  """
122
121
  self.default_strategy = default_strategy
123
122
  self.team_priorities = team_priorities or TeamPriorities()
@@ -129,8 +128,7 @@ class ConflictResolver:
129
128
  context: dict[str, Any] | None = None,
130
129
  strategy: ResolutionStrategy | None = None,
131
130
  ) -> ResolutionResult:
132
- """
133
- Resolve conflict between multiple patterns.
131
+ """Resolve conflict between multiple patterns.
134
132
 
135
133
  Args:
136
134
  patterns: List of conflicting patterns (minimum 2)
@@ -142,6 +140,7 @@ class ConflictResolver:
142
140
 
143
141
  Raises:
144
142
  ValueError: If fewer than 2 patterns provided
143
+
145
144
  """
146
145
  if len(patterns) < 2:
147
146
  raise ValueError("Need at least 2 patterns to resolve conflict")
@@ -185,7 +184,6 @@ class ConflictResolver:
185
184
  strategy: ResolutionStrategy,
186
185
  ) -> dict[str, float]:
187
186
  """Calculate score for a pattern based on strategy"""
188
-
189
187
  scores: dict[str, float] = {}
190
188
 
191
189
  # Factor 1: Confidence score (0-1)
@@ -230,7 +228,6 @@ class ConflictResolver:
230
228
  context: dict[str, Any],
231
229
  ) -> float:
232
230
  """Calculate how well a pattern matches the current context"""
233
-
234
231
  if not context or not pattern.context:
235
232
  return 0.5 # Neutral if no context available
236
233
 
@@ -261,7 +258,6 @@ class ConflictResolver:
261
258
  context: dict[str, Any],
262
259
  ) -> float:
263
260
  """Calculate how well a pattern aligns with team priorities"""
264
-
265
261
  score = 0.5 # Start neutral
266
262
 
267
263
  # Check team priority in context
@@ -307,13 +303,12 @@ class ConflictResolver:
307
303
  strategy: ResolutionStrategy,
308
304
  ) -> str:
309
305
  """Generate human-readable reasoning for the resolution"""
310
-
311
306
  reasons = []
312
307
 
313
308
  # Strategy-specific reasoning
314
309
  if strategy == ResolutionStrategy.HIGHEST_CONFIDENCE:
315
310
  reasons.append(
316
- f"Selected '{winner.name}' with highest confidence ({winner.confidence:.0%})"
311
+ f"Selected '{winner.name}' with highest confidence ({winner.confidence:.0%})",
317
312
  )
318
313
  elif strategy == ResolutionStrategy.MOST_RECENT:
319
314
  age = (datetime.now() - winner.discovered_at).days
@@ -321,7 +316,7 @@ class ConflictResolver:
321
316
  elif strategy == ResolutionStrategy.BEST_CONTEXT_MATCH:
322
317
  reasons.append(
323
318
  f"Selected '{winner.name}' as best match for current context "
324
- f"(match score: {scores['context_match']:.0%})"
319
+ f"(match score: {scores['context_match']:.0%})",
325
320
  )
326
321
  elif strategy == ResolutionStrategy.TEAM_PRIORITY:
327
322
  team_priority = context.get("team_priority", "balanced")
@@ -334,7 +329,7 @@ class ConflictResolver:
334
329
  )[:2]
335
330
  factor_desc = ", ".join(f"{k}: {v:.0%}" for k, v in top_factors)
336
331
  reasons.append(
337
- f"Selected '{winner.name}' based on weighted scoring (top factors: {factor_desc})"
332
+ f"Selected '{winner.name}' based on weighted scoring (top factors: {factor_desc})",
338
333
  )
339
334
 
340
335
  # Add comparison to losers
@@ -346,7 +341,6 @@ class ConflictResolver:
346
341
 
347
342
  def get_resolution_stats(self) -> dict[str, Any]:
348
343
  """Get statistics about resolution history"""
349
-
350
344
  if not self.resolution_history:
351
345
  return {
352
346
  "total_resolutions": 0,
@@ -397,8 +391,7 @@ class AgentTask:
397
391
 
398
392
 
399
393
  class AgentCoordinator:
400
- """
401
- Redis-backed coordinator for multi-agent teams.
394
+ """Redis-backed coordinator for multi-agent teams.
402
395
 
403
396
  Enables real-time coordination between agents using Redis short-term memory:
404
397
  - Task distribution and claiming
@@ -425,6 +418,7 @@ class AgentCoordinator:
425
418
  >>> if task:
426
419
  ... # Do work...
427
420
  ... coordinator.complete_task(task.task_id, {"issues_found": 3})
421
+
428
422
  """
429
423
 
430
424
  def __init__(
@@ -433,13 +427,13 @@ class AgentCoordinator:
433
427
  team_id: str,
434
428
  conflict_resolver: ConflictResolver | None = None,
435
429
  ):
436
- """
437
- Initialize the coordinator.
430
+ """Initialize the coordinator.
438
431
 
439
432
  Args:
440
433
  short_term_memory: RedisShortTermMemory instance
441
434
  team_id: Unique identifier for this team
442
435
  conflict_resolver: Optional ConflictResolver for pattern conflicts
436
+
443
437
  """
444
438
  from .redis_memory import AccessTier, AgentCredentials
445
439
 
@@ -457,14 +451,14 @@ class AgentCoordinator:
457
451
  self._active_agents: dict[str, datetime] = {}
458
452
 
459
453
  def add_task(self, task: AgentTask) -> bool:
460
- """
461
- Add a task to the queue for agents to claim.
454
+ """Add a task to the queue for agents to claim.
462
455
 
463
456
  Args:
464
457
  task: The task to add
465
458
 
466
459
  Returns:
467
460
  True if added successfully
461
+
468
462
  """
469
463
  task_data = {
470
464
  "task_id": task.task_id,
@@ -477,21 +471,22 @@ class AgentCoordinator:
477
471
  "context": task.context,
478
472
  }
479
473
 
480
- return self.memory.stash(
474
+ result = self.memory.stash(
481
475
  f"task:{self.team_id}:{task.task_id}",
482
476
  task_data,
483
477
  self._credentials,
484
478
  )
479
+ return bool(result)
485
480
 
486
481
  def get_pending_tasks(self, task_type: str | None = None) -> list[AgentTask]:
487
- """
488
- Get all pending tasks, optionally filtered by type.
482
+ """Get all pending tasks, optionally filtered by type.
489
483
 
490
484
  Args:
491
485
  task_type: Filter by task type
492
486
 
493
487
  Returns:
494
488
  List of pending AgentTask objects
489
+
495
490
  """
496
491
  # In a real implementation, we'd scan Redis keys
497
492
  # For now, this is a simplified version
@@ -515,7 +510,7 @@ class AgentCoordinator:
515
510
  status=task_data.get("status", "pending"),
516
511
  priority=task_data.get("priority", 5),
517
512
  context=task_data.get("context", {}),
518
- )
513
+ ),
519
514
  )
520
515
 
521
516
  return sorted(tasks, key=lambda t: t.priority, reverse=True)
@@ -525,8 +520,7 @@ class AgentCoordinator:
525
520
  agent_id: str,
526
521
  task_type: str | None = None,
527
522
  ) -> AgentTask | None:
528
- """
529
- Claim a pending task for an agent.
523
+ """Claim a pending task for an agent.
530
524
 
531
525
  Uses atomic operations to prevent race conditions.
532
526
 
@@ -536,6 +530,7 @@ class AgentCoordinator:
536
530
 
537
531
  Returns:
538
532
  The claimed task, or None if no tasks available
533
+
539
534
  """
540
535
  pending = self.get_pending_tasks(task_type)
541
536
 
@@ -575,8 +570,7 @@ class AgentCoordinator:
575
570
  result: dict[str, Any],
576
571
  agent_id: str | None = None,
577
572
  ) -> bool:
578
- """
579
- Mark a task as completed with results.
573
+ """Mark a task as completed with results.
580
574
 
581
575
  Args:
582
576
  task_id: Task to complete
@@ -585,6 +579,7 @@ class AgentCoordinator:
585
579
 
586
580
  Returns:
587
581
  True if completed successfully
582
+
588
583
  """
589
584
  task_key = f"task:{self.team_id}:{task_id}"
590
585
  current = self.memory.retrieve(task_key, self._credentials)
@@ -618,8 +613,7 @@ class AgentCoordinator:
618
613
  return False
619
614
 
620
615
  def register_agent(self, agent_id: str, capabilities: list[str] | None = None) -> bool:
621
- """
622
- Register an agent with the team.
616
+ """Register an agent with the team.
623
617
 
624
618
  Args:
625
619
  agent_id: Unique agent identifier
@@ -627,10 +621,11 @@ class AgentCoordinator:
627
621
 
628
622
  Returns:
629
623
  True if registered successfully
624
+
630
625
  """
631
626
  self._active_agents[agent_id] = datetime.now()
632
627
 
633
- return self.memory.stash(
628
+ result = self.memory.stash(
634
629
  f"agent:{self.team_id}:{agent_id}",
635
630
  {
636
631
  "agent_id": agent_id,
@@ -640,34 +635,36 @@ class AgentCoordinator:
640
635
  },
641
636
  self._credentials,
642
637
  )
638
+ return bool(result)
643
639
 
644
640
  def heartbeat(self, agent_id: str) -> bool:
645
- """
646
- Send heartbeat to indicate agent is still active.
641
+ """Send heartbeat to indicate agent is still active.
647
642
 
648
643
  Args:
649
644
  agent_id: Agent sending heartbeat
650
645
 
651
646
  Returns:
652
647
  True if heartbeat recorded
648
+
653
649
  """
654
650
  self._active_agents[agent_id] = datetime.now()
655
651
 
656
- return self.memory.send_signal(
652
+ result = self.memory.send_signal(
657
653
  signal_type="heartbeat",
658
654
  data={"agent_id": agent_id, "timestamp": datetime.now().isoformat()},
659
655
  credentials=self._credentials,
660
656
  )
657
+ return bool(result)
661
658
 
662
659
  def get_active_agents(self, timeout_seconds: int = 300) -> list[str]:
663
- """
664
- Get list of recently active agents.
660
+ """Get list of recently active agents.
665
661
 
666
662
  Args:
667
663
  timeout_seconds: Consider agents inactive after this duration
668
664
 
669
665
  Returns:
670
666
  List of active agent IDs
667
+
671
668
  """
672
669
  cutoff = datetime.now()
673
670
  active = []
@@ -679,8 +676,7 @@ class AgentCoordinator:
679
676
  return active
680
677
 
681
678
  def broadcast(self, message_type: str, data: dict[str, Any]) -> bool:
682
- """
683
- Broadcast a message to all agents in the team.
679
+ """Broadcast a message to all agents in the team.
684
680
 
685
681
  Args:
686
682
  message_type: Type of message
@@ -688,22 +684,24 @@ class AgentCoordinator:
688
684
 
689
685
  Returns:
690
686
  True if broadcast sent
687
+
691
688
  """
692
- return self.memory.send_signal(
689
+ result = self.memory.send_signal(
693
690
  signal_type=message_type,
694
691
  data={"team_id": self.team_id, **data},
695
692
  credentials=self._credentials,
696
693
  )
694
+ return bool(result)
697
695
 
698
696
  def aggregate_results(self, task_type: str | None = None) -> dict[str, Any]:
699
- """
700
- Aggregate results from completed tasks.
697
+ """Aggregate results from completed tasks.
701
698
 
702
699
  Args:
703
700
  task_type: Optional filter by task type
704
701
 
705
702
  Returns:
706
703
  Aggregated results summary
704
+
707
705
  """
708
706
  # Get completion signals
709
707
  completions = self.memory.receive_signals(
@@ -711,7 +709,7 @@ class AgentCoordinator:
711
709
  signal_type="task_completed",
712
710
  )
713
711
 
714
- results = {
712
+ results: dict[str, Any] = {
715
713
  "total_completed": 0,
716
714
  "by_agent": {},
717
715
  "by_type": {},
@@ -738,8 +736,7 @@ class AgentCoordinator:
738
736
 
739
737
 
740
738
  class TeamSession:
741
- """
742
- A collaborative session for multiple agents working together.
739
+ """A collaborative session for multiple agents working together.
743
740
 
744
741
  Example:
745
742
  >>> from empathy_os import get_redis_memory, TeamSession
@@ -759,6 +756,7 @@ class TeamSession:
759
756
  >>>
760
757
  >>> # Get context from session
761
758
  >>> scope = session.get("analysis_scope")
759
+
762
760
  """
763
761
 
764
762
  def __init__(
@@ -767,13 +765,13 @@ class TeamSession:
767
765
  session_id: str,
768
766
  purpose: str = "",
769
767
  ):
770
- """
771
- Create or join a team session.
768
+ """Create or join a team session.
772
769
 
773
770
  Args:
774
771
  short_term_memory: RedisShortTermMemory instance
775
772
  session_id: Unique session identifier
776
773
  purpose: Description of what this session is for
774
+
777
775
  """
778
776
  from .redis_memory import AccessTier, AgentCredentials
779
777
 
@@ -798,15 +796,15 @@ class TeamSession:
798
796
  from .redis_memory import AccessTier, AgentCredentials
799
797
 
800
798
  agent_creds = AgentCredentials(agent_id=agent_id, tier=AccessTier.CONTRIBUTOR)
801
- return self.memory.join_session(self.session_id, agent_creds)
799
+ return bool(self.memory.join_session(self.session_id, agent_creds))
802
800
 
803
801
  def get_info(self) -> dict[str, Any] | None:
804
802
  """Get session info including participants."""
805
- return self.memory.get_session(self.session_id, self._credentials)
803
+ result = self.memory.get_session(self.session_id, self._credentials)
804
+ return dict(result) if result else None
806
805
 
807
806
  def share(self, key: str, data: Any) -> bool:
808
- """
809
- Share data with all agents in the session.
807
+ """Share data with all agents in the session.
810
808
 
811
809
  Args:
812
810
  key: Unique key for this data
@@ -814,22 +812,25 @@ class TeamSession:
814
812
 
815
813
  Returns:
816
814
  True if shared successfully
815
+
817
816
  """
818
- return self.memory.stash(
819
- f"session:{self.session_id}:{key}",
820
- data,
821
- self._credentials,
817
+ return bool(
818
+ self.memory.stash(
819
+ f"session:{self.session_id}:{key}",
820
+ data,
821
+ self._credentials,
822
+ ),
822
823
  )
823
824
 
824
825
  def get(self, key: str) -> Any | None:
825
- """
826
- Get shared data from the session.
826
+ """Get shared data from the session.
827
827
 
828
828
  Args:
829
829
  key: Key of the shared data
830
830
 
831
831
  Returns:
832
832
  The data, or None if not found
833
+
833
834
  """
834
835
  return self.memory.retrieve(
835
836
  f"session:{self.session_id}:{key}",
@@ -837,8 +838,7 @@ class TeamSession:
837
838
  )
838
839
 
839
840
  def signal(self, signal_type: str, data: dict[str, Any]) -> bool:
840
- """
841
- Send a signal to session participants.
841
+ """Send a signal to session participants.
842
842
 
843
843
  Args:
844
844
  signal_type: Type of signal
@@ -846,21 +846,25 @@ class TeamSession:
846
846
 
847
847
  Returns:
848
848
  True if sent
849
+
849
850
  """
850
- return self.memory.send_signal(
851
- signal_type=signal_type,
852
- data={"session_id": self.session_id, **data},
853
- credentials=self._credentials,
851
+ return bool(
852
+ self.memory.send_signal(
853
+ signal_type=signal_type,
854
+ data={"session_id": self.session_id, **data},
855
+ credentials=self._credentials,
856
+ ),
854
857
  )
855
858
 
856
859
  def get_signals(self, signal_type: str | None = None) -> list[dict]:
857
- """
858
- Get signals from the session.
860
+ """Get signals from the session.
859
861
 
860
862
  Args:
861
863
  signal_type: Optional filter
862
864
 
863
865
  Returns:
864
866
  List of signals
867
+
865
868
  """
866
- return self.memory.receive_signals(self._credentials, signal_type=signal_type)
869
+ result = self.memory.receive_signals(self._credentials, signal_type=signal_type)
870
+ return list(result) if result else []