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.
Files changed (32) hide show
  1. {empathy_framework-3.9.2.dist-info → empathy_framework-3.10.1.dist-info}/METADATA +37 -5
  2. {empathy_framework-3.9.2.dist-info → empathy_framework-3.10.1.dist-info}/RECORD +32 -32
  3. empathy_llm_toolkit/agent_factory/crews/health_check.py +36 -29
  4. empathy_os/__init__.py +1 -1
  5. empathy_os/cache/hybrid.py +69 -9
  6. empathy_os/cli.py +183 -18
  7. empathy_os/cli_unified.py +113 -4
  8. empathy_os/config.py +7 -4
  9. empathy_os/hot_reload/integration.py +2 -1
  10. empathy_os/hot_reload/watcher.py +8 -4
  11. empathy_os/hot_reload/websocket.py +2 -1
  12. empathy_os/models/telemetry.py +900 -2
  13. empathy_os/test_generator/generator.py +1 -1
  14. empathy_os/tier_recommender.py +3 -3
  15. empathy_os/workflows/base.py +5 -2
  16. empathy_os/workflows/health_check.py +37 -0
  17. empathy_os/workflows/new_sample_workflow1.py +3 -3
  18. empathy_os/workflows/tier_tracking.py +1 -1
  19. empathy_software_plugin/wizards/advanced_debugging_wizard.py +9 -6
  20. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +1 -1
  21. empathy_software_plugin/wizards/debugging/config_loaders.py +6 -2
  22. empathy_software_plugin/wizards/debugging/language_patterns.py +4 -2
  23. empathy_software_plugin/wizards/debugging/linter_parsers.py +1 -1
  24. empathy_software_plugin/wizards/performance/profiler_parsers.py +7 -7
  25. empathy_software_plugin/wizards/security/vulnerability_scanner.py +1 -1
  26. empathy_software_plugin/wizards/security_analysis_wizard.py +2 -2
  27. empathy_software_plugin/wizards/testing/quality_analyzer.py +3 -9
  28. empathy_software_plugin/wizards/testing/test_suggester.py +1 -1
  29. {empathy_framework-3.9.2.dist-info → empathy_framework-3.10.1.dist-info}/WHEEL +0 -0
  30. {empathy_framework-3.9.2.dist-info → empathy_framework-3.10.1.dist-info}/entry_points.txt +0 -0
  31. {empathy_framework-3.9.2.dist-info → empathy_framework-3.10.1.dist-info}/licenses/LICENSE +0 -0
  32. {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.9.2
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,>=0.1.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.9.0 (Current Release)
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.9.2.dist-info/licenses/LICENSE,sha256=IJ9eeI5KSrD5P7alsn7sI_6_1bDihxBA5S4Sen4jf2k,4937
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=DDGAvq65LtXRrcpIdMj4GitmonvDFQgxZlM-0Sd3xTA,43788
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=29Xhv1VoZUwu7HTEHeVzjMtkWbyHaAcbUh4eZSQKJnU,5896
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=wT131LYtNskfOu8thDjrv724UXyjaRUuuFmylZqr_YM,110271
99
- empathy_os/cli_unified.py,sha256=i8tEnXmMyqegLJ4Yggd_GU9XO3AAyPQuV5i_DT1F6M8,23539
100
- empathy_os/config.py,sha256=nMzv4MJa4AiasMsip4z2zf11Dt-XigwHnXmyskUFbio,16172
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=bo69PuKO_3OxafX3-alPWhOuqY03NifrL6jPWPaAXM4,14144
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=d8R-r1IarW5tEKtjyBsFVSFKv_mGmn9jPhRUzqaST6o,12588
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=R-gRov0aqbnyAOE4Zcy-L8mPkFK4-riUy2kIyjBk8-w,6665
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=zmfemQzA94IrO86A6tjYm-Skg5rBAz0mnX8t1hTBbao,4978
139
- empathy_os/hot_reload/websocket.py,sha256=YjqmzGfQHtBwnXqgc5dz3sXHFvcts51KGW8qxqf5dQE,5027
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=BLtmbs90tO59WQhA_AKeL4saQZqbjhVZdfQLJB92oxY,16653
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=w0BXCZg_BphJ4kaA3FkbBC2uZK2xamN4XfWTtlvWdgc,9791
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=fnKeZXaFfPk6SUKbqV1P7aJVGueFJSd0O32PPoquWG8,66320
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=1yxNPV4wpLNEoMlbTm_S9Dlbp7q4L3WZM5kL_1LKVDQ,24633
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=GBUdgGtjrA1h7Xrdt14GsWjcMYvRMIPgRDM1gZ7Qex0,3978
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=aSTuRpY1UhDiGbUinYTwsLph5_4xdF4iivTLjQGtjZQ,14027
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=ue_iQu6MlNSrqU54BSviWCXsV-V_t4qW0DUWAp4TBdk,14545
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=2d9wYP-3oHvj9Hz3l2t6oPP3VEj8xE3bkMnmIlcnIPw,12306
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=BMjTHE6--nuzWKg8Rz6avNFm1LCTbrlLxpEfGPyaW6M,15770
299
- empathy_software_plugin/wizards/debugging/config_loaders.py,sha256=OtFaDZX9kAfXER-0FaKqPK7Nao6O9nqvj6KPKBtW7Q4,13412
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=6nrPX_800kXRbDuj5yndM29pAbUD0asPsR9E7BbM3Dw,15184
302
- empathy_software_plugin/wizards/debugging/linter_parsers.py,sha256=eD94fAJVjzZP6noaQJxqLNVkH2VJL3IeukEh8lANRqo,15508
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=H8Q35mrV_s4_TWLHRV06hbBeNSMx7Sph3ShjudtnxiE,8889
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=rbYcUU6Kdc6TkOFPgP5CHgfnfOCLSvI4c4NbtDUV4ww,23664
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=dvpc0ryaFXafKeKws9dEUbkFk0fj1U2FIIRCzD4vAnA,17744
315
- empathy_software_plugin/wizards/testing/test_suggester.py,sha256=EVq1AWD2vRI6Jd9vSQu8NrVnOOyit2oOx4Xyw9_4eg8,17873
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.9.2.dist-info/METADATA,sha256=tkHSoLo3cUA_OP4nhZTj03rBQpeaKxlOgzfIsgx9Cik,50099
338
- empathy_framework-3.9.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
339
- empathy_framework-3.9.2.dist-info/entry_points.txt,sha256=zMu7sKCiLndbEEXjTecltS-1P_JZoEUKrifuRBBbroc,1268
340
- empathy_framework-3.9.2.dist-info/top_level.txt,sha256=wrNU1aVMutVDACer58H-udv0P_171Dv6z_42sZtZ-xM,124
341
- empathy_framework-3.9.2.dist-info/RECORD,,
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", path, "--ignore-missing-imports", "--no-error-summary"],
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", path, "--tb=line", "-q", "--no-header"],
948
+ ["python", "-m", "pytest", test_path, "--collect-only", "-q"],
931
949
  check=False,
932
950
  capture_output=True,
933
951
  text=True,
934
- timeout=180,
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
- # Parse output for failures
942
- for line in result.stdout.splitlines()[:50]:
943
- if "FAILED" in line:
944
- # Extract test name
945
- test_name = line.split("FAILED")[0].strip()
946
- issues.append(
947
- HealthIssue(
948
- title=f"Test failed: {test_name[:50]}",
949
- description=line,
950
- category=HealthCategory.TESTS,
951
- severity=IssueSeverity.HIGH,
952
- file_path=test_name.split("::")[0] if "::" in test_name else None,
953
- tool="pytest",
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
@@ -55,7 +55,7 @@ Copyright 2025 Smart AI Memory, LLC
55
55
  Licensed under Fair Source 0.9
56
56
  """
57
57
 
58
- __version__ = "3.8.3"
58
+ __version__ = "3.9.3"
59
59
  __author__ = "Patrick Roebuck"
60
60
  __email__ = "hello@deepstudy.ai"
61
61
 
@@ -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
- logger.debug(
299
- f"Cache PUT (hybrid): {workflow}/{stage} "
300
- f"(hash_entries: {len(self._hash_cache)}, "
301
- f"semantic_entries: {len(self._semantic_cache)})"
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
- logger.info(f"Cache cleared (hash: {hash_count}, semantic: {semantic_count} entries)")
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."""