empathy-framework 4.6.6__py3-none-any.whl → 4.7.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- empathy_framework-4.7.1.dist-info/METADATA +690 -0
- empathy_framework-4.7.1.dist-info/RECORD +379 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/top_level.txt +1 -2
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
- empathy_llm_toolkit/agent_factory/__init__.py +6 -6
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
- empathy_llm_toolkit/agents_md/__init__.py +22 -0
- empathy_llm_toolkit/agents_md/loader.py +218 -0
- empathy_llm_toolkit/agents_md/parser.py +271 -0
- empathy_llm_toolkit/agents_md/registry.py +307 -0
- empathy_llm_toolkit/commands/__init__.py +51 -0
- empathy_llm_toolkit/commands/context.py +375 -0
- empathy_llm_toolkit/commands/loader.py +301 -0
- empathy_llm_toolkit/commands/models.py +231 -0
- empathy_llm_toolkit/commands/parser.py +371 -0
- empathy_llm_toolkit/commands/registry.py +429 -0
- empathy_llm_toolkit/config/__init__.py +8 -8
- empathy_llm_toolkit/config/unified.py +3 -7
- empathy_llm_toolkit/context/__init__.py +22 -0
- empathy_llm_toolkit/context/compaction.py +455 -0
- empathy_llm_toolkit/context/manager.py +434 -0
- empathy_llm_toolkit/hooks/__init__.py +24 -0
- empathy_llm_toolkit/hooks/config.py +306 -0
- empathy_llm_toolkit/hooks/executor.py +289 -0
- empathy_llm_toolkit/hooks/registry.py +302 -0
- empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
- empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
- empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
- empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
- empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
- empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
- empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
- empathy_llm_toolkit/learning/__init__.py +30 -0
- empathy_llm_toolkit/learning/evaluator.py +438 -0
- empathy_llm_toolkit/learning/extractor.py +514 -0
- empathy_llm_toolkit/learning/storage.py +560 -0
- empathy_llm_toolkit/providers.py +4 -11
- empathy_llm_toolkit/security/__init__.py +17 -17
- empathy_llm_toolkit/utils/tokens.py +2 -5
- empathy_os/__init__.py +202 -70
- empathy_os/cache_monitor.py +5 -3
- empathy_os/cli/__init__.py +11 -55
- empathy_os/cli/__main__.py +29 -15
- empathy_os/cli/commands/inspection.py +21 -12
- empathy_os/cli/commands/memory.py +4 -12
- empathy_os/cli/commands/profiling.py +198 -0
- empathy_os/cli/commands/utilities.py +27 -7
- empathy_os/cli.py +28 -57
- empathy_os/cli_unified.py +525 -1164
- empathy_os/cost_tracker.py +9 -3
- empathy_os/dashboard/server.py +200 -2
- empathy_os/hot_reload/__init__.py +7 -7
- empathy_os/hot_reload/config.py +6 -7
- empathy_os/hot_reload/integration.py +35 -35
- empathy_os/hot_reload/reloader.py +57 -57
- empathy_os/hot_reload/watcher.py +28 -28
- empathy_os/hot_reload/websocket.py +2 -2
- empathy_os/memory/__init__.py +11 -4
- empathy_os/memory/claude_memory.py +1 -1
- empathy_os/memory/cross_session.py +8 -12
- empathy_os/memory/edges.py +6 -6
- empathy_os/memory/file_session.py +770 -0
- empathy_os/memory/graph.py +30 -30
- empathy_os/memory/nodes.py +6 -6
- empathy_os/memory/short_term.py +15 -9
- empathy_os/memory/unified.py +606 -140
- empathy_os/meta_workflows/agent_creator.py +3 -9
- empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
- empathy_os/meta_workflows/form_engine.py +6 -18
- empathy_os/meta_workflows/intent_detector.py +64 -24
- empathy_os/meta_workflows/models.py +3 -1
- empathy_os/meta_workflows/pattern_learner.py +13 -31
- empathy_os/meta_workflows/plan_generator.py +55 -47
- empathy_os/meta_workflows/session_context.py +2 -3
- empathy_os/meta_workflows/workflow.py +20 -51
- empathy_os/models/cli.py +2 -2
- empathy_os/models/tasks.py +1 -2
- empathy_os/models/telemetry.py +4 -1
- empathy_os/models/token_estimator.py +3 -1
- empathy_os/monitoring/alerts.py +938 -9
- empathy_os/monitoring/alerts_cli.py +346 -183
- empathy_os/orchestration/execution_strategies.py +12 -29
- empathy_os/orchestration/pattern_learner.py +20 -26
- empathy_os/orchestration/real_tools.py +6 -15
- empathy_os/platform_utils.py +2 -1
- empathy_os/plugins/__init__.py +2 -2
- empathy_os/plugins/base.py +64 -64
- empathy_os/plugins/registry.py +32 -32
- empathy_os/project_index/index.py +49 -15
- empathy_os/project_index/models.py +1 -2
- empathy_os/project_index/reports.py +1 -1
- empathy_os/project_index/scanner.py +1 -0
- empathy_os/redis_memory.py +10 -7
- empathy_os/resilience/__init__.py +1 -1
- empathy_os/resilience/health.py +10 -10
- empathy_os/routing/__init__.py +7 -7
- empathy_os/routing/chain_executor.py +37 -37
- empathy_os/routing/classifier.py +36 -36
- empathy_os/routing/smart_router.py +40 -40
- empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
- empathy_os/scaffolding/__init__.py +8 -8
- empathy_os/scaffolding/__main__.py +1 -1
- empathy_os/scaffolding/cli.py +28 -28
- empathy_os/socratic/__init__.py +3 -19
- empathy_os/socratic/ab_testing.py +25 -36
- empathy_os/socratic/blueprint.py +38 -38
- empathy_os/socratic/cli.py +34 -20
- empathy_os/socratic/collaboration.py +30 -28
- empathy_os/socratic/domain_templates.py +9 -1
- empathy_os/socratic/embeddings.py +17 -13
- empathy_os/socratic/engine.py +135 -70
- empathy_os/socratic/explainer.py +70 -60
- empathy_os/socratic/feedback.py +24 -19
- empathy_os/socratic/forms.py +15 -10
- empathy_os/socratic/generator.py +51 -35
- empathy_os/socratic/llm_analyzer.py +25 -23
- empathy_os/socratic/mcp_server.py +99 -159
- empathy_os/socratic/session.py +19 -13
- empathy_os/socratic/storage.py +98 -67
- empathy_os/socratic/success.py +38 -27
- empathy_os/socratic/visual_editor.py +51 -39
- empathy_os/socratic/web_ui.py +99 -66
- empathy_os/telemetry/cli.py +3 -1
- empathy_os/telemetry/usage_tracker.py +1 -3
- empathy_os/test_generator/__init__.py +3 -3
- empathy_os/test_generator/cli.py +28 -28
- empathy_os/test_generator/generator.py +64 -66
- empathy_os/test_generator/risk_analyzer.py +11 -11
- empathy_os/vscode_bridge 2.py +173 -0
- empathy_os/vscode_bridge.py +173 -0
- empathy_os/workflows/__init__.py +212 -120
- empathy_os/workflows/batch_processing.py +8 -24
- empathy_os/workflows/bug_predict.py +1 -1
- empathy_os/workflows/code_review.py +20 -5
- empathy_os/workflows/code_review_pipeline.py +13 -8
- empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
- empathy_os/workflows/manage_documentation.py +1 -0
- empathy_os/workflows/orchestrated_health_check.py +6 -11
- empathy_os/workflows/orchestrated_release_prep.py +3 -3
- empathy_os/workflows/pr_review.py +18 -10
- empathy_os/workflows/progressive/README 2.md +454 -0
- empathy_os/workflows/progressive/__init__ 2.py +92 -0
- empathy_os/workflows/progressive/__init__.py +2 -12
- empathy_os/workflows/progressive/cli 2.py +242 -0
- empathy_os/workflows/progressive/cli.py +14 -37
- empathy_os/workflows/progressive/core 2.py +488 -0
- empathy_os/workflows/progressive/core.py +12 -12
- empathy_os/workflows/progressive/orchestrator 2.py +701 -0
- empathy_os/workflows/progressive/orchestrator.py +166 -144
- empathy_os/workflows/progressive/reports 2.py +528 -0
- empathy_os/workflows/progressive/reports.py +22 -31
- empathy_os/workflows/progressive/telemetry 2.py +280 -0
- empathy_os/workflows/progressive/telemetry.py +8 -14
- empathy_os/workflows/progressive/test_gen 2.py +514 -0
- empathy_os/workflows/progressive/test_gen.py +29 -48
- empathy_os/workflows/progressive/workflow 2.py +628 -0
- empathy_os/workflows/progressive/workflow.py +31 -70
- empathy_os/workflows/release_prep.py +21 -6
- empathy_os/workflows/release_prep_crew.py +1 -0
- empathy_os/workflows/secure_release.py +13 -6
- empathy_os/workflows/security_audit.py +8 -3
- empathy_os/workflows/test_coverage_boost_crew.py +3 -2
- empathy_os/workflows/test_maintenance_crew.py +1 -0
- empathy_os/workflows/test_runner.py +16 -12
- empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
- empathy_software_plugin/cli.py +0 -122
- patterns/README.md +119 -0
- patterns/__init__.py +95 -0
- patterns/behavior.py +298 -0
- patterns/code_review_memory.json +441 -0
- patterns/core.py +97 -0
- patterns/debugging.json +3763 -0
- patterns/empathy.py +268 -0
- patterns/health_check_memory.json +505 -0
- patterns/input.py +161 -0
- patterns/memory_graph.json +8 -0
- patterns/refactoring_memory.json +1113 -0
- patterns/registry.py +663 -0
- patterns/security_memory.json +8 -0
- patterns/structural.py +415 -0
- patterns/validation.py +194 -0
- coach_wizards/__init__.py +0 -45
- coach_wizards/accessibility_wizard.py +0 -91
- coach_wizards/api_wizard.py +0 -91
- coach_wizards/base_wizard.py +0 -209
- coach_wizards/cicd_wizard.py +0 -91
- coach_wizards/code_reviewer_README.md +0 -60
- coach_wizards/code_reviewer_wizard.py +0 -180
- coach_wizards/compliance_wizard.py +0 -91
- coach_wizards/database_wizard.py +0 -91
- coach_wizards/debugging_wizard.py +0 -91
- coach_wizards/documentation_wizard.py +0 -91
- coach_wizards/generate_wizards.py +0 -347
- coach_wizards/localization_wizard.py +0 -173
- coach_wizards/migration_wizard.py +0 -91
- coach_wizards/monitoring_wizard.py +0 -91
- coach_wizards/observability_wizard.py +0 -91
- coach_wizards/performance_wizard.py +0 -91
- coach_wizards/prompt_engineering_wizard.py +0 -661
- coach_wizards/refactoring_wizard.py +0 -91
- coach_wizards/scaling_wizard.py +0 -90
- coach_wizards/security_wizard.py +0 -92
- coach_wizards/testing_wizard.py +0 -91
- empathy_framework-4.6.6.dist-info/METADATA +0 -1597
- empathy_framework-4.6.6.dist-info/RECORD +0 -410
- empathy_llm_toolkit/wizards/__init__.py +0 -43
- empathy_llm_toolkit/wizards/base_wizard.py +0 -364
- empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
- empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
- empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
- empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
- empathy_os/wizard_factory_cli.py +0 -170
- empathy_software_plugin/wizards/__init__.py +0 -42
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
- empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
- empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
- empathy_software_plugin/wizards/base_wizard.py +0 -288
- empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
- empathy_software_plugin/wizards/code_review_wizard.py +0 -604
- empathy_software_plugin/wizards/debugging/__init__.py +0 -50
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
- empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
- empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
- empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
- empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
- empathy_software_plugin/wizards/debugging/verification.py +0 -369
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
- empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
- empathy_software_plugin/wizards/performance/__init__.py +0 -9
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
- empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
- empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
- empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
- empathy_software_plugin/wizards/security/__init__.py +0 -32
- empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
- empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
- empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
- empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
- empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
- empathy_software_plugin/wizards/testing/__init__.py +0 -27
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
- empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
- empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
- empathy_software_plugin/wizards/testing_wizard.py +0 -274
- wizards/__init__.py +0 -82
- wizards/admission_assessment_wizard.py +0 -644
- wizards/care_plan.py +0 -321
- wizards/clinical_assessment.py +0 -769
- wizards/discharge_planning.py +0 -77
- wizards/discharge_summary_wizard.py +0 -468
- wizards/dosage_calculation.py +0 -497
- wizards/incident_report_wizard.py +0 -454
- wizards/medication_reconciliation.py +0 -85
- wizards/nursing_assessment.py +0 -171
- wizards/patient_education.py +0 -654
- wizards/quality_improvement.py +0 -705
- wizards/sbar_report.py +0 -324
- wizards/sbar_wizard.py +0 -608
- wizards/shift_handoff_wizard.py +0 -535
- wizards/soap_note_wizard.py +0 -679
- wizards/treatment_plan.py +0 -15
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/WHEEL +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/entry_points.txt +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/licenses/LICENSE +0 -0
empathy_os/memory/graph.py
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
"""Memory Graph - Cross-
|
|
1
|
+
"""Memory Graph - Cross-Workflow Knowledge Base
|
|
2
2
|
|
|
3
|
-
A knowledge graph that connects findings across all
|
|
3
|
+
A knowledge graph that connects findings across all workflows,
|
|
4
4
|
enabling intelligent correlation and learning.
|
|
5
5
|
|
|
6
6
|
Features:
|
|
7
|
-
- Add findings from any
|
|
7
|
+
- Add findings from any workflow as nodes
|
|
8
8
|
- Connect related findings with typed edges
|
|
9
9
|
- Query for similar past findings
|
|
10
10
|
- Traverse relationships to find root causes
|
|
@@ -29,17 +29,17 @@ from .nodes import Node, NodeType
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
class MemoryGraph:
|
|
32
|
-
"""Knowledge graph for cross-
|
|
32
|
+
"""Knowledge graph for cross-workflow intelligence.
|
|
33
33
|
|
|
34
34
|
Stores nodes (findings) and edges (relationships) discovered
|
|
35
|
-
by
|
|
35
|
+
by workflows, enabling pattern correlation across sessions.
|
|
36
36
|
|
|
37
37
|
Usage:
|
|
38
38
|
graph = MemoryGraph()
|
|
39
39
|
|
|
40
40
|
# Add a bug finding
|
|
41
41
|
bug_id = graph.add_finding(
|
|
42
|
-
|
|
42
|
+
workflow="bug-predict",
|
|
43
43
|
finding={
|
|
44
44
|
"type": "bug",
|
|
45
45
|
"name": "Null reference in auth.py",
|
|
@@ -52,7 +52,7 @@ class MemoryGraph:
|
|
|
52
52
|
|
|
53
53
|
# Connect to a fix
|
|
54
54
|
fix_id = graph.add_finding(
|
|
55
|
-
|
|
55
|
+
workflow="bug-predict",
|
|
56
56
|
finding={
|
|
57
57
|
"type": "fix",
|
|
58
58
|
"name": "Add null check",
|
|
@@ -80,7 +80,7 @@ class MemoryGraph:
|
|
|
80
80
|
self._edges_by_source: dict[str, list[Edge]] = defaultdict(list)
|
|
81
81
|
self._edges_by_target: dict[str, list[Edge]] = defaultdict(list)
|
|
82
82
|
self._nodes_by_type: dict[NodeType, list[str]] = defaultdict(list)
|
|
83
|
-
self.
|
|
83
|
+
self._nodes_by_workflow: dict[str, list[str]] = defaultdict(list)
|
|
84
84
|
self._nodes_by_file: dict[str, list[str]] = defaultdict(list)
|
|
85
85
|
|
|
86
86
|
self._load()
|
|
@@ -133,8 +133,8 @@ class MemoryGraph:
|
|
|
133
133
|
def _index_node(self, node: Node) -> None:
|
|
134
134
|
"""Add node to indexes."""
|
|
135
135
|
self._nodes_by_type[node.type].append(node.id)
|
|
136
|
-
if node.
|
|
137
|
-
self.
|
|
136
|
+
if node.source_workflow:
|
|
137
|
+
self._nodes_by_workflow[node.source_workflow].append(node.id)
|
|
138
138
|
if node.source_file:
|
|
139
139
|
self._nodes_by_file[node.source_file].append(node.id)
|
|
140
140
|
|
|
@@ -151,11 +151,11 @@ class MemoryGraph:
|
|
|
151
151
|
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
|
|
152
152
|
return f"{finding.get('type', 'node')}_{timestamp}_{hash_val}"
|
|
153
153
|
|
|
154
|
-
def add_finding(self,
|
|
155
|
-
"""Add a finding from any
|
|
154
|
+
def add_finding(self, workflow: str, finding: dict[str, Any]) -> str:
|
|
155
|
+
"""Add a finding from any workflow, return node ID.
|
|
156
156
|
|
|
157
157
|
Args:
|
|
158
|
-
|
|
158
|
+
workflow: Name of the workflow adding this finding
|
|
159
159
|
finding: Dict with at least 'type' and 'name' keys
|
|
160
160
|
|
|
161
161
|
Returns:
|
|
@@ -163,7 +163,7 @@ class MemoryGraph:
|
|
|
163
163
|
|
|
164
164
|
Example:
|
|
165
165
|
node_id = graph.add_finding(
|
|
166
|
-
|
|
166
|
+
workflow="security-audit",
|
|
167
167
|
finding={
|
|
168
168
|
"type": "vulnerability",
|
|
169
169
|
"name": "SQL Injection in query builder",
|
|
@@ -189,7 +189,7 @@ class MemoryGraph:
|
|
|
189
189
|
type=node_type,
|
|
190
190
|
name=finding.get("name", "Unnamed finding"),
|
|
191
191
|
description=finding.get("description", ""),
|
|
192
|
-
|
|
192
|
+
source_workflow=workflow,
|
|
193
193
|
source_file=finding.get("file", finding.get("source_file", "")),
|
|
194
194
|
source_line=finding.get("line", finding.get("source_line")),
|
|
195
195
|
severity=finding.get("severity", ""),
|
|
@@ -210,7 +210,7 @@ class MemoryGraph:
|
|
|
210
210
|
target_id: str,
|
|
211
211
|
edge_type: EdgeType,
|
|
212
212
|
description: str = "",
|
|
213
|
-
|
|
213
|
+
workflow: str = "",
|
|
214
214
|
weight: float = 1.0,
|
|
215
215
|
bidirectional: bool = False,
|
|
216
216
|
) -> str:
|
|
@@ -221,7 +221,7 @@ class MemoryGraph:
|
|
|
221
221
|
target_id: Target node ID
|
|
222
222
|
edge_type: Type of relationship
|
|
223
223
|
description: Optional description of the relationship
|
|
224
|
-
|
|
224
|
+
workflow: Workflow that created this edge
|
|
225
225
|
weight: Strength of relationship (0.0 - 1.0)
|
|
226
226
|
bidirectional: If True, also create reverse edge
|
|
227
227
|
|
|
@@ -239,7 +239,7 @@ class MemoryGraph:
|
|
|
239
239
|
target_id=target_id,
|
|
240
240
|
type=edge_type,
|
|
241
241
|
description=description,
|
|
242
|
-
|
|
242
|
+
source_workflow=workflow,
|
|
243
243
|
weight=weight,
|
|
244
244
|
)
|
|
245
245
|
|
|
@@ -254,7 +254,7 @@ class MemoryGraph:
|
|
|
254
254
|
target_id=source_id,
|
|
255
255
|
type=reverse_type,
|
|
256
256
|
description=description,
|
|
257
|
-
|
|
257
|
+
source_workflow=workflow,
|
|
258
258
|
weight=weight,
|
|
259
259
|
)
|
|
260
260
|
self.edges.append(reverse_edge)
|
|
@@ -404,9 +404,9 @@ class MemoryGraph:
|
|
|
404
404
|
node_ids = self._nodes_by_type.get(node_type, [])
|
|
405
405
|
return [self.nodes[nid] for nid in node_ids if nid in self.nodes]
|
|
406
406
|
|
|
407
|
-
def
|
|
408
|
-
"""Find all nodes created by a specific
|
|
409
|
-
node_ids = self.
|
|
407
|
+
def find_by_workflow(self, workflow: str) -> list[Node]:
|
|
408
|
+
"""Find all nodes created by a specific workflow."""
|
|
409
|
+
node_ids = self._nodes_by_workflow.get(workflow, [])
|
|
410
410
|
return [self.nodes[nid] for nid in node_ids if nid in self.nodes]
|
|
411
411
|
|
|
412
412
|
def find_by_file(self, file_path: str) -> list[Node]:
|
|
@@ -463,13 +463,13 @@ class MemoryGraph:
|
|
|
463
463
|
def get_statistics(self) -> dict[str, Any]:
|
|
464
464
|
"""Get graph statistics."""
|
|
465
465
|
type_counts: dict[str, int] = defaultdict(int)
|
|
466
|
-
|
|
466
|
+
workflow_counts: dict[str, int] = defaultdict(int)
|
|
467
467
|
severity_counts: dict[str, int] = defaultdict(int)
|
|
468
468
|
|
|
469
469
|
for node in self.nodes.values():
|
|
470
470
|
type_counts[node.type.value] += 1
|
|
471
|
-
if node.
|
|
472
|
-
|
|
471
|
+
if node.source_workflow:
|
|
472
|
+
workflow_counts[node.source_workflow] += 1
|
|
473
473
|
if node.severity:
|
|
474
474
|
severity_counts[node.severity] += 1
|
|
475
475
|
|
|
@@ -481,7 +481,7 @@ class MemoryGraph:
|
|
|
481
481
|
"total_nodes": len(self.nodes),
|
|
482
482
|
"total_edges": len(self.edges),
|
|
483
483
|
"nodes_by_type": dict(type_counts),
|
|
484
|
-
"
|
|
484
|
+
"nodes_by_workflow": dict(workflow_counts),
|
|
485
485
|
"nodes_by_severity": dict(severity_counts),
|
|
486
486
|
"edges_by_type": dict(edge_type_counts),
|
|
487
487
|
"unique_files": len(self._nodes_by_file),
|
|
@@ -537,9 +537,9 @@ class MemoryGraph:
|
|
|
537
537
|
self._nodes_by_type[node.type] = [
|
|
538
538
|
nid for nid in self._nodes_by_type[node.type] if nid != node_id
|
|
539
539
|
]
|
|
540
|
-
if node.
|
|
541
|
-
self.
|
|
542
|
-
nid for nid in self.
|
|
540
|
+
if node.source_workflow in self._nodes_by_workflow:
|
|
541
|
+
self._nodes_by_workflow[node.source_workflow] = [
|
|
542
|
+
nid for nid in self._nodes_by_workflow[node.source_workflow] if nid != node_id
|
|
543
543
|
]
|
|
544
544
|
if node.source_file in self._nodes_by_file:
|
|
545
545
|
self._nodes_by_file[node.source_file] = [
|
|
@@ -565,6 +565,6 @@ class MemoryGraph:
|
|
|
565
565
|
self._edges_by_source = defaultdict(list)
|
|
566
566
|
self._edges_by_target = defaultdict(list)
|
|
567
567
|
self._nodes_by_type = defaultdict(list)
|
|
568
|
-
self.
|
|
568
|
+
self._nodes_by_workflow = defaultdict(list)
|
|
569
569
|
self._nodes_by_file = defaultdict(list)
|
|
570
570
|
self._save()
|
empathy_os/memory/nodes.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Memory Graph Node Types
|
|
2
2
|
|
|
3
|
-
Defines node types for the cross-
|
|
4
|
-
Each node represents an entity discovered by a
|
|
3
|
+
Defines node types for the cross-workflow knowledge graph.
|
|
4
|
+
Each node represents an entity discovered by a workflow.
|
|
5
5
|
|
|
6
6
|
Copyright 2025 Smart AI Memory, LLC
|
|
7
7
|
Licensed under Fair Source 0.9
|
|
@@ -52,7 +52,7 @@ class NodeType(Enum):
|
|
|
52
52
|
class Node:
|
|
53
53
|
"""A node in the memory graph.
|
|
54
54
|
|
|
55
|
-
Represents any entity that
|
|
55
|
+
Represents any entity that workflows discover or create.
|
|
56
56
|
"""
|
|
57
57
|
|
|
58
58
|
id: str
|
|
@@ -61,7 +61,7 @@ class Node:
|
|
|
61
61
|
description: str = ""
|
|
62
62
|
|
|
63
63
|
# Where this node came from
|
|
64
|
-
|
|
64
|
+
source_workflow: str = ""
|
|
65
65
|
source_file: str = ""
|
|
66
66
|
source_line: int | None = None
|
|
67
67
|
|
|
@@ -87,7 +87,7 @@ class Node:
|
|
|
87
87
|
"type": self.type.value,
|
|
88
88
|
"name": self.name,
|
|
89
89
|
"description": self.description,
|
|
90
|
-
"
|
|
90
|
+
"source_workflow": self.source_workflow,
|
|
91
91
|
"source_file": self.source_file,
|
|
92
92
|
"source_line": self.source_line,
|
|
93
93
|
"severity": self.severity,
|
|
@@ -107,7 +107,7 @@ class Node:
|
|
|
107
107
|
type=NodeType(data["type"]),
|
|
108
108
|
name=data["name"],
|
|
109
109
|
description=data.get("description", ""),
|
|
110
|
-
|
|
110
|
+
source_workflow=data.get("source_workflow", data.get("source_wizard", "")),
|
|
111
111
|
source_file=data.get("source_file", ""),
|
|
112
112
|
source_line=data.get("source_line"),
|
|
113
113
|
severity=data.get("severity", ""),
|
empathy_os/memory/short_term.py
CHANGED
|
@@ -560,11 +560,15 @@ class RedisShortTermMemory:
|
|
|
560
560
|
|
|
561
561
|
if self._config.pii_scrub_enabled:
|
|
562
562
|
self._pii_scrubber = PIIScrubber(enable_name_detection=False)
|
|
563
|
-
logger.debug(
|
|
563
|
+
logger.debug(
|
|
564
|
+
"pii_scrubber_enabled", message="PII scrubbing active for short-term memory"
|
|
565
|
+
)
|
|
564
566
|
|
|
565
567
|
if self._config.secrets_detection_enabled:
|
|
566
568
|
self._secrets_detector = SecretsDetector()
|
|
567
|
-
logger.debug(
|
|
569
|
+
logger.debug(
|
|
570
|
+
"secrets_detector_enabled", message="Secrets detection active for short-term memory"
|
|
571
|
+
)
|
|
568
572
|
|
|
569
573
|
if self.use_mock:
|
|
570
574
|
self._client = None
|
|
@@ -735,7 +739,8 @@ class RedisShortTermMemory:
|
|
|
735
739
|
detections = self._secrets_detector.detect(data_str)
|
|
736
740
|
# Block critical and high severity secrets
|
|
737
741
|
critical_secrets = [
|
|
738
|
-
d
|
|
742
|
+
d
|
|
743
|
+
for d in detections
|
|
739
744
|
if d.severity in (SecretSeverity.CRITICAL, SecretSeverity.HIGH)
|
|
740
745
|
]
|
|
741
746
|
if critical_secrets:
|
|
@@ -1378,17 +1383,18 @@ class RedisShortTermMemory:
|
|
|
1378
1383
|
|
|
1379
1384
|
"""
|
|
1380
1385
|
if self.use_mock:
|
|
1386
|
+
# Use generator expressions for memory-efficient counting
|
|
1381
1387
|
return {
|
|
1382
1388
|
"mode": "mock",
|
|
1383
1389
|
"total_keys": len(self._mock_storage),
|
|
1384
|
-
"working_keys":
|
|
1385
|
-
|
|
1390
|
+
"working_keys": sum(
|
|
1391
|
+
1 for k in self._mock_storage if k.startswith(self.PREFIX_WORKING)
|
|
1386
1392
|
),
|
|
1387
|
-
"staged_keys":
|
|
1388
|
-
|
|
1393
|
+
"staged_keys": sum(
|
|
1394
|
+
1 for k in self._mock_storage if k.startswith(self.PREFIX_STAGED)
|
|
1389
1395
|
),
|
|
1390
|
-
"conflict_keys":
|
|
1391
|
-
|
|
1396
|
+
"conflict_keys": sum(
|
|
1397
|
+
1 for k in self._mock_storage if k.startswith(self.PREFIX_CONFLICT)
|
|
1392
1398
|
),
|
|
1393
1399
|
}
|
|
1394
1400
|
|