@creeperhost/modlens-mcp 1.6.19 → 1.6.21

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 (108) hide show
  1. package/ATTRIBUTION.md +8 -1
  2. package/README.md +82 -5
  3. package/RUNTIME.md +262 -0
  4. package/TESTING.md +8 -0
  5. package/dist/cli.js +28 -8
  6. package/dist/cli.js.map +1 -1
  7. package/dist/hosted-mod-license.d.ts +36 -0
  8. package/dist/hosted-mod-license.d.ts.map +1 -0
  9. package/dist/hosted-mod-license.js +65 -0
  10. package/dist/hosted-mod-license.js.map +1 -0
  11. package/dist/hosted-policy.d.ts +32 -0
  12. package/dist/hosted-policy.d.ts.map +1 -0
  13. package/dist/hosted-policy.js +257 -0
  14. package/dist/hosted-policy.js.map +1 -0
  15. package/dist/launcher.js +104 -89
  16. package/dist/launcher.js.map +1 -1
  17. package/dist/license-notices.d.ts +8 -0
  18. package/dist/license-notices.d.ts.map +1 -0
  19. package/dist/license-notices.js +10 -0
  20. package/dist/license-notices.js.map +1 -0
  21. package/dist/license-source-references.d.ts +12 -0
  22. package/dist/license-source-references.d.ts.map +1 -0
  23. package/dist/license-source-references.js +18 -0
  24. package/dist/license-source-references.js.map +1 -0
  25. package/dist/license-templates.d.ts +6 -0
  26. package/dist/license-templates.d.ts.map +1 -0
  27. package/dist/license-templates.js +55 -0
  28. package/dist/license-templates.js.map +1 -0
  29. package/dist/local-mod.d.ts +31 -0
  30. package/dist/local-mod.d.ts.map +1 -0
  31. package/dist/local-mod.js +71 -0
  32. package/dist/local-mod.js.map +1 -0
  33. package/dist/mod-license.d.ts +53 -0
  34. package/dist/mod-license.d.ts.map +1 -0
  35. package/dist/mod-license.js +617 -0
  36. package/dist/mod-license.js.map +1 -0
  37. package/dist/primer-catalog.d.ts +15 -0
  38. package/dist/primer-catalog.d.ts.map +1 -0
  39. package/dist/primer-catalog.js +43 -0
  40. package/dist/primer-catalog.js.map +1 -0
  41. package/dist/primer-content.d.ts +7 -0
  42. package/dist/primer-content.d.ts.map +1 -0
  43. package/dist/primer-content.js +185 -0
  44. package/dist/primer-content.js.map +1 -0
  45. package/dist/runtime/cli.d.ts +2 -0
  46. package/dist/runtime/cli.d.ts.map +1 -0
  47. package/dist/runtime/cli.js +163 -0
  48. package/dist/runtime/cli.js.map +1 -0
  49. package/dist/runtime/companion.d.ts +32 -0
  50. package/dist/runtime/companion.d.ts.map +1 -0
  51. package/dist/runtime/companion.js +135 -0
  52. package/dist/runtime/companion.js.map +1 -0
  53. package/dist/runtime/guidance.d.ts +73 -0
  54. package/dist/runtime/guidance.d.ts.map +1 -0
  55. package/dist/runtime/guidance.js +40 -0
  56. package/dist/runtime/guidance.js.map +1 -0
  57. package/dist/runtime/hub.d.ts +150 -0
  58. package/dist/runtime/hub.d.ts.map +1 -0
  59. package/dist/runtime/hub.js +561 -0
  60. package/dist/runtime/hub.js.map +1 -0
  61. package/dist/runtime/modlens-agent.jar +0 -0
  62. package/dist/runtime/protocol.d.ts +202 -0
  63. package/dist/runtime/protocol.d.ts.map +1 -0
  64. package/dist/runtime/protocol.js +91 -0
  65. package/dist/runtime/protocol.js.map +1 -0
  66. package/dist/runtime/requests.d.ts +367 -0
  67. package/dist/runtime/requests.d.ts.map +1 -0
  68. package/dist/runtime/requests.js +57 -0
  69. package/dist/runtime/requests.js.map +1 -0
  70. package/dist/server.js +141 -45
  71. package/dist/server.js.map +1 -1
  72. package/dist/setup.js +9 -4
  73. package/dist/setup.js.map +1 -1
  74. package/dist/tools/primers.d.ts +133 -22
  75. package/dist/tools/primers.d.ts.map +1 -1
  76. package/dist/tools/primers.js +391 -386
  77. package/dist/tools/primers.js.map +1 -1
  78. package/dist/tools/project.d.ts +11 -7
  79. package/dist/tools/project.d.ts.map +1 -1
  80. package/dist/tools/project.js +45 -3
  81. package/dist/tools/project.js.map +1 -1
  82. package/dist/tools/report-issue.d.ts +77 -0
  83. package/dist/tools/report-issue.d.ts.map +1 -0
  84. package/dist/tools/report-issue.js +92 -0
  85. package/dist/tools/report-issue.js.map +1 -0
  86. package/dist/tools/runtime.d.ts +6 -0
  87. package/dist/tools/runtime.d.ts.map +1 -0
  88. package/dist/tools/runtime.js +18 -0
  89. package/dist/tools/runtime.js.map +1 -0
  90. package/dist/tools/source.d.ts +1 -1
  91. package/dist/tools/source.d.ts.map +1 -1
  92. package/dist/tools/source.js +5 -1
  93. package/dist/tools/source.js.map +1 -1
  94. package/package.json +8 -1
  95. package/scripts/build-runtime-agent.mjs +64 -0
  96. package/scripts/fixtures/mod-license-corpus.json +154 -0
  97. package/scripts/gradle/modlens-runtime.init.gradle +17 -0
  98. package/scripts/runtime-test-client.mjs +36 -0
  99. package/scripts/test-hosted-policy.mjs +123 -0
  100. package/scripts/test-mod-licenses-live.mjs +86 -0
  101. package/scripts/test-package.mjs +141 -5
  102. package/scripts/test-primers-live.mjs +93 -0
  103. package/scripts/test-project-http.mjs +46 -3
  104. package/scripts/test-runtime-gradle.mjs +107 -0
  105. package/scripts/test-runtime-minecraft.mjs +190 -0
  106. package/scripts/test-runtime-native.mjs +120 -0
  107. package/scripts/test-runtime-remote.mjs +209 -0
  108. package/scripts/update-license-templates.mjs +14 -0
@@ -0,0 +1,561 @@
1
+ import { createServer } from "node:http";
2
+ import { randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
3
+ import { mkdir, readFile, writeFile, stat, realpath, lstat, open, unlink, rename } from "node:fs/promises";
4
+ import { isAbsolute, join, relative } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { spawn } from "node:child_process";
7
+ import { agentPacket, properties, } from "./protocol.js";
8
+ const PACKAGE_ROOT = fileURLToPath(new URL("../../", import.meta.url));
9
+ const UUID = /^[0-9a-f-]{36}$/;
10
+ export const RUNTIME_HELP = {
11
+ target: "Minecraft Java 26.3 / Java 25",
12
+ clientJvmOptions: "26.3 client launches require -XX:StackShadowPages=32 independently of this agent. Setup includes it in the selected Gradle client task and returns all required vmOptions for manual launches.",
13
+ optional: true,
14
+ workflow: [
15
+ "setup(projectDir) prepares an opt-in IntelliJ Gradle run config and agent; no existing build file changes",
16
+ "launch(projectId) or select ModLens Client in IntelliJ",
17
+ "sessions, then status(sessionId) to inspect actual capabilities",
18
+ "command(mode=observe|hidden) gives the MCP exclusive game input; interactive returns input to the human",
19
+ "command inputs, screenshot, threads, recording, allocations; events(afterCursor,waitMs) for incidents",
20
+ ],
21
+ input: "SDL scancode names (W, SPACE, ESCAPE, LSHIFT, etc.) or numeric scancodes; mouse buttons: 1 left, 2 middle, 3 right. Held inputs expire. Screen coordinates are window pixels; relative movement uses deltas.",
22
+ monitoring: "Events are collected without an AI turn. While actively monitoring, use bounded events waits. MCP notifications do not by themselves guarantee an idle AI task wakes up.",
23
+ heapAnalysis: "Use command allocations with your mod's packagePrefix, then artifact to read the JSON hotspot report. Weighted JFR stack samples identify likely allocation-heavy callers. Combine with GC/heap metrics; this is not a retained-heap analysis or proof of a leak.",
24
+ execution: "Local stdio MCP executes directly. Remote MCP returns a local execution plan: Codex runs modlens-mcp --runtime --request-file <file> on the Minecraft PC. No second MCP connection or tunnel is required.",
25
+ limits: "Requires local execution access, an existing working 26.3 dev run task and a graphical environment even when hidden. Setup is not proof of game compatibility; inspect connected capabilities. No historical version claim.",
26
+ };
27
+ /** Local-only, opt-in bridge. Remote MCP clients never gain host process/filesystem control. */
28
+ export class RuntimeHub {
29
+ root;
30
+ agentJar;
31
+ projects = new Map();
32
+ sessions = new Map();
33
+ journal = [];
34
+ cursor = 0;
35
+ server;
36
+ endpoint = "";
37
+ init;
38
+ waiters = new Map();
39
+ children = new Map();
40
+ persistence = Promise.resolve();
41
+ monitor;
42
+ dirty = false;
43
+ ownsLock = false;
44
+ listening;
45
+ constructor(root, agentJar = join(PACKAGE_ROOT, "dist/runtime/modlens-agent.jar")) {
46
+ this.root = root;
47
+ this.agentJar = agentJar;
48
+ }
49
+ assertLocal() {
50
+ if (process.env.MCP_PORT)
51
+ throw new Error("Runtime control must execute on the dev machine through local stdio or the --runtime helper. The remote MCP provides a local execution plan instead of running local paths on its host.");
52
+ }
53
+ async initialize() {
54
+ this.assertLocal();
55
+ return (this.init ??= this.load().catch((e) => {
56
+ this.init = undefined;
57
+ throw e;
58
+ }));
59
+ }
60
+ /** Explicit CLI opt-in: keep a bridge ready even before the first project setup. */
61
+ async startLocalCompanion() {
62
+ await this.initialize();
63
+ await this.listen();
64
+ }
65
+ async load() {
66
+ const saved = await readFile(join(this.root, "projects.json"), "utf8").catch((e) => {
67
+ if (e.code === "ENOENT")
68
+ return "[]";
69
+ throw e;
70
+ });
71
+ for (const p of JSON.parse(saved)) {
72
+ if (UUID.test(p.id) && /^[a-f0-9]{64}$/.test(p.token) && isAbsolute(p.directory))
73
+ this.projects.set(p.id, p);
74
+ }
75
+ const history = await readFile(join(this.root, "events.json"), "utf8").catch((e) => {
76
+ if (e.code === "ENOENT")
77
+ return "[]";
78
+ throw e;
79
+ });
80
+ this.journal = JSON.parse(history).slice(-500);
81
+ this.cursor = this.journal.at(-1)?.cursor ?? 0;
82
+ if (this.projects.size)
83
+ await this.listen();
84
+ }
85
+ async listen() {
86
+ return (this.listening ??= this.openListener().catch(async (e) => {
87
+ await this.close();
88
+ this.listening = undefined;
89
+ throw e;
90
+ }));
91
+ }
92
+ async openListener() {
93
+ if (this.server)
94
+ return;
95
+ await mkdir(this.root, { recursive: true, mode: 0o700 });
96
+ const lockPath = join(this.root, "bridge.lock");
97
+ const acquire = async () => {
98
+ const file = await open(lockPath, "wx", 0o600);
99
+ try {
100
+ await file.writeFile(JSON.stringify({ pid: process.pid }));
101
+ }
102
+ finally {
103
+ await file.close();
104
+ }
105
+ this.ownsLock = true;
106
+ };
107
+ try {
108
+ await acquire();
109
+ }
110
+ catch (e) {
111
+ if (e.code !== "EEXIST")
112
+ throw e;
113
+ const owner = JSON.parse(await readFile(lockPath, "utf8"));
114
+ let alive = true;
115
+ try {
116
+ process.kill(owner.pid, 0);
117
+ }
118
+ catch (err) {
119
+ if (err.code === "ESRCH")
120
+ alive = false;
121
+ }
122
+ if (alive)
123
+ throw new Error("Another local ModLens runtime bridge owns these projects. Use that MCP connection, or stop it before starting this one. The existing client's connection was not changed.");
124
+ await unlink(lockPath);
125
+ await acquire();
126
+ }
127
+ const server = createServer(async (req, res) => {
128
+ res.setHeader("Cache-Control", "no-store");
129
+ // No browser access, CORS, wildcard binding, or unauthenticated control route.
130
+ if (req.headers.origin || req.method !== "POST") {
131
+ res.writeHead(403).end();
132
+ return;
133
+ }
134
+ const match = /^\/agent\/([0-9a-f-]{36})$/.exec(req.url ?? "");
135
+ const p = match && this.projects.get(match[1]);
136
+ const credential = Buffer.from(req.headers.authorization ?? "");
137
+ const expected = Buffer.from(p ? `Bearer ${p.token}` : "");
138
+ if (!p || credential.length !== expected.length || !timingSafeEqual(credential, expected)) {
139
+ res.writeHead(403).end();
140
+ return;
141
+ }
142
+ try {
143
+ const chunks = [];
144
+ let size = 0;
145
+ for await (const c of req) {
146
+ size += c.length;
147
+ if (size > 512 * 1024) {
148
+ res.writeHead(413).end();
149
+ req.destroy();
150
+ return;
151
+ }
152
+ chunks.push(c);
153
+ }
154
+ const packet = agentPacket.parse(JSON.parse(Buffer.concat(chunks).toString("utf8")));
155
+ const response = this.accept(p, packet);
156
+ res.writeHead(200, { "Content-Type": "text/plain; charset=us-ascii" }).end(properties(response));
157
+ }
158
+ catch {
159
+ if (!res.headersSent)
160
+ res.writeHead(400).end();
161
+ }
162
+ });
163
+ server.requestTimeout = 5000;
164
+ server.headersTimeout = 5000;
165
+ await new Promise((ok, fail) => {
166
+ server.once("error", fail);
167
+ server.listen(0, "127.0.0.1", () => {
168
+ server.off("error", fail);
169
+ ok();
170
+ });
171
+ });
172
+ this.server = server;
173
+ server.unref();
174
+ this.endpoint = `http://127.0.0.1:${server.address().port}`;
175
+ for (const p of this.projects.values())
176
+ await this.connection(p);
177
+ this.monitor = setInterval(() => {
178
+ for (const [id, s] of this.sessions)
179
+ if (!s.ended && !s.disconnected && Date.now() - s.lastSeen > 5000) {
180
+ s.disconnected = true;
181
+ this.add(id, "connection_lost", {
182
+ note: "Heartbeat lost; this is not proof of a JVM crash.",
183
+ });
184
+ }
185
+ if (this.dirty) {
186
+ this.dirty = false;
187
+ const snapshot = this.journal.slice(-500);
188
+ this.persistence = this.persistence
189
+ .then(() => this.saveEvents(snapshot))
190
+ .catch((e) => {
191
+ this.dirty = true;
192
+ console.error("[runtime] Could not persist events:", e);
193
+ });
194
+ }
195
+ }, 1000);
196
+ this.monitor.unref();
197
+ }
198
+ async safeDirectory(project, suffix) {
199
+ const dest = join(project, suffix);
200
+ let path = project;
201
+ for (const segment of suffix.split(/[\\/]/)) {
202
+ path = join(path, segment);
203
+ const info = await lstat(path).catch((e) => {
204
+ if (e.code === "ENOENT")
205
+ return null;
206
+ throw e;
207
+ });
208
+ if (info?.isSymbolicLink())
209
+ throw new Error(`Refusing symlink in managed runtime path: ${path}`);
210
+ if (info && !info.isDirectory())
211
+ throw new Error(`Expected directory: ${path}`);
212
+ if (!info)
213
+ await mkdir(path, { mode: 0o700 });
214
+ }
215
+ return dest;
216
+ }
217
+ async managedWrite(path, data, overwrite = true) {
218
+ const info = await lstat(path).catch((e) => {
219
+ if (e.code === "ENOENT")
220
+ return null;
221
+ throw e;
222
+ });
223
+ if (info?.isSymbolicLink() || (info && !info.isFile()))
224
+ throw new Error(`Refusing non-file managed path: ${path}`);
225
+ if (info && !overwrite)
226
+ throw new Error(`File already exists: ${path}`);
227
+ await writeFile(path, data, { mode: 0o600 });
228
+ }
229
+ async connection(p) {
230
+ const dir = await this.safeDirectory(p.directory, ".modlens/runtime");
231
+ const data = properties({
232
+ protocol: 1,
233
+ endpoint: `${this.endpoint}/agent/${p.id}`,
234
+ token: p.token,
235
+ projectId: p.id,
236
+ mode: p.mode,
237
+ minecraftHooks: p.hooks,
238
+ mcVersion: "26.3",
239
+ artifacts: join(dir, "sessions"),
240
+ });
241
+ await this.managedWrite(join(dir, "connection.properties"), data);
242
+ }
243
+ async setup(directory, mode = "interactive", task = "runClient", hooks = true) {
244
+ await this.initialize();
245
+ if (!isAbsolute(directory))
246
+ throw new Error("projectDir must be an absolute path on this machine");
247
+ directory = await realpath(directory);
248
+ if (!(await stat(directory)).isDirectory())
249
+ throw new Error("projectDir is not a directory");
250
+ if (!/^:?[\w-]+(?::[\w-]+)*$/.test(task))
251
+ throw new Error("gradleTask must be a Gradle task path such as :client:runClient");
252
+ const wrapper = join(directory, "gradle/wrapper/gradle-wrapper.jar");
253
+ await stat(wrapper).catch(() => {
254
+ throw new Error("Project needs an existing Gradle wrapper. Run setup on the mod development project, not its run/ folder.");
255
+ });
256
+ await stat(this.agentJar).catch(() => {
257
+ throw new Error("The packaged runtime agent is missing. In a source checkout, run npm run build:agent with JAVA_HOME set to JDK 25, then retry setup.");
258
+ });
259
+ let p = [...this.projects.values()].find((p) => p.directory === directory);
260
+ p = {
261
+ id: p?.id ?? randomUUID(),
262
+ directory,
263
+ token: p?.token ?? randomBytes(32).toString("hex"),
264
+ mode,
265
+ task,
266
+ hooks,
267
+ };
268
+ const dir = await this.safeDirectory(directory, ".modlens/runtime");
269
+ const runDir = await this.safeDirectory(directory, ".run");
270
+ const runFile = join(runDir, "ModLens Client.run.xml");
271
+ const existing = await readFile(runFile, "utf8").catch((e) => {
272
+ if (e.code === "ENOENT")
273
+ return "";
274
+ throw e;
275
+ });
276
+ if (existing && !existing.includes("<!-- Managed by ModLens runtime -->"))
277
+ throw new Error("A non-ModLens run configuration already exists at " + runFile);
278
+ await this.managedWrite(join(dir, "agent.jar"), await readFile(this.agentJar));
279
+ await this.managedWrite(join(dir, ".gitignore"), "*\n");
280
+ const script = await readFile(join(PACKAGE_ROOT, "scripts/gradle/modlens-runtime.init.gradle"), "utf8");
281
+ await this.managedWrite(join(dir, "init.gradle"), script);
282
+ await this.managedWrite(join(dir, "launch.properties"), properties({
283
+ task,
284
+ agent: join(dir, "agent.jar"),
285
+ connection: join(dir, "connection.properties"),
286
+ }));
287
+ const xml = (s) => s
288
+ .replaceAll("&", "&amp;")
289
+ .replaceAll('"', "&quot;")
290
+ .replaceAll("<", "&lt;")
291
+ .replaceAll(">", "&gt;");
292
+ await this.managedWrite(runFile, `<!-- Managed by ModLens runtime -->\n<component name="ProjectRunConfigurationManager">\n <configuration default="false" name="ModLens Client" type="GradleRunConfiguration" factoryName="Gradle">\n <ExternalSystemSettings>\n <option name="externalProjectPath" value="$PROJECT_DIR$" />\n <option name="externalSystemIdString" value="GRADLE" />\n <option name="scriptParameters" value="--init-script &quot;$PROJECT_DIR$/.modlens/runtime/init.gradle&quot; --no-configuration-cache" />\n <option name="taskNames"><list><option value="${xml(task)}" /></list></option>\n </ExternalSystemSettings>\n <method v="2" />\n </configuration>\n</component>\n`);
293
+ this.projects.set(p.id, p);
294
+ await this.listen();
295
+ await this.connection(p);
296
+ await mkdir(this.root, { recursive: true, mode: 0o700 });
297
+ await this.managedWrite(join(this.root, "projects.json"), JSON.stringify([...this.projects.values()]));
298
+ const vmOption = `-javaagent:${join(dir, "agent.jar")}=${join(dir, "connection.properties")}`;
299
+ return {
300
+ state: "configured",
301
+ projectId: p.id,
302
+ mcVersion: "26.3",
303
+ mode,
304
+ runConfiguration: runFile,
305
+ vmOption,
306
+ vmOptions: [vmOption, "-XX:StackShadowPages=32"],
307
+ manualLaunch: "Add every vmOptions entry to the actual Minecraft client JVM. StackShadowPages=32 is required for 26.3 client startup independently of the agent. The generated Gradle/IntelliJ launch includes it automatically.",
308
+ next: "Select ModLens Client in IntelliJ and Run, or call runtime.launch(projectId). Use runtime.sessions to confirm connection and capabilities.",
309
+ files: [
310
+ runFile,
311
+ join(dir, "agent.jar"),
312
+ join(dir, "connection.properties"),
313
+ join(dir, "init.gradle"),
314
+ join(dir, "launch.properties"),
315
+ ],
316
+ note: "Only this opt-in run configuration uses the agent; existing builds and run configurations are unchanged. Keep connection.properties private.",
317
+ };
318
+ }
319
+ accept(p, packet) {
320
+ let s = this.sessions.get(packet.sessionId);
321
+ if (s && s.projectId !== p.id)
322
+ throw new Error("Session project mismatch");
323
+ if (!s) {
324
+ if (this.sessions.size >= 64)
325
+ throw new Error("Session limit reached; restart the bridge to clear history");
326
+ s = { projectId: p.id, packet, lastSeen: Date.now(), lastSeq: 0, commands: new Map() };
327
+ this.sessions.set(packet.sessionId, s);
328
+ this.add(packet.sessionId, "session_started", { projectId: p.id, pid: packet.pid });
329
+ }
330
+ if (s.disconnected)
331
+ this.add(packet.sessionId, "connection_restored", {});
332
+ s.packet = packet;
333
+ s.lastSeen = Date.now();
334
+ s.disconnected = false;
335
+ for (const e of packet.events)
336
+ if (e.seq > s.lastSeq) {
337
+ this.add(packet.sessionId, e.type, e.data, e.time);
338
+ s.lastSeq = e.seq;
339
+ if (e.type === "jvm_shutdown")
340
+ s.ended = true;
341
+ }
342
+ for (const result of packet.results) {
343
+ const c = s.commands.get(result.id);
344
+ if (c) {
345
+ clearTimeout(c.timer);
346
+ s.commands.delete(c.id);
347
+ result.ok
348
+ ? c.resolve({ commandId: c.id, ...result.data })
349
+ : c.reject(new Error(JSON.stringify(result.data)));
350
+ }
351
+ }
352
+ const pending = [...s.commands.values()].find((c) => !c.sent && c.deadline > Date.now());
353
+ if (!pending)
354
+ return { ack: s.lastSeq };
355
+ pending.sent = true;
356
+ return { ack: s.lastSeq, id: pending.id, deadline: pending.deadline, ...pending.command };
357
+ }
358
+ add(sessionId, type, data, time = Date.now()) {
359
+ const e = { cursor: ++this.cursor, sessionId, time, type, data };
360
+ this.journal.push(e);
361
+ if (this.journal.length > 2000)
362
+ this.journal.shift();
363
+ // Coalesce writes instead of queuing one disk write per incoming event.
364
+ this.dirty = true;
365
+ for (const wake of this.waiters.keys())
366
+ wake();
367
+ }
368
+ async saveEvents(snapshot) {
369
+ await mkdir(this.root, { recursive: true, mode: 0o700 });
370
+ await writeFile(join(this.root, "events.tmp"), JSON.stringify(snapshot), { mode: 0o600 });
371
+ await rename(join(this.root, "events.tmp"), join(this.root, "events.json"));
372
+ }
373
+ async status(sessionId) {
374
+ await this.initialize();
375
+ if (sessionId) {
376
+ const s = this.session(sessionId);
377
+ return this.view(sessionId, s);
378
+ }
379
+ return {
380
+ enabled: this.projects.size > 0,
381
+ agentPackaged: await stat(this.agentJar).then(() => true, () => false),
382
+ projects: [...this.projects.values()].map(({ token, ...p }) => p),
383
+ help: RUNTIME_HELP,
384
+ };
385
+ }
386
+ async list() {
387
+ await this.initialize();
388
+ return [...this.sessions].map(([id, s]) => this.view(id, s));
389
+ }
390
+ view(id, s) {
391
+ return {
392
+ sessionId: id,
393
+ projectId: s.projectId,
394
+ status: s.ended ? "stopped" : Date.now() - s.lastSeen > 5000 ? "disconnected" : "connected",
395
+ lastSeen: s.lastSeen,
396
+ pid: s.packet.pid,
397
+ javaVersion: s.packet.javaVersion,
398
+ capabilities: s.packet.capabilities,
399
+ state: s.packet.state,
400
+ metrics: s.packet.metrics,
401
+ };
402
+ }
403
+ session(id) {
404
+ const s = this.sessions.get(id);
405
+ if (!s)
406
+ throw new Error("Unknown sessionId; call runtime.sessions first");
407
+ return s;
408
+ }
409
+ async events(after = 0, waitMs = 0, sessionId) {
410
+ await this.initialize();
411
+ const available = () => this.journal.filter((e) => e.cursor > after && (!sessionId || e.sessionId === sessionId));
412
+ if (!available().length && waitMs > 0)
413
+ await new Promise((ok) => {
414
+ const done = () => {
415
+ clearTimeout(timer);
416
+ this.waiters.delete(wake);
417
+ ok();
418
+ };
419
+ const wake = () => {
420
+ if (available().length)
421
+ done();
422
+ };
423
+ const timer = setTimeout(done, Math.min(30_000, waitMs));
424
+ this.waiters.set(wake, done);
425
+ });
426
+ const events = available().slice(0, 100);
427
+ return {
428
+ events,
429
+ nextCursor: events.at(-1)?.cursor ?? this.cursor,
430
+ truncated: after > 0 && after < (this.journal[0]?.cursor ?? 0) - 1,
431
+ };
432
+ }
433
+ async command(sessionId, command) {
434
+ await this.initialize();
435
+ const s = this.session(sessionId);
436
+ if (s.ended || Date.now() - s.lastSeen > 5000)
437
+ throw new Error("Client disconnected; command was not queued");
438
+ if (s.commands.size >= 16)
439
+ throw new Error("Too many commands awaiting completion");
440
+ const id = randomUUID(), deadline = Date.now() + 10_000;
441
+ return new Promise((ok, fail) => {
442
+ const timer = setTimeout(() => {
443
+ s.commands.delete(id);
444
+ fail(new Error("Command timed out; execution is unknown. Inspect session state before retrying an action."));
445
+ }, 11_000);
446
+ s.commands.set(id, { id, deadline, command, sent: false, resolve: ok, reject: fail, timer });
447
+ });
448
+ }
449
+ async launch(projectId, javaHome) {
450
+ await this.initialize();
451
+ const p = this.projects.get(projectId);
452
+ if (!p)
453
+ throw new Error("Unknown projectId; call setup first");
454
+ if (this.children.has(p.id))
455
+ throw new Error("A ModLens Gradle launch is already running for this project");
456
+ const java = javaHome
457
+ ? join(javaHome, "bin", process.platform === "win32" ? "java.exe" : "java")
458
+ : process.env.JAVA_HOME
459
+ ? join(process.env.JAVA_HOME, "bin", process.platform === "win32" ? "java.exe" : "java")
460
+ : "java";
461
+ const args = [
462
+ "-classpath",
463
+ join(p.directory, "gradle/wrapper/gradle-wrapper.jar"),
464
+ "org.gradle.wrapper.GradleWrapperMain",
465
+ p.task,
466
+ "--init-script",
467
+ join(p.directory, ".modlens/runtime/init.gradle"),
468
+ "--no-configuration-cache",
469
+ "--console=plain",
470
+ ];
471
+ const child = spawn(java, args, {
472
+ cwd: p.directory,
473
+ env: javaHome ? { ...process.env, JAVA_HOME: javaHome } : process.env,
474
+ windowsHide: true,
475
+ stdio: ["ignore", "pipe", "pipe"],
476
+ });
477
+ this.children.set(p.id, child);
478
+ child.once("exit", (code, signal) => {
479
+ this.children.delete(p.id);
480
+ this.add("launch:" + p.id, "launch_exited", { code, signal });
481
+ });
482
+ let recent = "";
483
+ const log = (chunk) => {
484
+ recent = (recent + chunk.toString()).slice(-16_000);
485
+ };
486
+ child.stdout?.on("data", log);
487
+ child.stderr?.on("data", log);
488
+ child.once("exit", () => {
489
+ this.add("launch:" + p.id, "launch_log", { text: recent });
490
+ });
491
+ await new Promise((ok, fail) => {
492
+ child.once("spawn", ok);
493
+ child.once("error", (e) => {
494
+ this.children.delete(p.id);
495
+ fail(e);
496
+ });
497
+ });
498
+ return {
499
+ state: "launching",
500
+ pid: child.pid,
501
+ projectId: p.id,
502
+ next: "Poll runtime.sessions/events for agent registration; a Gradle PID is not proof Minecraft started.",
503
+ };
504
+ }
505
+ async artifact(sessionId, name) {
506
+ await this.initialize();
507
+ const s = this.session(sessionId), p = this.projects.get(s.projectId);
508
+ if (!/^[a-zA-Z0-9._-]+\.(png|jfr|txt)$/.test(name))
509
+ throw new Error("Invalid artifact name");
510
+ const base = join(p.directory, ".modlens/runtime/sessions", sessionId);
511
+ if (relative(base, await realpath(base)) !== "")
512
+ throw new Error("Artifact session directory contains a symlink");
513
+ const path = await realpath(join(base, name));
514
+ const rel = relative(base, path);
515
+ if (rel.startsWith("..") || isAbsolute(rel))
516
+ throw new Error("Artifact escaped session directory");
517
+ if ((await stat(path)).size > 8 * 1024 * 1024)
518
+ return { path, note: "Artifact is larger than 8 MiB; inspect the local file." };
519
+ if (name.endsWith(".png"))
520
+ return { path, mimeType: "image/png", data: (await readFile(path)).toString("base64") };
521
+ if (name.endsWith(".txt"))
522
+ return { path, text: await readFile(path, "utf8") };
523
+ return { path };
524
+ }
525
+ async close() {
526
+ if (this.monitor)
527
+ clearInterval(this.monitor);
528
+ // Stopping monitoring must not kill game/Gradle processes or keep the helper
529
+ // alive indefinitely through their logging pipes.
530
+ for (const child of this.children.values()) {
531
+ child.removeAllListeners("exit");
532
+ child.unref();
533
+ child.stdout?.destroy();
534
+ child.stderr?.destroy();
535
+ }
536
+ this.children.clear();
537
+ for (const s of this.sessions.values())
538
+ for (const c of s.commands.values()) {
539
+ clearTimeout(c.timer);
540
+ c.reject(new Error("Runtime bridge closed"));
541
+ }
542
+ for (const done of this.waiters.values())
543
+ done();
544
+ await this.persistence.catch(() => { });
545
+ if (this.dirty) {
546
+ await this.saveEvents(this.journal.slice(-500));
547
+ this.dirty = false;
548
+ }
549
+ if (this.server) {
550
+ this.server.closeAllConnections();
551
+ await new Promise((ok) => this.server.close(() => ok()));
552
+ this.server = undefined;
553
+ }
554
+ if (this.ownsLock) {
555
+ await unlink(join(this.root, "bridge.lock")).catch(() => { });
556
+ this.ownsLock = false;
557
+ }
558
+ this.listening = undefined;
559
+ }
560
+ }
561
+ //# sourceMappingURL=hub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub.js","sourceRoot":"","sources":["../../src/runtime/hub.ts"],"names":[],"mappings":"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"}
Binary file