@zvec/zvec-grep 0.1.6 → 0.1.7

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.
Files changed (148) hide show
  1. package/README.md +128 -49
  2. package/README_CN.md +116 -43
  3. package/dist/cli/args.js +40 -7
  4. package/dist/cli/args.js.map +1 -1
  5. package/dist/cli/auth.js +1 -4
  6. package/dist/cli/auth.js.map +1 -1
  7. package/dist/cli/commands.js +53 -24
  8. package/dist/cli/commands.js.map +1 -1
  9. package/dist/cli/format/context.d.ts +3 -0
  10. package/dist/cli/format/context.js +93 -22
  11. package/dist/cli/format/context.js.map +1 -1
  12. package/dist/cli/format/debug.js +10 -4
  13. package/dist/cli/format/debug.js.map +1 -1
  14. package/dist/cli/format/status.d.ts +3 -1
  15. package/dist/cli/format/status.js +34 -0
  16. package/dist/cli/format/status.js.map +1 -1
  17. package/dist/cli/help.js +149 -16
  18. package/dist/cli/help.js.map +1 -1
  19. package/dist/cli/index.d.ts +1 -1
  20. package/dist/cli/index.js +1 -1
  21. package/dist/cli/install.js +174 -56
  22. package/dist/cli/install.js.map +1 -1
  23. package/dist/cli/server-search.d.ts +3 -0
  24. package/dist/cli/server-search.js +12 -0
  25. package/dist/cli/server-search.js.map +1 -0
  26. package/dist/cli/types.d.ts +3 -0
  27. package/dist/cli/types.js.map +1 -1
  28. package/dist/client/daemon-client.d.ts +12 -0
  29. package/dist/client/daemon-client.js +23 -0
  30. package/dist/client/daemon-client.js.map +1 -1
  31. package/dist/daemon/backend.d.ts +1 -0
  32. package/dist/daemon/backend.js +56 -18
  33. package/dist/daemon/backend.js.map +1 -1
  34. package/dist/daemon/http-server.js +1 -0
  35. package/dist/daemon/http-server.js.map +1 -1
  36. package/dist/daemon/index-coordinator.d.ts +2 -1
  37. package/dist/daemon/index-coordinator.js.map +1 -1
  38. package/dist/daemon/runtime-manager.d.ts +1 -0
  39. package/dist/daemon/runtime-manager.js +4 -1
  40. package/dist/daemon/runtime-manager.js.map +1 -1
  41. package/dist/daemon/server-controller.js +55 -4
  42. package/dist/daemon/server-controller.js.map +1 -1
  43. package/dist/engine/code-formats.d.ts +3 -0
  44. package/dist/engine/code-formats.js +14 -0
  45. package/dist/engine/code-formats.js.map +1 -0
  46. package/dist/engine/extraction/code/adapter.js +1 -1
  47. package/dist/engine/extraction/code/adapter.js.map +1 -1
  48. package/dist/engine/extraction/code/extractor.js +12 -5
  49. package/dist/engine/extraction/code/extractor.js.map +1 -1
  50. package/dist/engine/extraction/index.d.ts +1 -0
  51. package/dist/engine/extraction/index.js +1 -0
  52. package/dist/engine/extraction/index.js.map +1 -1
  53. package/dist/engine/extraction/markdown/extractor.js +5 -3
  54. package/dist/engine/extraction/markdown/extractor.js.map +1 -1
  55. package/dist/engine/extraction/vector-content.d.ts +5 -0
  56. package/dist/engine/extraction/vector-content.js +95 -0
  57. package/dist/engine/extraction/vector-content.js.map +1 -0
  58. package/dist/engine/file-size-policy.d.ts +6 -0
  59. package/dist/engine/file-size-policy.js +20 -0
  60. package/dist/engine/file-size-policy.js.map +1 -0
  61. package/dist/engine/file-type.d.ts +10 -0
  62. package/dist/engine/file-type.js +71 -38
  63. package/dist/engine/file-type.js.map +1 -1
  64. package/dist/engine/manifest.d.ts +1 -0
  65. package/dist/engine/manifest.js +4 -0
  66. package/dist/engine/manifest.js.map +1 -1
  67. package/dist/engine/models/backends/model2vec-runtime.d.ts +63 -0
  68. package/dist/engine/models/backends/model2vec-runtime.js +112 -0
  69. package/dist/engine/models/backends/model2vec-runtime.js.map +1 -0
  70. package/dist/engine/models/backends/model2vec-tokenizer.d.ts +2 -0
  71. package/dist/engine/models/backends/model2vec-tokenizer.js +42 -0
  72. package/dist/engine/models/backends/model2vec-tokenizer.js.map +1 -0
  73. package/dist/engine/models/backends/model2vec-worker-pool.d.ts +25 -0
  74. package/dist/engine/models/backends/model2vec-worker-pool.js +264 -0
  75. package/dist/engine/models/backends/model2vec-worker-pool.js.map +1 -0
  76. package/dist/engine/models/backends/model2vec-worker.d.ts +1 -0
  77. package/dist/engine/models/backends/model2vec-worker.js +41 -0
  78. package/dist/engine/models/backends/model2vec-worker.js.map +1 -0
  79. package/dist/engine/models/backends/model2vec.d.ts +3 -20
  80. package/dist/engine/models/backends/model2vec.js +107 -128
  81. package/dist/engine/models/backends/model2vec.js.map +1 -1
  82. package/dist/engine/models/catalog.d.ts +26 -7
  83. package/dist/engine/models/catalog.js +26 -7
  84. package/dist/engine/models/catalog.js.map +1 -1
  85. package/dist/engine/models/embeddings.d.ts +1 -0
  86. package/dist/engine/models/embeddings.js.map +1 -1
  87. package/dist/engine/models/resolution.js +1 -1
  88. package/dist/engine/models/resolution.js.map +1 -1
  89. package/dist/engine/pipeline/indexing/index.js +83 -78
  90. package/dist/engine/pipeline/indexing/index.js.map +1 -1
  91. package/dist/engine/pipeline/indexing/input-budget.d.ts +2 -0
  92. package/dist/engine/pipeline/indexing/input-budget.js +51 -0
  93. package/dist/engine/pipeline/indexing/input-budget.js.map +1 -0
  94. package/dist/engine/pipeline/indexing/scanner/index.d.ts +3 -1
  95. package/dist/engine/pipeline/indexing/scanner/index.js +70 -18
  96. package/dist/engine/pipeline/indexing/scanner/index.js.map +1 -1
  97. package/dist/engine/pipeline/search/index.js.map +1 -1
  98. package/dist/engine/service/index.d.ts +1 -1
  99. package/dist/engine/service/root.d.ts +1 -4
  100. package/dist/engine/service/root.js +15 -22
  101. package/dist/engine/service/root.js.map +1 -1
  102. package/dist/engine/service/structure-enrichment.d.ts +1 -1
  103. package/dist/engine/service/structure-enrichment.js +10 -10
  104. package/dist/engine/service/structure-enrichment.js.map +1 -1
  105. package/dist/engine/service/types.d.ts +8 -1
  106. package/dist/engine/service/workspace-index.d.ts +6 -4
  107. package/dist/engine/service/workspace-index.js +18 -12
  108. package/dist/engine/service/workspace-index.js.map +1 -1
  109. package/dist/engine/service/zvec-grep.js +47 -29
  110. package/dist/engine/service/zvec-grep.js.map +1 -1
  111. package/dist/engine/storage/index.d.ts +27 -21
  112. package/dist/engine/storage/index.js +2 -1
  113. package/dist/engine/storage/index.js.map +1 -1
  114. package/dist/engine/storage/layout.d.ts +10 -0
  115. package/dist/engine/storage/layout.js +29 -0
  116. package/dist/engine/storage/layout.js.map +1 -0
  117. package/dist/engine/storage/zvec.d.ts +2 -42
  118. package/dist/engine/storage/zvec.js +40 -67
  119. package/dist/engine/storage/zvec.js.map +1 -1
  120. package/dist/engine/types.d.ts +14 -0
  121. package/dist/engine/types.js.map +1 -1
  122. package/dist/index.d.ts +2 -2
  123. package/dist/index.js.map +1 -1
  124. package/dist/mcp/input-normalization.d.ts +2 -2
  125. package/dist/mcp/input-normalization.js +14 -5
  126. package/dist/mcp/input-normalization.js.map +1 -1
  127. package/dist/mcp/schemas.d.ts +242 -0
  128. package/dist/mcp/schemas.js +73 -14
  129. package/dist/mcp/schemas.js.map +1 -1
  130. package/dist/mcp/stdio-bridge.d.ts +9 -0
  131. package/dist/mcp/stdio-bridge.js +131 -0
  132. package/dist/mcp/stdio-bridge.js.map +1 -0
  133. package/dist/mcp/tools.d.ts +4 -1
  134. package/dist/mcp/tools.js +78 -44
  135. package/dist/mcp/tools.js.map +1 -1
  136. package/dist/prompts/zvec-grep-guidance.d.ts +2 -0
  137. package/dist/prompts/zvec-grep-guidance.js +9 -0
  138. package/dist/prompts/zvec-grep-guidance.js.map +1 -0
  139. package/docs/01-agents.md +26 -5
  140. package/docs/02-cli.md +11 -1
  141. package/docs/03-mcp.md +29 -11
  142. package/docs/04-pipeline.md +10 -2
  143. package/docs/06-server.md +5 -0
  144. package/docs/07-embedding.md +6 -3
  145. package/package.json +4 -4
  146. package/skills/zvec-grep/SKILL.md +0 -61
  147. package/skills/zvec-grep/agents/openai.yaml +0 -4
  148. package/skills/zvec-grep/references/cli-fallback.md +0 -85
@@ -0,0 +1,63 @@
1
+ import type { EmbeddingResult } from "../embeddings.js";
2
+ export type TokenTensor = {
3
+ data: ArrayLike<number | bigint>;
4
+ };
5
+ export type TokenizerOutput = {
6
+ input_ids: TokenTensor;
7
+ };
8
+ export type TokenizerLike = {
9
+ (text: string, options: {
10
+ add_special_tokens: false;
11
+ truncation: true;
12
+ max_length: number;
13
+ }): TokenizerOutput | Promise<TokenizerOutput>;
14
+ unk_token_id?: number | null;
15
+ };
16
+ export type StaticEmbeddingTable = {
17
+ data: Float32Array | Uint16Array;
18
+ dimension: number;
19
+ dtype: "F16" | "F32";
20
+ rows: number;
21
+ };
22
+ export type Model2VecWorkerData = {
23
+ tokenizerSource: string;
24
+ maxInputTokens: number;
25
+ normalize: boolean;
26
+ tableBuffer: SharedArrayBuffer;
27
+ dimension: number;
28
+ dtype: "F16" | "F32";
29
+ rows: number;
30
+ };
31
+ export type Model2VecWorkerRequest = {
32
+ id: number;
33
+ texts: string[];
34
+ };
35
+ export type SerializedWorkerError = {
36
+ name?: string;
37
+ message: string;
38
+ stack?: string;
39
+ };
40
+ export type Model2VecWorkerResponse = {
41
+ type: "ready";
42
+ } | {
43
+ type: "result";
44
+ id: number;
45
+ vectors: ArrayBuffer;
46
+ vectorCount: number;
47
+ truncated: number[];
48
+ } | {
49
+ type: "error";
50
+ id: number;
51
+ error: SerializedWorkerError;
52
+ };
53
+ export type TokenizedModel2VecTexts = {
54
+ tokenLists: number[][];
55
+ truncated: number[];
56
+ };
57
+ export declare function embedModel2VecTexts(texts: readonly string[], tokenizer: TokenizerLike, table: StaticEmbeddingTable, maxInputTokens: number, normalize: boolean): Promise<EmbeddingResult>;
58
+ export declare function tokenizeModel2VecTexts(texts: readonly string[], tokenizer: TokenizerLike, maxInputTokens: number): Promise<TokenizedModel2VecTexts>;
59
+ export declare function embedModel2VecTokenLists(tokenLists: readonly (readonly number[])[], table: StaticEmbeddingTable, normalize: boolean): number[][];
60
+ export declare function sharedStaticEmbeddingTable(table: StaticEmbeddingTable): StaticEmbeddingTable & {
61
+ data: Float32Array | Uint16Array;
62
+ };
63
+ export declare function staticEmbeddingTableFromWorkerData(data: Model2VecWorkerData): StaticEmbeddingTable;
@@ -0,0 +1,112 @@
1
+ export async function embedModel2VecTexts(texts, tokenizer, table, maxInputTokens, normalize) {
2
+ const tokenized = await tokenizeModel2VecTexts(texts, tokenizer, maxInputTokens);
3
+ return {
4
+ vectors: embedModel2VecTokenLists(tokenized.tokenLists, table, normalize),
5
+ truncated: tokenized.truncated,
6
+ };
7
+ }
8
+ export async function tokenizeModel2VecTexts(texts, tokenizer, maxInputTokens) {
9
+ const truncatedInputIndexes = [];
10
+ const tokenLists = await Promise.all(texts.map(async (text, index) => {
11
+ const encoded = await tokenizer(text, {
12
+ add_special_tokens: false,
13
+ truncation: true,
14
+ max_length: maxInputTokens + 1,
15
+ });
16
+ const encodedTokenIds = Array.from(encoded.input_ids.data, Number);
17
+ if (encodedTokenIds.length > maxInputTokens) {
18
+ truncatedInputIndexes.push(index);
19
+ }
20
+ const unknownTokenId = tokenizer.unk_token_id;
21
+ return encodedTokenIds
22
+ .slice(0, maxInputTokens)
23
+ .filter((id) => unknownTokenId === undefined ||
24
+ unknownTokenId === null ||
25
+ id !== unknownTokenId);
26
+ }));
27
+ return {
28
+ tokenLists,
29
+ truncated: truncatedInputIndexes.sort((left, right) => left - right),
30
+ };
31
+ }
32
+ export function embedModel2VecTokenLists(tokenLists, table, normalize) {
33
+ return tokenLists.map((tokenIds) => embedStaticTokenList(tokenIds, table, normalize));
34
+ }
35
+ export function sharedStaticEmbeddingTable(table) {
36
+ if (table.data.buffer instanceof SharedArrayBuffer) {
37
+ return table;
38
+ }
39
+ const sharedBuffer = new SharedArrayBuffer(table.data.byteLength);
40
+ new Uint8Array(sharedBuffer).set(new Uint8Array(table.data.buffer, table.data.byteOffset, table.data.byteLength));
41
+ return {
42
+ ...table,
43
+ data: table.dtype === "F16"
44
+ ? new Uint16Array(sharedBuffer)
45
+ : new Float32Array(sharedBuffer),
46
+ };
47
+ }
48
+ export function staticEmbeddingTableFromWorkerData(data) {
49
+ return {
50
+ data: data.dtype === "F16"
51
+ ? new Uint16Array(data.tableBuffer)
52
+ : new Float32Array(data.tableBuffer),
53
+ dimension: data.dimension,
54
+ dtype: data.dtype,
55
+ rows: data.rows,
56
+ };
57
+ }
58
+ function embedStaticTokenList(tokenIds, table, normalize) {
59
+ const dimension = table.dimension;
60
+ const halfValues = table.dtype === "F16" ? halfFloatValues() : null;
61
+ const vector = Array.from({ length: dimension }, () => 0);
62
+ if (tokenIds.length === 0) {
63
+ return vector;
64
+ }
65
+ for (let index = 0; index < tokenIds.length; index++) {
66
+ const tokenId = tokenIds[index];
67
+ if (!Number.isInteger(tokenId) || tokenId < 0 || tokenId >= table.rows) {
68
+ throw new Error(`Tokenizer returned out-of-range token id: id=${tokenId} rows=${table.rows}`);
69
+ }
70
+ const start = tokenId * dimension;
71
+ for (let column = 0; column < dimension; column++) {
72
+ const value = table.data[start + column];
73
+ vector[column] += halfValues ? halfValues[value] : value;
74
+ }
75
+ }
76
+ let squaredNorm = 0;
77
+ for (let column = 0; column < dimension; column++) {
78
+ vector[column] /= tokenIds.length;
79
+ squaredNorm += vector[column] * vector[column];
80
+ }
81
+ if (normalize && squaredNorm > 0) {
82
+ const inverseNorm = 1 / Math.sqrt(squaredNorm);
83
+ for (let column = 0; column < dimension; column++) {
84
+ vector[column] *= inverseNorm;
85
+ }
86
+ }
87
+ return vector;
88
+ }
89
+ let cachedHalfFloatValues = null;
90
+ function halfFloatValues() {
91
+ if (cachedHalfFloatValues) {
92
+ return cachedHalfFloatValues;
93
+ }
94
+ const values = new Float32Array(65_536);
95
+ for (let bits = 0; bits < values.length; bits++) {
96
+ const sign = bits & 0x8000 ? -1 : 1;
97
+ const exponent = (bits >> 10) & 0x1f;
98
+ const fraction = bits & 0x03ff;
99
+ if (exponent === 0) {
100
+ values[bits] = sign * 2 ** -14 * (fraction / 1024);
101
+ }
102
+ else if (exponent === 0x1f) {
103
+ values[bits] = fraction === 0 ? sign * Infinity : Number.NaN;
104
+ }
105
+ else {
106
+ values[bits] = sign * 2 ** (exponent - 15) * (1 + fraction / 1024);
107
+ }
108
+ }
109
+ cachedHalfFloatValues = values;
110
+ return values;
111
+ }
112
+ //# sourceMappingURL=model2vec-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model2vec-runtime.js","sourceRoot":"","sources":["../../../../src/engine/models/backends/model2vec-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { TokenizerLike } from "./model2vec-runtime.js";
2
+ export declare function loadModel2VecTokenizer(source: string): Promise<TokenizerLike>;
@@ -0,0 +1,42 @@
1
+ import { Tokenizer } from "@huggingface/tokenizers";
2
+ import { readFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ export async function loadModel2VecTokenizer(source) {
5
+ const [tokenizerJson, tokenizerConfig] = await Promise.all([
6
+ readJson(join(source, "tokenizer.json")),
7
+ readJson(join(source, "tokenizer_config.json")),
8
+ ]);
9
+ const tokenizer = new Tokenizer(tokenizerJson, tokenizerConfig);
10
+ const unknownTokenId = resolveUnknownTokenId(tokenizer, tokenizerJson);
11
+ const tokenize = (text, options) => {
12
+ const ids = tokenizer.encode(text, {
13
+ add_special_tokens: options.add_special_tokens,
14
+ }).ids;
15
+ return {
16
+ input_ids: {
17
+ data: ids.length > options.max_length
18
+ ? ids.slice(0, options.max_length)
19
+ : ids,
20
+ },
21
+ };
22
+ };
23
+ return Object.assign(tokenize, { unk_token_id: unknownTokenId });
24
+ }
25
+ async function readJson(path) {
26
+ return JSON.parse(await readFile(path, "utf8"));
27
+ }
28
+ function resolveUnknownTokenId(tokenizer, tokenizerJson) {
29
+ const configuredId = tokenizerJson.model?.unk_id;
30
+ if (typeof configuredId === "number" && Number.isInteger(configuredId)) {
31
+ return configuredId;
32
+ }
33
+ const configuredToken = tokenizerJson.model?.unk_token;
34
+ if (typeof configuredToken !== "string") {
35
+ return null;
36
+ }
37
+ const tokenId = tokenizer.token_to_id(configuredToken);
38
+ return typeof tokenId === "number" && Number.isInteger(tokenId)
39
+ ? tokenId
40
+ : null;
41
+ }
42
+ //# sourceMappingURL=model2vec-tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model2vec-tokenizer.js","sourceRoot":"","sources":["../../../../src/engine/models/backends/model2vec-tokenizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAUjC,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAc;IAEd,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;KAChD,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,qBAAqB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,CACf,IAAY,EACZ,OAIC,EACD,EAAE;QACF,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE;YACjC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;SAC/C,CAAC,CAAC,GAAG,CAAC;QACP,OAAO;YACL,SAAS,EAAE;gBACT,IAAI,EACF,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,UAAU;oBAC7B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;oBAClC,CAAC,CAAC,GAAG;aACV;SACF,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAA4B,CAAC;AAC7E,CAAC;AAED,SAAS,qBAAqB,CAC5B,SAAoB,EACpB,aAA4B;IAE5B,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC;IACjD,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;QACvE,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,eAAe,GAAG,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC;IACvD,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAY,SAAS,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAChE,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;QAC7D,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,IAAI,CAAC;AACX,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { EmbeddingResult } from "../embeddings.js";
2
+ import type { Model2VecWorkerData } from "./model2vec-runtime.js";
3
+ export declare class Model2VecWorkerPool {
4
+ private readonly data;
5
+ private readonly workerUrl;
6
+ private disposed;
7
+ private nextJobId;
8
+ private readonly maxWorkers;
9
+ private readonly queue;
10
+ private readonly slots;
11
+ constructor(data: Model2VecWorkerData, maxWorkers?: number, workerUrl?: URL);
12
+ start(): Promise<void>;
13
+ run(texts: readonly string[], signal?: AbortSignal): Promise<EmbeddingResult>;
14
+ dispose(): Promise<void>;
15
+ private spawnWorker;
16
+ private handleMessage;
17
+ private dispatch;
18
+ private postJob;
19
+ private drain;
20
+ private nextQueuedJob;
21
+ private failSlot;
22
+ private resolveJob;
23
+ private rejectJob;
24
+ private ensureNotDisposed;
25
+ }
@@ -0,0 +1,264 @@
1
+ import { availableParallelism } from "node:os";
2
+ import { Worker } from "node:worker_threads";
3
+ export class Model2VecWorkerPool {
4
+ data;
5
+ workerUrl;
6
+ disposed = false;
7
+ nextJobId = 1;
8
+ maxWorkers;
9
+ queue = [];
10
+ slots = [];
11
+ constructor(data, maxWorkers = availableParallelism(), workerUrl = new URL("./model2vec-worker.js", import.meta.url)) {
12
+ this.data = data;
13
+ this.workerUrl = workerUrl;
14
+ this.maxWorkers = Math.max(1, Math.floor(maxWorkers));
15
+ }
16
+ async start() {
17
+ this.ensureNotDisposed();
18
+ if (this.slots.length === 0) {
19
+ await this.spawnWorker().readyPromise;
20
+ }
21
+ }
22
+ async run(texts, signal) {
23
+ this.ensureNotDisposed();
24
+ throwIfAborted(signal);
25
+ return await new Promise((resolve, reject) => {
26
+ const job = {
27
+ id: this.nextJobId++,
28
+ texts: [...texts],
29
+ signal,
30
+ resolve,
31
+ reject,
32
+ settled: false,
33
+ };
34
+ job.abort = () => {
35
+ if (job.settled) {
36
+ return;
37
+ }
38
+ job.settled = true;
39
+ const queuedIndex = this.queue.indexOf(job);
40
+ if (queuedIndex >= 0) {
41
+ this.queue.splice(queuedIndex, 1);
42
+ }
43
+ reject(abortError(signal));
44
+ };
45
+ signal?.addEventListener("abort", job.abort, { once: true });
46
+ const idle = this.slots.find((slot) => slot.ready && !slot.closed && !slot.job);
47
+ if (idle) {
48
+ this.dispatch(idle, job);
49
+ }
50
+ else if (this.slots.length < this.maxWorkers) {
51
+ const slot = this.spawnWorker(job);
52
+ void slot.readyPromise.catch(() => undefined);
53
+ }
54
+ else {
55
+ this.queue.push(job);
56
+ }
57
+ });
58
+ }
59
+ async dispose() {
60
+ if (this.disposed) {
61
+ return;
62
+ }
63
+ this.disposed = true;
64
+ const error = new Error("Model2Vec worker pool is disposed");
65
+ for (const job of this.queue.splice(0)) {
66
+ this.rejectJob(job, error);
67
+ }
68
+ for (const slot of this.slots) {
69
+ if (slot.job) {
70
+ this.rejectJob(slot.job, error);
71
+ slot.job = undefined;
72
+ }
73
+ slot.closed = true;
74
+ }
75
+ await Promise.allSettled(this.slots.map((slot) => slot.worker.terminate()));
76
+ this.slots.length = 0;
77
+ }
78
+ spawnWorker(job) {
79
+ const worker = new Worker(this.workerUrl, { workerData: this.data });
80
+ let resolveReady;
81
+ let rejectReady;
82
+ const readyPromise = new Promise((resolve, reject) => {
83
+ resolveReady = resolve;
84
+ rejectReady = reject;
85
+ });
86
+ const slot = {
87
+ worker,
88
+ ready: false,
89
+ closed: false,
90
+ job,
91
+ resolveReady,
92
+ rejectReady,
93
+ readyPromise,
94
+ };
95
+ this.slots.push(slot);
96
+ worker.on("message", (response) => {
97
+ this.handleMessage(slot, response);
98
+ });
99
+ worker.on("error", (error) => {
100
+ this.failSlot(slot, error);
101
+ });
102
+ worker.on("exit", (code) => {
103
+ if (!slot.closed) {
104
+ this.failSlot(slot, new Error(`Model2Vec worker exited unexpectedly with code ${code}`));
105
+ }
106
+ });
107
+ return slot;
108
+ }
109
+ handleMessage(slot, response) {
110
+ if (slot.closed) {
111
+ return;
112
+ }
113
+ if (response.type === "ready") {
114
+ slot.ready = true;
115
+ slot.resolveReady();
116
+ if (slot.job) {
117
+ this.postJob(slot, slot.job);
118
+ }
119
+ else {
120
+ slot.worker.unref();
121
+ this.drain();
122
+ }
123
+ return;
124
+ }
125
+ const job = slot.job;
126
+ if (!job || response.id !== job.id) {
127
+ this.failSlot(slot, new Error("Model2Vec worker response is out of order"));
128
+ return;
129
+ }
130
+ slot.job = undefined;
131
+ slot.worker.unref();
132
+ if (response.type === "error") {
133
+ this.rejectJob(job, workerError(response.error));
134
+ }
135
+ else {
136
+ try {
137
+ this.resolveJob(job, workerEmbeddingResult(response, this.data.dimension));
138
+ }
139
+ catch (error) {
140
+ this.rejectJob(job, error);
141
+ this.failSlot(slot, error);
142
+ return;
143
+ }
144
+ }
145
+ this.drain();
146
+ }
147
+ dispatch(slot, job) {
148
+ slot.worker.ref();
149
+ slot.job = job;
150
+ this.postJob(slot, job);
151
+ }
152
+ postJob(slot, job) {
153
+ if (job.settled) {
154
+ slot.job = undefined;
155
+ slot.worker.unref();
156
+ this.drain();
157
+ return;
158
+ }
159
+ slot.worker.postMessage({
160
+ id: job.id,
161
+ texts: job.texts,
162
+ });
163
+ }
164
+ drain() {
165
+ if (this.disposed) {
166
+ return;
167
+ }
168
+ for (const slot of this.slots) {
169
+ if (!slot.ready || slot.closed || slot.job) {
170
+ continue;
171
+ }
172
+ const job = this.nextQueuedJob();
173
+ if (!job) {
174
+ return;
175
+ }
176
+ this.dispatch(slot, job);
177
+ }
178
+ while (this.queue.length > 0 && this.slots.length < this.maxWorkers) {
179
+ const job = this.nextQueuedJob();
180
+ if (!job) {
181
+ return;
182
+ }
183
+ const slot = this.spawnWorker(job);
184
+ void slot.readyPromise.catch(() => undefined);
185
+ }
186
+ }
187
+ nextQueuedJob() {
188
+ while (this.queue.length > 0) {
189
+ const job = this.queue.shift();
190
+ if (job && !job.settled) {
191
+ return job;
192
+ }
193
+ }
194
+ return undefined;
195
+ }
196
+ failSlot(slot, error) {
197
+ if (slot.closed) {
198
+ return;
199
+ }
200
+ slot.closed = true;
201
+ slot.rejectReady(error);
202
+ if (slot.job) {
203
+ this.rejectJob(slot.job, error);
204
+ slot.job = undefined;
205
+ }
206
+ const index = this.slots.indexOf(slot);
207
+ if (index >= 0) {
208
+ this.slots.splice(index, 1);
209
+ }
210
+ void slot.worker.terminate().catch(() => undefined);
211
+ this.drain();
212
+ }
213
+ resolveJob(job, result) {
214
+ if (job.settled) {
215
+ return;
216
+ }
217
+ job.settled = true;
218
+ job.signal?.removeEventListener("abort", job.abort);
219
+ job.resolve(result);
220
+ }
221
+ rejectJob(job, error) {
222
+ if (job.settled) {
223
+ return;
224
+ }
225
+ job.settled = true;
226
+ job.signal?.removeEventListener("abort", job.abort);
227
+ job.reject(error);
228
+ }
229
+ ensureNotDisposed() {
230
+ if (this.disposed) {
231
+ throw new Error("Model2Vec worker pool is disposed");
232
+ }
233
+ }
234
+ }
235
+ function workerEmbeddingResult(response, dimension) {
236
+ const flat = new Float32Array(response.vectors);
237
+ if (flat.length !== response.vectorCount * dimension) {
238
+ throw new Error("Model2Vec worker returned an invalid vector buffer");
239
+ }
240
+ const vectors = [];
241
+ for (let index = 0; index < response.vectorCount; index++) {
242
+ vectors.push(Array.from(flat.subarray(index * dimension, (index + 1) * dimension)));
243
+ }
244
+ return { vectors, truncated: response.truncated };
245
+ }
246
+ function workerError(serialized) {
247
+ const error = new Error(serialized.message);
248
+ error.name = serialized.name ?? "Error";
249
+ if (serialized.stack) {
250
+ error.stack = serialized.stack;
251
+ }
252
+ return error;
253
+ }
254
+ function throwIfAborted(signal) {
255
+ if (signal?.aborted) {
256
+ throw abortError(signal);
257
+ }
258
+ }
259
+ function abortError(signal) {
260
+ return signal?.reason instanceof Error
261
+ ? signal.reason
262
+ : new Error("Model2Vec embedding was cancelled");
263
+ }
264
+ //# sourceMappingURL=model2vec-worker-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model2vec-worker-pool.js","sourceRoot":"","sources":["../../../../src/engine/models/backends/model2vec-worker-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AA6B7C,MAAM,OAAO,mBAAmB;IAQX;IAEA;IATX,QAAQ,GAAG,KAAK,CAAC;IACjB,SAAS,GAAG,CAAC,CAAC;IACL,UAAU,CAAS;IACnB,KAAK,GAAgB,EAAE,CAAC;IACxB,KAAK,GAAiB,EAAE,CAAC;IAE1C,YACmB,IAAyB,EAC1C,UAAU,GAAG,oBAAoB,EAAE,EAClB,YAAY,IAAI,GAAG,CAClC,uBAAuB,EACvB,MAAM,CAAC,IAAI,CAAC,GAAG,CAChB;QALgB,SAAI,GAAJ,IAAI,CAAqB;QAEzB,cAAS,GAAT,SAAS,CAGzB;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,YAAY,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CACP,KAAwB,EACxB,MAAoB;QAEpB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,cAAc,CAAC,MAAM,CAAC,CAAC;QAEvB,OAAO,MAAM,IAAI,OAAO,CAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5D,MAAM,GAAG,GAAc;gBACrB,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE;gBACpB,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;gBACjB,MAAM;gBACN,OAAO;gBACP,MAAM;gBACN,OAAO,EAAE,KAAK;aACf,CAAC;YACF,GAAG,CAAC,KAAK,GAAG,GAAG,EAAE;gBACf,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBAChB,OAAO;gBACT,CAAC;gBACD,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;gBACnB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC5C,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;oBACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;gBACpC,CAAC;gBACD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7B,CAAC,CAAC;YACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAE7D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAC1B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAClD,CAAC;YACF,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC3B,CAAC;iBAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACnC,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC7D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAChC,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;YACvB,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,CAAC;IAEO,WAAW,CAAC,GAAe;QACjC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,YAAyB,CAAC;QAC9B,IAAI,WAAsC,CAAC;QAC3C,MAAM,YAAY,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACzD,YAAY,GAAG,OAAO,CAAC;YACvB,WAAW,GAAG,MAAM,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAe;YACvB,MAAM;YACN,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,KAAK;YACb,GAAG;YACH,YAAY;YACZ,WAAW;YACX,YAAY;SACb,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,QAAiC,EAAE,EAAE;YACzD,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,IAAI,CAAC,QAAQ,CACX,IAAI,EACJ,IAAI,KAAK,CAAC,kDAAkD,IAAI,EAAE,CAAC,CACpE,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,aAAa,CACnB,IAAgB,EAChB,QAAiC;QAEjC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,IAAI,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,CACX,IAAI,EACJ,IAAI,KAAK,CAAC,2CAA2C,CAAC,CACvD,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,CACb,GAAG,EACH,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CACrD,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC3B,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAEO,QAAQ,CAAC,IAAgB,EAAE,GAAc;QAC/C,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1B,CAAC;IAEO,OAAO,CAAC,IAAgB,EAAE,GAAc;QAC9C,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YACtB,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,KAAK,EAAE,GAAG,CAAC,KAAK;SACgB,CAAC,CAAC;IACtC,CAAC;IAEO,KAAK;QACX,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC3C,SAAS;YACX,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACpE,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACnC,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBACxB,OAAO,GAAG,CAAC;YACb,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,QAAQ,CAAC,IAAgB,EAAE,KAAc;QAC/C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAEO,UAAU,CAAC,GAAc,EAAE,MAAuB;QACxD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;QACnB,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,KAAM,CAAC,CAAC;QACrD,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAEO,SAAS,CAAC,GAAc,EAAE,KAAc;QAC9C,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;QACnB,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,KAAM,CAAC,CAAC;QACrD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF;AAED,SAAS,qBAAqB,CAC5B,QAA8D,EAC9D,SAAiB;IAEjB,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,WAAW,GAAG,SAAS,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1D,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,SAAS,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CACtE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,WAAW,CAAC,UAAiC;IACpD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,OAAO,CAAC;IACxC,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,MAAoB;IAC1C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,MAAoB;IACtC,OAAO,MAAM,EAAE,MAAM,YAAY,KAAK;QACpC,CAAC,CAAC,MAAM,CAAC,MAAM;QACf,CAAC,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,41 @@
1
+ import { parentPort, workerData } from "node:worker_threads";
2
+ import { loadModel2VecTokenizer } from "./model2vec-tokenizer.js";
3
+ import { embedModel2VecTexts, staticEmbeddingTableFromWorkerData, } from "./model2vec-runtime.js";
4
+ const port = parentPort;
5
+ if (!port) {
6
+ throw new Error("Model2Vec worker requires a parent port");
7
+ }
8
+ const data = workerData;
9
+ const tokenizer = await loadModel2VecTokenizer(data.tokenizerSource);
10
+ const table = staticEmbeddingTableFromWorkerData(data);
11
+ port.postMessage({ type: "ready" });
12
+ port.on("message", async (request) => {
13
+ try {
14
+ const result = await embedModel2VecTexts(request.texts, tokenizer, table, data.maxInputTokens, data.normalize);
15
+ const flatVectors = new Float32Array(result.vectors.length * data.dimension);
16
+ for (const [index, vector] of result.vectors.entries()) {
17
+ flatVectors.set(vector, index * data.dimension);
18
+ }
19
+ const response = {
20
+ type: "result",
21
+ id: request.id,
22
+ vectors: flatVectors.buffer,
23
+ vectorCount: result.vectors.length,
24
+ truncated: result.truncated,
25
+ };
26
+ port.postMessage(response, [flatVectors.buffer]);
27
+ }
28
+ catch (error) {
29
+ const cause = error instanceof Error ? error : new Error(String(error));
30
+ port.postMessage({
31
+ type: "error",
32
+ id: request.id,
33
+ error: {
34
+ name: cause.name,
35
+ message: cause.message,
36
+ stack: cause.stack,
37
+ },
38
+ });
39
+ }
40
+ });
41
+ //# sourceMappingURL=model2vec-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model2vec-worker.js","sourceRoot":"","sources":["../../../../src/engine/models/backends/model2vec-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,mBAAmB,EACnB,kCAAkC,GAInC,MAAM,wBAAwB,CAAC;AAEhC,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,IAAI,CAAC,IAAI,EAAE,CAAC;IACV,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,IAAI,GAAG,UAAiC,CAAC;AAC/C,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AACrE,MAAM,KAAK,GAAG,kCAAkC,CAAC,IAAI,CAAC,CAAC;AAEvD,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAoC,CAAC,CAAC;AACtE,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,OAA+B,EAAE,EAAE;IAC3D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,OAAO,CAAC,KAAK,EACb,SAAS,EACT,KAAK,EACL,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,SAAS,CACf,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,YAAY,CAClC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CACvC,CAAC;QACF,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACvD,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,QAAQ,GAA4B;YACxC,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,OAAO,EAAE,WAAW,CAAC,MAAM;YAC3B,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YAClC,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,WAAW,CAAC;YACf,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,KAAK,EAAE;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB;SACgC,CAAC,CAAC;IACvC,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1,26 +1,7 @@
1
1
  import type { Content } from "../../types.js";
2
2
  import { BaseEmbeddingModel, type CreateEmbeddingModelOptions, type EmbeddingModelInfo, type EmbeddingResult, type NormalizedEmbeddingOptions } from "../embeddings.js";
3
3
  import type { Model2VecEmbeddingCatalogEntry } from "../catalog.js";
4
- type TokenTensor = {
5
- data: ArrayLike<number | bigint>;
6
- };
7
- type TokenizerOutput = {
8
- input_ids: TokenTensor;
9
- };
10
- type TokenizerLike = {
11
- (text: string, options: {
12
- add_special_tokens: false;
13
- truncation: true;
14
- max_length: number;
15
- }): TokenizerOutput | Promise<TokenizerOutput>;
16
- unk_token_id?: number | null;
17
- };
18
- type StaticEmbeddingTable = {
19
- data: Float32Array | Uint16Array;
20
- dimension: number;
21
- dtype: "F16" | "F32";
22
- rows: number;
23
- };
4
+ import { type StaticEmbeddingTable, type TokenizerLike } from "./model2vec-runtime.js";
24
5
  type Model2VecDependencies = {
25
6
  loadTokenizer(repo: string, options: {
26
7
  cache_dir: string;
@@ -40,7 +21,9 @@ export declare class Model2VecEmbeddingModel extends BaseEmbeddingModel {
40
21
  private readonly dependencies;
41
22
  private tokenizer;
42
23
  private staticTable;
24
+ private workerPool;
43
25
  private loadPromise;
26
+ private readonly useWorkerPool;
44
27
  private disposed;
45
28
  constructor(entry: Model2VecEmbeddingCatalogEntry, options: CreateEmbeddingModelOptions, dependencies?: Partial<Model2VecDependencies>);
46
29
  protected doEmbed(contents: readonly Content[], options: NormalizedEmbeddingOptions): Promise<EmbeddingResult>;