@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.
- package/dist/behaviors/index.js +46 -37
- package/dist/behaviors/knob-embeddings.d.ts +16 -2
- package/dist/behaviors/knob-embeddings.js +47 -38
- package/dist/index.js +46 -37
- package/package.json +1 -1
package/dist/behaviors/index.js
CHANGED
|
@@ -206106,29 +206106,56 @@ async function getFactorySignatureCatalog() {
|
|
|
206106
206106
|
|
|
206107
206107
|
// behaviors/knob-embeddings.ts
|
|
206108
206108
|
var pending4 = null;
|
|
206109
|
-
function
|
|
206110
|
-
if (
|
|
206111
|
-
|
|
206112
|
-
|
|
206113
|
-
|
|
206114
|
-
|
|
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
|
|
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
|
|
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 (
|
|
206121
|
-
const
|
|
206122
|
-
|
|
206123
|
-
|
|
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
|
-
|
|
206145
|
+
} else {
|
|
206146
|
+
Object.keys(parsed.vectors ?? {}).forEach((key, i) => {
|
|
206147
|
+
vectors[key] = slots[i];
|
|
206148
|
+
});
|
|
206127
206149
|
}
|
|
206128
|
-
|
|
206129
|
-
|
|
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
|
-
|
|
206142
|
-
|
|
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,
|
|
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
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
|
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
|
|
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 (
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
62
|
+
} else {
|
|
63
|
+
Object.keys(parsed.vectors ?? {}).forEach((key, i) => {
|
|
64
|
+
vectors[key] = slots[i];
|
|
65
|
+
});
|
|
44
66
|
}
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
59
|
-
|
|
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
|
|
213030
|
-
if (
|
|
213031
|
-
|
|
213032
|
-
|
|
213033
|
-
|
|
213034
|
-
|
|
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
|
|
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
|
|
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 (
|
|
213041
|
-
const
|
|
213042
|
-
|
|
213043
|
-
|
|
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
|
-
|
|
213065
|
+
} else {
|
|
213066
|
+
Object.keys(parsed.vectors ?? {}).forEach((key, i) => {
|
|
213067
|
+
vectors[key] = slots[i];
|
|
213068
|
+
});
|
|
213047
213069
|
}
|
|
213048
|
-
|
|
213049
|
-
|
|
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
|
-
|
|
213062
|
-
|
|
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();
|