recallnest 1.4.1 → 2.2.1

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 (233) hide show
  1. package/.env +4 -0
  2. package/CLAUDE.md +7 -3
  3. package/README.md +202 -130
  4. package/README_CN.md +263 -190
  5. package/bin/recallnest.mjs +62 -0
  6. package/config.json +55 -0
  7. package/daily-recall.sh +23 -0
  8. package/integrations/setup-all.sh +31 -0
  9. package/logs/daily-recall.error.log +0 -0
  10. package/logs/daily-recall.log +30 -0
  11. package/logs/ingest-2026-04-11.log +110 -0
  12. package/logs/ingest-2026-04-12.log +90 -0
  13. package/logs/launchagent-stderr.log +0 -0
  14. package/logs/launchagent-stdout.log +0 -0
  15. package/package.json +10 -3
  16. package/src/access-tracker.ts +3 -2
  17. package/src/activity-counter.ts +109 -0
  18. package/src/adaptive-retrieval.ts +6 -5
  19. package/src/admission-control.ts +163 -0
  20. package/src/anchor-generator.ts +80 -0
  21. package/src/api-server.ts +10 -0
  22. package/src/audit-log.ts +122 -0
  23. package/src/auto-gc.ts +98 -29
  24. package/src/auto-recall.ts +33 -4
  25. package/src/capture-engine.ts +372 -23
  26. package/src/cascade-forget.ts +3 -2
  27. package/src/cli.ts +107 -5
  28. package/src/compat.ts +22 -0
  29. package/src/confidence-tracker.ts +210 -47
  30. package/src/conflict-store.ts +12 -3
  31. package/src/consolidation-engine.ts +296 -8
  32. package/src/context-collapse-renderer.ts +222 -0
  33. package/src/context-composer-stable-selection.ts +5 -1
  34. package/src/context-composer.ts +239 -4
  35. package/src/context-reconstructor.ts +404 -0
  36. package/src/conversation-importer.ts +441 -0
  37. package/src/data-checkup.ts +232 -0
  38. package/src/decay-engine.ts +84 -0
  39. package/src/distill-lock.ts +122 -0
  40. package/src/doctor.ts +8 -10
  41. package/src/dream-pipeline.ts +227 -0
  42. package/src/emotion-detector.ts +90 -0
  43. package/src/eval.ts +3 -2
  44. package/src/forget-engine.ts +269 -0
  45. package/src/frequency-tracker.ts +175 -0
  46. package/src/graph-export.ts +644 -0
  47. package/src/ingest.ts +36 -6
  48. package/src/interference-detector.ts +187 -0
  49. package/src/kg-extractor.ts +15 -24
  50. package/src/kg-store.ts +2 -1
  51. package/src/language-hook.ts +67 -0
  52. package/src/llm-client.ts +289 -6
  53. package/src/mcp-server.ts +707 -80
  54. package/src/memory-assets.ts +22 -5
  55. package/src/memory-evolution.ts +365 -0
  56. package/src/memory-lint.ts +429 -0
  57. package/src/memory-output.ts +69 -0
  58. package/src/memory-schema.ts +74 -2
  59. package/src/narrative-schema.ts +79 -0
  60. package/src/narrative-tagger.ts +164 -0
  61. package/src/pii-detector.ts +98 -0
  62. package/src/post-retrieval-filter.ts +76 -0
  63. package/src/prediction-engine.ts +253 -0
  64. package/src/preference-slots.ts +65 -2
  65. package/src/prospective-memory.ts +215 -0
  66. package/src/query-expander.ts +67 -0
  67. package/src/recall-governor.ts +183 -0
  68. package/src/retention-policy.ts +90 -0
  69. package/src/retriever.ts +828 -55
  70. package/src/rif.ts +34 -8
  71. package/src/runtime-config.ts +23 -8
  72. package/src/scope-inventory.ts +4 -3
  73. package/src/scope-policy.ts +4 -0
  74. package/src/session-distiller.ts +307 -0
  75. package/src/session-output.ts +40 -0
  76. package/src/session-schema.ts +37 -0
  77. package/src/session-store.ts +7 -2
  78. package/src/skill-engine.ts +208 -0
  79. package/src/skill-promotion.ts +293 -0
  80. package/src/skill-schema.ts +39 -0
  81. package/src/store.ts +96 -10
  82. package/src/topic-tag.ts +66 -0
  83. package/src/tracker.ts +3 -1
  84. package/src/ui-server.ts +80 -8
  85. package/src/workflow-observation-scope-review.ts +2 -1
  86. package/src/workflow-observation-store.ts +2 -1
  87. package/src/write-verifier.ts +126 -0
  88. package/.claude-plugin/CLAUDE.md +0 -29
  89. package/.claude-plugin/marketplace.json +0 -18
  90. package/.github/workflows/ci.yml +0 -28
  91. package/.mcp.json +0 -9
  92. package/CHANGELOG.md +0 -51
  93. package/DEMO.md +0 -94
  94. package/EVAL.md +0 -89
  95. package/FAILURES.md +0 -75
  96. package/OPERATIONS.md +0 -59
  97. package/ROADMAP.md +0 -198
  98. package/assets/recallnest-workbench.png +0 -0
  99. package/assets/ui/app.js +0 -807
  100. package/assets/ui/index.html +0 -154
  101. package/assets/ui/styles.css +0 -605
  102. package/assets/wechat-qr.jpg +0 -0
  103. package/daily-reflections/2026-03-05.md +0 -15
  104. package/daily-reflections/2026-03-06.md +0 -15
  105. package/daily-reflections/2026-03-07.md +0 -7
  106. package/daily-reflections/2026-03-08.md +0 -34
  107. package/daily-reflections/2026-03-09.md +0 -35
  108. package/daily-reflections/2026-03-10.md +0 -36
  109. package/daily-reflections/2026-03-11.md +0 -35
  110. package/daily-reflections/2026-03-12.md +0 -36
  111. package/daily-reflections/2026-03-13.md +0 -35
  112. package/daily-reflections/2026-03-14.md +0 -35
  113. package/daily-reflections/2026-03-15.md +0 -35
  114. package/daily-reflections/2026-03-16.md +0 -41
  115. package/daily-reflections/2026-03-17.md +0 -10
  116. package/daily-reflections/2026-03-18.md +0 -10
  117. package/daily-reflections/2026-03-19.md +0 -10
  118. package/daily-reflections/2026-03-20.md +0 -10
  119. package/daily-reflections/2026-03-21.md +0 -10
  120. package/daily-reflections/2026-03-22.md +0 -10
  121. package/daily-reflections/2026-03-23.md +0 -10
  122. package/daily-reflections/2026-03-24.md +0 -10
  123. package/daily-reflections/2026-03-25.md +0 -32
  124. package/daily-reflections/2026-03-26.md +0 -37
  125. package/daily-reflections/2026-03-27.md +0 -35
  126. package/daily-reflections/2026-03-28.md +0 -35
  127. package/daily-reflections/2026-03-29.md +0 -35
  128. package/daily-reflections/2026-03-30.md +0 -36
  129. package/daily-reflections/2026-03-31.md +0 -35
  130. package/daily-reflections/2026-04-01.md +0 -35
  131. package/docs/api-reference.md +0 -1291
  132. package/docs/architecture.md +0 -168
  133. package/docs/memory-boundary-contract.md +0 -226
  134. package/docs/memory-categories.md +0 -119
  135. package/docs/pipeline-audit-ultramemory.md +0 -177
  136. package/docs/plans/2026-03-08-query-expansion.md +0 -270
  137. package/docs/plans/2026-03-16-continuity-layer.md +0 -196
  138. package/docs/plans/mcp-tiering-plan.md +0 -126
  139. package/docs/research/recall-quality-audit-2026-03-22.md +0 -153
  140. package/docs/self-evolution.md +0 -198
  141. package/docs/superpowers/plans/2026-03-19-ingest-pipeline-upgrade.md +0 -782
  142. package/docs/superpowers/specs/2026-03-19-ingest-pipeline-upgrade-design.md +0 -77
  143. package/docs/superpowers/specs/2026-03-23-pull-claude-desktop-design.md +0 -95
  144. package/eval/continuity/results-2026-03-16.md +0 -117
  145. package/eval/continuity/results-2026-03-19.md +0 -453
  146. package/eval/continuity/runbook.md +0 -110
  147. package/eval/continuity/seed-cases.md +0 -54
  148. package/eval/reports/2026-03-06-abstract-query-baseline.md +0 -96
  149. package/eval/reports/2026-03-06-aws-ssh-baseline.md +0 -82
  150. package/eval/reports/2026-03-06-baseline.md +0 -82
  151. package/eval/reports/query-expansion.md +0 -138
  152. package/lm +0 -19
  153. package/plan-v1.2-distributable.md +0 -105
  154. package/scripts/archive-distilled-junk.ts +0 -116
  155. package/scripts/backfill-l0l1l2.ts +0 -98
  156. package/scripts/blind-scan.ts +0 -588
  157. package/scripts/cleanup-step1-exact-dups.ts +0 -117
  158. package/scripts/cleanup-step2-template-dups.ts +0 -113
  159. package/scripts/cleanup-step3-stale-content.ts +0 -149
  160. package/scripts/cleanup-step4-orphan-scopes.ts +0 -131
  161. package/scripts/delete-distilled-junk.ts +0 -88
  162. package/scripts/distill-facts.ts +0 -305
  163. package/scripts/health-check.ts +0 -343
  164. package/scripts/incremental-ingest.sh +0 -71
  165. package/scripts/mlp-health-check.ts +0 -382
  166. package/scripts/pull-claude-desktop.ts +0 -515
  167. package/scripts/re-ingest-cc.sh +0 -66
  168. package/scripts/rebalance-memory-health.ts +0 -181
  169. package/scripts/run-desktop-ingest.sh +0 -11
  170. package/scripts/start-server.sh +0 -12
  171. package/scripts/viz-dashboard.html +0 -423
  172. package/scripts/viz-export.ts +0 -703
  173. package/src/__tests__/access-tracker-novelty.test.ts +0 -228
  174. package/src/__tests__/auto-consolidation.test.ts +0 -168
  175. package/src/__tests__/auto-recall.test.ts +0 -131
  176. package/src/__tests__/batch-dedup.test.ts +0 -65
  177. package/src/__tests__/capture-engine.test.ts +0 -1142
  178. package/src/__tests__/capture-heuristic.test.ts +0 -171
  179. package/src/__tests__/cascade-forget.test.ts +0 -210
  180. package/src/__tests__/category-min-scores.test.ts +0 -33
  181. package/src/__tests__/confidence-tracker.test.ts +0 -196
  182. package/src/__tests__/conflict-advisor.test.ts +0 -206
  183. package/src/__tests__/conflict-escalation.test.ts +0 -149
  184. package/src/__tests__/conflict-lifecycle.test.ts +0 -83
  185. package/src/__tests__/conflict-output.test.ts +0 -85
  186. package/src/__tests__/conflict-store.test.ts +0 -374
  187. package/src/__tests__/consolidation-engine.test.ts +0 -181
  188. package/src/__tests__/context-composer-pins.test.ts +0 -64
  189. package/src/__tests__/context-composer-task-selection.test.ts +0 -24
  190. package/src/__tests__/context-renderer.test.ts +0 -91
  191. package/src/__tests__/continuity-eval.test.ts +0 -275
  192. package/src/__tests__/continuity-schema.test.ts +0 -97
  193. package/src/__tests__/core-recall-eval.test.ts +0 -235
  194. package/src/__tests__/core-summary.test.ts +0 -109
  195. package/src/__tests__/dedup-actions.test.ts +0 -58
  196. package/src/__tests__/deterministic-id.test.ts +0 -39
  197. package/src/__tests__/doctor.test.ts +0 -303
  198. package/src/__tests__/drill-down.test.ts +0 -108
  199. package/src/__tests__/embedder.test.ts +0 -122
  200. package/src/__tests__/entity-resolver.test.ts +0 -58
  201. package/src/__tests__/event-segmenter.test.ts +0 -153
  202. package/src/__tests__/hotness-blend.test.ts +0 -76
  203. package/src/__tests__/ingest.test.ts +0 -360
  204. package/src/__tests__/kg-extractor.test.ts +0 -184
  205. package/src/__tests__/kg-store.test.ts +0 -198
  206. package/src/__tests__/llm-consolidation.test.ts +0 -226
  207. package/src/__tests__/memory-boundaries.test.ts +0 -237
  208. package/src/__tests__/memory-health-rebalance.test.ts +0 -144
  209. package/src/__tests__/memory-output.test.ts +0 -215
  210. package/src/__tests__/multi-vector.test.ts +0 -242
  211. package/src/__tests__/ppr-traversal.test.ts +0 -256
  212. package/src/__tests__/preference-guard-smoke.test.ts +0 -211
  213. package/src/__tests__/preference-matcher.test.ts +0 -230
  214. package/src/__tests__/preference-slots.test.ts +0 -106
  215. package/src/__tests__/prospective-memory.test.ts +0 -283
  216. package/src/__tests__/query-entity-detector.test.ts +0 -171
  217. package/src/__tests__/query-expander.test.ts +0 -34
  218. package/src/__tests__/recall-mode.test.ts +0 -64
  219. package/src/__tests__/result-synthesizer.test.ts +0 -198
  220. package/src/__tests__/resume-context.test.ts +0 -4743
  221. package/src/__tests__/retrieval-trace.test.ts +0 -213
  222. package/src/__tests__/retriever-boundary-weight.test.ts +0 -136
  223. package/src/__tests__/retroactive-boost.test.ts +0 -223
  224. package/src/__tests__/scope-inventory.test.ts +0 -200
  225. package/src/__tests__/scope-policy.test.ts +0 -69
  226. package/src/__tests__/session-checkpoint.test.ts +0 -259
  227. package/src/__tests__/session-gc.test.ts +0 -215
  228. package/src/__tests__/store-scope-audit.test.ts +0 -81
  229. package/src/__tests__/temporal-parser.test.ts +0 -241
  230. package/src/__tests__/term-registry.test.ts +0 -121
  231. package/src/__tests__/tool-output-compressor.test.ts +0 -133
  232. package/src/__tests__/version-manager.test.ts +0 -213
  233. package/src/__tests__/workflow-observation.test.ts +0 -400
@@ -1,198 +0,0 @@
1
- /**
2
- * Tests for Tier 3.5: Result Synthesizer
3
- *
4
- * Validates:
5
- * 1. synthesize() with enough fragments calls LLM
6
- * 2. synthesize() returns fragments when below threshold
7
- * 3. synthesize() returns fragments when no LLM
8
- * 4. synthesize() handles LLM failure gracefully
9
- * 5. synthesizeSection() respects RECALLNEST_SYNTHESIZE env
10
- * 6. synthesizeSection() passes through when disabled
11
- * 7. Single fragment returned as-is (no LLM call)
12
- */
13
- import { describe, expect, it, beforeEach, afterEach } from "bun:test";
14
- import {
15
- synthesize,
16
- synthesizeSection,
17
- isSynthesisEnabled,
18
- DEFAULT_SYNTHESIZER_CONFIG,
19
- } from "../result-synthesizer.js";
20
- import type { LLMClient } from "../llm-client.js";
21
-
22
- // ---------------------------------------------------------------------------
23
- // Mock LLM Client
24
- // ---------------------------------------------------------------------------
25
-
26
- function createMockLLM(response: string | null = "Synthesized narrative."): LLMClient & { calls: Array<{ fragments: string[]; query: string }> } {
27
- const calls: Array<{ fragments: string[]; query: string }> = [];
28
- return {
29
- calls,
30
- async synthesizeFragments(fragments: string[], query: string) {
31
- calls.push({ fragments, query });
32
- return response;
33
- },
34
- } as any;
35
- }
36
-
37
- function createFailingLLM(): LLMClient {
38
- return {
39
- async synthesizeFragments() {
40
- throw new Error("LLM connection failed");
41
- },
42
- } as any;
43
- }
44
-
45
- // ---------------------------------------------------------------------------
46
- // synthesize() tests
47
- // ---------------------------------------------------------------------------
48
-
49
- describe("synthesize", () => {
50
- it("calls LLM when fragments >= minFragments", async () => {
51
- const llm = createMockLLM("Combined narrative about user preferences.");
52
- const fragments = ["Pref A: dark mode", "Pref B: vim keys", "Pref C: compact layout"];
53
-
54
- const result = await synthesize(fragments, "user preferences", llm);
55
-
56
- expect(result.synthesized).toBe(true);
57
- expect(result.text).toBe("Combined narrative about user preferences.");
58
- expect(result.reason).toBe("ok");
59
- expect(llm.calls.length).toBe(1);
60
- expect(llm.calls[0].query).toBe("user preferences");
61
- });
62
-
63
- it("skips synthesis when fragments < minFragments", async () => {
64
- const llm = createMockLLM();
65
- const fragments = ["Only one", "Two items"];
66
-
67
- const result = await synthesize(fragments, "test", llm);
68
-
69
- expect(result.synthesized).toBe(false);
70
- expect(result.reason).toBe("below-threshold");
71
- expect(result.fragments).toEqual(fragments);
72
- expect(llm.calls.length).toBe(0);
73
- });
74
-
75
- it("skips synthesis when no LLM provided", async () => {
76
- const fragments = ["A", "B", "C"];
77
- const result = await synthesize(fragments, "test", null);
78
-
79
- expect(result.synthesized).toBe(false);
80
- expect(result.reason).toBe("no-llm");
81
- });
82
-
83
- it("handles LLM failure gracefully", async () => {
84
- const llm = createFailingLLM();
85
- const fragments = ["A", "B", "C"];
86
-
87
- const result = await synthesize(fragments, "test", llm);
88
-
89
- expect(result.synthesized).toBe(false);
90
- expect(result.reason).toBe("error");
91
- expect(result.fragments).toEqual(fragments);
92
- });
93
-
94
- it("handles empty LLM response", async () => {
95
- const llm = createMockLLM(null);
96
- const fragments = ["A", "B", "C"];
97
-
98
- const result = await synthesize(fragments, "test", llm);
99
-
100
- expect(result.synthesized).toBe(false);
101
- expect(result.reason).toBe("empty-response");
102
- });
103
-
104
- it("handles empty fragments array", async () => {
105
- const llm = createMockLLM();
106
- const result = await synthesize([], "test", llm);
107
-
108
- expect(result.synthesized).toBe(false);
109
- expect(result.reason).toBe("below-threshold");
110
- });
111
-
112
- it("respects custom minFragments config", async () => {
113
- const llm = createMockLLM("ok");
114
- const fragments = ["A", "B"];
115
-
116
- // Default minFragments=3, so 2 items would be below threshold
117
- const result2 = await synthesize(fragments, "test", llm, { ...DEFAULT_SYNTHESIZER_CONFIG, minFragments: 2 });
118
- expect(result2.synthesized).toBe(true);
119
- });
120
- });
121
-
122
- // ---------------------------------------------------------------------------
123
- // synthesizeSection() tests
124
- // ---------------------------------------------------------------------------
125
-
126
- describe("synthesizeSection", () => {
127
- const originalEnv = process.env.RECALLNEST_SYNTHESIZE;
128
-
129
- afterEach(() => {
130
- if (originalEnv !== undefined) {
131
- process.env.RECALLNEST_SYNTHESIZE = originalEnv;
132
- } else {
133
- delete process.env.RECALLNEST_SYNTHESIZE;
134
- }
135
- });
136
-
137
- it("returns original items when RECALLNEST_SYNTHESIZE is not set", async () => {
138
- delete process.env.RECALLNEST_SYNTHESIZE;
139
- const items = ["A", "B", "C", "D"];
140
- const llm = createMockLLM("synthesized");
141
-
142
- const result = await synthesizeSection(items, "test", llm);
143
-
144
- expect(result).toEqual(items);
145
- expect(llm.calls.length).toBe(0);
146
- });
147
-
148
- it("synthesizes when RECALLNEST_SYNTHESIZE=true", async () => {
149
- process.env.RECALLNEST_SYNTHESIZE = "true";
150
- const items = ["Profile: developer", "Preference: dark mode", "Entity: project X"];
151
- const llm = createMockLLM("User is a developer who prefers dark mode and works on project X.");
152
-
153
- const result = await synthesizeSection(items, "user context", llm);
154
-
155
- expect(result).toEqual(["User is a developer who prefers dark mode and works on project X."]);
156
- });
157
-
158
- it("returns original items when synthesis fails", async () => {
159
- process.env.RECALLNEST_SYNTHESIZE = "true";
160
- const items = ["A", "B", "C"];
161
- const llm = createFailingLLM();
162
-
163
- const result = await synthesizeSection(items, "test", llm);
164
-
165
- expect(result).toEqual(items);
166
- });
167
- });
168
-
169
- // ---------------------------------------------------------------------------
170
- // isSynthesisEnabled() tests
171
- // ---------------------------------------------------------------------------
172
-
173
- describe("isSynthesisEnabled", () => {
174
- const originalEnv = process.env.RECALLNEST_SYNTHESIZE;
175
-
176
- afterEach(() => {
177
- if (originalEnv !== undefined) {
178
- process.env.RECALLNEST_SYNTHESIZE = originalEnv;
179
- } else {
180
- delete process.env.RECALLNEST_SYNTHESIZE;
181
- }
182
- });
183
-
184
- it("returns false when env not set", () => {
185
- delete process.env.RECALLNEST_SYNTHESIZE;
186
- expect(isSynthesisEnabled()).toBe(false);
187
- });
188
-
189
- it("returns true when env is 'true'", () => {
190
- process.env.RECALLNEST_SYNTHESIZE = "true";
191
- expect(isSynthesisEnabled()).toBe(true);
192
- });
193
-
194
- it("returns false when env is other value", () => {
195
- process.env.RECALLNEST_SYNTHESIZE = "false";
196
- expect(isSynthesisEnabled()).toBe(false);
197
- });
198
- });