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
wizards/care_plan.py DELETED
@@ -1,321 +0,0 @@
1
- """
2
- Care Plan Wizard - AI Nurse Florence
3
- Following Wizard Pattern Implementation from coding instructions
4
- """
5
-
6
- import json
7
- import logging
8
- from datetime import datetime
9
- from typing import Any
10
- from uuid import uuid4
11
-
12
- from fastapi import APIRouter, HTTPException
13
- from pydantic import BaseModel
14
-
15
- from ...utils.config import get_educational_banner
16
-
17
- logger = logging.getLogger(__name__)
18
-
19
- # Redis import with fallback
20
- try:
21
- from src.utils.redis_cache import get_redis_client
22
-
23
- _has_redis = True
24
- except ImportError:
25
- _has_redis = False
26
-
27
- router = APIRouter(
28
- prefix="/wizard/care-plan",
29
- tags=["wizards", "care-plan"],
30
- responses={
31
- 404: {"description": "Wizard session not found"},
32
- 422: {"description": "Invalid step data"},
33
- },
34
- )
35
-
36
- # Session storage (Redis in production, memory for development)
37
- _wizard_sessions: dict[str, dict[str, Any]] = {}
38
-
39
-
40
- async def _store_wizard_session(wizard_id: str, session_data: dict[str, Any]):
41
- """Store wizard session in Redis or memory."""
42
- if _has_redis:
43
- try:
44
- redis_client = await get_redis_client()
45
- if redis_client:
46
- await redis_client.setex(
47
- f"wizard_session:{wizard_id}",
48
- 3600, # 1 hour expiry
49
- json.dumps(session_data),
50
- )
51
- return
52
- except Exception as e:
53
- logger.warning(f"Failed to store session in Redis: {e}")
54
-
55
- # Fallback to memory
56
- _wizard_sessions[wizard_id] = session_data
57
-
58
-
59
- async def _get_wizard_session(wizard_id: str) -> dict[str, Any] | None:
60
- """Retrieve wizard session from Redis or memory."""
61
- if _has_redis:
62
- try:
63
- redis_client = await get_redis_client()
64
- if redis_client:
65
- data = await redis_client.get(f"wizard_session:{wizard_id}")
66
- if data:
67
- return json.loads(data)
68
- except Exception as e:
69
- logger.warning(f"Failed to retrieve session from Redis: {e}")
70
-
71
- # Fallback to memory
72
- return _wizard_sessions.get(wizard_id)
73
-
74
-
75
- class CarePlanStepData(BaseModel):
76
- """Data model for care plan step submission."""
77
-
78
- step_data: dict[str, Any]
79
-
80
-
81
- @router.post("/start")
82
- async def start_care_plan():
83
- """Start care plan wizard following Wizard Pattern Implementation."""
84
- wizard_id = str(uuid4())
85
-
86
- session_data = {
87
- "wizard_id": wizard_id,
88
- "wizard_type": "care_plan",
89
- "created_at": datetime.now().isoformat(),
90
- "current_step": 1,
91
- "total_steps": 4,
92
- "completed": False,
93
- "completed_steps": [],
94
- "data": {},
95
- }
96
-
97
- await _store_wizard_session(wizard_id, session_data)
98
-
99
- return {
100
- "banner": get_educational_banner(),
101
- "wizard_id": wizard_id,
102
- "wizard_type": "care_plan",
103
- "current_step": 1,
104
- "total_steps": 4,
105
- "step_title": "Nursing Diagnoses",
106
- "step_description": "Identify NANDA-approved nursing diagnoses based on patient assessment",
107
- "educational_note": "Use NANDA-approved nursing diagnoses for standardized care planning.",
108
- }
109
-
110
-
111
- @router.post("/{wizard_id}/step")
112
- async def submit_care_plan_step(wizard_id: str, step_data: CarePlanStepData):
113
- """Submit care plan step data."""
114
- session = await _get_wizard_session(wizard_id)
115
- if not session:
116
- raise HTTPException(status_code=404, detail="Wizard session not found")
117
-
118
- if session.get("completed", False):
119
- raise HTTPException(status_code=422, detail="Care plan already completed")
120
-
121
- current_step = session["current_step"]
122
-
123
- # Store step data
124
- session["data"][f"step_{current_step}"] = step_data.step_data
125
-
126
- # Mark step as completed
127
- if current_step not in session["completed_steps"]:
128
- session["completed_steps"].append(current_step)
129
-
130
- # Advance to next step (no auto-complete - requires explicit approval)
131
- if current_step < session["total_steps"]:
132
- session["current_step"] = current_step + 1
133
- next_step_info = _get_step_info(current_step + 1)
134
- else:
135
- next_step_info = {
136
- "step_title": "Review & Finalize",
137
- "message": "Use /preview to generate report, then /save to finalize",
138
- }
139
-
140
- # Store updated session
141
- await _store_wizard_session(wizard_id, session)
142
-
143
- return {
144
- "banner": get_educational_banner(),
145
- "wizard_id": wizard_id,
146
- "step_completed": current_step,
147
- "current_step": session["current_step"],
148
- "total_steps": session["total_steps"],
149
- "progress": len(session["completed_steps"]) / session["total_steps"] * 100,
150
- "next_step": next_step_info,
151
- }
152
-
153
-
154
- @router.get("/{wizard_id}/status")
155
- async def get_care_plan_status(wizard_id: str):
156
- """Get care plan wizard status following Wizard Pattern Implementation."""
157
-
158
- session = await _get_wizard_session(wizard_id)
159
- if not session:
160
- raise HTTPException(status_code=404, detail="Wizard session not found")
161
-
162
- return {
163
- "banner": get_educational_banner(),
164
- "wizard_id": wizard_id,
165
- "wizard_type": session["wizard_type"],
166
- "current_step": session["current_step"],
167
- "total_steps": session["total_steps"],
168
- "completed_steps": session["completed_steps"],
169
- "completed": session.get("completed", False),
170
- "progress": len(session["completed_steps"]) / session["total_steps"] * 100,
171
- "status": "completed" if session.get("completed", False) else "in_progress",
172
- }
173
-
174
-
175
- @router.post("/{wizard_id}/preview")
176
- async def preview_care_plan(wizard_id: str):
177
- """
178
- Generate preview of care plan.
179
- This does NOT mark the plan as completed.
180
- Requires user to call /save endpoint with approval to finalize.
181
- """
182
- session = await _get_wizard_session(wizard_id)
183
- if not session:
184
- raise HTTPException(status_code=404, detail="Wizard session not found")
185
-
186
- if session.get("completed", False):
187
- raise HTTPException(status_code=422, detail="Care plan already completed")
188
-
189
- # Generate care plan preview
190
- collected_data = session["data"]
191
- preview_report = _generate_care_plan_report(collected_data)
192
-
193
- # Store preview in session (does NOT mark as completed)
194
- session["preview_report"] = preview_report
195
- session["preview_generated_at"] = datetime.now().isoformat()
196
-
197
- # Store updated session
198
- await _store_wizard_session(wizard_id, session)
199
-
200
- return {
201
- "banner": get_educational_banner(),
202
- "success": True,
203
- "wizard_id": wizard_id,
204
- "message": "Care plan preview generated. Please review and use /save endpoint to finalize.",
205
- "data": {"preview": preview_report, "generated_at": session["preview_generated_at"]},
206
- }
207
-
208
-
209
- @router.post("/{wizard_id}/save")
210
- async def save_care_plan(wizard_id: str, approval_data: dict[str, Any]):
211
- """
212
- Finalize and save care plan with user approval.
213
- Requires user_approved: true in request body.
214
- This is the ONLY endpoint that marks the care plan as completed.
215
- """
216
- session = await _get_wizard_session(wizard_id)
217
- if not session:
218
- raise HTTPException(status_code=404, detail="Wizard session not found")
219
-
220
- if session.get("completed", False):
221
- raise HTTPException(status_code=422, detail="Care plan already completed")
222
-
223
- # Require preview before save
224
- if "preview_report" not in session:
225
- raise HTTPException(
226
- status_code=422,
227
- detail="Must generate preview before saving. Call /preview endpoint first.",
228
- )
229
-
230
- # Require explicit user approval
231
- if not approval_data.get("user_approved", False):
232
- raise HTTPException(
233
- status_code=422,
234
- detail="User approval required. Set user_approved: true to finalize care plan.",
235
- )
236
-
237
- # Mark as completed with user approval
238
- session["completed"] = True
239
- session["completed_at"] = datetime.now().isoformat()
240
- session["user_approved"] = True
241
- session["approved_by"] = approval_data.get("approved_by", "Unknown user")
242
-
243
- # Store updated session
244
- await _store_wizard_session(wizard_id, session)
245
-
246
- return {
247
- "banner": get_educational_banner(),
248
- "success": True,
249
- "wizard_id": wizard_id,
250
- "message": "Care plan finalized and saved successfully.",
251
- "data": {
252
- "report": session["preview_report"],
253
- "completed_at": session["completed_at"],
254
- "user_approved": True,
255
- "approved_by": session["approved_by"],
256
- },
257
- }
258
-
259
-
260
- def _get_step_info(step_number: int) -> dict[str, Any]:
261
- """Get step configuration information."""
262
- steps = {
263
- 1: {
264
- "step_title": "Nursing Diagnoses",
265
- "step_description": "Identify NANDA-approved nursing diagnoses",
266
- "educational_note": "Use NANDA-I taxonomy for standardized diagnoses",
267
- },
268
- 2: {
269
- "step_title": "Goals & Outcomes",
270
- "step_description": "Define measurable patient goals and expected outcomes",
271
- "educational_note": "Goals should be SMART: Specific, Measurable, Achievable, Relevant, Time-bound",
272
- },
273
- 3: {
274
- "step_title": "Nursing Interventions",
275
- "step_description": "Plan evidence-based nursing interventions",
276
- "educational_note": "Include both independent and collaborative interventions",
277
- },
278
- 4: {
279
- "step_title": "Review & Finalize",
280
- "step_description": "Review complete care plan and finalize with approval",
281
- "educational_note": "Review all components before finalizing",
282
- "is_review_step": True,
283
- },
284
- }
285
- return steps.get(step_number, {})
286
-
287
-
288
- def _generate_care_plan_report(collected_data: dict[str, Any]) -> dict[str, Any]:
289
- """
290
- Generate formatted nursing care plan from collected data.
291
- Internal function used by /preview and /save endpoints.
292
- """
293
- step_1 = collected_data.get("step_1", {})
294
- step_2 = collected_data.get("step_2", {})
295
- step_3 = collected_data.get("step_3", {})
296
-
297
- narrative = f"""
298
- NURSING CARE PLAN
299
- {'=' * 80}
300
-
301
- CARE PLAN DATE: {datetime.now().strftime('%Y-%m-%d %H:%M')}
302
-
303
- NURSING DIAGNOSES
304
- {step_1.get('diagnoses', 'Not documented')}
305
-
306
- GOALS & EXPECTED OUTCOMES
307
- {step_2.get('goals', 'Not documented')}
308
-
309
- NURSING INTERVENTIONS
310
- {step_3.get('interventions', 'Not documented')}
311
-
312
- {'=' * 80}
313
- Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
314
- """
315
-
316
- return {
317
- "report_type": "care_plan",
318
- "narrative": narrative.strip(),
319
- "structured_data": {"diagnoses": step_1, "goals_outcomes": step_2, "interventions": step_3},
320
- "metadata": {"generated_at": datetime.now().isoformat(), "wizard_type": "care_plan"},
321
- }