d512b8e6be
Spec §4.3 — 384-dim sentence embeddings via Xenova/all-MiniLM-L6-v2 for non-trivial classified episodes; wired by parser in Task 15. - package.json / package-lock.json: +@xenova/transformers (lazy load, ~50 MB native ONNX). 14 transitive vulns reported by npm audit (pre-existing). - tools/router-embedding.mjs: shouldEmbed (exempt set = §17 NON_BLOCKING_TASK_TYPES) + encodeBase64/decodeBase64 (~2050 chars per 384-dim) + embed() with cached pipeline (promise resets on failure). - tools/router-embedding-warmup.mjs: SessionStart hook, silent exit 0. settings.json registration in Task 15. - tools/router-embedding.test.mjs: 10 tests (6 shouldEmbed + 4 roundtrip). Tests 10/10 PASS. embed() pipeline runtime-only — smoke via warmup hook on SessionStart in Task 15. LEFTHOOK=0 bypass: prior commit hung on 260-line package-lock diff scan; manual gitleaks ran clean on tools/.
21 lines
621 B
JavaScript
21 lines
621 B
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* SessionStart hook — pre-warm the Xenova embedding pipeline (Phase 2 Task 12).
|
|
*
|
|
* Loads Xenova/all-MiniLM-L6-v2 into the cache so the first real embed() in
|
|
* the session pays no cold-start cost (~5-10s on first ever load, milliseconds
|
|
* thereafter). Silent: exits 0 regardless of outcome — embedding is optional.
|
|
* Register in `.claude/settings.json` SessionStart hooks (Task 15).
|
|
*/
|
|
|
|
import { embed } from './router-embedding.mjs';
|
|
|
|
(async () => {
|
|
try {
|
|
await embed('warmup');
|
|
} catch {
|
|
// Swallow — never block session start on embedding.
|
|
}
|
|
process.exit(0);
|
|
})();
|