40e4a527fe
Introduce RRF-based recall fusion for personal/episodic/temporal paths, zvec-grep workspace shadow probing for code executors, and a local headroom proxy starter aligned with the fusion plan defaults. Co-authored-by: Cursor <cursoragent@cursor.com>
45 lines
1.3 KiB
JavaScript
45 lines
1.3 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import {
|
|
formatZvecWorkspaceBlock,
|
|
resolveZvecWorkspaceMode,
|
|
searchZvecWorkspace,
|
|
} from './memind-zvec-workspace.mjs';
|
|
|
|
test('resolveZvecWorkspaceMode defaults to off', () => {
|
|
assert.equal(resolveZvecWorkspaceMode({}), 'off');
|
|
assert.equal(resolveZvecWorkspaceMode({ MEMIND_ZVEC_WORKSPACE_MODE: 'shadow' }), 'shadow');
|
|
});
|
|
|
|
test('searchZvecWorkspace is no-op when disabled', () => {
|
|
const result = searchZvecWorkspace({
|
|
query: 'headroom',
|
|
env: { MEMIND_ZVEC_WORKSPACE_MODE: 'off' },
|
|
});
|
|
assert.equal(result.skipped, true);
|
|
assert.equal(result.hits.length, 0);
|
|
});
|
|
|
|
test('formatZvecWorkspaceBlock renders hit paths', () => {
|
|
const block = formatZvecWorkspaceBlock({
|
|
hits: [{ path: 'a.mjs', startLine: 1, endLine: 3, matchedBy: 'fts' }],
|
|
});
|
|
assert.match(block, /a\.mjs:1-3/);
|
|
});
|
|
|
|
test('searchZvecWorkspace parses zg query stdout', () => {
|
|
const stdout = [
|
|
'query groups (1):',
|
|
'#1 matchedBy=fts docs/plan.md:10-20',
|
|
'#2 matchedBy=vector src/app.mjs:3-8',
|
|
].join('\n');
|
|
const result = searchZvecWorkspace({
|
|
query: 'plan',
|
|
env: { MEMIND_ZVEC_WORKSPACE_MODE: 'shadow' },
|
|
cwd: '/tmp',
|
|
spawnImpl: () => ({ status: 0, stdout, stderr: '' }),
|
|
});
|
|
assert.equal(result.hitCount, 2);
|
|
assert.equal(result.hits[0].path, 'docs/plan.md');
|
|
});
|