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/discovery.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Progressive Feature Discovery for Empathy Framework
|
|
1
|
+
"""Progressive Feature Discovery for Empathy Framework
|
|
3
2
|
|
|
4
3
|
Surface tips and suggestions at the right time based on usage patterns.
|
|
5
4
|
Helps users discover power-user features without overwhelming them upfront.
|
|
@@ -87,8 +86,7 @@ def _days_since_sync(stats: dict) -> int:
|
|
|
87
86
|
|
|
88
87
|
|
|
89
88
|
class DiscoveryEngine:
|
|
90
|
-
"""
|
|
91
|
-
Tracks usage and surfaces contextual tips.
|
|
89
|
+
"""Tracks usage and surfaces contextual tips.
|
|
92
90
|
|
|
93
91
|
Usage:
|
|
94
92
|
engine = DiscoveryEngine()
|
|
@@ -136,14 +134,14 @@ class DiscoveryEngine:
|
|
|
136
134
|
json.dump(self.state, f, indent=2)
|
|
137
135
|
|
|
138
136
|
def record_command(self, command: str) -> list:
|
|
139
|
-
"""
|
|
140
|
-
Record a command execution and return any triggered tips.
|
|
137
|
+
"""Record a command execution and return any triggered tips.
|
|
141
138
|
|
|
142
139
|
Args:
|
|
143
140
|
command: The command that was executed
|
|
144
141
|
|
|
145
142
|
Returns:
|
|
146
143
|
List of tip messages to show
|
|
144
|
+
|
|
147
145
|
"""
|
|
148
146
|
# Update counts
|
|
149
147
|
counts = self.state.get("command_counts", {})
|
|
@@ -177,8 +175,7 @@ class DiscoveryEngine:
|
|
|
177
175
|
self._save()
|
|
178
176
|
|
|
179
177
|
def get_pending_tips(self, trigger: str | None = None, max_tips: int = 2) -> list:
|
|
180
|
-
"""
|
|
181
|
-
Get pending tips based on current state.
|
|
178
|
+
"""Get pending tips based on current state.
|
|
182
179
|
|
|
183
180
|
Args:
|
|
184
181
|
trigger: Command that triggered this check (optional)
|
|
@@ -186,6 +183,7 @@ class DiscoveryEngine:
|
|
|
186
183
|
|
|
187
184
|
Returns:
|
|
188
185
|
List of tip messages
|
|
186
|
+
|
|
189
187
|
"""
|
|
190
188
|
tips_to_show = []
|
|
191
189
|
shown_tips = set(self.state.get("tips_shown", []))
|
|
@@ -207,7 +205,8 @@ class DiscoveryEngine:
|
|
|
207
205
|
# Check condition-based tips
|
|
208
206
|
elif "condition" in tip_config:
|
|
209
207
|
try:
|
|
210
|
-
|
|
208
|
+
condition = tip_config["condition"]
|
|
209
|
+
if callable(condition) and condition(self.state):
|
|
211
210
|
should_show = True
|
|
212
211
|
except Exception:
|
|
213
212
|
pass
|
|
@@ -218,11 +217,15 @@ class DiscoveryEngine:
|
|
|
218
217
|
"id": tip_id,
|
|
219
218
|
"tip": tip_config["tip"],
|
|
220
219
|
"priority": tip_config.get("priority", 3),
|
|
221
|
-
}
|
|
220
|
+
},
|
|
222
221
|
)
|
|
223
222
|
|
|
224
|
-
# Sort by priority and limit
|
|
225
|
-
|
|
223
|
+
# Sort by priority and limit - ensure we get an int for sorting
|
|
224
|
+
def get_priority(x: dict) -> int:
|
|
225
|
+
p = x.get("priority", 3)
|
|
226
|
+
return int(p) if isinstance(p, int | float | str) else 3
|
|
227
|
+
|
|
228
|
+
tips_to_show.sort(key=get_priority)
|
|
226
229
|
return tips_to_show[:max_tips]
|
|
227
230
|
|
|
228
231
|
def mark_shown(self, tip_id: str) -> None:
|
|
@@ -269,12 +272,12 @@ def get_engine(storage_dir: str = ".empathy") -> DiscoveryEngine:
|
|
|
269
272
|
|
|
270
273
|
|
|
271
274
|
def show_tip_if_available(command: str, quiet: bool = False) -> None:
|
|
272
|
-
"""
|
|
273
|
-
Check for tips after a command and display them.
|
|
275
|
+
"""Check for tips after a command and display them.
|
|
274
276
|
|
|
275
277
|
Args:
|
|
276
278
|
command: The command that was just executed
|
|
277
279
|
quiet: If True, don't print anything
|
|
280
|
+
|
|
278
281
|
"""
|
|
279
282
|
engine = get_engine()
|
|
280
283
|
tips = engine.record_command(command)
|
empathy_os/emergence.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Emergence Detection for AI-Human Collaboration
|
|
1
|
+
"""Emergence Detection for AI-Human Collaboration
|
|
3
2
|
|
|
4
3
|
Detects emergent properties in AI-human collaboration - system-level behaviors
|
|
5
4
|
that arise from component interactions but aren't properties of components.
|
|
@@ -17,8 +16,7 @@ from typing import Any
|
|
|
17
16
|
|
|
18
17
|
@dataclass
|
|
19
18
|
class EmergentProperty:
|
|
20
|
-
"""
|
|
21
|
-
An emergent property discovered in the system
|
|
19
|
+
"""An emergent property discovered in the system
|
|
22
20
|
|
|
23
21
|
Emergent properties are behaviors or patterns that arise from the
|
|
24
22
|
interactions of system components but cannot be predicted from
|
|
@@ -34,8 +32,7 @@ class EmergentProperty:
|
|
|
34
32
|
|
|
35
33
|
|
|
36
34
|
class EmergenceDetector:
|
|
37
|
-
"""
|
|
38
|
-
Detects emergent properties in AI-human collaboration
|
|
35
|
+
"""Detects emergent properties in AI-human collaboration
|
|
39
36
|
|
|
40
37
|
Emergent properties are system-level behaviors that arise from
|
|
41
38
|
component interactions but aren't properties of the components themselves.
|
|
@@ -57,6 +54,7 @@ class EmergenceDetector:
|
|
|
57
54
|
>>> current = {"trust": 0.8, "interactions": 50, "shared_patterns": 5}
|
|
58
55
|
>>> score = detector.measure_emergence(baseline, current)
|
|
59
56
|
>>> print(f"Emergence score: {score:.2f}")
|
|
57
|
+
|
|
60
58
|
"""
|
|
61
59
|
|
|
62
60
|
def __init__(self):
|
|
@@ -65,10 +63,10 @@ class EmergenceDetector:
|
|
|
65
63
|
self.baseline_metrics: dict[str, Any] = {}
|
|
66
64
|
|
|
67
65
|
def detect_emergent_norms(
|
|
68
|
-
self,
|
|
66
|
+
self,
|
|
67
|
+
team_interactions: list[dict[str, Any]],
|
|
69
68
|
) -> list[EmergentProperty]:
|
|
70
|
-
"""
|
|
71
|
-
Detect team norms that emerged organically
|
|
69
|
+
"""Detect team norms that emerged organically
|
|
72
70
|
|
|
73
71
|
Analyzes interaction history to identify behavioral patterns that:
|
|
74
72
|
1. Were not explicitly programmed or prescribed
|
|
@@ -88,6 +86,7 @@ class EmergenceDetector:
|
|
|
88
86
|
... {"type": "help_request", "response_time": 4}
|
|
89
87
|
... ]
|
|
90
88
|
>>> norms = detector.detect_emergent_norms(interactions)
|
|
89
|
+
|
|
91
90
|
"""
|
|
92
91
|
norms: list[EmergentProperty] = []
|
|
93
92
|
|
|
@@ -131,8 +130,7 @@ class EmergenceDetector:
|
|
|
131
130
|
return norms
|
|
132
131
|
|
|
133
132
|
def measure_emergence(self, baseline: dict[str, Any], current: dict[str, Any]) -> float:
|
|
134
|
-
"""
|
|
135
|
-
Quantify emergence by comparing baseline to current state
|
|
133
|
+
"""Quantify emergence by comparing baseline to current state
|
|
136
134
|
|
|
137
135
|
Measures how much new system-level properties have emerged that
|
|
138
136
|
weren't present in the baseline state.
|
|
@@ -151,6 +149,7 @@ class EmergenceDetector:
|
|
|
151
149
|
>>> baseline = {"trust": 0.3, "interactions": 10}
|
|
152
150
|
>>> current = {"trust": 0.8, "interactions": 50, "patterns": 5}
|
|
153
151
|
>>> score = detector.measure_emergence(baseline, current)
|
|
152
|
+
|
|
154
153
|
"""
|
|
155
154
|
emergence_score = 0.0
|
|
156
155
|
max_score = 0.0
|
|
@@ -191,10 +190,10 @@ class EmergenceDetector:
|
|
|
191
190
|
return 0.0
|
|
192
191
|
|
|
193
192
|
def detect_emergent_capabilities(
|
|
194
|
-
self,
|
|
193
|
+
self,
|
|
194
|
+
historical_states: list[dict[str, Any]],
|
|
195
195
|
) -> list[EmergentProperty]:
|
|
196
|
-
"""
|
|
197
|
-
Detect new capabilities that emerged over time
|
|
196
|
+
"""Detect new capabilities that emerged over time
|
|
198
197
|
|
|
199
198
|
Analyzes historical system states to identify capabilities that:
|
|
200
199
|
1. Weren't present initially
|
|
@@ -206,6 +205,7 @@ class EmergenceDetector:
|
|
|
206
205
|
|
|
207
206
|
Returns:
|
|
208
207
|
List of emergent capabilities detected
|
|
208
|
+
|
|
209
209
|
"""
|
|
210
210
|
if len(historical_states) < 2:
|
|
211
211
|
return []
|
|
@@ -231,8 +231,7 @@ class EmergenceDetector:
|
|
|
231
231
|
return capabilities
|
|
232
232
|
|
|
233
233
|
def _calculate_consistency(self, values: list[float]) -> float:
|
|
234
|
-
"""
|
|
235
|
-
Calculate consistency of a set of values (0.0-1.0)
|
|
234
|
+
"""Calculate consistency of a set of values (0.0-1.0)
|
|
236
235
|
|
|
237
236
|
Uses coefficient of variation: lower variation = higher consistency
|
|
238
237
|
"""
|
|
@@ -248,14 +247,14 @@ class EmergenceDetector:
|
|
|
248
247
|
cv = std_dev / mean # Coefficient of variation
|
|
249
248
|
|
|
250
249
|
# Convert to consistency score (inverse of variation)
|
|
251
|
-
consistency = max(0.0, 1.0 - min(cv, 1.0))
|
|
250
|
+
consistency: float = max(0.0, 1.0 - min(cv, 1.0))
|
|
252
251
|
return consistency
|
|
253
252
|
|
|
254
253
|
def _analyze_communication_patterns(
|
|
255
|
-
self,
|
|
254
|
+
self,
|
|
255
|
+
interactions: list[dict[str, Any]],
|
|
256
256
|
) -> dict[str, dict[str, Any]]:
|
|
257
|
-
"""
|
|
258
|
-
Analyze communication patterns in interactions
|
|
257
|
+
"""Analyze communication patterns in interactions
|
|
259
258
|
|
|
260
259
|
Returns dict of pattern_name -> {frequency, examples}
|
|
261
260
|
"""
|
|
@@ -288,14 +287,14 @@ class EmergenceDetector:
|
|
|
288
287
|
return patterns
|
|
289
288
|
|
|
290
289
|
def get_detected_properties(self, property_type: str | None = None) -> list[EmergentProperty]:
|
|
291
|
-
"""
|
|
292
|
-
Get all detected emergent properties, optionally filtered by type
|
|
290
|
+
"""Get all detected emergent properties, optionally filtered by type
|
|
293
291
|
|
|
294
292
|
Args:
|
|
295
293
|
property_type: Optional filter ("norm", "pattern", "behavior", "capability")
|
|
296
294
|
|
|
297
295
|
Returns:
|
|
298
296
|
List of emergent properties
|
|
297
|
+
|
|
299
298
|
"""
|
|
300
299
|
if property_type:
|
|
301
300
|
return [p for p in self.detected_properties if p.property_type == property_type]
|
empathy_os/exceptions.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Custom exceptions for the Empathy Framework
|
|
1
|
+
"""Custom exceptions for the Empathy Framework
|
|
3
2
|
|
|
4
3
|
Provides domain-specific exceptions for better error handling and debugging.
|
|
5
4
|
|
|
@@ -9,36 +8,31 @@ Licensed under Fair Source 0.9
|
|
|
9
8
|
|
|
10
9
|
|
|
11
10
|
class EmpathyFrameworkError(Exception):
|
|
12
|
-
"""
|
|
13
|
-
Base exception for all Empathy Framework errors
|
|
11
|
+
"""Base exception for all Empathy Framework errors
|
|
14
12
|
|
|
15
13
|
All custom exceptions in the framework inherit from this class,
|
|
16
14
|
making it easy to catch any framework-specific error.
|
|
17
15
|
"""
|
|
18
16
|
|
|
19
|
-
pass
|
|
20
|
-
|
|
21
17
|
|
|
22
18
|
class ValidationError(EmpathyFrameworkError):
|
|
23
|
-
"""
|
|
24
|
-
Raised when input validation fails
|
|
19
|
+
"""Raised when input validation fails
|
|
25
20
|
|
|
26
21
|
Examples:
|
|
27
22
|
- Empty strings when non-empty required
|
|
28
23
|
- Wrong type provided
|
|
29
24
|
- Invalid value ranges
|
|
30
|
-
"""
|
|
31
25
|
|
|
32
|
-
|
|
26
|
+
"""
|
|
33
27
|
|
|
34
28
|
|
|
35
29
|
class PatternNotFoundError(EmpathyFrameworkError):
|
|
36
|
-
"""
|
|
37
|
-
Raised when a pattern lookup fails
|
|
30
|
+
"""Raised when a pattern lookup fails
|
|
38
31
|
|
|
39
32
|
Examples:
|
|
40
33
|
- Pattern ID doesn't exist in library
|
|
41
34
|
- No patterns match query criteria
|
|
35
|
+
|
|
42
36
|
"""
|
|
43
37
|
|
|
44
38
|
def __init__(self, pattern_id: str, message: str | None = None):
|
|
@@ -49,12 +43,12 @@ class PatternNotFoundError(EmpathyFrameworkError):
|
|
|
49
43
|
|
|
50
44
|
|
|
51
45
|
class TrustThresholdError(EmpathyFrameworkError):
|
|
52
|
-
"""
|
|
53
|
-
Raised when trust level is insufficient for an operation
|
|
46
|
+
"""Raised when trust level is insufficient for an operation
|
|
54
47
|
|
|
55
48
|
Examples:
|
|
56
49
|
- Trust too low for proactive actions
|
|
57
50
|
- Erosion loop detected
|
|
51
|
+
|
|
58
52
|
"""
|
|
59
53
|
|
|
60
54
|
def __init__(self, current_trust: float, required_trust: float, message: str | None = None):
|
|
@@ -66,12 +60,12 @@ class TrustThresholdError(EmpathyFrameworkError):
|
|
|
66
60
|
|
|
67
61
|
|
|
68
62
|
class ConfidenceThresholdError(EmpathyFrameworkError):
|
|
69
|
-
"""
|
|
70
|
-
Raised when confidence is too low for proactive action
|
|
63
|
+
"""Raised when confidence is too low for proactive action
|
|
71
64
|
|
|
72
65
|
Examples:
|
|
73
66
|
- Pattern confidence below threshold
|
|
74
67
|
- Prediction uncertainty too high
|
|
68
|
+
|
|
75
69
|
"""
|
|
76
70
|
|
|
77
71
|
def __init__(self, confidence: float, threshold: float, message: str | None = None):
|
|
@@ -83,13 +77,13 @@ class ConfidenceThresholdError(EmpathyFrameworkError):
|
|
|
83
77
|
|
|
84
78
|
|
|
85
79
|
class EmpathyLevelError(EmpathyFrameworkError):
|
|
86
|
-
"""
|
|
87
|
-
Raised when empathy level operations fail
|
|
80
|
+
"""Raised when empathy level operations fail
|
|
88
81
|
|
|
89
82
|
Examples:
|
|
90
83
|
- Invalid level number
|
|
91
84
|
- Level not yet achieved
|
|
92
85
|
- Cannot regress to lower level
|
|
86
|
+
|
|
93
87
|
"""
|
|
94
88
|
|
|
95
89
|
def __init__(self, level: int, message: str | None = None):
|
|
@@ -100,36 +94,30 @@ class EmpathyLevelError(EmpathyFrameworkError):
|
|
|
100
94
|
|
|
101
95
|
|
|
102
96
|
class LeveragePointError(EmpathyFrameworkError):
|
|
103
|
-
"""
|
|
104
|
-
Raised when leverage point analysis fails
|
|
97
|
+
"""Raised when leverage point analysis fails
|
|
105
98
|
|
|
106
99
|
Examples:
|
|
107
100
|
- No leverage points found
|
|
108
101
|
- Intervention feasibility too low
|
|
109
|
-
"""
|
|
110
102
|
|
|
111
|
-
|
|
103
|
+
"""
|
|
112
104
|
|
|
113
105
|
|
|
114
106
|
class FeedbackLoopError(EmpathyFrameworkError):
|
|
115
|
-
"""
|
|
116
|
-
Raised when feedback loop detection or management fails
|
|
107
|
+
"""Raised when feedback loop detection or management fails
|
|
117
108
|
|
|
118
109
|
Examples:
|
|
119
110
|
- Vicious cycle detected but cannot break
|
|
120
111
|
- Insufficient history for loop detection
|
|
121
|
-
"""
|
|
122
112
|
|
|
123
|
-
|
|
113
|
+
"""
|
|
124
114
|
|
|
125
115
|
|
|
126
116
|
class CollaborationStateError(EmpathyFrameworkError):
|
|
127
|
-
"""
|
|
128
|
-
Raised when collaboration state operations fail
|
|
117
|
+
"""Raised when collaboration state operations fail
|
|
129
118
|
|
|
130
119
|
Examples:
|
|
131
120
|
- Invalid state transition
|
|
132
121
|
- State corruption detected
|
|
133
|
-
"""
|
|
134
122
|
|
|
135
|
-
|
|
123
|
+
"""
|
empathy_os/feedback_loops.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Feedback Loop Detection for AI-Human Collaboration
|
|
1
|
+
"""Feedback Loop Detection for AI-Human Collaboration
|
|
3
2
|
|
|
4
3
|
Detects and analyzes reinforcing and balancing feedback loops in AI-human
|
|
5
4
|
collaboration based on systems thinking (Meadows, Senge).
|
|
@@ -34,8 +33,7 @@ class LoopPolarity(Enum):
|
|
|
34
33
|
|
|
35
34
|
@dataclass
|
|
36
35
|
class FeedbackLoop:
|
|
37
|
-
"""
|
|
38
|
-
A detected feedback loop in the system
|
|
36
|
+
"""A detected feedback loop in the system
|
|
39
37
|
|
|
40
38
|
Feedback loops are circular causal chains where:
|
|
41
39
|
A -> B -> C -> A (with delays and polarities)
|
|
@@ -53,8 +51,7 @@ class FeedbackLoop:
|
|
|
53
51
|
|
|
54
52
|
|
|
55
53
|
class FeedbackLoopDetector:
|
|
56
|
-
"""
|
|
57
|
-
Detects reinforcing and balancing feedback loops in AI-human collaboration
|
|
54
|
+
"""Detects reinforcing and balancing feedback loops in AI-human collaboration
|
|
58
55
|
|
|
59
56
|
Based on systems thinking (Meadows, Senge):
|
|
60
57
|
|
|
@@ -85,6 +82,7 @@ class FeedbackLoopDetector:
|
|
|
85
82
|
... ]
|
|
86
83
|
>>> loops = detector.detect_active_loop(history)
|
|
87
84
|
>>> print(loops["dominant_loop"])
|
|
85
|
+
|
|
88
86
|
"""
|
|
89
87
|
|
|
90
88
|
def __init__(self):
|
|
@@ -99,7 +97,7 @@ class FeedbackLoopDetector:
|
|
|
99
97
|
loop_id="R1_trust_building",
|
|
100
98
|
loop_type=LoopType.REINFORCING,
|
|
101
99
|
polarity=LoopPolarity.VIRTUOUS,
|
|
102
|
-
description="Trust building
|
|
100
|
+
description="Trust building cycle: Success → Trust ↑ → Delegation ↑ → More Success",
|
|
103
101
|
components=["trust", "success_rate", "delegation_level"],
|
|
104
102
|
intervention_points=["celebrate_wins", "increase_transparency"],
|
|
105
103
|
)
|
|
@@ -109,7 +107,7 @@ class FeedbackLoopDetector:
|
|
|
109
107
|
loop_id="R2_trust_erosion",
|
|
110
108
|
loop_type=LoopType.REINFORCING,
|
|
111
109
|
polarity=LoopPolarity.VICIOUS,
|
|
112
|
-
description="Trust erosion
|
|
110
|
+
description="Trust erosion: Failure → Trust ↓ → Micromanagement ↑ → More Failures",
|
|
113
111
|
components=["trust", "failure_rate", "oversight_level"],
|
|
114
112
|
intervention_points=["break_cycle", "rebuild_confidence", "adjust_scope"],
|
|
115
113
|
)
|
|
@@ -128,8 +126,7 @@ class FeedbackLoopDetector:
|
|
|
128
126
|
self.detected_loops.extend([trust_building, trust_erosion, quality_control])
|
|
129
127
|
|
|
130
128
|
def detect_active_loop(self, session_history: list[dict[str, Any]]) -> dict[str, Any]:
|
|
131
|
-
"""
|
|
132
|
-
Analyze session history for active feedback loops
|
|
129
|
+
"""Analyze session history for active feedback loops
|
|
133
130
|
|
|
134
131
|
Examines trends in trust, success rate, and collaboration metrics
|
|
135
132
|
to determine which feedback loop is currently dominant.
|
|
@@ -151,6 +148,7 @@ class FeedbackLoopDetector:
|
|
|
151
148
|
... {"trust": 0.7, "success_rate": 0.8}
|
|
152
149
|
... ]
|
|
153
150
|
>>> result = detector.detect_active_loop(history)
|
|
151
|
+
|
|
154
152
|
"""
|
|
155
153
|
if len(session_history) < 2:
|
|
156
154
|
return {
|
|
@@ -183,7 +181,7 @@ class FeedbackLoopDetector:
|
|
|
183
181
|
"details": dominant_loop,
|
|
184
182
|
}
|
|
185
183
|
|
|
186
|
-
|
|
184
|
+
if trust_trend < -0.1 and success_rate < 0.4:
|
|
187
185
|
# Trust erosion vicious cycle active
|
|
188
186
|
dominant_loop = self._get_loop_by_id("R2_trust_erosion")
|
|
189
187
|
return {
|
|
@@ -191,25 +189,23 @@ class FeedbackLoopDetector:
|
|
|
191
189
|
"loop_type": "reinforcing_vicious",
|
|
192
190
|
"loop_strength": min(abs(trust_trend) * (1 - success_rate), 1.0),
|
|
193
191
|
"trend": "amplifying_negative",
|
|
194
|
-
"recommendation": "INTERVENTION NEEDED: Break
|
|
192
|
+
"recommendation": "INTERVENTION NEEDED: Break cycle. Reduce scope, rebuild confidence.",
|
|
195
193
|
"details": dominant_loop,
|
|
196
194
|
}
|
|
197
195
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
}
|
|
196
|
+
# Quality control balancing loop active
|
|
197
|
+
dominant_loop = self._get_loop_by_id("B1_quality_control")
|
|
198
|
+
return {
|
|
199
|
+
"dominant_loop": "B1_quality_control",
|
|
200
|
+
"loop_type": "balancing",
|
|
201
|
+
"loop_strength": 0.5,
|
|
202
|
+
"trend": "stabilizing",
|
|
203
|
+
"recommendation": "System stable. Monitor for reinforcing loop activation.",
|
|
204
|
+
"details": dominant_loop,
|
|
205
|
+
}
|
|
209
206
|
|
|
210
207
|
def detect_virtuous_cycle(self, history: list[dict[str, Any]]) -> bool:
|
|
211
|
-
"""
|
|
212
|
-
Detect reinforcing positive feedback (virtuous cycle)
|
|
208
|
+
"""Detect reinforcing positive feedback (virtuous cycle)
|
|
213
209
|
|
|
214
210
|
A virtuous cycle is present when:
|
|
215
211
|
1. Trust is increasing
|
|
@@ -230,6 +226,7 @@ class FeedbackLoopDetector:
|
|
|
230
226
|
... ]
|
|
231
227
|
>>> detector.detect_virtuous_cycle(history)
|
|
232
228
|
True
|
|
229
|
+
|
|
233
230
|
"""
|
|
234
231
|
if len(history) < 3:
|
|
235
232
|
return False
|
|
@@ -256,8 +253,7 @@ class FeedbackLoopDetector:
|
|
|
256
253
|
return is_accelerating
|
|
257
254
|
|
|
258
255
|
def detect_vicious_cycle(self, history: list[dict[str, Any]]) -> bool:
|
|
259
|
-
"""
|
|
260
|
-
Detect reinforcing negative feedback (vicious cycle)
|
|
256
|
+
"""Detect reinforcing negative feedback (vicious cycle)
|
|
261
257
|
|
|
262
258
|
A vicious cycle is present when:
|
|
263
259
|
1. Trust is decreasing
|
|
@@ -278,6 +274,7 @@ class FeedbackLoopDetector:
|
|
|
278
274
|
... ]
|
|
279
275
|
>>> detector.detect_vicious_cycle(history)
|
|
280
276
|
True
|
|
277
|
+
|
|
281
278
|
"""
|
|
282
279
|
if len(history) < 3:
|
|
283
280
|
return False
|
|
@@ -304,8 +301,7 @@ class FeedbackLoopDetector:
|
|
|
304
301
|
return is_accelerating_down
|
|
305
302
|
|
|
306
303
|
def get_intervention_recommendations(self, loop_id: str) -> list[str]:
|
|
307
|
-
"""
|
|
308
|
-
Get recommended interventions for a specific loop
|
|
304
|
+
"""Get recommended interventions for a specific loop
|
|
309
305
|
|
|
310
306
|
Args:
|
|
311
307
|
loop_id: ID of the loop (e.g., "R1_trust_building")
|
|
@@ -317,6 +313,7 @@ class FeedbackLoopDetector:
|
|
|
317
313
|
>>> recommendations = detector.get_intervention_recommendations("R2_trust_erosion")
|
|
318
314
|
>>> print(recommendations)
|
|
319
315
|
['break_cycle', 'rebuild_confidence', 'adjust_scope']
|
|
316
|
+
|
|
320
317
|
"""
|
|
321
318
|
loop = self._get_loop_by_id(loop_id)
|
|
322
319
|
if loop:
|
|
@@ -324,8 +321,7 @@ class FeedbackLoopDetector:
|
|
|
324
321
|
return []
|
|
325
322
|
|
|
326
323
|
def _calculate_trend(self, values: list[float]) -> float:
|
|
327
|
-
"""
|
|
328
|
-
Calculate trend direction and magnitude
|
|
324
|
+
"""Calculate trend direction and magnitude
|
|
329
325
|
|
|
330
326
|
Uses simple linear regression slope as trend indicator.
|
|
331
327
|
|
|
@@ -333,6 +329,7 @@ class FeedbackLoopDetector:
|
|
|
333
329
|
Positive value: increasing trend
|
|
334
330
|
Negative value: decreasing trend
|
|
335
331
|
Near zero: stable
|
|
332
|
+
|
|
336
333
|
"""
|
|
337
334
|
if len(values) < 2:
|
|
338
335
|
return 0.0
|
|
@@ -359,11 +356,11 @@ class FeedbackLoopDetector:
|
|
|
359
356
|
return None
|
|
360
357
|
|
|
361
358
|
def register_custom_loop(self, loop: FeedbackLoop):
|
|
362
|
-
"""
|
|
363
|
-
Register a custom feedback loop for detection
|
|
359
|
+
"""Register a custom feedback loop for detection
|
|
364
360
|
|
|
365
361
|
Args:
|
|
366
362
|
loop: FeedbackLoop instance to register
|
|
363
|
+
|
|
367
364
|
"""
|
|
368
365
|
self.detected_loops.append(loop)
|
|
369
366
|
|