empathy-framework 3.7.0__py3-none-any.whl → 3.8.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.
- coach_wizards/code_reviewer_README.md +60 -0
- coach_wizards/code_reviewer_wizard.py +180 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/METADATA +148 -11
- empathy_framework-3.8.0.dist-info/RECORD +333 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/top_level.txt +5 -1
- empathy_healthcare_plugin/monitors/__init__.py +9 -0
- empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
- empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
- empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
- empathy_llm_toolkit/agent_factory/__init__.py +53 -0
- empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
- empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
- empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
- empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
- empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
- empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
- empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
- empathy_llm_toolkit/agent_factory/base.py +305 -0
- empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
- empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
- empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
- empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
- empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
- empathy_llm_toolkit/agent_factory/decorators.py +286 -0
- empathy_llm_toolkit/agent_factory/factory.py +558 -0
- empathy_llm_toolkit/agent_factory/framework.py +192 -0
- empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
- empathy_llm_toolkit/agent_factory/resilient.py +320 -0
- empathy_llm_toolkit/cli/__init__.py +8 -0
- empathy_llm_toolkit/cli/sync_claude.py +487 -0
- empathy_llm_toolkit/code_health.py +150 -3
- empathy_llm_toolkit/config/__init__.py +29 -0
- empathy_llm_toolkit/config/unified.py +295 -0
- empathy_llm_toolkit/routing/__init__.py +32 -0
- empathy_llm_toolkit/routing/model_router.py +362 -0
- empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
- empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
- empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
- empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
- empathy_llm_toolkit/security/README.md +262 -0
- empathy_llm_toolkit/security/__init__.py +62 -0
- empathy_llm_toolkit/security/audit_logger.py +929 -0
- empathy_llm_toolkit/security/audit_logger_example.py +152 -0
- empathy_llm_toolkit/security/pii_scrubber.py +640 -0
- empathy_llm_toolkit/security/secrets_detector.py +678 -0
- empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
- empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
- empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
- empathy_llm_toolkit/wizards/__init__.py +38 -0
- empathy_llm_toolkit/wizards/base_wizard.py +364 -0
- empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
- empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
- empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
- empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
- empathy_os/__init__.py +52 -52
- empathy_os/adaptive/__init__.py +13 -0
- empathy_os/adaptive/task_complexity.py +127 -0
- empathy_os/cache/__init__.py +117 -0
- empathy_os/cache/base.py +166 -0
- empathy_os/cache/dependency_manager.py +253 -0
- empathy_os/cache/hash_only.py +248 -0
- empathy_os/cache/hybrid.py +390 -0
- empathy_os/cache/storage.py +282 -0
- empathy_os/cli.py +118 -8
- empathy_os/cli_unified.py +121 -1
- empathy_os/config/__init__.py +63 -0
- empathy_os/config/xml_config.py +239 -0
- empathy_os/config.py +2 -1
- empathy_os/dashboard/__init__.py +15 -0
- empathy_os/dashboard/server.py +743 -0
- empathy_os/memory/__init__.py +195 -0
- empathy_os/memory/claude_memory.py +466 -0
- empathy_os/memory/config.py +224 -0
- empathy_os/memory/control_panel.py +1298 -0
- empathy_os/memory/edges.py +179 -0
- empathy_os/memory/graph.py +567 -0
- empathy_os/memory/long_term.py +1194 -0
- empathy_os/memory/nodes.py +179 -0
- empathy_os/memory/redis_bootstrap.py +540 -0
- empathy_os/memory/security/__init__.py +31 -0
- empathy_os/memory/security/audit_logger.py +930 -0
- empathy_os/memory/security/pii_scrubber.py +640 -0
- empathy_os/memory/security/secrets_detector.py +678 -0
- empathy_os/memory/short_term.py +2119 -0
- empathy_os/memory/storage/__init__.py +15 -0
- empathy_os/memory/summary_index.py +583 -0
- empathy_os/memory/unified.py +619 -0
- empathy_os/metrics/__init__.py +12 -0
- empathy_os/metrics/prompt_metrics.py +190 -0
- empathy_os/models/__init__.py +136 -0
- empathy_os/models/__main__.py +13 -0
- empathy_os/models/cli.py +655 -0
- empathy_os/models/empathy_executor.py +354 -0
- empathy_os/models/executor.py +252 -0
- empathy_os/models/fallback.py +671 -0
- empathy_os/models/provider_config.py +563 -0
- empathy_os/models/registry.py +382 -0
- empathy_os/models/tasks.py +302 -0
- empathy_os/models/telemetry.py +548 -0
- empathy_os/models/token_estimator.py +378 -0
- empathy_os/models/validation.py +274 -0
- empathy_os/monitoring/__init__.py +52 -0
- empathy_os/monitoring/alerts.py +23 -0
- empathy_os/monitoring/alerts_cli.py +268 -0
- empathy_os/monitoring/multi_backend.py +271 -0
- empathy_os/monitoring/otel_backend.py +363 -0
- empathy_os/optimization/__init__.py +19 -0
- empathy_os/optimization/context_optimizer.py +272 -0
- empathy_os/plugins/__init__.py +28 -0
- empathy_os/plugins/base.py +361 -0
- empathy_os/plugins/registry.py +268 -0
- empathy_os/project_index/__init__.py +30 -0
- empathy_os/project_index/cli.py +335 -0
- empathy_os/project_index/crew_integration.py +430 -0
- empathy_os/project_index/index.py +425 -0
- empathy_os/project_index/models.py +501 -0
- empathy_os/project_index/reports.py +473 -0
- empathy_os/project_index/scanner.py +538 -0
- empathy_os/prompts/__init__.py +61 -0
- empathy_os/prompts/config.py +77 -0
- empathy_os/prompts/context.py +177 -0
- empathy_os/prompts/parser.py +285 -0
- empathy_os/prompts/registry.py +313 -0
- empathy_os/prompts/templates.py +208 -0
- empathy_os/resilience/__init__.py +56 -0
- empathy_os/resilience/circuit_breaker.py +256 -0
- empathy_os/resilience/fallback.py +179 -0
- empathy_os/resilience/health.py +300 -0
- empathy_os/resilience/retry.py +209 -0
- empathy_os/resilience/timeout.py +135 -0
- empathy_os/routing/__init__.py +43 -0
- empathy_os/routing/chain_executor.py +433 -0
- empathy_os/routing/classifier.py +217 -0
- empathy_os/routing/smart_router.py +234 -0
- empathy_os/routing/wizard_registry.py +307 -0
- empathy_os/trust/__init__.py +28 -0
- empathy_os/trust/circuit_breaker.py +579 -0
- empathy_os/validation/__init__.py +19 -0
- empathy_os/validation/xml_validator.py +281 -0
- empathy_os/wizard_factory_cli.py +170 -0
- empathy_os/workflows/__init__.py +360 -0
- empathy_os/workflows/base.py +1660 -0
- empathy_os/workflows/bug_predict.py +962 -0
- empathy_os/workflows/code_review.py +960 -0
- empathy_os/workflows/code_review_adapters.py +310 -0
- empathy_os/workflows/code_review_pipeline.py +720 -0
- empathy_os/workflows/config.py +600 -0
- empathy_os/workflows/dependency_check.py +648 -0
- empathy_os/workflows/document_gen.py +1069 -0
- empathy_os/workflows/documentation_orchestrator.py +1205 -0
- empathy_os/workflows/health_check.py +679 -0
- empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
- empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
- empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
- empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
- empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
- empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
- empathy_os/workflows/manage_documentation.py +804 -0
- empathy_os/workflows/new_sample_workflow1.py +146 -0
- empathy_os/workflows/new_sample_workflow1_README.md +150 -0
- empathy_os/workflows/perf_audit.py +687 -0
- empathy_os/workflows/pr_review.py +748 -0
- empathy_os/workflows/progress.py +445 -0
- empathy_os/workflows/progress_server.py +322 -0
- empathy_os/workflows/refactor_plan.py +693 -0
- empathy_os/workflows/release_prep.py +808 -0
- empathy_os/workflows/research_synthesis.py +404 -0
- empathy_os/workflows/secure_release.py +585 -0
- empathy_os/workflows/security_adapters.py +297 -0
- empathy_os/workflows/security_audit.py +1046 -0
- empathy_os/workflows/step_config.py +234 -0
- empathy_os/workflows/test5.py +125 -0
- empathy_os/workflows/test5_README.md +158 -0
- empathy_os/workflows/test_gen.py +1855 -0
- empathy_os/workflows/test_lifecycle.py +526 -0
- empathy_os/workflows/test_maintenance.py +626 -0
- empathy_os/workflows/test_maintenance_cli.py +590 -0
- empathy_os/workflows/test_maintenance_crew.py +821 -0
- empathy_os/workflows/xml_enhanced_crew.py +285 -0
- empathy_software_plugin/cli/__init__.py +120 -0
- empathy_software_plugin/cli/inspect.py +362 -0
- empathy_software_plugin/cli.py +3 -1
- empathy_software_plugin/wizards/__init__.py +42 -0
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
- empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
- empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
- empathy_software_plugin/wizards/base_wizard.py +288 -0
- empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
- empathy_software_plugin/wizards/code_review_wizard.py +606 -0
- empathy_software_plugin/wizards/debugging/__init__.py +50 -0
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
- empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
- empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
- empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
- empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
- empathy_software_plugin/wizards/debugging/verification.py +369 -0
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
- empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
- empathy_software_plugin/wizards/performance/__init__.py +9 -0
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
- empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
- empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
- empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
- empathy_software_plugin/wizards/security/__init__.py +32 -0
- empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
- empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
- empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
- empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
- empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
- empathy_software_plugin/wizards/testing/__init__.py +27 -0
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
- empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
- empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
- empathy_software_plugin/wizards/testing_wizard.py +274 -0
- hot_reload/README.md +473 -0
- hot_reload/__init__.py +62 -0
- hot_reload/config.py +84 -0
- hot_reload/integration.py +228 -0
- hot_reload/reloader.py +298 -0
- hot_reload/watcher.py +179 -0
- hot_reload/websocket.py +176 -0
- scaffolding/README.md +589 -0
- scaffolding/__init__.py +35 -0
- scaffolding/__main__.py +14 -0
- scaffolding/cli.py +240 -0
- test_generator/__init__.py +38 -0
- test_generator/__main__.py +14 -0
- test_generator/cli.py +226 -0
- test_generator/generator.py +325 -0
- test_generator/risk_analyzer.py +216 -0
- workflow_patterns/__init__.py +33 -0
- workflow_patterns/behavior.py +249 -0
- workflow_patterns/core.py +76 -0
- workflow_patterns/output.py +99 -0
- workflow_patterns/registry.py +255 -0
- workflow_patterns/structural.py +288 -0
- workflow_scaffolding/__init__.py +11 -0
- workflow_scaffolding/__main__.py +12 -0
- workflow_scaffolding/cli.py +206 -0
- workflow_scaffolding/generator.py +265 -0
- agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
- agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
- agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
- agents/compliance_anticipation_agent.py +0 -1422
- agents/compliance_db.py +0 -339
- agents/epic_integration_wizard.py +0 -530
- agents/notifications.py +0 -291
- agents/trust_building_behaviors.py +0 -872
- empathy_framework-3.7.0.dist-info/RECORD +0 -105
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/WHEEL +0 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/entry_points.txt +0 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/licenses/LICENSE +0 -0
- /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
|
-
}
|