empathy-framework 2.4.0__py3-none-any.whl → 3.8.2__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/__init__.py +13 -12
- coach_wizards/accessibility_wizard.py +12 -12
- coach_wizards/api_wizard.py +12 -12
- coach_wizards/base_wizard.py +26 -20
- coach_wizards/cicd_wizard.py +15 -13
- coach_wizards/code_reviewer_README.md +60 -0
- coach_wizards/code_reviewer_wizard.py +180 -0
- coach_wizards/compliance_wizard.py +12 -12
- coach_wizards/database_wizard.py +12 -12
- coach_wizards/debugging_wizard.py +12 -12
- coach_wizards/documentation_wizard.py +12 -12
- coach_wizards/generate_wizards.py +1 -2
- coach_wizards/localization_wizard.py +101 -19
- coach_wizards/migration_wizard.py +12 -12
- coach_wizards/monitoring_wizard.py +12 -12
- coach_wizards/observability_wizard.py +12 -12
- coach_wizards/performance_wizard.py +12 -12
- coach_wizards/prompt_engineering_wizard.py +661 -0
- coach_wizards/refactoring_wizard.py +12 -12
- coach_wizards/scaling_wizard.py +12 -12
- coach_wizards/security_wizard.py +12 -12
- coach_wizards/testing_wizard.py +12 -12
- empathy_framework-3.8.2.dist-info/METADATA +1176 -0
- empathy_framework-3.8.2.dist-info/RECORD +333 -0
- empathy_framework-3.8.2.dist-info/entry_points.txt +22 -0
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/top_level.txt +5 -1
- empathy_healthcare_plugin/__init__.py +1 -2
- 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/__init__.py +7 -7
- 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/claude_memory.py +14 -15
- empathy_llm_toolkit/cli/__init__.py +8 -0
- empathy_llm_toolkit/cli/sync_claude.py +487 -0
- empathy_llm_toolkit/code_health.py +186 -28
- empathy_llm_toolkit/config/__init__.py +29 -0
- empathy_llm_toolkit/config/unified.py +295 -0
- empathy_llm_toolkit/contextual_patterns.py +11 -12
- empathy_llm_toolkit/core.py +168 -53
- empathy_llm_toolkit/git_pattern_extractor.py +17 -13
- empathy_llm_toolkit/levels.py +6 -13
- empathy_llm_toolkit/pattern_confidence.py +14 -18
- empathy_llm_toolkit/pattern_resolver.py +10 -12
- empathy_llm_toolkit/pattern_summary.py +16 -14
- empathy_llm_toolkit/providers.py +194 -28
- 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/session_status.py +20 -22
- empathy_llm_toolkit/state.py +28 -21
- 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 +125 -84
- empathy_os/adaptive/__init__.py +13 -0
- empathy_os/adaptive/task_complexity.py +127 -0
- empathy_os/{monitoring.py → agent_monitoring.py} +28 -28
- 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 +1516 -70
- empathy_os/cli_unified.py +597 -0
- empathy_os/config/__init__.py +63 -0
- empathy_os/config/xml_config.py +239 -0
- empathy_os/config.py +95 -37
- empathy_os/coordination.py +72 -68
- empathy_os/core.py +94 -107
- empathy_os/cost_tracker.py +74 -55
- empathy_os/dashboard/__init__.py +15 -0
- empathy_os/dashboard/server.py +743 -0
- empathy_os/discovery.py +17 -14
- empathy_os/emergence.py +21 -22
- empathy_os/exceptions.py +18 -30
- empathy_os/feedback_loops.py +30 -33
- empathy_os/levels.py +32 -35
- empathy_os/leverage_points.py +31 -32
- empathy_os/logging_config.py +19 -16
- 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/pattern_library.py +30 -29
- empathy_os/persistence.py +35 -37
- empathy_os/platform_utils.py +261 -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/redis_config.py +144 -58
- empathy_os/redis_memory.py +79 -77
- 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/templates.py +19 -14
- empathy_os/trust/__init__.py +28 -0
- empathy_os/trust/circuit_breaker.py +579 -0
- empathy_os/trust_building.py +67 -58
- 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.py → workflow_commands.py} +131 -37
- 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/__init__.py +1 -2
- empathy_software_plugin/cli/__init__.py +120 -0
- empathy_software_plugin/cli/inspect.py +362 -0
- empathy_software_plugin/cli.py +49 -27
- empathy_software_plugin/plugin.py +4 -8
- 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 -1427
- agents/epic_integration_wizard.py +0 -541
- agents/trust_building_behaviors.py +0 -891
- empathy_framework-2.4.0.dist-info/METADATA +0 -485
- empathy_framework-2.4.0.dist-info/RECORD +0 -102
- empathy_framework-2.4.0.dist-info/entry_points.txt +0 -6
- empathy_llm_toolkit/htmlcov/status.json +0 -1
- empathy_llm_toolkit/security/htmlcov/status.json +0 -1
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +0 -0
empathy_os/coordination.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Multi-Agent Coordination for Distributed Memory Networks
|
|
1
|
+
"""Multi-Agent Coordination for Distributed Memory Networks
|
|
3
2
|
|
|
4
3
|
Provides conflict resolution and coordination primitives for multi-agent
|
|
5
4
|
systems sharing pattern libraries.
|
|
@@ -63,7 +62,7 @@ class TeamPriorities:
|
|
|
63
62
|
"performance": 0.7,
|
|
64
63
|
"style": 0.5,
|
|
65
64
|
"warning": 0.6,
|
|
66
|
-
}
|
|
65
|
+
},
|
|
67
66
|
)
|
|
68
67
|
|
|
69
68
|
# Tag preferences (tags that should be prioritized)
|
|
@@ -71,8 +70,7 @@ class TeamPriorities:
|
|
|
71
70
|
|
|
72
71
|
|
|
73
72
|
class ConflictResolver:
|
|
74
|
-
"""
|
|
75
|
-
Resolves conflicts between patterns from different agents.
|
|
73
|
+
"""Resolves conflicts between patterns from different agents.
|
|
76
74
|
|
|
77
75
|
When multiple agents contribute patterns that address the same issue
|
|
78
76
|
but recommend different approaches, the ConflictResolver determines
|
|
@@ -105,6 +103,7 @@ class ConflictResolver:
|
|
|
105
103
|
... context={"team_priority": "readability", "code_complexity": "high"}
|
|
106
104
|
... )
|
|
107
105
|
>>> print(f"Winner: {resolution.winning_pattern.name}")
|
|
106
|
+
|
|
108
107
|
"""
|
|
109
108
|
|
|
110
109
|
def __init__(
|
|
@@ -112,12 +111,12 @@ class ConflictResolver:
|
|
|
112
111
|
default_strategy: ResolutionStrategy = ResolutionStrategy.WEIGHTED_SCORE,
|
|
113
112
|
team_priorities: TeamPriorities | None = None,
|
|
114
113
|
):
|
|
115
|
-
"""
|
|
116
|
-
Initialize the ConflictResolver.
|
|
114
|
+
"""Initialize the ConflictResolver.
|
|
117
115
|
|
|
118
116
|
Args:
|
|
119
117
|
default_strategy: Strategy to use when not specified
|
|
120
118
|
team_priorities: Team-configured priorities for resolution
|
|
119
|
+
|
|
121
120
|
"""
|
|
122
121
|
self.default_strategy = default_strategy
|
|
123
122
|
self.team_priorities = team_priorities or TeamPriorities()
|
|
@@ -129,8 +128,7 @@ class ConflictResolver:
|
|
|
129
128
|
context: dict[str, Any] | None = None,
|
|
130
129
|
strategy: ResolutionStrategy | None = None,
|
|
131
130
|
) -> ResolutionResult:
|
|
132
|
-
"""
|
|
133
|
-
Resolve conflict between multiple patterns.
|
|
131
|
+
"""Resolve conflict between multiple patterns.
|
|
134
132
|
|
|
135
133
|
Args:
|
|
136
134
|
patterns: List of conflicting patterns (minimum 2)
|
|
@@ -142,6 +140,7 @@ class ConflictResolver:
|
|
|
142
140
|
|
|
143
141
|
Raises:
|
|
144
142
|
ValueError: If fewer than 2 patterns provided
|
|
143
|
+
|
|
145
144
|
"""
|
|
146
145
|
if len(patterns) < 2:
|
|
147
146
|
raise ValueError("Need at least 2 patterns to resolve conflict")
|
|
@@ -185,7 +184,6 @@ class ConflictResolver:
|
|
|
185
184
|
strategy: ResolutionStrategy,
|
|
186
185
|
) -> dict[str, float]:
|
|
187
186
|
"""Calculate score for a pattern based on strategy"""
|
|
188
|
-
|
|
189
187
|
scores: dict[str, float] = {}
|
|
190
188
|
|
|
191
189
|
# Factor 1: Confidence score (0-1)
|
|
@@ -230,7 +228,6 @@ class ConflictResolver:
|
|
|
230
228
|
context: dict[str, Any],
|
|
231
229
|
) -> float:
|
|
232
230
|
"""Calculate how well a pattern matches the current context"""
|
|
233
|
-
|
|
234
231
|
if not context or not pattern.context:
|
|
235
232
|
return 0.5 # Neutral if no context available
|
|
236
233
|
|
|
@@ -261,7 +258,6 @@ class ConflictResolver:
|
|
|
261
258
|
context: dict[str, Any],
|
|
262
259
|
) -> float:
|
|
263
260
|
"""Calculate how well a pattern aligns with team priorities"""
|
|
264
|
-
|
|
265
261
|
score = 0.5 # Start neutral
|
|
266
262
|
|
|
267
263
|
# Check team priority in context
|
|
@@ -307,13 +303,12 @@ class ConflictResolver:
|
|
|
307
303
|
strategy: ResolutionStrategy,
|
|
308
304
|
) -> str:
|
|
309
305
|
"""Generate human-readable reasoning for the resolution"""
|
|
310
|
-
|
|
311
306
|
reasons = []
|
|
312
307
|
|
|
313
308
|
# Strategy-specific reasoning
|
|
314
309
|
if strategy == ResolutionStrategy.HIGHEST_CONFIDENCE:
|
|
315
310
|
reasons.append(
|
|
316
|
-
f"Selected '{winner.name}' with highest confidence ({winner.confidence:.0%})"
|
|
311
|
+
f"Selected '{winner.name}' with highest confidence ({winner.confidence:.0%})",
|
|
317
312
|
)
|
|
318
313
|
elif strategy == ResolutionStrategy.MOST_RECENT:
|
|
319
314
|
age = (datetime.now() - winner.discovered_at).days
|
|
@@ -321,7 +316,7 @@ class ConflictResolver:
|
|
|
321
316
|
elif strategy == ResolutionStrategy.BEST_CONTEXT_MATCH:
|
|
322
317
|
reasons.append(
|
|
323
318
|
f"Selected '{winner.name}' as best match for current context "
|
|
324
|
-
f"(match score: {scores['context_match']:.0%})"
|
|
319
|
+
f"(match score: {scores['context_match']:.0%})",
|
|
325
320
|
)
|
|
326
321
|
elif strategy == ResolutionStrategy.TEAM_PRIORITY:
|
|
327
322
|
team_priority = context.get("team_priority", "balanced")
|
|
@@ -334,7 +329,7 @@ class ConflictResolver:
|
|
|
334
329
|
)[:2]
|
|
335
330
|
factor_desc = ", ".join(f"{k}: {v:.0%}" for k, v in top_factors)
|
|
336
331
|
reasons.append(
|
|
337
|
-
f"Selected '{winner.name}' based on weighted scoring (top factors: {factor_desc})"
|
|
332
|
+
f"Selected '{winner.name}' based on weighted scoring (top factors: {factor_desc})",
|
|
338
333
|
)
|
|
339
334
|
|
|
340
335
|
# Add comparison to losers
|
|
@@ -346,7 +341,6 @@ class ConflictResolver:
|
|
|
346
341
|
|
|
347
342
|
def get_resolution_stats(self) -> dict[str, Any]:
|
|
348
343
|
"""Get statistics about resolution history"""
|
|
349
|
-
|
|
350
344
|
if not self.resolution_history:
|
|
351
345
|
return {
|
|
352
346
|
"total_resolutions": 0,
|
|
@@ -397,8 +391,7 @@ class AgentTask:
|
|
|
397
391
|
|
|
398
392
|
|
|
399
393
|
class AgentCoordinator:
|
|
400
|
-
"""
|
|
401
|
-
Redis-backed coordinator for multi-agent teams.
|
|
394
|
+
"""Redis-backed coordinator for multi-agent teams.
|
|
402
395
|
|
|
403
396
|
Enables real-time coordination between agents using Redis short-term memory:
|
|
404
397
|
- Task distribution and claiming
|
|
@@ -425,6 +418,7 @@ class AgentCoordinator:
|
|
|
425
418
|
>>> if task:
|
|
426
419
|
... # Do work...
|
|
427
420
|
... coordinator.complete_task(task.task_id, {"issues_found": 3})
|
|
421
|
+
|
|
428
422
|
"""
|
|
429
423
|
|
|
430
424
|
def __init__(
|
|
@@ -433,13 +427,13 @@ class AgentCoordinator:
|
|
|
433
427
|
team_id: str,
|
|
434
428
|
conflict_resolver: ConflictResolver | None = None,
|
|
435
429
|
):
|
|
436
|
-
"""
|
|
437
|
-
Initialize the coordinator.
|
|
430
|
+
"""Initialize the coordinator.
|
|
438
431
|
|
|
439
432
|
Args:
|
|
440
433
|
short_term_memory: RedisShortTermMemory instance
|
|
441
434
|
team_id: Unique identifier for this team
|
|
442
435
|
conflict_resolver: Optional ConflictResolver for pattern conflicts
|
|
436
|
+
|
|
443
437
|
"""
|
|
444
438
|
from .redis_memory import AccessTier, AgentCredentials
|
|
445
439
|
|
|
@@ -457,14 +451,14 @@ class AgentCoordinator:
|
|
|
457
451
|
self._active_agents: dict[str, datetime] = {}
|
|
458
452
|
|
|
459
453
|
def add_task(self, task: AgentTask) -> bool:
|
|
460
|
-
"""
|
|
461
|
-
Add a task to the queue for agents to claim.
|
|
454
|
+
"""Add a task to the queue for agents to claim.
|
|
462
455
|
|
|
463
456
|
Args:
|
|
464
457
|
task: The task to add
|
|
465
458
|
|
|
466
459
|
Returns:
|
|
467
460
|
True if added successfully
|
|
461
|
+
|
|
468
462
|
"""
|
|
469
463
|
task_data = {
|
|
470
464
|
"task_id": task.task_id,
|
|
@@ -477,21 +471,22 @@ class AgentCoordinator:
|
|
|
477
471
|
"context": task.context,
|
|
478
472
|
}
|
|
479
473
|
|
|
480
|
-
|
|
474
|
+
result = self.memory.stash(
|
|
481
475
|
f"task:{self.team_id}:{task.task_id}",
|
|
482
476
|
task_data,
|
|
483
477
|
self._credentials,
|
|
484
478
|
)
|
|
479
|
+
return bool(result)
|
|
485
480
|
|
|
486
481
|
def get_pending_tasks(self, task_type: str | None = None) -> list[AgentTask]:
|
|
487
|
-
"""
|
|
488
|
-
Get all pending tasks, optionally filtered by type.
|
|
482
|
+
"""Get all pending tasks, optionally filtered by type.
|
|
489
483
|
|
|
490
484
|
Args:
|
|
491
485
|
task_type: Filter by task type
|
|
492
486
|
|
|
493
487
|
Returns:
|
|
494
488
|
List of pending AgentTask objects
|
|
489
|
+
|
|
495
490
|
"""
|
|
496
491
|
# In a real implementation, we'd scan Redis keys
|
|
497
492
|
# For now, this is a simplified version
|
|
@@ -515,7 +510,7 @@ class AgentCoordinator:
|
|
|
515
510
|
status=task_data.get("status", "pending"),
|
|
516
511
|
priority=task_data.get("priority", 5),
|
|
517
512
|
context=task_data.get("context", {}),
|
|
518
|
-
)
|
|
513
|
+
),
|
|
519
514
|
)
|
|
520
515
|
|
|
521
516
|
return sorted(tasks, key=lambda t: t.priority, reverse=True)
|
|
@@ -525,8 +520,7 @@ class AgentCoordinator:
|
|
|
525
520
|
agent_id: str,
|
|
526
521
|
task_type: str | None = None,
|
|
527
522
|
) -> AgentTask | None:
|
|
528
|
-
"""
|
|
529
|
-
Claim a pending task for an agent.
|
|
523
|
+
"""Claim a pending task for an agent.
|
|
530
524
|
|
|
531
525
|
Uses atomic operations to prevent race conditions.
|
|
532
526
|
|
|
@@ -536,6 +530,7 @@ class AgentCoordinator:
|
|
|
536
530
|
|
|
537
531
|
Returns:
|
|
538
532
|
The claimed task, or None if no tasks available
|
|
533
|
+
|
|
539
534
|
"""
|
|
540
535
|
pending = self.get_pending_tasks(task_type)
|
|
541
536
|
|
|
@@ -575,8 +570,7 @@ class AgentCoordinator:
|
|
|
575
570
|
result: dict[str, Any],
|
|
576
571
|
agent_id: str | None = None,
|
|
577
572
|
) -> bool:
|
|
578
|
-
"""
|
|
579
|
-
Mark a task as completed with results.
|
|
573
|
+
"""Mark a task as completed with results.
|
|
580
574
|
|
|
581
575
|
Args:
|
|
582
576
|
task_id: Task to complete
|
|
@@ -585,6 +579,7 @@ class AgentCoordinator:
|
|
|
585
579
|
|
|
586
580
|
Returns:
|
|
587
581
|
True if completed successfully
|
|
582
|
+
|
|
588
583
|
"""
|
|
589
584
|
task_key = f"task:{self.team_id}:{task_id}"
|
|
590
585
|
current = self.memory.retrieve(task_key, self._credentials)
|
|
@@ -618,8 +613,7 @@ class AgentCoordinator:
|
|
|
618
613
|
return False
|
|
619
614
|
|
|
620
615
|
def register_agent(self, agent_id: str, capabilities: list[str] | None = None) -> bool:
|
|
621
|
-
"""
|
|
622
|
-
Register an agent with the team.
|
|
616
|
+
"""Register an agent with the team.
|
|
623
617
|
|
|
624
618
|
Args:
|
|
625
619
|
agent_id: Unique agent identifier
|
|
@@ -627,10 +621,11 @@ class AgentCoordinator:
|
|
|
627
621
|
|
|
628
622
|
Returns:
|
|
629
623
|
True if registered successfully
|
|
624
|
+
|
|
630
625
|
"""
|
|
631
626
|
self._active_agents[agent_id] = datetime.now()
|
|
632
627
|
|
|
633
|
-
|
|
628
|
+
result = self.memory.stash(
|
|
634
629
|
f"agent:{self.team_id}:{agent_id}",
|
|
635
630
|
{
|
|
636
631
|
"agent_id": agent_id,
|
|
@@ -640,34 +635,36 @@ class AgentCoordinator:
|
|
|
640
635
|
},
|
|
641
636
|
self._credentials,
|
|
642
637
|
)
|
|
638
|
+
return bool(result)
|
|
643
639
|
|
|
644
640
|
def heartbeat(self, agent_id: str) -> bool:
|
|
645
|
-
"""
|
|
646
|
-
Send heartbeat to indicate agent is still active.
|
|
641
|
+
"""Send heartbeat to indicate agent is still active.
|
|
647
642
|
|
|
648
643
|
Args:
|
|
649
644
|
agent_id: Agent sending heartbeat
|
|
650
645
|
|
|
651
646
|
Returns:
|
|
652
647
|
True if heartbeat recorded
|
|
648
|
+
|
|
653
649
|
"""
|
|
654
650
|
self._active_agents[agent_id] = datetime.now()
|
|
655
651
|
|
|
656
|
-
|
|
652
|
+
result = self.memory.send_signal(
|
|
657
653
|
signal_type="heartbeat",
|
|
658
654
|
data={"agent_id": agent_id, "timestamp": datetime.now().isoformat()},
|
|
659
655
|
credentials=self._credentials,
|
|
660
656
|
)
|
|
657
|
+
return bool(result)
|
|
661
658
|
|
|
662
659
|
def get_active_agents(self, timeout_seconds: int = 300) -> list[str]:
|
|
663
|
-
"""
|
|
664
|
-
Get list of recently active agents.
|
|
660
|
+
"""Get list of recently active agents.
|
|
665
661
|
|
|
666
662
|
Args:
|
|
667
663
|
timeout_seconds: Consider agents inactive after this duration
|
|
668
664
|
|
|
669
665
|
Returns:
|
|
670
666
|
List of active agent IDs
|
|
667
|
+
|
|
671
668
|
"""
|
|
672
669
|
cutoff = datetime.now()
|
|
673
670
|
active = []
|
|
@@ -679,8 +676,7 @@ class AgentCoordinator:
|
|
|
679
676
|
return active
|
|
680
677
|
|
|
681
678
|
def broadcast(self, message_type: str, data: dict[str, Any]) -> bool:
|
|
682
|
-
"""
|
|
683
|
-
Broadcast a message to all agents in the team.
|
|
679
|
+
"""Broadcast a message to all agents in the team.
|
|
684
680
|
|
|
685
681
|
Args:
|
|
686
682
|
message_type: Type of message
|
|
@@ -688,22 +684,24 @@ class AgentCoordinator:
|
|
|
688
684
|
|
|
689
685
|
Returns:
|
|
690
686
|
True if broadcast sent
|
|
687
|
+
|
|
691
688
|
"""
|
|
692
|
-
|
|
689
|
+
result = self.memory.send_signal(
|
|
693
690
|
signal_type=message_type,
|
|
694
691
|
data={"team_id": self.team_id, **data},
|
|
695
692
|
credentials=self._credentials,
|
|
696
693
|
)
|
|
694
|
+
return bool(result)
|
|
697
695
|
|
|
698
696
|
def aggregate_results(self, task_type: str | None = None) -> dict[str, Any]:
|
|
699
|
-
"""
|
|
700
|
-
Aggregate results from completed tasks.
|
|
697
|
+
"""Aggregate results from completed tasks.
|
|
701
698
|
|
|
702
699
|
Args:
|
|
703
700
|
task_type: Optional filter by task type
|
|
704
701
|
|
|
705
702
|
Returns:
|
|
706
703
|
Aggregated results summary
|
|
704
|
+
|
|
707
705
|
"""
|
|
708
706
|
# Get completion signals
|
|
709
707
|
completions = self.memory.receive_signals(
|
|
@@ -711,7 +709,7 @@ class AgentCoordinator:
|
|
|
711
709
|
signal_type="task_completed",
|
|
712
710
|
)
|
|
713
711
|
|
|
714
|
-
results = {
|
|
712
|
+
results: dict[str, Any] = {
|
|
715
713
|
"total_completed": 0,
|
|
716
714
|
"by_agent": {},
|
|
717
715
|
"by_type": {},
|
|
@@ -738,8 +736,7 @@ class AgentCoordinator:
|
|
|
738
736
|
|
|
739
737
|
|
|
740
738
|
class TeamSession:
|
|
741
|
-
"""
|
|
742
|
-
A collaborative session for multiple agents working together.
|
|
739
|
+
"""A collaborative session for multiple agents working together.
|
|
743
740
|
|
|
744
741
|
Example:
|
|
745
742
|
>>> from empathy_os import get_redis_memory, TeamSession
|
|
@@ -759,6 +756,7 @@ class TeamSession:
|
|
|
759
756
|
>>>
|
|
760
757
|
>>> # Get context from session
|
|
761
758
|
>>> scope = session.get("analysis_scope")
|
|
759
|
+
|
|
762
760
|
"""
|
|
763
761
|
|
|
764
762
|
def __init__(
|
|
@@ -767,13 +765,13 @@ class TeamSession:
|
|
|
767
765
|
session_id: str,
|
|
768
766
|
purpose: str = "",
|
|
769
767
|
):
|
|
770
|
-
"""
|
|
771
|
-
Create or join a team session.
|
|
768
|
+
"""Create or join a team session.
|
|
772
769
|
|
|
773
770
|
Args:
|
|
774
771
|
short_term_memory: RedisShortTermMemory instance
|
|
775
772
|
session_id: Unique session identifier
|
|
776
773
|
purpose: Description of what this session is for
|
|
774
|
+
|
|
777
775
|
"""
|
|
778
776
|
from .redis_memory import AccessTier, AgentCredentials
|
|
779
777
|
|
|
@@ -798,15 +796,15 @@ class TeamSession:
|
|
|
798
796
|
from .redis_memory import AccessTier, AgentCredentials
|
|
799
797
|
|
|
800
798
|
agent_creds = AgentCredentials(agent_id=agent_id, tier=AccessTier.CONTRIBUTOR)
|
|
801
|
-
return self.memory.join_session(self.session_id, agent_creds)
|
|
799
|
+
return bool(self.memory.join_session(self.session_id, agent_creds))
|
|
802
800
|
|
|
803
801
|
def get_info(self) -> dict[str, Any] | None:
|
|
804
802
|
"""Get session info including participants."""
|
|
805
|
-
|
|
803
|
+
result = self.memory.get_session(self.session_id, self._credentials)
|
|
804
|
+
return dict(result) if result else None
|
|
806
805
|
|
|
807
806
|
def share(self, key: str, data: Any) -> bool:
|
|
808
|
-
"""
|
|
809
|
-
Share data with all agents in the session.
|
|
807
|
+
"""Share data with all agents in the session.
|
|
810
808
|
|
|
811
809
|
Args:
|
|
812
810
|
key: Unique key for this data
|
|
@@ -814,22 +812,25 @@ class TeamSession:
|
|
|
814
812
|
|
|
815
813
|
Returns:
|
|
816
814
|
True if shared successfully
|
|
815
|
+
|
|
817
816
|
"""
|
|
818
|
-
return
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
817
|
+
return bool(
|
|
818
|
+
self.memory.stash(
|
|
819
|
+
f"session:{self.session_id}:{key}",
|
|
820
|
+
data,
|
|
821
|
+
self._credentials,
|
|
822
|
+
),
|
|
822
823
|
)
|
|
823
824
|
|
|
824
825
|
def get(self, key: str) -> Any | None:
|
|
825
|
-
"""
|
|
826
|
-
Get shared data from the session.
|
|
826
|
+
"""Get shared data from the session.
|
|
827
827
|
|
|
828
828
|
Args:
|
|
829
829
|
key: Key of the shared data
|
|
830
830
|
|
|
831
831
|
Returns:
|
|
832
832
|
The data, or None if not found
|
|
833
|
+
|
|
833
834
|
"""
|
|
834
835
|
return self.memory.retrieve(
|
|
835
836
|
f"session:{self.session_id}:{key}",
|
|
@@ -837,8 +838,7 @@ class TeamSession:
|
|
|
837
838
|
)
|
|
838
839
|
|
|
839
840
|
def signal(self, signal_type: str, data: dict[str, Any]) -> bool:
|
|
840
|
-
"""
|
|
841
|
-
Send a signal to session participants.
|
|
841
|
+
"""Send a signal to session participants.
|
|
842
842
|
|
|
843
843
|
Args:
|
|
844
844
|
signal_type: Type of signal
|
|
@@ -846,21 +846,25 @@ class TeamSession:
|
|
|
846
846
|
|
|
847
847
|
Returns:
|
|
848
848
|
True if sent
|
|
849
|
+
|
|
849
850
|
"""
|
|
850
|
-
return
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
851
|
+
return bool(
|
|
852
|
+
self.memory.send_signal(
|
|
853
|
+
signal_type=signal_type,
|
|
854
|
+
data={"session_id": self.session_id, **data},
|
|
855
|
+
credentials=self._credentials,
|
|
856
|
+
),
|
|
854
857
|
)
|
|
855
858
|
|
|
856
859
|
def get_signals(self, signal_type: str | None = None) -> list[dict]:
|
|
857
|
-
"""
|
|
858
|
-
Get signals from the session.
|
|
860
|
+
"""Get signals from the session.
|
|
859
861
|
|
|
860
862
|
Args:
|
|
861
863
|
signal_type: Optional filter
|
|
862
864
|
|
|
863
865
|
Returns:
|
|
864
866
|
List of signals
|
|
867
|
+
|
|
865
868
|
"""
|
|
866
|
-
|
|
869
|
+
result = self.memory.receive_signals(self._credentials, signal_type=signal_type)
|
|
870
|
+
return list(result) if result else []
|