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,181 +0,0 @@
1
- import lancedb from "@lancedb/lancedb";
2
-
3
- import {
4
- buildMemoryHealthRebalancePlan,
5
- summarizeMemoryHealthPlans,
6
- } from "../src/memory-health-rebalance.js";
7
-
8
- const TABLE_NAME = "memories";
9
- const DEFAULT_DB_PATH = "./data/lancedb";
10
- const DEFAULT_BATCH_SIZE = 2000;
11
-
12
- interface MemoryUpdateRow {
13
- id: string;
14
- text: string;
15
- vector: Iterable<number>;
16
- category: string;
17
- scope: string;
18
- importance: number;
19
- timestamp: number;
20
- metadata?: string;
21
- }
22
-
23
- function escapeSqlLiteral(value: string): string {
24
- return value.replace(/'/g, "''");
25
- }
26
-
27
- function formatPercent(count: number, total: number): string {
28
- if (total <= 0) return "0.0%";
29
- return `${((count / total) * 100).toFixed(1)}%`;
30
- }
31
-
32
- function parseArgs(argv: string[]): {
33
- dbPath: string;
34
- batchSize: number;
35
- apply: boolean;
36
- optimize: boolean;
37
- } {
38
- const positional: string[] = [];
39
- let batchSize = DEFAULT_BATCH_SIZE;
40
- let apply = false;
41
- let optimize = true;
42
-
43
- for (const arg of argv) {
44
- if (arg === "--apply") {
45
- apply = true;
46
- continue;
47
- }
48
- if (arg === "--skip-optimize") {
49
- optimize = false;
50
- continue;
51
- }
52
- if (arg.startsWith("--batch-size=")) {
53
- const value = Number(arg.slice("--batch-size=".length));
54
- if (Number.isFinite(value) && value > 0) {
55
- batchSize = Math.floor(value);
56
- }
57
- continue;
58
- }
59
- positional.push(arg);
60
- }
61
-
62
- return {
63
- dbPath: positional[0] || DEFAULT_DB_PATH,
64
- batchSize,
65
- apply,
66
- optimize,
67
- };
68
- }
69
-
70
- async function loadPlanningRows(table: Awaited<ReturnType<typeof lancedb.connect>> extends { openTable(name: string): infer T } ? Awaited<T> : never) {
71
- return await table
72
- .query()
73
- .select(["id", "importance", "timestamp", "metadata"])
74
- .toArray() as Array<{ id: string; importance: number; timestamp: number; metadata?: string }>;
75
- }
76
-
77
- async function loadBatchRows(
78
- table: Awaited<ReturnType<typeof lancedb.connect>> extends { openTable(name: string): infer T } ? Awaited<T> : never,
79
- ids: string[],
80
- ): Promise<MemoryUpdateRow[]> {
81
- const where = `id IN (${ids.map((id) => `'${escapeSqlLiteral(id)}'`).join(", ")})`;
82
- return await table
83
- .query()
84
- .where(where)
85
- .select(["id", "text", "vector", "category", "scope", "importance", "timestamp", "metadata"])
86
- .toArray() as MemoryUpdateRow[];
87
- }
88
-
89
- async function main() {
90
- const { dbPath, batchSize, apply, optimize } = parseArgs(process.argv.slice(2));
91
-
92
- console.log(`\n🛠️ Memory health rebalance`);
93
- console.log(`📂 DB path: ${dbPath}`);
94
- console.log(`📦 Batch size: ${batchSize}`);
95
- console.log(`🧪 Mode: ${apply ? "apply" : "dry-run"}\n`);
96
-
97
- const db = await lancedb.connect(dbPath);
98
- const table = await db.openTable(TABLE_NAME);
99
-
100
- console.log("⏳ Loading planning rows...");
101
- const planningRows = await loadPlanningRows(table);
102
- const accessCounts = planningRows.map((row) =>
103
- buildMemoryHealthRebalancePlan(row, {
104
- maxAccessCount: 1,
105
- minTimestamp: row.timestamp,
106
- maxTimestamp: row.timestamp,
107
- }).accessCount
108
- );
109
- const effectiveMaxAccessCount = Math.max(1, ...accessCounts);
110
- const minTimestamp = Math.min(...planningRows.map((row) => row.timestamp));
111
- const maxTimestamp = Math.max(...planningRows.map((row) => row.timestamp));
112
- const plans = planningRows.map((row) =>
113
- buildMemoryHealthRebalancePlan(row, {
114
- maxAccessCount: effectiveMaxAccessCount,
115
- minTimestamp,
116
- maxTimestamp,
117
- })
118
- );
119
- const summary = summarizeMemoryHealthPlans(plans);
120
-
121
- console.log(`✅ Planned ${summary.totalRows.toLocaleString()} rows`);
122
- console.log(` dead memory rows : ${summary.deadMemoryRows.toLocaleString()} (${formatPercent(summary.deadMemoryRows, summary.totalRows)})`);
123
- console.log(` tier backfills : ${summary.tierBackfills.toLocaleString()} (${formatPercent(summary.tierBackfills, summary.totalRows)})`);
124
- console.log(` tier changes : ${summary.tierChanges.toLocaleString()} (${formatPercent(summary.tierChanges, summary.totalRows)})`);
125
- console.log(` importance changes : ${summary.importanceChanges.toLocaleString()} (${formatPercent(summary.importanceChanges, summary.totalRows)})`);
126
- console.log(` rows to rewrite : ${summary.changedRows.toLocaleString()} (${formatPercent(summary.changedRows, summary.totalRows)})`);
127
-
128
- if (!apply) {
129
- console.log("\nDry run only. Re-run with --apply after backing up the LanceDB directory.");
130
- return;
131
- }
132
-
133
- const changedPlans = plans.filter((plan) => plan.changed);
134
- const planById = new Map(changedPlans.map((plan) => [plan.id, plan]));
135
-
136
- let processed = 0;
137
- for (let start = 0; start < changedPlans.length; start += batchSize) {
138
- const batchPlans = changedPlans.slice(start, start + batchSize);
139
- const ids = batchPlans.map((plan) => plan.id);
140
- const rows = await loadBatchRows(table, ids);
141
- const mergeRows = rows.map((row) => {
142
- const plan = planById.get(row.id);
143
- if (!plan) {
144
- throw new Error(`Missing plan for row ${row.id}`);
145
- }
146
- return {
147
- id: row.id,
148
- text: row.text,
149
- vector: Array.from(row.vector),
150
- category: row.category,
151
- scope: row.scope,
152
- importance: plan.nextImportance,
153
- timestamp: row.timestamp,
154
- metadata: JSON.stringify(plan.nextMetadata),
155
- };
156
- });
157
-
158
- await table
159
- .mergeInsert("id")
160
- .whenMatchedUpdateAll()
161
- .execute(mergeRows, { timeoutMs: 120_000 });
162
-
163
- processed += mergeRows.length;
164
- console.log(` batch ${Math.floor(start / batchSize) + 1}/${Math.ceil(changedPlans.length / batchSize)}: ${processed.toLocaleString()}/${changedPlans.length.toLocaleString()} rows`);
165
- }
166
-
167
- if (optimize) {
168
- console.log("\n⏳ Optimizing Lance table after batched rewrites...");
169
- await table.optimize();
170
- }
171
-
172
- console.log("\n✅ Memory health rebalance complete");
173
- console.log(` dead memory rows kept but downgraded: ${summary.deadMemoryRows.toLocaleString()}`);
174
- console.log(` tier backfills applied : ${summary.tierBackfills.toLocaleString()}`);
175
- console.log(` importance updates applied : ${summary.importanceChanges.toLocaleString()}`);
176
- }
177
-
178
- main().catch((error) => {
179
- console.error(error);
180
- process.exitCode = 1;
181
- });
@@ -1,11 +0,0 @@
1
- #!/bin/bash
2
- # 后台运行 desktop ingest,关窗口也不中断
3
- # 日志输出到 data/desktop-ingest.log
4
-
5
- cd "$(dirname "$0")/.."
6
- LOG="data/desktop-ingest.log"
7
-
8
- echo "$(date '+%Y-%m-%d %H:%M:%S') 开始导入 Desktop 对话..." > "$LOG"
9
- bun run src/cli.ts ingest --source desktop >> "$LOG" 2>&1
10
- echo "" >> "$LOG"
11
- echo "$(date '+%Y-%m-%d %H:%M:%S') 导入完成" >> "$LOG"
@@ -1,12 +0,0 @@
1
- #!/bin/bash
2
- # RecallNest MCP Server startup script
3
- # Handles first-run bun install automatically
4
- set -e
5
-
6
- PLUGIN_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
7
-
8
- if [ ! -d "$PLUGIN_DIR/node_modules" ]; then
9
- cd "$PLUGIN_DIR" && bun install --frozen-lockfile --silent 2>/dev/null
10
- fi
11
-
12
- exec bun run "$PLUGIN_DIR/src/mcp-server.ts"