@holoscript/holoembed 6.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/charTrigram.ts","../src/SnnAccelerator.ts","../src/types.ts","../src/HoloEmbedEncoder.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * charTrigram — char-trigram histogram utilities\n *\n * Canonical implementation for HoloEmbed subword encoding.\n * Also used by HoloEmbedProvider in absorb-service (via copy-import pattern;\n * absorb-service does not take @holoscript/holoembed as a dep to avoid cycles).\n *\n * ## Algorithm\n *\n * 1. camelSplit: tokenize PascalCase/camelCase/snake_case/event:names into words\n * 2. Lowercase + strip non-alphanumeric → clean token sequence\n * 3. Slide 3-char window over each word; skip cross-word boundaries\n * 4. FNV-1a hash each 3-char sequence → bucket in [0, bins)\n * 5. Normalize bucket counts by total trigram count → [0, 1] histogram\n *\n * ## Why char trigrams?\n *\n * \"PillarSliceEmitter\" camel-split → \"pillar slice emitter\"\n * trigrams include: \"pil\",\"ill\",\"lla\",\"lar\" / \"sli\",\"lic\",\"ice\" / \"emi\",\"mit\",\"itt\",\"tte\",\"ter\"\n *\n * NL query \"pillar slice emitter\" produces IDENTICAL trigrams → perfect histogram overlap.\n * The 128-bin FNV hash means some trigrams collide, but the overlap signal dominates for\n * name-matched pairs.\n *\n * This is a BPE-lite approach: no vocabulary, no model, no training. Pure character algebra.\n */\n\n// =============================================================================\n// CAMEL / PASCAL / SNAKE SPLIT\n// =============================================================================\n\n/**\n * Tokenize a camelCase / PascalCase / snake_case / colon-separated identifier\n * into space-separated lowercase words suitable for trigram extraction.\n *\n * Examples:\n * \"PillarSliceEmitter\" → \"pillar slice emitter\"\n * \"extractEmitSites\" → \"extract emit sites\"\n * \"ev:pillar:spike\" → \"ev pillar spike\"\n * \"BRAIN_COORD_MAPPER\" → \"brain coord mapper\"\n * \"pillar slice emitter\" → \"pillar slice emitter\" (NL query passthrough)\n */\nexport function camelSplit(s: string): string {\n return s\n // Insert space before uppercase following lowercase: \"aSite\" → \"a Site\"\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n // Insert space before uppercase run followed by lowercase: \"HTMLParser\" → \"HTML Parser\"\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n // Replace non-alphanumeric separators (_, -, :, ., /) with space\n .replace(/[^a-zA-Z0-9]+/g, ' ')\n .trim()\n .toLowerCase();\n}\n\n// =============================================================================\n// TRIGRAM HISTOGRAM\n// =============================================================================\n\n/**\n * Accumulate a char-trigram histogram of `text` into `vec[offset..offset+bins)`.\n *\n * - Applies camelSplit to the input text first.\n * - Extracts all 3-char windows that don't cross word boundaries.\n * - FNV-1a hashes each trigram into a bin.\n * - Normalizes by total trigram count → values in [0, 1].\n *\n * Note: this function does NOT L2-normalize the output; the caller does a\n * single L2 normalization over the full output vector after all blocks are filled.\n */\nexport function trigramHistogram(\n text: string,\n vec: Float32Array,\n offset: number,\n bins: number,\n): void {\n const clean = camelSplit(text); // already lowercase\n if (clean.length < 3) return;\n\n const counts = new Float32Array(bins);\n let total = 0;\n\n for (let i = 0; i <= clean.length - 3; i++) {\n const a = clean[i]!;\n const b = clean[i + 1]!;\n const c = clean[i + 2]!;\n // Skip any trigram spanning a word boundary\n if (a === ' ' || b === ' ' || c === ' ') continue;\n\n // FNV-1a hash of the 3 chars\n let h = 2166136261;\n h ^= a.charCodeAt(0); h = (h * 16777619) >>> 0;\n h ^= b.charCodeAt(0); h = (h * 16777619) >>> 0;\n h ^= c.charCodeAt(0); h = (h * 16777619) >>> 0;\n\n counts[h % bins]!++;\n total++;\n }\n\n if (total > 0) {\n for (let i = 0; i < bins; i++) {\n vec[offset + i] = counts[i]! / total;\n }\n }\n}\n\n// =============================================================================\n// STRUCTURAL BASE (file-path / signature features)\n// =============================================================================\n\n/**\n * FNV-1a 32-bit hash of a string.\n * Used for deterministic structural feature spreading.\n */\nexport function hashString(s: string): number {\n let h = 2166136261;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = (h * 16777619) >>> 0;\n }\n return h;\n}\n\n/**\n * Spread a 32-bit hash deterministically into `count` dims of `vec`\n * starting at `offset`. Each dim is in [0, 1] via LCG.\n */\nexport function spreadHash(hash: number, vec: Float32Array, offset: number, count: number): void {\n let state = hash;\n for (let i = 0; i < count; i++) {\n state = ((state * 1664525 + 1013904223) >>> 0);\n vec[offset + i] = (state >>> 0) / 4294967295;\n }\n}\n\n/** In-place L2 normalization. */\nexport function l2Normalize(vec: Float32Array): void {\n let norm = 0;\n for (let i = 0; i < vec.length; i++) norm += vec[i]! * vec[i]!;\n norm = Math.sqrt(norm);\n if (norm > 0) {\n for (let i = 0; i < vec.length; i++) vec[i]! /= norm;\n }\n}\n","/**\n * SnnAccelerator — SNN-WebGPU population coding for HoloEmbed\n *\n * Replaces the static char-trigram histogram blocks with a richer\n * Leaky Integrate-and-Fire population code:\n *\n * Input: 128-dim normalized trigram histogram h[0..127]\n * Process: inject h[i] as synaptic current into LIF neuron i\n * simulate T timesteps at dt=1ms (default T=50)\n * Output: 128-dim spike-rate vector r[i] = spikes_i / T\n *\n * ## Why SNN population coding enriches embeddings\n *\n * The raw trigram histogram encodes frequency linearly: h[i] = count_i / total.\n * The LIF population code adds a nonlinear threshold transformation:\n * - High-frequency trigrams (large h[i]) → many spikes → high r[i]\n * - Rare trigrams (small h[i]) → sub-threshold → r[i] ≈ 0\n *\n * This sparse representation has better cosine similarity properties than\n * a dense histogram: two symbols with the same DOMINANT trigrams score high\n * even if their rare-trigram distribution differs. Matches the biological\n * precedent in Paper 33 (brain white-matter routing).\n *\n * ## WebGPU availability\n *\n * WebGPU is available in:\n * - Chrome 113+ / Edge 113+ (desktop)\n * - Node.js with the `webgpu` npm binding installed (auto-activated via ensureNodeWebGpu)\n *\n * In CI / Node.js without WebGPU, the accelerator reports `available = false`\n * and returns the input histogram unchanged (CPU passthrough). No behavior\n * difference — only performance difference for large batches.\n *\n * ## WGSL shader\n *\n * See `LIF_POPULATION_WGSL` below. One dispatch per symbol block.\n * Workgroup size 64 → 128 neurons fit in 2 workgroups.\n */\n\nimport type { EncoderOptions } from './types.js';\nimport { ensureNodeWebGpu } from '@holoscript/snn-webgpu';\n\n// =============================================================================\n// WGSL SHADER\n// =============================================================================\n\n/** LIF population coding compute shader — encodes 128-bin histogram to spike rates. */\nconst LIF_POPULATION_WGSL = /* wgsl */ `\nstruct LIFParams {\n tau : f32, // membrane time constant (ms). Default 20.0\n vThreshold: f32, // spike threshold (mV). Default -55.0\n vReset : f32, // post-spike reset (mV). Default -75.0\n vRest : f32, // resting potential (mV). Default -65.0\n dt : f32, // timestep (ms). Default 1.0\n timeSteps : u32, // number of LIF iterations. Default 50\n neuronCount: u32, // number of neurons (= input dims)\n currentScale: f32, // scale factor for current injection. Default 240.0\n};\n\n@group(0) @binding(0) var<uniform> params : LIFParams;\n@group(0) @binding(1) var<storage, read> currents: array<f32>; // [neuronCount] in [0,1]\n@group(0) @binding(2) var<storage, read_write> rates: array<f32>; // [neuronCount] out\n\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let i = gid.x;\n if (i >= params.neuronCount) { return; }\n\n let I_ext = currents[i] * params.currentScale; // scale to mV-equivalent current\n var V = params.vRest;\n var spikes: u32 = 0u;\n\n for (var t = 0u; t < params.timeSteps; t++) {\n // Euler LIF: dV/dt = (vRest - V + I_ext) / tau\n V += params.dt * (params.vRest - V + I_ext) / params.tau;\n if (V >= params.vThreshold) {\n V = params.vReset;\n spikes += 1u;\n }\n }\n\n // Spike rate: fraction of timesteps with a spike\n rates[i] = f32(spikes) / f32(params.timeSteps);\n}\n`;\n\n// =============================================================================\n// LIF DEFAULT PARAMETERS\n// =============================================================================\n\nconst DEFAULT_LIF: Required<LIFPopulationParams> = {\n tau: 20.0,\n vThreshold: -55.0,\n vReset: -75.0,\n vRest: -65.0,\n dt: 1.0,\n currentScale: 240.0,\n};\n\nexport interface LIFPopulationParams {\n tau?: number;\n vThreshold?: number;\n vReset?: number;\n vRest?: number;\n dt?: number;\n /** Scale factor applied to normalized trigram histogram values to produce mV-equivalent injection. */\n currentScale?: number;\n}\n\nexport interface LIFPopulationCpuOptions {\n /** Number of LIF timesteps. Matches EncoderOptions.snnTimesteps. */\n timeSteps?: number;\n /** Optional LIF parameter overrides. */\n lifParams?: LIFPopulationParams;\n}\n\n/**\n * CPU reference implementation of the LIF population coder.\n *\n * Production fallback remains identity passthrough so no CPU-only runtime pays\n * for LIF simulation accidentally. Tests and benchmarks use this function as\n * the apples-to-apples reference for the WebGPU shader.\n */\nexport function encodeLifPopulationCpu(\n histogram: Float32Array,\n options: LIFPopulationCpuOptions = {},\n): Float32Array {\n const timeSteps = normalizeTimeSteps(options.timeSteps ?? 50);\n const lif = resolveLifPopulationParams(options.lifParams);\n const rates = new Float32Array(histogram.length);\n\n for (let i = 0; i < histogram.length; i++) {\n const input = histogram[i] ?? 0;\n const current = input * lif.currentScale;\n let voltage = lif.vRest;\n let spikes = 0;\n\n for (let t = 0; t < timeSteps; t++) {\n voltage += lif.dt * (lif.vRest - voltage + current) / lif.tau;\n if (voltage >= lif.vThreshold) {\n voltage = lif.vReset;\n spikes++;\n }\n }\n\n rates[i] = spikes / timeSteps;\n }\n\n return rates;\n}\n\nfunction resolveLifPopulationParams(lifParams: LIFPopulationParams = {}): Required<LIFPopulationParams> {\n return { ...DEFAULT_LIF, ...lifParams };\n}\n\nfunction normalizeTimeSteps(value: number): number {\n if (!Number.isFinite(value) || value < 1) return 1;\n return Math.floor(value);\n}\n\n// =============================================================================\n// SNN ACCELERATOR\n// =============================================================================\n\n/**\n * SNN-WebGPU population coder for HoloEmbed trigram blocks.\n *\n * Usage:\n * ```ts\n * const accel = new SnnAccelerator();\n * await accel.initialize({ enableSnn: true });\n *\n * // In embedding loop:\n * const spikeRates = await accel.encode(trigramHistogram);\n * ```\n */\n\nexport class SnnAccelerator {\n private _available = false;\n private _timeSteps = 50;\n private _lif: Required<LIFPopulationParams> = { ...DEFAULT_LIF };\n\n // WebGPU resources (set after initialize() when GPU is available)\n private _device?: GPUDevice;\n private _pipeline?: GPUComputePipeline;\n private _paramsBuffer?: GPUBuffer;\n\n // ── Public ─────────────────────────────────────────────────────────────\n\n /** Whether the GPU path is active. In Node, requires the `webgpu` binding (auto-activated via ensureNodeWebGpu). */\n get available(): boolean { return this._available; }\n\n /**\n * Initialize the accelerator.\n * Detects WebGPU, compiles the LIF shader, allocates uniform buffers.\n * Safe to call multiple times; no-op after first successful init.\n */\n async initialize(opts: EncoderOptions = {}, lifParams: LIFPopulationParams = {}): Promise<void> {\n if (this._available) return; // already up\n\n this._timeSteps = normalizeTimeSteps(opts.snnTimesteps ?? 50);\n this._lif = resolveLifPopulationParams(lifParams);\n\n const enabled = opts.enableSnn !== false;\n if (!enabled) return;\n\n // Activate the Node WebGPU binding if present (no-op in browser).\n await ensureNodeWebGpu();\n\n // Feature-detect WebGPU (browser native, or Node via the `webgpu` binding)\n const gpu = (globalThis as { navigator?: { gpu?: unknown } }).navigator?.gpu\n ?? (globalThis as { GPU?: unknown }).GPU;\n if (!gpu) return;\n\n try {\n const adapter = await (gpu as GPU).requestAdapter();\n if (!adapter) return;\n this._device = await adapter.requestDevice();\n await this._compilePipeline();\n this._available = true;\n } catch {\n // WebGPU init failed — fall back to CPU passthrough\n this._device = undefined;\n this._available = false;\n }\n }\n\n /**\n * Encode a 128-dim trigram histogram through the LIF population.\n *\n * Returns a 128-dim spike-rate vector.\n * If GPU is unavailable, returns the input histogram unchanged (CPU passthrough).\n */\n async encode(histogram: Float32Array): Promise<Float32Array> {\n if (!this._available || !this._device) {\n return histogram; // CPU passthrough — identical dims, no transformation\n }\n return this._gpuEncode(histogram);\n }\n\n /**\n * Encode a batch of histograms. Amortizes GPU round-trip cost.\n * Falls back to sequential CPU passthrough if GPU unavailable.\n */\n async encodeBatch(histograms: Float32Array[]): Promise<Float32Array[]> {\n if (!this._available || !this._device) {\n return histograms; // CPU passthrough\n }\n if (histograms.length === 0) return [];\n // Fused batch path: all histograms must share one length (the 128-bin trigram\n // block invariant). LIF is per-element independent, so we flatten M x N into one\n // storage buffer and run a single dispatch + single readback, eliminating the\n // per-histogram buffer-create/map-read round-trip that dominated the old path.\n const n = histograms[0]!.length;\n const uniform = histograms.every(h => h.length === n);\n if (uniform) return this._gpuEncodeBatch(histograms, n);\n // Mixed lengths (rare) — fall back to per-item.\n return Promise.all(histograms.map(h => this._gpuEncode(h)));\n }\n\n /** Release GPU resources. */\n dispose(): void {\n this._paramsBuffer?.destroy();\n this._device?.destroy();\n this._device = undefined;\n this._pipeline = undefined;\n this._paramsBuffer = undefined;\n this._available = false;\n }\n\n // ── Private ──────────────────────────────────────────────────────────────\n\n private async _compilePipeline(): Promise<void> {\n const device = this._device!;\n\n // Compile the LIF compute shader\n const module = device.createShaderModule({ code: LIF_POPULATION_WGSL });\n\n this._pipeline = await device.createComputePipelineAsync({\n layout: 'auto',\n compute: { module, entryPoint: 'main' },\n });\n\n // Allocate params uniform buffer (constant per LIF config)\n this._paramsBuffer = device.createBuffer({\n size: 32, // 8 × f32/u32\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n\n // Upload LIF parameters\n const paramData = new ArrayBuffer(32);\n const f32 = new Float32Array(paramData);\n const u32 = new Uint32Array(paramData);\n f32[0] = this._lif.tau;\n f32[1] = this._lif.vThreshold;\n f32[2] = this._lif.vReset;\n f32[3] = this._lif.vRest;\n f32[4] = this._lif.dt;\n u32[5] = this._timeSteps;\n // neuronCount is set per-call\n f32[7] = this._lif.currentScale;\n device.queue.writeBuffer(this._paramsBuffer, 0, paramData);\n }\n\n private async _gpuEncode(histogram: Float32Array): Promise<Float32Array> {\n const device = this._device!;\n const pipeline = this._pipeline!;\n const paramsBuffer = this._paramsBuffer!;\n const neuronCount = histogram.length;\n\n // Patch neuronCount into the uniform buffer\n const neuronCountBuf = new Uint32Array([neuronCount]);\n device.queue.writeBuffer(paramsBuffer, 24, neuronCountBuf); // offset 24 = 6th u32\n\n // Input buffer (write histogram)\n const inputBuffer = device.createBuffer({\n size: neuronCount * 4,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n mappedAtCreation: true,\n });\n new Float32Array(inputBuffer.getMappedRange()).set(histogram);\n inputBuffer.unmap();\n\n // Output buffer (read spike rates)\n const outputBuffer = device.createBuffer({\n size: neuronCount * 4,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n const stagingBuffer = device.createBuffer({\n size: neuronCount * 4,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n\n // Bind group\n const bindGroup = device.createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: paramsBuffer } },\n { binding: 1, resource: { buffer: inputBuffer } },\n { binding: 2, resource: { buffer: outputBuffer } },\n ],\n });\n\n // Dispatch\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.dispatchWorkgroups(Math.ceil(neuronCount / 64));\n pass.end();\n encoder.copyBufferToBuffer(outputBuffer, 0, stagingBuffer, 0, neuronCount * 4);\n device.queue.submit([encoder.finish()]);\n\n // Readback\n await stagingBuffer.mapAsync(GPUMapMode.READ);\n const result = new Float32Array(stagingBuffer.getMappedRange().slice(0));\n stagingBuffer.unmap();\n\n // Cleanup\n inputBuffer.destroy();\n outputBuffer.destroy();\n stagingBuffer.destroy();\n\n return result;\n }\n\n /**\n * Fused batch encode: M histograms of equal length N processed in a SINGLE\n * dispatch + single readback. Because the LIF update is per-element independent,\n * the existing shader runs unchanged over a flattened (M*N) array; each thread\n * encodes one (histogram, neuron) pair. This removes the M x buffer-create and\n * M x mapAsync round-trips that made the per-item path slower than CPU.\n */\n private async _gpuEncodeBatch(histograms: Float32Array[], n: number): Promise<Float32Array[]> {\n const device = this._device!;\n const pipeline = this._pipeline!;\n const paramsBuffer = this._paramsBuffer!;\n const m = histograms.length;\n const total = m * n;\n\n // neuronCount uniform = total flattened elements (per-element bounds check)\n device.queue.writeBuffer(paramsBuffer, 24, new Uint32Array([total]));\n\n // Flatten M x N into one contiguous input buffer\n const flat = new Float32Array(total);\n for (let j = 0; j < m; j++) flat.set(histograms[j]!, j * n);\n\n const inputBuffer = device.createBuffer({\n size: total * 4,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n mappedAtCreation: true,\n });\n new Float32Array(inputBuffer.getMappedRange()).set(flat);\n inputBuffer.unmap();\n\n const outputBuffer = device.createBuffer({\n size: total * 4,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n });\n const stagingBuffer = device.createBuffer({\n size: total * 4,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n\n const bindGroup = device.createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: paramsBuffer } },\n { binding: 1, resource: { buffer: inputBuffer } },\n { binding: 2, resource: { buffer: outputBuffer } },\n ],\n });\n\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginComputePass();\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.dispatchWorkgroups(Math.ceil(total / 64));\n pass.end();\n encoder.copyBufferToBuffer(outputBuffer, 0, stagingBuffer, 0, total * 4);\n device.queue.submit([encoder.finish()]);\n\n await stagingBuffer.mapAsync(GPUMapMode.READ);\n const all = new Float32Array(stagingBuffer.getMappedRange().slice(0));\n stagingBuffer.unmap();\n\n inputBuffer.destroy();\n outputBuffer.destroy();\n stagingBuffer.destroy();\n\n // Slice the flat result back into M per-histogram vectors\n const out: Float32Array[] = new Array(m);\n for (let j = 0; j < m; j++) out[j] = all.slice(j * n, j * n + n);\n return out;\n }\n}\n","/**\n * HoloEmbed — shared types\n */\n\n// =============================================================================\n// SYMBOL INPUT\n// =============================================================================\n\n/**\n * Minimal symbol descriptor needed for encoding.\n * Intentionally independent of `@holoscript/absorb-service` types so this\n * package can be used without absorb-service as a dependency.\n */\nexport interface SymbolInput {\n /** Symbol identifier (camelCase, PascalCase, snake_case). */\n name: string;\n /** Symbol kind: function | method | class | interface | type_alias | enum | constant | field */\n type: string;\n /** Absolute or root-relative file path. */\n filePath: string;\n /** 1-based line number. */\n line: number;\n /** 0-based column. */\n column?: number;\n /** Signature string, e.g. \"function foo(x: string): void\" */\n signature?: string;\n /** JSDoc / block-comment extracted from source. */\n docComment?: string;\n /** Whether the symbol is exported. */\n isExported?: boolean;\n /** Visibility: 'public' | 'protected' | 'private' | 'internal' */\n visibility?: string;\n /** Owner class/interface name (for methods/fields). */\n owner?: string;\n /** Lines of code. */\n lineCount?: number;\n}\n\n// =============================================================================\n// GRAPH ENRICHMENT\n// =============================================================================\n\n/**\n * Optional graph-topology features passed alongside a SymbolInput.\n * When provided, these fill the structural call-graph and event-chain dims.\n */\nexport interface GraphEnrichment {\n /** Number of callers of this symbol. */\n fanIn?: number;\n /** Number of callees from this symbol. */\n fanOut?: number;\n /** Number of event emissions. */\n emitCount?: number;\n /** Number of event subscriptions. */\n listenCount?: number;\n /** Names of events emitted or listened to. */\n eventNames?: string[];\n}\n\n// =============================================================================\n// ENCODER OPTIONS\n// =============================================================================\n\nexport interface EncoderOptions {\n /**\n * Whether to attempt SNN-WebGPU acceleration.\n * Defaults to true; gracefully falls back to CPU if WebGPU is unavailable.\n */\n enableSnn?: boolean;\n /**\n * Number of LIF timesteps for SNN population coding.\n * Higher values → richer spike-rate patterns, slower GPU batch.\n * Default: 50 (50ms simulated at dt=1ms).\n */\n snnTimesteps?: number;\n}\n\n// =============================================================================\n// OUTPUT\n// =============================================================================\n\n/** Dimensionality of the HoloEmbed output vector. */\nexport const HOLOEMBED_DIM = 768;\n\n/** Dimensionality of the structural base (dims 0-383). */\nexport const STRUCTURAL_DIM = 384;\n\n/** Number of bins per char-trigram subword block (dims 384-511, 512-639, 640-767). */\nexport const SUBWORD_BINS = 128;\n\n/** Number of subword blocks. */\nexport const SUBWORD_BLOCKS = 3;\n","/**\n * HoloEmbedEncoder — main 768-dim encoder\n *\n * Combines:\n * Dims 0–383: structural base (file topology, call-graph, event-chain)\n * Dims 384–511: char-trigram histogram of name + type + signature (128 bins)\n * Dims 512–639: char-trigram histogram of docComment (128 bins)\n * Dims 640–767: char-trigram histogram of event names (128 bins)\n *\n * Optional SNN-WebGPU population coding (Phase 2 acceleration):\n * Each trigram block is passed through a 128-neuron LIF population.\n * Output → spike-rate vector (sparse, threshold-coded) instead of raw histogram.\n * Falls back to raw histogram when GPU is unavailable.\n *\n * ## Canonical use\n *\n * ```ts\n * import { HoloEmbedEncoder } from '@holoscript/holoembed';\n *\n * const encoder = new HoloEmbedEncoder();\n * await encoder.initialize({ enableSnn: true }); // no-op if GPU unavailable\n *\n * const vec = encoder.encode(sym, { fanIn: 3, eventNames: ['pillar:spike'] });\n * const textVec = encoder.encodeText('pillar slice emitter'); // for NL queries\n * ```\n *\n * ## EmbeddingProvider integration\n *\n * See `HoloEmbedProvider` in `@holoscript/absorb-service` — thin wrapper that\n * delegates to this encoder and satisfies the `EmbeddingProvider` interface.\n */\n\nimport {\n trigramHistogram,\n spreadHash,\n hashString,\n l2Normalize,\n camelSplit,\n} from './charTrigram.js';\nimport { SnnAccelerator } from './SnnAccelerator.js';\nimport type { SymbolInput, GraphEnrichment, EncoderOptions } from './types.js';\nimport {\n STRUCTURAL_DIM,\n SUBWORD_BINS,\n HOLOEMBED_DIM,\n} from './types.js';\n\n// =============================================================================\n// KNOWN PACKAGES / DIRS (structural base — mirrors StructuralEmbeddingProvider)\n// =============================================================================\n\nconst KNOWN_PACKAGES = [\n 'packages/core',\n 'packages/mcp-server',\n 'packages/plugins',\n 'packages/absorb-service',\n 'packages/studio',\n 'packages/r3f-renderer',\n];\n\n// =============================================================================\n// HOLOEMBED ENCODER\n// =============================================================================\n\nexport class HoloEmbedEncoder {\n private _accel = new SnnAccelerator();\n private _snnEnabled = false;\n\n /**\n * Initialize the encoder.\n * Attempts SNN-WebGPU setup if `enableSnn` is true (default).\n * Falls back to CPU encoding if GPU is unavailable — always safe to await.\n */\n async initialize(opts: EncoderOptions = {}): Promise<void> {\n await this._accel.initialize(opts);\n this._snnEnabled = this._accel.available;\n }\n\n /** Whether the GPU SNN path is active. */\n get snnActive(): boolean { return this._snnEnabled; }\n\n /**\n * Encode a symbol to a 768-dim L2-normalized Float32Array.\n *\n * Synchronous when SNN is disabled (CPU-only).\n * Returns a Float32Array that can be passed to cosine-similarity search.\n */\n encode(sym: SymbolInput, graph: GraphEnrichment = {}): Float32Array {\n const vec = new Float32Array(HOLOEMBED_DIM);\n this._fillStructural(vec, sym, graph);\n this._fillSubword(vec, sym, graph);\n l2Normalize(vec);\n return vec;\n }\n\n /**\n * Async encode — uses SNN population coding for the trigram blocks when GPU is active.\n * Identical to `encode()` when GPU is unavailable.\n */\n async encodeAsync(sym: SymbolInput, graph: GraphEnrichment = {}): Promise<Float32Array> {\n const vec = new Float32Array(HOLOEMBED_DIM);\n this._fillStructural(vec, sym, graph);\n\n if (this._snnEnabled) {\n await this._fillSubwordSnn(vec, sym, graph);\n } else {\n this._fillSubword(vec, sym, graph);\n }\n\n l2Normalize(vec);\n return vec;\n }\n\n /**\n * Encode a plain text string to a 768-dim vector.\n * For use with NL queries — fills the structural + name/sig trigram blocks.\n */\n encodeText(text: string): Float32Array {\n const vec = new Float32Array(HOLOEMBED_DIM);\n this._fillStructuralFromText(vec, text);\n trigramHistogram(text, vec, STRUCTURAL_DIM, SUBWORD_BINS);\n // docComment and eventName blocks remain zero — not in text repr\n l2Normalize(vec);\n return vec;\n }\n\n /**\n * Batch-encode text strings. Amortizes SNN GPU round-trip when GPU is active.\n */\n async encodeTexts(texts: string[]): Promise<Float32Array[]> {\n if (!this._snnEnabled) {\n return texts.map(t => this.encodeText(t));\n }\n\n // GPU path: compute trigram histograms on CPU, run SNN batch on GPU\n const histograms = texts.map(t => {\n const hist = new Float32Array(SUBWORD_BINS);\n const tmp = new Float32Array(HOLOEMBED_DIM);\n trigramHistogram(t, tmp, STRUCTURAL_DIM, SUBWORD_BINS);\n hist.set(tmp.slice(STRUCTURAL_DIM, STRUCTURAL_DIM + SUBWORD_BINS));\n return hist;\n });\n\n const snnRates = await this._accel.encodeBatch(histograms);\n\n return texts.map((t, i) => {\n const vec = new Float32Array(HOLOEMBED_DIM);\n this._fillStructuralFromText(vec, t);\n vec.set(snnRates[i]!, STRUCTURAL_DIM);\n l2Normalize(vec);\n return vec;\n });\n }\n\n /** Release GPU resources. */\n dispose(): void {\n this._accel.dispose();\n }\n\n // ── Private: structural base ──────────────────────────────────────────────\n\n private _fillStructural(vec: Float32Array, sym: SymbolInput, graph: GraphEnrichment): void {\n const fp = sym.filePath.replace(/\\\\/g, '/');\n\n // Dims 0–5: known package membership\n for (let i = 0; i < KNOWN_PACKAGES.length; i++) {\n vec[i] = fp.includes(KNOWN_PACKAGES[i]!) ? 1 : 0;\n }\n // Dims 6–9: structural directory flags\n vec[6] = (fp.includes('__tests__') || fp.includes('.test.') || fp.includes('.spec.')) ? 1 : 0;\n vec[7] = fp.includes('/traits/') ? 1 : 0;\n vec[8] = fp.includes('/adapters/') ? 1 : 0;\n vec[9] = fp.includes('/providers/') ? 1 : 0;\n // Dim 10: directory depth\n const depth = (fp.match(/\\//g) ?? []).length;\n vec[10] = Math.min(depth / 8, 1);\n // Dims 11–127: file path hash\n spreadHash(hashString(fp), vec, 11, 117);\n\n // Dims 128–191: signature structure\n vec[128] = symbolTypeScore(sym.type);\n vec[129] = visibilityScore(sym.visibility);\n vec[130] = sym.isExported ? 1 : 0;\n vec[131] = sym.signature ? Math.min(countParams(sym.signature) / 10, 1) : 0;\n vec[132] = sym.signature?.includes(':') ? 1 : 0;\n vec[133] = Math.min((sym.lineCount ?? 0) / 200, 1);\n vec[134] = sym.owner ? 1 : 0;\n spreadHash(hashString(sym.signature ?? sym.name), vec, 135, 57);\n\n // Dims 192–255: call-graph features\n vec[192] = Math.min((graph.fanIn ?? 0) / 20, 1);\n vec[193] = Math.min((graph.fanOut ?? 0) / 20, 1);\n spreadHash(hashString(sym.docComment ?? ''), vec, 194, 62);\n\n // Dims 256–319: event-chain features\n vec[256] = (graph.emitCount ?? 0) > 0 ? 1 : 0;\n vec[257] = (graph.listenCount ?? 0) > 0 ? 1 : 0;\n vec[258] = Math.min((graph.emitCount ?? 0) / 5, 1);\n vec[259] = Math.min((graph.listenCount ?? 0) / 5, 1);\n const eventKey = (graph.eventNames ?? []).sort().join('|');\n spreadHash(hashString(eventKey), vec, 260, 60);\n\n // Dims 320–383: content fingerprint\n const contentKey = `${sym.type}:${sym.name}:${sym.filePath}:${sym.line}`;\n spreadHash(hashString(contentKey), vec, 320, 64);\n }\n\n private _fillStructuralFromText(vec: Float32Array, text: string): void {\n // Parse \"file: path\" from EmbeddingIndex serialization\n const fileMatch = /file:\\s*(\\S+)/i.exec(text);\n const fp = (fileMatch?.[1] ?? '').replace(/\\\\/g, '/');\n\n for (let i = 0; i < KNOWN_PACKAGES.length; i++) {\n vec[i] = fp.includes(KNOWN_PACKAGES[i]!) ? 1 : 0;\n }\n vec[6] = (fp.includes('__tests__') || fp.includes('.test.') || fp.includes('.spec.')) ? 1 : 0;\n vec[7] = fp.includes('/traits/') ? 1 : 0;\n vec[8] = fp.includes('/adapters/') ? 1 : 0;\n vec[9] = fp.includes('/providers/') ? 1 : 0;\n const depth = (fp.match(/\\//g) ?? []).length;\n vec[10] = Math.min(depth / 8, 1);\n spreadHash(hashString(fp), vec, 11, 117);\n spreadHash(hashString(text), vec, 128, 64);\n spreadHash(hashString(text + fp), vec, 320, 64);\n }\n\n // ── Private: subword blocks (CPU) ─────────────────────────────────────────\n\n private _fillSubword(vec: Float32Array, sym: SymbolInput, graph: GraphEnrichment): void {\n // Block 1 (384–511): name + type + signature\n trigramHistogram(\n `${sym.name} ${sym.type} ${sym.signature ?? ''}`,\n vec, STRUCTURAL_DIM, SUBWORD_BINS,\n );\n // Block 2 (512–639): docComment\n trigramHistogram(sym.docComment ?? '', vec, STRUCTURAL_DIM + SUBWORD_BINS, SUBWORD_BINS);\n // Block 3 (640–767): event names\n trigramHistogram(\n camelSplit((graph.eventNames ?? []).join(' ')),\n vec, STRUCTURAL_DIM + 2 * SUBWORD_BINS, SUBWORD_BINS,\n );\n }\n\n // ── Private: subword blocks (GPU SNN) ────────────────────────────────────\n\n private async _fillSubwordSnn(vec: Float32Array, sym: SymbolInput, graph: GraphEnrichment): Promise<void> {\n // Build CPU histograms first, then replace with SNN rates\n const h1 = new Float32Array(SUBWORD_BINS);\n const h2 = new Float32Array(SUBWORD_BINS);\n const h3 = new Float32Array(SUBWORD_BINS);\n const tmp = new Float32Array(SUBWORD_BINS * 3); // scratch\n\n trigramHistogram(`${sym.name} ${sym.type} ${sym.signature ?? ''}`, tmp, 0, SUBWORD_BINS);\n trigramHistogram(sym.docComment ?? '', tmp, SUBWORD_BINS, SUBWORD_BINS);\n trigramHistogram(\n camelSplit((graph.eventNames ?? []).join(' ')),\n tmp, 2 * SUBWORD_BINS, SUBWORD_BINS,\n );\n\n h1.set(tmp.slice(0, SUBWORD_BINS));\n h2.set(tmp.slice(SUBWORD_BINS, 2 * SUBWORD_BINS));\n h3.set(tmp.slice(2 * SUBWORD_BINS, 3 * SUBWORD_BINS));\n\n // SNN encode each block\n const [r1, r2, r3] = await this._accel.encodeBatch([h1, h2, h3]);\n\n vec.set(r1!, STRUCTURAL_DIM);\n vec.set(r2!, STRUCTURAL_DIM + SUBWORD_BINS);\n vec.set(r3!, STRUCTURAL_DIM + 2 * SUBWORD_BINS);\n }\n}\n\n// =============================================================================\n// STRUCTURAL SCORING HELPERS\n// =============================================================================\n\nfunction symbolTypeScore(type: string): number {\n switch (type) {\n case 'function': return 1.0;\n case 'method': return 0.9;\n case 'class': return 0.7;\n case 'interface': return 0.5;\n case 'type_alias': return 0.4;\n case 'enum': return 0.3;\n case 'constant': return 0.2;\n case 'field': return 0.15;\n default: return 0.1;\n }\n}\n\nfunction visibilityScore(v: string | undefined): number {\n switch (v) {\n case 'public': return 1.0;\n case 'protected': return 0.5;\n case 'internal': return 0.3;\n case 'private': return 0.0;\n default: return 0.8;\n }\n}\n\nfunction countParams(signature: string): number {\n const s = signature.indexOf('(');\n const e = signature.lastIndexOf(')');\n if (s < 0 || e <= s) return 0;\n const inner = signature.slice(s + 1, e).trim();\n if (!inner) return 0;\n return inner.split(',').length;\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@holoscript/holoembed",
3
+ "version": "6.1.0",
4
+ "description": "HoloEmbed: 768-dim NL→code embeddings via structural features + char-trigram subwords. Optional SNN-WebGPU population coding for GPU-accelerated batch encoding.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "sideEffects": false,
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js",
17
+ "require": "./dist/index.cjs"
18
+ }
19
+ },
20
+ "dependencies": {
21
+ "@holoscript/snn-webgpu": "6.1.0",
22
+ "@holoscript/config": "6.1.0"
23
+ },
24
+ "peerDependencies": {
25
+ "webgpu": "^0.3.8"
26
+ },
27
+ "peerDependenciesMeta": {
28
+ "webgpu": {
29
+ "optional": true
30
+ }
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^24.10.1",
34
+ "@webgpu/types": ">=0.1.40",
35
+ "tsup": "^8.0.1",
36
+ "typescript": "~5.9.3",
37
+ "vitest": "^4.1.5",
38
+ "webgpu": "^0.3.8"
39
+ },
40
+ "keywords": [
41
+ "embedding",
42
+ "code-intelligence",
43
+ "snn",
44
+ "webgpu",
45
+ "holoscript"
46
+ ],
47
+ "license": "MIT",
48
+ "author": "Brian X Base Team",
49
+ "homepage": "https://github.com/brianonbased-dev/HoloScript#readme",
50
+ "bugs": {
51
+ "url": "https://github.com/brianonbased-dev/HoloScript/issues"
52
+ },
53
+ "repository": {
54
+ "type": "git",
55
+ "url": "https://github.com/brianonbased-dev/HoloScript.git",
56
+ "directory": "packages/holoembed"
57
+ },
58
+ "engines": {
59
+ "node": ">=20"
60
+ },
61
+ "scripts": {
62
+ "build": "tsup",
63
+ "dev": "tsup --watch",
64
+ "bench:snn": "pnpm run build && node scripts/bench-snn-accelerator.mjs",
65
+ "test": "vitest run --config vitest.config.ts --passWithNoTests",
66
+ "test:webgpu": "pnpm run build && vitest run --config vitest.config.ts src/__tests__/HoloEmbedEncoder.test.ts -t \"WebGPU path matches\"",
67
+ "test:watch": "vitest",
68
+ "test:coverage": "vitest run --coverage --passWithNoTests"
69
+ }
70
+ }