@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.
- package/CHANGELOG.md +39 -0
- package/LICENSE +200 -0
- package/README.md +86 -2
- package/dist/authoring/artifacts.d.ts +15 -0
- package/dist/authoring/artifacts.d.ts.map +1 -0
- package/dist/authoring/artifacts.js +347 -0
- package/dist/authoring/artifacts.js.map +1 -0
- package/dist/authoring/capture/render-client.js +4222 -0
- package/dist/authoring/capture/render-client.js.LEGAL.txt +9 -0
- package/dist/authoring/capture/render-client.js.map +7 -0
- package/dist/authoring/check.d.ts +4 -0
- package/dist/authoring/check.d.ts.map +1 -0
- package/dist/authoring/check.js +118 -0
- package/dist/authoring/check.js.map +1 -0
- package/dist/authoring/environment.d.ts +29 -0
- package/dist/authoring/environment.d.ts.map +1 -0
- package/dist/authoring/environment.js +182 -0
- package/dist/authoring/environment.js.map +1 -0
- package/dist/authoring/errors.d.ts +13 -0
- package/dist/authoring/errors.d.ts.map +1 -0
- package/dist/authoring/errors.js +43 -0
- package/dist/authoring/errors.js.map +1 -0
- package/dist/authoring/render-client.d.ts +6 -0
- package/dist/authoring/render-client.d.ts.map +1 -0
- package/dist/authoring/render-client.js +55 -0
- package/dist/authoring/render-client.js.map +1 -0
- package/dist/authoring/render-scene.d.ts +22 -0
- package/dist/authoring/render-scene.d.ts.map +1 -0
- package/dist/authoring/render-scene.js +139 -0
- package/dist/authoring/render-scene.js.map +1 -0
- package/dist/authoring/render-types.d.ts +81 -0
- package/dist/authoring/render-types.d.ts.map +1 -0
- package/dist/authoring/render-types.js +2 -0
- package/dist/authoring/render-types.js.map +1 -0
- package/dist/authoring/render.d.ts +23 -0
- package/dist/authoring/render.d.ts.map +1 -0
- package/dist/authoring/render.js +243 -0
- package/dist/authoring/render.js.map +1 -0
- package/dist/authoring/run.d.ts +7 -0
- package/dist/authoring/run.d.ts.map +1 -0
- package/dist/authoring/run.js +308 -0
- package/dist/authoring/run.js.map +1 -0
- package/dist/authoring/types.d.ts +175 -0
- package/dist/authoring/types.d.ts.map +1 -0
- package/dist/authoring/types.js +3 -0
- package/dist/authoring/types.js.map +1 -0
- package/dist/authoring/worker.d.ts +15 -0
- package/dist/authoring/worker.d.ts.map +1 -0
- package/dist/authoring/worker.js +163 -0
- package/dist/authoring/worker.js.map +1 -0
- package/dist/authoring.d.ts +12 -0
- package/dist/authoring.d.ts.map +1 -0
- package/dist/authoring.js +9 -0
- package/dist/authoring.js.map +1 -0
- package/dist/docs/guides/agent-authoring.md +240 -0
- package/dist/docs/guides/package.md +87 -0
- package/dist/docs/manifest.json +554 -0
- package/dist/docs/reference/authoring/AUTHORING_PROTOCOL_VERSION.md +9 -0
- package/dist/docs/reference/authoring/AuthoringDiagnostic.md +22 -0
- package/dist/docs/reference/authoring/AuthoringEnvironment.md +15 -0
- package/dist/docs/reference/authoring/AuthoringError.md +16 -0
- package/dist/docs/reference/authoring/AuthoringFailure-type.md +18 -0
- package/dist/docs/reference/authoring/AuthoringKind.md +10 -0
- package/dist/docs/reference/authoring/AuthoringPhase.md +10 -0
- package/dist/docs/reference/authoring/CapturedBuffer.md +14 -0
- package/dist/docs/reference/authoring/CapturedGeometry.md +14 -0
- package/dist/docs/reference/authoring/CapturedPart.md +19 -0
- package/dist/docs/reference/authoring/CapturedResource.md +15 -0
- package/dist/docs/reference/authoring/CapturedRun.md +14 -0
- package/dist/docs/reference/authoring/CapturedRunManifest.md +40 -0
- package/dist/docs/reference/authoring/CheckOptions.md +18 -0
- package/dist/docs/reference/authoring/CheckSuccess.md +16 -0
- package/dist/docs/reference/authoring/DocumentationEntry.md +20 -0
- package/dist/docs/reference/authoring/DocumentationManifest.md +15 -0
- package/dist/docs/reference/authoring/DocumentationSearchResult.md +13 -0
- package/dist/docs/reference/authoring/InstalledAuthoringPackage.md +15 -0
- package/dist/docs/reference/authoring/RenderCamera.md +22 -0
- package/dist/docs/reference/authoring/RenderFormat.md +10 -0
- package/dist/docs/reference/authoring/RenderOptions.md +20 -0
- package/dist/docs/reference/authoring/RenderResult.md +15 -0
- package/dist/docs/reference/authoring/RenderView.md +10 -0
- package/dist/docs/reference/authoring/RenderedImage.md +23 -0
- package/dist/docs/reference/authoring/RunOptions.md +25 -0
- package/dist/docs/reference/authoring/RunSuccess.md +14 -0
- package/dist/docs/reference/authoring/authoringFailure-value.md +10 -0
- package/dist/docs/reference/authoring/checkAuthoringSource.md +10 -0
- package/dist/docs/reference/authoring/discoverAuthoringEnvironment.md +13 -0
- package/dist/docs/reference/authoring/inspectCapturedRun.md +15 -0
- package/dist/docs/reference/authoring/installAuthoringBrowser.md +13 -0
- package/dist/docs/reference/authoring/readCapturedRun.md +10 -0
- package/dist/docs/reference/authoring/renderCapturedRun.md +13 -0
- package/dist/docs/reference/authoring/runAuthoringSource.md +13 -0
- package/dist/docs/reference/authoring/searchAuthoringDocumentation.md +16 -0
- package/dist/docs/reference/authoring/showAuthoringDocumentation.md +12 -0
- package/dist/metamesh.d.ts +3 -0
- package/dist/metamesh.d.ts.map +1 -0
- package/dist/metamesh.js +183 -0
- package/dist/metamesh.js.map +1 -0
- package/package.json +63 -3
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rename, stat, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { defaultModelingLimits } from "@metamesh/modeling/engine";
|
|
5
|
+
import { analyzeTriangleMesh, composeTransform3, eulerTransform3, transformTriangleMesh, translationTransform3, } from "@metamesh/modeling/geometry";
|
|
6
|
+
import { authoringPackageNames, confinedFile } from "./environment.js";
|
|
7
|
+
import { AuthoringError, isRecord } from "./errors.js";
|
|
8
|
+
export function sha256(value) {
|
|
9
|
+
return createHash("sha256").update(value).digest("hex");
|
|
10
|
+
}
|
|
11
|
+
export async function writeAtomicJson(file, value) {
|
|
12
|
+
const temporary = `${file}.pending`;
|
|
13
|
+
await writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, { flag: "wx" });
|
|
14
|
+
await rename(temporary, file);
|
|
15
|
+
}
|
|
16
|
+
export async function captureSnapshot(directory, snapshot, metadata, export3mf) {
|
|
17
|
+
await mkdir(join(directory, "geometry"), { recursive: true });
|
|
18
|
+
const resources = [];
|
|
19
|
+
const parts = [];
|
|
20
|
+
const seen = new Map();
|
|
21
|
+
const store = async (path, bytes) => {
|
|
22
|
+
await writeFile(join(directory, path), bytes, { flag: "wx" });
|
|
23
|
+
return { path, bytes: bytes.byteLength, sha256: sha256(bytes) };
|
|
24
|
+
};
|
|
25
|
+
for (const part of snapshot.parts) {
|
|
26
|
+
const positions = part.geometry.positions;
|
|
27
|
+
const indices = part.geometry.indices;
|
|
28
|
+
const positionBytes = new Uint8Array(positions.buffer, positions.byteOffset, positions.byteLength);
|
|
29
|
+
const indexBytes = new Uint8Array(indices.buffer, indices.byteOffset, indices.byteLength);
|
|
30
|
+
const key = `${sha256(positionBytes)}:${sha256(indexBytes)}`;
|
|
31
|
+
let resourceId = seen.get(key);
|
|
32
|
+
if (resourceId === undefined) {
|
|
33
|
+
resourceId = `geometry-${resources.length}`;
|
|
34
|
+
seen.set(key, resourceId);
|
|
35
|
+
resources.push({
|
|
36
|
+
id: resourceId,
|
|
37
|
+
positions: await store(`geometry/${resourceId}.positions.f32`, positionBytes),
|
|
38
|
+
indices: await store(`geometry/${resourceId}.indices.u32`, indexBytes),
|
|
39
|
+
measurements: part.geometry.measurements,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
parts.push({
|
|
43
|
+
id: part.id,
|
|
44
|
+
resourceId,
|
|
45
|
+
position: part.position,
|
|
46
|
+
rotation: part.rotation,
|
|
47
|
+
measurements: part.measurements,
|
|
48
|
+
...(part.color === undefined ? {} : { color: part.color }),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const manifest = {
|
|
52
|
+
...metadata,
|
|
53
|
+
bounds: snapshot.bounds,
|
|
54
|
+
stats: snapshot.stats,
|
|
55
|
+
diagnostics: snapshot.diagnostics,
|
|
56
|
+
dependencies: snapshot.dependencies,
|
|
57
|
+
resources,
|
|
58
|
+
parts,
|
|
59
|
+
...(export3mf === undefined
|
|
60
|
+
? {}
|
|
61
|
+
: { export3mf: await store("model.3mf", new Uint8Array(export3mf)) }),
|
|
62
|
+
};
|
|
63
|
+
await writeAtomicJson(join(directory, "manifest.json"), manifest);
|
|
64
|
+
return manifest;
|
|
65
|
+
}
|
|
66
|
+
function invalid(message) {
|
|
67
|
+
throw new AuthoringError("artifact", "INVALID_ARTIFACT", message);
|
|
68
|
+
}
|
|
69
|
+
const vector = (value) => Array.isArray(value) &&
|
|
70
|
+
value.length === 3 &&
|
|
71
|
+
value.every((number) => typeof number === "number" && Number.isFinite(number));
|
|
72
|
+
const bounds = (value) => isRecord(value) &&
|
|
73
|
+
vector(value.min) &&
|
|
74
|
+
vector(value.max) &&
|
|
75
|
+
value.min.every((number, axis) => number <= value.max[axis]);
|
|
76
|
+
const positiveInteger = (value) => typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
77
|
+
const identifier = (value) => typeof value === "string" && value.length <= 64 && /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value);
|
|
78
|
+
const strings = (value) => Array.isArray(value) &&
|
|
79
|
+
value.every((item) => typeof item === "string") &&
|
|
80
|
+
new Set(value).size === value.length;
|
|
81
|
+
function jsonData(value, depth = 0) {
|
|
82
|
+
if (depth > 100)
|
|
83
|
+
return false;
|
|
84
|
+
if (value === null || typeof value === "string" || typeof value === "boolean")
|
|
85
|
+
return true;
|
|
86
|
+
if (typeof value === "number")
|
|
87
|
+
return Number.isFinite(value);
|
|
88
|
+
if (Array.isArray(value))
|
|
89
|
+
return value.every((item) => jsonData(item, depth + 1));
|
|
90
|
+
return isRecord(value) && Object.values(value).every((item) => jsonData(item, depth + 1));
|
|
91
|
+
}
|
|
92
|
+
function bufferDescriptor(value) {
|
|
93
|
+
return (isRecord(value) &&
|
|
94
|
+
typeof value.path === "string" &&
|
|
95
|
+
value.path.length > 0 &&
|
|
96
|
+
!isAbsolutePath(value.path) &&
|
|
97
|
+
positiveInteger(value.bytes) &&
|
|
98
|
+
value.bytes <= 1024 * 1024 * 1024 &&
|
|
99
|
+
typeof value.sha256 === "string" &&
|
|
100
|
+
/^[a-f0-9]{64}$/.test(value.sha256));
|
|
101
|
+
}
|
|
102
|
+
function isAbsolutePath(path) {
|
|
103
|
+
return (path.startsWith("/") ||
|
|
104
|
+
path.includes("\\") ||
|
|
105
|
+
path.includes(":") ||
|
|
106
|
+
path.split("/").some((item) => item === ".." || item === "." || item.length === 0));
|
|
107
|
+
}
|
|
108
|
+
function measurements(value) {
|
|
109
|
+
return (isRecord(value) &&
|
|
110
|
+
bounds(value.bounds) &&
|
|
111
|
+
["signedVolume", "surfaceArea"].every((key) => typeof value[key] === "number" && Number.isFinite(value[key])) &&
|
|
112
|
+
positiveInteger(value.triangleCount) &&
|
|
113
|
+
positiveInteger(value.vertexCount) &&
|
|
114
|
+
(value.connectedComponentCount === undefined ||
|
|
115
|
+
positiveInteger(value.connectedComponentCount)) &&
|
|
116
|
+
(value.edgeCount === undefined || positiveInteger(value.edgeCount)));
|
|
117
|
+
}
|
|
118
|
+
function sameMeasurements(actual, recorded) {
|
|
119
|
+
return (actual.vertexCount === recorded.vertexCount &&
|
|
120
|
+
actual.triangleCount === recorded.triangleCount &&
|
|
121
|
+
actual.signedVolume === recorded.signedVolume &&
|
|
122
|
+
actual.surfaceArea === recorded.surfaceArea &&
|
|
123
|
+
actual.connectedComponentCount === recorded.connectedComponentCount &&
|
|
124
|
+
actual.edgeCount === recorded.edgeCount &&
|
|
125
|
+
JSON.stringify(actual.bounds) === JSON.stringify(recorded.bounds));
|
|
126
|
+
}
|
|
127
|
+
function manifestFrom(value) {
|
|
128
|
+
const stats = isRecord(value) && isRecord(value.stats) ? value.stats : undefined;
|
|
129
|
+
const policy = isRecord(value) && isRecord(value.policy) ? value.policy : undefined;
|
|
130
|
+
const limits = policy !== undefined && isRecord(policy.limits) ? policy.limits : undefined;
|
|
131
|
+
const dependencies = isRecord(value) && isRecord(value.dependencies) ? value.dependencies : undefined;
|
|
132
|
+
if (!isRecord(value) ||
|
|
133
|
+
value.formatVersion !== 1 ||
|
|
134
|
+
value.status !== "complete" ||
|
|
135
|
+
!identifier(value.runId) ||
|
|
136
|
+
typeof value.createdAt !== "string" ||
|
|
137
|
+
!Number.isFinite(Date.parse(value.createdAt)) ||
|
|
138
|
+
(value.kind !== "model" && value.kind !== "generator") ||
|
|
139
|
+
!isRecord(value.source) ||
|
|
140
|
+
typeof value.source.entry !== "string" ||
|
|
141
|
+
value.source.entry.length === 0 ||
|
|
142
|
+
value.source.entry.includes("\\") ||
|
|
143
|
+
value.source.entry.includes("\0") ||
|
|
144
|
+
typeof value.source.fingerprint !== "string" ||
|
|
145
|
+
!/^[a-f0-9]{64}$/.test(value.source.fingerprint) ||
|
|
146
|
+
!isRecord(value.packages) ||
|
|
147
|
+
!Object.entries(value.packages).every(([name, version]) => authoringPackageNames.includes(name) &&
|
|
148
|
+
typeof version === "string" &&
|
|
149
|
+
/^(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)\.(?:0|[1-9][0-9]*)$/.test(version)) ||
|
|
150
|
+
typeof value.packages["@metamesh/modeling"] !== "string" ||
|
|
151
|
+
(value.kind === "generator" && typeof value.packages["@metamesh/generator-sdk"] !== "string") ||
|
|
152
|
+
new Set(Object.values(value.packages)).size !== 1 ||
|
|
153
|
+
!isRecord(value.parameters) ||
|
|
154
|
+
!jsonData(value.parameters) ||
|
|
155
|
+
!Array.isArray(value.assets) ||
|
|
156
|
+
!value.assets.every((asset) => isRecord(asset) &&
|
|
157
|
+
Object.keys(asset).length === 3 &&
|
|
158
|
+
typeof asset.faceId === "string" &&
|
|
159
|
+
/^[a-z0-9][a-z0-9/-]{0,159}$/.test(asset.faceId) &&
|
|
160
|
+
typeof asset.revision === "string" &&
|
|
161
|
+
/^[a-f0-9]{64}$/.test(asset.revision) &&
|
|
162
|
+
typeof asset.weight === "number" &&
|
|
163
|
+
Number.isInteger(asset.weight) &&
|
|
164
|
+
asset.weight >= 1 &&
|
|
165
|
+
asset.weight <= 1000) ||
|
|
166
|
+
!Array.isArray(value.diagnostics) ||
|
|
167
|
+
!value.diagnostics.every((issue) => isRecord(issue) &&
|
|
168
|
+
issue.severity === "warning" &&
|
|
169
|
+
typeof issue.message === "string" &&
|
|
170
|
+
issue.message.trim().length > 0 &&
|
|
171
|
+
(issue.parameterId === undefined ||
|
|
172
|
+
(typeof issue.parameterId === "string" &&
|
|
173
|
+
Object.hasOwn(value.parameters, issue.parameterId)))) ||
|
|
174
|
+
limits === undefined ||
|
|
175
|
+
!positiveInteger(limits.maxParts) ||
|
|
176
|
+
Object.keys(limits).length !== Object.keys(defaultModelingLimits).length ||
|
|
177
|
+
!Object.entries(defaultModelingLimits).every(([key, ceiling]) => positiveInteger(limits[key]) &&
|
|
178
|
+
limits[key] >= (key === "maxCircularSegments" ? 3 : 1) &&
|
|
179
|
+
limits[key] <= ceiling) ||
|
|
180
|
+
!positiveInteger(policy?.timeoutMs) ||
|
|
181
|
+
policy.timeoutMs > 3600000 ||
|
|
182
|
+
!bounds(value.bounds) ||
|
|
183
|
+
!isRecord(value.stats) ||
|
|
184
|
+
![
|
|
185
|
+
"vertices",
|
|
186
|
+
"triangles",
|
|
187
|
+
"volumeMm3",
|
|
188
|
+
"bytes",
|
|
189
|
+
"buildMs",
|
|
190
|
+
"finalizationMs",
|
|
191
|
+
"generationMs",
|
|
192
|
+
].every((key) => typeof stats?.[key] === "number" && Number.isFinite(stats[key])) ||
|
|
193
|
+
!["vertices", "triangles", "bytes"].every((key) => positiveInteger(stats?.[key])) ||
|
|
194
|
+
!["buildMs", "finalizationMs", "generationMs"].every((key) => typeof stats?.[key] === "number" && stats[key] >= 0) ||
|
|
195
|
+
dependencies === undefined ||
|
|
196
|
+
!strings(dependencies.modelParameters) ||
|
|
197
|
+
!Array.isArray(dependencies.computations) ||
|
|
198
|
+
!dependencies.computations.every((item) => isRecord(item) &&
|
|
199
|
+
identifier(item.id) &&
|
|
200
|
+
strings(item.parameters) &&
|
|
201
|
+
strings(item.computations)) ||
|
|
202
|
+
!Array.isArray(dependencies.parts) ||
|
|
203
|
+
!dependencies.parts.every((item) => isRecord(item) &&
|
|
204
|
+
identifier(item.id) &&
|
|
205
|
+
strings(item.parameters) &&
|
|
206
|
+
strings(item.computations)) ||
|
|
207
|
+
!Array.isArray(value.resources) ||
|
|
208
|
+
!Array.isArray(value.parts) ||
|
|
209
|
+
value.resources.length === 0 ||
|
|
210
|
+
value.parts.length === 0 ||
|
|
211
|
+
value.parts.length > limits.maxParts ||
|
|
212
|
+
value.resources.length > limits.maxParts ||
|
|
213
|
+
(value.export3mf !== undefined && !bufferDescriptor(value.export3mf)))
|
|
214
|
+
invalid("Unsupported, incomplete, or malformed captured-run manifest.");
|
|
215
|
+
const ids = new Set();
|
|
216
|
+
for (const resource of value.resources) {
|
|
217
|
+
if (!isRecord(resource) ||
|
|
218
|
+
!identifier(resource.id) ||
|
|
219
|
+
ids.has(resource.id) ||
|
|
220
|
+
!measurements(resource.measurements) ||
|
|
221
|
+
!bufferDescriptor(resource.positions) ||
|
|
222
|
+
!bufferDescriptor(resource.indices))
|
|
223
|
+
invalid("Invalid or duplicate captured geometry resource.");
|
|
224
|
+
ids.add(resource.id);
|
|
225
|
+
}
|
|
226
|
+
const partIds = new Set();
|
|
227
|
+
for (const part of value.parts) {
|
|
228
|
+
if (!isRecord(part) ||
|
|
229
|
+
!identifier(part.id) ||
|
|
230
|
+
partIds.has(part.id) ||
|
|
231
|
+
typeof part.resourceId !== "string" ||
|
|
232
|
+
!ids.has(part.resourceId) ||
|
|
233
|
+
!vector(part.position) ||
|
|
234
|
+
!vector(part.rotation) ||
|
|
235
|
+
!measurements(part.measurements) ||
|
|
236
|
+
(part.color !== undefined &&
|
|
237
|
+
(typeof part.color !== "string" || !/^#[a-f0-9]{6}$/i.test(part.color))))
|
|
238
|
+
invalid("Invalid or duplicate captured part placement.");
|
|
239
|
+
partIds.add(part.id);
|
|
240
|
+
}
|
|
241
|
+
const manifest = value;
|
|
242
|
+
const computations = new Set(manifest.dependencies.computations.map(({ id }) => id));
|
|
243
|
+
if (computations.size !== manifest.dependencies.computations.length ||
|
|
244
|
+
manifest.dependencies.parts.length !== manifest.parts.length ||
|
|
245
|
+
new Set(manifest.dependencies.parts.map(({ id }) => id)).size !== manifest.parts.length ||
|
|
246
|
+
manifest.dependencies.parts.some((part) => !partIds.has(part.id)) ||
|
|
247
|
+
[...manifest.dependencies.computations, ...manifest.dependencies.parts].some((item) => item.computations.some((id) => !computations.has(id))))
|
|
248
|
+
invalid("Invalid captured dependency identities or references.");
|
|
249
|
+
return manifest;
|
|
250
|
+
}
|
|
251
|
+
async function readBuffer(directory, descriptor) {
|
|
252
|
+
if (!bufferDescriptor(descriptor))
|
|
253
|
+
invalid("Invalid captured buffer descriptor.");
|
|
254
|
+
const file = await confinedFile(directory, descriptor.path);
|
|
255
|
+
if ((await stat(file)).size !== descriptor.bytes)
|
|
256
|
+
invalid(`Captured buffer length mismatch: ${descriptor.path}`);
|
|
257
|
+
const bytes = new Uint8Array(await readFile(file));
|
|
258
|
+
if (sha256(bytes) !== descriptor.sha256)
|
|
259
|
+
invalid(`Captured buffer digest mismatch: ${descriptor.path}`);
|
|
260
|
+
return bytes;
|
|
261
|
+
}
|
|
262
|
+
/** Reads only immutable captured files. It never imports or executes original author source. */
|
|
263
|
+
export async function readCapturedRun(directory) {
|
|
264
|
+
try {
|
|
265
|
+
const root = resolve(directory);
|
|
266
|
+
const manifestFile = await confinedFile(root, "manifest.json");
|
|
267
|
+
if ((await stat(manifestFile)).size > 16 * 1024 * 1024)
|
|
268
|
+
invalid("Captured manifest exceeds its size limit.");
|
|
269
|
+
const manifest = manifestFrom(JSON.parse(await readFile(manifestFile, "utf8")));
|
|
270
|
+
const resources = [];
|
|
271
|
+
let totalBytes = 0;
|
|
272
|
+
for (const resource of manifest.resources) {
|
|
273
|
+
totalBytes += resource.positions.bytes + resource.indices.bytes;
|
|
274
|
+
if (totalBytes > Math.min(512 * 1024 * 1024, manifest.policy.limits.maxBytes))
|
|
275
|
+
invalid("Captured geometry exceeds its resource byte limit.");
|
|
276
|
+
const positions = await readBuffer(root, resource.positions);
|
|
277
|
+
const indices = await readBuffer(root, resource.indices);
|
|
278
|
+
if (positions.length % 12 !== 0 || indices.length % 12 !== 0)
|
|
279
|
+
invalid("Captured mesh buffers require complete vertices and triangles.");
|
|
280
|
+
const geometry = {
|
|
281
|
+
id: resource.id,
|
|
282
|
+
positions: new Float32Array(positions.buffer),
|
|
283
|
+
indices: new Uint32Array(indices.buffer),
|
|
284
|
+
};
|
|
285
|
+
const facts = analyzeTriangleMesh(geometry, { requireClosed: true, includeTopology: true });
|
|
286
|
+
if (!sameMeasurements(facts, resource.measurements))
|
|
287
|
+
invalid(`Captured measurements do not match geometry ${resource.id}.`);
|
|
288
|
+
resources.push(geometry);
|
|
289
|
+
}
|
|
290
|
+
let vertices = 0;
|
|
291
|
+
let triangles = 0;
|
|
292
|
+
let volume = 0;
|
|
293
|
+
const aggregateBounds = {
|
|
294
|
+
min: [Infinity, Infinity, Infinity],
|
|
295
|
+
max: [-Infinity, -Infinity, -Infinity],
|
|
296
|
+
};
|
|
297
|
+
for (const part of manifest.parts) {
|
|
298
|
+
const resource = resources.find(({ id }) => id === part.resourceId);
|
|
299
|
+
const geometry = [...part.position, ...part.rotation].every((number) => number === 0)
|
|
300
|
+
? resource
|
|
301
|
+
: transformTriangleMesh(resource, composeTransform3(translationTransform3(part.position), eulerTransform3(part.rotation)));
|
|
302
|
+
const facts = analyzeTriangleMesh(geometry, { requireClosed: true, includeTopology: true });
|
|
303
|
+
if (!sameMeasurements(facts, part.measurements))
|
|
304
|
+
invalid(`Captured placement measurements do not match part ${part.id}.`);
|
|
305
|
+
vertices += facts.vertexCount;
|
|
306
|
+
triangles += facts.triangleCount;
|
|
307
|
+
volume += facts.signedVolume;
|
|
308
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
309
|
+
aggregateBounds.min[axis] = Math.min(aggregateBounds.min[axis], facts.bounds.min[axis]);
|
|
310
|
+
aggregateBounds.max[axis] = Math.max(aggregateBounds.max[axis], facts.bounds.max[axis]);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (vertices !== manifest.stats.vertices ||
|
|
314
|
+
triangles !== manifest.stats.triangles ||
|
|
315
|
+
volume !== manifest.stats.volumeMm3 ||
|
|
316
|
+
manifest.stats.bytes < totalBytes ||
|
|
317
|
+
manifest.stats.bytes > manifest.policy.limits.maxBytes ||
|
|
318
|
+
vertices > manifest.policy.limits.maxVertices ||
|
|
319
|
+
triangles > manifest.policy.limits.maxTriangles ||
|
|
320
|
+
JSON.stringify(aggregateBounds) !== JSON.stringify(manifest.bounds))
|
|
321
|
+
invalid("Captured aggregate facts do not match finalized part geometry.");
|
|
322
|
+
if (manifest.export3mf !== undefined)
|
|
323
|
+
await readBuffer(root, manifest.export3mf);
|
|
324
|
+
return { directory: root, manifest, resources };
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
if (error instanceof AuthoringError)
|
|
328
|
+
throw error;
|
|
329
|
+
throw new AuthoringError("artifact", "INVALID_ARTIFACT", error instanceof Error ? error.message : String(error));
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Validates a completed capture and returns its manifest with an optional semantic part selection.
|
|
334
|
+
* Original source is never evaluated; incomplete captures and unknown part IDs reject.
|
|
335
|
+
*/
|
|
336
|
+
export async function inspectCapturedRun(directory, partId) {
|
|
337
|
+
const captured = await readCapturedRun(directory);
|
|
338
|
+
const selectedPart = partId === undefined ? undefined : captured.manifest.parts.find(({ id }) => id === partId);
|
|
339
|
+
if (partId !== undefined && selectedPart === undefined)
|
|
340
|
+
throw new AuthoringError("invocation", "PART_NOT_FOUND", `Captured run has no part ${partId}.`);
|
|
341
|
+
return {
|
|
342
|
+
directory: captured.directory,
|
|
343
|
+
manifest: captured.manifest,
|
|
344
|
+
...(selectedPart === undefined ? {} : { selectedPart }),
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/authoring/artifacts.ts"],"names":[],"mappings":"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"}
|