@volter/editor-core 0.5.57

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 (719) hide show
  1. package/BUNDLED_NOTICES +1527 -0
  2. package/LICENSE +686 -0
  3. package/LICENSE-APACHE +202 -0
  4. package/NOTICE +18 -0
  5. package/README.md +24 -0
  6. package/dist/build/chunk-JS4D4XZ3.js +175 -0
  7. package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
  8. package/dist/build/vite-plugin-product-contributions.js +100 -0
  9. package/dist/build/vite-plugin-product-contributions.js.map +7 -0
  10. package/dist/build/vite-plugin-shared-react.js +25 -0
  11. package/dist/build/vite-plugin-shared-react.js.map +7 -0
  12. package/dist/build/vite-plugin-shared-three.js +86 -0
  13. package/dist/build/vite-plugin-shared-three.js.map +7 -0
  14. package/dist/server/chunk-KMJC7AGO.js +98 -0
  15. package/dist/server/chunk-KMJC7AGO.js.map +7 -0
  16. package/dist/server/chunk-PSILUMGS.js +46 -0
  17. package/dist/server/chunk-PSILUMGS.js.map +7 -0
  18. package/dist/server/frame-proxy.js +255 -0
  19. package/dist/server/frame-proxy.js.map +7 -0
  20. package/dist/server/open-browser.js +53 -0
  21. package/dist/server/open-browser.js.map +7 -0
  22. package/dist/server/process-shutdown.js +127 -0
  23. package/dist/server/process-shutdown.js.map +7 -0
  24. package/dist/server/session-registry.js +141 -0
  25. package/dist/server/session-registry.js.map +7 -0
  26. package/dist/server/spawn-opener.js +11 -0
  27. package/dist/server/spawn-opener.js.map +7 -0
  28. package/dist/server/worktree-identity.js +11 -0
  29. package/dist/server/worktree-identity.js.map +7 -0
  30. package/dist-server/packaged.mjs +88816 -0
  31. package/package.json +118 -0
  32. package/scripts/build-plugins.mjs +14 -0
  33. package/scripts/build-server.mjs +26 -0
  34. package/scripts/build-session.mjs +9 -0
  35. package/server/account-credentials.ts +60 -0
  36. package/server/account-service.ts +1434 -0
  37. package/server/adapter-region-includes.ts +47 -0
  38. package/server/asset-catalog-v2.ts +175 -0
  39. package/server/asset-history-snapshots.ts +196 -0
  40. package/server/asset-ledger-store.ts +195 -0
  41. package/server/asset-library-routes.ts +1595 -0
  42. package/server/blender-wasm-artifact.ts +430 -0
  43. package/server/boot-timings.ts +106 -0
  44. package/server/canonical-path.ts +50 -0
  45. package/server/checkout-workspace-preflight.ts +349 -0
  46. package/server/cloud-asset-catalog.ts +158 -0
  47. package/server/coding-inference-launch.ts +237 -0
  48. package/server/collaboration-account-client.ts +202 -0
  49. package/server/collaboration-attribution.ts +122 -0
  50. package/server/collaboration-session.ts +934 -0
  51. package/server/comfyui-bridge.ts +248 -0
  52. package/server/console-ledger.ts +499 -0
  53. package/server/creation-site-transform.ts +304 -0
  54. package/server/creation-site-write.ts +648 -0
  55. package/server/data-file-serialize.ts +158 -0
  56. package/server/editor-brand-html.ts +72 -0
  57. package/server/editor-control-socket.ts +366 -0
  58. package/server/editor-server-options.ts +190 -0
  59. package/server/editor-server.ts +1483 -0
  60. package/server/editor-sse.ts +352 -0
  61. package/server/engine-provenance.ts +169 -0
  62. package/server/engine-source-restart.ts +117 -0
  63. package/server/frame-bridge.ts +115 -0
  64. package/server/frame-proxy.ts +490 -0
  65. package/server/frame-workbench.ts +259 -0
  66. package/server/frontend-handoff.ts +229 -0
  67. package/server/game-globals-shadow.ts +113 -0
  68. package/server/gameplay-session-retention.ts +149 -0
  69. package/server/gameplay-sessions.ts +123 -0
  70. package/server/generation-jobs.ts +201 -0
  71. package/server/generation-reconciler.ts +137 -0
  72. package/server/generative-execution-context.ts +59 -0
  73. package/server/git-workflow.ts +612 -0
  74. package/server/harness-chat-caller.ts +36 -0
  75. package/server/harness-chat-service.ts +1681 -0
  76. package/server/idle-shutdown.ts +170 -0
  77. package/server/js-profiling-policy.ts +52 -0
  78. package/server/launcher-settings.ts +84 -0
  79. package/server/local-asset-catalog.ts +410 -0
  80. package/server/managed-account-defaults.ts +22 -0
  81. package/server/mock-control-plane.ts +540 -0
  82. package/server/model-import-conversion.ts +345 -0
  83. package/server/native-credential-store.ts +162 -0
  84. package/server/open-browser.ts +118 -0
  85. package/server/packaged.ts +1192 -0
  86. package/server/play-stall.ts +126 -0
  87. package/server/process-shutdown.ts +218 -0
  88. package/server/product-presets.ts +55 -0
  89. package/server/project-build-artifact.ts +95 -0
  90. package/server/project-components.ts +100 -0
  91. package/server/project-dependency-invalidation.ts +114 -0
  92. package/server/project-file-scan.ts +235 -0
  93. package/server/project-hmr-files.ts +215 -0
  94. package/server/project-install-roots.ts +210 -0
  95. package/server/project-kinds.ts +71 -0
  96. package/server/project-mcp-servers.ts +82 -0
  97. package/server/project-module-freshness.ts +109 -0
  98. package/server/project-module-instance.ts +375 -0
  99. package/server/project-optimize-deps-entries.ts +827 -0
  100. package/server/project-output-writer.ts +679 -0
  101. package/server/project-package-origin.ts +63 -0
  102. package/server/project-root-surface.ts +831 -0
  103. package/server/project-scratch-path.ts +47 -0
  104. package/server/project-script-hmr.ts +619 -0
  105. package/server/project-serving-plugins.ts +236 -0
  106. package/server/project-tools.ts +653 -0
  107. package/server/project-validation.ts +250 -0
  108. package/server/project-verbs.ts +127 -0
  109. package/server/project-view.ts +52 -0
  110. package/server/project-watch.ts +1134 -0
  111. package/server/project-work-coordinator.ts +288 -0
  112. package/server/provider-credentials.ts +331 -0
  113. package/server/recent-projects-store.ts +98 -0
  114. package/server/redact-secrets.ts +71 -0
  115. package/server/repository-presence.ts +267 -0
  116. package/server/routes/account.ts +357 -0
  117. package/server/routes/agents.ts +60 -0
  118. package/server/routes/assets.ts +154 -0
  119. package/server/routes/build.ts +13 -0
  120. package/server/routes/collaboration.ts +595 -0
  121. package/server/routes/configurations.ts +419 -0
  122. package/server/routes/context.ts +264 -0
  123. package/server/routes/control-plane.ts +1811 -0
  124. package/server/routes/logs.ts +272 -0
  125. package/server/routes/project-identity.ts +302 -0
  126. package/server/routes/project-open.ts +429 -0
  127. package/server/routes/project-source.ts +686 -0
  128. package/server/routes/project-state.ts +383 -0
  129. package/server/routes/relay.ts +1029 -0
  130. package/server/routes/route-helpers.ts +29 -0
  131. package/server/routes/served-modules.ts +138 -0
  132. package/server/routes/session-tabs.ts +196 -0
  133. package/server/routes/settings.ts +121 -0
  134. package/server/routes/share-control.ts +486 -0
  135. package/server/routes/themes.ts +116 -0
  136. package/server/routes/tools.ts +230 -0
  137. package/server/routes/worktrees.ts +595 -0
  138. package/server/scoped-game-css.ts +461 -0
  139. package/server/server-utils.ts +1194 -0
  140. package/server/session-product.ts +112 -0
  141. package/server/session-registry.ts +230 -0
  142. package/server/share-claims.ts +138 -0
  143. package/server/share-host.ts +526 -0
  144. package/server/share-session-gateway.ts +1362 -0
  145. package/server/share-tunnel.ts +123 -0
  146. package/server/spawn-opener.ts +74 -0
  147. package/server/support/play/log-format.ts +76 -0
  148. package/server/support/play/session-record.ts +199 -0
  149. package/server/support/project/build-discipline.ts +718 -0
  150. package/server/support/project/inspection-node.ts +119 -0
  151. package/server/support/project/log-naming.ts +54 -0
  152. package/server/support/project/provenance.ts +290 -0
  153. package/server/support/project/run-name.ts +18 -0
  154. package/server/support/project/session-journal.ts +830 -0
  155. package/server/support/project/shared.ts +327 -0
  156. package/server/tab-bootstrap.ts +62 -0
  157. package/server/tab-heartbeat.ts +477 -0
  158. package/server/tab-lifecycle.ts +550 -0
  159. package/server/tab-presence.ts +1508 -0
  160. package/server/team-agent-mirror.ts +95 -0
  161. package/server/twin-auth.ts +138 -0
  162. package/server/vendored-lock-recorder.ts +968 -0
  163. package/server/worktree-identity.ts +121 -0
  164. package/server/worktree-management.ts +398 -0
  165. package/server/worktree-retention.d.mts +13 -0
  166. package/server/worktree-retention.mjs +205 -0
  167. package/src/EditorContext.tsx +169 -0
  168. package/src/account.ts +333 -0
  169. package/src/action-registry.ts +532 -0
  170. package/src/active-product.ts +74 -0
  171. package/src/active-project.ts +155 -0
  172. package/src/adapter-editor-config.ts +25 -0
  173. package/src/adapter-observation.ts +49 -0
  174. package/src/animation/stage-transport.ts +379 -0
  175. package/src/animation/three-clips-subject.ts +172 -0
  176. package/src/api/asset-library-wire.ts +45 -0
  177. package/src/api/assets.ts +365 -0
  178. package/src/api/base.ts +10 -0
  179. package/src/api/build.ts +99 -0
  180. package/src/api/git-wire.ts +56 -0
  181. package/src/api/logs.ts +92 -0
  182. package/src/api/project-identity.ts +74 -0
  183. package/src/api/project-open.ts +355 -0
  184. package/src/api/project-source.ts +162 -0
  185. package/src/api/project-state.ts +107 -0
  186. package/src/api/relay.ts +268 -0
  187. package/src/api/settings.ts +36 -0
  188. package/src/api/themes.ts +45 -0
  189. package/src/api/worktrees.ts +257 -0
  190. package/src/asset-compare-core.ts +171 -0
  191. package/src/asset-compare.ts +294 -0
  192. package/src/asset-editor-context.tsx +100 -0
  193. package/src/asset-events.ts +97 -0
  194. package/src/asset-inspector-actions.ts +87 -0
  195. package/src/asset-preview-framing.ts +357 -0
  196. package/src/asset-preview.ts +2802 -0
  197. package/src/asset-selection-viewer-registry.ts +113 -0
  198. package/src/asset-selection.ts +133 -0
  199. package/src/asset-workflow/asset-capabilities.ts +344 -0
  200. package/src/asset-workflow/asset-import-jobs.ts +106 -0
  201. package/src/asset-workflow/asset-ledger-backend.ts +126 -0
  202. package/src/asset-workflow/asset-ledger.ts +156 -0
  203. package/src/asset-workflow/asset-materialization-report.ts +140 -0
  204. package/src/asset-workflow/asset-pack-manifest.ts +320 -0
  205. package/src/asset-workflow/asset-types.ts +142 -0
  206. package/src/asset-workflow/asset-workflow-quality.ts +61 -0
  207. package/src/asset-workflow/audio-preview-player.ts +193 -0
  208. package/src/asset-workflow/audio-waveform.ts +22 -0
  209. package/src/asset-workflow/cloud-asset-client.ts +263 -0
  210. package/src/asset-workflow/folder-preview.ts +345 -0
  211. package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
  212. package/src/asset-workflow/image-view-scale.ts +32 -0
  213. package/src/asset-workflow/import-contract.ts +124 -0
  214. package/src/asset-workflow/ledger-write-lock.ts +244 -0
  215. package/src/asset-workflow/model-inspection.ts +818 -0
  216. package/src/asset-workflow/pixi-spritesheet.ts +197 -0
  217. package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
  218. package/src/asset-workflow/project-asset-commands.ts +23 -0
  219. package/src/asset-workflow/project-asset-health.ts +139 -0
  220. package/src/asset-workflow/project-asset-operations.ts +154 -0
  221. package/src/asset-workflow/project-asset-roots.ts +68 -0
  222. package/src/asset-workflow/project-content.ts +288 -0
  223. package/src/asset-workflow/project-source-index.ts +550 -0
  224. package/src/asset-workflow/thumbnail-system.ts +256 -0
  225. package/src/authoring/active-adapter.ts +199 -0
  226. package/src/authoring/active-systems.ts +422 -0
  227. package/src/authoring/adapter-key.ts +18 -0
  228. package/src/authoring/authoring-asset-url.ts +27 -0
  229. package/src/authoring/bootstrap-state.ts +49 -0
  230. package/src/authoring/boundary-authoring-adapter.ts +184 -0
  231. package/src/authoring/breakpoint-state.ts +43 -0
  232. package/src/authoring/canvas-scene-guides.ts +76 -0
  233. package/src/authoring/component-instance-root.ts +171 -0
  234. package/src/authoring/composite-authoring-adapter.ts +2110 -0
  235. package/src/authoring/consumer-actions.ts +520 -0
  236. package/src/authoring/css-numeric-style.ts +97 -0
  237. package/src/authoring/design-time-layers.ts +849 -0
  238. package/src/authoring/design-time-mount-registry.ts +235 -0
  239. package/src/authoring/design-time-settle.ts +343 -0
  240. package/src/authoring/edit-mode-authoring.ts +619 -0
  241. package/src/authoring/eyedropper-session.ts +60 -0
  242. package/src/authoring/instance-source-menu-register.ts +13 -0
  243. package/src/authoring/instance-source-menu.ts +135 -0
  244. package/src/authoring/layered-pick.ts +183 -0
  245. package/src/authoring/live-gesture-lock.ts +50 -0
  246. package/src/authoring/live-object-transform.ts +62 -0
  247. package/src/authoring/mount-failure-report.ts +154 -0
  248. package/src/authoring/mounted-root-subjects.ts +144 -0
  249. package/src/authoring/no-authoring-adapter.ts +55 -0
  250. package/src/authoring/null-inspection-subjects.tsx +75 -0
  251. package/src/authoring/object3d-document-persistence.ts +106 -0
  252. package/src/authoring/object3d-document-session-registry.ts +120 -0
  253. package/src/authoring/object3d-document-session.ts +1326 -0
  254. package/src/authoring/object3d-gesture-controller.ts +113 -0
  255. package/src/authoring/panel-authoring.ts +121 -0
  256. package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
  257. package/src/authoring/prefab-instance-section-model.ts +55 -0
  258. package/src/authoring/project-authoring-session.ts +105 -0
  259. package/src/authoring/provenance.ts +99 -0
  260. package/src/authoring/quarks-particle-systems.ts +19 -0
  261. package/src/authoring/react-canvas-navigation.ts +255 -0
  262. package/src/authoring/react-design-canvas-style.ts +20 -0
  263. package/src/authoring/react-story-board.ts +937 -0
  264. package/src/authoring/selection-scope.ts +195 -0
  265. package/src/authoring/shell-document-ops.ts +169 -0
  266. package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
  267. package/src/authoring/shell-viewport-policy.ts +48 -0
  268. package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
  269. package/src/authoring/stories-scope.ts +35 -0
  270. package/src/authoring/story-board-chrome-fit.ts +107 -0
  271. package/src/authoring/story-board-presentation.ts +111 -0
  272. package/src/authoring/three-projection-core.ts +226 -0
  273. package/src/authoring/viewport-pick-context.ts +40 -0
  274. package/src/authoring/viewport-raycast.ts +240 -0
  275. package/src/authoring/viewport-tool-context.ts +73 -0
  276. package/src/authoring/world-canvas-viewport-state.ts +35 -0
  277. package/src/authoring/world-hidden-viewport.ts +152 -0
  278. package/src/authoring/world-pan-state.ts +198 -0
  279. package/src/authoring/world-session-state.ts +101 -0
  280. package/src/authoring/write-pipe.ts +173 -0
  281. package/src/availability-tick.ts +66 -0
  282. package/src/bitmap-label.ts +120 -0
  283. package/src/blender-tab-metrics.ts +161 -0
  284. package/src/board-open-actions.ts +20 -0
  285. package/src/boot-routing.ts +391 -0
  286. package/src/build-identity.ts +15 -0
  287. package/src/bytes-codec.ts +62 -0
  288. package/src/camera-authoring.ts +175 -0
  289. package/src/cancellation-reason.ts +58 -0
  290. package/src/canvas-preview-frames.ts +482 -0
  291. package/src/capture-camera-pose.ts +77 -0
  292. package/src/chrome-registry.ts +159 -0
  293. package/src/chrome-slot-registry.ts +91 -0
  294. package/src/collaboration-client.ts +264 -0
  295. package/src/collaboration-presence.ts +41 -0
  296. package/src/command-dispatch.ts +19 -0
  297. package/src/command-listener.ts +2743 -0
  298. package/src/command-registry.ts +70 -0
  299. package/src/component-board-registry.ts +205 -0
  300. package/src/component-states-registry.ts +200 -0
  301. package/src/components/AgentPresentationNotice.tsx +75 -0
  302. package/src/components/AlignToolbar.tsx +204 -0
  303. package/src/components/AppRoot.tsx +394 -0
  304. package/src/components/ApplicationMenus.tsx +415 -0
  305. package/src/components/AssetBrowser.tsx +2843 -0
  306. package/src/components/AssetEditorShell.tsx +216 -0
  307. package/src/components/AssetInspectorToolSection.tsx +124 -0
  308. package/src/components/BoardRulers.tsx +354 -0
  309. package/src/components/CameraInfo.tsx +81 -0
  310. package/src/components/CanvasSceneViewport.tsx +556 -0
  311. package/src/components/CapabilityCoverageSection.tsx +185 -0
  312. package/src/components/CenterDocuments.tsx +22 -0
  313. package/src/components/ChromeSlot.tsx +20 -0
  314. package/src/components/CodeView.tsx +470 -0
  315. package/src/components/CollaborationHeaderControl.css +74 -0
  316. package/src/components/CompactInspectorCard.tsx +190 -0
  317. package/src/components/CompactInspectorShell.tsx +39 -0
  318. package/src/components/ConsolePanel.css +55 -0
  319. package/src/components/ConsolePanel.tsx +270 -0
  320. package/src/components/DefaultEditorLayout.tsx +106 -0
  321. package/src/components/DocumentHeaderStrip.tsx +96 -0
  322. package/src/components/DocumentShelfRail.tsx +45 -0
  323. package/src/components/DocumentThumbnail.tsx +345 -0
  324. package/src/components/EditorLeaseGuard.tsx +372 -0
  325. package/src/components/ErrorBanner.tsx +123 -0
  326. package/src/components/FolderPreviewTile.tsx +159 -0
  327. package/src/components/GameHierarchy.tsx +3842 -0
  328. package/src/components/GameplaySessionTimeline.tsx +295 -0
  329. package/src/components/InspectionProjection.tsx +968 -0
  330. package/src/components/Inspector.tsx +233 -0
  331. package/src/components/InspectorCanvasPreview.tsx +35 -0
  332. package/src/components/InspectorFieldsSection.tsx +290 -0
  333. package/src/components/InspectorObjectPreview.tsx +57 -0
  334. package/src/components/InspectorStoriesSection.tsx +92 -0
  335. package/src/components/InspectorToolSection.tsx +96 -0
  336. package/src/components/InspectorTransformSection.tsx +245 -0
  337. package/src/components/LightExplorerPanel.tsx +433 -0
  338. package/src/components/MediaProperties.tsx +145 -0
  339. package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
  340. package/src/components/Object3DDocumentToolbar.css +100 -0
  341. package/src/components/Object3DDocumentToolbar.tsx +454 -0
  342. package/src/components/Object3DDocumentViewport.tsx +58 -0
  343. package/src/components/ProjectHeader.css +617 -0
  344. package/src/components/ProjectHeader.tsx +328 -0
  345. package/src/components/ProjectLayout.tsx +249 -0
  346. package/src/components/ReactCanvasControls.tsx +284 -0
  347. package/src/components/RootSelectionOverlay.tsx +3162 -0
  348. package/src/components/RootTextEditor.tsx +79 -0
  349. package/src/components/SaveStatus.tsx +70 -0
  350. package/src/components/StageHost.tsx +1954 -0
  351. package/src/components/StageOverlays.tsx +21 -0
  352. package/src/components/StartupErrorScreen.tsx +76 -0
  353. package/src/components/StartupLoadingScreen.tsx +65 -0
  354. package/src/components/StatsOverlay.tsx +78 -0
  355. package/src/components/SurfaceStateOverlay.tsx +24 -0
  356. package/src/components/ToolContributionSurfaces.tsx +65 -0
  357. package/src/components/ToolHost.tsx +370 -0
  358. package/src/components/ToolObject3DPreview.tsx +39 -0
  359. package/src/components/Toolbar.tsx +595 -0
  360. package/src/components/TransientHint.tsx +44 -0
  361. package/src/components/TransportStrip.tsx +174 -0
  362. package/src/components/VersionControlSection.tsx +470 -0
  363. package/src/components/VgaiLogo.css +83 -0
  364. package/src/components/VgaiLogo.tsx +35 -0
  365. package/src/components/ViewportControlsHint.tsx +60 -0
  366. package/src/components/ViewportFurniture.tsx +401 -0
  367. package/src/components/ViewportOverlay.tsx +145 -0
  368. package/src/components/ViewportOverlaysMenu.tsx +153 -0
  369. package/src/components/ViewportShadingMenu.tsx +300 -0
  370. package/src/components/ViewportViewMenu.tsx +101 -0
  371. package/src/components/WorkspaceDocumentSurface.tsx +204 -0
  372. package/src/components/WorkspaceUtilitySurface.tsx +22 -0
  373. package/src/components/WorktreeSwitcher.css +239 -0
  374. package/src/components/WorktreeSwitcher.tsx +890 -0
  375. package/src/components/account-documents.tsx +1162 -0
  376. package/src/components/asset-documents.tsx +812 -0
  377. package/src/components/asset-editor-persistence.ts +216 -0
  378. package/src/components/asset-selection-section.tsx +535 -0
  379. package/src/components/asset-thumbnails.tsx +312 -0
  380. package/src/components/asset-viewers/AudioViewer.tsx +201 -0
  381. package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
  382. package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
  383. package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  384. package/src/components/asset-viewers/ImageViewer.tsx +300 -0
  385. package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
  386. package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
  387. package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
  388. package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
  389. package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
  390. package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
  391. package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
  392. package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
  393. package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
  394. package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
  395. package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  396. package/src/components/asset-viewers/VideoViewer.tsx +101 -0
  397. package/src/components/asset-viewers/shader-source.ts +144 -0
  398. package/src/components/asset-workflow.css +731 -0
  399. package/src/components/board-guides.ts +150 -0
  400. package/src/components/compact-inspector.css +539 -0
  401. package/src/components/core-utilities.tsx +90 -0
  402. package/src/components/editor-notifications.css +40 -0
  403. package/src/components/engine-workspace.css +274 -0
  404. package/src/components/inspector-preview-section.tsx +238 -0
  405. package/src/components/inspector-property-grouping.ts +64 -0
  406. package/src/components/inspector-revert-label.ts +20 -0
  407. package/src/components/inspector-selection.ts +42 -0
  408. package/src/components/inspector-stories-gating.ts +171 -0
  409. package/src/components/inspector-transform-subject.ts +11 -0
  410. package/src/components/inspector-transform.ts +75 -0
  411. package/src/components/kind-documents.tsx +500 -0
  412. package/src/components/palette-action-publisher.tsx +140 -0
  413. package/src/components/primitives/DraftColorInput.tsx +74 -0
  414. package/src/components/product-shell.css +1829 -0
  415. package/src/components/project-tool-documents.tsx +410 -0
  416. package/src/components/scene-documents.tsx +223 -0
  417. package/src/components/stage-keyboard.tsx +37 -0
  418. package/src/components/stage-overlay-set.tsx +107 -0
  419. package/src/components/stage-presence-markers.ts +478 -0
  420. package/src/components/standard-viewport-dressing.ts +417 -0
  421. package/src/components/status-contributions.tsx +403 -0
  422. package/src/components/tool-documents.tsx +309 -0
  423. package/src/components/tool-schema-form.tsx +262 -0
  424. package/src/components/use-after-paint.ts +41 -0
  425. package/src/components/use-project-image-assets.ts +86 -0
  426. package/src/components/viewport-header-controls.css +90 -0
  427. package/src/components/viewport-surface-status.tsx +55 -0
  428. package/src/components/workspace-history.ts +32 -0
  429. package/src/components/workspace-static-panel-registry.tsx +152 -0
  430. package/src/components/workspace-surfaces.css +621 -0
  431. package/src/components/world-documents.tsx +586 -0
  432. package/src/components/world-overlay-gestures.ts +1694 -0
  433. package/src/composite-screenshot.ts +1641 -0
  434. package/src/console-sync.ts +131 -0
  435. package/src/constraint-helper.ts +338 -0
  436. package/src/content-entry-source-registry.ts +184 -0
  437. package/src/coverage/authoring-seam-evidence.ts +300 -0
  438. package/src/coverage/canvas-reveal.ts +192 -0
  439. package/src/coverage/design-time-surfaces.ts +101 -0
  440. package/src/coverage/live-seam-evidence.ts +11 -0
  441. package/src/coverage/ontology-invariants.ts +466 -0
  442. package/src/coverage/session-vitals.ts +501 -0
  443. package/src/coverage/system-seam-evidence.ts +72 -0
  444. package/src/crash-null-boundary.ts +36 -0
  445. package/src/creation-site-edit.ts +1479 -0
  446. package/src/creation-site-registry.ts +160 -0
  447. package/src/delegate-harness-registry.ts +143 -0
  448. package/src/document-context-registry.ts +177 -0
  449. package/src/document-open-registry.ts +200 -0
  450. package/src/document-preview-source.ts +20 -0
  451. package/src/document-renderer-session.ts +138 -0
  452. package/src/editor-api.ts +46 -0
  453. package/src/editor-chrome-capture.ts +139 -0
  454. package/src/editor-commands.ts +164 -0
  455. package/src/editor-console.ts +563 -0
  456. package/src/editor-current-view.ts +82 -0
  457. package/src/editor-document-probe.ts +881 -0
  458. package/src/editor-git-client.ts +115 -0
  459. package/src/editor-host-door.ts +462 -0
  460. package/src/editor-hotkeys.ts +842 -0
  461. package/src/editor-lease-view.ts +39 -0
  462. package/src/editor-lease.ts +415 -0
  463. package/src/editor-mode.ts +19 -0
  464. package/src/editor-notifications.ts +140 -0
  465. package/src/editor-presence.ts +563 -0
  466. package/src/editor-presentation-activity.ts +50 -0
  467. package/src/editor-presentation-notice.ts +42 -0
  468. package/src/editor-runtime.tsx +145 -0
  469. package/src/editor-server-response.ts +86 -0
  470. package/src/editor-session-attribution.ts +75 -0
  471. package/src/editor-session-mode.ts +54 -0
  472. package/src/editor-shell-store.ts +1304 -0
  473. package/src/editor-state-facets.ts +74 -0
  474. package/src/editor-styles.css +33 -0
  475. package/src/editor-view-presentation.ts +810 -0
  476. package/src/editor-viewport.ts +5302 -0
  477. package/src/entity-lod.ts +31 -0
  478. package/src/entity-object.ts +91 -0
  479. package/src/files/file-provider.ts +62 -0
  480. package/src/files/project-files.ts +264 -0
  481. package/src/finders/index.ts +136 -0
  482. package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
  483. package/src/frame/bridge.tsx +1408 -0
  484. package/src/frame/product.ts +77 -0
  485. package/src/gameplay-dom-recording.ts +319 -0
  486. package/src/gameplay-export-state.ts +14 -0
  487. package/src/gameplay-replay.ts +417 -0
  488. package/src/gameplay-session-time.ts +9 -0
  489. package/src/gameplay-sessions.ts +204 -0
  490. package/src/harness-chat-types.ts +253 -0
  491. package/src/hierarchy-component-marks.ts +298 -0
  492. package/src/hierarchy-drop.ts +91 -0
  493. package/src/hierarchy-expansion-state.ts +80 -0
  494. package/src/hierarchy-header-slot.ts +52 -0
  495. package/src/hierarchy-internals.ts +197 -0
  496. package/src/hierarchy-kind-icon.ts +217 -0
  497. package/src/hierarchy-mark-reader.ts +73 -0
  498. package/src/hierarchy-menu-registry.ts +67 -0
  499. package/src/hierarchy-node-rows.ts +307 -0
  500. package/src/hierarchy-panel-view.ts +280 -0
  501. package/src/hierarchy-projection.ts +76 -0
  502. package/src/hierarchy-row-cache.ts +243 -0
  503. package/src/hierarchy-row-model.ts +308 -0
  504. package/src/hierarchy-rows.ts +11 -0
  505. package/src/hierarchy-walk.ts +86 -0
  506. package/src/history/editor-session.ts +25 -0
  507. package/src/history/history-commands.ts +147 -0
  508. package/src/history/history-delegate.ts +163 -0
  509. package/src/history/history-limit-notices.ts +43 -0
  510. package/src/history/history-service.ts +1173 -0
  511. package/src/history/persistence-coordinator.ts +35 -0
  512. package/src/history/project-file-history.ts +386 -0
  513. package/src/history/project-root-history-backends.ts +139 -0
  514. package/src/history/resource-registry.ts +209 -0
  515. package/src/history/snapshot-store.ts +103 -0
  516. package/src/history/source-history-backend.ts +546 -0
  517. package/src/history/types.ts +124 -0
  518. package/src/hmr-registration-group.ts +67 -0
  519. package/src/hmr-stable-react-context.ts +23 -0
  520. package/src/hotkeys.ts +188 -0
  521. package/src/inference-diagnostics.ts +69 -0
  522. package/src/initial-project.ts +80 -0
  523. package/src/inspection/active-subject.ts +578 -0
  524. package/src/inspection/active-surface.ts +142 -0
  525. package/src/inspection/compose.ts +1064 -0
  526. package/src/inspection/display.ts +170 -0
  527. package/src/inspection/document-subject.ts +109 -0
  528. package/src/inspection/game-subject.ts +85 -0
  529. package/src/inspection/model.ts +542 -0
  530. package/src/inspection/null-subject.ts +115 -0
  531. package/src/inspection/serialize.ts +357 -0
  532. package/src/inspection/use-active-inspection.ts +180 -0
  533. package/src/inspector-presentation.ts +201 -0
  534. package/src/inspector-section-registry.ts +221 -0
  535. package/src/instance-source-actions.ts +163 -0
  536. package/src/instanced-presentation.ts +164 -0
  537. package/src/js-heap.ts +71 -0
  538. package/src/key-actions.ts +91 -0
  539. package/src/keymap-presets.ts +401 -0
  540. package/src/layout-policy.ts +31 -0
  541. package/src/learn-links.ts +73 -0
  542. package/src/light-explorer-model.ts +134 -0
  543. package/src/live-canvas-frame.ts +55 -0
  544. package/src/live-document.ts +279 -0
  545. package/src/live-module-source.ts +230 -0
  546. package/src/live-session-registry.ts +220 -0
  547. package/src/live-transition.ts +633 -0
  548. package/src/manifest-project.ts +107 -0
  549. package/src/model-thumbnail.ts +523 -0
  550. package/src/native-selection-style.ts +202 -0
  551. package/src/object3d-document-write-policy.ts +137 -0
  552. package/src/packaged-runtime.ts +108 -0
  553. package/src/palettes/maya.palette.json +57 -0
  554. package/src/palettes/substance.palette.json +57 -0
  555. package/src/pasteboard-module.ts +81 -0
  556. package/src/performance-profiler.ts +367 -0
  557. package/src/performance-sources.ts +69 -0
  558. package/src/play-boot-phase.ts +145 -0
  559. package/src/presentation-surface.ts +248 -0
  560. package/src/project-adapter.ts +1143 -0
  561. package/src/project-asset-refresh.ts +26 -0
  562. package/src/project-declaration-refresh.ts +31 -0
  563. package/src/project-local-state.ts +118 -0
  564. package/src/project-manager.ts +243 -0
  565. package/src/project-module-changes.ts +163 -0
  566. package/src/project-module-split.ts +266 -0
  567. package/src/project-provenance.ts +115 -0
  568. package/src/project-ready.ts +42 -0
  569. package/src/project-session-reset.ts +67 -0
  570. package/src/project-shape.ts +68 -0
  571. package/src/project-tool-discovery.ts +66 -0
  572. package/src/project-tools.ts +107 -0
  573. package/src/project-work-types.ts +149 -0
  574. package/src/projection/three.ts +898 -0
  575. package/src/projection/types.ts +44 -0
  576. package/src/readiness.ts +113 -0
  577. package/src/reflection-probe-helper.ts +142 -0
  578. package/src/reported-play-state.ts +90 -0
  579. package/src/resolve-relative-specifier.ts +33 -0
  580. package/src/scene-document-plan.ts +315 -0
  581. package/src/scene-framing.ts +315 -0
  582. package/src/scene-live-open.ts +210 -0
  583. package/src/scene-view-fog.ts +89 -0
  584. package/src/scoped-game-css.ts +152 -0
  585. package/src/session-orphan-record.ts +193 -0
  586. package/src/session-tombstone.ts +126 -0
  587. package/src/settings/settings-provider.ts +82 -0
  588. package/src/settings-store.ts +345 -0
  589. package/src/shared-view-restore.ts +42 -0
  590. package/src/shell-store-door.ts +45 -0
  591. package/src/source-conflict.ts +122 -0
  592. package/src/spatial-handle-visuals.ts +332 -0
  593. package/src/stage-context.ts +341 -0
  594. package/src/stage-store-registry.ts +63 -0
  595. package/src/stale-chunk-recovery.ts +34 -0
  596. package/src/state-report-deferral.ts +73 -0
  597. package/src/storage/host-files-storage.ts +97 -0
  598. package/src/storage/http-storage.ts +174 -0
  599. package/src/storage/index.ts +75 -0
  600. package/src/storage/mem-storage.ts +149 -0
  601. package/src/storage/path-lock.ts +44 -0
  602. package/src/storage/paths.ts +26 -0
  603. package/src/storage/types.ts +116 -0
  604. package/src/stories/StoryComponentThumbnail.tsx +184 -0
  605. package/src/stories/StoryPreviewMount.tsx +306 -0
  606. package/src/stories/component-content-source.tsx +106 -0
  607. package/src/stories/component-states-source.ts +78 -0
  608. package/src/stories/compose-project-stories.ts +255 -0
  609. package/src/stories/pixi-story-model.ts +30 -0
  610. package/src/stories/prefabs-finder.ts +54 -0
  611. package/src/stories/prefabs-from-stories.ts +182 -0
  612. package/src/stories/project-story-discovery.ts +78 -0
  613. package/src/stories/project-story-regions.ts +24 -0
  614. package/src/stories/story-actions.ts +54 -0
  615. package/src/stories/story-capture-command.ts +124 -0
  616. package/src/stories/story-capture.ts +584 -0
  617. package/src/stories/story-declared-medium.ts +126 -0
  618. package/src/stories/story-discovery.ts +176 -0
  619. package/src/stories/story-document-openers.ts +36 -0
  620. package/src/stories/story-dom-runtime.ts +78 -0
  621. package/src/stories/story-grouping.ts +111 -0
  622. package/src/stories/story-lane.ts +88 -0
  623. package/src/stories/story-mount-turn.ts +27 -0
  624. package/src/stories/story-opener.ts +260 -0
  625. package/src/stories/story-pixi-preview.ts +408 -0
  626. package/src/stories/story-presentation.ts +215 -0
  627. package/src/stories/story-registry.ts +517 -0
  628. package/src/stories/story-three-preview.ts +807 -0
  629. package/src/stories/three-story-model.ts +96 -0
  630. package/src/story-three-preview-runtime.ts +56 -0
  631. package/src/surface-keyboard.ts +112 -0
  632. package/src/surface-state.ts +124 -0
  633. package/src/tab-bootstrap.js +628 -0
  634. package/src/tab-census.ts +198 -0
  635. package/src/tab-lifecycle-client.ts +196 -0
  636. package/src/theme-library.ts +844 -0
  637. package/src/theme-preference.ts +378 -0
  638. package/src/theme.css +3437 -0
  639. package/src/three-viewport/bone-selection-highlight.ts +119 -0
  640. package/src/three-viewport/camera-fit.ts +41 -0
  641. package/src/three-viewport/interactive-renderer.ts +132 -0
  642. package/src/three-viewport/selection-brackets.ts +310 -0
  643. package/src/three-viewport/selection-outline.ts +183 -0
  644. package/src/three-viewport/skeleton-helper.ts +61 -0
  645. package/src/three-viewport/source-color.ts +167 -0
  646. package/src/three-viewport/studio-environment.ts +96 -0
  647. package/src/three-viewport-presentation.ts +23 -0
  648. package/src/tool-contribution-play.ts +74 -0
  649. package/src/tool-loader.ts +1798 -0
  650. package/src/transform-mode-request.ts +57 -0
  651. package/src/transient-hint.ts +78 -0
  652. package/src/trigger-volume-helper.ts +116 -0
  653. package/src/ui-source/adapter-region-includes.ts +241 -0
  654. package/src/ui-source/ensure-import.ts +132 -0
  655. package/src/ui-source/file-region-resolver.ts +302 -0
  656. package/src/ui-source/inspect.ts +775 -0
  657. package/src/ui-source/oid-transform.ts +1845 -0
  658. package/src/ui-source/plan-csf-story.ts +196 -0
  659. package/src/ui-source/plan-extract-component.ts +421 -0
  660. package/src/ui-source/plan-fork-component.ts +621 -0
  661. package/src/ui-source/plan-named-style.ts +95 -0
  662. package/src/ui-source/plan-source-edit.ts +353 -0
  663. package/src/ui-source/r3f-contract-resolver.ts +327 -0
  664. package/src/ui-source/r3f-diagnostic-index.ts +165 -0
  665. package/src/ui-source/r3f-environment-binding.ts +133 -0
  666. package/src/ui-source/r3f-joint-binding.ts +251 -0
  667. package/src/ui-source/r3f-lod-binding.ts +91 -0
  668. package/src/ui-source/r3f-particle-binding.ts +235 -0
  669. package/src/ui-source/r3f-physics-binding.ts +483 -0
  670. package/src/ui-source/r3f-project-contracts.ts +444 -0
  671. package/src/ui-source/relative-import-specifier.ts +34 -0
  672. package/src/ui-source/reparent-guard.ts +544 -0
  673. package/src/ui-source/source-edit-request.ts +97 -0
  674. package/src/ui-source/source-write-backend.ts +618 -0
  675. package/src/ui-source/syntactic-prop-specs.ts +296 -0
  676. package/src/ui-source/tier-source-write-backend.ts +279 -0
  677. package/src/ui-source/ts-ast.ts +171 -0
  678. package/src/ui-source/utility-class-support.ts +169 -0
  679. package/src/ui-source/write-component-default.ts +133 -0
  680. package/src/ui-source/writer.ts +1989 -0
  681. package/src/viewport-activation-timings.ts +840 -0
  682. package/src/viewport-authoring-policy.ts +186 -0
  683. package/src/viewport-controls-hint.ts +57 -0
  684. package/src/viewport-door.ts +237 -0
  685. package/src/viewport-shading-boundary.ts +12 -0
  686. package/src/vite-error-surface.ts +141 -0
  687. package/src/wait-until.ts +37 -0
  688. package/src/workspace-areas.ts +156 -0
  689. package/src/workspace-aux-commands.ts +11 -0
  690. package/src/workspace-available-documents.ts +127 -0
  691. package/src/workspace-core-utilities.ts +31 -0
  692. package/src/workspace-document-ids.ts +59 -0
  693. package/src/workspace-document-registry.ts +612 -0
  694. package/src/workspace-document-restore.ts +145 -0
  695. package/src/workspace-host-commands.ts +141 -0
  696. package/src/workspace-persistence-gate.ts +40 -0
  697. package/src/workspace-play-utilities.ts +44 -0
  698. package/src/workspace-presets.ts +425 -0
  699. package/src/workspace-regions.ts +294 -0
  700. package/src/workspace-state-persistence.ts +536 -0
  701. package/src/workspace-static-panels.ts +73 -0
  702. package/src/workspace-status-registry.ts +121 -0
  703. package/src/workspace-style.ts +239 -0
  704. package/src/workspace-utility-commands.ts +74 -0
  705. package/src/workspace-utility-registry.ts +263 -0
  706. package/src/workspace-viewport-rect.ts +97 -0
  707. package/src/world-adoption.ts +115 -0
  708. package/src/world-document-routing.ts +104 -0
  709. package/vite-plugin-creation-site-write.ts +184 -0
  710. package/vite-plugin-creation-site.ts +80 -0
  711. package/vite-plugin-game-static.ts +303 -0
  712. package/vite-plugin-module-doorways.ts +336 -0
  713. package/vite-plugin-product-contributions.ts +197 -0
  714. package/vite-plugin-project-game-static.ts +125 -0
  715. package/vite-plugin-project-jsx-js.ts +65 -0
  716. package/vite-plugin-project-root-absolute-assets.ts +359 -0
  717. package/vite-plugin-shared-react.ts +420 -0
  718. package/vite-plugin-shared-three.ts +203 -0
  719. package/vite-plugin-ui-oid.ts +2106 -0
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Project-scoped hierarchy expansion preferences.
3
+ *
4
+ * Expansion belongs to an authored node's stable adapter id, not to its
5
+ * current row index. That lets the same preference survive an edit/live
6
+ * adapter replacement (Play/Stop) and ordinary React remounts. The project
7
+ * scope prevents common ids such as `game` or `root` leaking between games.
8
+ *
9
+ * Only explicit user choices are stored. A node with no entry follows the
10
+ * hierarchy's current shallow-open default, so changing the projection does
11
+ * not require a migration of a fully materialized tree state.
12
+ */
13
+
14
+ /** The section of the project-local document this module owns. */
15
+ const SECTION = 'hierarchyExpansion';
16
+
17
+ import {
18
+ projectLocalSection,
19
+ projectLocalStateReady,
20
+ writeProjectLocalSection,
21
+ } from './project-local-state';
22
+
23
+ type ProjectPreferences = Map<string, boolean>;
24
+
25
+ const preferences = new Map<string, ProjectPreferences>();
26
+ let hydrated = false;
27
+
28
+ function hydrate(): void {
29
+ if (hydrated) return;
30
+ if (!projectLocalStateReady()) return;
31
+ hydrated = true;
32
+ const parsed = projectLocalSection<Record<string, Record<string, boolean>>>(SECTION) ?? {};
33
+ for (const [projectId, nodes] of Object.entries(parsed)) {
34
+ preferences.set(projectId, new Map(Object.entries(nodes)));
35
+ }
36
+ }
37
+
38
+ function persist(): void {
39
+ const serialized: Record<string, Record<string, boolean>> = {};
40
+ for (const [projectId, nodes] of preferences) {
41
+ serialized[projectId] = Object.fromEntries(nodes);
42
+ }
43
+ writeProjectLocalSection(SECTION, serialized);
44
+ }
45
+
46
+ export function hierarchyExpansionPreference(
47
+ projectId: string,
48
+ nodeId: string,
49
+ ): boolean | undefined {
50
+ hydrate();
51
+ return preferences.get(projectId)?.get(nodeId);
52
+ }
53
+
54
+ /** Apply a whole branch/view operation with one storage write. */
55
+ export function setHierarchyExpansionPreferences(
56
+ projectId: string,
57
+ entries: Iterable<readonly [nodeId: string, expanded: boolean]>,
58
+ ): void {
59
+ hydrate();
60
+ let project = preferences.get(projectId);
61
+ if (!project) {
62
+ project = new Map();
63
+ preferences.set(projectId, project);
64
+ }
65
+ for (const [nodeId, expanded] of entries) project.set(nodeId, expanded);
66
+ persist();
67
+ }
68
+
69
+ /** Return every node in one project to the shallow first-open policy. */
70
+ export function clearHierarchyExpansionPreferences(projectId: string): void {
71
+ hydrate();
72
+ preferences.delete(projectId);
73
+ persist();
74
+ }
75
+
76
+ /** Test-only reset for this process (the in-memory map; the document is untouched). */
77
+ export function _resetHierarchyExpansionPreferencesForTest(): void {
78
+ preferences.clear();
79
+ hydrated = true;
80
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * The Hierarchy panel's controls do not belong to a row of their own.
3
+ *
4
+ * Blender's Outliner header is ONE row: the editor-type selector, the
5
+ * display-mode selector, the search field, the filter popover and the
6
+ * new-collection button all sit on the same strip, and the tree starts
7
+ * directly under it. Ours had grown three rows — the dock group's tab strip
8
+ * (Content · Hierarchy · Library, which IS Blender's editor-type selector),
9
+ * a provenance breadcrumb, and a search row — for one panel's header.
10
+ *
11
+ * The tab strip is the row that stays, so the controls move ONTO it: this
12
+ * module is the seam. The dock's `rightHeaderActionsComponent` publishes the
13
+ * element it renders for the group whose ACTIVE panel is the Hierarchy
14
+ * (`frame/bridge.tsx`'s outliner part), and `components/GameHierarchy.tsx`
15
+ * portals its controls into it.
16
+ *
17
+ * It is a SLOT, not a control registry: the panel keeps owning its search
18
+ * term, its expansion verbs and its Create menu, and nothing about them is
19
+ * republished through module state. A host that renders the panel without a
20
+ * dock — the design-system stories, a bounded host — publishes no element,
21
+ * and the panel falls back to rendering its own toolbar row inline. That
22
+ * fallback is the reason this is a DOM slot and not a props channel: there is
23
+ * exactly one implementation of the controls either way.
24
+ */
25
+
26
+ let slot: HTMLElement | null = null;
27
+ const listeners = new Set<() => void>();
28
+
29
+ export function hierarchyHeaderSlot(): HTMLElement | null {
30
+ return slot;
31
+ }
32
+
33
+ export function subscribeHierarchyHeaderSlot(listener: () => void): () => void {
34
+ listeners.add(listener);
35
+ return () => {
36
+ listeners.delete(listener);
37
+ };
38
+ }
39
+
40
+ export function setHierarchyHeaderSlot(element: HTMLElement | null): void {
41
+ if (slot === element) return;
42
+ slot = element;
43
+ for (const listener of listeners) listener();
44
+ }
45
+
46
+ /** Clear only if THIS element is still the published one — a dock group that
47
+ * unmounts after its successor has already claimed the slot would otherwise
48
+ * blank a live header. */
49
+ export function clearHierarchyHeaderSlot(element: HTMLElement | null): void {
50
+ if (slot !== element) return;
51
+ setHierarchyHeaderSlot(null);
52
+ }
@@ -0,0 +1,197 @@
1
+ /**
2
+ * "reveal internals, read-only". Godot's Editable Children, minus the editing.
3
+ *
4
+ * WHAT THIS IS. `R3fSourceAuthoringAdapter.projectedChildren` surfaces only
5
+ * CROSS-BOUNDARY children: an instance's own host nodes and its unstamped model
6
+ * internals (bones, GLTF meshes) are "traversed but not surfaced", so an
7
+ * `<Enemy>` reads as a leaf even though it rendered a 60-bone rig. Everything
8
+ * needed to show that rig already exists — `indexGraph` mints a path-keyed id
9
+ * for every non-helper object and `hierarchy.node(id)` describes it — so this
10
+ * module adds no identity machinery. It adds a VIEW: a decorator over the
11
+ * adapter's `HierarchyProvider` that appends the hidden children of the ids the
12
+ * author revealed, and answers which ids it minted rows for.
13
+ *
14
+ * WHY A DECORATOR AND NOT A NEW FLATTENER. `flattenHierarchyRows` walks
15
+ * `roots()`/`node(id).childIds`; virtualization, the child cap, collapse,
16
+ * selection-reveal and the search filter are all layered on TOP of that one
17
+ * walk. Injecting internals INTO the provider means every one of those keeps
18
+ * working untouched — a revealed skeleton is windowed, capped and collapsed by
19
+ * the same code as everything else, and no second row pipeline exists to drift.
20
+ *
21
+ * WHY THE STATE IS SESSION-ONLY. Reveal is deliberately NOT written to
22
+ * `hierarchy-expansion-state.ts` (which persists per project in localStorage):
23
+ * a skeleton that reappears on every project open is noise in the panel the
24
+ * author needs most, and unlike a normal fold it is not a statement about the
25
+ * authored tree at all — it is a temporary "let me look inside this". It lives
26
+ * in a module-level Set for the life of the tab, cleared on project switch by
27
+ * nothing at all, because ids are project-scoped (`r3f:<worldId>:<oid>`) and a
28
+ * stale id simply never matches.
29
+ *
30
+ * READ-ONLY IS ENFORCED ELSEWHERE, ON PURPOSE: this module only says WHICH rows
31
+ * are internal; `hierarchy-row-model.ts`'s `rowAffordances` is the single
32
+ * predicate that turns that into "no drag, no rename, no write, no search".
33
+ */
34
+
35
+ import type { EditorNode, HierarchyProvider } from '@volter/editor-project/adapter';
36
+
37
+ /** The (optional, structural) adapter capability H6 needs — the same
38
+ * contract-free probe shape H3's `InstanceSourceLocator` and H5's
39
+ * `RowDiagnosticsSource` use, so no adapter is forced to implement it and no
40
+ * editor module imports an R3F type to read it. */
41
+ export interface InternalsSource {
42
+ readonly hierarchy: Pick<HierarchyProvider, 'roots' | 'node'>;
43
+ /** Cheap "would revealing this row show anything?" — used to decide whether
44
+ * the menu item appears at all. */
45
+ readonly hasInternals?: ((id: string) => boolean) | undefined;
46
+ /** The RAW live children of `id` that the adapter's own projection hides,
47
+ * each described exactly as `hierarchy.node` would describe it, but
48
+ * re-parented to its RAW parent so a revealed subtree reads as the tree it
49
+ * actually is. `undefined` for an id the adapter does not own. */
50
+ readonly internalChildren?: ((id: string) => EditorNode[] | undefined) | undefined;
51
+ }
52
+
53
+ export interface InternalsProjection {
54
+ /** The provider to flatten. Identity-equal to the source's own when nothing
55
+ * is revealed, so the common case costs nothing. */
56
+ readonly hierarchy: Pick<HierarchyProvider, 'roots' | 'node'>;
57
+ /** True for a row that exists ONLY because of a reveal. */
58
+ isInternal(id: string): boolean;
59
+ /** The revealed ids that actually produced rows (a revealed id whose object
60
+ * is gone after an HMR remount is silently inert, not an error). */
61
+ readonly revealRootIds: ReadonlySet<string>;
62
+ /** Every id this projection minted a row for, transitively. */
63
+ readonly internalIds: ReadonlySet<string>;
64
+ }
65
+
66
+ /** Depth backstop for a pathological live tree — the same belt-and-braces
67
+ * constant `hierarchy-node-rows.ts` keeps for the same reason. */
68
+ const MAX_DEPTH = 500;
69
+
70
+ const EMPTY: ReadonlySet<string> = new Set();
71
+
72
+ // ------------------------------------------------------------ session state
73
+
74
+ /**
75
+ * Ids whose internals are currently revealed. Module-level and NOT persisted —
76
+ * see this file's header for why a revealed skeleton must not survive a reload.
77
+ */
78
+ const revealed = new Set<string>();
79
+
80
+ export function isInternalsRevealed(id: string): boolean {
81
+ return revealed.has(id);
82
+ }
83
+
84
+ /** Returns the new state, so a caller can report what it did. */
85
+ export function toggleInternalsRevealed(id: string): boolean {
86
+ if (revealed.delete(id)) return false;
87
+ revealed.add(id);
88
+ return true;
89
+ }
90
+
91
+ export function revealedInternalsIds(): ReadonlySet<string> {
92
+ return revealed;
93
+ }
94
+
95
+ /** Test-only reset for the module-level session set. */
96
+ export function __resetRevealedInternalsForTest(): void {
97
+ revealed.clear();
98
+ }
99
+
100
+ // -------------------------------------------------------------- projection
101
+
102
+ /**
103
+ * Build the revealing view of `source.hierarchy`.
104
+ *
105
+ * The walk is EAGER (every revealed subtree is expanded to its leaves up
106
+ * front) rather than lazy inside `node()`, because "is this row internal?" must
107
+ * be answerable in any order — the panel asks it while rendering a row, long
108
+ * after the flatten that produced it, and a lazily-populated set would make the
109
+ * answer depend on call order. It costs one `internalChildren` call per
110
+ * revealed node, which the R3F adapter answers in O(children × depth) with no
111
+ * subtree walk.
112
+ *
113
+ * A revealed node's internals are appended AFTER its projected children, which
114
+ * is what keeps a nested instance's row in its authored place: the flattener
115
+ * dedupes by id on first occurrence, so the instance is emitted as the real
116
+ * child it is, and the internal path that also reaches it is skipped.
117
+ */
118
+ export function internalsProjection(
119
+ source: InternalsSource,
120
+ revealedIds: ReadonlySet<string> = revealed,
121
+ ): InternalsProjection {
122
+ // Called THROUGH `source` below, never as a detached reference: every real
123
+ // implementer is a class method that needs its own `this`.
124
+ if (typeof source.internalChildren !== 'function' || revealedIds.size === 0) {
125
+ return {
126
+ hierarchy: source.hierarchy,
127
+ isInternal: () => false,
128
+ revealRootIds: EMPTY,
129
+ internalIds: EMPTY,
130
+ };
131
+ }
132
+
133
+ /** id -> the internal child ids appended to it. */
134
+ const appended = new Map<string, string[]>();
135
+ /** id -> the node an internal row renders (never re-asked of the adapter,
136
+ * whose own `node()` would answer with the PROJECTED parent). */
137
+ const internalNodes = new Map<string, EditorNode>();
138
+ const revealRootIds = new Set<string>();
139
+
140
+ const walk = (id: string, depth: number): void => {
141
+ if (depth > MAX_DEPTH || appended.has(id)) return;
142
+ const children = source.internalChildren!(id) ?? [];
143
+ if (children.length === 0) return;
144
+ appended.set(
145
+ id,
146
+ children.map((child) => child.id),
147
+ );
148
+ for (const child of children) {
149
+ if (internalNodes.has(child.id)) continue;
150
+ internalNodes.set(child.id, child);
151
+ walk(child.id, depth + 1);
152
+ }
153
+ };
154
+
155
+ for (const id of revealedIds) {
156
+ walk(id, 0);
157
+ if (appended.has(id)) revealRootIds.add(id);
158
+ }
159
+
160
+ const decorate = (node: EditorNode | null): EditorNode | null => {
161
+ if (!node) return null;
162
+ const extra = appended.get(node.id);
163
+ return extra ? { ...node, childIds: [...node.childIds, ...extra] } : node;
164
+ };
165
+
166
+ return {
167
+ hierarchy: {
168
+ roots: () => source.hierarchy.roots().map((root) => decorate(root)!),
169
+ node: (id) => decorate(internalNodes.get(id) ?? source.hierarchy.node(id)),
170
+ },
171
+ isInternal: (id) => internalNodes.has(id),
172
+ revealRootIds,
173
+ internalIds: new Set(internalNodes.keys()),
174
+ };
175
+ }
176
+
177
+ /**
178
+ * H6's first-open policy, applied ON TOP of the panel's own
179
+ * `defaultExpansionByNode` result: **the reveal root's direct children are
180
+ * visible, everything deeper starts folded.**
181
+ *
182
+ * Two overrides express exactly that. The revealed row itself opens (otherwise
183
+ * "Reveal Internals" would appear to do nothing on an instance that happened to
184
+ * be folded), and every internal row starts closed — a rig is 60 rows deep and
185
+ * dumping all of it into the panel is the opposite of the "look inside this one
186
+ * thing" the action is for. Both are DEFAULTS: an explicit fold the author
187
+ * performs afterwards still wins, because the panel consults session and
188
+ * persisted preferences before this map.
189
+ */
190
+ export function applyRevealExpansionDefaults(
191
+ defaults: Map<string, boolean>,
192
+ projection: Pick<InternalsProjection, 'revealRootIds' | 'internalIds'>,
193
+ ): Map<string, boolean> {
194
+ for (const id of projection.internalIds) defaults.set(id, false);
195
+ for (const id of projection.revealRootIds) defaults.set(id, true);
196
+ return defaults;
197
+ }
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Hierarchy row glyphs. Canvas kinds used to fall through to a circle because
3
+ * KIND_ICON only named three-lane kinds — every Sprite/Text/Container looked
4
+ * the same.
5
+ *
6
+ * THE THREE OBJECT KINDS OWN THEIR NAMES, for the same reason
7
+ * `editorIcons.modeling` does (`components/primitives/editor-icons.ts` — read
8
+ * its docblock) and here the reason is COLOUR rather than shape. An icon set
9
+ * keys a glyph by `icon.iconName` and may give it a category TONE, so a tone
10
+ * on `cube` would tint EVERY site that asks for a cube — and measured in the
11
+ * live editor, the Blender set's `object` orange landed on the viewport
12
+ * header's Perspective/Orthographic dropdown (`Object3DDocumentToolbar.tsx`
13
+ * draws it with `faCube`) and on the transform-space toggle, neither of which
14
+ * is an object. `faLightbulb` and `faCamera` reuse the same way (the viewport
15
+ * lighting overlay, the camera view menu).
16
+ *
17
+ * Blender's evidence for the colour is the OUTLINER specifically — a row's
18
+ * type glyph — so the tone belongs to a name only the outliner asks for.
19
+ * The `icon` tuple stays Font Awesome's, so a set that does not carry these
20
+ * names paints exactly what it painted before.
21
+ */
22
+ import type { IconDefinition } from '@fortawesome/fontawesome-svg-core';
23
+ import {
24
+ faBookOpen,
25
+ faCamera,
26
+ faCircle,
27
+ faCircleDot,
28
+ faCirclePlay,
29
+ faCode,
30
+ faCube,
31
+ faDrawPolygon,
32
+ faFont,
33
+ faImage,
34
+ faLayerGroup,
35
+ faLightbulb,
36
+ faLink,
37
+ faList,
38
+ faObjectGroup,
39
+ faPuzzlePiece,
40
+ faSquare,
41
+ faSquareCheck,
42
+ faVideoSlash,
43
+ faVolumeHigh,
44
+ } from '@fortawesome/free-solid-svg-icons';
45
+
46
+ /** A definition under a name of OURS carrying Font Awesome's drawing until an
47
+ * icon set supplies its own — the same three lines as `editor-icons.ts`'s
48
+ * `meshGlyph`, kept local so this module's import closure stays FA-only. */
49
+ function outlinerGlyph(iconName: string, source: IconDefinition): IconDefinition {
50
+ return { ...source, iconName: iconName as IconDefinition['iconName'] };
51
+ }
52
+
53
+ const OUTLINER_OBJECT = outlinerGlyph('outliner-object', faCube);
54
+ const OUTLINER_LIGHT = outlinerGlyph('outliner-light', faLightbulb);
55
+ const OUTLINER_CAMERA = outlinerGlyph('outliner-camera', faCamera);
56
+ // The speaker is the header's mute button too (`HeaderTelemetry.tsx`), which is
57
+ // exactly the reuse this module's docblock names: an outliner tone on the bare
58
+ // `volume-high` would tint that control as well.
59
+ const OUTLINER_AUDIO = outlinerGlyph('outliner-audio', faVolumeHigh);
60
+ /**
61
+ * A DATABLOCK row, not an object row — the geometry a mesh carries
62
+ * (ARCHITECTURE-CORE §A model is
63
+ * data). Blender's Outliner draws it in the DATA green where the object above
64
+ * it is orange, which is the whole reason it gets a name of its own rather
65
+ * than reusing the rail's `properties-data`: the two are the same drawing but
66
+ * the two sites' STATES differ: the outliner composites its glyphs at α 0.80
67
+ * over the row, and so does the Properties rail's CLOSED tab, while its open
68
+ * tab paints the ink full. One ink, three states — the palette carries the
69
+ * ink and each site declares its own alpha (`theme.ts`'s category docblock
70
+ * carries the solve and the frames it was measured in).
71
+ */
72
+ const OUTLINER_DATA = outlinerGlyph('outliner-data', faDrawPolygon);
73
+ /**
74
+ * A MESH object's own mark. Blender's Outliner does not draw a cube for one:
75
+ * measured on `outliner.png`, the Cube row carries an apex-down triangle — the
76
+ * object-type sibling of the datablock's mark, in the object orange — while
77
+ * `outliner-object`'s cube stays for a generic three-object row that names no
78
+ * mesh. A set without the name draws Font Awesome's cube, exactly as before.
79
+ */
80
+ const OUTLINER_MESH = outlinerGlyph('outliner-mesh', faCube);
81
+
82
+ const KIND_ICON: Record<string, IconDefinition> = {
83
+ three: OUTLINER_OBJECT,
84
+ react: faCode,
85
+ canvas: faLayerGroup,
86
+ scene: faBookOpen,
87
+ mesh: OUTLINER_MESH,
88
+ 'skinned-mesh': OUTLINER_MESH,
89
+ 'mesh-data': OUTLINER_DATA,
90
+ // A MODEL DOCUMENT'S ROOT is the datablock, not an object carrying one
91
+ // (ARCHITECTURE-CORE §A model is data) — which is why `@volter/editor-blender` hangs a
92
+ // `mesh-data` row off it in the first place. These are the two kind names
93
+ // `source-object3d-authoring-adapter.ts` mints for that root, and they read
94
+ // the DATA glyph for the same reason `mesh-data` does. This is the "one
95
+ // line here and nothing else moves" the note below describes; the consumer
96
+ // that needed it is the Properties breadcrumb, whose glyph Blender takes
97
+ // from the datablock and never from the open tab.
98
+ 'three-source': OUTLINER_DATA,
99
+ 'model-asset': OUTLINER_DATA,
100
+ light: OUTLINER_LIGHT,
101
+ camera: OUTLINER_CAMERA,
102
+ audio: OUTLINER_AUDIO,
103
+ 'reflection-probe': faCircleDot,
104
+ group: faObjectGroup,
105
+ object: faCircle,
106
+ component: faPuzzlePiece,
107
+ img: faImage,
108
+ a: faLink,
109
+ ul: faList,
110
+ ol: faList,
111
+ li: faList,
112
+ button: faSquare,
113
+ sprite: faImage,
114
+ animatedsprite: faCirclePlay,
115
+ nineslicesprite: faImage,
116
+ tilingsprite: faImage,
117
+ text: faFont,
118
+ graphics: faSquare,
119
+ container: faObjectGroup,
120
+ };
121
+
122
+ /**
123
+ * THE TWO RESTRICTION-COLUMN GLYPHS THAT ARE NOT THE EYE — Blender's Disable
124
+ * in Renders column (`outliner_draw.cc:1363-1384`). Names of OURS for the same
125
+ * reason the outliner marks above have them: the bare `camera` name is the
126
+ * viewport header's camera menu, and a skin that drew Blender's
127
+ * `restrict_render_*` mark under it would repaint that menu too.
128
+ */
129
+ export const OUTLINER_RENDER_ON = outlinerGlyph('outliner-render-on', faCamera);
130
+ export const OUTLINER_RENDER_OFF = outlinerGlyph('outliner-render-off', faVideoSlash);
131
+
132
+ /**
133
+ * THE EXCLUDE COLUMN's pair — Blender's leftmost restriction column, drawn for
134
+ * `LayerCollection` rows (`outliner_draw.cc:1634-1653`). It asks for
135
+ * `ICON_NONE` on an icon toggle, which is how a boolean draws the WIDGET's own
136
+ * checkbox, so the marks are `checkbox_hlt` / `checkbox_dehlt` — named here the
137
+ * way the render pair is, because a bare `checkbox` name would repaint every
138
+ * checkbox in the editor.
139
+ */
140
+ export const OUTLINER_EXCLUDE_ON = outlinerGlyph('outliner-exclude-on', faSquareCheck);
141
+ export const OUTLINER_EXCLUDE_OFF = outlinerGlyph('outliner-exclude-off', faSquare);
142
+
143
+ /**
144
+ * A `blender-` KIND NAMES ITS OWN GLYPH, and that is the whole rule.
145
+ *
146
+ * `@volter/editor-blender`'s Outliner rows carry Blender's own `ICON_*` per row
147
+ * (`tree_element_get_icon`, `outliner_draw.cc:2619-2945`) — 70-odd marks across
148
+ * the object types, the data types, the modifier and constraint families. A
149
+ * table here with one line per mark would be a transcription of Blender's
150
+ * switch maintained in a second place; the adapter already knows the name, so
151
+ * the kind IS the name (`blender-outliner-ob-mesh`, `blender-mod-subsurf`) and
152
+ * the icon SET decides whether it draws it. A set that does not carry the name
153
+ * falls through to Font Awesome's circle, exactly as any unknown kind does.
154
+ */
155
+ const BLENDER_KIND = /^blender-[a-z0-9-]+$/;
156
+
157
+ export function hierarchyKindIcon(
158
+ kind: string,
159
+ fallback: IconDefinition = faCircle,
160
+ ): IconDefinition {
161
+ const known = KIND_ICON[kind];
162
+ if (known) return known;
163
+ if (BLENDER_KIND.test(kind)) return outlinerGlyph(kind, fallback);
164
+ return fallback;
165
+ }
166
+
167
+ /**
168
+ * THE DATABLOCK KINDS — the rows Blender's Outliner hangs OFF an object rather
169
+ * than under it, and the one place this editor decides which those are.
170
+ *
171
+ * Measured on `outliner.png`: at rest every object row is COLLAPSED and carries
172
+ * its datablock as an inline glyph after the label, one cell to the right
173
+ * (Camera's at src x 288-327, Cube's at 263-302, Light's at 266-291 — the label
174
+ * ink ends at 246/222/218, so the gap is 40-41 device px, one 20-point cell
175
+ * every time). Expanding is what produces the child row.
176
+ *
177
+ * WHY A KIND LIST AND NOT A ROLE. The datablock row is `role: 'element'`
178
+ * and so is every ordinary JSX
179
+ * child in the DOM and React lanes — a rule keyed on the role would collapse
180
+ * those trees by default, which is a regression, not a transcription. The KIND
181
+ * is the adapter's own vocabulary and this module is already where the host
182
+ * reads it: `KIND_ICON` above gives `mesh-data` the DATA glyph because it is a
183
+ * datablock. A future `light-data`/`camera-data` adds one line here and
184
+ * nothing else moves.
185
+ *
186
+ * `EditorNode` gains no field for this. The kind is open by construction (the
187
+ * previous unit's ruling), so a new noun on the kernel object would buy
188
+ * nothing that the name the adapter already sends does not.
189
+ */
190
+ const DATABLOCK_KINDS: ReadonlySet<string> = new Set([
191
+ 'mesh-data',
192
+ // Blender's own DATA marks, which is exactly what
193
+ // `tree_element_get_icon_from_id` (`outliner_draw.cc:2479-2610`) answers for
194
+ // a non-object ID: the mark a Model document's rows carry for an object's
195
+ // data, its materials and its shape keys. The object marks
196
+ // (`blender-outliner-ob-*`) are deliberately NOT here — those are the row
197
+ // itself, not something hung off it.
198
+ 'blender-material-data',
199
+ 'blender-shapekey-data',
200
+ 'blender-texture-data',
201
+ 'blender-image-data',
202
+ ]);
203
+
204
+ /** The prefixes of the same set that are keyed by a VALUE rather than a struct
205
+ * — a light's lamp type and a probe's (`outliner_draw.cc:2508-2521`,
206
+ * `:2578-2589`) — plus the `OUTLINER_DATA_*` family. */
207
+ const DATABLOCK_KIND_PREFIXES: readonly string[] = [
208
+ 'blender-outliner-data-',
209
+ 'blender-light-',
210
+ 'blender-lightprobe-',
211
+ ];
212
+
213
+ export function isDatablockKind(kind: string | undefined): boolean {
214
+ if (kind === undefined) return false;
215
+ if (DATABLOCK_KINDS.has(kind)) return true;
216
+ return DATABLOCK_KIND_PREFIXES.some((prefix) => kind.startsWith(prefix));
217
+ }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * The one place the hierarchy panel's mark convention meets a real `Object3D`.
3
+ *
4
+ * `hierarchy-component-marks.ts` is deliberately pure — it takes a
5
+ * {@link NodeMarkReader} and never learns what a node is made of — and
6
+ * `GameHierarchy` is deliberately contract-only (rule zero: no 3D-library value
7
+ * import). This module is the seam between them: it asks the adapter's OPTIONAL
8
+ * `object3D` capability for the node and reads
9
+ * `@volter/editor-threejs/adapter/hierarchy-marks`' two marks off it.
10
+ *
11
+ * An adapter with no `Object3D` seam (React, Pixi, DOM) yields {@link NO_MARKS},
12
+ * which `componentMarkView` recognizes by identity and short-circuits on — so a
13
+ * non-three surface pays nothing and renders byte-identically.
14
+ */
15
+
16
+ import type { HierarchyProvider } from '@volter/editor-project/adapter';
17
+ import { componentRootName, isBuiltInternal } from '@volter/editor-threejs/adapter/hierarchy-marks';
18
+ import { getUserData } from '@volter/editor-threejs/ecs/user-data';
19
+ import { isComponentInstanceRoot } from './authoring/component-instance-root';
20
+ import { NO_MARKS, type NodeMarkReader, type NodeMarks } from './hierarchy-component-marks';
21
+
22
+ /** Project-local R3F source already carries its component ownership on the
23
+ * native node. Read that existing stamp as the automatic equivalent of an
24
+ * imperative `markComponentRoot`; explicit marks still win. */
25
+ function componentName(object: Parameters<typeof componentRootName>[0]): string | undefined {
26
+ const explicit = componentRootName(object);
27
+ // Some project-local components are the native authoring ENTITY constructor rather than a
28
+ // reusable component boundary. Importers are the canonical case: `<UnityNode>` creates the
29
+ // GameObject itself, while a generated `<Player>` prefab remains a component instance around
30
+ // that node. `authoringRoot` is the existing generic declaration for exactly that distinction.
31
+ // An explicit component mark still wins, so a prefab root can be both its own authoring object
32
+ // and the boundary of the reusable prefab instance. A built-internal mark suppresses only the
33
+ // automatic component classification: a React helper that renders implementation machinery is
34
+ // still implementation, not a prefab merely because Fiber recorded its component boundary.
35
+ if (
36
+ explicit ||
37
+ isBuiltInternal(object) ||
38
+ getUserData(object, 'authoringRoot') === true ||
39
+ !isComponentInstanceRoot(object)
40
+ ) {
41
+ return explicit;
42
+ }
43
+ const authored = getUserData(object, 'authoringComponent');
44
+ return typeof authored === 'string' && authored ? authored : undefined;
45
+ }
46
+
47
+ /**
48
+ * A memoized reader over `hierarchy.object3D`.
49
+ *
50
+ * The cache lives for the reader's lifetime — one render pass — because the
51
+ * live graph it reads is re-walked every render anyway (`hierarchy.roots()` IS
52
+ * the refresh point on a live adapter). Within one pass the marks cannot move,
53
+ * and the walk asks for the same id many times: once per `node()` projection,
54
+ * again per internals probe.
55
+ */
56
+ export function markReaderFor(hierarchy: Pick<HierarchyProvider, 'object3D'>): NodeMarkReader {
57
+ const object3D = hierarchy.object3D;
58
+ if (typeof object3D !== 'function') return NO_MARKS;
59
+ const cache = new Map<string, NodeMarks | undefined>();
60
+ return (id) => {
61
+ if (cache.has(id)) return cache.get(id);
62
+ const object = object3D.call(hierarchy, id);
63
+ const marks: NodeMarks | undefined = object
64
+ ? {
65
+ componentRoot: componentName(object),
66
+ authoredEntity: getUserData(object, 'authoringRoot') === true,
67
+ builtInternal: isBuiltInternal(object),
68
+ }
69
+ : undefined;
70
+ cache.set(id, marks);
71
+ return marks;
72
+ };
73
+ }