@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,235 @@
1
+ import { select } from "@inquirer/prompts";
2
+ import { getLlama, LlamaLogLevel, NoBinaryFoundError, resolveModelFile, } from "node-llama-cpp";
3
+ import { EMBEDDING_MODEL_FILE, EMBEDDING_MODEL_PATH, EMBEDDING_MODEL_SOURCES, MODELS_DIR, ensureDirs, hasEmbeddingModel, isMirrorName, isUiLanguage, loadConfig, saveConfig, } from "./config.js";
4
+ import { getLocalizedMirrorLabel, getUiLanguageLabel, t } from "./i18n.js";
5
+ const MIRROR_CHOICES = [
6
+ { mirror: "huggingface", key: "1" },
7
+ { mirror: "modelscope", key: "2" },
8
+ ];
9
+ const LANGUAGE_CHOICES = [
10
+ { key: "1", language: "en", aliases: ["english"] },
11
+ { key: "2", language: "zh-CN", aliases: ["zh-cn", "zh_cn", "zhcn", "cn", "simplified", "simplified-chinese"] },
12
+ { key: "3", language: "zh-TW", aliases: ["zh-tw", "zh_tw", "zhtw", "tw", "traditional", "traditional-chinese"] },
13
+ { key: "4", language: "ja", aliases: ["jp", "japanese"] },
14
+ { key: "5", language: "ko", aliases: ["kr", "korean"] },
15
+ { key: "6", language: "fr", aliases: ["french", "francais"] },
16
+ { key: "7", language: "ru", aliases: ["russian"] },
17
+ { key: "8", language: "de", aliases: ["german", "deutsch"] },
18
+ { key: "9", language: "es", aliases: ["spanish", "espanol", "español"] },
19
+ { key: "10", language: "pt", aliases: ["portuguese", "portugues", "português", "pt-br", "pt-pt"] },
20
+ ];
21
+ let _runtimeCheck = null;
22
+ export function getMirrorLabel(mirror, language = null) {
23
+ if (!mirror)
24
+ return t(language, "notSet");
25
+ return getLocalizedMirrorLabel(mirror, language);
26
+ }
27
+ export function getConfiguredMirror(config, preferredMirror) {
28
+ if (isMirrorName(preferredMirror))
29
+ return preferredMirror;
30
+ return config.mirror;
31
+ }
32
+ function normalizeUiLanguageInput(value) {
33
+ if (value == null)
34
+ return null;
35
+ if (isUiLanguage(value))
36
+ return value;
37
+ const normalized = value.trim().toLowerCase();
38
+ if (normalized === "")
39
+ return null;
40
+ for (const choice of LANGUAGE_CHOICES) {
41
+ if (choice.key === normalized || choice.aliases.includes(normalized)) {
42
+ return choice.language;
43
+ }
44
+ }
45
+ return null;
46
+ }
47
+ export function getConfiguredUiLanguage(config, preferredLanguage) {
48
+ const preferred = normalizeUiLanguageInput(preferredLanguage);
49
+ if (preferred)
50
+ return preferred;
51
+ return config.uiLanguage;
52
+ }
53
+ export async function promptForUiLanguageSelection(languageForPrompts = "en") {
54
+ try {
55
+ return await select({
56
+ message: t(languageForPrompts, "languagePromptTitle"),
57
+ default: "en",
58
+ pageSize: LANGUAGE_CHOICES.length,
59
+ instructions: {
60
+ navigation: t(languageForPrompts, "menuHint"),
61
+ pager: t(languageForPrompts, "menuHint"),
62
+ },
63
+ choices: LANGUAGE_CHOICES.map((choice) => ({
64
+ value: choice.language,
65
+ name: getUiLanguageLabel(choice.language),
66
+ })),
67
+ });
68
+ }
69
+ catch (error) {
70
+ handlePromptAbort(error);
71
+ }
72
+ }
73
+ export async function promptForMirrorSelection(language = "en") {
74
+ try {
75
+ return await select({
76
+ message: t(language, "mirrorPromptTitle"),
77
+ default: "huggingface",
78
+ instructions: {
79
+ navigation: t(language, "menuHint"),
80
+ pager: t(language, "menuHint"),
81
+ },
82
+ choices: MIRROR_CHOICES.map((choice) => ({
83
+ value: choice.mirror,
84
+ name: getLocalizedMirrorLabel(choice.mirror, language),
85
+ description: t(language, choice.mirror === "huggingface" ? "mirrorHintHuggingFace" : "mirrorHintModelScope"),
86
+ })),
87
+ });
88
+ }
89
+ catch (error) {
90
+ handlePromptAbort(error);
91
+ }
92
+ }
93
+ export async function ensureUiLanguageConfigured(config, options = { interactive: false }) {
94
+ const selected = getConfiguredUiLanguage(config, options.preferredLanguage);
95
+ if (selected) {
96
+ if (config.uiLanguage !== selected) {
97
+ config.uiLanguage = selected;
98
+ if (options.save !== false)
99
+ saveConfig(config);
100
+ }
101
+ return config;
102
+ }
103
+ if (!options.interactive || !process.stdin.isTTY || !process.stdout.isTTY) {
104
+ config.uiLanguage = "en";
105
+ if (options.save !== false)
106
+ saveConfig(config);
107
+ return config;
108
+ }
109
+ config.uiLanguage = await promptForUiLanguageSelection("en");
110
+ if (options.save !== false)
111
+ saveConfig(config);
112
+ console.log(t(config.uiLanguage, "languageSet", { language: getUiLanguageLabel(config.uiLanguage) }));
113
+ return config;
114
+ }
115
+ export async function ensureMirrorConfigured(config, options = { interactive: false }) {
116
+ const selected = getConfiguredMirror(config, options.preferredMirror);
117
+ if (selected) {
118
+ if (config.mirror !== selected) {
119
+ config.mirror = selected;
120
+ if (options.save !== false)
121
+ saveConfig(config);
122
+ }
123
+ return config;
124
+ }
125
+ const language = options.uiLanguage ?? config.uiLanguage ?? "en";
126
+ if (!options.interactive || !process.stdin.isTTY || !process.stdout.isTTY) {
127
+ throw new Error(t(language, "mirrorSelectionRequired"));
128
+ }
129
+ config.mirror = await promptForMirrorSelection(language);
130
+ if (options.save !== false)
131
+ saveConfig(config);
132
+ return config;
133
+ }
134
+ export async function ensureEmbeddingRuntimeAvailable(language = null) {
135
+ if (_runtimeCheck)
136
+ return _runtimeCheck;
137
+ _runtimeCheck = (async () => {
138
+ try {
139
+ await getLlama({
140
+ build: "never",
141
+ dryRun: true,
142
+ gpu: "auto",
143
+ logLevel: LlamaLogLevel.warn,
144
+ progressLogs: false,
145
+ });
146
+ }
147
+ catch (error) {
148
+ throw formatRuntimeError(error, language);
149
+ }
150
+ })();
151
+ return _runtimeCheck;
152
+ }
153
+ export async function ensureEmbeddingModelReady(options = {}) {
154
+ ensureDirs();
155
+ const baseConfig = options.config ?? loadConfig();
156
+ const interactive = options.interactive ?? false;
157
+ const configWithLanguage = await ensureUiLanguageConfigured(baseConfig, {
158
+ interactive,
159
+ preferredLanguage: options.preferredLanguage,
160
+ });
161
+ const config = await ensureMirrorConfigured(configWithLanguage, {
162
+ interactive,
163
+ preferredMirror: options.preferredMirror,
164
+ uiLanguage: configWithLanguage.uiLanguage,
165
+ });
166
+ if (hasEmbeddingModel()) {
167
+ console.log(t(config.uiLanguage, "modelAlreadyAvailable", { path: EMBEDDING_MODEL_PATH }));
168
+ console.log(t(config.uiLanguage, "modelSkipDownload"));
169
+ return { config, modelPath: EMBEDDING_MODEL_PATH };
170
+ }
171
+ const source = EMBEDDING_MODEL_SOURCES[config.mirror];
172
+ const sourceLabel = getLocalizedMirrorLabel(config.mirror, config.uiLanguage);
173
+ console.log(t(config.uiLanguage, "embeddingDownload", { file: EMBEDDING_MODEL_FILE }));
174
+ console.log(t(config.uiLanguage, "labelSource", { label: sourceLabel }));
175
+ console.log(t(config.uiLanguage, "labelSavedTo", { path: EMBEDDING_MODEL_PATH }));
176
+ const modelPath = await withLocalizedDownloadProgress(config.uiLanguage, async () => resolveModelFile(source.downloadUrl, {
177
+ cli: options.showProgress ?? true,
178
+ directory: MODELS_DIR,
179
+ download: "auto",
180
+ fileName: EMBEDDING_MODEL_FILE,
181
+ verify: false,
182
+ }));
183
+ return { config, modelPath };
184
+ }
185
+ async function withLocalizedDownloadProgress(language, run) {
186
+ const stdoutWrite = process.stdout.write.bind(process.stdout);
187
+ const stderrWrite = process.stderr.write.bind(process.stderr);
188
+ const patch = (text) => text
189
+ .replaceAll("Downloading to", t(language, "downloadProgressDownloadingTo"))
190
+ .replaceAll("Downloaded to", t(language, "downloadProgressDownloadedTo"));
191
+ const patchChunk = (chunk) => {
192
+ if (typeof chunk === "string") {
193
+ return patch(chunk);
194
+ }
195
+ try {
196
+ return Buffer.from(patch(Buffer.from(chunk).toString("utf8")), "utf8");
197
+ }
198
+ catch {
199
+ return chunk;
200
+ }
201
+ };
202
+ process.stdout.write = ((chunk, encoding, cb) => {
203
+ return stdoutWrite(patchChunk(chunk), encoding, cb);
204
+ });
205
+ process.stderr.write = ((chunk, encoding, cb) => {
206
+ return stderrWrite(patchChunk(chunk), encoding, cb);
207
+ });
208
+ try {
209
+ return await run();
210
+ }
211
+ finally {
212
+ process.stdout.write = stdoutWrite;
213
+ process.stderr.write = stderrWrite;
214
+ }
215
+ }
216
+ function formatRuntimeError(error, language) {
217
+ if (error instanceof NoBinaryFoundError) {
218
+ return new Error(t(language, "runtimeBinaryUnavailable"));
219
+ }
220
+ if (error instanceof Error) {
221
+ return error;
222
+ }
223
+ return new Error(String(error));
224
+ }
225
+ function handlePromptAbort(error) {
226
+ if (error &&
227
+ typeof error === "object" &&
228
+ (("code" in error && error.code === "ABORT_ERR")
229
+ || ("name" in error && (error.name === "AbortPromptError" || error.name === "ExitPromptError")))) {
230
+ console.log("");
231
+ process.exit(130);
232
+ }
233
+ throw error;
234
+ }
235
+ //# sourceMappingURL=model-bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-bootstrap.js","sourceRoot":"","sources":["../src/model-bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 代理服务独立启动入口(后台进程使用)。
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=proxy-main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-main.d.ts","sourceRoot":"","sources":["../src/proxy-main.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 代理服务独立启动入口(后台进程使用)。
3
+ */
4
+ import { startProxy } from "./proxy.js";
5
+ import { applyMeluRuntimeContextEnv, createMeluRuntimeContext, } from "./runtime-context.js";
6
+ const memoryName = process.env.MELU_MEMORY_PATH || process.env.MELU_MEMORY || null;
7
+ const runtimeContext = createMeluRuntimeContext(process.env.MELU_RUN_ID || null);
8
+ applyMeluRuntimeContextEnv(runtimeContext);
9
+ startProxy(memoryName, runtimeContext);
10
+ //# sourceMappingURL=proxy-main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-main.js","sourceRoot":"","sources":["../src/proxy-main.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC;AACnF,MAAM,cAAc,GAAG,wBAAwB,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;AACjF,0BAA0B,CAAC,cAAc,CAAC,CAAC;AAC3C,UAAU,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Melu 代理服务。
3
+ *
4
+ * 原生 Node.js HTTP 服务器,拦截 Anthropic Messages API 请求,
5
+ * 注入记忆后转发给真实 API,SSE streaming 逐 chunk 透传。
6
+ */
7
+ import { type MeluRuntimeContext } from "./runtime-context.js";
8
+ export declare function startProxy(memoryName?: string | null, runtime?: MeluRuntimeContext): Promise<void>;
9
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAC;AAwR9B,wBAAgB,UAAU,CACxB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAkDf"}
package/dist/proxy.js ADDED
@@ -0,0 +1,309 @@
1
+ /**
2
+ * Melu 代理服务。
3
+ *
4
+ * 原生 Node.js HTTP 服务器,拦截 Anthropic Messages API 请求,
5
+ * 注入记忆后转发给真实 API,SSE streaming 逐 chunk 透传。
6
+ */
7
+ import { createHash } from "node:crypto";
8
+ import { createServer } from "node:http";
9
+ import { loadConfig, getMemoryPath } from "./config.js";
10
+ import { embedLongTextViaDaemon } from "./embedder-daemon-client.js";
11
+ import { enqueuePendingExtractionJob } from "./extraction-queue.js";
12
+ import { MemoryStore, formatMemoriesForInjection } from "./memory.js";
13
+ import { applyMeluRuntimeContextEnv, getMeluRuntimeContext, } from "./runtime-context.js";
14
+ let store = null;
15
+ let config;
16
+ let activeMemoryPath = null;
17
+ let runtimeContext = null;
18
+ let didLogEmbedderFallback = false;
19
+ /** 本次 run 已入队的 userText 哈希集合,防止同一条消息被重复提取 */
20
+ const enqueuedTextHashes = new Set();
21
+ function hashText(text) {
22
+ return createHash("sha256").update(text).digest("hex").slice(0, 16);
23
+ }
24
+ // ── 辅助函数 ─────────────────────────────────────────────────────────
25
+ function buildUpstreamHeaders(req) {
26
+ const forwardKeys = [
27
+ "authorization", "x-api-key", "content-type",
28
+ "anthropic-version", "anthropic-beta",
29
+ "anthropic-dangerous-direct-browser-access",
30
+ "user-agent", "x-app",
31
+ ];
32
+ const headers = {};
33
+ for (const key of forwardKeys) {
34
+ const val = req.headers[key];
35
+ if (val)
36
+ headers[key] = Array.isArray(val) ? val[0] : val;
37
+ }
38
+ return headers;
39
+ }
40
+ // 无需 ExtractionContext,提取由 CLI 层面的 claude -p 完成
41
+ /**
42
+ * 从 user message 中剥离系统注入的标签内容(如 <system-reminder>、<available-deferred-tools> 等),
43
+ * 只保留用户真正输入的文本。
44
+ */
45
+ function stripSystemTags(text) {
46
+ // 移除所有 <tag-name>...</tag-name> 形式的系统注入块
47
+ const cleaned = text.replace(/<(system-reminder|available-deferred-tools|local-command-caveat|command-name|command-message|command-args|local-command-stdout|task-notification|antml:[a-z_]+)[^>]*>[\s\S]*?<\/\1>/gi, "");
48
+ // 也移除自闭合的 <tag /> 形式
49
+ return cleaned.replace(/<(system-reminder|available-deferred-tools)[^>]*\/>/gi, "").trim();
50
+ }
51
+ /**
52
+ * 判断一个 user message 是否只包含 tool_result 块(即不含真正的用户输入)。
53
+ * Claude Code 在 assistant tool_use 之后会发送 role=user 的 tool_result 消息,
54
+ * 这些不是用户真正说的话,不应被提取记忆。
55
+ */
56
+ function isToolResultOnly(content) {
57
+ if (!Array.isArray(content))
58
+ return false;
59
+ if (content.length === 0)
60
+ return false;
61
+ return content.every((block) => typeof block === "object" &&
62
+ block !== null &&
63
+ "type" in block &&
64
+ block.type === "tool_result");
65
+ }
66
+ function extractUserText(messages) {
67
+ for (let i = messages.length - 1; i >= 0; i--) {
68
+ const msg = messages[i];
69
+ if (msg.role !== "user")
70
+ continue;
71
+ // 跳过纯 tool_result 消息(不是用户真正的输入)
72
+ if (isToolResultOnly(msg.content))
73
+ continue;
74
+ if (typeof msg.content === "string")
75
+ return stripSystemTags(msg.content);
76
+ if (Array.isArray(msg.content)) {
77
+ const parts = [];
78
+ for (const block of msg.content) {
79
+ if (typeof block === "object" && block && "type" in block && block.type === "text" && "text" in block) {
80
+ parts.push(block.text);
81
+ }
82
+ }
83
+ return stripSystemTags(parts.join("\n"));
84
+ }
85
+ }
86
+ return "";
87
+ }
88
+ function injectMemoriesIntoBody(body, memoryText) {
89
+ if (!memoryText)
90
+ return;
91
+ const existing = body.system;
92
+ if (typeof existing === "string") {
93
+ body.system = existing + memoryText;
94
+ }
95
+ else if (Array.isArray(existing)) {
96
+ existing.push({ type: "text", text: memoryText });
97
+ }
98
+ else {
99
+ body.system = memoryText;
100
+ }
101
+ }
102
+ async function readBody(req) {
103
+ const chunks = [];
104
+ for await (const chunk of req) {
105
+ chunks.push(chunk);
106
+ }
107
+ return Buffer.concat(chunks);
108
+ }
109
+ // ── 核心处理 ─────────────────────────────────────────────────────────
110
+ async function handleRequest(req, res) {
111
+ const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
112
+ const path = url.pathname;
113
+ const query = url.search;
114
+ const upstreamBase = config.upstreamAnthropic;
115
+ const upstreamUrl = `${upstreamBase}${path}${query}`;
116
+ const upstreamHeaders = buildUpstreamHeaders(req);
117
+ console.log(`[Melu:DEBUG] 收到请求: ${req.method} ${path}${query}`);
118
+ console.log(`[Melu:DEBUG] 转发到: ${upstreamUrl}`);
119
+ console.log(`[Melu:DEBUG] Auth header 类型: ${req.headers["authorization"] ? "Bearer/OAuth" : ""} ${req.headers["x-api-key"] ? "API-Key" : ""}`);
120
+ const rawBody = await readBody(req);
121
+ const isMessages = path.includes("messages") && req.method === "POST";
122
+ let bodyDict = null;
123
+ let userText = "";
124
+ let isStreaming = false;
125
+ if (isMessages && rawBody.length > 0) {
126
+ try {
127
+ bodyDict = JSON.parse(rawBody.toString("utf-8"));
128
+ const messages = bodyDict.messages;
129
+ isStreaming = bodyDict.stream === true;
130
+ userText = extractUserText(messages);
131
+ console.log(`[Melu:DEBUG] userText 长度: ${userText.length}, 前200字: ${userText.slice(0, 200)}`);
132
+ // 检索记忆
133
+ if (store && userText) {
134
+ let queryVector = null;
135
+ try {
136
+ queryVector = await embedLongTextViaDaemon(userText, config.embeddingModel, {
137
+ runId: runtimeContext?.runId ?? null,
138
+ socketPath: runtimeContext?.embedderSocketPath ?? null,
139
+ type: "query",
140
+ });
141
+ }
142
+ catch (e) {
143
+ queryVector = null;
144
+ if (!didLogEmbedderFallback) {
145
+ didLogEmbedderFallback = true;
146
+ console.warn("[Melu] Embedding daemon 不可用,已降级为非向量检索");
147
+ }
148
+ console.warn("[Melu] Query embedding 失败:", e);
149
+ }
150
+ const memories = store.retrieve(queryVector);
151
+ if (memories.length > 0) {
152
+ const memoryText = formatMemoriesForInjection(memories);
153
+ injectMemoriesIntoBody(bodyDict, memoryText);
154
+ console.log(`[Melu] 注入 ${memories.length} 条记忆`);
155
+ }
156
+ }
157
+ // 重新序列化
158
+ const newBody = JSON.stringify(bodyDict);
159
+ upstreamHeaders["content-length"] = String(Buffer.byteLength(newBody));
160
+ const model = bodyDict.model ?? "";
161
+ console.log(`[Melu] 请求模型: ${model || "(empty)"}`);
162
+ const forwarded = isStreaming
163
+ ? await handleStreaming(upstreamUrl, upstreamHeaders, newBody, res)
164
+ : await handleNormal(req.method ?? "POST", upstreamUrl, upstreamHeaders, newBody, res);
165
+ if (forwarded && userText && userText.trim().length > 4) {
166
+ const textHash = hashText(userText);
167
+ if (enqueuedTextHashes.has(textHash)) {
168
+ console.log(`[Melu] 跳过重复 userText (hash=${textHash})`);
169
+ }
170
+ else {
171
+ try {
172
+ enqueuePendingExtractionJob(userText, activeMemoryPath, runtimeContext?.runId ?? null);
173
+ enqueuedTextHashes.add(textHash);
174
+ console.log(`[Melu] 已记录待提取文本 (${userText.length} 字符)`);
175
+ }
176
+ catch (e) {
177
+ console.warn("[Melu] 写入待提取队列失败:", e);
178
+ }
179
+ }
180
+ }
181
+ return;
182
+ }
183
+ catch {
184
+ console.warn("[Melu] 请求体 JSON 解析失败,原样转发");
185
+ }
186
+ }
187
+ // 非 messages 请求或解析失败,原样转发
188
+ await handleNormal(req.method ?? "GET", upstreamUrl, upstreamHeaders, rawBody, res);
189
+ }
190
+ async function handleNormal(method, url, headers, body, res) {
191
+ try {
192
+ const resp = await fetch(url, {
193
+ method,
194
+ headers,
195
+ body: method !== "GET" && method !== "HEAD" ? (typeof body === "string" ? body : new Uint8Array(body)) : undefined,
196
+ });
197
+ res.writeHead(resp.status, Object.fromEntries([...resp.headers.entries()].filter(([k]) => !["content-encoding", "transfer-encoding", "content-length"].includes(k.toLowerCase()))));
198
+ if (resp.body) {
199
+ const reader = resp.body.getReader();
200
+ const pump = async () => {
201
+ while (true) {
202
+ const { done, value } = await reader.read();
203
+ if (done)
204
+ break;
205
+ res.write(value);
206
+ }
207
+ res.end();
208
+ };
209
+ await pump();
210
+ }
211
+ else {
212
+ const buffer = await resp.arrayBuffer();
213
+ res.end(Buffer.from(buffer));
214
+ }
215
+ return resp.ok;
216
+ }
217
+ catch (e) {
218
+ console.error("[Melu] 转发失败:", e);
219
+ res.writeHead(502);
220
+ res.end("Melu proxy error");
221
+ return false;
222
+ }
223
+ }
224
+ async function handleStreaming(url, headers, body, res) {
225
+ try {
226
+ const resp = await fetch(url, {
227
+ method: "POST",
228
+ headers,
229
+ body,
230
+ });
231
+ // 透传响应头
232
+ res.writeHead(resp.status, {
233
+ "content-type": "text/event-stream",
234
+ "cache-control": "no-cache",
235
+ "connection": "keep-alive",
236
+ "x-accel-buffering": "no",
237
+ });
238
+ if (resp.body) {
239
+ const reader = resp.body.getReader();
240
+ while (true) {
241
+ const { done, value } = await reader.read();
242
+ if (done)
243
+ break;
244
+ res.write(value);
245
+ }
246
+ }
247
+ res.end();
248
+ return resp.ok;
249
+ }
250
+ catch (e) {
251
+ console.error("[Melu] Streaming 转发失败:", e);
252
+ if (!res.headersSent) {
253
+ res.writeHead(502);
254
+ }
255
+ res.end("Melu proxy streaming error");
256
+ return false;
257
+ }
258
+ }
259
+ // ── 启动 ─────────────────────────────────────────────────────────────
260
+ export function startProxy(memoryName, runtime) {
261
+ config = loadConfig();
262
+ const upstreamOverride = process.env.MELU_UPSTREAM_ANTHROPIC?.trim();
263
+ if (upstreamOverride) {
264
+ config.upstreamAnthropic = upstreamOverride;
265
+ }
266
+ runtimeContext = runtime ?? getMeluRuntimeContext();
267
+ applyMeluRuntimeContextEnv(runtimeContext);
268
+ const memPath = getMemoryPath(memoryName ?? config.defaultMemory);
269
+ activeMemoryPath = memPath;
270
+ didLogEmbedderFallback = false;
271
+ store = new MemoryStore(memPath);
272
+ store.open();
273
+ console.log(`[Melu] 记忆文件: ${memPath}`);
274
+ console.log(`[Melu] 记忆条数: ${store.countActive()}`);
275
+ return new Promise((resolve) => {
276
+ const server = createServer((req, res) => {
277
+ handleRequest(req, res).catch((e) => {
278
+ console.error("[Melu] 请求处理失败:", e);
279
+ if (!res.headersSent)
280
+ res.writeHead(500);
281
+ res.end("Internal proxy error");
282
+ });
283
+ });
284
+ server.listen(config.port, "127.0.0.1", () => {
285
+ console.log(`[Melu] 代理服务运行在 http://127.0.0.1:${config.port}`);
286
+ resolve();
287
+ });
288
+ // 优雅退出
289
+ let shuttingDown = false;
290
+ const shutdown = () => {
291
+ if (shuttingDown)
292
+ return;
293
+ shuttingDown = true;
294
+ console.log("\n[Melu] 正在关闭...");
295
+ store?.close();
296
+ store = null;
297
+ activeMemoryPath = null;
298
+ runtimeContext = null;
299
+ server.close(() => {
300
+ console.log("[Melu] 已完全退出");
301
+ process.exit(0);
302
+ });
303
+ setTimeout(() => process.exit(0), 3000);
304
+ };
305
+ process.on("SIGINT", shutdown);
306
+ process.on("SIGTERM", shutdown);
307
+ });
308
+ }
309
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export interface MeluRunPaths {
2
+ runId: string;
3
+ socketPath: string;
4
+ statsPath: string;
5
+ pendingExtractionsDir: string;
6
+ }
7
+ export interface MeluRunStats {
8
+ runId: string;
9
+ processed: number;
10
+ newMemories: number;
11
+ failed: number;
12
+ remainingQueue: number;
13
+ updatedAt: string;
14
+ }
15
+ interface JsonSocketResponse {
16
+ id?: string;
17
+ type?: string;
18
+ error?: string;
19
+ latency_ms?: number;
20
+ [key: string]: unknown;
21
+ }
22
+ export declare function createRunId(): string;
23
+ export declare function getRunPaths(runId: string): MeluRunPaths;
24
+ export declare function ensureRunPaths(paths: MeluRunPaths): void;
25
+ export declare function createInitialRunStats(runId: string, remainingQueue?: number): MeluRunStats;
26
+ export declare function writeAtomicJson(filePath: string, value: unknown): void;
27
+ export declare function readRunStats(statsPath: string): MeluRunStats | null;
28
+ export declare function countQueueJobs(queueDir: string): number;
29
+ export declare function buildRunEnv(paths: MeluRunPaths, ownerPid: number, overrides?: Record<string, string | undefined>): NodeJS.ProcessEnv;
30
+ export declare function sendUnixSocketJson<TResponse extends JsonSocketResponse = JsonSocketResponse>(socketPath: string, payload: Record<string, unknown>, timeoutMs?: number): Promise<TResponse>;
31
+ export declare function waitForUnixSocketReady(socketPath: string, timeoutMs?: number): Promise<void>;
32
+ export declare function sleep(ms: number): Promise<void>;
33
+ export {};
34
+ //# sourceMappingURL=run-runtime.d.ts.map