@metamesh/cli 0.0.0-stage → 0.14.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 (99) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/LICENSE +200 -0
  3. package/README.md +86 -2
  4. package/dist/authoring/artifacts.d.ts +15 -0
  5. package/dist/authoring/artifacts.d.ts.map +1 -0
  6. package/dist/authoring/artifacts.js +347 -0
  7. package/dist/authoring/artifacts.js.map +1 -0
  8. package/dist/authoring/capture/render-client.js +4222 -0
  9. package/dist/authoring/capture/render-client.js.LEGAL.txt +9 -0
  10. package/dist/authoring/capture/render-client.js.map +7 -0
  11. package/dist/authoring/check.d.ts +4 -0
  12. package/dist/authoring/check.d.ts.map +1 -0
  13. package/dist/authoring/check.js +118 -0
  14. package/dist/authoring/check.js.map +1 -0
  15. package/dist/authoring/environment.d.ts +29 -0
  16. package/dist/authoring/environment.d.ts.map +1 -0
  17. package/dist/authoring/environment.js +182 -0
  18. package/dist/authoring/environment.js.map +1 -0
  19. package/dist/authoring/errors.d.ts +13 -0
  20. package/dist/authoring/errors.d.ts.map +1 -0
  21. package/dist/authoring/errors.js +43 -0
  22. package/dist/authoring/errors.js.map +1 -0
  23. package/dist/authoring/render-client.d.ts +6 -0
  24. package/dist/authoring/render-client.d.ts.map +1 -0
  25. package/dist/authoring/render-client.js +55 -0
  26. package/dist/authoring/render-client.js.map +1 -0
  27. package/dist/authoring/render-scene.d.ts +22 -0
  28. package/dist/authoring/render-scene.d.ts.map +1 -0
  29. package/dist/authoring/render-scene.js +139 -0
  30. package/dist/authoring/render-scene.js.map +1 -0
  31. package/dist/authoring/render-types.d.ts +81 -0
  32. package/dist/authoring/render-types.d.ts.map +1 -0
  33. package/dist/authoring/render-types.js +2 -0
  34. package/dist/authoring/render-types.js.map +1 -0
  35. package/dist/authoring/render.d.ts +23 -0
  36. package/dist/authoring/render.d.ts.map +1 -0
  37. package/dist/authoring/render.js +243 -0
  38. package/dist/authoring/render.js.map +1 -0
  39. package/dist/authoring/run.d.ts +7 -0
  40. package/dist/authoring/run.d.ts.map +1 -0
  41. package/dist/authoring/run.js +308 -0
  42. package/dist/authoring/run.js.map +1 -0
  43. package/dist/authoring/types.d.ts +175 -0
  44. package/dist/authoring/types.d.ts.map +1 -0
  45. package/dist/authoring/types.js +3 -0
  46. package/dist/authoring/types.js.map +1 -0
  47. package/dist/authoring/worker.d.ts +15 -0
  48. package/dist/authoring/worker.d.ts.map +1 -0
  49. package/dist/authoring/worker.js +163 -0
  50. package/dist/authoring/worker.js.map +1 -0
  51. package/dist/authoring.d.ts +12 -0
  52. package/dist/authoring.d.ts.map +1 -0
  53. package/dist/authoring.js +9 -0
  54. package/dist/authoring.js.map +1 -0
  55. package/dist/docs/guides/agent-authoring.md +240 -0
  56. package/dist/docs/guides/package.md +87 -0
  57. package/dist/docs/manifest.json +554 -0
  58. package/dist/docs/reference/authoring/AUTHORING_PROTOCOL_VERSION.md +9 -0
  59. package/dist/docs/reference/authoring/AuthoringDiagnostic.md +22 -0
  60. package/dist/docs/reference/authoring/AuthoringEnvironment.md +15 -0
  61. package/dist/docs/reference/authoring/AuthoringError.md +16 -0
  62. package/dist/docs/reference/authoring/AuthoringFailure-type.md +18 -0
  63. package/dist/docs/reference/authoring/AuthoringKind.md +10 -0
  64. package/dist/docs/reference/authoring/AuthoringPhase.md +10 -0
  65. package/dist/docs/reference/authoring/CapturedBuffer.md +14 -0
  66. package/dist/docs/reference/authoring/CapturedGeometry.md +14 -0
  67. package/dist/docs/reference/authoring/CapturedPart.md +19 -0
  68. package/dist/docs/reference/authoring/CapturedResource.md +15 -0
  69. package/dist/docs/reference/authoring/CapturedRun.md +14 -0
  70. package/dist/docs/reference/authoring/CapturedRunManifest.md +40 -0
  71. package/dist/docs/reference/authoring/CheckOptions.md +18 -0
  72. package/dist/docs/reference/authoring/CheckSuccess.md +16 -0
  73. package/dist/docs/reference/authoring/DocumentationEntry.md +20 -0
  74. package/dist/docs/reference/authoring/DocumentationManifest.md +15 -0
  75. package/dist/docs/reference/authoring/DocumentationSearchResult.md +13 -0
  76. package/dist/docs/reference/authoring/InstalledAuthoringPackage.md +15 -0
  77. package/dist/docs/reference/authoring/RenderCamera.md +22 -0
  78. package/dist/docs/reference/authoring/RenderFormat.md +10 -0
  79. package/dist/docs/reference/authoring/RenderOptions.md +20 -0
  80. package/dist/docs/reference/authoring/RenderResult.md +15 -0
  81. package/dist/docs/reference/authoring/RenderView.md +10 -0
  82. package/dist/docs/reference/authoring/RenderedImage.md +23 -0
  83. package/dist/docs/reference/authoring/RunOptions.md +25 -0
  84. package/dist/docs/reference/authoring/RunSuccess.md +14 -0
  85. package/dist/docs/reference/authoring/authoringFailure-value.md +10 -0
  86. package/dist/docs/reference/authoring/checkAuthoringSource.md +10 -0
  87. package/dist/docs/reference/authoring/discoverAuthoringEnvironment.md +13 -0
  88. package/dist/docs/reference/authoring/inspectCapturedRun.md +15 -0
  89. package/dist/docs/reference/authoring/installAuthoringBrowser.md +13 -0
  90. package/dist/docs/reference/authoring/readCapturedRun.md +10 -0
  91. package/dist/docs/reference/authoring/renderCapturedRun.md +13 -0
  92. package/dist/docs/reference/authoring/runAuthoringSource.md +13 -0
  93. package/dist/docs/reference/authoring/searchAuthoringDocumentation.md +16 -0
  94. package/dist/docs/reference/authoring/showAuthoringDocumentation.md +12 -0
  95. package/dist/metamesh.d.ts +3 -0
  96. package/dist/metamesh.d.ts.map +1 -0
  97. package/dist/metamesh.js +183 -0
  98. package/dist/metamesh.js.map +1 -0
  99. package/package.json +63 -3
@@ -0,0 +1,139 @@
1
+ import { Box3, BufferAttribute, BufferGeometry, Color, DirectionalLight, Group, HemisphereLight, Mesh, MeshStandardMaterial, OrthographicCamera, Scene, Vector3, } from "three";
2
+ /** @internal Owns one capture's GPU-independent scene resources. */
3
+ export function createCaptureScene(input, resources) {
4
+ const scene = new Scene();
5
+ if (input.background !== "transparent")
6
+ scene.background = new Color(input.background);
7
+ const group = new Group();
8
+ const geometries = new Map();
9
+ const materials = [];
10
+ function dispose() {
11
+ for (const geometry of geometries.values())
12
+ geometry.dispose();
13
+ for (const material of materials)
14
+ material.dispose();
15
+ scene.clear();
16
+ }
17
+ try {
18
+ for (const resource of resources) {
19
+ if (geometries.has(resource.id))
20
+ throw new Error(`Duplicate geometry resource ${resource.id}.`);
21
+ if (resource.positions.length === 0 ||
22
+ resource.positions.length % 3 !== 0 ||
23
+ resource.indices.length === 0 ||
24
+ resource.indices.length % 3 !== 0 ||
25
+ !resource.positions.every(Number.isFinite) ||
26
+ resource.indices.some((index) => index >= resource.positions.length / 3)) {
27
+ throw new Error(`Invalid rendering buffers for resource ${resource.id}.`);
28
+ }
29
+ const geometry = new BufferGeometry();
30
+ geometry.setAttribute("position", new BufferAttribute(resource.positions, 3));
31
+ geometry.setIndex(new BufferAttribute(resource.indices, 1));
32
+ geometry.computeVertexNormals();
33
+ geometries.set(resource.id, geometry);
34
+ }
35
+ for (const part of input.parts) {
36
+ const geometry = geometries.get(part.resourceId);
37
+ if (!geometry)
38
+ throw new Error(`Part ${part.id} refers to an unknown geometry resource.`);
39
+ if (part.position.length !== 3 ||
40
+ part.rotation.length !== 3 ||
41
+ !part.position.every(Number.isFinite) ||
42
+ !part.rotation.every(Number.isFinite)) {
43
+ throw new Error(`Part ${part.id} requires finite XYZ placement.`);
44
+ }
45
+ if (part.color !== undefined && !/^#[\da-f]{6}$/i.test(part.color)) {
46
+ throw new Error(`Part ${part.id} requires a six-digit RGB color.`);
47
+ }
48
+ const material = new MeshStandardMaterial({
49
+ color: part.color ?? "#94a3b8",
50
+ roughness: 0.72,
51
+ metalness: 0,
52
+ flatShading: true,
53
+ });
54
+ materials.push(material);
55
+ const mesh = new Mesh(geometry, material);
56
+ mesh.name = part.id;
57
+ mesh.position.set(...part.position);
58
+ // Fixed global X, then Y, then Z is the ZYX intrinsic Euler convention.
59
+ mesh.rotation.set((part.rotation[0] * Math.PI) / 180, (part.rotation[1] * Math.PI) / 180, (part.rotation[2] * Math.PI) / 180, "ZYX");
60
+ group.add(mesh);
61
+ }
62
+ scene.add(group);
63
+ group.updateMatrixWorld(true);
64
+ const bounds = new Box3().setFromObject(group, true);
65
+ if (bounds.isEmpty())
66
+ throw new Error("Cannot render a captured model with no geometry.");
67
+ const ambient = new HemisphereLight(0xffffff, 0x64748b, 2.1);
68
+ ambient.position.set(0, 0, 1);
69
+ const key = new DirectionalLight(0xffffff, 2.4);
70
+ key.position.set(2, -3, 5);
71
+ const fill = new DirectionalLight(0xffffff, 0.8);
72
+ fill.position.set(-3, 1, 2);
73
+ scene.add(ambient, key, fill);
74
+ return { scene, group, bounds, dispose };
75
+ }
76
+ catch (error) {
77
+ dispose();
78
+ throw error;
79
+ }
80
+ }
81
+ /** @internal Fits every world-bounds corner in the selected orthographic view. */
82
+ export function createCaptureCamera(bounds, view, width, height) {
83
+ const target = bounds.getCenter(new Vector3());
84
+ const diagonal = Math.max(bounds.getSize(new Vector3()).length(), 0.001);
85
+ const direction = new Vector3(...viewDirection(view)).normalize();
86
+ const camera = new OrthographicCamera(-1, 1, 1, -1, diagonal * 0.01, diagonal * 8);
87
+ camera.up.set(0, view === "top" ? 1 : 0, view === "top" ? 0 : 1);
88
+ camera.position.copy(target).addScaledVector(direction, diagonal * 3);
89
+ camera.lookAt(target);
90
+ camera.updateMatrixWorld(true);
91
+ let halfWidth = 0;
92
+ let halfHeight = 0;
93
+ for (const x of [bounds.min.x, bounds.max.x]) {
94
+ for (const y of [bounds.min.y, bounds.max.y]) {
95
+ for (const z of [bounds.min.z, bounds.max.z]) {
96
+ const point = new Vector3(x, y, z).applyMatrix4(camera.matrixWorldInverse);
97
+ halfWidth = Math.max(halfWidth, Math.abs(point.x));
98
+ halfHeight = Math.max(halfHeight, Math.abs(point.y));
99
+ }
100
+ }
101
+ }
102
+ const aspect = width / height;
103
+ halfHeight = Math.max(halfHeight, halfWidth / aspect, diagonal * 0.001) * 1.12;
104
+ halfWidth = halfHeight * aspect;
105
+ camera.left = -halfWidth;
106
+ camera.right = halfWidth;
107
+ camera.top = halfHeight;
108
+ camera.bottom = -halfHeight;
109
+ camera.updateProjectionMatrix();
110
+ return {
111
+ camera,
112
+ record: {
113
+ position: camera.position.toArray(),
114
+ target: target.toArray(),
115
+ up: camera.up.toArray(),
116
+ frustum: {
117
+ left: camera.left,
118
+ right: camera.right,
119
+ top: camera.top,
120
+ bottom: camera.bottom,
121
+ near: camera.near,
122
+ far: camera.far,
123
+ },
124
+ },
125
+ };
126
+ }
127
+ function viewDirection(view) {
128
+ switch (view) {
129
+ case "isometric":
130
+ return [1, -1, 1];
131
+ case "front":
132
+ return [0, -1, 0];
133
+ case "top":
134
+ return [0, 0, 1];
135
+ case "right":
136
+ return [1, 0, 0];
137
+ }
138
+ }
139
+ //# sourceMappingURL=render-scene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-scene.js","sourceRoot":"","sources":["../../src/authoring/render-scene.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /** Standard orthographic views in MetaMesh's Z-up coordinate system. */
2
+ export type RenderView = "isometric" | "front" | "top" | "right";
3
+ /** Image encodings; WebP is always lossless. */
4
+ export type RenderFormat = "png" | "webp";
5
+ /** Options for rendering a previously captured model, without executing author code. */
6
+ export interface RenderOptions {
7
+ readonly views?: readonly RenderView[];
8
+ readonly width?: number;
9
+ readonly height?: number;
10
+ readonly format?: RenderFormat;
11
+ readonly background?: "transparent" | `#${string}`;
12
+ /** Parent for a new unique capture directory; defaults to the run's renders directory. */
13
+ readonly outputDirectory?: string;
14
+ /** Browser startup, page readiness, and capture deadline; defaults to 30 seconds. */
15
+ readonly timeoutMs?: number;
16
+ }
17
+ /** Recorded orthographic camera, expressed in millimetres and world coordinates. */
18
+ export interface RenderCamera {
19
+ readonly position: readonly [number, number, number];
20
+ readonly target: readonly [number, number, number];
21
+ readonly up: readonly [number, number, number];
22
+ readonly frustum: {
23
+ readonly left: number;
24
+ readonly right: number;
25
+ readonly top: number;
26
+ readonly bottom: number;
27
+ readonly near: number;
28
+ readonly far: number;
29
+ };
30
+ }
31
+ /** A view and its provenance, also written beside the image as JSON. */
32
+ export interface RenderedImage {
33
+ readonly path: string;
34
+ readonly metadataPath: string;
35
+ readonly runId: string;
36
+ readonly sourceFingerprint: string;
37
+ readonly view: RenderView;
38
+ readonly width: number;
39
+ readonly height: number;
40
+ readonly format: RenderFormat;
41
+ readonly background: string;
42
+ readonly camera: RenderCamera;
43
+ readonly rendererRevision: string;
44
+ readonly browserVersion: string;
45
+ }
46
+ /** Images always belong to one captured run and one unique output directory. */
47
+ export interface RenderResult {
48
+ readonly runId: string;
49
+ readonly sourceFingerprint: string;
50
+ readonly directory: string;
51
+ readonly images: readonly RenderedImage[];
52
+ }
53
+ /** @internal Plain-data scene descriptor served only to the isolated capture page. */
54
+ export interface CaptureScene {
55
+ readonly resources: readonly {
56
+ readonly id: string;
57
+ readonly positionsUrl: string;
58
+ readonly indicesUrl: string;
59
+ }[];
60
+ readonly parts: readonly {
61
+ readonly id: string;
62
+ readonly resourceId: string;
63
+ readonly position: readonly [number, number, number];
64
+ readonly rotation: readonly [number, number, number];
65
+ readonly color?: string;
66
+ }[];
67
+ readonly width: number;
68
+ readonly height: number;
69
+ readonly background: string;
70
+ }
71
+ /** @internal Browser readiness is explicit so failed/blank frames cannot be captured. */
72
+ export type CaptureState = {
73
+ readonly status: "loading";
74
+ } | {
75
+ readonly status: "ready";
76
+ readonly camera: RenderCamera;
77
+ } | {
78
+ readonly status: "error";
79
+ readonly message: string;
80
+ };
81
+ //# sourceMappingURL=render-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-types.d.ts","sourceRoot":"","sources":["../../src/authoring/render-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=render-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-types.js","sourceRoot":"","sources":["../../src/authoring/render-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import type { RenderFormat, RenderOptions, RenderResult, RenderView } from "./render-types.js";
2
+ /** Revision of the capture scene, lighting, framing, and encoding policy. */
3
+ export declare const RENDERER_REVISION = "1";
4
+ /** @internal Shared by command parsing and the reusable renderer. */
5
+ export declare function resolveRenderOptions(options?: RenderOptions): {
6
+ readonly views: readonly RenderView[];
7
+ readonly width: number;
8
+ readonly height: number;
9
+ readonly format: RenderFormat;
10
+ readonly background: string;
11
+ readonly timeoutMs: number;
12
+ };
13
+ /** Explicit installation of this package's pinned Chromium. Never called by render. */
14
+ export declare function installAuthoringBrowser(): Promise<{
15
+ browser: "chromium";
16
+ executablePath: string;
17
+ }>;
18
+ /**
19
+ * Render validated persisted local geometry and placements. Source code is never imported,
20
+ * and a fresh capture directory prevents overlapping calls from overwriting evidence.
21
+ */
22
+ export declare function renderCapturedRun(directory: string, options?: RenderOptions): Promise<RenderResult>;
23
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/authoring/render.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAIV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACX,MAAM,mBAAmB,CAAC;AAG3B,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAGrC,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,aAAkB,GAAG;IACjE,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAkDA;AAED,uFAAuF;AACvF,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IACvD,OAAO,EAAE,UAAU,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC,CAuBD;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAkJvB"}
@@ -0,0 +1,243 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdir, mkdtemp, readFile, rename, rm, writeFile } from "node:fs/promises";
3
+ import { createServer } from "node:http";
4
+ import { createRequire } from "node:module";
5
+ import { dirname, join, resolve } from "node:path";
6
+ import { readCapturedRun } from "./artifacts.js";
7
+ import { AuthoringError } from "./errors.js";
8
+ /** Revision of the capture scene, lighting, framing, and encoding policy. */
9
+ export const RENDERER_REVISION = "1";
10
+ const VIEWS = ["isometric", "front", "top", "right"];
11
+ /** @internal Shared by command parsing and the reusable renderer. */
12
+ export function resolveRenderOptions(options = {}) {
13
+ const views = options.views ?? ["isometric"];
14
+ if (views.length === 0 ||
15
+ views.length > 4 ||
16
+ new Set(views).size !== views.length ||
17
+ views.some((view) => !VIEWS.includes(view))) {
18
+ throw new AuthoringError("invocation", "INVALID_RENDER_VIEW", "Choose distinct views from isometric, front, top, and right.");
19
+ }
20
+ const width = options.width ?? 1024;
21
+ const height = options.height ?? 1024;
22
+ for (const value of [width, height]) {
23
+ if (!Number.isInteger(value) || value < 16 || value > 4096) {
24
+ throw new AuthoringError("invocation", "INVALID_RENDER_SIZE", "Image width and height must be integers from 16 to 4096 pixels.");
25
+ }
26
+ }
27
+ const format = options.format ?? "png";
28
+ if (format !== "png" && format !== "webp") {
29
+ throw new AuthoringError("invocation", "INVALID_RENDER_FORMAT", "Image format must be png or webp.");
30
+ }
31
+ const background = options.background ?? "#f1f5f9";
32
+ if (background !== "transparent" && !/^#[\da-f]{6}$/i.test(background)) {
33
+ throw new AuthoringError("invocation", "INVALID_RENDER_BACKGROUND", "Background must be transparent or a six-digit RGB color.");
34
+ }
35
+ const timeoutMs = options.timeoutMs ?? 30_000;
36
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 300_000) {
37
+ throw new AuthoringError("invocation", "INVALID_RENDER_TIMEOUT", "Render timeout must be an integer from 1 to 300000 milliseconds.");
38
+ }
39
+ return { views, width, height, format, background, timeoutMs };
40
+ }
41
+ /** Explicit installation of this package's pinned Chromium. Never called by render. */
42
+ export async function installAuthoringBrowser() {
43
+ const require = createRequire(import.meta.url);
44
+ const cli = join(dirname(require.resolve("playwright/package.json")), "cli.js");
45
+ await new Promise((resolveInstall, reject) => {
46
+ const child = spawn(process.execPath, [cli, "install", "chromium"], {
47
+ stdio: ["ignore", 2, 2],
48
+ windowsHide: true,
49
+ });
50
+ child.once("error", reject);
51
+ child.once("exit", (code) => {
52
+ if (code === 0)
53
+ resolveInstall();
54
+ else
55
+ reject(new AuthoringError("environment", "BROWSER_INSTALL_FAILED", `Chromium installation exited with code ${code ?? "unknown"}.`));
56
+ });
57
+ });
58
+ const { chromium } = await import("playwright");
59
+ return { browser: "chromium", executablePath: chromium.executablePath() };
60
+ }
61
+ /**
62
+ * Render validated persisted local geometry and placements. Source code is never imported,
63
+ * and a fresh capture directory prevents overlapping calls from overwriting evidence.
64
+ */
65
+ export async function renderCapturedRun(directory, options = {}) {
66
+ const settings = resolveRenderOptions(options);
67
+ const run = await readCapturedRun(directory);
68
+ const { chromium } = await import("playwright");
69
+ let client;
70
+ try {
71
+ client = await readFile(new URL("../../dist/authoring/capture/render-client.js", import.meta.url));
72
+ }
73
+ catch {
74
+ throw new AuthoringError("environment", "RENDERER_NOT_BUILT", "The packaged capture page is missing. Rebuild @metamesh/cli before rendering.");
75
+ }
76
+ const scene = {
77
+ ...settings,
78
+ resources: run.resources.map((resource, index) => ({
79
+ id: resource.id,
80
+ positionsUrl: `/buffers/${index}/positions`,
81
+ indicesUrl: `/buffers/${index}/indices`,
82
+ })),
83
+ parts: run.manifest.parts,
84
+ };
85
+ const server = captureServer(run, scene, client);
86
+ let browser;
87
+ let output;
88
+ const started = Date.now();
89
+ const remaining = () => {
90
+ const value = settings.timeoutMs - (Date.now() - started);
91
+ if (value <= 0)
92
+ throw new AuthoringError("render", "RENDER_TIMEOUT", "Rendering exceeded its capture deadline.");
93
+ return value;
94
+ };
95
+ try {
96
+ const origin = await listen(server);
97
+ try {
98
+ // Headless launch resolves Playwright's pinned shell. executablePath() instead
99
+ // names the full browser, which CI's explicit --only-shell install omits.
100
+ browser = await chromium.launch({
101
+ headless: true,
102
+ timeout: remaining(),
103
+ args: [
104
+ "--use-angle=swiftshader",
105
+ "--enable-unsafe-swiftshader",
106
+ "--force-color-profile=srgb",
107
+ ],
108
+ });
109
+ }
110
+ catch (error) {
111
+ if (error instanceof Error &&
112
+ /Executable doesn't exist|playwright install/u.test(error.message)) {
113
+ throw new AuthoringError("environment", "BROWSER_NOT_INSTALLED", "Rendering needs the pinned Chromium. Run `metamesh browser install` explicitly, then retry.");
114
+ }
115
+ throw error;
116
+ }
117
+ const context = await browser.newContext({
118
+ viewport: { width: settings.width, height: settings.height },
119
+ deviceScaleFactor: 1,
120
+ colorScheme: "light",
121
+ reducedMotion: "reduce",
122
+ });
123
+ const page = await context.newPage();
124
+ await page.goto(origin, { waitUntil: "load", timeout: remaining() });
125
+ await page.waitForFunction(() => globalThis.metameshCaptureState?.status !== undefined &&
126
+ globalThis.metameshCaptureState.status !== "loading", undefined, { timeout: remaining() });
127
+ const initial = await page.evaluate(() => globalThis.metameshCaptureState);
128
+ if (initial.status === "error")
129
+ throw new AuthoringError("render", "CAPTURE_FAILED", initial.message);
130
+ const parent = resolve(options.outputDirectory ?? join(run.directory, "renders"));
131
+ await mkdir(parent, { recursive: true });
132
+ output = await mkdtemp(join(parent, "capture-"));
133
+ const images = [];
134
+ for (const view of settings.views) {
135
+ const state = await page.evaluate((selected) => {
136
+ globalThis.metameshCaptureView(selected);
137
+ return globalThis.metameshCaptureState;
138
+ }, view);
139
+ if (state.status !== "ready")
140
+ throw new AuthoringError("render", "CAPTURE_FAILED", state.status === "error" ? state.message : "Capture frame is not ready.");
141
+ const path = join(output, `${view}.${settings.format}`);
142
+ const metadataPath = join(output, `${view}.json`);
143
+ await page.screenshot({
144
+ path,
145
+ type: settings.format,
146
+ ...(settings.format === "webp" ? { quality: 100 } : {}),
147
+ omitBackground: settings.background === "transparent",
148
+ animations: "disabled",
149
+ timeout: remaining(),
150
+ });
151
+ const image = {
152
+ path,
153
+ metadataPath,
154
+ runId: run.manifest.runId,
155
+ sourceFingerprint: run.manifest.source.fingerprint,
156
+ view,
157
+ width: settings.width,
158
+ height: settings.height,
159
+ format: settings.format,
160
+ background: settings.background,
161
+ camera: state.camera,
162
+ rendererRevision: RENDERER_REVISION,
163
+ browserVersion: browser.version(),
164
+ };
165
+ await writeFile(`${metadataPath}.tmp`, `${JSON.stringify(image, null, 2)}\n`);
166
+ await rename(`${metadataPath}.tmp`, metadataPath);
167
+ images.push(image);
168
+ }
169
+ return {
170
+ runId: run.manifest.runId,
171
+ sourceFingerprint: run.manifest.source.fingerprint,
172
+ directory: output,
173
+ images,
174
+ };
175
+ }
176
+ catch (error) {
177
+ if (output)
178
+ await rm(output, { recursive: true, force: true });
179
+ if (error instanceof AuthoringError)
180
+ throw error;
181
+ throw new AuthoringError("render", "CAPTURE_FAILED", error instanceof Error ? error.message : String(error));
182
+ }
183
+ finally {
184
+ await browser?.close();
185
+ await close(server);
186
+ }
187
+ }
188
+ function captureServer(run, scene, client) {
189
+ const buffers = new Map();
190
+ for (const [index, resource] of run.resources.entries()) {
191
+ buffers.set(`/buffers/${index}/positions`, Buffer.from(resource.positions.buffer, resource.positions.byteOffset, resource.positions.byteLength));
192
+ buffers.set(`/buffers/${index}/indices`, Buffer.from(resource.indices.buffer, resource.indices.byteOffset, resource.indices.byteLength));
193
+ }
194
+ const html = '<!doctype html><html><head><meta charset="utf-8"><style>html,body{margin:0;overflow:hidden;background:transparent}canvas{display:block}</style></head><body><script src="/render-client.js"></script></body></html>';
195
+ const json = JSON.stringify(scene);
196
+ return createServer((request, response) => {
197
+ response.setHeader("Cache-Control", "no-store");
198
+ response.setHeader("Content-Security-Policy", "default-src 'none'; script-src 'self'; connect-src 'self'; style-src 'unsafe-inline'");
199
+ const path = request.url;
200
+ if (request.method !== "GET") {
201
+ response.writeHead(405).end();
202
+ }
203
+ else if (path === "/") {
204
+ response.setHeader("Content-Type", "text/html; charset=utf-8");
205
+ response.end(html);
206
+ }
207
+ else if (path === "/scene.json") {
208
+ response.setHeader("Content-Type", "application/json");
209
+ response.end(json);
210
+ }
211
+ else if (path === "/render-client.js") {
212
+ response.setHeader("Content-Type", "text/javascript; charset=utf-8");
213
+ response.end(client);
214
+ }
215
+ else if (path && buffers.has(path)) {
216
+ response.setHeader("Content-Type", "application/octet-stream");
217
+ response.end(buffers.get(path));
218
+ }
219
+ else {
220
+ response.writeHead(404).end();
221
+ }
222
+ });
223
+ }
224
+ async function listen(server) {
225
+ return new Promise((resolveListen, reject) => {
226
+ server.once("error", reject);
227
+ server.listen(0, "127.0.0.1", () => {
228
+ server.removeListener("error", reject);
229
+ const address = server.address();
230
+ if (!address || typeof address === "string")
231
+ reject(new Error("Capture server has no TCP address."));
232
+ else
233
+ resolveListen(`http://127.0.0.1:${address.port}`);
234
+ });
235
+ });
236
+ }
237
+ async function close(server) {
238
+ if (!server.listening)
239
+ return;
240
+ server.closeAllConnections();
241
+ await new Promise((resolveClose, reject) => server.close((error) => (error ? reject(error) : resolveClose())));
242
+ }
243
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/authoring/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AuthoringFailure, RunOptions, RunSuccess } from "./types.js";
2
+ /**
3
+ * Checks and executes trusted local source in a disposable child, then captures its finalized geometry.
4
+ * Returns a success or failure envelope for this fresh attempt; failed attempts cannot be rendered.
5
+ */
6
+ export declare function runAuthoringSource(options: RunOptions): Promise<RunSuccess | AuthoringFailure>;
7
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/authoring/run.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA2N3E;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,UAAU,GAAG,gBAAgB,CAAC,CA2HxC"}