codestrate 0.6.1 → 0.6.3

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 (223) hide show
  1. package/README.md +97 -101
  2. package/dist/constants.d.ts +1 -1
  3. package/dist/constants.d.ts.map +1 -1
  4. package/dist/constants.js +54 -4
  5. package/dist/constants.js.map +1 -1
  6. package/dist/index.d.ts +3 -2
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +198 -119
  9. package/dist/index.js.map +1 -1
  10. package/dist/install.d.ts +0 -0
  11. package/dist/install.d.ts.map +0 -0
  12. package/dist/install.js +2 -2
  13. package/dist/install.js.map +1 -1
  14. package/dist/profiles.d.ts +28 -0
  15. package/dist/profiles.d.ts.map +1 -0
  16. package/dist/profiles.js +89 -0
  17. package/dist/profiles.js.map +1 -0
  18. package/dist/schemas/index.d.ts +1441 -126
  19. package/dist/schemas/index.d.ts.map +1 -1
  20. package/dist/schemas/index.js +221 -10
  21. package/dist/schemas/index.js.map +1 -1
  22. package/dist/security/guard.d.ts +15 -2
  23. package/dist/security/guard.d.ts.map +1 -1
  24. package/dist/security/guard.js +42 -8
  25. package/dist/security/guard.js.map +1 -1
  26. package/dist/services/code-chunker.d.ts +50 -0
  27. package/dist/services/code-chunker.d.ts.map +1 -0
  28. package/dist/services/code-chunker.js +148 -0
  29. package/dist/services/code-chunker.js.map +1 -0
  30. package/dist/services/code-searcher.d.ts +6 -2
  31. package/dist/services/code-searcher.d.ts.map +1 -1
  32. package/dist/services/code-searcher.js +111 -17
  33. package/dist/services/code-searcher.js.map +1 -1
  34. package/dist/services/context-builder.d.ts +0 -11
  35. package/dist/services/context-builder.d.ts.map +1 -1
  36. package/dist/services/context-builder.js +74 -128
  37. package/dist/services/context-builder.js.map +1 -1
  38. package/dist/services/embedding-runtime.d.ts +41 -0
  39. package/dist/services/embedding-runtime.d.ts.map +1 -0
  40. package/dist/services/embedding-runtime.js +636 -0
  41. package/dist/services/embedding-runtime.js.map +1 -0
  42. package/dist/services/embedding.d.ts +79 -0
  43. package/dist/services/embedding.d.ts.map +1 -0
  44. package/dist/services/embedding.js +257 -0
  45. package/dist/services/embedding.js.map +1 -0
  46. package/dist/services/index-state.d.ts +74 -0
  47. package/dist/services/index-state.d.ts.map +1 -0
  48. package/dist/services/index-state.js +151 -0
  49. package/dist/services/index-state.js.map +1 -0
  50. package/dist/services/index-worker.d.ts +60 -0
  51. package/dist/services/index-worker.d.ts.map +1 -0
  52. package/dist/services/index-worker.js +182 -0
  53. package/dist/services/index-worker.js.map +1 -0
  54. package/dist/services/logger.d.ts +48 -0
  55. package/dist/services/logger.d.ts.map +1 -0
  56. package/dist/services/logger.js +106 -0
  57. package/dist/services/logger.js.map +1 -0
  58. package/dist/services/memory-store.d.ts +9 -7
  59. package/dist/services/memory-store.d.ts.map +1 -1
  60. package/dist/services/memory-store.js +93 -7
  61. package/dist/services/memory-store.js.map +1 -1
  62. package/dist/services/repository-parser.d.ts +0 -0
  63. package/dist/services/repository-parser.d.ts.map +0 -0
  64. package/dist/services/repository-parser.js +0 -0
  65. package/dist/services/repository-parser.js.map +0 -0
  66. package/dist/services/symbol-indexer.d.ts +0 -0
  67. package/dist/services/symbol-indexer.d.ts.map +1 -1
  68. package/dist/services/symbol-indexer.js +25 -13
  69. package/dist/services/symbol-indexer.js.map +1 -1
  70. package/dist/services/tree-sitter.d.ts +0 -0
  71. package/dist/services/tree-sitter.d.ts.map +0 -0
  72. package/dist/services/tree-sitter.js +0 -0
  73. package/dist/services/tree-sitter.js.map +0 -0
  74. package/dist/services/validation-runner.d.ts +0 -0
  75. package/dist/services/validation-runner.d.ts.map +1 -1
  76. package/dist/services/validation-runner.js +9 -9
  77. package/dist/services/validation-runner.js.map +1 -1
  78. package/dist/services/vector-indexer.d.ts +53 -0
  79. package/dist/services/vector-indexer.d.ts.map +1 -0
  80. package/dist/services/vector-indexer.js +230 -0
  81. package/dist/services/vector-indexer.js.map +1 -0
  82. package/dist/store/index.d.ts +0 -0
  83. package/dist/store/index.d.ts.map +0 -0
  84. package/dist/store/index.js +0 -0
  85. package/dist/store/index.js.map +0 -0
  86. package/dist/store/interface.d.ts +70 -1
  87. package/dist/store/interface.d.ts.map +1 -1
  88. package/dist/store/interface.js +0 -0
  89. package/dist/store/interface.js.map +0 -0
  90. package/dist/store/memory.d.ts +0 -0
  91. package/dist/store/memory.d.ts.map +0 -0
  92. package/dist/store/memory.js +0 -0
  93. package/dist/store/memory.js.map +0 -0
  94. package/dist/store/service.d.ts +49 -0
  95. package/dist/store/service.d.ts.map +1 -0
  96. package/dist/store/service.js +147 -0
  97. package/dist/store/service.js.map +1 -0
  98. package/dist/store/sqlite.d.ts +68 -3
  99. package/dist/store/sqlite.d.ts.map +1 -1
  100. package/dist/store/sqlite.js +708 -58
  101. package/dist/store/sqlite.js.map +1 -1
  102. package/dist/store/vector-store.d.ts +66 -0
  103. package/dist/store/vector-store.d.ts.map +1 -0
  104. package/dist/store/vector-store.js +330 -0
  105. package/dist/store/vector-store.js.map +1 -0
  106. package/dist/tools/analyze-impact.d.ts +0 -0
  107. package/dist/tools/analyze-impact.d.ts.map +1 -1
  108. package/dist/tools/analyze-impact.js +101 -39
  109. package/dist/tools/analyze-impact.js.map +1 -1
  110. package/dist/tools/deep-explore.d.ts +0 -0
  111. package/dist/tools/deep-explore.d.ts.map +1 -1
  112. package/dist/tools/deep-explore.js +18 -4
  113. package/dist/tools/deep-explore.js.map +1 -1
  114. package/dist/tools/detect-cycles.d.ts +3 -0
  115. package/dist/tools/detect-cycles.d.ts.map +1 -0
  116. package/dist/tools/detect-cycles.js +61 -0
  117. package/dist/tools/detect-cycles.js.map +1 -0
  118. package/dist/tools/detect-dead-code.d.ts +0 -0
  119. package/dist/tools/detect-dead-code.d.ts.map +1 -1
  120. package/dist/tools/detect-dead-code.js +1 -0
  121. package/dist/tools/detect-dead-code.js.map +1 -1
  122. package/dist/tools/explore.d.ts +13 -0
  123. package/dist/tools/explore.d.ts.map +1 -1
  124. package/dist/tools/explore.js +122 -88
  125. package/dist/tools/explore.js.map +1 -1
  126. package/dist/tools/get-context.d.ts +15 -0
  127. package/dist/tools/get-context.d.ts.map +1 -1
  128. package/dist/tools/get-context.js +66 -61
  129. package/dist/tools/get-context.js.map +1 -1
  130. package/dist/tools/graph-explain.d.ts +3 -0
  131. package/dist/tools/graph-explain.d.ts.map +1 -0
  132. package/dist/tools/graph-explain.js +140 -0
  133. package/dist/tools/graph-explain.js.map +1 -0
  134. package/dist/tools/graph-stats.d.ts +3 -0
  135. package/dist/tools/graph-stats.d.ts.map +1 -0
  136. package/dist/tools/graph-stats.js +73 -0
  137. package/dist/tools/graph-stats.js.map +1 -0
  138. package/dist/tools/inspect-symbol.d.ts +10 -0
  139. package/dist/tools/inspect-symbol.d.ts.map +1 -1
  140. package/dist/tools/inspect-symbol.js +112 -101
  141. package/dist/tools/inspect-symbol.js.map +1 -1
  142. package/dist/tools/ping.d.ts +0 -0
  143. package/dist/tools/ping.d.ts.map +1 -1
  144. package/dist/tools/ping.js +2 -3
  145. package/dist/tools/ping.js.map +1 -1
  146. package/dist/tools/profile.d.ts +9 -0
  147. package/dist/tools/profile.d.ts.map +1 -0
  148. package/dist/tools/profile.js +101 -0
  149. package/dist/tools/profile.js.map +1 -0
  150. package/dist/tools/query-graph.d.ts +3 -0
  151. package/dist/tools/query-graph.d.ts.map +1 -0
  152. package/dist/tools/query-graph.js +157 -0
  153. package/dist/tools/query-graph.js.map +1 -0
  154. package/dist/tools/recall-experience.d.ts +0 -0
  155. package/dist/tools/recall-experience.d.ts.map +1 -1
  156. package/dist/tools/recall-experience.js +5 -5
  157. package/dist/tools/recall-experience.js.map +1 -1
  158. package/dist/tools/record-experience.d.ts +0 -0
  159. package/dist/tools/record-experience.d.ts.map +1 -1
  160. package/dist/tools/record-experience.js +2 -5
  161. package/dist/tools/record-experience.js.map +1 -1
  162. package/dist/tools/reflect.d.ts +4 -0
  163. package/dist/tools/reflect.d.ts.map +1 -0
  164. package/dist/tools/reflect.js +99 -0
  165. package/dist/tools/reflect.js.map +1 -0
  166. package/dist/tools/register.d.ts +5 -2
  167. package/dist/tools/register.d.ts.map +1 -1
  168. package/dist/tools/register.js +31 -1
  169. package/dist/tools/register.js.map +1 -1
  170. package/dist/tools/reindex.d.ts +0 -0
  171. package/dist/tools/reindex.d.ts.map +1 -1
  172. package/dist/tools/reindex.js +102 -21
  173. package/dist/tools/reindex.js.map +1 -1
  174. package/dist/tools/repo-overview.d.ts +0 -0
  175. package/dist/tools/repo-overview.d.ts.map +1 -1
  176. package/dist/tools/repo-overview.js +8 -6
  177. package/dist/tools/repo-overview.js.map +1 -1
  178. package/dist/tools/run-validation.d.ts +0 -0
  179. package/dist/tools/run-validation.d.ts.map +1 -1
  180. package/dist/tools/run-validation.js +15 -1
  181. package/dist/tools/run-validation.js.map +1 -1
  182. package/dist/tools/search-code.d.ts +0 -0
  183. package/dist/tools/search-code.d.ts.map +1 -1
  184. package/dist/tools/search-code.js +11 -4
  185. package/dist/tools/search-code.js.map +1 -1
  186. package/dist/tools/search-history.d.ts +0 -0
  187. package/dist/tools/search-history.d.ts.map +0 -0
  188. package/dist/tools/search-history.js +0 -0
  189. package/dist/tools/search-history.js.map +0 -0
  190. package/dist/tools/session-heartbeat.d.ts +0 -0
  191. package/dist/tools/session-heartbeat.d.ts.map +1 -1
  192. package/dist/tools/session-heartbeat.js +1 -0
  193. package/dist/tools/session-heartbeat.js.map +1 -1
  194. package/dist/tools/session-status.d.ts +0 -0
  195. package/dist/tools/session-status.d.ts.map +1 -1
  196. package/dist/tools/session-status.js +1 -0
  197. package/dist/tools/session-status.js.map +1 -1
  198. package/dist/tools/status.d.ts +0 -0
  199. package/dist/tools/status.d.ts.map +1 -1
  200. package/dist/tools/status.js +87 -24
  201. package/dist/tools/status.js.map +1 -1
  202. package/dist/tools/trace-bfs.d.ts +13 -0
  203. package/dist/tools/trace-bfs.d.ts.map +1 -0
  204. package/dist/tools/trace-bfs.js +251 -0
  205. package/dist/tools/trace-bfs.js.map +1 -0
  206. package/dist/tools/trace-flow.d.ts +1 -1
  207. package/dist/tools/trace-flow.d.ts.map +1 -1
  208. package/dist/tools/trace-flow.js +113 -69
  209. package/dist/tools/trace-flow.js.map +1 -1
  210. package/dist/types.d.ts +75 -13
  211. package/dist/types.d.ts.map +1 -1
  212. package/dist/types.js +15 -0
  213. package/dist/types.js.map +1 -1
  214. package/grammars/tree-sitter-c.wasm +0 -0
  215. package/grammars/tree-sitter-cpp.wasm +0 -0
  216. package/grammars/tree-sitter-go.wasm +0 -0
  217. package/grammars/tree-sitter-java.wasm +0 -0
  218. package/grammars/tree-sitter-javascript.wasm +0 -0
  219. package/grammars/tree-sitter-python.wasm +0 -0
  220. package/grammars/tree-sitter-rust.wasm +0 -0
  221. package/grammars/tree-sitter-tsx.wasm +0 -0
  222. package/grammars/tree-sitter-typescript.wasm +0 -0
  223. package/package.json +8 -6
@@ -0,0 +1,636 @@
1
+ /**
2
+ * Embedding runtime bootstrap — fully automatic local stack:
3
+ *
4
+ * 1. Probe existing llama-server (if any)
5
+ * 2. Download LFM2.5-Embedding-350M GGUF (~220MB) if missing
6
+ * 3. Download/find llama-server binary if missing
7
+ * 4. Spawn managed llama-server --embeddings
8
+ * 5. Wait until /v1/embeddings is healthy
9
+ *
10
+ * Default mode is "auto". Set embeddingMode=none or CI_MCP_EMBEDDING_MODE=none to disable.
11
+ * Logs go to stderr only (MCP stdio stays clean).
12
+ */
13
+ import { createWriteStream, existsSync, mkdirSync, chmodSync, statSync, unlinkSync, renameSync, readdirSync, } from "fs";
14
+ import { homedir } from "os";
15
+ import { join, dirname, resolve } from "path";
16
+ import { spawn, execFileSync } from "child_process";
17
+ import { pipeline } from "stream/promises";
18
+ import { Readable } from "stream";
19
+ import { DEFAULT_EMBEDDING_DIM, DEFAULT_EMBEDDING_URL, setEmbeddingRuntimeOverride, clearEmbeddingRuntimeOverride, } from "./embedding.js";
20
+ // ─── Constants ────────────────────────────────────────────
21
+ export const CI_MCP_HOME = join(homedir(), ".ci-mcp");
22
+ export const MODELS_DIR = join(CI_MCP_HOME, "models");
23
+ export const BIN_DIR = join(CI_MCP_HOME, "bin");
24
+ /** Prefer Q4_K_M — good quality / size tradeoff (~229 MB). */
25
+ export const DEFAULT_MODEL_REPO = "LiquidAI/LFM2.5-Embedding-350M-GGUF";
26
+ export const DEFAULT_MODEL_FILE = "LFM2.5-Embedding-350M-Q4_K_M.gguf";
27
+ export const DEFAULT_MODEL_DIM = 1024;
28
+ const HF_RESOLVE = (repo, file) => `https://huggingface.co/${repo}/resolve/main/${file}`;
29
+ const MANAGED_PORT_DEFAULT = 18765;
30
+ const HEALTH_TIMEOUT_MS = 120_000;
31
+ const HEALTH_POLL_MS = 500;
32
+ let status = {
33
+ ready: false,
34
+ mode: "none",
35
+ url: null,
36
+ modelPath: null,
37
+ binaryPath: null,
38
+ port: null,
39
+ dim: DEFAULT_EMBEDDING_DIM,
40
+ message: "not started",
41
+ };
42
+ let managedChild = null;
43
+ let bootstrapPromise = null;
44
+ let shuttingDown = false;
45
+ export function getEmbeddingRuntimeStatus() {
46
+ return { ...status };
47
+ }
48
+ function log(msg) {
49
+ console.error(`[embedding-runtime] ${msg}`);
50
+ }
51
+ // ─── Public API ───────────────────────────────────────────
52
+ /**
53
+ * Ensure embedding runtime is ready. Idempotent; concurrent callers share one promise.
54
+ * Safe when embeddingMode is none — returns immediately.
55
+ */
56
+ export async function ensureEmbeddingRuntime(config) {
57
+ if (bootstrapPromise)
58
+ return bootstrapPromise;
59
+ const mode = resolveEffectiveMode(config);
60
+ if (mode === "none") {
61
+ status = {
62
+ ready: false,
63
+ mode: "none",
64
+ url: null,
65
+ modelPath: null,
66
+ binaryPath: null,
67
+ port: null,
68
+ dim: config.embeddingDim ?? DEFAULT_EMBEDDING_DIM,
69
+ message: "embedding disabled (embeddingMode=none)",
70
+ };
71
+ clearEmbeddingRuntimeOverride();
72
+ return status;
73
+ }
74
+ if (process.env.CI_MCP_MOCK_EMBEDDER === "1") {
75
+ status = {
76
+ ready: true,
77
+ mode: "mock",
78
+ url: null,
79
+ modelPath: null,
80
+ binaryPath: null,
81
+ port: null,
82
+ dim: config.embeddingDim ?? 64,
83
+ message: "mock embedder (CI_MCP_MOCK_EMBEDDER=1)",
84
+ startedAt: new Date().toISOString(),
85
+ };
86
+ return status;
87
+ }
88
+ bootstrapPromise = bootstrap(config, mode).finally(() => {
89
+ // keep promise for reuse while ready; clear on hard failure so retry works
90
+ if (!status.ready && status.mode === "error") {
91
+ bootstrapPromise = null;
92
+ }
93
+ });
94
+ return bootstrapPromise;
95
+ }
96
+ export async function shutdownEmbeddingRuntime() {
97
+ shuttingDown = true;
98
+ if (managedChild && !managedChild.killed) {
99
+ log("stopping managed llama-server...");
100
+ managedChild.kill("SIGTERM");
101
+ await new Promise((r) => {
102
+ const t = setTimeout(() => {
103
+ try {
104
+ managedChild?.kill("SIGKILL");
105
+ }
106
+ catch {
107
+ /* ignore */
108
+ }
109
+ r();
110
+ }, 3000);
111
+ managedChild?.once("exit", () => {
112
+ clearTimeout(t);
113
+ r();
114
+ });
115
+ });
116
+ managedChild = null;
117
+ }
118
+ clearEmbeddingRuntimeOverride();
119
+ status = {
120
+ ...status,
121
+ ready: false,
122
+ mode: status.mode === "managed" ? "none" : status.mode,
123
+ message: "shut down",
124
+ };
125
+ bootstrapPromise = null;
126
+ shuttingDown = false;
127
+ }
128
+ // ─── Bootstrap ────────────────────────────────────────────
129
+ function resolveEffectiveMode(config) {
130
+ const env = process.env.CI_MCP_EMBEDDING_MODE?.trim().toLowerCase();
131
+ if (env === "none" || env === "0" || env === "off" || env === "false")
132
+ return "none";
133
+ if (env === "auto" || env === "api" || env === "subprocess")
134
+ return env;
135
+ if (process.env.CI_MCP_AUTO_EMBED === "0")
136
+ return "none";
137
+ const m = config.embeddingMode;
138
+ if (m === "none" || m === "auto" || m === "api" || m === "subprocess")
139
+ return m;
140
+ return "auto";
141
+ }
142
+ async function bootstrap(config, mode) {
143
+ const dim = config.embeddingDim ?? DEFAULT_MODEL_DIM;
144
+ const preferredUrl = config.embeddingApi?.url?.replace(/\/$/, "") || DEFAULT_EMBEDDING_URL;
145
+ try {
146
+ // 1) Reuse already-running server if healthy
147
+ if (mode === "api" || mode === "auto") {
148
+ const existing = await probeEmbeddings(preferredUrl);
149
+ if (existing) {
150
+ log(`using external embedding server at ${preferredUrl}`);
151
+ setEmbeddingRuntimeOverride({ url: preferredUrl, dim });
152
+ status = {
153
+ ready: true,
154
+ mode: "external",
155
+ url: preferredUrl,
156
+ modelPath: null,
157
+ binaryPath: null,
158
+ port: null,
159
+ dim,
160
+ message: `external server ${preferredUrl}`,
161
+ startedAt: new Date().toISOString(),
162
+ };
163
+ return status;
164
+ }
165
+ if (mode === "api") {
166
+ // pure api mode: do not download/spawn — user must provide server
167
+ // unless auto-like: for "api" we still try managed if CI_MCP_AUTO_EMBED != 0
168
+ // Actually user asked fully auto — for api mode if down, fall through to managed
169
+ if (process.env.CI_MCP_STRICT_API === "1") {
170
+ throw new Error(`embeddingMode=api but server unreachable at ${preferredUrl}`);
171
+ }
172
+ log(`api server ${preferredUrl} unreachable — falling back to managed runtime`);
173
+ }
174
+ }
175
+ // 2) Ensure model on disk
176
+ const modelPath = await ensureModel(config);
177
+ status = {
178
+ ...status,
179
+ modelPath,
180
+ message: `model ready: ${modelPath}`,
181
+ dim,
182
+ };
183
+ // 3) Ensure binary
184
+ const binaryPath = await ensureLlamaServerBinary();
185
+ status = { ...status, binaryPath, message: `binary ready: ${binaryPath}` };
186
+ // 4) Pick port (prefer managed default, then preferred, then free)
187
+ const port = await pickPort([
188
+ MANAGED_PORT_DEFAULT,
189
+ parsePort(preferredUrl) ?? 0,
190
+ 8080,
191
+ ].filter((p) => p > 0));
192
+ const url = `http://127.0.0.1:${port}`;
193
+ // 5) Spawn managed server
194
+ await spawnManagedServer(binaryPath, modelPath, port);
195
+ await waitHealthy(url, HEALTH_TIMEOUT_MS);
196
+ setEmbeddingRuntimeOverride({ url, dim });
197
+ status = {
198
+ ready: true,
199
+ mode: "managed",
200
+ url,
201
+ modelPath,
202
+ binaryPath,
203
+ port,
204
+ dim,
205
+ message: `managed llama-server on ${url}`,
206
+ startedAt: new Date().toISOString(),
207
+ };
208
+ log(`ready — ${status.message}`);
209
+ return status;
210
+ }
211
+ catch (err) {
212
+ const message = err instanceof Error ? err.message : String(err);
213
+ log(`bootstrap failed: ${message}`);
214
+ clearEmbeddingRuntimeOverride();
215
+ status = {
216
+ ready: false,
217
+ mode: "error",
218
+ url: null,
219
+ modelPath: status.modelPath,
220
+ binaryPath: status.binaryPath,
221
+ port: null,
222
+ dim,
223
+ message: "bootstrap failed",
224
+ error: message,
225
+ };
226
+ return status;
227
+ }
228
+ }
229
+ // ─── Model download ───────────────────────────────────────
230
+ async function ensureModel(config) {
231
+ const custom = process.env.CI_MCP_EMBEDDING_MODEL_PATH;
232
+ if (custom && existsSync(custom)) {
233
+ log(`using model from CI_MCP_EMBEDDING_MODEL_PATH: ${custom}`);
234
+ return resolve(custom);
235
+ }
236
+ const repo = process.env.CI_MCP_EMBEDDING_MODEL_REPO || DEFAULT_MODEL_REPO;
237
+ const file = process.env.CI_MCP_EMBEDDING_MODEL_FILE || DEFAULT_MODEL_FILE;
238
+ mkdirSync(MODELS_DIR, { recursive: true });
239
+ const dest = join(MODELS_DIR, file);
240
+ if (existsSync(dest) && statSync(dest).size > 1_000_000) {
241
+ log(`model already present (${formatBytes(statSync(dest).size)}): ${dest}`);
242
+ return dest;
243
+ }
244
+ const url = HF_RESOLVE(repo, file);
245
+ log(`downloading model ${file} (~220MB) from Hugging Face...`);
246
+ log(` → ${dest}`);
247
+ await downloadFile(url, dest, (done, total) => {
248
+ if (!total)
249
+ return;
250
+ const pct = ((done / total) * 100).toFixed(1);
251
+ // throttle-ish: log every ~10%
252
+ if (done === total || Math.floor((done / total) * 10) !== Math.floor(((done - 1) / total) * 10)) {
253
+ log(` download ${pct}% (${formatBytes(done)} / ${formatBytes(total)})`);
254
+ }
255
+ });
256
+ log(`model download complete: ${dest}`);
257
+ return dest;
258
+ }
259
+ // ─── Binary ensure ────────────────────────────────────────
260
+ async function ensureLlamaServerBinary() {
261
+ const envBin = process.env.CI_MCP_LLAMA_SERVER;
262
+ if (envBin && existsSync(envBin))
263
+ return resolve(envBin);
264
+ const local = join(BIN_DIR, process.platform === "win32" ? "llama-server.exe" : "llama-server");
265
+ if (existsSync(local)) {
266
+ try {
267
+ chmodSync(local, 0o755);
268
+ }
269
+ catch {
270
+ /* ignore */
271
+ }
272
+ return local;
273
+ }
274
+ const fromPath = which("llama-server") || which("llama-server.exe");
275
+ if (fromPath) {
276
+ log(`found llama-server on PATH: ${fromPath}`);
277
+ return fromPath;
278
+ }
279
+ log("llama-server not found — downloading prebuilt binary from llama.cpp releases...");
280
+ mkdirSync(BIN_DIR, { recursive: true });
281
+ await downloadLlamaServerBinary(local);
282
+ return local;
283
+ }
284
+ function which(cmd) {
285
+ try {
286
+ const out = execFileSync(process.platform === "win32" ? "where" : "which", [cmd], { encoding: "utf-8", timeout: 5000 })
287
+ .toString()
288
+ .trim()
289
+ .split(/\r?\n/)[0];
290
+ return out && existsSync(out) ? out : null;
291
+ }
292
+ catch {
293
+ return null;
294
+ }
295
+ }
296
+ async function downloadLlamaServerBinary(destPath) {
297
+ const asset = selectReleaseAsset();
298
+ if (!asset) {
299
+ throw new Error(`No prebuilt llama-server asset for platform=${process.platform} arch=${process.arch}. ` +
300
+ `Install llama.cpp and set CI_MCP_LLAMA_SERVER=/path/to/llama-server`);
301
+ }
302
+ log(`resolving latest llama.cpp release asset: ${asset.pattern}...`);
303
+ const release = await fetchJson("https://api.github.com/repos/ggml-org/llama.cpp/releases/latest");
304
+ const match = release.assets.find((a) => asset.match(a.name));
305
+ if (!match) {
306
+ throw new Error(`Could not find asset matching ${asset.pattern} in ${release.tag_name}`);
307
+ }
308
+ const archivePath = join(BIN_DIR, match.name);
309
+ log(`downloading ${match.name} (${formatBytes(match.size)})...`);
310
+ await downloadFile(match.browser_download_url, archivePath, (done, total) => {
311
+ if (!total)
312
+ return;
313
+ const pct = ((done / total) * 100).toFixed(0);
314
+ if (done === total || done % (5 * 1024 * 1024) < 64 * 1024) {
315
+ log(` binary ${pct}%`);
316
+ }
317
+ });
318
+ log(`extracting llama-server...`);
319
+ extractLlamaServer(archivePath, destPath);
320
+ try {
321
+ unlinkSync(archivePath);
322
+ }
323
+ catch {
324
+ /* ignore */
325
+ }
326
+ try {
327
+ chmodSync(destPath, 0o755);
328
+ }
329
+ catch {
330
+ /* ignore */
331
+ }
332
+ if (!existsSync(destPath)) {
333
+ throw new Error(`Failed to extract llama-server to ${destPath}`);
334
+ }
335
+ log(`llama-server installed: ${destPath}`);
336
+ }
337
+ function selectReleaseAsset() {
338
+ const { platform, arch } = process;
339
+ // Prefer CPU builds (portable). Name patterns from llama.cpp releases.
340
+ if (platform === "linux" && arch === "x64") {
341
+ return {
342
+ pattern: /ubuntu-x64\.tar\.gz$/,
343
+ match: (n) => n.includes("bin-ubuntu-x64") && n.endsWith(".tar.gz") && !n.includes("vulkan") && !n.includes("sycl") && !n.includes("rocm") && !n.includes("openvino"),
344
+ };
345
+ }
346
+ if (platform === "linux" && arch === "arm64") {
347
+ return {
348
+ pattern: /ubuntu-arm64\.tar\.gz$/,
349
+ match: (n) => n.includes("bin-ubuntu-arm64") && n.endsWith(".tar.gz") && !n.includes("vulkan"),
350
+ };
351
+ }
352
+ if (platform === "darwin" && arch === "arm64") {
353
+ return {
354
+ pattern: /macos-arm64\.tar\.gz$/,
355
+ match: (n) => n.includes("bin-macos-arm64") && n.endsWith(".tar.gz"),
356
+ };
357
+ }
358
+ if (platform === "darwin" && arch === "x64") {
359
+ return {
360
+ pattern: /macos-x64\.tar\.gz$/,
361
+ match: (n) => n.includes("bin-macos-x64") && n.endsWith(".tar.gz"),
362
+ };
363
+ }
364
+ if (platform === "win32" && arch === "x64") {
365
+ return {
366
+ pattern: /win-cpu-x64\.zip$/,
367
+ match: (n) => n.includes("bin-win-cpu-x64") && n.endsWith(".zip"),
368
+ };
369
+ }
370
+ return null;
371
+ }
372
+ function extractLlamaServer(archivePath, destPath) {
373
+ mkdirSync(dirname(destPath), { recursive: true });
374
+ const tmpDir = join(BIN_DIR, `extract-${Date.now()}`);
375
+ mkdirSync(tmpDir, { recursive: true });
376
+ try {
377
+ if (archivePath.endsWith(".zip")) {
378
+ // Prefer system unzip
379
+ try {
380
+ execFileSync("unzip", ["-o", archivePath, "-d", tmpDir], {
381
+ timeout: 120_000,
382
+ stdio: ["ignore", "pipe", "pipe"],
383
+ });
384
+ }
385
+ catch {
386
+ // PowerShell Expand-Archive on Windows
387
+ execFileSync("powershell", [
388
+ "-NoProfile",
389
+ "-Command",
390
+ `Expand-Archive -Path '${archivePath}' -DestinationPath '${tmpDir}' -Force`,
391
+ ], { timeout: 120_000 });
392
+ }
393
+ }
394
+ else {
395
+ execFileSync("tar", ["-xzf", archivePath, "-C", tmpDir], {
396
+ timeout: 120_000,
397
+ stdio: ["ignore", "pipe", "pipe"],
398
+ });
399
+ }
400
+ const found = findFileRecursive(tmpDir, process.platform === "win32" ? "llama-server.exe" : "llama-server");
401
+ if (!found) {
402
+ throw new Error("llama-server not found inside archive");
403
+ }
404
+ renameSync(found, destPath);
405
+ }
406
+ finally {
407
+ try {
408
+ execFileSync("rm", ["-rf", tmpDir], { timeout: 30_000 });
409
+ }
410
+ catch {
411
+ /* ignore */
412
+ }
413
+ }
414
+ }
415
+ function findFileRecursive(dir, name) {
416
+ const entries = readdirSync(dir, { withFileTypes: true });
417
+ for (const e of entries) {
418
+ const p = join(dir, e.name);
419
+ if (e.isFile() && e.name === name)
420
+ return p;
421
+ if (e.isDirectory()) {
422
+ const hit = findFileRecursive(p, name);
423
+ if (hit)
424
+ return hit;
425
+ }
426
+ }
427
+ return null;
428
+ }
429
+ // ─── Spawn / health ───────────────────────────────────────
430
+ async function spawnManagedServer(binary, modelPath, port) {
431
+ if (managedChild && !managedChild.killed) {
432
+ managedChild.kill("SIGTERM");
433
+ managedChild = null;
434
+ }
435
+ const args = [
436
+ "-m",
437
+ modelPath,
438
+ "--host",
439
+ "127.0.0.1",
440
+ "--port",
441
+ String(port),
442
+ "--embeddings",
443
+ "-c",
444
+ "2048",
445
+ "-np",
446
+ "1",
447
+ "--parallel",
448
+ "1",
449
+ ];
450
+ log(`starting: ${binary} ${args.join(" ")}`);
451
+ const child = spawn(binary, args, {
452
+ stdio: ["ignore", "pipe", "pipe"],
453
+ detached: false,
454
+ env: { ...process.env },
455
+ });
456
+ managedChild = child;
457
+ child.stdout?.on("data", (buf) => {
458
+ const line = buf.toString().trim();
459
+ if (line)
460
+ log(`[llama-server] ${line.slice(0, 300)}`);
461
+ });
462
+ child.stderr?.on("data", (buf) => {
463
+ const line = buf.toString().trim();
464
+ if (line)
465
+ log(`[llama-server] ${line.slice(0, 300)}`);
466
+ });
467
+ child.on("exit", (code, signal) => {
468
+ if (!shuttingDown) {
469
+ log(`managed llama-server exited code=${code} signal=${signal}`);
470
+ if (status.mode === "managed") {
471
+ status = {
472
+ ...status,
473
+ ready: false,
474
+ message: `managed server exited (${code ?? signal})`,
475
+ };
476
+ clearEmbeddingRuntimeOverride();
477
+ bootstrapPromise = null;
478
+ }
479
+ }
480
+ managedChild = null;
481
+ });
482
+ // brief settle
483
+ await sleep(300);
484
+ if (child.exitCode !== null) {
485
+ throw new Error(`llama-server exited immediately with code ${child.exitCode}`);
486
+ }
487
+ }
488
+ async function waitHealthy(url, timeoutMs) {
489
+ const start = Date.now();
490
+ log(`waiting for embeddings endpoint at ${url}...`);
491
+ while (Date.now() - start < timeoutMs) {
492
+ if (await probeEmbeddings(url)) {
493
+ log("embeddings endpoint healthy");
494
+ return;
495
+ }
496
+ if (managedChild?.exitCode !== null && managedChild?.exitCode !== undefined) {
497
+ throw new Error("llama-server died while waiting for health");
498
+ }
499
+ await sleep(HEALTH_POLL_MS);
500
+ }
501
+ throw new Error(`Timed out waiting for embeddings at ${url} after ${timeoutMs}ms`);
502
+ }
503
+ async function probeEmbeddings(baseUrl) {
504
+ const url = baseUrl.replace(/\/$/, "");
505
+ try {
506
+ // Prefer OpenAI-compatible path with tiny payload
507
+ const controller = new AbortController();
508
+ const t = setTimeout(() => controller.abort(), 2500);
509
+ try {
510
+ const res = await fetch(`${url}/v1/embeddings`, {
511
+ method: "POST",
512
+ headers: { "Content-Type": "application/json" },
513
+ body: JSON.stringify({
514
+ input: "query: ping",
515
+ model: "LFM2.5-Embedding-350M",
516
+ }),
517
+ signal: controller.signal,
518
+ });
519
+ if (res.ok)
520
+ return true;
521
+ // 4xx that is not connection error still means server is up for some builds
522
+ if (res.status === 400 || res.status === 404 || res.status === 422) {
523
+ // try health / models
524
+ const h = await fetch(`${url}/health`, { signal: controller.signal }).catch(() => null);
525
+ if (h?.ok)
526
+ return true;
527
+ const m = await fetch(`${url}/v1/models`, {
528
+ signal: controller.signal,
529
+ }).catch(() => null);
530
+ return !!m?.ok;
531
+ }
532
+ return false;
533
+ }
534
+ finally {
535
+ clearTimeout(t);
536
+ }
537
+ }
538
+ catch {
539
+ return false;
540
+ }
541
+ }
542
+ // ─── Download helpers ─────────────────────────────────────
543
+ async function downloadFile(url, dest, onProgress) {
544
+ mkdirSync(dirname(dest), { recursive: true });
545
+ const partial = `${dest}.partial`;
546
+ const res = await fetch(url, {
547
+ redirect: "follow",
548
+ headers: {
549
+ "User-Agent": "codestrate-mcp/embedding-runtime",
550
+ ...(process.env.HF_TOKEN
551
+ ? { Authorization: `Bearer ${process.env.HF_TOKEN}` }
552
+ : {}),
553
+ },
554
+ });
555
+ if (!res.ok || !res.body) {
556
+ throw new Error(`Download failed ${res.status} ${res.statusText}: ${url}`);
557
+ }
558
+ const total = Number(res.headers.get("content-length") || 0) || null;
559
+ let downloaded = 0;
560
+ const body = Readable.fromWeb(res.body);
561
+ const out = createWriteStream(partial);
562
+ body.on("data", (chunk) => {
563
+ downloaded += chunk.length;
564
+ onProgress?.(downloaded, total);
565
+ });
566
+ await pipeline(body, out);
567
+ renameSync(partial, dest);
568
+ }
569
+ async function fetchJson(url) {
570
+ const res = await fetch(url, {
571
+ headers: {
572
+ "User-Agent": "codestrate-mcp/embedding-runtime",
573
+ Accept: "application/vnd.github+json",
574
+ },
575
+ });
576
+ if (!res.ok) {
577
+ throw new Error(`GET ${url} → ${res.status}`);
578
+ }
579
+ return res.json();
580
+ }
581
+ async function pickPort(preferred) {
582
+ for (const p of preferred) {
583
+ if (await isPortFree(p))
584
+ return p;
585
+ }
586
+ // random high port
587
+ for (let i = 0; i < 20; i++) {
588
+ const p = 19000 + Math.floor(Math.random() * 1000);
589
+ if (await isPortFree(p))
590
+ return p;
591
+ }
592
+ throw new Error("Could not find a free port for llama-server");
593
+ }
594
+ async function isPortFree(port) {
595
+ const net = await import("net");
596
+ return new Promise((resolve) => {
597
+ const srv = net.createServer();
598
+ srv.once("error", () => resolve(false));
599
+ srv.once("listening", () => {
600
+ srv.close(() => resolve(true));
601
+ });
602
+ srv.listen(port, "127.0.0.1");
603
+ });
604
+ }
605
+ function parsePort(url) {
606
+ try {
607
+ const u = new URL(url);
608
+ if (u.port)
609
+ return Number(u.port);
610
+ return u.protocol === "https:" ? 443 : 80;
611
+ }
612
+ catch {
613
+ return null;
614
+ }
615
+ }
616
+ function sleep(ms) {
617
+ return new Promise((r) => setTimeout(r, ms));
618
+ }
619
+ function formatBytes(n) {
620
+ if (n < 1024)
621
+ return `${n} B`;
622
+ if (n < 1024 * 1024)
623
+ return `${(n / 1024).toFixed(1)} KB`;
624
+ if (n < 1024 * 1024 * 1024)
625
+ return `${(n / (1024 * 1024)).toFixed(1)} MB`;
626
+ return `${(n / (1024 * 1024 * 1024)).toFixed(2)} GB`;
627
+ }
628
+ // Graceful shutdown hooks
629
+ for (const sig of ["SIGINT", "SIGTERM"]) {
630
+ process.on(sig, () => {
631
+ void shutdownEmbeddingRuntime().finally(() => {
632
+ // do not force exit — let MCP host manage lifecycle
633
+ });
634
+ });
635
+ }
636
+ //# sourceMappingURL=embedding-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-runtime.js","sourceRoot":"","sources":["../../src/services/embedding-runtime.ts"],"names":[],"mappings":"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"}