@adhisang/minecraft-modding-mcp 3.2.0 → 4.1.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 (194) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +52 -32
  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 +59 -7
  7. package/dist/config.d.ts +10 -1
  8. package/dist/config.js +52 -1
  9. package/dist/entry-tools/analyze-symbol-service.d.ts +18 -18
  10. package/dist/entry-tools/analyze-symbol-service.js +13 -2
  11. package/dist/entry-tools/batch-class-members-service.d.ts +34 -0
  12. package/dist/entry-tools/batch-class-members-service.js +97 -0
  13. package/dist/entry-tools/batch-class-source-service.d.ts +37 -0
  14. package/dist/entry-tools/batch-class-source-service.js +100 -0
  15. package/dist/entry-tools/batch-mappings-service.d.ts +36 -0
  16. package/dist/entry-tools/batch-mappings-service.js +66 -0
  17. package/dist/entry-tools/batch-runner.d.ts +72 -0
  18. package/dist/entry-tools/batch-runner.js +90 -0
  19. package/dist/entry-tools/batch-symbol-exists-service.d.ts +46 -0
  20. package/dist/entry-tools/batch-symbol-exists-service.js +113 -0
  21. package/dist/entry-tools/compare-minecraft-service.d.ts +6 -6
  22. package/dist/entry-tools/inspect-minecraft/handlers/artifact.d.ts +5 -0
  23. package/dist/entry-tools/inspect-minecraft/handlers/artifact.js +83 -0
  24. package/dist/entry-tools/inspect-minecraft/handlers/class-members.d.ts +6 -0
  25. package/dist/entry-tools/inspect-minecraft/handlers/class-members.js +80 -0
  26. package/dist/entry-tools/inspect-minecraft/handlers/class-overview.d.ts +5 -0
  27. package/dist/entry-tools/inspect-minecraft/handlers/class-overview.js +248 -0
  28. package/dist/entry-tools/inspect-minecraft/handlers/class-source.d.ts +5 -0
  29. package/dist/entry-tools/inspect-minecraft/handlers/class-source.js +60 -0
  30. package/dist/entry-tools/inspect-minecraft/handlers/file.d.ts +5 -0
  31. package/dist/entry-tools/inspect-minecraft/handlers/file.js +54 -0
  32. package/dist/entry-tools/inspect-minecraft/handlers/list-files.d.ts +5 -0
  33. package/dist/entry-tools/inspect-minecraft/handlers/list-files.js +100 -0
  34. package/dist/entry-tools/inspect-minecraft/handlers/search.d.ts +5 -0
  35. package/dist/entry-tools/inspect-minecraft/handlers/search.js +155 -0
  36. package/dist/entry-tools/inspect-minecraft/handlers/versions.d.ts +6 -0
  37. package/dist/entry-tools/inspect-minecraft/handlers/versions.js +49 -0
  38. package/dist/entry-tools/inspect-minecraft/internal.d.ts +1042 -0
  39. package/dist/entry-tools/inspect-minecraft/internal.js +448 -0
  40. package/dist/entry-tools/inspect-minecraft-service.d.ts +213 -328
  41. package/dist/entry-tools/inspect-minecraft-service.js +20 -1238
  42. package/dist/entry-tools/manage-cache-service.d.ts +16 -16
  43. package/dist/entry-tools/validate-project/cases/access-transformer.d.ts +6 -0
  44. package/dist/entry-tools/validate-project/cases/access-transformer.js +106 -0
  45. package/dist/entry-tools/validate-project/cases/access-widener.d.ts +6 -0
  46. package/dist/entry-tools/validate-project/cases/access-widener.js +86 -0
  47. package/dist/entry-tools/validate-project/cases/mixin.d.ts +6 -0
  48. package/dist/entry-tools/validate-project/cases/mixin.js +90 -0
  49. package/dist/entry-tools/validate-project/cases/project-summary.d.ts +97 -0
  50. package/dist/entry-tools/validate-project/cases/project-summary.js +346 -0
  51. package/dist/entry-tools/validate-project/internal.d.ts +135 -0
  52. package/dist/entry-tools/validate-project/internal.js +287 -0
  53. package/dist/entry-tools/validate-project-service.d.ts +63 -47
  54. package/dist/entry-tools/validate-project-service.js +12 -482
  55. package/dist/entry-tools/verify-mixin-target-service.d.ts +133 -0
  56. package/dist/entry-tools/verify-mixin-target-service.js +323 -0
  57. package/dist/error-mapping.d.ts +40 -0
  58. package/dist/error-mapping.js +139 -0
  59. package/dist/errors.d.ts +6 -0
  60. package/dist/errors.js +6 -0
  61. package/dist/index.d.ts +2 -0
  62. package/dist/index.js +170 -1314
  63. package/dist/lru-list.d.ts +31 -0
  64. package/dist/lru-list.js +102 -0
  65. package/dist/mapping/internal-types.d.ts +54 -0
  66. package/dist/mapping/internal-types.js +14 -0
  67. package/dist/mapping/loaders/mojang.d.ts +2 -0
  68. package/dist/mapping/loaders/mojang.js +64 -0
  69. package/dist/mapping/loaders/tiny-loom.d.ts +2 -0
  70. package/dist/mapping/loaders/tiny-loom.js +73 -0
  71. package/dist/mapping/loaders/tiny-maven.d.ts +2 -0
  72. package/dist/mapping/loaders/tiny-maven.js +104 -0
  73. package/dist/mapping/loaders/types.d.ts +14 -0
  74. package/dist/mapping/loaders/types.js +2 -0
  75. package/dist/mapping/lookup.d.ts +52 -0
  76. package/dist/mapping/lookup.js +496 -0
  77. package/dist/mapping/parsers/normalize.d.ts +10 -0
  78. package/dist/mapping/parsers/normalize.js +52 -0
  79. package/dist/mapping/parsers/proguard.d.ts +20 -0
  80. package/dist/mapping/parsers/proguard.js +138 -0
  81. package/dist/mapping/parsers/symbol-records.d.ts +27 -0
  82. package/dist/mapping/parsers/symbol-records.js +216 -0
  83. package/dist/mapping/parsers/tiny.d.ts +9 -0
  84. package/dist/mapping/parsers/tiny.js +96 -0
  85. package/dist/mapping/types.d.ts +147 -0
  86. package/dist/mapping/types.js +2 -0
  87. package/dist/mapping-pipeline-service.d.ts +10 -1
  88. package/dist/mapping-pipeline-service.js +16 -3
  89. package/dist/mapping-service.d.ts +15 -144
  90. package/dist/mapping-service.js +179 -1119
  91. package/dist/mixin/access-validators.d.ts +9 -0
  92. package/dist/mixin/access-validators.js +257 -0
  93. package/dist/mixin/annotation-validators.d.ts +5 -0
  94. package/dist/mixin/annotation-validators.js +162 -0
  95. package/dist/mixin/helpers.d.ts +28 -0
  96. package/dist/mixin/helpers.js +315 -0
  97. package/dist/mixin/parsed-validator.d.ts +8 -0
  98. package/dist/mixin/parsed-validator.js +337 -0
  99. package/dist/mixin/types.d.ts +208 -0
  100. package/dist/mixin/types.js +28 -0
  101. package/dist/mixin-validator.d.ts +9 -201
  102. package/dist/mixin-validator.js +8 -1005
  103. package/dist/observability.d.ts +18 -1
  104. package/dist/observability.js +44 -1
  105. package/dist/response-utils.d.ts +44 -10
  106. package/dist/response-utils.js +131 -17
  107. package/dist/source/access-validate.d.ts +4 -0
  108. package/dist/source/access-validate.js +254 -0
  109. package/dist/source/artifact-resolver.d.ts +110 -0
  110. package/dist/source/artifact-resolver.js +1174 -0
  111. package/dist/source/cache-metrics.d.ts +26 -0
  112. package/dist/source/cache-metrics.js +172 -0
  113. package/dist/source/class-source/members-builder.d.ts +34 -0
  114. package/dist/source/class-source/members-builder.js +46 -0
  115. package/dist/source/class-source/snippet-builder.d.ts +19 -0
  116. package/dist/source/class-source/snippet-builder.js +46 -0
  117. package/dist/source/class-source-helpers.d.ts +34 -0
  118. package/dist/source/class-source-helpers.js +140 -0
  119. package/dist/source/class-source.d.ts +42 -0
  120. package/dist/source/class-source.js +883 -0
  121. package/dist/source/descriptor-utils.d.ts +6 -0
  122. package/dist/source/descriptor-utils.js +37 -0
  123. package/dist/source/file-access.d.ts +4 -0
  124. package/dist/source/file-access.js +102 -0
  125. package/dist/source/indexer.d.ts +82 -0
  126. package/dist/source/indexer.js +505 -0
  127. package/dist/source/lifecycle/diff-utils.d.ts +9 -0
  128. package/dist/source/lifecycle/diff-utils.js +107 -0
  129. package/dist/source/lifecycle/diff.d.ts +2 -0
  130. package/dist/source/lifecycle/diff.js +265 -0
  131. package/dist/source/lifecycle/mapping-helpers.d.ts +22 -0
  132. package/dist/source/lifecycle/mapping-helpers.js +327 -0
  133. package/dist/source/lifecycle/runtime-check.d.ts +2 -0
  134. package/dist/source/lifecycle/runtime-check.js +142 -0
  135. package/dist/source/lifecycle/trace.d.ts +2 -0
  136. package/dist/source/lifecycle/trace.js +231 -0
  137. package/dist/source/lifecycle.d.ts +4 -0
  138. package/dist/source/lifecycle.js +5 -0
  139. package/dist/source/search.d.ts +51 -0
  140. package/dist/source/search.js +676 -0
  141. package/dist/source/shared-utils.d.ts +6 -0
  142. package/dist/source/shared-utils.js +55 -0
  143. package/dist/source/state.d.ts +21 -0
  144. package/dist/source/state.js +19 -0
  145. package/dist/source/symbol-resolver.d.ts +3 -0
  146. package/dist/source/symbol-resolver.js +212 -0
  147. package/dist/source/validate-mixin/pipeline/mapping-health.d.ts +3 -0
  148. package/dist/source/validate-mixin/pipeline/mapping-health.js +41 -0
  149. package/dist/source/validate-mixin/pipeline/parse.d.ts +2 -0
  150. package/dist/source/validate-mixin/pipeline/parse.js +10 -0
  151. package/dist/source/validate-mixin/pipeline/resolve.d.ts +3 -0
  152. package/dist/source/validate-mixin/pipeline/resolve.js +78 -0
  153. package/dist/source/validate-mixin/pipeline/target-lookup.d.ts +6 -0
  154. package/dist/source/validate-mixin/pipeline/target-lookup.js +260 -0
  155. package/dist/source/validate-mixin/pipeline-context.d.ts +72 -0
  156. package/dist/source/validate-mixin/pipeline-context.js +93 -0
  157. package/dist/source/validate-mixin.d.ts +22 -0
  158. package/dist/source/validate-mixin.js +799 -0
  159. package/dist/source/workspace-target.d.ts +18 -0
  160. package/dist/source/workspace-target.js +305 -0
  161. package/dist/source-resolver.d.ts +9 -1
  162. package/dist/source-resolver.js +14 -6
  163. package/dist/source-service.d.ts +178 -105
  164. package/dist/source-service.js +72 -5312
  165. package/dist/stage-emitter.d.ts +13 -0
  166. package/dist/stage-emitter.js +30 -0
  167. package/dist/stdio-supervisor.d.ts +61 -0
  168. package/dist/stdio-supervisor.js +326 -9
  169. package/dist/storage/artifacts-repo.d.ts +4 -1
  170. package/dist/storage/artifacts-repo.js +33 -5
  171. package/dist/storage/files-repo.d.ts +0 -2
  172. package/dist/storage/files-repo.js +0 -11
  173. package/dist/storage/migrations.d.ts +1 -1
  174. package/dist/storage/migrations.js +10 -2
  175. package/dist/storage/schema.d.ts +2 -0
  176. package/dist/storage/schema.js +25 -0
  177. package/dist/tool-contract-manifest.d.ts +1 -1
  178. package/dist/tool-contract-manifest.js +23 -6
  179. package/dist/tool-guidance.d.ts +82 -0
  180. package/dist/tool-guidance.js +734 -0
  181. package/dist/tool-schema-registry.d.ts +16 -0
  182. package/dist/tool-schema-registry.js +37 -0
  183. package/dist/tool-schemas.d.ts +3518 -0
  184. package/dist/tool-schemas.js +813 -0
  185. package/dist/types.d.ts +39 -0
  186. package/dist/version-service.js +7 -6
  187. package/dist/workspace-context-cache.d.ts +32 -0
  188. package/dist/workspace-context-cache.js +66 -0
  189. package/dist/workspace-mapping-service.d.ts +16 -0
  190. package/dist/workspace-mapping-service.js +173 -1
  191. package/docs/README-ja.md +414 -0
  192. package/docs/examples.md +483 -0
  193. package/docs/tool-reference.md +459 -0
  194. package/package.json +5 -2
@@ -0,0 +1,60 @@
1
+ import { buildEntryToolResult, createSummarySubject } from "../../response-contract.js";
2
+ import { buildClassSubject, resolveClassArtifactReference, invalidTaskSubjectError } from "../internal.js";
3
+ export async function handleClassSource(deps, subject, detail, include) {
4
+ if (subject.kind !== "class" && !(subject.kind === "workspace" && subject.focus?.kind === "class")) {
5
+ invalidTaskSubjectError("class-source", subject);
6
+ }
7
+ const classSubject = buildClassSubject(subject);
8
+ const className = classSubject.className;
9
+ const artifactContext = await resolveClassArtifactReference(deps, subject, classSubject, "class-source");
10
+ const source = await deps.getClassSource({
11
+ className,
12
+ artifactId: artifactContext.artifactId || undefined,
13
+ mapping: classSubject.mapping,
14
+ scope: classSubject.scope,
15
+ projectPath: classSubject.projectPath,
16
+ preferProjectVersion: classSubject.preferProjectVersion,
17
+ strictVersion: classSubject.strictVersion,
18
+ mode: include.includes("source") || detail === "full" ? "snippet" : "metadata"
19
+ });
20
+ const summary = {
21
+ status: "ok",
22
+ headline: `Resolved source for ${source.className}.`,
23
+ subject: createSummarySubject({
24
+ task: "class-source",
25
+ requested: subject,
26
+ className: source.className,
27
+ artifactId: source.artifactId
28
+ }),
29
+ counts: {
30
+ totalLines: source.totalLines
31
+ }
32
+ };
33
+ return {
34
+ ...buildEntryToolResult({
35
+ task: "class-source",
36
+ summary,
37
+ detail,
38
+ include,
39
+ blocks: {
40
+ subject: {
41
+ requested: subject,
42
+ resolved: {
43
+ artifactId: source.artifactId,
44
+ className: source.className
45
+ }
46
+ },
47
+ source: {
48
+ className: source.className,
49
+ mode: source.mode,
50
+ returnedRange: source.returnedRange,
51
+ totalLines: source.totalLines,
52
+ sourceText: source.sourceText
53
+ }
54
+ },
55
+ alwaysBlocks: ["subject"]
56
+ }),
57
+ warnings: [...artifactContext.warnings, ...source.warnings]
58
+ };
59
+ }
60
+ //# sourceMappingURL=class-source.js.map
@@ -0,0 +1,5 @@
1
+ import { type DetailLevel } from "../../response-contract.js";
2
+ import { type Subject, type InspectMinecraftDeps } from "../internal.js";
3
+ export declare function handleFile(deps: InspectMinecraftDeps, subject: Subject, detail: DetailLevel, include: string[]): Promise<{
4
+ warnings: string[];
5
+ }>;
@@ -0,0 +1,54 @@
1
+ import { buildEntryToolResult, createSummarySubject } from "../../response-contract.js";
2
+ import { requireWorkspaceFileFocus, resolveWorkspaceArtifactReference, invalidTaskSubjectError, resolveArtifactReference } from "../internal.js";
3
+ export async function handleFile(deps, subject, detail, include) {
4
+ if (subject.kind !== "file" && !(subject.kind === "workspace" && subject.focus?.kind === "file")) {
5
+ invalidTaskSubjectError("file", subject);
6
+ }
7
+ const fileSubject = subject.kind === "file" ? subject : requireWorkspaceFileFocus(subject);
8
+ const artifact = subject.kind === "file"
9
+ ? await resolveArtifactReference(deps, subject, "file")
10
+ : await resolveWorkspaceArtifactReference(deps, subject, fileSubject.artifact);
11
+ const file = await deps.getArtifactFile({
12
+ artifactId: artifact.artifactId,
13
+ filePath: fileSubject.filePath
14
+ });
15
+ const summary = {
16
+ status: "ok",
17
+ headline: `Read ${file.filePath}.`,
18
+ subject: createSummarySubject({
19
+ task: "file",
20
+ requested: subject,
21
+ filePath: file.filePath,
22
+ artifactId: artifact.artifactId
23
+ }),
24
+ counts: {
25
+ bytes: file.contentBytes
26
+ }
27
+ };
28
+ return {
29
+ ...buildEntryToolResult({
30
+ task: "file",
31
+ summary,
32
+ detail,
33
+ include,
34
+ blocks: {
35
+ subject: {
36
+ requested: subject,
37
+ resolved: {
38
+ artifactId: artifact.artifactId,
39
+ filePath: file.filePath
40
+ }
41
+ },
42
+ file: {
43
+ filePath: file.filePath,
44
+ contentBytes: file.contentBytes,
45
+ truncated: file.truncated,
46
+ content: include.includes("source") || detail !== "summary" ? file.content : undefined
47
+ }
48
+ },
49
+ alwaysBlocks: ["subject"]
50
+ }),
51
+ warnings: [...artifact.warnings]
52
+ };
53
+ }
54
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1,5 @@
1
+ import { type DetailLevel } from "../../response-contract.js";
2
+ import { type Subject, type InspectMinecraftDeps } from "../internal.js";
3
+ export declare function handleListFiles(deps: InspectMinecraftDeps, subject: Subject, detail: DetailLevel, include: string[], limit: number | undefined, cursor: string | undefined): Promise<{
4
+ warnings: string[];
5
+ }>;
@@ -0,0 +1,100 @@
1
+ import { buildEntryToolResult, createNextAction, createSummarySubject } from "../../response-contract.js";
2
+ import { capArray, nextActionsOrUndefined } from "../../request-normalizers.js";
3
+ import { hasPartialVanillaCoverage, resolveArtifactReference } from "../internal.js";
4
+ export async function handleListFiles(deps, subject, detail, include, limit, cursor) {
5
+ const artifact = await resolveArtifactReference(deps, subject, "list-files");
6
+ const files = await deps.listArtifactFiles({
7
+ artifactId: artifact.artifactId,
8
+ limit,
9
+ cursor
10
+ });
11
+ const sampled = capArray(files.items, 10);
12
+ const partialCoverage = subject.kind === "workspace" && hasPartialVanillaCoverage(artifact.artifact);
13
+ const nextActions = [
14
+ ...(files.items.length > 0
15
+ ? [
16
+ createNextAction("inspect-minecraft", {
17
+ task: "file",
18
+ subject: {
19
+ kind: "file",
20
+ filePath: files.items[0],
21
+ artifact: {
22
+ type: "resolved-id",
23
+ artifactId: artifact.artifactId
24
+ }
25
+ }
26
+ })
27
+ ]
28
+ : []),
29
+ ...(partialCoverage
30
+ ? [
31
+ createNextAction("inspect-minecraft", {
32
+ task: "class-source",
33
+ subject: {
34
+ kind: "workspace",
35
+ projectPath: subject.projectPath,
36
+ mapping: subject.mapping,
37
+ scope: subject.scope,
38
+ preferProjectVersion: subject.preferProjectVersion,
39
+ strictVersion: subject.strictVersion,
40
+ focus: {
41
+ kind: "class",
42
+ className: "net.minecraft.world.item.Item"
43
+ }
44
+ }
45
+ })
46
+ ]
47
+ : [])
48
+ ];
49
+ const summary = {
50
+ status: partialCoverage ? "partial" : "ok",
51
+ headline: `Listed ${files.items.length} files for ${artifact.artifactId}.`,
52
+ subject: createSummarySubject({
53
+ task: "list-files",
54
+ requested: subject,
55
+ artifactId: artifact.artifactId
56
+ }),
57
+ counts: {
58
+ files: files.items.length
59
+ },
60
+ nextActions: nextActionsOrUndefined(nextActions),
61
+ ...(partialCoverage
62
+ ? {
63
+ notes: [
64
+ "This listing is partial because the resolved source artifact does not contain net.minecraft entries."
65
+ ]
66
+ }
67
+ : {})
68
+ };
69
+ return {
70
+ ...buildEntryToolResult({
71
+ task: "list-files",
72
+ summary,
73
+ detail,
74
+ include,
75
+ blocks: {
76
+ subject: {
77
+ requested: subject,
78
+ resolved: {
79
+ artifactId: artifact.artifactId
80
+ }
81
+ },
82
+ files: {
83
+ items: detail === "summary" ? sampled.items : files.items,
84
+ nextCursor: files.nextCursor,
85
+ ...(partialCoverage
86
+ ? {
87
+ coverage: {
88
+ sourceCoverage: "partial",
89
+ missingNamespaces: ["net.minecraft"]
90
+ }
91
+ }
92
+ : {})
93
+ }
94
+ },
95
+ alwaysBlocks: ["subject"]
96
+ }),
97
+ warnings: [...artifact.warnings, ...files.warnings]
98
+ };
99
+ }
100
+ //# sourceMappingURL=list-files.js.map
@@ -0,0 +1,5 @@
1
+ import { type DetailLevel } from "../../response-contract.js";
2
+ import { type Subject, type InspectMinecraftDeps } from "../internal.js";
3
+ export declare function handleSearch(deps: InspectMinecraftDeps, subject: Subject, detail: DetailLevel, include: string[], limit: number | undefined, cursor: string | undefined): Promise<{
4
+ warnings: string[];
5
+ }>;
@@ -0,0 +1,155 @@
1
+ import { buildEntryToolResult, createNextAction, createSummarySubject } from "../../response-contract.js";
2
+ import { capArray, nextActionsOrUndefined } from "../../request-normalizers.js";
3
+ import { classNameToFilePath, hasPartialVanillaCoverage, hitTargetsVanillaNamespace, looksLikeClassQuery, requireWorkspaceSearchFocus, resolveWorkspaceArtifactReference, summarizeRequestedSubject, invalidTaskSubjectError, resolveBinaryBackedClass, resolveArtifactReference } from "../internal.js";
4
+ export async function handleSearch(deps, subject, detail, include, limit, cursor) {
5
+ if (subject.kind !== "search" && !(subject.kind === "workspace" && subject.focus?.kind === "search")) {
6
+ invalidTaskSubjectError("search", subject);
7
+ }
8
+ const searchSubject = subject.kind === "search" ? subject : requireWorkspaceSearchFocus(subject);
9
+ const requestedSubject = summarizeRequestedSubject(subject);
10
+ const queryMode = searchSubject.queryMode ?? "auto";
11
+ const artifact = subject.kind === "search"
12
+ ? await resolveArtifactReference(deps, subject, "search")
13
+ : await resolveWorkspaceArtifactReference(deps, subject, searchSubject.artifact);
14
+ const search = await deps.searchClassSource({
15
+ artifactId: artifact.artifactId,
16
+ query: searchSubject.query,
17
+ intent: searchSubject.intent,
18
+ match: searchSubject.match,
19
+ queryMode,
20
+ limit,
21
+ cursor,
22
+ scope: searchSubject.packagePrefix || searchSubject.fileGlob || searchSubject.symbolKind
23
+ ? {
24
+ packagePrefix: searchSubject.packagePrefix,
25
+ fileGlob: searchSubject.fileGlob,
26
+ symbolKind: searchSubject.symbolKind
27
+ }
28
+ : undefined
29
+ });
30
+ const needsBinaryBackedClassHit = subject.kind === "workspace" &&
31
+ hasPartialVanillaCoverage(artifact.artifact) &&
32
+ looksLikeClassQuery(searchSubject.query) &&
33
+ !search.hits.some((hit) => hitTargetsVanillaNamespace(hit));
34
+ const binaryBackedClassHit = needsBinaryBackedClassHit
35
+ ? await resolveBinaryBackedClass(deps, searchSubject.query, {
36
+ version: artifact.version,
37
+ mapping: subject.mapping
38
+ })
39
+ : undefined;
40
+ const binaryBackedHitRecord = binaryBackedClassHit == null
41
+ ? undefined
42
+ : {
43
+ filePath: classNameToFilePath(binaryBackedClassHit.className),
44
+ score: 100,
45
+ matchedIn: "symbol",
46
+ reasonCodes: ["binary-class-lookup"],
47
+ symbol: {
48
+ symbolKind: "class",
49
+ symbolName: binaryBackedClassHit.className.split(".").at(-1) ?? binaryBackedClassHit.className,
50
+ qualifiedName: binaryBackedClassHit.className,
51
+ line: 1
52
+ }
53
+ };
54
+ const effectiveHits = binaryBackedHitRecord == null
55
+ ? search.hits
56
+ : [
57
+ binaryBackedHitRecord,
58
+ ...search.hits.filter((hit) => hit.filePath !== binaryBackedHitRecord.filePath)
59
+ ];
60
+ const sampledHits = capArray(effectiveHits, 5);
61
+ const isAutoSeparatorMiss = effectiveHits.length === 0 &&
62
+ queryMode === "auto" &&
63
+ /[._$]/.test(searchSubject.query);
64
+ const literalRetrySubject = subject.kind === "search"
65
+ ? {
66
+ ...subject,
67
+ queryMode: "literal"
68
+ }
69
+ : {
70
+ ...subject,
71
+ focus: {
72
+ ...searchSubject,
73
+ kind: "search",
74
+ queryMode: "literal"
75
+ }
76
+ };
77
+ const summary = {
78
+ status: effectiveHits.length > 0 ? "ok" : "not_found",
79
+ headline: effectiveHits.length > 0
80
+ ? `Found ${effectiveHits.length} source hits for ${searchSubject.query}.`
81
+ : `No source hits were found for ${searchSubject.query}.`,
82
+ subject: createSummarySubject({
83
+ task: "search",
84
+ requested: requestedSubject,
85
+ query: searchSubject.query,
86
+ artifactId: artifact.artifactId
87
+ }),
88
+ counts: {
89
+ hits: effectiveHits.length
90
+ },
91
+ nextActions: nextActionsOrUndefined([
92
+ ...(effectiveHits.length > 0
93
+ ? [
94
+ createNextAction("inspect-minecraft", {
95
+ task: "file",
96
+ subject: {
97
+ kind: "file",
98
+ filePath: effectiveHits[0].filePath,
99
+ artifact: {
100
+ type: "resolved-id",
101
+ artifactId: artifact.artifactId
102
+ }
103
+ },
104
+ include: ["source"]
105
+ })
106
+ ]
107
+ : []),
108
+ ...(isAutoSeparatorMiss
109
+ ? [
110
+ createNextAction("inspect-minecraft", {
111
+ task: "search",
112
+ subject: literalRetrySubject
113
+ })
114
+ ]
115
+ : [])
116
+ ]),
117
+ ...(isAutoSeparatorMiss
118
+ ? {
119
+ notes: [
120
+ "Separator query returned no indexed hits. Retry with queryMode=\"literal\" for an explicit full substring scan."
121
+ ]
122
+ }
123
+ : binaryBackedClassHit
124
+ ? {
125
+ notes: [
126
+ "Source coverage was partial, so inspect-minecraft returned a binary-backed class match for the vanilla symbol."
127
+ ]
128
+ }
129
+ : {})
130
+ };
131
+ return {
132
+ ...buildEntryToolResult({
133
+ task: "search",
134
+ summary,
135
+ detail,
136
+ include,
137
+ blocks: {
138
+ subject: {
139
+ requested: requestedSubject,
140
+ resolved: {
141
+ artifactId: artifact.artifactId
142
+ }
143
+ },
144
+ search: {
145
+ query: searchSubject.query,
146
+ hits: detail === "summary" ? sampledHits.items : effectiveHits,
147
+ nextCursor: search.nextCursor
148
+ }
149
+ },
150
+ alwaysBlocks: ["subject"]
151
+ }),
152
+ warnings: [...artifact.warnings, ...(binaryBackedClassHit?.warnings ?? [])]
153
+ };
154
+ }
155
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1,6 @@
1
+ import { type DetailLevel } from "../../response-contract.js";
2
+ import { type InspectMinecraftDeps } from "../internal.js";
3
+ import { type InspectMinecraftInput } from "../../inspect-minecraft-service.js";
4
+ export declare function handleVersions(deps: InspectMinecraftDeps, input: InspectMinecraftInput, detail: DetailLevel, include: string[]): Promise<{
5
+ warnings: never[];
6
+ }>;
@@ -0,0 +1,49 @@
1
+ import { buildEntryToolResult, createNextAction, createSummarySubject } from "../../response-contract.js";
2
+ import { nextActionsOrUndefined } from "../../request-normalizers.js";
3
+ export async function handleVersions(deps, input, detail, include) {
4
+ const versions = await deps.listVersions({
5
+ includeSnapshots: input.includeSnapshots,
6
+ limit: input.limit
7
+ });
8
+ const summary = {
9
+ status: "ok",
10
+ headline: `Found ${versions.totalAvailable} Minecraft versions.`,
11
+ subject: createSummarySubject({
12
+ task: "versions",
13
+ kind: "versions",
14
+ includeSnapshots: input.includeSnapshots === false ? undefined : input.includeSnapshots,
15
+ limit: input.limit
16
+ }),
17
+ counts: {
18
+ releases: versions.releases.length,
19
+ snapshots: versions.snapshots?.length ?? 0
20
+ },
21
+ nextActions: nextActionsOrUndefined([
22
+ createNextAction("inspect-minecraft", {
23
+ task: "artifact",
24
+ subject: {
25
+ kind: "version",
26
+ version: versions.latest.release ?? versions.releases[0]?.id
27
+ }
28
+ })
29
+ ])
30
+ };
31
+ return {
32
+ ...buildEntryToolResult({
33
+ task: "versions",
34
+ summary,
35
+ detail,
36
+ include,
37
+ blocks: {
38
+ versions: {
39
+ latest: versions.latest,
40
+ releases: detail === "summary" ? versions.releases.slice(0, 5) : versions.releases,
41
+ snapshots: input.includeSnapshots ? versions.snapshots : undefined,
42
+ cached: versions.cached
43
+ }
44
+ }
45
+ }),
46
+ warnings: []
47
+ };
48
+ }
49
+ //# sourceMappingURL=versions.js.map