recallnest 2.6.1 → 3.0.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 (207) hide show
  1. package/CHANGELOG.md +292 -0
  2. package/README.md +280 -195
  3. package/README_CN.md +266 -199
  4. package/config.json.example +8 -1
  5. package/docs/api-reference.md +1 -1
  6. package/integrations/README.md +1 -1
  7. package/integrations/agy/README.md +73 -0
  8. package/integrations/agy/setup.sh +75 -0
  9. package/integrations/setup-all.sh +1 -1
  10. package/package.json +7 -5
  11. package/src/access-tracker.ts +10 -1
  12. package/src/activity-counter.ts +69 -11
  13. package/src/age-label.ts +29 -0
  14. package/src/audit-log.ts +35 -0
  15. package/src/auto-gc.ts +97 -30
  16. package/src/capture-engine.ts +26 -4
  17. package/src/cli.ts +224 -10
  18. package/src/consolidation-engine.ts +317 -123
  19. package/src/context-composer-stable.ts +5 -1
  20. package/src/data-checkup.ts +17 -3
  21. package/src/dream-pipeline.ts +90 -12
  22. package/src/embedder.ts +44 -5
  23. package/src/env-config.ts +71 -0
  24. package/src/forget-engine.ts +8 -2
  25. package/src/gateway-server.ts +272 -0
  26. package/src/ingest.ts +248 -22
  27. package/src/kg-extractor.ts +17 -0
  28. package/src/llm-client.ts +86 -25
  29. package/src/mcp-server.ts +2 -1
  30. package/src/mcp-tools-advanced.ts +7 -2
  31. package/src/mcp-tools-core.ts +11 -1
  32. package/src/mcp-tools-governance.ts +45 -3
  33. package/src/memory-evolution.ts +16 -0
  34. package/src/memory-output.ts +47 -8
  35. package/src/memory-promotion.ts +280 -0
  36. package/src/memory-store-port.ts +32 -3
  37. package/src/memory-utility.ts +314 -0
  38. package/src/pivot-apply.ts +52 -1
  39. package/src/pivot-evidence.ts +128 -0
  40. package/src/ppr-traversal.ts +25 -1
  41. package/src/recall-ledger.ts +76 -0
  42. package/src/retriever.ts +82 -9
  43. package/src/runtime-config.ts +9 -0
  44. package/src/scope-policy.ts +22 -1
  45. package/src/session-engine.ts +11 -4
  46. package/src/session-output.ts +13 -4
  47. package/src/session-store.ts +2 -3
  48. package/src/skill-promotion.ts +218 -1
  49. package/src/store.ts +231 -71
  50. package/src/synthesis-contract.ts +286 -0
  51. package/src/version-manager.ts +83 -0
  52. package/src/workflow-observation-schema.ts +26 -0
  53. package/integrations/gemini-cli/README.md +0 -57
  54. package/integrations/gemini-cli/setup.sh +0 -64
  55. package/src/__tests__/access-tracker-novelty.test.ts +0 -304
  56. package/src/__tests__/activity-counter.test.ts +0 -125
  57. package/src/__tests__/adaptive-fidelity.test.ts +0 -102
  58. package/src/__tests__/admission-control.test.ts +0 -206
  59. package/src/__tests__/anchor-generator.test.ts +0 -67
  60. package/src/__tests__/api-server-security.test.ts +0 -102
  61. package/src/__tests__/auto-consolidation.test.ts +0 -168
  62. package/src/__tests__/auto-recall.test.ts +0 -131
  63. package/src/__tests__/babel-integration.test.ts +0 -144
  64. package/src/__tests__/batch-dedup.test.ts +0 -65
  65. package/src/__tests__/belief-history.test.ts +0 -220
  66. package/src/__tests__/canary-eval.test.ts +0 -114
  67. package/src/__tests__/capture-engine.test.ts +0 -1328
  68. package/src/__tests__/capture-heuristic.test.ts +0 -171
  69. package/src/__tests__/cascade-forget.test.ts +0 -210
  70. package/src/__tests__/category-min-scores.test.ts +0 -116
  71. package/src/__tests__/cc8-cc1-essential-context.test.ts +0 -298
  72. package/src/__tests__/circuit-breaker.test.ts +0 -99
  73. package/src/__tests__/cluster-consolidation.test.ts +0 -945
  74. package/src/__tests__/confidence-metadata.test.ts +0 -125
  75. package/src/__tests__/confidence-tracker.test.ts +0 -261
  76. package/src/__tests__/conflict-advisor.test.ts +0 -206
  77. package/src/__tests__/conflict-escalation.test.ts +0 -149
  78. package/src/__tests__/conflict-lifecycle.test.ts +0 -83
  79. package/src/__tests__/conflict-output.test.ts +0 -85
  80. package/src/__tests__/conflict-store.test.ts +0 -418
  81. package/src/__tests__/connector-v1.test.ts +0 -181
  82. package/src/__tests__/consolidation-engine.test.ts +0 -430
  83. package/src/__tests__/constructive-retrieval.test.ts +0 -509
  84. package/src/__tests__/context-collapse-renderer.test.ts +0 -214
  85. package/src/__tests__/context-composer-pins.test.ts +0 -64
  86. package/src/__tests__/context-composer-task-selection.test.ts +0 -24
  87. package/src/__tests__/context-reconstructor.test.ts +0 -65
  88. package/src/__tests__/context-renderer.test.ts +0 -91
  89. package/src/__tests__/continuity-eval.test.ts +0 -275
  90. package/src/__tests__/continuity-schema.test.ts +0 -97
  91. package/src/__tests__/contracts.test.ts +0 -262
  92. package/src/__tests__/conversation-importer.test.ts +0 -692
  93. package/src/__tests__/core-recall-eval.test.ts +0 -235
  94. package/src/__tests__/core-summary.test.ts +0 -109
  95. package/src/__tests__/data-checkup.test.ts +0 -276
  96. package/src/__tests__/decay-exemption.test.ts +0 -129
  97. package/src/__tests__/dedup-actions.test.ts +0 -58
  98. package/src/__tests__/dedup-guard.test.ts +0 -39
  99. package/src/__tests__/deterministic-id.test.ts +0 -39
  100. package/src/__tests__/distill-lock.test.ts +0 -305
  101. package/src/__tests__/distill-session-argshape.test.ts +0 -79
  102. package/src/__tests__/doctor.test.ts +0 -319
  103. package/src/__tests__/dream-pipeline.test.ts +0 -780
  104. package/src/__tests__/drill-down.test.ts +0 -108
  105. package/src/__tests__/embedder.test.ts +0 -122
  106. package/src/__tests__/emotion-decay.test.ts +0 -46
  107. package/src/__tests__/emotion-detector.test.ts +0 -56
  108. package/src/__tests__/emotion-phase1-integration.test.ts +0 -153
  109. package/src/__tests__/emotion-retrieval.test.ts +0 -56
  110. package/src/__tests__/entity-resolver.test.ts +0 -58
  111. package/src/__tests__/env-config.test.ts +0 -151
  112. package/src/__tests__/error-signature-boost.test.ts +0 -87
  113. package/src/__tests__/error-signature.test.ts +0 -95
  114. package/src/__tests__/error-taxonomy.test.ts +0 -129
  115. package/src/__tests__/ethics-layer.test.ts +0 -476
  116. package/src/__tests__/event-segmenter.test.ts +0 -153
  117. package/src/__tests__/feature-flags-integration.test.ts +0 -54
  118. package/src/__tests__/frequency-tracker.test.ts +0 -113
  119. package/src/__tests__/freshness.test.ts +0 -186
  120. package/src/__tests__/graph-export.test.ts +0 -489
  121. package/src/__tests__/hotness-blend.test.ts +0 -283
  122. package/src/__tests__/ingest-chunking.test.ts +0 -44
  123. package/src/__tests__/ingest.test.ts +0 -360
  124. package/src/__tests__/interference-detector.test.ts +0 -203
  125. package/src/__tests__/kg-extractor.test.ts +0 -192
  126. package/src/__tests__/kg-store.test.ts +0 -300
  127. package/src/__tests__/llm-client-pivot.test.ts +0 -628
  128. package/src/__tests__/llm-consolidation.test.ts +0 -226
  129. package/src/__tests__/maintenance-locks.test.ts +0 -189
  130. package/src/__tests__/mcp-efficiency.test.ts +0 -288
  131. package/src/__tests__/mcp-related-scopes.test.ts +0 -151
  132. package/src/__tests__/memory-boundaries.test.ts +0 -282
  133. package/src/__tests__/memory-evolution-b2-b3-e1.test.ts +0 -345
  134. package/src/__tests__/memory-evolution.test.ts +0 -271
  135. package/src/__tests__/memory-health-rebalance.test.ts +0 -144
  136. package/src/__tests__/memory-lint.test.ts +0 -421
  137. package/src/__tests__/memory-output.test.ts +0 -215
  138. package/src/__tests__/memory-promotion.test.ts +0 -315
  139. package/src/__tests__/migrate-dedup-ids.test.ts +0 -65
  140. package/src/__tests__/multi-vector.test.ts +0 -242
  141. package/src/__tests__/narrative-architecture.test.ts +0 -456
  142. package/src/__tests__/noise-filter.test.ts +0 -205
  143. package/src/__tests__/noise-prototype-bank.test.ts +0 -280
  144. package/src/__tests__/obsidian-connector.test.ts +0 -363
  145. package/src/__tests__/omitted-reporting.test.ts +0 -98
  146. package/src/__tests__/pending-review.test.ts +0 -77
  147. package/src/__tests__/pii-redact.test.ts +0 -333
  148. package/src/__tests__/pivot-apply.test.ts +0 -373
  149. package/src/__tests__/pivot-distill-supervisor.test.ts +0 -457
  150. package/src/__tests__/pivot-distill.test.ts +0 -1178
  151. package/src/__tests__/post-retrieval-filter.test.ts +0 -178
  152. package/src/__tests__/ppr-traversal.test.ts +0 -256
  153. package/src/__tests__/prediction-engine.test.ts +0 -349
  154. package/src/__tests__/predictive-prospective-memory.test.ts +0 -416
  155. package/src/__tests__/preference-guard-smoke.test.ts +0 -211
  156. package/src/__tests__/preference-matcher.test.ts +0 -282
  157. package/src/__tests__/preference-slots.test.ts +0 -205
  158. package/src/__tests__/prospective-memory.test.ts +0 -283
  159. package/src/__tests__/pull-from-macbook-sync-only.test.ts +0 -679
  160. package/src/__tests__/query-entity-detector.test.ts +0 -171
  161. package/src/__tests__/query-expander-alias.test.ts +0 -146
  162. package/src/__tests__/query-expander.test.ts +0 -34
  163. package/src/__tests__/recall-gate.test.ts +0 -266
  164. package/src/__tests__/recall-governor.test.ts +0 -227
  165. package/src/__tests__/recall-mode.test.ts +0 -64
  166. package/src/__tests__/resolve-db-path.test.ts +0 -130
  167. package/src/__tests__/resolve-tier.test.ts +0 -64
  168. package/src/__tests__/result-synthesizer.test.ts +0 -198
  169. package/src/__tests__/resume-context.test.ts +0 -4898
  170. package/src/__tests__/retrieval-eval.test.ts +0 -163
  171. package/src/__tests__/retrieval-trace.test.ts +0 -213
  172. package/src/__tests__/retriever-boundary-weight.test.ts +0 -136
  173. package/src/__tests__/retriever-lazy-init-dispatch.test.ts +0 -123
  174. package/src/__tests__/retroactive-boost.test.ts +0 -223
  175. package/src/__tests__/salience-scoring.test.ts +0 -106
  176. package/src/__tests__/scope-inventory.test.ts +0 -200
  177. package/src/__tests__/scope-policy.test.ts +0 -69
  178. package/src/__tests__/scope-suggester.test.ts +0 -80
  179. package/src/__tests__/session-checkpoint.test.ts +0 -291
  180. package/src/__tests__/session-distiller.test.ts +0 -640
  181. package/src/__tests__/session-gc.test.ts +0 -215
  182. package/src/__tests__/skill-engine.test.ts +0 -552
  183. package/src/__tests__/skill-promotion.test.ts +0 -654
  184. package/src/__tests__/skill-verifier.test.ts +0 -122
  185. package/src/__tests__/source-heartbeat.test.ts +0 -250
  186. package/src/__tests__/stable-context-length-contract.test.ts +0 -62
  187. package/src/__tests__/store-patch-metadata.test.ts +0 -205
  188. package/src/__tests__/store-read-consistency.test.ts +0 -122
  189. package/src/__tests__/store-schema-migration.test.ts +0 -87
  190. package/src/__tests__/store-scope-audit.test.ts +0 -81
  191. package/src/__tests__/store-upsert.test.ts +0 -201
  192. package/src/__tests__/supersede-chain.test.ts +0 -154
  193. package/src/__tests__/temporal-parser.test.ts +0 -241
  194. package/src/__tests__/temporal-validity.test.ts +0 -160
  195. package/src/__tests__/term-registry-terminal-roster.test.ts +0 -127
  196. package/src/__tests__/term-registry.test.ts +0 -121
  197. package/src/__tests__/tool-error-surfacing.test.ts +0 -98
  198. package/src/__tests__/tool-output-compressor.test.ts +0 -160
  199. package/src/__tests__/topic-tag.test.ts +0 -113
  200. package/src/__tests__/trusted-memory.test.ts +0 -839
  201. package/src/__tests__/ui-server-security.test.ts +0 -93
  202. package/src/__tests__/usage-tracker.test.ts +0 -287
  203. package/src/__tests__/version-manager.test.ts +0 -213
  204. package/src/__tests__/workflow-observation-skill-outcome.test.ts +0 -352
  205. package/src/__tests__/workflow-observation.test.ts +0 -433
  206. package/src/__tests__/write-verifier.test.ts +0 -122
  207. /package/integrations/{gemini-cli/gemini-md-snippet.md → agy/agy-md-snippet.md} +0 -0
package/README.md CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  # RecallNest
4
4
 
5
- **Shared Memory Layer for Any MCP Client — Claude Code, Codex, Kimi, Antigravity, Gemini CLI**
5
+ **Shared Memory Layer for Every AI Client — CLI agents, desktop apps, your own scripts**
6
6
 
7
- *One memory. Every terminal. Context that survives across windows.*
7
+ *One memory. Every client. Context that survives across windows — and across machines.*
8
8
 
9
9
  A local-first memory system backed by LanceDB that turns scattered conversation history into reusable knowledge — shared across your coding agents, recalled automatically.
10
10
 
11
11
  [![GitHub](https://img.shields.io/github/stars/AliceLJY/recallnest?style=social)](https://github.com/AliceLJY/recallnest)
12
12
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
13
- [![Runtime](https://img.shields.io/badge/Runtime-Bun_|_Node.js_18+-f9f1e1?logo=bun)](https://bun.sh)
13
+ [![Runtime](https://img.shields.io/badge/Runtime-Bun_|_Node.js_22+-f9f1e1?logo=bun)](https://bun.sh)
14
14
  [![LanceDB](https://img.shields.io/badge/LanceDB-Vector+FTS-orange)](https://lancedb.com)
15
- [![MCP](https://img.shields.io/badge/MCP-43_tools-blue)](https://modelcontextprotocol.io)
15
+ [![MCP](https://img.shields.io/badge/MCP-44_tools-blue)](https://modelcontextprotocol.io)
16
16
  [![CI](https://github.com/AliceLJY/recallnest/actions/workflows/ci.yml/badge.svg)](https://github.com/AliceLJY/recallnest/actions/workflows/ci.yml)
17
17
  [![CC Plugin](https://img.shields.io/badge/Claude_Code-Plugin-blueviolet)](https://github.com/AliceLJY/recallnest)
18
18
 
@@ -26,115 +26,38 @@ A local-first memory system backed by LanceDB that turns scattered conversation
26
26
 
27
27
  Coding agents forget everything between windows. Your context — project configs, debugging decisions, entity mappings — is scattered across Claude Code, Codex, Kimi, Antigravity — and every other terminal you open — with no shared memory.
28
28
 
29
- RecallNest solves this: **a single LanceDB-backed memory layer that your coding agents read and write**. Context stored in one window is auto-recalled in another. Sessions checkpoint on exit and resume on start. Memory decays, evolves, and self-organizes — not just raw log storage.
29
+ RecallNest is **one LanceDB-backed memory layer that all of them read and write**. Context stored in one window is recalled in another. Sessions checkpoint on exit and resume on start. Memory decays, evolves, and self-organizes — it is not a log you grep.
30
30
 
31
+ ### What a recall actually looks like
31
32
 
32
- ## Quick Start
33
-
34
- ### Option A: Claude Code Plugin (recommended)
33
+ ```text
34
+ Query : deploy rollback
35
+ Hits : 5
35
36
 
36
- ```bash
37
- /plugin marketplace add AliceLJY/recallnest
38
- /plugin install recallnest@AliceLJY
37
+ # ID Score Category Tier Source Date Age Retrieval Path
38
+ 1 ee79037a 46.1% cases peripheral cc 2026-08-25 2d vector
39
+ [assistant] Rolled back to the previous image and pinned the digest so the next…
40
+ prov : evidence/transcript-ingest
41
+ imgs : 52 agent-made in this session · read sess=dca70d4a
39
42
  ```
40
43
 
41
- RecallNest starts automatically with Claude Code. No manual MCP config needed.
42
-
43
- Claude Code prompts for a Jina API key during installation. The key is stored through Claude Code's sensitive plugin configuration, while the generated config and LanceDB database live in the plugin's persistent data directory rather than the versioned plugin cache.
44
+ Three things in that block carry most of the design:
44
45
 
45
- > The Claude Code plugin and npm package share one release version and are updated together.
46
- >
47
- > **Requires:** [Bun](https://bun.sh). Dependencies install on first start.
46
+ - **`Source cc` · `Age 2d`** — this came out of a Claude Code window two days ago and you
47
+ are reading it from a different terminal, possibly on a different machine. That is the
48
+ premise the whole project is built on.
49
+ - **`prov : evidence/…`** — every row states which layer it sits on. A fragment scraped out
50
+ of a transcript never gets to pose as a decision you actually made; moving to durable
51
+ memory is a separate, gated step with its own evidence requirement.
52
+ - **`imgs : …`** — that session contained 52 images. **Not one of them is in the database.**
53
+ The line exists so you know there is something to go look at, and producing it cost no
54
+ model call, no vector, and no storage.
48
55
 
49
- ### Option B: npm install
56
+ That last one is the approach in miniature: **store what makes a thing findable, not
57
+ everything that could ever be asked about it.** The full reasoning — including the two
58
+ places where the obvious implementation was wrong — is in
59
+ [Images: addressable, not embedded](#images-addressable-not-embedded).
50
60
 
51
- ```bash
52
- npx recallnest --help # run directly
53
- # or
54
- npm install -g recallnest # install globally
55
- recallnest doctor
56
- ```
57
-
58
- Works with Node.js 18+ (via tsx) or Bun. No git clone needed.
59
-
60
- ### Option C: Manual setup
61
-
62
- ```bash
63
- git clone https://github.com/AliceLJY/recallnest.git
64
- cd recallnest
65
- bun install
66
- cp config.json.example config.json
67
- cp .env.example .env
68
- # Edit .env → add your JINA_API_KEY
69
- ```
70
-
71
- ### Start the server
72
-
73
- ```bash
74
- bun run api
75
- # → RecallNest API running at http://localhost:4318
76
- ```
77
-
78
- ### Try it
79
-
80
- ```bash
81
- # Store a memory
82
- curl -X POST http://localhost:4318/v1/store \
83
- -H "Content-Type: application/json" \
84
- -d '{"text": "User prefers dark mode", "category": "preferences"}'
85
-
86
- # Recall memories
87
- curl -X POST http://localhost:4318/v1/recall \
88
- -H "Content-Type: application/json" \
89
- -d '{"query": "user preferences"}'
90
-
91
- # Check stats
92
- curl http://localhost:4318/v1/stats
93
- ```
94
-
95
- ### Connect your terminals
96
-
97
- ```bash
98
- bash integrations/claude-code/setup.sh
99
- bash integrations/gemini-cli/setup.sh
100
- bash integrations/codex/setup.sh
101
- ```
102
-
103
- Each script installs MCP access and managed continuity rules, so `resume_context` fires automatically in fresh windows.
104
-
105
- ### Index existing conversations
106
-
107
- ```bash
108
- bun run src/cli.ts ingest --source all
109
- bun run seed:continuity
110
- bun run src/cli.ts doctor
111
- ```
112
-
113
- ---
114
-
115
- ## Web UI
116
-
117
- <p align="center">
118
- <img src="assets/dashboard.png" alt="RecallNest Dashboard" width="800" />
119
- <br><em>Dashboard — total count, category distribution, health score, and growth trends at a glance.</em>
120
- </p>
121
-
122
- <p align="center">
123
- <img src="assets/screenshots/ui-full.png" alt="RecallNest Search Workbench" width="800" />
124
- <br><em>Search Workbench — hybrid search with topic tag filtering, 4 retrieval profiles, Skills browser, and asset management.</em>
125
- </p>
126
-
127
- <p align="center">
128
- <img src="assets/knowledge-graph.png" alt="RecallNest Knowledge Graph" width="800" />
129
- <br><em>Knowledge Graph — interactive force-directed visualization with semantic bridges revealing cross-domain connections.</em>
130
- </p>
131
-
132
- ```bash
133
- bun run src/ui-server.ts
134
- # → http://localhost:4317
135
- ```
136
-
137
- ---
138
61
 
139
62
  ## Core Capabilities
140
63
 
@@ -196,134 +119,251 @@ bun run src/ui-server.ts
196
119
 
197
120
  ---
198
121
 
199
- ## New in v2.6: Reliable Cross-Process Memory and Distribution
122
+ ## Architecture
200
123
 
201
- v2.6 turns the development since v2.5.4 into a release-ready upgrade:
124
+ ```
125
+ CLIENTS ACCESS CORE ENGINE STORAGE
126
+ ────────────────────── ─────────────────────── ──────────────────────────── ──────────────────────
127
+
128
+ Claude Code MCP over stdio Retriever LanceDB
129
+ Codex ───▶ 44 tools, 3 tiers ───▶ vector + BM25 + RRF ───▶ vector + columnar
130
+ Kimi · Antigravity Classifier · 6 categories
131
+ Doubao desktop Context composer
132
+ HTTP API :4318 resume_context Jina embeddings v5
133
+ your scripts · cron ───▶ 21 endpoints ───▶ Decay · Weibull half-life ─▶ 1024-dim, task-aware
134
+ Conflict · audit + merge
135
+ phone app ───▶ read-only gateway ───▶ Capture: evidence → durable
136
+ :8791, token-gated
137
+ ```
202
138
 
203
- - **Cross-process visibility** — LanceDB now checks for external commits on every read by default, so resident MCP/API/UI processes see writes from CLI ingestion without a restart. Set `RECALLNEST_READ_CONSISTENCY_INTERVAL=<seconds>` for bounded staleness or `off` for the legacy unchecked behavior.
204
- - **Safer memory evolution** — belief changes preserve the old row as `superseded`; procedural memories avoid time decay; cold-start and length-normalization behavior no longer suppress short entity queries or stable memories.
205
- - **More reliable consolidation** — `dream` now distinguishes failure classes, honors wall-clock budgets, refills vectors before semantic clustering, and asserts that successful runs actually produced work.
206
- - **Broader conversation coverage** — Kimi, AGY/Antigravity, and minis sources are recognized across ingestion, scope boundaries, and term resolution.
207
- - **One public version** — npm metadata, CLI `--version`, MCP handshakes, HTTP health responses, and the Claude Code marketplace all follow the `2.6.0` release contract.
208
- - **Installable Claude Code plugin** — installation now registers the 43-tool MCP server and continuity skill, asks for the Jina key through sensitive plugin configuration, and keeps config plus LanceDB data in Claude Code's persistent plugin data directory.
139
+ ### Internal Design
209
140
 
210
- ### Upgrading from v2.5.4
141
+ - **L0 / L1 / L2 Dynamic Folding** — every memory stores 3 granularity layers (one-liner / bullet summary / full content); retrieval dynamically selects which layer to return based on relevance score and token budget
142
+ - **Weibull Decay + Emotion Modulation** — memories decay along a parametric Weibull curve; importance scores modulate the half-life, and emotional salience extends it further (up to 30%)
143
+ - **Vector Pre-filter + LLM Dedup** — 90% of dedup decisions use cheap cosine similarity (>= 0.92); only borderline cases invoke LLM judgment, keeping costs low without sacrificing accuracy
144
+ - **Category-Aware Merge Strategies** — `profile` and `preferences` use merge-on-conflict (latest wins); `events` and `cases` use append-only (history preserved)
145
+ - **Display Score vs Elimination Score** — dual-track retrieval: tier floor prevents core memories from ever dropping out, while decay boost lets fresh memories surface temporarily without permanently displacing stable ones
211
146
 
212
- - Existing LanceDB data is opened in place. Legacy tables missing newer fields are migrated automatically, including empty tables.
213
- - Plugin data survives plugin updates because it is stored outside the versioned cache. A manual clone continues to use its existing `config.json` and database path.
214
- - Retrieval auditing now includes read operations. `audit.jsonl` has no automatic rotation yet; consider archiving it if it approaches 50 MB.
215
- - `RECALLNEST_LAYER_ADMISSION` remains opt-in (`observe` or `on`); the default is `off`.
147
+ > Full architecture deep-dive: [`docs/architecture.md`](docs/architecture.md)
216
148
 
217
149
  ---
218
150
 
219
- ## New in v2.1: Philosophy-Informed Memory
151
+ ## Who Can Connect
220
152
 
221
- v2.0 built the operational memory platform; v2.1 added philosophy-informed memory behavior.
153
+ **The data layer does not know what your client looks like.** RecallNest exposes the same LanceDB store through three outlets, so the right one is picked per client — not per protocol.
222
154
 
223
- Five upgrades derived from 9 research dimensions in philosophy of memory, each mapped to concrete engineering:
155
+ | What your client can do | Route | Verified with |
156
+ |---|---|---|
157
+ | Run a local command (CLI agent) | **MCP over stdio** | Claude Code, Codex, Kimi, Antigravity |
158
+ | Run a local command (GUI app, MCP config filled by hand) | **MCP over stdio** | Doubao desktop — same shape as Cherry Studio / ChatBox |
159
+ | Only speak HTTP | **HTTP API** | custom agents, scripts, cron |
160
+ | Run on another machine | swap the stdio command for `ssh <host> recallnest-mcp` | four clients on a laptop reading one store on a home server |
224
161
 
225
- - **Emotion-Aware Decay** *(Affective Memory Theory)* — Memories with strong emotional content decay 20-30% slower. Keyword-based emotion detection computes `salience` (mnemonic significance), which feeds into the Weibull half-life formula and a rebalanced 4-factor evolution score. Zero LLM cost.
162
+ Two consequences worth stating plainly:
226
163
 
227
- - **Memory Ethics Layer** *(Right to Be Forgotten / GDPR Art. 17)* — Four privacy tiers (`ephemeral` / `private` / `durable` / `shared`). Cascade forgetting engine that propagates deletion through KG triples, evolution chains, pin assets, and briefs. Full audit trail. `forget_memory` MCP tool for agent-driven deletion.
164
+ - **Not tied to one protocol.** A GUI chat app that supports MCP config connects the same way a terminal agent does. A client that can only issue HTTP requests still reads the same memory.
165
+ - **Not tied to one machine.** Because the MCP transport is stdio, the launch command is yours to define — point it at `ssh` and every client on every machine shares a single source of truth instead of each host growing its own database.
228
166
 
229
- - **Autobiographical Narrative** *(Narrative Identity Theory / Conway's 3-layer model)* — Memories are tagged with `lifePeriod → generalEvent → specificEvent` hierarchy, orthogonal to existing 6 categories. Retrieval pulls narrative siblings. Context rendering groups by life period. Rule-based tagger with EN+CN support.
167
+ Adding a client does not mean changing RecallNest. A capable client writes one config line; a limited one gets a thin gateway in front of the HTTP API.
230
168
 
231
- - **Constructive Retrieval** *(Simulation Theory / Michaelian)* — Instead of returning raw stored text, RecallNest now reconstructs context from an expanded candidate set: KG neighbors + evolution chains + cluster members + narrative siblings. Source-map grounded coverage replaces lexical overlap. Contradictions are detected and flagged.
169
+ ### AI apps on a phone: the read-only gateway
232
170
 
233
- - **Predictive Prospective Memory** *(Mental Time Travel / Tulving)* — Heuristic prediction engine that surfaces "you might need this" reminders from behavioral signals: stale checkpoint open loops, corrected workflow observations, high-frequency dormant memories, and uncovered query topics. Zero LLM cost. Auto-expire in 7 days if unaccepted.
171
+ The HTTP API (`:4318`) binds to `127.0.0.1` and rejects any request whose Host header is not local. That is **deliberate** — it also exposes write routes (`/v1/store`, `/v1/checkpoint`), so putting it on a public address would hand out write access.
234
172
 
235
- ---
173
+ To let an AI app on your phone read the same memory, put a read-only gateway in front:
236
174
 
237
- ## New in v2.2: Retrieval Quality Hardening
175
+ ```bash
176
+ openssl rand -hex 32 > ~/.config/recallnest/gateway-token
177
+ chmod 600 ~/.config/recallnest/gateway-token
238
178
 
239
- v2.1 added philosophy-informed behavior; v2.2 closes the last three engine-layer gaps identified by a frontier research scan (ACC, PI-LLM, TSM).
179
+ bun run api # local API on :4318
180
+ bun run gateway # read-only gateway on :8791 → forwards to :4318
181
+ ```
240
182
 
241
- - **Memory Confidence Meta-tags** *(ACC / Dual-Process UQ)* — Each memory now carries structured `ConfidenceMetadata` (score, reliability tier: `direct` / `inferred` / `hearsay`). Auto-assigned from source on write (`manual` = 0.9, `agent` = 0.7, `conversation_import` = 0.5). Retrieval scores are weighted by confidence. `resume_context` tags low-confidence items with `[低置信]`.
183
+ The gateway allows read routes only (`/recall`, `/search`, `/stats`, `/health`); **every write route is a 404**. Bearer token compared in constant time, per-minute rate limit, hard caps on request and response size. Put it behind a tunnel (Tailscale Serve/Funnel, Cloudflare Tunnel, …) to reach it from a phone.
242
184
 
243
- - **Interference Detection + Active Forgetting Gate** *(PI-LLM / SleepGate)* — Semantic cluster detection identifies groups of near-duplicate memories competing for retrieval. Enhanced RIF keeps only top-K (default 3) per cluster; extras are demoted 50% instead of removed. Write-time pre-warning: when a scope accumulates ≥5 high-similarity active memories, the weakest is flagged `pending_review`. `data_checkup` reports interference density.
185
+ ```bash
186
+ curl -X POST https://<your-tunnel>/recall \
187
+ -H "Authorization: Bearer $(cat ~/.config/recallnest/gateway-token)" \
188
+ -H 'content-type: application/json' \
189
+ -d '{"query":"how did we fix that deploy issue","limit":3,"allScopes":true}'
190
+ ```
244
191
 
245
- - **Temporal Validity Windows** *(TSM / TiMem / Zep)* — `store_memory` accepts `validUntil` (expiration) and `eventTime` (when the event actually happened). `search_memory` supports `validAt` (point-in-time query) and `includeExpired` (demote 80% instead of hide). Auto-GC applies 2× decay acceleration to expired memories.
192
+ Optional: set `RECALLNEST_GATEWAY_FILE_ROOTS="notes=/abs/path,wiki=/abs/path"` to add `GET /files/search`, a read-only ripgrep search over markdown directories you name (the query is passed as an argv element, never through a shell). Leave it unset and the route does not exist.
246
193
 
247
- - **Usage-Adjusted Auto-GC** *(off by default)* — `RECALLNEST_USAGE_DECAY=true` enables a GC-only cold-memory penalty when constructive retrieval is also active. Cold memories discount the frequency component instead of changing online retrieval ranking.
194
+ > The gateway also binds to `127.0.0.1` by default — exposing it is the tunnel's job. Evaluate that risk yourself.
248
195
 
249
- ---
196
+ This is how the author connected [OpenMinis](https://github.com/OpenMinis/OpenMinis) on an iPhone: the phone app reaches the gateway over a Tailscale Funnel and queries the same memory store. The interesting part is what it reads back — its own history. Those conversations get exported, flow back, and are indexed, so a phone agent that cold-starts every time ends up with memory that survives its sessions.
250
197
 
251
- ## New in v2.3: Connector Ecosystem + Source Health
252
198
 
253
- v2.2 hardened retrieval quality; v2.3 opens RecallNest to external data sources with a standard connector framework and operational health monitoring.
254
199
 
255
- - **Connector-v1 Standard** *(GB-2)* — A JSON format (`ConnectorOutputV1`) that any external script can produce. Obsidian vaults, emails, RSS feeds, log files — normalize once, ingest through the full dedup/embed/extract pipeline. See [`docs/connector-spec.md`](docs/connector-spec.md) for the specification and [`connectors/examples/`](connectors/examples/) for adapter skeletons (email, logs, RSS).
200
+ ## Quick Start
256
201
 
257
- - **Obsidian Vault Ingestion** *(GB-1)* — First-party Obsidian connector: scans `.md` files, extracts frontmatter + wikilinks, maps folder structure to tags. One command: `lm ingest --obsidian /path/to/vault`.
202
+ ### Option A: Claude Code Plugin (recommended)
258
203
 
259
- - **Source Health Monitoring** *(GB-3)* — Every connector ingest writes a heartbeat to `data/source-heartbeat.json`. `data_checkup` flags stale sources (>7d warning, >30d error). `doctor --ci` shows a per-source heartbeat summary with human-readable age.
204
+ ```bash
205
+ /plugin marketplace add AliceLJY/recallnest
206
+ /plugin install recallnest@AliceLJY
207
+ ```
260
208
 
261
- ---
209
+ RecallNest starts automatically with Claude Code. No manual MCP config needed.
262
210
 
263
- ## Architecture
211
+ Claude Code prompts for a Jina API key during installation. The key is stored through Claude Code's sensitive plugin configuration, while the generated config and LanceDB database live in the plugin's persistent data directory rather than the versioned plugin cache.
212
+
213
+ > The Claude Code plugin and npm package share one release version and are updated together.
214
+ >
215
+ > **Requires:** [Bun](https://bun.sh). Dependencies install on first start.
264
216
 
217
+ ### Option B: npm install
218
+
219
+ ```bash
220
+ npx recallnest --help # run directly
221
+ # or
222
+ npm install -g recallnest # install globally
223
+ recallnest doctor
265
224
  ```
266
- ┌──────────────────────────────────────────────────────────┐
267
- │ Client Layer │
268
- ├──────────┬──────────┬──────────┬──────────────────────────┤
269
- │ Claude │ Gemini │ Codex │ Custom Agents / curl │
270
- │ Code │ CLI │ │ │
271
- └────┬─────┴────┬─────┴────┬─────┴──────┬──────────────────┘
272
- │ │ │ │
273
- └──── MCP (stdio) ───┘ HTTP API (port 4318)
274
- │ │
275
- ▼ ▼
276
- ┌──────────────────────────────────────────────────────────┐
277
- │ Integration Layer │
278
- │ ┌─────────────────────┐ ┌────────────────────────────┐ │
279
- │ │ MCP Server │ │ HTTP API Server │ │
280
- │ │ 43 tools │ │ 21 endpoints │ │
281
- │ └─────────┬───────────┘ └──────────┬─────────────────┘ │
282
- └────────────┼─────────────────────────┼───────────────────┘
283
- └──────────┬──────────────┘
284
- ▼
285
- ┌──────────────────────────────────────────────────────────┐
286
- │ Core Engine │
287
- │ │
288
- │ ┌────────────┐ ┌────────────┐ ┌─────────────────────┐ │
289
- │ │ Retriever │ │ Classifier │ │ Context Composer │ │
290
- │ │ (vector + │ │ (6 cats) │ │ (resume_context) │ │
291
- │ │ BM25 + RRF)│ │ │ │ │ │
292
- │ └────────────┘ └────────────┘ └──────────────────────┘ │
293
- │ ┌────────────┐ ┌────────────┐ ┌─────────────────────┐ │
294
- │ │ Decay │ │ Conflict │ │ Capture Engine │ │
295
- │ │ Engine │ │ Engine │ │ (evidence → durable) │ │
296
- │ │ (Weibull) │ │ (audit + │ │ │ │
297
- │ │ │ │ merge) │ │ │ │
298
- │ └────────────┘ └────────────┘ └──────────────────────┘ │
299
- └──────────────────────────┬───────────────────────────────┘
300
- ▼
301
- ┌──────────────────────────────────────────────────────────┐
302
- │ Storage Layer │
303
- │ ┌─────────────────────┐ ┌────────────────────────────┐ │
304
- │ │ LanceDB │ │ Jina Embeddings v5 │ │
305
- │ │ (vector + columnar) │ │ (1024-dim, task-aware) │ │
306
- │ └─────────────────────┘ └────────────────────────────┘ │
307
- └──────────────────────────────────────────────────────────┘
225
+
226
+ Works with Node.js 22+ (via tsx) or Bun. No git clone needed.
227
+
228
+ ### Option C: Manual setup
229
+
230
+ ```bash
231
+ git clone https://github.com/AliceLJY/recallnest.git
232
+ cd recallnest
233
+ bun install
234
+ cp config.json.example config.json
235
+ cp .env.example .env
236
+ # Edit .env → add your JINA_API_KEY
308
237
  ```
309
238
 
310
- ### Internal Design
239
+ ### Start the server
311
240
 
312
- - **L0 / L1 / L2 Dynamic Folding** — every memory stores 3 granularity layers (one-liner / bullet summary / full content); retrieval dynamically selects which layer to return based on relevance score and token budget
313
- - **Weibull Decay + Emotion Modulation** — memories decay along a parametric Weibull curve; importance scores modulate the half-life, and emotional salience extends it further (up to 30%)
314
- - **Vector Pre-filter + LLM Dedup** — 90% of dedup decisions use cheap cosine similarity (>= 0.92); only borderline cases invoke LLM judgment, keeping costs low without sacrificing accuracy
315
- - **Category-Aware Merge Strategies** — `profile` and `preferences` use merge-on-conflict (latest wins); `events` and `cases` use append-only (history preserved)
316
- - **Display Score vs Elimination Score** — dual-track retrieval: tier floor prevents core memories from ever dropping out, while decay boost lets fresh memories surface temporarily without permanently displacing stable ones
241
+ ```bash
242
+ bun run api
243
+ # → RecallNest API running at http://localhost:4318
244
+ ```
317
245
 
318
- > Full architecture deep-dive: [`docs/architecture.md`](docs/architecture.md)
246
+ ### Try it
247
+
248
+ ```bash
249
+ # Store a memory
250
+ curl -X POST http://localhost:4318/v1/store \
251
+ -H "Content-Type: application/json" \
252
+ -d '{"text": "User prefers dark mode", "category": "preferences"}'
253
+
254
+ # Recall memories
255
+ curl -X POST http://localhost:4318/v1/recall \
256
+ -H "Content-Type: application/json" \
257
+ -d '{"query": "user preferences"}'
258
+
259
+ # Check stats
260
+ curl http://localhost:4318/v1/stats
261
+ ```
262
+
263
+ ### Connect your terminals
264
+
265
+ ```bash
266
+ bash integrations/claude-code/setup.sh
267
+ bash integrations/agy/setup.sh
268
+ bash integrations/codex/setup.sh
269
+ ```
270
+
271
+ Each script installs MCP access and managed continuity rules, so `resume_context` fires automatically in fresh windows.
272
+
273
+ ### Index existing conversations
274
+
275
+ ```bash
276
+ bun run src/cli.ts ingest --source all
277
+ bun run seed:continuity
278
+ bun run src/cli.ts doctor
279
+ ```
319
280
 
320
281
  ---
321
282
 
283
+ ## Images: addressable, not embedded
284
+
285
+ Conversations contain images. A text memory layer does not. The usual answer is a
286
+ multimodal embedding model — encode every image into the same space as the text. That is
287
+ right for photo libraries. It is the wrong shape here, for a cheap reason: **in a
288
+ conversation an image almost never arrives alone.** It comes wrapped in "look at this
289
+ error", and the reply right after it usually describes what was in the picture. The words
290
+ around the image are already an index of it. What was missing was never semantic search
291
+ over pixels — it was knowing a picture is sitting there at all.
292
+
293
+ So RecallNest does not encode images. It records **how many images are in the session a
294
+ memory came from**, and lets you decide whether to open the original transcript. Meaning
295
+ is resolved on demand, by whatever model is asking, at the moment it matters.
296
+
297
+ The cost is worth stating plainly: **no multimodal model, no re-embedding, no image
298
+ storage, no change to any vector.** Backfilling 21,319 existing memories touched metadata
299
+ only.
300
+
301
+ Two design choices in it were not obvious, and both were wrong on the first attempt.
302
+
303
+ ### Session-level, on purpose
304
+
305
+ The marker counts the whole session, not the turn — coarser than it first looks like it
306
+ should be, and the coarseness is the point.
307
+
308
+ A turn that is nothing but a pasted screenshot has almost no text, so it never cleared the
309
+ length gate and never entered the store. Measured on real transcripts, **12.5% of turns
310
+ containing a pasted image were dropped whole** — including the ones worth the most, like
311
+ seven screenshots with no caption, or "here are the steps" attached to a picture that *is*
312
+ the steps. A turn-level marker has nothing to attach to for exactly those. A session-level
313
+ marker lands on that session's *other* memories, which did get stored, and those are what
314
+ a search surfaces.
315
+
316
+ The trade-off is undisguised: every memory from a session carries the same count, so the
317
+ images may have nothing to do with the row you are looking at. The line says
318
+ `in this session`, not `in this memory`, for that reason.
319
+
320
+ ### Two classes, because they answer different questions
321
+
322
+ | Bucket | What it is | The question it answers |
323
+ |---|---|---|
324
+ | user-pasted | Pictures a human put into a message | *Where is that screenshot I sent?* |
325
+ | agent-made | Everything else the session produced | *What did the page look like? What did I generate?* |
326
+
327
+ Keeping only the first is tempting — a person searching their own memory wants their own
328
+ screenshots. But an agent reconstructing its past work wants the other: the diagram it
329
+ drew, the rendering it captured, the illustration it made for a post. **Of 1,767 sessions
330
+ carrying images, 1,103 contain no human-pasted image at all.** Keep one bucket and those
331
+ sessions go silent — precisely the ones where the agent did visual work.
332
+
333
+ ### The second bucket is a complement, not a list
334
+
335
+ The first implementation defined agent-made images by enumeration: inside `tool_result`,
336
+ inside `payload.output`, inside `tool.result`. Every location was real. The list was still
337
+ wrong, because **the set of ways an image can appear only grows**, and an enumeration
338
+ silently drops whatever it did not anticipate.
339
+
340
+ So the second bucket is a complement: count every image signal in the record, subtract the
341
+ ones positively identified as human-pasted, attribute the rest without asking where it came
342
+ from. Across 9,619 transcripts:
343
+
344
+ | | Enumerated | Complement |
345
+ |---|---|---|
346
+ | Agent-made images | 5,812 | **10,938** |
347
+ | Sessions with any image | 1,507 | **1,767** |
348
+ | Human-pasted images | 1,629 | 1,629 |
349
+
350
+ **The enumeration missed 5,126 images and 376 sessions** — nearly half. The largest class
351
+ it dropped was image *generation*, which lives in neither container the list knew about.
352
+ Human-pasted counts are identical under both definitions, which is the check that matters:
353
+ widening the second bucket did not contaminate the precise one. A regression test feeds the
354
+ parser an `image_generation_call` — a shape the source never names — and asserts it lands
355
+ in the second bucket; under the enumerated implementation that test fails.
356
+
357
+ One caveat: the complement counts *signals*, not certified pictures. A single generation can
358
+ leave both a call and a completion record and be counted twice. That direction was chosen
359
+ deliberately — the question is "is there anything here to look at", not "exactly how many".
360
+
361
+
322
362
  ## Interfaces
323
363
 
324
364
  RecallNest serves two interfaces:
325
365
 
326
- - **MCP** — for any MCP client: Claude Code, Codex, Kimi, Antigravity, Gemini CLI (native tool access)
366
+ - **MCP (stdio)** — for any client that can launch a command: CLI agents (Claude Code, Codex, Kimi, Antigravity) and GUI apps that accept an MCP config (Doubao, Cherry Studio, ChatBox)
327
367
  - **HTTP API** — for custom agents, SDK-based apps, and any HTTP client
328
368
 
329
369
  ### Agent framework examples
@@ -339,7 +379,7 @@ Examples live in [`integrations/examples/`](integrations/examples/):
339
379
  ---
340
380
 
341
381
  <details>
342
- <summary><strong>MCP Tools (43 tools)</strong></summary>
382
+ <summary><strong>MCP Tools (44 tools)</strong></summary>
343
383
 
344
384
  | Tool | Description |
345
385
  |------|-------------|
@@ -351,6 +391,7 @@ Examples live in [`integrations/examples/`](integrations/examples/):
351
391
  | `store_case` | Store a reusable problem-solution pair as durable `cases` memory |
352
392
  | `promote_memory` | Explicitly promote evidence into durable memory |
353
393
  | `promote_scan` | Scan recent evidence and auto-promote qualifying memories into durable storage |
394
+ | `promote_synthesis` | Scan dream-synthesized conclusions and promote the ones their own evidence set supports |
354
395
  | `list_conflicts` | List or inspect promotion conflict candidates |
355
396
  | `audit_conflicts` | Summarize stale/escalated conflict priorities |
356
397
  | `escalate_conflicts` | Preview or apply conflict escalation metadata |
@@ -463,6 +504,48 @@ bun run src/cli.ts doctor
463
504
 
464
505
  ---
465
506
 
507
+ ## Web UI
508
+
509
+ <p align="center">
510
+ <img src="assets/dashboard.png" alt="RecallNest Dashboard" width="800" />
511
+ <br><em>Dashboard — total count, category distribution, health score, and growth trends at a glance.</em>
512
+ </p>
513
+
514
+ <p align="center">
515
+ <img src="assets/screenshots/ui-full.png" alt="RecallNest Search Workbench" width="800" />
516
+ <br><em>Search Workbench — hybrid search with topic tag filtering, 4 retrieval profiles, Skills browser, and asset management.</em>
517
+ </p>
518
+
519
+ <p align="center">
520
+ <img src="assets/knowledge-graph.png" alt="RecallNest Knowledge Graph" width="800" />
521
+ <br><em>Knowledge Graph — interactive force-directed visualization with semantic bridges revealing cross-domain connections.</em>
522
+ </p>
523
+
524
+ ```bash
525
+ bun run src/ui-server.ts
526
+ # → http://localhost:4317
527
+ ```
528
+
529
+ ---
530
+
531
+ ## What's new
532
+
533
+ **v3.0** raised the runtime floor to **Node 22** (the only breaking change — Bun users are
534
+ unaffected) and gave synthesized conclusions a road into stable memory: a `dream` insight
535
+ can now be promoted on the strength of its own validated evidence set, instead of being
536
+ permanently stuck on the evidence layer where nothing downstream could lean on it.
537
+
538
+ It also fixed a rate-limit reply that could trigger an unbounded request storm — measured
539
+ at over 61,000 requests in five seconds against an endpoint asking us to slow down. Found
540
+ by the new HTTP contract tests, which drive the real client classes against a loopback
541
+ server instead of stubbing the SDK.
542
+
543
+ Existing LanceDB data opens in place; there is no export or import step.
544
+
545
+ **Full history — v3.0 through v1.0, with the upgrade notes for each — is in
546
+ [CHANGELOG.md](CHANGELOG.md).**
547
+
548
+
466
549
  ## Multilingual Support
467
550
 
468
551
  RecallNest works out of the box with English. For multilingual memory (Chinese, Japanese, Thai, and 20+ more), install [babel-memory](https://github.com/AliceLJY/babel-memory) with the language packs you need:
@@ -492,6 +575,8 @@ RecallNest auto-detects babel-memory at startup — no configuration needed. Wit
492
575
 
493
576
  RecallNest is actively maintained. All major architecture phases are complete — see the full [Roadmap](ROADMAP.md) for current priorities and future plans.
494
577
 
578
+ Maintainers: see [Publishing RecallNest](https://github.com/AliceLJY/recallnest/blob/main/docs/releasing.md) for the npm Trusted Publishing, validation, and recovery process.
579
+
495
580
  ---
496
581
 
497
582
  ## Relationship to memory-lancedb-pro
@@ -499,7 +584,7 @@ RecallNest is actively maintained. All major architecture phases are complete
499
584
  RecallNest started as a fork of [memory-lancedb-pro](https://github.com/CortexReach/memory-lancedb-pro) and shares its core ideas around hybrid retrieval, decay modeling, and memory-as-engineering-system. The key difference:
500
585
 
501
586
  - **memory-lancedb-pro** is an OpenClaw plugin — it adds long-term memory to a single OpenClaw agent.
502
- - **RecallNest** is a standalone memory layer — it serves any MCP client (Claude Code, Codex, Kimi, Antigravity, Gemini CLI) simultaneously through MCP + HTTP API, with session continuity, structured assets, and conflict management built in.
587
+ - **RecallNest** is a standalone memory layer — it serves CLI agents, GUI chat apps and plain HTTP callers simultaneously through MCP + HTTP API, with session continuity, structured assets, and conflict management built in.
503
588
 
504
589
  ## Credit
505
590
 
@@ -520,9 +605,9 @@ Part of the **小试AI** open-source AI workflow:
520
605
  |---------|-------------|
521
606
  | [babel-memory](https://github.com/AliceLJY/babel-memory) | Multilingual preprocessing for BM25 — 27+ languages, zero deps |
522
607
  | cc-empire *(private)* | Hooks/rules/methodology — the connective tissue of the whole ecosystem |
523
- | [telegram-ai-bridge](https://github.com/AliceLJY/telegram-ai-bridge) | Telegram bots for Claude, Codex, and Gemini |
608
+ | [telegram-ai-bridge](https://github.com/AliceLJY/telegram-ai-bridge) | Telegram bots for Claude, Codex, Agy, and Kimi |
524
609
  | [tg-bridge-channel](https://github.com/AliceLJY/tg-bridge-channel) | Sister Telegram bridge using Claude Agent View background sessions |
525
- | [wechat-ai-bridge](https://github.com/AliceLJY/wechat-ai-bridge) | Run Claude Code / Codex / Gemini in WeChat with session management |
610
+ | [wechat-ai-bridge](https://github.com/AliceLJY/wechat-ai-bridge) | Run Claude Code / Codex in WeChat with session management |
526
611
  | [openclaw-tunnel](https://github.com/AliceLJY/openclaw-tunnel) | Docker ↔ host CLI bridge (maintenance mode — LanceDB test only) |
527
612
  | [digital-clone-skill](https://github.com/AliceLJY/digital-clone-skill) | Build digital clones from corpus data |
528
613
  | [claude-code-studio](https://github.com/AliceLJY/claude-code-studio) | Multi-session collaboration platform for Claude Code |