cozyclay 2.0.2 → 2.1.1

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 (262) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +17 -2
  3. package/THIRD_PARTY_NOTICES.md +8 -0
  4. package/bin/agent/agent-routes.mjs +211 -36
  5. package/bin/agent/agent-runner.mjs +98 -4
  6. package/bin/agent/codex-client.mjs +2 -1
  7. package/bin/agent/fal-contract.mjs +0 -17
  8. package/bin/agent/h3-preservation.mjs +6 -8
  9. package/bin/agent/provider-keys.mjs +1 -1
  10. package/bin/agent/providers.mjs +124 -3
  11. package/bin/agent/script-tool.mjs +74 -0
  12. package/bin/agent/session-store.mjs +5 -5
  13. package/bin/agent/studio-prompt.mjs +2 -1
  14. package/bin/agent/studio-rebase.mjs +314 -0
  15. package/bin/agent/studio-tools.mjs +21 -14
  16. package/bin/agent/supervisor.mjs +311 -0
  17. package/bin/agent/video-adapters.mjs +0 -7
  18. package/bin/codex-auth.mjs +4 -4
  19. package/bin/live/cli.mjs +23 -8
  20. package/bin/live/client.mjs +1 -1
  21. package/bin/live/studio.mjs +5 -2
  22. package/bin/mcp-runtime.mjs +2 -2
  23. package/bin/telemetry-state.mjs +3 -3
  24. package/dist/app/index.html +6 -6
  25. package/dist/assets/analytics-C9pMpW7s.js +1 -0
  26. package/dist/assets/app-B_2XB9rw.css +1 -0
  27. package/dist/assets/app-DAuvKPP8.js +4920 -0
  28. package/dist/assets/{demo-ByeYp-dY.js → demo-CvKuBgy5.js} +1 -1
  29. package/dist/assets/{first-shot-handoff-DgT28ZiV.js → first-shot-handoff-msLI71g1.js} +1 -1
  30. package/dist/assets/{landing-BaXkpFip.js → landing-ChUvB_zL.js} +1 -1
  31. package/dist/assets/scene-asset-sync-DKkpjKBV.js +19 -0
  32. package/dist/assets/{shot-prompt-CbqWcWYi.css → scene-asset-sync-DjJ_cJ2R.css} +1 -1
  33. package/dist/assets/{ticket-BcmsnHn5.js → ticket-BPk2Ni95.js} +1 -1
  34. package/dist/assets/workflow-jJRBR94Z.js +179 -0
  35. package/dist/cozyclay-package.json +1 -1
  36. package/dist/index.html +328 -222
  37. package/dist/llms.txt +14 -0
  38. package/dist/sitemap.xml +1 -1
  39. package/dist/workflow/index.html +4 -4
  40. package/mcp/LIVE-PROTOCOL.md +23 -2
  41. package/mcp/README.md +37 -2
  42. package/mcp/ardy-prompts.mjs +1 -1
  43. package/mcp/image-file.mjs +132 -0
  44. package/mcp/live-hub.mjs +2 -2
  45. package/mcp/package.json +1 -0
  46. package/mcp/runtime/package-lock.json +7 -0
  47. package/mcp/runtime/package.json +1 -0
  48. package/mcp/server.mjs +0 -6
  49. package/mcp/tool-handlers.mjs +289 -87
  50. package/package.json +11 -2
  51. package/src/App.jsx +813 -278
  52. package/src/agent-image-client.js +94 -0
  53. package/src/analytics.js +47 -3
  54. package/src/app-stage.jsx +129 -2745
  55. package/src/ardy/auto-physics.js +6 -16
  56. package/src/ardy/collision-blockers.js +3 -7
  57. package/src/ardy/fix-collisions.js +5 -35
  58. package/src/ardy/ik-drag.js +86 -5
  59. package/src/ardy/ik-key-json.js +3 -1
  60. package/src/ardy/ik.js +15 -13
  61. package/src/ardy/motion-calibration.js +1 -1
  62. package/src/ardy/npz.js +0 -8
  63. package/src/ardy/physics-panel.jsx +3 -2
  64. package/src/ardy/physics-review.js +3 -2
  65. package/src/ardy/physics-support.js +1 -1
  66. package/src/ardy/physics-surface.js +1 -1
  67. package/src/ardy/platform-fit-panel.jsx +2 -1
  68. package/src/ardy/playback.js +1 -5
  69. package/src/ardy/range-pin.js +2 -2
  70. package/src/ardy/root-drop.js +0 -1
  71. package/src/ardy/timeline.css +184 -6
  72. package/src/ardy/timeline.jsx +121 -36
  73. package/src/ardy/to-cskel27.js +0 -2
  74. package/src/ardy/waypoints.js +0 -3
  75. package/src/ardy-bridge-contract.js +281 -0
  76. package/src/asset-pane.jsx +19 -9
  77. package/src/auto-color.js +1 -1
  78. package/src/burn-in.js +1 -1
  79. package/src/camera-block.js +1 -1
  80. package/src/camera-follow.js +75 -32
  81. package/src/camera-move.js +0 -6
  82. package/src/camera-tutorial.jsx +6 -7
  83. package/src/character-kind.js +79 -0
  84. package/src/command-bus.js +76 -17
  85. package/src/commands/cast.js +31 -7
  86. package/src/commands/elements/object.js +1 -1
  87. package/src/commands/elements/shot.js +1 -1
  88. package/src/commands/elements.js +1 -1
  89. package/src/commands/export.js +3 -3
  90. package/src/commands/motion.js +2 -2
  91. package/src/commands/objects.js +105 -10
  92. package/src/commands/project.js +15 -2
  93. package/src/commands/sculpt-images.js +53 -0
  94. package/src/commands/shot.js +88 -10
  95. package/src/commands/view.js +10 -4
  96. package/src/coplanar-depth.js +216 -0
  97. package/src/cuts.js +7 -6
  98. package/src/domains/cast.js +60 -43
  99. package/src/domains/motion/motion-intent-codec.js +50 -0
  100. package/src/domains/motion/motion-range-pin-rules.js +23 -0
  101. package/src/domains/motion/motion-video-capture.js +664 -0
  102. package/src/domains/motion.js +253 -742
  103. package/src/domains/objects.js +106 -5
  104. package/src/domains/scenes.js +79 -28
  105. package/src/domains/shots.js +33 -7
  106. package/src/error-boundary.jsx +1 -1
  107. package/src/execution-telemetry.js +5 -5
  108. package/src/facing-marks.js +14 -1
  109. package/src/first-success-guide.jsx +35 -4
  110. package/src/gizmo-claim.js +3 -1
  111. package/src/grid-floor.jsx +1 -4
  112. package/src/hierarchy-model.js +48 -35
  113. package/src/hierarchy-panel.css +1 -0
  114. package/src/hierarchy-panel.jsx +54 -102
  115. package/src/history.js +0 -2
  116. package/src/i2v-motion-client.js +1 -4
  117. package/src/ime.js +6 -0
  118. package/src/keyframe-pack.js +15 -6
  119. package/src/line-edit.js +4 -4
  120. package/src/live-control.js +6 -6
  121. package/src/matte-editor.js +2 -8
  122. package/src/matte.js +0 -19
  123. package/src/mesh-graph-clone.js +16 -2
  124. package/src/mesh-sniff.js +0 -1
  125. package/src/monotone-cubic.js +40 -0
  126. package/src/motion-store.js +4 -4
  127. package/src/motion-trail.js +5 -11
  128. package/src/multimodel-ingest.js +1 -3
  129. package/src/object-catalog.jsx +7 -5
  130. package/src/object-gizmo.jsx +45 -31
  131. package/src/object-path.js +310 -67
  132. package/src/object-travel.js +224 -0
  133. package/src/otio.js +8 -3
  134. package/src/panels/CharacterTransformPanel.jsx +24 -6
  135. package/src/panels/ObjectTransformPanel.jsx +4 -3
  136. package/src/panels/PoseImagePanel.jsx +205 -0
  137. package/src/panels/PromptBlocksPanel.jsx +3 -1
  138. package/src/panels/ProxyFigurePanel.jsx +56 -0
  139. package/src/panels/ReferenceImageField.jsx +1 -1
  140. package/src/panels/RigControlPanel.jsx +24 -3
  141. package/src/panels/RigPanel.jsx +2 -1
  142. package/src/panels/SculptPanel.jsx +405 -0
  143. package/src/panels/SubjectBox.jsx +1 -1
  144. package/src/panels/SubjectsPanel.jsx +0 -2
  145. package/src/panels/VideoCapturePanel.jsx +2 -1
  146. package/src/panels/pose-image.css +42 -0
  147. package/src/panels/pose.css +3 -0
  148. package/src/panels/sculpt.css +162 -0
  149. package/src/plan-diagram.js +184 -0
  150. package/src/planview.jsx +127 -80
  151. package/src/playground.js +3 -5
  152. package/src/pose-fade.js +77 -0
  153. package/src/pose-gizmo.css +23 -0
  154. package/src/pose-gizmo.js +96 -0
  155. package/src/posestudio.jsx +134 -83
  156. package/src/project-browser.css +53 -0
  157. package/src/project-browser.jsx +49 -4
  158. package/src/project.js +55 -24
  159. package/src/props.jsx +177 -36
  160. package/src/proxy-figure.jsx +69 -0
  161. package/src/range-pin-panel.jsx +0 -1
  162. package/src/receipt-findings.js +20 -0
  163. package/src/render-passes.js +0 -1
  164. package/src/resource-status.jsx +1 -1
  165. package/src/root-path.js +48 -0
  166. package/src/route-owner.js +52 -0
  167. package/src/scene-asset-cache.js +1 -2
  168. package/src/scene-assets.js +12 -4
  169. package/src/scene-fbx.js +1 -1
  170. package/src/scene-mesh-cache.js +0 -1
  171. package/src/scene-objects.js +319 -19
  172. package/src/scenes.js +58 -9
  173. package/src/sculpt-blueprint.js +65 -0
  174. package/src/sculpt-compare.js +384 -0
  175. package/src/sculpt-geometry.js +141 -0
  176. package/src/sculpt-mode.js +168 -0
  177. package/src/sculpt-recipe.js +385 -0
  178. package/src/sculpt-run.js +351 -0
  179. package/src/sculpt-stage.jsx +221 -0
  180. package/src/settings-menu.jsx +1 -1
  181. package/src/shell/BoardSlot.jsx +341 -0
  182. package/src/shell/BottomDock.jsx +60 -16
  183. package/src/shell/CompositionGuideButton.jsx +20 -0
  184. package/src/shell/DetailsSlot.jsx +26 -6
  185. package/src/shell/MenuBar.jsx +78 -6
  186. package/src/shell/OutlinerSlot.jsx +3 -1
  187. package/src/shell/ShotPreviewHeader.jsx +17 -0
  188. package/src/shell/TopBar.jsx +18 -3
  189. package/src/shell/ViewportToolbar.jsx +36 -31
  190. package/src/shell/dock.css +239 -0
  191. package/src/shell/glass-regions.css +3 -2
  192. package/src/shell/log-store.js +4 -4
  193. package/src/shell/mode.css +20 -0
  194. package/src/shell/studio-shell-context.js +4 -1
  195. package/src/shell/viewport.css +12 -0
  196. package/src/shot-authoring.js +69 -6
  197. package/src/stable-items.js +1 -1
  198. package/src/stage-attach-frames.js +169 -0
  199. package/src/stage-canvas-rigs.jsx +402 -0
  200. package/src/stage-capture.jsx +216 -0
  201. package/src/stage-characters.jsx +302 -0
  202. package/src/stage-editor-gizmos.jsx +1229 -0
  203. package/src/stage-labels-ko.js +204 -0
  204. package/src/stage-startup-defaults.js +182 -0
  205. package/src/starter-scenes.js +1 -1
  206. package/src/storyboard.js +24 -5
  207. package/src/studio-actions.js +42 -9
  208. package/src/studio-agent-commands.js +213 -23
  209. package/src/studio-agent-context.js +11 -9
  210. package/src/studio-agent-motion.js +2 -1
  211. package/src/studio-agent-protocol.js +60 -24
  212. package/src/studio-app-binding.js +56 -23
  213. package/src/studio-contact-sheet.js +3 -3
  214. package/src/studio-elements.js +11 -2
  215. package/src/studio-geometry-facts.js +114 -0
  216. package/src/styles.css +92 -9
  217. package/src/ui-scrub.js +4 -4
  218. package/src/ui.jsx +6 -4
  219. package/src/use-asset-shelf.js +60 -0
  220. package/src/use-camera-tutorial.js +50 -0
  221. package/src/use-embed-bridge.js +12 -0
  222. package/src/use-first-success-prompt.js +7 -0
  223. package/src/use-i2v-capture-modal.js +15 -0
  224. package/src/use-sculpt-mode.js +95 -0
  225. package/src/workflow/AgentPanel.jsx +106 -18
  226. package/src/workflow/WorkflowBuilder.jsx +1 -1
  227. package/src/workflow/agent-client.js +113 -45
  228. package/src/workflow/agent-panel.css +35 -0
  229. package/src/workflow/attachment-image.js +1 -1
  230. package/src/workflow/canvas-commands.js +3 -3
  231. package/src/workflow/cozy-scene-node.js +3 -3
  232. package/src/workflow/local-workflow.js +2 -2
  233. package/src/workflow/motion-input.js +3 -3
  234. package/src/workflow/node-schema.js +1 -1
  235. package/src/workflow/scene-asset-sync.js +2 -9
  236. package/src/workflow/shot-prompt-node.js +1 -1
  237. package/src/workflow/video-contract.js +1 -1
  238. package/src/workflow/workflow-resources.js +0 -8
  239. package/src/workflow-send.js +87 -0
  240. package/tools/ardy/__pycache__/cclay_gvhmr_worker.cpython-313.pyc +0 -0
  241. package/tools/check-eslint.mjs +57 -0
  242. package/tools/check-knip.mjs +60 -0
  243. package/tools/check-loc.mjs +54 -0
  244. package/tools/demo-worker/api-client.mjs +7 -13
  245. package/tools/demo-worker/generate.mjs +2 -4
  246. package/tools/eslint-baseline.json +23 -0
  247. package/tools/gt-render/browser.mjs +23 -0
  248. package/tools/headless-studio.mjs +85 -0
  249. package/tools/kimodo/effector-constraints.mjs +4 -4
  250. package/tools/kimodo/generate.mjs +1 -1
  251. package/tools/knip-baseline.json +331 -0
  252. package/tools/loc-baseline.json +126 -0
  253. package/tools/process-supervisor.mjs +1 -1
  254. package/tools/projflow/replay.mjs +4 -4
  255. package/tools/projflow/runner.mjs +3 -3
  256. package/tools/qa/studio-control-count.mjs +2 -0
  257. package/tools/run-tests.mjs +95 -7
  258. package/dist/assets/analytics-MVZOEW8O.js +0 -1
  259. package/dist/assets/app-BxBLC6GT.js +0 -4876
  260. package/dist/assets/app-CJdxvnrl.css +0 -1
  261. package/dist/assets/shot-prompt-hN0j_O-p.js +0 -17
  262. package/dist/assets/workflow-B5XZwVfe.js +0 -179
@@ -0,0 +1,20 @@
1
+ // Findings an edit receipt reports beside its readback: a value the domain
2
+ // moved to stay inside its limits, so a request that did not land as asked is
3
+ // never silent.
4
+ const round = value => Number(value.toFixed(4));
5
+
6
+ /** One CLAMPED warning for an entity when any requested number differs from
7
+ * the number the domain kept, or null. `requested` and `applied` are keyed by
8
+ * the same channel names (x, y, z, scaleX, scale, ...). */
9
+ export function clampWarning(id, requested, applied) {
10
+ const parts = [];
11
+ for (const [key, asked] of Object.entries(requested)) {
12
+ const kept = applied?.[key];
13
+ if (!Number.isFinite(asked) || !Number.isFinite(kept) || Math.abs(asked - kept) < 1e-9) continue;
14
+ const limit = asked < kept ? 'minimum' : 'maximum';
15
+ parts.push(`${key} ${round(asked)}→${round(kept)} (${limit} ${round(kept)}${/^(x|y|z)$/.test(key) ? ' m' : ''})`);
16
+ }
17
+ if (!parts.length) return null;
18
+ const message = [...`Clamped: ${parts.join('; ')}`];
19
+ return { code: 'CLAMPED', id, message: message.length > 120 ? `${message.slice(0, 119).join('')}…` : message.join('') };
20
+ }
@@ -69,7 +69,6 @@ void main() {
69
69
 
70
70
  const BACKGROUND_FAR = new THREE.Color(0x000000);
71
71
 
72
- /** Build the override material for a pass. */
73
72
  function passMaterial(kind, camera, depthRange = null) {
74
73
  if (kind === "depth") {
75
74
  return new THREE.ShaderMaterial({
@@ -26,7 +26,7 @@ export function resourceStatusLabel(item) {
26
26
  return ko("Missing", "누락");
27
27
  }
28
28
 
29
- export function resourceKindLabel(kind) {
29
+ function resourceKindLabel(kind) {
30
30
  return KIND_LABELS[kind]?.() ?? String(kind ?? "");
31
31
  }
32
32
 
@@ -0,0 +1,48 @@
1
+ import { isProxyFigure } from "./scenes.js";
2
+
3
+ // Frame-addressed scene placement. No renderer or waypoint authoring state.
4
+ export function sampleRootPath(character, frame, { fps = 24 } = {}) {
5
+ const waypoints = character.layer?.waypoints ?? [];
6
+ if (!waypoints.length) return null;
7
+ const base = { x: character.x, z: character.z, heading: character.rot };
8
+ if (frame <= 0) return base;
9
+ let previous = { frame: 0, ...base };
10
+ let sampled = base;
11
+ for (const pin of waypoints) {
12
+ const dx = pin.x - previous.x;
13
+ const dz = pin.z - previous.z;
14
+ const heading = pin.heading ?? (dx || dz ? Math.atan2(dx, dz) * 180 / Math.PI : sampled.heading);
15
+ const weight = Math.min(1, (frame / fps - previous.frame / fps) / (pin.frame / fps - previous.frame / fps));
16
+ sampled = {
17
+ x: previous.x + dx * weight,
18
+ z: previous.z + dz * weight,
19
+ heading,
20
+ };
21
+ if (frame <= pin.frame) return sampled;
22
+ previous = pin;
23
+ }
24
+ return sampled;
25
+ }
26
+
27
+ // takeRoot is an already sampled world-space { x, z, rot? } supplied by the
28
+ // take owner. Shot lookup is injected so this module does not own a timeline.
29
+ export function resolveCharacterPlacement(character, frame, { shotAt = () => null, takeRoot = null } = {}) {
30
+ const base = { x: character.x, z: character.z, rot: character.rot, posture: character.posture, pose: character.pose };
31
+ if (takeRoot) return { ...base, ...takeRoot };
32
+ const root = sampleRootPath(character, frame);
33
+ if (root) return { ...base, x: root.x, z: root.z, rot: root.heading };
34
+ return { ...base, ...shotAt(frame)?.cast?.[character.id] };
35
+ }
36
+
37
+ // Rendering and export share the same placement policy. A rigged character's
38
+ // authored waypoints belong to its take, not its world transform; only proxy
39
+ // figures use the root-path sampler without a take. Still cast overrides are
40
+ // editorial placement and apply to either kind while the playhead is inside a
41
+ // still.
42
+ export function placementAt(character, frame, { shotAt = () => null, takeRoot = null } = {}) {
43
+ if (takeRoot) return resolveCharacterPlacement(character, frame, { takeRoot });
44
+ const shot = shotAt(frame);
45
+ if (isProxyFigure(character)) return resolveCharacterPlacement(character, frame, { shotAt: () => shot });
46
+ if (shot?.kind === "still") return { ...character, ...shot.cast?.[character.id] };
47
+ return character;
48
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Whose route the studio shows for a selection.
3
+ *
4
+ * A route belongs to one record, but a car is a group: "Vintage Car" (an
5
+ * Empty) → "Chassis" (owns the route) → parts. The operator selects the group,
6
+ * so the rail, its dots and the route strip follow the group to the record
7
+ * that actually owns the travel. Pure and flat-record based, like
8
+ * object-travel.js: `parent` is grouping only.
9
+ */
10
+
11
+ const hasRoute = (object) => !!object && !!object.path;
12
+
13
+ /**
14
+ * The record whose route a selection stands for: the selected record when it
15
+ * owns a path, else its nearest routed descendant (breadth-first; ties at one
16
+ * depth go to the first in record order), else null. A descendant carried by a
17
+ * character (`attach`) is skipped: its route never plays.
18
+ *
19
+ * @param {object[]|Map<string, object>} objects scene records
20
+ * @param {string|null} selectedId
21
+ */
22
+ export function routeOwnerFor(objects, selectedId) {
23
+ if (!selectedId) return null;
24
+ const list = objects instanceof Map ? [...objects.values()] : Array.isArray(objects) ? objects : [];
25
+ const selected = list.find((object) => object && object.id === selectedId);
26
+ if (!selected) return null;
27
+ if (hasRoute(selected)) return selected;
28
+ const childrenOf = new Map();
29
+ for (const object of list) {
30
+ if (!object || typeof object.parent !== "string") continue;
31
+ if (!childrenOf.has(object.parent)) childrenOf.set(object.parent, []);
32
+ childrenOf.get(object.parent).push(object);
33
+ }
34
+ const order = new Map(list.map((object, index) => [object, index]));
35
+ const seen = new Set([selected.id]);
36
+ let level = [selected];
37
+ while (level.length) {
38
+ const next = [];
39
+ let best = null;
40
+ for (const node of level) {
41
+ for (const child of childrenOf.get(node.id) ?? []) {
42
+ if (seen.has(child.id)) continue;
43
+ seen.add(child.id);
44
+ if (!child.attach && hasRoute(child) && (!best || order.get(child) < order.get(best))) best = child;
45
+ next.push(child);
46
+ }
47
+ }
48
+ if (best) return best;
49
+ level = next;
50
+ }
51
+ return null;
52
+ }
@@ -128,7 +128,7 @@ export function createAssetTextureCache({
128
128
  entry.promise = null;
129
129
  // A GLB in this function would always hit createImageBitmap. Mesh import
130
130
  // stores bytes with putAsset and leaves textures alone.
131
- if (isMeshRecord(stored) || isMeshAssetId(stored.id)) return stored;
131
+ if (isMeshRecord(stored)) return stored;
132
132
  const texture = await textureFromAsset(stored);
133
133
  if (!texture || entry.generation !== generation) {
134
134
  dispose(texture);
@@ -183,4 +183,3 @@ export const assetRecord = cache.assetRecord;
183
183
  export const rememberAsset = cache.rememberAsset;
184
184
  export const evictAssetTexture = cache.evictAssetTexture;
185
185
  export const subscribeToAssetTexture = cache.subscribeToAssetTexture;
186
- export const clearAssetTextures = cache.clearAssetTextures;
@@ -29,9 +29,9 @@ export const MESH_ID_PREFIX = "mesh-";
29
29
  * pictures, and short enough to read in a scene file. */
30
30
  const ASSET_ID_HEX = 32;
31
31
 
32
- export const ASSET_DB_NAME = "cozyclay.assets";
33
- export const ASSET_DB_VERSION = 1;
34
- export const ASSET_STORE_NAME = "images";
32
+ const ASSET_DB_NAME = "cozyclay.assets";
33
+ const ASSET_DB_VERSION = 1;
34
+ const ASSET_STORE_NAME = "images";
35
35
 
36
36
  /** What an import will accept. SVG is excluded on purpose: it is a document
37
37
  * that can carry script, and a set piece is not worth that. */
@@ -308,7 +308,15 @@ export async function importImageFile(file, {
308
308
  * going away. This is the reachable set; `unreachableAssetIds` is the sweep.
309
309
  */
310
310
  export function referencedAssetIds(scenes) {
311
- return new Set(assetUsageCounts(scenes).keys());
311
+ const ids = new Set(assetUsageCounts(scenes).keys());
312
+ // A storyboard panel's stylized picture is held by its shot, not by an object.
313
+ for (const scene of Array.isArray(scenes) ? scenes : []) {
314
+ const shots = scene?.shotDocument?.shots;
315
+ for (const shot of Array.isArray(shots) ? shots : []) {
316
+ if (isImageAssetId(shot?.stylizedAssetId)) ids.add(shot.stylizedAssetId);
317
+ }
318
+ }
319
+ return ids;
312
320
  }
313
321
 
314
322
  /**
package/src/scene-fbx.js CHANGED
@@ -46,7 +46,7 @@ export function readFbxVersion(bytes) {
46
46
  return Number.isFinite(version) ? version : null;
47
47
  }
48
48
 
49
- export function parseFbxGroup(bytes) {
49
+ function parseFbxGroup(bytes) {
50
50
  const buffer = arrayBufferOf(bytes);
51
51
  if (!buffer || !buffer.byteLength) return null;
52
52
  return new FBXLoader().parse(buffer, "");
@@ -132,4 +132,3 @@ const cache = createMeshSceneCache();
132
132
  export const loadMeshScene = cache.loadMeshScene;
133
133
  export const subscribeToMeshScene = cache.subscribeToMeshScene;
134
134
  export const evictMeshScene = cache.evictMeshScene;
135
- export const clearMeshScenes = cache.clearMeshScenes;