Files
portal/tools/router-embedding-warmup.mjs
T
Дмитрий d512b8e6be feat(router): local embedding + SessionStart warmup (phase 2 task 12)
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/.
2026-05-25 14:28:25 +03:00

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);
})();