@adhisang/minecraft-modding-mcp 4.1.0 → 4.2.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 (70) hide show
  1. package/CHANGELOG.md +21 -2
  2. package/README.md +9 -2
  3. package/dist/entry-tools/analyze-symbol-service.d.ts +12 -0
  4. package/dist/entry-tools/analyze-symbol-service.js +7 -0
  5. package/dist/entry-tools/batch-class-members-service.d.ts +1 -0
  6. package/dist/entry-tools/batch-class-members-service.js +2 -0
  7. package/dist/entry-tools/batch-class-source-service.d.ts +1 -0
  8. package/dist/entry-tools/batch-class-source-service.js +2 -0
  9. package/dist/entry-tools/batch-mappings-service.d.ts +1 -0
  10. package/dist/entry-tools/batch-mappings-service.js +1 -0
  11. package/dist/entry-tools/batch-symbol-exists-service.d.ts +1 -0
  12. package/dist/entry-tools/batch-symbol-exists-service.js +2 -0
  13. package/dist/entry-tools/compare-minecraft-service.d.ts +9 -0
  14. package/dist/entry-tools/compare-minecraft-service.js +3 -1
  15. package/dist/entry-tools/inspect-minecraft/handlers/class-members.js +1 -0
  16. package/dist/entry-tools/inspect-minecraft/handlers/class-overview.js +3 -1
  17. package/dist/entry-tools/inspect-minecraft/handlers/class-source.js +1 -0
  18. package/dist/entry-tools/inspect-minecraft/handlers/list-files.js +1 -0
  19. package/dist/entry-tools/inspect-minecraft/handlers/search.js +2 -1
  20. package/dist/entry-tools/inspect-minecraft/internal.d.ts +17 -0
  21. package/dist/entry-tools/inspect-minecraft/internal.js +10 -0
  22. package/dist/entry-tools/inspect-minecraft-service.d.ts +40 -0
  23. package/dist/entry-tools/validate-project/cases/project-summary.d.ts +6 -1
  24. package/dist/entry-tools/validate-project/cases/project-summary.js +83 -9
  25. package/dist/entry-tools/validate-project/internal.d.ts +29 -18
  26. package/dist/entry-tools/validate-project/internal.js +37 -19
  27. package/dist/entry-tools/validate-project-service.d.ts +15 -1
  28. package/dist/entry-tools/validate-project-service.js +3 -2
  29. package/dist/entry-tools/verify-mixin-target-service.d.ts +2 -0
  30. package/dist/entry-tools/verify-mixin-target-service.js +1 -0
  31. package/dist/gradle-paths.d.ts +8 -3
  32. package/dist/gradle-paths.js +34 -5
  33. package/dist/index.js +29 -9
  34. package/dist/mapping/loaders/tiny-loom.d.ts +1 -1
  35. package/dist/mapping/loaders/tiny-loom.js +5 -2
  36. package/dist/mapping/types.d.ts +5 -0
  37. package/dist/mapping-service.d.ts +6 -1
  38. package/dist/mapping-service.js +26 -18
  39. package/dist/mixin-validator.d.ts +1 -1
  40. package/dist/mixin-validator.js +1 -1
  41. package/dist/source/access-validate.js +12 -8
  42. package/dist/source/artifact-resolver.d.ts +7 -1
  43. package/dist/source/artifact-resolver.js +120 -7
  44. package/dist/source/class-source/members-builder.d.ts +1 -0
  45. package/dist/source/class-source/members-builder.js +1 -1
  46. package/dist/source/class-source.d.ts +1 -0
  47. package/dist/source/class-source.js +9 -1
  48. package/dist/source/indexer.js +17 -0
  49. package/dist/source/lifecycle/diff.js +6 -6
  50. package/dist/source/lifecycle/mapping-helpers.d.ts +3 -3
  51. package/dist/source/lifecycle/mapping-helpers.js +17 -9
  52. package/dist/source/lifecycle/trace.js +2 -2
  53. package/dist/source/search.js +1 -0
  54. package/dist/source/state.d.ts +5 -0
  55. package/dist/source/state.js +5 -0
  56. package/dist/source/symbol-resolver.js +4 -1
  57. package/dist/source/validate-mixin/pipeline/mapping-health.js +2 -1
  58. package/dist/source/validate-mixin/pipeline/resolve.js +1 -0
  59. package/dist/source/validate-mixin/pipeline/target-lookup.js +12 -7
  60. package/dist/source-resolver.d.ts +1 -0
  61. package/dist/source-resolver.js +1 -1
  62. package/dist/source-service.d.ts +35 -1
  63. package/dist/source-service.js +5 -2
  64. package/dist/tool-contract-manifest.d.ts +1 -1
  65. package/dist/tool-contract-manifest.js +2 -2
  66. package/dist/tool-schemas.d.ts +91 -0
  67. package/dist/tool-schemas.js +20 -0
  68. package/docs/README-ja.md +4 -2
  69. package/docs/tool-reference.md +13 -7
  70. package/package.json +15 -3
@@ -323,6 +323,23 @@ export async function ingestIfNeeded(svc, resolved) {
323
323
  touchCacheMetrics(svc, resolved.artifactId, touchedAt);
324
324
  return;
325
325
  }
326
+ const inflight = svc.state.inflightArtifactIngests.get(resolved.artifactId);
327
+ if (inflight) {
328
+ await inflight;
329
+ return;
330
+ }
331
+ const ingestPromise = rebuildMissingArtifactIndex(svc, resolved, reason);
332
+ svc.state.inflightArtifactIngests.set(resolved.artifactId, ingestPromise);
333
+ try {
334
+ await ingestPromise;
335
+ }
336
+ finally {
337
+ if (svc.state.inflightArtifactIngests.get(resolved.artifactId) === ingestPromise) {
338
+ svc.state.inflightArtifactIngests.delete(resolved.artifactId);
339
+ }
340
+ }
341
+ }
342
+ async function rebuildMissingArtifactIndex(svc, resolved, reason) {
326
343
  svc.metrics.recordArtifactCacheMiss();
327
344
  svc.metrics.recordReindex();
328
345
  log("info", "index.rebuild.start", {
@@ -63,10 +63,10 @@ export async function diffClassSignatures(svc, input) {
63
63
  });
64
64
  }
65
65
  const mappingWarnings = [];
66
- const obfuscatedFromClassName = await resolveToObfuscatedClassName(svc, className, fromVersion, mapping, input.sourcePriority, mappingWarnings);
66
+ const obfuscatedFromClassName = await resolveToObfuscatedClassName(svc, className, fromVersion, mapping, input.sourcePriority, mappingWarnings, input.gradleUserHome);
67
67
  const obfuscatedToClassName = fromVersion === toVersion
68
68
  ? obfuscatedFromClassName
69
- : await resolveToObfuscatedClassName(svc, className, toVersion, mapping, input.sourcePriority, mappingWarnings);
69
+ : await resolveToObfuscatedClassName(svc, className, toVersion, mapping, input.sourcePriority, mappingWarnings, input.gradleUserHome);
70
70
  const [fromResolved, toResolved] = await Promise.all([
71
71
  svc.versionService.resolveVersionJar(fromVersion),
72
72
  svc.versionService.resolveVersionJar(toVersion)
@@ -176,8 +176,8 @@ export async function diffClassSignatures(svc, input) {
176
176
  // Remap diff delta members for non-obfuscated mappings
177
177
  const remapDelta = async (delta, kind) => {
178
178
  const [addedResult, removedResult] = await Promise.all([
179
- svc.remapSignatureMembers(delta.added, kind, toVersion, "obfuscated", mapping, input.sourcePriority, warnings),
180
- svc.remapSignatureMembers(delta.removed, kind, fromVersion, "obfuscated", mapping, input.sourcePriority, warnings)
179
+ svc.remapSignatureMembers(delta.added, kind, toVersion, "obfuscated", mapping, input.sourcePriority, warnings, undefined, input.gradleUserHome),
180
+ svc.remapSignatureMembers(delta.removed, kind, fromVersion, "obfuscated", mapping, input.sourcePriority, warnings, undefined, input.gradleUserHome)
181
181
  ]);
182
182
  const remappedModified = await Promise.all(delta.modified.map(async (change) => {
183
183
  if (!change.from || !change.to) {
@@ -194,8 +194,8 @@ export async function diffClassSignatures(svc, input) {
194
194
  });
195
195
  }
196
196
  const [fromResult, toResult] = await Promise.all([
197
- svc.remapSignatureMembers([change.from], kind, fromVersion, "obfuscated", mapping, input.sourcePriority, warnings),
198
- svc.remapSignatureMembers([change.to], kind, toVersion, "obfuscated", mapping, input.sourcePriority, warnings)
197
+ svc.remapSignatureMembers([change.from], kind, fromVersion, "obfuscated", mapping, input.sourcePriority, warnings, undefined, input.gradleUserHome),
198
+ svc.remapSignatureMembers([change.to], kind, toVersion, "obfuscated", mapping, input.sourcePriority, warnings, undefined, input.gradleUserHome)
199
199
  ]);
200
200
  const fromMember = fromResult.members[0];
201
201
  const toMember = toResult.members[0];
@@ -11,12 +11,12 @@ export declare function rejectLifecycleClassLikeInput(svc: SourceService, input:
11
11
  sourcePriority?: MappingSourcePriority;
12
12
  }): void;
13
13
  export declare function releaseLifecycleMappingGraph(svc: SourceService, version: string, sourcePriority: MappingSourcePriority | undefined): void;
14
- export declare function resolveToObfuscatedClassName(svc: SourceService, className: string, version: string, mapping: SourceMapping, sourcePriority: MappingSourcePriority | undefined, warnings: string[]): Promise<string>;
15
- export declare function resolveToObfuscatedMemberName(svc: SourceService, name: string, ownerInSourceMapping: string, descriptor: string | undefined, kind: "field" | "method", version: string, mapping: SourceMapping, sourcePriority: MappingSourcePriority | undefined, warnings: string[]): Promise<{
14
+ export declare function resolveToObfuscatedClassName(svc: SourceService, className: string, version: string, mapping: SourceMapping, sourcePriority: MappingSourcePriority | undefined, warnings: string[], gradleUserHome?: string): Promise<string>;
15
+ export declare function resolveToObfuscatedMemberName(svc: SourceService, name: string, ownerInSourceMapping: string, descriptor: string | undefined, kind: "field" | "method", version: string, mapping: SourceMapping, sourcePriority: MappingSourcePriority | undefined, warnings: string[], gradleUserHome?: string): Promise<{
16
16
  name: string;
17
17
  descriptor?: string;
18
18
  }>;
19
- export declare function remapSignatureMembers(svc: SourceService, members: SignatureMember[], kind: "field" | "method", version: string, sourceMapping: SourceMapping, targetMapping: SourceMapping, sourcePriority: MappingSourcePriority | undefined, warnings: string[], projectPath?: string): Promise<{
19
+ export declare function remapSignatureMembers(svc: SourceService, members: SignatureMember[], kind: "field" | "method", version: string, sourceMapping: SourceMapping, targetMapping: SourceMapping, sourcePriority: MappingSourcePriority | undefined, warnings: string[], projectPath?: string, gradleUserHome?: string): Promise<{
20
20
  members: SignatureMember[];
21
21
  failedNames: Set<string>;
22
22
  }>;
@@ -58,18 +58,19 @@ export function releaseLifecycleMappingGraph(svc, version, sourcePriority) {
58
58
  svc.mappingService.releaseGraphCacheEntry(version, sourcePriority);
59
59
  }
60
60
  }
61
- export async function resolveToObfuscatedClassName(svc, className, version, mapping, sourcePriority, warnings) {
61
+ export async function resolveToObfuscatedClassName(svc, className, version, mapping, sourcePriority, warnings, gradleUserHome) {
62
62
  return svc.resolveClassNameForLookup({
63
63
  className,
64
64
  version,
65
65
  sourceMapping: mapping,
66
66
  targetMapping: "obfuscated",
67
67
  sourcePriority,
68
+ gradleUserHome,
68
69
  warnings,
69
70
  context: "bytecode lookup"
70
71
  });
71
72
  }
72
- export async function resolveToObfuscatedMemberName(svc, name, ownerInSourceMapping, descriptor, kind, version, mapping, sourcePriority, warnings) {
73
+ export async function resolveToObfuscatedMemberName(svc, name, ownerInSourceMapping, descriptor, kind, version, mapping, sourcePriority, warnings, gradleUserHome) {
73
74
  if (mapping === "obfuscated") {
74
75
  return {
75
76
  name,
@@ -89,7 +90,8 @@ export async function resolveToObfuscatedMemberName(svc, name, ownerInSourceMapp
89
90
  descriptor,
90
91
  sourceMapping: mapping,
91
92
  targetMapping: "obfuscated",
92
- sourcePriority
93
+ sourcePriority,
94
+ gradleUserHome
93
95
  })
94
96
  : await svc.mappingService.findMapping({
95
97
  version,
@@ -108,7 +110,8 @@ export async function resolveToObfuscatedMemberName(svc, name, ownerInSourceMapp
108
110
  : undefined,
109
111
  sourceMapping: mapping,
110
112
  targetMapping: "obfuscated",
111
- sourcePriority
113
+ sourcePriority,
114
+ gradleUserHome
112
115
  });
113
116
  warnings.push(...mapped.warnings);
114
117
  if (mapped.resolved && mapped.resolvedSymbol) {
@@ -127,7 +130,8 @@ export async function resolveToObfuscatedMemberName(svc, name, ownerInSourceMapp
127
130
  signatureMode: "exact",
128
131
  sourceMapping: mapping,
129
132
  targetMapping: "obfuscated",
130
- sourcePriority
133
+ sourcePriority,
134
+ gradleUserHome
131
135
  });
132
136
  warnings.push(...fallbackMapped.warnings);
133
137
  if (fallbackMapped.resolved && fallbackMapped.resolvedSymbol) {
@@ -147,7 +151,7 @@ export async function resolveToObfuscatedMemberName(svc, name, ownerInSourceMapp
147
151
  descriptor: kind === "method" ? descriptor : undefined
148
152
  };
149
153
  }
150
- export async function remapSignatureMembers(svc, members, kind, version, sourceMapping, targetMapping, sourcePriority, warnings, projectPath) {
154
+ export async function remapSignatureMembers(svc, members, kind, version, sourceMapping, targetMapping, sourcePriority, warnings, projectPath, gradleUserHome) {
151
155
  const failedNames = new Set();
152
156
  if (sourceMapping === targetMapping) {
153
157
  return { members, failedNames };
@@ -174,7 +178,8 @@ export async function remapSignatureMembers(svc, members, kind, version, sourceM
174
178
  sourceMapping,
175
179
  targetMapping,
176
180
  sourcePriority,
177
- projectPath
181
+ projectPath,
182
+ gradleUserHome
178
183
  });
179
184
  if (mapped.resolved && mapped.resolvedSymbol) {
180
185
  ownerToRemapped.set(obfuscatedFqn, mapped.resolvedSymbol.name);
@@ -207,7 +212,8 @@ export async function remapSignatureMembers(svc, members, kind, version, sourceM
207
212
  sourceMapping,
208
213
  targetMapping,
209
214
  sourcePriority,
210
- projectPath
215
+ projectPath,
216
+ gradleUserHome
211
217
  });
212
218
  if (mapped.resolved && mapped.resolvedSymbol) {
213
219
  ownerToRemapped.set(dotFqn, mapped.resolvedSymbol.name);
@@ -242,7 +248,8 @@ export async function remapSignatureMembers(svc, members, kind, version, sourceM
242
248
  sourceMapping,
243
249
  targetMapping,
244
250
  sourcePriority,
245
- projectPath
251
+ projectPath,
252
+ gradleUserHome
246
253
  });
247
254
  if (exactResult.resolved && exactResult.resolvedSymbol) {
248
255
  memberKeyToRemapped.set(key, exactResult.resolvedSymbol.name);
@@ -270,6 +277,7 @@ export async function remapSignatureMembers(svc, members, kind, version, sourceM
270
277
  targetMapping,
271
278
  sourcePriority,
272
279
  projectPath,
280
+ gradleUserHome,
273
281
  disambiguation: {
274
282
  ownerHint: targetOwner,
275
283
  descriptorHint: remappedDescriptorHint
@@ -123,8 +123,8 @@ export async function traceSymbolLifecycle(svc, input) {
123
123
  const versionWarnings = [];
124
124
  try {
125
125
  const [obfuscatedClassName, obfuscatedMethod, resolvedJar] = await Promise.all([
126
- resolveToObfuscatedClassName(svc, userClassName, version, mapping, input.sourcePriority, versionWarnings),
127
- resolveToObfuscatedMemberName(svc, userMethodName, userClassName, descriptor, "method", version, mapping, input.sourcePriority, versionWarnings),
126
+ resolveToObfuscatedClassName(svc, userClassName, version, mapping, input.sourcePriority, versionWarnings, input.gradleUserHome),
127
+ resolveToObfuscatedMemberName(svc, userMethodName, userClassName, descriptor, "method", version, mapping, input.sourcePriority, versionWarnings, input.gradleUserHome),
128
128
  svc.versionService.resolveVersionJar(version)
129
129
  ]);
130
130
  const signature = await svc.explorerService.getSignature({
@@ -250,6 +250,7 @@ export async function searchClassSource(svc, input) {
250
250
  sourceMapping: input.queryNamespace,
251
251
  targetMapping: artifactMapping,
252
252
  sourcePriority: input.sourcePriority,
253
+ gradleUserHome: input.gradleUserHome,
253
254
  signatureMode: "name-only",
254
255
  maxCandidates: 5
255
256
  });
@@ -14,6 +14,11 @@ export declare class SourceServiceState {
14
14
  * tiny-remapper run.
15
15
  */
16
16
  readonly inflightRemaps: Map<string, Promise<string>>;
17
+ /**
18
+ * Process-local artifact ingest jobs keyed by artifactId. This collapses
19
+ * concurrent class source/member lookups inside one MCP server process.
20
+ */
21
+ readonly inflightArtifactIngests: Map<string, Promise<void>>;
17
22
  readonly lru: LruList<{
18
23
  totalContentBytes: number;
19
24
  updatedAt: string;
@@ -14,6 +14,11 @@ export class SourceServiceState {
14
14
  * tiny-remapper run.
15
15
  */
16
16
  inflightRemaps = new Map();
17
+ /**
18
+ * Process-local artifact ingest jobs keyed by artifactId. This collapses
19
+ * concurrent class source/member lookups inside one MCP server process.
20
+ */
21
+ inflightArtifactIngests = new Map();
17
22
  lru = new LruList();
18
23
  }
19
24
  //# sourceMappingURL=state.js.map
@@ -106,6 +106,7 @@ export async function resolveWorkspaceSymbol(svc, input) {
106
106
  sourceMapping: input.sourceMapping,
107
107
  targetMapping: mappingApplied,
108
108
  sourcePriority: input.sourcePriority,
109
+ gradleUserHome: input.gradleUserHome,
109
110
  maxCandidates: input.maxCandidates
110
111
  });
111
112
  return {
@@ -121,7 +122,8 @@ export async function resolveWorkspaceSymbol(svc, input) {
121
122
  className,
122
123
  classNameMapping: input.sourceMapping,
123
124
  includeKinds: ["class"],
124
- sourcePriority: input.sourcePriority
125
+ sourcePriority: input.sourcePriority,
126
+ gradleUserHome: input.gradleUserHome
125
127
  });
126
128
  const resolvedClass = matrix.classIdentity[mappingApplied];
127
129
  if (!resolvedClass) {
@@ -180,6 +182,7 @@ export async function resolveWorkspaceSymbol(svc, input) {
180
182
  sourceMapping: input.sourceMapping,
181
183
  targetMapping: mappingApplied,
182
184
  sourcePriority: input.sourcePriority,
185
+ gradleUserHome: input.gradleUserHome,
183
186
  maxCandidates: input.maxCandidates
184
187
  });
185
188
  const filtered = mapped.candidates.filter((candidate) => candidate.kind === kind);
@@ -5,7 +5,8 @@ export async function runMappingHealthStage(svc, ctx) {
5
5
  const health = await svc.mappingService.checkMappingHealth({
6
6
  version: ctx.version,
7
7
  requestedMapping: ctx.requestedMapping,
8
- sourcePriority: ctx.currentSourcePriority
8
+ sourcePriority: ctx.currentSourcePriority,
9
+ gradleUserHome: ctx.input.gradleUserHome
9
10
  });
10
11
  const jarAvailable = existsSync(ctx.jarPath);
11
12
  ctx.healthReport = {
@@ -36,6 +36,7 @@ export async function runResolveStage(svc, ctx) {
36
36
  mapping: ctx.requestedMapping,
37
37
  sourcePriority: ctx.currentSourcePriority,
38
38
  projectPath: ctx.input.projectPath,
39
+ gradleUserHome: ctx.input.gradleUserHome,
39
40
  scope: ctx.input.scope,
40
41
  preferProjectVersion: false
41
42
  });
@@ -9,7 +9,8 @@ function findValidateMixinClassMapping(svc, input) {
9
9
  sourceMapping: input.sourceMapping,
10
10
  targetMapping: input.targetMapping,
11
11
  sourcePriority: input.sourcePriority,
12
- projectPath: input.projectPath
12
+ projectPath: input.projectPath,
13
+ gradleUserHome: input.gradleUserHome
13
14
  });
14
15
  }
15
16
  const cacheKey = [
@@ -18,7 +19,8 @@ function findValidateMixinClassMapping(svc, input) {
18
19
  input.sourceMapping,
19
20
  input.targetMapping,
20
21
  input.sourcePriority,
21
- input.projectPath ?? ""
22
+ input.projectPath ?? "",
23
+ input.gradleUserHome ?? ""
22
24
  ].join("\0");
23
25
  const cached = cache.get(cacheKey);
24
26
  if (cached) {
@@ -31,7 +33,8 @@ function findValidateMixinClassMapping(svc, input) {
31
33
  sourceMapping: input.sourceMapping,
32
34
  targetMapping: input.targetMapping,
33
35
  sourcePriority: input.sourcePriority,
34
- projectPath: input.projectPath
36
+ projectPath: input.projectPath,
37
+ gradleUserHome: input.gradleUserHome
35
38
  }).catch((error) => {
36
39
  cache.delete(cacheKey);
37
40
  throw error;
@@ -78,6 +81,7 @@ export async function processSingleMixinTarget(svc, ctx, target, targetIndex) {
78
81
  targetMapping: ctx.signatureLookupMapping,
79
82
  sourcePriority: ctx.currentSourcePriority,
80
83
  projectPath: ctx.input.projectPath,
84
+ gradleUserHome: ctx.input.gradleUserHome,
81
85
  batchCaches: ctx.input.batchCaches
82
86
  });
83
87
  if (mapped.resolved && mapped.resolvedSymbol) {
@@ -110,9 +114,9 @@ export async function processSingleMixinTarget(svc, ctx, target, targetIndex) {
110
114
  if (ctx.requestedMapping !== ctx.signatureLookupMapping) {
111
115
  try {
112
116
  const [ctorResult, methodResult, fieldResult] = await Promise.all([
113
- svc.remapSignatureMembers(sig.constructors, "method", ctx.version, ctx.signatureLookupMapping, ctx.requestedMapping, ctx.currentSourcePriority, ctx.warnings, ctx.input.projectPath),
114
- svc.remapSignatureMembers(sig.methods, "method", ctx.version, ctx.signatureLookupMapping, ctx.requestedMapping, ctx.currentSourcePriority, ctx.warnings, ctx.input.projectPath),
115
- svc.remapSignatureMembers(sig.fields, "field", ctx.version, ctx.signatureLookupMapping, ctx.requestedMapping, ctx.currentSourcePriority, ctx.warnings, ctx.input.projectPath)
117
+ svc.remapSignatureMembers(sig.constructors, "method", ctx.version, ctx.signatureLookupMapping, ctx.requestedMapping, ctx.currentSourcePriority, ctx.warnings, ctx.input.projectPath, ctx.input.gradleUserHome),
118
+ svc.remapSignatureMembers(sig.methods, "method", ctx.version, ctx.signatureLookupMapping, ctx.requestedMapping, ctx.currentSourcePriority, ctx.warnings, ctx.input.projectPath, ctx.input.gradleUserHome),
119
+ svc.remapSignatureMembers(sig.fields, "field", ctx.version, ctx.signatureLookupMapping, ctx.requestedMapping, ctx.currentSourcePriority, ctx.warnings, ctx.input.projectPath, ctx.input.gradleUserHome)
116
120
  ]);
117
121
  constructors = ctorResult.members;
118
122
  methods = methodResult.members;
@@ -160,7 +164,8 @@ export async function processSingleMixinTarget(svc, ctx, target, targetIndex) {
160
164
  try {
161
165
  const existenceCheck = await svc.mappingService.checkSymbolExists({
162
166
  version: ctx.version, kind: "class", name: resolvedClassName,
163
- sourceMapping: ctx.requestedMapping, nameMode: "auto", sourcePriority: ctx.currentSourcePriority
167
+ sourceMapping: ctx.requestedMapping, nameMode: "auto", sourcePriority: ctx.currentSourcePriority,
168
+ gradleUserHome: ctx.input.gradleUserHome
164
169
  });
165
170
  if (existenceCheck.resolved) {
166
171
  ctx.symbolExistsButSignatureFailed.add(target.className);
@@ -1,5 +1,6 @@
1
1
  import type { Config, MappingVariant, ResolvedSourceArtifact, SourceTargetInput } from "./types.js";
2
2
  export type { MappingVariant } from "./types.js";
3
+ export declare function artifactIdForJar(inputKind: string, artifactPath: string, signature: string, suffix?: string, mappingVariant?: MappingVariant): string;
3
4
  export interface ResolveSourceTargetOptions {
4
5
  allowDecompile: boolean;
5
6
  preferBinaryOnly?: boolean;
@@ -133,7 +133,7 @@ async function resolveGradleCacheCoordinateCandidate(coordinate) {
133
133
  function resolveRemoteBinaryCandidate(coordinate, repos) {
134
134
  return buildRemoteBinaryUrls(repos, coordinate);
135
135
  }
136
- function artifactIdForJar(inputKind, artifactPath, signature, suffix, mappingVariant = "pass") {
136
+ export function artifactIdForJar(inputKind, artifactPath, signature, suffix, mappingVariant = "pass") {
137
137
  const parts = [inputKind, artifactPath, signature, suffix ?? "source"];
138
138
  if (mappingVariant === "mojang-remapped") {
139
139
  parts.push("mojang-remapped");
@@ -26,6 +26,7 @@ export type ResolveArtifactInput = {
26
26
  sourcePriority?: MappingSourcePriority;
27
27
  allowDecompile?: boolean;
28
28
  projectPath?: string;
29
+ gradleUserHome?: string;
29
30
  scope?: ArtifactScope;
30
31
  preferProjectVersion?: boolean;
31
32
  strictVersion?: boolean;
@@ -50,6 +51,23 @@ export type ResolveArtifactOutput = {
50
51
  warnings: string[];
51
52
  sampleEntries?: string[];
52
53
  };
54
+ export type ProbeMinecraftArtifactInput = {
55
+ target: {
56
+ kind: "version";
57
+ value: string;
58
+ };
59
+ mapping?: SourceMapping;
60
+ sourcePriority?: MappingSourcePriority;
61
+ projectPath?: string;
62
+ gradleUserHome?: string;
63
+ scope?: ArtifactScope;
64
+ preferProjectVersion?: boolean;
65
+ };
66
+ export type ProbeMinecraftArtifactOutput = {
67
+ artifactId: string;
68
+ mappingApplied: SourceMapping;
69
+ warnings?: string[];
70
+ };
53
71
  export type ArtifactContentsSummary = {
54
72
  sourceKind: "source-jar" | "decompiled-binary";
55
73
  indexedContentKinds: string[];
@@ -89,6 +107,7 @@ export type SearchClassSourceInput = {
89
107
  cursor?: string;
90
108
  queryNamespace?: SourceMapping;
91
109
  sourcePriority?: MappingSourcePriority;
110
+ gradleUserHome?: string;
92
111
  };
93
112
  export type SearchClassSourceOutput = {
94
113
  hits: SearchSourceHit[];
@@ -149,6 +168,7 @@ export type ResolveWorkspaceSymbolInput = {
149
168
  descriptor?: string;
150
169
  sourceMapping: SourceMapping;
151
170
  sourcePriority?: MappingSourcePriority;
171
+ gradleUserHome?: string;
152
172
  maxCandidates?: number;
153
173
  };
154
174
  export type ResolveWorkspaceSymbolOutput = MappingSymbolResolutionOutput & {
@@ -164,6 +184,7 @@ export type GetClassSourceInput = {
164
184
  sourcePriority?: MappingSourcePriority;
165
185
  allowDecompile?: boolean;
166
186
  projectPath?: string;
187
+ gradleUserHome?: string;
167
188
  scope?: ArtifactScope;
168
189
  preferProjectVersion?: boolean;
169
190
  strictVersion?: boolean;
@@ -225,6 +246,7 @@ export type GetClassMembersInput = {
225
246
  memberPattern?: string;
226
247
  maxMembers?: number;
227
248
  projectPath?: string;
249
+ gradleUserHome?: string;
228
250
  scope?: ArtifactScope;
229
251
  preferProjectVersion?: boolean;
230
252
  strictVersion?: boolean;
@@ -286,6 +308,7 @@ export type TraceSymbolLifecycleInput = {
286
308
  toVersion?: string;
287
309
  mapping?: SourceMapping;
288
310
  sourcePriority?: MappingSourcePriority;
311
+ gradleUserHome?: string;
289
312
  includeSnapshots?: boolean;
290
313
  maxVersions?: number;
291
314
  includeTimeline?: boolean;
@@ -336,6 +359,7 @@ export type DiffClassSignaturesInput = {
336
359
  toVersion: string;
337
360
  mapping?: SourceMapping;
338
361
  sourcePriority?: MappingSourcePriority;
362
+ gradleUserHome?: string;
339
363
  includeFullDiff?: boolean;
340
364
  };
341
365
  export type DiffClassSignaturesOutput = {
@@ -401,6 +425,7 @@ export type ValidateMixinInput = {
401
425
  sourcePriority?: MappingSourcePriority;
402
426
  scope?: ArtifactScope;
403
427
  projectPath?: string;
428
+ gradleUserHome?: string;
404
429
  preferProjectVersion?: boolean;
405
430
  minSeverity?: "error" | "warning" | "all";
406
431
  hideUncertain?: boolean;
@@ -472,6 +497,7 @@ export type ValidateAccessWidenerInput = {
472
497
  mapping?: SourceMapping;
473
498
  sourcePriority?: MappingSourcePriority;
474
499
  projectPath?: string;
500
+ gradleUserHome?: string;
475
501
  scope?: ArtifactScope;
476
502
  preferProjectVersion?: boolean;
477
503
  };
@@ -482,6 +508,7 @@ export type ValidateAccessTransformerInput = {
482
508
  atNamespace?: AccessTransformerNamespace;
483
509
  sourcePriority?: MappingSourcePriority;
484
510
  projectPath?: string;
511
+ gradleUserHome?: string;
485
512
  scope?: ArtifactScope;
486
513
  preferProjectVersion?: boolean;
487
514
  };
@@ -508,6 +535,7 @@ export declare class SourceService {
508
535
  workspaceContextCache?: WorkspaceContextCache;
509
536
  });
510
537
  resolveArtifact(input: ResolveArtifactInput): Promise<ResolveArtifactOutput>;
538
+ probeMinecraftArtifact(input: ProbeMinecraftArtifactInput): Promise<ProbeMinecraftArtifactOutput>;
511
539
  synthesizeWorkspaceTarget(input: ResolveArtifactInput, workspace: import("./types.js").WorkspaceTargetInput): ReturnType<typeof workspaceTarget.synthesizeWorkspaceTarget>;
512
540
  synthesizeDependencyTarget(input: ResolveArtifactInput, dep: import("./types.js").DependencyTargetInput): ReturnType<typeof workspaceTarget.synthesizeDependencyTarget>;
513
541
  loadOrDetectWorkspaceContext(projectPath: string): ReturnType<typeof workspaceTarget.loadOrDetectWorkspaceContext>;
@@ -515,6 +543,7 @@ export declare class SourceService {
515
543
  version: string;
516
544
  awNamespace: SourceMapping;
517
545
  projectPath?: string;
546
+ gradleUserHome?: string;
518
547
  scope?: ArtifactScope;
519
548
  preferProjectVersion?: boolean;
520
549
  }): Promise<RuntimeValidationProvenance<SourceMapping>>;
@@ -526,6 +555,7 @@ export declare class SourceService {
526
555
  version: string;
527
556
  atNamespace: AccessTransformerNamespace;
528
557
  projectPath?: string;
558
+ gradleUserHome?: string;
529
559
  scope?: ArtifactScope;
530
560
  preferProjectVersion?: boolean;
531
561
  }): Promise<RuntimeValidationProvenance<AccessTransformerNamespace>>;
@@ -538,15 +568,18 @@ export declare class SourceService {
538
568
  discoverVersionSourceJar(input: {
539
569
  version: string;
540
570
  projectPath?: string;
571
+ gradleUserHome?: string;
541
572
  }): ReturnType<typeof artifactResolver.discoverVersionSourceJar>;
542
573
  discoverAccessWidenerRuntimeCandidates(input: {
543
574
  version: string;
544
575
  projectPath?: string;
576
+ gradleUserHome?: string;
545
577
  requestedScope: ArtifactScope;
546
578
  }): ReturnType<typeof artifactResolver.discoverAccessWidenerRuntimeCandidates>;
547
579
  discoverAccessTransformerRuntimeCandidates(input: {
548
580
  version: string;
549
581
  projectPath?: string;
582
+ gradleUserHome?: string;
550
583
  requestedScope: ArtifactScope;
551
584
  atNamespace: AccessTransformerNamespace;
552
585
  loader: import("./workspace-mapping-service.js").WorkspaceProjectLoader | "unknown";
@@ -580,7 +613,7 @@ export declare class SourceService {
580
613
  getClassMembers(input: GetClassMembersInput): Promise<GetClassMembersOutput>;
581
614
  validateMixin(input: ValidateMixinInput, options?: ValidateMixinOptions): Promise<ValidateMixinOutput>;
582
615
  validateMixinSingle(input: validateMixinModule.ValidateMixinSingleInput): Promise<MixinValidationResult>;
583
- remapSignatureMembers(members: SignatureMember[], kind: "field" | "method", version: string, sourceMapping: SourceMapping, targetMapping: SourceMapping, sourcePriority: MappingSourcePriority | undefined, warnings: string[], projectPath?: string): Promise<{
616
+ remapSignatureMembers(members: SignatureMember[], kind: "field" | "method", version: string, sourceMapping: SourceMapping, targetMapping: SourceMapping, sourcePriority: MappingSourcePriority | undefined, warnings: string[], projectPath?: string, gradleUserHome?: string): Promise<{
584
617
  members: SignatureMember[];
585
618
  failedNames: Set<string>;
586
619
  }>;
@@ -595,6 +628,7 @@ export declare class SourceService {
595
628
  sourceMapping: SourceMapping;
596
629
  targetMapping: SourceMapping;
597
630
  sourcePriority: MappingSourcePriority | undefined;
631
+ gradleUserHome?: string;
598
632
  warnings: string[];
599
633
  context: string;
600
634
  }): Promise<string>;
@@ -67,6 +67,9 @@ export class SourceService {
67
67
  async resolveArtifact(input) {
68
68
  return artifactResolver.resolveArtifact(this, input);
69
69
  }
70
+ async probeMinecraftArtifact(input) {
71
+ return artifactResolver.probeMinecraftArtifact(this, input);
72
+ }
70
73
  async synthesizeWorkspaceTarget(input, workspace) {
71
74
  return workspaceTarget.synthesizeWorkspaceTarget(this, input, workspace);
72
75
  }
@@ -173,8 +176,8 @@ export class SourceService {
173
176
  async validateMixinSingle(input) {
174
177
  return validateMixinModule.validateMixinSingle(this, input);
175
178
  }
176
- async remapSignatureMembers(members, kind, version, sourceMapping, targetMapping, sourcePriority, warnings, projectPath) {
177
- return lifecycle.remapSignatureMembers(this, members, kind, version, sourceMapping, targetMapping, sourcePriority, warnings, projectPath);
179
+ async remapSignatureMembers(members, kind, version, sourceMapping, targetMapping, sourcePriority, warnings, projectPath, gradleUserHome) {
180
+ return lifecycle.remapSignatureMembers(this, members, kind, version, sourceMapping, targetMapping, sourcePriority, warnings, projectPath, gradleUserHome);
178
181
  }
179
182
  async validateAccessWidener(input) {
180
183
  return accessValidate.validateAccessWidener(this, input);
@@ -1,4 +1,4 @@
1
- export declare const TOOL_SURFACE_SECTION_IDS: readonly ["v3-entry-tools", "source-exploration", "version-comparison-symbol-tracking", "mapping-symbols", "nbt-utilities", "mod-analysis", "validation", "registry-diagnostics", "batch-lookup"];
1
+ export declare const TOOL_SURFACE_SECTION_IDS: readonly ["top-level-workflow-tools", "source-exploration", "version-comparison-symbol-tracking", "mapping-symbols", "nbt-utilities", "mod-analysis", "validation", "registry-diagnostics", "batch-lookup"];
2
2
  export type ToolSurfaceSectionId = (typeof TOOL_SURFACE_SECTION_IDS)[number];
3
3
  export type ToolSurfaceLocale = "en" | "ja";
4
4
  export declare function renderToolSurfaceSection(locale: ToolSurfaceLocale, sectionId: ToolSurfaceSectionId): string;
@@ -1,5 +1,5 @@
1
1
  export const TOOL_SURFACE_SECTION_IDS = [
2
- "v3-entry-tools",
2
+ "top-level-workflow-tools",
3
3
  "source-exploration",
4
4
  "version-comparison-symbol-tracking",
5
5
  "mapping-symbols",
@@ -10,7 +10,7 @@ export const TOOL_SURFACE_SECTION_IDS = [
10
10
  "batch-lookup"
11
11
  ];
12
12
  const SECTION_ROWS = {
13
- "v3-entry-tools": {
13
+ "top-level-workflow-tools": {
14
14
  en: [
15
15
  "| `inspect-minecraft` | Inspect versions, artifacts, classes, files, source text, and workspace-aware lookup flows |",
16
16
  "| `analyze-symbol` | Handle symbol existence checks, namespace mapping, lifecycle tracing, workspace symbol resolution, and API overviews |",