@helix3/helix-cli 0.1.14-helix3.167 → 0.1.14-helix3.169
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/README.md +5 -1
- package/assets/bridge/metahuman-eye-baked.png +0 -0
- package/dist/bridge/bridge.testutil.d.ts +73 -0
- package/dist/bridge/bridge.testutil.js +229 -0
- package/dist/bridge/bridge.testutil.js.map +1 -0
- package/dist/bridge/detect.d.ts +4 -0
- package/dist/bridge/detect.js +152 -0
- package/dist/bridge/detect.js.map +1 -0
- package/dist/bridge/execute.d.ts +3 -0
- package/dist/bridge/execute.js +177 -0
- package/dist/bridge/execute.js.map +1 -0
- package/dist/bridge/glb.d.ts +60 -0
- package/dist/bridge/glb.js +80 -0
- package/dist/bridge/glb.js.map +1 -0
- package/dist/bridge/hash.d.ts +6 -0
- package/dist/bridge/hash.js +40 -0
- package/dist/bridge/hash.js.map +1 -0
- package/dist/bridge/index.d.ts +10 -0
- package/dist/bridge/index.js +27 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/bridge/internal/artifacts.d.ts +5 -0
- package/dist/bridge/internal/artifacts.js +31 -0
- package/dist/bridge/internal/artifacts.js.map +1 -0
- package/dist/bridge/internal/builtInExecution.d.ts +4 -0
- package/dist/bridge/internal/builtInExecution.js +248 -0
- package/dist/bridge/internal/builtInExecution.js.map +1 -0
- package/dist/bridge/internal/externalExecution.d.ts +4 -0
- package/dist/bridge/internal/externalExecution.js +148 -0
- package/dist/bridge/internal/externalExecution.js.map +1 -0
- package/dist/bridge/internal/outputReservation.d.ts +13 -0
- package/dist/bridge/internal/outputReservation.js +145 -0
- package/dist/bridge/internal/outputReservation.js.map +1 -0
- package/dist/bridge/internal/snapshots.d.ts +32 -0
- package/dist/bridge/internal/snapshots.js +508 -0
- package/dist/bridge/internal/snapshots.js.map +1 -0
- package/dist/bridge/management.d.ts +40 -0
- package/dist/bridge/management.js +333 -0
- package/dist/bridge/management.js.map +1 -0
- package/dist/bridge/manifest.d.ts +8 -0
- package/dist/bridge/manifest.js +192 -0
- package/dist/bridge/manifest.js.map +1 -0
- package/dist/bridge/metahuman.d.ts +26 -0
- package/dist/bridge/metahuman.js +262 -0
- package/dist/bridge/metahuman.js.map +1 -0
- package/dist/bridge/planner.d.ts +6 -0
- package/dist/bridge/planner.js +214 -0
- package/dist/bridge/planner.js.map +1 -0
- package/dist/bridge/plugins.d.ts +16 -0
- package/dist/bridge/plugins.js +230 -0
- package/dist/bridge/plugins.js.map +1 -0
- package/dist/bridge/resolution.d.ts +8 -0
- package/dist/bridge/resolution.js +22 -0
- package/dist/bridge/resolution.js.map +1 -0
- package/dist/bridge/types.d.ts +209 -0
- package/dist/bridge/types.js +53 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/bridge/validate.d.ts +12 -0
- package/dist/bridge/validate.js +192 -0
- package/dist/bridge/validate.js.map +1 -0
- package/dist/builds/index.d.ts +54 -0
- package/dist/builds/index.js +215 -0
- package/dist/builds/index.js.map +1 -0
- package/dist/canary/cli.d.ts +17 -0
- package/dist/canary/cli.js +95 -0
- package/dist/canary/cli.js.map +1 -0
- package/dist/canary/index.d.ts +4 -0
- package/dist/canary/index.js +21 -0
- package/dist/canary/index.js.map +1 -0
- package/dist/canary/inventory.d.ts +46 -0
- package/dist/canary/inventory.js +499 -0
- package/dist/canary/inventory.js.map +1 -0
- package/dist/canary/pacifica.d.ts +51 -0
- package/dist/canary/pacifica.js +247 -0
- package/dist/canary/pacifica.js.map +1 -0
- package/dist/canary/plan.d.ts +115 -0
- package/dist/canary/plan.js +479 -0
- package/dist/canary/plan.js.map +1 -0
- package/dist/character/fbx.js +7 -4
- package/dist/character/fbx.js.map +1 -1
- package/dist/character/importCharacter.js +2 -2
- package/dist/character/importCharacter.js.map +1 -1
- package/dist/character/mat4.js +0 -2
- package/dist/character/mat4.js.map +1 -1
- package/dist/character/meshyToHelixMap.js +0 -2
- package/dist/character/meshyToHelixMap.js.map +1 -1
- package/dist/character/quat.js +2 -2
- package/dist/character/quat.js.map +1 -1
- package/dist/character/stages/bakeTexture.js +0 -2
- package/dist/character/stages/bakeTexture.js.map +1 -1
- package/dist/character/stages/conform.js +0 -2
- package/dist/character/stages/conform.js.map +1 -1
- package/dist/character/stages/ktx2.js +0 -2
- package/dist/character/stages/ktx2.js.map +1 -1
- package/dist/character/stages/mergeLods.js +0 -2
- package/dist/character/stages/mergeLods.js.map +1 -1
- package/dist/character/stages/report.js +0 -2
- package/dist/character/stages/report.js.map +1 -1
- package/dist/character/stages/resizeTextures.js +0 -2
- package/dist/character/stages/resizeTextures.js.map +1 -1
- package/dist/character/stages/retarget.js +0 -2
- package/dist/character/stages/retarget.js.map +1 -1
- package/dist/character/stages/retargetClip.js +0 -2
- package/dist/character/stages/retargetClip.js.map +1 -1
- package/dist/character/stages/sanitizeMaterials.js +0 -2
- package/dist/character/stages/sanitizeMaterials.js.map +1 -1
- package/dist/character/stages/simplifyMesh.js +0 -2
- package/dist/character/stages/simplifyMesh.js.map +1 -1
- package/dist/character/stages/splitFacePrimitive.js +0 -2
- package/dist/character/stages/splitFacePrimitive.js.map +1 -1
- package/dist/character/stages/weldedSimplify.js +0 -2
- package/dist/character/stages/weldedSimplify.js.map +1 -1
- package/dist/character/testutil/syntheticRig.js +0 -2
- package/dist/character/testutil/syntheticRig.js.map +1 -1
- package/dist/character/untrustedSource.js +1 -1
- package/dist/character/untrustedSource.js.map +1 -1
- package/dist/continuum/authoring.d.ts +31 -0
- package/dist/continuum/authoring.js +34 -0
- package/dist/continuum/authoring.js.map +1 -0
- package/dist/continuum/cli.d.ts +46 -0
- package/dist/continuum/cli.js +62 -0
- package/dist/continuum/cli.js.map +1 -0
- package/dist/continuum/cliAuthority.d.ts +17 -0
- package/dist/continuum/cliAuthority.js +28 -0
- package/dist/continuum/cliAuthority.js.map +1 -0
- package/dist/continuum/client.d.ts +40 -0
- package/dist/continuum/client.js +76 -0
- package/dist/continuum/client.js.map +1 -0
- package/dist/continuum/identity.d.ts +4 -0
- package/dist/continuum/identity.js +20 -0
- package/dist/continuum/identity.js.map +1 -0
- package/dist/continuum/index.d.ts +7 -0
- package/dist/continuum/index.js +24 -0
- package/dist/continuum/index.js.map +1 -0
- package/dist/continuum/state.d.ts +40 -0
- package/dist/continuum/state.js +194 -0
- package/dist/continuum/state.js.map +1 -0
- package/dist/continuum/types.d.ts +125 -0
- package/dist/continuum/types.js +6 -0
- package/dist/continuum/types.js.map +1 -0
- package/dist/continuum/workflow.d.ts +54 -0
- package/dist/continuum/workflow.js +404 -0
- package/dist/continuum/workflow.js.map +1 -0
- package/dist/index.js +495 -0
- package/dist/index.js.map +1 -1
- package/dist/lib.d.ts +6 -0
- package/dist/lib.js +30 -5
- package/dist/lib.js.map +1 -1
- package/dist/sceneElements/continuum.d.ts +48 -0
- package/dist/sceneElements/continuum.js +286 -0
- package/dist/sceneElements/continuum.js.map +1 -0
- package/dist/sceneImport/bistroMaterialBake.d.ts +1 -1
- package/dist/sceneImport/bistroMaterialBake.js +6 -2
- package/dist/sceneImport/bistroMaterialBake.js.map +1 -1
- package/dist/sceneImport/fbx.d.ts +4 -0
- package/dist/sceneImport/fbx.js +43 -63
- package/dist/sceneImport/fbx.js.map +1 -1
- package/dist/sceneImport/materials/binding.d.ts +16 -0
- package/dist/sceneImport/materials/binding.js +42 -0
- package/dist/sceneImport/materials/binding.js.map +1 -0
- package/dist/sceneImport/materials/catalog.d.ts +36 -0
- package/dist/sceneImport/materials/catalog.js +233 -0
- package/dist/sceneImport/materials/catalog.js.map +1 -0
- package/dist/sceneImport/materials/index.d.ts +4 -0
- package/dist/sceneImport/materials/index.js +21 -0
- package/dist/sceneImport/materials/index.js.map +1 -0
- package/dist/sceneImport/materials/matcher.d.ts +33 -0
- package/dist/sceneImport/materials/matcher.js +127 -0
- package/dist/sceneImport/materials/matcher.js.map +1 -0
- package/dist/sceneImport/materials/recipe.d.ts +30 -0
- package/dist/sceneImport/materials/recipe.js +134 -0
- package/dist/sceneImport/materials/recipe.js.map +1 -0
- package/dist/sceneImport/semantic.d.ts +75 -0
- package/dist/sceneImport/semantic.js +296 -0
- package/dist/sceneImport/semantic.js.map +1 -0
- package/dist/sceneImport/textureDecode.d.ts +4 -2
- package/dist/sceneImport/textureDecode.js +19 -2
- package/dist/sceneImport/textureDecode.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/docs/bridge.md +216 -0
- package/package.json +18 -2
package/README.md
CHANGED
|
@@ -35,6 +35,8 @@ The token is stored in `~/.helix/credentials.json` (mode `600`). It's sent as
|
|
|
35
35
|
|
|
36
36
|
| Command | What it does |
|
|
37
37
|
|---|---|
|
|
38
|
+
| `helix bridge detect\|inspect\|plan\|import\|validate\|doctor` | Universal plugin-driven intake for assets, characters, animations, scenes, and engine projects. Produces deterministic plans, HELIX-native outputs, and checksummed provenance. See [`docs/bridge.md`](docs/bridge.md). |
|
|
39
|
+
| `helix bridge plugins create\|test\|list\|inspect\|install\|remove` | Build and manage local/community Bridge Plugins using the versioned capability and permission contract. |
|
|
38
40
|
| `helix login [--api-url <url>] [--web-url <url>] [--token <t>] [--no-browser]` | Sign in via the browser (`/cli-login`), or `--token` for CI/headless. Stores the client token. |
|
|
39
41
|
| `helix logout` | Remove the stored token. |
|
|
40
42
|
| `helix whoami` | Show current login status. |
|
|
@@ -65,6 +67,8 @@ The token is stored in `~/.helix/credentials.json` (mode `600`). It's sent as
|
|
|
65
67
|
| `helix world audit\|source-audit\|perf-gate\|prove-live` | Run the blocking world QA, performance, and deployed-build identity gates. |
|
|
66
68
|
| `helix world scene-source inventory\|compile <helsinki\|bistro> <archive>` | Verify and safely inventory a known CC BY source archive, then compile deterministic local proxy/detail GLBs and an existing-schema Scene v2 package. |
|
|
67
69
|
| `helix world scene-source publish <world-id> <package-dir> [--publish]` | Validate the Scene v2 package and print its multipart build receipt. Execution remains dry-run-only until backend private-pin entitlement lands; `--publish` currently fails closed, and access control never changes CC BY rights. |
|
|
70
|
+
| `helix continuum publish-source-map\|publish-scratch\|publish-package` | Resume exact-CID object adoption/ingestion, Package lease/seal, optional explicitly authorized Listing, and WorldRelease publication through one creator-owned pipeline. |
|
|
71
|
+
| `helix continuum receipt <job-id>` | Read the sanitized durable receipt for a completed Continuum publication. |
|
|
68
72
|
| `helix unreal init\|validate\|doctor\|package [project]` | Create and gate a shared-runtime or native-game publish manifest, check optional editor MCP, and assemble a local upload-shaped package. |
|
|
69
73
|
| `helix unreal publish <candidate> --world <slug>` | Upload a **cooked** Unreal world to HELIX: verify the candidate, presign, upload every artifact, finalize, and promote it as the world's active build. |
|
|
70
74
|
| `helix doctor [--project <dir>]` | Print the environment + whether the @helix toolchain (CLI/MCP/SDK/manifest) is current. |
|
|
@@ -496,7 +500,7 @@ database column and the backend rejects it by name rather than dropping it in si
|
|
|
496
500
|
|
|
497
501
|
```bash
|
|
498
502
|
npm install
|
|
499
|
-
npm test #
|
|
503
|
+
npm test # build current source, then Jest
|
|
500
504
|
npm run build # tsc → dist/ (bin: dist/index.js)
|
|
501
505
|
npm run lint
|
|
502
506
|
```
|
|
Binary file
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Document } from '@gltf-transform/core';
|
|
2
|
+
export declare function addPrimitive(document: Document, mesh: ReturnType<Document['createMesh']>, materialName: string, triangles: number): void;
|
|
3
|
+
export declare function writeMetaHumanFixture(path: string): Promise<void>;
|
|
4
|
+
export declare function writeBipedFixture(path: string): Promise<void>;
|
|
5
|
+
export declare function writeExternalFixture(directory: string, options: {
|
|
6
|
+
id: string;
|
|
7
|
+
capability?: string;
|
|
8
|
+
priority?: number;
|
|
9
|
+
extension?: string;
|
|
10
|
+
accepts?: string[];
|
|
11
|
+
produces?: string[];
|
|
12
|
+
replaces?: string[];
|
|
13
|
+
args?: string[];
|
|
14
|
+
requires?: string[];
|
|
15
|
+
handler: string[];
|
|
16
|
+
}): void;
|
|
17
|
+
export declare function glb(json: Record<string, unknown>): Buffer;
|
|
18
|
+
export declare function writeLargeGlb(path: string, json: Record<string, unknown>, binaryBytes: number): void;
|
|
19
|
+
export declare function validBaseAvatar(): {
|
|
20
|
+
scenes: {
|
|
21
|
+
name: string;
|
|
22
|
+
nodes: number[];
|
|
23
|
+
}[];
|
|
24
|
+
nodes: ({
|
|
25
|
+
name: string;
|
|
26
|
+
mesh: number;
|
|
27
|
+
skin: number;
|
|
28
|
+
children: number[];
|
|
29
|
+
} | {
|
|
30
|
+
name: string;
|
|
31
|
+
mesh: number;
|
|
32
|
+
skin: number;
|
|
33
|
+
children?: undefined;
|
|
34
|
+
})[];
|
|
35
|
+
meshes: ({
|
|
36
|
+
primitives: {
|
|
37
|
+
attributes: {
|
|
38
|
+
POSITION: number;
|
|
39
|
+
};
|
|
40
|
+
indices: number;
|
|
41
|
+
material: number;
|
|
42
|
+
}[];
|
|
43
|
+
name?: undefined;
|
|
44
|
+
} | {
|
|
45
|
+
name: string;
|
|
46
|
+
primitives: {
|
|
47
|
+
attributes: {
|
|
48
|
+
POSITION: number;
|
|
49
|
+
};
|
|
50
|
+
indices: number;
|
|
51
|
+
material: number;
|
|
52
|
+
}[];
|
|
53
|
+
})[];
|
|
54
|
+
skins: {
|
|
55
|
+
joints: never[];
|
|
56
|
+
}[];
|
|
57
|
+
accessors: {
|
|
58
|
+
count: number;
|
|
59
|
+
}[];
|
|
60
|
+
materials: ({
|
|
61
|
+
name: string;
|
|
62
|
+
pbrMetallicRoughness?: undefined;
|
|
63
|
+
} | {
|
|
64
|
+
name: string;
|
|
65
|
+
pbrMetallicRoughness: {
|
|
66
|
+
baseColorTexture: {
|
|
67
|
+
index: number;
|
|
68
|
+
};
|
|
69
|
+
baseColorFactor: number[];
|
|
70
|
+
};
|
|
71
|
+
})[];
|
|
72
|
+
textures: {}[];
|
|
73
|
+
};
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.addPrimitive = addPrimitive;
|
|
7
|
+
exports.writeMetaHumanFixture = writeMetaHumanFixture;
|
|
8
|
+
exports.writeBipedFixture = writeBipedFixture;
|
|
9
|
+
exports.writeExternalFixture = writeExternalFixture;
|
|
10
|
+
exports.glb = glb;
|
|
11
|
+
exports.writeLargeGlb = writeLargeGlb;
|
|
12
|
+
exports.validBaseAvatar = validBaseAvatar;
|
|
13
|
+
const node_fs_1 = require("node:fs");
|
|
14
|
+
const node_path_1 = require("node:path");
|
|
15
|
+
const core_1 = require("@gltf-transform/core");
|
|
16
|
+
const sharp_1 = __importDefault(require("sharp"));
|
|
17
|
+
const index_1 = require("./index");
|
|
18
|
+
function addPrimitive(document, mesh, materialName, triangles) {
|
|
19
|
+
const buffer = document.getRoot().listBuffers()[0] ?? document.createBuffer();
|
|
20
|
+
const positions = new Float32Array(triangles * 9);
|
|
21
|
+
const texcoords = new Float32Array(triangles * 6);
|
|
22
|
+
const indices = new Uint16Array(triangles * 3);
|
|
23
|
+
for (let i = 0; i < indices.length; i++)
|
|
24
|
+
indices[i] = i;
|
|
25
|
+
const position = document.createAccessor().setType('VEC3').setArray(positions).setBuffer(buffer);
|
|
26
|
+
const texcoord = document.createAccessor().setType('VEC2').setArray(texcoords).setBuffer(buffer);
|
|
27
|
+
const index = document.createAccessor().setType('SCALAR').setArray(indices).setBuffer(buffer);
|
|
28
|
+
const material = document.createMaterial(materialName).setBaseColorFactor([0, 0, 0, 1]);
|
|
29
|
+
mesh.addPrimitive(document.createPrimitive()
|
|
30
|
+
.setAttribute('POSITION', position)
|
|
31
|
+
.setAttribute('TEXCOORD_0', texcoord)
|
|
32
|
+
.setIndices(index)
|
|
33
|
+
.setMaterial(material));
|
|
34
|
+
}
|
|
35
|
+
async function writeMetaHumanFixture(path) {
|
|
36
|
+
const document = new core_1.Document();
|
|
37
|
+
const faceMesh = document.createMesh('FaceMesh');
|
|
38
|
+
const eyeMesh = document.createMesh('Eyes');
|
|
39
|
+
addPrimitive(document, faceMesh, 'MI_Head_Baked', 2);
|
|
40
|
+
addPrimitive(document, faceMesh, 'M_Hide', 1);
|
|
41
|
+
addPrimitive(document, eyeMesh, 'MI_EyeL_Baked', 1);
|
|
42
|
+
addPrimitive(document, eyeMesh, 'MI_EyeR_Baked', 1);
|
|
43
|
+
document.createScene('scene')
|
|
44
|
+
.addChild(document.createNode('FaceMesh').setMesh(faceMesh))
|
|
45
|
+
.addChild(document.createNode('Eyes').setMesh(eyeMesh));
|
|
46
|
+
await new core_1.NodeIO().write(path, document);
|
|
47
|
+
}
|
|
48
|
+
async function writeBipedFixture(path) {
|
|
49
|
+
const document = new core_1.Document();
|
|
50
|
+
const buffer = document.createBuffer();
|
|
51
|
+
const scene = document.createScene('scene');
|
|
52
|
+
const node = (name) => document.createNode(name);
|
|
53
|
+
const hips = node('Hips');
|
|
54
|
+
const spine02 = node('Spine02');
|
|
55
|
+
const spine01 = node('Spine01');
|
|
56
|
+
const spine = node('Spine');
|
|
57
|
+
const neck = node('neck');
|
|
58
|
+
const head = node('Head');
|
|
59
|
+
hips.setTranslation([0, 1, 0]);
|
|
60
|
+
spine02.setTranslation([0, 0.2, 0]);
|
|
61
|
+
spine01.setTranslation([0, 0.2, 0]);
|
|
62
|
+
spine.setTranslation([0, 0.2, 0]);
|
|
63
|
+
neck.setTranslation([0, 0.15, 0]);
|
|
64
|
+
head.setTranslation([0, 0.15, 0]);
|
|
65
|
+
hips.addChild(spine02);
|
|
66
|
+
spine02.addChild(spine01);
|
|
67
|
+
spine01.addChild(spine);
|
|
68
|
+
spine.addChild(neck);
|
|
69
|
+
neck.addChild(head);
|
|
70
|
+
const addChain = (parent, names) => {
|
|
71
|
+
const nodes = [];
|
|
72
|
+
let current = parent;
|
|
73
|
+
for (const name of names) {
|
|
74
|
+
const child = node(name);
|
|
75
|
+
current.addChild(child);
|
|
76
|
+
nodes.push(child);
|
|
77
|
+
current = child;
|
|
78
|
+
}
|
|
79
|
+
return nodes;
|
|
80
|
+
};
|
|
81
|
+
const leftArm = addChain(spine, ['LeftShoulder', 'LeftArm', 'LeftForeArm', 'LeftHand']);
|
|
82
|
+
const rightArm = addChain(spine, ['RightShoulder', 'RightArm', 'RightForeArm', 'RightHand']);
|
|
83
|
+
const leftLeg = addChain(hips, ['LeftUpLeg', 'LeftLeg', 'LeftFoot', 'LeftToeBase']);
|
|
84
|
+
const rightLeg = addChain(hips, ['RightUpLeg', 'RightLeg', 'RightFoot', 'RightToeBase']);
|
|
85
|
+
leftArm.forEach((joint, index) => joint.setTranslation([index === 0 ? 0.15 : 0.2, 0, 0]));
|
|
86
|
+
rightArm.forEach((joint, index) => joint.setTranslation([index === 0 ? -0.15 : -0.2, 0, 0]));
|
|
87
|
+
leftLeg.forEach((joint, index) => joint.setTranslation([index === 0 ? 0.1 : 0, -0.25, index > 1 ? 0.05 : 0]));
|
|
88
|
+
rightLeg.forEach((joint, index) => joint.setTranslation([index === 0 ? -0.1 : 0, -0.25, index > 1 ? 0.05 : 0]));
|
|
89
|
+
scene.addChild(hips);
|
|
90
|
+
const joints = [hips, spine02, spine01, spine, neck, head, ...leftArm, ...rightArm, ...leftLeg, ...rightLeg];
|
|
91
|
+
const skin = document.createSkin('skin').setSkeleton(hips);
|
|
92
|
+
joints.forEach((joint) => skin.addJoint(joint));
|
|
93
|
+
const inverseBindMatrices = new Float32Array(joints.length * 16);
|
|
94
|
+
for (let index = 0; index < joints.length; index += 1) {
|
|
95
|
+
inverseBindMatrices[index * 16] = 1;
|
|
96
|
+
inverseBindMatrices[index * 16 + 5] = 1;
|
|
97
|
+
inverseBindMatrices[index * 16 + 10] = 1;
|
|
98
|
+
inverseBindMatrices[index * 16 + 15] = 1;
|
|
99
|
+
}
|
|
100
|
+
skin.setInverseBindMatrices(document.createAccessor().setType('MAT4').setArray(inverseBindMatrices).setBuffer(buffer));
|
|
101
|
+
const baseColorPng = await (0, sharp_1.default)(Buffer.from([180, 120, 80, 255]), {
|
|
102
|
+
raw: { width: 1, height: 1, channels: 4 },
|
|
103
|
+
}).png().toBuffer();
|
|
104
|
+
const material = document.createMaterial('BodyMaterial').setBaseColorTexture(document.createTexture('BodyTexture').setImage(new Uint8Array(baseColorPng)).setMimeType('image/png'));
|
|
105
|
+
const primitive = document.createPrimitive()
|
|
106
|
+
.setIndices(document.createAccessor().setType('SCALAR').setArray(new Uint16Array([0, 1, 2, 0, 2, 3])).setBuffer(buffer))
|
|
107
|
+
.setAttribute('POSITION', document.createAccessor().setType('VEC3')
|
|
108
|
+
.setArray(new Float32Array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0])).setBuffer(buffer))
|
|
109
|
+
.setAttribute('NORMAL', document.createAccessor().setType('VEC3')
|
|
110
|
+
.setArray(new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1])).setBuffer(buffer))
|
|
111
|
+
.setAttribute('TEXCOORD_0', document.createAccessor().setType('VEC2')
|
|
112
|
+
.setArray(new Float32Array([0, 0, 1, 0, 1, 1, 0, 1])).setBuffer(buffer))
|
|
113
|
+
.setAttribute('JOINTS_0', document.createAccessor().setType('VEC4')
|
|
114
|
+
.setArray(new Uint16Array(16)).setBuffer(buffer))
|
|
115
|
+
.setAttribute('WEIGHTS_0', document.createAccessor().setType('VEC4')
|
|
116
|
+
.setArray(new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0])).setBuffer(buffer))
|
|
117
|
+
.setMaterial(material);
|
|
118
|
+
scene.addChild(document.createNode('BodyMesh').setMesh(document.createMesh('BodyMesh').addPrimitive(primitive)).setSkin(skin));
|
|
119
|
+
const times = document.createAccessor().setType('SCALAR').setArray(new Float32Array([0, 1])).setBuffer(buffer);
|
|
120
|
+
const translations = document.createAccessor().setType('VEC3')
|
|
121
|
+
.setArray(new Float32Array([0, 0, 0, 0, 0.1, 0])).setBuffer(buffer);
|
|
122
|
+
const sampler = document.createAnimationSampler().setInput(times).setOutput(translations).setInterpolation('LINEAR');
|
|
123
|
+
const rotations = document.createAccessor().setType('VEC4')
|
|
124
|
+
.setArray(new Float32Array([0, 0, 0, 1, 0, 0, 0.1, 0.995])).setBuffer(buffer);
|
|
125
|
+
const rotationSampler = document.createAnimationSampler().setInput(times).setOutput(rotations).setInterpolation('LINEAR');
|
|
126
|
+
document.createAnimation('fixture')
|
|
127
|
+
.addSampler(sampler)
|
|
128
|
+
.addChannel(document.createAnimationChannel().setSampler(sampler).setTargetNode(hips).setTargetPath('translation'))
|
|
129
|
+
.addSampler(rotationSampler)
|
|
130
|
+
.addChannel(document.createAnimationChannel().setSampler(rotationSampler).setTargetNode(spine).setTargetPath('rotation'));
|
|
131
|
+
await new core_1.NodeIO().write(path, document);
|
|
132
|
+
}
|
|
133
|
+
function writeExternalFixture(directory, options) {
|
|
134
|
+
const capability = options.capability ?? `${options.id}.import`;
|
|
135
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(directory, 'bin'), { recursive: true });
|
|
136
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(directory, 'bridge-plugin.json'), JSON.stringify({
|
|
137
|
+
schemaVersion: index_1.BRIDGE_PLUGIN_SCHEMA,
|
|
138
|
+
id: options.id,
|
|
139
|
+
name: options.id,
|
|
140
|
+
version: '1.0.0',
|
|
141
|
+
trust: 'local-untrusted',
|
|
142
|
+
permissions: [],
|
|
143
|
+
capabilities: [{
|
|
144
|
+
id: capability,
|
|
145
|
+
stage: 'transform',
|
|
146
|
+
accepts: options.accepts ?? ['file.unknown'],
|
|
147
|
+
produces: options.produces ?? ['helix.package.asset'],
|
|
148
|
+
priority: options.priority ?? 0,
|
|
149
|
+
matches: { extensions: [options.extension ?? '.fixture'] },
|
|
150
|
+
...(options.replaces === undefined ? {} : { replaces: options.replaces }),
|
|
151
|
+
...(options.requires === undefined ? {} : { requires: options.requires }),
|
|
152
|
+
command: { executable: 'bin/import.js', ...(options.args === undefined ? {} : { args: options.args }), timeoutSeconds: 5 },
|
|
153
|
+
}],
|
|
154
|
+
}));
|
|
155
|
+
const executable = (0, node_path_1.join)(directory, 'bin', 'import.js');
|
|
156
|
+
(0, node_fs_1.writeFileSync)(executable, [
|
|
157
|
+
'#!/usr/bin/env node',
|
|
158
|
+
"let input = '';",
|
|
159
|
+
"process.stdin.setEncoding('utf8');",
|
|
160
|
+
"process.stdin.on('data', (chunk) => { input += chunk; });",
|
|
161
|
+
"process.stdin.on('end', () => {",
|
|
162
|
+
' const request = JSON.parse(input);',
|
|
163
|
+
...options.handler.map((line) => ` ${line}`),
|
|
164
|
+
'});',
|
|
165
|
+
'',
|
|
166
|
+
].join('\n'));
|
|
167
|
+
(0, node_fs_1.chmodSync)(executable, 0o755);
|
|
168
|
+
}
|
|
169
|
+
function glb(json) {
|
|
170
|
+
const source = Buffer.from(JSON.stringify(json));
|
|
171
|
+
const paddedLength = Math.ceil(source.length / 4) * 4;
|
|
172
|
+
const bytes = Buffer.alloc(20 + paddedLength, 0x20);
|
|
173
|
+
bytes.writeUInt32LE(0x46546c67, 0);
|
|
174
|
+
bytes.writeUInt32LE(2, 4);
|
|
175
|
+
bytes.writeUInt32LE(bytes.length, 8);
|
|
176
|
+
bytes.writeUInt32LE(paddedLength, 12);
|
|
177
|
+
bytes.writeUInt32LE(0x4e4f534a, 16);
|
|
178
|
+
source.copy(bytes, 20);
|
|
179
|
+
return bytes;
|
|
180
|
+
}
|
|
181
|
+
function writeLargeGlb(path, json, binaryBytes) {
|
|
182
|
+
const source = Buffer.from(JSON.stringify(json));
|
|
183
|
+
const paddedLength = Math.ceil(source.length / 4) * 4;
|
|
184
|
+
const header = Buffer.alloc(20 + paddedLength, 0x20);
|
|
185
|
+
header.writeUInt32LE(0x46546c67, 0);
|
|
186
|
+
header.writeUInt32LE(2, 4);
|
|
187
|
+
header.writeUInt32LE(header.length + binaryBytes, 8);
|
|
188
|
+
header.writeUInt32LE(paddedLength, 12);
|
|
189
|
+
header.writeUInt32LE(0x4e4f534a, 16);
|
|
190
|
+
source.copy(header, 20);
|
|
191
|
+
const descriptor = (0, node_fs_1.openSync)(path, 'w');
|
|
192
|
+
try {
|
|
193
|
+
(0, node_fs_1.writeSync)(descriptor, header);
|
|
194
|
+
const chunk = Buffer.alloc(1024 * 1024);
|
|
195
|
+
for (let remaining = binaryBytes; remaining > 0; remaining -= chunk.length) {
|
|
196
|
+
(0, node_fs_1.writeSync)(descriptor, chunk, 0, Math.min(chunk.length, remaining));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
(0, node_fs_1.closeSync)(descriptor);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function validBaseAvatar() {
|
|
204
|
+
return {
|
|
205
|
+
scenes: [{ name: 'lod1', nodes: [0] }, { name: 'lod2', nodes: [3] }, { name: 'lod3', nodes: [6] }],
|
|
206
|
+
nodes: [
|
|
207
|
+
{ name: 'FaceMesh', mesh: 0, skin: 0, children: [1, 2] }, { name: 'BodyMesh', mesh: 1, skin: 0 }, { name: 'Eyes', mesh: 2, skin: 0 },
|
|
208
|
+
{ name: 'FaceMesh', mesh: 0, skin: 0, children: [4, 5] }, { name: 'BodyMesh', mesh: 1, skin: 0 }, { name: 'Eyes', mesh: 2, skin: 0 },
|
|
209
|
+
{ name: 'FaceMesh', mesh: 0, skin: 0, children: [7, 8] }, { name: 'BodyMesh', mesh: 1, skin: 0 }, { name: 'Eyes', mesh: 2, skin: 0 },
|
|
210
|
+
],
|
|
211
|
+
meshes: [
|
|
212
|
+
{ primitives: [{ attributes: { POSITION: 0 }, indices: 1, material: 0 }] },
|
|
213
|
+
{ primitives: [{ attributes: { POSITION: 0 }, indices: 1, material: 0 }] },
|
|
214
|
+
{ name: 'Eyes', primitives: [
|
|
215
|
+
{ attributes: { POSITION: 0 }, indices: 1, material: 1 },
|
|
216
|
+
{ attributes: { POSITION: 0 }, indices: 1, material: 2 },
|
|
217
|
+
] },
|
|
218
|
+
],
|
|
219
|
+
skins: [{ joints: [] }],
|
|
220
|
+
accessors: [{ count: 3 }, { count: 3 }],
|
|
221
|
+
materials: [
|
|
222
|
+
{ name: 'MI_Head_Baked' },
|
|
223
|
+
{ name: 'MI_EyeL_Baked', pbrMetallicRoughness: { baseColorTexture: { index: 0 }, baseColorFactor: [1, 1, 1, 1] } },
|
|
224
|
+
{ name: 'MI_EyeR_Baked', pbrMetallicRoughness: { baseColorTexture: { index: 1 }, baseColorFactor: [1, 1, 1, 1] } },
|
|
225
|
+
],
|
|
226
|
+
textures: [{}, {}],
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=bridge.testutil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.testutil.js","sourceRoot":"","sources":["../../src/bridge/bridge.testutil.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type BridgeDetection } from './types';
|
|
2
|
+
/** Shared by detection and immutable execution snapshots. */
|
|
3
|
+
export declare function isBridgeDirectoryExcluded(name: string): boolean;
|
|
4
|
+
export declare function detectBridgeSource(source: string): Promise<BridgeDetection>;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isBridgeDirectoryExcluded = isBridgeDirectoryExcluded;
|
|
4
|
+
exports.detectBridgeSource = detectBridgeSource;
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
7
|
+
const node_path_1 = require("node:path");
|
|
8
|
+
const glb_1 = require("./glb");
|
|
9
|
+
const hash_1 = require("./hash");
|
|
10
|
+
const types_1 = require("./types");
|
|
11
|
+
const DIRECTORY_EXCLUDES = new Set(['.git', 'node_modules', 'Intermediate', 'Saved', 'DerivedDataCache', 'Library', '.godot']);
|
|
12
|
+
/** Shared by detection and immutable execution snapshots. */
|
|
13
|
+
function isBridgeDirectoryExcluded(name) {
|
|
14
|
+
return DIRECTORY_EXCLUDES.has(name);
|
|
15
|
+
}
|
|
16
|
+
async function hashDirectoryFile(root, path, hash) {
|
|
17
|
+
const info = (0, node_fs_1.statSync)(path);
|
|
18
|
+
const name = (0, node_path_1.relative)(root, path).replaceAll('\\', '/');
|
|
19
|
+
hash.update(`F\0${name}\0${info.size}\0`);
|
|
20
|
+
await new Promise((resolvePromise, rejectPromise) => {
|
|
21
|
+
const stream = (0, node_fs_1.createReadStream)(path);
|
|
22
|
+
stream.on('data', (chunk) => hash.update(chunk));
|
|
23
|
+
stream.on('error', rejectPromise);
|
|
24
|
+
stream.on('end', resolvePromise);
|
|
25
|
+
});
|
|
26
|
+
return info.size;
|
|
27
|
+
}
|
|
28
|
+
async function hashDirectoryTree(root, current, hash, counter) {
|
|
29
|
+
let sizeBytes = 0;
|
|
30
|
+
for (const entry of (0, node_fs_1.readdirSync)(current, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
31
|
+
const path = (0, node_path_1.join)(current, entry.name);
|
|
32
|
+
if (entry.isSymbolicLink())
|
|
33
|
+
throw new Error(`Bridge directory sources may not contain symlinks: ${path}`);
|
|
34
|
+
if (entry.isDirectory()) {
|
|
35
|
+
if (!isBridgeDirectoryExcluded(entry.name)) {
|
|
36
|
+
counter.directories += 1;
|
|
37
|
+
hash.update(`D\0${(0, node_path_1.relative)(root, path).replaceAll('\\', '/')}\0`);
|
|
38
|
+
sizeBytes += await hashDirectoryTree(root, path, hash, counter);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else if (entry.isFile()) {
|
|
42
|
+
counter.files += 1;
|
|
43
|
+
sizeBytes += await hashDirectoryFile(root, path, hash);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return sizeBytes;
|
|
47
|
+
}
|
|
48
|
+
async function hashDirectory(root) {
|
|
49
|
+
const hash = (0, node_crypto_1.createHash)('sha256');
|
|
50
|
+
const counter = { files: 0, directories: 0 };
|
|
51
|
+
const sizeBytes = await hashDirectoryTree(root, root, hash, counter);
|
|
52
|
+
return {
|
|
53
|
+
sha256: hash.digest('hex'),
|
|
54
|
+
sizeBytes,
|
|
55
|
+
fileCount: counter.files,
|
|
56
|
+
directoryCount: counter.directories,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function directoryKind(path) {
|
|
60
|
+
const names = (0, node_fs_1.readdirSync)(path, { withFileTypes: true }).map((entry) => entry.name);
|
|
61
|
+
const uproject = names.find((name) => name.toLowerCase().endsWith('.uproject'));
|
|
62
|
+
if (uproject)
|
|
63
|
+
return { kind: 'unreal.project', evidence: [`found ${uproject}`] };
|
|
64
|
+
if ((0, node_fs_1.existsSync)((0, node_path_1.join)(path, 'ProjectSettings', 'ProjectVersion.txt')) && (0, node_fs_1.existsSync)((0, node_path_1.join)(path, 'Assets'))) {
|
|
65
|
+
return { kind: 'unity.project', evidence: ['found Assets/ and ProjectSettings/ProjectVersion.txt'] };
|
|
66
|
+
}
|
|
67
|
+
if ((0, node_fs_1.existsSync)((0, node_path_1.join)(path, 'project.godot')))
|
|
68
|
+
return { kind: 'godot.project', evidence: ['found project.godot'] };
|
|
69
|
+
return { kind: 'directory.unknown', evidence: ['no supported engine project marker found'] };
|
|
70
|
+
}
|
|
71
|
+
function fileKind(path) {
|
|
72
|
+
switch ((0, node_path_1.extname)(path).toLowerCase()) {
|
|
73
|
+
case '.glb': return 'format.glb';
|
|
74
|
+
case '.gltf': return 'format.gltf';
|
|
75
|
+
case '.fbx': return 'format.fbx';
|
|
76
|
+
case '.obj': return 'format.obj';
|
|
77
|
+
case '.usd':
|
|
78
|
+
case '.usda':
|
|
79
|
+
case '.usdc': return 'format.usd';
|
|
80
|
+
case '.usdz': return 'format.usdz';
|
|
81
|
+
case '.vrm': return 'format.vrm';
|
|
82
|
+
case '.png':
|
|
83
|
+
case '.jpg':
|
|
84
|
+
case '.jpeg':
|
|
85
|
+
case '.webp':
|
|
86
|
+
case '.tga':
|
|
87
|
+
case '.dds':
|
|
88
|
+
case '.ktx':
|
|
89
|
+
case '.ktx2': return 'format.image';
|
|
90
|
+
case '.wav':
|
|
91
|
+
case '.ogg':
|
|
92
|
+
case '.mp3':
|
|
93
|
+
case '.flac':
|
|
94
|
+
case '.m4a': return 'format.audio';
|
|
95
|
+
default: return 'file.unknown';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function suggestedType(kind, inspection) {
|
|
99
|
+
if (kind === 'metahuman.face' || kind === 'format.vrm' || (inspection?.skinCount ?? 0) > 0)
|
|
100
|
+
return 'character';
|
|
101
|
+
if (kind.endsWith('.project') || kind === 'format.obj')
|
|
102
|
+
return 'scene';
|
|
103
|
+
if ((inspection?.animationCount ?? 0) > 0 && (inspection?.meshCount ?? 0) === 0)
|
|
104
|
+
return 'animation';
|
|
105
|
+
return 'asset';
|
|
106
|
+
}
|
|
107
|
+
async function detectBridgeSource(source) {
|
|
108
|
+
const path = (0, node_path_1.resolve)(source);
|
|
109
|
+
if (!(0, node_fs_1.existsSync)(path))
|
|
110
|
+
throw new Error(`Bridge source does not exist: ${path}`);
|
|
111
|
+
const info = (0, node_fs_1.statSync)(path);
|
|
112
|
+
if (!info.isFile() && !info.isDirectory())
|
|
113
|
+
throw new Error(`Bridge source must be a regular file or directory: ${path}`);
|
|
114
|
+
if (info.isDirectory()) {
|
|
115
|
+
const detected = directoryKind(path);
|
|
116
|
+
const fingerprint = await hashDirectory(path);
|
|
117
|
+
return {
|
|
118
|
+
schemaVersion: types_1.BRIDGE_DETECTION_SCHEMA,
|
|
119
|
+
source: path,
|
|
120
|
+
sourceKind: detected.kind,
|
|
121
|
+
suggestedType: suggestedType(detected.kind),
|
|
122
|
+
confidence: detected.kind === 'directory.unknown' ? 0.2 : 1,
|
|
123
|
+
evidence: detected.evidence,
|
|
124
|
+
...fingerprint,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
let kind = fileKind(path);
|
|
128
|
+
const evidence = [`extension ${(0, node_path_1.extname)(path).toLowerCase() || '(none)'}`];
|
|
129
|
+
let inspection;
|
|
130
|
+
if (kind === 'format.glb' || kind === 'format.vrm') {
|
|
131
|
+
const gltf = (0, glb_1.readGlbJson)(path, info.size);
|
|
132
|
+
inspection = (0, glb_1.inspectGlbJson)(gltf);
|
|
133
|
+
evidence.push(`${inspection.meshCount} mesh(es), ${inspection.skinCount} skin(s), ${inspection.animationCount} animation(s)`);
|
|
134
|
+
if (inspection.nodeNames.some((name) => /FaceMesh/i.test(name)) &&
|
|
135
|
+
inspection.materialNames.some((name) => /MI_Eye[LR]_Baked/i.test(name))) {
|
|
136
|
+
kind = 'metahuman.face';
|
|
137
|
+
evidence.push('MetaHuman FaceMesh and baked eye materials');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
schemaVersion: types_1.BRIDGE_DETECTION_SCHEMA,
|
|
142
|
+
source: path,
|
|
143
|
+
sourceKind: kind,
|
|
144
|
+
suggestedType: suggestedType(kind, inspection),
|
|
145
|
+
confidence: kind === 'file.unknown' ? 0.1 : kind === 'format.fbx' ? 0.8 : 1,
|
|
146
|
+
evidence: [`${(0, node_path_1.basename)(path)}: ${evidence.join('; ')}`],
|
|
147
|
+
sha256: await (0, hash_1.sha256File)(path),
|
|
148
|
+
sizeBytes: info.size,
|
|
149
|
+
...(inspection ? { inspection } : {}),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/bridge/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type BridgeImportOptions, type BridgeImportResult } from './types';
|
|
2
|
+
export { BRIDGE_MAX_FBX_RAW_TEXTURE_BYTES, discoverGltfDependencies, readBridgeSiblingTextures, } from './internal/snapshots';
|
|
3
|
+
export declare function importWithBridge(source: string, options?: BridgeImportOptions): Promise<BridgeImportResult>;
|