empathy-framework 3.7.0__py3-none-any.whl → 3.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 (267) hide show
  1. coach_wizards/code_reviewer_README.md +60 -0
  2. coach_wizards/code_reviewer_wizard.py +180 -0
  3. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/METADATA +20 -2
  4. empathy_framework-3.7.1.dist-info/RECORD +327 -0
  5. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/top_level.txt +5 -1
  6. empathy_healthcare_plugin/monitors/__init__.py +9 -0
  7. empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
  8. empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
  9. empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
  10. empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
  11. empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
  12. empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
  13. empathy_llm_toolkit/agent_factory/__init__.py +53 -0
  14. empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
  15. empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
  16. empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
  17. empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
  18. empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
  19. empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
  20. empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
  21. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
  22. empathy_llm_toolkit/agent_factory/base.py +305 -0
  23. empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
  24. empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
  25. empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
  26. empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
  27. empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
  28. empathy_llm_toolkit/agent_factory/decorators.py +286 -0
  29. empathy_llm_toolkit/agent_factory/factory.py +558 -0
  30. empathy_llm_toolkit/agent_factory/framework.py +192 -0
  31. empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
  32. empathy_llm_toolkit/agent_factory/resilient.py +320 -0
  33. empathy_llm_toolkit/cli/__init__.py +8 -0
  34. empathy_llm_toolkit/cli/sync_claude.py +487 -0
  35. empathy_llm_toolkit/code_health.py +150 -3
  36. empathy_llm_toolkit/config/__init__.py +29 -0
  37. empathy_llm_toolkit/config/unified.py +295 -0
  38. empathy_llm_toolkit/routing/__init__.py +32 -0
  39. empathy_llm_toolkit/routing/model_router.py +362 -0
  40. empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
  41. empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
  42. empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
  43. empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
  44. empathy_llm_toolkit/security/README.md +262 -0
  45. empathy_llm_toolkit/security/__init__.py +62 -0
  46. empathy_llm_toolkit/security/audit_logger.py +929 -0
  47. empathy_llm_toolkit/security/audit_logger_example.py +152 -0
  48. empathy_llm_toolkit/security/pii_scrubber.py +640 -0
  49. empathy_llm_toolkit/security/secrets_detector.py +678 -0
  50. empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
  51. empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
  52. empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
  53. empathy_llm_toolkit/wizards/__init__.py +38 -0
  54. empathy_llm_toolkit/wizards/base_wizard.py +364 -0
  55. empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
  56. empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
  57. empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
  58. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
  59. empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
  60. empathy_os/__init__.py +52 -52
  61. empathy_os/adaptive/__init__.py +13 -0
  62. empathy_os/adaptive/task_complexity.py +127 -0
  63. empathy_os/cli.py +118 -8
  64. empathy_os/cli_unified.py +121 -1
  65. empathy_os/config/__init__.py +63 -0
  66. empathy_os/config/xml_config.py +239 -0
  67. empathy_os/dashboard/__init__.py +15 -0
  68. empathy_os/dashboard/server.py +743 -0
  69. empathy_os/memory/__init__.py +195 -0
  70. empathy_os/memory/claude_memory.py +466 -0
  71. empathy_os/memory/config.py +224 -0
  72. empathy_os/memory/control_panel.py +1298 -0
  73. empathy_os/memory/edges.py +179 -0
  74. empathy_os/memory/graph.py +567 -0
  75. empathy_os/memory/long_term.py +1193 -0
  76. empathy_os/memory/nodes.py +179 -0
  77. empathy_os/memory/redis_bootstrap.py +540 -0
  78. empathy_os/memory/security/__init__.py +31 -0
  79. empathy_os/memory/security/audit_logger.py +930 -0
  80. empathy_os/memory/security/pii_scrubber.py +640 -0
  81. empathy_os/memory/security/secrets_detector.py +678 -0
  82. empathy_os/memory/short_term.py +2119 -0
  83. empathy_os/memory/storage/__init__.py +15 -0
  84. empathy_os/memory/summary_index.py +583 -0
  85. empathy_os/memory/unified.py +619 -0
  86. empathy_os/metrics/__init__.py +12 -0
  87. empathy_os/metrics/prompt_metrics.py +190 -0
  88. empathy_os/models/__init__.py +136 -0
  89. empathy_os/models/__main__.py +13 -0
  90. empathy_os/models/cli.py +655 -0
  91. empathy_os/models/empathy_executor.py +354 -0
  92. empathy_os/models/executor.py +252 -0
  93. empathy_os/models/fallback.py +671 -0
  94. empathy_os/models/provider_config.py +563 -0
  95. empathy_os/models/registry.py +382 -0
  96. empathy_os/models/tasks.py +302 -0
  97. empathy_os/models/telemetry.py +548 -0
  98. empathy_os/models/token_estimator.py +378 -0
  99. empathy_os/models/validation.py +274 -0
  100. empathy_os/monitoring/__init__.py +52 -0
  101. empathy_os/monitoring/alerts.py +23 -0
  102. empathy_os/monitoring/alerts_cli.py +268 -0
  103. empathy_os/monitoring/multi_backend.py +271 -0
  104. empathy_os/monitoring/otel_backend.py +363 -0
  105. empathy_os/optimization/__init__.py +19 -0
  106. empathy_os/optimization/context_optimizer.py +272 -0
  107. empathy_os/plugins/__init__.py +28 -0
  108. empathy_os/plugins/base.py +361 -0
  109. empathy_os/plugins/registry.py +268 -0
  110. empathy_os/project_index/__init__.py +30 -0
  111. empathy_os/project_index/cli.py +335 -0
  112. empathy_os/project_index/crew_integration.py +430 -0
  113. empathy_os/project_index/index.py +425 -0
  114. empathy_os/project_index/models.py +501 -0
  115. empathy_os/project_index/reports.py +473 -0
  116. empathy_os/project_index/scanner.py +538 -0
  117. empathy_os/prompts/__init__.py +61 -0
  118. empathy_os/prompts/config.py +77 -0
  119. empathy_os/prompts/context.py +177 -0
  120. empathy_os/prompts/parser.py +285 -0
  121. empathy_os/prompts/registry.py +313 -0
  122. empathy_os/prompts/templates.py +208 -0
  123. empathy_os/resilience/__init__.py +56 -0
  124. empathy_os/resilience/circuit_breaker.py +256 -0
  125. empathy_os/resilience/fallback.py +179 -0
  126. empathy_os/resilience/health.py +300 -0
  127. empathy_os/resilience/retry.py +209 -0
  128. empathy_os/resilience/timeout.py +135 -0
  129. empathy_os/routing/__init__.py +43 -0
  130. empathy_os/routing/chain_executor.py +433 -0
  131. empathy_os/routing/classifier.py +217 -0
  132. empathy_os/routing/smart_router.py +234 -0
  133. empathy_os/routing/wizard_registry.py +307 -0
  134. empathy_os/trust/__init__.py +28 -0
  135. empathy_os/trust/circuit_breaker.py +579 -0
  136. empathy_os/validation/__init__.py +19 -0
  137. empathy_os/validation/xml_validator.py +281 -0
  138. empathy_os/wizard_factory_cli.py +170 -0
  139. empathy_os/workflows/__init__.py +360 -0
  140. empathy_os/workflows/base.py +1530 -0
  141. empathy_os/workflows/bug_predict.py +962 -0
  142. empathy_os/workflows/code_review.py +960 -0
  143. empathy_os/workflows/code_review_adapters.py +310 -0
  144. empathy_os/workflows/code_review_pipeline.py +720 -0
  145. empathy_os/workflows/config.py +600 -0
  146. empathy_os/workflows/dependency_check.py +648 -0
  147. empathy_os/workflows/document_gen.py +1069 -0
  148. empathy_os/workflows/documentation_orchestrator.py +1205 -0
  149. empathy_os/workflows/health_check.py +679 -0
  150. empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
  151. empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
  152. empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
  153. empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
  154. empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
  155. empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
  156. empathy_os/workflows/manage_documentation.py +804 -0
  157. empathy_os/workflows/new_sample_workflow1.py +146 -0
  158. empathy_os/workflows/new_sample_workflow1_README.md +150 -0
  159. empathy_os/workflows/perf_audit.py +687 -0
  160. empathy_os/workflows/pr_review.py +748 -0
  161. empathy_os/workflows/progress.py +445 -0
  162. empathy_os/workflows/progress_server.py +322 -0
  163. empathy_os/workflows/refactor_plan.py +691 -0
  164. empathy_os/workflows/release_prep.py +808 -0
  165. empathy_os/workflows/research_synthesis.py +404 -0
  166. empathy_os/workflows/secure_release.py +585 -0
  167. empathy_os/workflows/security_adapters.py +297 -0
  168. empathy_os/workflows/security_audit.py +1050 -0
  169. empathy_os/workflows/step_config.py +234 -0
  170. empathy_os/workflows/test5.py +125 -0
  171. empathy_os/workflows/test5_README.md +158 -0
  172. empathy_os/workflows/test_gen.py +1855 -0
  173. empathy_os/workflows/test_lifecycle.py +526 -0
  174. empathy_os/workflows/test_maintenance.py +626 -0
  175. empathy_os/workflows/test_maintenance_cli.py +590 -0
  176. empathy_os/workflows/test_maintenance_crew.py +821 -0
  177. empathy_os/workflows/xml_enhanced_crew.py +285 -0
  178. empathy_software_plugin/cli/__init__.py +120 -0
  179. empathy_software_plugin/cli/inspect.py +362 -0
  180. empathy_software_plugin/cli.py +3 -1
  181. empathy_software_plugin/wizards/__init__.py +42 -0
  182. empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
  183. empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
  184. empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
  185. empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
  186. empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
  187. empathy_software_plugin/wizards/base_wizard.py +288 -0
  188. empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
  189. empathy_software_plugin/wizards/code_review_wizard.py +606 -0
  190. empathy_software_plugin/wizards/debugging/__init__.py +50 -0
  191. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
  192. empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
  193. empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
  194. empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
  195. empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
  196. empathy_software_plugin/wizards/debugging/verification.py +369 -0
  197. empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
  198. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
  199. empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
  200. empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
  201. empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
  202. empathy_software_plugin/wizards/performance/__init__.py +9 -0
  203. empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
  204. empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
  205. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
  206. empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
  207. empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
  208. empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
  209. empathy_software_plugin/wizards/security/__init__.py +32 -0
  210. empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
  211. empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
  212. empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
  213. empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
  214. empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
  215. empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
  216. empathy_software_plugin/wizards/testing/__init__.py +27 -0
  217. empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
  218. empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
  219. empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
  220. empathy_software_plugin/wizards/testing_wizard.py +274 -0
  221. hot_reload/README.md +473 -0
  222. hot_reload/__init__.py +62 -0
  223. hot_reload/config.py +84 -0
  224. hot_reload/integration.py +228 -0
  225. hot_reload/reloader.py +298 -0
  226. hot_reload/watcher.py +179 -0
  227. hot_reload/websocket.py +176 -0
  228. scaffolding/README.md +589 -0
  229. scaffolding/__init__.py +35 -0
  230. scaffolding/__main__.py +14 -0
  231. scaffolding/cli.py +240 -0
  232. test_generator/__init__.py +38 -0
  233. test_generator/__main__.py +14 -0
  234. test_generator/cli.py +226 -0
  235. test_generator/generator.py +325 -0
  236. test_generator/risk_analyzer.py +216 -0
  237. workflow_patterns/__init__.py +33 -0
  238. workflow_patterns/behavior.py +249 -0
  239. workflow_patterns/core.py +76 -0
  240. workflow_patterns/output.py +99 -0
  241. workflow_patterns/registry.py +255 -0
  242. workflow_patterns/structural.py +288 -0
  243. workflow_scaffolding/__init__.py +11 -0
  244. workflow_scaffolding/__main__.py +12 -0
  245. workflow_scaffolding/cli.py +206 -0
  246. workflow_scaffolding/generator.py +265 -0
  247. agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
  248. agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
  249. agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
  250. agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
  251. agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
  252. agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
  253. agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
  254. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
  255. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
  256. agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
  257. agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
  258. agents/compliance_anticipation_agent.py +0 -1422
  259. agents/compliance_db.py +0 -339
  260. agents/epic_integration_wizard.py +0 -530
  261. agents/notifications.py +0 -291
  262. agents/trust_building_behaviors.py +0 -872
  263. empathy_framework-3.7.0.dist-info/RECORD +0 -105
  264. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/WHEEL +0 -0
  265. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/entry_points.txt +0 -0
  266. {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/licenses/LICENSE +0 -0
  267. /empathy_os/{monitoring.py → agent_monitoring.py} +0 -0
agents/compliance_db.py DELETED
@@ -1,339 +0,0 @@
1
- """Compliance Database with Append-Only Architecture.
2
-
3
- Provides immutable audit trail for healthcare compliance tracking.
4
- Supports INSERT operations only (no UPDATE/DELETE) for regulatory compliance.
5
-
6
- Copyright 2025 Smart-AI-Memory
7
- Licensed under Fair Source License 0.9
8
- """
9
-
10
- import sqlite3
11
- from collections.abc import Generator
12
- from contextlib import contextmanager
13
- from datetime import datetime
14
- from pathlib import Path
15
- from typing import Any
16
-
17
-
18
- class ComplianceDatabase:
19
- """SQLite database for compliance tracking with append-only operations.
20
-
21
- Features:
22
- - Immutable audit trail (INSERT only, no UPDATE/DELETE)
23
- - Audit date tracking
24
- - Compliance status monitoring
25
- - Gap detection and recording
26
- - Thread-safe operations
27
-
28
- Regulatory Compliance:
29
- - Append-only design satisfies HIPAA audit log requirements
30
- - No modification of historical records
31
- - Complete audit trail preservation
32
- """
33
-
34
- def __init__(self, db_path: str | None = None):
35
- """Initialize compliance database.
36
-
37
- Args:
38
- db_path: Path to SQLite database file.
39
- Defaults to agents/data/compliance.db
40
- """
41
- if db_path is None:
42
- # Default to agents/data/compliance.db
43
- agents_dir = Path(__file__).parent
44
- data_dir = agents_dir / "data"
45
- data_dir.mkdir(exist_ok=True)
46
- db_path = str(data_dir / "compliance.db")
47
-
48
- self.db_path = db_path
49
- self._init_schema()
50
-
51
- @contextmanager
52
- def _get_connection(self) -> Generator[sqlite3.Connection, None, None]:
53
- """Get database connection with automatic cleanup."""
54
- conn = sqlite3.connect(self.db_path, check_same_thread=False)
55
- conn.row_factory = sqlite3.Row # Enable dict-like access
56
- try:
57
- yield conn
58
- conn.commit()
59
- except Exception:
60
- conn.rollback()
61
- raise
62
- finally:
63
- conn.close()
64
-
65
- def _init_schema(self) -> None:
66
- """Initialize database schema if not exists."""
67
- with self._get_connection() as conn:
68
- conn.executescript(
69
- """
70
- CREATE TABLE IF NOT EXISTS compliance_audits (
71
- id INTEGER PRIMARY KEY AUTOINCREMENT,
72
- audit_date TIMESTAMP NOT NULL,
73
- audit_type TEXT NOT NULL, -- 'HIPAA', 'GDPR', 'SOC2', etc.
74
- findings TEXT, -- JSON string of findings
75
- risk_score INTEGER, -- 0-100
76
- auditor TEXT, -- Who performed the audit
77
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
78
- -- No updated_at field (immutable records)
79
- );
80
-
81
- CREATE TABLE IF NOT EXISTS compliance_gaps (
82
- id INTEGER PRIMARY KEY AUTOINCREMENT,
83
- gap_type TEXT NOT NULL, -- 'missing_policy', 'expired_cert', etc.
84
- severity TEXT NOT NULL, -- 'critical', 'high', 'medium', 'low'
85
- detected_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
86
- description TEXT,
87
- affected_systems TEXT, -- JSON string of affected systems
88
- compliance_framework TEXT, -- 'HIPAA', 'GDPR', etc.
89
- detection_source TEXT -- 'automated_scan', 'manual_review', etc.
90
- -- No status field (can't mark as "fixed", only add new record showing fix)
91
- );
92
-
93
- CREATE TABLE IF NOT EXISTS compliance_status (
94
- id INTEGER PRIMARY KEY AUTOINCREMENT,
95
- compliance_framework TEXT NOT NULL, -- 'HIPAA', 'GDPR', 'SOC2', etc.
96
- status TEXT NOT NULL, -- 'compliant', 'non_compliant', 'pending'
97
- effective_date TIMESTAMP NOT NULL,
98
- notes TEXT,
99
- recorded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
100
- );
101
-
102
- CREATE INDEX IF NOT EXISTS idx_audits_date ON compliance_audits(audit_date DESC);
103
- CREATE INDEX IF NOT EXISTS idx_gaps_severity ON compliance_gaps(severity, detected_at DESC);
104
- CREATE INDEX IF NOT EXISTS idx_status_framework ON compliance_status(compliance_framework, effective_date DESC);
105
- """
106
- )
107
-
108
- def record_audit(
109
- self,
110
- audit_date: datetime,
111
- audit_type: str,
112
- findings: str | None = None,
113
- risk_score: int | None = None,
114
- auditor: str | None = None,
115
- ) -> int:
116
- """Record a compliance audit (append-only).
117
-
118
- Args:
119
- audit_date: When the audit was performed
120
- audit_type: Type of audit ('HIPAA', 'GDPR', 'SOC2', etc.)
121
- findings: JSON string of audit findings
122
- risk_score: Risk score 0-100
123
- auditor: Who performed the audit
124
-
125
- Returns:
126
- Audit record ID
127
-
128
- Note:
129
- This is an append-only operation. Cannot modify existing audits.
130
- """
131
- with self._get_connection() as conn:
132
- cursor = conn.execute(
133
- """
134
- INSERT INTO compliance_audits (audit_date, audit_type, findings, risk_score, auditor)
135
- VALUES (?, ?, ?, ?, ?)
136
- """,
137
- (audit_date, audit_type, findings, risk_score, auditor),
138
- )
139
- return cursor.lastrowid
140
-
141
- def get_last_audit(self, audit_type: str | None = None) -> dict[str, Any] | None:
142
- """Get most recent audit record (read-only).
143
-
144
- Args:
145
- audit_type: Optional filter by audit type
146
-
147
- Returns:
148
- Audit record dict or None if no audits found
149
- """
150
- with self._get_connection() as conn:
151
- if audit_type:
152
- cursor = conn.execute(
153
- """
154
- SELECT * FROM compliance_audits
155
- WHERE audit_type = ?
156
- ORDER BY audit_date DESC
157
- LIMIT 1
158
- """,
159
- (audit_type,),
160
- )
161
- else:
162
- cursor = conn.execute(
163
- """
164
- SELECT * FROM compliance_audits
165
- ORDER BY audit_date DESC
166
- LIMIT 1
167
- """
168
- )
169
-
170
- row = cursor.fetchone()
171
- if row is None:
172
- return None
173
-
174
- return {
175
- "id": row["id"],
176
- "audit_date": row["audit_date"],
177
- "audit_type": row["audit_type"],
178
- "findings": row["findings"],
179
- "risk_score": row["risk_score"],
180
- "auditor": row["auditor"],
181
- "created_at": row["created_at"],
182
- }
183
-
184
- def record_gap(
185
- self,
186
- gap_type: str,
187
- severity: str,
188
- description: str | None = None,
189
- affected_systems: str | None = None,
190
- compliance_framework: str | None = None,
191
- detection_source: str = "automated_scan",
192
- ) -> int:
193
- """Record a compliance gap (append-only).
194
-
195
- Args:
196
- gap_type: Type of gap ('missing_policy', 'expired_cert', etc.)
197
- severity: Severity level ('critical', 'high', 'medium', 'low')
198
- description: Human-readable description
199
- affected_systems: JSON string of affected systems
200
- compliance_framework: Related framework ('HIPAA', 'GDPR', etc.)
201
- detection_source: How gap was detected
202
-
203
- Returns:
204
- Gap record ID
205
-
206
- Note:
207
- This is an append-only operation. To mark a gap as fixed,
208
- add a new status record, don't modify this one.
209
- """
210
- with self._get_connection() as conn:
211
- cursor = conn.execute(
212
- """
213
- INSERT INTO compliance_gaps (
214
- gap_type, severity, description, affected_systems,
215
- compliance_framework, detection_source
216
- )
217
- VALUES (?, ?, ?, ?, ?, ?)
218
- """,
219
- (
220
- gap_type,
221
- severity,
222
- description,
223
- affected_systems,
224
- compliance_framework,
225
- detection_source,
226
- ),
227
- )
228
- return cursor.lastrowid
229
-
230
- def get_active_gaps(
231
- self, severity: str | None = None, framework: str | None = None
232
- ) -> list[dict[str, Any]]:
233
- """Get all recorded gaps (read-only).
234
-
235
- Args:
236
- severity: Optional filter by severity
237
- framework: Optional filter by compliance framework
238
-
239
- Returns:
240
- List of gap records
241
-
242
- Note:
243
- Returns all gaps. In append-only design, gaps are never deleted.
244
- To track fixes, use separate status records.
245
- """
246
- with self._get_connection() as conn:
247
- query = "SELECT * FROM compliance_gaps WHERE 1=1"
248
- params: list[Any] = []
249
-
250
- if severity:
251
- query += " AND severity = ?"
252
- params.append(severity)
253
-
254
- if framework:
255
- query += " AND compliance_framework = ?"
256
- params.append(framework)
257
-
258
- query += " ORDER BY detected_at DESC"
259
-
260
- cursor = conn.execute(query, params)
261
- rows = cursor.fetchall()
262
-
263
- return [
264
- {
265
- "id": row["id"],
266
- "gap_type": row["gap_type"],
267
- "severity": row["severity"],
268
- "detected_at": row["detected_at"],
269
- "description": row["description"],
270
- "affected_systems": row["affected_systems"],
271
- "compliance_framework": row["compliance_framework"],
272
- "detection_source": row["detection_source"],
273
- }
274
- for row in rows
275
- ]
276
-
277
- def record_compliance_status(
278
- self,
279
- compliance_framework: str,
280
- status: str,
281
- effective_date: datetime,
282
- notes: str | None = None,
283
- ) -> int:
284
- """Record compliance status change (append-only).
285
-
286
- Args:
287
- compliance_framework: Framework name ('HIPAA', 'GDPR', 'SOC2', etc.)
288
- status: Status ('compliant', 'non_compliant', 'pending')
289
- effective_date: When this status became effective
290
- notes: Additional notes
291
-
292
- Returns:
293
- Status record ID
294
-
295
- Note:
296
- This is an append-only operation. Status history is preserved.
297
- """
298
- with self._get_connection() as conn:
299
- cursor = conn.execute(
300
- """
301
- INSERT INTO compliance_status (compliance_framework, status, effective_date, notes)
302
- VALUES (?, ?, ?, ?)
303
- """,
304
- (compliance_framework, status, effective_date, notes),
305
- )
306
- return cursor.lastrowid
307
-
308
- def get_current_compliance_status(self, compliance_framework: str) -> dict[str, Any] | None:
309
- """Get most recent compliance status (read-only).
310
-
311
- Args:
312
- compliance_framework: Framework name
313
-
314
- Returns:
315
- Status record or None
316
- """
317
- with self._get_connection() as conn:
318
- cursor = conn.execute(
319
- """
320
- SELECT * FROM compliance_status
321
- WHERE compliance_framework = ?
322
- ORDER BY effective_date DESC, recorded_at DESC
323
- LIMIT 1
324
- """,
325
- (compliance_framework,),
326
- )
327
-
328
- row = cursor.fetchone()
329
- if row is None:
330
- return None
331
-
332
- return {
333
- "id": row["id"],
334
- "compliance_framework": row["compliance_framework"],
335
- "status": row["status"],
336
- "effective_date": row["effective_date"],
337
- "notes": row["notes"],
338
- "recorded_at": row["recorded_at"],
339
- }