@bkm016/calcite 0.2.0 → 0.5.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 (93) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +206 -18
  3. package/dist/accounts.js +4 -2
  4. package/dist/accounts.js.map +1 -1
  5. package/dist/cli.js +16 -127
  6. package/dist/cli.js.map +1 -1
  7. package/dist/client-core.d.ts +23 -12
  8. package/dist/client-core.js +227 -244
  9. package/dist/client-core.js.map +1 -1
  10. package/dist/client.d.ts +60 -13
  11. package/dist/client.js +76 -18
  12. package/dist/client.js.map +1 -1
  13. package/dist/display.d.ts +0 -6
  14. package/dist/display.js +31 -44
  15. package/dist/display.js.map +1 -1
  16. package/dist/feed.d.ts +17 -0
  17. package/dist/feed.js +47 -0
  18. package/dist/feed.js.map +1 -0
  19. package/dist/game-run.d.ts +30 -0
  20. package/dist/game-run.js +51 -0
  21. package/dist/game-run.js.map +1 -0
  22. package/dist/hmc.d.ts +7 -0
  23. package/dist/hmc.js +42 -31
  24. package/dist/hmc.js.map +1 -1
  25. package/dist/index.d.ts +4 -2
  26. package/dist/index.js +2 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/install.d.ts +6 -0
  29. package/dist/install.js +26 -3
  30. package/dist/install.js.map +1 -1
  31. package/dist/java.js +11 -2
  32. package/dist/java.js.map +1 -1
  33. package/dist/launch.d.ts +79 -0
  34. package/dist/launch.js +142 -0
  35. package/dist/launch.js.map +1 -0
  36. package/dist/lock.js +18 -18
  37. package/dist/lock.js.map +1 -1
  38. package/dist/mcp/accounts.d.ts +3 -0
  39. package/dist/mcp/accounts.js +45 -0
  40. package/dist/mcp/accounts.js.map +1 -0
  41. package/dist/mcp/act.d.ts +3 -0
  42. package/dist/mcp/act.js +129 -0
  43. package/dist/mcp/act.js.map +1 -0
  44. package/dist/mcp/extensions.d.ts +3 -0
  45. package/dist/mcp/extensions.js +21 -0
  46. package/dist/mcp/extensions.js.map +1 -0
  47. package/dist/mcp/index.d.ts +13 -0
  48. package/dist/mcp/index.js +58 -0
  49. package/dist/mcp/index.js.map +1 -0
  50. package/dist/mcp/items.d.ts +3 -0
  51. package/dist/mcp/items.js +71 -0
  52. package/dist/mcp/items.js.map +1 -0
  53. package/dist/mcp/lifecycle.d.ts +3 -0
  54. package/dist/mcp/lifecycle.js +120 -0
  55. package/dist/mcp/lifecycle.js.map +1 -0
  56. package/dist/mcp/observe.d.ts +3 -0
  57. package/dist/mcp/observe.js +110 -0
  58. package/dist/mcp/observe.js.map +1 -0
  59. package/dist/mcp/shared.d.ts +49 -0
  60. package/dist/mcp/shared.js +56 -0
  61. package/dist/mcp/shared.js.map +1 -0
  62. package/dist/mcp/tasks.d.ts +15 -0
  63. package/dist/mcp/tasks.js +46 -0
  64. package/dist/mcp/tasks.js.map +1 -0
  65. package/dist/mcp.js +35 -3
  66. package/dist/mcp.js.map +1 -1
  67. package/dist/mods.d.ts +2 -0
  68. package/dist/mods.js +35 -4
  69. package/dist/mods.js.map +1 -1
  70. package/dist/mojang.d.ts +5 -1
  71. package/dist/mojang.js.map +1 -1
  72. package/dist/names.js +30 -8
  73. package/dist/names.js.map +1 -1
  74. package/dist/net.js +25 -19
  75. package/dist/net.js.map +1 -1
  76. package/dist/paper.d.ts +46 -0
  77. package/dist/paper.js +200 -0
  78. package/dist/paper.js.map +1 -0
  79. package/dist/probe-server.d.ts +14 -4
  80. package/dist/probe-server.js +15 -10
  81. package/dist/probe-server.js.map +1 -1
  82. package/dist/repl.d.ts +6 -0
  83. package/dist/repl.js +207 -0
  84. package/dist/repl.js.map +1 -0
  85. package/dist/stage.d.ts +6 -0
  86. package/dist/stage.js +19 -0
  87. package/dist/stage.js.map +1 -0
  88. package/dist/types.d.ts +167 -3
  89. package/dist/types.js +12 -1
  90. package/dist/types.js.map +1 -1
  91. package/dist/zip.js.map +1 -1
  92. package/package.json +11 -3
  93. package/vendor/calcite-probe.jar +0 -0
package/dist/paper.js ADDED
@@ -0,0 +1,200 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { createHash } from 'node:crypto';
3
+ import { once } from 'node:events';
4
+ import { copyFile, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
5
+ import { createServer } from 'node:net';
6
+ import { basename, join, resolve } from 'node:path';
7
+ import { createInterface } from 'node:readline';
8
+ import { UTF8_CONSOLE_PROPS } from './hmc.js';
9
+ import { ensureJava } from './java.js';
10
+ import { getVersionJson, requiredJavaMajor, resolveVersion } from './mojang.js';
11
+ import { download, httpJson } from './net.js';
12
+ import { resolvePaths } from './paths.js';
13
+ const FILL_API = 'https://fill.papermc.io/v3/projects/paper/versions';
14
+ /** ViaVersion and ViaBackwards let clients of other versions join (they need Java 17+). */
15
+ const VIA_PLUGINS = [
16
+ {
17
+ url: 'https://github.com/ViaVersion/ViaVersion/releases/download/5.12.0/ViaVersion-5.12.0.jar',
18
+ sha256: '72c40a6a702d67f226fc9a0d8ad82aba1483fdabe2e6159bcdddb2dc070750b0',
19
+ },
20
+ {
21
+ url: 'https://github.com/ViaVersion/ViaBackwards/releases/download/5.12.0/ViaBackwards-5.12.0.jar',
22
+ sha256: '194e9250224632274d7b3c17e411e031a9223c1863c6f5138d53c721f07ab78d',
23
+ },
24
+ ];
25
+ /** Plugins placed by an earlier start, removed again when they are no longer wanted. */
26
+ const MANAGED_PLUGINS = 'plugins/.calcite-managed.json';
27
+ /** The Minecraft version of the previous start; configs and worlds from another version are not reused. */
28
+ const VERSION_FILE = '.calcite-version';
29
+ /**
30
+ * Configs and worlds an older server cannot read. Downloaded jars (cache, libraries, versions) are stored per
31
+ * version and kept; plugins download their own libraries there too.
32
+ */
33
+ const VERSIONED_STATE = [
34
+ 'config',
35
+ 'bukkit.yml',
36
+ 'spigot.yml',
37
+ 'commands.yml',
38
+ 'help.yml',
39
+ 'permissions.yml',
40
+ 'version_history.json',
41
+ 'world',
42
+ 'world_nether',
43
+ 'world_the_end',
44
+ ];
45
+ /** The UUID an offline-mode server gives a player name. */
46
+ export function offlineUuid(name) {
47
+ const b = createHash('md5').update(`OfflinePlayer:${name}`).digest();
48
+ b[6] = (b[6] & 0x0f) | 0x30;
49
+ b[8] = (b[8] & 0x3f) | 0x80;
50
+ const h = b.toString('hex');
51
+ return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}`;
52
+ }
53
+ export function serverProperties(port, overrides = {}) {
54
+ const props = {
55
+ 'server-port': String(port),
56
+ 'online-mode': 'false',
57
+ 'enforce-secure-profile': 'false',
58
+ 'level-type': 'minecraft\\:flat',
59
+ 'generate-structures': 'false',
60
+ 'spawn-protection': '0',
61
+ difficulty: 'peaceful',
62
+ 'view-distance': '6',
63
+ 'simulation-distance': '4',
64
+ 'pause-when-empty-seconds': '-1',
65
+ motd: 'Calcite test server',
66
+ ...overrides,
67
+ };
68
+ return `${Object.entries(props)
69
+ .map(([k, v]) => `${k}=${v}`)
70
+ .join('\n')}\n`;
71
+ }
72
+ async function freePort() {
73
+ const server = createServer();
74
+ server.listen(0, '127.0.0.1');
75
+ await once(server, 'listening');
76
+ const { port } = server.address();
77
+ server.close();
78
+ return port;
79
+ }
80
+ async function installPaper(dir, version) {
81
+ const build = await httpJson(`${FILL_API}/${encodeURIComponent(version)}/builds/latest`);
82
+ const jar = build.downloads['server:default'];
83
+ await download(jar.url, join(dir, 'paper.jar'), { sha256: jar.checksums.sha256 });
84
+ }
85
+ /** Copies the wanted plugins in and removes the ones an earlier start placed that are no longer wanted. */
86
+ async function installPlugins(dir, plugins, via) {
87
+ const pluginDir = join(dir, 'plugins');
88
+ await mkdir(pluginDir, { recursive: true });
89
+ const previous = JSON.parse(await readFile(join(dir, MANAGED_PLUGINS), 'utf8').catch(() => '[]'));
90
+ const placed = [];
91
+ for (const plugin of plugins) {
92
+ await copyFile(resolve(plugin), join(pluginDir, basename(plugin)));
93
+ placed.push(basename(plugin));
94
+ }
95
+ if (via) {
96
+ for (const p of VIA_PLUGINS)
97
+ placed.push(basename(await download(p.url, join(pluginDir, basename(p.url)), { sha256: p.sha256 })));
98
+ }
99
+ for (const stale of previous.filter((p) => !placed.includes(p)))
100
+ await rm(join(pluginDir, stale), { force: true });
101
+ await writeFile(join(dir, MANAGED_PLUGINS), JSON.stringify(placed));
102
+ }
103
+ /** Starts a disposable Paper server for tests and resolves once it accepts players. */
104
+ export async function startPaperServer(opts) {
105
+ const dir = resolve(opts.dir);
106
+ const paths = opts.paths ?? resolvePaths();
107
+ const port = opts.port ?? (await freePort());
108
+ const json = await getVersionJson(paths, await resolveVersion(paths, opts.version));
109
+ const java = await ensureJava(paths, requiredJavaMajor(json), { javaPath: opts.javaPath });
110
+ await mkdir(dir, { recursive: true });
111
+ // A directory without the marker may hold state from any version, so it is reset too.
112
+ const previousVersion = await readFile(join(dir, VERSION_FILE), 'utf8').catch(() => null);
113
+ if (previousVersion !== json.id) {
114
+ for (const entry of VERSIONED_STATE)
115
+ await rm(join(dir, entry), { recursive: true, force: true });
116
+ }
117
+ await installPaper(dir, json.id);
118
+ await writeFile(join(dir, VERSION_FILE), json.id);
119
+ await installPlugins(dir, opts.plugins ?? [], (opts.via ?? true) && java.major >= 17);
120
+ if (!opts.keepWorld) {
121
+ for (const world of ['world', 'world_nether', 'world_the_end'])
122
+ await rm(join(dir, world), { recursive: true, force: true });
123
+ }
124
+ await writeFile(join(dir, 'eula.txt'), 'eula=true\n');
125
+ await writeFile(join(dir, 'server.properties'), serverProperties(port, opts.properties));
126
+ const ops = (opts.operators ?? []).map((name) => ({ uuid: offlineUuid(name), name, level: 4, bypassesPlayerLimit: false }));
127
+ await writeFile(join(dir, 'ops.json'), JSON.stringify(ops, null, 2));
128
+ const utf8 = Object.entries(UTF8_CONSOLE_PROPS).map(([k, v]) => `-D${k}=${v}`);
129
+ const proc = spawn(java.path, [`-Xmx${opts.memory ?? '1G'}`, ...utf8, '-jar', 'paper.jar', '--nogui'], {
130
+ cwd: dir,
131
+ stdio: ['pipe', 'pipe', 'pipe'],
132
+ });
133
+ const waiters = new Set();
134
+ const tail = [];
135
+ for (const stream of [proc.stdout, proc.stderr]) {
136
+ createInterface({ input: stream }).on('line', (line) => {
137
+ tail.push(line);
138
+ if (tail.length > 40)
139
+ tail.shift();
140
+ opts.onLine?.(line);
141
+ for (const w of waiters) {
142
+ if (w.pattern.test(line)) {
143
+ waiters.delete(w);
144
+ w.resolve(line);
145
+ }
146
+ }
147
+ });
148
+ }
149
+ const exited = once(proc, 'exit');
150
+ const waitForLine = (pattern, timeoutMs = 10_000) => new Promise((resolveLine, reject) => {
151
+ const waiter = {
152
+ pattern,
153
+ resolve: (line) => {
154
+ clearTimeout(timer);
155
+ resolveLine(line);
156
+ },
157
+ };
158
+ const timer = setTimeout(() => {
159
+ waiters.delete(waiter);
160
+ reject(new Error(`No console line matched ${pattern} within ${timeoutMs}ms:\n${tail.slice(-10).join('\n')}`));
161
+ }, timeoutMs);
162
+ waiters.add(waiter);
163
+ });
164
+ const command = (line) => {
165
+ proc.stdin.write(`${line}\n`);
166
+ };
167
+ const stop = async () => {
168
+ if (proc.exitCode !== null)
169
+ return;
170
+ command('stop');
171
+ const timer = setTimeout(() => proc.kill('SIGKILL'), 30_000);
172
+ await exited;
173
+ clearTimeout(timer);
174
+ };
175
+ const timeoutMs = opts.timeoutMs ?? 300_000;
176
+ const done = waitForLine(/Done \(/, timeoutMs);
177
+ done.catch(() => undefined); // still pending when the server exits first
178
+ const failure = await Promise.race([
179
+ done.then(() => null, (err) => err),
180
+ exited.then(([code]) => new Error(`Paper exited with code ${String(code)}:\n${tail.join('\n')}`)),
181
+ ]);
182
+ if (failure) {
183
+ proc.kill('SIGKILL');
184
+ throw failure;
185
+ }
186
+ return {
187
+ address: `127.0.0.1:${port}`,
188
+ port,
189
+ dir,
190
+ command,
191
+ run: (line, expect, ms) => {
192
+ const matched = waitForLine(expect, ms);
193
+ command(line);
194
+ return matched;
195
+ },
196
+ waitForLine,
197
+ stop,
198
+ };
199
+ }
200
+ //# sourceMappingURL=paper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paper.js","sourceRoot":"","sources":["../src/paper.ts"],"names":[],"mappings":"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"}
@@ -4,18 +4,27 @@ export declare class ProbeError extends Error {
4
4
  readonly code: string;
5
5
  constructor(code: string, message: string);
6
6
  }
7
+ /** An event the probe forwards from the game or an extension. */
8
+ export interface ProbeEvent {
9
+ name: string;
10
+ data: unknown;
11
+ time: number;
12
+ }
13
+ interface ProbeServerEvents {
14
+ connected: [];
15
+ disconnected: [];
16
+ event: [event: ProbeEvent];
17
+ }
7
18
  /**
8
19
  * TCP endpoint (127.0.0.1, random port) the in-game probe connects to. Authenticated with a random token;
9
20
  * JSON objects separated by newlines.
10
- *
11
- * Events: 'connected', 'disconnected'.
12
21
  */
13
- export declare class ProbeServer extends EventEmitter {
22
+ export declare class ProbeServer extends EventEmitter<ProbeServerEvents> {
14
23
  readonly token: string;
15
24
  private server;
16
25
  private socket;
17
26
  private nextId;
18
- private pending;
27
+ private readonly pending;
19
28
  port: number;
20
29
  listen(): Promise<number>;
21
30
  get connected(): boolean;
@@ -26,3 +35,4 @@ export declare class ProbeServer extends EventEmitter {
26
35
  request<T = unknown>(op: string, args?: Record<string, unknown>, timeoutMs?: number): Promise<T>;
27
36
  close(): Promise<void>;
28
37
  }
38
+ export {};
@@ -16,8 +16,6 @@ export class ProbeError extends Error {
16
16
  /**
17
17
  * TCP endpoint (127.0.0.1, random port) the in-game probe connects to. Authenticated with a random token;
18
18
  * JSON objects separated by newlines.
19
- *
20
- * Events: 'connected', 'disconnected'.
21
19
  */
22
20
  export class ProbeServer extends EventEmitter {
23
21
  token = randomBytes(24).toString('hex');
@@ -27,12 +25,13 @@ export class ProbeServer extends EventEmitter {
27
25
  pending = new Map();
28
26
  port = 0;
29
27
  async listen() {
30
- this.server = createServer((socket) => this.accept(socket));
28
+ const server = createServer((socket) => this.accept(socket));
29
+ this.server = server;
31
30
  await new Promise((resolve, reject) => {
32
- this.server.once('error', reject);
33
- this.server.listen(0, '127.0.0.1', () => resolve());
31
+ server.once('error', reject);
32
+ server.listen(0, '127.0.0.1', () => resolve());
34
33
  });
35
- const address = this.server.address();
34
+ const address = server.address();
36
35
  if (!address || typeof address === 'string')
37
36
  throw new Error('Probe server has no TCP address');
38
37
  this.port = address.port;
@@ -72,7 +71,11 @@ export class ProbeServer extends EventEmitter {
72
71
  this.socket?.destroy();
73
72
  this.socket = socket;
74
73
  log.debug(`probe connected (java ${String(msg.java)})`);
75
- this.emit('connected', msg);
74
+ this.emit('connected');
75
+ return;
76
+ }
77
+ if (msg.type === 'event') {
78
+ this.emit('event', { name: String(msg.name), data: msg.data, time: Number(msg.time) || Date.now() });
76
79
  return;
77
80
  }
78
81
  this.onResponse(msg);
@@ -97,7 +100,7 @@ export class ProbeServer extends EventEmitter {
97
100
  if (msg.ok)
98
101
  pending.resolve(msg.result);
99
102
  else
100
- pending.reject(new ProbeError(String(msg.code ?? 'error'), String(msg.error ?? 'probe error')));
103
+ pending.reject(new ProbeError(typeof msg.code === 'string' ? msg.code : 'error', typeof msg.error === 'string' ? msg.error : 'probe error'));
101
104
  }
102
105
  failAll(err) {
103
106
  for (const [id, p] of this.pending) {
@@ -117,7 +120,7 @@ export class ProbeServer extends EventEmitter {
117
120
  this.pending.delete(id);
118
121
  reject(new ProbeError('timeout', `Probe request "${op}" timed out after ${timeoutMs}ms`));
119
122
  }, timeoutMs);
120
- this.pending.set(id, { resolve: resolve, reject, timer });
123
+ this.pending.set(id, { resolve: (value) => resolve(value), reject, timer });
121
124
  socket.write(JSON.stringify({ id, op, args }) + '\n');
122
125
  });
123
126
  }
@@ -125,8 +128,10 @@ export class ProbeServer extends EventEmitter {
125
128
  this.failAll(new ProbeError('closed', 'Probe server closed'));
126
129
  this.socket?.destroy();
127
130
  this.socket = null;
128
- await new Promise((resolve) => (this.server ? this.server.close(() => resolve()) : resolve()));
131
+ const server = this.server;
129
132
  this.server = null;
133
+ if (server)
134
+ await new Promise((resolve) => server.close(() => resolve()));
130
135
  }
131
136
  }
132
137
  //# sourceMappingURL=probe-server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"probe-server.js","sourceRoot":"","sources":["../src/probe-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"probe-server.js","sourceRoot":"","sources":["../src/probe-server.ts"],"names":[],"mappings":"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"}
package/dist/repl.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import { type Client, type Surroundings } from './client.js';
2
+ export declare function formatSurroundings(s: Surroundings): string;
3
+ /** Runs one console line: chat, a /command, or a :command. Returns the text to print, if any. */
4
+ export declare function execute(client: Client, line: string): Promise<string | undefined>;
5
+ /** Reads console lines until ":quit" or end of input, running each against the client. */
6
+ export declare function runRepl(client: Client): Promise<void>;
package/dist/repl.js ADDED
@@ -0,0 +1,207 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ import { createInterface } from 'node:readline';
3
+ import { CalciteError } from './client.js';
4
+ const usage = (name) => new CalciteError('bad_request', `usage: :${name} ${lookup(name)?.args ?? ''}`);
5
+ /** Argument {@code index} as a number; fails with the command's usage when it is missing or not a number. */
6
+ function num(args, index, name) {
7
+ const value = Number(args[index] ?? NaN);
8
+ if (!Number.isFinite(value))
9
+ throw usage(name);
10
+ return value;
11
+ }
12
+ /** Arguments {@code from} to {@code from + 2} as a block position. */
13
+ function point(args, name, from = 0) {
14
+ return { x: num(args, from, name), y: num(args, from + 1, name), z: num(args, from + 2, name) };
15
+ }
16
+ const optionalNumber = (value) => (value === undefined ? undefined : Number(value));
17
+ export function formatSurroundings(s) {
18
+ return [
19
+ `${s.x.toFixed(1)} ${s.y.toFixed(1)} ${s.z.toFixed(1)} facing ${s.facing} in ${s.biome ?? '?'} (${s.dimension ?? '?'}), time ${s.timeOfDay ?? '?'}`,
20
+ `standing on ${s.standingOn ?? '?'}${s.in ? `, in ${s.in}` : ''}`,
21
+ ...s.map.map((row) => ` ${row}`),
22
+ ` ${s.legend}`,
23
+ ...s.blocks.map((b) => `${String(b.count).padStart(5)} ${b.id} nearest ${b.nearest.join(' ')}`),
24
+ ...s.entities.map((e) => `entity ${e.id} ${e.type}${e.name ? ` "${e.name}"` : ''} at ${e.distance}m`),
25
+ ].join('\n');
26
+ }
27
+ const COMMANDS = {
28
+ state: { help: 'game state', run: (c) => c.state() },
29
+ ents: {
30
+ args: '[radius]',
31
+ help: 'entities nearby',
32
+ run: async (c, [radius]) => (await c.entities({ radius: optionalNumber(radius) ?? 32 }))
33
+ .map((e) => `${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)}`)
34
+ .join('\n'),
35
+ },
36
+ around: {
37
+ args: '[radius]',
38
+ help: 'map of the area, nearby blocks and entities',
39
+ run: async (c, [radius]) => formatSurroundings(await c.surroundings({ radius: optionalNumber(radius) })),
40
+ },
41
+ find: {
42
+ args: '<block> [radius]',
43
+ help: 'find blocks by id or pattern (*_ore)',
44
+ run: (c, [blocks, radius]) => {
45
+ if (!blocks)
46
+ throw usage('find');
47
+ return c.findBlocks({ blocks, radius: optionalNumber(radius) });
48
+ },
49
+ },
50
+ shot: {
51
+ args: '[file]',
52
+ help: 'save a screenshot',
53
+ run: async (c, [file = `calcite-${Date.now()}.png`]) => {
54
+ const shot = await c.screenshot();
55
+ await writeFile(file, shot.png);
56
+ return `saved ${file} (${shot.png.length} bytes)`;
57
+ },
58
+ },
59
+ render: { args: 'on|off', help: 'continuous rendering', run: (c, [mode]) => c.setRender(mode === 'on') },
60
+ respawn: { help: 'respawn after death', run: (c) => c.respawn() },
61
+ look: {
62
+ args: '<yaw> <pitch>',
63
+ help: 'turn to a rotation',
64
+ run: (c, args) => c.look({ yaw: num(args, 0, 'look'), pitch: num(args, 1, 'look') }),
65
+ },
66
+ lookat: {
67
+ args: '<x> <y> <z>',
68
+ help: 'turn towards a point',
69
+ run: (c, args) => c.look(point(args, 'lookat')),
70
+ },
71
+ goto: {
72
+ args: '<x> <z> [y]',
73
+ help: 'walk there along a path',
74
+ run: (c, args) => c.walkTo(num(args, 0, 'goto'), num(args, 1, 'goto'), { y: optionalNumber(args[2]) }),
75
+ },
76
+ move: {
77
+ args: '<forward,jump,...> [ticks]',
78
+ help: 'hold movement keys',
79
+ run: (c, [keys = '', ticks]) => c.move(Object.fromEntries(keys
80
+ .split(',')
81
+ .filter(Boolean)
82
+ .map((k) => [k, true])), { ticks: optionalNumber(ticks) ?? 20 }),
83
+ },
84
+ stop: { help: 'release keys, cancel the running action', run: (c) => c.stopActions() },
85
+ task: { help: 'the running action', run: (c) => c.task() },
86
+ attack: { args: '[entity id]', help: 'left click', run: (c, [id]) => c.attack(optionalNumber(id)) },
87
+ use: {
88
+ args: '[entity id | x y z] [hold ticks]',
89
+ help: 'right click',
90
+ run: (c, args) => args.length >= 3
91
+ ? c.use({ block: point(args, 'use'), holdTicks: optionalNumber(args[3]) })
92
+ : c.use({ entityId: optionalNumber(args[0]), holdTicks: optionalNumber(args[1]) }),
93
+ },
94
+ dig: {
95
+ args: '<x> <y> <z>',
96
+ help: 'mine a block',
97
+ run: (c, args) => c.dig(point(args, 'dig')),
98
+ },
99
+ block: {
100
+ args: '<x> <y> <z>',
101
+ help: 'block at a position',
102
+ run: (c, args) => c.block(point(args, 'block')),
103
+ },
104
+ target: { help: 'what the crosshair points at', run: (c) => c.target() },
105
+ inv: { help: 'inventory', run: (c) => c.inventory() },
106
+ slot: { args: '<0-8>', help: 'select a hotbar slot', run: (c, args) => c.selectSlot(num(args, 0, 'slot')) },
107
+ craft: {
108
+ args: '<item> [count]',
109
+ help: 'craft from the inventory',
110
+ run: (c, [item, count]) => {
111
+ if (!item)
112
+ throw usage('craft');
113
+ return c.craft(item, { count: optionalNumber(count) });
114
+ },
115
+ },
116
+ container: { help: 'the open container', run: (c) => c.container() },
117
+ click: {
118
+ args: '<slot> [button] [mode]',
119
+ help: 'click a container slot',
120
+ run: (c, args) => c.click(num(args, 0, 'click'), { button: optionalNumber(args[1]), mode: args[2] }),
121
+ },
122
+ transfer: {
123
+ args: '<item> [count] [inventory]',
124
+ help: 'move items into the open container (or back into the inventory)',
125
+ run: (c, [item, ...rest]) => {
126
+ if (!item)
127
+ throw usage('transfer');
128
+ const count = rest.map(Number).find(Number.isFinite);
129
+ return c.transfer(item, { count, to: rest.includes('inventory') ? 'inventory' : 'container' });
130
+ },
131
+ },
132
+ close: { help: 'close the container', run: (c) => c.closeContainer() },
133
+ drop: { args: '[all]', help: 'drop the held item', run: (c, [all]) => c.drop({ all: all === 'all' }) },
134
+ events: { args: '[name regex]', help: 'recent game events', run: (c, [name]) => c.eventsSince({ name, limit: 20 }) },
135
+ ext: {
136
+ help: 'extension commands',
137
+ run: async (c) => {
138
+ const { commands, extensions } = await c.extensions();
139
+ return [
140
+ ...extensions.map((x) => `jar ${x.jar}: ${x.error ? `failed: ${x.error}` : x.ids.join(', ')}`),
141
+ ...commands.map((cmd) => `${cmd.name}\t${cmd.description ?? ''}${cmd.schema ? `\targs ${JSON.stringify(cmd.schema)}` : ''}`),
142
+ ...(commands.length ? [] : ['no extension commands']),
143
+ ].join('\n');
144
+ },
145
+ },
146
+ call: {
147
+ args: '<name> [json args]',
148
+ help: 'call an extension command',
149
+ run: (c, [name], rest) => {
150
+ if (!name)
151
+ throw usage('call');
152
+ const json = rest.slice(name.length).trim();
153
+ return c.call(name, json ? JSON.parse(json) : {});
154
+ },
155
+ },
156
+ help: { help: 'this list', run: () => help() },
157
+ };
158
+ function lookup(name) {
159
+ return Object.hasOwn(COMMANDS, name) ? COMMANDS[name] : undefined;
160
+ }
161
+ function help() {
162
+ const lines = Object.entries(COMMANDS).map(([name, c]) => [`:${name} ${c.args ?? ''}`, c.help]);
163
+ lines.push([':quit', 'stop the client']);
164
+ const width = Math.max(...lines.map(([u]) => u.length));
165
+ return ['Type chat, /command or:', ...lines.map(([u, h]) => ` ${u.padEnd(width)} ${h}`)].join('\n');
166
+ }
167
+ /** Runs one console line: chat, a /command, or a :command. Returns the text to print, if any. */
168
+ export async function execute(client, line) {
169
+ if (line.startsWith('/')) {
170
+ await client.command(line.slice(1));
171
+ return undefined;
172
+ }
173
+ if (!line.startsWith(':')) {
174
+ await client.chat(line);
175
+ return undefined;
176
+ }
177
+ const [name = '', ...args] = line.slice(1).split(/\s+/);
178
+ const command = lookup(name);
179
+ if (!command)
180
+ throw new CalciteError('unknown_command', `unknown command :${name} (:help lists them)`);
181
+ const result = await command.run(client, args, line.slice(1 + name.length).trim());
182
+ if (result === undefined || typeof result === 'string')
183
+ return result;
184
+ return JSON.stringify(result, null, 2);
185
+ }
186
+ /** Reads console lines until ":quit" or end of input, running each against the client. */
187
+ export async function runRepl(client) {
188
+ process.stderr.write(`Ready. ${help()}\n`);
189
+ const rl = createInterface({ input: process.stdin });
190
+ for await (const raw of rl) {
191
+ const line = raw.trim();
192
+ if (line === ':quit' || line === ':q')
193
+ break;
194
+ if (!line)
195
+ continue;
196
+ try {
197
+ const output = await execute(client, line);
198
+ if (output)
199
+ process.stdout.write(`${output}\n`);
200
+ }
201
+ catch (err) {
202
+ process.stderr.write(`error: ${err.message}\n`);
203
+ }
204
+ }
205
+ rl.close();
206
+ }
207
+ //# sourceMappingURL=repl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { GameState } from './types.js';
2
+ /** Game log lines worth reporting when mod loading failed. */
3
+ export declare const MOD_ERROR_LINE: RegExp;
4
+ /** Where the game is, as far as starting and staying connected is concerned. */
5
+ export type GameStage = 'mod_error' | 'playing' | 'title' | 'disconnected' | 'loading';
6
+ export declare function gameStage(state: GameState): GameStage;
package/dist/stage.js ADDED
@@ -0,0 +1,19 @@
1
+ /** Screens shown while joining or changing dimension; the player is not playable yet. */
2
+ const LOADING_SCREEN = /LevelLoading|ReceivingLevel|ProgressScreen|ConnectScreen|GenericMessage|DownloadingTerrain/;
3
+ /** Screens Forge and NeoForge show when mods fail to load. */
4
+ const MOD_ERROR_SCREEN = /LoadingErrorScreen|ModLoadingError/;
5
+ /** Game log lines worth reporting when mod loading failed. */
6
+ export const MOD_ERROR_LINE = /\/(ERROR|FATAL)\]|Exception|[Mm]issing|requires/;
7
+ export function gameStage(state) {
8
+ const screen = state.screen ?? '';
9
+ if (MOD_ERROR_SCREEN.test(screen))
10
+ return 'mod_error';
11
+ if (state.inGame && !state.loading && !LOADING_SCREEN.test(screen))
12
+ return 'playing';
13
+ if (screen === 'TitleScreen' && !state.loading)
14
+ return 'title';
15
+ if (screen === 'DisconnectedScreen')
16
+ return 'disconnected';
17
+ return 'loading';
18
+ }
19
+ //# sourceMappingURL=stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage.js","sourceRoot":"","sources":["../src/stage.ts"],"names":[],"mappings":"AAEA,yFAAyF;AACzF,MAAM,cAAc,GAAG,4FAA4F,CAAC;AAEpH,8DAA8D;AAC9D,MAAM,gBAAgB,GAAG,oCAAoC,CAAC;AAE9D,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAG,iDAAiD,CAAC;AAKhF,MAAM,UAAU,SAAS,CAAC,KAAgB;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,WAAW,CAAC;IACtD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACrF,IAAI,MAAM,KAAK,aAAa,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IAC/D,IAAI,MAAM,KAAK,oBAAoB;QAAE,OAAO,cAAc,CAAC;IAC3D,OAAO,SAAS,CAAC;AACnB,CAAC"}