@almadar/std 16.246.0 → 16.246.1

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.
@@ -206106,29 +206106,56 @@ async function getFactorySignatureCatalog() {
206106
206106
 
206107
206107
  // behaviors/knob-embeddings.ts
206108
206108
  var pending4 = null;
206109
- function decodeVector2(stored) {
206110
- if (!("d" in stored)) return stored;
206111
- const bytes = Buffer.from(stored.d, "base64");
206112
- const out = new Array(bytes.length);
206113
- for (let i = 0; i < bytes.length; i++) {
206114
- out[i] = bytes.readInt8(i) * stored.s / 127;
206109
+ function writeVector(stored, slot) {
206110
+ if ("d" in stored) {
206111
+ const bytes = Buffer.from(stored.d, "base64");
206112
+ if (bytes.length !== slot.length) return false;
206113
+ slot.set(new Int8Array(bytes.buffer, bytes.byteOffset, bytes.length));
206114
+ return true;
206115
206115
  }
206116
- return out;
206116
+ if (stored.length !== slot.length) return false;
206117
+ let maxAbs = 0;
206118
+ for (const v of stored) maxAbs = Math.max(maxAbs, Math.abs(v));
206119
+ for (let i = 0; i < stored.length; i++) {
206120
+ slot[i] = maxAbs === 0 ? 0 : Math.round(stored[i] * 127 / maxAbs);
206121
+ }
206122
+ return true;
206117
206123
  }
206118
- function reconstructVectors(parsed) {
206124
+ function decodeKnobEmbeddingsFile(parsed) {
206125
+ const interned = typeof parsed?.table === "object" && typeof parsed?.keys === "object";
206126
+ const nonInterned = typeof parsed?.vectors === "object" && parsed.vectors !== null;
206127
+ if (typeof parsed?.model !== "string" || typeof parsed?.dimensions !== "number" || !interned && !nonInterned) {
206128
+ return null;
206129
+ }
206130
+ const dims = parsed.dimensions;
206131
+ const stored = interned ? parsed.table ?? [] : Object.values(parsed.vectors ?? {});
206132
+ const backing = new Int8Array(stored.length * dims);
206133
+ const slots = [];
206134
+ for (let i = 0; i < stored.length; i++) {
206135
+ const slot = backing.subarray(i * dims, (i + 1) * dims);
206136
+ if (!writeVector(stored[i], slot)) return null;
206137
+ slots.push(slot);
206138
+ }
206119
206139
  const vectors = {};
206120
- if (parsed.table && parsed.keys) {
206121
- const decoded = parsed.table.map(decodeVector2);
206122
- for (const [key, idx] of Object.entries(parsed.keys)) {
206123
- const vec = decoded[idx];
206124
- if (vec) vectors[key] = vec;
206140
+ if (interned) {
206141
+ for (const [key, idx] of Object.entries(parsed.keys ?? {})) {
206142
+ const slot = slots[idx];
206143
+ if (slot) vectors[key] = slot;
206125
206144
  }
206126
- return vectors;
206145
+ } else {
206146
+ Object.keys(parsed.vectors ?? {}).forEach((key, i) => {
206147
+ vectors[key] = slots[i];
206148
+ });
206127
206149
  }
206128
- for (const [key, stored] of Object.entries(parsed.vectors ?? {})) {
206129
- vectors[key] = decodeVector2(stored);
206150
+ return { version: parsed.version ?? "", model: parsed.model, dimensions: dims, vectors };
206151
+ }
206152
+ async function readKnobEmbeddingsFile(path) {
206153
+ try {
206154
+ const { readFileSync } = await import('fs');
206155
+ return decodeKnobEmbeddingsFile(JSON.parse(readFileSync(path, "utf-8")));
206156
+ } catch {
206157
+ return null;
206130
206158
  }
206131
- return vectors;
206132
206159
  }
206133
206160
  function loadManifest2() {
206134
206161
  pending4 ?? (pending4 = loadManifestUncached2().then((m) => {
@@ -206138,26 +206165,8 @@ function loadManifest2() {
206138
206165
  return pending4;
206139
206166
  }
206140
206167
  async function loadManifestUncached2() {
206141
- try {
206142
- const { readFileSync } = await import('fs');
206143
- const { resolve } = await import('path');
206144
- const dir = await resolveStdDataDir();
206145
- const raw = readFileSync(resolve(dir, "knob-embeddings.json"), "utf-8");
206146
- const parsed = JSON.parse(raw);
206147
- const interned = typeof parsed?.table === "object" && typeof parsed?.keys === "object";
206148
- const nonInterned = typeof parsed?.vectors === "object" && parsed.vectors !== null;
206149
- if (typeof parsed?.model !== "string" || typeof parsed?.dimensions !== "number" || !interned && !nonInterned) {
206150
- return null;
206151
- }
206152
- return {
206153
- version: parsed.version,
206154
- model: parsed.model,
206155
- dimensions: parsed.dimensions,
206156
- vectors: reconstructVectors(parsed)
206157
- };
206158
- } catch {
206159
- return null;
206160
- }
206168
+ const { resolve } = await import('path');
206169
+ return readKnobEmbeddingsFile(resolve(await resolveStdDataDir(), "knob-embeddings.json"));
206161
206170
  }
206162
206171
  async function getKnobEmbeddings() {
206163
206172
  return loadManifest2();
@@ -15,11 +15,15 @@
15
15
  *
16
16
  * @packageDocumentation
17
17
  */
18
+ /** Each knob's vector as int8, all views over one shared buffer — the on-disk
19
+ * bytes, never widened to a float per dimension (that was 8× the memory and
20
+ * OOM-killed the builder server). The per-vector scale is dropped, so a
21
+ * vector here is a direction: compare it with cosine similarity only. */
18
22
  interface KnobEmbeddingsManifest {
19
23
  version: string;
20
24
  model: string;
21
25
  dimensions: number;
22
- vectors: Record<string, ReadonlyArray<number>>;
26
+ vectors: Readonly<Record<string, Int8Array>>;
23
27
  }
24
28
  /** Int8-quantized vector: `d` = base64 of one signed byte per dimension,
25
29
  * `s` = per-vector max-abs scale; value = byte × s ÷ 127. Landed when the
@@ -43,6 +47,16 @@ interface StoredKnobEmbeddingsFile {
43
47
  table?: StoredKnobVector[];
44
48
  keys?: Record<string, number>;
45
49
  }
50
+ /**
51
+ * Decode a parsed `knob-embeddings.json` into int8 vectors over one buffer
52
+ * sized (stored vectors × dimensions). Interned table entries are written
53
+ * once and shared by every key that points at them. Returns `null` for a
54
+ * file missing its model, dimensions or vectors, or holding a vector whose
55
+ * length is not `dimensions`.
56
+ */
57
+ declare function decodeKnobEmbeddingsFile(parsed: Partial<StoredKnobEmbeddingsFile>): KnobEmbeddingsManifest | null;
58
+ /** Read and decode a `knob-embeddings.json` at `path`; `null` when it is missing or invalid. */
59
+ declare function readKnobEmbeddingsFile(path: string): Promise<KnobEmbeddingsManifest | null>;
46
60
  /**
47
61
  * Return the typed knob embeddings manifest. Returns `null` when the
48
62
  * JSON sidecar is missing (older std checkout, or a dev build with
@@ -51,4 +65,4 @@ interface StoredKnobEmbeddingsFile {
51
65
  */
52
66
  declare function getKnobEmbeddings(): Promise<KnobEmbeddingsManifest | null>;
53
67
 
54
- export { type KnobEmbeddingsManifest, type QuantizedKnobVector, type StoredKnobEmbeddingsFile, type StoredKnobVector, getKnobEmbeddings };
68
+ export { type KnobEmbeddingsManifest, type QuantizedKnobVector, type StoredKnobEmbeddingsFile, type StoredKnobVector, decodeKnobEmbeddingsFile, getKnobEmbeddings, readKnobEmbeddingsFile };
@@ -23,29 +23,56 @@ async function resolveStdDataDirUncached() {
23
23
 
24
24
  // behaviors/knob-embeddings.ts
25
25
  var pending2 = null;
26
- function decodeVector(stored) {
27
- if (!("d" in stored)) return stored;
28
- const bytes = Buffer.from(stored.d, "base64");
29
- const out = new Array(bytes.length);
30
- for (let i = 0; i < bytes.length; i++) {
31
- out[i] = bytes.readInt8(i) * stored.s / 127;
26
+ function writeVector(stored, slot) {
27
+ if ("d" in stored) {
28
+ const bytes = Buffer.from(stored.d, "base64");
29
+ if (bytes.length !== slot.length) return false;
30
+ slot.set(new Int8Array(bytes.buffer, bytes.byteOffset, bytes.length));
31
+ return true;
32
32
  }
33
- return out;
33
+ if (stored.length !== slot.length) return false;
34
+ let maxAbs = 0;
35
+ for (const v of stored) maxAbs = Math.max(maxAbs, Math.abs(v));
36
+ for (let i = 0; i < stored.length; i++) {
37
+ slot[i] = maxAbs === 0 ? 0 : Math.round(stored[i] * 127 / maxAbs);
38
+ }
39
+ return true;
34
40
  }
35
- function reconstructVectors(parsed) {
41
+ function decodeKnobEmbeddingsFile(parsed) {
42
+ const interned = typeof parsed?.table === "object" && typeof parsed?.keys === "object";
43
+ const nonInterned = typeof parsed?.vectors === "object" && parsed.vectors !== null;
44
+ if (typeof parsed?.model !== "string" || typeof parsed?.dimensions !== "number" || !interned && !nonInterned) {
45
+ return null;
46
+ }
47
+ const dims = parsed.dimensions;
48
+ const stored = interned ? parsed.table ?? [] : Object.values(parsed.vectors ?? {});
49
+ const backing = new Int8Array(stored.length * dims);
50
+ const slots = [];
51
+ for (let i = 0; i < stored.length; i++) {
52
+ const slot = backing.subarray(i * dims, (i + 1) * dims);
53
+ if (!writeVector(stored[i], slot)) return null;
54
+ slots.push(slot);
55
+ }
36
56
  const vectors = {};
37
- if (parsed.table && parsed.keys) {
38
- const decoded = parsed.table.map(decodeVector);
39
- for (const [key, idx] of Object.entries(parsed.keys)) {
40
- const vec = decoded[idx];
41
- if (vec) vectors[key] = vec;
57
+ if (interned) {
58
+ for (const [key, idx] of Object.entries(parsed.keys ?? {})) {
59
+ const slot = slots[idx];
60
+ if (slot) vectors[key] = slot;
42
61
  }
43
- return vectors;
62
+ } else {
63
+ Object.keys(parsed.vectors ?? {}).forEach((key, i) => {
64
+ vectors[key] = slots[i];
65
+ });
44
66
  }
45
- for (const [key, stored] of Object.entries(parsed.vectors ?? {})) {
46
- vectors[key] = decodeVector(stored);
67
+ return { version: parsed.version ?? "", model: parsed.model, dimensions: dims, vectors };
68
+ }
69
+ async function readKnobEmbeddingsFile(path) {
70
+ try {
71
+ const { readFileSync } = await import('fs');
72
+ return decodeKnobEmbeddingsFile(JSON.parse(readFileSync(path, "utf-8")));
73
+ } catch {
74
+ return null;
47
75
  }
48
- return vectors;
49
76
  }
50
77
  function loadManifest() {
51
78
  pending2 ?? (pending2 = loadManifestUncached().then((m) => {
@@ -55,29 +82,11 @@ function loadManifest() {
55
82
  return pending2;
56
83
  }
57
84
  async function loadManifestUncached() {
58
- try {
59
- const { readFileSync } = await import('fs');
60
- const { resolve } = await import('path');
61
- const dir = await resolveStdDataDir();
62
- const raw = readFileSync(resolve(dir, "knob-embeddings.json"), "utf-8");
63
- const parsed = JSON.parse(raw);
64
- const interned = typeof parsed?.table === "object" && typeof parsed?.keys === "object";
65
- const nonInterned = typeof parsed?.vectors === "object" && parsed.vectors !== null;
66
- if (typeof parsed?.model !== "string" || typeof parsed?.dimensions !== "number" || !interned && !nonInterned) {
67
- return null;
68
- }
69
- return {
70
- version: parsed.version,
71
- model: parsed.model,
72
- dimensions: parsed.dimensions,
73
- vectors: reconstructVectors(parsed)
74
- };
75
- } catch {
76
- return null;
77
- }
85
+ const { resolve } = await import('path');
86
+ return readKnobEmbeddingsFile(resolve(await resolveStdDataDir(), "knob-embeddings.json"));
78
87
  }
79
88
  async function getKnobEmbeddings() {
80
89
  return loadManifest();
81
90
  }
82
91
 
83
- export { getKnobEmbeddings };
92
+ export { decodeKnobEmbeddingsFile, getKnobEmbeddings, readKnobEmbeddingsFile };
package/dist/index.js CHANGED
@@ -213026,29 +213026,56 @@ async function getFactorySignatureCatalog() {
213026
213026
 
213027
213027
  // behaviors/knob-embeddings.ts
213028
213028
  var pending4 = null;
213029
- function decodeVector2(stored) {
213030
- if (!("d" in stored)) return stored;
213031
- const bytes = Buffer.from(stored.d, "base64");
213032
- const out = new Array(bytes.length);
213033
- for (let i = 0; i < bytes.length; i++) {
213034
- out[i] = bytes.readInt8(i) * stored.s / 127;
213029
+ function writeVector(stored, slot) {
213030
+ if ("d" in stored) {
213031
+ const bytes = Buffer.from(stored.d, "base64");
213032
+ if (bytes.length !== slot.length) return false;
213033
+ slot.set(new Int8Array(bytes.buffer, bytes.byteOffset, bytes.length));
213034
+ return true;
213035
213035
  }
213036
- return out;
213036
+ if (stored.length !== slot.length) return false;
213037
+ let maxAbs = 0;
213038
+ for (const v of stored) maxAbs = Math.max(maxAbs, Math.abs(v));
213039
+ for (let i = 0; i < stored.length; i++) {
213040
+ slot[i] = maxAbs === 0 ? 0 : Math.round(stored[i] * 127 / maxAbs);
213041
+ }
213042
+ return true;
213037
213043
  }
213038
- function reconstructVectors(parsed) {
213044
+ function decodeKnobEmbeddingsFile(parsed) {
213045
+ const interned = typeof parsed?.table === "object" && typeof parsed?.keys === "object";
213046
+ const nonInterned = typeof parsed?.vectors === "object" && parsed.vectors !== null;
213047
+ if (typeof parsed?.model !== "string" || typeof parsed?.dimensions !== "number" || !interned && !nonInterned) {
213048
+ return null;
213049
+ }
213050
+ const dims = parsed.dimensions;
213051
+ const stored = interned ? parsed.table ?? [] : Object.values(parsed.vectors ?? {});
213052
+ const backing = new Int8Array(stored.length * dims);
213053
+ const slots = [];
213054
+ for (let i = 0; i < stored.length; i++) {
213055
+ const slot = backing.subarray(i * dims, (i + 1) * dims);
213056
+ if (!writeVector(stored[i], slot)) return null;
213057
+ slots.push(slot);
213058
+ }
213039
213059
  const vectors = {};
213040
- if (parsed.table && parsed.keys) {
213041
- const decoded = parsed.table.map(decodeVector2);
213042
- for (const [key, idx] of Object.entries(parsed.keys)) {
213043
- const vec = decoded[idx];
213044
- if (vec) vectors[key] = vec;
213060
+ if (interned) {
213061
+ for (const [key, idx] of Object.entries(parsed.keys ?? {})) {
213062
+ const slot = slots[idx];
213063
+ if (slot) vectors[key] = slot;
213045
213064
  }
213046
- return vectors;
213065
+ } else {
213066
+ Object.keys(parsed.vectors ?? {}).forEach((key, i) => {
213067
+ vectors[key] = slots[i];
213068
+ });
213047
213069
  }
213048
- for (const [key, stored] of Object.entries(parsed.vectors ?? {})) {
213049
- vectors[key] = decodeVector2(stored);
213070
+ return { version: parsed.version ?? "", model: parsed.model, dimensions: dims, vectors };
213071
+ }
213072
+ async function readKnobEmbeddingsFile(path) {
213073
+ try {
213074
+ const { readFileSync } = await import('fs');
213075
+ return decodeKnobEmbeddingsFile(JSON.parse(readFileSync(path, "utf-8")));
213076
+ } catch {
213077
+ return null;
213050
213078
  }
213051
- return vectors;
213052
213079
  }
213053
213080
  function loadManifest2() {
213054
213081
  pending4 ?? (pending4 = loadManifestUncached2().then((m) => {
@@ -213058,26 +213085,8 @@ function loadManifest2() {
213058
213085
  return pending4;
213059
213086
  }
213060
213087
  async function loadManifestUncached2() {
213061
- try {
213062
- const { readFileSync } = await import('fs');
213063
- const { resolve } = await import('path');
213064
- const dir = await resolveStdDataDir();
213065
- const raw = readFileSync(resolve(dir, "knob-embeddings.json"), "utf-8");
213066
- const parsed = JSON.parse(raw);
213067
- const interned = typeof parsed?.table === "object" && typeof parsed?.keys === "object";
213068
- const nonInterned = typeof parsed?.vectors === "object" && parsed.vectors !== null;
213069
- if (typeof parsed?.model !== "string" || typeof parsed?.dimensions !== "number" || !interned && !nonInterned) {
213070
- return null;
213071
- }
213072
- return {
213073
- version: parsed.version,
213074
- model: parsed.model,
213075
- dimensions: parsed.dimensions,
213076
- vectors: reconstructVectors(parsed)
213077
- };
213078
- } catch {
213079
- return null;
213080
- }
213088
+ const { resolve } = await import('path');
213089
+ return readKnobEmbeddingsFile(resolve(await resolveStdDataDir(), "knob-embeddings.json"));
213081
213090
  }
213082
213091
  async function getKnobEmbeddings() {
213083
213092
  return loadManifest2();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/std",
3
- "version": "16.246.0",
3
+ "version": "16.246.1",
4
4
  "description": "Standard library operators for Almadar (math, string, array, etc.)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",