@monoes/monomindcli 2.16.12 → 2.16.13

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 (217) hide show
  1. package/.claude/agents/core/coder.md +1 -1
  2. package/.claude/agents/engineering/engineering-devops-automator.md +1 -1
  3. package/.claude/agents/github/repo-architect.md +1 -1
  4. package/.claude/agents/testing/production-validator.md +1 -1
  5. package/.claude/agents/testing/testing-tool-evaluator.md +1 -1
  6. package/.claude/commands/github/pr-manager.md +1 -1
  7. package/.claude/helpers/pick-rank.cjs +34 -4
  8. package/.claude/skills/monolean-audit/SKILL.md +1 -1
  9. package/dist/src/commands/cleanup-data.d.ts +30 -0
  10. package/dist/src/commands/cleanup-data.d.ts.map +1 -0
  11. package/dist/src/commands/cleanup-data.js +138 -0
  12. package/dist/src/commands/cleanup-data.js.map +1 -0
  13. package/dist/src/commands/cleanup-scratch.d.ts +43 -0
  14. package/dist/src/commands/cleanup-scratch.d.ts.map +1 -0
  15. package/dist/src/commands/cleanup-scratch.js +125 -0
  16. package/dist/src/commands/cleanup-scratch.js.map +1 -0
  17. package/dist/src/commands/cleanup.d.ts +2 -39
  18. package/dist/src/commands/cleanup.d.ts.map +1 -1
  19. package/dist/src/commands/cleanup.js +5 -247
  20. package/dist/src/commands/cleanup.js.map +1 -1
  21. package/dist/src/commands/doctor-gitignore-checks.d.ts +10 -0
  22. package/dist/src/commands/doctor-gitignore-checks.d.ts.map +1 -0
  23. package/dist/src/commands/doctor-gitignore-checks.js +141 -0
  24. package/dist/src/commands/doctor-gitignore-checks.js.map +1 -0
  25. package/dist/src/commands/doctor-helpers-checks.d.ts +10 -0
  26. package/dist/src/commands/doctor-helpers-checks.d.ts.map +1 -0
  27. package/dist/src/commands/doctor-helpers-checks.js +292 -0
  28. package/dist/src/commands/doctor-helpers-checks.js.map +1 -0
  29. package/dist/src/commands/doctor-memory-checks.d.ts +47 -0
  30. package/dist/src/commands/doctor-memory-checks.d.ts.map +1 -0
  31. package/dist/src/commands/doctor-memory-checks.js +298 -0
  32. package/dist/src/commands/doctor-memory-checks.js.map +1 -0
  33. package/dist/src/commands/doctor-monograph-checks.d.ts +9 -0
  34. package/dist/src/commands/doctor-monograph-checks.d.ts.map +1 -0
  35. package/dist/src/commands/doctor-monograph-checks.js +331 -0
  36. package/dist/src/commands/doctor-monograph-checks.js.map +1 -0
  37. package/dist/src/commands/doctor-project-checks.d.ts +7 -66
  38. package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
  39. package/dist/src/commands/doctor-project-checks.js +10 -1331
  40. package/dist/src/commands/doctor-project-checks.js.map +1 -1
  41. package/dist/src/commands/doctor-routing-checks.d.ts +10 -0
  42. package/dist/src/commands/doctor-routing-checks.d.ts.map +1 -0
  43. package/dist/src/commands/doctor-routing-checks.js +194 -0
  44. package/dist/src/commands/doctor-routing-checks.js.map +1 -0
  45. package/dist/src/commands/doctor-worker-checks.d.ts +17 -0
  46. package/dist/src/commands/doctor-worker-checks.d.ts.map +1 -0
  47. package/dist/src/commands/doctor-worker-checks.js +122 -0
  48. package/dist/src/commands/doctor-worker-checks.js.map +1 -0
  49. package/dist/src/commands/hooks-routing-commands.js +1 -1
  50. package/dist/src/commands/hooks-routing-commands.js.map +1 -1
  51. package/dist/src/commands/init.d.ts.map +1 -1
  52. package/dist/src/commands/init.js +6 -15
  53. package/dist/src/commands/init.js.map +1 -1
  54. package/dist/src/index.js +2 -2
  55. package/dist/src/index.js.map +1 -1
  56. package/dist/src/init/never-commit.d.ts +3 -3
  57. package/dist/src/init/types.d.ts +1 -1
  58. package/dist/src/init/types.js +1 -1
  59. package/dist/src/knowledge/document-store.js +1 -1
  60. package/dist/src/knowledge/document-store.js.map +1 -1
  61. package/dist/src/mcp-tools/hooks-edit-command.d.ts +10 -0
  62. package/dist/src/mcp-tools/hooks-edit-command.d.ts.map +1 -0
  63. package/dist/src/mcp-tools/hooks-edit-command.js +247 -0
  64. package/dist/src/mcp-tools/hooks-edit-command.js.map +1 -0
  65. package/dist/src/mcp-tools/hooks-learning.d.ts +9 -0
  66. package/dist/src/mcp-tools/hooks-learning.d.ts.map +1 -0
  67. package/dist/src/mcp-tools/hooks-learning.js +408 -0
  68. package/dist/src/mcp-tools/hooks-learning.js.map +1 -0
  69. package/dist/src/mcp-tools/hooks-metrics-list.d.ts +8 -0
  70. package/dist/src/mcp-tools/hooks-metrics-list.d.ts.map +1 -0
  71. package/dist/src/mcp-tools/hooks-metrics-list.js +205 -0
  72. package/dist/src/mcp-tools/hooks-metrics-list.js.map +1 -0
  73. package/dist/src/mcp-tools/hooks-route.d.ts +12 -0
  74. package/dist/src/mcp-tools/hooks-route.d.ts.map +1 -0
  75. package/dist/src/mcp-tools/hooks-route.js +251 -0
  76. package/dist/src/mcp-tools/hooks-route.js.map +1 -0
  77. package/dist/src/mcp-tools/hooks-routing.d.ts +6 -27
  78. package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
  79. package/dist/src/mcp-tools/hooks-routing.js +6 -1727
  80. package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
  81. package/dist/src/mcp-tools/hooks-session.d.ts +9 -0
  82. package/dist/src/mcp-tools/hooks-session.d.ts.map +1 -0
  83. package/dist/src/mcp-tools/hooks-session.js +243 -0
  84. package/dist/src/mcp-tools/hooks-session.js.map +1 -0
  85. package/dist/src/mcp-tools/hooks-task.d.ts +17 -0
  86. package/dist/src/mcp-tools/hooks-task.d.ts.map +1 -0
  87. package/dist/src/mcp-tools/hooks-task.js +427 -0
  88. package/dist/src/mcp-tools/hooks-task.js.map +1 -0
  89. package/dist/src/mcp-tools/hooks-tools.d.ts +2 -1
  90. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  91. package/dist/src/mcp-tools/hooks-tools.js +2 -1
  92. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  93. package/dist/src/mcp-tools/memory-tools.js +1 -1
  94. package/dist/src/mcp-tools/memory-tools.js.map +1 -1
  95. package/dist/src/memory/bm25-index.d.ts +2 -2
  96. package/dist/src/memory/bm25-index.js +2 -2
  97. package/dist/src/memory/embedding-operations.js +2 -2
  98. package/dist/src/memory/embedding-operations.js.map +1 -1
  99. package/dist/src/memory/entity-name-key.d.ts +1 -1
  100. package/dist/src/memory/entity-name-key.js +1 -1
  101. package/dist/src/memory/hnsw-operations.d.ts +1 -1
  102. package/dist/src/memory/hnsw-operations.js +1 -1
  103. package/dist/src/memory/memory-bridge-backend.d.ts +43 -0
  104. package/dist/src/memory/memory-bridge-backend.d.ts.map +1 -0
  105. package/dist/src/memory/memory-bridge-backend.js +363 -0
  106. package/dist/src/memory/memory-bridge-backend.js.map +1 -0
  107. package/dist/src/memory/memory-bridge-core.d.ts +42 -0
  108. package/dist/src/memory/memory-bridge-core.d.ts.map +1 -0
  109. package/dist/src/memory/memory-bridge-core.js +126 -0
  110. package/dist/src/memory/memory-bridge-core.js.map +1 -0
  111. package/dist/src/memory/memory-bridge-entries.d.ts +131 -0
  112. package/dist/src/memory/memory-bridge-entries.d.ts.map +1 -0
  113. package/dist/src/memory/memory-bridge-entries.js +227 -0
  114. package/dist/src/memory/memory-bridge-entries.js.map +1 -0
  115. package/dist/src/memory/memory-bridge-feedback.d.ts +60 -0
  116. package/dist/src/memory/memory-bridge-feedback.d.ts.map +1 -0
  117. package/dist/src/memory/memory-bridge-feedback.js +118 -0
  118. package/dist/src/memory/memory-bridge-feedback.js.map +1 -0
  119. package/dist/src/memory/memory-bridge-paths.d.ts +123 -0
  120. package/dist/src/memory/memory-bridge-paths.d.ts.map +1 -0
  121. package/dist/src/memory/memory-bridge-paths.js +335 -0
  122. package/dist/src/memory/memory-bridge-paths.js.map +1 -0
  123. package/dist/src/memory/memory-bridge-search.d.ts +48 -0
  124. package/dist/src/memory/memory-bridge-search.d.ts.map +1 -0
  125. package/dist/src/memory/memory-bridge-search.js +383 -0
  126. package/dist/src/memory/memory-bridge-search.js.map +1 -0
  127. package/dist/src/memory/memory-bridge-sessions.d.ts +38 -0
  128. package/dist/src/memory/memory-bridge-sessions.d.ts.map +1 -0
  129. package/dist/src/memory/memory-bridge-sessions.js +109 -0
  130. package/dist/src/memory/memory-bridge-sessions.js.map +1 -0
  131. package/dist/src/memory/memory-bridge-store.d.ts +58 -0
  132. package/dist/src/memory/memory-bridge-store.d.ts.map +1 -0
  133. package/dist/src/memory/memory-bridge-store.js +201 -0
  134. package/dist/src/memory/memory-bridge-store.js.map +1 -0
  135. package/dist/src/memory/memory-bridge.d.ts +10 -438
  136. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  137. package/dist/src/memory/memory-bridge.js +14 -1787
  138. package/dist/src/memory/memory-bridge.js.map +1 -1
  139. package/dist/src/memory/memory-kg-claims.d.ts +52 -0
  140. package/dist/src/memory/memory-kg-claims.d.ts.map +1 -0
  141. package/dist/src/memory/memory-kg-claims.js +99 -0
  142. package/dist/src/memory/memory-kg-claims.js.map +1 -0
  143. package/dist/src/memory/memory-kg-index.d.ts +86 -0
  144. package/dist/src/memory/memory-kg-index.d.ts.map +1 -0
  145. package/dist/src/memory/memory-kg-index.js +256 -0
  146. package/dist/src/memory/memory-kg-index.js.map +1 -0
  147. package/dist/src/memory/memory-kg-ingest.d.ts +44 -0
  148. package/dist/src/memory/memory-kg-ingest.d.ts.map +1 -0
  149. package/dist/src/memory/memory-kg-ingest.js +361 -0
  150. package/dist/src/memory/memory-kg-ingest.js.map +1 -0
  151. package/dist/src/memory/memory-kg-model.d.ts +168 -0
  152. package/dist/src/memory/memory-kg-model.d.ts.map +1 -0
  153. package/dist/src/memory/memory-kg-model.js +158 -0
  154. package/dist/src/memory/memory-kg-model.js.map +1 -0
  155. package/dist/src/memory/memory-kg-names.d.ts +64 -0
  156. package/dist/src/memory/memory-kg-names.d.ts.map +1 -0
  157. package/dist/src/memory/memory-kg-names.js +187 -0
  158. package/dist/src/memory/memory-kg-names.js.map +1 -0
  159. package/dist/src/memory/memory-kg-promote.d.ts +79 -0
  160. package/dist/src/memory/memory-kg-promote.d.ts.map +1 -0
  161. package/dist/src/memory/memory-kg-promote.js +248 -0
  162. package/dist/src/memory/memory-kg-promote.js.map +1 -0
  163. package/dist/src/memory/memory-kg-rebuild.d.ts +77 -0
  164. package/dist/src/memory/memory-kg-rebuild.d.ts.map +1 -0
  165. package/dist/src/memory/memory-kg-rebuild.js +299 -0
  166. package/dist/src/memory/memory-kg-rebuild.js.map +1 -0
  167. package/dist/src/memory/memory-kg-rollback.d.ts +47 -0
  168. package/dist/src/memory/memory-kg-rollback.d.ts.map +1 -0
  169. package/dist/src/memory/memory-kg-rollback.js +193 -0
  170. package/dist/src/memory/memory-kg-rollback.js.map +1 -0
  171. package/dist/src/memory/memory-kg-rules.d.ts +64 -0
  172. package/dist/src/memory/memory-kg-rules.d.ts.map +1 -0
  173. package/dist/src/memory/memory-kg-rules.js +251 -0
  174. package/dist/src/memory/memory-kg-rules.js.map +1 -0
  175. package/dist/src/memory/memory-kg-scan.d.ts +118 -0
  176. package/dist/src/memory/memory-kg-scan.d.ts.map +1 -0
  177. package/dist/src/memory/memory-kg-scan.js +209 -0
  178. package/dist/src/memory/memory-kg-scan.js.map +1 -0
  179. package/dist/src/memory/memory-kg-search.d.ts +80 -0
  180. package/dist/src/memory/memory-kg-search.d.ts.map +1 -0
  181. package/dist/src/memory/memory-kg-search.js +239 -0
  182. package/dist/src/memory/memory-kg-search.js.map +1 -0
  183. package/dist/src/memory/memory-kg.d.ts +19 -547
  184. package/dist/src/memory/memory-kg.d.ts.map +1 -1
  185. package/dist/src/memory/memory-kg.js +10 -2389
  186. package/dist/src/memory/memory-kg.js.map +1 -1
  187. package/dist/src/ui/org-hil.mjs +1 -1
  188. package/dist/src/ui/routes-org-agents.mjs +318 -0
  189. package/dist/src/ui/routes-org-approvals.mjs +133 -0
  190. package/dist/src/ui/routes-org-config.mjs +459 -0
  191. package/dist/src/ui/routes-org-control.mjs +300 -0
  192. package/dist/src/ui/routes-org-files.mjs +172 -0
  193. package/dist/src/ui/routes-org-helpers.mjs +84 -0
  194. package/dist/src/ui/routes-org-knowledge.mjs +262 -0
  195. package/dist/src/ui/routes-org-lifecycle.mjs +224 -0
  196. package/dist/src/ui/routes-org-live.mjs +278 -0
  197. package/dist/src/ui/routes-org-mastermind.mjs +346 -0
  198. package/dist/src/ui/routes-org-planning.mjs +398 -0
  199. package/dist/src/ui/routes-org-runs.mjs +430 -0
  200. package/dist/src/ui/routes-org-status.mjs +342 -0
  201. package/dist/src/ui/routes-org-workflows.mjs +212 -0
  202. package/dist/src/ui/routes-org.mjs +26 -3847
  203. package/dist/src/ui/server.mjs +1 -1
  204. package/dist/src/utils/native-error.d.ts +1 -1
  205. package/dist/src/utils/native-error.js +1 -1
  206. package/dist/src/utils/paths.d.ts +2 -1
  207. package/dist/src/utils/paths.d.ts.map +1 -1
  208. package/dist/src/utils/paths.js +2 -1
  209. package/dist/src/utils/paths.js.map +1 -1
  210. package/dist/tsconfig.tsbuildinfo +1 -1
  211. package/org-skills/adversarial-reviewer/SKILL.md +1 -1
  212. package/org-skills/board-deck-builder/SKILL.md +1 -1
  213. package/org-skills/code-reviewer/SKILL.md +1 -1
  214. package/org-skills/debugging-wizard/SKILL.md +1 -1
  215. package/org-skills/scientific-thinking-literature-review/SKILL.md +1 -1
  216. package/org-skills/scientific-thinking-scholar-evaluation/SKILL.md +1 -1
  217. package/package.json +8 -8
@@ -0,0 +1,363 @@
1
+ /**
2
+ * Memory Bridge — the lazy per-path backend cache, the process-wide local
3
+ * models (embedder + cross-encoder reranker) and their kill switch, and
4
+ * bridge lifecycle. Owns all of that module-level state; other bridge
5
+ * modules only read it. Split out of memory-bridge.ts, which re-exports the
6
+ * public symbols.
7
+ */
8
+ import * as fs from 'node:fs';
9
+ import * as os from 'node:os';
10
+ import * as path from 'node:path';
11
+ import { BRIDGE_EMBEDDING_MODEL, logBridgeError } from './memory-bridge-core.js';
12
+ import { getDbPath, getGlobalBrainDir, getProjectRoot, projectDataDir, } from './memory-bridge-paths.js';
13
+ import { ettinHeadLogit, loadEttinHead, resolveRerankerSource } from './reranker-head.js';
14
+ const backendSlots = new Map();
15
+ const MAX_BACKEND_SLOTS = 5;
16
+ export let _embedder = null;
17
+ let _embedderPromise = null;
18
+ const MAX_INIT_ATTEMPTS = 3;
19
+ // Process-local kill switch for both local ONNX models (embedder + reranker):
20
+ // the in-process equivalent of MONOMIND_NO_LOCAL_EMBEDDINGS=1 plus
21
+ // MONOMIND_RERANKER=0. Org runs flip this instead of setting those env vars,
22
+ // because process.env is inherited by every child — each role's CLI and every
23
+ // command a role runs through Bash — which silently degraded a role's own
24
+ // `monomind memory search` to keyword-only (#249).
25
+ let _localModelsDisabled = false;
26
+ /** Disable local model loads for THIS process only (see `org run`/`org serve`). */
27
+ export function disableLocalModels() {
28
+ _localModelsDisabled = true;
29
+ }
30
+ export function localEmbeddingsDisabled() {
31
+ return _localModelsDisabled || process.env.MONOMIND_NO_LOCAL_EMBEDDINGS === '1';
32
+ }
33
+ export function rerankerDisabled() {
34
+ return _localModelsDisabled || process.env.MONOMIND_RERANKER === '0';
35
+ }
36
+ // ===== Lazy cross-encoder reranker (ettin-32m) =====
37
+ //
38
+ // Same ORT constraints as the embedder (ADR-R001). Loaded only when the first
39
+ // search with >1 candidate completes — never on store, never on startup.
40
+ // Disabled with MONOMIND_RERANKER=0.
41
+ //
42
+ // The upstream HF ONNX file for ettin-reranker-32m-v1 only contains the base
43
+ // ModernBERT encoder (outputs last_hidden_state, no logits). The classifier
44
+ // head lives in separate sentence-transformers module safetensors files
45
+ // (2_Dense, 3_LayerNorm, 4_Dense). Two ways to score, in order of preference:
46
+ // - a self-exported ONNX with the head baked in (scripts/export-ettin-onnx.py,
47
+ // needs PyTorch) under ~/.monomind/models/ettin-reranker-32m-v1-onnx/
48
+ // - the upstream encoder plus the head applied in JS (reranker-head.ts), from
49
+ // head files fetched by `doc eval --provision-model` into
50
+ // ~/.monomind/models/ettin-reranker-32m-v1-head/
51
+ // With neither, the reranker does not load: the upstream encoder alone cannot
52
+ // score, and loading it anyway ran the model on every search for nothing.
53
+ export const BRIDGE_RERANKER_MODEL = 'cross-encoder/ettin-reranker-32m-v1';
54
+ /** Where reranker export / head files live. */
55
+ export function rerankerModelsDir() {
56
+ return path.join(os.homedir(), '.monomind', 'models');
57
+ }
58
+ /** How the reranker is scoring, or null when it is not loaded. */
59
+ let _rerankerKind = null;
60
+ export function rerankerKind() {
61
+ return _rerankerKind;
62
+ }
63
+ export let _reranker = null;
64
+ export let _rerankerPromise = null;
65
+ /** Pre-load the cross-encoder reranker model. Idempotent, no-op when
66
+ * MONOMIND_RERANKER=0. Exported so the eval harness can force-load before
67
+ * the network guard blocks model downloads. */
68
+ export async function loadReranker() {
69
+ if (_reranker)
70
+ return;
71
+ if (rerankerDisabled())
72
+ return;
73
+ if (!_rerankerPromise) {
74
+ _rerankerPromise = (async () => {
75
+ try {
76
+ const source = resolveRerankerSource(rerankerModelsDir());
77
+ if (!source)
78
+ return; // nothing that can score — stay unloaded (no per-search cost)
79
+ const hf = await import('@huggingface/transformers');
80
+ const opts = { local_files_only: true };
81
+ const sigmoid = (logit) => 1 / (1 + Math.exp(-logit));
82
+ if (source.kind === 'export') {
83
+ const tokenizer = await hf.AutoTokenizer.from_pretrained(source.dir, opts);
84
+ const model = await hf.AutoModelForSequenceClassification.from_pretrained(source.dir, opts);
85
+ _reranker = async (query, passage) => {
86
+ const inputs = await tokenizer(query, {
87
+ text_pair: passage,
88
+ padding: true,
89
+ truncation: true,
90
+ });
91
+ const output = await model(inputs);
92
+ // num_labels=1 → [1,1] regression score, apply sigmoid
93
+ return sigmoid(output.logits.data[0]);
94
+ };
95
+ }
96
+ else {
97
+ const head = loadEttinHead(source.dir);
98
+ const tokenizer = await hf.AutoTokenizer.from_pretrained(BRIDGE_RERANKER_MODEL, opts);
99
+ const model = await hf.AutoModel.from_pretrained(BRIDGE_RERANKER_MODEL, {
100
+ ...opts,
101
+ dtype: 'fp32',
102
+ });
103
+ _reranker = async (query, passage) => {
104
+ const inputs = await tokenizer(query, {
105
+ text_pair: passage,
106
+ padding: true,
107
+ truncation: true,
108
+ });
109
+ const output = await model(inputs);
110
+ return sigmoid(ettinHeadLogit(head, output.last_hidden_state.data));
111
+ };
112
+ }
113
+ _rerankerKind = source.kind;
114
+ }
115
+ catch (e) {
116
+ _rerankerPromise = null; // allow retry
117
+ if (process.env.DEBUG || process.env.MONOMIND_DEBUG)
118
+ console.error('[memory-bridge] reranker failed to load:', e);
119
+ }
120
+ })();
121
+ }
122
+ await _rerankerPromise;
123
+ }
124
+ /** Rerank an array of results using the cross-encoder. Mutates nothing; returns
125
+ * a new sorted array with reranker scores in provenance. */
126
+ export async function rerankResults(query, results, limit) {
127
+ const reranker = _reranker;
128
+ if (!reranker || results.length <= 1)
129
+ return { reranked: results, applied: false };
130
+ try {
131
+ const scored = await Promise.all(results.map(async (r) => {
132
+ const rerankerScore = await reranker(query, r.content || '');
133
+ return {
134
+ ...r,
135
+ score: rerankerScore,
136
+ provenance: `${r.provenance ?? ''}→rerank:${rerankerScore.toFixed(3)}`,
137
+ };
138
+ }));
139
+ scored.sort((a, b) => b.score - a.score);
140
+ return { reranked: scored.slice(0, limit), applied: true };
141
+ }
142
+ catch (e) {
143
+ if (process.env.DEBUG || process.env.MONOMIND_DEBUG)
144
+ console.error('[memory-bridge] reranking failed — returning original order:', e);
145
+ return { reranked: results, applied: false };
146
+ }
147
+ }
148
+ /** Flush after mutations: the sql.js fallback backend is in-memory WASM and
149
+ * only reaches disk via persist(); the CLI process is short-lived, so waiting
150
+ * for an auto-persist interval would lose writes. No-op on better-sqlite3. */
151
+ export async function flushBackend(backend) {
152
+ try {
153
+ await backend?.persist?.();
154
+ }
155
+ catch (e) {
156
+ logBridgeError('flushBackend', e); /* best effort */
157
+ }
158
+ }
159
+ /** Loads the local embedding model.
160
+ *
161
+ * This is the single point where `onnxruntime-node` enters the CLI process
162
+ * (via @huggingface/transformers). Once it has run, the process is subject to
163
+ * docs/adrs/ADR-R001-onnxruntime-process-teardown.md: calling process.exit()
164
+ * will abort with SIGABRT ("mutex lock failed") instead of exiting cleanly,
165
+ * and disposing the pipeline first does not help.
166
+ *
167
+ * Anything that reaches this — `doctor`, `memory store`, `memory search`, the
168
+ * MCP memory tools — inherits that constraint, which is why it bit commands
169
+ * that look nothing like ML work. Adding a new caller is fine; adding a new
170
+ * process-exit path is not. */
171
+ async function loadEmbedder() {
172
+ if (_embedder)
173
+ return;
174
+ // MONOMIND_NO_LOCAL_EMBEDDINGS: skip the native pipeline() load entirely.
175
+ // On some machines @huggingface/transformers' ONNX runtime crashes the
176
+ // whole process with a native `libc++abi terminate` (a mutex failure
177
+ // inside the tokenizer backend) rather than throwing a catchable JS
178
+ // error — the try/catch below only protects against normal failures
179
+ // (missing cache, bad revision, offline), not that. Everything that
180
+ // reads _embedder already tolerates it being unset (keyword-only
181
+ // fallback), so skipping the call is the only way to actually avoid the
182
+ // crash rather than just failing to catch it. Org runs disable it
183
+ // in-process (disableLocalModels()) since a crashed org is much worse than
184
+ // degraded search; anyone else can opt in with the env var.
185
+ if (localEmbeddingsDisabled())
186
+ return;
187
+ if (!_embedderPromise) {
188
+ _embedderPromise = (async () => {
189
+ try {
190
+ const hf = await import('@huggingface/transformers');
191
+ // revision must be a git ref — 'main' is the HF default; 'default' 404s and
192
+ // silently killed embeddings (every search degraded to keyword matching)
193
+ // dtype pinned explicitly: transformers.js logs a "dtype not specified"
194
+ // warning to the console on every load otherwise (leaks into CLI output).
195
+ const extractor = await hf.pipeline('feature-extraction', BRIDGE_EMBEDDING_MODEL, {
196
+ revision: 'main',
197
+ dtype: 'q8',
198
+ local_files_only: true,
199
+ });
200
+ _embedder = async (text) => {
201
+ const output = await extractor(text, { pooling: 'cls', normalize: true });
202
+ return new Float32Array(output.data);
203
+ };
204
+ }
205
+ catch (e) {
206
+ _embedderPromise = null; // allow retry (e.g. first call offline)
207
+ if (process.env.DEBUG || process.env.MONOMIND_DEBUG)
208
+ console.error('[memory-bridge] embedding model failed to load — store and search without vectors:', e);
209
+ }
210
+ })();
211
+ }
212
+ await _embedderPromise;
213
+ }
214
+ /** Fetches the local embedding model into the transformers cache so later
215
+ * loadEmbedder() calls (local_files_only) find it. Same model, revision and
216
+ * dtype as loadEmbedder() — only the network is allowed here, which is why it
217
+ * is reserved for explicit opt-in steps (`init --with-embeddings`). Throws
218
+ * when the model cannot be fetched (offline, disabled, package missing);
219
+ * callers degrade. Loads onnxruntime, so ADR-R001 applies to the caller. */
220
+ export async function downloadEmbeddingModel() {
221
+ if (localEmbeddingsDisabled())
222
+ throw new Error('local embeddings are disabled (MONOMIND_NO_LOCAL_EMBEDDINGS=1)');
223
+ const hf = await import('@huggingface/transformers');
224
+ await hf.pipeline('feature-extraction', BRIDGE_EMBEDDING_MODEL, {
225
+ revision: 'main',
226
+ dtype: 'q8',
227
+ });
228
+ }
229
+ export async function getBackend(dbPath) {
230
+ const dir = getDbPath(dbPath);
231
+ let slot = backendSlots.get(dir);
232
+ if (!slot) {
233
+ if (backendSlots.size >= MAX_BACKEND_SLOTS) {
234
+ const oldest = backendSlots.keys().next().value;
235
+ const evicted = backendSlots.get(oldest);
236
+ // shutdownBridge() below uses .shutdown() — that's the real method these
237
+ // backends expose. .close() doesn't exist on either backend class, so this
238
+ // resolved to undefined via the optional chain every time and never actually
239
+ // released the connection: every 6th distinct database path opened in this
240
+ // process leaked the oldest slot's connection for the process lifetime.
241
+ try {
242
+ await evicted?.instance?.shutdown?.();
243
+ }
244
+ catch (e) {
245
+ logBridgeError('getBackend.evictedShutdown', e); /* best effort */
246
+ }
247
+ backendSlots.delete(oldest);
248
+ }
249
+ slot = { promise: null, instance: null, available: null, attempts: 0 };
250
+ backendSlots.set(dir, slot);
251
+ }
252
+ if (slot.available === false)
253
+ return null;
254
+ if (slot.attempts >= MAX_INIT_ATTEMPTS) {
255
+ slot.available = false;
256
+ return null;
257
+ }
258
+ if (slot.instance)
259
+ return slot.instance;
260
+ if (!slot.promise) {
261
+ slot.promise = (async () => {
262
+ try {
263
+ const mod = await import('@monoes/memory');
264
+ await loadEmbedder();
265
+ // Local SQLite engine (LanceDB replaced 2026-07): better-sqlite3 when its
266
+ // native binding loads, sql.js (pure WASM) otherwise — both persist text
267
+ // AND embeddings, so vectors are always recomputable/derivable data.
268
+ fs.mkdirSync(dir, { recursive: true });
269
+ // Origin marker: records which project this data dir belongs to, so
270
+ // `monomind cleanup --data` can verifiably prune dirs whose project
271
+ // no longer exists (the dir-name hash is one-way). Best-effort; never
272
+ // written for the global brain (it has no single origin project).
273
+ if (dir !== getGlobalBrainDir()) {
274
+ try {
275
+ // MUST be the same path projectDataDir() hashed into the slug. If
276
+ // this recorded the raw cwd, running any memory command from a
277
+ // package subdirectory would stamp that subdirectory into the
278
+ // project-root-keyed dir — and deleting the subdirectory later
279
+ // would make `cleanup --data` prune the WHOLE project's brain as
280
+ // orphaned.
281
+ const originFile = path.join(projectDataDir(), 'origin.json');
282
+ fs.writeFileSync(originFile, JSON.stringify({ path: getProjectRoot(), updatedAt: new Date().toISOString() }) +
283
+ '\n', 'utf-8');
284
+ }
285
+ catch (e) {
286
+ logBridgeError('getBackend.originWrite', e); /* non-fatal */
287
+ }
288
+ }
289
+ const cfg = {
290
+ databasePath: path.join(dir, 'memory.db'),
291
+ walMode: true,
292
+ optimize: true,
293
+ defaultNamespace: 'default',
294
+ embeddingGenerator: _embedder ?? undefined,
295
+ // R3: when the MCP server and a CLI hook subprocess hit the same
296
+ // memory.db at the same time, SQLite returns SQLITE_BUSY and the
297
+ // bridge silently no-ops. busy_timeout tells SQLite to wait up to
298
+ // 5s for a lock before giving up, which covers the normal handoff
299
+ // window. The native @monoes/memory backend reads this key.
300
+ busyTimeoutMs: 5000,
301
+ };
302
+ const origLog = console.log;
303
+ console.log = (...args) => {
304
+ const msg = String(args[0] ?? '');
305
+ if (msg.includes('Transformers.js') || msg.includes('Loading model'))
306
+ return;
307
+ origLog.apply(console, args);
308
+ };
309
+ let backend;
310
+ try {
311
+ try {
312
+ backend = new mod.SQLiteBackend(cfg);
313
+ await backend.initialize();
314
+ }
315
+ catch (e) {
316
+ if (process.env.DEBUG || process.env.MONOMIND_DEBUG)
317
+ console.error('[memory-bridge] better-sqlite3 unavailable — using sql.js backend:', e);
318
+ backend = new mod.SqlJsBackend(cfg);
319
+ await backend.initialize();
320
+ }
321
+ }
322
+ finally {
323
+ console.log = origLog;
324
+ }
325
+ slot.instance = backend;
326
+ slot.available = true;
327
+ return backend;
328
+ }
329
+ catch (e) {
330
+ slot.attempts++;
331
+ slot.promise = null;
332
+ if (slot.attempts >= MAX_INIT_ATTEMPTS)
333
+ slot.available = false;
334
+ logBridgeError('getBackend', e);
335
+ return null;
336
+ }
337
+ })();
338
+ }
339
+ return slot.promise;
340
+ }
341
+ // ===== Availability / lifecycle =====
342
+ export async function isBridgeAvailable(dbPath) {
343
+ const backend = await getBackend(dbPath);
344
+ return !!backend;
345
+ }
346
+ export async function shutdownBridge() {
347
+ for (const slot of backendSlots.values()) {
348
+ if (slot.instance) {
349
+ try {
350
+ await slot.instance.shutdown();
351
+ }
352
+ catch (e) {
353
+ logBridgeError('bridgeShutdown.slotShutdown', e); /* ignore */
354
+ }
355
+ }
356
+ }
357
+ backendSlots.clear();
358
+ _embedder = null;
359
+ _embedderPromise = null;
360
+ _reranker = null;
361
+ _rerankerPromise = null;
362
+ }
363
+ //# sourceMappingURL=memory-bridge-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-bridge-backend.js","sourceRoot":"","sources":["../../../src/memory/memory-bridge-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Memory Bridge — shared helpers: error logging, embedding validation,
3
+ * limits, automem config and usage/feedback weights. Split out of
4
+ * memory-bridge.ts, which re-exports the public symbols.
5
+ */
6
+ /**
7
+ * R1: surface swallowed errors when DEBUG/MONOMIND_DEBUG is on. The bridge
8
+ * has ~12 `} catch { return null; }` sites that collapse SQLITE_BUSY,
9
+ * EACCES, disk-full, and schema mismatches into "no matches" with zero
10
+ * diagnostic. Behavior contract (return null on failure) is unchanged;
11
+ * observability is added. Caller passes the bridge fn name + the thrown
12
+ * value so the log is greppable per call site.
13
+ */
14
+ export declare function logBridgeError(label: string, err: unknown): void;
15
+ export declare function safeParseEmbedding(raw: string | null | undefined): number[] | null;
16
+ export declare const BRIDGE_EMBEDDING_MODEL = "Alibaba-NLP/gte-modernbert-base";
17
+ export declare const BRIDGE_EMBEDDING_DIMS = 768;
18
+ export declare const BRIDGE_MAX_KEY_LEN: number;
19
+ export declare const BRIDGE_MAX_VALUE_LEN: number;
20
+ export declare const MAX_TAGS = 32;
21
+ export declare const MAX_TAG_LEN = 64;
22
+ export declare function capResultContent(content: string): string;
23
+ export declare function getAutomemConfig(): {
24
+ dedupThreshold: number;
25
+ staleDays: number;
26
+ feedbackInfluence: number;
27
+ };
28
+ export declare const FEEDBACK_EWMA_ALPHA = 0.1;
29
+ export declare function entryWeights(metadata: unknown): {
30
+ feedback: number;
31
+ frequency: number;
32
+ };
33
+ /** Blend learned usefulness into a GENUINE embedding-similarity score.
34
+ * Cognee guard: never applied to keyword-fallback scores — those carry no
35
+ * real relevance signal, and blending there lets a high-feedback stale entry
36
+ * outrank relevant matches and self-reinforce (rich-get-richer). */
37
+ export declare function blendScore(cosineSim: number, weights: {
38
+ feedback: number;
39
+ frequency: number;
40
+ }, influence: number): number;
41
+ export declare function generateId(prefix: string): string;
42
+ //# sourceMappingURL=memory-bridge-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-bridge-core.d.ts","sourceRoot":"","sources":["../../../src/memory/memory-bridge-core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,CAIhE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,IAAI,CAiBlF;AAID,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AACxE,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,kBAAkB,QAAW,CAAC;AAC3C,eAAO,MAAM,oBAAoB,QAAY,CAAC;AAC9C,eAAO,MAAM,QAAQ,KAAK,CAAC;AAC3B,eAAO,MAAM,WAAW,KAAK,CAAC;AAK9B,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,wBAAgB,gBAAgB,IAAI;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CA0BA;AAWD,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAIvC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAWvF;AAED;;;qEAGqE;AACrE,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAChD,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Memory Bridge — shared helpers: error logging, embedding validation,
3
+ * limits, automem config and usage/feedback weights. Split out of
4
+ * memory-bridge.ts, which re-exports the public symbols.
5
+ */
6
+ import * as crypto from 'node:crypto';
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ // ===== Embedding validation =====
10
+ const MAX_EMBEDDING_DIMS = 8192;
11
+ const MAX_EMBEDDING_JSON_BYTES = MAX_EMBEDDING_DIMS * 32; // ~256KB ceiling
12
+ /**
13
+ * R1: surface swallowed errors when DEBUG/MONOMIND_DEBUG is on. The bridge
14
+ * has ~12 `} catch { return null; }` sites that collapse SQLITE_BUSY,
15
+ * EACCES, disk-full, and schema mismatches into "no matches" with zero
16
+ * diagnostic. Behavior contract (return null on failure) is unchanged;
17
+ * observability is added. Caller passes the bridge fn name + the thrown
18
+ * value so the log is greppable per call site.
19
+ */
20
+ export function logBridgeError(label, err) {
21
+ if (!(process.env.DEBUG || process.env.MONOMIND_DEBUG))
22
+ return;
23
+ const msg = err instanceof Error ? `${err.name}: ${err.message}` : String(err);
24
+ console.error(`[bridge:${label}] ${msg}`);
25
+ }
26
+ export function safeParseEmbedding(raw) {
27
+ if (typeof raw !== 'string' || raw.length === 0)
28
+ return null;
29
+ if (raw.length > MAX_EMBEDDING_JSON_BYTES)
30
+ return null;
31
+ let parsed;
32
+ try {
33
+ parsed = JSON.parse(raw);
34
+ }
35
+ catch (e) {
36
+ logBridgeError('safeParseEmbedding', e);
37
+ return null;
38
+ }
39
+ if (!Array.isArray(parsed))
40
+ return null;
41
+ if (parsed.length === 0 || parsed.length > MAX_EMBEDDING_DIMS)
42
+ return null;
43
+ for (let i = 0; i < parsed.length; i++) {
44
+ const v = parsed[i];
45
+ if (typeof v !== 'number' || !Number.isFinite(v))
46
+ return null;
47
+ }
48
+ return parsed;
49
+ }
50
+ // ===== Constants =====
51
+ export const BRIDGE_EMBEDDING_MODEL = 'Alibaba-NLP/gte-modernbert-base';
52
+ export const BRIDGE_EMBEDDING_DIMS = 768;
53
+ export const BRIDGE_MAX_KEY_LEN = 4 * 1024;
54
+ export const BRIDGE_MAX_VALUE_LEN = 16 * 1024;
55
+ export const MAX_TAGS = 32;
56
+ export const MAX_TAG_LEN = 64;
57
+ // Search results serve the head of the stored content only — full values bloat
58
+ // every MCP payload. Entries needing the full text can read the entry by key.
59
+ const BRIDGE_RESULT_CONTENT_CAP = 500;
60
+ export function capResultContent(content) {
61
+ return content.length > BRIDGE_RESULT_CONTENT_CAP
62
+ ? `${content.slice(0, BRIDGE_RESULT_CONTENT_CAP)}…`
63
+ : content;
64
+ }
65
+ export function getAutomemConfig() {
66
+ const defaults = { dedupThreshold: 0.85, staleDays: 7, feedbackInfluence: 0.2 };
67
+ try {
68
+ const configPath = path.join(process.cwd(), '.monomind', 'automem-config.json');
69
+ if (!fs.existsSync(configPath))
70
+ return defaults;
71
+ const stat = fs.statSync(configPath);
72
+ if (stat.size > 64 * 1024)
73
+ return defaults;
74
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
75
+ return {
76
+ dedupThreshold: typeof config?.scaffold?.dedupThreshold === 'number'
77
+ ? config.scaffold.dedupThreshold
78
+ : defaults.dedupThreshold,
79
+ staleDays: typeof config?.scaffold?.staleDays === 'number'
80
+ ? config.scaffold.staleDays
81
+ : defaults.staleDays,
82
+ feedbackInfluence: typeof config?.scaffold?.feedbackInfluence === 'number'
83
+ ? Math.max(0, Math.min(1, config.scaffold.feedbackInfluence))
84
+ : defaults.feedbackInfluence,
85
+ };
86
+ }
87
+ catch (e) {
88
+ logBridgeError('loadBridgeConfig', e);
89
+ return defaults;
90
+ }
91
+ }
92
+ // ===== Usage/feedback weights (cognee-style, stored in entry metadata) =====
93
+ //
94
+ // feedback_weight (0..1, default 0.5): EWMA of explicit/auto ratings applied to
95
+ // the entries actually used to produce an answer. frequency_weight (>=0): how
96
+ // often the entry was returned by a search. Both live in the entry's metadata
97
+ // JSON — deliberately NOT backend schema columns, so no @monoes/memory publish
98
+ // is needed and both backends work unchanged.
99
+ const DEFAULT_FEEDBACK_WEIGHT = 0.5;
100
+ export const FEEDBACK_EWMA_ALPHA = 0.1;
101
+ /** frequency_weight normalization ceiling: 10+ uses counts as fully reinforced. */
102
+ const FREQUENCY_NORM_CAP = 10;
103
+ export function entryWeights(metadata) {
104
+ const md = (metadata ?? {});
105
+ const fw = typeof md.feedback_weight === 'number' && Number.isFinite(md.feedback_weight)
106
+ ? Math.max(0, Math.min(1, md.feedback_weight))
107
+ : DEFAULT_FEEDBACK_WEIGHT;
108
+ const freq = typeof md.frequency_weight === 'number' && Number.isFinite(md.frequency_weight)
109
+ ? Math.max(0, md.frequency_weight)
110
+ : 0;
111
+ return { feedback: fw, frequency: freq };
112
+ }
113
+ /** Blend learned usefulness into a GENUINE embedding-similarity score.
114
+ * Cognee guard: never applied to keyword-fallback scores — those carry no
115
+ * real relevance signal, and blending there lets a high-feedback stale entry
116
+ * outrank relevant matches and self-reinforce (rich-get-richer). */
117
+ export function blendScore(cosineSim, weights, influence) {
118
+ if (influence <= 0)
119
+ return cosineSim;
120
+ const usefulness = 0.7 * weights.feedback + 0.3 * Math.min(1, weights.frequency / FREQUENCY_NORM_CAP);
121
+ return (1 - influence) * cosineSim + influence * usefulness;
122
+ }
123
+ export function generateId(prefix) {
124
+ return `${prefix}_${Date.now()}_${crypto.randomBytes(8).toString('hex')}`;
125
+ }
126
+ //# sourceMappingURL=memory-bridge-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-bridge-core.js","sourceRoot":"","sources":["../../../src/memory/memory-bridge-core.ts"],"names":[],"mappings":"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"}