@vgai/engine 0.5.10 → 0.5.12
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 +6 -5
- package/dist/adapter/authoring.d.ts +51 -28
- package/dist/adapter/authoring.d.ts.map +1 -1
- package/dist/adapter/body-marks.d.ts +59 -0
- package/dist/adapter/body-marks.d.ts.map +1 -0
- package/dist/adapter/body-marks.js +62 -0
- package/dist/adapter/constraint.d.ts +41 -0
- package/dist/adapter/constraint.d.ts.map +1 -0
- package/dist/adapter/constraint.js +27 -0
- package/dist/adapter/hierarchy-marks.d.ts +138 -0
- package/dist/adapter/hierarchy-marks.d.ts.map +1 -0
- package/dist/adapter/hierarchy-marks.js +148 -0
- package/dist/adapter/index.d.ts +1 -1
- package/dist/adapter/index.d.ts.map +1 -1
- package/dist/adapter/ingest/contract-system-adapters.d.ts +64 -0
- package/dist/adapter/ingest/contract-system-adapters.d.ts.map +1 -0
- package/dist/adapter/ingest/contract-system-adapters.js +134 -0
- package/dist/adapter/ingest/game-contract.d.ts +89 -5
- package/dist/adapter/ingest/game-contract.d.ts.map +1 -1
- package/dist/adapter/ingest/game-contract.js +11 -3
- package/dist/adapter/ingest/scene-capture.d.ts +31 -4
- package/dist/adapter/ingest/scene-capture.d.ts.map +1 -1
- package/dist/adapter/ingest/scene-capture.js +29 -7
- package/dist/adapter/ingest/structural-ids.d.ts +1 -1
- package/dist/adapter/ingest/structural-ids.js +2 -2
- package/dist/adapter/reflection-probe.d.ts +53 -0
- package/dist/adapter/reflection-probe.d.ts.map +1 -0
- package/dist/adapter/reflection-probe.js +18 -0
- package/dist/asset-formats/index.d.ts +4 -10
- package/dist/asset-formats/index.d.ts.map +1 -1
- package/dist/asset-formats/index.js +3 -8
- package/dist/asset-formats/material.d.ts +0 -66
- package/dist/asset-formats/material.d.ts.map +1 -1
- package/dist/asset-formats/material.js +0 -8
- package/dist/asset-formats/mesh.d.ts +1 -2
- package/dist/asset-formats/mesh.d.ts.map +1 -1
- package/dist/asset-formats/mesh.js +3 -13
- package/dist/asset-formats/render-env.d.ts +2 -2
- package/dist/asset-parse-error.d.ts +4 -5
- package/dist/asset-parse-error.d.ts.map +1 -1
- package/dist/asset-parse-error.js +4 -5
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -0
- package/dist/data/curve.d.ts +116 -0
- package/dist/data/curve.d.ts.map +1 -0
- package/dist/data/curve.js +230 -0
- package/dist/data/vite-plugin-data.d.ts +2 -2
- package/dist/data/vite-plugin-data.d.ts.map +1 -1
- package/dist/data/vite-plugin-data.js +24 -15
- package/dist/dev/performance-profiler.d.ts +1 -0
- package/dist/dev/performance-profiler.d.ts.map +1 -1
- package/dist/dev/performance-profiler.js +25 -2
- package/dist/dev/register-render-vitals.d.ts +18 -7
- package/dist/dev/register-render-vitals.d.ts.map +1 -1
- package/dist/dev/register-render-vitals.js +35 -8
- package/dist/ecs/user-data.d.ts +49 -1
- package/dist/ecs/user-data.d.ts.map +1 -1
- package/dist/ecs/user-data.js +34 -0
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/manifest/index.d.ts +3 -3
- package/dist/manifest/index.d.ts.map +1 -1
- package/dist/manifest/index.js +2 -2
- package/dist/manifest/load.d.ts +20 -63
- package/dist/manifest/load.d.ts.map +1 -1
- package/dist/manifest/load.js +12 -103
- package/dist/manifest/schema.d.ts +21 -103
- package/dist/manifest/schema.d.ts.map +1 -1
- package/dist/manifest/schema.js +66 -142
- package/dist/pixi/index.d.ts +2 -3
- package/dist/pixi/index.d.ts.map +1 -1
- package/dist/pixi/index.js +2 -3
- package/dist/pixi/ingest.d.ts +7 -75
- package/dist/pixi/ingest.d.ts.map +1 -1
- package/dist/pixi/ingest.js +6 -14
- package/dist/pixi/scene-capture.d.ts +2 -2
- package/dist/pixi/scene-capture.js +2 -2
- package/dist/react/use-data.d.ts +10 -5
- package/dist/react/use-data.d.ts.map +1 -1
- package/dist/react/use-data.js +15 -15
- package/dist/render/viewport-shading.d.ts +1 -1
- package/dist/render/viewport-shading.d.ts.map +1 -1
- package/dist/render/viewport-shading.js +14 -0
- package/dist/runtime/create-runtime.d.ts +12 -0
- package/dist/runtime/create-runtime.d.ts.map +1 -1
- package/dist/runtime/create-runtime.js +7 -2
- package/dist/runtime/mount-game.d.ts +1 -1
- package/dist/runtime/mount-game.d.ts.map +1 -1
- package/dist/runtime/mount-manifest.d.ts.map +1 -1
- package/dist/runtime/mount-manifest.js +5 -1
- package/dist/world3d-react/r3f-adapter.d.ts.map +1 -1
- package/dist/world3d-react/r3f-adapter.js +129 -6
- package/dist/world3d-react/renderer-config.d.ts +15 -0
- package/dist/world3d-react/renderer-config.d.ts.map +1 -1
- package/dist/world3d-react/renderer-config.js +15 -0
- package/dist/world3d-react/world-context.d.ts +11 -1
- package/dist/world3d-react/world-context.d.ts.map +1 -1
- package/dist/world3d-react/world-context.js +1 -0
- package/dist-config/config.js +140 -20
- package/dist-config/config.js.map +4 -4
- package/package.json +1 -1
- package/schemas/engine-capabilities.json +10 -10
- package/schemas/vgai-project.schema.json +22 -73
- package/src/adapter/authoring.ts +54 -31
- package/src/adapter/body-marks.ts +69 -0
- package/src/adapter/constraint.ts +71 -0
- package/src/adapter/hierarchy-marks.ts +155 -0
- package/src/adapter/index.ts +2 -3
- package/src/adapter/ingest/contract-system-adapters.ts +174 -0
- package/src/adapter/ingest/game-contract.ts +104 -6
- package/src/adapter/ingest/scene-capture.ts +61 -11
- package/src/adapter/ingest/structural-ids.ts +2 -2
- package/src/adapter/reflection-probe.ts +75 -0
- package/src/asset-formats/index.ts +4 -10
- package/src/asset-formats/material.ts +0 -11
- package/src/asset-formats/mesh.ts +3 -16
- package/src/asset-parse-error.ts +4 -5
- package/src/config.ts +13 -0
- package/src/data/curve.ts +263 -0
- package/src/data/vite-plugin-data.ts +48 -14
- package/src/dev/performance-profiler.ts +21 -2
- package/src/dev/register-render-vitals.ts +38 -8
- package/src/ecs/user-data.ts +50 -0
- package/src/index.ts +2 -3
- package/src/manifest/index.ts +3 -15
- package/src/manifest/load.ts +33 -139
- package/src/manifest/schema.ts +72 -181
- package/src/pixi/index.ts +2 -15
- package/src/pixi/ingest.ts +13 -87
- package/src/pixi/scene-capture.ts +2 -2
- package/src/react/use-data.ts +15 -20
- package/src/render/viewport-shading.ts +16 -1
- package/src/runtime/create-runtime.ts +30 -5
- package/src/runtime/mount-game.ts +1 -1
- package/src/runtime/mount-manifest.ts +5 -1
- package/src/world3d-react/r3f-adapter.tsx +142 -6
- package/src/world3d-react/renderer-config.ts +31 -0
- package/src/world3d-react/world-context.ts +11 -1
- package/dist/asset-formats/instances.d.ts +0 -17
- package/dist/asset-formats/instances.d.ts.map +0 -1
- package/dist/asset-formats/instances.js +0 -31
- package/dist/asset-formats/parse.d.ts +0 -20
- package/dist/asset-formats/parse.d.ts.map +0 -1
- package/dist/asset-formats/parse.js +0 -34
- package/dist/pixi/ingest-iframe.d.ts +0 -82
- package/dist/pixi/ingest-iframe.d.ts.map +0 -1
- package/dist/pixi/ingest-iframe.js +0 -166
- package/dist/render/instance-mesh.d.ts +0 -5
- package/dist/render/instance-mesh.d.ts.map +0 -1
- package/dist/render/instance-mesh.js +0 -19
- package/schemas/mat.schema.json +0 -255
- package/src/asset-formats/instances.ts +0 -38
- package/src/asset-formats/parse.ts +0 -39
- package/src/pixi/ingest-iframe.ts +0 -255
- package/src/render/instance-mesh.ts +0 -25
package/dist/ecs/user-data.js
CHANGED
|
@@ -76,12 +76,39 @@
|
|
|
76
76
|
* implementation parts without adding wrappers.
|
|
77
77
|
* - `authoringLabel` — authored literal name (or component tag fallback)
|
|
78
78
|
* for that source-backed component instance.
|
|
79
|
+
* - `authoringComponent` — exact source component identity for portable-CSF
|
|
80
|
+
* association; unlike the label, never user-facing copy.
|
|
81
|
+
* - `authoringDocument` — generic reference to the project-tool document
|
|
82
|
+
* that owns this scene instance's authored asset.
|
|
79
83
|
* - `editorHelper` — `true` for editor-only helper objects (gizmos, wireframes).
|
|
84
|
+
*
|
|
85
|
+
* Hierarchy-presentation convention (written by GAME code, read by the editor —
|
|
86
|
+
* see `../adapter/hierarchy-marks.ts`, which is the ONLY place these two are
|
|
87
|
+
* read/written from; the `vgai` prefix marks them as the HOST's namespace on a
|
|
88
|
+
* node a game owns, unlike every other key above, which the engine/editor also
|
|
89
|
+
* write):
|
|
90
|
+
* - `vgaiComponentRoot` — display name of the component instance this subtree
|
|
91
|
+
* IS. The node renders as one collapsed, expandable
|
|
92
|
+
* row named for it.
|
|
93
|
+
* - `vgaiBuiltInternal` — `true` on the ROOT of a subtree runtime code
|
|
94
|
+
* CONSTRUCTED rather than authored (skeleton bones,
|
|
95
|
+
* particle renderers). Subtree-scoped: everything
|
|
96
|
+
* below a marked node is built-internal too.
|
|
97
|
+
* - `vgaiBodyOwner` — the rigid body that OWNS this node's pose, written
|
|
98
|
+
* by the code that attaches the body (see
|
|
99
|
+
* `../adapter/body-marks.ts`, the only reader/writer).
|
|
100
|
+
* A transform edit on such a node must be applied to
|
|
101
|
+
* the BODY, or the next physics step writes the node
|
|
102
|
+
* straight back.
|
|
80
103
|
* - `editorHelperType` — which kind of helper (lights/particles/pivot/navmesh/...).
|
|
81
104
|
* - `editorIcon` — `true` for editor billboard icon sprites.
|
|
82
105
|
* - `skeletonVisible` — per-entity editor preference for its bone overlay.
|
|
83
106
|
* - `skeletonEnabled` — resolved visibility preference on a skeleton helper.
|
|
84
107
|
* - `envObject` — `true` for environment objects (ambient light, etc.).
|
|
108
|
+
* - `reflectionProbe` — live project-owned reflection probe projected from
|
|
109
|
+
* JSX props for renderer/editor integration.
|
|
110
|
+
* - `constraints` — live project-owned spatial constraints projected
|
|
111
|
+
* into the shared Inspector and viewport.
|
|
85
112
|
* - `splineControlPoint` — index of a spline control-point drag handle.
|
|
86
113
|
* - `vcDirIdx` — view-cube face direction index (0=+X,1=-X,2=+Y,...).
|
|
87
114
|
*/
|
|
@@ -115,12 +142,19 @@ export const UserDataKeys = {
|
|
|
115
142
|
authoringRoot: 'authoringRoot',
|
|
116
143
|
authoringInstance: 'authoringInstance',
|
|
117
144
|
authoringLabel: 'authoringLabel',
|
|
145
|
+
vgaiComponentRoot: 'vgaiComponentRoot',
|
|
146
|
+
vgaiBuiltInternal: 'vgaiBuiltInternal',
|
|
147
|
+
vgaiBodyOwner: 'vgaiBodyOwner',
|
|
148
|
+
authoringComponent: 'authoringComponent',
|
|
149
|
+
authoringDocument: 'authoringDocument',
|
|
118
150
|
editorHelper: 'editorHelper',
|
|
119
151
|
editorHelperType: 'editorHelperType',
|
|
120
152
|
editorIcon: 'editorIcon',
|
|
121
153
|
skeletonVisible: 'skeletonVisible',
|
|
122
154
|
skeletonEnabled: 'skeletonEnabled',
|
|
123
155
|
envObject: 'envObject',
|
|
156
|
+
constraints: 'constraints',
|
|
157
|
+
reflectionProbe: 'reflectionProbe',
|
|
124
158
|
vcDirIdx: 'vcDirIdx',
|
|
125
159
|
navPathPoints: 'navPathPoints',
|
|
126
160
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -20,14 +20,13 @@
|
|
|
20
20
|
* - game setup contract: `GameContext`/`GameCleanup`/`GameSetupFn`, `fromSetup`
|
|
21
21
|
* - surface vocabulary: `AdapterSurface`
|
|
22
22
|
* - manifest-driven mount: `mountManifestRoots` + its option/result types
|
|
23
|
-
* - asset-format entry points: `parseMaterialFile` (.mat.json), `parseInstancesFile`
|
|
24
23
|
* - game manifest (vgai.project.json) entry point: `loadGameManifest`
|
|
25
24
|
*/
|
|
26
25
|
export type { AdapterSurface } from './adapter/adapter-surface';
|
|
27
26
|
export { fromSetup } from './adapter/setup-three-root-adapter';
|
|
28
|
-
export { AssetParseError
|
|
27
|
+
export { AssetParseError } from './asset-parse-error';
|
|
29
28
|
export type { AdapterRoot, GameManifest, ResolvedAdapter, ResolvedAdapterRoot, ResolvedGameManifest, RootAdapter, } from './manifest';
|
|
30
|
-
export {
|
|
29
|
+
export { DEFAULT_SERVER_MODULE, loadGameManifest } from './manifest';
|
|
31
30
|
export type { GameSession } from './runtime/create-runtime';
|
|
32
31
|
export type { MountEntry, MountedManifestSession, MountManifestOptions, } from './runtime/mount-manifest';
|
|
33
32
|
export { mountManifestRoots } from './runtime/mount-manifest';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACrE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,YAAY,EACV,UAAU,EACV,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -20,10 +20,9 @@
|
|
|
20
20
|
* - game setup contract: `GameContext`/`GameCleanup`/`GameSetupFn`, `fromSetup`
|
|
21
21
|
* - surface vocabulary: `AdapterSurface`
|
|
22
22
|
* - manifest-driven mount: `mountManifestRoots` + its option/result types
|
|
23
|
-
* - asset-format entry points: `parseMaterialFile` (.mat.json), `parseInstancesFile`
|
|
24
23
|
* - game manifest (vgai.project.json) entry point: `loadGameManifest`
|
|
25
24
|
*/
|
|
26
25
|
export { fromSetup } from './adapter/setup-three-root-adapter';
|
|
27
|
-
export { AssetParseError
|
|
28
|
-
export {
|
|
26
|
+
export { AssetParseError } from './asset-parse-error';
|
|
27
|
+
export { DEFAULT_SERVER_MODULE, loadGameManifest } from './manifest';
|
|
29
28
|
export { mountManifestRoots } from './runtime/mount-manifest';
|
package/dist/manifest/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { isManifestFilename, MANIFEST_FILENAME, REMOVED_MANIFEST_FILENAME, removedManifestFilenameMessage, } from './filename';
|
|
2
2
|
export type { ResolvedAdapter, ResolvedAdapterRoot, ResolvedGameManifest } from './load';
|
|
3
|
-
export {
|
|
4
|
-
export type { AdapterRoot, GameManifest,
|
|
5
|
-
export { AdapterRootSchema, GameManifestSchema,
|
|
3
|
+
export { DEFAULT_SERVER_MODULE, loadGameManifest } from './load';
|
|
4
|
+
export type { AdapterRoot, GameManifest, RootAdapter } from './schema';
|
|
5
|
+
export { AdapterRootSchema, GameManifestSchema, RootAdapterSchema } from './schema';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AACzF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AACzF,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/manifest/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Game manifest (vgai.project.json) — schema + loader (T3.1 slice
|
|
2
2
|
// 1)..
|
|
3
3
|
export { isManifestFilename, MANIFEST_FILENAME, REMOVED_MANIFEST_FILENAME, removedManifestFilenameMessage, } from './filename';
|
|
4
|
-
export {
|
|
5
|
-
export { AdapterRootSchema, GameManifestSchema,
|
|
4
|
+
export { DEFAULT_SERVER_MODULE, loadGameManifest } from './load';
|
|
5
|
+
export { AdapterRootSchema, GameManifestSchema, RootAdapterSchema } from './schema';
|
|
6
6
|
// `loadGameManifestFile` (Node-only, reads `path` via `node:fs`) is
|
|
7
7
|
// deliberately NOT re-exported here — this barrel must stay import-safe for
|
|
8
8
|
// browser bundles. Import it directly from `@engine/manifest/load-file` in
|
package/dist/manifest/load.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type LearnMetadata } from './schema';
|
|
2
2
|
/** D6's resolved adapter identities. */
|
|
3
3
|
export type ResolvedAdapter = {
|
|
4
4
|
readonly type: 'builtin';
|
|
@@ -13,18 +13,24 @@ export type ResolvedAdapter = {
|
|
|
13
13
|
readonly type: 'ingest';
|
|
14
14
|
readonly identity: 'ingest-three' | 'ingest-pixi' | 'ingest-react';
|
|
15
15
|
readonly surface: 'three' | 'canvas' | 'dom';
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Project-relative ES module declaring `window.vgaiGame` beside a
|
|
18
|
+
* pristine copy. OPTIONAL rather than required-and-possibly-undefined
|
|
19
|
+
* (the shape its siblings above use) because most ingested games have
|
|
20
|
+
* nothing to say about it, and requiring the key would only make every
|
|
21
|
+
* construction site say `undefined`.
|
|
22
|
+
*/
|
|
23
|
+
readonly contractShim?: string | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Project-relative ES module that writes this game'''s own DATA file back
|
|
26
|
+
* (see the field'''s schema description). Same OPTIONAL shape and same
|
|
27
|
+
* reason as {@link contractShim}: a game whose truth is entirely source
|
|
28
|
+
* declares nothing here.
|
|
29
|
+
*/
|
|
30
|
+
readonly dataWriter?: string | undefined;
|
|
18
31
|
readonly assets: Record<string, string> | undefined;
|
|
19
32
|
readonly domStubs: string[] | undefined;
|
|
20
33
|
readonly captureTimeoutMs: number | undefined;
|
|
21
|
-
/** Iframe-reachable-multi mount fields. */
|
|
22
|
-
readonly bundleUrl: string | undefined;
|
|
23
|
-
readonly baseHref: string | undefined;
|
|
24
|
-
readonly assetBaseUrl: string | undefined;
|
|
25
|
-
readonly extraDeps: string[] | undefined;
|
|
26
|
-
readonly pixiModuleUrl: string | undefined;
|
|
27
|
-
readonly bodyHtml: string | undefined;
|
|
28
34
|
};
|
|
29
35
|
export interface ResolvedAdapterRoot {
|
|
30
36
|
readonly id: string;
|
|
@@ -38,11 +44,6 @@ export interface ResolvedAdapterRoot {
|
|
|
38
44
|
* `manifest/schema.ts`'s `dev` field for the four readers. */
|
|
39
45
|
readonly dev: boolean;
|
|
40
46
|
readonly loop: 'gated' | 'self-driven';
|
|
41
|
-
/** Every optional resolved: both contexts always present (§4/§5). */
|
|
42
|
-
readonly capabilities: {
|
|
43
|
-
readonly local: Tier;
|
|
44
|
-
readonly hosted: Tier;
|
|
45
|
-
};
|
|
46
47
|
}
|
|
47
48
|
export interface ResolvedGameManifest {
|
|
48
49
|
readonly manifestVersion: 2;
|
|
@@ -62,6 +63,10 @@ export interface ResolvedGameManifest {
|
|
|
62
63
|
readonly width: number;
|
|
63
64
|
readonly height: number;
|
|
64
65
|
} | undefined;
|
|
66
|
+
/** Construction-time renderer properties no world can declare for itself — see the schema. */
|
|
67
|
+
readonly rendering: {
|
|
68
|
+
readonly antialias: boolean;
|
|
69
|
+
} | undefined;
|
|
65
70
|
readonly authoring: {
|
|
66
71
|
readonly hierarchy?: {
|
|
67
72
|
readonly rootLabels?: Readonly<Record<string, string>> | undefined;
|
|
@@ -101,54 +106,6 @@ export interface ResolvedGameManifest {
|
|
|
101
106
|
* gallery/wizard/Learn-catalog registries. */
|
|
102
107
|
readonly learn: LearnMetadata | undefined;
|
|
103
108
|
}
|
|
104
|
-
/**
|
|
105
|
-
* Ceiling (maximum legal declared `Tier`) per adapter type and delivery
|
|
106
|
-
* context. `default` roots are always first-party in both contexts (D6/§2 —
|
|
107
|
-
* a first-party root is fully vgai-native everywhere). `ingest` roots are
|
|
108
|
-
* ceilinged by their own capture `strategy`: locally the local CLI's Vite
|
|
109
|
-
* pipeline gives bundler dedupe, so every strategy reaches its own natural
|
|
110
|
-
* rung; hosted has no bundler (esbuild-wasm + externals only), and a
|
|
111
|
-
* `deduped` root is DEFINED by being source built through our pipeline — no
|
|
112
|
-
* prebuilt bundle exists to fall back to an iframe rung, and nothing
|
|
113
|
-
* implements a hosted build for it, so hosted is `unsupported` (honesty over
|
|
114
|
-
* optimism; if the hosted esbuild-wasm path ever proves capable, raising
|
|
115
|
-
* this ceiling is a non-breaking widening). `shared`/`iframe-reachable`/
|
|
116
|
-
* `opaque-embed` don't depend on a bundler either way, so they carry through
|
|
117
|
-
* unchanged. `module` adapters have no derivable ceiling ("a custom
|
|
118
|
-
* adapter's reach is not derivable", §4) — modeled here as `first-party`
|
|
119
|
-
* (the top rank), i.e. no ceiling actually constrains a module adapter's
|
|
120
|
-
* declared tier; the loader instead requires the tier to be declared
|
|
121
|
-
* explicitly for module roots (see `resolveCapabilities`), since there is no
|
|
122
|
-
* default to derive.
|
|
123
|
-
*/
|
|
124
|
-
export declare const CAPABILITY_CEILINGS: {
|
|
125
|
-
readonly builtin: {
|
|
126
|
-
readonly local: "first-party";
|
|
127
|
-
readonly hosted: "first-party";
|
|
128
|
-
};
|
|
129
|
-
readonly ingest: {
|
|
130
|
-
readonly shared: {
|
|
131
|
-
readonly local: "shared";
|
|
132
|
-
readonly hosted: "shared";
|
|
133
|
-
};
|
|
134
|
-
readonly deduped: {
|
|
135
|
-
readonly local: "deduped";
|
|
136
|
-
readonly hosted: "unsupported";
|
|
137
|
-
};
|
|
138
|
-
readonly 'iframe-reachable': {
|
|
139
|
-
readonly local: "iframe-reachable";
|
|
140
|
-
readonly hosted: "iframe-reachable";
|
|
141
|
-
};
|
|
142
|
-
readonly 'opaque-embed': {
|
|
143
|
-
readonly local: "opaque-embed";
|
|
144
|
-
readonly hosted: "opaque-embed";
|
|
145
|
-
};
|
|
146
|
-
};
|
|
147
|
-
readonly module: {
|
|
148
|
-
readonly local: "first-party";
|
|
149
|
-
readonly hosted: "first-party";
|
|
150
|
-
};
|
|
151
|
-
};
|
|
152
109
|
/** Default relative path for `server.module` when omitted (§3) — the scaffolded Colyseus bootstrap. */
|
|
153
110
|
export declare const DEFAULT_SERVER_MODULE = "server/colyseus-setup.ts";
|
|
154
111
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/manifest/load.ts"],"names":[],"mappings":"AAeA,OAAO,EAIL,KAAK,
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/manifest/load.ts"],"names":[],"mappings":"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"}
|
package/dist/manifest/load.js
CHANGED
|
@@ -13,49 +13,6 @@
|
|
|
13
13
|
// wrapper that reads a path and calls this function, so browser bundles that
|
|
14
14
|
// only need `loadGameManifest` never pull in `node:fs`.
|
|
15
15
|
import { GameManifestSchema, } from './schema';
|
|
16
|
-
// ---------------------------------------------------------------------------
|
|
17
|
-
// §4 — the per-context ceiling table (named + exported so the tier-table test
|
|
18
|
-
// can pin its rows against this).
|
|
19
|
-
// ---------------------------------------------------------------------------
|
|
20
|
-
/**
|
|
21
|
-
* Ceiling (maximum legal declared `Tier`) per adapter type and delivery
|
|
22
|
-
* context. `default` roots are always first-party in both contexts (D6/§2 —
|
|
23
|
-
* a first-party root is fully vgai-native everywhere). `ingest` roots are
|
|
24
|
-
* ceilinged by their own capture `strategy`: locally the local CLI's Vite
|
|
25
|
-
* pipeline gives bundler dedupe, so every strategy reaches its own natural
|
|
26
|
-
* rung; hosted has no bundler (esbuild-wasm + externals only), and a
|
|
27
|
-
* `deduped` root is DEFINED by being source built through our pipeline — no
|
|
28
|
-
* prebuilt bundle exists to fall back to an iframe rung, and nothing
|
|
29
|
-
* implements a hosted build for it, so hosted is `unsupported` (honesty over
|
|
30
|
-
* optimism; if the hosted esbuild-wasm path ever proves capable, raising
|
|
31
|
-
* this ceiling is a non-breaking widening). `shared`/`iframe-reachable`/
|
|
32
|
-
* `opaque-embed` don't depend on a bundler either way, so they carry through
|
|
33
|
-
* unchanged. `module` adapters have no derivable ceiling ("a custom
|
|
34
|
-
* adapter's reach is not derivable", §4) — modeled here as `first-party`
|
|
35
|
-
* (the top rank), i.e. no ceiling actually constrains a module adapter's
|
|
36
|
-
* declared tier; the loader instead requires the tier to be declared
|
|
37
|
-
* explicitly for module roots (see `resolveCapabilities`), since there is no
|
|
38
|
-
* default to derive.
|
|
39
|
-
*/
|
|
40
|
-
export const CAPABILITY_CEILINGS = {
|
|
41
|
-
builtin: { local: 'first-party', hosted: 'first-party' },
|
|
42
|
-
ingest: {
|
|
43
|
-
shared: { local: 'shared', hosted: 'shared' },
|
|
44
|
-
deduped: { local: 'deduped', hosted: 'unsupported' },
|
|
45
|
-
'iframe-reachable': { local: 'iframe-reachable', hosted: 'iframe-reachable' },
|
|
46
|
-
'opaque-embed': { local: 'opaque-embed', hosted: 'opaque-embed' },
|
|
47
|
-
},
|
|
48
|
-
module: { local: 'first-party', hosted: 'first-party' },
|
|
49
|
-
};
|
|
50
|
-
/** Total order over `Tier` (§4: `first-party > shared ≈ deduped > iframe-reachable > opaque-embed > unsupported`). */
|
|
51
|
-
const TIER_RANK = {
|
|
52
|
-
'first-party': 5,
|
|
53
|
-
shared: 4,
|
|
54
|
-
deduped: 4,
|
|
55
|
-
'iframe-reachable': 3,
|
|
56
|
-
'opaque-embed': 2,
|
|
57
|
-
unsupported: 1,
|
|
58
|
-
};
|
|
59
16
|
/** Default relative path for `server.module` when omitted (§3) — the scaffolded Colyseus bootstrap. */
|
|
60
17
|
export const DEFAULT_SERVER_MODULE = 'server/colyseus-setup.ts';
|
|
61
18
|
const SEMVER_RE = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z-.]+)?(?:\+[0-9A-Za-z-.]+)?$/;
|
|
@@ -84,16 +41,11 @@ function checkAdapterEntryRules(root) {
|
|
|
84
41
|
throw new Error(`Game manifest: root "${root.id}" uses the '${adapter}' adapter but declares no ` +
|
|
85
42
|
'`entry` — a built-in adapter root is authored as an entry module.');
|
|
86
43
|
}
|
|
44
|
+
if (typeof adapter === 'object' && 'ingest' in adapter && !root.entry) {
|
|
45
|
+
throw new Error(`Game manifest: root "${root.id}" is an { ingest } root but declares no \`entry\` — the ` +
|
|
46
|
+
"game's own entry module is what the host imports.");
|
|
47
|
+
}
|
|
87
48
|
}
|
|
88
|
-
// Historical note (Track N, N1): this file used to reject EVERY `kind:
|
|
89
|
-
// 'react'` + `{ ingest }` root outright here (`checkReactAdapterRestriction`,
|
|
90
|
-
// citing "no react ingest program is un-parked"). Track N un-parks exactly
|
|
91
|
-
// that program — react+ingest is now a structurally legal combination,
|
|
92
|
-
// resolved to the `'ingest-react'` identity by `resolveAdapter` below like
|
|
93
|
-
// any other ingest root. There is nothing left to reject at THIS layer: the
|
|
94
|
-
// v1 "deduped strategy only" restriction is an editor-resolver concern (D-N3),
|
|
95
|
-
// not a manifest-shape concern — see the `ResolvedAdapter` type's comment
|
|
96
|
-
// above.
|
|
97
49
|
// ---------------------------------------------------------------------------
|
|
98
50
|
// Resolution (§5)
|
|
99
51
|
// ---------------------------------------------------------------------------
|
|
@@ -111,8 +63,7 @@ function resolveAdapter(root) {
|
|
|
111
63
|
};
|
|
112
64
|
}
|
|
113
65
|
// isIngestAdapter (Track N, N1: 'ingest-react' joins 'ingest-three'/
|
|
114
|
-
// 'ingest-pixi'
|
|
115
|
-
// this stays strategy-agnostic here).
|
|
66
|
+
// 'ingest-pixi').
|
|
116
67
|
const identity = adapter.surface === 'three'
|
|
117
68
|
? 'ingest-three'
|
|
118
69
|
: adapter.surface === 'canvas'
|
|
@@ -123,55 +74,13 @@ function resolveAdapter(root) {
|
|
|
123
74
|
type: 'ingest',
|
|
124
75
|
identity,
|
|
125
76
|
surface: adapter.surface,
|
|
126
|
-
|
|
127
|
-
|
|
77
|
+
contractShim: ingest.contractShim,
|
|
78
|
+
dataWriter: ingest.dataWriter,
|
|
128
79
|
assets: ingest.assets,
|
|
129
80
|
domStubs: ingest.domStubs,
|
|
130
81
|
captureTimeoutMs: ingest.captureTimeoutMs,
|
|
131
|
-
bundleUrl: ingest.bundleUrl,
|
|
132
|
-
baseHref: ingest.baseHref,
|
|
133
|
-
assetBaseUrl: ingest.assetBaseUrl,
|
|
134
|
-
extraDeps: ingest.extraDeps,
|
|
135
|
-
pixiModuleUrl: ingest.pixiModuleUrl,
|
|
136
|
-
bodyHtml: ingest.bodyHtml,
|
|
137
82
|
};
|
|
138
83
|
}
|
|
139
|
-
function ceilingFor(adapter, context) {
|
|
140
|
-
if (typeof adapter === 'string')
|
|
141
|
-
return CAPABILITY_CEILINGS.builtin[context];
|
|
142
|
-
if (isModuleAdapter(adapter))
|
|
143
|
-
return CAPABILITY_CEILINGS.module[context];
|
|
144
|
-
return CAPABILITY_CEILINGS.ingest[adapter.ingest.strategy][context];
|
|
145
|
-
}
|
|
146
|
-
function resolveCapabilities(root) {
|
|
147
|
-
const contexts = ['local', 'hosted'];
|
|
148
|
-
const result = {};
|
|
149
|
-
for (const context of contexts) {
|
|
150
|
-
const declared = root.capabilities?.[context];
|
|
151
|
-
if (declared !== undefined) {
|
|
152
|
-
const ceiling = ceilingFor(root.adapter, context);
|
|
153
|
-
if (TIER_RANK[declared] > TIER_RANK[ceiling]) {
|
|
154
|
-
throw new Error(`Game manifest: root "${root.id}": declared capabilities.${context} tier "${declared}" ` +
|
|
155
|
-
`exceeds the "${ceiling}" ceiling for this adapter in the ${context} context (§4). ` +
|
|
156
|
-
'Under-claiming (including `unsupported`) is legal; over-claiming is not.');
|
|
157
|
-
}
|
|
158
|
-
result[context] = declared;
|
|
159
|
-
continue;
|
|
160
|
-
}
|
|
161
|
-
// Omitted -> derive.
|
|
162
|
-
if (typeof root.adapter === 'string') {
|
|
163
|
-
result[context] = 'first-party';
|
|
164
|
-
}
|
|
165
|
-
else if (isModuleAdapter(root.adapter)) {
|
|
166
|
-
throw new Error(`Game manifest: root "${root.id}": { module } adapter requires an explicit ` +
|
|
167
|
-
`capabilities.${context} declaration — a custom adapter's reach is not derivable (§4).`);
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
result[context] = CAPABILITY_CEILINGS.ingest[root.adapter.ingest.strategy][context];
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
return result;
|
|
174
|
-
}
|
|
175
84
|
function checkEngineVersionPin(version) {
|
|
176
85
|
if (!SEMVER_RE.test(version)) {
|
|
177
86
|
throw new Error(`Game manifest: engine.version "${version}" is not a valid exact semver string (e.g. ` +
|
|
@@ -180,17 +89,17 @@ function checkEngineVersionPin(version) {
|
|
|
180
89
|
}
|
|
181
90
|
/**
|
|
182
91
|
* Resolve one already-Zod-validated root entry into its `ResolvedAdapterRoot`
|
|
183
|
-
* (adapter identity,
|
|
92
|
+
* (adapter identity, and a pass-through of every other field).
|
|
184
93
|
* Every `AdapterRoot` field participates here or in a check above:
|
|
185
94
|
* `id` drives uniqueness; `adapter` (incl. its surface and
|
|
186
|
-
* `module`/`ingest.*` sub-fields) drives identity
|
|
95
|
+
* `module`/`ingest.*` sub-fields) drives adapter identity
|
|
187
96
|
* resolution; `entry` drives the entry cross-field rule and is
|
|
188
97
|
* carried through; `zOrder` drives the final sort; `pausable`/`loop` are
|
|
189
98
|
* carried through as-is (their consumers are the runtime/CLI, T3.2/T3.3);
|
|
190
99
|
* `dev` is carried through for the four dev-layer readers (`mountManifestRoots`'s
|
|
191
100
|
* ship gate, the host's topmost stacking pass, the play compositor's capture
|
|
192
101
|
* exclusion, and the editor's chrome-not-content seam);
|
|
193
|
-
* `
|
|
102
|
+
* `description` (T3.3
|
|
194
103
|
* slice 3) is carried through as-is — its consumer today is
|
|
195
104
|
* `resolveIngestDescriptor` (packages/editor/src/adapter-resolver.ts), which
|
|
196
105
|
* threads an ingest-three root's description into `IngestGame.description`.
|
|
@@ -208,7 +117,6 @@ function resolveRoot(root) {
|
|
|
208
117
|
pausable: root.pausable,
|
|
209
118
|
dev: root.dev,
|
|
210
119
|
loop: root.loop,
|
|
211
|
-
capabilities: resolveCapabilities(root),
|
|
212
120
|
};
|
|
213
121
|
}
|
|
214
122
|
// ---------------------------------------------------------------------------
|
|
@@ -233,7 +141,7 @@ export function loadGameManifest(raw) {
|
|
|
233
141
|
// raw multi-issue dump, because each one already reads as a finished
|
|
234
142
|
// sentence naming the offending ids. Every other schema violation keeps
|
|
235
143
|
// propagating as the raw `ZodError` it always has (unchanged behavior,
|
|
236
|
-
// e.g.
|
|
144
|
+
// e.g. an unrecognized key or a bad `manifestVersion`).
|
|
237
145
|
const compositionIssue = parsed.error.issues.find((issue) => issue.message.startsWith('Game manifest: duplicate root id') ||
|
|
238
146
|
issue.message.startsWith('Game manifest: a project has at most one'));
|
|
239
147
|
if (compositionIssue)
|
|
@@ -260,6 +168,7 @@ export function loadGameManifest(raw) {
|
|
|
260
168
|
roots,
|
|
261
169
|
server,
|
|
262
170
|
resolution: manifest.resolution,
|
|
171
|
+
rendering: manifest.rendering,
|
|
263
172
|
authoring: manifest.authoring,
|
|
264
173
|
debug: manifest.debug,
|
|
265
174
|
determinism: manifest.determinism,
|