@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.
- package/.claude/agents/core/coder.md +1 -1
- package/.claude/agents/engineering/engineering-devops-automator.md +1 -1
- package/.claude/agents/github/repo-architect.md +1 -1
- package/.claude/agents/testing/production-validator.md +1 -1
- package/.claude/agents/testing/testing-tool-evaluator.md +1 -1
- package/.claude/commands/github/pr-manager.md +1 -1
- package/.claude/helpers/pick-rank.cjs +34 -4
- package/.claude/skills/monolean-audit/SKILL.md +1 -1
- package/dist/src/commands/cleanup-data.d.ts +30 -0
- package/dist/src/commands/cleanup-data.d.ts.map +1 -0
- package/dist/src/commands/cleanup-data.js +138 -0
- package/dist/src/commands/cleanup-data.js.map +1 -0
- package/dist/src/commands/cleanup-scratch.d.ts +43 -0
- package/dist/src/commands/cleanup-scratch.d.ts.map +1 -0
- package/dist/src/commands/cleanup-scratch.js +125 -0
- package/dist/src/commands/cleanup-scratch.js.map +1 -0
- package/dist/src/commands/cleanup.d.ts +2 -39
- package/dist/src/commands/cleanup.d.ts.map +1 -1
- package/dist/src/commands/cleanup.js +5 -247
- package/dist/src/commands/cleanup.js.map +1 -1
- package/dist/src/commands/doctor-gitignore-checks.d.ts +10 -0
- package/dist/src/commands/doctor-gitignore-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-gitignore-checks.js +141 -0
- package/dist/src/commands/doctor-gitignore-checks.js.map +1 -0
- package/dist/src/commands/doctor-helpers-checks.d.ts +10 -0
- package/dist/src/commands/doctor-helpers-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-helpers-checks.js +292 -0
- package/dist/src/commands/doctor-helpers-checks.js.map +1 -0
- package/dist/src/commands/doctor-memory-checks.d.ts +47 -0
- package/dist/src/commands/doctor-memory-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-memory-checks.js +298 -0
- package/dist/src/commands/doctor-memory-checks.js.map +1 -0
- package/dist/src/commands/doctor-monograph-checks.d.ts +9 -0
- package/dist/src/commands/doctor-monograph-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-monograph-checks.js +331 -0
- package/dist/src/commands/doctor-monograph-checks.js.map +1 -0
- package/dist/src/commands/doctor-project-checks.d.ts +7 -66
- package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
- package/dist/src/commands/doctor-project-checks.js +10 -1331
- package/dist/src/commands/doctor-project-checks.js.map +1 -1
- package/dist/src/commands/doctor-routing-checks.d.ts +10 -0
- package/dist/src/commands/doctor-routing-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-routing-checks.js +194 -0
- package/dist/src/commands/doctor-routing-checks.js.map +1 -0
- package/dist/src/commands/doctor-worker-checks.d.ts +17 -0
- package/dist/src/commands/doctor-worker-checks.d.ts.map +1 -0
- package/dist/src/commands/doctor-worker-checks.js +122 -0
- package/dist/src/commands/doctor-worker-checks.js.map +1 -0
- package/dist/src/commands/hooks-routing-commands.js +1 -1
- package/dist/src/commands/hooks-routing-commands.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +6 -15
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/init/never-commit.d.ts +3 -3
- package/dist/src/init/types.d.ts +1 -1
- package/dist/src/init/types.js +1 -1
- package/dist/src/knowledge/document-store.js +1 -1
- package/dist/src/knowledge/document-store.js.map +1 -1
- package/dist/src/mcp-tools/hooks-edit-command.d.ts +10 -0
- package/dist/src/mcp-tools/hooks-edit-command.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-edit-command.js +247 -0
- package/dist/src/mcp-tools/hooks-edit-command.js.map +1 -0
- package/dist/src/mcp-tools/hooks-learning.d.ts +9 -0
- package/dist/src/mcp-tools/hooks-learning.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-learning.js +408 -0
- package/dist/src/mcp-tools/hooks-learning.js.map +1 -0
- package/dist/src/mcp-tools/hooks-metrics-list.d.ts +8 -0
- package/dist/src/mcp-tools/hooks-metrics-list.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-metrics-list.js +205 -0
- package/dist/src/mcp-tools/hooks-metrics-list.js.map +1 -0
- package/dist/src/mcp-tools/hooks-route.d.ts +12 -0
- package/dist/src/mcp-tools/hooks-route.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-route.js +251 -0
- package/dist/src/mcp-tools/hooks-route.js.map +1 -0
- package/dist/src/mcp-tools/hooks-routing.d.ts +6 -27
- package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-routing.js +6 -1727
- package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
- package/dist/src/mcp-tools/hooks-session.d.ts +9 -0
- package/dist/src/mcp-tools/hooks-session.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-session.js +243 -0
- package/dist/src/mcp-tools/hooks-session.js.map +1 -0
- package/dist/src/mcp-tools/hooks-task.d.ts +17 -0
- package/dist/src/mcp-tools/hooks-task.d.ts.map +1 -0
- package/dist/src/mcp-tools/hooks-task.js +427 -0
- package/dist/src/mcp-tools/hooks-task.js.map +1 -0
- package/dist/src/mcp-tools/hooks-tools.d.ts +2 -1
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +2 -1
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +1 -1
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/src/memory/bm25-index.d.ts +2 -2
- package/dist/src/memory/bm25-index.js +2 -2
- package/dist/src/memory/embedding-operations.js +2 -2
- package/dist/src/memory/embedding-operations.js.map +1 -1
- package/dist/src/memory/entity-name-key.d.ts +1 -1
- package/dist/src/memory/entity-name-key.js +1 -1
- package/dist/src/memory/hnsw-operations.d.ts +1 -1
- package/dist/src/memory/hnsw-operations.js +1 -1
- package/dist/src/memory/memory-bridge-backend.d.ts +43 -0
- package/dist/src/memory/memory-bridge-backend.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-backend.js +363 -0
- package/dist/src/memory/memory-bridge-backend.js.map +1 -0
- package/dist/src/memory/memory-bridge-core.d.ts +42 -0
- package/dist/src/memory/memory-bridge-core.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-core.js +126 -0
- package/dist/src/memory/memory-bridge-core.js.map +1 -0
- package/dist/src/memory/memory-bridge-entries.d.ts +131 -0
- package/dist/src/memory/memory-bridge-entries.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-entries.js +227 -0
- package/dist/src/memory/memory-bridge-entries.js.map +1 -0
- package/dist/src/memory/memory-bridge-feedback.d.ts +60 -0
- package/dist/src/memory/memory-bridge-feedback.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-feedback.js +118 -0
- package/dist/src/memory/memory-bridge-feedback.js.map +1 -0
- package/dist/src/memory/memory-bridge-paths.d.ts +123 -0
- package/dist/src/memory/memory-bridge-paths.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-paths.js +335 -0
- package/dist/src/memory/memory-bridge-paths.js.map +1 -0
- package/dist/src/memory/memory-bridge-search.d.ts +48 -0
- package/dist/src/memory/memory-bridge-search.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-search.js +383 -0
- package/dist/src/memory/memory-bridge-search.js.map +1 -0
- package/dist/src/memory/memory-bridge-sessions.d.ts +38 -0
- package/dist/src/memory/memory-bridge-sessions.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-sessions.js +109 -0
- package/dist/src/memory/memory-bridge-sessions.js.map +1 -0
- package/dist/src/memory/memory-bridge-store.d.ts +58 -0
- package/dist/src/memory/memory-bridge-store.d.ts.map +1 -0
- package/dist/src/memory/memory-bridge-store.js +201 -0
- package/dist/src/memory/memory-bridge-store.js.map +1 -0
- package/dist/src/memory/memory-bridge.d.ts +10 -438
- package/dist/src/memory/memory-bridge.d.ts.map +1 -1
- package/dist/src/memory/memory-bridge.js +14 -1787
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/src/memory/memory-kg-claims.d.ts +52 -0
- package/dist/src/memory/memory-kg-claims.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-claims.js +99 -0
- package/dist/src/memory/memory-kg-claims.js.map +1 -0
- package/dist/src/memory/memory-kg-index.d.ts +86 -0
- package/dist/src/memory/memory-kg-index.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-index.js +256 -0
- package/dist/src/memory/memory-kg-index.js.map +1 -0
- package/dist/src/memory/memory-kg-ingest.d.ts +44 -0
- package/dist/src/memory/memory-kg-ingest.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-ingest.js +361 -0
- package/dist/src/memory/memory-kg-ingest.js.map +1 -0
- package/dist/src/memory/memory-kg-model.d.ts +168 -0
- package/dist/src/memory/memory-kg-model.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-model.js +158 -0
- package/dist/src/memory/memory-kg-model.js.map +1 -0
- package/dist/src/memory/memory-kg-names.d.ts +64 -0
- package/dist/src/memory/memory-kg-names.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-names.js +187 -0
- package/dist/src/memory/memory-kg-names.js.map +1 -0
- package/dist/src/memory/memory-kg-promote.d.ts +79 -0
- package/dist/src/memory/memory-kg-promote.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-promote.js +248 -0
- package/dist/src/memory/memory-kg-promote.js.map +1 -0
- package/dist/src/memory/memory-kg-rebuild.d.ts +77 -0
- package/dist/src/memory/memory-kg-rebuild.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-rebuild.js +299 -0
- package/dist/src/memory/memory-kg-rebuild.js.map +1 -0
- package/dist/src/memory/memory-kg-rollback.d.ts +47 -0
- package/dist/src/memory/memory-kg-rollback.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-rollback.js +193 -0
- package/dist/src/memory/memory-kg-rollback.js.map +1 -0
- package/dist/src/memory/memory-kg-rules.d.ts +64 -0
- package/dist/src/memory/memory-kg-rules.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-rules.js +251 -0
- package/dist/src/memory/memory-kg-rules.js.map +1 -0
- package/dist/src/memory/memory-kg-scan.d.ts +118 -0
- package/dist/src/memory/memory-kg-scan.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-scan.js +209 -0
- package/dist/src/memory/memory-kg-scan.js.map +1 -0
- package/dist/src/memory/memory-kg-search.d.ts +80 -0
- package/dist/src/memory/memory-kg-search.d.ts.map +1 -0
- package/dist/src/memory/memory-kg-search.js +239 -0
- package/dist/src/memory/memory-kg-search.js.map +1 -0
- package/dist/src/memory/memory-kg.d.ts +19 -547
- package/dist/src/memory/memory-kg.d.ts.map +1 -1
- package/dist/src/memory/memory-kg.js +10 -2389
- package/dist/src/memory/memory-kg.js.map +1 -1
- package/dist/src/ui/org-hil.mjs +1 -1
- package/dist/src/ui/routes-org-agents.mjs +318 -0
- package/dist/src/ui/routes-org-approvals.mjs +133 -0
- package/dist/src/ui/routes-org-config.mjs +459 -0
- package/dist/src/ui/routes-org-control.mjs +300 -0
- package/dist/src/ui/routes-org-files.mjs +172 -0
- package/dist/src/ui/routes-org-helpers.mjs +84 -0
- package/dist/src/ui/routes-org-knowledge.mjs +262 -0
- package/dist/src/ui/routes-org-lifecycle.mjs +224 -0
- package/dist/src/ui/routes-org-live.mjs +278 -0
- package/dist/src/ui/routes-org-mastermind.mjs +346 -0
- package/dist/src/ui/routes-org-planning.mjs +398 -0
- package/dist/src/ui/routes-org-runs.mjs +430 -0
- package/dist/src/ui/routes-org-status.mjs +342 -0
- package/dist/src/ui/routes-org-workflows.mjs +212 -0
- package/dist/src/ui/routes-org.mjs +26 -3847
- package/dist/src/ui/server.mjs +1 -1
- package/dist/src/utils/native-error.d.ts +1 -1
- package/dist/src/utils/native-error.js +1 -1
- package/dist/src/utils/paths.d.ts +2 -1
- package/dist/src/utils/paths.d.ts.map +1 -1
- package/dist/src/utils/paths.js +2 -1
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/org-skills/adversarial-reviewer/SKILL.md +1 -1
- package/org-skills/board-deck-builder/SKILL.md +1 -1
- package/org-skills/code-reviewer/SKILL.md +1 -1
- package/org-skills/debugging-wizard/SKILL.md +1 -1
- package/org-skills/scientific-thinking-literature-review/SKILL.md +1 -1
- package/org-skills/scientific-thinking-scholar-evaluation/SKILL.md +1 -1
- 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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"}
|