@hope666/melu 1.0.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.
Files changed (87) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +57 -0
  3. package/dist/cli.d.ts +8 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +630 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config.d.ts +45 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +135 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/embedder-client.d.ts +24 -0
  12. package/dist/embedder-client.d.ts.map +1 -0
  13. package/dist/embedder-client.js +164 -0
  14. package/dist/embedder-client.js.map +1 -0
  15. package/dist/embedder-daemon-client.d.ts +10 -0
  16. package/dist/embedder-daemon-client.d.ts.map +1 -0
  17. package/dist/embedder-daemon-client.js +185 -0
  18. package/dist/embedder-daemon-client.js.map +1 -0
  19. package/dist/embedder-daemon.d.ts +11 -0
  20. package/dist/embedder-daemon.d.ts.map +1 -0
  21. package/dist/embedder-daemon.js +284 -0
  22. package/dist/embedder-daemon.js.map +1 -0
  23. package/dist/embedder-ipc.d.ts +27 -0
  24. package/dist/embedder-ipc.d.ts.map +1 -0
  25. package/dist/embedder-ipc.js +60 -0
  26. package/dist/embedder-ipc.js.map +1 -0
  27. package/dist/embedder-main.d.ts +2 -0
  28. package/dist/embedder-main.d.ts.map +1 -0
  29. package/dist/embedder-main.js +6 -0
  30. package/dist/embedder-main.js.map +1 -0
  31. package/dist/embedder.d.ts +41 -0
  32. package/dist/embedder.d.ts.map +1 -0
  33. package/dist/embedder.js +231 -0
  34. package/dist/embedder.js.map +1 -0
  35. package/dist/extraction-queue.d.ts +53 -0
  36. package/dist/extraction-queue.d.ts.map +1 -0
  37. package/dist/extraction-queue.js +418 -0
  38. package/dist/extraction-queue.js.map +1 -0
  39. package/dist/extraction-stats.d.ts +15 -0
  40. package/dist/extraction-stats.d.ts.map +1 -0
  41. package/dist/extraction-stats.js +89 -0
  42. package/dist/extraction-stats.js.map +1 -0
  43. package/dist/extractor-worker-main.d.ts +2 -0
  44. package/dist/extractor-worker-main.d.ts.map +1 -0
  45. package/dist/extractor-worker-main.js +70 -0
  46. package/dist/extractor-worker-main.js.map +1 -0
  47. package/dist/extractor-worker.d.ts +17 -0
  48. package/dist/extractor-worker.d.ts.map +1 -0
  49. package/dist/extractor-worker.js +164 -0
  50. package/dist/extractor-worker.js.map +1 -0
  51. package/dist/extractor.d.ts +36 -0
  52. package/dist/extractor.d.ts.map +1 -0
  53. package/dist/extractor.js +244 -0
  54. package/dist/extractor.js.map +1 -0
  55. package/dist/i18n.d.ts +995 -0
  56. package/dist/i18n.d.ts.map +1 -0
  57. package/dist/i18n.js +1024 -0
  58. package/dist/i18n.js.map +1 -0
  59. package/dist/memory.d.ts +62 -0
  60. package/dist/memory.d.ts.map +1 -0
  61. package/dist/memory.js +293 -0
  62. package/dist/memory.js.map +1 -0
  63. package/dist/model-bootstrap.d.ts +29 -0
  64. package/dist/model-bootstrap.d.ts.map +1 -0
  65. package/dist/model-bootstrap.js +235 -0
  66. package/dist/model-bootstrap.js.map +1 -0
  67. package/dist/proxy-main.d.ts +5 -0
  68. package/dist/proxy-main.d.ts.map +1 -0
  69. package/dist/proxy-main.js +10 -0
  70. package/dist/proxy-main.js.map +1 -0
  71. package/dist/proxy.d.ts +9 -0
  72. package/dist/proxy.d.ts.map +1 -0
  73. package/dist/proxy.js +309 -0
  74. package/dist/proxy.js.map +1 -0
  75. package/dist/run-runtime.d.ts +34 -0
  76. package/dist/run-runtime.d.ts.map +1 -0
  77. package/dist/run-runtime.js +170 -0
  78. package/dist/run-runtime.js.map +1 -0
  79. package/dist/runtime-context.d.ts +12 -0
  80. package/dist/runtime-context.d.ts.map +1 -0
  81. package/dist/runtime-context.js +39 -0
  82. package/dist/runtime-context.js.map +1 -0
  83. package/dist/text-chunking.d.ts +7 -0
  84. package/dist/text-chunking.d.ts.map +1 -0
  85. package/dist/text-chunking.js +50 -0
  86. package/dist/text-chunking.js.map +1 -0
  87. package/package.json +46 -0
@@ -0,0 +1,284 @@
1
+ import { existsSync, unlinkSync } from "node:fs";
2
+ import { createConnection, createServer } from "node:net";
3
+ import { pathToFileURL } from "node:url";
4
+ import { disposeEmbedder, embedBatch, getEmbedder } from "./embedder.js";
5
+ import { EMBEDDER_DAEMON_DEFAULT_IDLE_CHECK_MS, EMBEDDER_DAEMON_DEFAULT_IDLE_TIMEOUT_MS, encodeEmbedderMessage, getEmbedderDaemonSocketPath, isEmbedderDaemonRequest, normalizeEmbedderTexts, tryParseEmbedderMessage, } from "./embedder-ipc.js";
6
+ import { ensureDirs, loadConfig } from "./config.js";
7
+ function hasProcessExited(pid) {
8
+ if (!Number.isInteger(pid) || pid <= 0)
9
+ return true;
10
+ try {
11
+ process.kill(pid, 0);
12
+ return false;
13
+ }
14
+ catch {
15
+ return true;
16
+ }
17
+ }
18
+ function serializeResponse(response) {
19
+ return encodeEmbedderMessage(response);
20
+ }
21
+ function createRequestError(request, error, latencyMs) {
22
+ return {
23
+ id: request.id,
24
+ run_id: request.run_id,
25
+ type: request.type,
26
+ ok: false,
27
+ error,
28
+ latency_ms: latencyMs,
29
+ };
30
+ }
31
+ function createRequestSuccess(request, latencyMs, embeddings) {
32
+ return {
33
+ id: request.id,
34
+ run_id: request.run_id,
35
+ type: request.type,
36
+ ok: true,
37
+ error: null,
38
+ latency_ms: latencyMs,
39
+ embeddings,
40
+ };
41
+ }
42
+ async function embedRequest(request, modelId) {
43
+ const startedAt = Date.now();
44
+ try {
45
+ const texts = normalizeEmbedderTexts(request.texts);
46
+ if (request.type !== "ping" && texts.length === 0) {
47
+ return createRequestError(request, "texts must contain at least one non-empty string", Date.now() - startedAt);
48
+ }
49
+ if (request.type === "ping") {
50
+ return createRequestSuccess(request, Date.now() - startedAt, []);
51
+ }
52
+ const vectors = await embedBatch(texts, modelId, {
53
+ purpose: request.type === "memory" ? "memory" : "query",
54
+ });
55
+ return createRequestSuccess(request, Date.now() - startedAt, vectors.map((vector) => Array.from(vector)));
56
+ }
57
+ catch (error) {
58
+ return createRequestError(request, error instanceof Error ? error.message : String(error), Date.now() - startedAt);
59
+ }
60
+ }
61
+ function scheduleTask(state, task) {
62
+ state.requestChain = state.requestChain
63
+ .then(task)
64
+ .catch((error) => {
65
+ console.error("[Melu] Embedder daemon task failed:", error);
66
+ });
67
+ }
68
+ function maybeShutdownForIdle(state) {
69
+ if (state.shutdownRequested)
70
+ return;
71
+ if (state.inFlight > 0)
72
+ return;
73
+ if (Date.now() - state.lastActivityAt < state.idleTimeoutMs)
74
+ return;
75
+ if (!hasProcessExited(state.ownerPid))
76
+ return;
77
+ state.shutdownRequested = true;
78
+ void shutdownEmbedderDaemon(state, 0, "owner process exited and daemon stayed idle");
79
+ }
80
+ async function shutdownEmbedderDaemon(state, exitCode, reason) {
81
+ if (state.shutdownRequested && exitCode !== 0) {
82
+ return;
83
+ }
84
+ state.shutdownRequested = true;
85
+ if (state.idleTimer) {
86
+ clearInterval(state.idleTimer);
87
+ state.idleTimer = null;
88
+ }
89
+ try {
90
+ state.server.close();
91
+ }
92
+ catch {
93
+ // Ignore close failures during shutdown.
94
+ }
95
+ try {
96
+ await state.requestChain;
97
+ }
98
+ catch {
99
+ // Ignore queued failures during shutdown.
100
+ }
101
+ try {
102
+ await disposeEmbedder();
103
+ }
104
+ catch (error) {
105
+ console.error("[Melu] Failed to dispose embedder during shutdown:", error);
106
+ }
107
+ try {
108
+ if (existsSync(state.socketPath)) {
109
+ unlinkSync(state.socketPath);
110
+ }
111
+ }
112
+ catch {
113
+ // Ignore cleanup failures.
114
+ }
115
+ console.error(`[Melu] Embedder daemon exited: ${reason}`);
116
+ process.exit(exitCode);
117
+ }
118
+ function attachSocketHandlers(socket, state) {
119
+ socket.setEncoding("utf8");
120
+ let buffer = "";
121
+ let handled = false;
122
+ const finishWithResponse = (response) => {
123
+ if (handled)
124
+ return;
125
+ handled = true;
126
+ const payload = serializeResponse(response);
127
+ socket.end(payload, "utf8");
128
+ };
129
+ socket.on("data", (chunk) => {
130
+ if (handled)
131
+ return;
132
+ buffer += chunk;
133
+ const newlineIndex = buffer.indexOf("\n");
134
+ if (newlineIndex === -1)
135
+ return;
136
+ const rawLine = buffer.slice(0, newlineIndex);
137
+ const parsed = tryParseEmbedderMessage(rawLine);
138
+ if (!isEmbedderDaemonRequest(parsed)) {
139
+ finishWithResponse(createRequestError({
140
+ id: "invalid",
141
+ run_id: "invalid",
142
+ type: "ping",
143
+ texts: [],
144
+ }, "Invalid embedder daemon request", 0));
145
+ return;
146
+ }
147
+ const request = parsed;
148
+ const queueItem = request;
149
+ state.inFlight += 1;
150
+ scheduleTask(state, async () => {
151
+ state.lastActivityAt = Date.now();
152
+ const response = await embedRequest(queueItem, state.modelId);
153
+ state.inFlight -= 1;
154
+ state.lastActivityAt = Date.now();
155
+ if (response.run_id !== queueItem.run_id) {
156
+ finishWithResponse(createRequestError(queueItem, "run_id mismatch in embedder daemon response", response.latency_ms));
157
+ return;
158
+ }
159
+ finishWithResponse(response);
160
+ maybeShutdownForIdle(state);
161
+ });
162
+ });
163
+ socket.on("error", (error) => {
164
+ if (!handled) {
165
+ handled = true;
166
+ console.error("[Melu] Embedder daemon socket error:", error);
167
+ }
168
+ });
169
+ socket.on("close", () => {
170
+ if (!handled) {
171
+ handled = true;
172
+ }
173
+ });
174
+ }
175
+ async function ensureSocketPathAvailable(socketPath) {
176
+ if (!existsSync(socketPath))
177
+ return;
178
+ const isLiveSocket = await new Promise((resolve) => {
179
+ const probe = createConnection({ path: socketPath });
180
+ let settled = false;
181
+ const settle = (isAlive) => {
182
+ if (settled)
183
+ return;
184
+ settled = true;
185
+ probe.removeAllListeners();
186
+ probe.destroy();
187
+ resolve(isAlive);
188
+ };
189
+ probe.once("connect", () => {
190
+ settle(true);
191
+ });
192
+ probe.once("error", () => {
193
+ settle(false);
194
+ });
195
+ probe.setTimeout(250, () => {
196
+ settle(false);
197
+ });
198
+ });
199
+ if (isLiveSocket) {
200
+ throw new Error(`Embedder daemon already appears to be running at ${socketPath}`);
201
+ }
202
+ try {
203
+ unlinkSync(socketPath);
204
+ }
205
+ catch {
206
+ // Ignore stale cleanup failures. Listen will fail if the path is genuinely busy.
207
+ }
208
+ }
209
+ export async function startEmbedderDaemon(options) {
210
+ ensureDirs();
211
+ delete process.env.MELU_EMBEDDER_SOCKET;
212
+ const config = loadConfig();
213
+ const socketPath = options.socketPath ?? getEmbedderDaemonSocketPath(options.runId);
214
+ const ownerPid = options.ownerPid ?? process.ppid;
215
+ const idleTimeoutMs = options.idleTimeoutMs ?? EMBEDDER_DAEMON_DEFAULT_IDLE_TIMEOUT_MS;
216
+ const idleCheckMs = options.idleCheckMs ?? EMBEDDER_DAEMON_DEFAULT_IDLE_CHECK_MS;
217
+ const modelId = options.modelId ?? config.embeddingModel;
218
+ if (process.platform === "win32") {
219
+ throw new Error("Embedder daemon currently expects a Unix socket path and is not wired for Windows yet.");
220
+ }
221
+ await ensureSocketPathAvailable(socketPath);
222
+ console.error(`[Melu] Preloading embedder model for run ${options.runId}`);
223
+ await getEmbedder(modelId);
224
+ const server = createServer();
225
+ const state = {
226
+ server,
227
+ socketPath,
228
+ ownerPid,
229
+ idleTimeoutMs,
230
+ idleCheckMs,
231
+ modelId,
232
+ shutdownRequested: false,
233
+ inFlight: 0,
234
+ lastActivityAt: Date.now(),
235
+ requestChain: Promise.resolve(),
236
+ idleTimer: null,
237
+ };
238
+ server.on("connection", (socket) => {
239
+ attachSocketHandlers(socket, state);
240
+ });
241
+ server.on("error", (error) => {
242
+ console.error("[Melu] Embedder daemon server error:", error);
243
+ void shutdownEmbedderDaemon(state, 1, "server error");
244
+ });
245
+ await new Promise((resolve, reject) => {
246
+ server.listen(socketPath, () => resolve());
247
+ server.once("error", reject);
248
+ });
249
+ state.idleTimer = setInterval(() => {
250
+ maybeShutdownForIdle(state);
251
+ }, idleCheckMs);
252
+ process.once("SIGINT", () => {
253
+ void shutdownEmbedderDaemon(state, 0, "SIGINT");
254
+ });
255
+ process.once("SIGTERM", () => {
256
+ void shutdownEmbedderDaemon(state, 0, "SIGTERM");
257
+ });
258
+ console.error(`[Melu] Embedder daemon listening at ${socketPath}`);
259
+ }
260
+ export async function runEmbedderDaemonFromEnv() {
261
+ const runId = process.env.MELU_RUN_ID ?? process.env.MELU_DAEMON_RUN_ID ?? "default";
262
+ const socketPath = process.env.MELU_EMBEDDER_SOCKET?.trim() || undefined;
263
+ const ownerPidRaw = process.env.MELU_DAEMON_OWNER_PID ?? "";
264
+ const idleTimeoutRaw = process.env.MELU_DAEMON_IDLE_TIMEOUT_MS ?? "";
265
+ const idleCheckRaw = process.env.MELU_DAEMON_IDLE_CHECK_MS ?? "";
266
+ const ownerPid = Number(ownerPidRaw);
267
+ const idleTimeoutMs = Number(idleTimeoutRaw);
268
+ const idleCheckMs = Number(idleCheckRaw);
269
+ await startEmbedderDaemon({
270
+ runId,
271
+ socketPath,
272
+ ownerPid: Number.isInteger(ownerPid) && ownerPid > 0 ? ownerPid : undefined,
273
+ idleTimeoutMs: Number.isFinite(idleTimeoutMs) && idleTimeoutMs > 0 ? idleTimeoutMs : undefined,
274
+ idleCheckMs: Number.isFinite(idleCheckMs) && idleCheckMs > 0 ? idleCheckMs : undefined,
275
+ });
276
+ }
277
+ const entryPoint = process.argv[1];
278
+ if (entryPoint && import.meta.url === pathToFileURL(entryPoint).href) {
279
+ void runEmbedderDaemonFromEnv().catch((error) => {
280
+ console.error("[Melu] Failed to start embedder daemon:", error);
281
+ process.exitCode = 1;
282
+ });
283
+ }
284
+ //# sourceMappingURL=embedder-daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder-daemon.js","sourceRoot":"","sources":["../src/embedder-daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export declare const EMBEDDER_DAEMON_SOCKET_PREFIX = "embedder";
2
+ export declare const EMBEDDER_DAEMON_DEFAULT_IDLE_TIMEOUT_MS: number;
3
+ export declare const EMBEDDER_DAEMON_DEFAULT_IDLE_CHECK_MS: number;
4
+ export type EmbedderRequestType = "query" | "memory" | "ping";
5
+ export interface EmbedderDaemonRequest {
6
+ id: string;
7
+ run_id: string;
8
+ type: EmbedderRequestType;
9
+ texts: string[];
10
+ }
11
+ export interface EmbedderDaemonResponse {
12
+ id: string;
13
+ run_id: string;
14
+ type: EmbedderRequestType;
15
+ ok: boolean;
16
+ error: string | null;
17
+ latency_ms: number;
18
+ embeddings?: number[][];
19
+ }
20
+ export declare function sanitizePathComponent(value: string): string;
21
+ export declare function getEmbedderDaemonSocketPath(runId: string): string;
22
+ export declare function isEmbedderRequestType(value: unknown): value is EmbedderRequestType;
23
+ export declare function normalizeEmbedderTexts(texts: unknown): string[];
24
+ export declare function isEmbedderDaemonRequest(value: unknown): value is EmbedderDaemonRequest;
25
+ export declare function encodeEmbedderMessage(message: EmbedderDaemonRequest | EmbedderDaemonResponse): string;
26
+ export declare function tryParseEmbedderMessage(line: string): unknown;
27
+ //# sourceMappingURL=embedder-ipc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder-ipc.d.ts","sourceRoot":"","sources":["../src/embedder-ipc.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,6BAA6B,aAAa,CAAC;AACxD,eAAO,MAAM,uCAAuC,QAAgB,CAAC;AACrE,eAAO,MAAM,qCAAqC,QAAY,CAAC;AAE/D,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,mBAAmB,CAAC;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAElF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAY/D;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAatF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,sBAAsB,GAAG,MAAM,CAErG;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAS7D"}
@@ -0,0 +1,60 @@
1
+ import { join } from "node:path";
2
+ import { SOCKETS_DIR } from "./config.js";
3
+ export const EMBEDDER_DAEMON_SOCKET_PREFIX = "embedder";
4
+ export const EMBEDDER_DAEMON_DEFAULT_IDLE_TIMEOUT_MS = 5 * 60 * 1000;
5
+ export const EMBEDDER_DAEMON_DEFAULT_IDLE_CHECK_MS = 30 * 1000;
6
+ export function sanitizePathComponent(value) {
7
+ const normalized = value
8
+ .trim()
9
+ .replace(/[^a-zA-Z0-9._-]+/g, "-")
10
+ .replace(/-+/g, "-")
11
+ .replace(/^[-.]+|[-.]+$/g, "");
12
+ return normalized.length > 0 ? normalized.slice(0, 120) : "default";
13
+ }
14
+ export function getEmbedderDaemonSocketPath(runId) {
15
+ return join(SOCKETS_DIR, `${EMBEDDER_DAEMON_SOCKET_PREFIX}-${sanitizePathComponent(runId)}.sock`);
16
+ }
17
+ export function isEmbedderRequestType(value) {
18
+ return value === "query" || value === "memory" || value === "ping";
19
+ }
20
+ export function normalizeEmbedderTexts(texts) {
21
+ if (!Array.isArray(texts))
22
+ return [];
23
+ const normalized = [];
24
+ for (const item of texts) {
25
+ if (typeof item !== "string")
26
+ continue;
27
+ const text = item.trim();
28
+ if (text) {
29
+ normalized.push(text);
30
+ }
31
+ }
32
+ return normalized;
33
+ }
34
+ export function isEmbedderDaemonRequest(value) {
35
+ if (!value || typeof value !== "object")
36
+ return false;
37
+ const obj = value;
38
+ return (typeof obj.id === "string" &&
39
+ obj.id.trim() !== "" &&
40
+ typeof obj.run_id === "string" &&
41
+ obj.run_id.trim() !== "" &&
42
+ isEmbedderRequestType(obj.type) &&
43
+ Array.isArray(obj.texts) &&
44
+ obj.texts.every((item) => typeof item === "string"));
45
+ }
46
+ export function encodeEmbedderMessage(message) {
47
+ return JSON.stringify(message) + "\n";
48
+ }
49
+ export function tryParseEmbedderMessage(line) {
50
+ const trimmed = line.trim();
51
+ if (trimmed === "")
52
+ return null;
53
+ try {
54
+ return JSON.parse(trimmed);
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ //# sourceMappingURL=embedder-ipc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder-ipc.js","sourceRoot":"","sources":["../src/embedder-ipc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=embedder-main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder-main.d.ts","sourceRoot":"","sources":["../src/embedder-main.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { runEmbedderDaemonFromEnv } from "./embedder-daemon.js";
2
+ void runEmbedderDaemonFromEnv().catch((error) => {
3
+ console.error("[Melu] Failed to start embedder daemon:", error);
4
+ process.exitCode = 1;
5
+ });
6
+ //# sourceMappingURL=embedder-main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder-main.js","sourceRoot":"","sources":["../src/embedder-main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,KAAK,wBAAwB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC9C,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;IAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Melu Embedding 封装。
3
+ *
4
+ * 使用 node-llama-cpp 加载 GGUF embedding 模型,
5
+ * 运行时使用预编译 llama.cpp binary,不要求用户自行安装系统编译依赖。
6
+ */
7
+ import { type Llama, type LlamaEmbeddingContext, type LlamaModel } from "node-llama-cpp";
8
+ type EmbeddingPurpose = "query" | "memory";
9
+ interface LoadedEmbedder {
10
+ llama: Llama;
11
+ model: LlamaModel;
12
+ embeddingContext: LlamaEmbeddingContext;
13
+ }
14
+ /**
15
+ * 获取或初始化 embedding backend(单例,懒加载)。
16
+ */
17
+ export declare function getEmbedder(modelId: string): Promise<LoadedEmbedder>;
18
+ /**
19
+ * 对单条文本生成 embedding 向量。
20
+ */
21
+ export declare function embed(text: string, modelId: string, options?: {
22
+ purpose?: EmbeddingPurpose;
23
+ }): Promise<Float32Array>;
24
+ /**
25
+ * 对长文本分块后做 embedding,并对所有 chunk 向量取平均。
26
+ */
27
+ export declare function embedLongText(text: string, modelId: string, options?: {
28
+ purpose?: EmbeddingPurpose;
29
+ }): Promise<Float32Array>;
30
+ /**
31
+ * 批量 embedding。
32
+ */
33
+ export declare function embedBatch(texts: string[], modelId: string, options?: {
34
+ purpose?: EmbeddingPurpose;
35
+ }): Promise<Float32Array[]>;
36
+ /**
37
+ * 释放模型,回收内存。
38
+ */
39
+ export declare function disposeEmbedder(): Promise<void>;
40
+ export {};
41
+ //# sourceMappingURL=embedder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AAaxB,KAAK,gBAAgB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3C,UAAU,cAAc;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,gBAAgB,EAAE,qBAAqB,CAAC;CACzC;AAKD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA6C1E;AAED;;GAEG;AACH,wBAAsB,KAAK,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,gBAAgB,CAAA;CAAO,GAC3C,OAAO,CAAC,YAAY,CAAC,CAYvB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,gBAAgB,CAAA;CAAO,GAC3C,OAAO,CAAC,YAAY,CAAC,CAYvB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,gBAAgB,CAAA;CAAO,GAC3C,OAAO,CAAC,YAAY,EAAE,CAAC,CAYzB;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CASrD"}