empathy-framework 5.2.1__py3-none-any.whl → 5.3.0__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 (49) hide show
  1. {empathy_framework-5.2.1.dist-info → empathy_framework-5.3.0.dist-info}/METADATA +28 -4
  2. {empathy_framework-5.2.1.dist-info → empathy_framework-5.3.0.dist-info}/RECORD +27 -49
  3. empathy_os/__init__.py +1 -1
  4. empathy_os/cache/hybrid.py +5 -1
  5. empathy_os/cli/commands/batch.py +8 -0
  6. empathy_os/cli/commands/profiling.py +4 -0
  7. empathy_os/cli/commands/workflow.py +8 -4
  8. empathy_os/config.py +15 -2
  9. empathy_os/dashboard/simple_server.py +62 -30
  10. empathy_os/memory/long_term.py +5 -5
  11. empathy_os/memory/mixins/backend_init_mixin.py +6 -1
  12. empathy_os/memory/mixins/capabilities_mixin.py +12 -3
  13. empathy_os/memory/short_term.py +54 -12
  14. empathy_os/memory/simple_storage.py +3 -3
  15. empathy_os/memory/types.py +8 -3
  16. empathy_os/telemetry/agent_coordination.py +2 -3
  17. empathy_os/telemetry/agent_tracking.py +26 -7
  18. empathy_os/telemetry/approval_gates.py +18 -24
  19. empathy_os/telemetry/event_streaming.py +7 -3
  20. empathy_os/telemetry/feedback_loop.py +28 -15
  21. empathy_os/workflows/output.py +4 -1
  22. empathy_os/workflows/progress.py +8 -2
  23. empathy_os/cli/parsers/cache 2.py +0 -65
  24. empathy_os/cli_router 2.py +0 -416
  25. empathy_os/dashboard/app 2.py +0 -512
  26. empathy_os/dashboard/simple_server 2.py +0 -403
  27. empathy_os/dashboard/standalone_server 2.py +0 -536
  28. empathy_os/models/adaptive_routing 2.py +0 -437
  29. empathy_os/project_index/scanner_parallel 2.py +0 -291
  30. empathy_os/telemetry/agent_coordination 2.py +0 -478
  31. empathy_os/telemetry/agent_tracking 2.py +0 -350
  32. empathy_os/telemetry/approval_gates 2.py +0 -563
  33. empathy_os/telemetry/event_streaming 2.py +0 -405
  34. empathy_os/telemetry/feedback_loop 2.py +0 -557
  35. empathy_os/vscode_bridge 2.py +0 -173
  36. empathy_os/workflows/document_gen.py +0 -29
  37. empathy_os/workflows/progressive/__init__ 2.py +0 -92
  38. empathy_os/workflows/progressive/cli 2.py +0 -242
  39. empathy_os/workflows/progressive/core 2.py +0 -488
  40. empathy_os/workflows/progressive/orchestrator 2.py +0 -701
  41. empathy_os/workflows/progressive/reports 2.py +0 -528
  42. empathy_os/workflows/progressive/telemetry 2.py +0 -280
  43. empathy_os/workflows/progressive/test_gen 2.py +0 -514
  44. empathy_os/workflows/progressive/workflow 2.py +0 -628
  45. {empathy_framework-5.2.1.dist-info → empathy_framework-5.3.0.dist-info}/WHEEL +0 -0
  46. {empathy_framework-5.2.1.dist-info → empathy_framework-5.3.0.dist-info}/entry_points.txt +0 -0
  47. {empathy_framework-5.2.1.dist-info → empathy_framework-5.3.0.dist-info}/licenses/LICENSE +0 -0
  48. {empathy_framework-5.2.1.dist-info → empathy_framework-5.3.0.dist-info}/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md +0 -0
  49. {empathy_framework-5.2.1.dist-info → empathy_framework-5.3.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: empathy-framework
3
- Version: 5.2.1
3
+ Version: 5.3.0
4
4
  Summary: AI collaboration framework with real LLM agent execution, AskUserQuestion tool integration, Socratic agent generation, progressive tier escalation (70-85% cost savings), meta-orchestration, dynamic agent composition (10 patterns including Anthropic-inspired), intelligent caching (85% hit rate), semantic workflow discovery, visual workflow editor, MCP integration for Claude Code, and multi-agent orchestration.
5
5
  Author-email: Patrick Roebuck <admin@smartaimemory.com>
6
6
  Maintainer-email: Smart-AI-Memory <admin@smartaimemory.com>
@@ -444,7 +444,7 @@ pip install empathy-framework[developer]
444
444
  **Empathy Framework is evolving to focus exclusively on Anthropic/Claude** to unlock features impossible with multi-provider abstraction:
445
445
 
446
446
  - **📦 Prompt Caching:** 90% cost reduction on repeated prompts
447
- - **📖 200K Context:** Largest context window available (vs 128K for competitors)
447
+ - **📖 Flexible Context:** 200K via subscription for most tasks, up to 1M via API for large codebases
448
448
  - **🧠 Extended Thinking:** See Claude's internal reasoning process
449
449
  - **🔧 Advanced Tool Use:** Optimized for agentic workflows
450
450
 
@@ -458,6 +458,30 @@ pip install empathy-framework[developer]
458
458
 
459
459
  ---
460
460
 
461
+ ## What's New in v5.3.0
462
+
463
+ **🎨 Dashboard Enhancements** - Improved usability and clarity:
464
+
465
+ - **Agent Display Names** - Human-readable labels for agents in dashboard (e.g., "Code Analyzer" instead of UUID)
466
+ - **Comprehensive Help Panel** - 5-section accordion explaining dashboard features, use cases, and Redis setup
467
+ - **UX Improvements** - "Source Agent:" label clarity, "Redis Requires Enabling" status message
468
+ - **Browser Cache Busting** - Date-based versioning ensures updates appear immediately
469
+
470
+ **📚 Documentation Improvements**:
471
+
472
+ - Clarified flexible context strategy (200K subscription + 1M API routing)
473
+ - Added Redis requirement documentation for dashboard
474
+ - Root directory cleanup (8 archived files)
475
+
476
+ **🧪 Test Infrastructure**:
477
+
478
+ - Sequential test execution to fix import timing issues
479
+ - All agent tracking tests passing (19/19)
480
+
481
+ [See Full Changelog](CHANGELOG.md#530---2026-01-31)
482
+
483
+ ---
484
+
461
485
  ## What's New in v5.1.0
462
486
 
463
487
  **🤖 Multi-Agent Orchestration** - Full support for custom agents and Anthropic LLM agents:
@@ -472,7 +496,7 @@ pip install empathy-framework[developer]
472
496
 
473
497
  - **Custom Agents** - Build specialized agents for your workflow needs
474
498
  - **LLM Agents from Anthropic** - Leverage Claude's advanced capabilities
475
- - Dashboard accessible at `http://localhost:8000` with `python examples/dashboard_demo.py`
499
+ - Dashboard accessible at `http://localhost:8000` with `python examples/dashboard_demo.py` **(Requires Redis)**
476
500
 
477
501
  **🔐 Authentication Strategy System** - Intelligent routing between Claude subscriptions and Anthropic API:
478
502
 
@@ -902,7 +926,7 @@ export ANTHROPIC_API_KEY="sk-ant-..."
902
926
  export OPENAI_API_KEY="sk-..."
903
927
  export GOOGLE_API_KEY="..."
904
928
 
905
- # Optional: Redis for memory
929
+ # Optional (but required for Agent Dashboard): Redis for memory
906
930
  export REDIS_URL="redis://localhost:6379"
907
931
  ```
908
932
 
@@ -1,5 +1,5 @@
1
- empathy_framework-5.2.1.dist-info/licenses/LICENSE,sha256=kqe3EeGatNB79lUTHxjLnxDe7VJr0iYetThOr4_Fx7A,11348
2
- empathy_framework-5.2.1.dist-info/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md,sha256=Grc_xHyZL62DTvEQ-fPH2sgX8mdkgjws4yeDFWTJRV0,3868
1
+ empathy_framework-5.3.0.dist-info/licenses/LICENSE,sha256=kqe3EeGatNB79lUTHxjLnxDe7VJr0iYetThOr4_Fx7A,11348
2
+ empathy_framework-5.3.0.dist-info/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md,sha256=Grc_xHyZL62DTvEQ-fPH2sgX8mdkgjws4yeDFWTJRV0,3868
3
3
  empathy_healthcare_plugin/__init__.py,sha256=4NioL1_86UXzkd-QNkQZUSZ8rKTQGSP0TC9VXP32kQs,295
4
4
  empathy_healthcare_plugin/monitors/__init__.py,sha256=Udp8qfZR504QAq5_eQjvtIaE7v06Yguc7nuF40KllQc,196
5
5
  empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py,sha256=MWE5t8tW9HWZn_SNo-inx8-0nhdTNGhbcB8ZeDWyXa0,11648
@@ -95,16 +95,15 @@ empathy_llm_toolkit/security/secure_memdocs.py,sha256=x6won-u3tiBkv5ZPVRpSJKTs1m
95
95
  empathy_llm_toolkit/security/secure_memdocs_example.py,sha256=4UwbaM5X-c93p4_3pz6LKaeNYzfxptzbsYY_-ZuG0A0,8359
96
96
  empathy_llm_toolkit/utils/__init__.py,sha256=b2Juy_nuMJ7Ax9tck725V7i3s5shaMSfqZZbiJ2-rOc,187
97
97
  empathy_llm_toolkit/utils/tokens.py,sha256=vu5aggQYmoESIG1dkFahfX6hs6QiyPPF0gMTEp9mGak,11220
98
- empathy_os/__init__.py,sha256=mSKSAXKqkjmV2HP5TqwE_3HTPE0ijeUpB04VDkgLMZM,12061
98
+ empathy_os/__init__.py,sha256=5ng8THjtd_o6UYa5rGNfchWaCfDWyaF2adJSs8pHvHs,12061
99
99
  empathy_os/agent_monitoring.py,sha256=s4seLC_J4AtQ3PYWrRPO8YHM-Fbm0Q36kPEdlTHf2HI,13375
100
100
  empathy_os/cache_monitor.py,sha256=lcBqODhYY9iPaH35PWkOSgyMavdvXneHv9F57dPmjnc,11190
101
101
  empathy_os/cache_stats.py,sha256=rWJPBNFEfhuLwKYKy89D_Qa9GPIyVso2jdCKp_cdJhI,10232
102
102
  empathy_os/cli_legacy.py,sha256=x5z48dIfBcUHdhkMLT2q99iVZ2o7UFXyk46P4bgfj0s,140265
103
103
  empathy_os/cli_minimal.py,sha256=Tp47-M7ptrBAAsdkwFXrE2IK7SJPj3_EjHZP1DtpWVM,41188
104
- empathy_os/cli_router 2.py,sha256=86gc917B1hfmnv1nEfNLQU7_uyDbuu9ORSH5eofcIXE,14616
105
104
  empathy_os/cli_router.py,sha256=rSGEKafKLvFO-LUlJfcwdvMS32xBhmVNyRcPcxc1h3s,16131
106
105
  empathy_os/cli_unified.py,sha256=w80cyED93QFu3puC4qiIrrLtTmsfTi2stPsHGqroUfI,25387
107
- empathy_os/config.py,sha256=jsFQuXpZP_jt6UrZtfLlkBZwPUSNbnW5VVtMS5JIhbA,16276
106
+ empathy_os/config.py,sha256=wzBHoUjfdU6WWNoKxQpTrCuaH0psJmnr5QRxBd0aUaI,16731
108
107
  empathy_os/coordination.py,sha256=E2HvHxKk1xbYswtgxhnVKB6DRxfXUV5pCt-XWHOvNKM,28509
109
108
  empathy_os/core.py,sha256=JSqejXdUIced5FZpoOr2_DF5BaRfWnXlZkuDDQkg5Cw,53968
110
109
  empathy_os/cost_tracker.py,sha256=00QFmAsV0k4aJ8_TjcsOrUGLvG7I-BSJgs3TjBPHfIo,22997
@@ -125,7 +124,6 @@ empathy_os/templates.py,sha256=B5fzlc6wU3lwdaKK4ZUdytqOYrM6TEnFteZ0nCSp_EI,17220
125
124
  empathy_os/tier_recommender.py,sha256=oYOKhnrTG2sqYsDvojQyaKuyC4ac_weSz4Xv0j0TuP8,14305
126
125
  empathy_os/tools.py,sha256=YCfHTm9Es6wwh7oESt4q0mDz7AV8ecvMAB_1_0516r4,6225
127
126
  empathy_os/trust_building.py,sha256=z2ZsQWK5QjX6d7pxFWrFD54J1keUguTog6YztZJVPKI,19180
128
- empathy_os/vscode_bridge 2.py,sha256=SgFmWFCoAoPww-g2hsRC2VeqAMTqUmXXxJ3hglykxP4,4967
129
127
  empathy_os/vscode_bridge.py,sha256=SgFmWFCoAoPww-g2hsRC2VeqAMTqUmXXxJ3hglykxP4,4967
130
128
  empathy_os/workflow_commands.py,sha256=tps6norBiw7Q2hV0qdqwdX4B7Kedt_FwYBQWhc2oEYg,25482
131
129
  empathy_os/adaptive/__init__.py,sha256=07m_Gsdxmm9mDBjJRFz7a8wZK-Tdd2QFRQOUw6yCc1w,342
@@ -134,13 +132,13 @@ empathy_os/cache/__init__.py,sha256=nKHyWnQmyBU6f24UOq5iZ4ULUFys5Dhl6dFZlU0jlHU,
134
132
  empathy_os/cache/base.py,sha256=1waj2OZ_5gRhwYhSfsSfgQs1N_ftZcAq6UAV9RctSek,3968
135
133
  empathy_os/cache/dependency_manager.py,sha256=lObktgRVeN-Z1ajGpAPuTvW1bOlLaHBNvoeGoCdOhAo,7747
136
134
  empathy_os/cache/hash_only.py,sha256=N9fJw-IGOzgfDOuKe15e3AzLrxkjDBbwDXEgR1DYXAo,7492
137
- empathy_os/cache/hybrid.py,sha256=urBT47GOmvc0ez1a-h92p9_ul9aTDsvmSwnTDBIOJbw,15336
135
+ empathy_os/cache/hybrid.py,sha256=uRby-q75IWTOAmubH0jKHdc2h0lZW-xh5T-1cdm69wQ,15542
138
136
  empathy_os/cache/storage.py,sha256=eTXP8rZRlalNRlsZxsaolMg81JNfjDrD129e-p9Wjk0,7792
139
137
  empathy_os/cli/__init__.py,sha256=7PFURX1O4_sX14kWvNrnAV1Ndeixrx_nI8IN8eLQpQs,4951
140
138
  empathy_os/cli/__main__.py,sha256=md0GsFpiTgifmJ0MJQ_E6Daq9JCxyCUgOUJRdJ69Ews,215
141
139
  empathy_os/cli/core.py,sha256=USK7MwpSqxKcMP0rxtf9qqTgQ1GMmcPpXBw9uadQ3sM,883
142
140
  empathy_os/cli/commands/__init__.py,sha256=GYdoNv80KS2p7bCThuoRbhiLmIZW6ddPqPEFEx567nQ,35
143
- empathy_os/cli/commands/batch.py,sha256=1I_xW_zufwhlapnHL4UaOQJbWAKAcZkFU7kp8xQu49c,7946
141
+ empathy_os/cli/commands/batch.py,sha256=ldSUkCbwcKW3g_icAPmNT1-TPcJcUIWzpmtYShr1EO4,8570
144
142
  empathy_os/cli/commands/cache.py,sha256=1KSX_4dv1ZfwtfGxhb5kop-8mSPBCkFFFAI9BCfh9Wk,8188
145
143
  empathy_os/cli/commands/help.py,sha256=AerAgAl0zW8YCCQIkxxc9p9K_wAskDGNhq211elPY_k,10082
146
144
  empathy_os/cli/commands/info.py,sha256=SFwOAhHjIoHRguqbMEPT0lG7bbt72Zv5AFpZjJPfHm8,4794
@@ -150,7 +148,7 @@ empathy_os/cli/commands/memory.py,sha256=1NTgfIHGdjKwsU5fAZZwZI5HUN7b4AE62_UF9ps
150
148
  empathy_os/cli/commands/metrics.py,sha256=pX41tJpvRu-rGip2drdCkgZ0LDxOd0DVGXuV_hEY7ng,3176
151
149
  empathy_os/cli/commands/orchestrate.py,sha256=ifqEGUGaz8aF1mW3muGrbaJRqqJodcBXIyZDIIf1WPA,6553
152
150
  empathy_os/cli/commands/patterns.py,sha256=EVLX4akwGdkZOvJEQZDUojIAa5yK_50rE-TTFzEs-9w,7938
153
- empathy_os/cli/commands/profiling.py,sha256=n_1cyLwwguSHJUj6NKDr5gBuP1gSBLnkQ_ccxUmAkNY,5706
151
+ empathy_os/cli/commands/profiling.py,sha256=C0yLguK3fzLXEqE-FHfxvG59_N0OBIZm054ee4DyEyc,6021
154
152
  empathy_os/cli/commands/provider.py,sha256=Mg8SjNsWKfhhdEZ0RvyfEaR3yiYcGj5L6OE5YFZRRFw,3095
155
153
  empathy_os/cli/commands/routing.py,sha256=5pcDRiSqCHZRJt1m1nU2upEZrvNCM2O84NAzPCA06_c,9904
156
154
  empathy_os/cli/commands/setup.py,sha256=cF_3u7lrxfoyTr-ucu4D4Gc01EqtAQSxrwwU32tDsA0,3456
@@ -158,10 +156,9 @@ empathy_os/cli/commands/status.py,sha256=ZIJx4Y0iMVFW_NDnoio1R6NBcXXS543QD9MwdaP
158
156
  empathy_os/cli/commands/sync.py,sha256=5ABcmJ--puRXEH10yXBMOnqaue1miEPCzYhIbov5pq8,5094
159
157
  empathy_os/cli/commands/tier.py,sha256=3l3j7m83lcaKUFClTb2iU5vkH06zC8-eLGrt-KHdz0M,3745
160
158
  empathy_os/cli/commands/utilities.py,sha256=e4izGTS_uOy4YJDPwPbQnQ20p9M2v3JUyqAQEPwitMc,3737
161
- empathy_os/cli/commands/workflow.py,sha256=OdQAWivZwB7KDleSovXPuFtPYRv__E9UIGzBvtZy278,23215
159
+ empathy_os/cli/commands/workflow.py,sha256=ThU0g2a-4roFHHSfBR6pyKJTV2c2BawpVxvXvTT5YFY,23577
162
160
  empathy_os/cli/parsers/__init__.py,sha256=Oihx1jb5wN_4GS3RxZiEYhQhglI44idOOlFJs9a6e5g,1677
163
161
  empathy_os/cli/parsers/batch.py,sha256=wSutRqerJZxUNVNIotU9qtI8EGP6IzVihEZUViCItCQ,3236
164
- empathy_os/cli/parsers/cache 2.py,sha256=_SpFE48JM1xfAvb_ndqYNR0bP4EyMb_T_PlmIsIHf5o,1797
165
162
  empathy_os/cli/parsers/cache.py,sha256=_SpFE48JM1xfAvb_ndqYNR0bP4EyMb_T_PlmIsIHf5o,1797
166
163
  empathy_os/cli/parsers/help.py,sha256=I3QFDVABxZpYDCJ52GNWwfQlKEdV72Yr9A8spPHqUqU,1642
167
164
  empathy_os/cli/parsers/info.py,sha256=525oPlxKkOJk8tra_a2ga9DKm6VtejQUBWzBCDQK1v4,989
@@ -183,11 +180,8 @@ empathy_os/config/__init__.py,sha256=veciTnRf0kNm9L8wxF95-FBnNjXdxucNnbnLlERpO2Y
183
180
  empathy_os/config/xml_config.py,sha256=iXFJvGPlSoxRdARlxx-7YIdxb8eRiFHVRWM6-HwOWBc,8899
184
181
  empathy_os/core_modules/__init__.py,sha256=jUbjfT2UHOLrJStqvIPqxbr02_2fofqTYqGdXvKxwFI,274
185
182
  empathy_os/dashboard/__init__.py,sha256=gJXfr0R0uA3nHJnay2oYJlWYcGfZIZykr0O_hCUPfLQ,1412
186
- empathy_os/dashboard/app 2.py,sha256=taCHkhSAsnna_joClhLTai5ayevYbh67nJDpOYOU-EA,16147
187
183
  empathy_os/dashboard/app.py,sha256=J1OSKQRDxv6uYTI30fEycpktpDzTn6J5pEO3NhLMkEE,16147
188
- empathy_os/dashboard/simple_server 2.py,sha256=L2uSgCJtiHS7TZSu-iEXpImNTAW4w3zNVg8YNsj5vPs,14667
189
- empathy_os/dashboard/simple_server.py,sha256=L2uSgCJtiHS7TZSu-iEXpImNTAW4w3zNVg8YNsj5vPs,14667
190
- empathy_os/dashboard/standalone_server 2.py,sha256=c6csNtVFTeQNgaCTYC7EhC9A5AyQab8wbFPHy07rZdE,20331
184
+ empathy_os/dashboard/simple_server.py,sha256=XGdSi98eOqvVi7JA3f4_tJogH35WQKgJ5s8No5Q3CHM,16106
191
185
  empathy_os/dashboard/standalone_server.py,sha256=rsJdlHZii3UUbA4Yi3H8KDmc77RGqBbyZUHIOKvFE2M,20862
192
186
  empathy_os/hot_reload/README.md,sha256=FnQWSX-dfTIJvXHjjiWRWBjMK2DR-eyOfDHJlGIzm0o,10406
193
187
  empathy_os/hot_reload/__init__.py,sha256=Aos2tLSKRzOLr5zRomLyzrz6qDRd1_PlinI3vrJcCTo,1642
@@ -208,19 +202,19 @@ empathy_os/memory/edges.py,sha256=O-GVRS9q12-NBGVun8FUbEHE0y3CjHCV1s_KrzC_WZw,59
208
202
  empathy_os/memory/encryption.py,sha256=onZIElhiBBJQ0snIxWnWT9zfzV_g7JPrAMXYNmEUoiY,5140
209
203
  empathy_os/memory/file_session.py,sha256=Iisrqom4bsodpeRFTnugoTcH_fZEhfwgtCD3_oNxXd4,25985
210
204
  empathy_os/memory/graph.py,sha256=JSAag-p5vCh4jznjUTUHdMNfyOAHjtOUDix6eLUeIcA,19023
211
- empathy_os/memory/long_term.py,sha256=OEGb0cJ3ujpu1AGHDTbKx77XywJD2_Um04DVcDSUn7Y,32341
205
+ empathy_os/memory/long_term.py,sha256=H2yKuuKoLxGHWcspsNp6ixUYIjj_jdhxeRG-7WKhk5c,32447
212
206
  empathy_os/memory/long_term_types.py,sha256=tkzcQUmbF-DQEYpjdy5uqThPNI_wK15y96rFYk58e3c,2870
213
207
  empathy_os/memory/nodes.py,sha256=h71kV3x2ALzuTOdrB7LQswZWai71HzGHKlFBzf7TwrI,4795
214
208
  empathy_os/memory/redis_bootstrap.py,sha256=G71loEE2LTcn0BCp_mN96Bk37ygFz1ImORiLoEmg9jA,16508
215
- empathy_os/memory/short_term.py,sha256=vaGBT1dlAM_w0JLf7YX_coy6dl7tbVQCgosgR0XbPeA,70282
216
- empathy_os/memory/simple_storage.py,sha256=uRtmBFibLjU8WXQ7duuWA6-IDyYtoRQ0P5Mo4KmmvJs,9792
209
+ empathy_os/memory/short_term.py,sha256=MjFZuD2d-1Nrh_K7eRZwuqCTUmU8DR21hJq5_0jgB7g,71964
210
+ empathy_os/memory/simple_storage.py,sha256=8nLhB7HOWJCLew-f3C_Apqltfy44L3UshNx3yjRUi9Q,9837
217
211
  empathy_os/memory/storage_backend.py,sha256=E9z8iALiNkwIDbEx9vc4rA4ePv0YDqi0oW81RHddWrc,5046
218
212
  empathy_os/memory/summary_index.py,sha256=7m_m2xH3KMBJWRJFvk3hAws_tgPD4VCfFBxwAbV9fCo,20777
219
- empathy_os/memory/types.py,sha256=ISzAhjWxqtTZiMdhc5DAziHxgtVlEP6mm79Y9HzNru4,14286
213
+ empathy_os/memory/types.py,sha256=MvF82iV9Tb5Wui0PKZGwPTVU4cK977qWOdCKHFkCnHY,14542
220
214
  empathy_os/memory/unified.py,sha256=yHcM6oBNi3Mk7fXaiCig2HxOkGV0kMiIVbmAnExy2Yw,6802
221
215
  empathy_os/memory/mixins/__init__.py,sha256=QhddBtH1TiXrde8d1lUhLSqPrSPK8y8rozSBkXWMV-w,745
222
- empathy_os/memory/mixins/backend_init_mixin.py,sha256=TGnOVeeUK5toLev_1eQTpyV7Ax9FeM542uMA_ZyZRj8,9959
223
- empathy_os/memory/mixins/capabilities_mixin.py,sha256=i4MkST9XwuCYsbBWbDJcu6zroC67WglbEE5ld7YQfu4,6718
216
+ empathy_os/memory/mixins/backend_init_mixin.py,sha256=BINJ_XYHA1GZI1HCEPgXuB5Yole8F-__5sky6nKEKRo,10279
217
+ empathy_os/memory/mixins/capabilities_mixin.py,sha256=i5UxT8ZyEhnZLASJKm3qm5_C2G18ChdcOmBo2CfRkf8,7094
224
218
  empathy_os/memory/mixins/handoff_mixin.py,sha256=lh-TIkMmUmZeB0BeWBksau77Alc5Jc5PAbBTxFUWenM,6938
225
219
  empathy_os/memory/mixins/lifecycle_mixin.py,sha256=zOUpyl0OI2rF49ersLpG7nYPH87rW7-4Fsp4X-VCIas,1356
226
220
  empathy_os/memory/mixins/long_term_mixin.py,sha256=L0O3kbXU0ymkHtrxoU52u0Efw6j3LHqYNBDNzgAOjpA,12328
@@ -255,7 +249,6 @@ empathy_os/metrics/collector.py,sha256=WBrUklvZ9T80a5iz1XyRPvmteMOpftqBYHdBb4DpZ
255
249
  empathy_os/metrics/prompt_metrics.py,sha256=C9N8uIynTP8XiGcwUeOoJRU48vLiS3uK0SKFmVefalo,6518
256
250
  empathy_os/models/__init__.py,sha256=_-s1n1EBdyAdhJE6vd48DQjk3QRQ3ZL-8aW6ccgJLxM,3936
257
251
  empathy_os/models/__main__.py,sha256=V7uZJ_XT__ROZsmnEI4-U7hNsOH1oqzfnWb2o6xJ0g4,296
258
- empathy_os/models/adaptive_routing 2.py,sha256=lbUIb9axWwCyjYN6NpMcnSu-eccxT09xfo3guwndFr4,15224
259
252
  empathy_os/models/adaptive_routing.py,sha256=lbUIb9axWwCyjYN6NpMcnSu-eccxT09xfo3guwndFr4,15224
260
253
  empathy_os/models/auth_cli.py,sha256=gNtugIkCpBloN-xM1jjc7f8mF0OyXDhQo_LXNWUg90s,15754
261
254
  empathy_os/models/auth_strategy.py,sha256=RCWxZYXtViVY6_TKXfP3-67Cn9P0LFMkEKf51QUfG6M,15461
@@ -299,7 +292,6 @@ empathy_os/project_index/index.py,sha256=ZQ53xtPYO2U3E2FyUJF3gQU-8LX_wf5uqr2sj7r
299
292
  empathy_os/project_index/models.py,sha256=_m12jDd4qAzsf5aVVYTwrL36GDor04i4QJobEYLqAMw,17626
300
293
  empathy_os/project_index/reports.py,sha256=MTs2JbMx-mDR6RCUF-KRLkdf5wZOw7AsntdHTH2tcFk,17043
301
294
  empathy_os/project_index/scanner.py,sha256=E1ochUusLcPwOCPezSoEip22qKjTzcPHAnM6-ag1yGQ,31339
302
- empathy_os/project_index/scanner_parallel 2.py,sha256=Dq3f957Yxwu3Dp4c6flVrO9TyRw9O-GWH33jIBMcgBE,10019
303
295
  empathy_os/project_index/scanner_parallel.py,sha256=Dq3f957Yxwu3Dp4c6flVrO9TyRw9O-GWH33jIBMcgBE,10019
304
296
  empathy_os/prompts/__init__.py,sha256=8sbL94w0h6P6kZcZbrXZnGlPqYTz3Fw1VUfCaMLrzlM,1554
305
297
  empathy_os/prompts/config.py,sha256=aV_NbUKwtHJJkggvGSykHApor_EaMJSkAGM5IFzd3NM,3009
@@ -342,17 +334,12 @@ empathy_os/socratic/success.py,sha256=wZoHBkfkzmZwwbEMNdUj8cWw4nLCyKFtGNcWHJDoV9
342
334
  empathy_os/socratic/visual_editor.py,sha256=Nk2vJaTKtcwhHH04KTzRnAVyae6AeA03je2-y74d1kk,27912
343
335
  empathy_os/socratic/web_ui.py,sha256=Sg7pSS1043ecVt_yYpSLnv_6pvGnt6aM742fXq6uJ7M,25375
344
336
  empathy_os/telemetry/__init__.py,sha256=DpNi4Eglyj7mAA4XT3GFpidnvvbVNC7Qo1Te9Q5wQ44,1295
345
- empathy_os/telemetry/agent_coordination 2.py,sha256=ZqtXFq-GR5vdNO18taJYwW78jdzXeWJBMumxiPvTvHo,16072
346
- empathy_os/telemetry/agent_coordination.py,sha256=HD1trP3jZRneuCUhwZ_b3vhzS9gGxL4MTythGQEs_gM,15890
347
- empathy_os/telemetry/agent_tracking 2.py,sha256=o49YUXcVnwfMBFUDKPh2Cw2FfbhL5oIFhk5HecKHVNQ,11655
348
- empathy_os/telemetry/agent_tracking.py,sha256=sdGQN2NGk2F9BUYxAt37ENw8-wpYs4qUWkB6LbpJ228,11659
349
- empathy_os/telemetry/approval_gates 2.py,sha256=WwYolC-3LKR8ippu5qna1GUtiAmZfuHFwMt9vcnxyvo,19933
350
- empathy_os/telemetry/approval_gates.py,sha256=1h3vZyD3rBdVQ2og3kTsXtDFm52sf6w5j1XU4lPEYoM,19300
337
+ empathy_os/telemetry/agent_coordination.py,sha256=PUkdEgBRVqyjVMR0oCv9EifJrYGkN1X1u09zpruDSic,15850
338
+ empathy_os/telemetry/agent_tracking.py,sha256=Gy3YlrPBkSpmlIh3oUgXOVdP3B49G9Zr2Q49NfxFPX0,12324
339
+ empathy_os/telemetry/approval_gates.py,sha256=Kj7i1P8tofoy8CXCRwKa6FBEONEZmm2GdWMPVaCo2vA,19080
351
340
  empathy_os/telemetry/cli.py,sha256=UDldU7zwW8WS7TC7HY3f6BzSEzcs7rr9A59BwgO8Lds,45540
352
- empathy_os/telemetry/event_streaming 2.py,sha256=-tMNmI3eeDTDUMoE13nH9Gm6_3JVAft0Ic2kk7zl8qU,13096
353
- empathy_os/telemetry/event_streaming.py,sha256=JyOH_ugpf9T8oshzv7--1hWI-zKf8BX4opVbYEOWuEw,13231
354
- empathy_os/telemetry/feedback_loop 2.py,sha256=PLfR4EJuXlyVhJMxKcgNwXrLy7nP8cxiLX_21WRI4Aw,19423
355
- empathy_os/telemetry/feedback_loop.py,sha256=yu4oo6eANJsDnEG13C4LnsTrlOMY4YcJFqnhv6QC39k,19303
341
+ empathy_os/telemetry/event_streaming.py,sha256=nkR155uaKXx74U-YnxayusNbaQZl6hp12xHwNT25u-4,13413
342
+ empathy_os/telemetry/feedback_loop.py,sha256=AnbDPBxawbOHQp71hmgpq8oNLLry2if3qE65RU42iDE,20058
356
343
  empathy_os/telemetry/usage_tracker.py,sha256=Be409JSeweps3GEN3k66u_0I1594KTWoH_bRzelih9U,21184
357
344
  empathy_os/telemetry/commands/__init__.py,sha256=UVKjQBaY0bd8iTlnbQSpd8jA_CjOCfPLGqmplt68P8c,338
358
345
  empathy_os/telemetry/commands/dashboard_commands.py,sha256=36V-g1Ng9lN4nEqNODfDudQ-nkITWkZgce1b7ceIH1M,24029
@@ -383,7 +370,6 @@ empathy_os/workflows/code_review_adapters.py,sha256=2AKLnOQKIoZi4-SFYFfmSSQPrrT8
383
370
  empathy_os/workflows/code_review_pipeline.py,sha256=m-LWxE8MHzn0HxpHmL0ntssWTcDRxscVbAIB1OTwL3g,24460
384
371
  empathy_os/workflows/config.py,sha256=qahi2OOs-5ahaZd4LWkH2uX0N8YV9KxY-o6popeS4Io,22865
385
372
  empathy_os/workflows/dependency_check.py,sha256=zWwSCAWThnAUkOqEUx2GTl5Vgf2fW9P5HRqwWhYZXlc,23452
386
- empathy_os/workflows/document_gen.py,sha256=k382gDQP7v6aF2dXA3kekut576A-UwGC7qlS2NFbnyo,751
387
373
  empathy_os/workflows/document_manager.py,sha256=mP6YFO9eKbKRLc5EuJdYYxL2tIylkNswpm3Npf1T0UM,7385
388
374
  empathy_os/workflows/document_manager_README.md,sha256=aKegxvNXTHpxQsShpSp9cdhF6rT2rhdLB5CsfsdA7YI,2157
389
375
  empathy_os/workflows/documentation_orchestrator.py,sha256=sSzTsLJPkSlHcE_o-pfM-27DVAVpwPcmxPZT71GYfeo,43013
@@ -396,10 +382,10 @@ empathy_os/workflows/new_sample_workflow1.py,sha256=W59znXxsq5kgk4ZI3psC41KtzkLo
396
382
  empathy_os/workflows/new_sample_workflow1_README.md,sha256=bzLyqukgaKilG1OnCdLsc5GNWsYEagI7mn3n80BPMHY,2366
397
383
  empathy_os/workflows/orchestrated_health_check.py,sha256=sKmdvKrDhDe3bRSFVhPt7XeiexC-TKy0EK6TbVXLxQw,30492
398
384
  empathy_os/workflows/orchestrated_release_prep.py,sha256=Erp2rw-EBNOfIwyT0nJhGqpYPg2v-YL_h06aMtaALlA,20224
399
- empathy_os/workflows/output.py,sha256=oXYQBHa0zKUbN32Bki3es0H23LBKZ4xbsBkSbHwNxjs,12743
385
+ empathy_os/workflows/output.py,sha256=BJHDdaYB7ptemZy8KHbuLkSmrEAiFCArjOfvQfRMnCU,12829
400
386
  empathy_os/workflows/perf_audit.py,sha256=vuIrCkxrWVwY0dS3SYsnINch2Je_7BUne0HqwSqV6K0,32068
401
387
  empathy_os/workflows/pr_review.py,sha256=lR7TxvGjBj1fIMxYgBtgxuSvWFTGqQHTsVpL5zKLUB8,26796
402
- empathy_os/workflows/progress.py,sha256=DZll6H7aVWeyljnYL4m2fRiB6NPGH2tMQtAPuuC-XeM,26418
388
+ empathy_os/workflows/progress.py,sha256=z_0UV2uH4Xu9fG85VYtcqJwJWQhTfa7WvFqrtIe-ISE,26588
403
389
  empathy_os/workflows/progress_server.py,sha256=aLDrcBuxqN9_mfJRcRLJypuB4uRMFq9u4C_li9HioOM,10233
404
390
  empathy_os/workflows/refactor_plan.py,sha256=JmW0bMuQDHwCL77ZHC76pVFpp_UY9vke9phVVJfHyDw,25600
405
391
  empathy_os/workflows/release_prep.py,sha256=5TjAXzMiHBG9v0xJnakqMYxsoufmWZ6HFB_0HbVV6fU,31082
@@ -438,21 +424,13 @@ empathy_os/workflows/keyboard_shortcuts/schema.py,sha256=MwvM63J9WTO6nqtwes5A04H
438
424
  empathy_os/workflows/keyboard_shortcuts/workflow.py,sha256=FOEQwc8IR0PEYim05zjR-uIlw6oPZHW9jQZ8skxXp0c,17678
439
425
  empathy_os/workflows/progressive/README 2.md,sha256=ngn3ZC48LW-ON5Vow90dW4UvEWeOKuU7V-W4JdudqJo,13793
440
426
  empathy_os/workflows/progressive/README.md,sha256=ngn3ZC48LW-ON5Vow90dW4UvEWeOKuU7V-W4JdudqJo,13793
441
- empathy_os/workflows/progressive/__init__ 2.py,sha256=l18JX30ONk8H08Wm210k1W3AKat2tVzI840JqlzTBpU,2203
442
427
  empathy_os/workflows/progressive/__init__.py,sha256=qkPVjO_MtHjxVcHMr5jbU9NMZTxVCGHXVD3EkngyCso,2179
443
- empathy_os/workflows/progressive/cli 2.py,sha256=WIFxTBUsCL2hvKKoPFxYUgfhRFjMm-HVUjRp3Y-pvXA,6305
444
428
  empathy_os/workflows/progressive/cli.py,sha256=jbl5jSk3wlbjGc00Ao06OO7aU53AZuVZVKJpJJAajX4,6122
445
- empathy_os/workflows/progressive/core 2.py,sha256=891OttvWkFokBRVzvqVUxwpcNlgc7edlVYqGUCkn0vs,16101
446
429
  empathy_os/workflows/progressive/core.py,sha256=2FzIsy0xKyP91-aMTGfERbX5Mow5CSlfR9RUmHU4GeM,16070
447
- empathy_os/workflows/progressive/orchestrator 2.py,sha256=FsLcoRC8jujRcOV87PyN-0jzlLvStIQQqMFisxWWg0I,26786
448
430
  empathy_os/workflows/progressive/orchestrator.py,sha256=LssTqdy4ufqhgpgS3QNZEdpeSkdg-MgpFyhW5zCJmAY,27733
449
- empathy_os/workflows/progressive/reports 2.py,sha256=F2p3HyInGH8fT9-e_BsOVcgeQBtOugYsSyBn49yhhmc,17588
450
431
  empathy_os/workflows/progressive/reports.py,sha256=VgymV6v7owodELf_QLQTwqGOEZjaFKclKxeQ0-vow0k,17631
451
- empathy_os/workflows/progressive/telemetry 2.py,sha256=5ZjCmeGjtfESejocWdtvnm5iCTAQv5_3NRTYmuoIbVs,9427
452
432
  empathy_os/workflows/progressive/telemetry.py,sha256=DiDTrkeKDjsWJnA57UrNfhbSG6qv9LaTP2wqHPcRscA,9398
453
- empathy_os/workflows/progressive/test_gen 2.py,sha256=rNjjrQ8AFoXRe99X1Yk020gX6tcTxLh5pGMXXho8XRs,15802
454
433
  empathy_os/workflows/progressive/test_gen.py,sha256=wdpjx-Tlz-dWqOwHwoblbgEABr7EjTRV2faXMTad1M0,15759
455
- empathy_os/workflows/progressive/workflow 2.py,sha256=bGXKmB9UFLfDw5c9MsW6Zw4GSbknCP-9HnaIEX36nhY,21597
456
434
  empathy_os/workflows/progressive/workflow.py,sha256=FD3MzRSMV1n_c1S8jSlLLIrcewcus6Niyml6-EMdk_E,21146
457
435
  empathy_os/workflows/test_gen/__init__.py,sha256=x891W01J_ve3RufDSbtuasCl8xHzccGF8a72WeNnMdw,1230
458
436
  empathy_os/workflows/test_gen/ast_analyzer.py,sha256=I50uqEZ-8oX31Ap7Yl02id9Bnvxa6u5OmKPe4iL4N2k,9140
@@ -471,8 +449,8 @@ workflow_scaffolding/__init__.py,sha256=UpX5vjjjPjIaAKyIV1D4GxJzLUZy5DzdzgSkePYM
471
449
  workflow_scaffolding/__main__.py,sha256=0qspuNoadTDqyskXTlT8Sahqau-XIxN35NHTSGVW6z4,236
472
450
  workflow_scaffolding/cli.py,sha256=yLgvMsPbqI-LHt7UKXMuj-Dc0-44EqWiChldysrw1YQ,6763
473
451
  workflow_scaffolding/generator.py,sha256=9eEmm324kVzf8BCtXEML090pyke06o0U7aGATzZIaPM,8869
474
- empathy_framework-5.2.1.dist-info/METADATA,sha256=rupZLCA0pqjig1qmgUW_mhpsup02dY6QOFIX2GoXYbQ,44260
475
- empathy_framework-5.2.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
476
- empathy_framework-5.2.1.dist-info/entry_points.txt,sha256=Ox9iu_2Fx66x5fyZ5L1NJrrFFekD-BZJIudHNzKwYPs,1565
477
- empathy_framework-5.2.1.dist-info/top_level.txt,sha256=YJNBYFE2u5f2XnveFqYO-rZDcHR_aMOHAiIIf9tl72c,102
478
- empathy_framework-5.2.1.dist-info/RECORD,,
452
+ empathy_framework-5.3.0.dist-info/METADATA,sha256=uTY8UwkjZwNmYlXcBdQSyuElhcAvGnU-bG06aBF4ffc,45238
453
+ empathy_framework-5.3.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
454
+ empathy_framework-5.3.0.dist-info/entry_points.txt,sha256=Ox9iu_2Fx66x5fyZ5L1NJrrFFekD-BZJIudHNzKwYPs,1565
455
+ empathy_framework-5.3.0.dist-info/top_level.txt,sha256=YJNBYFE2u5f2XnveFqYO-rZDcHR_aMOHAiIIf9tl72c,102
456
+ empathy_framework-5.3.0.dist-info/RECORD,,
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__ = "5.1.1"
58
+ __version__ = "5.3.0"
59
59
  __author__ = "Patrick Roebuck"
60
60
  __email__ = "patrick.roebuck@smartaimemory.com"
61
61
 
@@ -256,7 +256,11 @@ class HybridCache(BaseCache):
256
256
  return None
257
257
 
258
258
  if self._model is None:
259
- raise RuntimeError("Sentence transformer model not loaded")
259
+ raise RuntimeError(
260
+ f"Sentence transformer model '{self.model_name}' not loaded. "
261
+ "Install required dependencies with: pip install empathy-framework[cache] "
262
+ "or pip install sentence-transformers torch"
263
+ )
260
264
 
261
265
  # Encode prompt
262
266
  prompt_embedding = self._model.encode(prompt, convert_to_numpy=True)
@@ -47,6 +47,8 @@ def cmd_batch_submit(args):
47
47
  api_key = os.getenv("ANTHROPIC_API_KEY")
48
48
  if not api_key:
49
49
  print("❌ Error: ANTHROPIC_API_KEY environment variable not set")
50
+ print(" Set it with: export ANTHROPIC_API_KEY='your-api-key-here'")
51
+ print(" Or get a key from: https://console.anthropic.com/")
50
52
  return 1
51
53
 
52
54
  # Load requests from file
@@ -100,6 +102,8 @@ def cmd_batch_status(args):
100
102
  api_key = os.getenv("ANTHROPIC_API_KEY")
101
103
  if not api_key:
102
104
  print("❌ Error: ANTHROPIC_API_KEY environment variable not set")
105
+ print(" Set it with: export ANTHROPIC_API_KEY='your-api-key-here'")
106
+ print(" Or get a key from: https://console.anthropic.com/")
103
107
  return 1
104
108
 
105
109
  workflow = BatchProcessingWorkflow(api_key=api_key)
@@ -154,6 +158,8 @@ def cmd_batch_results(args):
154
158
  api_key = os.getenv("ANTHROPIC_API_KEY")
155
159
  if not api_key:
156
160
  print("❌ Error: ANTHROPIC_API_KEY environment variable not set")
161
+ print(" Set it with: export ANTHROPIC_API_KEY='your-api-key-here'")
162
+ print(" Or get a key from: https://console.anthropic.com/")
157
163
  return 1
158
164
 
159
165
  workflow = BatchProcessingWorkflow(api_key=api_key)
@@ -214,6 +220,8 @@ def cmd_batch_wait(args):
214
220
  api_key = os.getenv("ANTHROPIC_API_KEY")
215
221
  if not api_key:
216
222
  print("❌ Error: ANTHROPIC_API_KEY environment variable not set")
223
+ print(" Set it with: export ANTHROPIC_API_KEY='your-api-key-here'")
224
+ print(" Or get a key from: https://console.anthropic.com/")
217
225
  return 1
218
226
 
219
227
  workflow = BatchProcessingWorkflow(api_key=api_key)
@@ -86,6 +86,8 @@ def memory_scan(
86
86
  if not scanner_path.exists():
87
87
  console.print("[red]Error:[/red] Memory leak scanner not found at expected path")
88
88
  console.print(f"Expected: {scanner_path}")
89
+ console.print("\nThe scanner script may have been moved or renamed.")
90
+ console.print("Check the scripts/ directory or reinstall the package.")
89
91
  raise typer.Exit(1)
90
92
 
91
93
  args = [sys.executable, str(scanner_path), "--path", str(path)]
@@ -135,6 +137,8 @@ def memory_test(
135
137
  if not profile_script.exists():
136
138
  console.print("[red]Error:[/red] Memory profiling script not found")
137
139
  console.print(f"Expected: {profile_script}")
140
+ console.print("\nInstall memory_profiler with: pip install memory-profiler")
141
+ console.print("Or check that the benchmarks directory exists.")
138
142
  raise typer.Exit(1)
139
143
 
140
144
  console.print(f"[bold]Profiling memory module: {module}[/bold]\n")
@@ -151,8 +151,9 @@ def cmd_workflow(args):
151
151
  print(f"Provider: {actual_provider}")
152
152
  print(workflow.describe())
153
153
 
154
- except KeyError as e:
155
- print(f"Error: {e}")
154
+ except KeyError:
155
+ print(f"Error: Workflow '{name}' not found")
156
+ print("\nRun 'empathy workflow list' to see available workflows")
156
157
  return 1
157
158
 
158
159
  elif action == "run":
@@ -366,11 +367,14 @@ def cmd_workflow(args):
366
367
  error_msg = error_msg or "Unknown error"
367
368
  print(f"\n✗ Workflow failed: {error_msg}\n")
368
369
 
369
- except KeyError as e:
370
- print(f"Error: {e}")
370
+ except KeyError:
371
+ print(f"Error: Workflow '{name}' not found")
372
+ print("\nRun 'empathy workflow list' to see available workflows")
371
373
  return 1
372
374
  except json_mod.JSONDecodeError as e:
373
375
  print(f"Error parsing input JSON: {e}")
376
+ print('\nExpected valid JSON, e.g.: --input \'{"key": "value"}\'')
377
+ print("Make sure to use single quotes around JSON and double quotes inside")
374
378
  return 1
375
379
 
376
380
  elif action == "config":
empathy_os/config.py CHANGED
@@ -61,9 +61,22 @@ def _validate_file_path(path: str, allowed_dir: str | None = None) -> Path:
61
61
  raise ValueError(f"path must be within {allowed_dir}")
62
62
 
63
63
  # Check for dangerous system paths
64
- dangerous_paths = ["/etc", "/sys", "/proc", "/dev"]
64
+ # Note: On macOS, /etc is a symlink to /private/etc, so we check both
65
+ dangerous_paths = [
66
+ "/etc",
67
+ "/sys",
68
+ "/proc",
69
+ "/dev",
70
+ "/private/etc", # macOS: /etc -> /private/etc
71
+ "/private/var/root", # macOS: root's home directory
72
+ "/usr/bin", # System binaries
73
+ "/usr/sbin", # System admin binaries
74
+ "/bin", # Essential binaries
75
+ "/sbin", # System binaries
76
+ ]
77
+ resolved_str = str(resolved)
65
78
  for dangerous in dangerous_paths:
66
- if str(resolved).startswith(dangerous):
79
+ if resolved_str.startswith(dangerous + "/") or resolved_str == dangerous:
67
80
  raise ValueError(f"Cannot write to system directory: {dangerous}")
68
81
 
69
82
  return resolved
@@ -39,6 +39,8 @@ class DashboardHandler(BaseHTTPRequestHandler):
39
39
  # Route requests
40
40
  if path == "/" or path == "/index.html":
41
41
  self.serve_file("index.html", "text/html")
42
+ elif path == "/test.html":
43
+ self.serve_file("test.html", "text/html")
42
44
  elif path == "/static/style.css":
43
45
  self.serve_file("style.css", "text/css")
44
46
  elif path == "/static/app.js":
@@ -132,12 +134,15 @@ class DashboardHandler(BaseHTTPRequestHandler):
132
134
  def api_health(self):
133
135
  """System health endpoint."""
134
136
  try:
135
- coordinator = HeartbeatCoordinator()
136
- has_redis = coordinator.memory is not None
137
+ from empathy_os.memory.short_term import RedisShortTermMemory
137
138
 
139
+ memory = RedisShortTermMemory()
140
+ has_redis = memory._client is not None
141
+
142
+ coordinator = HeartbeatCoordinator(memory=memory)
138
143
  active_agents = len(coordinator.get_active_agents()) if has_redis else 0
139
144
 
140
- gate = ApprovalGate()
145
+ gate = ApprovalGate(memory=memory)
141
146
  pending_approvals = len(gate.get_pending_approvals()) if has_redis else 0
142
147
 
143
148
  self.send_json(
@@ -155,22 +160,24 @@ class DashboardHandler(BaseHTTPRequestHandler):
155
160
  def api_agents(self):
156
161
  """List active agents."""
157
162
  try:
158
- coordinator = HeartbeatCoordinator()
163
+ from empathy_os.memory.short_term import RedisShortTermMemory
164
+
165
+ memory = RedisShortTermMemory()
166
+ coordinator = HeartbeatCoordinator(memory=memory)
159
167
  active_agents = coordinator.get_active_agents()
160
168
 
161
169
  result = []
162
- for agent_id in active_agents:
163
- heartbeat = coordinator.get_heartbeat(agent_id)
164
- if heartbeat:
165
- result.append(
166
- {
167
- "agent_id": agent_id,
168
- "status": heartbeat.status,
169
- "last_seen": heartbeat.timestamp.isoformat(),
170
- "progress": heartbeat.progress,
171
- "current_task": heartbeat.current_task,
172
- }
173
- )
170
+ for agent in active_agents:
171
+ result.append(
172
+ {
173
+ "agent_id": agent.agent_id,
174
+ "display_name": agent.display_name,
175
+ "status": agent.status,
176
+ "last_seen": agent.last_beat.isoformat(),
177
+ "progress": agent.progress,
178
+ "current_task": agent.current_task,
179
+ }
180
+ )
174
181
 
175
182
  self.send_json(result)
176
183
  except Exception as e:
@@ -180,8 +187,11 @@ class DashboardHandler(BaseHTTPRequestHandler):
180
187
  def api_agent_detail(self, agent_id: str):
181
188
  """Get specific agent details."""
182
189
  try:
183
- coordinator = HeartbeatCoordinator()
184
- heartbeat = coordinator.get_heartbeat(agent_id)
190
+ from empathy_os.memory.short_term import RedisShortTermMemory
191
+
192
+ memory = RedisShortTermMemory()
193
+ coordinator = HeartbeatCoordinator(memory=memory)
194
+ heartbeat = coordinator.get_agent_status(agent_id)
185
195
 
186
196
  if not heartbeat:
187
197
  self.send_json({"error": f"Agent {agent_id} not found"}, status=404)
@@ -189,9 +199,9 @@ class DashboardHandler(BaseHTTPRequestHandler):
189
199
 
190
200
  self.send_json(
191
201
  {
192
- "agent_id": agent_id,
202
+ "agent_id": heartbeat.agent_id,
193
203
  "status": heartbeat.status,
194
- "last_seen": heartbeat.timestamp.isoformat(),
204
+ "last_seen": heartbeat.last_beat.isoformat(),
195
205
  "progress": heartbeat.progress,
196
206
  "current_task": heartbeat.current_task,
197
207
  "metadata": heartbeat.metadata,
@@ -203,8 +213,12 @@ class DashboardHandler(BaseHTTPRequestHandler):
203
213
  def api_signals(self, limit: int):
204
214
  """Get recent coordination signals."""
205
215
  try:
206
- signals = CoordinationSignals()
207
- recent = signals.get_recent_signals(limit=limit)
216
+ from empathy_os.memory.short_term import RedisShortTermMemory
217
+
218
+ memory = RedisShortTermMemory()
219
+ # Use broadcast target to get all signals (not just for dashboard)
220
+ signals = CoordinationSignals(memory=memory, agent_id="*")
221
+ recent = signals.get_pending_signals()[:limit]
208
222
 
209
223
  result = [
210
224
  {
@@ -225,15 +239,18 @@ class DashboardHandler(BaseHTTPRequestHandler):
225
239
  def api_events(self, event_type: str | None, limit: int):
226
240
  """Get recent events."""
227
241
  try:
228
- streamer = EventStreamer()
242
+ from empathy_os.memory.short_term import RedisShortTermMemory
243
+
244
+ memory = RedisShortTermMemory()
245
+ streamer = EventStreamer(memory=memory)
229
246
 
230
247
  if event_type:
231
- events = list(streamer.get_recent_events(event_type, limit=limit))
248
+ events = list(streamer.get_recent_events(event_type, count=limit))
232
249
  else:
233
250
  # Get events from multiple streams
234
251
  all_events = []
235
252
  for evt_type in ["agent_heartbeat", "coordination_signal", "workflow_progress"]:
236
- events = list(streamer.get_recent_events(evt_type, limit=20))
253
+ events = list(streamer.get_recent_events(evt_type, count=20))
237
254
  all_events.extend(events)
238
255
 
239
256
  all_events.sort(key=lambda e: e.timestamp, reverse=True)
@@ -258,7 +275,10 @@ class DashboardHandler(BaseHTTPRequestHandler):
258
275
  def api_approvals(self):
259
276
  """Get pending approvals."""
260
277
  try:
261
- gate = ApprovalGate()
278
+ from empathy_os.memory.short_term import RedisShortTermMemory
279
+
280
+ memory = RedisShortTermMemory()
281
+ gate = ApprovalGate(memory=memory)
262
282
  pending = gate.get_pending_approvals()
263
283
 
264
284
  result = [
@@ -281,7 +301,10 @@ class DashboardHandler(BaseHTTPRequestHandler):
281
301
  def api_approve(self, request_id: str, reason: str):
282
302
  """Approve request."""
283
303
  try:
284
- gate = ApprovalGate()
304
+ from empathy_os.memory.short_term import RedisShortTermMemory
305
+
306
+ memory = RedisShortTermMemory()
307
+ gate = ApprovalGate(memory=memory)
285
308
  success = gate.respond_to_approval(
286
309
  request_id=request_id, approved=True, responder="dashboard", reason=reason
287
310
  )
@@ -296,7 +319,10 @@ class DashboardHandler(BaseHTTPRequestHandler):
296
319
  def api_reject(self, request_id: str, reason: str):
297
320
  """Reject request."""
298
321
  try:
299
- gate = ApprovalGate()
322
+ from empathy_os.memory.short_term import RedisShortTermMemory
323
+
324
+ memory = RedisShortTermMemory()
325
+ gate = ApprovalGate(memory=memory)
300
326
  success = gate.respond_to_approval(
301
327
  request_id=request_id, approved=False, responder="dashboard", reason=reason
302
328
  )
@@ -311,7 +337,10 @@ class DashboardHandler(BaseHTTPRequestHandler):
311
337
  def api_feedback_workflows(self):
312
338
  """Get workflow quality metrics."""
313
339
  try:
314
- feedback = FeedbackLoop()
340
+ from empathy_os.memory.short_term import RedisShortTermMemory
341
+
342
+ memory = RedisShortTermMemory()
343
+ feedback = FeedbackLoop(memory=memory)
315
344
 
316
345
  workflows = ["code-review", "test-generation", "refactoring"]
317
346
  results = []
@@ -340,7 +369,10 @@ class DashboardHandler(BaseHTTPRequestHandler):
340
369
  def api_underperforming(self, threshold: float):
341
370
  """Get underperforming stages."""
342
371
  try:
343
- feedback = FeedbackLoop()
372
+ from empathy_os.memory.short_term import RedisShortTermMemory
373
+
374
+ memory = RedisShortTermMemory()
375
+ feedback = FeedbackLoop(memory=memory)
344
376
 
345
377
  workflows = ["code-review", "test-generation", "refactoring"]
346
378
  all_underperforming = []
@@ -225,11 +225,11 @@ class SecureMemDocsIntegration:
225
225
  try:
226
226
  # Pattern 1: String ID validation
227
227
  if not content or not content.strip():
228
- raise ValueError("content cannot be empty")
228
+ raise ValueError(f"content cannot be empty. Got: {content!r}")
229
229
  if not pattern_type or not pattern_type.strip():
230
- raise ValueError("pattern_type cannot be empty")
230
+ raise ValueError(f"pattern_type cannot be empty. Got: {pattern_type!r}")
231
231
  if not user_id or not user_id.strip():
232
- raise ValueError("user_id cannot be empty")
232
+ raise ValueError(f"user_id cannot be empty. Got: {user_id!r}")
233
233
 
234
234
  # Pattern 5: Type validation
235
235
  if custom_metadata is not None and not isinstance(custom_metadata, dict):
@@ -446,7 +446,7 @@ class SecureMemDocsIntegration:
446
446
  """
447
447
  # Pattern 1: String ID validation
448
448
  if not pattern_id or not pattern_id.strip():
449
- raise ValueError("pattern_id cannot be empty")
449
+ raise ValueError(f"pattern_id cannot be empty. Got: {pattern_id!r}")
450
450
  if not user_id or not user_id.strip():
451
451
  raise ValueError("user_id cannot be empty")
452
452
 
@@ -793,7 +793,7 @@ class SecureMemDocsIntegration:
793
793
  """
794
794
  # Pattern 1: String ID validation
795
795
  if not pattern_id or not pattern_id.strip():
796
- raise ValueError("pattern_id cannot be empty")
796
+ raise ValueError(f"pattern_id cannot be empty. Got: {pattern_id!r}")
797
797
  if not user_id or not user_id.strip():
798
798
  raise ValueError("user_id cannot be empty")
799
799