cyclops-clientdevbridge-cli 0.1.1

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 (112) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.md +218 -0
  4. package/dist/artifacts.d.ts +56 -0
  5. package/dist/artifacts.d.ts.map +1 -0
  6. package/dist/artifacts.js +58 -0
  7. package/dist/artifacts.js.map +1 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +348 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands/compare.d.ts +27 -0
  13. package/dist/commands/compare.d.ts.map +1 -0
  14. package/dist/commands/compare.js +209 -0
  15. package/dist/commands/compare.js.map +1 -0
  16. package/dist/commands/context.d.ts +25 -0
  17. package/dist/commands/context.d.ts.map +1 -0
  18. package/dist/commands/context.js +36 -0
  19. package/dist/commands/context.js.map +1 -0
  20. package/dist/commands/doctor.d.ts +31 -0
  21. package/dist/commands/doctor.d.ts.map +1 -0
  22. package/dist/commands/doctor.js +234 -0
  23. package/dist/commands/doctor.js.map +1 -0
  24. package/dist/commands/hotswap.d.ts +7 -0
  25. package/dist/commands/hotswap.d.ts.map +1 -0
  26. package/dist/commands/hotswap.js +76 -0
  27. package/dist/commands/hotswap.js.map +1 -0
  28. package/dist/commands/input.d.ts +53 -0
  29. package/dist/commands/input.d.ts.map +1 -0
  30. package/dist/commands/input.js +204 -0
  31. package/dist/commands/input.js.map +1 -0
  32. package/dist/commands/inspect.d.ts +19 -0
  33. package/dist/commands/inspect.d.ts.map +1 -0
  34. package/dist/commands/inspect.js +90 -0
  35. package/dist/commands/inspect.js.map +1 -0
  36. package/dist/commands/lifecycle.d.ts +29 -0
  37. package/dist/commands/lifecycle.d.ts.map +1 -0
  38. package/dist/commands/lifecycle.js +201 -0
  39. package/dist/commands/lifecycle.js.map +1 -0
  40. package/dist/commands/snapshot.d.ts +37 -0
  41. package/dist/commands/snapshot.d.ts.map +1 -0
  42. package/dist/commands/snapshot.js +133 -0
  43. package/dist/commands/snapshot.js.map +1 -0
  44. package/dist/commands/world.d.ts +27 -0
  45. package/dist/commands/world.d.ts.map +1 -0
  46. package/dist/commands/world.js +203 -0
  47. package/dist/commands/world.js.map +1 -0
  48. package/dist/detect.d.ts +58 -0
  49. package/dist/detect.d.ts.map +1 -0
  50. package/dist/detect.js +185 -0
  51. package/dist/detect.js.map +1 -0
  52. package/dist/errors.d.ts +24 -0
  53. package/dist/errors.d.ts.map +1 -0
  54. package/dist/errors.js +37 -0
  55. package/dist/errors.js.map +1 -0
  56. package/dist/hotswap.d.ts +58 -0
  57. package/dist/hotswap.d.ts.map +1 -0
  58. package/dist/hotswap.js +284 -0
  59. package/dist/hotswap.js.map +1 -0
  60. package/dist/index.d.ts +11 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +11 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/initscript.d.ts +49 -0
  65. package/dist/initscript.d.ts.map +1 -0
  66. package/dist/initscript.js +202 -0
  67. package/dist/initscript.js.map +1 -0
  68. package/dist/java.d.ts +47 -0
  69. package/dist/java.d.ts.map +1 -0
  70. package/dist/java.js +114 -0
  71. package/dist/java.js.map +1 -0
  72. package/dist/launcher.d.ts +104 -0
  73. package/dist/launcher.d.ts.map +1 -0
  74. package/dist/launcher.js +609 -0
  75. package/dist/launcher.js.map +1 -0
  76. package/dist/loopback.d.ts +17 -0
  77. package/dist/loopback.d.ts.map +1 -0
  78. package/dist/loopback.js +19 -0
  79. package/dist/loopback.js.map +1 -0
  80. package/dist/output.d.ts +21 -0
  81. package/dist/output.d.ts.map +1 -0
  82. package/dist/output.js +41 -0
  83. package/dist/output.js.map +1 -0
  84. package/dist/paths.d.ts +23 -0
  85. package/dist/paths.d.ts.map +1 -0
  86. package/dist/paths.js +47 -0
  87. package/dist/paths.js.map +1 -0
  88. package/dist/protocol/client.d.ts +35 -0
  89. package/dist/protocol/client.d.ts.map +1 -0
  90. package/dist/protocol/client.js +170 -0
  91. package/dist/protocol/client.js.map +1 -0
  92. package/dist/protocol/types.d.ts +114 -0
  93. package/dist/protocol/types.d.ts.map +1 -0
  94. package/dist/protocol/types.js +38 -0
  95. package/dist/protocol/types.js.map +1 -0
  96. package/dist/session.d.ts +77 -0
  97. package/dist/session.d.ts.map +1 -0
  98. package/dist/session.js +79 -0
  99. package/dist/session.js.map +1 -0
  100. package/dist/snapshot/model.d.ts +327 -0
  101. package/dist/snapshot/model.d.ts.map +1 -0
  102. package/dist/snapshot/model.js +91 -0
  103. package/dist/snapshot/model.js.map +1 -0
  104. package/dist/snapshot/outline.d.ts +35 -0
  105. package/dist/snapshot/outline.d.ts.map +1 -0
  106. package/dist/snapshot/outline.js +135 -0
  107. package/dist/snapshot/outline.js.map +1 -0
  108. package/dist/xvfb.d.ts +30 -0
  109. package/dist/xvfb.d.ts.map +1 -0
  110. package/dist/xvfb.js +66 -0
  111. package/dist/xvfb.js.map +1 -0
  112. package/package.json +66 -0
@@ -0,0 +1,204 @@
1
+ import { line, printJson } from '../output.js';
2
+ import { CliError } from '../errors.js';
3
+ import { withClient } from './context.js';
4
+ export function parsePoint(raw, what) {
5
+ const parts = raw.split(',').map((part) => Number(part.trim()));
6
+ if (parts.length !== 2 || parts.some((value) => Number.isNaN(value))) {
7
+ throw new CliError(`${what} must be two numbers 'x,y', but was '${raw}'.`, 1, `For example: ${what} 210,100`);
8
+ }
9
+ return { x: parts[0], y: parts[1] };
10
+ }
11
+ /**
12
+ * Every state-changing input command reports the screen it left behind, so an agent can tell at a
13
+ * glance whether its click did anything.
14
+ */
15
+ async function reportAfterInput(global, result) {
16
+ if (global.json) {
17
+ printJson(result);
18
+ return;
19
+ }
20
+ if (!global.quiet) {
21
+ line(`screen: ${result['screenClass'] ?? 'none'}`);
22
+ }
23
+ }
24
+ export async function runClick(global, options) {
25
+ await withClient(global, async ({ client }) => {
26
+ let point;
27
+ if (options.widget !== undefined) {
28
+ const { resolveWidget } = await import('./snapshot.js');
29
+ point = await resolveWidget(client, options.widget);
30
+ }
31
+ else if (options.at !== undefined) {
32
+ point = parsePoint(options.at, '--at');
33
+ }
34
+ else {
35
+ throw new CliError('click needs either --at x,y or --widget <text-or-path>.', 1);
36
+ }
37
+ const result = await client.call('input.mouseClick', {
38
+ ...point,
39
+ button: Number(options.button),
40
+ space: options.space,
41
+ });
42
+ await reportAfterInput(global, result);
43
+ });
44
+ }
45
+ export async function runType(global, text) {
46
+ await withClient(global, async ({ client }) => {
47
+ const result = await client.call('input.type', { text });
48
+ await reportAfterInput(global, result);
49
+ });
50
+ }
51
+ export async function runKey(global, key, options) {
52
+ await withClient(global, async ({ client }) => {
53
+ const params = { key, action: options.action };
54
+ if (options.modifiers !== undefined) {
55
+ params['modifiers'] = Number(options.modifiers);
56
+ }
57
+ const result = await client.call('input.key', params);
58
+ await reportAfterInput(global, result);
59
+ });
60
+ }
61
+ export async function runHoldKey(global, key, options) {
62
+ await withClient(global, async ({ client }) => {
63
+ const result = await client.call('input.hold', { key, ticks: Number(options.ticks) }, 120_000);
64
+ await reportAfterInput(global, result);
65
+ });
66
+ }
67
+ export async function runMouseMove(global, at, options) {
68
+ await withClient(global, async ({ client }) => {
69
+ const result = await client.call('input.mouseMove', {
70
+ ...parsePoint(at, 'mouse-move'),
71
+ space: options.space,
72
+ });
73
+ await reportAfterInput(global, result);
74
+ });
75
+ }
76
+ export async function runScroll(global, options) {
77
+ await withClient(global, async ({ client }) => {
78
+ const result = await client.call('input.scroll', {
79
+ ...parsePoint(options.at, '--at'),
80
+ dx: Number(options.dx),
81
+ dy: Number(options.dy),
82
+ space: options.space,
83
+ });
84
+ await reportAfterInput(global, result);
85
+ });
86
+ }
87
+ export async function runDrag(global, options) {
88
+ await withClient(global, async ({ client }) => {
89
+ const from = parsePoint(options.from, '--from');
90
+ const to = parsePoint(options.to, '--to');
91
+ const result = await client.call('input.mouseDrag', {
92
+ from: [from.x, from.y],
93
+ to: [to.x, to.y],
94
+ button: Number(options.button),
95
+ steps: Number(options.steps),
96
+ space: options.space,
97
+ });
98
+ await reportAfterInput(global, result);
99
+ });
100
+ }
101
+ export async function runOpenGui(global, x, y, z, options) {
102
+ await withClient(global, async ({ client }) => {
103
+ const result = await client.call('screen.open', { blockPos: [Number(x), Number(y), Number(z)], approach: options.approach }, 60_000);
104
+ if (global.json) {
105
+ printJson(result);
106
+ return;
107
+ }
108
+ if (result['opened'] === true) {
109
+ line(`screen: ${result['screenClass']}`);
110
+ }
111
+ else {
112
+ line(`No screen opened. ${result['hint'] ?? ''}`.trim());
113
+ process.exitCode = 1;
114
+ }
115
+ });
116
+ }
117
+ export async function runCloseScreen(global) {
118
+ await withClient(global, async ({ client }) => {
119
+ const result = await client.call('screen.close');
120
+ if (global.json) {
121
+ printJson(result);
122
+ return;
123
+ }
124
+ if (!global.quiet) {
125
+ line('Closed the screen.');
126
+ }
127
+ });
128
+ }
129
+ export async function runEval(global, code) {
130
+ await withClient(global, async ({ client }) => {
131
+ const result = await client.call('eval', { language: 'groovy', code }, 60_000);
132
+ if (global.json) {
133
+ printJson(result);
134
+ return;
135
+ }
136
+ const stdout = String(result['stdout'] ?? '');
137
+ if (stdout.length > 0) {
138
+ process.stdout.write(stdout.endsWith('\n') ? stdout : `${stdout}\n`);
139
+ }
140
+ // The mod describes anything it cannot map to JSON as { type, toString }. Every JS object
141
+ // inherits a toString, so this has to check for that exact shape rather than for the key.
142
+ const value = result['value'];
143
+ if (isDescribedObject(value)) {
144
+ line(value['toString']);
145
+ }
146
+ else {
147
+ line(JSON.stringify(value));
148
+ }
149
+ });
150
+ }
151
+ export function isDescribedObject(value) {
152
+ return (typeof value === 'object' &&
153
+ value !== null &&
154
+ !Array.isArray(value) &&
155
+ typeof value['type'] === 'string' &&
156
+ typeof value['toString'] === 'string');
157
+ }
158
+ export async function runWaitFor(global, options) {
159
+ await withClient(global, async ({ client }) => {
160
+ const timeoutMs = Number(options.timeout);
161
+ if (options.ticks !== undefined) {
162
+ const result = await client.call('wait.ticks', { ticks: Number(options.ticks) }, timeoutMs + 30_000);
163
+ if (global.json) {
164
+ printJson(result);
165
+ }
166
+ else if (!global.quiet) {
167
+ line(`Waited ${options.ticks} ticks (now at tick ${result['tick']}).`);
168
+ }
169
+ return;
170
+ }
171
+ let params;
172
+ if (options.screen !== undefined) {
173
+ params = { condition: 'screen', value: options.screen, timeoutMs };
174
+ }
175
+ else if (options.expr !== undefined) {
176
+ params = { condition: 'expr', value: options.expr, timeoutMs };
177
+ }
178
+ else if (options.chunk !== undefined) {
179
+ params = { condition: 'chunkLoaded', value: options.chunk.split(',').map(Number), timeoutMs };
180
+ }
181
+ else if (options.inWorld === true) {
182
+ params = { condition: 'inWorld', timeoutMs };
183
+ }
184
+ else {
185
+ throw new CliError('wait needs one of --ticks, --screen, --expr, --chunk or --in-world.', 1);
186
+ }
187
+ const result = await client.call('wait.for', params, timeoutMs + 30_000);
188
+ if (global.json) {
189
+ printJson(result);
190
+ return;
191
+ }
192
+ if (result['met'] === true) {
193
+ if (!global.quiet) {
194
+ line(`Condition met (screen: ${result['screenClass'] ?? 'none'}, in world: ${result['inWorld']}).`);
195
+ }
196
+ }
197
+ else {
198
+ line(`Timed out after ${timeoutMs} ms waiting for ${result['condition']}` +
199
+ ` (screen is ${result['screenClass'] ?? 'none'}, in world: ${result['inWorld']}).`);
200
+ process.exitCode = 1;
201
+ }
202
+ });
203
+ }
204
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/commands/input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type GlobalOptions } from './context.js';
2
+ export interface ScreenshotOptions {
3
+ readonly name?: string | undefined;
4
+ readonly region?: string | undefined;
5
+ readonly afterTicks?: string | undefined;
6
+ readonly scale?: string | undefined;
7
+ readonly space?: string | undefined;
8
+ }
9
+ export declare function parseRegion(raw: string, space: string): Record<string, unknown>;
10
+ export declare function runScreenshot(global: GlobalOptions, options: ScreenshotOptions): Promise<void>;
11
+ export interface LogsOptions {
12
+ readonly lines: string;
13
+ readonly filter?: string | undefined;
14
+ readonly level?: string | undefined;
15
+ readonly gradle: boolean;
16
+ }
17
+ export declare function runLogs(global: GlobalOptions, options: LogsOptions): Promise<void>;
18
+ export declare function screenshotDirectory(projectDir: string): string;
19
+ //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,aAAa,EAA0C,MAAM,cAAc,CAAC;AAG1F,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAU/E;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BpG;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CxF;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9D"}
@@ -0,0 +1,90 @@
1
+ import * as path from 'node:path';
2
+ import { line, printJson, printPath } from '../output.js';
3
+ import { readTruncated, tailFile } from '../launcher.js';
4
+ import { readSession } from '../session.js';
5
+ import { timestampName, withClient, writeBase64 } from './context.js';
6
+ import { CliError } from '../errors.js';
7
+ export function parseRegion(raw, space) {
8
+ const parts = raw.split(',').map((part) => Number(part.trim()));
9
+ if (parts.length !== 4 || parts.some((value) => Number.isNaN(value))) {
10
+ throw new CliError(`--region must be four numbers 'x,y,w,h', but was '${raw}'.`, 1, 'For example: --region 100,80,200,120');
11
+ }
12
+ return { x: parts[0], y: parts[1], w: parts[2], h: parts[3], space };
13
+ }
14
+ export async function runScreenshot(global, options) {
15
+ await withClient(global, async ({ client, paths }) => {
16
+ const space = options.space ?? 'gui';
17
+ const params = {};
18
+ if (options.region !== undefined) {
19
+ params['region'] = parseRegion(options.region, space);
20
+ }
21
+ if (options.afterTicks !== undefined) {
22
+ params['afterTicks'] = Number(options.afterTicks);
23
+ }
24
+ if (options.scale !== undefined) {
25
+ params['scale'] = Number(options.scale);
26
+ }
27
+ const result = await client.call('screenshot', params);
28
+ const file = writeBase64(paths.screenshots, options.name ?? timestampName('screenshot'), String(result['png']));
29
+ if (global.json) {
30
+ const { png: _png, ...rest } = result;
31
+ printJson({ ...rest, path: file });
32
+ return;
33
+ }
34
+ if (!global.quiet) {
35
+ line(`${result['width']}x${result['height']} px (window ${result['pixelWidth']}x${result['pixelHeight']}, ` +
36
+ `gui ${result['guiWidth']}x${result['guiHeight']} @ scale ${result['guiScale']})`);
37
+ }
38
+ // The path goes on its own line: this is the contract an agent reads to open the image.
39
+ printPath(file);
40
+ });
41
+ }
42
+ export async function runLogs(global, options) {
43
+ const count = Number(options.lines);
44
+ if (options.gradle) {
45
+ const status = readSession(global.project);
46
+ const file = status.paths.gradleLog;
47
+ let text = tailFile(file, count);
48
+ if (options.filter !== undefined) {
49
+ const pattern = new RegExp(options.filter);
50
+ text = readTruncated(file)
51
+ .split('\n')
52
+ .filter((entry) => pattern.test(entry))
53
+ .slice(-count)
54
+ .join('\n');
55
+ }
56
+ if (global.json) {
57
+ printJson({ source: file, lines: text.split('\n').filter((entry) => entry.length > 0) });
58
+ return;
59
+ }
60
+ if (!global.quiet) {
61
+ line(`# ${file}`);
62
+ }
63
+ line(text);
64
+ return;
65
+ }
66
+ await withClient(global, async ({ client }) => {
67
+ const params = { lines: count };
68
+ if (options.filter !== undefined) {
69
+ params['filter'] = options.filter;
70
+ }
71
+ if (options.level !== undefined) {
72
+ params['level'] = options.level;
73
+ }
74
+ const result = await client.call('log.tail', params);
75
+ if (global.json) {
76
+ printJson(result);
77
+ return;
78
+ }
79
+ for (const entry of result.lines) {
80
+ line(entry);
81
+ }
82
+ if (!global.quiet) {
83
+ line(`# ${result.lines.length} of ${result.buffered} buffered lines, at level ${result.level} and above`);
84
+ }
85
+ });
86
+ }
87
+ export function screenshotDirectory(projectDir) {
88
+ return path.join(projectDir, '.clientdevbridge', 'screenshots');
89
+ }
90
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { GlobalOptions } from './context.js';
2
+ export interface StartCommandOptions {
3
+ readonly loader?: string | undefined;
4
+ readonly mcVersion?: string | undefined;
5
+ readonly clientdevbridgeVersion?: string | undefined;
6
+ readonly world?: string | undefined;
7
+ readonly headed: boolean;
8
+ readonly port: string;
9
+ readonly timeout: string;
10
+ readonly gradleArgs?: string | undefined;
11
+ readonly width: string;
12
+ readonly height: string;
13
+ readonly eval: boolean;
14
+ readonly pinOptions: boolean;
15
+ readonly jdwpPort?: string | undefined;
16
+ }
17
+ export declare function runStart(global: GlobalOptions, options: StartCommandOptions): Promise<void>;
18
+ export declare function runStop(global: GlobalOptions, options?: {
19
+ port?: string | undefined;
20
+ }): Promise<void>;
21
+ export declare function runStatus(global: GlobalOptions): Promise<void>;
22
+ export declare function runRestart(global: GlobalOptions, options: StartCommandOptions): Promise<void>;
23
+ export declare const START_DEFAULTS: {
24
+ port: string;
25
+ timeout: string;
26
+ width: string;
27
+ height: string;
28
+ };
29
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/commands/lifecycle.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCjG;AAaD,wBAAsB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB/G;AAkCD,wBAAsB,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFpE;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGnG;AAED,eAAO,MAAM,cAAc;;;;;CAK1B,CAAC"}
@@ -0,0 +1,201 @@
1
+ import * as path from 'node:path';
2
+ import { DEFAULT_HEIGHT, DEFAULT_PORT, DEFAULT_USERNAME, DEFAULT_WIDTH, describeBridgeOnPort, describePortOwner, isPortFree, start, stop, tailFile, } from '../launcher.js';
3
+ import { formatDuration, keyValues, line, printJson } from '../output.js';
4
+ import { readSession } from '../session.js';
5
+ import { BridgeClient } from '../protocol/client.js';
6
+ export async function runStart(global, options) {
7
+ const result = await start({
8
+ projectDir: global.project,
9
+ loader: options.loader,
10
+ minecraftVersion: options.mcVersion,
11
+ bridgeVersion: options.clientdevbridgeVersion,
12
+ world: options.world,
13
+ headed: options.headed,
14
+ port: Number(options.port),
15
+ timeoutMs: Number(options.timeout) * 1000,
16
+ gradleArgs: options.gradleArgs === undefined ? [] : options.gradleArgs.split(' ').filter((a) => a.length > 0),
17
+ width: Number(options.width),
18
+ height: Number(options.height),
19
+ evalEnabled: options.eval,
20
+ pinOptions: options.pinOptions,
21
+ jdwpPort: options.jdwpPort === undefined ? null : Number(options.jdwpPort),
22
+ onProgress: global.quiet ? undefined : (message) => line(message),
23
+ });
24
+ if (global.json) {
25
+ printJson({ session: result.session, hello: result.hello });
26
+ return;
27
+ }
28
+ const hello = result.hello;
29
+ line('ClientDevBridge is ready.');
30
+ keyValues([
31
+ ['project', result.session.projectDir],
32
+ ['loader', result.session.loader],
33
+ ['minecraft', String(hello['mcVersion'] ?? result.session.mcVersion)],
34
+ ['mod version', String(hello['clientDevBridgeVersion'] ?? result.session.bridgeVersion)],
35
+ ['protocol', String(hello['protocol'])],
36
+ ['port', result.session.port],
37
+ ['username', DEFAULT_USERNAME],
38
+ ['world', result.session.world],
39
+ ['eval', String(hello['evalEnabled'] ?? false)],
40
+ // Fabric loads its API as ~50 separate modules, which turns this into a wall of names that
41
+ // says nothing. What a caller needs from it is whether the mod under test is loaded.
42
+ ['mods', summariseMods(hello['mods'])],
43
+ ]);
44
+ }
45
+ /** The mod list, shortened once it stops being readable. */
46
+ function summariseMods(mods, limit = 12) {
47
+ if (mods === undefined) {
48
+ return [];
49
+ }
50
+ if (mods.length <= limit) {
51
+ return mods;
52
+ }
53
+ return [...mods.slice(0, limit), `... and ${mods.length - limit} more`];
54
+ }
55
+ export async function runStop(global, options = {}) {
56
+ const port = options.port === undefined ? DEFAULT_PORT : Number(options.port);
57
+ const result = await stop(global.project, port);
58
+ if (global.json) {
59
+ printJson(result);
60
+ return;
61
+ }
62
+ if (result.stopped) {
63
+ line('Stopped the ClientDevBridge client.');
64
+ }
65
+ else if (result.wasStale) {
66
+ line('No client was running; cleared a stale session file.');
67
+ }
68
+ else {
69
+ line('No client was running.');
70
+ }
71
+ if (result.orphan !== null) {
72
+ line('');
73
+ for (const explanation of await describeOccupiedPort(port, result.orphan, global.project)) {
74
+ line(explanation);
75
+ }
76
+ process.exitCode = 2;
77
+ }
78
+ }
79
+ /**
80
+ * Explains what is holding the bridge port.
81
+ *
82
+ * "An orphaned client whose session file is gone" is one possibility and not the likely one: a mod
83
+ * developer with two checkouts open reaches this every time, and `kill <pid>` is confident, wrong
84
+ * advice about a client they are still using.
85
+ */
86
+ async function describeOccupiedPort(port, pid, thisProject) {
87
+ const bridge = await describeBridgeOnPort(port);
88
+ if (bridge === null) {
89
+ return [
90
+ `Something is listening on port ${port}: pid ${pid}, and it does not answer the bridge protocol.`,
91
+ `Start elsewhere with --port <other>, or stop it with: kill ${pid.split(' ')[0]}`,
92
+ ];
93
+ }
94
+ const where = bridge.projectDir;
95
+ if (where !== null && path.resolve(where) !== path.resolve(thisProject)) {
96
+ return [
97
+ `A ClientDevBridge client is on port ${port} (pid ${pid}), but it belongs to another project:`,
98
+ ` ${where} (Minecraft ${bridge.mcVersion}, ${bridge.loader})`,
99
+ `Drive it from there, stop it with: clientdevbridge --project ${where} stop`,
100
+ 'or start this project on a different port with --port <other>.',
101
+ ];
102
+ }
103
+ return [
104
+ `A ClientDevBridge client for this project is on port ${port} (pid ${pid}), but its session`,
105
+ `file is gone (Minecraft ${bridge.mcVersion}, ${bridge.loader}), so the CLI cannot drive it.`,
106
+ `Stop it with: kill ${pid.split(' ')[0]}`,
107
+ ];
108
+ }
109
+ export async function runStatus(global) {
110
+ const status = readSession(global.project);
111
+ if (status.session === null || status.stale) {
112
+ const reason = status.session === null && !status.stale ? 'no session recorded' : 'the recorded process is gone';
113
+ // The session file is not the only evidence: a client whose session.json was deleted is still
114
+ // running, and reporting it as gone is worse than reporting nothing at all.
115
+ const port = status.session?.port ?? DEFAULT_PORT;
116
+ const orphan = (await isPortFree(port)) ? null : describePortOwner(port);
117
+ if (global.json) {
118
+ printJson({ running: false, reason, project: status.paths.projectDir, orphanOnPort: orphan });
119
+ return;
120
+ }
121
+ line(`Not running (${reason}) in ${status.paths.projectDir}.`);
122
+ if (orphan !== null) {
123
+ line('');
124
+ for (const explanation of await describeOccupiedPort(port, orphan, status.paths.projectDir)) {
125
+ line(explanation);
126
+ }
127
+ return;
128
+ }
129
+ line('Start one with: clientdevbridge start');
130
+ // The log tail is what explains a crash. After a deliberate stop it is just noise, and a
131
+ // cleanly stopped session leaves no marker to tell the two apart -- so only show it when the
132
+ // client is recorded as having died rather than never having been tracked.
133
+ if (status.stale) {
134
+ const tail = tailFile(status.paths.gradleLog, 20);
135
+ if (tail !== '(no log yet)' && tail.length > 0) {
136
+ line('');
137
+ line(`The client exited. Last 20 lines of ${status.paths.gradleLog}:`);
138
+ line(tail);
139
+ }
140
+ }
141
+ return;
142
+ }
143
+ const session = status.session;
144
+ let live = null;
145
+ let hello = null;
146
+ let connectError = null;
147
+ try {
148
+ const client = await BridgeClient.connect({ port: session.port, timeoutMs: 5000 });
149
+ hello = client.hello;
150
+ live = await client.call('status');
151
+ client.close();
152
+ }
153
+ catch (error) {
154
+ connectError = error.message;
155
+ }
156
+ if (global.json) {
157
+ printJson({ running: true, session, hello, status: live, connectError });
158
+ return;
159
+ }
160
+ line(connectError === null ? 'Running.' : 'Running, but not answering yet.');
161
+ keyValues([
162
+ ['project', session.projectDir],
163
+ ['loader', session.loader],
164
+ ['minecraft', String(hello?.['mcVersion'] ?? session.mcVersion)],
165
+ ['mod version', String(hello?.['clientDevBridgeVersion'] ?? session.bridgeVersion)],
166
+ ['protocol', String(hello?.['protocol'] ?? '-')],
167
+ ['port', session.port],
168
+ ['pid', session.pid],
169
+ ['display', session.display],
170
+ ['uptime', formatDuration(Date.now() - new Date(session.startedAt).getTime())],
171
+ ['gradle log', session.projectDir === '' ? '-' : path.join(session.projectDir, '.clientdevbridge', 'gradle.log')],
172
+ ]);
173
+ if (live !== null) {
174
+ line('');
175
+ keyValues([
176
+ ['in world', String(live['inWorld'])],
177
+ ['screen', String(live['screenClass'] ?? 'none')],
178
+ ['tick', String(live['tick'])],
179
+ ['fps', String(live['fps'])],
180
+ ['gui size', `${live['guiWidth']}x${live['guiHeight']} @ scale ${live['guiScale']}`],
181
+ ['pixel size', `${live['pixelWidth']}x${live['pixelHeight']}`],
182
+ ['game dir', String(live['gameDir'] ?? '-')],
183
+ ]);
184
+ }
185
+ else if (connectError !== null) {
186
+ line('');
187
+ line(connectError);
188
+ line(`See ${path.join(session.projectDir, '.clientdevbridge', 'gradle.log')} for the game log.`);
189
+ }
190
+ }
191
+ export async function runRestart(global, options) {
192
+ await stop(global.project);
193
+ await runStart(global, options);
194
+ }
195
+ export const START_DEFAULTS = {
196
+ port: String(DEFAULT_PORT),
197
+ timeout: '300',
198
+ width: String(DEFAULT_WIDTH),
199
+ height: String(DEFAULT_HEIGHT),
200
+ };
201
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/commands/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type Snapshot } from '../snapshot/model.js';
2
+ import type { BridgeClient } from '../protocol/client.js';
3
+ import { type GlobalOptions } from './context.js';
4
+ export declare function fetchSnapshot(client: BridgeClient, options?: {
5
+ includeHidden?: boolean;
6
+ maxDepth?: number;
7
+ }): Promise<Snapshot>;
8
+ export declare function runSnapshot(global: GlobalOptions, options: {
9
+ includeHidden: boolean;
10
+ maxDepth?: string | undefined;
11
+ }): Promise<void>;
12
+ export declare function runFind(global: GlobalOptions, text: string, options: {
13
+ type?: string | undefined;
14
+ }): Promise<void>;
15
+ /**
16
+ * Turns a `--widget` argument into a point to click.
17
+ *
18
+ * Ambiguity is an error rather than a guess: silently clicking the wrong one of two similarly
19
+ * labelled buttons is far worse than being told to be more specific.
20
+ */
21
+ export declare function resolveWidget(client: BridgeClient, query: string): Promise<{
22
+ x: number;
23
+ y: number;
24
+ }>;
25
+ export declare function runTooltip(global: GlobalOptions, options: {
26
+ at?: string | undefined;
27
+ widget?: string | undefined;
28
+ }): Promise<void>;
29
+ /**
30
+ * The composite an agent reaches for most: open a block's GUI, wait for it, and produce both the
31
+ * outline and a screenshot path in one round trip.
32
+ */
33
+ export declare function runInspectGui(global: GlobalOptions, x: string, y: string, z: string, options: {
34
+ approach: boolean;
35
+ name?: string | undefined;
36
+ }): Promise<void>;
37
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,QAAQ,EAAkB,MAAM,sBAAsB,CAAC;AAEhG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,KAAK,aAAa,EAA0C,MAAM,cAAc,CAAC;AAE1F,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3D,OAAO,CAAC,QAAQ,CAAC,CAkBnB;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACjE,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACrC,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiC1G;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAChE,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,OAAO,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACxD,OAAO,CAAC,IAAI,CAAC,CA4Bf"}