@adhisang/minecraft-modding-mcp 4.0.0 → 4.1.1

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 (176) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +40 -23
  3. package/dist/build-suggested-call.d.ts +29 -0
  4. package/dist/build-suggested-call.js +58 -0
  5. package/dist/cache-registry.d.ts +3 -1
  6. package/dist/cache-registry.js +50 -6
  7. package/dist/entry-tools/analyze-symbol-service.d.ts +16 -16
  8. package/dist/entry-tools/batch-class-members-service.d.ts +34 -0
  9. package/dist/entry-tools/batch-class-members-service.js +97 -0
  10. package/dist/entry-tools/batch-class-source-service.d.ts +37 -0
  11. package/dist/entry-tools/batch-class-source-service.js +100 -0
  12. package/dist/entry-tools/batch-mappings-service.d.ts +36 -0
  13. package/dist/entry-tools/batch-mappings-service.js +66 -0
  14. package/dist/entry-tools/batch-runner.d.ts +72 -0
  15. package/dist/entry-tools/batch-runner.js +90 -0
  16. package/dist/entry-tools/batch-symbol-exists-service.d.ts +46 -0
  17. package/dist/entry-tools/batch-symbol-exists-service.js +113 -0
  18. package/dist/entry-tools/compare-minecraft-service.d.ts +6 -6
  19. package/dist/entry-tools/inspect-minecraft/handlers/artifact.d.ts +5 -0
  20. package/dist/entry-tools/inspect-minecraft/handlers/artifact.js +83 -0
  21. package/dist/entry-tools/inspect-minecraft/handlers/class-members.d.ts +6 -0
  22. package/dist/entry-tools/inspect-minecraft/handlers/class-members.js +80 -0
  23. package/dist/entry-tools/inspect-minecraft/handlers/class-overview.d.ts +5 -0
  24. package/dist/entry-tools/inspect-minecraft/handlers/class-overview.js +248 -0
  25. package/dist/entry-tools/inspect-minecraft/handlers/class-source.d.ts +5 -0
  26. package/dist/entry-tools/inspect-minecraft/handlers/class-source.js +60 -0
  27. package/dist/entry-tools/inspect-minecraft/handlers/file.d.ts +5 -0
  28. package/dist/entry-tools/inspect-minecraft/handlers/file.js +54 -0
  29. package/dist/entry-tools/inspect-minecraft/handlers/list-files.d.ts +5 -0
  30. package/dist/entry-tools/inspect-minecraft/handlers/list-files.js +100 -0
  31. package/dist/entry-tools/inspect-minecraft/handlers/search.d.ts +5 -0
  32. package/dist/entry-tools/inspect-minecraft/handlers/search.js +155 -0
  33. package/dist/entry-tools/inspect-minecraft/handlers/versions.d.ts +6 -0
  34. package/dist/entry-tools/inspect-minecraft/handlers/versions.js +49 -0
  35. package/dist/entry-tools/inspect-minecraft/internal.d.ts +1042 -0
  36. package/dist/entry-tools/inspect-minecraft/internal.js +448 -0
  37. package/dist/entry-tools/inspect-minecraft-service.d.ts +193 -308
  38. package/dist/entry-tools/inspect-minecraft-service.js +20 -1244
  39. package/dist/entry-tools/manage-cache-service.d.ts +16 -16
  40. package/dist/entry-tools/validate-project/cases/access-transformer.d.ts +6 -0
  41. package/dist/entry-tools/validate-project/cases/access-transformer.js +106 -0
  42. package/dist/entry-tools/validate-project/cases/access-widener.d.ts +6 -0
  43. package/dist/entry-tools/validate-project/cases/access-widener.js +86 -0
  44. package/dist/entry-tools/validate-project/cases/mixin.d.ts +6 -0
  45. package/dist/entry-tools/validate-project/cases/mixin.js +90 -0
  46. package/dist/entry-tools/validate-project/cases/project-summary.d.ts +102 -0
  47. package/dist/entry-tools/validate-project/cases/project-summary.js +415 -0
  48. package/dist/entry-tools/validate-project/internal.d.ts +142 -0
  49. package/dist/entry-tools/validate-project/internal.js +303 -0
  50. package/dist/entry-tools/validate-project-service.d.ts +67 -47
  51. package/dist/entry-tools/validate-project-service.js +13 -563
  52. package/dist/entry-tools/verify-mixin-target-service.d.ts +133 -0
  53. package/dist/entry-tools/verify-mixin-target-service.js +323 -0
  54. package/dist/error-mapping.d.ts +40 -0
  55. package/dist/error-mapping.js +139 -0
  56. package/dist/errors.d.ts +6 -0
  57. package/dist/errors.js +6 -0
  58. package/dist/index.d.ts +2 -0
  59. package/dist/index.js +147 -1354
  60. package/dist/mapping/internal-types.d.ts +54 -0
  61. package/dist/mapping/internal-types.js +14 -0
  62. package/dist/mapping/loaders/mojang.d.ts +2 -0
  63. package/dist/mapping/loaders/mojang.js +64 -0
  64. package/dist/mapping/loaders/tiny-loom.d.ts +2 -0
  65. package/dist/mapping/loaders/tiny-loom.js +73 -0
  66. package/dist/mapping/loaders/tiny-maven.d.ts +2 -0
  67. package/dist/mapping/loaders/tiny-maven.js +104 -0
  68. package/dist/mapping/loaders/types.d.ts +14 -0
  69. package/dist/mapping/loaders/types.js +2 -0
  70. package/dist/mapping/lookup.d.ts +52 -0
  71. package/dist/mapping/lookup.js +496 -0
  72. package/dist/mapping/parsers/normalize.d.ts +10 -0
  73. package/dist/mapping/parsers/normalize.js +52 -0
  74. package/dist/mapping/parsers/proguard.d.ts +20 -0
  75. package/dist/mapping/parsers/proguard.js +138 -0
  76. package/dist/mapping/parsers/symbol-records.d.ts +27 -0
  77. package/dist/mapping/parsers/symbol-records.js +216 -0
  78. package/dist/mapping/parsers/tiny.d.ts +9 -0
  79. package/dist/mapping/parsers/tiny.js +96 -0
  80. package/dist/mapping/types.d.ts +147 -0
  81. package/dist/mapping/types.js +2 -0
  82. package/dist/mapping-pipeline-service.js +3 -2
  83. package/dist/mapping-service.d.ts +8 -145
  84. package/dist/mapping-service.js +30 -1207
  85. package/dist/mixin/access-validators.d.ts +9 -0
  86. package/dist/mixin/access-validators.js +257 -0
  87. package/dist/mixin/annotation-validators.d.ts +5 -0
  88. package/dist/mixin/annotation-validators.js +162 -0
  89. package/dist/mixin/helpers.d.ts +28 -0
  90. package/dist/mixin/helpers.js +315 -0
  91. package/dist/mixin/parsed-validator.d.ts +8 -0
  92. package/dist/mixin/parsed-validator.js +337 -0
  93. package/dist/mixin/types.d.ts +208 -0
  94. package/dist/mixin/types.js +28 -0
  95. package/dist/mixin-validator.d.ts +9 -201
  96. package/dist/mixin-validator.js +8 -1020
  97. package/dist/source/access-validate.d.ts +4 -0
  98. package/dist/source/access-validate.js +254 -0
  99. package/dist/source/artifact-resolver.d.ts +111 -0
  100. package/dist/source/artifact-resolver.js +1271 -0
  101. package/dist/source/cache-metrics.d.ts +26 -0
  102. package/dist/source/cache-metrics.js +172 -0
  103. package/dist/source/class-source/members-builder.d.ts +34 -0
  104. package/dist/source/class-source/members-builder.js +46 -0
  105. package/dist/source/class-source/snippet-builder.d.ts +19 -0
  106. package/dist/source/class-source/snippet-builder.js +46 -0
  107. package/dist/source/class-source-helpers.d.ts +34 -0
  108. package/dist/source/class-source-helpers.js +140 -0
  109. package/dist/source/class-source.d.ts +42 -0
  110. package/dist/source/class-source.js +883 -0
  111. package/dist/source/descriptor-utils.d.ts +6 -0
  112. package/dist/source/descriptor-utils.js +37 -0
  113. package/dist/source/file-access.d.ts +4 -0
  114. package/dist/source/file-access.js +102 -0
  115. package/dist/source/indexer.d.ts +82 -0
  116. package/dist/source/indexer.js +522 -0
  117. package/dist/source/lifecycle/diff-utils.d.ts +9 -0
  118. package/dist/source/lifecycle/diff-utils.js +107 -0
  119. package/dist/source/lifecycle/diff.d.ts +2 -0
  120. package/dist/source/lifecycle/diff.js +265 -0
  121. package/dist/source/lifecycle/mapping-helpers.d.ts +22 -0
  122. package/dist/source/lifecycle/mapping-helpers.js +327 -0
  123. package/dist/source/lifecycle/runtime-check.d.ts +2 -0
  124. package/dist/source/lifecycle/runtime-check.js +142 -0
  125. package/dist/source/lifecycle/trace.d.ts +2 -0
  126. package/dist/source/lifecycle/trace.js +231 -0
  127. package/dist/source/lifecycle.d.ts +4 -0
  128. package/dist/source/lifecycle.js +5 -0
  129. package/dist/source/search.d.ts +51 -0
  130. package/dist/source/search.js +676 -0
  131. package/dist/source/shared-utils.d.ts +6 -0
  132. package/dist/source/shared-utils.js +55 -0
  133. package/dist/source/state.d.ts +26 -0
  134. package/dist/source/state.js +24 -0
  135. package/dist/source/symbol-resolver.d.ts +3 -0
  136. package/dist/source/symbol-resolver.js +212 -0
  137. package/dist/source/validate-mixin/pipeline/mapping-health.d.ts +3 -0
  138. package/dist/source/validate-mixin/pipeline/mapping-health.js +41 -0
  139. package/dist/source/validate-mixin/pipeline/parse.d.ts +2 -0
  140. package/dist/source/validate-mixin/pipeline/parse.js +10 -0
  141. package/dist/source/validate-mixin/pipeline/resolve.d.ts +3 -0
  142. package/dist/source/validate-mixin/pipeline/resolve.js +78 -0
  143. package/dist/source/validate-mixin/pipeline/target-lookup.d.ts +6 -0
  144. package/dist/source/validate-mixin/pipeline/target-lookup.js +260 -0
  145. package/dist/source/validate-mixin/pipeline-context.d.ts +72 -0
  146. package/dist/source/validate-mixin/pipeline-context.js +93 -0
  147. package/dist/source/validate-mixin.d.ts +22 -0
  148. package/dist/source/validate-mixin.js +799 -0
  149. package/dist/source/workspace-target.d.ts +18 -0
  150. package/dist/source/workspace-target.js +305 -0
  151. package/dist/source-resolver.d.ts +1 -0
  152. package/dist/source-resolver.js +1 -1
  153. package/dist/source-service.d.ts +164 -170
  154. package/dist/source-service.js +70 -6116
  155. package/dist/stage-emitter.d.ts +13 -0
  156. package/dist/stage-emitter.js +30 -0
  157. package/dist/stdio-supervisor.d.ts +61 -0
  158. package/dist/stdio-supervisor.js +326 -9
  159. package/dist/tool-contract-manifest.d.ts +1 -1
  160. package/dist/tool-contract-manifest.js +23 -6
  161. package/dist/tool-guidance.d.ts +82 -0
  162. package/dist/tool-guidance.js +734 -0
  163. package/dist/tool-schema-registry.d.ts +16 -0
  164. package/dist/tool-schema-registry.js +37 -0
  165. package/dist/tool-schemas.d.ts +3518 -0
  166. package/dist/tool-schemas.js +813 -0
  167. package/dist/types.d.ts +36 -0
  168. package/dist/version-service.js +7 -6
  169. package/dist/workspace-context-cache.d.ts +32 -0
  170. package/dist/workspace-context-cache.js +66 -0
  171. package/dist/workspace-mapping-service.d.ts +16 -0
  172. package/dist/workspace-mapping-service.js +173 -1
  173. package/docs/README-ja.md +416 -0
  174. package/docs/examples.md +483 -0
  175. package/docs/tool-reference.md +462 -0
  176. package/package.json +17 -4
@@ -0,0 +1,138 @@
1
+ import { ERROR_CODES, createError } from "../../errors.js";
2
+ import { addLookupEntries, createClassSymbolRecord, createDirectionIndex, createFieldSymbolRecord, createMethodSymbolRecord, parseFieldName, stripLineInfo } from "./symbol-records.js";
3
+ import { pairKey } from "./normalize.js";
4
+ /** Map of proguard primitive type names to JVM type characters. */
5
+ export const PROGUARD_PRIMITIVES = {
6
+ void: "V", boolean: "Z", byte: "B", char: "C",
7
+ short: "S", int: "I", long: "J", float: "F", double: "D"
8
+ };
9
+ /**
10
+ * Convert a single proguard type (e.g. "int", "net.minecraft.Foo", "int[][]")
11
+ * to JVM notation (e.g. "I", "Lnet/minecraft/Foo;", "[[I").
12
+ * `classLookup` maps mojang class names → obfuscated class names (for the obfuscated descriptor).
13
+ * Pass `undefined` to skip class name translation (for mojang descriptors).
14
+ */
15
+ export function proguardTypeToJvm(type, classLookup) {
16
+ let arrayDepth = 0;
17
+ let base = type;
18
+ while (base.endsWith("[]")) {
19
+ arrayDepth += 1;
20
+ base = base.slice(0, -2);
21
+ }
22
+ const prefix = "[".repeat(arrayDepth);
23
+ const primitive = PROGUARD_PRIMITIVES[base];
24
+ if (primitive) {
25
+ return `${prefix}${primitive}`;
26
+ }
27
+ const translated = classLookup ? (classLookup.get(base) ?? base) : base;
28
+ return `${prefix}L${translated.replace(/\./g, "/")};`;
29
+ }
30
+ /**
31
+ * Parse a proguard method signature (after stripLineInfo) into a JVM descriptor.
32
+ * Input format: "returnType methodName(paramType1,paramType2,...)"
33
+ * Returns `{ name, descriptor }` or `undefined` if parsing fails.
34
+ */
35
+ export function parseProguardMethod(value, classLookup) {
36
+ const match = /^(.+?)\s+([^\s(]+)\((.*)\)$/.exec(value);
37
+ if (!match) {
38
+ return undefined;
39
+ }
40
+ const returnType = match[1].trim();
41
+ const name = match[2].trim();
42
+ const params = match[3].trim();
43
+ if (!name) {
44
+ return undefined;
45
+ }
46
+ const paramParts = params ? params.split(",").map((p) => p.trim()) : [];
47
+ const paramDescriptor = paramParts.map((p) => proguardTypeToJvm(p, classLookup)).join("");
48
+ const returnDescriptor = proguardTypeToJvm(returnType, classLookup);
49
+ return { name, descriptor: `(${paramDescriptor})${returnDescriptor}` };
50
+ }
51
+ export function parseClientMappings(text) {
52
+ const obfuscatedToMojang = createDirectionIndex();
53
+ const mojangToObfuscated = createDirectionIndex();
54
+ // Two-pass parsing: first collect class name mappings, then parse members with descriptors.
55
+ const lines = text.split(/\r?\n/);
56
+ // Pass 1: collect class name mappings (mojang → obfuscated)
57
+ const mojangToObfuscatedClass = new Map();
58
+ let classCount = 0;
59
+ for (const rawLine of lines) {
60
+ const line = rawLine.trim();
61
+ if (!line || line.startsWith("#")) {
62
+ continue;
63
+ }
64
+ const classMatch = /^(.+?)\s+->\s+(.+):$/.exec(line);
65
+ if (classMatch) {
66
+ const mojangClass = classMatch[1]?.trim() ?? "";
67
+ const obfuscatedClass = classMatch[2]?.trim() ?? "";
68
+ if (mojangClass && obfuscatedClass) {
69
+ mojangToObfuscatedClass.set(mojangClass, obfuscatedClass);
70
+ classCount += 1;
71
+ }
72
+ }
73
+ }
74
+ if (classCount === 0) {
75
+ throw createError({
76
+ code: ERROR_CODES.MAPPING_UNAVAILABLE,
77
+ message: "No class mappings could be parsed from client mappings."
78
+ });
79
+ }
80
+ // Pass 2: build full index with descriptors
81
+ let currentClass;
82
+ for (const rawLine of lines) {
83
+ const line = rawLine.trim();
84
+ if (!line || line.startsWith("#")) {
85
+ continue;
86
+ }
87
+ const classMatch = /^(.+?)\s+->\s+(.+):$/.exec(line);
88
+ if (classMatch) {
89
+ const mojangClass = classMatch[1]?.trim() ?? "";
90
+ const obfuscatedClass = classMatch[2]?.trim() ?? "";
91
+ if (!mojangClass || !obfuscatedClass) {
92
+ currentClass = undefined;
93
+ continue;
94
+ }
95
+ currentClass = {
96
+ obfuscated: obfuscatedClass,
97
+ mojang: mojangClass
98
+ };
99
+ addLookupEntries(obfuscatedToMojang, createClassSymbolRecord(obfuscatedClass), createClassSymbolRecord(mojangClass));
100
+ addLookupEntries(mojangToObfuscated, createClassSymbolRecord(mojangClass), createClassSymbolRecord(obfuscatedClass));
101
+ continue;
102
+ }
103
+ if (!currentClass) {
104
+ continue;
105
+ }
106
+ const arrowIndex = line.indexOf(" -> ");
107
+ if (arrowIndex < 0) {
108
+ continue;
109
+ }
110
+ const leftRaw = line.slice(0, arrowIndex).trim();
111
+ const rightRaw = line.slice(arrowIndex + 4).trim();
112
+ if (!leftRaw || !rightRaw) {
113
+ continue;
114
+ }
115
+ const mojangMemberSignature = stripLineInfo(leftRaw);
116
+ // Try method parsing with JVM descriptor
117
+ const obfuscatedMethod = parseProguardMethod(mojangMemberSignature, mojangToObfuscatedClass);
118
+ if (obfuscatedMethod) {
119
+ const mojangMethod = parseProguardMethod(mojangMemberSignature, undefined);
120
+ const obfuscatedDescriptor = obfuscatedMethod.descriptor;
121
+ const mojangDescriptor = mojangMethod?.descriptor;
122
+ addLookupEntries(obfuscatedToMojang, createMethodSymbolRecord(currentClass.obfuscated, rightRaw, obfuscatedDescriptor), createMethodSymbolRecord(currentClass.mojang, obfuscatedMethod.name, mojangDescriptor));
123
+ addLookupEntries(mojangToObfuscated, createMethodSymbolRecord(currentClass.mojang, obfuscatedMethod.name, mojangDescriptor), createMethodSymbolRecord(currentClass.obfuscated, rightRaw, obfuscatedDescriptor));
124
+ continue;
125
+ }
126
+ const fieldName = parseFieldName(mojangMemberSignature);
127
+ if (!fieldName) {
128
+ continue;
129
+ }
130
+ addLookupEntries(obfuscatedToMojang, createFieldSymbolRecord(currentClass.obfuscated, rightRaw), createFieldSymbolRecord(currentClass.mojang, fieldName));
131
+ addLookupEntries(mojangToObfuscated, createFieldSymbolRecord(currentClass.mojang, fieldName), createFieldSymbolRecord(currentClass.obfuscated, rightRaw));
132
+ }
133
+ const result = new Map();
134
+ result.set(pairKey("obfuscated", "mojang"), obfuscatedToMojang);
135
+ result.set(pairKey("mojang", "obfuscated"), mojangToObfuscated);
136
+ return result;
137
+ }
138
+ //# sourceMappingURL=proguard.js.map
@@ -0,0 +1,27 @@
1
+ import type { DirectionIndex, MappingSymbolRecord } from "../internal-types.js";
2
+ export declare function createDirectionIndex(): DirectionIndex;
3
+ export declare function addToSetMap(map: Map<string, Set<string>>, key: string, value: string): void;
4
+ export declare function normalizedVariants(symbol: string): string[];
5
+ export declare function simpleName(symbol: string): string | undefined;
6
+ export declare function normalizeMappedSymbolOutput(symbol: string): string;
7
+ export declare function splitOwnerAndName(symbol: string): {
8
+ owner: string;
9
+ name: string;
10
+ } | undefined;
11
+ export declare function stripLineInfo(input: string): string;
12
+ export declare function parseMethodName(value: string): string | undefined;
13
+ export declare function parseFieldName(value: string): string | undefined;
14
+ export declare function buildSymbolKey(record: MappingSymbolRecord): string;
15
+ export declare function classNameParts(classFqn: string): {
16
+ owner?: string;
17
+ name: string;
18
+ };
19
+ export declare function createClassSymbolRecord(className: string): MappingSymbolRecord;
20
+ export declare function createFieldSymbolRecord(owner: string, fieldName: string): MappingSymbolRecord;
21
+ export declare function createMethodSymbolRecord(owner: string, methodName: string, descriptor: string | undefined): MappingSymbolRecord;
22
+ export declare function parseInputSymbol(symbol: string): MappingSymbolRecord | undefined;
23
+ export declare function exactLookupKeys(record: MappingSymbolRecord): string[];
24
+ export declare function simpleLookupKeys(record: MappingSymbolRecord): string[];
25
+ export declare function registerRecord(index: DirectionIndex, record: MappingSymbolRecord): string;
26
+ export declare function addLookupEntries(index: DirectionIndex, fromRecord: MappingSymbolRecord, toRecord: MappingSymbolRecord): void;
27
+ export declare function mergeDirectionIndexes(target: DirectionIndex, source: DirectionIndex): void;
@@ -0,0 +1,216 @@
1
+ export function createDirectionIndex() {
2
+ return {
3
+ exact: new Map(),
4
+ normalized: new Map(),
5
+ simple: new Map(),
6
+ records: new Map()
7
+ };
8
+ }
9
+ export function addToSetMap(map, key, value) {
10
+ const normalizedKey = key.trim();
11
+ if (!normalizedKey) {
12
+ return;
13
+ }
14
+ const existing = map.get(normalizedKey) ?? new Set();
15
+ existing.add(value);
16
+ map.set(normalizedKey, existing);
17
+ }
18
+ export function normalizedVariants(symbol) {
19
+ const variants = [symbol];
20
+ let dotted;
21
+ if (symbol.includes("/")) {
22
+ dotted = symbol.replace(/\//g, ".");
23
+ if (dotted !== symbol) {
24
+ variants.push(dotted);
25
+ }
26
+ }
27
+ if (symbol.includes(".")) {
28
+ const slashed = symbol.replace(/\./g, "/");
29
+ if (slashed !== symbol && slashed !== dotted) {
30
+ variants.push(slashed);
31
+ }
32
+ }
33
+ return variants;
34
+ }
35
+ export function simpleName(symbol) {
36
+ const trimmed = symbol.trim();
37
+ if (!trimmed) {
38
+ return undefined;
39
+ }
40
+ const withoutDescriptor = trimmed.includes("(") ? trimmed.slice(0, trimmed.indexOf("(")) : trimmed;
41
+ const base = withoutDescriptor.split(/[./]/).at(-1)?.trim();
42
+ return base || undefined;
43
+ }
44
+ export function normalizeMappedSymbolOutput(symbol) {
45
+ return symbol.replace(/\//g, ".");
46
+ }
47
+ export function splitOwnerAndName(symbol) {
48
+ const trimmed = symbol.trim();
49
+ const separatorIndex = Math.max(trimmed.lastIndexOf("."), trimmed.lastIndexOf("/"));
50
+ if (separatorIndex <= 0 || separatorIndex >= trimmed.length - 1) {
51
+ return undefined;
52
+ }
53
+ return {
54
+ owner: trimmed.slice(0, separatorIndex),
55
+ name: trimmed.slice(separatorIndex + 1)
56
+ };
57
+ }
58
+ export function stripLineInfo(input) {
59
+ let value = input.trim();
60
+ while (/^\d+:\d+:/.test(value)) {
61
+ value = value.replace(/^\d+:\d+:/, "");
62
+ }
63
+ return value.replace(/:\d+:\d+$/, "").trim();
64
+ }
65
+ export function parseMethodName(value) {
66
+ const match = /^(.+?)\s+([^\s(]+)\((.*)\)$/.exec(value);
67
+ if (!match) {
68
+ return undefined;
69
+ }
70
+ return match[2]?.trim() || undefined;
71
+ }
72
+ export function parseFieldName(value) {
73
+ const match = /^(.+?)\s+([^\s]+)$/.exec(value);
74
+ if (!match) {
75
+ return undefined;
76
+ }
77
+ return match[2]?.trim() || undefined;
78
+ }
79
+ export function buildSymbolKey(record) {
80
+ return `${record.kind}|${record.owner ?? ""}|${record.name}|${record.descriptor ?? ""}`;
81
+ }
82
+ export function classNameParts(classFqn) {
83
+ const separatorIndex = classFqn.lastIndexOf(".");
84
+ if (separatorIndex <= 0 || separatorIndex >= classFqn.length - 1) {
85
+ return {
86
+ owner: undefined,
87
+ name: classFqn
88
+ };
89
+ }
90
+ return {
91
+ owner: classFqn.slice(0, separatorIndex),
92
+ name: classFqn.slice(separatorIndex + 1)
93
+ };
94
+ }
95
+ export function createClassSymbolRecord(className) {
96
+ const symbol = normalizeMappedSymbolOutput(className.trim());
97
+ const parts = classNameParts(symbol);
98
+ return {
99
+ kind: "class",
100
+ symbol,
101
+ owner: parts.owner,
102
+ name: parts.name
103
+ };
104
+ }
105
+ export function createFieldSymbolRecord(owner, fieldName) {
106
+ const normalizedOwner = normalizeMappedSymbolOutput(owner.trim());
107
+ const normalizedName = fieldName.trim();
108
+ return {
109
+ kind: "field",
110
+ symbol: `${normalizedOwner}.${normalizedName}`,
111
+ owner: normalizedOwner,
112
+ name: normalizedName
113
+ };
114
+ }
115
+ export function createMethodSymbolRecord(owner, methodName, descriptor) {
116
+ const normalizedOwner = normalizeMappedSymbolOutput(owner.trim());
117
+ const normalizedName = methodName.trim();
118
+ const normalizedDescriptor = descriptor?.trim() || undefined;
119
+ return {
120
+ kind: "method",
121
+ symbol: `${normalizedOwner}.${normalizedName}${normalizedDescriptor ?? ""}`,
122
+ owner: normalizedOwner,
123
+ name: normalizedName,
124
+ descriptor: normalizedDescriptor
125
+ };
126
+ }
127
+ export function parseInputSymbol(symbol) {
128
+ const trimmed = symbol.trim();
129
+ if (!trimmed || /\s/.test(trimmed)) {
130
+ return undefined;
131
+ }
132
+ const openIndex = trimmed.indexOf("(");
133
+ if (openIndex >= 0) {
134
+ const closeIndex = trimmed.indexOf(")", openIndex);
135
+ if (closeIndex < 0) {
136
+ return undefined;
137
+ }
138
+ const ownerAndMethod = splitOwnerAndName(trimmed.slice(0, openIndex));
139
+ if (!ownerAndMethod) {
140
+ return undefined;
141
+ }
142
+ const descriptor = trimmed.slice(openIndex);
143
+ return createMethodSymbolRecord(ownerAndMethod.owner, ownerAndMethod.name, descriptor);
144
+ }
145
+ const ownerAndName = splitOwnerAndName(trimmed);
146
+ if (!ownerAndName) {
147
+ return createClassSymbolRecord(trimmed);
148
+ }
149
+ if (/^[A-Z$]/.test(ownerAndName.name)) {
150
+ return createClassSymbolRecord(trimmed);
151
+ }
152
+ return createFieldSymbolRecord(ownerAndName.owner, ownerAndName.name);
153
+ }
154
+ export function exactLookupKeys(record) {
155
+ const keys = new Set([record.symbol]);
156
+ if (record.kind === "method" && record.owner && record.descriptor) {
157
+ keys.add(`${record.owner}.${record.name}`);
158
+ }
159
+ return [...keys];
160
+ }
161
+ export function simpleLookupKeys(record) {
162
+ if (record.kind === "class") {
163
+ return [record.name];
164
+ }
165
+ if (record.kind === "field") {
166
+ return [record.name];
167
+ }
168
+ if (record.descriptor) {
169
+ return [record.name, `${record.name}${record.descriptor}`];
170
+ }
171
+ return [record.name];
172
+ }
173
+ export function registerRecord(index, record) {
174
+ const key = buildSymbolKey(record);
175
+ if (!index.records.has(key)) {
176
+ index.records.set(key, record);
177
+ }
178
+ return key;
179
+ }
180
+ export function addLookupEntries(index, fromRecord, toRecord) {
181
+ if (!fromRecord.symbol || !toRecord.symbol) {
182
+ return;
183
+ }
184
+ const targetKey = registerRecord(index, toRecord);
185
+ for (const key of exactLookupKeys(fromRecord)) {
186
+ addToSetMap(index.exact, key, targetKey);
187
+ for (const variant of normalizedVariants(key)) {
188
+ if (variant !== key) {
189
+ addToSetMap(index.normalized, variant, targetKey);
190
+ }
191
+ }
192
+ }
193
+ for (const key of simpleLookupKeys(fromRecord)) {
194
+ addToSetMap(index.simple, key, targetKey);
195
+ }
196
+ }
197
+ export function mergeDirectionIndexes(target, source) {
198
+ const mergeMap = (targetMap, sourceMap) => {
199
+ for (const [key, values] of sourceMap.entries()) {
200
+ const existing = targetMap.get(key) ?? new Set();
201
+ for (const value of values) {
202
+ existing.add(value);
203
+ }
204
+ targetMap.set(key, existing);
205
+ }
206
+ };
207
+ mergeMap(target.exact, source.exact);
208
+ mergeMap(target.normalized, source.normalized);
209
+ mergeMap(target.simple, source.simple);
210
+ for (const [key, value] of source.records.entries()) {
211
+ if (!target.records.has(key)) {
212
+ target.records.set(key, value);
213
+ }
214
+ }
215
+ }
216
+ //# sourceMappingURL=symbol-records.js.map
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tiny v2 mapping format parser. Pure; extracted from
3
+ * `src/mapping-service.ts`.
4
+ */
5
+ import type { SourceMapping } from "../../types.js";
6
+ import type { DirectionIndex, MappingSymbolRecord, PairKey } from "../internal-types.js";
7
+ export declare function normalizeTinyNamespace(namespace: string): SourceMapping | undefined;
8
+ export declare function addPairRecords(target: Map<PairKey, DirectionIndex>, records: Map<SourceMapping, MappingSymbolRecord>): void;
9
+ export declare function parseTinyMappings(text: string): Map<PairKey, DirectionIndex>;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Tiny v2 mapping format parser. Pure; extracted from
3
+ * `src/mapping-service.ts`.
4
+ */
5
+ import { addLookupEntries, createClassSymbolRecord, createFieldSymbolRecord, createMethodSymbolRecord } from "./symbol-records.js";
6
+ import { ensurePairIndex } from "./normalize.js";
7
+ export function normalizeTinyNamespace(namespace) {
8
+ const normalized = namespace.trim().toLowerCase();
9
+ if (normalized === "obfuscated" || normalized === "official") {
10
+ return "obfuscated";
11
+ }
12
+ if (normalized === "mojang") {
13
+ return "mojang";
14
+ }
15
+ if (normalized === "intermediary") {
16
+ return "intermediary";
17
+ }
18
+ if (normalized === "named" || normalized === "yarn") {
19
+ return "yarn";
20
+ }
21
+ return undefined;
22
+ }
23
+ export function addPairRecords(target, records) {
24
+ for (const [sourceMapping, sourceRecord] of records.entries()) {
25
+ for (const [targetMapping, targetRecord] of records.entries()) {
26
+ if (sourceMapping === targetMapping) {
27
+ continue;
28
+ }
29
+ addLookupEntries(ensurePairIndex(target, sourceMapping, targetMapping), sourceRecord, targetRecord);
30
+ }
31
+ }
32
+ }
33
+ export function parseTinyMappings(text) {
34
+ const lines = text.split(/\r?\n/).filter((line) => line.trim().length > 0);
35
+ if (lines.length === 0) {
36
+ return new Map();
37
+ }
38
+ const header = lines[0].split("\t");
39
+ if (header.length < 5 || header[0] !== "tiny" || header[1] !== "2") {
40
+ return new Map();
41
+ }
42
+ const namespaceColumns = header.slice(3).map((namespace, index) => ({
43
+ mapping: normalizeTinyNamespace(namespace),
44
+ columnIndex: index + 1
45
+ }));
46
+ const recognized = namespaceColumns.filter((entry) => entry.mapping != null);
47
+ if (recognized.length < 2) {
48
+ return new Map();
49
+ }
50
+ const result = new Map();
51
+ const currentClassNames = new Map();
52
+ for (const line of lines.slice(1)) {
53
+ const columns = line.split("\t");
54
+ if (columns[0] === "c") {
55
+ const classRecords = new Map();
56
+ for (const namespace of recognized) {
57
+ const value = columns[namespace.columnIndex]?.trim() ?? "";
58
+ if (!value) {
59
+ continue;
60
+ }
61
+ currentClassNames.set(namespace.mapping, value);
62
+ classRecords.set(namespace.mapping, createClassSymbolRecord(value));
63
+ }
64
+ addPairRecords(result, classRecords);
65
+ continue;
66
+ }
67
+ if (columns[0] === "" && columns[1] === "f") {
68
+ const fieldRecords = new Map();
69
+ for (const namespace of recognized) {
70
+ const owner = currentClassNames.get(namespace.mapping);
71
+ const value = columns[namespace.columnIndex + 2]?.trim() ?? "";
72
+ if (!owner || !value) {
73
+ continue;
74
+ }
75
+ fieldRecords.set(namespace.mapping, createFieldSymbolRecord(owner, value));
76
+ }
77
+ addPairRecords(result, fieldRecords);
78
+ continue;
79
+ }
80
+ if (columns[0] === "" && columns[1] === "m") {
81
+ const descriptor = columns[2]?.trim() || undefined;
82
+ const methodRecords = new Map();
83
+ for (const namespace of recognized) {
84
+ const owner = currentClassNames.get(namespace.mapping);
85
+ const value = columns[namespace.columnIndex + 2]?.trim() ?? "";
86
+ if (!owner || !value) {
87
+ continue;
88
+ }
89
+ methodRecords.set(namespace.mapping, createMethodSymbolRecord(owner, value, descriptor));
90
+ }
91
+ addPairRecords(result, methodRecords);
92
+ }
93
+ }
94
+ return result;
95
+ }
96
+ //# sourceMappingURL=tiny.js.map
@@ -0,0 +1,147 @@
1
+ import type { MappingSourcePriority, SourceMapping } from "../types.js";
2
+ import type { MappingLookupSource, MappingSymbolKind } from "./internal-types.js";
3
+ export type MappingMatchKind = "exact" | "normalized" | "simple-name";
4
+ export type MappingLookupCandidate = {
5
+ symbol: string;
6
+ matchKind: MappingMatchKind;
7
+ confidence: number;
8
+ kind: MappingSymbolKind;
9
+ owner?: string;
10
+ name: string;
11
+ descriptor?: string;
12
+ };
13
+ export type MappingLookupProvenance = {
14
+ source: MappingLookupSource;
15
+ mappingArtifact: string;
16
+ version: string;
17
+ priority: MappingSourcePriority;
18
+ };
19
+ export type SymbolQueryKind = MappingSymbolKind;
20
+ export type SymbolQueryInput = {
21
+ kind: SymbolQueryKind;
22
+ name: string;
23
+ owner?: string;
24
+ descriptor?: string;
25
+ };
26
+ export type SymbolReference = {
27
+ kind: SymbolQueryKind;
28
+ name: string;
29
+ owner?: string;
30
+ descriptor?: string;
31
+ symbol: string;
32
+ };
33
+ export type SymbolResolutionStatus = "resolved" | "not_found" | "ambiguous" | "mapping_unavailable";
34
+ export type SymbolResolutionOutput = {
35
+ querySymbol: SymbolReference;
36
+ mappingContext: {
37
+ version: string;
38
+ sourceMapping: SourceMapping;
39
+ targetMapping?: SourceMapping;
40
+ sourcePriorityApplied: MappingSourcePriority;
41
+ };
42
+ resolved: boolean;
43
+ status: SymbolResolutionStatus;
44
+ resolvedSymbol?: SymbolReference;
45
+ candidates: Array<SymbolReference & Pick<MappingLookupCandidate, "matchKind" | "confidence">>;
46
+ candidateCount: number;
47
+ candidatesTruncated?: boolean;
48
+ warnings: string[];
49
+ provenance?: MappingLookupProvenance;
50
+ ambiguityReasons?: string[];
51
+ };
52
+ export type FindMappingInput = {
53
+ version: string;
54
+ kind: SymbolQueryKind;
55
+ name: string;
56
+ owner?: string;
57
+ descriptor?: string;
58
+ signatureMode?: "exact" | "name-only";
59
+ sourceMapping: SourceMapping;
60
+ targetMapping: SourceMapping;
61
+ sourcePriority?: MappingSourcePriority;
62
+ projectPath?: string;
63
+ disambiguation?: {
64
+ ownerHint?: string;
65
+ descriptorHint?: string;
66
+ };
67
+ maxCandidates?: number;
68
+ };
69
+ export type FindMappingOutput = SymbolResolutionOutput;
70
+ export type EnsureMappingAvailableInput = {
71
+ version: string;
72
+ sourceMapping: SourceMapping;
73
+ targetMapping: SourceMapping;
74
+ sourcePriority?: MappingSourcePriority;
75
+ projectPath?: string;
76
+ };
77
+ export type EnsureMappingAvailableOutput = {
78
+ transformChain: string[];
79
+ warnings: string[];
80
+ provenance?: MappingLookupProvenance;
81
+ };
82
+ export type ResolveMethodMappingExactInput = {
83
+ version: string;
84
+ name: string;
85
+ owner: string;
86
+ descriptor: string;
87
+ sourceMapping: SourceMapping;
88
+ targetMapping: SourceMapping;
89
+ sourcePriority?: MappingSourcePriority;
90
+ projectPath?: string;
91
+ maxCandidates?: number;
92
+ };
93
+ export type ResolveMethodMappingExactOutput = SymbolResolutionOutput;
94
+ export type ClassApiMatrixKind = "class" | "field" | "method";
95
+ export type ClassApiMatrixInput = {
96
+ version: string;
97
+ className: string;
98
+ classNameMapping: SourceMapping;
99
+ sourcePriority?: MappingSourcePriority;
100
+ includeKinds?: ClassApiMatrixKind[];
101
+ maxRows?: number;
102
+ };
103
+ export type ClassApiMatrixEntry = {
104
+ symbol: string;
105
+ owner?: string;
106
+ name: string;
107
+ descriptor?: string;
108
+ };
109
+ export type ClassApiMatrixRow = {
110
+ kind: ClassApiMatrixKind;
111
+ descriptor?: string;
112
+ obfuscated?: ClassApiMatrixEntry;
113
+ mojang?: ClassApiMatrixEntry;
114
+ intermediary?: ClassApiMatrixEntry;
115
+ yarn?: ClassApiMatrixEntry;
116
+ completeness: boolean;
117
+ };
118
+ export type ClassApiMatrixOutput = {
119
+ version: string;
120
+ className: string;
121
+ classNameMapping: SourceMapping;
122
+ classIdentity: Partial<Record<SourceMapping, string>>;
123
+ rows: ClassApiMatrixRow[];
124
+ rowCount: number;
125
+ rowsTruncated?: boolean;
126
+ warnings: string[];
127
+ ambiguousRowCount?: number;
128
+ };
129
+ export type SymbolExistenceInput = {
130
+ version: string;
131
+ kind: SymbolQueryKind;
132
+ name: string;
133
+ owner?: string;
134
+ descriptor?: string;
135
+ sourceMapping: SourceMapping;
136
+ sourcePriority?: MappingSourcePriority;
137
+ nameMode?: "fqcn" | "auto";
138
+ signatureMode?: "exact" | "name-only";
139
+ maxCandidates?: number;
140
+ };
141
+ export type SymbolExistenceOutput = SymbolResolutionOutput;
142
+ export type ResolutionCandidate = SymbolReference & Pick<MappingLookupCandidate, "matchKind" | "confidence">;
143
+ export type DescriptorProjection = {
144
+ descriptor: string;
145
+ hadClassReferences: boolean;
146
+ complete: boolean;
147
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -1,3 +1,4 @@
1
+ import { buildSuggestedCall } from "./build-suggested-call.js";
1
2
  import { createError, ERROR_CODES } from "./errors.js";
2
3
  /**
3
4
  * Mapping pipeline for v0.3.
@@ -74,13 +75,13 @@ export function applyMappingPipeline(input) {
74
75
  binaryJarPath: input.resolved.binaryJarPath,
75
76
  sourceJarPath: input.resolved.sourceJarPath,
76
77
  nextAction: "Provide a source-backed artifact (source jar) or use mapping=obfuscated.",
77
- suggestedCall: {
78
+ ...buildSuggestedCall({
78
79
  tool: "resolve-artifact",
79
80
  params: {
80
81
  target: input.target,
81
82
  mapping: "obfuscated"
82
83
  }
83
- }
84
+ })
84
85
  }
85
86
  });
86
87
  }