@bitmagic/cli 0.1.52-dev.0 → 0.1.52-dev.2

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 (82) hide show
  1. package/README.md +66 -1
  2. package/dist/assets/add.d.ts +66 -0
  3. package/dist/assets/add.js +274 -0
  4. package/dist/assets/add.js.map +1 -0
  5. package/dist/assets/entry.d.ts +44 -0
  6. package/dist/assets/entry.js +71 -0
  7. package/dist/assets/entry.js.map +1 -0
  8. package/dist/assets/file-kind.d.ts +53 -0
  9. package/dist/assets/file-kind.js +180 -0
  10. package/dist/assets/file-kind.js.map +1 -0
  11. package/dist/assets/list.d.ts +27 -0
  12. package/dist/assets/list.js +50 -0
  13. package/dist/assets/list.js.map +1 -0
  14. package/dist/assets/remove.d.ts +50 -0
  15. package/dist/assets/remove.js +91 -0
  16. package/dist/assets/remove.js.map +1 -0
  17. package/dist/assets/vxl-summary.d.ts +23 -0
  18. package/dist/assets/vxl-summary.js +103 -0
  19. package/dist/assets/vxl-summary.js.map +1 -0
  20. package/dist/browser-gl.d.ts +46 -8
  21. package/dist/browser-gl.js +54 -26
  22. package/dist/browser-gl.js.map +1 -1
  23. package/dist/cli.d.ts +19 -0
  24. package/dist/cli.js +4 -0
  25. package/dist/cli.js.map +1 -1
  26. package/dist/commands/assets.d.ts +62 -0
  27. package/dist/commands/assets.js +359 -0
  28. package/dist/commands/assets.js.map +1 -0
  29. package/dist/commands/forge.d.ts +5 -0
  30. package/dist/commands/forge.js +10 -1
  31. package/dist/commands/forge.js.map +1 -1
  32. package/dist/commands/init.js +19 -12
  33. package/dist/commands/init.js.map +1 -1
  34. package/dist/commands/judge.d.ts +41 -0
  35. package/dist/commands/judge.js +217 -0
  36. package/dist/commands/judge.js.map +1 -0
  37. package/dist/commands/reset-account.js +2 -8
  38. package/dist/commands/reset-account.js.map +1 -1
  39. package/dist/commands/verify.js +3 -3
  40. package/dist/commands/verify.js.map +1 -1
  41. package/dist/editor/previews.d.ts +6 -0
  42. package/dist/editor/previews.js +16 -0
  43. package/dist/editor/previews.js.map +1 -1
  44. package/dist/editor/server.js +2 -2
  45. package/dist/editor/server.js.map +1 -1
  46. package/dist/forge/apply-modifications.d.ts +9 -1
  47. package/dist/forge/apply-modifications.js +3 -14
  48. package/dist/forge/apply-modifications.js.map +1 -1
  49. package/dist/forge/voxelize-session.d.ts +24 -0
  50. package/dist/forge/voxelize-session.js +137 -0
  51. package/dist/forge/voxelize-session.js.map +1 -0
  52. package/dist/generate/prop.js +9 -63
  53. package/dist/generate/prop.js.map +1 -1
  54. package/dist/generate/vehicle.js +5 -85
  55. package/dist/generate/vehicle.js.map +1 -1
  56. package/dist/http/signed-upload.d.ts +55 -0
  57. package/dist/http/signed-upload.js +168 -0
  58. package/dist/http/signed-upload.js.map +1 -0
  59. package/dist/judge/facts.d.ts +18 -0
  60. package/dist/judge/facts.js +180 -0
  61. package/dist/judge/facts.js.map +1 -0
  62. package/dist/judge/record.d.ts +16 -0
  63. package/dist/judge/record.js +55 -0
  64. package/dist/judge/record.js.map +1 -0
  65. package/dist/judge/stream.d.ts +36 -0
  66. package/dist/judge/stream.js +122 -0
  67. package/dist/judge/stream.js.map +1 -0
  68. package/dist/project/jobs.d.ts +1 -1
  69. package/dist/project/jobs.js.map +1 -1
  70. package/dist/publish/client.js +13 -34
  71. package/dist/publish/client.js.map +1 -1
  72. package/dist/scaffold/project-files.d.ts +8 -0
  73. package/dist/scaffold/project-files.js +104 -21
  74. package/dist/scaffold/project-files.js.map +1 -1
  75. package/dist/scaffold/project.js +2 -1
  76. package/dist/scaffold/project.js.map +1 -1
  77. package/dist/verify/browser.d.ts +11 -6
  78. package/dist/verify/browser.js +31 -15
  79. package/dist/verify/browser.js.map +1 -1
  80. package/dist/verify/iterate.js +3 -3
  81. package/dist/verify/iterate.js.map +1 -1
  82. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"prop.js","sourceRoot":"","sources":["../../src/generate/prop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prop.js","sourceRoot":"","sources":["../../src/generate/prop.ts"],"names":[],"mappings":"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"}
@@ -1,39 +1,8 @@
1
- /**
2
- * `bitmagic generate vehicle` — design a drivable vehicle and register it as an asset.
3
- *
4
- * Three steps, the same shape `generate prop` uses:
5
- *
6
- * 1. Ask api-server to design + build the vehicle (`POST /api/cli/v1/assets/vehicle/stream`).
7
- * The designer LLM and the Asset Forger credentials live there and never reach this machine.
8
- * 2. Voxelize the GLB in a browser. Only the engine can do this, so the CLI drives its own
9
- * headless Chrome — the same arrangement `bitmagic forge` and `generate prop` use.
10
- * 3. Upsert the finished asset into `assets[]`.
11
- *
12
- * Where this deliberately differs from `prop`, which upgrades an EXISTING asset in place:
13
- *
14
- * - No asset is looked up first, and none is required. A vehicle is a NEW asset; requiring a
15
- * placeholder to already exist would make the command unusable.
16
- * - No `fitBox` and no `assetId` are sent. The engine derives the vehicle's physics fitment from
17
- * the GLB's own `bmVehicle` scene extras and mints the id. Passing a fitBox would rescale the
18
- * body off its authored ride stance and silently produce wrong physics.
19
- * - The bake resolution comes from the server frame, not a constant: it is derived from the
20
- * vehicle's own proportions (a semi tractor and a go-kart do not bake at the same voxel size).
21
- *
22
- * The GLB survives a failure in steps 2-3: it is reported in the error so a retry can be pointed at
23
- * it with `--glb-url` rather than paying for the design twice.
24
- */
25
- import { spawn } from 'child_process';
26
1
  import { CliError } from '../errors.js';
27
2
  import { applyModificationsToWorld } from '../forge/apply-modifications.js';
28
- import { ForgeBrowserHost, readProjectGameData } from '../forge/browser-host.js';
29
3
  import { projectWorldJsonPath } from '../forge/run-pipeline.js';
30
- import { startUploadProxy } from '../forge/upload-proxy.js';
4
+ import { VOXELIZE_TIMEOUT_MS, withVoxelizeSession } from '../forge/voxelize-session.js';
31
5
  import { requestGeneration } from './stream.js';
32
- import { reserveCorsAllowedPort } from '../local-port.js';
33
- import { projectBin } from '../project/context.js';
34
- import { waitForServer } from '../verify/wait-for-server.js';
35
- /** Voxelizing a dense mesh is minutes of work in the browser, not seconds. */
36
- const VOXELIZE_TIMEOUT_MS = 10 * 60 * 1000;
37
6
  /**
38
7
  * A vehicle body is a closed shell around a cabin; baked hollow it reads as a shell the moment the
39
8
  * camera clips inside, and every preset is well under the size where a solid fill gets expensive.
@@ -114,48 +83,9 @@ function retryHint(name, glbUrl, minVoxelSize) {
114
83
  export async function voxelizeAndInstallVehicle(options) {
115
84
  const { context, environment, token, name, glbUrl, minVoxelSize, maxVoxelSize, description, log } = options;
116
85
  const worldPath = projectWorldJsonPath(context.root);
117
- const port = await reserveCorsAllowedPort();
118
- if (port === null) {
119
- throw new CliError('No free port between 3000 and 3199, which is the only range the asset CDN serves. '
120
- + `Stop something in that range and retry.\n${retryHint(name, glbUrl, minVoxelSize)}`);
121
- }
122
- const vite = projectBin(context.root, 'vite');
123
- let server;
124
- let host;
125
- let uploadProxy;
126
- try {
127
- server = spawn(vite, ['--port', String(port), '--strictPort'], {
128
- cwd: context.root,
129
- stdio: ['ignore', 'ignore', 'pipe'],
130
- });
131
- let viteStderr = '';
132
- server.stderr?.on('data', (chunk) => { viteStderr += String(chunk); });
133
- try {
134
- await waitForServer(port, 30_000);
135
- }
136
- catch {
137
- throw new CliError(`The project's dev server did not come up on port ${port}, so the vehicle cannot be voxelized.`
138
- + (viteStderr.trim() ? `\n${viteStderr.trim()}` : '')
139
- + `\n${retryHint(name, glbUrl, minVoxelSize)}`);
140
- }
141
- // The engine uploads the baked .vxl itself, to a presigned URL it asks for at a hardcoded
142
- // path with no credentials. The proxy translates that into the authenticated api-server route
143
- // and keeps the token out of the page — see forge/upload-proxy.ts.
144
- uploadProxy = await startUploadProxy({
145
- apiUrl: environment.apiUrl,
146
- token,
147
- gameId: context.metadata.gameId,
148
- log,
149
- });
150
- host = new ForgeBrowserHost({
151
- gamePort: port,
152
- gameId: context.metadata.gameId,
153
- gameData: readProjectGameData(context.root, context.metadata),
154
- agentUrl: uploadProxy.url,
155
- log,
156
- });
157
- await host.launch();
158
- await host.loadGame();
86
+ return withVoxelizeSession({
87
+ context, environment, token, log, subject: 'the vehicle', retryHint: retryHint(name, glbUrl, minVoxelSize),
88
+ }, async ({ host, port }) => {
159
89
  log(`Voxelizing "${name}" at ${minVoxelSize}m…`);
160
90
  const result = await host.transport.sendAndWait({
161
91
  type: 'CREATE_ASSET_FROM_GLB_URL',
@@ -212,16 +142,6 @@ export async function voxelizeAndInstallVehicle(options) {
212
142
  drivable,
213
143
  notes,
214
144
  };
215
- }
216
- finally {
217
- // Ordered: the page first (it may still be mid-upload), then the proxy it was uploading
218
- // through, then the server underneath both.
219
- if (host)
220
- await host.close();
221
- if (uploadProxy)
222
- await uploadProxy.close();
223
- if (server)
224
- server.kill('SIGTERM');
225
- }
145
+ });
226
146
  }
227
147
  //# sourceMappingURL=vehicle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vehicle.js","sourceRoot":"","sources":["../../src/generate/vehicle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vehicle.js","sourceRoot":"","sources":["../../src/generate/vehicle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { Environment } from '../config/environments.js';
2
+ import { type ApiDeps } from './client.js';
3
+ /** The api-server route; the same one `forge/upload-proxy.ts` forwards the engine to. */
4
+ export declare const SIGNED_UPLOAD_PATH = "/api/cli/v1/uploads/signed-url";
5
+ export interface SignedUploadRequest {
6
+ gameId: string;
7
+ /** A bare basename. api-server refuses (never rewrites) a path separator or `..`. */
8
+ filename: string;
9
+ contentType: string;
10
+ }
11
+ /** `cli-uploads.ts`'s `generateUploadSignedUrl` response, the fields a caller needs. */
12
+ export interface SignedUpload {
13
+ signedUrl: string;
14
+ /** Where the object is served from once the PUT lands — what goes into world.json. */
15
+ publicUrl: string;
16
+ cacheControl?: string;
17
+ /** `'gzip'` when the server bound that encoding into the signature; the PUT must then gzip. */
18
+ contentEncoding?: string;
19
+ }
20
+ /**
21
+ * Ask api-server for a presigned PUT under `worlds/v3/<gameId>/`. Ownership is checked there
22
+ * before anything is minted, so a refusal here has cost nothing and changed nothing.
23
+ */
24
+ export declare function mintSignedUpload(environment: Environment, accessToken: string, body: SignedUploadRequest, deps: ApiDeps): Promise<SignedUpload>;
25
+ export interface PutSignedUrlOptions {
26
+ /** Exit code for a failed PUT. `bitmagic publish` documents 6 for its upload step; default 1. */
27
+ exitCode?: number;
28
+ }
29
+ /**
30
+ * Raw PUT of already-prepared bytes to a GCS V4 signed URL.
31
+ *
32
+ * `headers` must match exactly what the URL's signature bound (Content-Type, Cache-Control, and
33
+ * Content-Encoding when the server chose to gzip). A mismatch is a 403 from GCS, not a stale-cache
34
+ * symptom; see cli-publish.ts's and cli-uploads.ts's own doc comments for why.
35
+ */
36
+ export declare function putSignedUrl(url: string, body: string | Uint8Array, headers: Record<string, string>, deps: ApiDeps, options?: PutSignedUrlOptions): Promise<void>;
37
+ /**
38
+ * PUT `bytes` to the URL `mintSignedUpload` returned, gzipping first when the server bound
39
+ * `Content-Encoding: gzip` into the signature. `contentType` is the SAME value the caller minted
40
+ * with (the server never echoes it back), while `cacheControl` and `contentEncoding` are read off
41
+ * the signed response, because the server — not the caller — decides both.
42
+ *
43
+ * Returns the byte count that actually went over the wire, which is also what is stored.
44
+ */
45
+ export declare function putSignedUpload(signed: SignedUpload, bytes: Uint8Array, contentType: string, deps: ApiDeps, options?: PutSignedUrlOptions): Promise<{
46
+ storedBytes: number;
47
+ }>;
48
+ export interface UploadProjectFileInput extends SignedUploadRequest {
49
+ bytes: Uint8Array;
50
+ }
51
+ /** Mint and PUT in one call — the whole upload for a file the CLI holds in memory. */
52
+ export declare function uploadProjectFile(environment: Environment, accessToken: string, input: UploadProjectFileInput, deps: ApiDeps): Promise<{
53
+ url: string;
54
+ storedBytes: number;
55
+ }>;
@@ -0,0 +1,168 @@
1
+ /**
2
+ * The CLI's own lane into Bitmagic's storage bucket: mint a presigned PUT from api-server, then
3
+ * PUT the bytes to it from THIS process.
4
+ *
5
+ * `forge/upload-proxy.ts` bridges the same api-server route for the ENGINE (a headless page that
6
+ * uploads its own `.vxl` bytes); this module is for bytes the CLI already holds — a creator's own
7
+ * `.glb`/`.vxl`/image/audio file (`bitmagic assets add`) or the publish thumbnail. One place for
8
+ * the two things every caller has to get right:
9
+ *
10
+ * - **The PUT's headers must match what the signature bound.** api-server signs `Content-Type`,
11
+ * `Cache-Control` and — for the content types it marks compressible (`application/octet-stream`,
12
+ * `application/json`, ...) — `Content-Encoding: gzip`. A header that differs is a 403 from GCS,
13
+ * which reads like an auth problem and is not one.
14
+ * - **`Content-Encoding: gzip` means the bytes are gzipped**, not merely labelled. The engine's
15
+ * `StorageUploadUtil` gzips before it PUTs; so does this. A creator's `.vxl` uploaded raw under a
16
+ * gzip label would be served with the wrong encoding and fail to load in every browser.
17
+ *
18
+ * Status mapping is this module's own rather than `http/client.ts`'s `request()`, because that one
19
+ * reads every 403 as a Bitmagic Pro refusal. Here a 403 is more often "you do not own this game"
20
+ * (api-server's `assertOwnsGame`, which answers `{ error }` with no `code`) — telling that creator
21
+ * to subscribe would send them somewhere that cannot help.
22
+ */
23
+ import * as zlib from 'zlib';
24
+ import { CliError } from '../errors.js';
25
+ import { proRefusal } from './client.js';
26
+ import { isJsonObject } from '../project/world-json.js';
27
+ import { apiServerHeaders } from '../telemetry/request-headers.js';
28
+ /** The api-server route; the same one `forge/upload-proxy.ts` forwards the engine to. */
29
+ export const SIGNED_UPLOAD_PATH = '/api/cli/v1/uploads/signed-url';
30
+ async function readJsonBody(response) {
31
+ try {
32
+ const parsed = await response.json();
33
+ return isJsonObject(parsed) ? parsed : {};
34
+ }
35
+ catch {
36
+ return {};
37
+ }
38
+ }
39
+ /**
40
+ * Ask api-server for a presigned PUT under `worlds/v3/<gameId>/`. Ownership is checked there
41
+ * before anything is minted, so a refusal here has cost nothing and changed nothing.
42
+ */
43
+ export async function mintSignedUpload(environment, accessToken, body, deps) {
44
+ const url = `${environment.apiUrl}${SIGNED_UPLOAD_PATH}`;
45
+ let response;
46
+ try {
47
+ response = await deps.fetch(url, {
48
+ method: 'POST',
49
+ headers: {
50
+ ...apiServerHeaders(),
51
+ Authorization: `Bearer ${accessToken}`,
52
+ 'Content-Type': 'application/json',
53
+ Accept: 'application/json',
54
+ },
55
+ body: JSON.stringify(body),
56
+ });
57
+ }
58
+ catch {
59
+ throw new CliError(`Cannot reach api-server at ${environment.apiUrl}.`, 1, 'unreachable');
60
+ }
61
+ if (response.ok) {
62
+ const parsed = await readJsonBody(response);
63
+ if (typeof parsed.signedUrl !== 'string' || typeof parsed.publicUrl !== 'string') {
64
+ throw new CliError('api-server minted an upload URL this CLI cannot read — is it newer than this CLI?');
65
+ }
66
+ return {
67
+ signedUrl: parsed.signedUrl,
68
+ publicUrl: parsed.publicUrl,
69
+ // Absent, not ''. The value is bound into the V4 signature, so sending an empty header the
70
+ // server never signed is a GCS 403 that reads like an auth failure.
71
+ ...(typeof parsed.cacheControl === 'string' && parsed.cacheControl !== ''
72
+ ? { cacheControl: parsed.cacheControl }
73
+ : {}),
74
+ ...(typeof parsed.contentEncoding === 'string' && parsed.contentEncoding !== ''
75
+ ? { contentEncoding: parsed.contentEncoding }
76
+ : {}),
77
+ };
78
+ }
79
+ if (response.status === 401) {
80
+ throw new CliError('Your session has expired. Run `bitmagic login`.', 1, 'session_expired');
81
+ }
82
+ if (response.status === 403) {
83
+ // Two different refusals share the status: the Pro gate on every /api/cli/v1 route (which
84
+ // carries a `code`), and this route's own ownership check (which carries only `error`).
85
+ const clone = response.clone();
86
+ const parsed = await readJsonBody(response);
87
+ if (parsed.code === 'pro_expired' || parsed.code === 'pro_required') {
88
+ const refusal = await proRefusal(clone);
89
+ throw new CliError(refusal.message, 1, refusal.code);
90
+ }
91
+ throw new CliError(`You do not own game "${body.gameId}", so nothing can be uploaded to it. `
92
+ + 'Check the gameId in bitmagic.json.', 1, 'not_owner');
93
+ }
94
+ if (response.status === 400) {
95
+ const parsed = await readJsonBody(response);
96
+ const message = typeof parsed.error === 'string' ? parsed.error : 'api-server rejected the upload request.';
97
+ throw new CliError(`api-server refused to mint an upload URL: ${message}`);
98
+ }
99
+ if (response.status === 503) {
100
+ throw new CliError(`api-server reported uploads are unavailable in the "${environment.name}" environment.`, 1, 'unavailable');
101
+ }
102
+ throw new CliError(`api-server returned HTTP ${response.status} for ${SIGNED_UPLOAD_PATH}.`, 1, 'http_error');
103
+ }
104
+ /**
105
+ * Raw PUT of already-prepared bytes to a GCS V4 signed URL.
106
+ *
107
+ * `headers` must match exactly what the URL's signature bound (Content-Type, Cache-Control, and
108
+ * Content-Encoding when the server chose to gzip). A mismatch is a 403 from GCS, not a stale-cache
109
+ * symptom; see cli-publish.ts's and cli-uploads.ts's own doc comments for why.
110
+ */
111
+ export async function putSignedUrl(url, body, headers, deps, options = {}) {
112
+ const exitCode = options.exitCode ?? 1;
113
+ let response;
114
+ try {
115
+ // `@types/node`'s ambient `Uint8Array` (generic over `ArrayBufferLike` since TS 5.7) does not
116
+ // structurally match this project's `BodyInit` (this tsconfig's `"DOM"` lib pulls in lib.dom's
117
+ // own copy, which `@types/node`'s conditional global-augmentation defers to whenever DOM
118
+ // globals are present — see node_modules/@types/node/web-globals/fetch.d.ts). Deriving the
119
+ // body type from `Parameters<typeof fetch>[1]` instead of naming `BodyInit` was tried and hits
120
+ // the identical mismatch, because it resolves to the same lib.dom type in THIS project. Both a
121
+ // `string` and a `Uint8Array` are valid `fetch` bodies at runtime regardless.
122
+ response = await deps.fetch(url, { method: 'PUT', headers, body: body });
123
+ }
124
+ catch (error) {
125
+ const message = error instanceof Error ? error.message : String(error);
126
+ throw new CliError(`Could not upload to storage: ${message}`, exitCode);
127
+ }
128
+ if (!response.ok) {
129
+ const text = await response.text().catch(() => '');
130
+ throw new CliError(`Upload to storage failed: HTTP ${response.status}${text ? ` — ${text.slice(0, 200)}` : ''}`, exitCode);
131
+ }
132
+ }
133
+ /**
134
+ * PUT `bytes` to the URL `mintSignedUpload` returned, gzipping first when the server bound
135
+ * `Content-Encoding: gzip` into the signature. `contentType` is the SAME value the caller minted
136
+ * with (the server never echoes it back), while `cacheControl` and `contentEncoding` are read off
137
+ * the signed response, because the server — not the caller — decides both.
138
+ *
139
+ * Returns the byte count that actually went over the wire, which is also what is stored.
140
+ */
141
+ export async function putSignedUpload(signed, bytes, contentType, deps, options = {}) {
142
+ const headers = { 'Content-Type': contentType };
143
+ if (signed.cacheControl !== undefined && signed.cacheControl !== '') {
144
+ headers['Cache-Control'] = signed.cacheControl;
145
+ }
146
+ let body = bytes;
147
+ if (signed.contentEncoding !== undefined && signed.contentEncoding !== '') {
148
+ // Only gzip is implemented, and an encoding this code cannot PRODUCE must not be advertised:
149
+ // labelling raw bytes `br` because the server started signing brotli would store an object no
150
+ // browser can decode. Refused loudly instead, before anything is written.
151
+ if (signed.contentEncoding !== 'gzip') {
152
+ throw new CliError(`api-server asked for Content-Encoding "${signed.contentEncoding}", which this CLI cannot produce. `
153
+ + 'Run `bitmagic upgrade` or update the CLI.');
154
+ }
155
+ headers['Content-Encoding'] = signed.contentEncoding;
156
+ body = new Uint8Array(zlib.gzipSync(bytes));
157
+ }
158
+ await putSignedUrl(signed.signedUrl, body, headers, deps, options);
159
+ return { storedBytes: body.byteLength };
160
+ }
161
+ /** Mint and PUT in one call — the whole upload for a file the CLI holds in memory. */
162
+ export async function uploadProjectFile(environment, accessToken, input, deps) {
163
+ const { bytes, ...request } = input;
164
+ const signed = await mintSignedUpload(environment, accessToken, request, deps);
165
+ const { storedBytes } = await putSignedUpload(signed, bytes, request.contentType, deps);
166
+ return { url: signed.publicUrl, storedBytes };
167
+ }
168
+ //# sourceMappingURL=signed-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signed-upload.js","sourceRoot":"","sources":["../../src/http/signed-upload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { VerifyRunRecord } from '../verify/result.js';
2
+ /**
3
+ * A compact, factual inventory of the scene, or null when world.json is
4
+ * missing or unreadable (the judge then grades from pixels alone, as before).
5
+ *
6
+ * Spread matters as much as counts: "23 objects" reads very differently when
7
+ * they span the whole ground than when they huddle within 10 units of spawn,
8
+ * and design docs make exactly this kind of claim ("dotted with", "scattered
9
+ * across"). The spatial summary is what lets the judge grade those claims
10
+ * instead of guessing from whatever the camera framed.
11
+ */
12
+ export declare function buildSceneFacts(world: unknown): string | null;
13
+ /**
14
+ * The run-state summary plus a console tail — what the judge knows about the
15
+ * game beyond the pixels. Char-capped to the wire contract's limit; the tail
16
+ * is trimmed first because the engine facts are the denser signal.
17
+ */
18
+ export declare function buildVerifyContext(record: VerifyRunRecord | null, consoleTail: string | null): string | null;
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Engine ground truth for the judge — the advantage this lane has over judging
3
+ * from pixels alone. A screenshot shows one camera angle of one instant; the
4
+ * engine knows the whole world and the whole run. Everything here is composed
5
+ * DETERMINISTICALLY, in code, from data verify and the project already have —
6
+ * the model is never asked to compute a fact it can be handed.
7
+ *
8
+ * Two outputs, two destinations:
9
+ * - `buildSceneFacts` summarises world.json — what exists, where, and how
10
+ * spread out. It rides in the rubric (via `buildJudgeRubric`'s
11
+ * `sceneFacts`), beside the design text it lets the judge check claims
12
+ * against.
13
+ * - `buildVerifyContext` summarises the RUN — engine state, settle, gameplay
14
+ * events, console tail. It rides in the request's `verifyContext` field.
15
+ */
16
+ import { MAX_JUDGE_VERIFY_CHARS } from '@bitmagic/asset-core';
17
+ // ---------------------------------------------------------------------------
18
+ // Scene facts from world.json
19
+ // ---------------------------------------------------------------------------
20
+ function isRecord(value) {
21
+ return typeof value === 'object' && value !== null;
22
+ }
23
+ /** The records inside an untrusted JSON array; empty when it is not an array at all. */
24
+ function toRecords(value) {
25
+ return Array.isArray(value) ? value.filter(isRecord) : [];
26
+ }
27
+ /**
28
+ * The `cap` most common keys, commonest first, as `name×n` — the `×n` dropped
29
+ * for a single occurrence. Items whose key is null are left out entirely.
30
+ */
31
+ function formatCounts(items, key, cap) {
32
+ const totals = new Map();
33
+ for (const item of items) {
34
+ const k = key(item);
35
+ if (k !== null)
36
+ totals.set(k, (totals.get(k) ?? 0) + 1);
37
+ }
38
+ return [...totals.entries()]
39
+ .sort((a, b) => b[1] - a[1])
40
+ .slice(0, cap)
41
+ .map(([name, n]) => (n > 1 ? `${name}×${n}` : name))
42
+ .join(', ');
43
+ }
44
+ /**
45
+ * A compact, factual inventory of the scene, or null when world.json is
46
+ * missing or unreadable (the judge then grades from pixels alone, as before).
47
+ *
48
+ * Spread matters as much as counts: "23 objects" reads very differently when
49
+ * they span the whole ground than when they huddle within 10 units of spawn,
50
+ * and design docs make exactly this kind of claim ("dotted with", "scattered
51
+ * across"). The spatial summary is what lets the judge grade those claims
52
+ * instead of guessing from whatever the camera framed.
53
+ */
54
+ export function buildSceneFacts(world) {
55
+ if (!isRecord(world))
56
+ return null;
57
+ const lines = [];
58
+ const objects = toRecords(world.environmentObjects);
59
+ if (objects.length > 0) {
60
+ const byType = formatCounts(objects, (o) => (typeof o.type === 'string' ? o.type : null), 12);
61
+ lines.push(`Placed objects: ${objects.length} (${byType}).`);
62
+ const xs = [];
63
+ const zs = [];
64
+ for (const object of objects) {
65
+ const position = object.position;
66
+ if (isRecord(position) && typeof position.x === 'number' && typeof position.z === 'number') {
67
+ xs.push(position.x);
68
+ zs.push(position.z);
69
+ }
70
+ }
71
+ if (xs.length > 0) {
72
+ const span = (v) => `${Math.round(Math.min(...v))}..${Math.round(Math.max(...v))}`;
73
+ lines.push(`Object spread: x ${span(xs)}, z ${span(zs)}.`);
74
+ }
75
+ }
76
+ else {
77
+ lines.push('Placed objects: none.');
78
+ }
79
+ const assets = toRecords(world.assets);
80
+ if (assets.length > 0) {
81
+ const byType = formatCounts(assets, (a) => (typeof a.type === 'string' ? a.type : 'unknown'), 8);
82
+ const names = assets
83
+ .map((a) => a.name)
84
+ .filter((n) => typeof n === 'string')
85
+ .slice(0, 15);
86
+ lines.push(`Assets: ${assets.length} (${byType})${names.length > 0 ? ` — ${names.join(', ')}` : ''}.`);
87
+ }
88
+ else {
89
+ lines.push('Assets: none.');
90
+ }
91
+ const profile = isRecord(world.worldProfileData) ? world.worldProfileData : null;
92
+ if (profile) {
93
+ const spawn = isRecord(profile.playerSpawnPosition) ? profile.playerSpawnPosition : null;
94
+ const hud = isRecord(profile.hud) ? profile.hud : null;
95
+ const startScreen = hud && isRecord(hud.startScreen) ? hud.startScreen : null;
96
+ // Absence is stated as plainly as presence: "no custom skybox" is itself a
97
+ // finding the judge should be able to make without inspecting pixels.
98
+ const details = [
99
+ typeof profile.groundWorldSizeX === 'number' && typeof profile.groundWorldSizeZ === 'number'
100
+ ? `ground ${profile.groundWorldSizeX}×${profile.groundWorldSizeZ}`
101
+ : null,
102
+ typeof profile.skyboxUrl === 'string' && profile.skyboxUrl ? 'custom skybox' : 'no custom skybox',
103
+ spawn && typeof spawn.x === 'number' ? `spawn at (${spawn.x}, ${spawn.y}, ${spawn.z})` : null,
104
+ typeof startScreen?.imageUrl === 'string' ? 'start-screen cover art set' : 'no start-screen cover art',
105
+ ].filter((detail) => detail !== null);
106
+ lines.push(`World: ${details.join(', ')}.`);
107
+ }
108
+ return lines.join('\n');
109
+ }
110
+ // ---------------------------------------------------------------------------
111
+ // Run facts from the verify record
112
+ // ---------------------------------------------------------------------------
113
+ /** What to report when only engine `state` events fired — see verify/events.ts. */
114
+ const GAMEPLAY_EVENT_HINT = 'no gameplay events (deaths, pickups, score, match-end) fired during the run';
115
+ function describeEvents(record) {
116
+ const events = record.events;
117
+ if (!events)
118
+ return null;
119
+ const gameplay = Object.entries(events.totalByType).filter(([type]) => type !== 'state');
120
+ if (gameplay.length === 0)
121
+ return `Gameplay events: ${GAMEPLAY_EVENT_HINT}.`;
122
+ const summary = gameplay
123
+ .sort((a, b) => b[1] - a[1])
124
+ .map(([type, n]) => `${type}×${n}`)
125
+ .join(', ');
126
+ const matchEnd = events.matchEndAtSeconds !== null
127
+ ? `; first match-end at ${Math.round(events.matchEndAtSeconds)}s`
128
+ : '';
129
+ return `Gameplay events: ${summary}${matchEnd}.`;
130
+ }
131
+ function describeRun(record) {
132
+ const parts = [`verify ${record.ok ? 'passed' : 'FAILED'}`];
133
+ if (record.failures.length > 0)
134
+ parts.push(`failures: ${record.failures.join('; ')}`);
135
+ if (record.warnings.length > 0)
136
+ parts.push(`warnings: ${record.warnings.join('; ')}`);
137
+ if (record.settle) {
138
+ parts.push(`settled in ${(record.settle.durationMs / 1000).toFixed(1)}s (${record.settle.reason})`);
139
+ }
140
+ const snapshot = record.snapshot;
141
+ if (snapshot) {
142
+ const { fps, gameState, player, physics, scene, npcCount } = snapshot;
143
+ if (fps !== null)
144
+ parts.push(`${fps} fps`);
145
+ if (gameState)
146
+ parts.push(`state ${gameState}`);
147
+ if (player) {
148
+ const at = `(${Math.round(player.x)}, ${Math.round(player.y)}, ${Math.round(player.z)})`;
149
+ parts.push(`player at ${at}${player.isFalling ? ', FALLING' : ''}`);
150
+ }
151
+ if (physics)
152
+ parts.push(`${physics.rigidBodyCount} rigid bodies`);
153
+ if (scene)
154
+ parts.push(`scene: ${scene.objects} objects, ${scene.meshes} meshes, ${scene.lights} lights`);
155
+ if (npcCount !== null)
156
+ parts.push(`${npcCount} NPCs`);
157
+ }
158
+ return parts.join(' · ');
159
+ }
160
+ /**
161
+ * The run-state summary plus a console tail — what the judge knows about the
162
+ * game beyond the pixels. Char-capped to the wire contract's limit; the tail
163
+ * is trimmed first because the engine facts are the denser signal.
164
+ */
165
+ export function buildVerifyContext(record, consoleTail) {
166
+ const parts = [];
167
+ if (record) {
168
+ parts.push(describeRun(record));
169
+ const events = describeEvents(record);
170
+ if (events)
171
+ parts.push(events);
172
+ }
173
+ const tail = consoleTail?.trim();
174
+ if (tail)
175
+ parts.push(`Console tail:\n${tail}`);
176
+ if (parts.length === 0)
177
+ return null;
178
+ return parts.join('\n\n').slice(0, MAX_JUDGE_VERIFY_CHARS);
179
+ }
180
+ //# sourceMappingURL=facts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facts.js","sourceRoot":"","sources":["../../src/judge/facts.ts"],"names":[],"mappings":"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"}