@monoes/monomindcli 2.16.11 → 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-origin.d.ts +24 -0
- package/dist/src/commands/cleanup-origin.d.ts.map +1 -0
- package/dist/src/commands/cleanup-origin.js +67 -0
- package/dist/src/commands/cleanup-origin.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 +9 -296
- 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/orgrt/sandbox-stubs.d.ts +4 -0
- package/dist/src/orgrt/sandbox-stubs.d.ts.map +1 -1
- package/dist/src/orgrt/sandbox-stubs.js +12 -2
- package/dist/src/orgrt/sandbox-stubs.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,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Knowledge Graph — retrieval: kgSearch (seed nodes, neighbourhood
|
|
3
|
+
* expansion, evidence-aware ranking) and kgGlossary for extraction prompts.
|
|
4
|
+
* Split out of memory-kg.ts, which re-exports the public symbols.
|
|
5
|
+
*/
|
|
6
|
+
import { bridgeGetEntry, bridgeSearchEntries } from './memory-bridge.js';
|
|
7
|
+
import { readAdj, readIndexStatus } from './memory-kg-index.js';
|
|
8
|
+
import { kgNamespaces, normalizeName } from './memory-kg-model.js';
|
|
9
|
+
import { SEARCH_EDGE_SCAN_MAX, scanNamespace } from './memory-kg-scan.js';
|
|
10
|
+
/** Seed candidates pulled before filtering and ranking. */
|
|
11
|
+
const SEARCH_SEED_LIMIT = 15;
|
|
12
|
+
/** Extra candidates fetched when a `nodeSet` narrows the graph.
|
|
13
|
+
*
|
|
14
|
+
* The bridge has no tag filter, so set membership can only be tested after
|
|
15
|
+
* retrieval. Filtering the unfiltered top-15 meant a node that IS in the set
|
|
16
|
+
* but ranks 16th overall was missed — the set made results scarcer instead of
|
|
17
|
+
* more precise. Over-fetching moves the cutoff after the filter. */
|
|
18
|
+
const SEARCH_NODE_SET_OVERFETCH = 4;
|
|
19
|
+
/** How far a co-occurrence guess drops below an equally-seeded stated fact.
|
|
20
|
+
* Enough to lose a tie, not enough to hide it: `mentioned_with` between two
|
|
21
|
+
* strong seeds is still worth surfacing when nothing better was asserted. */
|
|
22
|
+
const HEURISTIC_PENALTY = 0.15;
|
|
23
|
+
/** Live origins disagree about what this edge says. Still returned — a disputed
|
|
24
|
+
* fact is information — but it does not outrank a settled one. */
|
|
25
|
+
const CONFLICT_PENALTY = 0.1;
|
|
26
|
+
/** Seeded retrieval → neighborhood → triplet ranking (cognee's brute-force
|
|
27
|
+
* triplet search, scaled down). Seed scores already carry the Phase 1 feedback
|
|
28
|
+
* blend, and the seed retrieval may be vector or keyword — `method` on the
|
|
29
|
+
* result says which actually ran.
|
|
30
|
+
*
|
|
31
|
+
* Ranking weighs exactly two evidence signals, both read off the claim ledger:
|
|
32
|
+
* extraction method and description conflict. It deliberately does NOT model
|
|
33
|
+
* source credibility, claim freshness, or whether the relation itself answers
|
|
34
|
+
* the query — those need an evaluation set to tune against, and guessing at
|
|
35
|
+
* them would be the same overclaim this weighting exists to correct. */
|
|
36
|
+
export async function kgSearch(options) {
|
|
37
|
+
try {
|
|
38
|
+
const limit = options.limit ?? 8;
|
|
39
|
+
const ns = kgNamespaces(options.scope);
|
|
40
|
+
const seedsRes = await bridgeSearchEntries({
|
|
41
|
+
query: options.query,
|
|
42
|
+
namespace: ns.nodes,
|
|
43
|
+
// Over-fetch when a set filter follows, so the cutoff lands AFTER it.
|
|
44
|
+
limit: options.nodeSet ? SEARCH_SEED_LIMIT * SEARCH_NODE_SET_OVERFETCH : SEARCH_SEED_LIMIT,
|
|
45
|
+
threshold: 0.25,
|
|
46
|
+
dbPath: options.dbPath,
|
|
47
|
+
});
|
|
48
|
+
// What the retrieval actually was, carried on every return below: a keyword
|
|
49
|
+
// fallback presented as vector-seeded search is the overclaim B5 names.
|
|
50
|
+
const retrieval = {
|
|
51
|
+
...(seedsRes?.searchMethod ? { method: seedsRes.searchMethod } : {}),
|
|
52
|
+
...(seedsRes?.fallbackReason ? { fallbackReason: seedsRes.fallbackReason } : {}),
|
|
53
|
+
};
|
|
54
|
+
let seedResults = seedsRes?.results ?? [];
|
|
55
|
+
if (options.nodeSet) {
|
|
56
|
+
const setTag = normalizeName(options.nodeSet);
|
|
57
|
+
seedResults = seedResults.filter((r) => (r.tags ?? []).includes(setTag));
|
|
58
|
+
}
|
|
59
|
+
seedResults = seedResults.slice(0, SEARCH_SEED_LIMIT);
|
|
60
|
+
if (!seedResults.length)
|
|
61
|
+
return { success: true, context: '', triplets: [], seeds: [], ...retrieval };
|
|
62
|
+
const seedScore = new Map();
|
|
63
|
+
for (const s of seedResults)
|
|
64
|
+
seedScore.set(s.key, s.score);
|
|
65
|
+
const triplets = [];
|
|
66
|
+
let scannedEdges = 0;
|
|
67
|
+
let truncated = false;
|
|
68
|
+
/** Score one edge against the seeded entities and, if relevant, push its
|
|
69
|
+
* triplet — shared by the indexed and exhaustive gathering paths below
|
|
70
|
+
* so ranking never depends on which one ran (K7). */
|
|
71
|
+
const considerEdge = (e) => {
|
|
72
|
+
scannedEdges++;
|
|
73
|
+
const md = (e.metadata ?? {});
|
|
74
|
+
if (md?.kg !== 'edge' || md.valid_to != null)
|
|
75
|
+
return;
|
|
76
|
+
const src = String(md.src ?? '');
|
|
77
|
+
const dst = String(md.dst ?? '');
|
|
78
|
+
const sSrc = seedScore.get(src) ?? 0;
|
|
79
|
+
const sDst = seedScore.get(dst) ?? 0;
|
|
80
|
+
if (sSrc === 0 && sDst === 0)
|
|
81
|
+
return;
|
|
82
|
+
// Both endpoints seeded beats one; the unseeded endpoint contributes a
|
|
83
|
+
// neutral 0.35 so bridging edges from a strong seed still surface.
|
|
84
|
+
const relevance = (Math.max(sSrc, 0.35) + Math.max(sDst, 0.35)) / 2 + (sSrc > 0 && sDst > 0 ? 0.1 : 0);
|
|
85
|
+
// Evidence, from the claim ledger. An edge whose method was never
|
|
86
|
+
// recorded is left at its relevance score — unknown is not evidence
|
|
87
|
+
// against it, and penalizing it would demote the entire pre-existing
|
|
88
|
+
// graph relative to anything written today.
|
|
89
|
+
const method = md.method === 'asserted' || md.method === 'heuristic'
|
|
90
|
+
? md.method
|
|
91
|
+
: undefined;
|
|
92
|
+
const conflict = md.conflict === true;
|
|
93
|
+
const score = Math.max(0, relevance -
|
|
94
|
+
(method === 'heuristic' ? HEURISTIC_PENALTY : 0) -
|
|
95
|
+
(conflict ? CONFLICT_PENALTY : 0));
|
|
96
|
+
triplets.push({
|
|
97
|
+
source: String(md.source_name ?? src),
|
|
98
|
+
relation: String(md.relation ?? 'related_to'),
|
|
99
|
+
target: String(md.target_name ?? dst),
|
|
100
|
+
fact: e.content,
|
|
101
|
+
score,
|
|
102
|
+
...(method ? { method } : {}),
|
|
103
|
+
...(conflict ? { conflict } : {}),
|
|
104
|
+
id: e.id,
|
|
105
|
+
key: e.key,
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
// Scores are per-edge, so pruning to the running top-`limit` after every
|
|
109
|
+
// batch yields exactly the same result as sorting the whole set at the end.
|
|
110
|
+
const pruneToLimit = () => {
|
|
111
|
+
if (triplets.length > limit) {
|
|
112
|
+
triplets.sort((a, b) => b.score - a.score);
|
|
113
|
+
triplets.length = limit;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
// K7: gather candidate edges via each seed's adjacency entry — O(seeds ×
|
|
117
|
+
// degree) instead of a full namespace scan — when the scope's index is
|
|
118
|
+
// ready and every seed's adjacency entry resolves. Any seed that misses
|
|
119
|
+
// (index not ready, or an unresolvable ref) falls the WHOLE query back to
|
|
120
|
+
// the exhaustive scan rather than silently searching only some seeds.
|
|
121
|
+
let covered = false;
|
|
122
|
+
let usedIndex = false;
|
|
123
|
+
if ((await readIndexStatus(ns, options.dbPath)).state === 'ready') {
|
|
124
|
+
const candidateKeys = new Set();
|
|
125
|
+
let indexOk = true;
|
|
126
|
+
for (const s of seedResults) {
|
|
127
|
+
const adj = await readAdj(ns, s.key, options.dbPath);
|
|
128
|
+
if (adj === null) {
|
|
129
|
+
indexOk = false;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
for (const key of adj.edgeKeys)
|
|
133
|
+
candidateKeys.add(key);
|
|
134
|
+
}
|
|
135
|
+
if (indexOk) {
|
|
136
|
+
for (const key of candidateKeys) {
|
|
137
|
+
const res = await bridgeGetEntry({ key, namespace: ns.edges, dbPath: options.dbPath });
|
|
138
|
+
if (res?.found && res.entry)
|
|
139
|
+
considerEdge(res.entry);
|
|
140
|
+
}
|
|
141
|
+
pruneToLimit();
|
|
142
|
+
usedIndex = true;
|
|
143
|
+
covered = true;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Paged edge scan (see monolean note in module header). Each page is folded
|
|
147
|
+
// into the running top-`limit` immediately, so memory stays at one page
|
|
148
|
+
// regardless of how many edges the namespace holds.
|
|
149
|
+
if (!usedIndex) {
|
|
150
|
+
covered = await scanNamespace(ns.edges, options.dbPath, (page) => {
|
|
151
|
+
for (const e of page)
|
|
152
|
+
considerEdge(e);
|
|
153
|
+
pruneToLimit();
|
|
154
|
+
if (scannedEdges >= SEARCH_EDGE_SCAN_MAX) {
|
|
155
|
+
truncated = true;
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
return true;
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
// An unreadable namespace is an incomplete answer, not an empty graph.
|
|
162
|
+
if (!covered)
|
|
163
|
+
truncated = true;
|
|
164
|
+
triplets.sort((a, b) => b.score - a.score);
|
|
165
|
+
const seeds = seedResults.slice(0, limit).map((s) => {
|
|
166
|
+
// metadata is not in search results; parse from rendered content "name — description"
|
|
167
|
+
const dash = s.content.indexOf(' — ');
|
|
168
|
+
return {
|
|
169
|
+
name: dash > 0 ? s.content.slice(0, dash) : s.key,
|
|
170
|
+
// Tags carry the stored type (`['kg', <type>, …]`). The key never did:
|
|
171
|
+
// reading `key.split(':')[1]` reported the type of `n:shared_service`
|
|
172
|
+
// as `shared_service`, and under hashed IDs would report a digest.
|
|
173
|
+
type: (s.tags ?? [])[1] ?? 'entity',
|
|
174
|
+
description: dash > 0 ? s.content.slice(dash + 3) : s.content,
|
|
175
|
+
score: s.score,
|
|
176
|
+
id: s.id,
|
|
177
|
+
};
|
|
178
|
+
});
|
|
179
|
+
const context = [
|
|
180
|
+
...triplets.map((t) => `${t.source} —${t.relation}→ ${t.target}${t.fact && t.fact !== `${t.source} ${t.relation} ${t.target}` ? ` (${t.fact})` : ''}`),
|
|
181
|
+
...(triplets.length ? [] : seeds.map((s) => `${s.name}: ${s.description}`)),
|
|
182
|
+
].join('\n');
|
|
183
|
+
return {
|
|
184
|
+
success: true,
|
|
185
|
+
context,
|
|
186
|
+
triplets,
|
|
187
|
+
seeds,
|
|
188
|
+
scannedEdges,
|
|
189
|
+
...(truncated && { truncated }),
|
|
190
|
+
...retrieval,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
return {
|
|
195
|
+
success: false,
|
|
196
|
+
context: '',
|
|
197
|
+
triplets: [],
|
|
198
|
+
seeds: [],
|
|
199
|
+
error: err instanceof Error ? err.message : String(err),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// ── Glossary (anti-duplicate-entity injection for extraction prompts) ──
|
|
204
|
+
export async function kgGlossary(options) {
|
|
205
|
+
const limit = options?.limit ?? 40;
|
|
206
|
+
// Running top-`limit` by rank, deduplicated by normalized name. Folding each
|
|
207
|
+
// page in and pruning keeps the whole node namespace in scope without ever
|
|
208
|
+
// holding more than a page plus `limit` names.
|
|
209
|
+
let top = [];
|
|
210
|
+
await scanNamespace(kgNamespaces(options?.scope).nodes, options?.dbPath, (page) => {
|
|
211
|
+
for (const e of page) {
|
|
212
|
+
const md = e.metadata;
|
|
213
|
+
// Glossary is for ENTITY name reuse — rule prose and extraction-source
|
|
214
|
+
// Session nodes would drown it.
|
|
215
|
+
const t = String(md?.type ?? '').toLowerCase();
|
|
216
|
+
if (md?.node_set === 'rules' || t === 'rule' || t === 'session')
|
|
217
|
+
continue;
|
|
218
|
+
const fw = typeof md.feedback_weight === 'number' ? md.feedback_weight : 0.5;
|
|
219
|
+
const freq = typeof md.frequency_weight === 'number' ? md.frequency_weight : 0;
|
|
220
|
+
const version = typeof md.version === 'number' ? md.version : 1;
|
|
221
|
+
const name = String(md.name ?? e.key);
|
|
222
|
+
top.push({ name, norm: normalizeName(name), rank: version + freq + fw });
|
|
223
|
+
}
|
|
224
|
+
top.sort((a, b) => b.rank - a.rank);
|
|
225
|
+
const seen = new Set();
|
|
226
|
+
const pruned = [];
|
|
227
|
+
for (const n of top) {
|
|
228
|
+
if (seen.has(n.norm))
|
|
229
|
+
continue;
|
|
230
|
+
seen.add(n.norm);
|
|
231
|
+
pruned.push(n);
|
|
232
|
+
if (pruned.length >= limit)
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
top = pruned;
|
|
236
|
+
});
|
|
237
|
+
return top.map((n) => n.name);
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=memory-kg-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-kg-search.js","sourceRoot":"","sources":["../../../src/memory/memory-kg-search.ts"],"names":[],"mappings":"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"}
|