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.
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/METADATA +7 -6
- empathy_framework-4.7.0.dist-info/RECORD +354 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/top_level.txt +0 -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.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/__init__.py +2 -12
- empathy_os/workflows/progressive/cli.py +14 -37
- empathy_os/workflows/progressive/core.py +12 -12
- empathy_os/workflows/progressive/orchestrator.py +166 -144
- empathy_os/workflows/progressive/reports.py +22 -31
- empathy_os/workflows/progressive/telemetry.py +8 -14
- empathy_os/workflows/progressive/test_gen.py +29 -48
- 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
- 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/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.0.dist-info}/WHEEL +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/entry_points.txt +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.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
|
-
}
|