nlm-memory 0.5.3 → 0.5.4

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.
package/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  <p align="center">
2
- <strong>nlm-memory</strong><br/>
3
- Local-first non-linear memory OS for AI operators
2
+ <picture>
3
+ <source media="(prefers-color-scheme: dark)" srcset="assets/banner-dark.svg" />
4
+ <source media="(prefers-color-scheme: light)" srcset="assets/banner-light.svg" />
5
+ <img alt="nlm-memory — Local-first non-linear memory OS" src="assets/banner-light.svg" width="720" />
6
+ </picture>
4
7
  </p>
5
8
 
6
9
  <p align="center">
@@ -30,8 +33,8 @@
30
33
  `nlm-memory` indexes every session from Claude Code, Codex, OpenCode, Cursor, Windsurf, Hermes, Aider, and pi into a single searchable store on your machine. Three properties no other memory layer ships together:
31
34
 
32
35
  1. **Cross-runtime reach.** One index, every adapter.
33
- 2. **Editable timeline.** Sessions can be superseded, retired, or marked aborted. Patch history retroactively — no other tool lets you do this.
34
- 3. **97.2% R@5 baseline.** On a 14-month corpus, keyword recall surfaces the right session in the top 5 on 97.2% of evaluator queries. No fine-tuning, no cloud, no account.
36
+ 2. **Editable timeline.** Sessions can be superseded by newer ones; entities can be retired. Patch history retroactively — no other tool lets you do this. See [docs/supersedence.md](docs/supersedence.md).
37
+ 3. **97.2% R@5 baseline.** On a 14-month corpus, keyword recall surfaces the right session in the top 5 on 97.2% of evaluator queries. No fine-tuning, no cloud, no account. See [docs/methodology-recall-baseline.md](docs/methodology-recall-baseline.md).
35
38
 
36
39
  Everything stays on your machine. No telemetry, no account beyond your classifier of choice.
37
40
 
@@ -94,7 +97,7 @@ Two delivery paths. They share the same index.
94
97
 
95
98
  ### 1. Hooks (Claude Code) — automatic context injection
96
99
 
97
- Five hooks installed into `~/.claude/settings.json`:
100
+ Five hooks installed into `~/.claude/settings.json`. Full lifecycle, modes, logging surface, and the load-bearing daily liveness canary documented in [docs/hooks.md](docs/hooks.md).
98
101
 
99
102
  | Event | What NLM does | Mode |
100
103
  |---|---|---|
@@ -291,6 +294,15 @@ The defining property is the editable timeline. mem0 and Letta append; NLM lets
291
294
 
292
295
  ---
293
296
 
297
+ ## Docs
298
+
299
+ - [docs/supersedence.md](docs/supersedence.md) — the editable timeline: statuses, what gets recorded when, how supersedence flows through recall
300
+ - [docs/hooks.md](docs/hooks.md) — full hook lifecycle, modes, selection logic, pointer-block format, logging surface, daily liveness canary
301
+ - [docs/methodology-recall-baseline.md](docs/methodology-recall-baseline.md) — how R@5 = 97.2% is measured + how to run LongMemEval-S on your own machine
302
+ - [SECURITY.md](SECURITY.md) — threat model + responsible disclosure
303
+
304
+ ---
305
+
294
306
  ## Development
295
307
 
296
308
  ```sh
@@ -0,0 +1,60 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 360" role="img" aria-label="nlm-memory — Local-first non-linear memory OS">
2
+ <defs>
3
+ <style>
4
+ .bg { fill: #0d1117; }
5
+ .grid { stroke: #21262d; stroke-width: 1; }
6
+ .rail { stroke: #30363d; stroke-width: 2; }
7
+ .session { fill: #5ecbb4; }
8
+ .session-faded { fill: #5ecbb4; opacity: 0.45; }
9
+ .session-recent { fill: #5ecbb4; opacity: 0.85; }
10
+ .session-superseded { fill: #0d1117; stroke: #5ecbb4; stroke-width: 2; stroke-dasharray: 3 2; }
11
+ .arrow { fill: none; stroke: #f0b56b; stroke-width: 2.5; }
12
+ .arrowhead { fill: #f0b56b; }
13
+ .wordmark { font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace; font-size: 88px; font-weight: 700; letter-spacing: -2px; fill: #e6edf3; }
14
+ .accent { fill: #5ecbb4; }
15
+ .tagline { font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace; font-size: 22px; font-weight: 500; fill: #8b949e; }
16
+ .meta { font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace; font-size: 16px; font-weight: 400; fill: #6e7681; letter-spacing: 0.5px; }
17
+ .label { font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace; font-size: 13px; font-weight: 400; fill: #6e7681; }
18
+ </style>
19
+ </defs>
20
+
21
+ <rect class="bg" width="1200" height="360" />
22
+
23
+ <!-- Session timeline (the editable timeline visual) -->
24
+ <g transform="translate(150, 70)">
25
+ <line x1="0" y1="20" x2="900" y2="20" class="rail" />
26
+
27
+ <!-- 14 session dots representing a non-linear timeline -->
28
+ <circle cx="0" cy="20" r="9" class="session-faded" />
29
+ <circle cx="69" cy="20" r="9" class="session-faded" />
30
+ <circle cx="138" cy="20" r="9" class="session-faded" />
31
+ <circle cx="207" cy="20" r="9" class="session-faded" />
32
+ <circle cx="276" cy="20" r="11" class="session-superseded" /> <!-- the patched one -->
33
+ <circle cx="345" cy="20" r="9" class="session-faded" />
34
+ <circle cx="414" cy="20" r="9" class="session-faded" />
35
+ <circle cx="483" cy="20" r="11" class="session-recent" /> <!-- the patcher -->
36
+ <circle cx="552" cy="20" r="9" class="session-recent" />
37
+ <circle cx="621" cy="20" r="9" class="session-recent" />
38
+ <circle cx="690" cy="20" r="9" class="session-recent" />
39
+ <circle cx="759" cy="20" r="9" class="session" />
40
+ <circle cx="828" cy="20" r="9" class="session" />
41
+ <circle cx="900" cy="20" r="9" class="session" />
42
+
43
+ <!-- Supersedence arrow: from the patcher (483) back to the patched (276) -->
44
+ <path d="M 483 32 Q 380 90 285 32" class="arrow" />
45
+ <polygon points="278,25 290,28 285,38" class="arrowhead" />
46
+
47
+ <!-- Labels -->
48
+ <text x="276" y="-12" text-anchor="middle" class="label">superseded</text>
49
+ <text x="483" y="-12" text-anchor="middle" class="label">supersedes</text>
50
+ </g>
51
+
52
+ <!-- Wordmark + tagline block -->
53
+ <g transform="translate(600, 245)">
54
+ <text x="0" y="0" text-anchor="middle" class="wordmark">
55
+ <tspan>nlm</tspan><tspan class="accent">-</tspan><tspan>memory</tspan>
56
+ </text>
57
+ <text x="0" y="40" text-anchor="middle" class="tagline">Local-first non-linear memory OS</text>
58
+ <text x="0" y="75" text-anchor="middle" class="meta">session-grained recall &#xb7; editable timeline &#xb7; cross-runtime</text>
59
+ </g>
60
+ </svg>
@@ -0,0 +1,55 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 360" role="img" aria-label="nlm-memory — Local-first non-linear memory OS">
2
+ <defs>
3
+ <style>
4
+ .bg { fill: #ffffff; }
5
+ .grid { stroke: #eaeef2; stroke-width: 1; }
6
+ .rail { stroke: #d0d7de; stroke-width: 2; }
7
+ .session { fill: #1f8a73; }
8
+ .session-faded { fill: #1f8a73; opacity: 0.4; }
9
+ .session-recent { fill: #1f8a73; opacity: 0.8; }
10
+ .session-superseded { fill: #ffffff; stroke: #1f8a73; stroke-width: 2; stroke-dasharray: 3 2; }
11
+ .arrow { fill: none; stroke: #b8741a; stroke-width: 2.5; }
12
+ .arrowhead { fill: #b8741a; }
13
+ .wordmark { font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace; font-size: 88px; font-weight: 700; letter-spacing: -2px; fill: #1f2328; }
14
+ .accent { fill: #1f8a73; }
15
+ .tagline { font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace; font-size: 22px; font-weight: 500; fill: #59636e; }
16
+ .meta { font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace; font-size: 16px; font-weight: 400; fill: #818b98; letter-spacing: 0.5px; }
17
+ .label { font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace; font-size: 13px; font-weight: 400; fill: #818b98; }
18
+ </style>
19
+ </defs>
20
+
21
+ <rect class="bg" width="1200" height="360" />
22
+
23
+ <g transform="translate(150, 70)">
24
+ <line x1="0" y1="20" x2="900" y2="20" class="rail" />
25
+
26
+ <circle cx="0" cy="20" r="9" class="session-faded" />
27
+ <circle cx="69" cy="20" r="9" class="session-faded" />
28
+ <circle cx="138" cy="20" r="9" class="session-faded" />
29
+ <circle cx="207" cy="20" r="9" class="session-faded" />
30
+ <circle cx="276" cy="20" r="11" class="session-superseded" />
31
+ <circle cx="345" cy="20" r="9" class="session-faded" />
32
+ <circle cx="414" cy="20" r="9" class="session-faded" />
33
+ <circle cx="483" cy="20" r="11" class="session-recent" />
34
+ <circle cx="552" cy="20" r="9" class="session-recent" />
35
+ <circle cx="621" cy="20" r="9" class="session-recent" />
36
+ <circle cx="690" cy="20" r="9" class="session-recent" />
37
+ <circle cx="759" cy="20" r="9" class="session" />
38
+ <circle cx="828" cy="20" r="9" class="session" />
39
+ <circle cx="900" cy="20" r="9" class="session" />
40
+
41
+ <path d="M 483 32 Q 380 90 285 32" class="arrow" />
42
+ <polygon points="278,25 290,28 285,38" class="arrowhead" />
43
+
44
+ <text x="276" y="-12" text-anchor="middle" class="label">superseded</text>
45
+ <text x="483" y="-12" text-anchor="middle" class="label">supersedes</text>
46
+ </g>
47
+
48
+ <g transform="translate(600, 245)">
49
+ <text x="0" y="0" text-anchor="middle" class="wordmark">
50
+ <tspan>nlm</tspan><tspan class="accent">-</tspan><tspan>memory</tspan>
51
+ </text>
52
+ <text x="0" y="40" text-anchor="middle" class="tagline">Local-first non-linear memory OS</text>
53
+ <text x="0" y="75" text-anchor="middle" class="meta">session-grained recall &#xb7; editable timeline &#xb7; cross-runtime</text>
54
+ </g>
55
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nlm-memory",
3
- "version": "0.5.3",
3
+ "version": "0.5.4",
4
4
  "description": "Local-first non-linear memory operating system for AI operators.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -29,6 +29,7 @@
29
29
  "files": [
30
30
  "dist",
31
31
  "plugin",
32
+ "assets",
32
33
  "LICENSE",
33
34
  "README.md"
34
35
  ],