@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,131 @@
1
+ /**
2
+ * Memory Bridge — entry reads and deletes (list, count, get, delete),
3
+ * embedding generation, backend stats, and HNSW status/build. Split out of
4
+ * memory-bridge.ts, which re-exports the public symbols.
5
+ */
6
+ export declare function bridgeListEntries(options: {
7
+ namespace?: string;
8
+ limit?: number;
9
+ offset?: number;
10
+ dbPath?: string;
11
+ }): Promise<{
12
+ success: boolean;
13
+ entries: {
14
+ id: string;
15
+ key: string;
16
+ namespace: string;
17
+ content: string;
18
+ accessCount: number;
19
+ createdAt: string;
20
+ updatedAt: string;
21
+ hasEmbedding: boolean;
22
+ tags: string[];
23
+ metadata: Record<string, unknown>;
24
+ }[];
25
+ total: number;
26
+ error?: string;
27
+ } | null>;
28
+ /** A real database count for one namespace — `SELECT COUNT(*) WHERE
29
+ * namespace = ?` against the existing `idx_namespace` index — as opposed to
30
+ * `bridgeListEntries.total`, which is only the returned page's length (K7:
31
+ * "bridgeListEntries.total is the returned page length, not a database
32
+ * count"). Every row in a KG namespace (`kg:nodes`, `kg:edges`, `rules`) is
33
+ * exactly one node/edge/rule — the name/adjacency index namespaces are
34
+ * separate — so this count needs no per-row filtering to be exact, and costs
35
+ * one indexed query instead of paging the whole namespace.
36
+ *
37
+ * @returns null when the backend is unavailable, or when the loaded backend
38
+ * predates `count()` — callers fall back to the paginated scan they already
39
+ * had rather than fail. */
40
+ export declare function bridgeCountEntries(namespace: string, dbPath?: string): Promise<number | null>;
41
+ export declare function bridgeGetEntry(options: {
42
+ key: string;
43
+ namespace?: string;
44
+ dbPath?: string;
45
+ agentId?: string;
46
+ }): Promise<{
47
+ success: boolean;
48
+ found: boolean;
49
+ entry?: {
50
+ id: string;
51
+ key: string;
52
+ namespace: string;
53
+ content: string;
54
+ accessCount: number;
55
+ createdAt: string;
56
+ updatedAt: string;
57
+ hasEmbedding: boolean;
58
+ tags: string[];
59
+ metadata: Record<string, unknown>;
60
+ /** The row's own revision counter (bumped on every store()/upsert),
61
+ * distinct from any KG-level metadata.version. A caller doing a
62
+ * read-merge-write passes this straight back as `bridgeStoreEntry`'s
63
+ * `ifVersion` to detect a concurrent writer instead of silently
64
+ * overwriting it (K5). Absent only when the underlying entry predates
65
+ * version tracking. */
66
+ version?: number;
67
+ };
68
+ cacheHit?: boolean;
69
+ error?: string;
70
+ } | null>;
71
+ export declare function bridgeDeleteEntry(options: {
72
+ key?: string;
73
+ id?: string;
74
+ namespace?: string;
75
+ dbPath?: string;
76
+ }): Promise<{
77
+ success: boolean;
78
+ deleted: boolean;
79
+ error?: string;
80
+ } | null>;
81
+ export declare function bridgeGenerateEmbedding(text: string, dbPath?: string): Promise<{
82
+ embedding: number[];
83
+ dimensions: number;
84
+ model: string;
85
+ } | null>;
86
+ export declare function bridgeLoadEmbeddingModel(dbPath?: string): Promise<{
87
+ success: boolean;
88
+ dimensions: number;
89
+ modelName: string;
90
+ loadTime?: number;
91
+ } | null>;
92
+ export declare function bridgeGetBackendStats(dbPath?: string): Promise<{
93
+ totalEntries: number;
94
+ entriesByNamespace: Record<string, number>;
95
+ memoryUsage: number;
96
+ } | null>;
97
+ export declare function bridgeAddToHNSW(options: {
98
+ id: string;
99
+ embedding: number[];
100
+ namespace?: string;
101
+ dbPath?: string;
102
+ }): Promise<{
103
+ success: boolean;
104
+ indexSize?: number;
105
+ error?: string;
106
+ } | null>;
107
+ /**
108
+ * Real status for the ANN (HNSW) fast path inside SqlBackend.search() —
109
+ * whether the corpus is big enough to use it, whether it's currently built,
110
+ * and where its on-disk cache lives. Read-only; does not build anything.
111
+ */
112
+ export declare function bridgeGetHNSWStatus(dbPath?: string): Promise<{
113
+ available: boolean;
114
+ thresholdEntries: number;
115
+ activeEmbeddedEntries: number;
116
+ built: boolean;
117
+ entryCount: number;
118
+ dimensions: number;
119
+ cachePath: string | null;
120
+ } | null>;
121
+ /**
122
+ * Force-build (or reload from disk cache) the ANN index regardless of
123
+ * MONOMIND_HNSW_THRESHOLD — the real implementation behind
124
+ * `memory search --build-hnsw`.
125
+ */
126
+ export declare function bridgeForceBuildHNSW(dbPath?: string): Promise<{
127
+ entryCount: number;
128
+ dimensions: number;
129
+ cachePath: string | null;
130
+ } | null>;
131
+ //# sourceMappingURL=memory-bridge-entries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-bridge-entries.d.ts","sourceRoot":"","sources":["../../../src/memory/memory-bridge-entries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Memory Bridge — entry reads and deletes (list, count, get, delete),
3
+ * embedding generation, backend stats, and HNSW status/build. Split out of
4
+ * memory-bridge.ts, which re-exports the public symbols.
5
+ */
6
+ import { _embedder, flushBackend, getBackend } from './memory-bridge-backend.js';
7
+ import { BRIDGE_EMBEDDING_DIMS, BRIDGE_EMBEDDING_MODEL, logBridgeError, } from './memory-bridge-core.js';
8
+ export async function bridgeListEntries(options) {
9
+ const backend = await getBackend(options.dbPath);
10
+ if (!backend)
11
+ return null;
12
+ try {
13
+ const entries = await backend.query({
14
+ type: 'exact',
15
+ // No namespace means "all namespaces" — the query builder (sql-backend.ts)
16
+ // already skips its filter clause on a falsy namespace. Defaulting to the
17
+ // literal string 'default' here (as this used to) overrode that legitimate
18
+ // "no filter" signal and silently scoped every unfiltered list/search to a
19
+ // namespace that's usually near-empty in practice.
20
+ namespace: options.namespace,
21
+ limit: options.limit ?? 100,
22
+ offset: options.offset,
23
+ });
24
+ return {
25
+ success: true,
26
+ entries: entries.map((e) => ({
27
+ id: e.id,
28
+ key: e.key,
29
+ namespace: e.namespace,
30
+ content: e.content,
31
+ accessCount: e.accessCount ?? 0,
32
+ createdAt: new Date(e.createdAt).toISOString(),
33
+ updatedAt: new Date(e.updatedAt).toISOString(),
34
+ hasEmbedding: !!(e.embedding && e.embedding.length > 0),
35
+ tags: e.tags ?? [],
36
+ metadata: e.metadata ?? {},
37
+ })),
38
+ total: entries.length,
39
+ };
40
+ }
41
+ catch (e) {
42
+ logBridgeError('bridgeListEntries', e);
43
+ return null;
44
+ }
45
+ }
46
+ /** A real database count for one namespace — `SELECT COUNT(*) WHERE
47
+ * namespace = ?` against the existing `idx_namespace` index — as opposed to
48
+ * `bridgeListEntries.total`, which is only the returned page's length (K7:
49
+ * "bridgeListEntries.total is the returned page length, not a database
50
+ * count"). Every row in a KG namespace (`kg:nodes`, `kg:edges`, `rules`) is
51
+ * exactly one node/edge/rule — the name/adjacency index namespaces are
52
+ * separate — so this count needs no per-row filtering to be exact, and costs
53
+ * one indexed query instead of paging the whole namespace.
54
+ *
55
+ * @returns null when the backend is unavailable, or when the loaded backend
56
+ * predates `count()` — callers fall back to the paginated scan they already
57
+ * had rather than fail. */
58
+ export async function bridgeCountEntries(namespace, dbPath) {
59
+ const backend = await getBackend(dbPath);
60
+ if (!backend || typeof backend.count !== 'function')
61
+ return null;
62
+ try {
63
+ return await backend.count(namespace);
64
+ }
65
+ catch (e) {
66
+ logBridgeError('bridgeCountEntries', e);
67
+ return null;
68
+ }
69
+ }
70
+ export async function bridgeGetEntry(options) {
71
+ const backend = await getBackend(options.dbPath);
72
+ if (!backend)
73
+ return null;
74
+ try {
75
+ const { key, namespace = 'default' } = options;
76
+ const entry = await backend.getByKey(namespace, key);
77
+ if (!entry)
78
+ return { success: true, found: false };
79
+ return {
80
+ success: true,
81
+ found: true,
82
+ entry: {
83
+ id: entry.id,
84
+ key: entry.key,
85
+ namespace: entry.namespace,
86
+ content: entry.content,
87
+ accessCount: entry.accessCount ?? 0,
88
+ createdAt: new Date(entry.createdAt).toISOString(),
89
+ updatedAt: new Date(entry.updatedAt).toISOString(),
90
+ hasEmbedding: !!(entry.embedding && entry.embedding.length > 0),
91
+ tags: entry.tags ?? [],
92
+ metadata: entry.metadata ?? {},
93
+ ...(typeof entry.version === 'number' ? { version: entry.version } : {}),
94
+ },
95
+ };
96
+ }
97
+ catch (e) {
98
+ logBridgeError('bridgeGetEntry', e);
99
+ return null;
100
+ }
101
+ }
102
+ export async function bridgeDeleteEntry(options) {
103
+ const backend = await getBackend(options.dbPath);
104
+ if (!backend)
105
+ return null;
106
+ try {
107
+ const namespace = options.namespace ?? 'default';
108
+ let deleted = false;
109
+ if (options.id) {
110
+ deleted = await backend.delete(options.id);
111
+ }
112
+ else if (options.key) {
113
+ const entry = await backend.getByKey(namespace, options.key);
114
+ if (entry)
115
+ deleted = await backend.delete(entry.id);
116
+ }
117
+ if (deleted)
118
+ await flushBackend(backend);
119
+ return { success: true, deleted };
120
+ }
121
+ catch (e) {
122
+ logBridgeError('bridgeDeleteEntry', e);
123
+ return { success: false, deleted: false };
124
+ }
125
+ }
126
+ // ===== Embeddings =====
127
+ export async function bridgeGenerateEmbedding(text, dbPath) {
128
+ await getBackend(dbPath); // ensure embedder is initialized
129
+ if (!_embedder)
130
+ return null;
131
+ try {
132
+ const emb = await _embedder(text);
133
+ return { embedding: Array.from(emb), dimensions: emb.length, model: BRIDGE_EMBEDDING_MODEL };
134
+ }
135
+ catch (e) {
136
+ logBridgeError('bridgeEmbedText', e);
137
+ return null;
138
+ }
139
+ }
140
+ export async function bridgeLoadEmbeddingModel(dbPath) {
141
+ const startTime = Date.now();
142
+ await getBackend(dbPath);
143
+ if (!_embedder)
144
+ return null;
145
+ try {
146
+ const test = await _embedder('test');
147
+ if (!test)
148
+ return null;
149
+ return {
150
+ success: true,
151
+ dimensions: test.length,
152
+ modelName: BRIDGE_EMBEDDING_MODEL,
153
+ loadTime: Date.now() - startTime,
154
+ };
155
+ }
156
+ catch (e) {
157
+ logBridgeError('bridgeLoadEmbeddingModel', e);
158
+ return null;
159
+ }
160
+ }
161
+ export async function bridgeGetBackendStats(dbPath) {
162
+ const backend = await getBackend(dbPath);
163
+ if (!backend)
164
+ return null;
165
+ try {
166
+ const stats = await backend.getStats();
167
+ return {
168
+ totalEntries: stats?.totalEntries ?? 0,
169
+ entriesByNamespace: stats?.entriesByNamespace ?? {},
170
+ memoryUsage: stats?.memoryUsage ?? 0,
171
+ };
172
+ }
173
+ catch (e) {
174
+ logBridgeError('bridgeGetBackendStats', e);
175
+ return null;
176
+ }
177
+ }
178
+ // ===== HNSW (real ANN status/build; search itself runs inside SqlBackend.search()) =====
179
+ export async function bridgeAddToHNSW(options) {
180
+ // The SQLite backend indexes entries automatically on store — this is a no-op
181
+ const backend = await getBackend(options.dbPath);
182
+ if (!backend)
183
+ return null;
184
+ try {
185
+ const stats = await backend.getStats();
186
+ return { success: true, indexSize: stats?.totalEntries ?? 0 };
187
+ }
188
+ catch (e) {
189
+ logBridgeError('bridgeAddToHNSW', e);
190
+ return { success: true };
191
+ }
192
+ }
193
+ /**
194
+ * Real status for the ANN (HNSW) fast path inside SqlBackend.search() —
195
+ * whether the corpus is big enough to use it, whether it's currently built,
196
+ * and where its on-disk cache lives. Read-only; does not build anything.
197
+ */
198
+ export async function bridgeGetHNSWStatus(dbPath) {
199
+ const backend = await getBackend(dbPath);
200
+ if (!backend || typeof backend.getAnnStatus !== 'function')
201
+ return null;
202
+ try {
203
+ return { available: true, ...backend.getAnnStatus() };
204
+ }
205
+ catch (e) {
206
+ logBridgeError('bridgeGetHNSWStatus', e);
207
+ return null;
208
+ }
209
+ }
210
+ /**
211
+ * Force-build (or reload from disk cache) the ANN index regardless of
212
+ * MONOMIND_HNSW_THRESHOLD — the real implementation behind
213
+ * `memory search --build-hnsw`.
214
+ */
215
+ export async function bridgeForceBuildHNSW(dbPath) {
216
+ const backend = await getBackend(dbPath);
217
+ if (!backend || typeof backend.forceBuildAnnIndex !== 'function')
218
+ return null;
219
+ try {
220
+ return await backend.forceBuildAnnIndex(BRIDGE_EMBEDDING_DIMS);
221
+ }
222
+ catch (e) {
223
+ logBridgeError('bridgeForceBuildHNSW', e);
224
+ return null;
225
+ }
226
+ }
227
+ //# sourceMappingURL=memory-bridge-entries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-bridge-entries.js","sourceRoot":"","sources":["../../../src/memory/memory-bridge-entries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Memory Bridge — the usage/feedback closed loop: usage capture
3
+ * (frequency_weight), EWMA feedback weighting with an idempotency ledger,
4
+ * and feedback records. Split out of memory-bridge.ts, which re-exports the
5
+ * public symbols.
6
+ */
7
+ import type { SkippedEntry } from './memory-bridge-store.js';
8
+ /** Record that these entries were actually USED (returned to and consumed by a
9
+ * caller) — increments frequency_weight, which feeds the ranking blend.
10
+ *
11
+ * Unresolvable ids are REPORTED, not dropped: this used to `continue` past
12
+ * every id it could not read, so a caller handing it a page of stale ids got
13
+ * `{success: true, updated: 0}` with nothing to say whether those entries had
14
+ * been deleted or the writes had failed. Same contract as
15
+ * `bridgeApplyFeedback`. */
16
+ export declare function bridgeRecordUsage(options: {
17
+ entryIds: string[];
18
+ dbPath?: string;
19
+ }): Promise<{
20
+ success: boolean;
21
+ updated: number;
22
+ skipped?: SkippedEntry[];
23
+ } | null>;
24
+ /** Apply a usefulness rating to the entries that produced an answer:
25
+ * EWMA feedback_weight' = w + alpha*(score - w), clipped [0,1] (cognee's
26
+ * apply_feedback_weights). `ledgerKey` makes application idempotent — a
27
+ * daemon retry or duplicate MCP call must never compound the update. */
28
+ export declare function bridgeApplyFeedback(options: {
29
+ entryIds: string[];
30
+ score: number;
31
+ ledgerKey?: string;
32
+ alpha?: number;
33
+ dbPath?: string;
34
+ }): Promise<{
35
+ success: boolean;
36
+ applied: number;
37
+ /** Ids that trained nothing, with why — so `applied: 0` is never a silent
38
+ * success. `not_found` means the id resolved to no entry (it was deleted, or
39
+ * it predates the in-place upsert fix and was orphaned by a re-ingest);
40
+ * `error` means the entry existed but could not be updated. */
41
+ skipped?: {
42
+ id: string;
43
+ reason: 'not_found' | 'error';
44
+ }[];
45
+ alreadyApplied?: boolean;
46
+ error?: string;
47
+ } | null>;
48
+ export declare function bridgeRecordFeedback(options: {
49
+ taskType: string;
50
+ action: string;
51
+ outcome: 'success' | 'failure' | 'partial';
52
+ confidence?: number;
53
+ metadata?: Record<string, unknown>;
54
+ dbPath?: string;
55
+ }): Promise<{
56
+ success: boolean;
57
+ id: string;
58
+ error?: string;
59
+ } | null>;
60
+ //# sourceMappingURL=memory-bridge-feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-bridge-feedback.d.ts","sourceRoot":"","sources":["../../../src/memory/memory-bridge-feedback.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAK7D;;;;;;;6BAO6B;AAC7B,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CAclF;AAED;;;yEAGyE;AACzE,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB;;;oEAGgE;IAChE,OAAO,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAA;KAAE,EAAE,CAAC;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CAAC,CA4DR;AAID,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAgBnE"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Memory Bridge — the usage/feedback closed loop: usage capture
3
+ * (frequency_weight), EWMA feedback weighting with an idempotency ledger,
4
+ * and feedback records. Split out of memory-bridge.ts, which re-exports the
5
+ * public symbols.
6
+ */
7
+ import { flushBackend, getBackend } from './memory-bridge-backend.js';
8
+ import { entryWeights, FEEDBACK_EWMA_ALPHA, logBridgeError } from './memory-bridge-core.js';
9
+ import { bridgeStoreEntry, recordUsageOnBackend } from './memory-bridge-store.js';
10
+ // ===== Usage capture & feedback weighting (closed loop) =====
11
+ /** Record that these entries were actually USED (returned to and consumed by a
12
+ * caller) — increments frequency_weight, which feeds the ranking blend.
13
+ *
14
+ * Unresolvable ids are REPORTED, not dropped: this used to `continue` past
15
+ * every id it could not read, so a caller handing it a page of stale ids got
16
+ * `{success: true, updated: 0}` with nothing to say whether those entries had
17
+ * been deleted or the writes had failed. Same contract as
18
+ * `bridgeApplyFeedback`. */
19
+ export async function bridgeRecordUsage(options) {
20
+ const backend = await getBackend(options.dbPath);
21
+ if (!backend)
22
+ return null;
23
+ try {
24
+ const { updated, skipped } = await recordUsageOnBackend(backend, (options.entryIds ?? []).slice(0, 100));
25
+ if (updated)
26
+ await flushBackend(backend);
27
+ return skipped.length ? { success: true, updated, skipped } : { success: true, updated };
28
+ }
29
+ catch (e) {
30
+ logBridgeError('bridgeRecordUsage', e);
31
+ return { success: false, updated: 0 };
32
+ }
33
+ }
34
+ /** Apply a usefulness rating to the entries that produced an answer:
35
+ * EWMA feedback_weight' = w + alpha*(score - w), clipped [0,1] (cognee's
36
+ * apply_feedback_weights). `ledgerKey` makes application idempotent — a
37
+ * daemon retry or duplicate MCP call must never compound the update. */
38
+ export async function bridgeApplyFeedback(options) {
39
+ const backend = await getBackend(options.dbPath);
40
+ if (!backend)
41
+ return null;
42
+ try {
43
+ const score = Math.max(0, Math.min(1, options.score));
44
+ const alpha = typeof options.alpha === 'number'
45
+ ? Math.max(0, Math.min(1, options.alpha))
46
+ : FEEDBACK_EWMA_ALPHA;
47
+ const ledgerEntryKey = options.ledgerKey ? `applied_${options.ledgerKey.slice(0, 500)}` : null;
48
+ if (ledgerEntryKey) {
49
+ const existing = await backend.getByKey('feedback', ledgerEntryKey).catch(() => null);
50
+ if (existing)
51
+ return { success: true, applied: 0, alreadyApplied: true };
52
+ }
53
+ let applied = 0;
54
+ const skipped = [];
55
+ for (const id of (options.entryIds ?? []).slice(0, 100)) {
56
+ if (typeof id !== 'string' || !id)
57
+ continue;
58
+ try {
59
+ const entry = await backend.get(id);
60
+ if (!entry) {
61
+ skipped.push({ id, reason: 'not_found' });
62
+ continue;
63
+ }
64
+ const { feedback } = entryWeights(entry.metadata);
65
+ const next = Math.max(0, Math.min(1, feedback + alpha * (score - feedback)));
66
+ await backend.update(id, { metadata: { feedback_weight: next } });
67
+ applied++;
68
+ }
69
+ catch (e) {
70
+ logBridgeError('bridgeApplyFeedback.entryUpdate', e);
71
+ skipped.push({ id, reason: 'error' });
72
+ }
73
+ }
74
+ if (ledgerEntryKey) {
75
+ await bridgeStoreEntry({
76
+ key: ledgerEntryKey,
77
+ value: JSON.stringify({
78
+ score,
79
+ entryIds: options.entryIds.slice(0, 100),
80
+ appliedAt: Date.now(),
81
+ applied,
82
+ skipped,
83
+ }),
84
+ namespace: 'feedback',
85
+ generateEmbeddingFlag: false,
86
+ dbPath: options.dbPath,
87
+ upsert: true,
88
+ });
89
+ }
90
+ if (applied)
91
+ await flushBackend(backend);
92
+ return skipped.length ? { success: true, applied, skipped } : { success: true, applied };
93
+ }
94
+ catch (err) {
95
+ logBridgeError('bridgeApplyFeedback', err);
96
+ const message = err instanceof Error ? err.message : String(err);
97
+ return { success: false, applied: 0, error: message };
98
+ }
99
+ }
100
+ // ===== Feedback =====
101
+ export async function bridgeRecordFeedback(options) {
102
+ return bridgeStoreEntry({
103
+ key: `feedback_${options.taskType}_${Date.now()}`,
104
+ value: JSON.stringify({
105
+ taskType: options.taskType,
106
+ action: options.action,
107
+ outcome: options.outcome,
108
+ confidence: options.confidence ?? 0.5,
109
+ metadata: options.metadata ?? {},
110
+ recordedAt: Date.now(),
111
+ }),
112
+ namespace: 'feedback',
113
+ tags: [options.taskType, options.outcome],
114
+ generateEmbeddingFlag: true,
115
+ dbPath: options.dbPath,
116
+ });
117
+ }
118
+ //# sourceMappingURL=memory-bridge-feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-bridge-feedback.js","sourceRoot":"","sources":["../../../src/memory/memory-bridge-feedback.ts"],"names":[],"mappings":"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"}