@metamesh/cli 0.0.0-bootstrap.0 → 0.13.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 +27 -0
- package/README.md +71 -5
- package/dist/authoring/artifacts.d.ts +11 -0
- package/dist/authoring/artifacts.d.ts.map +1 -0
- package/dist/authoring/artifacts.js +343 -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 +3 -0
- package/dist/authoring/check.d.ts.map +1 -0
- package/dist/authoring/check.js +117 -0
- package/dist/authoring/check.js.map +1 -0
- package/dist/authoring/environment.d.ts +19 -0
- package/dist/authoring/environment.d.ts.map +1 -0
- package/dist/authoring/environment.js +173 -0
- package/dist/authoring/environment.js.map +1 -0
- package/dist/authoring/errors.d.ts +11 -0
- package/dist/authoring/errors.d.ts.map +1 -0
- package/dist/authoring/errors.js +41 -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 +3 -0
- package/dist/authoring/run.d.ts.map +1 -0
- package/dist/authoring/run.js +304 -0
- package/dist/authoring/run.js.map +1 -0
- package/dist/authoring/types.d.ts +138 -0
- package/dist/authoring/types.d.ts.map +1 -0
- package/dist/authoring/types.js +2 -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 +183 -0
- package/dist/docs/guides/package.md +72 -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 +19 -0
- package/dist/docs/reference/authoring/AuthoringEnvironment.md +14 -0
- package/dist/docs/reference/authoring/AuthoringError.md +15 -0
- package/dist/docs/reference/authoring/AuthoringFailure-type.md +15 -0
- package/dist/docs/reference/authoring/AuthoringKind.md +9 -0
- package/dist/docs/reference/authoring/AuthoringPhase.md +9 -0
- package/dist/docs/reference/authoring/CapturedBuffer.md +13 -0
- package/dist/docs/reference/authoring/CapturedGeometry.md +13 -0
- package/dist/docs/reference/authoring/CapturedPart.md +16 -0
- package/dist/docs/reference/authoring/CapturedResource.md +14 -0
- package/dist/docs/reference/authoring/CapturedRun.md +13 -0
- package/dist/docs/reference/authoring/CapturedRunManifest.md +38 -0
- package/dist/docs/reference/authoring/CheckOptions.md +14 -0
- package/dist/docs/reference/authoring/CheckSuccess.md +15 -0
- package/dist/docs/reference/authoring/DocumentationEntry.md +18 -0
- package/dist/docs/reference/authoring/DocumentationManifest.md +14 -0
- package/dist/docs/reference/authoring/DocumentationSearchResult.md +12 -0
- package/dist/docs/reference/authoring/InstalledAuthoringPackage.md +14 -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 +17 -0
- package/dist/docs/reference/authoring/RunSuccess.md +13 -0
- package/dist/docs/reference/authoring/authoringFailure-value.md +9 -0
- package/dist/docs/reference/authoring/checkAuthoringSource.md +9 -0
- package/dist/docs/reference/authoring/discoverAuthoringEnvironment.md +9 -0
- package/dist/docs/reference/authoring/inspectCapturedRun.md +11 -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 +9 -0
- package/dist/docs/reference/authoring/searchAuthoringDocumentation.md +12 -0
- package/dist/docs/reference/authoring/showAuthoringDocumentation.md +11 -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 +51 -6
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# @metamesh/cli
|
|
2
|
+
|
|
3
|
+
## 0.13.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 2ebe03f: Ship exact-version offline documentation and a development-only authoring CLI for semantic
|
|
8
|
+
checking, generation, captured geometry inspection, and explicit Chromium previews. Use exact
|
|
9
|
+
package versions in documentation metadata and reject unsupported authoring artifact formats.
|
|
10
|
+
Provide generated command help and strict per-command argument validation, and enforce semantic
|
|
11
|
+
checking even when the consumer's TypeScript configuration disables it.
|
|
12
|
+
|
|
13
|
+
Publish lightweight model and Generator testing helpers as `@metamesh/testkit`. Move the
|
|
14
|
+
`metamesh` executable and Node authoring API into `@metamesh/cli`, which owns compiler, bundler,
|
|
15
|
+
renderer, and browser dependencies. Remove the former package name and authoring entry from
|
|
16
|
+
Testkit without compatibility aliases.
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- Updated dependencies [2ebe03f]
|
|
21
|
+
- Updated dependencies [7e1b75d]
|
|
22
|
+
- Updated dependencies [3139981]
|
|
23
|
+
- @metamesh/modeling@0.13.0
|
|
24
|
+
- @metamesh/generator-sdk@0.13.0
|
|
25
|
+
- @metamesh/testkit@0.13.0
|
|
26
|
+
|
|
27
|
+
Local authoring tools extracted from the former Generator testing package.
|
package/README.md
CHANGED
|
@@ -1,6 +1,72 @@
|
|
|
1
|
-
#
|
|
1
|
+
# `@metamesh/cli`
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
Check, execute, inspect, and render trusted local MetaMesh source. The `metamesh` executable and
|
|
4
|
+
Node-only `/authoring` functions use the production engine and version-matched installed documentation.
|
|
5
|
+
|
|
6
|
+
> **Preview:** `0.x` minor releases may break compatibility. Patches remain compatible within the
|
|
7
|
+
> same minor line.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
Install matching releases in the project where you author models:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pnpm add @metamesh/modeling
|
|
15
|
+
pnpm add -D @metamesh/cli
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Add `@metamesh/generator-sdk` when your source defines Generators. Add `@metamesh/testkit` as a
|
|
19
|
+
development dependency when importing testing helpers. CLI internally reuses Testkit font fixtures
|
|
20
|
+
and its SDK contracts; neither package needs to be directly declared for standalone model authoring.
|
|
21
|
+
The compiler, bundler, Three renderer, and Playwright belong to CLI; Testkit does not install them.
|
|
22
|
+
Chromium is installed separately and never downloaded by checking or generation.
|
|
23
|
+
|
|
24
|
+
## Local workflow
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
pnpm exec metamesh environment
|
|
28
|
+
pnpm exec metamesh docs search "extrude"
|
|
29
|
+
pnpm exec metamesh docs show TOPIC_ID
|
|
30
|
+
pnpm exec metamesh check model.ts --kind model
|
|
31
|
+
pnpm exec metamesh run model.ts --kind model
|
|
32
|
+
pnpm exec metamesh inspect RUN_DIRECTORY
|
|
33
|
+
pnpm exec metamesh browser install
|
|
34
|
+
pnpm exec metamesh render RUN_DIRECTORY --views isometric,front,top,right
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
`run` includes semantic TypeScript checking and executes in a disposable child process with a
|
|
38
|
+
30-second default deadline. It saves each attempt beneath `.metamesh/runs` with source identity,
|
|
39
|
+
parameters, diagnostics, measurements, and hashed geometry buffers. `inspect` and `render` validate
|
|
40
|
+
those captured buffers without importing the original source. Use `--json` for one structured stdout
|
|
41
|
+
result; bounded author logs go to stderr. Exit codes are 0 for success, 1 for source or generation
|
|
42
|
+
failure, and 2 for invocation, environment, artifact, or tooling failure. This executes trusted local
|
|
43
|
+
code and is not a security sandbox.
|
|
44
|
+
|
|
45
|
+
For Generators, use `--kind generator`. Entries named-export `definition` and default-export the
|
|
46
|
+
Generator module envelope. Defaults merge with `--params parameters.json`, then strict validation
|
|
47
|
+
rejects unknown or invalid overrides. Standalone model entries default-export a `ModelProgram` and
|
|
48
|
+
receive no injected services. Both support normal local imports and installed dependencies; Studio's
|
|
49
|
+
virtual `@metamesh/project` module is unavailable.
|
|
50
|
+
|
|
51
|
+
Use `--help` on each command for parameters, fonts, resource limits, export, and image options.
|
|
52
|
+
`metamesh setup` prints skill installation and project-instruction guidance without modifying files.
|
|
53
|
+
|
|
54
|
+
## Programmatic API and documentation
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import { inspectCapturedRun, runAuthoringSource } from "@metamesh/cli/authoring";
|
|
58
|
+
|
|
59
|
+
const result = await runAuthoringSource({ entry: "model.ts", kind: "model" });
|
|
60
|
+
if (result.success) {
|
|
61
|
+
console.log(await inspectCapturedRun(result.runDirectory));
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Resolve `@metamesh/cli/docs/manifest.json` for the installed Markdown reference. The
|
|
66
|
+
[authoring guide](https://metamesh.studio/docs/develop/agent-authoring) explains local font fixtures,
|
|
67
|
+
artifacts, rendering, and agent integration. The reusable authoring functions and command
|
|
68
|
+
implementation stay in this package; geometry and Generator contracts retain their existing owners.
|
|
69
|
+
|
|
70
|
+
## License
|
|
71
|
+
|
|
72
|
+
[Apache-2.0](https://github.com/JasonKoolman/metamesh/blob/main/packages/cli/LICENSE).
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ModelSnapshot } from "@metamesh/modeling/engine";
|
|
2
|
+
import type { CapturedPart, CapturedRun, CapturedRunManifest } from "./types.js";
|
|
3
|
+
export declare function sha256(value: Uint8Array | string): string;
|
|
4
|
+
export declare function writeAtomicJson(file: string, value: unknown): Promise<void>;
|
|
5
|
+
export declare function captureSnapshot(directory: string, snapshot: ModelSnapshot, metadata: Omit<CapturedRunManifest, "resources" | "parts" | "bounds" | "stats" | "diagnostics" | "dependencies" | "export3mf">, export3mf?: ArrayBuffer): Promise<CapturedRunManifest>;
|
|
6
|
+
/** Reads only immutable captured files. It never imports or executes original author source. */
|
|
7
|
+
export declare function readCapturedRun(directory: string): Promise<CapturedRun>;
|
|
8
|
+
export declare function inspectCapturedRun(directory: string, partId?: string): Promise<Omit<CapturedRun, "resources"> & {
|
|
9
|
+
readonly selectedPart?: CapturedPart;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=artifacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/authoring/artifacts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAY/D,OAAO,KAAK,EAGV,YAAY,EAEZ,WAAW,EACX,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjF;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,IAAI,CACZ,mBAAmB,EACnB,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,aAAa,GAAG,cAAc,GAAG,WAAW,CAC1F,EACD,SAAS,CAAC,EAAE,WAAW,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAqD9B;AAsPD,gGAAgG;AAChG,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA0E7E;AAED,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG;IAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC,CAWpF"}
|
|
@@ -0,0 +1,343 @@
|
|
|
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
|
+
export async function inspectCapturedRun(directory, partId) {
|
|
333
|
+
const captured = await readCapturedRun(directory);
|
|
334
|
+
const selectedPart = partId === undefined ? undefined : captured.manifest.parts.find(({ id }) => id === partId);
|
|
335
|
+
if (partId !== undefined && selectedPart === undefined)
|
|
336
|
+
throw new AuthoringError("invocation", "PART_NOT_FOUND", `Captured run has no part ${partId}.`);
|
|
337
|
+
return {
|
|
338
|
+
directory: captured.directory,
|
|
339
|
+
manifest: captured.manifest,
|
|
340
|
+
...(selectedPart === undefined ? {} : { selectedPart }),
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
//# 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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"}
|