@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.
Files changed (157) hide show
  1. package/README.md +6 -5
  2. package/dist/adapter/authoring.d.ts +51 -28
  3. package/dist/adapter/authoring.d.ts.map +1 -1
  4. package/dist/adapter/body-marks.d.ts +59 -0
  5. package/dist/adapter/body-marks.d.ts.map +1 -0
  6. package/dist/adapter/body-marks.js +62 -0
  7. package/dist/adapter/constraint.d.ts +41 -0
  8. package/dist/adapter/constraint.d.ts.map +1 -0
  9. package/dist/adapter/constraint.js +27 -0
  10. package/dist/adapter/hierarchy-marks.d.ts +138 -0
  11. package/dist/adapter/hierarchy-marks.d.ts.map +1 -0
  12. package/dist/adapter/hierarchy-marks.js +148 -0
  13. package/dist/adapter/index.d.ts +1 -1
  14. package/dist/adapter/index.d.ts.map +1 -1
  15. package/dist/adapter/ingest/contract-system-adapters.d.ts +64 -0
  16. package/dist/adapter/ingest/contract-system-adapters.d.ts.map +1 -0
  17. package/dist/adapter/ingest/contract-system-adapters.js +134 -0
  18. package/dist/adapter/ingest/game-contract.d.ts +89 -5
  19. package/dist/adapter/ingest/game-contract.d.ts.map +1 -1
  20. package/dist/adapter/ingest/game-contract.js +11 -3
  21. package/dist/adapter/ingest/scene-capture.d.ts +31 -4
  22. package/dist/adapter/ingest/scene-capture.d.ts.map +1 -1
  23. package/dist/adapter/ingest/scene-capture.js +29 -7
  24. package/dist/adapter/ingest/structural-ids.d.ts +1 -1
  25. package/dist/adapter/ingest/structural-ids.js +2 -2
  26. package/dist/adapter/reflection-probe.d.ts +53 -0
  27. package/dist/adapter/reflection-probe.d.ts.map +1 -0
  28. package/dist/adapter/reflection-probe.js +18 -0
  29. package/dist/asset-formats/index.d.ts +4 -10
  30. package/dist/asset-formats/index.d.ts.map +1 -1
  31. package/dist/asset-formats/index.js +3 -8
  32. package/dist/asset-formats/material.d.ts +0 -66
  33. package/dist/asset-formats/material.d.ts.map +1 -1
  34. package/dist/asset-formats/material.js +0 -8
  35. package/dist/asset-formats/mesh.d.ts +1 -2
  36. package/dist/asset-formats/mesh.d.ts.map +1 -1
  37. package/dist/asset-formats/mesh.js +3 -13
  38. package/dist/asset-formats/render-env.d.ts +2 -2
  39. package/dist/asset-parse-error.d.ts +4 -5
  40. package/dist/asset-parse-error.d.ts.map +1 -1
  41. package/dist/asset-parse-error.js +4 -5
  42. package/dist/config.d.ts +7 -0
  43. package/dist/config.d.ts.map +1 -1
  44. package/dist/config.js +7 -0
  45. package/dist/data/curve.d.ts +116 -0
  46. package/dist/data/curve.d.ts.map +1 -0
  47. package/dist/data/curve.js +230 -0
  48. package/dist/data/vite-plugin-data.d.ts +2 -2
  49. package/dist/data/vite-plugin-data.d.ts.map +1 -1
  50. package/dist/data/vite-plugin-data.js +24 -15
  51. package/dist/dev/performance-profiler.d.ts +1 -0
  52. package/dist/dev/performance-profiler.d.ts.map +1 -1
  53. package/dist/dev/performance-profiler.js +25 -2
  54. package/dist/dev/register-render-vitals.d.ts +18 -7
  55. package/dist/dev/register-render-vitals.d.ts.map +1 -1
  56. package/dist/dev/register-render-vitals.js +35 -8
  57. package/dist/ecs/user-data.d.ts +49 -1
  58. package/dist/ecs/user-data.d.ts.map +1 -1
  59. package/dist/ecs/user-data.js +34 -0
  60. package/dist/index.d.ts +2 -3
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +2 -3
  63. package/dist/manifest/index.d.ts +3 -3
  64. package/dist/manifest/index.d.ts.map +1 -1
  65. package/dist/manifest/index.js +2 -2
  66. package/dist/manifest/load.d.ts +20 -63
  67. package/dist/manifest/load.d.ts.map +1 -1
  68. package/dist/manifest/load.js +12 -103
  69. package/dist/manifest/schema.d.ts +21 -103
  70. package/dist/manifest/schema.d.ts.map +1 -1
  71. package/dist/manifest/schema.js +66 -142
  72. package/dist/pixi/index.d.ts +2 -3
  73. package/dist/pixi/index.d.ts.map +1 -1
  74. package/dist/pixi/index.js +2 -3
  75. package/dist/pixi/ingest.d.ts +7 -75
  76. package/dist/pixi/ingest.d.ts.map +1 -1
  77. package/dist/pixi/ingest.js +6 -14
  78. package/dist/pixi/scene-capture.d.ts +2 -2
  79. package/dist/pixi/scene-capture.js +2 -2
  80. package/dist/react/use-data.d.ts +10 -5
  81. package/dist/react/use-data.d.ts.map +1 -1
  82. package/dist/react/use-data.js +15 -15
  83. package/dist/render/viewport-shading.d.ts +1 -1
  84. package/dist/render/viewport-shading.d.ts.map +1 -1
  85. package/dist/render/viewport-shading.js +14 -0
  86. package/dist/runtime/create-runtime.d.ts +12 -0
  87. package/dist/runtime/create-runtime.d.ts.map +1 -1
  88. package/dist/runtime/create-runtime.js +7 -2
  89. package/dist/runtime/mount-game.d.ts +1 -1
  90. package/dist/runtime/mount-game.d.ts.map +1 -1
  91. package/dist/runtime/mount-manifest.d.ts.map +1 -1
  92. package/dist/runtime/mount-manifest.js +5 -1
  93. package/dist/world3d-react/r3f-adapter.d.ts.map +1 -1
  94. package/dist/world3d-react/r3f-adapter.js +129 -6
  95. package/dist/world3d-react/renderer-config.d.ts +15 -0
  96. package/dist/world3d-react/renderer-config.d.ts.map +1 -1
  97. package/dist/world3d-react/renderer-config.js +15 -0
  98. package/dist/world3d-react/world-context.d.ts +11 -1
  99. package/dist/world3d-react/world-context.d.ts.map +1 -1
  100. package/dist/world3d-react/world-context.js +1 -0
  101. package/dist-config/config.js +140 -20
  102. package/dist-config/config.js.map +4 -4
  103. package/package.json +1 -1
  104. package/schemas/engine-capabilities.json +10 -10
  105. package/schemas/vgai-project.schema.json +22 -73
  106. package/src/adapter/authoring.ts +54 -31
  107. package/src/adapter/body-marks.ts +69 -0
  108. package/src/adapter/constraint.ts +71 -0
  109. package/src/adapter/hierarchy-marks.ts +155 -0
  110. package/src/adapter/index.ts +2 -3
  111. package/src/adapter/ingest/contract-system-adapters.ts +174 -0
  112. package/src/adapter/ingest/game-contract.ts +104 -6
  113. package/src/adapter/ingest/scene-capture.ts +61 -11
  114. package/src/adapter/ingest/structural-ids.ts +2 -2
  115. package/src/adapter/reflection-probe.ts +75 -0
  116. package/src/asset-formats/index.ts +4 -10
  117. package/src/asset-formats/material.ts +0 -11
  118. package/src/asset-formats/mesh.ts +3 -16
  119. package/src/asset-parse-error.ts +4 -5
  120. package/src/config.ts +13 -0
  121. package/src/data/curve.ts +263 -0
  122. package/src/data/vite-plugin-data.ts +48 -14
  123. package/src/dev/performance-profiler.ts +21 -2
  124. package/src/dev/register-render-vitals.ts +38 -8
  125. package/src/ecs/user-data.ts +50 -0
  126. package/src/index.ts +2 -3
  127. package/src/manifest/index.ts +3 -15
  128. package/src/manifest/load.ts +33 -139
  129. package/src/manifest/schema.ts +72 -181
  130. package/src/pixi/index.ts +2 -15
  131. package/src/pixi/ingest.ts +13 -87
  132. package/src/pixi/scene-capture.ts +2 -2
  133. package/src/react/use-data.ts +15 -20
  134. package/src/render/viewport-shading.ts +16 -1
  135. package/src/runtime/create-runtime.ts +30 -5
  136. package/src/runtime/mount-game.ts +1 -1
  137. package/src/runtime/mount-manifest.ts +5 -1
  138. package/src/world3d-react/r3f-adapter.tsx +142 -6
  139. package/src/world3d-react/renderer-config.ts +31 -0
  140. package/src/world3d-react/world-context.ts +11 -1
  141. package/dist/asset-formats/instances.d.ts +0 -17
  142. package/dist/asset-formats/instances.d.ts.map +0 -1
  143. package/dist/asset-formats/instances.js +0 -31
  144. package/dist/asset-formats/parse.d.ts +0 -20
  145. package/dist/asset-formats/parse.d.ts.map +0 -1
  146. package/dist/asset-formats/parse.js +0 -34
  147. package/dist/pixi/ingest-iframe.d.ts +0 -82
  148. package/dist/pixi/ingest-iframe.d.ts.map +0 -1
  149. package/dist/pixi/ingest-iframe.js +0 -166
  150. package/dist/render/instance-mesh.d.ts +0 -5
  151. package/dist/render/instance-mesh.d.ts.map +0 -1
  152. package/dist/render/instance-mesh.js +0 -19
  153. package/schemas/mat.schema.json +0 -255
  154. package/src/asset-formats/instances.ts +0 -38
  155. package/src/asset-formats/parse.ts +0 -39
  156. package/src/pixi/ingest-iframe.ts +0 -255
  157. package/src/render/instance-mesh.ts +0 -25
@@ -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, parseInstancesFile, parseMaterialFile } from './asset-formats/parse';
27
+ export { AssetParseError } from './asset-parse-error';
29
28
  export type { AdapterRoot, GameManifest, ResolvedAdapter, ResolvedAdapterRoot, ResolvedGameManifest, RootAdapter, } from './manifest';
30
- export { CAPABILITY_CEILINGS, DEFAULT_SERVER_MODULE, loadGameManifest } from './manifest';
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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/F,YAAY,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC1F,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"}
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, parseInstancesFile, parseMaterialFile } from './asset-formats/parse';
28
- export { CAPABILITY_CEILINGS, DEFAULT_SERVER_MODULE, loadGameManifest } from './manifest';
26
+ export { AssetParseError } from './asset-parse-error';
27
+ export { DEFAULT_SERVER_MODULE, loadGameManifest } from './manifest';
29
28
  export { mountManifestRoots } from './runtime/mount-manifest';
@@ -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 { CAPABILITY_CEILINGS, DEFAULT_SERVER_MODULE, loadGameManifest } from './load';
4
- export type { AdapterRoot, GameManifest, IngestStrategy, RootAdapter, Tier, } from './schema';
5
- export { AdapterRootSchema, GameManifestSchema, IngestStrategySchema, RootAdapterSchema, TierSchema, } from './schema';
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,mBAAmB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AACtF,YAAY,EACV,WAAW,EACX,YAAY,EACZ,cAAc,EACd,WAAW,EACX,IAAI,GACL,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,GACX,MAAM,UAAU,CAAC"}
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"}
@@ -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 { CAPABILITY_CEILINGS, DEFAULT_SERVER_MODULE, loadGameManifest } from './load';
5
- export { AdapterRootSchema, GameManifestSchema, IngestStrategySchema, RootAdapterSchema, TierSchema, } from './schema';
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
@@ -1,4 +1,4 @@
1
- import { type IngestStrategy, type LearnMetadata, type Tier } from './schema';
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
- readonly strategy: IngestStrategy;
17
- readonly entryHtml: string | undefined;
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":"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"}
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/manifest/load.ts"],"names":[],"mappings":"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"}
@@ -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' — see the `ResolvedAdapter` type's comment above for why
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
- strategy: ingest.strategy,
127
- entryHtml: ingest.entryHtml,
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, capabilities, and a pass-through of every other field).
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 + capability-ceiling
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
- * `capabilities.{local,hosted}` drive tier resolution; `description` (T3.3
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. the iframe-reachable field-exclusivity / manifestVersion checks).
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,