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
@@ -44,11 +44,11 @@ SOCRATIC_TOOLS = [
44
44
  "properties": {
45
45
  "goal": {
46
46
  "type": "string",
47
- "description": "Optional initial goal. If not provided, session starts in AWAITING_GOAL state."
47
+ "description": "Optional initial goal. If not provided, session starts in AWAITING_GOAL state.",
48
48
  }
49
49
  },
50
- "required": []
51
- }
50
+ "required": [],
51
+ },
52
52
  },
53
53
  {
54
54
  "name": "socratic_set_goal",
@@ -56,31 +56,20 @@ SOCRATIC_TOOLS = [
56
56
  "inputSchema": {
57
57
  "type": "object",
58
58
  "properties": {
59
- "session_id": {
60
- "type": "string",
61
- "description": "The session ID to update"
62
- },
63
- "goal": {
64
- "type": "string",
65
- "description": "The user's goal in free-form text"
66
- }
59
+ "session_id": {"type": "string", "description": "The session ID to update"},
60
+ "goal": {"type": "string", "description": "The user's goal in free-form text"},
67
61
  },
68
- "required": ["session_id", "goal"]
69
- }
62
+ "required": ["session_id", "goal"],
63
+ },
70
64
  },
71
65
  {
72
66
  "name": "socratic_get_questions",
73
67
  "description": "Get the next set of clarifying questions for a session.",
74
68
  "inputSchema": {
75
69
  "type": "object",
76
- "properties": {
77
- "session_id": {
78
- "type": "string",
79
- "description": "The session ID"
80
- }
81
- },
82
- "required": ["session_id"]
83
- }
70
+ "properties": {"session_id": {"type": "string", "description": "The session ID"}},
71
+ "required": ["session_id"],
72
+ },
84
73
  },
85
74
  {
86
75
  "name": "socratic_submit_answers",
@@ -88,31 +77,23 @@ SOCRATIC_TOOLS = [
88
77
  "inputSchema": {
89
78
  "type": "object",
90
79
  "properties": {
91
- "session_id": {
92
- "type": "string",
93
- "description": "The session ID"
94
- },
80
+ "session_id": {"type": "string", "description": "The session ID"},
95
81
  "answers": {
96
82
  "type": "object",
97
- "description": "Dictionary of field_id -> answer value"
98
- }
83
+ "description": "Dictionary of field_id -> answer value",
84
+ },
99
85
  },
100
- "required": ["session_id", "answers"]
101
- }
86
+ "required": ["session_id", "answers"],
87
+ },
102
88
  },
103
89
  {
104
90
  "name": "socratic_generate_workflow",
105
91
  "description": "Generate the workflow once all questions are answered. Returns agent blueprints and success criteria.",
106
92
  "inputSchema": {
107
93
  "type": "object",
108
- "properties": {
109
- "session_id": {
110
- "type": "string",
111
- "description": "The session ID"
112
- }
113
- },
114
- "required": ["session_id"]
115
- }
94
+ "properties": {"session_id": {"type": "string", "description": "The session ID"}},
95
+ "required": ["session_id"],
96
+ },
116
97
  },
117
98
  {
118
99
  "name": "socratic_list_sessions",
@@ -123,11 +104,11 @@ SOCRATIC_TOOLS = [
123
104
  "status_filter": {
124
105
  "type": "string",
125
106
  "enum": ["all", "active", "completed"],
126
- "description": "Filter sessions by status"
107
+ "description": "Filter sessions by status",
127
108
  }
128
109
  },
129
- "required": []
130
- }
110
+ "required": [],
111
+ },
131
112
  },
132
113
  {
133
114
  "name": "socratic_get_session",
@@ -135,13 +116,10 @@ SOCRATIC_TOOLS = [
135
116
  "inputSchema": {
136
117
  "type": "object",
137
118
  "properties": {
138
- "session_id": {
139
- "type": "string",
140
- "description": "The session ID to retrieve"
141
- }
119
+ "session_id": {"type": "string", "description": "The session ID to retrieve"}
142
120
  },
143
- "required": ["session_id"]
144
- }
121
+ "required": ["session_id"],
122
+ },
145
123
  },
146
124
  {
147
125
  "name": "socratic_list_blueprints",
@@ -151,25 +129,20 @@ SOCRATIC_TOOLS = [
151
129
  "properties": {
152
130
  "domain_filter": {
153
131
  "type": "string",
154
- "description": "Optional domain to filter by (e.g., 'code_review', 'security')"
132
+ "description": "Optional domain to filter by (e.g., 'code_review', 'security')",
155
133
  }
156
134
  },
157
- "required": []
158
- }
135
+ "required": [],
136
+ },
159
137
  },
160
138
  {
161
139
  "name": "socratic_analyze_goal",
162
140
  "description": "Analyze a goal using LLM to detect domains, requirements, and ambiguities without starting a full session.",
163
141
  "inputSchema": {
164
142
  "type": "object",
165
- "properties": {
166
- "goal": {
167
- "type": "string",
168
- "description": "The goal to analyze"
169
- }
170
- },
171
- "required": ["goal"]
172
- }
143
+ "properties": {"goal": {"type": "string", "description": "The goal to analyze"}},
144
+ "required": ["goal"],
145
+ },
173
146
  },
174
147
  {
175
148
  "name": "socratic_recommend_agents",
@@ -180,22 +153,22 @@ SOCRATIC_TOOLS = [
180
153
  "domains": {
181
154
  "type": "array",
182
155
  "items": {"type": "string"},
183
- "description": "List of domains (e.g., ['code_review', 'security'])"
156
+ "description": "List of domains (e.g., ['code_review', 'security'])",
184
157
  },
185
158
  "languages": {
186
159
  "type": "array",
187
160
  "items": {"type": "string"},
188
- "description": "Programming languages involved"
161
+ "description": "Programming languages involved",
189
162
  },
190
163
  "quality_focus": {
191
164
  "type": "array",
192
165
  "items": {"type": "string"},
193
- "description": "Quality focus areas (e.g., ['security', 'performance'])"
194
- }
166
+ "description": "Quality focus areas (e.g., ['security', 'performance'])",
167
+ },
195
168
  },
196
- "required": ["domains"]
197
- }
198
- }
169
+ "required": ["domains"],
170
+ },
171
+ },
199
172
  ]
200
173
 
201
174
 
@@ -293,7 +266,7 @@ class SocraticMCPServer:
293
266
  result = {
294
267
  "session_id": session.session_id,
295
268
  "state": session.state.value,
296
- "message": "Session started successfully"
269
+ "message": "Session started successfully",
297
270
  }
298
271
 
299
272
  if goal:
@@ -341,7 +314,7 @@ class SocraticMCPServer:
341
314
  "primary_domain": analysis.primary_domain,
342
315
  "confidence": analysis.confidence,
343
316
  "ambiguities": analysis.ambiguities,
344
- "suggested_questions": analysis.suggested_questions[:3]
317
+ "suggested_questions": analysis.suggested_questions[:3],
345
318
  }
346
319
 
347
320
  return result
@@ -360,7 +333,7 @@ class SocraticMCPServer:
360
333
  "session_id": session_id,
361
334
  "state": session.state.value,
362
335
  "questions": [],
363
- "message": "No more questions - ready to generate workflow"
336
+ "message": "No more questions - ready to generate workflow",
364
337
  }
365
338
 
366
339
  # Convert form to JSON-serializable format
@@ -370,7 +343,7 @@ class SocraticMCPServer:
370
343
  "field_id": field.id,
371
344
  "type": field.field_type.value,
372
345
  "label": field.label,
373
- "required": field.validation.required if field.validation else False
346
+ "required": field.validation.required if field.validation else False,
374
347
  }
375
348
  if field.options:
376
349
  # Serialize FieldOption objects
@@ -391,7 +364,7 @@ class SocraticMCPServer:
391
364
  "state": session.state.value,
392
365
  "form_id": form.id,
393
366
  "form_title": form.title,
394
- "questions": questions
367
+ "questions": questions,
395
368
  }
396
369
 
397
370
  async def _handle_submit_answers(self, args: dict[str, Any]) -> dict[str, Any]:
@@ -415,7 +388,7 @@ class SocraticMCPServer:
415
388
  "session_id": session_id,
416
389
  "state": session.state.value,
417
390
  "ready_to_generate": ready,
418
- "message": "Ready to generate workflow" if ready else "More questions available"
391
+ "message": "Ready to generate workflow" if ready else "More questions available",
419
392
  }
420
393
 
421
394
  async def _handle_generate_workflow(self, args: dict[str, Any]) -> dict[str, Any]:
@@ -427,10 +400,7 @@ class SocraticMCPServer:
427
400
  return {"error": f"Session not found: {session_id}"}
428
401
 
429
402
  if not self._builder.is_ready_to_generate(session):
430
- return {
431
- "error": "Session not ready for generation",
432
- "state": session.state.value
433
- }
403
+ return {"error": "Session not ready for generation", "state": session.state.value}
434
404
 
435
405
  workflow = self._builder.generate_workflow(session)
436
406
 
@@ -442,32 +412,38 @@ class SocraticMCPServer:
442
412
  # Convert to JSON-serializable format
443
413
  agents = []
444
414
  for agent in workflow.blueprint.agents:
445
- agents.append({
446
- "agent_id": agent.agent_id,
447
- "name": agent.name,
448
- "role": agent.role.value,
449
- "description": agent.description,
450
- "tools": [t.tool_id for t in agent.tools]
451
- })
415
+ agents.append(
416
+ {
417
+ "agent_id": agent.agent_id,
418
+ "name": agent.name,
419
+ "role": agent.role.value,
420
+ "description": agent.description,
421
+ "tools": [t.tool_id for t in agent.tools],
422
+ }
423
+ )
452
424
 
453
425
  stages = []
454
426
  for stage in workflow.blueprint.stages:
455
- stages.append({
456
- "stage_id": stage.stage_id,
457
- "name": stage.name,
458
- "agent_ids": stage.agent_ids,
459
- "dependencies": stage.dependencies
460
- })
427
+ stages.append(
428
+ {
429
+ "stage_id": stage.stage_id,
430
+ "name": stage.name,
431
+ "agent_ids": stage.agent_ids,
432
+ "dependencies": stage.dependencies,
433
+ }
434
+ )
461
435
 
462
436
  metrics = []
463
437
  for metric in workflow.success_criteria.metrics:
464
- metrics.append({
465
- "metric_id": metric.metric_id,
466
- "name": metric.name,
467
- "description": metric.description,
468
- "type": metric.metric_type.value,
469
- "target": metric.target_value
470
- })
438
+ metrics.append(
439
+ {
440
+ "metric_id": metric.metric_id,
441
+ "name": metric.name,
442
+ "description": metric.description,
443
+ "type": metric.metric_type.value,
444
+ "target": metric.target_value,
445
+ }
446
+ )
471
447
 
472
448
  return {
473
449
  "session_id": session_id,
@@ -476,7 +452,7 @@ class SocraticMCPServer:
476
452
  "agents": agents,
477
453
  "stages": stages,
478
454
  "success_metrics": metrics,
479
- "state": session.state.value
455
+ "state": session.state.value,
480
456
  }
481
457
 
482
458
  async def _handle_list_sessions(self, args: dict[str, Any]) -> dict[str, Any]:
@@ -499,17 +475,18 @@ class SocraticMCPServer:
499
475
  # Add in-memory sessions not yet persisted
500
476
  for sid, session in self._sessions.items():
501
477
  if not any(s.get("session_id") == sid for s in sessions):
502
- sessions.append({
503
- "session_id": session.session_id,
504
- "state": session.state.value,
505
- "goal": session.goal,
506
- "created_at": session.created_at.isoformat() if session.created_at else None
507
- })
478
+ sessions.append(
479
+ {
480
+ "session_id": session.session_id,
481
+ "state": session.state.value,
482
+ "goal": session.goal,
483
+ "created_at": (
484
+ session.created_at.isoformat() if session.created_at else None
485
+ ),
486
+ }
487
+ )
508
488
 
509
- return {
510
- "sessions": sessions,
511
- "count": len(sessions)
512
- }
489
+ return {"sessions": sessions, "count": len(sessions)}
513
490
 
514
491
  async def _handle_get_session(self, args: dict[str, Any]) -> dict[str, Any]:
515
492
  """Get session details."""
@@ -525,7 +502,7 @@ class SocraticMCPServer:
525
502
  "goal": session.goal,
526
503
  "question_rounds": session.question_rounds,
527
504
  "created_at": session.created_at.isoformat() if session.created_at else None,
528
- "updated_at": session.updated_at.isoformat() if session.updated_at else None
505
+ "updated_at": session.updated_at.isoformat() if session.updated_at else None,
529
506
  }
530
507
  # Add domain from goal_analysis if available
531
508
  if session.goal_analysis:
@@ -547,10 +524,7 @@ class SocraticMCPServer:
547
524
  continue
548
525
  blueprints.append(bp)
549
526
 
550
- return {
551
- "blueprints": blueprints,
552
- "count": len(blueprints)
553
- }
527
+ return {"blueprints": blueprints, "count": len(blueprints)}
554
528
 
555
529
  async def _handle_analyze_goal(self, args: dict[str, Any]) -> dict[str, Any]:
556
530
  """Analyze a goal without starting a session."""
@@ -569,18 +543,14 @@ class SocraticMCPServer:
569
543
  "ambiguities": analysis.ambiguities,
570
544
  "suggested_questions": analysis.suggested_questions,
571
545
  "suggested_agents": analysis.suggested_agents,
572
- "analysis_method": "llm"
546
+ "analysis_method": "llm",
573
547
  }
574
548
  except Exception as e:
575
549
  logger.warning(f"LLM analysis failed: {e}")
576
550
 
577
551
  # Fallback to keyword-based analysis
578
552
  domains = self._builder._detect_domains(goal)
579
- return {
580
- "goal": goal,
581
- "detected_domains": list(domains),
582
- "analysis_method": "keyword"
583
- }
553
+ return {"goal": goal, "detected_domains": list(domains), "analysis_method": "keyword"}
584
554
 
585
555
  async def _handle_recommend_agents(self, args: dict[str, Any]) -> dict[str, Any]:
586
556
  """Get agent recommendations."""
@@ -594,11 +564,7 @@ class SocraticMCPServer:
594
564
  # Use adaptive generator if feedback available
595
565
  if self._feedback_loop:
596
566
  adaptive_gen = AdaptiveAgentGenerator(self._feedback_loop.collector)
597
- context = {
598
- "domains": domains,
599
- "languages": languages,
600
- "quality_focus": quality_focus
601
- }
567
+ context = {"domains": domains, "languages": languages, "quality_focus": quality_focus}
602
568
  recommendations = adaptive_gen.recommend_agents(context)
603
569
  else:
604
570
  # Use basic generator
@@ -607,16 +573,9 @@ class SocraticMCPServer:
607
573
  for domain in domains:
608
574
  templates = generator._get_templates_for_domain(domain)
609
575
  for t in templates:
610
- recommendations.append({
611
- "template_id": t,
612
- "domain": domain,
613
- "confidence": 0.8
614
- })
576
+ recommendations.append({"template_id": t, "domain": domain, "confidence": 0.8})
615
577
 
616
- return {
617
- "recommendations": recommendations,
618
- "count": len(recommendations)
619
- }
578
+ return {"recommendations": recommendations, "count": len(recommendations)}
620
579
 
621
580
  def _get_session(self, session_id: str):
622
581
  """Get session from memory or storage."""
@@ -646,7 +605,9 @@ async def run_mcp_server():
646
605
  writer_transport, writer_protocol = await asyncio.get_event_loop().connect_write_pipe(
647
606
  asyncio.streams.FlowControlMixin, sys.stdout
648
607
  )
649
- writer = asyncio.StreamWriter(writer_transport, writer_protocol, reader, asyncio.get_event_loop())
608
+ writer = asyncio.StreamWriter(
609
+ writer_transport, writer_protocol, reader, asyncio.get_event_loop()
610
+ )
650
611
 
651
612
  async def send_response(response: dict):
652
613
  """Send a JSON-RPC response."""
@@ -667,26 +628,15 @@ async def run_mcp_server():
667
628
  "id": msg_id,
668
629
  "result": {
669
630
  "protocolVersion": MCP_VERSION,
670
- "capabilities": {
671
- "tools": {}
672
- },
673
- "serverInfo": {
674
- "name": "socratic-workflow-builder",
675
- "version": "1.0.0"
676
- }
677
- }
631
+ "capabilities": {"tools": {}},
632
+ "serverInfo": {"name": "socratic-workflow-builder", "version": "1.0.0"},
633
+ },
678
634
  }
679
635
  await send_response(response)
680
636
 
681
637
  elif method == "tools/list":
682
638
  # List available tools
683
- response = {
684
- "jsonrpc": "2.0",
685
- "id": msg_id,
686
- "result": {
687
- "tools": SOCRATIC_TOOLS
688
- }
689
- }
639
+ response = {"jsonrpc": "2.0", "id": msg_id, "result": {"tools": SOCRATIC_TOOLS}}
690
640
  await send_response(response)
691
641
 
692
642
  elif method == "tools/call":
@@ -699,14 +649,7 @@ async def run_mcp_server():
699
649
  response = {
700
650
  "jsonrpc": "2.0",
701
651
  "id": msg_id,
702
- "result": {
703
- "content": [
704
- {
705
- "type": "text",
706
- "text": json.dumps(result, indent=2)
707
- }
708
- ]
709
- }
652
+ "result": {"content": [{"type": "text", "text": json.dumps(result, indent=2)}]},
710
653
  }
711
654
  await send_response(response)
712
655
 
@@ -719,10 +662,7 @@ async def run_mcp_server():
719
662
  response = {
720
663
  "jsonrpc": "2.0",
721
664
  "id": msg_id,
722
- "error": {
723
- "code": -32601,
724
- "message": f"Method not found: {method}"
725
- }
665
+ "error": {"code": -32601, "message": f"Method not found: {method}"},
726
666
  }
727
667
  await send_response(response)
728
668
 
@@ -749,7 +689,7 @@ def main():
749
689
  logging.basicConfig(
750
690
  level=logging.INFO,
751
691
  format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
752
- stream=sys.stderr # Log to stderr, MCP uses stdout
692
+ stream=sys.stderr, # Log to stderr, MCP uses stdout
753
693
  )
754
694
 
755
695
  try:
@@ -210,12 +210,14 @@ class SocraticSession:
210
210
  answers: dict[str, Any],
211
211
  ) -> None:
212
212
  """Record a round of questions and answers."""
213
- self.question_rounds.append({
214
- "round": self.current_round,
215
- "questions": questions,
216
- "answers": answers,
217
- "timestamp": datetime.now().isoformat(),
218
- })
213
+ self.question_rounds.append(
214
+ {
215
+ "round": self.current_round,
216
+ "questions": questions,
217
+ "answers": answers,
218
+ "timestamp": datetime.now().isoformat(),
219
+ }
220
+ )
219
221
  self.current_round += 1
220
222
  self.touch()
221
223
 
@@ -239,13 +241,17 @@ class SocraticSession:
239
241
  "created_at": self.created_at.isoformat(),
240
242
  "updated_at": self.updated_at.isoformat(),
241
243
  "goal": self.goal,
242
- "goal_analysis": {
243
- "intent": self.goal_analysis.intent,
244
- "domain": self.goal_analysis.domain,
245
- "confidence": self.goal_analysis.confidence,
246
- "ambiguities": self.goal_analysis.ambiguities,
247
- "assumptions": self.goal_analysis.assumptions,
248
- } if self.goal_analysis else None,
244
+ "goal_analysis": (
245
+ {
246
+ "intent": self.goal_analysis.intent,
247
+ "domain": self.goal_analysis.domain,
248
+ "confidence": self.goal_analysis.confidence,
249
+ "ambiguities": self.goal_analysis.ambiguities,
250
+ "assumptions": self.goal_analysis.assumptions,
251
+ }
252
+ if self.goal_analysis
253
+ else None
254
+ ),
249
255
  "requirements": {
250
256
  "must_have": self.requirements.must_have,
251
257
  "should_have": self.requirements.should_have,