@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,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Bridge — the read/search path: bridgeSearchEntries (semantic +
|
|
3
|
+
* FTS5/BM25 keyword merge, stale and superseded-knowledge filtering,
|
|
4
|
+
* cross-encoder reranking). Split out of memory-bridge.ts, which re-exports
|
|
5
|
+
* it.
|
|
6
|
+
*/
|
|
7
|
+
import { _embedder, _reranker, _rerankerPromise, getBackend, loadReranker, rerankerDisabled, rerankResults, } from './memory-bridge-backend.js';
|
|
8
|
+
import { blendScore, capResultContent, entryWeights, getAutomemConfig, logBridgeError, } from './memory-bridge-core.js';
|
|
9
|
+
import { GLOBAL_BRAIN, getGlobalBrainDir, getProjectRoot } from './memory-bridge-paths.js';
|
|
10
|
+
export async function bridgeSearchEntries(options) {
|
|
11
|
+
const backend = await getBackend(options.dbPath);
|
|
12
|
+
if (!backend)
|
|
13
|
+
return null;
|
|
14
|
+
try {
|
|
15
|
+
const { query: queryStr, limit = 10, threshold = 0.3 } = options;
|
|
16
|
+
// CLI callers pass 'all' as a no-filter sentinel — never treat it as a literal namespace
|
|
17
|
+
const namespace = options.namespace && options.namespace !== 'all' ? options.namespace : undefined;
|
|
18
|
+
const startTime = Date.now();
|
|
19
|
+
// ── Knowledge removal support (issue #106) ──────────────────────
|
|
20
|
+
// Pre-compute live document hashes for knowledge namespaces so we can
|
|
21
|
+
// (a) over-fetch to compensate for superseded entries being filtered,
|
|
22
|
+
// (b) filter them out after retrieval — ensuring removed documents
|
|
23
|
+
// are invisible to EVERY caller, not just searchKnowledge.
|
|
24
|
+
// Dynamic import breaks the circular dependency: document-pipeline
|
|
25
|
+
// imports getProjectRoot from this module.
|
|
26
|
+
let _knowledgeLive = null;
|
|
27
|
+
let _knowledgeHasMeta = false;
|
|
28
|
+
let _isSupersededKey = null;
|
|
29
|
+
const knowledgeFilterActive = namespace?.startsWith('knowledge:') && !options.includeSuperseded;
|
|
30
|
+
if (knowledgeFilterActive) {
|
|
31
|
+
try {
|
|
32
|
+
const dp = await import('../knowledge/document-pipeline.js');
|
|
33
|
+
const rootDir = options.dbPath === GLOBAL_BRAIN
|
|
34
|
+
? getGlobalBrainDir()
|
|
35
|
+
: (options.rootDir ?? getProjectRoot());
|
|
36
|
+
_knowledgeLive = dp.liveContentHashes(rootDir);
|
|
37
|
+
_knowledgeHasMeta = dp.hasKnowledgeMetadata(rootDir);
|
|
38
|
+
_isSupersededKey = dp.isSupersededKey;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
logBridgeError('bridgeSearchEntries.knowledgeFilter', e); /* non-fatal: skip filtering when pipeline is unavailable */
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Over-retrieve when the reranker is available: fetch more candidates so the
|
|
45
|
+
// cross-encoder can reshuffle them. The reranker trims back to `limit`.
|
|
46
|
+
// For knowledge namespaces, also over-fetch to compensate for superseded
|
|
47
|
+
// document versions that will be filtered out below.
|
|
48
|
+
const rerankerActive = !options.skipRerank && _reranker !== null && !rerankerDisabled();
|
|
49
|
+
const knowledgeLimit = _knowledgeLive && _knowledgeLive.size > 0
|
|
50
|
+
? Math.min(Math.max(limit * 20, limit), 300)
|
|
51
|
+
: limit;
|
|
52
|
+
const retrieveK = rerankerActive
|
|
53
|
+
? Math.min(knowledgeLimit * 3, Math.max(20, knowledgeLimit))
|
|
54
|
+
: knowledgeLimit;
|
|
55
|
+
let results = [];
|
|
56
|
+
let searchMethod = 'keyword';
|
|
57
|
+
// Reported to callers so "(semantic)" can never be printed over keyword hits.
|
|
58
|
+
// The two reasons for skipping the vector path are distinct and must not be
|
|
59
|
+
// conflated: a healthy model given an empty query is not a missing model.
|
|
60
|
+
let fallbackReason = !_embedder
|
|
61
|
+
? 'no-embedding-model'
|
|
62
|
+
: queryStr.length === 0
|
|
63
|
+
? 'empty-query'
|
|
64
|
+
: undefined;
|
|
65
|
+
let semanticAttempted = false;
|
|
66
|
+
if (_embedder && queryStr.length > 0) {
|
|
67
|
+
semanticAttempted = true;
|
|
68
|
+
try {
|
|
69
|
+
const queryEmbedding = await _embedder(queryStr);
|
|
70
|
+
const searchResults = await backend.search(queryEmbedding, {
|
|
71
|
+
k: retrieveK,
|
|
72
|
+
threshold,
|
|
73
|
+
filters: namespace ? { type: 'exact', namespace } : undefined,
|
|
74
|
+
});
|
|
75
|
+
const { feedbackInfluence } = getAutomemConfig();
|
|
76
|
+
results = searchResults
|
|
77
|
+
.map((r) => {
|
|
78
|
+
const weights = entryWeights(r.entry.metadata);
|
|
79
|
+
// Blend only here (semantic path): r.score is a genuine cosine similarity.
|
|
80
|
+
const blended = blendScore(r.score, weights, feedbackInfluence);
|
|
81
|
+
return {
|
|
82
|
+
id: r.entry.id,
|
|
83
|
+
key: r.entry.key,
|
|
84
|
+
content: capResultContent(r.entry.content || ''),
|
|
85
|
+
score: blended,
|
|
86
|
+
namespace: r.entry.namespace,
|
|
87
|
+
provenance: `semantic:${r.score.toFixed(3)}${blended !== r.score ? `→${blended.toFixed(3)}` : ''}`,
|
|
88
|
+
tags: r.entry.tags ?? [],
|
|
89
|
+
_createdAt: r.entry.createdAt || 0,
|
|
90
|
+
};
|
|
91
|
+
})
|
|
92
|
+
.sort((a, b) => b.score - a.score);
|
|
93
|
+
searchMethod = 'semantic';
|
|
94
|
+
fallbackReason = undefined;
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
// fall through to keyword search — but never claim this was semantic
|
|
98
|
+
fallbackReason = 'embedding-failed';
|
|
99
|
+
if (process.env.DEBUG || process.env.MONOMIND_DEBUG)
|
|
100
|
+
console.error('[memory-bridge] semantic search failed — falling back to keyword matching:', e);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Keyword search — always runs (not just as a fallback).
|
|
104
|
+
// Entries stored without embeddings are invisible to the vector path,
|
|
105
|
+
// so keyword results are merged into semantic results (union, deduplicated
|
|
106
|
+
// by key) to ensure every findable entry surfaces regardless of whether
|
|
107
|
+
// it has an embedding. Semantic hits take priority on score.
|
|
108
|
+
//
|
|
109
|
+
// Issue #66: When the backend has FTS5, keyword matching runs inside
|
|
110
|
+
// SQLite via MATCH — orders of magnitude faster than the old path that
|
|
111
|
+
// loaded up to 50k rows and scanned them in JS. The JS fallback is
|
|
112
|
+
// kept for sql.js WASM builds that lack the FTS5 extension.
|
|
113
|
+
{
|
|
114
|
+
const tokens = queryStr
|
|
115
|
+
.toLowerCase()
|
|
116
|
+
.split(/[^a-z0-9]+/)
|
|
117
|
+
.filter((t) => t.length > 1);
|
|
118
|
+
let keywordHits = [];
|
|
119
|
+
if (tokens.length) {
|
|
120
|
+
// ── FTS5 fast path ──────────────────────────────────────────
|
|
121
|
+
const fts5Results = typeof backend.keywordSearch === 'function'
|
|
122
|
+
? await backend.keywordSearch(queryStr, { namespace, limit }).catch(() => null)
|
|
123
|
+
: null;
|
|
124
|
+
if (fts5Results !== null && fts5Results.length > 0) {
|
|
125
|
+
// FTS5 rank is negative (lower = better); normalise to 0–1 against
|
|
126
|
+
// the BEST (largest-magnitude) result, not a hard floor of 1
|
|
127
|
+
// (issue #224). BM25 IDF goes to zero/negative when a query term
|
|
128
|
+
// appears in most or all of the matched rows — a small or
|
|
129
|
+
// lexically-homogeneous result set (a duplicated FTS row for one
|
|
130
|
+
// entry, per sql-schema.ts's `ensureFTS5Triggers`, was one way to
|
|
131
|
+
// reach exactly this) — so a genuinely-best (or sole) match can
|
|
132
|
+
// legitimately have |rank| < 1. A hard `Math.max(…,
|
|
133
|
+
// 1)` floor then divides that down toward 0, displaying the
|
|
134
|
+
// correct top match as ~0.00 instead of its best-available 1.0.
|
|
135
|
+
// Mirrors the identical fix already applied to the JS BM25
|
|
136
|
+
// fallback below (#126-review): only fall back to a floor of 1
|
|
137
|
+
// when every rank is genuinely 0 (nothing to normalise against),
|
|
138
|
+
// never merely because the raw magnitude is under 1.
|
|
139
|
+
const rawMaxRank = Math.max(...fts5Results.map((r) => Math.abs(r.rank)));
|
|
140
|
+
const maxRank = rawMaxRank > 0 ? rawMaxRank : 1;
|
|
141
|
+
keywordHits = fts5Results.map((r) => {
|
|
142
|
+
const score = rawMaxRank > 0 ? Math.abs(r.rank) / maxRank : 1;
|
|
143
|
+
return {
|
|
144
|
+
id: r.id,
|
|
145
|
+
key: r.key,
|
|
146
|
+
content: capResultContent(r.content || ''),
|
|
147
|
+
score,
|
|
148
|
+
namespace: r.namespace,
|
|
149
|
+
provenance: `keyword-fts5:${score.toFixed(2)}`,
|
|
150
|
+
tags: [],
|
|
151
|
+
_createdAt: 0,
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
// ── JS fallback (no FTS5 or empty FTS5 result) ────────────
|
|
157
|
+
const entries = await backend.query({
|
|
158
|
+
type: 'exact',
|
|
159
|
+
...(namespace ? { namespace } : {}),
|
|
160
|
+
limit: 50000,
|
|
161
|
+
});
|
|
162
|
+
// #126: Bm25Index.build() costs real time at scale (measured in
|
|
163
|
+
// bm25-index.ts's own header: ~113ms/673 chunks, ~1.7s/12.5k
|
|
164
|
+
// chunks) — this fallback can be handed up to 50,000 entries, so
|
|
165
|
+
// building a fresh index on every call without a cap would make
|
|
166
|
+
// large stores' searches slower, not better. Below the cap, BM25
|
|
167
|
+
// (proper IDF weighting) replaces the naive token-overlap-fraction
|
|
168
|
+
// scan; above it, the fast scan keeps running so latency never
|
|
169
|
+
// regresses. MONOMIND_BM25=0 disables this arm entirely (mirrors
|
|
170
|
+
// the MONOMIND_RERANKER kill-switch).
|
|
171
|
+
const BM25_ENTRY_CAP = 1500;
|
|
172
|
+
const bm25Enabled = (process.env.MONOMIND_BM25 ?? '1') !== '0';
|
|
173
|
+
let bm25Ok = false;
|
|
174
|
+
if (bm25Enabled && entries.length > 0 && entries.length <= BM25_ENTRY_CAP) {
|
|
175
|
+
try {
|
|
176
|
+
const { Bm25Index } = await import('./bm25-index.js');
|
|
177
|
+
// #126-review: index by the entry's ARRAY POSITION, not e.key —
|
|
178
|
+
// memory_entries only enforces UNIQUE(namespace, key), so a bare
|
|
179
|
+
// key string can legitimately repeat across namespaces (e.g. two
|
|
180
|
+
// agents each storing a 'summary' key in their own namespace).
|
|
181
|
+
// Keying by e.key alone collided in that case: every BM25 hit
|
|
182
|
+
// sharing that key string resolved to whichever entry happened
|
|
183
|
+
// to be inserted last into the lookup map, silently returning
|
|
184
|
+
// the wrong entry's id/content/namespace.
|
|
185
|
+
const chunks = entries.map((e, i) => ({
|
|
186
|
+
key: String(i),
|
|
187
|
+
text: `${e.key || ''} ${e.content || ''}`,
|
|
188
|
+
}));
|
|
189
|
+
const idx = Bm25Index.build(chunks, () => false); // no superseded concept at this generic KV level — filtered later by callers that care
|
|
190
|
+
const hits = idx.search(queryStr, limit);
|
|
191
|
+
// #126-review: Math.max(..., 1) as a divide-by-zero guard also
|
|
192
|
+
// silently floors the normalization divisor whenever every real
|
|
193
|
+
// score is < 1 (common for small/sparse corpora — exactly the
|
|
194
|
+
// regime this capped fallback runs in), so the top hit stopped
|
|
195
|
+
// normalizing to 1.0 as the comment below claims. Only fall
|
|
196
|
+
// back to 1 when there is no positive score to divide by.
|
|
197
|
+
const rawMax = hits.length ? Math.max(...hits.map((h) => h.score)) : 0;
|
|
198
|
+
const maxScore = rawMax > 0 ? rawMax : 1;
|
|
199
|
+
keywordHits = hits.map((h) => {
|
|
200
|
+
const e = entries[Number(h.key)];
|
|
201
|
+
const normalized = h.score / maxScore; // BM25 scores aren't comparable across queries/corpora — normalise 0-1 like the FTS5 path does
|
|
202
|
+
return {
|
|
203
|
+
id: e.id,
|
|
204
|
+
key: e.key,
|
|
205
|
+
content: capResultContent(e.content || ''),
|
|
206
|
+
score: normalized,
|
|
207
|
+
namespace: e.namespace,
|
|
208
|
+
provenance: `keyword-bm25:${normalized.toFixed(2)}`,
|
|
209
|
+
tags: e.tags ?? [],
|
|
210
|
+
_createdAt: e.createdAt || 0,
|
|
211
|
+
};
|
|
212
|
+
});
|
|
213
|
+
bm25Ok = true;
|
|
214
|
+
}
|
|
215
|
+
catch (e) {
|
|
216
|
+
// #126-review: BM25 build/search had no local try/catch, unlike
|
|
217
|
+
// every other sub-path in this function — an exception here
|
|
218
|
+
// used to propagate to the function's single outer catch,
|
|
219
|
+
// discarding the whole call (including already-computed
|
|
220
|
+
// semantic results) instead of degrading to the naive scan
|
|
221
|
+
// below, which is what every other keyword-path failure does.
|
|
222
|
+
if (process.env.DEBUG || process.env.MONOMIND_DEBUG)
|
|
223
|
+
console.error('[memory-bridge] BM25 keyword search failed — falling back to token-overlap scan:', e);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (!bm25Ok) {
|
|
227
|
+
keywordHits = entries
|
|
228
|
+
.map((e) => {
|
|
229
|
+
const haystack = `${e.key || ''} ${e.content || ''}`.toLowerCase();
|
|
230
|
+
const hits = tokens.filter((t) => haystack.includes(t)).length;
|
|
231
|
+
return { e, score: hits / tokens.length };
|
|
232
|
+
})
|
|
233
|
+
.filter((x) => x.score > 0)
|
|
234
|
+
.sort((a, b) => b.score - a.score)
|
|
235
|
+
.slice(0, limit)
|
|
236
|
+
.map(({ e, score }) => ({
|
|
237
|
+
id: e.id,
|
|
238
|
+
key: e.key,
|
|
239
|
+
content: capResultContent(e.content || ''),
|
|
240
|
+
// Raw token-overlap fraction, NOT rescaled to look like a cosine.
|
|
241
|
+
score,
|
|
242
|
+
namespace: e.namespace,
|
|
243
|
+
provenance: `keyword:${score.toFixed(2)}`,
|
|
244
|
+
tags: e.tags ?? [],
|
|
245
|
+
_createdAt: e.createdAt || 0,
|
|
246
|
+
}));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Issue #223/#224 follow-up: FTS5/BM25 ranks above are normalised
|
|
250
|
+
// RELATIVE to the best result in this call's own small candidate set
|
|
251
|
+
// (score = |rank| / maxRank), so the top — or sole — hit always
|
|
252
|
+
// lands at ~1.0 by construction, no matter how weak the actual
|
|
253
|
+
// match is. `options.threshold` compared against that already-
|
|
254
|
+
// inflated score can never reject a top/sole hit, so a single
|
|
255
|
+
// coincidental partial-token overlap looks exactly as confident as
|
|
256
|
+
// a genuine strong match. Gate on independent evidence instead: how
|
|
257
|
+
// much of the QUERY the candidate actually covers. This can only
|
|
258
|
+
// narrow the result set (never rescue something already excluded),
|
|
259
|
+
// and doesn't touch the rank-normalisation math other callers rely on.
|
|
260
|
+
keywordHits = keywordHits.filter((h) => {
|
|
261
|
+
if (h.score < threshold)
|
|
262
|
+
return false;
|
|
263
|
+
const haystack = `${h.key || ''} ${h.content || ''}`.toLowerCase();
|
|
264
|
+
const matchedFraction = tokens.filter((t) => haystack.includes(t)).length / tokens.length;
|
|
265
|
+
return matchedFraction >= threshold;
|
|
266
|
+
});
|
|
267
|
+
if (results.length === 0) {
|
|
268
|
+
// No semantic results — keyword is all we have.
|
|
269
|
+
results = keywordHits;
|
|
270
|
+
searchMethod = semanticAttempted ? 'keyword-fallback' : 'keyword';
|
|
271
|
+
if (semanticAttempted && !fallbackReason)
|
|
272
|
+
fallbackReason = 'no-semantic-matches';
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
// Merge: union deduplicated by key, semantic wins on duplicates.
|
|
276
|
+
// Extras are flagged _keywordOnly so the reranking step below can
|
|
277
|
+
// skip them — the cross-encoder scores r.content, and an entry
|
|
278
|
+
// findable ONLY by keyword (e.g. a placeholder/near-empty content
|
|
279
|
+
// whose relevance lives in the key) reranks as noise and gets
|
|
280
|
+
// sliced off by the final `limit`, silently defeating the whole
|
|
281
|
+
// point of merging it in. Guaranteed inclusion has to survive
|
|
282
|
+
// reranking, not just the merge.
|
|
283
|
+
const seenKeys = new Set(results.map((r) => r.key));
|
|
284
|
+
const extras = keywordHits.filter((kh) => !seenKeys.has(kh.key));
|
|
285
|
+
if (extras.length) {
|
|
286
|
+
results = [...results, ...extras.map((e) => ({ ...e, _keywordOnly: true }))];
|
|
287
|
+
// searchMethod stays 'semantic' — the primary path succeeded;
|
|
288
|
+
// keyword only supplemented entries that lacked embeddings.
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
else if (results.length === 0) {
|
|
293
|
+
// Empty token list AND no semantic results — nothing to search.
|
|
294
|
+
searchMethod = semanticAttempted ? 'keyword-fallback' : 'keyword';
|
|
295
|
+
if (semanticAttempted && !fallbackReason)
|
|
296
|
+
fallbackReason = 'no-semantic-matches';
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// Filter stale entries based on automem config — skip for knowledge
|
|
300
|
+
// namespaces (documents should remain searchable indefinitely)
|
|
301
|
+
// Stale filtering is per-RESULT namespace (documents stay searchable
|
|
302
|
+
// forever) — keying it on the query's namespace filter meant an
|
|
303
|
+
// all-namespace search silently dropped knowledge:* results past the
|
|
304
|
+
// stale cutoff.
|
|
305
|
+
// org:* (cross-run org memory) and rules are durable learned state like
|
|
306
|
+
// documents — the stale cliff silently erased org recall after a week.
|
|
307
|
+
const durableNs = (ns) => ns.startsWith('knowledge:') ||
|
|
308
|
+
ns.startsWith('org:') ||
|
|
309
|
+
ns.startsWith('agent:') ||
|
|
310
|
+
ns.startsWith('kg:') ||
|
|
311
|
+
ns === 'rules';
|
|
312
|
+
const isKnowledgeNs = namespace ? durableNs(namespace) : false;
|
|
313
|
+
if (!isKnowledgeNs) {
|
|
314
|
+
const { staleDays } = getAutomemConfig();
|
|
315
|
+
const staleCutoff = Date.now() - staleDays * 86400000;
|
|
316
|
+
results = results.filter((r) => durableNs(String(r.namespace ?? '')) || !r._createdAt || r._createdAt > staleCutoff);
|
|
317
|
+
}
|
|
318
|
+
results.forEach((r) => delete r._createdAt);
|
|
319
|
+
// ── Knowledge superseded filtering (issue #106) ─────────────────
|
|
320
|
+
// Remove document chunks whose content hash is no longer current
|
|
321
|
+
// (i.e. the document was removed via `knowledge_remove` or replaced
|
|
322
|
+
// by a newer ingest). This runs inside the bridge so every caller —
|
|
323
|
+
// embeddings_search, CLI `memory search`, and searchKnowledge — gets
|
|
324
|
+
// the same removal guarantee.
|
|
325
|
+
if (_knowledgeLive && _isSupersededKey && results.length > 0) {
|
|
326
|
+
results = results.filter((r) => !_isSupersededKey?.(String(r.key ?? ''), _knowledgeLive, _knowledgeHasMeta));
|
|
327
|
+
// Trim back to the originally requested limit after overfetch — but
|
|
328
|
+
// never let this blind size-based cut drop a _keywordOnly extra (see
|
|
329
|
+
// the merge above): reserve its slot and trim the rest first.
|
|
330
|
+
if (results.length > limit) {
|
|
331
|
+
const extras = results.filter((r) => r._keywordOnly);
|
|
332
|
+
const main = results.filter((r) => !r._keywordOnly);
|
|
333
|
+
const keep = Math.max(0, limit - extras.length);
|
|
334
|
+
results = [...main.slice(0, keep), ...extras.slice(0, limit)];
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// Keyword-only extras are guaranteed to survive to the final result —
|
|
338
|
+
// pull them out before reranking so the cross-encoder (which scores
|
|
339
|
+
// r.content only) can't outrank them into oblivion, then reserve their
|
|
340
|
+
// slots when re-merging below.
|
|
341
|
+
const keywordOnlyResults = results.filter((r) => r._keywordOnly);
|
|
342
|
+
let rerankPool = results.filter((r) => !r._keywordOnly);
|
|
343
|
+
// ── Cross-encoder reranking ──────────────────────────────────────
|
|
344
|
+
// Fires only when: reranker loaded, >1 result, not explicitly skipped.
|
|
345
|
+
// Lazy-load on first qualifying search so startup stays fast.
|
|
346
|
+
let reranked = false;
|
|
347
|
+
if (!options.skipRerank && !rerankerDisabled() && rerankPool.length > 1) {
|
|
348
|
+
if (!_reranker && !_rerankerPromise) {
|
|
349
|
+
// First qualifying search — kick off the lazy load. This search
|
|
350
|
+
// proceeds without reranking; the NEXT search will use it.
|
|
351
|
+
loadReranker().catch(() => {
|
|
352
|
+
/* swallowed — retry next time */
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
if (_reranker) {
|
|
356
|
+
const rr = await rerankResults(queryStr, rerankPool, limit);
|
|
357
|
+
rerankPool = rr.reranked;
|
|
358
|
+
reranked = rr.applied;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (keywordOnlyResults.length) {
|
|
362
|
+
const keep = Math.max(0, limit - keywordOnlyResults.length);
|
|
363
|
+
results = [...rerankPool.slice(0, keep), ...keywordOnlyResults.slice(0, limit)];
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
results = rerankPool;
|
|
367
|
+
}
|
|
368
|
+
results.forEach((r) => delete r._keywordOnly);
|
|
369
|
+
return {
|
|
370
|
+
success: true,
|
|
371
|
+
results,
|
|
372
|
+
searchTime: Date.now() - startTime,
|
|
373
|
+
searchMethod,
|
|
374
|
+
reranked,
|
|
375
|
+
...(searchMethod === 'semantic' ? {} : { fallbackReason }),
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
catch (e) {
|
|
379
|
+
logBridgeError('bridgeSearchEntries', e);
|
|
380
|
+
return null;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=memory-bridge-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-bridge-search.js","sourceRoot":"","sources":["../../../src/memory/memory-bridge-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Bridge — session lifecycle rows (start, end, latest) in the
|
|
3
|
+
* `sessions` namespace. Split out of memory-bridge.ts, which re-exports the
|
|
4
|
+
* public symbols.
|
|
5
|
+
*/
|
|
6
|
+
export declare function bridgeSessionStart(options: {
|
|
7
|
+
sessionId: string;
|
|
8
|
+
agentId?: string;
|
|
9
|
+
metadata?: Record<string, unknown>;
|
|
10
|
+
dbPath?: string;
|
|
11
|
+
}): Promise<{
|
|
12
|
+
success: boolean;
|
|
13
|
+
id: string;
|
|
14
|
+
error?: string;
|
|
15
|
+
} | null>;
|
|
16
|
+
export declare function bridgeSessionEnd(options: {
|
|
17
|
+
sessionId: string;
|
|
18
|
+
summary?: string;
|
|
19
|
+
metrics?: Record<string, unknown>;
|
|
20
|
+
dbPath?: string;
|
|
21
|
+
}): Promise<{
|
|
22
|
+
success: boolean;
|
|
23
|
+
error?: string;
|
|
24
|
+
} | null>;
|
|
25
|
+
/** The most recently started session recorded by bridgeSessionStart, read
|
|
26
|
+
* back from its row — or null when there is none (or no backend). */
|
|
27
|
+
export declare function bridgeLatestSession(options: {
|
|
28
|
+
excludeSessionId?: string;
|
|
29
|
+
dbPath?: string;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
sessionId: string;
|
|
32
|
+
status: string;
|
|
33
|
+
startedAt: string;
|
|
34
|
+
endedAt?: string;
|
|
35
|
+
summary?: string;
|
|
36
|
+
metrics?: Record<string, unknown>;
|
|
37
|
+
} | null>;
|
|
38
|
+
//# sourceMappingURL=memory-bridge-sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-bridge-sessions.d.ts","sourceRoot":"","sources":["../../../src/memory/memory-bridge-sessions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,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;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAoCvD;AAED;sEACsE;AACtE,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC;IACV,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,GAAG,IAAI,CAAC,CAuCR"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Bridge — session lifecycle rows (start, end, latest) in the
|
|
3
|
+
* `sessions` namespace. Split out of memory-bridge.ts, which re-exports the
|
|
4
|
+
* public symbols.
|
|
5
|
+
*/
|
|
6
|
+
import { flushBackend, getBackend } from './memory-bridge-backend.js';
|
|
7
|
+
import { logBridgeError } from './memory-bridge-core.js';
|
|
8
|
+
import { bridgeStoreEntry } from './memory-bridge-store.js';
|
|
9
|
+
// ===== Session lifecycle =====
|
|
10
|
+
export async function bridgeSessionStart(options) {
|
|
11
|
+
return bridgeStoreEntry({
|
|
12
|
+
key: `session_${options.sessionId}`,
|
|
13
|
+
value: JSON.stringify({
|
|
14
|
+
sessionId: options.sessionId,
|
|
15
|
+
agentId: options.agentId,
|
|
16
|
+
startedAt: Date.now(),
|
|
17
|
+
status: 'active',
|
|
18
|
+
metadata: options.metadata ?? {},
|
|
19
|
+
}),
|
|
20
|
+
namespace: 'sessions',
|
|
21
|
+
tags: ['session', 'active'],
|
|
22
|
+
generateEmbeddingFlag: false,
|
|
23
|
+
dbPath: options.dbPath,
|
|
24
|
+
upsert: true,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export async function bridgeSessionEnd(options) {
|
|
28
|
+
const backend = await getBackend(options.dbPath);
|
|
29
|
+
if (!backend)
|
|
30
|
+
return null;
|
|
31
|
+
try {
|
|
32
|
+
const existing = await backend.getByKey('sessions', `session_${options.sessionId}`);
|
|
33
|
+
// Nothing is written for a session that was never started — do not report
|
|
34
|
+
// that as a recorded session end.
|
|
35
|
+
if (!existing)
|
|
36
|
+
return { success: false, error: `no session ${options.sessionId} to end` };
|
|
37
|
+
let data = {};
|
|
38
|
+
try {
|
|
39
|
+
data = JSON.parse(existing.content);
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
if (process.env.DEBUG || process.env.MONOMIND_DEBUG)
|
|
43
|
+
console.error('[memory-bridge] session content failed to parse — ending session with empty prior state:', e);
|
|
44
|
+
}
|
|
45
|
+
const updated = await backend.update(existing.id, {
|
|
46
|
+
content: JSON.stringify({
|
|
47
|
+
...data,
|
|
48
|
+
status: 'ended',
|
|
49
|
+
endedAt: Date.now(),
|
|
50
|
+
summary: options.summary,
|
|
51
|
+
metrics: options.metrics ?? {},
|
|
52
|
+
}),
|
|
53
|
+
tags: ['session', 'ended'],
|
|
54
|
+
});
|
|
55
|
+
if (!updated)
|
|
56
|
+
return { success: false, error: `session ${options.sessionId} vanished` };
|
|
57
|
+
await flushBackend(backend);
|
|
58
|
+
return { success: true };
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
logBridgeError('bridgeSessionEnd', e);
|
|
62
|
+
return { success: false };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** The most recently started session recorded by bridgeSessionStart, read
|
|
66
|
+
* back from its row — or null when there is none (or no backend). */
|
|
67
|
+
export async function bridgeLatestSession(options) {
|
|
68
|
+
const backend = await getBackend(options.dbPath);
|
|
69
|
+
if (!backend)
|
|
70
|
+
return null;
|
|
71
|
+
try {
|
|
72
|
+
// Newest two rows: one of them may be the excluded (current) session.
|
|
73
|
+
const rows = await backend.query({
|
|
74
|
+
type: 'exact',
|
|
75
|
+
namespace: 'sessions',
|
|
76
|
+
keyPrefix: 'session_',
|
|
77
|
+
sortField: 'createdAt',
|
|
78
|
+
sortDirection: 'desc',
|
|
79
|
+
limit: 2,
|
|
80
|
+
});
|
|
81
|
+
for (const row of rows) {
|
|
82
|
+
let data;
|
|
83
|
+
try {
|
|
84
|
+
data = JSON.parse(row.content);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (typeof data?.sessionId !== 'string' || data.sessionId === options.excludeSessionId)
|
|
90
|
+
continue;
|
|
91
|
+
return {
|
|
92
|
+
sessionId: data.sessionId,
|
|
93
|
+
status: typeof data.status === 'string' ? data.status : 'unknown',
|
|
94
|
+
startedAt: new Date(data.startedAt ?? row.createdAt).toISOString(),
|
|
95
|
+
...(typeof data.endedAt === 'number'
|
|
96
|
+
? { endedAt: new Date(data.endedAt).toISOString() }
|
|
97
|
+
: {}),
|
|
98
|
+
...(typeof data.summary === 'string' ? { summary: data.summary } : {}),
|
|
99
|
+
...(data.metrics && typeof data.metrics === 'object' ? { metrics: data.metrics } : {}),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
logBridgeError('bridgeLatestSession', e);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=memory-bridge-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-bridge-sessions.js","sourceRoot":"","sources":["../../../src/memory/memory-bridge-sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Bridge — the write path: bridgeStoreEntry (upsert identity, dedup
|
|
3
|
+
* gate, compare-and-swap) and the usage-recording helper it shares with the
|
|
4
|
+
* feedback loop. Split out of memory-bridge.ts, which re-exports the public
|
|
5
|
+
* symbols.
|
|
6
|
+
*/
|
|
7
|
+
export declare function bridgeStoreEntry(options: {
|
|
8
|
+
key: string;
|
|
9
|
+
value: string;
|
|
10
|
+
namespace?: string;
|
|
11
|
+
generateEmbeddingFlag?: boolean;
|
|
12
|
+
tags?: string[];
|
|
13
|
+
ttl?: number;
|
|
14
|
+
dbPath?: string;
|
|
15
|
+
upsert?: boolean;
|
|
16
|
+
/** Structured metadata persisted on the entry (KG nodes/edges, weights, provenance). */
|
|
17
|
+
metadata?: Record<string, unknown>;
|
|
18
|
+
/** Compare-and-swap guard for a read-merge-write caller (memory-kg.ts's
|
|
19
|
+
* claim-ledger merge, K5). `'absent'` requires no row to exist yet at this
|
|
20
|
+
* key; a number requires the row's CURRENT stored version to still equal
|
|
21
|
+
* it. Either way, the check and the write are one atomic SQL statement
|
|
22
|
+
* (see SqlBackend.storeIfVersion/storeIfAbsent) — a caller that read this
|
|
23
|
+
* row (or found it absent) moments ago finds out here, via `conflict`,
|
|
24
|
+
* whether a concurrent writer beat it, instead of silently overwriting (or
|
|
25
|
+
* being overwritten by) that writer's update. Omit for the plain
|
|
26
|
+
* last-write-wins upsert every other caller already relies on. */
|
|
27
|
+
ifVersion?: number | 'absent';
|
|
28
|
+
}): Promise<{
|
|
29
|
+
success: boolean;
|
|
30
|
+
id: string;
|
|
31
|
+
embedding?: {
|
|
32
|
+
dimensions: number;
|
|
33
|
+
model: string;
|
|
34
|
+
};
|
|
35
|
+
guarded?: boolean;
|
|
36
|
+
cached?: boolean;
|
|
37
|
+
attested?: boolean;
|
|
38
|
+
duplicate?: boolean;
|
|
39
|
+
/** True when `ifVersion` did not match the row's current state — the row
|
|
40
|
+
* changed (or was created) concurrently. `success` is false alongside this;
|
|
41
|
+
* nothing was written. The caller must re-read and retry, not treat this
|
|
42
|
+
* as a transient error. */
|
|
43
|
+
conflict?: boolean;
|
|
44
|
+
error?: string;
|
|
45
|
+
} | null>;
|
|
46
|
+
/** Ids a usage/feedback pass could not train, with why — so `updated: 0` and
|
|
47
|
+
* `applied: 0` are never a silent success. `not_found` means the id resolved
|
|
48
|
+
* to no entry (deleted, or orphaned by an older re-ingest); `error` means the
|
|
49
|
+
* entry existed but could not be updated. */
|
|
50
|
+
export type SkippedEntry = {
|
|
51
|
+
id: string;
|
|
52
|
+
reason: 'not_found' | 'error';
|
|
53
|
+
};
|
|
54
|
+
export declare function recordUsageOnBackend(backend: any, entryIds: string[]): Promise<{
|
|
55
|
+
updated: number;
|
|
56
|
+
skipped: SkippedEntry[];
|
|
57
|
+
}>;
|
|
58
|
+
//# sourceMappingURL=memory-bridge-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-bridge-store.d.ts","sourceRoot":"","sources":["../../../src/memory/memory-bridge-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC;;;;;;;;uEAQmE;IACnE,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC/B,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;gCAG4B;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CAAC,CAqLR;AAED;;;8CAG8C;AAC9C,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAA;CAAE,CAAC;AAEzE,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC,CAuBvD"}
|