memor-cli 0.4.0__tar.gz → 0.4.1__tar.gz

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 (97) hide show
  1. {memor_cli-0.4.0/memor_cli.egg-info → memor_cli-0.4.1}/PKG-INFO +1 -1
  2. memor_cli-0.4.1/memor/__init__.py +1 -0
  3. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/dashboard/static/index.html +55 -59
  4. {memor_cli-0.4.0 → memor_cli-0.4.1/memor_cli.egg-info}/PKG-INFO +1 -1
  5. {memor_cli-0.4.0 → memor_cli-0.4.1}/pyproject.toml +1 -1
  6. memor_cli-0.4.0/memor/__init__.py +0 -1
  7. {memor_cli-0.4.0 → memor_cli-0.4.1}/LICENSE +0 -0
  8. {memor_cli-0.4.0 → memor_cli-0.4.1}/README.md +0 -0
  9. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/cli.py +0 -0
  10. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/daemon.py +0 -0
  11. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/dashboard/__init__.py +0 -0
  12. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/dashboard/server.py +0 -0
  13. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/distill/__init__.py +0 -0
  14. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/distill/distiller.py +0 -0
  15. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/distill/extractive.py +0 -0
  16. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/embed/__init__.py +0 -0
  17. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/embed/api.py +0 -0
  18. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/embed/fake.py +0 -0
  19. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/embed/local.py +0 -0
  20. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/eval/__init__.py +0 -0
  21. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/eval/baselines/__init__.py +0 -0
  22. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/eval/baselines/base.py +0 -0
  23. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/eval/baselines/claude_mem.py +0 -0
  24. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/eval/baselines/graphiti.py +0 -0
  25. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/eval/dataset.py +0 -0
  26. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/eval/embed_benchmark.py +0 -0
  27. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/eval/judge.py +0 -0
  28. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/eval/metrics.py +0 -0
  29. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/eval/runner.py +0 -0
  30. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/feedback.py +0 -0
  31. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/hook_cli.py +0 -0
  32. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/hook_server.py +0 -0
  33. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/ingest/__init__.py +0 -0
  34. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/ingest/claude_code.py +0 -0
  35. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/ingest/documents.py +0 -0
  36. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/interfaces.py +0 -0
  37. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/llm/__init__.py +0 -0
  38. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/llm/anthropic.py +0 -0
  39. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/llm/base.py +0 -0
  40. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/llm/openai_compat.py +0 -0
  41. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/project.py +0 -0
  42. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/query_complexity.py +0 -0
  43. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/recall.py +0 -0
  44. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/redact.py +0 -0
  45. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/retrieve/__init__.py +0 -0
  46. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/retrieve/retriever.py +0 -0
  47. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/service.py +0 -0
  48. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/session_context.py +0 -0
  49. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/store/__init__.py +0 -0
  50. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/store/sqlite_store.py +0 -0
  51. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/tokencount.py +0 -0
  52. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/turn_metrics.py +0 -0
  53. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor/types.py +0 -0
  54. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor_cli.egg-info/SOURCES.txt +0 -0
  55. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor_cli.egg-info/dependency_links.txt +0 -0
  56. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor_cli.egg-info/entry_points.txt +0 -0
  57. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor_cli.egg-info/requires.txt +0 -0
  58. {memor_cli-0.4.0 → memor_cli-0.4.1}/memor_cli.egg-info/top_level.txt +0 -0
  59. {memor_cli-0.4.0 → memor_cli-0.4.1}/setup.cfg +0 -0
  60. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_cli_smoke.py +0 -0
  61. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_daemon.py +0 -0
  62. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_dashboard.py +0 -0
  63. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_dataset_builder.py +0 -0
  64. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_dimension_safety.py +0 -0
  65. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_distiller.py +0 -0
  66. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_embed.py +0 -0
  67. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_embed_benchmark.py +0 -0
  68. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_eval_ablation.py +0 -0
  69. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_eval_runner.py +0 -0
  70. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_external_baselines.py +0 -0
  71. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_extractive.py +0 -0
  72. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_feedback.py +0 -0
  73. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_hook.py +0 -0
  74. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_hook_server.py +0 -0
  75. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_hybrid_retrieval.py +0 -0
  76. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_ingest_claude_code.py +0 -0
  77. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_ingest_documents.py +0 -0
  78. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_install_hook.py +0 -0
  79. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_interfaces.py +0 -0
  80. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_judge.py +0 -0
  81. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_metrics.py +0 -0
  82. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_noise_filter.py +0 -0
  83. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_project_resolver.py +0 -0
  84. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_quality_gate.py +0 -0
  85. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_query_complexity.py +0 -0
  86. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_recall_core.py +0 -0
  87. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_redact.py +0 -0
  88. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_retriever.py +0 -0
  89. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_semantic_feedback.py +0 -0
  90. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_service.py +0 -0
  91. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_session_context.py +0 -0
  92. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_skill_recall.py +0 -0
  93. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_store.py +0 -0
  94. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_supersession.py +0 -0
  95. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_tokencount.py +0 -0
  96. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_turn_metrics.py +0 -0
  97. {memor_cli-0.4.0 → memor_cli-0.4.1}/tests/test_types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memor-cli
3
- Version: 0.4.0
3
+ Version: 0.4.1
4
4
  Summary: Measured memory for coding agents. Fire and forget — no API keys needed.
5
5
  Author-email: Nimit Bhandari <nimitbhandari17@gmail.com>
6
6
  License-Expression: MIT
@@ -0,0 +1 @@
1
+ __version__ = "0.4.1"
@@ -172,6 +172,7 @@
172
172
  background: var(--surface); border: 1px solid var(--border);
173
173
  border-radius: var(--radius); padding: 22px 24px;
174
174
  box-shadow: var(--card-shadow);
175
+ display: flex; flex-direction: column;
175
176
  }
176
177
  .chart-header {
177
178
  display: flex; align-items: center; justify-content: space-between;
@@ -199,7 +200,7 @@
199
200
 
200
201
  .bar-chart {
201
202
  display: flex; align-items: flex-end; gap: 4px;
202
- height: 180px; padding-top: 8px;
203
+ flex: 1; min-height: 180px; padding-top: 8px;
203
204
  border-bottom: 1px solid var(--border-light);
204
205
  }
205
206
  .bar-group {
@@ -207,15 +208,16 @@
207
208
  align-items: center; gap: 0; height: 100%;
208
209
  justify-content: flex-end;
209
210
  }
210
- .bar-stack { display: flex; flex-direction: column-reverse; gap: 1px; width: 100%; max-width: 22px; }
211
- .bar-hits { background: var(--accent); border-radius: 2px 2px 0 0; min-height: 0; transition: height 0.3s; }
212
- .bar-miss { background: var(--surface3); border-radius: 2px 2px 0 0; min-height: 0; transition: height 0.3s; }
211
+ .bar-stack { display: flex; flex-direction: column-reverse; gap: 2px; width: 100%; max-width: 28px; flex: 1; align-items: center; justify-content: flex-end; }
212
+ .bar-cell { width: 16px; height: 10px; border-radius: 2px; transition: opacity 0.3s; }
213
+ .bar-cell-hit { background: var(--accent); }
214
+ .bar-cell-miss { background: var(--surface3); }
213
215
  .bar-label {
214
216
  font-size: 9px; color: var(--text-muted); margin-top: 6px;
215
217
  text-align: center; white-space: nowrap;
216
218
  }
217
219
 
218
- .bar-group:hover .bar-hits { background: #f0a030; }
220
+ .bar-group:hover .bar-cell-hit { background: #f0a030; }
219
221
  .bar-group { cursor: default; position: relative; }
220
222
  .bar-tooltip {
221
223
  display: none; position: absolute; bottom: calc(100% + 8px);
@@ -378,6 +380,33 @@
378
380
  </div>
379
381
  </section>
380
382
 
383
+ <!-- ── Token ROI hero ─────────────────────────────────── -->
384
+ <section>
385
+ <div class="chart-card" id="roi-card" style="display:none;">
386
+ <div style="display:flex;align-items:center;gap:20px;flex-wrap:wrap;">
387
+ <div>
388
+ <div class="chart-title" style="margin-bottom:4px;">Token ROI</div>
389
+ <div style="font-size:32px;font-weight:700;color:var(--ok);letter-spacing:-1px;" id="roi-value">&ndash;</div>
390
+ <div style="font-size:12px;color:var(--text-muted);margin-top:2px;" id="roi-desc">fewer tool calls when Memor injects context</div>
391
+ </div>
392
+ <div style="display:flex;gap:24px;flex:1;justify-content:flex-end;">
393
+ <div style="text-align:center;">
394
+ <div style="font-size:18px;font-weight:600;color:var(--text);" id="roi-tools-with">&ndash;</div>
395
+ <div style="font-size:10px;color:var(--text-muted);">avg tools/turn<br>with recall</div>
396
+ </div>
397
+ <div style="text-align:center;">
398
+ <div style="font-size:18px;font-weight:600;color:var(--text);" id="roi-tools-without">&ndash;</div>
399
+ <div style="font-size:10px;color:var(--text-muted);">avg tools/turn<br>without recall</div>
400
+ </div>
401
+ <div style="text-align:center;">
402
+ <div style="font-size:18px;font-weight:600;color:var(--text);" id="roi-turns">&ndash;</div>
403
+ <div style="font-size:10px;color:var(--text-muted);" id="roi-turns-sub">turns measured</div>
404
+ </div>
405
+ </div>
406
+ </div>
407
+ </div>
408
+ </section>
409
+
381
410
  <!-- ── Recall trend chart ─────────────────────────────── -->
382
411
  <section>
383
412
  <div class="chart-grid">
@@ -426,32 +455,6 @@
426
455
  </div>
427
456
  </div>
428
457
  </div>
429
- <div class="chart-card">
430
- <div class="chart-header">
431
- <div class="chart-title">Token ROI</div>
432
- </div>
433
- <div id="roi-banner" style="display:none;background:var(--ok-dim);border:1px solid rgba(61,214,140,0.2);border-radius:var(--radius-sm);padding:12px 14px;margin-bottom:14px;">
434
- <div style="font-size:22px;font-weight:700;color:var(--ok);letter-spacing:-0.5px;" id="roi-value">&ndash;</div>
435
- <div style="font-size:11px;color:var(--text-muted);margin-top:2px;" id="roi-desc">fewer tool calls when Memor injects context</div>
436
- </div>
437
- <div class="side-stats" id="roi-side">
438
- <div class="side-stat">
439
- <div class="side-stat-label">Avg Tools / Turn (with recall)</div>
440
- <div class="side-stat-value" id="roi-tools-with">&ndash;</div>
441
- <div class="side-stat-sub">when Memor injected context</div>
442
- </div>
443
- <div class="side-stat">
444
- <div class="side-stat-label">Avg Tools / Turn (without)</div>
445
- <div class="side-stat-value" id="roi-tools-without">&ndash;</div>
446
- <div class="side-stat-sub">when no context was injected</div>
447
- </div>
448
- <div class="side-stat">
449
- <div class="side-stat-label">Turns Measured</div>
450
- <div class="side-stat-value" id="roi-turns">&ndash;</div>
451
- <div class="side-stat-sub" id="roi-turns-sub">with vs. without recall</div>
452
- </div>
453
- </div>
454
- </div>
455
458
  </div>
456
459
  </section>
457
460
 
@@ -539,7 +542,7 @@
539
542
  function badge(status) {
540
543
  var map = {
541
544
  ok: ['badge-ok', 'Success'],
542
- extractive_only: ['badge-extractive','Extractive'],
545
+ extractive_only: ['badge-extractive','No Distill'],
543
546
  no_hits: ['badge-no_hits', 'No Hits'],
544
547
  };
545
548
  var m = map[status] || ['badge-no_hits', status];
@@ -669,21 +672,20 @@
669
672
  var recallsByDay = data.map(function(d) { return d.recalls; });
670
673
  renderMiniBars('mb-recalls', recallsByDay);
671
674
 
675
+ var maxCells = 30;
672
676
  data.forEach(function(d) {
673
- var pct = (d.recalls / maxRecalls) * 100;
674
- var hitPct = d.hits ? (d.hits / d.recalls) * 100 : 0;
675
- var missPct = 100 - hitPct;
676
- var hitH = Math.max(0, pct * hitPct / 100);
677
- var missH = Math.max(0, pct * missPct / 100);
677
+ var totalCells = Math.max(1, Math.round((d.recalls / maxRecalls) * maxCells));
678
+ var hitCells = Math.round((d.hits / d.recalls) * totalCells);
679
+ var missCells = totalCells - hitCells;
678
680
 
679
681
  var dayStr = d.day.slice(5);
680
682
  var group = el('div', {class: 'bar-group'});
683
+ var cells = '';
684
+ for (var i = 0; i < hitCells; i++) cells += '<div class="bar-cell bar-cell-hit"></div>';
685
+ for (var i = 0; i < missCells; i++) cells += '<div class="bar-cell bar-cell-miss"></div>';
681
686
  group.innerHTML =
682
687
  '<div class="bar-tooltip">' + esc(d.day) + '<br>' + d.recalls + ' recalls · ' + (d.hits||0) + ' hits</div>' +
683
- '<div class="bar-stack">' +
684
- '<div class="bar-hits" style="height:' + hitH + '%"></div>' +
685
- '<div class="bar-miss" style="height:' + missH + '%"></div>' +
686
- '</div>' +
688
+ '<div class="bar-stack">' + cells + '</div>' +
687
689
  '<div class="bar-label">' + dayStr + '</div>';
688
690
  container.appendChild(group);
689
691
  });
@@ -725,7 +727,7 @@
725
727
  document.getElementById('th-col3').textContent = 'Avg Score';
726
728
  document.getElementById('th-col4').textContent = 'OK';
727
729
  document.getElementById('th-col5').textContent = 'No Hits';
728
- document.getElementById('th-col6').textContent = 'Extractive';
730
+ document.getElementById('th-col6').textContent = 'No Distill';
729
731
  }
730
732
 
731
733
  sorted.forEach(function(row) {
@@ -809,33 +811,27 @@
809
811
 
810
812
  /* ── ROI renderer ─────────────────────────────────────── */
811
813
  function renderROI(data) {
814
+ var card = document.getElementById('roi-card');
815
+ var roiValue = document.getElementById('roi-value');
816
+ var roiDesc = document.getElementById('roi-desc');
817
+
812
818
  document.getElementById('roi-tools-with').textContent = data.avg_tools_with_recall;
813
819
  document.getElementById('roi-tools-without').textContent = data.avg_tools_without_recall;
814
- document.getElementById('roi-turns').textContent =
815
- (data.turns_with_recall + data.turns_without_recall).toLocaleString();
820
+ var totalTurns = data.turns_with_recall + data.turns_without_recall;
821
+ document.getElementById('roi-turns').textContent = totalTurns.toLocaleString();
816
822
  document.getElementById('roi-turns-sub').textContent =
817
- data.turns_with_recall + ' with recall · ' + data.turns_without_recall + ' without';
818
-
819
- var banner = document.getElementById('roi-banner');
820
- var roiValue = document.getElementById('roi-value');
821
- var roiDesc = document.getElementById('roi-desc');
822
- banner.style.display = 'none';
823
- banner.style.background = 'var(--ok-dim)';
824
- banner.style.borderColor = 'rgba(61,214,140,0.2)';
825
- roiValue.style.color = 'var(--ok)';
826
- roiValue.textContent = '–';
827
- roiDesc.textContent = 'fewer tool calls when Memor injects context';
823
+ data.turns_with_recall + ' with · ' + data.turns_without_recall + ' without';
828
824
 
829
825
  if (data.tool_call_reduction_pct > 0 && data.turns_with_recall >= 5 && data.turns_without_recall >= 5) {
830
826
  roiValue.textContent = data.tool_call_reduction_pct + '% fewer';
831
- banner.style.display = 'block';
827
+ roiValue.style.color = 'var(--ok)';
828
+ roiDesc.textContent = 'fewer tool calls when Memor injects context';
829
+ card.style.display = 'block';
832
830
  } else if (data.tool_call_reduction_pct < 0 && data.turns_with_recall >= 5) {
833
831
  roiValue.textContent = Math.abs(data.tool_call_reduction_pct) + '% more';
834
832
  roiValue.style.color = 'var(--warn)';
835
833
  roiDesc.textContent = 'tool calls with recall — investigating...';
836
- banner.style.display = 'block';
837
- banner.style.background = 'var(--warn-dim)';
838
- banner.style.borderColor = 'rgba(232,147,32,0.2)';
834
+ card.style.display = 'block';
839
835
  }
840
836
  }
841
837
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memor-cli
3
- Version: 0.4.0
3
+ Version: 0.4.1
4
4
  Summary: Measured memory for coding agents. Fire and forget — no API keys needed.
5
5
  Author-email: Nimit Bhandari <nimitbhandari17@gmail.com>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "memor-cli"
7
- version = "0.4.0"
7
+ version = "0.4.1"
8
8
  description = "Measured memory for coding agents. Fire and forget — no API keys needed."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1 +0,0 @@
1
- __version__ = "0.4.0"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes