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
@@ -64,7 +64,9 @@ class AgentPerformance:
64
64
  return "insufficient_data"
65
65
 
66
66
  recent_5 = [s for _, s in self.recent_scores[-5:]]
67
- older_5 = [s for _, s in self.recent_scores[-10:-5]] if len(self.recent_scores) >= 10 else []
67
+ older_5 = (
68
+ [s for _, s in self.recent_scores[-10:-5]] if len(self.recent_scores) >= 10 else []
69
+ )
68
70
 
69
71
  if not older_5:
70
72
  return "stable"
@@ -343,12 +345,12 @@ class FeedbackCollector:
343
345
  if success:
344
346
  pattern.successes += 1
345
347
  # Rolling average
346
- pattern.average_score = (
347
- (pattern.average_score * (pattern.uses - 1) + score) / pattern.uses
348
- )
348
+ pattern.average_score = (pattern.average_score * (pattern.uses - 1) + score) / pattern.uses
349
349
 
350
350
  self._save_data()
351
- logger.info(f"Recorded feedback for blueprint {blueprint.id[:8]}: success={success}, score={score:.2f}")
351
+ logger.info(
352
+ f"Recorded feedback for blueprint {blueprint.id[:8]}: success={success}, score={score:.2f}"
353
+ )
352
354
 
353
355
  def _generate_pattern_id(self, blueprint: WorkflowBlueprint) -> str:
354
356
  """Generate a unique ID for a workflow pattern."""
@@ -444,8 +446,7 @@ class FeedbackCollector:
444
446
 
445
447
  # Top performing agents
446
448
  all_agents = [
447
- (tid, perf) for tid, perf in self._agent_performance.items()
448
- if perf.total_uses >= 5
449
+ (tid, perf) for tid, perf in self._agent_performance.items() if perf.total_uses >= 5
449
450
  ]
450
451
  all_agents.sort(key=lambda x: x[1].average_score, reverse=True)
451
452
  insights["top_performing_agents"] = [
@@ -456,11 +457,13 @@ class FeedbackCollector:
456
457
  # Declining agents
457
458
  for tid, perf in self._agent_performance.items():
458
459
  if perf.trend == "declining" and perf.total_uses >= 5:
459
- insights["declining_agents"].append({
460
- "template_id": tid,
461
- "current_score": perf.average_score,
462
- "uses": perf.total_uses,
463
- })
460
+ insights["declining_agents"].append(
461
+ {
462
+ "template_id": tid,
463
+ "current_score": perf.average_score,
464
+ "uses": perf.total_uses,
465
+ }
466
+ )
464
467
 
465
468
  # Domain insights
466
469
  domains: dict[str, dict[str, Any]] = {}
@@ -602,7 +605,7 @@ class AdaptiveAgentGenerator:
602
605
  customizations={
603
606
  "languages": languages,
604
607
  "quality_focus": quality_focus,
605
- }
608
+ },
606
609
  )
607
610
  scored_base.append((new_agent, score))
608
611
  logger.info(f"Added high-performing agent '{tid}' based on feedback")
@@ -649,8 +652,11 @@ class AdaptiveAgentGenerator:
649
652
  {
650
653
  "template_id": tid,
651
654
  "score": score,
652
- "performance": self.feedback.get_agent_performance(tid).to_dict()
653
- if self.feedback.get_agent_performance(tid) else None,
655
+ "performance": (
656
+ self.feedback.get_agent_performance(tid).to_dict()
657
+ if self.feedback.get_agent_performance(tid)
658
+ else None
659
+ ),
654
660
  }
655
661
  for tid, score in best_agents
656
662
  ],
@@ -659,10 +665,9 @@ class AdaptiveAgentGenerator:
659
665
  "total_executions": sum(
660
666
  p.total_uses for p in self.feedback.get_all_performance().values()
661
667
  ),
662
- "agents_with_data": len([
663
- p for p in self.feedback.get_all_performance().values()
664
- if p.total_uses >= 5
665
- ]),
668
+ "agents_with_data": len(
669
+ [p for p in self.feedback.get_all_performance().values() if p.total_uses >= 5]
670
+ ),
666
671
  },
667
672
  }
668
673
 
@@ -200,6 +200,7 @@ class FormField:
200
200
  # Check pattern
201
201
  if v.pattern and isinstance(value, str):
202
202
  import re
203
+
203
204
  if not re.match(v.pattern, value):
204
205
  return False, v.error_message
205
206
 
@@ -347,16 +348,20 @@ class Form:
347
348
  "placeholder": f.placeholder,
348
349
  "default": f.default,
349
350
  "category": f.category,
350
- "options": [
351
- {
352
- "value": o.value,
353
- "label": o.label,
354
- "description": o.description,
355
- "icon": o.icon,
356
- "recommended": o.recommended,
357
- }
358
- for o in f.options
359
- ] if f.options else [],
351
+ "options": (
352
+ [
353
+ {
354
+ "value": o.value,
355
+ "label": o.label,
356
+ "description": o.description,
357
+ "icon": o.icon,
358
+ "recommended": o.recommended,
359
+ }
360
+ for o in f.options
361
+ ]
362
+ if f.options
363
+ else []
364
+ ),
360
365
  "validation": {
361
366
  "required": f.validation.required,
362
367
  "min_length": f.validation.min_length,
@@ -506,14 +506,16 @@ class AgentGenerator:
506
506
  # Build stage configuration
507
507
  stages_config = []
508
508
  for stage in blueprint.stages:
509
- stages_config.append({
510
- "id": stage.id,
511
- "name": stage.name,
512
- "agents": stage.agent_ids,
513
- "parallel": stage.parallel,
514
- "depends_on": stage.depends_on,
515
- "timeout": stage.timeout,
516
- })
509
+ stages_config.append(
510
+ {
511
+ "id": stage.id,
512
+ "name": stage.name,
513
+ "agents": stage.agent_ids,
514
+ "parallel": stage.parallel,
515
+ "depends_on": stage.depends_on,
516
+ "timeout": stage.timeout,
517
+ }
518
+ )
517
519
 
518
520
  return GeneratedWorkflow(
519
521
  blueprint=blueprint,
@@ -557,7 +559,11 @@ class AgentGenerator:
557
559
  Complete WorkflowBlueprint
558
560
  """
559
561
  # Group agents by role for staging
560
- analyzers = [a for a in agents if a.spec.role in (AgentRole.ANALYZER, AgentRole.REVIEWER, AgentRole.AUDITOR)]
562
+ analyzers = [
563
+ a
564
+ for a in agents
565
+ if a.spec.role in (AgentRole.ANALYZER, AgentRole.REVIEWER, AgentRole.AUDITOR)
566
+ ]
561
567
  generators = [a for a in agents if a.spec.role == AgentRole.GENERATOR]
562
568
  reporters = [a for a in agents if a.spec.role == AgentRole.REPORTER]
563
569
 
@@ -565,25 +571,29 @@ class AgentGenerator:
565
571
 
566
572
  # Stage 1: Analysis (parallel)
567
573
  if analyzers:
568
- stages.append(StageSpec(
569
- id="analysis",
570
- name="Analysis",
571
- description="Analyze code and identify issues",
572
- agent_ids=[a.spec.id for a in analyzers],
573
- parallel=True,
574
- output_aggregation="merge",
575
- ))
574
+ stages.append(
575
+ StageSpec(
576
+ id="analysis",
577
+ name="Analysis",
578
+ description="Analyze code and identify issues",
579
+ agent_ids=[a.spec.id for a in analyzers],
580
+ parallel=True,
581
+ output_aggregation="merge",
582
+ )
583
+ )
576
584
 
577
585
  # Stage 2: Generation (sequential, depends on analysis)
578
586
  if generators:
579
- stages.append(StageSpec(
580
- id="generation",
581
- name="Generation",
582
- description="Generate fixes and improvements",
583
- agent_ids=[a.spec.id for a in generators],
584
- parallel=False,
585
- depends_on=["analysis"] if analyzers else [],
586
- ))
587
+ stages.append(
588
+ StageSpec(
589
+ id="generation",
590
+ name="Generation",
591
+ description="Generate fixes and improvements",
592
+ agent_ids=[a.spec.id for a in generators],
593
+ parallel=False,
594
+ depends_on=["analysis"] if analyzers else [],
595
+ )
596
+ )
587
597
 
588
598
  # Stage 3: Synthesis (always last)
589
599
  if reporters:
@@ -593,14 +603,16 @@ class AgentGenerator:
593
603
  if generators:
594
604
  depends.append("generation")
595
605
 
596
- stages.append(StageSpec(
597
- id="synthesis",
598
- name="Synthesis",
599
- description="Synthesize findings into report",
600
- agent_ids=[a.spec.id for a in reporters],
601
- parallel=False,
602
- depends_on=depends,
603
- ))
606
+ stages.append(
607
+ StageSpec(
608
+ id="synthesis",
609
+ name="Synthesis",
610
+ description="Synthesize findings into report",
611
+ agent_ids=[a.spec.id for a in reporters],
612
+ parallel=False,
613
+ depends_on=depends,
614
+ )
615
+ )
604
616
 
605
617
  return WorkflowBlueprint(
606
618
  name=name,
@@ -667,8 +679,12 @@ class GeneratedWorkflow:
667
679
  for agent_id in agent_ids:
668
680
  # Find agent
669
681
  agent = next(
670
- (a for a in self.agents if hasattr(a, "role") and self._match_agent(a, agent_id)),
671
- None
682
+ (
683
+ a
684
+ for a in self.agents
685
+ if hasattr(a, "role") and self._match_agent(a, agent_id)
686
+ ),
687
+ None,
672
688
  )
673
689
  if agent:
674
690
  # Execute agent (simplified)
@@ -15,13 +15,7 @@ import re
15
15
  from dataclasses import dataclass, field
16
16
  from typing import Any
17
17
 
18
- from .forms import (
19
- FieldOption,
20
- FieldType,
21
- FieldValidation,
22
- Form,
23
- FormField,
24
- )
18
+ from .forms import FieldOption, FieldType, FieldValidation, Form, FormField
25
19
  from .session import SocraticSession
26
20
 
27
21
  logger = logging.getLogger(__name__)
@@ -245,6 +239,7 @@ class LLMGoalAnalyzer:
245
239
  model_tier: Model tier (cheap, capable, premium)
246
240
  """
247
241
  import os
242
+
248
243
  self.api_key = api_key or os.environ.get("ANTHROPIC_API_KEY")
249
244
  self.provider = provider
250
245
  self.model_tier = model_tier
@@ -256,6 +251,7 @@ class LLMGoalAnalyzer:
256
251
  if self._client is None and self.api_key:
257
252
  try:
258
253
  import anthropic
254
+
259
255
  self._client = anthropic.Anthropic(api_key=self.api_key)
260
256
  except ImportError:
261
257
  logger.warning("anthropic package not installed")
@@ -266,6 +262,7 @@ class LLMGoalAnalyzer:
266
262
  if self._executor is None:
267
263
  try:
268
264
  from ..models.empathy_executor import EmpathyLLMExecutor
265
+
269
266
  self._executor = EmpathyLLMExecutor(provider=self.provider)
270
267
  except ImportError:
271
268
  logger.warning("EmpathyLLMExecutor not available, using mock")
@@ -310,7 +307,7 @@ class LLMGoalAnalyzer:
310
307
  prompt=prompt,
311
308
  system=system,
312
309
  )
313
- return response.content if hasattr(response, 'content') else str(response)
310
+ return response.content if hasattr(response, "content") else str(response)
314
311
 
315
312
  async def analyze_goal(self, goal: str) -> LLMAnalysisResult:
316
313
  """Analyze a goal using LLM.
@@ -559,6 +556,7 @@ class MockLLMExecutor:
559
556
 
560
557
  async def run(self, **kwargs) -> Any:
561
558
  """Return mock response."""
559
+
562
560
  @dataclass
563
561
  class MockResponse:
564
562
  content: str = "{}"
@@ -604,21 +602,25 @@ def llm_questions_to_form(
604
602
  if isinstance(opt, str):
605
603
  options.append(FieldOption(value=opt.lower().replace(" ", "_"), label=opt))
606
604
  elif isinstance(opt, dict):
607
- options.append(FieldOption(
608
- value=opt.get("value", opt.get("label", "").lower().replace(" ", "_")),
609
- label=opt.get("label", ""),
610
- description=opt.get("description", ""),
611
- ))
612
-
613
- fields.append(FormField(
614
- id=q_id,
615
- field_type=field_type,
616
- label=q.get("question", ""),
617
- options=options,
618
- validation=FieldValidation(required=q.get("required", False)),
619
- category=q.get("category", "general"),
620
- order=q.get("priority", 5),
621
- ))
605
+ options.append(
606
+ FieldOption(
607
+ value=opt.get("value", opt.get("label", "").lower().replace(" ", "_")),
608
+ label=opt.get("label", ""),
609
+ description=opt.get("description", ""),
610
+ )
611
+ )
612
+
613
+ fields.append(
614
+ FormField(
615
+ id=q_id,
616
+ field_type=field_type,
617
+ label=q.get("question", ""),
618
+ options=options,
619
+ validation=FieldValidation(required=q.get("required", False)),
620
+ category=q.get("category", "general"),
621
+ order=q.get("priority", 5),
622
+ )
623
+ )
622
624
 
623
625
  # Sort by priority (higher priority = lower order number = appears first)
624
626
  fields.sort(key=lambda f: f.order, reverse=True)