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.
- empathy_framework-4.7.1.dist-info/METADATA +690 -0
- empathy_framework-4.7.1.dist-info/RECORD +379 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/top_level.txt +1 -2
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
- empathy_llm_toolkit/agent_factory/__init__.py +6 -6
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
- empathy_llm_toolkit/agents_md/__init__.py +22 -0
- empathy_llm_toolkit/agents_md/loader.py +218 -0
- empathy_llm_toolkit/agents_md/parser.py +271 -0
- empathy_llm_toolkit/agents_md/registry.py +307 -0
- empathy_llm_toolkit/commands/__init__.py +51 -0
- empathy_llm_toolkit/commands/context.py +375 -0
- empathy_llm_toolkit/commands/loader.py +301 -0
- empathy_llm_toolkit/commands/models.py +231 -0
- empathy_llm_toolkit/commands/parser.py +371 -0
- empathy_llm_toolkit/commands/registry.py +429 -0
- empathy_llm_toolkit/config/__init__.py +8 -8
- empathy_llm_toolkit/config/unified.py +3 -7
- empathy_llm_toolkit/context/__init__.py +22 -0
- empathy_llm_toolkit/context/compaction.py +455 -0
- empathy_llm_toolkit/context/manager.py +434 -0
- empathy_llm_toolkit/hooks/__init__.py +24 -0
- empathy_llm_toolkit/hooks/config.py +306 -0
- empathy_llm_toolkit/hooks/executor.py +289 -0
- empathy_llm_toolkit/hooks/registry.py +302 -0
- empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
- empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
- empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
- empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
- empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
- empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
- empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
- empathy_llm_toolkit/learning/__init__.py +30 -0
- empathy_llm_toolkit/learning/evaluator.py +438 -0
- empathy_llm_toolkit/learning/extractor.py +514 -0
- empathy_llm_toolkit/learning/storage.py +560 -0
- empathy_llm_toolkit/providers.py +4 -11
- empathy_llm_toolkit/security/__init__.py +17 -17
- empathy_llm_toolkit/utils/tokens.py +2 -5
- empathy_os/__init__.py +202 -70
- empathy_os/cache_monitor.py +5 -3
- empathy_os/cli/__init__.py +11 -55
- empathy_os/cli/__main__.py +29 -15
- empathy_os/cli/commands/inspection.py +21 -12
- empathy_os/cli/commands/memory.py +4 -12
- empathy_os/cli/commands/profiling.py +198 -0
- empathy_os/cli/commands/utilities.py +27 -7
- empathy_os/cli.py +28 -57
- empathy_os/cli_unified.py +525 -1164
- empathy_os/cost_tracker.py +9 -3
- empathy_os/dashboard/server.py +200 -2
- empathy_os/hot_reload/__init__.py +7 -7
- empathy_os/hot_reload/config.py +6 -7
- empathy_os/hot_reload/integration.py +35 -35
- empathy_os/hot_reload/reloader.py +57 -57
- empathy_os/hot_reload/watcher.py +28 -28
- empathy_os/hot_reload/websocket.py +2 -2
- empathy_os/memory/__init__.py +11 -4
- empathy_os/memory/claude_memory.py +1 -1
- empathy_os/memory/cross_session.py +8 -12
- empathy_os/memory/edges.py +6 -6
- empathy_os/memory/file_session.py +770 -0
- empathy_os/memory/graph.py +30 -30
- empathy_os/memory/nodes.py +6 -6
- empathy_os/memory/short_term.py +15 -9
- empathy_os/memory/unified.py +606 -140
- empathy_os/meta_workflows/agent_creator.py +3 -9
- empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
- empathy_os/meta_workflows/form_engine.py +6 -18
- empathy_os/meta_workflows/intent_detector.py +64 -24
- empathy_os/meta_workflows/models.py +3 -1
- empathy_os/meta_workflows/pattern_learner.py +13 -31
- empathy_os/meta_workflows/plan_generator.py +55 -47
- empathy_os/meta_workflows/session_context.py +2 -3
- empathy_os/meta_workflows/workflow.py +20 -51
- empathy_os/models/cli.py +2 -2
- empathy_os/models/tasks.py +1 -2
- empathy_os/models/telemetry.py +4 -1
- empathy_os/models/token_estimator.py +3 -1
- empathy_os/monitoring/alerts.py +938 -9
- empathy_os/monitoring/alerts_cli.py +346 -183
- empathy_os/orchestration/execution_strategies.py +12 -29
- empathy_os/orchestration/pattern_learner.py +20 -26
- empathy_os/orchestration/real_tools.py +6 -15
- empathy_os/platform_utils.py +2 -1
- empathy_os/plugins/__init__.py +2 -2
- empathy_os/plugins/base.py +64 -64
- empathy_os/plugins/registry.py +32 -32
- empathy_os/project_index/index.py +49 -15
- empathy_os/project_index/models.py +1 -2
- empathy_os/project_index/reports.py +1 -1
- empathy_os/project_index/scanner.py +1 -0
- empathy_os/redis_memory.py +10 -7
- empathy_os/resilience/__init__.py +1 -1
- empathy_os/resilience/health.py +10 -10
- empathy_os/routing/__init__.py +7 -7
- empathy_os/routing/chain_executor.py +37 -37
- empathy_os/routing/classifier.py +36 -36
- empathy_os/routing/smart_router.py +40 -40
- empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
- empathy_os/scaffolding/__init__.py +8 -8
- empathy_os/scaffolding/__main__.py +1 -1
- empathy_os/scaffolding/cli.py +28 -28
- empathy_os/socratic/__init__.py +3 -19
- empathy_os/socratic/ab_testing.py +25 -36
- empathy_os/socratic/blueprint.py +38 -38
- empathy_os/socratic/cli.py +34 -20
- empathy_os/socratic/collaboration.py +30 -28
- empathy_os/socratic/domain_templates.py +9 -1
- empathy_os/socratic/embeddings.py +17 -13
- empathy_os/socratic/engine.py +135 -70
- empathy_os/socratic/explainer.py +70 -60
- empathy_os/socratic/feedback.py +24 -19
- empathy_os/socratic/forms.py +15 -10
- empathy_os/socratic/generator.py +51 -35
- empathy_os/socratic/llm_analyzer.py +25 -23
- empathy_os/socratic/mcp_server.py +99 -159
- empathy_os/socratic/session.py +19 -13
- empathy_os/socratic/storage.py +98 -67
- empathy_os/socratic/success.py +38 -27
- empathy_os/socratic/visual_editor.py +51 -39
- empathy_os/socratic/web_ui.py +99 -66
- empathy_os/telemetry/cli.py +3 -1
- empathy_os/telemetry/usage_tracker.py +1 -3
- empathy_os/test_generator/__init__.py +3 -3
- empathy_os/test_generator/cli.py +28 -28
- empathy_os/test_generator/generator.py +64 -66
- empathy_os/test_generator/risk_analyzer.py +11 -11
- empathy_os/vscode_bridge 2.py +173 -0
- empathy_os/vscode_bridge.py +173 -0
- empathy_os/workflows/__init__.py +212 -120
- empathy_os/workflows/batch_processing.py +8 -24
- empathy_os/workflows/bug_predict.py +1 -1
- empathy_os/workflows/code_review.py +20 -5
- empathy_os/workflows/code_review_pipeline.py +13 -8
- empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
- empathy_os/workflows/manage_documentation.py +1 -0
- empathy_os/workflows/orchestrated_health_check.py +6 -11
- empathy_os/workflows/orchestrated_release_prep.py +3 -3
- empathy_os/workflows/pr_review.py +18 -10
- empathy_os/workflows/progressive/README 2.md +454 -0
- empathy_os/workflows/progressive/__init__ 2.py +92 -0
- empathy_os/workflows/progressive/__init__.py +2 -12
- empathy_os/workflows/progressive/cli 2.py +242 -0
- empathy_os/workflows/progressive/cli.py +14 -37
- empathy_os/workflows/progressive/core 2.py +488 -0
- empathy_os/workflows/progressive/core.py +12 -12
- empathy_os/workflows/progressive/orchestrator 2.py +701 -0
- empathy_os/workflows/progressive/orchestrator.py +166 -144
- empathy_os/workflows/progressive/reports 2.py +528 -0
- empathy_os/workflows/progressive/reports.py +22 -31
- empathy_os/workflows/progressive/telemetry 2.py +280 -0
- empathy_os/workflows/progressive/telemetry.py +8 -14
- empathy_os/workflows/progressive/test_gen 2.py +514 -0
- empathy_os/workflows/progressive/test_gen.py +29 -48
- empathy_os/workflows/progressive/workflow 2.py +628 -0
- empathy_os/workflows/progressive/workflow.py +31 -70
- empathy_os/workflows/release_prep.py +21 -6
- empathy_os/workflows/release_prep_crew.py +1 -0
- empathy_os/workflows/secure_release.py +13 -6
- empathy_os/workflows/security_audit.py +8 -3
- empathy_os/workflows/test_coverage_boost_crew.py +3 -2
- empathy_os/workflows/test_maintenance_crew.py +1 -0
- empathy_os/workflows/test_runner.py +16 -12
- empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
- empathy_software_plugin/cli.py +0 -122
- patterns/README.md +119 -0
- patterns/__init__.py +95 -0
- patterns/behavior.py +298 -0
- patterns/code_review_memory.json +441 -0
- patterns/core.py +97 -0
- patterns/debugging.json +3763 -0
- patterns/empathy.py +268 -0
- patterns/health_check_memory.json +505 -0
- patterns/input.py +161 -0
- patterns/memory_graph.json +8 -0
- patterns/refactoring_memory.json +1113 -0
- patterns/registry.py +663 -0
- patterns/security_memory.json +8 -0
- patterns/structural.py +415 -0
- patterns/validation.py +194 -0
- coach_wizards/__init__.py +0 -45
- coach_wizards/accessibility_wizard.py +0 -91
- coach_wizards/api_wizard.py +0 -91
- coach_wizards/base_wizard.py +0 -209
- coach_wizards/cicd_wizard.py +0 -91
- coach_wizards/code_reviewer_README.md +0 -60
- coach_wizards/code_reviewer_wizard.py +0 -180
- coach_wizards/compliance_wizard.py +0 -91
- coach_wizards/database_wizard.py +0 -91
- coach_wizards/debugging_wizard.py +0 -91
- coach_wizards/documentation_wizard.py +0 -91
- coach_wizards/generate_wizards.py +0 -347
- coach_wizards/localization_wizard.py +0 -173
- coach_wizards/migration_wizard.py +0 -91
- coach_wizards/monitoring_wizard.py +0 -91
- coach_wizards/observability_wizard.py +0 -91
- coach_wizards/performance_wizard.py +0 -91
- coach_wizards/prompt_engineering_wizard.py +0 -661
- coach_wizards/refactoring_wizard.py +0 -91
- coach_wizards/scaling_wizard.py +0 -90
- coach_wizards/security_wizard.py +0 -92
- coach_wizards/testing_wizard.py +0 -91
- empathy_framework-4.6.6.dist-info/METADATA +0 -1597
- empathy_framework-4.6.6.dist-info/RECORD +0 -410
- empathy_llm_toolkit/wizards/__init__.py +0 -43
- empathy_llm_toolkit/wizards/base_wizard.py +0 -364
- empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
- empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
- empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
- empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
- empathy_os/wizard_factory_cli.py +0 -170
- empathy_software_plugin/wizards/__init__.py +0 -42
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
- empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
- empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
- empathy_software_plugin/wizards/base_wizard.py +0 -288
- empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
- empathy_software_plugin/wizards/code_review_wizard.py +0 -604
- empathy_software_plugin/wizards/debugging/__init__.py +0 -50
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
- empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
- empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
- empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
- empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
- empathy_software_plugin/wizards/debugging/verification.py +0 -369
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
- empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
- empathy_software_plugin/wizards/performance/__init__.py +0 -9
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
- empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
- empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
- empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
- empathy_software_plugin/wizards/security/__init__.py +0 -32
- empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
- empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
- empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
- empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
- empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
- empathy_software_plugin/wizards/testing/__init__.py +0 -27
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
- empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
- empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
- empathy_software_plugin/wizards/testing_wizard.py +0 -274
- wizards/__init__.py +0 -82
- wizards/admission_assessment_wizard.py +0 -644
- wizards/care_plan.py +0 -321
- wizards/clinical_assessment.py +0 -769
- wizards/discharge_planning.py +0 -77
- wizards/discharge_summary_wizard.py +0 -468
- wizards/dosage_calculation.py +0 -497
- wizards/incident_report_wizard.py +0 -454
- wizards/medication_reconciliation.py +0 -85
- wizards/nursing_assessment.py +0 -171
- wizards/patient_education.py +0 -654
- wizards/quality_improvement.py +0 -705
- wizards/sbar_report.py +0 -324
- wizards/sbar_wizard.py +0 -608
- wizards/shift_handoff_wizard.py +0 -535
- wizards/soap_note_wizard.py +0 -679
- wizards/treatment_plan.py +0 -15
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/WHEEL +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/entry_points.txt +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.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
|
-
|
|
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
|
-
|
|
78
|
-
|
|
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
|
-
|
|
110
|
-
|
|
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
|
-
|
|
167
|
-
|
|
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
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
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
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
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
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
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
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
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(
|
|
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
|
-
|
|
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:
|
empathy_os/socratic/session.py
CHANGED
|
@@ -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
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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,
|