context-vault 3.18.0 → 3.20.0
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/bin/cli.js +673 -4
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +0 -2
- package/dist/register-tools.js.map +1 -1
- package/dist/server.js +78 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/recall.d.ts +1 -1
- package/dist/tools/recall.d.ts.map +1 -1
- package/dist/tools/recall.js +50 -100
- package/dist/tools/recall.js.map +1 -1
- package/node_modules/@context-vault/core/dist/assemble.d.ts +22 -0
- package/node_modules/@context-vault/core/dist/assemble.d.ts.map +1 -0
- package/node_modules/@context-vault/core/dist/assemble.js +143 -0
- package/node_modules/@context-vault/core/dist/assemble.js.map +1 -0
- package/node_modules/@context-vault/core/dist/capture.d.ts.map +1 -1
- package/node_modules/@context-vault/core/dist/capture.js +10 -5
- package/node_modules/@context-vault/core/dist/capture.js.map +1 -1
- package/node_modules/@context-vault/core/dist/consolidation.d.ts +40 -0
- package/node_modules/@context-vault/core/dist/consolidation.d.ts.map +1 -0
- package/node_modules/@context-vault/core/dist/consolidation.js +229 -0
- package/node_modules/@context-vault/core/dist/consolidation.js.map +1 -0
- package/node_modules/@context-vault/core/dist/db.d.ts +25 -1
- package/node_modules/@context-vault/core/dist/db.d.ts.map +1 -1
- package/node_modules/@context-vault/core/dist/db.js +92 -4
- package/node_modules/@context-vault/core/dist/db.js.map +1 -1
- package/node_modules/@context-vault/core/dist/frontmatter.d.ts.map +1 -1
- package/node_modules/@context-vault/core/dist/frontmatter.js +26 -3
- package/node_modules/@context-vault/core/dist/frontmatter.js.map +1 -1
- package/node_modules/@context-vault/core/dist/index.d.ts.map +1 -1
- package/node_modules/@context-vault/core/dist/index.js +225 -184
- package/node_modules/@context-vault/core/dist/index.js.map +1 -1
- package/node_modules/@context-vault/core/dist/main.d.ts +3 -0
- package/node_modules/@context-vault/core/dist/main.d.ts.map +1 -1
- package/node_modules/@context-vault/core/dist/main.js +4 -0
- package/node_modules/@context-vault/core/dist/main.js.map +1 -1
- package/node_modules/@context-vault/core/dist/search.d.ts +6 -0
- package/node_modules/@context-vault/core/dist/search.d.ts.map +1 -1
- package/node_modules/@context-vault/core/dist/search.js +106 -5
- package/node_modules/@context-vault/core/dist/search.js.map +1 -1
- package/node_modules/@context-vault/core/dist/search.test.d.ts +2 -0
- package/node_modules/@context-vault/core/dist/search.test.d.ts.map +1 -0
- package/node_modules/@context-vault/core/dist/search.test.js +49 -0
- package/node_modules/@context-vault/core/dist/search.test.js.map +1 -0
- package/node_modules/@context-vault/core/dist/summarize.d.ts +5 -0
- package/node_modules/@context-vault/core/dist/summarize.d.ts.map +1 -0
- package/node_modules/@context-vault/core/dist/summarize.js +146 -0
- package/node_modules/@context-vault/core/dist/summarize.js.map +1 -0
- package/node_modules/@context-vault/core/dist/types.d.ts +2 -0
- package/node_modules/@context-vault/core/dist/types.d.ts.map +1 -1
- package/node_modules/@context-vault/core/package.json +13 -1
- package/node_modules/@context-vault/core/src/assemble.ts +187 -0
- package/node_modules/@context-vault/core/src/capture.ts +10 -5
- package/node_modules/@context-vault/core/src/consolidation.ts +356 -0
- package/node_modules/@context-vault/core/src/db.ts +95 -4
- package/node_modules/@context-vault/core/src/frontmatter.ts +25 -4
- package/node_modules/@context-vault/core/src/index.ts +127 -88
- package/node_modules/@context-vault/core/src/main.ts +7 -0
- package/node_modules/@context-vault/core/src/search.test.ts +59 -0
- package/node_modules/@context-vault/core/src/search.ts +112 -5
- package/node_modules/@context-vault/core/src/summarize.ts +157 -0
- package/node_modules/@context-vault/core/src/types.ts +2 -0
- package/package.json +2 -2
- package/scripts/validate-epipe-shutdown.mjs +183 -0
- package/scripts/validate-sqlite-busy-retry.mjs +243 -0
- package/src/register-tools.ts +0 -2
- package/src/server.ts +76 -1
- package/src/tools/recall.ts +51 -110
- package/.claude-plugin/README.md +0 -219
- package/.claude-plugin/plugin.json +0 -11
- package/commands/vault-cleanup.md +0 -43
- package/commands/vault-snapshot.md +0 -43
- package/commands/vault-status.md +0 -35
- package/dist/tools/session-start.d.ts +0 -25
- package/dist/tools/session-start.d.ts.map +0 -1
- package/dist/tools/session-start.js +0 -469
- package/dist/tools/session-start.js.map +0 -1
- package/skills/context-assembly/SKILL.md +0 -308
- package/skills/knowledge-capture/SKILL.md +0 -303
- package/skills/memory-management/SKILL.md +0 -237
- package/src/tools/session-start.ts +0 -527
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import type { LocalCtx, SharedCtx, ToolResult } from '../types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Extract keywords from a signal string.
|
|
5
|
-
* Split on whitespace, filter stopwords and words under 4 chars, keep top 10.
|
|
6
|
-
*/
|
|
7
|
-
export declare function extractKeywords(signal: string): string[];
|
|
8
|
-
export declare const name = "recall";
|
|
9
|
-
export declare const description = "Search the vault using a raw signal (prompt text, error message, file path, or task context). Returns lightweight hints for proactive surfacing. Designed for runtime hooks, not direct user interaction.";
|
|
10
|
-
export declare const inputSchema: {
|
|
11
|
-
signal: z.ZodString;
|
|
12
|
-
signal_type: z.ZodEnum<{
|
|
13
|
-
prompt: "prompt";
|
|
14
|
-
task: "task";
|
|
15
|
-
error: "error";
|
|
16
|
-
file: "file";
|
|
17
|
-
}>;
|
|
18
|
-
bucket: z.ZodOptional<z.ZodString>;
|
|
19
|
-
session_id: z.ZodOptional<z.ZodString>;
|
|
20
|
-
max_hints: z.ZodOptional<z.ZodNumber>;
|
|
21
|
-
};
|
|
22
|
-
export declare function handler({ signal, signal_type, bucket, session_id, max_hints }: Record<string, any>, ctx: LocalCtx, { ensureIndexed }: SharedCtx): Promise<ToolResult>;
|
|
23
|
-
/** Reset session dedup state (for testing) */
|
|
24
|
-
export declare function _resetSessionState(): void;
|
|
25
|
-
//# sourceMappingURL=session-start.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../src/tools/session-start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA0BnE;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBxD;AAED,eAAO,MAAM,IAAI,WAAW,CAAC;AAE7B,eAAO,MAAM,WAAW,8MACqL,CAAC;AAE9M,eAAO,MAAM,WAAW;;;;;;;;;;;CAmBvB,CAAC;AAEF,wBAAsB,OAAO,CAC3B,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3E,GAAG,EAAE,QAAQ,EACb,EAAE,aAAa,EAAE,EAAE,SAAS,GAC3B,OAAO,CAAC,UAAU,CAAC,CAoarB;AAoBD,8CAA8C;AAC9C,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
|
|
@@ -1,469 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { ok } from '../helpers.js';
|
|
3
|
-
import { isEmbedAvailable } from '@context-vault/core/embed';
|
|
4
|
-
import { getAutoMemory, findAutoMemoryOverlaps } from '../auto-memory.js';
|
|
5
|
-
import { getRemoteClient, getTeamId, getPublicVaults } from '../remote.js';
|
|
6
|
-
const SEMANTIC_SIMILARITY_THRESHOLD = 0.6;
|
|
7
|
-
const CO_RETRIEVAL_WEIGHT_CAP = 50;
|
|
8
|
-
const STOPWORDS = new Set([
|
|
9
|
-
'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
10
|
-
'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
|
|
11
|
-
'should', 'may', 'might', 'shall', 'can', 'need', 'must', 'ought',
|
|
12
|
-
'and', 'but', 'or', 'nor', 'not', 'so', 'yet', 'for', 'with',
|
|
13
|
-
'from', 'into', 'during', 'before', 'after', 'above', 'below',
|
|
14
|
-
'to', 'of', 'in', 'on', 'at', 'by', 'about', 'between', 'through',
|
|
15
|
-
'this', 'that', 'these', 'those', 'it', 'its', 'they', 'them',
|
|
16
|
-
'their', 'we', 'our', 'you', 'your', 'he', 'she', 'him', 'her',
|
|
17
|
-
'all', 'each', 'every', 'both', 'few', 'more', 'most', 'other',
|
|
18
|
-
'some', 'such', 'no', 'only', 'own', 'same', 'than', 'too', 'very',
|
|
19
|
-
'just', 'also', 'now', 'then', 'here', 'there', 'when', 'where',
|
|
20
|
-
'how', 'what', 'which', 'who', 'whom', 'why', 'if', 'because',
|
|
21
|
-
'as', 'until', 'while', 'use', 'using', 'used',
|
|
22
|
-
]);
|
|
23
|
-
const DEFAULT_MAX_HINTS = 3;
|
|
24
|
-
/** Module-level session dedup map: session_id -> Set of surfaced entry IDs */
|
|
25
|
-
const sessionSurfaced = new Map();
|
|
26
|
-
/**
|
|
27
|
-
* Extract keywords from a signal string.
|
|
28
|
-
* Split on whitespace, filter stopwords and words under 4 chars, keep top 10.
|
|
29
|
-
*/
|
|
30
|
-
export function extractKeywords(signal) {
|
|
31
|
-
const words = signal
|
|
32
|
-
.toLowerCase()
|
|
33
|
-
.replace(/[^a-z0-9\s_-]/g, ' ')
|
|
34
|
-
.split(/\s+/)
|
|
35
|
-
.filter((w) => w.length >= 4 && !STOPWORDS.has(w));
|
|
36
|
-
const seen = new Set();
|
|
37
|
-
const unique = [];
|
|
38
|
-
for (const w of words) {
|
|
39
|
-
if (seen.has(w))
|
|
40
|
-
continue;
|
|
41
|
-
seen.add(w);
|
|
42
|
-
unique.push(w);
|
|
43
|
-
if (unique.length >= 10)
|
|
44
|
-
break;
|
|
45
|
-
}
|
|
46
|
-
return unique;
|
|
47
|
-
}
|
|
48
|
-
export const name = 'recall';
|
|
49
|
-
export const description = 'Search the vault using a raw signal (prompt text, error message, file path, or task context). Returns lightweight hints for proactive surfacing. Designed for runtime hooks, not direct user interaction.';
|
|
50
|
-
export const inputSchema = {
|
|
51
|
-
signal: z
|
|
52
|
-
.string()
|
|
53
|
-
.describe('Raw text: prompt, error message, file path, or combined signal.'),
|
|
54
|
-
signal_type: z
|
|
55
|
-
.enum(['prompt', 'error', 'file', 'task'])
|
|
56
|
-
.describe('Type of signal, used to weight results.'),
|
|
57
|
-
bucket: z
|
|
58
|
-
.string()
|
|
59
|
-
.optional()
|
|
60
|
-
.describe('Scope results to a project bucket.'),
|
|
61
|
-
session_id: z
|
|
62
|
-
.string()
|
|
63
|
-
.optional()
|
|
64
|
-
.describe('Session identifier for dedup. Entries already surfaced this session are suppressed.'),
|
|
65
|
-
max_hints: z
|
|
66
|
-
.number()
|
|
67
|
-
.optional()
|
|
68
|
-
.describe('Maximum hints to return. Default: 3.'),
|
|
69
|
-
};
|
|
70
|
-
export async function handler({ signal, signal_type, bucket, session_id, max_hints }, ctx, { ensureIndexed }) {
|
|
71
|
-
const start = Date.now();
|
|
72
|
-
await ensureIndexed();
|
|
73
|
-
const keywords = extractKeywords(signal || '');
|
|
74
|
-
const limit = max_hints ?? DEFAULT_MAX_HINTS;
|
|
75
|
-
if (keywords.length === 0) {
|
|
76
|
-
const result = ok('No relevant entries found.');
|
|
77
|
-
result._meta = {
|
|
78
|
-
latency_ms: Date.now() - start,
|
|
79
|
-
method: 'none',
|
|
80
|
-
signal_keywords: [],
|
|
81
|
-
suppressed: 0,
|
|
82
|
-
};
|
|
83
|
-
return result;
|
|
84
|
-
}
|
|
85
|
-
// Build fast-path query: tag/title LIKE match for each keyword
|
|
86
|
-
const conditions = [];
|
|
87
|
-
const params = [];
|
|
88
|
-
for (const kw of keywords) {
|
|
89
|
-
conditions.push('(title LIKE ? OR tags LIKE ?)');
|
|
90
|
-
params.push(`%${kw}%`, `%${kw}%`);
|
|
91
|
-
}
|
|
92
|
-
const bucketClause = bucket ? ' AND tags LIKE ?' : '';
|
|
93
|
-
if (bucket)
|
|
94
|
-
params.push(`%"bucket:${bucket}"%`);
|
|
95
|
-
const sql = `SELECT id, title, substr(body, 1, 100) as summary, kind, tags, tier
|
|
96
|
-
FROM vault
|
|
97
|
-
WHERE indexed = 1
|
|
98
|
-
AND (expires_at IS NULL OR expires_at > datetime('now'))
|
|
99
|
-
AND superseded_by IS NULL
|
|
100
|
-
AND (${conditions.join(' OR ')})${bucketClause}
|
|
101
|
-
LIMIT 20`;
|
|
102
|
-
let rows;
|
|
103
|
-
try {
|
|
104
|
-
rows = ctx.db.prepare(sql).all(...params);
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
rows = [];
|
|
108
|
-
}
|
|
109
|
-
// Session dedup
|
|
110
|
-
let suppressed = 0;
|
|
111
|
-
const bypassDedup = signal_type === 'error';
|
|
112
|
-
const sessionSet = session_id
|
|
113
|
-
? (sessionSurfaced.get(session_id) ?? (() => { const s = new Set(); sessionSurfaced.set(session_id, s); return s; })())
|
|
114
|
-
: null;
|
|
115
|
-
const hints = [];
|
|
116
|
-
for (const row of rows) {
|
|
117
|
-
if (hints.length >= limit)
|
|
118
|
-
break;
|
|
119
|
-
// Dedup check
|
|
120
|
-
if (sessionSet && !bypassDedup && sessionSet.has(row.id)) {
|
|
121
|
-
suppressed++;
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
124
|
-
const entryTags = row.tags ? JSON.parse(row.tags) : [];
|
|
125
|
-
// Score relevance: count how many keywords match title or tags
|
|
126
|
-
let matchCount = 0;
|
|
127
|
-
const titleLower = (row.title || '').toLowerCase();
|
|
128
|
-
const tagsLower = (row.tags || '').toLowerCase();
|
|
129
|
-
for (const kw of keywords) {
|
|
130
|
-
if (titleLower.includes(kw) || tagsLower.includes(kw))
|
|
131
|
-
matchCount++;
|
|
132
|
-
}
|
|
133
|
-
const isDurable = row.tier === 'durable';
|
|
134
|
-
const relevance = (matchCount >= 2 || (isDurable && matchCount >= 1)) ? 'high' : 'medium';
|
|
135
|
-
hints.push({
|
|
136
|
-
id: row.id,
|
|
137
|
-
title: row.title || '(untitled)',
|
|
138
|
-
summary: row.summary || '',
|
|
139
|
-
relevance,
|
|
140
|
-
kind: row.kind || 'knowledge',
|
|
141
|
-
tags: entryTags,
|
|
142
|
-
});
|
|
143
|
-
// Track surfaced
|
|
144
|
-
if (sessionSet)
|
|
145
|
-
sessionSet.add(row.id);
|
|
146
|
-
}
|
|
147
|
-
// Remote recall: merge hints from hosted API
|
|
148
|
-
const remoteClient = getRemoteClient(ctx.config);
|
|
149
|
-
if (remoteClient && hints.length < limit) {
|
|
150
|
-
try {
|
|
151
|
-
const remoteHints = await remoteClient.recall({
|
|
152
|
-
signal,
|
|
153
|
-
signal_type,
|
|
154
|
-
bucket,
|
|
155
|
-
max_hints: limit - hints.length,
|
|
156
|
-
});
|
|
157
|
-
const localIds = new Set(hints.map(h => h.id));
|
|
158
|
-
for (const rh of remoteHints) {
|
|
159
|
-
if (hints.length >= limit)
|
|
160
|
-
break;
|
|
161
|
-
if (localIds.has(rh.id))
|
|
162
|
-
continue;
|
|
163
|
-
if (sessionSet && !bypassDedup && sessionSet.has(rh.id)) {
|
|
164
|
-
suppressed++;
|
|
165
|
-
continue;
|
|
166
|
-
}
|
|
167
|
-
hints.push(rh);
|
|
168
|
-
if (sessionSet)
|
|
169
|
-
sessionSet.add(rh.id);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
catch (e) {
|
|
173
|
-
console.warn(`[context-vault] Remote recall failed: ${e.message}`);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// Team vault recall: include team results if teamId is configured
|
|
177
|
-
const teamId = getTeamId(ctx.config);
|
|
178
|
-
if (remoteClient && teamId && hints.length < limit) {
|
|
179
|
-
try {
|
|
180
|
-
const teamHints = await remoteClient.teamRecall(teamId, {
|
|
181
|
-
signal,
|
|
182
|
-
signal_type,
|
|
183
|
-
bucket,
|
|
184
|
-
max_hints: limit - hints.length,
|
|
185
|
-
});
|
|
186
|
-
const existingIds = new Set(hints.map(h => h.id));
|
|
187
|
-
for (const th of teamHints) {
|
|
188
|
-
if (hints.length >= limit)
|
|
189
|
-
break;
|
|
190
|
-
if (existingIds.has(th.id))
|
|
191
|
-
continue;
|
|
192
|
-
if (sessionSet && !bypassDedup && sessionSet.has(th.id)) {
|
|
193
|
-
suppressed++;
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
hints.push({ ...th, tags: [...(th.tags || []), '[team]'] });
|
|
197
|
-
if (sessionSet)
|
|
198
|
-
sessionSet.add(th.id);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
catch (e) {
|
|
202
|
-
console.warn(`[context-vault] Team recall failed: ${e.message}`);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
// Public vault recall: query each configured public vault
|
|
206
|
-
const publicVaultSlugs = getPublicVaults(ctx.config);
|
|
207
|
-
if (remoteClient && publicVaultSlugs.length > 0 && hints.length < limit) {
|
|
208
|
-
const publicRecalls = publicVaultSlugs.map(slug => remoteClient.publicRecall(slug, {
|
|
209
|
-
signal,
|
|
210
|
-
signal_type,
|
|
211
|
-
bucket,
|
|
212
|
-
max_hints: limit - hints.length,
|
|
213
|
-
}).catch(e => {
|
|
214
|
-
console.warn(`[context-vault] Public vault "${slug}" recall failed: ${e.message}`);
|
|
215
|
-
return [];
|
|
216
|
-
}));
|
|
217
|
-
try {
|
|
218
|
-
const allPublicHints = await Promise.all(publicRecalls);
|
|
219
|
-
const existingIds = new Set(hints.map(h => h.id));
|
|
220
|
-
for (const publicHints of allPublicHints) {
|
|
221
|
-
for (const ph of publicHints) {
|
|
222
|
-
if (hints.length >= limit)
|
|
223
|
-
break;
|
|
224
|
-
if (existingIds.has(ph.id))
|
|
225
|
-
continue;
|
|
226
|
-
if (sessionSet && !bypassDedup && sessionSet.has(ph.id)) {
|
|
227
|
-
suppressed++;
|
|
228
|
-
continue;
|
|
229
|
-
}
|
|
230
|
-
hints.push({ ...ph, tags: [...(ph.tags || []), '[public]'] });
|
|
231
|
-
if (sessionSet)
|
|
232
|
-
sessionSet.add(ph.id);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
catch (e) {
|
|
237
|
-
console.warn(`[context-vault] Public vault recall failed: ${e.message}`);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
let method = hints.length > 0 ? 'tag_match' : 'none';
|
|
241
|
-
// Associative recall: always search durables semantically (regardless of keyword hits)
|
|
242
|
-
if (signal_type !== 'file' && isEmbedAvailable()) {
|
|
243
|
-
try {
|
|
244
|
-
const durableCount = ctx.db.prepare("SELECT COUNT(*) as c FROM vault_vec v JOIN vault e ON e.rowid = v.rowid WHERE e.tier = 'durable'").get().c;
|
|
245
|
-
if (durableCount > 0) {
|
|
246
|
-
const queryVec = await ctx.embed(signal);
|
|
247
|
-
if (queryVec) {
|
|
248
|
-
// KNN against all vectors, then filter to durables in hydration
|
|
249
|
-
const vecRows = ctx.db
|
|
250
|
-
.prepare('SELECT v.rowid, v.distance FROM vault_vec v WHERE embedding MATCH ? ORDER BY distance LIMIT 15')
|
|
251
|
-
.all(queryVec);
|
|
252
|
-
// Merge content vectors (vault_vec) and context vectors (vault_ctx_vec)
|
|
253
|
-
// Content vectors match on what the entry says; context vectors match on
|
|
254
|
-
// when/where the decision applies (encoding_context), bridging vocabulary gaps.
|
|
255
|
-
let ctxVecRows = [];
|
|
256
|
-
try {
|
|
257
|
-
const ctxVecCount = ctx.db.prepare('SELECT COUNT(*) as c FROM vault_ctx_vec').get().c;
|
|
258
|
-
if (ctxVecCount > 0) {
|
|
259
|
-
ctxVecRows = ctx.db
|
|
260
|
-
.prepare('SELECT v.rowid, v.distance FROM vault_ctx_vec v WHERE embedding MATCH ? ORDER BY distance LIMIT 15')
|
|
261
|
-
.all(queryVec);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
catch {
|
|
265
|
-
// vault_ctx_vec may not exist or be empty
|
|
266
|
-
}
|
|
267
|
-
// Combine both vector result sets, keeping best distance per rowid
|
|
268
|
-
const mergedDistMap = new Map();
|
|
269
|
-
for (const vr of vecRows) {
|
|
270
|
-
mergedDistMap.set(vr.rowid, vr.distance);
|
|
271
|
-
}
|
|
272
|
-
for (const cr of ctxVecRows) {
|
|
273
|
-
const existing = mergedDistMap.get(cr.rowid);
|
|
274
|
-
if (existing === undefined || cr.distance < existing) {
|
|
275
|
-
mergedDistMap.set(cr.rowid, cr.distance);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
const allRowids = [...mergedDistMap.keys()];
|
|
279
|
-
if (allRowids.length) {
|
|
280
|
-
const placeholders = allRowids.map(() => '?').join(',');
|
|
281
|
-
const hydrated = ctx.db
|
|
282
|
-
.prepare(`SELECT rowid, id, title, substr(body, 1, 150) as summary, kind, tags, tier FROM vault
|
|
283
|
-
WHERE rowid IN (${placeholders})
|
|
284
|
-
AND tier = 'durable'
|
|
285
|
-
AND indexed = 1
|
|
286
|
-
AND (expires_at IS NULL OR expires_at > datetime('now'))
|
|
287
|
-
AND superseded_by IS NULL`)
|
|
288
|
-
.all(...allRowids);
|
|
289
|
-
const byRowid = new Map();
|
|
290
|
-
for (const row of hydrated)
|
|
291
|
-
byRowid.set(row.rowid, row);
|
|
292
|
-
const existingIds = new Set(hints.map(h => h.id));
|
|
293
|
-
// Sort by distance (best first)
|
|
294
|
-
const sorted = allRowids
|
|
295
|
-
.map(rowid => ({ rowid, distance: mergedDistMap.get(rowid) }))
|
|
296
|
-
.sort((a, b) => a.distance - b.distance);
|
|
297
|
-
for (const { rowid, distance } of sorted) {
|
|
298
|
-
if (hints.length >= limit + 2)
|
|
299
|
-
break;
|
|
300
|
-
const row = byRowid.get(rowid);
|
|
301
|
-
if (!row)
|
|
302
|
-
continue;
|
|
303
|
-
if (existingIds.has(row.id))
|
|
304
|
-
continue;
|
|
305
|
-
const similarity = Math.max(0, 1 - distance / 2);
|
|
306
|
-
if (similarity < 0.45)
|
|
307
|
-
continue;
|
|
308
|
-
if (sessionSet && !bypassDedup && sessionSet.has(row.id)) {
|
|
309
|
-
suppressed++;
|
|
310
|
-
continue;
|
|
311
|
-
}
|
|
312
|
-
hints.push({
|
|
313
|
-
id: row.id,
|
|
314
|
-
title: row.title || '(untitled)',
|
|
315
|
-
summary: row.summary || '',
|
|
316
|
-
relevance: similarity >= 0.6 ? 'high' : 'medium',
|
|
317
|
-
kind: row.kind || 'knowledge',
|
|
318
|
-
tags: row.tags ? JSON.parse(row.tags) : [],
|
|
319
|
-
});
|
|
320
|
-
if (sessionSet)
|
|
321
|
-
sessionSet.add(row.id);
|
|
322
|
-
}
|
|
323
|
-
if (method === 'none' && hints.length > 0)
|
|
324
|
-
method = 'durable_semantic';
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
catch {
|
|
330
|
-
// Associative recall is best-effort
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
// Semantic fallback: when fast-path returns 0 results and signal is not file-based
|
|
334
|
-
if (hints.length === 0 && signal_type !== 'file' && isEmbedAvailable()) {
|
|
335
|
-
try {
|
|
336
|
-
const vecCount = ctx.db.prepare('SELECT COUNT(*) as c FROM vault_vec').get().c;
|
|
337
|
-
if (vecCount > 0) {
|
|
338
|
-
const queryVec = await ctx.embed(signal);
|
|
339
|
-
if (queryVec) {
|
|
340
|
-
const vecRows = ctx.db
|
|
341
|
-
.prepare('SELECT v.rowid, v.distance FROM vault_vec v WHERE embedding MATCH ? ORDER BY distance LIMIT 5')
|
|
342
|
-
.all(queryVec);
|
|
343
|
-
if (vecRows.length) {
|
|
344
|
-
const rowids = vecRows.map((vr) => vr.rowid);
|
|
345
|
-
const placeholders = rowids.map(() => '?').join(',');
|
|
346
|
-
let bucketFilter = '';
|
|
347
|
-
const hydrateParams = [...rowids];
|
|
348
|
-
if (bucket) {
|
|
349
|
-
bucketFilter = ' AND tags LIKE ?';
|
|
350
|
-
hydrateParams.push(`%"bucket:${bucket}"%`);
|
|
351
|
-
}
|
|
352
|
-
const hydrated = ctx.db
|
|
353
|
-
.prepare(`SELECT rowid, id, title, substr(body, 1, 100) as summary, kind, tags FROM vault WHERE rowid IN (${placeholders}) AND indexed = 1 AND (expires_at IS NULL OR expires_at > datetime('now')) AND superseded_by IS NULL${bucketFilter}`)
|
|
354
|
-
.all(...hydrateParams);
|
|
355
|
-
const byRowid = new Map();
|
|
356
|
-
for (const row of hydrated)
|
|
357
|
-
byRowid.set(row.rowid, row);
|
|
358
|
-
for (const vr of vecRows) {
|
|
359
|
-
if (hints.length >= limit)
|
|
360
|
-
break;
|
|
361
|
-
const row = byRowid.get(vr.rowid);
|
|
362
|
-
if (!row)
|
|
363
|
-
continue;
|
|
364
|
-
const similarity = Math.max(0, 1 - vr.distance / 2);
|
|
365
|
-
if (similarity < SEMANTIC_SIMILARITY_THRESHOLD)
|
|
366
|
-
continue;
|
|
367
|
-
// Session dedup
|
|
368
|
-
if (sessionSet && !bypassDedup && sessionSet.has(row.id)) {
|
|
369
|
-
suppressed++;
|
|
370
|
-
continue;
|
|
371
|
-
}
|
|
372
|
-
const entryTags = row.tags ? JSON.parse(row.tags) : [];
|
|
373
|
-
hints.push({
|
|
374
|
-
id: row.id,
|
|
375
|
-
title: row.title || '(untitled)',
|
|
376
|
-
summary: row.summary || '',
|
|
377
|
-
relevance: similarity >= 0.8 ? 'high' : 'medium',
|
|
378
|
-
kind: row.kind || 'knowledge',
|
|
379
|
-
tags: entryTags,
|
|
380
|
-
});
|
|
381
|
-
if (sessionSet)
|
|
382
|
-
sessionSet.add(row.id);
|
|
383
|
-
}
|
|
384
|
-
if (hints.length > 0)
|
|
385
|
-
method = 'semantic';
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
catch {
|
|
391
|
-
// Semantic fallback is best-effort; fast path already ran
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
const latency = Date.now() - start;
|
|
395
|
-
if (hints.length === 0) {
|
|
396
|
-
const result = ok('No relevant entries found.');
|
|
397
|
-
result._meta = {
|
|
398
|
-
latency_ms: latency,
|
|
399
|
-
method,
|
|
400
|
-
signal_keywords: keywords,
|
|
401
|
-
suppressed,
|
|
402
|
-
};
|
|
403
|
-
return result;
|
|
404
|
-
}
|
|
405
|
-
// Record co-retrieval pairs (fire and forget, non-blocking)
|
|
406
|
-
if (hints.length >= 2) {
|
|
407
|
-
recordCoRetrieval(ctx, hints.map((h) => h.id));
|
|
408
|
-
}
|
|
409
|
-
// Check for auto-memory overlap to avoid redundant surfacing
|
|
410
|
-
let autoMemoryOverlaps = [];
|
|
411
|
-
try {
|
|
412
|
-
const autoMemory = getAutoMemory();
|
|
413
|
-
if (autoMemory.detected && autoMemory.entries.length > 0) {
|
|
414
|
-
for (const h of hints) {
|
|
415
|
-
const searchText = [h.title, h.summary].filter(Boolean).join(' ');
|
|
416
|
-
const overlaps = findAutoMemoryOverlaps(autoMemory, searchText, 0.3);
|
|
417
|
-
if (overlaps.length > 0) {
|
|
418
|
-
autoMemoryOverlaps.push({
|
|
419
|
-
hint_id: h.id,
|
|
420
|
-
memory_file: overlaps[0].file,
|
|
421
|
-
memory_name: overlaps[0].name,
|
|
422
|
-
});
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
catch {
|
|
428
|
-
// Non-fatal
|
|
429
|
-
}
|
|
430
|
-
// Format output
|
|
431
|
-
const lines = [`[Vault: ${hints.length} ${hints.length === 1 ? 'entry' : 'entries'} may be relevant]`];
|
|
432
|
-
for (const h of hints) {
|
|
433
|
-
const overlap = autoMemoryOverlaps.find(o => o.hint_id === h.id);
|
|
434
|
-
const overlapNote = overlap ? ` [also in auto-memory: ${overlap.memory_name}]` : '';
|
|
435
|
-
lines.push(`- "${h.title}" (${h.kind}, ${h.relevance})${overlapNote}`);
|
|
436
|
-
}
|
|
437
|
-
lines.push('Use get_context to retrieve full details.');
|
|
438
|
-
const result = ok(lines.join('\n'));
|
|
439
|
-
result._meta = {
|
|
440
|
-
latency_ms: latency,
|
|
441
|
-
method,
|
|
442
|
-
signal_keywords: keywords,
|
|
443
|
-
suppressed,
|
|
444
|
-
hints,
|
|
445
|
-
auto_memory_overlaps: autoMemoryOverlaps.length > 0 ? autoMemoryOverlaps : undefined,
|
|
446
|
-
};
|
|
447
|
-
return result;
|
|
448
|
-
}
|
|
449
|
-
function recordCoRetrieval(ctx, ids) {
|
|
450
|
-
try {
|
|
451
|
-
const now = new Date().toISOString();
|
|
452
|
-
const upsert = ctx.db.prepare(`INSERT INTO co_retrievals (entry_a, entry_b, count, last_at) VALUES (?, ?, 1, ?)
|
|
453
|
-
ON CONFLICT(entry_a, entry_b) DO UPDATE SET count = MIN(count + 1, ?), last_at = ?`);
|
|
454
|
-
for (let i = 0; i < ids.length; i++) {
|
|
455
|
-
for (let j = i + 1; j < ids.length; j++) {
|
|
456
|
-
const [a, b] = ids[i] < ids[j] ? [ids[i], ids[j]] : [ids[j], ids[i]];
|
|
457
|
-
upsert.run(a, b, now, CO_RETRIEVAL_WEIGHT_CAP, now);
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
catch {
|
|
462
|
-
// Non-fatal: co-retrieval recording is best-effort
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
/** Reset session dedup state (for testing) */
|
|
466
|
-
export function _resetSessionState() {
|
|
467
|
-
sessionSurfaced.clear();
|
|
468
|
-
}
|
|
469
|
-
//# sourceMappingURL=session-start.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/tools/session-start.ts"],"names":[],"mappings":"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"}
|