empathy-framework 3.9.2__py3-none-any.whl → 3.10.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-3.9.2.dist-info → empathy_framework-3.10.1.dist-info}/METADATA +37 -5
- {empathy_framework-3.9.2.dist-info → empathy_framework-3.10.1.dist-info}/RECORD +32 -32
- empathy_llm_toolkit/agent_factory/crews/health_check.py +36 -29
- empathy_os/__init__.py +1 -1
- empathy_os/cache/hybrid.py +69 -9
- empathy_os/cli.py +183 -18
- empathy_os/cli_unified.py +113 -4
- empathy_os/config.py +7 -4
- empathy_os/hot_reload/integration.py +2 -1
- empathy_os/hot_reload/watcher.py +8 -4
- empathy_os/hot_reload/websocket.py +2 -1
- empathy_os/models/telemetry.py +900 -2
- empathy_os/test_generator/generator.py +1 -1
- empathy_os/tier_recommender.py +3 -3
- empathy_os/workflows/base.py +5 -2
- empathy_os/workflows/health_check.py +37 -0
- empathy_os/workflows/new_sample_workflow1.py +3 -3
- empathy_os/workflows/tier_tracking.py +1 -1
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +9 -6
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +1 -1
- empathy_software_plugin/wizards/debugging/config_loaders.py +6 -2
- empathy_software_plugin/wizards/debugging/language_patterns.py +4 -2
- empathy_software_plugin/wizards/debugging/linter_parsers.py +1 -1
- empathy_software_plugin/wizards/performance/profiler_parsers.py +7 -7
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +1 -1
- empathy_software_plugin/wizards/security_analysis_wizard.py +2 -2
- empathy_software_plugin/wizards/testing/quality_analyzer.py +3 -9
- empathy_software_plugin/wizards/testing/test_suggester.py +1 -1
- {empathy_framework-3.9.2.dist-info → empathy_framework-3.10.1.dist-info}/WHEEL +0 -0
- {empathy_framework-3.9.2.dist-info → empathy_framework-3.10.1.dist-info}/entry_points.txt +0 -0
- {empathy_framework-3.9.2.dist-info → empathy_framework-3.10.1.dist-info}/licenses/LICENSE +0 -0
- {empathy_framework-3.9.2.dist-info → empathy_framework-3.10.1.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: empathy-framework
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.10.1
|
|
4
4
|
Summary: AI collaboration framework with intelligent caching (up to 57% cache hit rate), tier routing (34-86% cost savings depending on task complexity), XML-enhanced prompts, persistent memory, CrewAI integration, and multi-agent orchestration. Includes HIPAA-compliant healthcare wizards.
|
|
5
5
|
Author-email: Patrick Roebuck <admin@smartaimemory.com>
|
|
6
6
|
Maintainer-email: Smart-AI-Memory <admin@smartaimemory.com>
|
|
@@ -178,7 +178,7 @@ Requires-Dist: pyyaml<7.0,>=6.0
|
|
|
178
178
|
Requires-Dist: anthropic<1.0.0,>=0.25.0
|
|
179
179
|
Requires-Dist: crewai<1.0.0,>=0.1.0
|
|
180
180
|
Requires-Dist: langchain<2.0.0,>=0.1.0
|
|
181
|
-
Requires-Dist: langchain-core<2.0.0,>=
|
|
181
|
+
Requires-Dist: langchain-core<2.0.0,>=1.2.6
|
|
182
182
|
Provides-Extra: anthropic
|
|
183
183
|
Requires-Dist: anthropic<1.0.0,>=0.25.0; extra == "anthropic"
|
|
184
184
|
Provides-Extra: openai
|
|
@@ -368,7 +368,41 @@ Dynamic: license-file
|
|
|
368
368
|
pip install empathy-framework[developer] # Lightweight for individual developers
|
|
369
369
|
```
|
|
370
370
|
|
|
371
|
-
## What's New in v3.
|
|
371
|
+
## What's New in v3.10.0 (Current Release)
|
|
372
|
+
|
|
373
|
+
### 🎯 **Intelligent Tier Fallback: Start CHEAP, Upgrade Only When Needed**
|
|
374
|
+
|
|
375
|
+
**Automatic cost optimization with quality-based tier escalation.**
|
|
376
|
+
|
|
377
|
+
- ✅ **30-50% cost savings** on average workflow execution
|
|
378
|
+
- ✅ **CHEAP → CAPABLE → PREMIUM** automatic fallback chain
|
|
379
|
+
- ✅ **Quality gates** validate each tier before upgrading
|
|
380
|
+
- ✅ **Opt-in design** - backward compatible, enabled via `--use-recommended-tier`
|
|
381
|
+
- ✅ **Full telemetry** tracks tier progression and savings
|
|
382
|
+
|
|
383
|
+
```bash
|
|
384
|
+
# Enable intelligent tier fallback
|
|
385
|
+
empathy workflow run health-check --use-recommended-tier
|
|
386
|
+
|
|
387
|
+
# Result: Both stages succeeded at CHEAP tier
|
|
388
|
+
# 💰 Cost Savings: $0.0300 (66.7% vs. all-PREMIUM)
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
**How it works:**
|
|
392
|
+
1. Try CHEAP tier first (Haiku)
|
|
393
|
+
2. If quality gates fail → upgrade to CAPABLE (Sonnet 4.5)
|
|
394
|
+
3. If still failing → upgrade to PREMIUM (Opus 4.5)
|
|
395
|
+
4. Track savings and learn from patterns
|
|
396
|
+
|
|
397
|
+
**When to use:** Cost-sensitive workflows where quality can be validated (health-check, test-gen, doc-gen)
|
|
398
|
+
|
|
399
|
+
See [CHANGELOG.md](https://github.com/Smart-AI-Memory/empathy-framework/blob/main/CHANGELOG.md#3100---2026-01-09) for full details.
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
### Previous Releases
|
|
404
|
+
|
|
405
|
+
#### v3.9.0
|
|
372
406
|
|
|
373
407
|
### 🔒 **Security Hardening: 174 Security Tests (Up from 14)**
|
|
374
408
|
|
|
@@ -407,8 +441,6 @@ See [SECURITY.md](https://github.com/Smart-AI-Memory/empathy-framework/blob/main
|
|
|
407
441
|
|
|
408
442
|
---
|
|
409
443
|
|
|
410
|
-
### Previous Releases
|
|
411
|
-
|
|
412
444
|
#### v3.8.3
|
|
413
445
|
|
|
414
446
|
### 🎯 **Transparent Cost Claims: Honest Role-Based Savings (34-86%)**
|
|
@@ -20,7 +20,7 @@ coach_wizards/refactoring_wizard.py,sha256=X0MTx3BHpOlOMAYDow-3HX5GyryY70JGAF5vA
|
|
|
20
20
|
coach_wizards/scaling_wizard.py,sha256=n1RLtpWmj1RSEGSWssMiUPwCdpskO3z2Z3yhLlTdXro,2598
|
|
21
21
|
coach_wizards/security_wizard.py,sha256=19SOClSxo6N-QqUc_QsFXOE7yEquiZF4kLi7jRomA7g,2605
|
|
22
22
|
coach_wizards/testing_wizard.py,sha256=vKFgFG4uJfAVFmCIQbkrWNvZhIfLC6ve_XbvWZKrPg4,2563
|
|
23
|
-
empathy_framework-3.
|
|
23
|
+
empathy_framework-3.10.1.dist-info/licenses/LICENSE,sha256=IJ9eeI5KSrD5P7alsn7sI_6_1bDihxBA5S4Sen4jf2k,4937
|
|
24
24
|
empathy_healthcare_plugin/__init__.py,sha256=4NioL1_86UXzkd-QNkQZUSZ8rKTQGSP0TC9VXP32kQs,295
|
|
25
25
|
empathy_healthcare_plugin/monitors/__init__.py,sha256=Udp8qfZR504QAq5_eQjvtIaE7v06Yguc7nuF40KllQc,196
|
|
26
26
|
empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py,sha256=GkNh2Yuw9cvuKuPh3mriWtKJZFq_sTxBD7Ci8lFV9gQ,11620
|
|
@@ -64,7 +64,7 @@ empathy_llm_toolkit/agent_factory/adapters/native.py,sha256=lCpR6kvVIlTzbYs3jgMD
|
|
|
64
64
|
empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py,sha256=Qy4_SCQOJU-CUvUIwQoOR66Ji37ICI0CNzy7Oc8Db7c,13326
|
|
65
65
|
empathy_llm_toolkit/agent_factory/crews/__init__.py,sha256=U3D84fRfZb2aqBHKKTuK1fPPzWRx5fcfvpikDGuZnNw,1582
|
|
66
66
|
empathy_llm_toolkit/agent_factory/crews/code_review.py,sha256=deAWBABYd9dhyJ8AiZLo1ZEtxTYzpVrzMI3k3ATKHn0,39323
|
|
67
|
-
empathy_llm_toolkit/agent_factory/crews/health_check.py,sha256=
|
|
67
|
+
empathy_llm_toolkit/agent_factory/crews/health_check.py,sha256=qJlUVSXaxuJBexa14L3jCWrNeHfiYoLgx0VruSPU6_I,43927
|
|
68
68
|
empathy_llm_toolkit/agent_factory/crews/refactoring.py,sha256=kt-PtUxOr4EGa8psnaMaqxoqiw74opWhdhncmu9h5B0,40373
|
|
69
69
|
empathy_llm_toolkit/agent_factory/crews/security_audit.py,sha256=Fuv98e-zDNzqqmGGwtEiSYgyBIj3YxdBGL8zui28X1M,36527
|
|
70
70
|
empathy_llm_toolkit/cli/__init__.py,sha256=-U-ESXUHamUV1vL-4aBfPFdyBysd4PzeiS1W65bDv2U,177
|
|
@@ -93,11 +93,11 @@ empathy_llm_toolkit/wizards/healthcare_wizard.py,sha256=zIdeXqS5jPTRFhUTi0MyPYqh
|
|
|
93
93
|
empathy_llm_toolkit/wizards/patient_assessment_README.md,sha256=DInK_x7LgM8Qi9YSHgXtm7_sQupioJRf0M43_vml4ck,1586
|
|
94
94
|
empathy_llm_toolkit/wizards/patient_assessment_wizard.py,sha256=dsvoOq0AYCBigmn6HPoaSBnBPk9YV7IzAFZkJYx1iZQ,5423
|
|
95
95
|
empathy_llm_toolkit/wizards/technology_wizard.py,sha256=8hQirzzGQp7UVtj1hFCoaoLLtqAtx9HFf4mdUWV1xH0,7533
|
|
96
|
-
empathy_os/__init__.py,sha256=
|
|
96
|
+
empathy_os/__init__.py,sha256=zAvie0wQFlSpv7thmNNtdrPy0YY1NUaQfb1oD_hKmns,5896
|
|
97
97
|
empathy_os/agent_monitoring.py,sha256=s4seLC_J4AtQ3PYWrRPO8YHM-Fbm0Q36kPEdlTHf2HI,13375
|
|
98
|
-
empathy_os/cli.py,sha256=
|
|
99
|
-
empathy_os/cli_unified.py,sha256=
|
|
100
|
-
empathy_os/config.py,sha256=
|
|
98
|
+
empathy_os/cli.py,sha256=2xeJgb3EZ9PT9Uc-4V6X_8WIcPRlGFklVTf3QkE5yk0,116971
|
|
99
|
+
empathy_os/cli_unified.py,sha256=o6l1nokC5Ku8nvEDAEBJoP_p63g5xbVWz_JKTSFNsgE,27181
|
|
100
|
+
empathy_os/config.py,sha256=jsFQuXpZP_jt6UrZtfLlkBZwPUSNbnW5VVtMS5JIhbA,16276
|
|
101
101
|
empathy_os/coordination.py,sha256=E2HvHxKk1xbYswtgxhnVKB6DRxfXUV5pCt-XWHOvNKM,28509
|
|
102
102
|
empathy_os/core.py,sha256=PvrPs8JQPwQjPZZQj6zy6xQTFGHKziaeRxCIlIs3iHA,52951
|
|
103
103
|
empathy_os/cost_tracker.py,sha256=Cd07k2ecpYH2Xq968Ed1YsyqvEXQ5Cn6RqoAENVEE_k,12524
|
|
@@ -114,7 +114,7 @@ empathy_os/platform_utils.py,sha256=VXv3IgK0ykKCBJlsxB4xSwJQteKu3Ds-1UDmHl9fHmo,
|
|
|
114
114
|
empathy_os/redis_config.py,sha256=6khRnNSA3gljmrH4w38h5nrVUfA8DvXRFbDXAJVzl6o,9754
|
|
115
115
|
empathy_os/redis_memory.py,sha256=e8cqZtcnVGLCAI4sgv5zzoZB9xo-UPwJQ8gzbEKWnwM,23119
|
|
116
116
|
empathy_os/templates.py,sha256=uSJQbHE55R8kuuvEyPLxTxFPXstybrsKvGOhhiy93sE,17047
|
|
117
|
-
empathy_os/tier_recommender.py,sha256=
|
|
117
|
+
empathy_os/tier_recommender.py,sha256=LD65r_p7uhKU-18vgLdy78Pe5HiteB6kHrnTAcTqYfQ,14188
|
|
118
118
|
empathy_os/trust_building.py,sha256=plCmSQSzgU2ryMMmJqawQ4l7fIoFmwsx53BDYQv4jhU,18836
|
|
119
119
|
empathy_os/wizard_factory_cli.py,sha256=BMOOTIKf9bAVOuvtHi_HgkIBqnLpLBCkuvA51kxV9iI,4756
|
|
120
120
|
empathy_os/workflow_commands.py,sha256=PqzpsXVB7Vk2raMbSYTDICETb1PZJ4u7IXb7HQdKSYo,25174
|
|
@@ -124,7 +124,7 @@ empathy_os/cache/__init__.py,sha256=nKHyWnQmyBU6f24UOq5iZ4ULUFys5Dhl6dFZlU0jlHU,
|
|
|
124
124
|
empathy_os/cache/base.py,sha256=1waj2OZ_5gRhwYhSfsSfgQs1N_ftZcAq6UAV9RctSek,3968
|
|
125
125
|
empathy_os/cache/dependency_manager.py,sha256=Khwpi4LiT5xFp1Pka4XQHO0bLzWUG1ElpRQ_Zmup_iM,7614
|
|
126
126
|
empathy_os/cache/hash_only.py,sha256=CdyZvl81lbargRyVhWVBJB4VDUNay4KIf3knUmqvZCo,7427
|
|
127
|
-
empathy_os/cache/hybrid.py,sha256=
|
|
127
|
+
empathy_os/cache/hybrid.py,sha256=HSqStILYY6YhfyKGnYkrjYnGpOjHemMEF7YaKivtbQU,15264
|
|
128
128
|
empathy_os/cache/storage.py,sha256=VrvvpAeQF29T-d6Ly6L-bqvu-XHFJRWICb-gfiC0Hqw,7659
|
|
129
129
|
empathy_os/config/__init__.py,sha256=jkdGF6eWEqOayld3Xcl1tsk92YIXIBXI-QcecMUBbXE,1577
|
|
130
130
|
empathy_os/config/xml_config.py,sha256=QOnFV0rshX-7xoUSadLNDCltz5DZwCi8UvC0y2Pqt-w,8672
|
|
@@ -133,10 +133,10 @@ empathy_os/dashboard/server.py,sha256=dFJCtZb5xfOvY4te5WUqINJc5pZSYsJEdWyXJlDTvs
|
|
|
133
133
|
empathy_os/hot_reload/README.md,sha256=FnQWSX-dfTIJvXHjjiWRWBjMK2DR-eyOfDHJlGIzm0o,10406
|
|
134
134
|
empathy_os/hot_reload/__init__.py,sha256=RZ4Ow7Than1w-FWkqOqkDLpBwUn-AUidv5dKyfcSCI0,1628
|
|
135
135
|
empathy_os/hot_reload/config.py,sha256=y6H36dmkTBmc6rbC8hnlK_QrmIEGFBnf-xxpCme70S8,2322
|
|
136
|
-
empathy_os/hot_reload/integration.py,sha256=
|
|
136
|
+
empathy_os/hot_reload/integration.py,sha256=mBhQgkV266Z753WVuuyMEcm0J25DzSsutQPwZAskdl4,6721
|
|
137
137
|
empathy_os/hot_reload/reloader.py,sha256=akqz5t9nn5kc-yj1Dj2NuyPO1p1cWaAhUf-CVlr0XRE,9365
|
|
138
|
-
empathy_os/hot_reload/watcher.py,sha256=
|
|
139
|
-
empathy_os/hot_reload/websocket.py,sha256=
|
|
138
|
+
empathy_os/hot_reload/watcher.py,sha256=l0dZmfDM5RaCZm7nT8qutPI4fXScrS9_QoJ_pdCdOoY,5198
|
|
139
|
+
empathy_os/hot_reload/websocket.py,sha256=DFJlu2gK3hi5R99J05By7RGlfIJDPLa555VZtzUJxUE,5088
|
|
140
140
|
empathy_os/memory/__init__.py,sha256=QwxOpVux5AKBBEZRHs7FoE39JVdWlJQ6WCAm00Cy3C8,4908
|
|
141
141
|
empathy_os/memory/claude_memory.py,sha256=IIwm3su_vyyyoLy4NrpwVk96KLnIgq1A_TfBhjcUZk4,14878
|
|
142
142
|
empathy_os/memory/config.py,sha256=EoBBZLgyY5sHT3kLeyWjyI4b6hRA3Xiaoo3xdMLLGos,6380
|
|
@@ -165,7 +165,7 @@ empathy_os/models/fallback.py,sha256=6xerVS4VHaFB9JC0XnPEGHMrYo9CLACYnCx1QPu3zC8
|
|
|
165
165
|
empathy_os/models/provider_config.py,sha256=-r-q-Yiy1gjBp3ovP7VXz3bEJ6hjVaoPCw5tzBFpKHQ,19463
|
|
166
166
|
empathy_os/models/registry.py,sha256=tBLCzjZeb_wuzAPL5aMXI2VIl3jhXWvprc_whfn0ah8,12987
|
|
167
167
|
empathy_os/models/tasks.py,sha256=XyS0IN6kadLpyC26sMiX9FEXgfP2j57AYPJO2oH4sKU,8691
|
|
168
|
-
empathy_os/models/telemetry.py,sha256=
|
|
168
|
+
empathy_os/models/telemetry.py,sha256=bsiUAtI-6zHpTtnWpfHLYgsRuQeF8KmJFJyIlUJfyoM,45558
|
|
169
169
|
empathy_os/models/token_estimator.py,sha256=hUeWH0oJvp2UbYRLMsgDBGQRzICfLQxzPi_rsqP6fkE,12576
|
|
170
170
|
empathy_os/models/validation.py,sha256=K7Pki8jKmQ3zKG2CSJtx4Bv7cfn9l5g6aIxXWdMA4cs,8925
|
|
171
171
|
empathy_os/monitoring/__init__.py,sha256=efAzUX0DYeUTGEES-MV6jI4iUYmhH-RkQYnVLnjSl-M,1507
|
|
@@ -215,7 +215,7 @@ empathy_os/telemetry/usage_tracker.py,sha256=qym1FzvWmUi-61kugASITAUR7Fbjoxi1zQG
|
|
|
215
215
|
empathy_os/test_generator/__init__.py,sha256=d7grN2uxoRqcTsiZAC-kgEad48Z9rDunOZ6TycS3fy4,913
|
|
216
216
|
empathy_os/test_generator/__main__.py,sha256=YY_HE1xg4zKZkHHAd6sSzWvJCvLFOtmpawCrNlGjWAc,345
|
|
217
217
|
empathy_os/test_generator/cli.py,sha256=u8WL1X3reqSYfVGjYiET7fmxqQDIIOzAE5HMQquhl7M,6862
|
|
218
|
-
empathy_os/test_generator/generator.py,sha256=
|
|
218
|
+
empathy_os/test_generator/generator.py,sha256=XCEQFkYJy6R1PfcHsHLJ8Y_0d1fJHaFxLCLY2Ue5xOo,9798
|
|
219
219
|
empathy_os/test_generator/risk_analyzer.py,sha256=5vEncQDmxUXglZBX9-DdCcsz4yjvuY9IhJGjIfTH9fE,7486
|
|
220
220
|
empathy_os/trust/__init__.py,sha256=tJj5h5mYsfdWg_xmnHPonKZfTycYI3QlXDUQSjRLEtE,651
|
|
221
221
|
empathy_os/trust/circuit_breaker.py,sha256=VMuVmH_lZ_RB0E-tjE150Qtbk7WnkLQXc-fp_8NR5AQ,20716
|
|
@@ -228,7 +228,7 @@ empathy_os/workflow_patterns/output.py,sha256=EyioUYeXGQWllZdJXHXv2mLwl7fMwihrEb
|
|
|
228
228
|
empathy_os/workflow_patterns/registry.py,sha256=0U_XT0hdQ5fLHuEJlrvzjaCBUyeWDA675_hEyvHxT0o,7461
|
|
229
229
|
empathy_os/workflow_patterns/structural.py,sha256=v1wbBU0pCQQKdNhPXM_fuPO8ptQCbEC_8X-OKgfhrk8,9432
|
|
230
230
|
empathy_os/workflows/__init__.py,sha256=UYXKvpkaLEAGqnMpUHrdR8TZiqmR8k47lpdEs2cs9B0,12022
|
|
231
|
-
empathy_os/workflows/base.py,sha256=
|
|
231
|
+
empathy_os/workflows/base.py,sha256=iNnF89vEicVicH_azn3p_Cf8LPnhNOmnp9jGXux7ueU,66402
|
|
232
232
|
empathy_os/workflows/bug_predict.py,sha256=Td2XtawwTSqBOOIqlziNXcOt4YRMMeya2W1tFOJKytY,35726
|
|
233
233
|
empathy_os/workflows/code_review.py,sha256=SWNXSuJ2v4to8sZiHSQ2Z06gVCJ10L1LQr77Jf1SUyM,35647
|
|
234
234
|
empathy_os/workflows/code_review_adapters.py,sha256=9aGUDAgE1B1EUJ-Haz2Agwo4RAwY2aqHtNYKEbJq2yc,11065
|
|
@@ -237,9 +237,9 @@ empathy_os/workflows/config.py,sha256=qahi2OOs-5ahaZd4LWkH2uX0N8YV9KxY-o6popeS4I
|
|
|
237
237
|
empathy_os/workflows/dependency_check.py,sha256=zWwSCAWThnAUkOqEUx2GTl5Vgf2fW9P5HRqwWhYZXlc,23452
|
|
238
238
|
empathy_os/workflows/document_gen.py,sha256=z9jVtGYCvl01oNk2JfelQs4CfFMw35t1vo9IIeC6sWQ,39135
|
|
239
239
|
empathy_os/workflows/documentation_orchestrator.py,sha256=sSzTsLJPkSlHcE_o-pfM-27DVAVpwPcmxPZT71GYfeo,43013
|
|
240
|
-
empathy_os/workflows/health_check.py,sha256=
|
|
240
|
+
empathy_os/workflows/health_check.py,sha256=0OOfL7OyTfQYL1uspwAdTqMdWZkM6zQauE5Gn2v9qNg,26067
|
|
241
241
|
empathy_os/workflows/manage_documentation.py,sha256=gknIse4MzTLxRowIAS07WSXNqWAoWCfxmoIJSbTYBNM,29419
|
|
242
|
-
empathy_os/workflows/new_sample_workflow1.py,sha256=
|
|
242
|
+
empathy_os/workflows/new_sample_workflow1.py,sha256=vG4s_Dnn61y7qe1PEwjIBkKpXh6afpEVXp8orCI_EOo,3977
|
|
243
243
|
empathy_os/workflows/new_sample_workflow1_README.md,sha256=bzLyqukgaKilG1OnCdLsc5GNWsYEagI7mn3n80BPMHY,2366
|
|
244
244
|
empathy_os/workflows/perf_audit.py,sha256=JzJjuU5WQAa7Eisdwmwz4CQTB5W5v-mphVJ_yhORM5A,25275
|
|
245
245
|
empathy_os/workflows/pr_review.py,sha256=H6YukqPrHYA8uDmddISYy0PVp8axmaoeBeB6dZ0GpLE,26193
|
|
@@ -259,7 +259,7 @@ empathy_os/workflows/test_lifecycle.py,sha256=c6UDSd6kOQdCHmaJviwAnUVceVQuSdLNQ9
|
|
|
259
259
|
empathy_os/workflows/test_maintenance.py,sha256=jiMeYX7Qg3CnRU5xW8LuOXnARxV7uqfygDKkIsEgL0s,22941
|
|
260
260
|
empathy_os/workflows/test_maintenance_cli.py,sha256=U8t-1uK9iqEg9RoVXbS27KbhqvbXm30anQH4GbCvKBM,17879
|
|
261
261
|
empathy_os/workflows/test_maintenance_crew.py,sha256=mzV45WZ9ABVgDQk4lWglMBhOCop5c5TzG16cJkWZAV8,28709
|
|
262
|
-
empathy_os/workflows/tier_tracking.py,sha256=
|
|
262
|
+
empathy_os/workflows/tier_tracking.py,sha256=GzQXbUyWCBtDxQczxI8SaKwKURrgULBPWTw5F_wvqTg,14034
|
|
263
263
|
empathy_os/workflows/xml_enhanced_crew.py,sha256=SnPb-LdUNn3MWlm5c_6OB1IWKV_D6XjCsgmi_hRFhuk,9000
|
|
264
264
|
empathy_os/workflows/keyboard_shortcuts/__init__.py,sha256=zPY6KTepKXmLF0xUsqxbH9qztHdVdsCzyY-_PiSnuxk,1116
|
|
265
265
|
empathy_os/workflows/keyboard_shortcuts/generators.py,sha256=qjKU3FPHWYaMP3Pi_HgKaXDUm1wV2dm8W-1ThsAbc7o,12599
|
|
@@ -274,7 +274,7 @@ empathy_software_plugin/plugin.py,sha256=jjIrGOtitOUzmLqfsgML5lsGx7bXaI9WURgucPY
|
|
|
274
274
|
empathy_software_plugin/cli/__init__.py,sha256=YM3lWC69nzp07a7_PoRZ3yqkh-109PzLpwWLacL0YZs,4233
|
|
275
275
|
empathy_software_plugin/cli/inspect.py,sha256=Z1f2bV0TtAUY0uODMjEmoM2zryAsM2mwQEAyRMlmhOE,9413
|
|
276
276
|
empathy_software_plugin/wizards/__init__.py,sha256=rfzUdSjNHRq-mb4xfZgDY57VAafRCCK1jWu2UiUIkjE,1508
|
|
277
|
-
empathy_software_plugin/wizards/advanced_debugging_wizard.py,sha256=
|
|
277
|
+
empathy_software_plugin/wizards/advanced_debugging_wizard.py,sha256=64TSxOXT80Fw_Z3wrFbpMvZ2LKaRF4rkA9UZnVKX99w,14896
|
|
278
278
|
empathy_software_plugin/wizards/agent_orchestration_wizard.py,sha256=iRnHZ_NWhNzinwg_GLzpGpFJukFCctaYGGHWrAZgTYI,21428
|
|
279
279
|
empathy_software_plugin/wizards/ai_collaboration_wizard.py,sha256=63WdxxvPoTeHxdAgmLEh-X2D_jDvpKiHN-TRvUi0jE8,22446
|
|
280
280
|
empathy_software_plugin/wizards/ai_context_wizard.py,sha256=T-LWkozjpZMznlH5fgO1Tjg7Fo2apX7_EZ5KSrl8hrs,18788
|
|
@@ -290,29 +290,29 @@ empathy_software_plugin/wizards/pattern_retriever_wizard.py,sha256=6yue042C8a3K6
|
|
|
290
290
|
empathy_software_plugin/wizards/performance_profiling_wizard.py,sha256=7gPzKi7LOc-eD2dIBMAI1xUVEN3pndMCQcFEs8m4HlM,11631
|
|
291
291
|
empathy_software_plugin/wizards/prompt_engineering_wizard.py,sha256=X7NktPg6zKWn-7KLB2JUGemhZX64dyNgTwxMvKLibIs,17209
|
|
292
292
|
empathy_software_plugin/wizards/rag_pattern_wizard.py,sha256=K5GBwo26RDurRXxxiCmGu7sSGg-Erc-ncDS3hGRoUYM,19138
|
|
293
|
-
empathy_software_plugin/wizards/security_analysis_wizard.py,sha256=
|
|
293
|
+
empathy_software_plugin/wizards/security_analysis_wizard.py,sha256=EelZARa3x5DZjK15tzDIa5XyMRmXEQNhgwdZdfRS6Lc,12332
|
|
294
294
|
empathy_software_plugin/wizards/security_learning_wizard.py,sha256=KLGurDpwMw7tqPRlfnsptd9Hc0xOdVLXiS8Og2Hlv-4,27947
|
|
295
295
|
empathy_software_plugin/wizards/tech_debt_wizard.py,sha256=6cwJrSHfQdkudY2bLhthgQ1kF3OEqAdLL2WZLcgl-Kk,26535
|
|
296
296
|
empathy_software_plugin/wizards/testing_wizard.py,sha256=evDrQW90p2Lt3SBdTPjPNDW3K6l2syzNAkzlkFmjU2k,9686
|
|
297
297
|
empathy_software_plugin/wizards/debugging/__init__.py,sha256=5psc3AIKldwSaD2ymeqAr88I7GjE42_lgcnM5Q3ObSU,1387
|
|
298
|
-
empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py,sha256=
|
|
299
|
-
empathy_software_plugin/wizards/debugging/config_loaders.py,sha256=
|
|
298
|
+
empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py,sha256=7Y1NKFcwbRW9J5PSVzZtTAVUzyukBSNZGXA92kmCg8I,15807
|
|
299
|
+
empathy_software_plugin/wizards/debugging/config_loaders.py,sha256=nbXh_bR-PJsmQjWbRNJ-spX8U1PBJZrvZ2XuM7PYPL0,13481
|
|
300
300
|
empathy_software_plugin/wizards/debugging/fix_applier.py,sha256=dmLBoWLkANBE7GlPKaX0ROS5cQ5EMGD1ecoOCnJ277o,14849
|
|
301
|
-
empathy_software_plugin/wizards/debugging/language_patterns.py,sha256=
|
|
302
|
-
empathy_software_plugin/wizards/debugging/linter_parsers.py,sha256=
|
|
301
|
+
empathy_software_plugin/wizards/debugging/language_patterns.py,sha256=s_pk3dYiaM9SwL2Iwtz01J6vqrjbgeA8gAhD8ZGxUDU,15285
|
|
302
|
+
empathy_software_plugin/wizards/debugging/linter_parsers.py,sha256=OI96MRoY78QONsJpknp6LY9z9soTBEMzf8UmP8fgZUg,15524
|
|
303
303
|
empathy_software_plugin/wizards/debugging/verification.py,sha256=6plbuzfURtWJ2WWYiWUvUYMW2wJD-CERUNOpvZQjlIU,11021
|
|
304
304
|
empathy_software_plugin/wizards/performance/__init__.py,sha256=Jsnj_O6ln7lwrpWGq_36_houCSTl1JG38D71_txvyBY,175
|
|
305
305
|
empathy_software_plugin/wizards/performance/bottleneck_detector.py,sha256=rkSkq4MNJ3q3EVD2sINyhYTHaEkntQcmbwIPcP2ukUg,8144
|
|
306
|
-
empathy_software_plugin/wizards/performance/profiler_parsers.py,sha256=
|
|
306
|
+
empathy_software_plugin/wizards/performance/profiler_parsers.py,sha256=Jf9FwtNN-QUaCxRH5NpzBsWFQ425Rk1DKfaM-yPtQY4,8897
|
|
307
307
|
empathy_software_plugin/wizards/performance/trajectory_analyzer.py,sha256=CONUG3WRUX8-jZdOKJSGXZiRNtHrvkXydaSXmC29naE,15846
|
|
308
308
|
empathy_software_plugin/wizards/security/__init__.py,sha256=faXGfP8VmcVFg_4xWRKFQ_30c-QxbHQk4-gQKTzQFIY,723
|
|
309
309
|
empathy_software_plugin/wizards/security/exploit_analyzer.py,sha256=K-V0ycsMRLLTsRiG2ojwzbLIHAZwyIedY6doHGLZHQo,9681
|
|
310
310
|
empathy_software_plugin/wizards/security/owasp_patterns.py,sha256=MARl4_D_r0KQU8Cysft-8OGuxXrbDN1ReTF6kWbcEW4,10234
|
|
311
|
-
empathy_software_plugin/wizards/security/vulnerability_scanner.py,sha256=
|
|
311
|
+
empathy_software_plugin/wizards/security/vulnerability_scanner.py,sha256=lMFPPzRyf4fZZqjhdlhT49ciGuRnwF0a1w89VZB-9aA,23685
|
|
312
312
|
empathy_software_plugin/wizards/testing/__init__.py,sha256=yfVkFo1374ZaJvdgtq9TBprzAFHqlcp8yBydAnnaHIw,707
|
|
313
313
|
empathy_software_plugin/wizards/testing/coverage_analyzer.py,sha256=k37_GJL895OKmZTficg-HKzfMjdm9YC4kpH5ELszHtQ,16113
|
|
314
|
-
empathy_software_plugin/wizards/testing/quality_analyzer.py,sha256=
|
|
315
|
-
empathy_software_plugin/wizards/testing/test_suggester.py,sha256=
|
|
314
|
+
empathy_software_plugin/wizards/testing/quality_analyzer.py,sha256=7hM2aqaMHGq0T-44gwDqKXexURkdWDxQXx0w_XagQxA,17617
|
|
315
|
+
empathy_software_plugin/wizards/testing/test_suggester.py,sha256=DoPEzqqU52QdEVEuORDju2bISWRwNz9ZLHW96wRoBl8,17915
|
|
316
316
|
wizards/__init__.py,sha256=5JJ6rtS5mwJtuZIgO2sYHZlCy0XJP2eyyCK5zMD6ZAc,2452
|
|
317
317
|
wizards/admission_assessment_wizard.py,sha256=-Th9bwu6Sd6V2jA4fciK35QpoFc40U1quZHDMdOH93U,23609
|
|
318
318
|
wizards/care_plan.py,sha256=YVjjmbdUptOSkgkbhCIioHbcgISgzvIhlRiHZ3xvUJQ,10728
|
|
@@ -334,8 +334,8 @@ workflow_scaffolding/__init__.py,sha256=UpX5vjjjPjIaAKyIV1D4GxJzLUZy5DzdzgSkePYM
|
|
|
334
334
|
workflow_scaffolding/__main__.py,sha256=0qspuNoadTDqyskXTlT8Sahqau-XIxN35NHTSGVW6z4,236
|
|
335
335
|
workflow_scaffolding/cli.py,sha256=R4rCTDENRMil2c3v32MnisqteFRDfilS6RHBNlYV39Q,6752
|
|
336
336
|
workflow_scaffolding/generator.py,sha256=whWbBmWEA0rN3M3X9EzTjfbwBxHcF40Jin8-nbj0S0E,8858
|
|
337
|
-
empathy_framework-3.
|
|
338
|
-
empathy_framework-3.
|
|
339
|
-
empathy_framework-3.
|
|
340
|
-
empathy_framework-3.
|
|
341
|
-
empathy_framework-3.
|
|
337
|
+
empathy_framework-3.10.1.dist-info/METADATA,sha256=zfKPI4kz7zONf-LqIarSuFz2zACBPMIiSiWnqjJkaFw,51251
|
|
338
|
+
empathy_framework-3.10.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
339
|
+
empathy_framework-3.10.1.dist-info/entry_points.txt,sha256=zMu7sKCiLndbEEXjTecltS-1P_JZoEUKrifuRBBbroc,1268
|
|
340
|
+
empathy_framework-3.10.1.dist-info/top_level.txt,sha256=wrNU1aVMutVDACer58H-udv0P_171Dv6z_42sZtZ-xM,124
|
|
341
|
+
empathy_framework-3.10.1.dist-info/RECORD,,
|
|
@@ -874,9 +874,24 @@ Rules:
|
|
|
874
874
|
issues = []
|
|
875
875
|
passed = True
|
|
876
876
|
|
|
877
|
+
# Only scan production code directories
|
|
878
|
+
production_paths = [
|
|
879
|
+
"src/",
|
|
880
|
+
"empathy_software_plugin/",
|
|
881
|
+
"empathy_healthcare_plugin/",
|
|
882
|
+
"empathy_llm_toolkit/",
|
|
883
|
+
"patterns/",
|
|
884
|
+
"tests/",
|
|
885
|
+
]
|
|
886
|
+
|
|
887
|
+
# Use production paths if checking current directory
|
|
888
|
+
scan_paths = production_paths if path in [".", "./"] else [path]
|
|
889
|
+
|
|
877
890
|
try:
|
|
878
891
|
result = subprocess.run(
|
|
879
|
-
["python", "-m", "mypy"
|
|
892
|
+
["python", "-m", "mypy"]
|
|
893
|
+
+ scan_paths
|
|
894
|
+
+ ["--ignore-missing-imports", "--no-error-summary"],
|
|
880
895
|
check=False,
|
|
881
896
|
capture_output=True,
|
|
882
897
|
text=True,
|
|
@@ -925,44 +940,36 @@ Rules:
|
|
|
925
940
|
issues = []
|
|
926
941
|
passed = True
|
|
927
942
|
|
|
943
|
+
# Only run tests in tests/ directory for production health check
|
|
944
|
+
test_path = "tests/" if path in [".", "./"] else path
|
|
945
|
+
|
|
928
946
|
try:
|
|
929
947
|
result = subprocess.run(
|
|
930
|
-
["python", "-m", "pytest",
|
|
948
|
+
["python", "-m", "pytest", test_path, "--collect-only", "-q"],
|
|
931
949
|
check=False,
|
|
932
950
|
capture_output=True,
|
|
933
951
|
text=True,
|
|
934
|
-
timeout=
|
|
935
|
-
cwd=path if Path(path).is_dir() else ".",
|
|
952
|
+
timeout=60,
|
|
936
953
|
)
|
|
937
954
|
|
|
938
955
|
if result.returncode != 0:
|
|
939
956
|
passed = False
|
|
940
957
|
|
|
941
|
-
#
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
elif "ERROR" in line and "test" in line.lower():
|
|
957
|
-
issues.append(
|
|
958
|
-
HealthIssue(
|
|
959
|
-
title=f"Test error: {line[:50]}",
|
|
960
|
-
description=line,
|
|
961
|
-
category=HealthCategory.TESTS,
|
|
962
|
-
severity=IssueSeverity.CRITICAL,
|
|
963
|
-
tool="pytest",
|
|
964
|
-
),
|
|
965
|
-
)
|
|
958
|
+
# Check for collection errors in stderr
|
|
959
|
+
error_output = result.stderr + result.stdout
|
|
960
|
+
for line in error_output.splitlines()[:50]:
|
|
961
|
+
if "ERROR" in line or "INTERNALERROR" in line:
|
|
962
|
+
# Only report actual errors, not counts
|
|
963
|
+
if "error" in line.lower() and not line.strip().startswith("="):
|
|
964
|
+
issues.append(
|
|
965
|
+
HealthIssue(
|
|
966
|
+
title=f"Test error: {line[:50]}",
|
|
967
|
+
description=line,
|
|
968
|
+
category=HealthCategory.TESTS,
|
|
969
|
+
severity=IssueSeverity.CRITICAL,
|
|
970
|
+
tool="pytest",
|
|
971
|
+
),
|
|
972
|
+
)
|
|
966
973
|
|
|
967
974
|
except (subprocess.TimeoutExpired, FileNotFoundError) as e:
|
|
968
975
|
logger.warning(f"Test check failed: {e}")
|
empathy_os/__init__.py
CHANGED
empathy_os/cache/hybrid.py
CHANGED
|
@@ -15,11 +15,13 @@ Licensed under Fair Source License 0.9
|
|
|
15
15
|
import hashlib
|
|
16
16
|
import logging
|
|
17
17
|
import time
|
|
18
|
+
from pathlib import Path
|
|
18
19
|
from typing import TYPE_CHECKING, Any
|
|
19
20
|
|
|
20
21
|
import numpy as np
|
|
21
22
|
|
|
22
23
|
from .base import BaseCache, CacheEntry, CacheStats
|
|
24
|
+
from .storage import CacheStorage
|
|
23
25
|
|
|
24
26
|
if TYPE_CHECKING:
|
|
25
27
|
from sentence_transformers import SentenceTransformer
|
|
@@ -77,6 +79,7 @@ class HybridCache(BaseCache):
|
|
|
77
79
|
similarity_threshold: float = 0.95,
|
|
78
80
|
model_name: str = "all-MiniLM-L6-v2",
|
|
79
81
|
device: str = "cpu",
|
|
82
|
+
cache_dir: Path | None = None,
|
|
80
83
|
):
|
|
81
84
|
"""Initialize hybrid cache.
|
|
82
85
|
|
|
@@ -87,6 +90,7 @@ class HybridCache(BaseCache):
|
|
|
87
90
|
similarity_threshold: Semantic similarity threshold (0.0-1.0, default: 0.95).
|
|
88
91
|
model_name: Sentence transformer model (default: all-MiniLM-L6-v2).
|
|
89
92
|
device: Device for embeddings ("cpu" or "cuda").
|
|
93
|
+
cache_dir: Directory for persistent cache storage (default: ~/.empathy/cache/).
|
|
90
94
|
|
|
91
95
|
"""
|
|
92
96
|
super().__init__(max_size_mb, default_ttl)
|
|
@@ -106,9 +110,16 @@ class HybridCache(BaseCache):
|
|
|
106
110
|
self._model: SentenceTransformer | None = None
|
|
107
111
|
self._load_model()
|
|
108
112
|
|
|
113
|
+
# Initialize persistent storage
|
|
114
|
+
self._storage = CacheStorage(cache_dir=cache_dir, max_disk_mb=max_size_mb)
|
|
115
|
+
|
|
116
|
+
# Load existing entries from storage into memory caches
|
|
117
|
+
self._load_from_storage()
|
|
118
|
+
|
|
109
119
|
logger.info(
|
|
110
120
|
f"HybridCache initialized (model: {model_name}, threshold: {similarity_threshold}, "
|
|
111
|
-
f"device: {device}, max_memory: {max_memory_mb}MB
|
|
121
|
+
f"device: {device}, max_memory: {max_memory_mb}MB, "
|
|
122
|
+
f"loaded: {len(self._hash_cache)} entries from disk)"
|
|
112
123
|
)
|
|
113
124
|
|
|
114
125
|
def _load_model(self) -> None:
|
|
@@ -131,6 +142,34 @@ class HybridCache(BaseCache):
|
|
|
131
142
|
logger.warning("Falling back to hash-only mode")
|
|
132
143
|
self._model = None
|
|
133
144
|
|
|
145
|
+
def _load_from_storage(self) -> None:
|
|
146
|
+
"""Load cached entries from persistent storage into memory caches."""
|
|
147
|
+
try:
|
|
148
|
+
# Get all non-expired entries from storage
|
|
149
|
+
entries = self._storage.get_all()
|
|
150
|
+
|
|
151
|
+
if not entries:
|
|
152
|
+
logger.debug("No cached entries found in storage")
|
|
153
|
+
return
|
|
154
|
+
|
|
155
|
+
# Populate hash cache
|
|
156
|
+
for entry in entries:
|
|
157
|
+
self._hash_cache[entry.key] = entry
|
|
158
|
+
self._access_times[entry.key] = entry.timestamp
|
|
159
|
+
|
|
160
|
+
logger.info(f"Loaded {len(entries)} entries from persistent storage into hash cache")
|
|
161
|
+
|
|
162
|
+
# Populate semantic cache if model available
|
|
163
|
+
if self._model is not None:
|
|
164
|
+
logger.debug("Generating embeddings for cached prompts...")
|
|
165
|
+
# Note: We don't have the original prompts, so semantic cache
|
|
166
|
+
# will be populated on-demand as cache hits occur
|
|
167
|
+
# This is acceptable since semantic matching is secondary to hash matching
|
|
168
|
+
logger.debug("Semantic cache will be populated on-demand from hash hits")
|
|
169
|
+
|
|
170
|
+
except Exception as e:
|
|
171
|
+
logger.warning(f"Failed to load cache from storage: {e}, starting with empty cache")
|
|
172
|
+
|
|
134
173
|
def get(
|
|
135
174
|
self,
|
|
136
175
|
workflow: str,
|
|
@@ -257,7 +296,7 @@ class HybridCache(BaseCache):
|
|
|
257
296
|
response: Any,
|
|
258
297
|
ttl: int | None = None,
|
|
259
298
|
) -> None:
|
|
260
|
-
"""Store response in both hash and semantic caches.
|
|
299
|
+
"""Store response in both hash and semantic caches, and persist to disk.
|
|
261
300
|
|
|
262
301
|
Args:
|
|
263
302
|
workflow: Workflow name.
|
|
@@ -295,14 +334,26 @@ class HybridCache(BaseCache):
|
|
|
295
334
|
prompt_embedding = self._model.encode(prompt, convert_to_numpy=True)
|
|
296
335
|
self._semantic_cache.append((prompt_embedding, entry))
|
|
297
336
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
337
|
+
# Persist to disk storage
|
|
338
|
+
try:
|
|
339
|
+
self._storage.put(entry)
|
|
340
|
+
logger.debug(
|
|
341
|
+
f"Cache PUT (hybrid): {workflow}/{stage} "
|
|
342
|
+
f"(hash_entries: {len(self._hash_cache)}, "
|
|
343
|
+
f"semantic_entries: {len(self._semantic_cache)}, "
|
|
344
|
+
f"persisted: True)"
|
|
345
|
+
)
|
|
346
|
+
except Exception as e:
|
|
347
|
+
logger.warning(f"Failed to persist cache entry to disk: {e}")
|
|
348
|
+
logger.debug(
|
|
349
|
+
f"Cache PUT (hybrid): {workflow}/{stage} "
|
|
350
|
+
f"(hash_entries: {len(self._hash_cache)}, "
|
|
351
|
+
f"semantic_entries: {len(self._semantic_cache)}, "
|
|
352
|
+
f"persisted: False)"
|
|
353
|
+
)
|
|
303
354
|
|
|
304
355
|
def clear(self) -> None:
|
|
305
|
-
"""Clear all cached entries."""
|
|
356
|
+
"""Clear all cached entries from memory and disk."""
|
|
306
357
|
hash_count = len(self._hash_cache)
|
|
307
358
|
semantic_count = len(self._semantic_cache)
|
|
308
359
|
|
|
@@ -310,7 +361,16 @@ class HybridCache(BaseCache):
|
|
|
310
361
|
self._access_times.clear()
|
|
311
362
|
self._semantic_cache.clear()
|
|
312
363
|
|
|
313
|
-
|
|
364
|
+
# Clear persistent storage
|
|
365
|
+
try:
|
|
366
|
+
storage_count = self._storage.clear()
|
|
367
|
+
logger.info(
|
|
368
|
+
f"Cache cleared (hash: {hash_count}, semantic: {semantic_count}, "
|
|
369
|
+
f"storage: {storage_count} entries)"
|
|
370
|
+
)
|
|
371
|
+
except Exception as e:
|
|
372
|
+
logger.warning(f"Failed to clear persistent storage: {e}")
|
|
373
|
+
logger.info(f"Cache cleared (hash: {hash_count}, semantic: {semantic_count} entries)")
|
|
314
374
|
|
|
315
375
|
def get_stats(self) -> CacheStats:
|
|
316
376
|
"""Get cache statistics."""
|