@bkm016/calcite 0.0.0-stage → 0.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.
- package/LICENSE +21 -0
- package/README.md +314 -2
- package/THIRD_PARTY_NOTICES.md +44 -0
- package/dist/accounts.d.ts +27 -0
- package/dist/accounts.js +114 -0
- package/dist/accounts.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +242 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +251 -0
- package/dist/client.js +671 -0
- package/dist/client.js.map +1 -0
- package/dist/display.d.ts +23 -0
- package/dist/display.js +135 -0
- package/dist/display.js.map +1 -0
- package/dist/hmc.d.ts +33 -0
- package/dist/hmc.js +130 -0
- package/dist/hmc.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/java.d.ts +31 -0
- package/dist/java.js +218 -0
- package/dist/java.js.map +1 -0
- package/dist/lock.d.ts +13 -0
- package/dist/lock.js +79 -0
- package/dist/lock.js.map +1 -0
- package/dist/log.d.ts +13 -0
- package/dist/log.js +20 -0
- package/dist/log.js.map +1 -0
- package/dist/manager.d.ts +15 -0
- package/dist/manager.js +65 -0
- package/dist/manager.js.map +1 -0
- package/dist/mcp.d.ts +13 -0
- package/dist/mcp.js +252 -0
- package/dist/mcp.js.map +1 -0
- package/dist/mojang.d.ts +70 -0
- package/dist/mojang.js +109 -0
- package/dist/mojang.js.map +1 -0
- package/dist/net.d.ts +21 -0
- package/dist/net.js +246 -0
- package/dist/net.js.map +1 -0
- package/dist/options.d.ts +14 -0
- package/dist/options.js +50 -0
- package/dist/options.js.map +1 -0
- package/dist/paths.d.ts +27 -0
- package/dist/paths.js +48 -0
- package/dist/paths.js.map +1 -0
- package/dist/probe-server.d.ts +28 -0
- package/dist/probe-server.js +132 -0
- package/dist/probe-server.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +11 -0
- package/dist/version.js.map +1 -0
- package/package.json +57 -4
- package/vendor/calcite-probe.jar +0 -0
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { listAccounts, removeAccount, startLogin } from './accounts.js';
|
|
5
|
+
import { CalciteError, defaultUsername, installVersion } from './client.js';
|
|
6
|
+
import { getManifest } from './mojang.js';
|
|
7
|
+
import { ClientManager } from './manager.js';
|
|
8
|
+
import { resolvePaths } from './paths.js';
|
|
9
|
+
import { VERSION } from './version.js';
|
|
10
|
+
function text(value) {
|
|
11
|
+
return { content: [{ type: 'text', text: typeof value === 'string' ? value : JSON.stringify(value, null, 2) }] };
|
|
12
|
+
}
|
|
13
|
+
function failure(err) {
|
|
14
|
+
const code = err instanceof CalciteError ? err.code : err?.code;
|
|
15
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
16
|
+
return { isError: true, content: [{ type: 'text', text: code ? `[${code}] ${message}` : message }] };
|
|
17
|
+
}
|
|
18
|
+
/** Wraps a handler so every failure becomes an MCP tool error instead of a protocol error. */
|
|
19
|
+
function safe(fn) {
|
|
20
|
+
return async (args) => {
|
|
21
|
+
try {
|
|
22
|
+
return await fn(args);
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
return failure(err);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const clientName = z.string().optional().describe('Client name; may be omitted when exactly one client is running');
|
|
30
|
+
const entityFilter = {
|
|
31
|
+
radius: z.number().positive().optional().describe('Only entities within this many blocks of the player'),
|
|
32
|
+
type: z.string().optional().describe('Entity type id, e.g. "minecraft:player" or "zombie"'),
|
|
33
|
+
uuid: z.string().optional(),
|
|
34
|
+
name: z.string().optional().describe('Case-insensitive substring of the name or custom name'),
|
|
35
|
+
limit: z.number().int().positive().max(1000).optional(),
|
|
36
|
+
includeSelf: z.boolean().optional(),
|
|
37
|
+
};
|
|
38
|
+
export function createMcpServer(opts = {}) {
|
|
39
|
+
const paths = resolvePaths();
|
|
40
|
+
const manager = new ClientManager();
|
|
41
|
+
const logins = new Map();
|
|
42
|
+
let loginSeq = 0;
|
|
43
|
+
const server = new McpServer({ name: 'calcite', version: VERSION }, {
|
|
44
|
+
instructions: [
|
|
45
|
+
'Calcite drives real Minecraft Java Edition clients (any version 1.14.4+ fully, older versions launch without probe features).',
|
|
46
|
+
'Typical flow: launch_client (first launch of a version downloads ~0.5-1 GB and can take minutes) → get_state / get_entities / send_chat / run_command / screenshot / wait_for → stop_client.',
|
|
47
|
+
'Offline accounts need no login. For premium servers call account_login_start, show the URL to the user, then poll account_login_status.',
|
|
48
|
+
'Screenshots need render "on-demand" (default) or "always"; with "on-demand" frames are only rendered while a screenshot is taken, keeping CPU usage low.',
|
|
49
|
+
].join('\n'),
|
|
50
|
+
});
|
|
51
|
+
server.registerTool('launch_client', {
|
|
52
|
+
title: 'Launch a Minecraft client',
|
|
53
|
+
description: 'Downloads (if needed) and starts a Minecraft client, optionally joining a server. Resolves once the player is in the world (or on the title screen without a server).',
|
|
54
|
+
inputSchema: {
|
|
55
|
+
name: z.string().regex(/^[A-Za-z0-9_.-]{1,32}$/).describe('Unique client name; also the instance directory'),
|
|
56
|
+
version: z.string().default('release').describe('Minecraft version id, "release" (latest release) or "snapshot"'),
|
|
57
|
+
server: z.string().optional().describe('host[:port] to join'),
|
|
58
|
+
username: z.string().optional().describe('Offline username (3-16 chars). Ignored when microsoft is set'),
|
|
59
|
+
microsoft: z.union([z.boolean(), z.string()]).optional().describe('Use a stored Microsoft account: true for the primary one or the profile name'),
|
|
60
|
+
render: z.enum(['on-demand', 'always', 'off']).optional().describe('on-demand (default): render only for screenshots; always; off: no renderer at all'),
|
|
61
|
+
memory: z.string().regex(/^\d+[MG]$/).optional().describe('Max heap, e.g. "2G"'),
|
|
62
|
+
reconnect: z.boolean().optional().describe('Relaunch and rejoin after a disconnect/crash (default true)'),
|
|
63
|
+
timeoutSeconds: z.number().int().positive().optional().describe('Startup timeout (default 900)'),
|
|
64
|
+
},
|
|
65
|
+
}, safe(async (a) => {
|
|
66
|
+
const account = a.microsoft
|
|
67
|
+
? { type: 'microsoft', name: typeof a.microsoft === 'string' ? a.microsoft : undefined }
|
|
68
|
+
: { type: 'offline', username: a.username ?? defaultUsername(a.name) };
|
|
69
|
+
const client = await manager.launch({
|
|
70
|
+
...opts.defaults,
|
|
71
|
+
name: a.name,
|
|
72
|
+
version: a.version,
|
|
73
|
+
server: a.server,
|
|
74
|
+
account,
|
|
75
|
+
render: a.render ?? opts.defaults?.render,
|
|
76
|
+
memory: a.memory ?? opts.defaults?.memory,
|
|
77
|
+
reconnect: a.reconnect ?? opts.defaults?.reconnect,
|
|
78
|
+
startTimeoutMs: a.timeoutSeconds ? a.timeoutSeconds * 1000 : opts.defaults?.startTimeoutMs,
|
|
79
|
+
});
|
|
80
|
+
return text(client.status());
|
|
81
|
+
}));
|
|
82
|
+
server.registerTool('stop_client', { title: 'Stop a client', description: 'Stops the game and frees its resources.', inputSchema: { client: clientName } }, safe(async ({ client }) => {
|
|
83
|
+
const target = manager.resolve(client);
|
|
84
|
+
await manager.stop(target.options.name);
|
|
85
|
+
return text(`Stopped ${target.options.name}`);
|
|
86
|
+
}));
|
|
87
|
+
server.registerTool('list_clients', { title: 'List clients', description: 'Status of every client managed by this server.', inputSchema: {} }, safe(async () => text(manager.list())));
|
|
88
|
+
server.registerTool('get_state', {
|
|
89
|
+
title: 'Client state',
|
|
90
|
+
description: 'Lifecycle status plus live game state: screen, position, health, dimension, fps, disconnect reason.',
|
|
91
|
+
inputSchema: { client: clientName },
|
|
92
|
+
}, safe(async ({ client }) => {
|
|
93
|
+
const target = manager.resolve(client);
|
|
94
|
+
const status = target.status();
|
|
95
|
+
if (status.probeConnected) {
|
|
96
|
+
try {
|
|
97
|
+
status.game = await target.state();
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// keep the last polled state
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return text(status);
|
|
104
|
+
}));
|
|
105
|
+
server.registerTool('get_entities', {
|
|
106
|
+
title: 'Entities the client sees',
|
|
107
|
+
description: 'Entities currently known to the client (what the server actually sent), with position, type, names and vehicle.',
|
|
108
|
+
inputSchema: { client: clientName, ...entityFilter },
|
|
109
|
+
}, safe(async ({ client, ...query }) => {
|
|
110
|
+
const list = await manager.resolve(client).entities(query);
|
|
111
|
+
return text({ count: list.length, entities: list });
|
|
112
|
+
}));
|
|
113
|
+
server.registerTool('send_chat', { title: 'Send chat', description: 'Sends a chat message as the player.', inputSchema: { client: clientName, message: z.string().min(1).max(256) } }, safe(async ({ client, message }) => {
|
|
114
|
+
await manager.resolve(client).chat(message);
|
|
115
|
+
return text('sent');
|
|
116
|
+
}));
|
|
117
|
+
server.registerTool('run_command', {
|
|
118
|
+
title: 'Run command',
|
|
119
|
+
description: 'Runs a command as the player (leading "/" optional). Output arrives as chat; use get_chat or wait_for to read it.',
|
|
120
|
+
inputSchema: { client: clientName, command: z.string().min(1).max(32_000) },
|
|
121
|
+
}, safe(async ({ client, command }) => {
|
|
122
|
+
const target = manager.resolve(client);
|
|
123
|
+
const before = target.chatSince(0).at(-1)?.seq ?? 0;
|
|
124
|
+
await target.command(command.replace(/^\//, ''));
|
|
125
|
+
await new Promise((r) => setTimeout(r, 750));
|
|
126
|
+
return text({ sent: true, chatSince: target.chatSince(before) });
|
|
127
|
+
}));
|
|
128
|
+
server.registerTool('screenshot', {
|
|
129
|
+
title: 'Screenshot',
|
|
130
|
+
description: 'Renders and returns the current view as a PNG image.',
|
|
131
|
+
inputSchema: { client: clientName, keep: z.boolean().optional().describe('Also keep the file in the instance screenshots folder') },
|
|
132
|
+
}, safe(async ({ client, keep }) => {
|
|
133
|
+
const shot = await manager.resolve(client).screenshot({ keep });
|
|
134
|
+
const content = [{ type: 'image', data: shot.png.toString('base64'), mimeType: 'image/png' }];
|
|
135
|
+
if (shot.path)
|
|
136
|
+
content.push({ type: 'text', text: shot.path });
|
|
137
|
+
return { content };
|
|
138
|
+
}));
|
|
139
|
+
server.registerTool('wait_for', {
|
|
140
|
+
title: 'Wait for a condition',
|
|
141
|
+
description: 'Blocks until a chat line matches, an entity appears/disappears, or the client reaches a phase.',
|
|
142
|
+
inputSchema: {
|
|
143
|
+
client: clientName,
|
|
144
|
+
chat: z.string().optional().describe('Case-insensitive regular expression matched against new chat lines'),
|
|
145
|
+
entity: z.object({ ...entityFilter, present: z.boolean().optional().describe('false waits for it to disappear') }).optional(),
|
|
146
|
+
phase: z.enum(['in_game', 'disconnected', 'reconnecting', 'crashed', 'stopped']).optional(),
|
|
147
|
+
timeoutSeconds: z.number().positive().max(600).default(30),
|
|
148
|
+
},
|
|
149
|
+
}, safe(async ({ client, timeoutSeconds, ...cond }) => {
|
|
150
|
+
if (!cond.chat && !cond.entity && !cond.phase)
|
|
151
|
+
throw new CalciteError('bad_condition', 'Give chat, entity or phase');
|
|
152
|
+
return text(await manager.resolve(client).waitFor(cond, timeoutSeconds * 1000));
|
|
153
|
+
}));
|
|
154
|
+
server.registerTool('get_chat', {
|
|
155
|
+
title: 'Chat history',
|
|
156
|
+
description: 'Chat lines received by the client. Pass the last seen seq as "since" to get only new lines.',
|
|
157
|
+
inputSchema: { client: clientName, since: z.number().int().nonnegative().optional(), limit: z.number().int().positive().max(1000).default(50) },
|
|
158
|
+
}, safe(async ({ client, since, limit }) => text(manager.resolve(client).chatSince(since ?? 0, limit))));
|
|
159
|
+
server.registerTool('get_logs', {
|
|
160
|
+
title: 'Client logs',
|
|
161
|
+
description: 'Game and Calcite log lines (useful when a launch fails or the client crashed).',
|
|
162
|
+
inputSchema: {
|
|
163
|
+
client: clientName,
|
|
164
|
+
since: z.number().int().nonnegative().optional(),
|
|
165
|
+
limit: z.number().int().positive().max(2000).default(100),
|
|
166
|
+
contains: z.string().optional(),
|
|
167
|
+
source: z.enum(['game', 'calcite']).optional(),
|
|
168
|
+
},
|
|
169
|
+
}, safe(async ({ client, ...q }) => text(manager.resolve(client).logsSince(q))));
|
|
170
|
+
server.registerTool('set_render', {
|
|
171
|
+
title: 'Toggle continuous rendering',
|
|
172
|
+
description: 'Turns continuous rendering on (e.g. while watching) or off (saves CPU). Screenshots work either way.',
|
|
173
|
+
inputSchema: { client: clientName, enabled: z.boolean() },
|
|
174
|
+
}, safe(async ({ client, enabled }) => {
|
|
175
|
+
await manager.resolve(client).setRender(enabled);
|
|
176
|
+
return text(`render ${enabled ? 'on' : 'off'}`);
|
|
177
|
+
}));
|
|
178
|
+
server.registerTool('respawn', { title: 'Respawn', description: 'Respawns the player after death.', inputSchema: { client: clientName } }, safe(async ({ client }) => {
|
|
179
|
+
await manager.resolve(client).respawn();
|
|
180
|
+
return text('respawned');
|
|
181
|
+
}));
|
|
182
|
+
server.registerTool('install_version', {
|
|
183
|
+
title: 'Pre-download a version',
|
|
184
|
+
description: 'Downloads a version (client, libraries, assets, Java) without launching, so the next launch is fast.',
|
|
185
|
+
inputSchema: { version: z.string().default('release') },
|
|
186
|
+
}, safe(async ({ version }) => text(await installVersion(version, { paths }))));
|
|
187
|
+
server.registerTool('list_versions', {
|
|
188
|
+
title: 'Available versions',
|
|
189
|
+
description: 'Minecraft versions from Mojang\'s manifest (newest first).',
|
|
190
|
+
inputSchema: { type: z.enum(['release', 'snapshot', 'old_beta', 'old_alpha', 'all']).default('release'), limit: z.number().int().positive().default(30) },
|
|
191
|
+
}, safe(async ({ type, limit }) => {
|
|
192
|
+
const manifest = await getManifest(paths);
|
|
193
|
+
const versions = manifest.versions.filter((v) => type === 'all' || v.type === type).slice(0, limit);
|
|
194
|
+
return text({ latest: manifest.latest, versions: versions.map((v) => ({ id: v.id, type: v.type, releaseTime: v.releaseTime })) });
|
|
195
|
+
}));
|
|
196
|
+
server.registerTool('account_list', { title: 'Stored Microsoft accounts', description: 'Microsoft accounts whose login is saved.', inputSchema: {} }, safe(async () => text(await listAccounts(paths))));
|
|
197
|
+
server.registerTool('account_login_start', {
|
|
198
|
+
title: 'Start Microsoft login',
|
|
199
|
+
description: 'Starts a Microsoft device login. Returns a URL the user must open in a browser and approve; then poll account_login_status. The session is saved and refreshed automatically.',
|
|
200
|
+
inputSchema: {},
|
|
201
|
+
}, safe(async () => {
|
|
202
|
+
const id = ++loginSeq;
|
|
203
|
+
const handle = await startLogin(paths);
|
|
204
|
+
const entry = { handle };
|
|
205
|
+
logins.set(id, entry);
|
|
206
|
+
handle.done.then((n) => (entry.result = n), (e) => (entry.error = e.message));
|
|
207
|
+
entry.url = await handle.url;
|
|
208
|
+
return text({ loginId: id, url: entry.url, next: 'Ask the user to open the URL and sign in, then call account_login_status' });
|
|
209
|
+
}));
|
|
210
|
+
server.registerTool('account_login_status', {
|
|
211
|
+
title: 'Microsoft login status',
|
|
212
|
+
description: 'Waits up to waitSeconds for a pending login started with account_login_start.',
|
|
213
|
+
inputSchema: { loginId: z.number().int(), waitSeconds: z.number().min(0).max(120).default(30) },
|
|
214
|
+
}, safe(async ({ loginId, waitSeconds }) => {
|
|
215
|
+
const entry = logins.get(loginId);
|
|
216
|
+
if (!entry)
|
|
217
|
+
throw new CalciteError('unknown_login', `No login with id ${loginId}`);
|
|
218
|
+
if (!entry.result && !entry.error) {
|
|
219
|
+
await Promise.race([entry.handle.done.catch(() => undefined), new Promise((r) => setTimeout(r, waitSeconds * 1000))]);
|
|
220
|
+
}
|
|
221
|
+
if (entry.result)
|
|
222
|
+
return text({ status: 'done', account: entry.result });
|
|
223
|
+
if (entry.error)
|
|
224
|
+
return text({ status: 'failed', error: entry.error });
|
|
225
|
+
return text({ status: 'pending', url: entry.url });
|
|
226
|
+
}));
|
|
227
|
+
server.registerTool('account_remove', { title: 'Remove a stored account', description: 'Deletes a saved Microsoft login.', inputSchema: { account: z.string() } }, safe(async ({ account }) => {
|
|
228
|
+
if (!(await removeAccount(paths, account)))
|
|
229
|
+
throw new CalciteError('unknown_account', `No stored account named "${account}"`);
|
|
230
|
+
return text(`Removed ${account}`);
|
|
231
|
+
}));
|
|
232
|
+
return { server, manager };
|
|
233
|
+
}
|
|
234
|
+
/** Runs the MCP server over stdio until the client disconnects. stdout carries only protocol messages. */
|
|
235
|
+
export async function runMcpStdio(opts = {}) {
|
|
236
|
+
const { server, manager } = createMcpServer(opts);
|
|
237
|
+
const transport = new StdioServerTransport();
|
|
238
|
+
let closing = false;
|
|
239
|
+
const close = async () => {
|
|
240
|
+
if (closing)
|
|
241
|
+
return;
|
|
242
|
+
closing = true;
|
|
243
|
+
await manager.stopAll();
|
|
244
|
+
process.exit(0);
|
|
245
|
+
};
|
|
246
|
+
transport.onclose = () => void close();
|
|
247
|
+
process.stdin.once('end', () => void close());
|
|
248
|
+
process.once('SIGINT', () => void close());
|
|
249
|
+
process.once('SIGTERM', () => void close());
|
|
250
|
+
await server.connect(transport);
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/mojang.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { CalcitePaths } from './paths.js';
|
|
2
|
+
export declare const MANIFEST_URL = "https://piston-meta.mojang.com/mc/game/version_manifest_v2.json";
|
|
3
|
+
export interface ManifestVersion {
|
|
4
|
+
id: string;
|
|
5
|
+
type: 'release' | 'snapshot' | 'old_beta' | 'old_alpha' | string;
|
|
6
|
+
url: string;
|
|
7
|
+
sha1: string;
|
|
8
|
+
releaseTime: string;
|
|
9
|
+
}
|
|
10
|
+
export interface Manifest {
|
|
11
|
+
latest: {
|
|
12
|
+
release: string;
|
|
13
|
+
snapshot: string;
|
|
14
|
+
};
|
|
15
|
+
versions: ManifestVersion[];
|
|
16
|
+
}
|
|
17
|
+
interface Download {
|
|
18
|
+
url: string;
|
|
19
|
+
sha1: string;
|
|
20
|
+
size: number;
|
|
21
|
+
}
|
|
22
|
+
export interface VersionJson {
|
|
23
|
+
id: string;
|
|
24
|
+
type: string;
|
|
25
|
+
releaseTime: string;
|
|
26
|
+
javaVersion?: {
|
|
27
|
+
majorVersion: number;
|
|
28
|
+
component?: string;
|
|
29
|
+
};
|
|
30
|
+
downloads: {
|
|
31
|
+
client: Download;
|
|
32
|
+
client_mappings?: Download;
|
|
33
|
+
server?: Download;
|
|
34
|
+
};
|
|
35
|
+
arguments?: {
|
|
36
|
+
game?: unknown[];
|
|
37
|
+
jvm?: unknown[];
|
|
38
|
+
};
|
|
39
|
+
minecraftArguments?: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function getManifest(paths: CalcitePaths, { refresh }?: {
|
|
42
|
+
refresh?: boolean | undefined;
|
|
43
|
+
}): Promise<Manifest>;
|
|
44
|
+
/** Resolves "latest"/"release", "snapshot"/"latest-snapshot" or an exact id. */
|
|
45
|
+
export declare function resolveVersion(paths: CalcitePaths, spec: string): Promise<ManifestVersion>;
|
|
46
|
+
/** Version JSON, stored where HeadlessMC expects it (minecraft/versions/<id>/<id>.json). */
|
|
47
|
+
export declare function getVersionJson(paths: CalcitePaths, version: ManifestVersion): Promise<VersionJson>;
|
|
48
|
+
/** Downloads the client jar where HeadlessMC expects it. */
|
|
49
|
+
export declare function ensureClientJar(paths: CalcitePaths, json: VersionJson): Promise<string>;
|
|
50
|
+
/** Java major version required by the game (versions before 1.17 default to 8). */
|
|
51
|
+
export declare function requiredJavaMajor(json: VersionJson): number;
|
|
52
|
+
/** Whether the game understands --quickPlayMultiplayer (1.20+); older versions use --server/--port. */
|
|
53
|
+
export declare function supportsQuickPlay(json: VersionJson): boolean;
|
|
54
|
+
export type NameMode = {
|
|
55
|
+
kind: 'mappings';
|
|
56
|
+
file: string;
|
|
57
|
+
} | {
|
|
58
|
+
kind: 'official';
|
|
59
|
+
} | {
|
|
60
|
+
kind: 'unsupported';
|
|
61
|
+
reason: string;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* How the probe can find game classes: Mojang mappings (obfuscated 1.14.4+), official names (unobfuscated
|
|
65
|
+
* releases such as 26.1+), or unsupported (obfuscated versions without published mappings, before 1.14.4).
|
|
66
|
+
*/
|
|
67
|
+
export declare function resolveNames(paths: CalcitePaths, json: VersionJson, clientJar: string): Promise<NameMode>;
|
|
68
|
+
/** Checks the zip central directory for an entry name (no full extraction). */
|
|
69
|
+
export declare function zipContains(file: string, entry: string): Promise<boolean>;
|
|
70
|
+
export {};
|
package/dist/mojang.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { mkdir, open, readFile, stat, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { download, httpJson } from './net.js';
|
|
4
|
+
export const MANIFEST_URL = 'https://piston-meta.mojang.com/mc/game/version_manifest_v2.json';
|
|
5
|
+
const MANIFEST_TTL_MS = 10 * 60_000;
|
|
6
|
+
export async function getManifest(paths, { refresh = false } = {}) {
|
|
7
|
+
const file = join(paths.meta, 'version_manifest_v2.json');
|
|
8
|
+
if (!refresh) {
|
|
9
|
+
try {
|
|
10
|
+
const info = await stat(file);
|
|
11
|
+
if (Date.now() - info.mtimeMs < MANIFEST_TTL_MS) {
|
|
12
|
+
return JSON.parse(await readFile(file, 'utf8'));
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// fetch below
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const manifest = await httpJson(MANIFEST_URL);
|
|
21
|
+
await mkdir(paths.meta, { recursive: true });
|
|
22
|
+
await writeFile(file, JSON.stringify(manifest));
|
|
23
|
+
return manifest;
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
// offline: fall back to a stale cache
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(await readFile(file, 'utf8'));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Resolves "latest"/"release", "snapshot"/"latest-snapshot" or an exact id. */
|
|
36
|
+
export async function resolveVersion(paths, spec) {
|
|
37
|
+
const manifest = await getManifest(paths);
|
|
38
|
+
let id = spec;
|
|
39
|
+
if (spec === 'latest' || spec === 'release' || spec === 'latest-release')
|
|
40
|
+
id = manifest.latest.release;
|
|
41
|
+
if (spec === 'snapshot' || spec === 'latest-snapshot')
|
|
42
|
+
id = manifest.latest.snapshot;
|
|
43
|
+
const found = manifest.versions.find((v) => v.id === id);
|
|
44
|
+
if (!found) {
|
|
45
|
+
const refreshed = await getManifest(paths, { refresh: true });
|
|
46
|
+
const again = refreshed.versions.find((v) => v.id === id);
|
|
47
|
+
if (!again)
|
|
48
|
+
throw new Error(`Unknown Minecraft version "${spec}"`);
|
|
49
|
+
return again;
|
|
50
|
+
}
|
|
51
|
+
return found;
|
|
52
|
+
}
|
|
53
|
+
/** Version JSON, stored where HeadlessMC expects it (minecraft/versions/<id>/<id>.json). */
|
|
54
|
+
export async function getVersionJson(paths, version) {
|
|
55
|
+
const file = join(paths.minecraft, 'versions', version.id, `${version.id}.json`);
|
|
56
|
+
await download(version.url, file, { sha1: version.sha1 });
|
|
57
|
+
return JSON.parse(await readFile(file, 'utf8'));
|
|
58
|
+
}
|
|
59
|
+
/** Downloads the client jar where HeadlessMC expects it. */
|
|
60
|
+
export async function ensureClientJar(paths, json) {
|
|
61
|
+
const file = join(paths.minecraft, 'versions', json.id, `${json.id}.jar`);
|
|
62
|
+
await download(json.downloads.client.url, file, { sha1: json.downloads.client.sha1 });
|
|
63
|
+
return file;
|
|
64
|
+
}
|
|
65
|
+
/** Java major version required by the game (versions before 1.17 default to 8). */
|
|
66
|
+
export function requiredJavaMajor(json) {
|
|
67
|
+
return json.javaVersion?.majorVersion ?? 8;
|
|
68
|
+
}
|
|
69
|
+
/** Whether the game understands --quickPlayMultiplayer (1.20+); older versions use --server/--port. */
|
|
70
|
+
export function supportsQuickPlay(json) {
|
|
71
|
+
return JSON.stringify(json.arguments?.game ?? []).includes('quickPlayMultiplayer');
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* How the probe can find game classes: Mojang mappings (obfuscated 1.14.4+), official names (unobfuscated
|
|
75
|
+
* releases such as 26.1+), or unsupported (obfuscated versions without published mappings, before 1.14.4).
|
|
76
|
+
*/
|
|
77
|
+
export async function resolveNames(paths, json, clientJar) {
|
|
78
|
+
if (json.downloads.client_mappings) {
|
|
79
|
+
const file = join(paths.mappings, `${json.id}-client.txt`);
|
|
80
|
+
await download(json.downloads.client_mappings.url, file, { sha1: json.downloads.client_mappings.sha1 });
|
|
81
|
+
return { kind: 'mappings', file };
|
|
82
|
+
}
|
|
83
|
+
if (await zipContains(clientJar, 'net/minecraft/client/Minecraft.class')) {
|
|
84
|
+
return { kind: 'official' };
|
|
85
|
+
}
|
|
86
|
+
return { kind: 'unsupported', reason: `Minecraft ${json.id} is obfuscated and Mojang published no mappings for it (needs 1.14.4+)` };
|
|
87
|
+
}
|
|
88
|
+
/** Checks the zip central directory for an entry name (no full extraction). */
|
|
89
|
+
export async function zipContains(file, entry) {
|
|
90
|
+
const handle = await open(file, 'r');
|
|
91
|
+
try {
|
|
92
|
+
const { size } = await handle.stat();
|
|
93
|
+
const tailSize = Math.min(size, 65_557);
|
|
94
|
+
const tail = Buffer.alloc(tailSize);
|
|
95
|
+
await handle.read(tail, 0, tailSize, size - tailSize);
|
|
96
|
+
const eocd = tail.lastIndexOf(Buffer.from([0x50, 0x4b, 0x05, 0x06]));
|
|
97
|
+
if (eocd < 0)
|
|
98
|
+
throw new Error(`Not a zip file: ${file}`);
|
|
99
|
+
const cdSize = tail.readUInt32LE(eocd + 12);
|
|
100
|
+
const cdOffset = tail.readUInt32LE(eocd + 16);
|
|
101
|
+
const cd = Buffer.alloc(cdSize);
|
|
102
|
+
await handle.read(cd, 0, cdSize, cdOffset);
|
|
103
|
+
return cd.includes(Buffer.from(entry, 'utf8'));
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
await handle.close();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=mojang.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mojang.js","sourceRoot":"","sources":["../src/mojang.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAG9C,MAAM,CAAC,MAAM,YAAY,GAAG,iEAAiE,CAAC;AA+B9F,MAAM,eAAe,GAAG,EAAE,GAAG,MAAM,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAmB,EAAE,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,EAAE;IAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,eAAe,EAAE,CAAC;gBAChD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAa,CAAC;YAC9D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAW,YAAY,CAAC,CAAC;QACxD,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,sCAAsC;QACtC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAa,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAmB,EAAE,IAAY;IACpE,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,EAAE,GAAG,IAAI,CAAC;IACd,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,gBAAgB;QAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACvG,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,iBAAiB;QAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;IACrF,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,GAAG,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAmB,EAAE,OAAwB;IAChF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACjF,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAgB,CAAC;AACjE,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAmB,EAAE,IAAiB;IAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1E,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACtF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,OAAO,IAAI,CAAC,WAAW,EAAE,YAAY,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;AACrF,CAAC;AAOD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAmB,EAAE,IAAiB,EAAE,SAAiB;IAC1F,IAAI,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;QAC3D,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;QACxG,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACpC,CAAC;IACD,IAAI,MAAM,WAAW,CAAC,SAAS,EAAE,sCAAsC,CAAC,EAAE,CAAC;QACzE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,IAAI,CAAC,EAAE,wEAAwE,EAAE,CAAC;AACvI,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,KAAa;IAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACrE,IAAI,IAAI,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC3C,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|
package/dist/net.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const USER_AGENT = "calcite (+https://github.com/bkm016/Calcite)";
|
|
2
|
+
export declare class HttpError extends Error {
|
|
3
|
+
readonly url: string;
|
|
4
|
+
readonly status: number;
|
|
5
|
+
constructor(url: string, status: number);
|
|
6
|
+
}
|
|
7
|
+
/** NO_PROXY matching: "*", exact hosts, ".suffix"/"suffix" domains, host:port and IPv4 CIDR. */
|
|
8
|
+
export declare function bypassProxy(target: URL, noProxy?: string): boolean;
|
|
9
|
+
/** The proxy to use for {@code target}, honouring HTTPS_PROXY / HTTP_PROXY / NO_PROXY (any case). */
|
|
10
|
+
export declare function proxyFor(target: URL): URL | undefined;
|
|
11
|
+
export declare function httpText(url: string): Promise<string>;
|
|
12
|
+
export declare function httpJson<T>(url: string): Promise<T>;
|
|
13
|
+
export declare function hashFile(file: string, algorithm: 'sha1' | 'sha256'): Promise<string>;
|
|
14
|
+
export interface DownloadOptions {
|
|
15
|
+
sha1?: string;
|
|
16
|
+
sha256?: string;
|
|
17
|
+
/** Skip the download when the file exists and (if a hash is given) matches. */
|
|
18
|
+
reuse?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** Downloads to {@code dest} atomically (temp file + rename) and verifies the hash when given. */
|
|
21
|
+
export declare function download(url: string, dest: string, opts?: DownloadOptions): Promise<string>;
|