@creeperhost/modlens-mcp 1.6.18 → 1.6.19

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 (179) hide show
  1. package/README.md +97 -10
  2. package/TESTING.md +69 -0
  3. package/dist/cli.js +21 -5
  4. package/dist/cli.js.map +1 -1
  5. package/dist/curseforge.d.ts +9 -7
  6. package/dist/curseforge.d.ts.map +1 -1
  7. package/dist/curseforge.js +48 -55
  8. package/dist/curseforge.js.map +1 -1
  9. package/dist/db.d.ts.map +1 -1
  10. package/dist/db.js +31 -1
  11. package/dist/db.js.map +1 -1
  12. package/dist/embeddings.d.ts.map +1 -1
  13. package/dist/embeddings.js +1 -0
  14. package/dist/embeddings.js.map +1 -1
  15. package/dist/feed-the-beast.d.ts +5 -5
  16. package/dist/feed-the-beast.d.ts.map +1 -1
  17. package/dist/feed-the-beast.js +5 -21
  18. package/dist/feed-the-beast.js.map +1 -1
  19. package/dist/java-tools.d.ts +1 -0
  20. package/dist/java-tools.d.ts.map +1 -1
  21. package/dist/java-tools.js +31 -7
  22. package/dist/java-tools.js.map +1 -1
  23. package/dist/launcher.js +15 -0
  24. package/dist/launcher.js.map +1 -1
  25. package/dist/mappings.d.ts +4 -1
  26. package/dist/mappings.d.ts.map +1 -1
  27. package/dist/mappings.js +120 -52
  28. package/dist/mappings.js.map +1 -1
  29. package/dist/minecraft.d.ts +0 -4
  30. package/dist/minecraft.d.ts.map +1 -1
  31. package/dist/minecraft.js +7 -23
  32. package/dist/minecraft.js.map +1 -1
  33. package/dist/mod-artifacts.d.ts +4 -0
  34. package/dist/mod-artifacts.d.ts.map +1 -0
  35. package/dist/mod-artifacts.js +58 -0
  36. package/dist/mod-artifacts.js.map +1 -0
  37. package/dist/modpacks-ch.d.ts +72 -46
  38. package/dist/modpacks-ch.d.ts.map +1 -1
  39. package/dist/modpacks-ch.js +134 -20
  40. package/dist/modpacks-ch.js.map +1 -1
  41. package/dist/modrinth.d.ts +14 -6
  42. package/dist/modrinth.d.ts.map +1 -1
  43. package/dist/modrinth.js +70 -55
  44. package/dist/modrinth.js.map +1 -1
  45. package/dist/platform-adapter.d.ts +1 -0
  46. package/dist/platform-adapter.d.ts.map +1 -1
  47. package/dist/platform.d.ts.map +1 -1
  48. package/dist/platform.js +20 -44
  49. package/dist/platform.js.map +1 -1
  50. package/dist/processor.d.ts +5 -0
  51. package/dist/processor.d.ts.map +1 -1
  52. package/dist/processor.js +166 -46
  53. package/dist/processor.js.map +1 -1
  54. package/dist/registry-submission.d.ts +34 -0
  55. package/dist/registry-submission.d.ts.map +1 -0
  56. package/dist/registry-submission.js +128 -0
  57. package/dist/registry-submission.js.map +1 -0
  58. package/dist/repositories/array-fields.d.ts +3 -0
  59. package/dist/repositories/array-fields.d.ts.map +1 -0
  60. package/dist/repositories/array-fields.js +8 -0
  61. package/dist/repositories/array-fields.js.map +1 -0
  62. package/dist/repositories/embeddings-sqlite.d.ts +1 -0
  63. package/dist/repositories/embeddings-sqlite.d.ts.map +1 -1
  64. package/dist/repositories/embeddings-sqlite.js +26 -58
  65. package/dist/repositories/embeddings-sqlite.js.map +1 -1
  66. package/dist/repositories/embeddings.d.ts.map +1 -1
  67. package/dist/repositories/embeddings.js +26 -3
  68. package/dist/repositories/embeddings.js.map +1 -1
  69. package/dist/repositories/index.d.ts +1 -1
  70. package/dist/repositories/index.d.ts.map +1 -1
  71. package/dist/repositories/mod.d.ts +8 -5
  72. package/dist/repositories/mod.d.ts.map +1 -1
  73. package/dist/repositories/mod.js +25 -11
  74. package/dist/repositories/mod.js.map +1 -1
  75. package/dist/repositories/packs.d.ts.map +1 -1
  76. package/dist/repositories/packs.js +10 -2
  77. package/dist/repositories/packs.js.map +1 -1
  78. package/dist/search-adapter.d.ts +2 -0
  79. package/dist/search-adapter.d.ts.map +1 -1
  80. package/dist/search-adapter.js +21 -9
  81. package/dist/search-adapter.js.map +1 -1
  82. package/dist/security.d.ts +2 -0
  83. package/dist/security.d.ts.map +1 -1
  84. package/dist/security.js +5 -1
  85. package/dist/security.js.map +1 -1
  86. package/dist/server.js +63 -25
  87. package/dist/server.js.map +1 -1
  88. package/dist/sqlite-json.d.ts +3 -0
  89. package/dist/sqlite-json.d.ts.map +1 -0
  90. package/dist/sqlite-json.js +78 -0
  91. package/dist/sqlite-json.js.map +1 -0
  92. package/dist/sqlite-parameters.d.ts +3 -0
  93. package/dist/sqlite-parameters.d.ts.map +1 -0
  94. package/dist/sqlite-parameters.js +19 -0
  95. package/dist/sqlite-parameters.js.map +1 -0
  96. package/dist/sqlite-schema.d.ts +4 -0
  97. package/dist/sqlite-schema.d.ts.map +1 -0
  98. package/dist/sqlite-schema.js +76 -0
  99. package/dist/sqlite-schema.js.map +1 -0
  100. package/dist/tools/catalog.d.ts +1 -6
  101. package/dist/tools/catalog.d.ts.map +1 -1
  102. package/dist/tools/catalog.js +10 -14
  103. package/dist/tools/catalog.js.map +1 -1
  104. package/dist/tools/compat-check.d.ts.map +1 -1
  105. package/dist/tools/compat-check.js +18 -30
  106. package/dist/tools/compat-check.js.map +1 -1
  107. package/dist/tools/diagnostics.js.map +1 -1
  108. package/dist/tools/docs.d.ts.map +1 -1
  109. package/dist/tools/docs.js +8 -3
  110. package/dist/tools/docs.js.map +1 -1
  111. package/dist/tools/embed-registry.d.ts +20 -4
  112. package/dist/tools/embed-registry.d.ts.map +1 -1
  113. package/dist/tools/embed-registry.js +30 -19
  114. package/dist/tools/embed-registry.js.map +1 -1
  115. package/dist/tools/graphify.d.ts +19 -4
  116. package/dist/tools/graphify.d.ts.map +1 -1
  117. package/dist/tools/graphify.js +61 -13
  118. package/dist/tools/graphify.js.map +1 -1
  119. package/dist/tools/ingest.d.ts.map +1 -1
  120. package/dist/tools/ingest.js +4 -4
  121. package/dist/tools/ingest.js.map +1 -1
  122. package/dist/tools/kubejs.js +1 -1
  123. package/dist/tools/kubejs.js.map +1 -1
  124. package/dist/tools/mc-fts.d.ts.map +1 -1
  125. package/dist/tools/mc-fts.js +9 -4
  126. package/dist/tools/mc-fts.js.map +1 -1
  127. package/dist/tools/mcmeta.d.ts +10 -1
  128. package/dist/tools/mcmeta.d.ts.map +1 -1
  129. package/dist/tools/mcmeta.js +43 -29
  130. package/dist/tools/mcmeta.js.map +1 -1
  131. package/dist/tools/mixin-scan.d.ts +12 -6
  132. package/dist/tools/mixin-scan.d.ts.map +1 -1
  133. package/dist/tools/mixin-scan.js +12 -7
  134. package/dist/tools/mixin-scan.js.map +1 -1
  135. package/dist/tools/mod-data.d.ts.map +1 -1
  136. package/dist/tools/mod-data.js +40 -27
  137. package/dist/tools/mod-data.js.map +1 -1
  138. package/dist/tools/modpacks-ch.d.ts +9 -5
  139. package/dist/tools/modpacks-ch.d.ts.map +1 -1
  140. package/dist/tools/modpacks-ch.js +54 -33
  141. package/dist/tools/modpacks-ch.js.map +1 -1
  142. package/dist/tools/packtools.js +3 -3
  143. package/dist/tools/packtools.js.map +1 -1
  144. package/dist/tools/platform.d.ts +2 -2
  145. package/dist/tools/platform.d.ts.map +1 -1
  146. package/dist/tools/platform.js +33 -23
  147. package/dist/tools/platform.js.map +1 -1
  148. package/dist/tools/project.d.ts +342 -0
  149. package/dist/tools/project.d.ts.map +1 -0
  150. package/dist/tools/project.js +519 -0
  151. package/dist/tools/project.js.map +1 -0
  152. package/dist/tools/reports.d.ts.map +1 -1
  153. package/dist/tools/reports.js +5 -3
  154. package/dist/tools/reports.js.map +1 -1
  155. package/dist/tools/vanilla-data.d.ts.map +1 -1
  156. package/dist/tools/vanilla-data.js +3 -33
  157. package/dist/tools/vanilla-data.js.map +1 -1
  158. package/dist/tools/vanilla.d.ts +3 -1
  159. package/dist/tools/vanilla.d.ts.map +1 -1
  160. package/dist/tools/vanilla.js +26 -12
  161. package/dist/tools/vanilla.js.map +1 -1
  162. package/dist/tools/version-diff.d.ts.map +1 -1
  163. package/dist/tools/version-diff.js +4 -24
  164. package/dist/tools/version-diff.js.map +1 -1
  165. package/dist/version-ranges.d.ts +5 -0
  166. package/dist/version-ranges.d.ts.map +1 -0
  167. package/dist/version-ranges.js +93 -0
  168. package/dist/version-ranges.js.map +1 -0
  169. package/package.json +5 -1
  170. package/prisma/backends/template.db +0 -0
  171. package/scripts/build-template-db.mjs +3 -1
  172. package/scripts/enable-sqlite-vec.mjs +2 -106
  173. package/scripts/gradle/modlens.init.gradle +154 -0
  174. package/scripts/project-upload.mjs +74 -0
  175. package/scripts/test-minecraft-eras.mjs +202 -0
  176. package/scripts/test-package.mjs +8 -0
  177. package/scripts/test-project-gradle.mjs +76 -0
  178. package/scripts/test-project-http.mjs +98 -0
  179. package/scripts/test-setup.mjs +18 -0
@@ -0,0 +1,519 @@
1
+ /** Project compile environments. Deliberately independent of the shared mod/MC database. */
2
+ import { createHash, randomBytes } from "node:crypto";
3
+ import { mkdir, readFile, writeFile, readdir, rename, rm, stat, open } from "node:fs/promises";
4
+ import { join, isAbsolute } from "node:path";
5
+ import AdmZip from "adm-zip";
6
+ import { z } from "zod";
7
+ import { CACHE_ROOT } from "../cache.js";
8
+ import { assertHostAccessiblePath, normalizeJarPath } from "../security.js";
9
+ import { decompileClass, inspectClass, getBytecode } from "../java-tools.js";
10
+ const MB = 1024 * 1024;
11
+ export const PROJECT_CHUNK_BYTES = MB;
12
+ const MAX_BUNDLE = 512 * MB;
13
+ const MAX_EXPANDED = 1024 * MB;
14
+ const digest = (data) => createHash("sha256").update(data).digest("hex");
15
+ const hex = z.string().regex(/^[a-f0-9]{64}$/);
16
+ const artifactSchema = z.object({
17
+ path: z.string().regex(/^artifacts\/[0-9]+\.jar$/),
18
+ name: z.string().min(1).max(300),
19
+ sha256: hex,
20
+ size: z.number().int().positive().max(MAX_BUNDLE),
21
+ // classpath order is authoritative; source JARs must name the binary they describe.
22
+ kind: z.enum(["classpath", "sources"]),
23
+ sourceFor: z.string().regex(/^artifacts\/[0-9]+\.jar$/).optional(),
24
+ }).strict();
25
+ export const projectManifestSchema = z.object({
26
+ format: z.literal("modlens-project-v1"),
27
+ project: z.string().min(1).max(300),
28
+ sourceSet: z.string().min(1).max(100),
29
+ toolchain: z.string().min(1).max(200),
30
+ minecraftVersion: z.string().max(100),
31
+ loaderVersion: z.string().max(100),
32
+ mappings: z.string().max(300),
33
+ javaVersion: z.number().int().min(8).max(100),
34
+ // Hashes only: no absolute paths, credentials or Gradle properties are exported.
35
+ transformations: z.array(z.object({ name: z.string().max(300), sha256: hex }).strict()).max(1000),
36
+ artifacts: z.array(artifactSchema).min(1).max(2000),
37
+ }).strict();
38
+ // No tool can enumerate other projects. A random 256-bit projectKey is the access capability.
39
+ // Only its hash is used on disk; never return it in tool output or log it.
40
+ function projectRoot(root, key) {
41
+ if (!hex.safeParse(key).success)
42
+ throw new Error("projectKey must be a random 64-character lowercase hex key (use the export task's project-key.txt).");
43
+ return join(root, digest(key));
44
+ }
45
+ function identifier(value, label) {
46
+ if (!value || !/^[a-f0-9]{64}$/.test(value))
47
+ throw new Error(`Invalid ${label}`);
48
+ return value;
49
+ }
50
+ function safeEntry(name) {
51
+ return !name.includes("\\") && !name.includes(":") && !name.startsWith("/") &&
52
+ !name.split("/").some(p => p === ".." || p === "." || /[\x00-\x1f]/.test(p));
53
+ }
54
+ function className(value) {
55
+ const name = (value ?? "").replace(/\.class$/, "").replace(/\./g, "/");
56
+ if (!name || name.length > 500 || !name.split("/").every(p => /^[\p{L}\p{N}_$]+$/u.test(p)))
57
+ throw new Error("Invalid className");
58
+ return name;
59
+ }
60
+ function readZip(data, maxTotal) {
61
+ const zip = new AdmZip(data);
62
+ let size = 0;
63
+ const names = new Set();
64
+ const entries = zip.getEntries();
65
+ if (entries.length > 250_000)
66
+ throw new Error("Archive has too many entries");
67
+ for (const entry of entries) {
68
+ if (!safeEntry(entry.entryName) || names.has(entry.entryName))
69
+ throw new Error("Unsafe or duplicate archive entry");
70
+ names.add(entry.entryName);
71
+ size += entry.header.size;
72
+ if (size > maxTotal)
73
+ throw new Error("Archive exceeds expanded size limit");
74
+ // We never extract ZIP paths, and never follow symlinks from archives.
75
+ if (((entry.attr >>> 16) & 0xf000) === 0xa000)
76
+ throw new Error("Archive symlinks are unsupported");
77
+ }
78
+ return zip;
79
+ }
80
+ function entryData(zip, name, max) {
81
+ const entry = zip.getEntry(name);
82
+ if (!entry || entry.isDirectory || entry.header.size > max)
83
+ throw new Error(`Missing or oversized archive entry: ${name}`);
84
+ const data = entry.getData();
85
+ if (data.length !== entry.header.size || data.length > max)
86
+ throw new Error("Archive entry size mismatch");
87
+ return data;
88
+ }
89
+ /** Serializes operations for the same upload in this server process; immutable commits use rename. */
90
+ const locks = new Map();
91
+ async function exclusive(key, fn) {
92
+ const prior = locks.get(key) ?? Promise.resolve();
93
+ const next = prior.catch(() => { }).then(fn);
94
+ locks.set(key, next);
95
+ try {
96
+ return await next;
97
+ }
98
+ finally {
99
+ if (locks.get(key) === next)
100
+ locks.delete(key);
101
+ }
102
+ }
103
+ export class ProjectStore {
104
+ root;
105
+ constructor(root = join(CACHE_ROOT, "projects")) {
106
+ this.root = root;
107
+ }
108
+ dir(key, environmentId) {
109
+ return join(projectRoot(this.root, key), "environments", identifier(environmentId, "environmentId"));
110
+ }
111
+ async snapshot(key, environmentId) {
112
+ try {
113
+ return JSON.parse(await readFile(join(this.dir(key, environmentId), "snapshot.json"), "utf8"));
114
+ }
115
+ catch {
116
+ throw new Error("Project environment not found for this projectKey; import a bundle first.");
117
+ }
118
+ }
119
+ async list(key) {
120
+ const root = join(projectRoot(this.root, key), "environments");
121
+ const ids = await readdir(root).catch((e) => { if (e.code === "ENOENT")
122
+ return []; throw e; });
123
+ return Promise.all(ids.filter(id => /^[a-f0-9]{64}$/.test(id)).sort().map(async (id) => this.describe(key, id)));
124
+ }
125
+ async describe(key, environmentId) {
126
+ const s = await this.snapshot(key, environmentId);
127
+ return { environmentId, importedAt: s.importedAt, ...s.manifest,
128
+ classCount: Object.keys(s.index.classes).length, sourceCount: Object.keys(s.index.sources).length,
129
+ shadowedClasses: s.index.shadowedClasses,
130
+ scope: "Gradle compile-time snapshot; runtime mixin/coremod transformations are not applied. Re-export after build configuration changes." };
131
+ }
132
+ async importLocal(key, bundlePath) {
133
+ // Remote clients must use upload chunks; no remote arbitrary host filesystem import.
134
+ if (process.env.MCP_PORT)
135
+ throw new Error("import_local is disabled over HTTP; use the upload client.");
136
+ const path = normalizeJarPath(bundlePath);
137
+ assertHostAccessiblePath(path);
138
+ if (!isAbsolute(path) || !path.endsWith(".zip"))
139
+ throw new Error("bundlePath must be an absolute .zip path on the ModLens host");
140
+ if ((await stat(path)).size > MAX_BUNDLE)
141
+ throw new Error("Bundle exceeds 512 MiB limit");
142
+ return this.importBuffer(key, await readFile(path));
143
+ }
144
+ async importBuffer(key, data) {
145
+ const root = projectRoot(this.root, key);
146
+ if (!data.length || data.length > MAX_BUNDLE)
147
+ throw new Error("Bundle exceeds 512 MiB limit");
148
+ const zip = readZip(data, MAX_BUNDLE);
149
+ const manifest = projectManifestSchema.parse(JSON.parse(entryData(zip, "manifest.json", 2 * MB).toString("utf8")));
150
+ const paths = new Set(manifest.artifacts.map(a => a.path));
151
+ if (paths.size !== manifest.artifacts.length)
152
+ throw new Error("Duplicate artifact paths");
153
+ if (zip.getEntries().some(e => !e.isDirectory && e.entryName !== "manifest.json" && !paths.has(e.entryName)))
154
+ throw new Error("Undeclared bundle entry");
155
+ for (const a of manifest.artifacts) {
156
+ if (a.kind === "sources" && !manifest.artifacts.some(b => b.kind === "classpath" && b.path === a.sourceFor))
157
+ throw new Error("Source artifact must reference a classpath artifact");
158
+ if (a.kind === "classpath" && a.sourceFor)
159
+ throw new Error("Classpath artifact cannot have sourceFor");
160
+ }
161
+ // Canonical schema property order and artifact order make the ID independent of ZIP timestamps.
162
+ const environmentId = digest(JSON.stringify(manifest));
163
+ const dest = this.dir(key, environmentId);
164
+ const stage = join(root, "staging", randomBytes(32).toString("hex"));
165
+ await mkdir(join(stage, "artifacts"), { recursive: true });
166
+ const index = { classes: Object.create(null), sources: Object.create(null), shadowedClasses: 0 };
167
+ const candidates = [];
168
+ const overlaidSources = new Set();
169
+ let totalExpanded = 0;
170
+ try {
171
+ for (const artifact of manifest.artifacts) {
172
+ const bytes = entryData(zip, artifact.path, MAX_BUNDLE);
173
+ if (bytes.length !== artifact.size || digest(bytes) !== artifact.sha256)
174
+ throw new Error(`Artifact checksum mismatch: ${artifact.path}`);
175
+ const jar = readZip(bytes, MAX_EXPANDED - totalExpanded);
176
+ const entries = jar.getEntries();
177
+ const overlays = new Map();
178
+ const multiRelease = jar.getEntry("META-INF/MANIFEST.MF") && /^Multi-Release:\s*true\s*$/im.test(entryData(jar, "META-INF/MANIFEST.MF", MB).toString("utf8"));
179
+ if (multiRelease && artifact.kind === "classpath") {
180
+ for (const e of entries) {
181
+ const match = /^META-INF\/versions\/(\d+)\/(.+\.class)$/.exec(e.entryName);
182
+ if (!match || Number(match[1]) < 9 || Number(match[1]) > manifest.javaVersion)
183
+ continue;
184
+ if (e.header.size > 16 * MB)
185
+ throw new Error("Oversized class file");
186
+ const current = overlays.get(match[2]);
187
+ if (!current || Number(match[1]) > current.version)
188
+ overlays.set(match[2], { version: Number(match[1]), entry: e.entryName });
189
+ }
190
+ }
191
+ for (const e of entries) {
192
+ totalExpanded += e.header.size;
193
+ if (e.isDirectory || e.entryName.startsWith("META-INF/"))
194
+ continue;
195
+ if (e.entryName.endsWith(".class") && artifact.kind === "classpath") {
196
+ if (e.header.size > 16 * MB)
197
+ throw new Error("Oversized class file");
198
+ const name = e.entryName.slice(0, -6);
199
+ if (name === "module-info" || name.endsWith("/package-info"))
200
+ continue;
201
+ className(name);
202
+ if (index.classes[name])
203
+ index.shadowedClasses++;
204
+ else
205
+ index.classes[name] = { artifact: artifact.path, entry: e.entryName };
206
+ }
207
+ else if (e.entryName.endsWith(".java")) {
208
+ if (e.header.size > 2 * MB)
209
+ throw new Error("Oversized Java source file");
210
+ candidates.push({ name: e.entryName.slice(0, -5), source: {
211
+ artifact: artifact.path, entry: e.entryName, binary: artifact.sourceFor ?? artifact.path,
212
+ } });
213
+ }
214
+ }
215
+ if (overlays.size) {
216
+ // javap/indexer/decompiler must all inspect the same Java-release-specific view.
217
+ const effectiveArtifact = artifact.path.replace("artifacts/", "effective/");
218
+ for (const [name, selected] of overlays) {
219
+ const logical = name.slice(0, -6);
220
+ if (logical === "module-info" || logical.endsWith("/package-info"))
221
+ continue;
222
+ className(logical);
223
+ if (!index.classes[logical] || index.classes[logical].artifact === artifact.path) {
224
+ index.classes[logical] = { artifact: artifact.path, entry: selected.entry, effectiveArtifact };
225
+ overlaidSources.add(`${artifact.path}:${logical.split("$")[0]}`);
226
+ }
227
+ const data = entryData(jar, selected.entry, 16 * MB);
228
+ if (jar.getEntry(name))
229
+ jar.updateFile(name, data);
230
+ else
231
+ jar.addFile(name, data);
232
+ }
233
+ for (const e of entries)
234
+ if (e.entryName.startsWith("META-INF/versions/"))
235
+ jar.deleteFile(e.entryName);
236
+ await mkdir(join(stage, "effective"), { recursive: true });
237
+ await writeFile(join(stage, effectiveArtifact), jar.toBuffer());
238
+ // Even non-overlaid classes in this JAR use the flattened artifact consistently.
239
+ for (const entry of Object.values(index.classes))
240
+ if (entry.artifact === artifact.path)
241
+ entry.effectiveArtifact = effectiveArtifact;
242
+ }
243
+ await writeFile(join(stage, artifact.path), bytes, { flag: "wx" });
244
+ }
245
+ if (!Object.keys(index.classes).length)
246
+ throw new Error("Bundle contains no compile classpath classes");
247
+ for (const c of candidates) {
248
+ // A duplicate dependency's sources must never describe the winning class.
249
+ const binary = index.classes[c.name];
250
+ if (binary?.artifact === c.source.binary && !overlaidSources.has(`${c.source.binary}:${c.name.split("$")[0]}`) && !index.sources[c.name])
251
+ index.sources[c.name] = c.source;
252
+ }
253
+ const snapshot = { environmentId, importedAt: new Date().toISOString(), manifest, index };
254
+ await writeFile(join(stage, "snapshot.json"), JSON.stringify(snapshot));
255
+ await mkdir(join(root, "environments"), { recursive: true });
256
+ await exclusive(dest, async () => {
257
+ try {
258
+ await stat(join(dest, "snapshot.json"));
259
+ }
260
+ catch (e) {
261
+ if (e.code !== "ENOENT")
262
+ throw e;
263
+ await rename(stage, dest);
264
+ }
265
+ });
266
+ return this.describe(key, environmentId);
267
+ }
268
+ finally {
269
+ await rm(stage, { recursive: true, force: true });
270
+ }
271
+ }
272
+ uploadDir(key, uploadId) {
273
+ return join(projectRoot(this.root, key), "uploads", identifier(uploadId, "uploadId"));
274
+ }
275
+ async begin(key, size, sha256) {
276
+ if (!Number.isSafeInteger(size) || size <= 0 || size > MAX_BUNDLE)
277
+ throw new Error("Upload size must be 1 byte to 512 MiB");
278
+ identifier(sha256, "sha256");
279
+ const root = join(projectRoot(this.root, key), "uploads");
280
+ return exclusive(root, async () => {
281
+ await mkdir(root, { recursive: true });
282
+ // Bound abandoned uploads; expires after 24 hours. Cleanup only under this project's upload root.
283
+ for (const id of await readdir(root)) {
284
+ if (!/^[a-f0-9]{64}$/.test(id))
285
+ continue;
286
+ const p = join(root, id);
287
+ if (Date.now() - (await stat(p)).mtimeMs > 86400_000)
288
+ await rm(p, { recursive: true, force: true });
289
+ }
290
+ let active = 0;
291
+ for (const id of await readdir(root)) {
292
+ if (!/^[a-f0-9]{64}$/.test(id))
293
+ continue;
294
+ try {
295
+ await stat(join(root, id, "receipt.json"));
296
+ }
297
+ catch (e) {
298
+ if (e.code !== "ENOENT")
299
+ throw e;
300
+ active++;
301
+ }
302
+ }
303
+ if (active >= 4)
304
+ throw new Error("At most four active uploads per project; abort an old upload first");
305
+ const uploadId = randomBytes(32).toString("hex");
306
+ const dir = this.uploadDir(key, uploadId);
307
+ await mkdir(dir);
308
+ await writeFile(join(dir, "metadata.json"), JSON.stringify({ size, sha256 }));
309
+ await writeFile(join(dir, "bundle.zip"), Buffer.alloc(0));
310
+ return { uploadId, chunkBytes: PROJECT_CHUNK_BYTES, offset: 0 };
311
+ });
312
+ }
313
+ async chunk(key, uploadId, offset, base64) {
314
+ const dir = this.uploadDir(key, uploadId);
315
+ return exclusive(dir, async () => {
316
+ if (!Number.isSafeInteger(offset) || offset < 0)
317
+ throw new Error("Invalid offset");
318
+ if (!base64 || base64.length > Math.ceil(PROJECT_CHUNK_BYTES / 3) * 4 || base64.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(base64))
319
+ throw new Error("Invalid or oversized base64 chunk");
320
+ const bytes = Buffer.from(base64, "base64");
321
+ if (!bytes.length || bytes.length > PROJECT_CHUNK_BYTES || bytes.toString("base64") !== base64)
322
+ throw new Error("Chunk exceeds 1 MiB or is not canonical base64");
323
+ const meta = JSON.parse(await readFile(join(dir, "metadata.json"), "utf8"));
324
+ const file = await open(join(dir, "bundle.zip"), "r+");
325
+ try {
326
+ const current = (await file.stat()).size;
327
+ if (offset + bytes.length > meta.size || offset > current)
328
+ throw new Error(`Unexpected offset; server has ${current} bytes`);
329
+ if (offset < current) {
330
+ if (offset + bytes.length > current)
331
+ throw new Error("Chunk overlaps uploaded bytes");
332
+ const existing = Buffer.alloc(bytes.length);
333
+ await file.read(existing, 0, existing.length, offset);
334
+ if (!existing.equals(bytes))
335
+ throw new Error("Retry does not match uploaded bytes");
336
+ return { offset: current };
337
+ }
338
+ let written = 0;
339
+ while (written < bytes.length)
340
+ written += (await file.write(bytes, written, bytes.length - written, offset + written)).bytesWritten;
341
+ return { offset: offset + written };
342
+ }
343
+ finally {
344
+ await file.close();
345
+ }
346
+ });
347
+ }
348
+ async finish(key, uploadId) {
349
+ const dir = this.uploadDir(key, uploadId);
350
+ return exclusive(dir, async () => {
351
+ // Retain receipt until expiry, so retrying a lost finish response is safe.
352
+ try {
353
+ return JSON.parse(await readFile(join(dir, "receipt.json"), "utf8"));
354
+ }
355
+ catch (e) {
356
+ if (e.code !== "ENOENT")
357
+ throw e;
358
+ }
359
+ const meta = JSON.parse(await readFile(join(dir, "metadata.json"), "utf8"));
360
+ const data = await readFile(join(dir, "bundle.zip"));
361
+ if (data.length !== meta.size || digest(data) !== meta.sha256)
362
+ throw new Error("Upload incomplete or checksum mismatch");
363
+ const result = await this.importBuffer(key, data);
364
+ await writeFile(join(dir, "receipt.json"), JSON.stringify(result));
365
+ await rm(join(dir, "bundle.zip"));
366
+ return result;
367
+ });
368
+ }
369
+ async abort(key, uploadId) {
370
+ const dir = this.uploadDir(key, uploadId);
371
+ await exclusive(dir, () => rm(dir, { recursive: true, force: true }));
372
+ return { aborted: true };
373
+ }
374
+ async classes(key, environmentId, query = "", offset = 0, limit = 50) {
375
+ const s = await this.snapshot(key, environmentId);
376
+ const names = Object.keys(s.index.classes).filter(n => n.toLowerCase().includes(query.toLowerCase().replace(/\./g, "/"))).sort();
377
+ return { environmentId, total: names.length, classes: names.slice(offset, offset + limit).map(name => ({ name, ...s.index.classes[name] })) };
378
+ }
379
+ async source(key, environmentId, input, startLine = 1, maxLines = 200) {
380
+ const s = await this.snapshot(key, environmentId);
381
+ const name = className(input);
382
+ const binary = s.index.classes[name];
383
+ if (!binary)
384
+ throw new Error("Class is not in this environment's compile classpath");
385
+ const outer = name.split("$")[0];
386
+ const source = s.index.sources[name] ?? s.index.sources[outer];
387
+ const dir = this.dir(key, environmentId);
388
+ let text;
389
+ let origin;
390
+ if (source && source.binary === binary.artifact) {
391
+ const zip = new AdmZip(await readFile(join(dir, source.artifact)));
392
+ text = entryData(zip, source.entry, 2 * MB).toString("utf8");
393
+ origin = "gradle-sources";
394
+ }
395
+ else {
396
+ const cache = join(dir, "decompiled", binary.artifact.slice("artifacts/".length, -4));
397
+ const path = join(cache, `${outer}.java`);
398
+ text = await exclusive(path, async () => {
399
+ try {
400
+ return await readFile(path, "utf8");
401
+ }
402
+ catch (e) {
403
+ if (e.code !== "ENOENT")
404
+ throw e;
405
+ }
406
+ return decompileClass(join(dir, binary.effectiveArtifact ?? binary.artifact), outer, cache);
407
+ });
408
+ origin = "decompiled-compile-classpath";
409
+ }
410
+ const lines = text.split(/\r?\n/);
411
+ return { environmentId, className: name, artifact: binary.artifact, origin, totalLines: lines.length, startLine,
412
+ source: lines.slice(startLine - 1, startLine - 1 + maxLines).join("\n") };
413
+ }
414
+ async members(key, environmentId, input, bytecode = false) {
415
+ const s = await this.snapshot(key, environmentId);
416
+ const name = className(input);
417
+ const binary = s.index.classes[name];
418
+ if (!binary)
419
+ throw new Error("Class is not in this environment's compile classpath");
420
+ const path = join(this.dir(key, environmentId), binary.effectiveArtifact ?? binary.artifact);
421
+ return { environmentId, className: name, artifact: binary.artifact,
422
+ result: await (bytecode ? getBytecode(path, name) : inspectClass(path, name)) };
423
+ }
424
+ async search(key, environmentId, query, limit = 20) {
425
+ if (!query || query.length > 500)
426
+ throw new Error("query must contain 1 to 500 characters");
427
+ const s = await this.snapshot(key, environmentId);
428
+ const dir = this.dir(key, environmentId);
429
+ const results = [];
430
+ const needle = query.toLowerCase();
431
+ let searchedFiles = 0;
432
+ const byArtifact = new Map();
433
+ for (const entry of Object.entries(s.index.sources)) {
434
+ const group = byArtifact.get(entry[1].artifact) ?? [];
435
+ group.push(entry);
436
+ byArtifact.set(entry[1].artifact, group);
437
+ }
438
+ const searchText = (name, text, origin) => {
439
+ searchedFiles++;
440
+ const lines = text.split(/\r?\n/);
441
+ for (let i = 0; i < lines.length && results.length < limit; i++) {
442
+ if (lines[i].toLowerCase().includes(needle))
443
+ results.push({ className: name, line: i + 1, text: lines[i].slice(0, 2000), origin });
444
+ }
445
+ };
446
+ for (const [artifact, entries] of byArtifact) {
447
+ if (results.length >= limit)
448
+ break;
449
+ const jar = new AdmZip(await readFile(join(dir, artifact)));
450
+ for (const [name, source] of entries) {
451
+ searchText(name, entryData(jar, source.entry, 2 * MB).toString("utf8"), "gradle-sources");
452
+ if (results.length >= limit)
453
+ break;
454
+ }
455
+ }
456
+ // Include on-demand decompiles, but do not trigger an expensive full classpath decompile during search.
457
+ const walkCached = async (base, prefix = "") => {
458
+ const entries = await readdir(join(base, prefix), { withFileTypes: true }).catch((e) => {
459
+ if (e.code === "ENOENT")
460
+ return [];
461
+ throw e;
462
+ });
463
+ for (const entry of entries) {
464
+ if (results.length >= limit)
465
+ return;
466
+ const relative = prefix ? `${prefix}/${entry.name}` : entry.name;
467
+ if (entry.isDirectory())
468
+ await walkCached(base, relative);
469
+ else if (entry.isFile() && relative.endsWith(".java")) {
470
+ const name = relative.slice(0, -5);
471
+ if (!s.index.sources[name] && s.index.classes[name])
472
+ searchText(name, await readFile(join(base, relative), "utf8"), "decompiled-compile-classpath");
473
+ }
474
+ }
475
+ };
476
+ for (const a of s.manifest.artifacts) {
477
+ if (a.kind !== "classpath" || results.length >= limit)
478
+ continue;
479
+ await walkCached(join(dir, "decompiled", a.path.slice("artifacts/".length, -4)));
480
+ }
481
+ return { environmentId, results, searchedFiles, limitReached: results.length >= limit,
482
+ coverage: "Supplied Gradle sources and cached on-demand decompiles only. Use classes/members for the full compile classpath." };
483
+ }
484
+ }
485
+ export const projectToolSchema = {
486
+ action: z.enum(["import_local", "upload_begin", "upload_chunk", "upload_finish", "upload_abort", "list", "info", "classes", "source", "search", "members", "bytecode"]),
487
+ projectKey: hex.describe("Private project access key from .gradle/modlens/project-key.txt. Never share or log it."),
488
+ environmentId: hex.optional().describe("Immutable snapshot ID returned by import/list; required for queries."),
489
+ bundlePath: z.string().optional(),
490
+ uploadId: hex.optional(), size: z.number().int().positive().max(MAX_BUNDLE).optional(), sha256: hex.optional(),
491
+ offset: z.number().int().min(0).optional(),
492
+ data: z.string().max(Math.ceil(PROJECT_CHUNK_BYTES / 3) * 4).optional().describe("Base64 upload chunk (at most 1 MiB decoded)."),
493
+ className: z.string().max(500).optional(), query: z.string().max(500).optional(),
494
+ limit: z.number().int().min(1).max(200).optional(), startLine: z.number().int().min(1).optional(), maxLines: z.number().int().min(1).max(1000).optional(),
495
+ };
496
+ const requestSchema = z.object(projectToolSchema);
497
+ const defaultStore = new ProjectStore();
498
+ export async function projectAction(input, store = defaultStore) {
499
+ const p = requestSchema.parse(input);
500
+ const required = (value, name) => { if (value === undefined)
501
+ throw new Error(`${name} is required for ${p.action}`); return value; };
502
+ const key = p.projectKey;
503
+ const env = () => required(p.environmentId, "environmentId");
504
+ switch (p.action) {
505
+ case "import_local": return store.importLocal(key, required(p.bundlePath, "bundlePath"));
506
+ case "upload_begin": return store.begin(key, required(p.size, "size"), required(p.sha256, "sha256"));
507
+ case "upload_chunk": return store.chunk(key, required(p.uploadId, "uploadId"), required(p.offset, "offset"), required(p.data, "data"));
508
+ case "upload_finish": return store.finish(key, required(p.uploadId, "uploadId"));
509
+ case "upload_abort": return store.abort(key, required(p.uploadId, "uploadId"));
510
+ case "list": return store.list(key);
511
+ case "info": return store.describe(key, env());
512
+ case "classes": return store.classes(key, env(), p.query, p.offset, p.limit);
513
+ case "source": return store.source(key, env(), required(p.className, "className"), p.startLine, p.maxLines);
514
+ case "search": return store.search(key, env(), required(p.query, "query"), p.limit);
515
+ case "members": return store.members(key, env(), required(p.className, "className"));
516
+ case "bytecode": return store.members(key, env(), required(p.className, "className"), true);
517
+ }
518
+ }
519
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["../../src/tools/reports.ts"],"names":[],"mappings":"AAwTA,MAAM,MAAM,UAAU,GAChB,iBAAiB,GACjB,eAAe,GACf,mBAAmB,GACnB,cAAc,GACd,aAAa,GACb,aAAa,GACb,WAAW,GACX,WAAW,GACX,gBAAgB,GAChB,gBAAgB,CAAC;AA4TvB,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACvC,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAG,MAAM,CAAC;IACtB,WAAW,CAAC,EAAG,MAAM,CAAC;IACtB,KAAK,CAAC,EAAS,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAQ,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAQ,MAAM,EAAE,CAAC;CAC3B,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgDlD"}
1
+ {"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["../../src/tools/reports.ts"],"names":[],"mappings":"AAwTA,MAAM,MAAM,UAAU,GAChB,iBAAiB,GACjB,eAAe,GACf,mBAAmB,GACnB,cAAc,GACd,aAAa,GACb,aAAa,GACb,WAAW,GACX,WAAW,GACX,gBAAgB,GAChB,gBAAgB,CAAC;AA8TvB,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACvC,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAG,MAAM,CAAC;IACtB,WAAW,CAAC,EAAG,MAAM,CAAC;IACtB,KAAK,CAAC,EAAS,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAQ,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAQ,MAAM,EAAE,CAAC;CAC3B,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgDlD"}
@@ -262,7 +262,7 @@ async function reportPackCompat(opts) {
262
262
  metadataSource: { in: ["filename", "@Mod annotation"] },
263
263
  };
264
264
  if (opts.mcVersion)
265
- Object.assign(degradedWhere, mcVersionWhere(opts.mcVersion));
265
+ Object.assign(degradedWhere, await mcVersionWhere(opts.mcVersion));
266
266
  if (opts.loader)
267
267
  degradedWhere.loader = opts.loader;
268
268
  const db = await getDb();
@@ -376,8 +376,10 @@ async function reportDepGraph(opts) {
376
376
  // Mermaid diagram (cap at 40 mods to keep it readable)
377
377
  const entries = Object.entries(graphData.graph);
378
378
  md += h2("Mermaid Dependency Diagram");
379
- const subset = opts.modId
380
- ? entries.filter(([id]) => String(id).includes(String(opts.modId)))
379
+ const filterId = typeof opts.modId === "number" || /^\d+$/.test(String(opts.modId))
380
+ ? (await resolveModRef(opts.modId))?.modId ?? String(opts.modId) : opts.modId;
381
+ const subset = filterId
382
+ ? entries.filter(([id]) => String(id).includes(filterId))
381
383
  : entries.slice(0, 40);
382
384
  if (subset.length > 0) {
383
385
  md += "```mermaid\nflowchart LR\n";