@bkm016/calcite 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +416 -2
  3. package/THIRD_PARTY_NOTICES.md +44 -0
  4. package/dist/accounts.d.ts +46 -0
  5. package/dist/accounts.js +194 -0
  6. package/dist/accounts.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +332 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/client-core.d.ts +66 -0
  11. package/dist/client-core.js +530 -0
  12. package/dist/client-core.js.map +1 -0
  13. package/dist/client.d.ts +127 -0
  14. package/dist/client.js +185 -0
  15. package/dist/client.js.map +1 -0
  16. package/dist/display.d.ts +23 -0
  17. package/dist/display.js +164 -0
  18. package/dist/display.js.map +1 -0
  19. package/dist/hmc.d.ts +53 -0
  20. package/dist/hmc.js +168 -0
  21. package/dist/hmc.js.map +1 -0
  22. package/dist/index.d.ts +11 -0
  23. package/dist/index.js +8 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/install.d.ts +48 -0
  26. package/dist/install.js +119 -0
  27. package/dist/install.js.map +1 -0
  28. package/dist/java.d.ts +37 -0
  29. package/dist/java.js +222 -0
  30. package/dist/java.js.map +1 -0
  31. package/dist/loaders.d.ts +41 -0
  32. package/dist/loaders.js +86 -0
  33. package/dist/loaders.js.map +1 -0
  34. package/dist/lock.d.ts +13 -0
  35. package/dist/lock.js +79 -0
  36. package/dist/lock.js.map +1 -0
  37. package/dist/log.d.ts +13 -0
  38. package/dist/log.js +20 -0
  39. package/dist/log.js.map +1 -0
  40. package/dist/manager.d.ts +15 -0
  41. package/dist/manager.js +65 -0
  42. package/dist/manager.js.map +1 -0
  43. package/dist/mcp.d.ts +13 -0
  44. package/dist/mcp.js +377 -0
  45. package/dist/mcp.js.map +1 -0
  46. package/dist/mods.d.ts +21 -0
  47. package/dist/mods.js +135 -0
  48. package/dist/mods.js.map +1 -0
  49. package/dist/mojang.d.ts +54 -0
  50. package/dist/mojang.js +73 -0
  51. package/dist/mojang.js.map +1 -0
  52. package/dist/names.d.ts +53 -0
  53. package/dist/names.js +267 -0
  54. package/dist/names.js.map +1 -0
  55. package/dist/net.d.ts +26 -0
  56. package/dist/net.js +286 -0
  57. package/dist/net.js.map +1 -0
  58. package/dist/options.d.ts +14 -0
  59. package/dist/options.js +50 -0
  60. package/dist/options.js.map +1 -0
  61. package/dist/paths.d.ts +29 -0
  62. package/dist/paths.js +49 -0
  63. package/dist/paths.js.map +1 -0
  64. package/dist/probe-server.d.ts +28 -0
  65. package/dist/probe-server.js +132 -0
  66. package/dist/probe-server.js.map +1 -0
  67. package/dist/types.d.ts +235 -0
  68. package/dist/types.js +25 -0
  69. package/dist/types.js.map +1 -0
  70. package/dist/version.d.ts +2 -0
  71. package/dist/version.js +11 -0
  72. package/dist/version.js.map +1 -0
  73. package/dist/zip.d.ts +5 -0
  74. package/dist/zip.js +65 -0
  75. package/dist/zip.js.map +1 -0
  76. package/package.json +57 -4
  77. package/vendor/calcite-probe.jar +0 -0
@@ -0,0 +1,194 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { chmod, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
3
+ import { dirname, join } from 'node:path';
4
+ import { ensureHmc, killTree, runHmc } from './hmc.js';
5
+ import { ensureLauncherJava } from './java.js';
6
+ import { withLock } from './lock.js';
7
+ /** HeadlessMC account providers. */
8
+ const MICROSOFT = 'default';
9
+ const OFFLINE = 'offline';
10
+ /** HeadlessMC files location holding the Microsoft sessions created by `calcite login`. */
11
+ export function accountsHome(paths) {
12
+ return paths.hmcHome;
13
+ }
14
+ /** HeadlessMC 3 stores the sessions (including refresh tokens) of one provider in this file. */
15
+ function storeFile(location, provider) {
16
+ return join(location, '.auth', provider, '.accounts.json');
17
+ }
18
+ function lastUsedFile(location) {
19
+ return join(location, '.auth', 'last', '.accounts.json');
20
+ }
21
+ /** Microsoft sessions of `calcite login`; Calcite restricts the file to the current user. */
22
+ export function accountsFile(paths) {
23
+ return storeFile(accountsHome(paths), MICROSOFT);
24
+ }
25
+ export function accountsLock(paths) {
26
+ return join(paths.hmcHome, 'accounts.lock');
27
+ }
28
+ async function readStore(file) {
29
+ try {
30
+ const data = JSON.parse(await readFile(file, 'utf8'));
31
+ return data.accounts && typeof data.accounts === 'object' && !Array.isArray(data.accounts) ? data.accounts : {};
32
+ }
33
+ catch {
34
+ return {};
35
+ }
36
+ }
37
+ async function writeStore(file, accounts) {
38
+ await mkdir(dirname(file), { recursive: true });
39
+ await writeFile(file, JSON.stringify({ accounts, version: 0 }, null, 2), { mode: 0o600 });
40
+ if (process.platform !== 'win32')
41
+ await chmod(file, 0o600).catch(() => undefined); // Windows: the profile ACL applies
42
+ }
43
+ function findKey(accounts, name) {
44
+ return Object.keys(accounts).find((k) => k.toLowerCase() === name.toLowerCase());
45
+ }
46
+ /** The Minecraft profile id inside a stored MinecraftAuth session (an object carrying both the name and the id). */
47
+ function findUuid(session, name) {
48
+ const stack = [session];
49
+ while (stack.length) {
50
+ const node = stack.pop();
51
+ if (!node || typeof node !== 'object')
52
+ continue;
53
+ const obj = node;
54
+ if (typeof obj.name === 'string' && obj.name.toLowerCase() === name.toLowerCase() && typeof obj.id === 'string')
55
+ return obj.id;
56
+ for (const v of Object.values(obj))
57
+ if (v && typeof v === 'object')
58
+ stack.push(v);
59
+ }
60
+ return undefined;
61
+ }
62
+ /** Name of the most recently used Microsoft account of a HeadlessMC location. */
63
+ async function lastUsed(location) {
64
+ const latest = (await readStore(lastUsedFile(location))).latest;
65
+ if (!Array.isArray(latest))
66
+ return undefined;
67
+ const entry = latest.find((e) => e && typeof e === 'object' && e.provider === MICROSOFT);
68
+ return typeof entry?.name === 'string' ? entry.name : undefined;
69
+ }
70
+ /** Stored Microsoft accounts (no secrets). */
71
+ export async function listAccounts(paths) {
72
+ const accounts = await readStore(accountsFile(paths));
73
+ const names = Object.keys(accounts);
74
+ const last = await lastUsed(accountsHome(paths));
75
+ const primary = (last && findKey(accounts, last)) ?? names[0];
76
+ return names.map((name) => ({ name, uuid: findUuid(accounts[name], name), primary: name === primary }));
77
+ }
78
+ export async function removeAccount(paths, name) {
79
+ return withLock(accountsLock(paths), async () => {
80
+ const accounts = await readStore(accountsFile(paths));
81
+ const key = findKey(accounts, name);
82
+ if (!key)
83
+ return false;
84
+ delete accounts[key];
85
+ await writeStore(accountsFile(paths), accounts);
86
+ return true;
87
+ });
88
+ }
89
+ /** UUID the vanilla server assigns to an offline player (version 3, from "OfflinePlayer:<name>"), without dashes. */
90
+ export function offlineUuid(name) {
91
+ const hash = createHash('md5').update(`OfflinePlayer:${name}`, 'utf8').digest();
92
+ hash[6] = (hash[6] & 0x0f) | 0x30;
93
+ hash[8] = (hash[8] & 0x3f) | 0x80;
94
+ return hash.toString('hex');
95
+ }
96
+ /**
97
+ * Prepares the private HeadlessMC location of one client so that HeadlessMC launches exactly this account.
98
+ * Microsoft sessions are copied from the `calcite login` store; {@link syncAccount} writes refreshed tokens back.
99
+ * Returns the account name.
100
+ */
101
+ export async function prepareAccount(paths, location, account) {
102
+ if (account.type === 'offline') {
103
+ const name = account.username;
104
+ await rm(storeFile(location, MICROSOFT), { force: true });
105
+ await writeStore(storeFile(location, OFFLINE), {
106
+ [name]: { provider: OFFLINE, name, uuid: offlineUuid(name), token: '', type: 'msa', xuid: '' },
107
+ });
108
+ await writeStore(lastUsedFile(location), { latest: [{ provider: OFFLINE, name }] });
109
+ return name;
110
+ }
111
+ return withLock(accountsLock(paths), async () => {
112
+ const accounts = await listAccounts(paths);
113
+ if (!accounts.length)
114
+ throw Object.assign(new Error('No Microsoft account is stored; run `calcite login` first'), { code: 'not_logged_in' });
115
+ const wanted = account.name;
116
+ const match = wanted ? accounts.find((a) => a.name.toLowerCase() === wanted.toLowerCase()) : accounts.find((a) => a.primary);
117
+ if (!match) {
118
+ throw Object.assign(new Error(`No stored Microsoft account named "${wanted}" (have: ${accounts.map((a) => a.name).join(', ')})`), { code: 'unknown_account' });
119
+ }
120
+ const session = (await readStore(accountsFile(paths)))[match.name];
121
+ await rm(storeFile(location, OFFLINE), { force: true });
122
+ await writeStore(storeFile(location, MICROSOFT), { [match.name]: session });
123
+ await writeStore(lastUsedFile(location), { latest: [{ provider: MICROSOFT, name: match.name }] });
124
+ return match.name;
125
+ });
126
+ }
127
+ /** Copies a Microsoft session refreshed by a launch back into the `calcite login` store. */
128
+ export async function syncAccount(paths, location, name) {
129
+ const local = await readStore(storeFile(location, MICROSOFT));
130
+ const key = findKey(local, name);
131
+ if (!key)
132
+ return;
133
+ await withLock(accountsLock(paths), async () => {
134
+ const accounts = await readStore(accountsFile(paths));
135
+ const central = findKey(accounts, name);
136
+ if (!central || JSON.stringify(accounts[central]) === JSON.stringify(local[key]))
137
+ return; // removed meanwhile, or unchanged
138
+ accounts[central] = local[key];
139
+ await writeStore(accountsFile(paths), accounts);
140
+ });
141
+ }
142
+ /**
143
+ * Starts a Microsoft device-code login through HeadlessMC. The session (including the refresh token) is stored
144
+ * in Calcite's HeadlessMC location and refreshed automatically on every launch.
145
+ */
146
+ export async function startLogin(paths, { timeoutMs = 15 * 60_000 } = {}) {
147
+ const java = await ensureLauncherJava(paths);
148
+ const hmcJar = await ensureHmc(paths);
149
+ let resolveUrl;
150
+ let rejectUrl;
151
+ const url = new Promise((res, rej) => {
152
+ resolveUrl = res;
153
+ rejectUrl = rej;
154
+ });
155
+ let failure = '';
156
+ let account = '';
157
+ const run = runHmc({
158
+ javaPath: java.path,
159
+ hmcJar,
160
+ location: accountsHome(paths),
161
+ command: ['login'],
162
+ onLine: (line) => {
163
+ const go = /To login visit (https?:\/\/\S+)/.exec(line);
164
+ if (go)
165
+ resolveUrl(go[1]);
166
+ const ok = /Logged in to account (.+?) successfully/.exec(line);
167
+ if (ok)
168
+ account = ok[1];
169
+ if (/AuthException|Failed to login|You can't play|Exception:/.test(line) && !failure)
170
+ failure = line.trim();
171
+ },
172
+ });
173
+ const timer = setTimeout(() => void killTree(run.child), timeoutMs);
174
+ const done = run.exited.then(async () => {
175
+ clearTimeout(timer);
176
+ if (!account) {
177
+ const err = new Error(failure || 'Login did not complete (timed out or cancelled)');
178
+ rejectUrl(err);
179
+ throw err;
180
+ }
181
+ await chmod(accountsFile(paths), 0o600).catch(() => undefined);
182
+ return account;
183
+ });
184
+ done.catch(() => undefined);
185
+ return {
186
+ url,
187
+ done,
188
+ async cancel() {
189
+ clearTimeout(timer);
190
+ await killTree(run.child);
191
+ },
192
+ };
193
+ }
194
+ //# sourceMappingURL=accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,332 @@
1
+ #!/usr/bin/env node
2
+ import { writeFile } from 'node:fs/promises';
3
+ import { createInterface } from 'node:readline';
4
+ import { Command, InvalidArgumentError, Option } from 'commander';
5
+ import { listAccounts, removeAccount, startLogin } from './accounts.js';
6
+ import { Client, defaultUsername, installVersion } from './client.js';
7
+ import { hasSharedLib, which } from './display.js';
8
+ import { findJavaInstalls } from './java.js';
9
+ import { setLogLevel } from './log.js';
10
+ import { getManifest } from './mojang.js';
11
+ import { runMcpStdio } from './mcp.js';
12
+ import { resolvePaths } from './paths.js';
13
+ import { VERSION } from './version.js';
14
+ const out = (line = '') => process.stdout.write(`${line}\n`);
15
+ function positiveInt(value) {
16
+ const n = Number(value);
17
+ if (!Number.isInteger(n) || n <= 0)
18
+ throw new InvalidArgumentError('must be a positive integer');
19
+ return n;
20
+ }
21
+ function fail(err) {
22
+ const e = err;
23
+ process.stderr.write(`error${e.code ? ` [${e.code}]` : ''}: ${e.message}\n`);
24
+ process.exit(1);
25
+ }
26
+ const json = (value) => out(JSON.stringify(value, null, 2));
27
+ /** Interactive action commands of `calcite launch`; returns false for unknown commands. */
28
+ async function action(client, line) {
29
+ const [cmd, ...rest] = line.slice(1).split(/\s+/);
30
+ const n = rest.map(Number);
31
+ const need = (count) => {
32
+ if (n.length < count || n.slice(0, count).some((v) => !Number.isFinite(v)))
33
+ throw new Error(`:${cmd} needs ${count} numbers`);
34
+ };
35
+ switch (cmd) {
36
+ case 'look':
37
+ need(2);
38
+ json(await client.look({ yaw: n[0], pitch: n[1] }));
39
+ return true;
40
+ case 'lookat':
41
+ need(3);
42
+ json(await client.look({ x: n[0], y: n[1], z: n[2] }));
43
+ return true;
44
+ case 'goto':
45
+ need(2);
46
+ json(await client.walkTo(n[0], n[1]));
47
+ return true;
48
+ case 'move': {
49
+ const controls = Object.fromEntries((rest[0] ?? '').split(',').filter(Boolean).map((c) => [c, true]));
50
+ json(await client.move(controls, { ticks: rest[1] ? Number(rest[1]) : 20 }));
51
+ return true;
52
+ }
53
+ case 'stop':
54
+ await client.stopActions();
55
+ return true;
56
+ case 'attack':
57
+ json(await client.attack(rest[0] ? Number(rest[0]) : undefined));
58
+ return true;
59
+ case 'use':
60
+ if (rest.length >= 3) {
61
+ need(3);
62
+ json(await client.use({ block: { x: n[0], y: n[1], z: n[2] }, holdTicks: n[3] || undefined }));
63
+ }
64
+ else {
65
+ json(await client.use({ entityId: rest[0] ? n[0] : undefined, holdTicks: n[1] || undefined }));
66
+ }
67
+ return true;
68
+ case 'dig':
69
+ need(3);
70
+ json(await client.dig({ x: n[0], y: n[1], z: n[2] }));
71
+ return true;
72
+ case 'block':
73
+ need(3);
74
+ json(await client.block({ x: n[0], y: n[1], z: n[2] }));
75
+ return true;
76
+ case 'target':
77
+ json(await client.target());
78
+ return true;
79
+ case 'inv':
80
+ json(await client.inventory());
81
+ return true;
82
+ case 'slot':
83
+ need(1);
84
+ json(await client.selectSlot(n[0]));
85
+ return true;
86
+ case 'container':
87
+ json(await client.container());
88
+ return true;
89
+ case 'click':
90
+ need(1);
91
+ json(await client.click(n[0], { button: rest[1] ? n[1] : 0, mode: rest[2] ?? 'pickup' }));
92
+ return true;
93
+ case 'close':
94
+ await client.closeContainer();
95
+ return true;
96
+ case 'drop':
97
+ json(await client.drop({ all: rest[0] === 'all' }));
98
+ return true;
99
+ default:
100
+ return false;
101
+ }
102
+ }
103
+ function collect(value, previous) {
104
+ return [...previous, value];
105
+ }
106
+ const program = new Command()
107
+ .name('calcite')
108
+ .description('Run real Minecraft clients headlessly for testing and AI agents')
109
+ .version(VERSION, '--version') // -V is the launch command's --mc-version
110
+ .option('-v, --verbose', 'debug logging')
111
+ .hook('preAction', (cmd) => {
112
+ if (cmd.opts().verbose)
113
+ setLogLevel('debug');
114
+ });
115
+ program
116
+ .command('launch')
117
+ .description('Launch a client and control it from the terminal')
118
+ .argument('[server]', 'host[:port] to join')
119
+ .option('-n, --name <name>', 'client / instance name', 'calcite')
120
+ .option('-V, --mc-version <version>', 'Minecraft version, "release" or "snapshot"', 'release')
121
+ .option('-l, --loader <loader>', 'mod loader: fabric, forge or neoforge, optionally @version (e.g. fabric@0.19.5)')
122
+ .option('--mod <spec>', 'mod jar, folder, URL or modrinth:<project>[@version] (repeatable; needs --loader)', collect, [])
123
+ .option('-u, --username <name>', 'offline username (default: the client name)')
124
+ .option('-m, --microsoft [account]', 'use a stored Microsoft account (primary one, or by name)')
125
+ .addOption(new Option('-r, --render <mode>', 'renderer mode').choices(['on-demand', 'always', 'off']).default('on-demand'))
126
+ .option('--java <path>', 'java executable to use')
127
+ .option('--no-java-download', 'never download a Java runtime')
128
+ .option('--memory <size>', 'max heap, e.g. 2G', '2G')
129
+ .option('--no-reconnect', 'do not rejoin after a disconnect or crash')
130
+ .action(async (server, o) => {
131
+ const account = o.microsoft
132
+ ? { type: 'microsoft', name: typeof o.microsoft === 'string' ? o.microsoft : undefined }
133
+ : { type: 'offline', username: o.username ?? defaultUsername(o.name) };
134
+ const client = new Client({
135
+ name: o.name,
136
+ version: o.mcVersion,
137
+ loader: o.loader,
138
+ mods: o.mod,
139
+ server,
140
+ account,
141
+ render: o.render,
142
+ javaPath: o.java,
143
+ allowJavaDownload: o.javaDownload,
144
+ memory: o.memory,
145
+ reconnect: o.reconnect,
146
+ });
147
+ client.on('phase', (p) => process.stderr.write(`[${p}]\n`));
148
+ client.on('chat', (c) => out(c.message));
149
+ let stopping = false;
150
+ const stop = async (code = 0) => {
151
+ if (stopping)
152
+ return;
153
+ stopping = true;
154
+ await client.stop();
155
+ process.exit(code);
156
+ };
157
+ process.once('SIGINT', () => void stop(130));
158
+ process.once('SIGTERM', () => void stop(143));
159
+ try {
160
+ await client.start();
161
+ }
162
+ catch (err) {
163
+ process.stderr.write(client.logsSince({ limit: 30 }).map((l) => ` ${l.line}`).join('\n') + '\n');
164
+ await client.stop();
165
+ fail(err);
166
+ }
167
+ process.stderr.write('Ready. Type chat, /command, or :state :ents [radius] :shot [file] :render on|off :respawn :quit\n' +
168
+ 'Actions: :look yaw pitch | :lookat x y z | :goto x z | :move forward,jump [ticks] | :stop | :attack [id] | :use [id | x y z] [hold]\n' +
169
+ ' :dig x y z | :block x y z | :target | :inv | :slot n | :container | :click slot [button] [mode] | :close | :drop [all]\n');
170
+ const rl = createInterface({ input: process.stdin });
171
+ rl.on('close', () => void stop());
172
+ for await (const raw of rl) {
173
+ const line = raw.trim();
174
+ if (!line)
175
+ continue;
176
+ try {
177
+ if (line === ':quit' || line === ':q')
178
+ break;
179
+ else if (line === ':state')
180
+ out(JSON.stringify(await client.state(), null, 2));
181
+ else if (line.startsWith(':ents')) {
182
+ const radius = Number(line.split(/\s+/)[1] ?? 32);
183
+ for (const e of await client.entities({ radius })) {
184
+ out(`${e.id}\t${e.type}\t${e.name ?? ''}${e.customName ? ` (${e.customName})` : ''}\t${e.x?.toFixed(1)} ${e.y?.toFixed(1)} ${e.z?.toFixed(1)}`);
185
+ }
186
+ }
187
+ else if (line.startsWith(':shot')) {
188
+ const file = line.split(/\s+/)[1] ?? `calcite-${Date.now()}.png`;
189
+ const shot = await client.screenshot();
190
+ await writeFile(file, shot.png);
191
+ out(`saved ${file} (${shot.png.length} bytes)`);
192
+ }
193
+ else if (line.startsWith(':render')) {
194
+ await client.setRender(line.endsWith('on'));
195
+ }
196
+ else if (line === ':respawn')
197
+ await client.respawn();
198
+ else if (line.startsWith(':') && (await action(client, line))) {
199
+ // handled
200
+ }
201
+ else if (line.startsWith('/'))
202
+ await client.command(line.slice(1));
203
+ else if (line.startsWith(':'))
204
+ process.stderr.write(`unknown command ${line}\n`);
205
+ else
206
+ await client.chat(line);
207
+ }
208
+ catch (err) {
209
+ process.stderr.write(`error: ${err.message}\n`);
210
+ }
211
+ }
212
+ await stop();
213
+ });
214
+ program
215
+ .command('install')
216
+ .description('Download a version (client, libraries, assets, Java, mod loader) without launching')
217
+ .argument('[version]', 'version id, "release" or "snapshot"', 'release')
218
+ .option('-l, --loader <loader>', 'also install a mod loader: fabric, forge or neoforge, optionally @version')
219
+ .option('--java <path>', 'java executable to use')
220
+ .action(async (version, o) => {
221
+ try {
222
+ const r = await installVersion(version, { loader: o.loader, javaPath: o.java, onLine: (l) => process.stderr.write(` ${l}\n`) });
223
+ out(`installed ${r.id}${r.loader ? ` with ${r.loader}` : ''} (java ${r.java}; probe ${r.probe})`);
224
+ }
225
+ catch (err) {
226
+ fail(err);
227
+ }
228
+ });
229
+ program
230
+ .command('versions')
231
+ .description('List Minecraft versions')
232
+ .addOption(new Option('-t, --type <type>', 'version type').choices(['release', 'snapshot', 'old_beta', 'old_alpha', 'all']).default('release'))
233
+ .option('-l, --limit <n>', 'how many', positiveInt, 20)
234
+ .action(async (o) => {
235
+ try {
236
+ const manifest = await getManifest(resolvePaths());
237
+ out(`latest release ${manifest.latest.release}, snapshot ${manifest.latest.snapshot}`);
238
+ for (const v of manifest.versions.filter((v) => o.type === 'all' || v.type === o.type).slice(0, o.limit)) {
239
+ out(`${v.id.padEnd(24)} ${v.type.padEnd(9)} ${v.releaseTime.slice(0, 10)}`);
240
+ }
241
+ }
242
+ catch (err) {
243
+ fail(err);
244
+ }
245
+ });
246
+ program
247
+ .command('login')
248
+ .description('Log in with a Microsoft account (device code); the login is saved and refreshed automatically')
249
+ .action(async () => {
250
+ try {
251
+ const handle = await startLogin(resolvePaths());
252
+ process.once('SIGINT', () => void handle.cancel().then(() => process.exit(130)));
253
+ out(`Open this URL in a browser and sign in:\n\n ${await handle.url}\n`);
254
+ out(`Logged in as ${await handle.done}`);
255
+ }
256
+ catch (err) {
257
+ fail(err);
258
+ }
259
+ });
260
+ program
261
+ .command('accounts')
262
+ .description('List saved Microsoft accounts')
263
+ .action(async () => {
264
+ try {
265
+ const accounts = await listAccounts(resolvePaths());
266
+ if (!accounts.length)
267
+ out('No saved accounts. Run `calcite login`.');
268
+ for (const a of accounts)
269
+ out(`${a.primary ? '*' : ' '} ${a.name}${a.uuid ? ` ${a.uuid}` : ''}`);
270
+ }
271
+ catch (err) {
272
+ fail(err);
273
+ }
274
+ });
275
+ program
276
+ .command('logout')
277
+ .description('Remove a saved Microsoft account')
278
+ .argument('<account>', 'profile name')
279
+ .action(async (name) => {
280
+ try {
281
+ if (!(await removeAccount(resolvePaths(), name)))
282
+ fail(Object.assign(new Error(`No saved account named "${name}"`), { code: 'unknown_account' }));
283
+ out(`Removed ${name}`);
284
+ }
285
+ catch (err) {
286
+ fail(err);
287
+ }
288
+ });
289
+ program
290
+ .command('doctor')
291
+ .description('Check the environment')
292
+ .action(async () => {
293
+ const paths = resolvePaths();
294
+ out(`calcite ${VERSION} on node ${process.versions.node} (${process.platform}/${process.arch})`);
295
+ out(`home: ${paths.home}`);
296
+ out(`probe: ${paths.probe}`);
297
+ const javas = await findJavaInstalls(paths);
298
+ out(`java: ${javas.length ? '' : 'none found (will be downloaded on demand)'}`);
299
+ for (const j of javas)
300
+ out(` ${String(j.major).padStart(2)} ${j.version.padEnd(12)} ${j.path}`);
301
+ if (process.platform === 'linux') {
302
+ const xvfb = which('Xvfb');
303
+ out(`xvfb: ${xvfb ?? 'missing — needed for screenshots without a display (apt install xvfb libgl1-mesa-dri libegl1 libegl-mesa0)'}`);
304
+ out(`egl: ${hasSharedLib('libEGL.so.1') ? 'ok' : 'missing — Minecraft 26.x needs it to render on Xvfb (apt install libegl1 libegl-mesa0)'}`);
305
+ out(`display: ${process.env.DISPLAY ?? 'none (a virtual one will be started)'}`);
306
+ }
307
+ try {
308
+ const accounts = await listAccounts(paths);
309
+ out(`accounts: ${accounts.map((a) => a.name).join(', ') || 'none'}`);
310
+ }
311
+ catch (err) {
312
+ out(`accounts: unreadable (${err.message})`);
313
+ }
314
+ try {
315
+ const m = await getManifest(paths, { refresh: true });
316
+ out(`mojang: reachable (latest ${m.latest.release})`);
317
+ }
318
+ catch (err) {
319
+ out(`mojang: UNREACHABLE (${err.message})`);
320
+ }
321
+ });
322
+ program
323
+ .command('mcp')
324
+ .description('Run the MCP server on stdio')
325
+ .addOption(new Option('-r, --render <mode>', 'default renderer mode').choices(['on-demand', 'always', 'off']))
326
+ .option('--memory <size>', 'default max heap')
327
+ .action(async (o) => {
328
+ // stdout belongs to the protocol; logs go to stderr
329
+ await runMcpStdio({ defaults: { render: o.render, memory: o.memory } });
330
+ });
331
+ program.parseAsync().catch(fail);
332
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import { type CalcitePaths } from './paths.js';
3
+ import { ProbeServer } from './probe-server.js';
4
+ import { type Account, type ChatLine, type ClientOptions, type ClientStatus, type GameState, type LogLine, type Phase, type RenderMode, type ServerAddress } from './types.js';
5
+ export declare const sleep: (ms: number) => Promise<unknown>;
6
+ /** Process lifecycle of a client: preparing, launching, the probe connection, reconnects and shutdown. */
7
+ export declare abstract class ClientCore extends EventEmitter {
8
+ readonly options: Required<Pick<ClientOptions, 'name' | 'version'>> & ClientOptions;
9
+ readonly paths: CalcitePaths;
10
+ readonly gameDir: string;
11
+ readonly render: RenderMode;
12
+ readonly account: Account;
13
+ readonly server?: ServerAddress;
14
+ protected phaseValue: Phase;
15
+ protected logs: LogLine[];
16
+ protected chats: ChatLine[];
17
+ protected seq: number;
18
+ protected probe: ProbeServer | null;
19
+ private run;
20
+ private display;
21
+ private releaseInstance;
22
+ private probeConfig;
23
+ private game;
24
+ private mods;
25
+ protected headlessValue: boolean;
26
+ protected lastState: GameState | undefined;
27
+ private lastError;
28
+ /** Error code of a failure that relaunching cannot fix (reported by start() instead of "crashed"). */
29
+ private fatalCode;
30
+ private startedAt;
31
+ private reconnects;
32
+ private stopping;
33
+ private poller;
34
+ private inGameSince;
35
+ private relaunching;
36
+ private everInGame;
37
+ private joinRequested;
38
+ private readonly log;
39
+ constructor(options: ClientOptions);
40
+ get phase(): Phase;
41
+ get headless(): boolean;
42
+ private setPhase;
43
+ private note;
44
+ private pushLog;
45
+ /**
46
+ * Prepares everything (Java, game files, mappings), launches the client and resolves once it is in a world
47
+ * (or on the title screen when no server is configured).
48
+ */
49
+ start(): Promise<ClientStatus>;
50
+ /** Downloads and verifies everything needed to launch (idempotent). */
51
+ prepare(): Promise<void>;
52
+ private resolveHeadless;
53
+ private launch;
54
+ private onProbeConnected;
55
+ private poll;
56
+ private reconnectLimit;
57
+ private maybeReconnect;
58
+ private onGameExit;
59
+ private waitUntilStarted;
60
+ private cleanupRun;
61
+ private shutdown;
62
+ /** Stops the game and releases all resources. */
63
+ stop(): Promise<void>;
64
+ status(): ClientStatus;
65
+ protected requireProbe(): ProbeServer;
66
+ }