@memtensor/memos-local-openclaw-plugin 1.0.6-beta.8 → 1.0.6
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/openclaw.plugin.json +1 -1
- package/package.json +3 -5
- package/prebuilds/darwin-arm64/better_sqlite3.node +0 -0
- package/prebuilds/darwin-x64/better_sqlite3.node +0 -0
- package/prebuilds/linux-x64/better_sqlite3.node +0 -0
- package/prebuilds/win32-x64/better_sqlite3.node +0 -0
- package/scripts/postinstall.cjs +44 -44
- package/skill/memos-memory-guide/SKILL.md +20 -0
- package/src/update-check.ts +2 -7
- package/src/viewer/html.ts +4 -4
- package/src/viewer/server.ts +13 -3
- package/telemetry.credentials.json +5 -0
- package/dist/capture/index.d.ts +0 -26
- package/dist/capture/index.d.ts.map +0 -1
- package/dist/capture/index.js +0 -283
- package/dist/capture/index.js.map +0 -1
- package/dist/client/connector.d.ts +0 -34
- package/dist/client/connector.d.ts.map +0 -1
- package/dist/client/connector.js +0 -381
- package/dist/client/connector.js.map +0 -1
- package/dist/client/hub.d.ts +0 -61
- package/dist/client/hub.d.ts.map +0 -1
- package/dist/client/hub.js +0 -174
- package/dist/client/hub.js.map +0 -1
- package/dist/client/skill-sync.d.ts +0 -36
- package/dist/client/skill-sync.d.ts.map +0 -1
- package/dist/client/skill-sync.js +0 -226
- package/dist/client/skill-sync.js.map +0 -1
- package/dist/config.d.ts +0 -5
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -171
- package/dist/config.js.map +0 -1
- package/dist/embedding/index.d.ts +0 -14
- package/dist/embedding/index.d.ts.map +0 -1
- package/dist/embedding/index.js +0 -105
- package/dist/embedding/index.js.map +0 -1
- package/dist/embedding/local.d.ts +0 -3
- package/dist/embedding/local.d.ts.map +0 -1
- package/dist/embedding/local.js +0 -66
- package/dist/embedding/local.js.map +0 -1
- package/dist/embedding/providers/cohere.d.ts +0 -4
- package/dist/embedding/providers/cohere.d.ts.map +0 -1
- package/dist/embedding/providers/cohere.js +0 -57
- package/dist/embedding/providers/cohere.js.map +0 -1
- package/dist/embedding/providers/gemini.d.ts +0 -3
- package/dist/embedding/providers/gemini.d.ts.map +0 -1
- package/dist/embedding/providers/gemini.js +0 -31
- package/dist/embedding/providers/gemini.js.map +0 -1
- package/dist/embedding/providers/mistral.d.ts +0 -3
- package/dist/embedding/providers/mistral.d.ts.map +0 -1
- package/dist/embedding/providers/mistral.js +0 -25
- package/dist/embedding/providers/mistral.js.map +0 -1
- package/dist/embedding/providers/openai.d.ts +0 -3
- package/dist/embedding/providers/openai.d.ts.map +0 -1
- package/dist/embedding/providers/openai.js +0 -35
- package/dist/embedding/providers/openai.js.map +0 -1
- package/dist/embedding/providers/voyage.d.ts +0 -3
- package/dist/embedding/providers/voyage.d.ts.map +0 -1
- package/dist/embedding/providers/voyage.js +0 -25
- package/dist/embedding/providers/voyage.js.map +0 -1
- package/dist/hub/auth.d.ts +0 -19
- package/dist/hub/auth.d.ts.map +0 -1
- package/dist/hub/auth.js +0 -70
- package/dist/hub/auth.js.map +0 -1
- package/dist/hub/server.d.ts +0 -52
- package/dist/hub/server.d.ts.map +0 -1
- package/dist/hub/server.js +0 -1197
- package/dist/hub/server.js.map +0 -1
- package/dist/hub/user-manager.d.ts +0 -40
- package/dist/hub/user-manager.d.ts.map +0 -1
- package/dist/hub/user-manager.js +0 -153
- package/dist/hub/user-manager.js.map +0 -1
- package/dist/index.d.ts +0 -46
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -82
- package/dist/index.js.map +0 -1
- package/dist/ingest/chunker.d.ts +0 -15
- package/dist/ingest/chunker.d.ts.map +0 -1
- package/dist/ingest/chunker.js +0 -192
- package/dist/ingest/chunker.js.map +0 -1
- package/dist/ingest/dedup.d.ts +0 -19
- package/dist/ingest/dedup.d.ts.map +0 -1
- package/dist/ingest/dedup.js +0 -50
- package/dist/ingest/dedup.js.map +0 -1
- package/dist/ingest/providers/anthropic.d.ts +0 -21
- package/dist/ingest/providers/anthropic.d.ts.map +0 -1
- package/dist/ingest/providers/anthropic.js +0 -314
- package/dist/ingest/providers/anthropic.js.map +0 -1
- package/dist/ingest/providers/bedrock.d.ts +0 -21
- package/dist/ingest/providers/bedrock.d.ts.map +0 -1
- package/dist/ingest/providers/bedrock.js +0 -313
- package/dist/ingest/providers/bedrock.js.map +0 -1
- package/dist/ingest/providers/gemini.d.ts +0 -21
- package/dist/ingest/providers/gemini.d.ts.map +0 -1
- package/dist/ingest/providers/gemini.js +0 -298
- package/dist/ingest/providers/gemini.js.map +0 -1
- package/dist/ingest/providers/index.d.ts +0 -68
- package/dist/ingest/providers/index.d.ts.map +0 -1
- package/dist/ingest/providers/index.js +0 -611
- package/dist/ingest/providers/index.js.map +0 -1
- package/dist/ingest/providers/openai.d.ts +0 -30
- package/dist/ingest/providers/openai.d.ts.map +0 -1
- package/dist/ingest/providers/openai.js +0 -387
- package/dist/ingest/providers/openai.js.map +0 -1
- package/dist/ingest/task-processor.d.ts +0 -91
- package/dist/ingest/task-processor.d.ts.map +0 -1
- package/dist/ingest/task-processor.js +0 -478
- package/dist/ingest/task-processor.js.map +0 -1
- package/dist/ingest/worker.d.ts +0 -23
- package/dist/ingest/worker.d.ts.map +0 -1
- package/dist/ingest/worker.js +0 -255
- package/dist/ingest/worker.js.map +0 -1
- package/dist/openclaw-api.d.ts +0 -53
- package/dist/openclaw-api.d.ts.map +0 -1
- package/dist/openclaw-api.js +0 -189
- package/dist/openclaw-api.js.map +0 -1
- package/dist/recall/engine.d.ts +0 -28
- package/dist/recall/engine.d.ts.map +0 -1
- package/dist/recall/engine.js +0 -343
- package/dist/recall/engine.js.map +0 -1
- package/dist/recall/mmr.d.ts +0 -17
- package/dist/recall/mmr.d.ts.map +0 -1
- package/dist/recall/mmr.js +0 -53
- package/dist/recall/mmr.js.map +0 -1
- package/dist/recall/recency.d.ts +0 -20
- package/dist/recall/recency.d.ts.map +0 -1
- package/dist/recall/recency.js +0 -26
- package/dist/recall/recency.js.map +0 -1
- package/dist/recall/rrf.d.ts +0 -16
- package/dist/recall/rrf.d.ts.map +0 -1
- package/dist/recall/rrf.js +0 -15
- package/dist/recall/rrf.js.map +0 -1
- package/dist/shared/llm-call.d.ts +0 -30
- package/dist/shared/llm-call.d.ts.map +0 -1
- package/dist/shared/llm-call.js +0 -253
- package/dist/shared/llm-call.js.map +0 -1
- package/dist/sharing/types.contract.d.ts +0 -2
- package/dist/sharing/types.contract.d.ts.map +0 -1
- package/dist/sharing/types.contract.js +0 -3
- package/dist/sharing/types.contract.js.map +0 -1
- package/dist/sharing/types.d.ts +0 -80
- package/dist/sharing/types.d.ts.map +0 -1
- package/dist/sharing/types.js +0 -3
- package/dist/sharing/types.js.map +0 -1
- package/dist/skill/bundled-memory-guide.d.ts +0 -2
- package/dist/skill/bundled-memory-guide.d.ts.map +0 -1
- package/dist/skill/bundled-memory-guide.js +0 -45
- package/dist/skill/bundled-memory-guide.js.map +0 -1
- package/dist/skill/evaluator.d.ts +0 -28
- package/dist/skill/evaluator.d.ts.map +0 -1
- package/dist/skill/evaluator.js +0 -169
- package/dist/skill/evaluator.js.map +0 -1
- package/dist/skill/evolver.d.ts +0 -48
- package/dist/skill/evolver.d.ts.map +0 -1
- package/dist/skill/evolver.js +0 -406
- package/dist/skill/evolver.js.map +0 -1
- package/dist/skill/generator.d.ts +0 -26
- package/dist/skill/generator.d.ts.map +0 -1
- package/dist/skill/generator.js +0 -521
- package/dist/skill/generator.js.map +0 -1
- package/dist/skill/installer.d.ts +0 -42
- package/dist/skill/installer.d.ts.map +0 -1
- package/dist/skill/installer.js +0 -165
- package/dist/skill/installer.js.map +0 -1
- package/dist/skill/upgrader.d.ts +0 -19
- package/dist/skill/upgrader.d.ts.map +0 -1
- package/dist/skill/upgrader.js +0 -366
- package/dist/skill/upgrader.js.map +0 -1
- package/dist/skill/validator.d.ts +0 -30
- package/dist/skill/validator.d.ts.map +0 -1
- package/dist/skill/validator.js +0 -272
- package/dist/skill/validator.js.map +0 -1
- package/dist/storage/ensure-binding.d.ts +0 -12
- package/dist/storage/ensure-binding.d.ts.map +0 -1
- package/dist/storage/ensure-binding.js +0 -53
- package/dist/storage/ensure-binding.js.map +0 -1
- package/dist/storage/sqlite.d.ts +0 -649
- package/dist/storage/sqlite.d.ts.map +0 -1
- package/dist/storage/sqlite.js +0 -2657
- package/dist/storage/sqlite.js.map +0 -1
- package/dist/storage/vector.d.ts +0 -12
- package/dist/storage/vector.d.ts.map +0 -1
- package/dist/storage/vector.js +0 -34
- package/dist/storage/vector.js.map +0 -1
- package/dist/telemetry.d.ts +0 -47
- package/dist/telemetry.d.ts.map +0 -1
- package/dist/telemetry.js +0 -312
- package/dist/telemetry.js.map +0 -1
- package/dist/tools/index.d.ts +0 -5
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -12
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/memory-get.d.ts +0 -4
- package/dist/tools/memory-get.d.ts.map +0 -1
- package/dist/tools/memory-get.js +0 -64
- package/dist/tools/memory-get.js.map +0 -1
- package/dist/tools/memory-search.d.ts +0 -7
- package/dist/tools/memory-search.d.ts.map +0 -1
- package/dist/tools/memory-search.js +0 -84
- package/dist/tools/memory-search.js.map +0 -1
- package/dist/tools/memory-timeline.d.ts +0 -4
- package/dist/tools/memory-timeline.d.ts.map +0 -1
- package/dist/tools/memory-timeline.js +0 -73
- package/dist/tools/memory-timeline.js.map +0 -1
- package/dist/tools/network-memory-detail.d.ts +0 -4
- package/dist/tools/network-memory-detail.d.ts.map +0 -1
- package/dist/tools/network-memory-detail.js +0 -34
- package/dist/tools/network-memory-detail.js.map +0 -1
- package/dist/types.d.ts +0 -330
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -38
- package/dist/types.js.map +0 -1
- package/dist/update-check.d.ts +0 -21
- package/dist/update-check.d.ts.map +0 -1
- package/dist/update-check.js +0 -110
- package/dist/update-check.js.map +0 -1
- package/dist/viewer/html.d.ts +0 -2
- package/dist/viewer/html.d.ts.map +0 -1
- package/dist/viewer/html.js +0 -9168
- package/dist/viewer/html.js.map +0 -1
- package/dist/viewer/server.d.ts +0 -205
- package/dist/viewer/server.d.ts.map +0 -1
- package/dist/viewer/server.js +0 -4876
- package/dist/viewer/server.js.map +0 -1
package/dist/recall/engine.js
DELETED
|
@@ -1,343 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RecallEngine = void 0;
|
|
4
|
-
const vector_1 = require("../storage/vector");
|
|
5
|
-
const rrf_1 = require("./rrf");
|
|
6
|
-
const mmr_1 = require("./mmr");
|
|
7
|
-
const recency_1 = require("./recency");
|
|
8
|
-
const providers_1 = require("../ingest/providers");
|
|
9
|
-
const MAX_RECENT_QUERIES = 20;
|
|
10
|
-
class RecallEngine {
|
|
11
|
-
store;
|
|
12
|
-
embedder;
|
|
13
|
-
ctx;
|
|
14
|
-
recentQueries = [];
|
|
15
|
-
constructor(store, embedder, ctx) {
|
|
16
|
-
this.store = store;
|
|
17
|
-
this.embedder = embedder;
|
|
18
|
-
this.ctx = ctx;
|
|
19
|
-
}
|
|
20
|
-
async search(opts) {
|
|
21
|
-
const recallCfg = this.ctx.config.recall;
|
|
22
|
-
const maxResults = Math.min(opts.maxResults ?? recallCfg.maxResultsDefault, recallCfg.maxResultsMax);
|
|
23
|
-
const minScore = opts.minScore ?? recallCfg.minScoreDefault;
|
|
24
|
-
const query = opts.query ?? "";
|
|
25
|
-
const roleFilter = opts.role;
|
|
26
|
-
const repeatNote = this.checkRepeat(query, maxResults, minScore);
|
|
27
|
-
const candidatePool = maxResults * 5;
|
|
28
|
-
const ownerFilter = opts.ownerFilter;
|
|
29
|
-
// Step 1: Gather candidates from FTS, vector search, and pattern search
|
|
30
|
-
const ftsCandidates = query
|
|
31
|
-
? this.store.ftsSearch(query, candidatePool, ownerFilter)
|
|
32
|
-
: [];
|
|
33
|
-
let vecCandidates = [];
|
|
34
|
-
if (query) {
|
|
35
|
-
try {
|
|
36
|
-
const queryVec = await this.embedder.embedQuery(query);
|
|
37
|
-
const maxChunks = recallCfg.vectorSearchMaxChunks && recallCfg.vectorSearchMaxChunks > 0
|
|
38
|
-
? recallCfg.vectorSearchMaxChunks
|
|
39
|
-
: undefined;
|
|
40
|
-
vecCandidates = (0, vector_1.vectorSearch)(this.store, queryVec, candidatePool, maxChunks, ownerFilter);
|
|
41
|
-
}
|
|
42
|
-
catch (err) {
|
|
43
|
-
this.ctx.log.warn(`Vector search failed, using FTS only: ${err}`);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
// Step 1b: Pattern search (LIKE-based) as fallback for short terms that
|
|
47
|
-
// trigram FTS cannot match (trigram requires >= 3 chars).
|
|
48
|
-
// For CJK text without spaces, extract bigrams (2-char sliding windows)
|
|
49
|
-
// so that queries like "唐波是谁" produce ["唐波", "波是", "是谁"].
|
|
50
|
-
const cleaned = query.replace(/[."""(){}[\]*:^~!@#$%&\\/<>,;'`??。,!、:""''()【】《》]/g, " ");
|
|
51
|
-
const spaceSplit = cleaned.split(/\s+/).filter((t) => t.length === 2);
|
|
52
|
-
const cjkBigrams = [];
|
|
53
|
-
const cjkRuns = cleaned.match(/[\u4e00-\u9fff\u3400-\u4dbf\uF900-\uFAFF]{2,}/g);
|
|
54
|
-
if (cjkRuns) {
|
|
55
|
-
for (const run of cjkRuns) {
|
|
56
|
-
for (let i = 0; i <= run.length - 2; i++) {
|
|
57
|
-
cjkBigrams.push(run.slice(i, i + 2));
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
const shortTerms = [...new Set([...spaceSplit, ...cjkBigrams])];
|
|
62
|
-
const patternHits = shortTerms.length > 0
|
|
63
|
-
? this.store.patternSearch(shortTerms, { limit: candidatePool })
|
|
64
|
-
: [];
|
|
65
|
-
const patternRanked = patternHits.map((h, i) => ({
|
|
66
|
-
id: h.chunkId,
|
|
67
|
-
score: 1 / (i + 1),
|
|
68
|
-
}));
|
|
69
|
-
// Step 1c: Hub memories — FTS + pattern + cached embeddings (same strategy as chunks/skills).
|
|
70
|
-
let hubMemFtsRanked = [];
|
|
71
|
-
let hubMemVecRanked = [];
|
|
72
|
-
let hubMemPatternRanked = [];
|
|
73
|
-
if (query && this.ctx.config.sharing?.enabled && this.ctx.config.sharing.role === "hub") {
|
|
74
|
-
try {
|
|
75
|
-
const hubFtsHits = this.store.searchHubMemories(query, { maxResults: candidatePool });
|
|
76
|
-
hubMemFtsRanked = hubFtsHits.map(({ hit }, i) => ({ id: `hubmem:${hit.id}`, score: 1 / (i + 1) }));
|
|
77
|
-
}
|
|
78
|
-
catch { /* hub_memories table may not exist */ }
|
|
79
|
-
if (shortTerms.length > 0) {
|
|
80
|
-
try {
|
|
81
|
-
const hubPatternHits = this.store.hubMemoryPatternSearch(shortTerms, { limit: candidatePool });
|
|
82
|
-
hubMemPatternRanked = hubPatternHits.map((h, i) => ({ id: `hubmem:${h.memoryId}`, score: 1 / (i + 1) }));
|
|
83
|
-
}
|
|
84
|
-
catch { /* best-effort */ }
|
|
85
|
-
}
|
|
86
|
-
try {
|
|
87
|
-
const qv = await this.embedder.embedQuery(query).catch(() => null);
|
|
88
|
-
if (qv) {
|
|
89
|
-
const memEmbs = this.store.getVisibleHubMemoryEmbeddings("__hub__");
|
|
90
|
-
const scored = [];
|
|
91
|
-
for (const e of memEmbs) {
|
|
92
|
-
let dot = 0, nA = 0, nB = 0;
|
|
93
|
-
const len = Math.min(qv.length, e.vector.length);
|
|
94
|
-
for (let i = 0; i < len; i++) {
|
|
95
|
-
dot += qv[i] * e.vector[i];
|
|
96
|
-
nA += qv[i] * qv[i];
|
|
97
|
-
nB += e.vector[i] * e.vector[i];
|
|
98
|
-
}
|
|
99
|
-
const sim = nA > 0 && nB > 0 ? dot / (Math.sqrt(nA) * Math.sqrt(nB)) : 0;
|
|
100
|
-
if (sim > 0.3)
|
|
101
|
-
scored.push({ id: `hubmem:${e.memoryId}`, score: sim });
|
|
102
|
-
}
|
|
103
|
-
scored.sort((a, b) => b.score - a.score);
|
|
104
|
-
hubMemVecRanked = scored.slice(0, candidatePool);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
catch { /* best-effort */ }
|
|
108
|
-
const hubTotal = hubMemFtsRanked.length + hubMemVecRanked.length + hubMemPatternRanked.length;
|
|
109
|
-
if (hubTotal > 0) {
|
|
110
|
-
this.ctx.log.debug(`recall: hub_memories candidates: fts=${hubMemFtsRanked.length}, vec=${hubMemVecRanked.length}, pattern=${hubMemPatternRanked.length}`);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
// Step 2: RRF fusion
|
|
114
|
-
const ftsRanked = ftsCandidates.map((c) => ({ id: c.chunkId, score: c.score }));
|
|
115
|
-
const vecRanked = vecCandidates.map((c) => ({ id: c.chunkId, score: c.score }));
|
|
116
|
-
const allRankedLists = [ftsRanked, vecRanked, patternRanked];
|
|
117
|
-
if (hubMemFtsRanked.length > 0)
|
|
118
|
-
allRankedLists.push(hubMemFtsRanked);
|
|
119
|
-
if (hubMemVecRanked.length > 0)
|
|
120
|
-
allRankedLists.push(hubMemVecRanked);
|
|
121
|
-
if (hubMemPatternRanked.length > 0)
|
|
122
|
-
allRankedLists.push(hubMemPatternRanked);
|
|
123
|
-
const rrfScores = (0, rrf_1.rrfFuse)(allRankedLists, recallCfg.rrfK);
|
|
124
|
-
if (rrfScores.size === 0) {
|
|
125
|
-
this.recordQuery(query, maxResults, minScore, 0);
|
|
126
|
-
return {
|
|
127
|
-
hits: [],
|
|
128
|
-
meta: {
|
|
129
|
-
usedMinScore: minScore,
|
|
130
|
-
usedMaxResults: maxResults,
|
|
131
|
-
totalCandidates: 0,
|
|
132
|
-
note: repeatNote ?? "No candidates found for the given query.",
|
|
133
|
-
},
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
// Step 3: MMR re-ranking
|
|
137
|
-
const rrfList = [...rrfScores.entries()]
|
|
138
|
-
.map(([id, score]) => ({ id, score }))
|
|
139
|
-
.sort((a, b) => b.score - a.score);
|
|
140
|
-
const mmrResults = (0, mmr_1.mmrRerank)(rrfList, this.store, recallCfg.mmrLambda, maxResults * 2);
|
|
141
|
-
// Step 4: Time decay
|
|
142
|
-
const withTs = mmrResults.map((r) => {
|
|
143
|
-
if (r.id.startsWith("hubmem:")) {
|
|
144
|
-
const memId = r.id.slice(7);
|
|
145
|
-
const mem = this.store.getHubMemoryById(memId);
|
|
146
|
-
return { ...r, createdAt: mem?.createdAt ?? 0 };
|
|
147
|
-
}
|
|
148
|
-
const chunk = this.store.getChunk(r.id);
|
|
149
|
-
return { ...r, createdAt: chunk?.createdAt ?? 0 };
|
|
150
|
-
});
|
|
151
|
-
const decayed = (0, recency_1.applyRecencyDecay)(withTs, recallCfg.recencyHalfLifeDays);
|
|
152
|
-
// Step 5: Apply relative threshold on raw scores, then normalize to [0,1]
|
|
153
|
-
const sorted = [...decayed].sort((a, b) => b.score - a.score);
|
|
154
|
-
const topScore = sorted.length > 0 ? sorted[0].score : 0;
|
|
155
|
-
const absoluteFloor = topScore * minScore * 0.3;
|
|
156
|
-
// When role filter is active, keep a larger pool before slicing so we don't
|
|
157
|
-
// discard target-role candidates that rank below non-target ones.
|
|
158
|
-
const preSliceLimit = roleFilter ? maxResults * 5 : maxResults;
|
|
159
|
-
const filtered = sorted
|
|
160
|
-
.filter((d) => d.score >= absoluteFloor)
|
|
161
|
-
.slice(0, preSliceLimit);
|
|
162
|
-
const displayMax = filtered.length > 0 ? filtered[0].score : 1;
|
|
163
|
-
const normalized = filtered.map((d) => ({
|
|
164
|
-
...d,
|
|
165
|
-
score: d.score / displayMax,
|
|
166
|
-
}));
|
|
167
|
-
// Step 6: Build hits (with optional role filter), applying maxResults cap at the end
|
|
168
|
-
const hits = [];
|
|
169
|
-
for (const candidate of normalized) {
|
|
170
|
-
if (hits.length >= maxResults)
|
|
171
|
-
break;
|
|
172
|
-
if (candidate.id.startsWith("hubmem:")) {
|
|
173
|
-
const memId = candidate.id.slice(7);
|
|
174
|
-
const mem = this.store.getHubMemoryById(memId);
|
|
175
|
-
if (!mem)
|
|
176
|
-
continue;
|
|
177
|
-
if (roleFilter && mem.role !== roleFilter)
|
|
178
|
-
continue;
|
|
179
|
-
hits.push({
|
|
180
|
-
summary: mem.summary || mem.content.slice(0, 200),
|
|
181
|
-
original_excerpt: mem.content,
|
|
182
|
-
ref: {
|
|
183
|
-
sessionKey: `hub-shared:${mem.sourceUserId}`,
|
|
184
|
-
chunkId: mem.id,
|
|
185
|
-
turnId: "",
|
|
186
|
-
seq: 0,
|
|
187
|
-
},
|
|
188
|
-
score: Math.round(candidate.score * 1000) / 1000,
|
|
189
|
-
taskId: null,
|
|
190
|
-
skillId: null,
|
|
191
|
-
owner: `hub-user:${mem.sourceUserId}`,
|
|
192
|
-
origin: "hub-memory",
|
|
193
|
-
source: {
|
|
194
|
-
ts: mem.createdAt,
|
|
195
|
-
role: (mem.role || "assistant"),
|
|
196
|
-
sessionKey: `hub-shared:${mem.sourceUserId}`,
|
|
197
|
-
},
|
|
198
|
-
});
|
|
199
|
-
continue;
|
|
200
|
-
}
|
|
201
|
-
const chunk = this.store.getChunk(candidate.id);
|
|
202
|
-
if (!chunk)
|
|
203
|
-
continue;
|
|
204
|
-
if (roleFilter && chunk.role !== roleFilter)
|
|
205
|
-
continue;
|
|
206
|
-
const excerpt = (chunk.mergeCount ?? 0) > 0 ? chunk.summary : makeExcerpt(chunk.content);
|
|
207
|
-
hits.push({
|
|
208
|
-
summary: chunk.summary,
|
|
209
|
-
original_excerpt: excerpt,
|
|
210
|
-
ref: {
|
|
211
|
-
sessionKey: chunk.sessionKey,
|
|
212
|
-
chunkId: chunk.id,
|
|
213
|
-
turnId: chunk.turnId,
|
|
214
|
-
seq: chunk.seq,
|
|
215
|
-
},
|
|
216
|
-
score: Math.round(candidate.score * 1000) / 1000,
|
|
217
|
-
taskId: chunk.taskId,
|
|
218
|
-
skillId: chunk.skillId,
|
|
219
|
-
origin: chunk.owner === "public" ? "local-shared" : "local",
|
|
220
|
-
source: {
|
|
221
|
-
ts: chunk.createdAt,
|
|
222
|
-
role: chunk.role,
|
|
223
|
-
sessionKey: chunk.sessionKey,
|
|
224
|
-
},
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
this.recordQuery(query, maxResults, minScore, hits.length);
|
|
228
|
-
return {
|
|
229
|
-
hits,
|
|
230
|
-
meta: {
|
|
231
|
-
usedMinScore: minScore,
|
|
232
|
-
usedMaxResults: maxResults,
|
|
233
|
-
totalCandidates: rrfScores.size,
|
|
234
|
-
...(repeatNote ? { note: repeatNote } : {}),
|
|
235
|
-
},
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* PRD §6.1: Detect repeated identical/similar queries and produce a
|
|
240
|
-
* warning note so the model knows to vary its approach.
|
|
241
|
-
*/
|
|
242
|
-
checkRepeat(query, maxResults, minScore) {
|
|
243
|
-
const normalized = query.toLowerCase().trim();
|
|
244
|
-
if (!normalized)
|
|
245
|
-
return undefined;
|
|
246
|
-
const dup = this.recentQueries.find((q) => q.query === normalized && q.maxResults === maxResults && q.minScore === minScore);
|
|
247
|
-
if (dup) {
|
|
248
|
-
if (dup.hitCount === 0) {
|
|
249
|
-
return "This exact query with the same parameters was already tried and returned 0 results. Try rephrasing with different keywords, or adjust maxResults/minScore.";
|
|
250
|
-
}
|
|
251
|
-
return "This exact query with the same parameters was already executed. Consider varying the query or expanding parameters to get different results.";
|
|
252
|
-
}
|
|
253
|
-
return undefined;
|
|
254
|
-
}
|
|
255
|
-
recordQuery(query, maxResults, minScore, hitCount) {
|
|
256
|
-
const normalized = query.toLowerCase().trim();
|
|
257
|
-
if (!normalized)
|
|
258
|
-
return;
|
|
259
|
-
this.recentQueries = this.recentQueries.filter((q) => !(q.query === normalized && q.maxResults === maxResults && q.minScore === minScore));
|
|
260
|
-
this.recentQueries.push({ query: normalized, maxResults, minScore, hitCount });
|
|
261
|
-
if (this.recentQueries.length > MAX_RECENT_QUERIES) {
|
|
262
|
-
this.recentQueries.shift();
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
async searchSkills(query, scope, currentOwner) {
|
|
266
|
-
const RRF_K = 60;
|
|
267
|
-
const TOP_CANDIDATES = 20;
|
|
268
|
-
// FTS on name + description
|
|
269
|
-
const ftsCandidates = this.store.skillFtsSearch(query, TOP_CANDIDATES, scope, currentOwner);
|
|
270
|
-
// Vector search on description embedding
|
|
271
|
-
let vecCandidates = [];
|
|
272
|
-
try {
|
|
273
|
-
const queryVec = await this.embedder.embedQuery(query);
|
|
274
|
-
const allEmb = this.store.getSkillEmbeddings(scope, currentOwner);
|
|
275
|
-
vecCandidates = allEmb.map((row) => ({
|
|
276
|
-
skillId: row.skillId,
|
|
277
|
-
score: (0, vector_1.cosineSimilarity)(queryVec, row.vector),
|
|
278
|
-
}));
|
|
279
|
-
vecCandidates.sort((a, b) => b.score - a.score);
|
|
280
|
-
vecCandidates = vecCandidates.slice(0, TOP_CANDIDATES);
|
|
281
|
-
}
|
|
282
|
-
catch (err) {
|
|
283
|
-
this.ctx.log.warn(`Skill vector search failed, using FTS only: ${err}`);
|
|
284
|
-
}
|
|
285
|
-
// RRF fusion
|
|
286
|
-
const ftsRanked = ftsCandidates.map((c) => ({ id: c.skillId, score: c.score }));
|
|
287
|
-
const vecRanked = vecCandidates.map((c) => ({ id: c.skillId, score: c.score }));
|
|
288
|
-
const rrfScores = (0, rrf_1.rrfFuse)([ftsRanked, vecRanked], RRF_K);
|
|
289
|
-
if (rrfScores.size === 0)
|
|
290
|
-
return [];
|
|
291
|
-
const sorted = [...rrfScores.entries()]
|
|
292
|
-
.map(([id, score]) => ({ id, score }))
|
|
293
|
-
.sort((a, b) => b.score - a.score)
|
|
294
|
-
.slice(0, TOP_CANDIDATES);
|
|
295
|
-
// Load skill details for LLM judgment
|
|
296
|
-
const candidateSkills = [];
|
|
297
|
-
for (const item of sorted) {
|
|
298
|
-
const skill = this.store.getSkill(item.id);
|
|
299
|
-
if (skill)
|
|
300
|
-
candidateSkills.push({ skill, rrfScore: item.score });
|
|
301
|
-
}
|
|
302
|
-
if (candidateSkills.length === 0)
|
|
303
|
-
return [];
|
|
304
|
-
// LLM relevance judgment
|
|
305
|
-
const summarizer = new providers_1.Summarizer(this.ctx.config.summarizer, this.ctx.log, this.ctx.openclawAPI);
|
|
306
|
-
const relevantIndices = await this.judgeSkillRelevance(summarizer, query, candidateSkills);
|
|
307
|
-
return relevantIndices.map((idx) => {
|
|
308
|
-
const { skill, rrfScore } = candidateSkills[idx];
|
|
309
|
-
return {
|
|
310
|
-
skillId: skill.id,
|
|
311
|
-
name: skill.name,
|
|
312
|
-
description: skill.description,
|
|
313
|
-
owner: skill.owner,
|
|
314
|
-
visibility: skill.visibility,
|
|
315
|
-
score: rrfScore,
|
|
316
|
-
reason: "relevant",
|
|
317
|
-
};
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
async judgeSkillRelevance(summarizer, query, candidates) {
|
|
321
|
-
const candidateList = candidates.map((c, i) => ({
|
|
322
|
-
index: i,
|
|
323
|
-
role: "skill",
|
|
324
|
-
content: `[${c.skill.name}] ${c.skill.description}`,
|
|
325
|
-
}));
|
|
326
|
-
try {
|
|
327
|
-
const result = await summarizer.filterRelevant(query, candidateList);
|
|
328
|
-
if (result && result.relevant.length > 0) {
|
|
329
|
-
return result.relevant.map((r) => r);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
catch (err) {
|
|
333
|
-
this.ctx.log.warn(`Skill relevance judgment failed, returning all: ${err}`);
|
|
334
|
-
}
|
|
335
|
-
// Fallback: return all candidates
|
|
336
|
-
return candidates.map((_, i) => i);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
exports.RecallEngine = RecallEngine;
|
|
340
|
-
function makeExcerpt(content) {
|
|
341
|
-
return content;
|
|
342
|
-
}
|
|
343
|
-
//# sourceMappingURL=engine.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/recall/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/recall/mmr.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { SqliteStore } from "../storage/sqlite";
|
|
2
|
-
/**
|
|
3
|
-
* Maximal Marginal Relevance (PRD §5.3)
|
|
4
|
-
*
|
|
5
|
-
* Re-ranks candidates to balance relevance with diversity,
|
|
6
|
-
* preventing top-K results from being too similar.
|
|
7
|
-
*
|
|
8
|
-
* MMR = λ · sim(q, d) - (1-λ) · max(sim(d, d_selected))
|
|
9
|
-
*/
|
|
10
|
-
export declare function mmrRerank(candidates: Array<{
|
|
11
|
-
id: string;
|
|
12
|
-
score: number;
|
|
13
|
-
}>, store: SqliteStore, lambda?: number, topK?: number): Array<{
|
|
14
|
-
id: string;
|
|
15
|
-
score: number;
|
|
16
|
-
}>;
|
|
17
|
-
//# sourceMappingURL=mmr.d.ts.map
|
package/dist/recall/mmr.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mmr.d.ts","sourceRoot":"","sources":["../../src/recall/mmr.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,UAAU,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAChD,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,MAAY,EACpB,IAAI,GAAE,MAAW,GAChB,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA6CtC"}
|
package/dist/recall/mmr.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.mmrRerank = mmrRerank;
|
|
4
|
-
const vector_1 = require("../storage/vector");
|
|
5
|
-
/**
|
|
6
|
-
* Maximal Marginal Relevance (PRD §5.3)
|
|
7
|
-
*
|
|
8
|
-
* Re-ranks candidates to balance relevance with diversity,
|
|
9
|
-
* preventing top-K results from being too similar.
|
|
10
|
-
*
|
|
11
|
-
* MMR = λ · sim(q, d) - (1-λ) · max(sim(d, d_selected))
|
|
12
|
-
*/
|
|
13
|
-
function mmrRerank(candidates, store, lambda = 0.7, topK = 20) {
|
|
14
|
-
if (candidates.length <= 1)
|
|
15
|
-
return candidates;
|
|
16
|
-
const embeddings = new Map();
|
|
17
|
-
for (const c of candidates) {
|
|
18
|
-
const vec = store.getEmbedding(c.id);
|
|
19
|
-
if (vec)
|
|
20
|
-
embeddings.set(c.id, vec);
|
|
21
|
-
}
|
|
22
|
-
const selected = [];
|
|
23
|
-
const remaining = [...candidates];
|
|
24
|
-
while (selected.length < topK && remaining.length > 0) {
|
|
25
|
-
let bestIdx = 0;
|
|
26
|
-
let bestMmr = -Infinity;
|
|
27
|
-
for (let i = 0; i < remaining.length; i++) {
|
|
28
|
-
const cand = remaining[i];
|
|
29
|
-
const candVec = embeddings.get(cand.id);
|
|
30
|
-
let maxSimToSelected = 0;
|
|
31
|
-
if (candVec && selected.length > 0) {
|
|
32
|
-
for (const s of selected) {
|
|
33
|
-
const sVec = embeddings.get(s.id);
|
|
34
|
-
if (sVec) {
|
|
35
|
-
const sim = (0, vector_1.cosineSimilarity)(candVec, sVec);
|
|
36
|
-
maxSimToSelected = Math.max(maxSimToSelected, sim);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
const mmrScore = lambda * cand.score - (1 - lambda) * maxSimToSelected;
|
|
41
|
-
if (mmrScore > bestMmr) {
|
|
42
|
-
bestMmr = mmrScore;
|
|
43
|
-
bestIdx = i;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
const chosen = remaining.splice(bestIdx, 1)[0];
|
|
47
|
-
// Preserve original RRF score for downstream filtering;
|
|
48
|
-
// MMR only determines selection order, not the score value.
|
|
49
|
-
selected.push({ id: chosen.id, score: chosen.score });
|
|
50
|
-
}
|
|
51
|
-
return selected;
|
|
52
|
-
}
|
|
53
|
-
//# sourceMappingURL=mmr.js.map
|
package/dist/recall/mmr.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mmr.js","sourceRoot":"","sources":["../../src/recall/mmr.ts"],"names":[],"mappings":";;AAWA,8BAkDC;AA7DD,8CAAqD;AAGrD;;;;;;;GAOG;AACH,SAAgB,SAAS,CACvB,UAAgD,EAChD,KAAkB,EAClB,SAAiB,GAAG,EACpB,OAAe,EAAE;IAEjB,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IAE9C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,GAAG;YAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,QAAQ,GAAyC,EAAE,CAAC;IAC1D,MAAM,SAAS,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;IAElC,OAAO,QAAQ,CAAC,MAAM,GAAG,IAAI,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC;QAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAExC,IAAI,gBAAgB,GAAG,CAAC,CAAC;YACzB,IAAI,OAAO,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;oBACzB,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAClC,IAAI,IAAI,EAAE,CAAC;wBACT,MAAM,GAAG,GAAG,IAAA,yBAAgB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;wBAC5C,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;oBACrD,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,gBAAgB,CAAC;YACvE,IAAI,QAAQ,GAAG,OAAO,EAAE,CAAC;gBACvB,OAAO,GAAG,QAAQ,CAAC;gBACnB,OAAO,GAAG,CAAC,CAAC;YACd,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,wDAAwD;QACxD,4DAA4D;QAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/recall/recency.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Time decay scoring (PRD §5.3)
|
|
3
|
-
*
|
|
4
|
-
* Applies exponential decay based on document age, biasing towards
|
|
5
|
-
* more recent memories. Uses configurable half-life (default 14 days).
|
|
6
|
-
*
|
|
7
|
-
* decay(t) = 0.5 ^ (age_days / half_life)
|
|
8
|
-
* final = base_score * (alpha + (1-alpha) * decay)
|
|
9
|
-
*
|
|
10
|
-
* alpha=0.3 ensures old but highly relevant results are not zeroed out.
|
|
11
|
-
*/
|
|
12
|
-
export declare function applyRecencyDecay(candidates: Array<{
|
|
13
|
-
id: string;
|
|
14
|
-
score: number;
|
|
15
|
-
createdAt: number;
|
|
16
|
-
}>, halfLifeDays?: number, now?: number): Array<{
|
|
17
|
-
id: string;
|
|
18
|
-
score: number;
|
|
19
|
-
}>;
|
|
20
|
-
//# sourceMappingURL=recency.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recency.d.ts","sourceRoot":"","sources":["../../src/recall/recency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,EACnE,YAAY,GAAE,MAAW,EACzB,GAAG,CAAC,EAAE,MAAM,GACX,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAWtC"}
|
package/dist/recall/recency.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.applyRecencyDecay = applyRecencyDecay;
|
|
4
|
-
/**
|
|
5
|
-
* Time decay scoring (PRD §5.3)
|
|
6
|
-
*
|
|
7
|
-
* Applies exponential decay based on document age, biasing towards
|
|
8
|
-
* more recent memories. Uses configurable half-life (default 14 days).
|
|
9
|
-
*
|
|
10
|
-
* decay(t) = 0.5 ^ (age_days / half_life)
|
|
11
|
-
* final = base_score * (alpha + (1-alpha) * decay)
|
|
12
|
-
*
|
|
13
|
-
* alpha=0.3 ensures old but highly relevant results are not zeroed out.
|
|
14
|
-
*/
|
|
15
|
-
function applyRecencyDecay(candidates, halfLifeDays = 14, now) {
|
|
16
|
-
const currentTime = now ?? Date.now();
|
|
17
|
-
const halfLifeMs = halfLifeDays * 24 * 60 * 60 * 1000;
|
|
18
|
-
const alpha = 0.3;
|
|
19
|
-
return candidates.map((c) => {
|
|
20
|
-
const ageMs = Math.max(0, currentTime - c.createdAt);
|
|
21
|
-
const decay = Math.pow(0.5, ageMs / halfLifeMs);
|
|
22
|
-
const adjustedScore = c.score * (alpha + (1 - alpha) * decay);
|
|
23
|
-
return { id: c.id, score: adjustedScore };
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=recency.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recency.js","sourceRoot":"","sources":["../../src/recall/recency.ts"],"names":[],"mappings":";;AAWA,8CAeC;AA1BD;;;;;;;;;;GAUG;AACH,SAAgB,iBAAiB,CAC/B,UAAmE,EACnE,eAAuB,EAAE,EACzB,GAAY;IAEZ,MAAM,WAAW,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACtD,MAAM,KAAK,GAAG,GAAG,CAAC;IAElB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,UAAU,CAAC,CAAC;QAChD,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;QAC9D,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/recall/rrf.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reciprocal Rank Fusion (PRD §5.2)
|
|
3
|
-
*
|
|
4
|
-
* Merges ranked lists from different retrieval sources (FTS, vector)
|
|
5
|
-
* into a single ranking. Handles score scale mismatch between BM25
|
|
6
|
-
* and cosine similarity.
|
|
7
|
-
*
|
|
8
|
-
* RRF(d) = Σ 1 / (k + rank_i(d))
|
|
9
|
-
* where k is a constant (default 60) and rank_i is the rank in list i.
|
|
10
|
-
*/
|
|
11
|
-
export interface RankedItem {
|
|
12
|
-
id: string;
|
|
13
|
-
score: number;
|
|
14
|
-
}
|
|
15
|
-
export declare function rrfFuse(lists: RankedItem[][], k?: number): Map<string, number>;
|
|
16
|
-
//# sourceMappingURL=rrf.d.ts.map
|
package/dist/recall/rrf.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rrf.d.ts","sourceRoot":"","sources":["../../src/recall/rrf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,OAAO,CACrB,KAAK,EAAE,UAAU,EAAE,EAAE,EACrB,CAAC,GAAE,MAAW,GACb,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAYrB"}
|
package/dist/recall/rrf.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.rrfFuse = rrfFuse;
|
|
4
|
-
function rrfFuse(lists, k = 60) {
|
|
5
|
-
const scores = new Map();
|
|
6
|
-
for (const list of lists) {
|
|
7
|
-
for (let rank = 0; rank < list.length; rank++) {
|
|
8
|
-
const item = list[rank];
|
|
9
|
-
const prev = scores.get(item.id) ?? 0;
|
|
10
|
-
scores.set(item.id, prev + 1 / (k + rank + 1));
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
return scores;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=rrf.js.map
|
package/dist/recall/rrf.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rrf.js","sourceRoot":"","sources":["../../src/recall/rrf.ts"],"names":[],"mappings":";;AAeA,0BAeC;AAfD,SAAgB,OAAO,CACrB,KAAqB,EACrB,IAAY,EAAE;IAEd,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { SummarizerConfig, Logger, PluginContext, OpenClawAPI } from "../types";
|
|
2
|
-
/**
|
|
3
|
-
* Build a SummarizerConfig from OpenClaw's native model configuration (openclaw.json).
|
|
4
|
-
* Final fallback when both strongCfg and plugin summarizer fail or are absent.
|
|
5
|
-
*/
|
|
6
|
-
export declare function loadOpenClawFallbackConfig(log: Logger): SummarizerConfig | undefined;
|
|
7
|
-
/**
|
|
8
|
-
* Build the ordered fallback chain for skill-related LLM calls:
|
|
9
|
-
* skillEvolution.summarizer → plugin summarizer → OpenClaw native model
|
|
10
|
-
*/
|
|
11
|
-
export declare function buildSkillConfigChain(ctx: PluginContext): SummarizerConfig[];
|
|
12
|
-
export interface LLMCallOptions {
|
|
13
|
-
maxTokens?: number;
|
|
14
|
-
temperature?: number;
|
|
15
|
-
timeoutMs?: number;
|
|
16
|
-
/** Pass ctx.openclawAPI so callLLMOnce can handle provider === "openclaw" */
|
|
17
|
-
openclawAPI?: OpenClawAPI;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Make a single LLM call with the given config. Throws on failure.
|
|
21
|
-
* When cfg.provider === "openclaw", delegates to the OpenClaw host completion API.
|
|
22
|
-
* Dispatches to Anthropic or OpenAI-compatible format based on provider.
|
|
23
|
-
*/
|
|
24
|
-
export declare function callLLMOnce(cfg: SummarizerConfig, prompt: string, opts?: LLMCallOptions): Promise<string>;
|
|
25
|
-
/**
|
|
26
|
-
* Call LLM with fallback chain: tries each config in order until one succeeds.
|
|
27
|
-
* Returns the result string, or throws if ALL configs fail.
|
|
28
|
-
*/
|
|
29
|
-
export declare function callLLMWithFallback(chain: SummarizerConfig[], prompt: string, log: Logger, label: string, opts?: LLMCallOptions): Promise<string>;
|
|
30
|
-
//# sourceMappingURL=llm-call.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm-call.d.ts","sourceRoot":"","sources":["../../src/shared/llm-call.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA8BtG;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAuCpF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,GAAG,gBAAgB,EAAE,CAS5E;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAoBD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,CAmBjB;AA2ED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,gBAAgB,EAAE,EACzB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
|