@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,300 @@
1
+ /**
2
+ * One structural and operational answer for an AuthoringAdapter.
3
+ *
4
+ * This module does not call providers. It inventories their compiler-pinned
5
+ * shapes and combines those receipts with receipts produced by real consumers
6
+ * and conformance probes. Shape can reject a malformed carrier immediately;
7
+ * it can never manufacture an operational pass.
8
+ */
9
+
10
+ import {
11
+ AUTHORING_ADAPTER_SHAPE,
12
+ AUTHORING_PROVIDER_KEYS,
13
+ AUTHORING_PROVIDER_SHAPES,
14
+ type AuthoringAdapter,
15
+ type AuthoringProviderKey,
16
+ gradeSeamCarrier,
17
+ gradeSeamEvidence,
18
+ HIERARCHY_PROVIDER_SHAPE,
19
+ type HierarchyProvider,
20
+ inspectSeamShape,
21
+ type SeamEvidenceReceipt,
22
+ type SeamEvidenceVerdict,
23
+ type SeamProofStage,
24
+ type SeamShape,
25
+ type StructuralWriteOutcome,
26
+ type WriteAck,
27
+ } from '@volter/editor-project/adapter';
28
+ import { liveSeamEvidence, recordLiveSeamEvidence } from './live-seam-evidence';
29
+
30
+ const EPOCHS = new WeakMap<object, string>();
31
+ let nextEpoch = 1;
32
+
33
+ /** Stable only for the lifetime of this adapter object. A cold remount creates
34
+ * a new adapter and therefore cannot inherit receipts from the old one. */
35
+ export function authoringAdapterEpoch(adapter: AuthoringAdapter): string {
36
+ const object = adapter as object;
37
+ const existing = EPOCHS.get(object);
38
+ if (existing) return existing;
39
+ const epoch = `authoring-${nextEpoch++}`;
40
+ EPOCHS.set(object, epoch);
41
+ return epoch;
42
+ }
43
+
44
+ function recordAuthoringReceipt(options: {
45
+ readonly adapter: AuthoringAdapter;
46
+ readonly seam: string;
47
+ readonly stage: SeamProofStage;
48
+ readonly outcome: 'pass' | 'fail';
49
+ readonly detail: string;
50
+ }): void {
51
+ const epoch = authoringAdapterEpoch(options.adapter);
52
+ const record = (seam: string, detail: string): void =>
53
+ recordLiveSeamEvidence({
54
+ seam,
55
+ subject: 'authoring-adapter',
56
+ epoch,
57
+ stage: options.stage,
58
+ outcome: options.outcome,
59
+ source: 'consumer',
60
+ detail,
61
+ });
62
+ record(options.seam, options.detail);
63
+ const segments = options.seam.split('.');
64
+ if (segments.length < 3) return;
65
+ const parent = segments.slice(0, -1).join('.');
66
+ record(
67
+ parent,
68
+ options.outcome === 'pass'
69
+ ? `${parent} served a real consumer ${options.stage}`
70
+ : `${parent} failed through its consumer: ${options.detail}`,
71
+ );
72
+ }
73
+
74
+ function writeAck(value: unknown): WriteAck | null {
75
+ if (!value || typeof value !== 'object') return null;
76
+ const candidate = value as { destination?: unknown; persisted?: unknown };
77
+ return typeof candidate.destination === 'string' && typeof candidate.persisted === 'boolean'
78
+ ? (candidate as WriteAck)
79
+ : null;
80
+ }
81
+
82
+ /** Record one real consumer call against the exact adapter object it used.
83
+ *
84
+ * The epoch, not a display label, is the identity boundary: one root can be
85
+ * reported under its manifest id in status and under `root` in the ingest
86
+ * mount report, while both names refer to this same adapter instance. The
87
+ * receipt is therefore stored under the neutral subject and rebound to the
88
+ * report's subject in {@link inspectAuthoringAdapterSeams} below.
89
+ *
90
+ * Promise-returning provider methods keep their original timing and rejection;
91
+ * success is recorded only after they settle. A thrown/rejected call records a
92
+ * failing receipt and is rethrown unchanged.
93
+ */
94
+ export function recordAuthoringConsumerUse<T>(options: {
95
+ readonly adapter: AuthoringAdapter;
96
+ readonly seam: string;
97
+ readonly stage: SeamProofStage;
98
+ readonly detail: string;
99
+ readonly run: () => T;
100
+ }): T {
101
+ const receipt = (outcome: 'pass' | 'fail', detail: string): void => {
102
+ recordAuthoringReceipt({ ...options, outcome, detail });
103
+ };
104
+ try {
105
+ const value = options.run();
106
+ if (value && typeof (value as { then?: unknown }).then === 'function') {
107
+ return Promise.resolve(value).then(
108
+ (settled) => {
109
+ receipt('pass', options.detail);
110
+ return settled;
111
+ },
112
+ (error) => {
113
+ receipt(
114
+ 'fail',
115
+ `${options.detail} failed: ${error instanceof Error ? error.message : String(error)}`,
116
+ );
117
+ throw error;
118
+ },
119
+ ) as unknown as T;
120
+ }
121
+ receipt('pass', options.detail);
122
+ return value;
123
+ } catch (error) {
124
+ receipt(
125
+ 'fail',
126
+ `${options.detail} failed: ${error instanceof Error ? error.message : String(error)}`,
127
+ );
128
+ throw error;
129
+ }
130
+ }
131
+
132
+ /** Record a write at the strength its own return value proves. A concrete
133
+ * WriteAck is a round trip even when it honestly says live-only; `void` proves
134
+ * only that the effect call returned. This keeps void-returning legacy lanes
135
+ * from manufacturing the stronger receipt their contract still owes. */
136
+ export function recordAuthoringWriteConsumerUse(options: {
137
+ readonly adapter: AuthoringAdapter;
138
+ readonly seam: string;
139
+ readonly detail: string;
140
+ readonly run: () => StructuralWriteOutcome;
141
+ }): StructuralWriteOutcome {
142
+ const success = (value: void | WriteAck): void | WriteAck => {
143
+ const ack = writeAck(value);
144
+ recordAuthoringReceipt({
145
+ adapter: options.adapter,
146
+ seam: options.seam,
147
+ stage: ack ? 'round-trip' : 'effect',
148
+ outcome: 'pass',
149
+ detail: ack
150
+ ? `${options.detail}: ${ack.destination} (${ack.persisted ? 'persisted' : 'live-only'})`
151
+ : `${options.detail}; the provider returned no write acknowledgement`,
152
+ });
153
+ return value;
154
+ };
155
+ const failure = (error: unknown): never => {
156
+ recordAuthoringReceipt({
157
+ adapter: options.adapter,
158
+ seam: options.seam,
159
+ stage: 'round-trip',
160
+ outcome: 'fail',
161
+ detail: `${options.detail} failed: ${error instanceof Error ? error.message : String(error)}`,
162
+ });
163
+ throw error;
164
+ };
165
+ try {
166
+ const value = options.run();
167
+ return value && typeof (value as { then?: unknown }).then === 'function'
168
+ ? Promise.resolve(value).then(success, failure)
169
+ : success(value as void | WriteAck);
170
+ } catch (error) {
171
+ return failure(error);
172
+ }
173
+ }
174
+
175
+ export interface AuthoringSeamEvidence {
176
+ readonly subject: string;
177
+ readonly epoch: string;
178
+ readonly receipts: readonly SeamEvidenceReceipt[];
179
+ readonly providers: Readonly<Record<AuthoringProviderKey, SeamEvidenceVerdict>>;
180
+ /**
181
+ * The hierarchy CARRIER: well-formed, and every member it advertises proven
182
+ * at that member's own required stage. This is the door
183
+ * `authoring/active-adapter.ts` refuses a malformed adapter with — a missing
184
+ * or mis-kinded `roots`/`node` only ever shows up as a member verdict, so
185
+ * the refusal needs the carrier grade and not the seam's own.
186
+ */
187
+ readonly hierarchy: SeamEvidenceVerdict;
188
+ /**
189
+ * The hierarchy WALK — the `editor.hierarchy` seam's own verdict, which is a
190
+ * different and weaker question than {@link hierarchy}: did a current-epoch
191
+ * operation walk this root's tree and find it finite, non-empty and
192
+ * reciprocal (`coverage/authoring-read-probe.ts`)?
193
+ *
194
+ * It exists because the CARRIER asks a strictly stronger question: every
195
+ * member the carrier advertises, proven at that member's own stage. It used
196
+ * to be an UNANSWERABLE one — `object3D` (required `operation`) and
197
+ * `idForObject3D` (then required `effect`) are optional-but-PRESENT on every
198
+ * three adapter, no production consumer records a receipt for either, and
199
+ * the read probe did not call them, so `gradeSeamCarrier` returned
200
+ * `unverified` on a perfectly reciprocal tree, forever. Both are pure
201
+ * lookups and are `operation` now, called and checked against the walk by
202
+ * `coverage/authoring-read-probe.ts`'s `objectLookupReceipts`, so the
203
+ * carrier answers its own question on a healthy adapter.
204
+ * The two grades stay separate regardless: this one is what
205
+ * `adapter-reach.ts`'s `captureEvidence` reads, and reading the CARRIER
206
+ * there once left the capture row's `ok` branch DEAD — a healthy
207
+ * root printed "no current-epoch hierarchy operation proves it projects
208
+ * this root's runtime" as `info` while the operation had in fact run and
209
+ * passed. MEASURED 2026-09-19 on a `--template game` scaffold: `info` with
210
+ * the reciprocity fix in, `gap` with the pre-fix adapter planted — the
211
+ * failure branch worked, the success branch could not be reached.
212
+ *
213
+ * Graded here, beside the carrier and off the SAME receipt set, so the two
214
+ * answers cannot drift apart in two modules.
215
+ */
216
+ readonly hierarchyWalk: SeamEvidenceVerdict;
217
+ }
218
+
219
+ export function inspectAuthoringAdapterSeams(options: {
220
+ readonly adapter: AuthoringAdapter;
221
+ readonly subject: string;
222
+ readonly epoch?: string | undefined;
223
+ readonly receipts?: readonly SeamEvidenceReceipt[] | undefined;
224
+ }): AuthoringSeamEvidence {
225
+ const { adapter, subject } = options;
226
+ const epoch = options.epoch ?? authoringAdapterEpoch(adapter);
227
+ const receipts: SeamEvidenceReceipt[] = [
228
+ ...inspectSeamShape<AuthoringAdapter>({
229
+ prefix: 'editor',
230
+ value: adapter,
231
+ shape: AUTHORING_ADAPTER_SHAPE,
232
+ subject,
233
+ epoch,
234
+ }),
235
+ ...inspectSeamShape<HierarchyProvider>({
236
+ prefix: 'editor.hierarchy',
237
+ value: adapter.hierarchy,
238
+ shape: HIERARCHY_PROVIDER_SHAPE,
239
+ subject,
240
+ epoch,
241
+ }),
242
+ ];
243
+
244
+ for (const [provider, shape] of Object.entries(AUTHORING_PROVIDER_SHAPES)) {
245
+ receipts.push(
246
+ ...inspectSeamShape({
247
+ prefix: `editor.${provider}`,
248
+ value: (adapter as unknown as Record<string, unknown>)[provider],
249
+ shape: shape as SeamShape<object>,
250
+ subject,
251
+ epoch,
252
+ }),
253
+ );
254
+ }
255
+ // An adapter epoch already identifies one concrete carrier. Rebind its live
256
+ // consumer receipts to this report's display subject so the same operation
257
+ // closes both the per-root status row (`worldId`) and the ingest report
258
+ // (`root`) without duplicating or guessing names at the call site.
259
+ receipts.push(
260
+ ...liveSeamEvidence.receipts({ epoch }).map((receipt) => ({ ...receipt, subject })),
261
+ );
262
+ if (options.receipts) receipts.push(...options.receipts);
263
+
264
+ const providers = {} as Record<AuthoringProviderKey, SeamEvidenceVerdict>;
265
+ for (const provider of AUTHORING_PROVIDER_KEYS) {
266
+ const nested = (AUTHORING_PROVIDER_SHAPES as Partial<Record<string, SeamShape<object>>>)[
267
+ provider
268
+ ];
269
+ providers[provider] = gradeSeamCarrier({
270
+ seam: `editor.${provider}`,
271
+ required: AUTHORING_ADAPTER_SHAPE[provider].required,
272
+ shape: nested,
273
+ subject,
274
+ epoch,
275
+ receipts,
276
+ });
277
+ }
278
+
279
+ return {
280
+ subject,
281
+ epoch,
282
+ receipts,
283
+ providers,
284
+ hierarchy: gradeSeamCarrier({
285
+ seam: 'editor.hierarchy',
286
+ required: AUTHORING_ADAPTER_SHAPE.hierarchy.required,
287
+ shape: HIERARCHY_PROVIDER_SHAPE as SeamShape<object>,
288
+ subject,
289
+ epoch,
290
+ receipts,
291
+ }),
292
+ hierarchyWalk: gradeSeamEvidence({
293
+ seam: 'editor.hierarchy',
294
+ required: AUTHORING_ADAPTER_SHAPE.hierarchy.required,
295
+ subject,
296
+ epoch,
297
+ receipts,
298
+ }),
299
+ };
300
+ }
@@ -0,0 +1,192 @@
1
+ /**
2
+ * WHICH CANVAS IS PRESENTING, and the bounded failsafe for when NONE is.
3
+ *
4
+ * The `canvas-revealed` ontology invariant (`ontology-invariants.ts`) asks one
5
+ * question: is this session drawing onto a surface nobody can see? Its own
6
+ * `fix` text has always named "the reveal failsafe" — and there wasn't one.
7
+ * This module is both halves, kept pure (facts in, decision out) so every
8
+ * transition is testable with no browser, the same contract the invariants
9
+ * themselves follow.
10
+ *
11
+ * ## Half one: the measurement was picking the wrong canvas
12
+ *
13
+ * The facts used to come from `findPrimaryCanvas`, which ranks by painted
14
+ * AREA and is blind to visibility — a canvas hidden by `visibility: hidden`
15
+ * keeps its full bounding box. Measured live on a racing-game ingest session
16
+ * (2026-08-15): during Play the Scene document's render overlay is hidden
17
+ * with an inline `visibility: hidden` while the game's own canvas
18
+ * fills the pane. The editor's Scene canvas — full-size, correctly hidden,
19
+ * shallower in the tree — won the ranking, so the invariant reported
20
+ * "4 frame(s) produced in 3389ms while the viewport canvas is hidden
21
+ * (visibility: hidden)" for a session whose screenshot showed the game
22
+ * rendering perfectly. A standing warning on a healthy session is the failure
23
+ * mode the invariant module's own comments warn about, so it is fixed at the
24
+ * source: **a session is revealed when ANY of its canvases is revealed**, and
25
+ * only when every one of them is hidden does the row name the largest one's
26
+ * reason.
27
+ *
28
+ * ## Half two: firing, not just reporting
29
+ *
30
+ * When every canvas IS hidden while frames are being produced, reporting is
31
+ * not enough — the user is looking at a blank viewport and the fix is one
32
+ * style write away. The failsafe fires it, and is deliberately narrow:
33
+ *
34
+ * - **Only inline hiding on the canvas ITSELF.** A canvas hidden by an
35
+ * ancestor (a render overlay) or by a stylesheet rule is somebody
36
+ * else's decision, expressed somewhere this must not reach into.
37
+ * - **Only a canvas with no declared owner.** The editor's own viewport
38
+ * canvas is inline `opacity: 0` whenever `isThreejsSurfaceVisible` says so
39
+ * — a computed decision with a name — and React would re-apply it anyway.
40
+ * Fighting it would put a permanent false alarm on every DOM-only project.
41
+ * - **Once per canvas, after a bounded wait.** A mount is legitimately hidden
42
+ * for a moment; a failsafe that fires on the transient is a failsafe that
43
+ * cries wolf. And a failsafe is an emergency, never a policy: it clears the
44
+ * style once and then stops, so it can never become the mechanism a broken
45
+ * reveal path quietly relies on.
46
+ *
47
+ * Firing is LOUD by design. The ledger entry says the failsafe fired, what it
48
+ * had to undo, and that this is a defect worth reporting upstream — because a
49
+ * silently-repaired reveal is a reveal nobody ever fixes.
50
+ */
51
+
52
+ /** One canvas as the DOM layer measured it. */
53
+ export interface CanvasVisibilityFact {
54
+ /** How the message names it — a `data-testid`, a class, or its index. */
55
+ readonly label: string;
56
+ /** Painted area in CSS px², used only to pick the one the row speaks for. */
57
+ readonly area: number;
58
+ /** Why it is not visible, in the measurement's own words, or `null` when it
59
+ * IS visible. */
60
+ readonly hiddenBy: string | null;
61
+ /** Which of the canvas' OWN inline style properties is what hides it, or
62
+ * `null` when the hiding comes from anywhere else (an ancestor, a
63
+ * stylesheet, a zero-size box). Only this is ever cleared. */
64
+ readonly inlineHiding: 'opacity' | 'visibility' | 'display' | null;
65
+ /** True when this canvas' visibility is nobody's declared decision. The
66
+ * editor's own viewport canvas is `false` — see the module header. */
67
+ readonly failsafeEligible: boolean;
68
+ }
69
+
70
+ /**
71
+ * Why the session has no visible presentation surface, in the measurement's
72
+ * own words — `undefined` when there is no canvas to measure at all, `null`
73
+ * when at least one canvas is revealed.
74
+ *
75
+ * This is the whole of half one: the presence of ONE revealed canvas is what
76
+ * makes the session presentable, whatever the others are doing.
77
+ */
78
+ export function presentingCanvasHiddenBy(
79
+ canvases: readonly CanvasVisibilityFact[],
80
+ ): string | null | undefined {
81
+ if (canvases.length === 0) return undefined;
82
+ if (canvases.some((canvas) => canvas.hiddenBy === null)) return null;
83
+ const largest = [...canvases].sort((a, b) => b.area - a.area)[0];
84
+ return largest?.hiddenBy ?? null;
85
+ }
86
+
87
+ /**
88
+ * One line per hidden canvas: which one, why, and whose doing it is.
89
+ *
90
+ * The row used to say only "the viewport canvas is hidden (visibility:
91
+ * hidden)" — a sentence you cannot act on, because a session has several
92
+ * canvases and the reason does not say which of them is the subject or who
93
+ * hid it. Verifying this work against a live session was blocked on exactly
94
+ * that gap, which is the argument for it being in the report rather than in a
95
+ * debug affordance.
96
+ */
97
+ export function hiddenCanvasBreakdown(
98
+ canvases: readonly CanvasVisibilityFact[],
99
+ ): readonly string[] {
100
+ return canvases
101
+ .filter((canvas) => canvas.hiddenBy !== null)
102
+ .sort((a, b) => b.area - a.area)
103
+ .map(
104
+ (canvas) =>
105
+ `${canvas.label} (${canvas.hiddenBy}, ${
106
+ canvas.inlineHiding === null
107
+ ? 'from an ancestor or a stylesheet'
108
+ : canvas.failsafeEligible
109
+ ? 'its own inline style, unowned'
110
+ : 'its own inline style, by a declared owner'
111
+ }, ${Math.round(canvas.area)}px²)`,
112
+ );
113
+ }
114
+
115
+ /**
116
+ * THE ONE SUBJECT DEFINITION — a canvas hiding ITSELF with nobody owning that
117
+ * decision. Both the invariant row and the failsafe below turn on this, which
118
+ * is why it is a function rather than two filters that could drift apart.
119
+ *
120
+ * Two facts have to line up, and each was measured as a false positive on the
121
+ * same live racing-ingest session (2026-08-15) when it did not:
122
+ *
123
+ * - hidden by its OWN box or inline style. On the UI Components document,
124
+ * every canvas is hidden by an ANCESTOR — the editor
125
+ * showing a different document, which is what the user opened.
126
+ * - and NOT a canvas whose visibility is somebody's declared decision. The
127
+ * editor's own viewport canvas carries inline `opacity: 0` from
128
+ * `isThreejsSurfaceVisible`, so during Play over an ingest root it read as
129
+ * "a canvas hiding itself" and kept the row violating on a healthy session.
130
+ */
131
+ export function selfHiddenSubjects(
132
+ canvases: readonly CanvasVisibilityFact[],
133
+ ): readonly CanvasVisibilityFact[] {
134
+ return canvases.filter((canvas) => canvas.failsafeEligible && canvas.inlineHiding !== null);
135
+ }
136
+
137
+ /**
138
+ * Of the hidden canvases, is any of them {@link selfHiddenSubjects | hiding
139
+ * itself}? `null` when nothing is hidden at all — there is no question to
140
+ * answer.
141
+ */
142
+ export function anyCanvasHidesItself(canvases: readonly CanvasVisibilityFact[]): boolean | null {
143
+ if (!canvases.some((canvas) => canvas.hiddenBy !== null)) return null;
144
+ return selfHiddenSubjects(canvases).length > 0;
145
+ }
146
+
147
+ /**
148
+ * How long the all-hidden-while-drawing condition must hold before the
149
+ * failsafe fires. Longer than one vitals sample, so the condition has to
150
+ * SURVIVE a sample rather than merely be observed once during a mount.
151
+ */
152
+ export const REVEAL_FAILSAFE_DEADLINE_MS = 4_000;
153
+
154
+ export type RevealFailsafeDecision =
155
+ | { readonly fire: false }
156
+ | { readonly fire: true; readonly target: CanvasVisibilityFact; readonly ledger: string };
157
+
158
+ export interface RevealFailsafeInput {
159
+ readonly canvases: readonly CanvasVisibilityFact[];
160
+ /** Frames the page produced in the sample window. */
161
+ readonly framesProduced: number;
162
+ /** How long the condition has held, or `null` when this is the first sample
163
+ * that has seen it (nothing has held yet). */
164
+ readonly hiddenForMs: number | null;
165
+ readonly deadlineMs?: number;
166
+ }
167
+
168
+ /**
169
+ * Whether to force the reveal, and the ledger line that must accompany it.
170
+ *
171
+ * Every gate is a fact the caller measured; nothing here reads a clock or the
172
+ * DOM.
173
+ */
174
+ export function decideRevealFailsafe(input: RevealFailsafeInput): RevealFailsafeDecision {
175
+ const deadline = input.deadlineMs ?? REVEAL_FAILSAFE_DEADLINE_MS;
176
+ if (input.framesProduced <= 0) return { fire: false };
177
+ if (input.hiddenForMs === null || input.hiddenForMs < deadline) return { fire: false };
178
+ if (presentingCanvasHiddenBy(input.canvases) === null) return { fire: false };
179
+ const target = [...selfHiddenSubjects(input.canvases)].sort((a, b) => b.area - a.area)[0];
180
+ if (!target) return { fire: false };
181
+ return {
182
+ fire: true,
183
+ target,
184
+ ledger:
185
+ `canvas reveal FAILSAFE FIRED — the "${target.label}" canvas was still hidden by its own ` +
186
+ `inline ${target.inlineHiding} (${target.hiddenBy}) ${Math.round(input.hiddenForMs / 1000)}s ` +
187
+ 'after frames started arriving, so the editor cleared that style to put the picture on ' +
188
+ 'screen. THIS IS A DEFECT, not a feature: the mount path that hid this canvas never ran ' +
189
+ 'its own reveal, and the failsafe fires ONCE — a second mount in this state stays blank. ' +
190
+ 'Report it upstream with the mount that owns this canvas.',
191
+ };
192
+ }
@@ -0,0 +1,101 @@
1
+ /**
2
+ * THE DESIGN-TIME SURFACE REGISTRY — every place the editor mounts a game's own
3
+ * content while it is NOT playing, and the content clock each one publishes.
4
+ *
5
+ * ## CONTENT time vs PRESENTATION time (the one policy, stated once)
6
+ *
7
+ * A design-time surface renders continuously, and that is fine: the camera
8
+ * orbit, a turntable, the standard viewport dressing and the editor's own
9
+ * helpers are PRESENTATION and are editor-owned, so they may move while the
10
+ * editor is in Edit. What may NOT move is CONTENT — the mounted world's
11
+ * `update(dt)`, an animation mixer, a `useFrame` clock, a simulation step —
12
+ * because Edit is static (ARCHITECTURE-CORE §Rules). An interactive document
13
+ * may advance content only through its explicit animation/simulation transport;
14
+ * opening the document itself never advances it. Off-screen capture operations
15
+ * may request their own bounded settle before producing a still.
16
+ *
17
+ * ## WHY A REGISTRY, rather than a field on one surface's session class
18
+ *
19
+ * Edit-static was enforced at the Scene view's design session only, so the
20
+ * SAME content mounted on any other surface kept running: a GLB train animated
21
+ * in the Asset Lab while every instrument reported a still editor (owner find,
22
+ * 2026-08-15). The check therefore enumerates SURFACES, and a surface that
23
+ * publishes no clock is reported UNMEASURED BY NAME rather than assumed still —
24
+ * silence is the one case that would let a surface animate in Edit with the
25
+ * vitals green, which is the defect this registry exists to make impossible.
26
+ *
27
+ * A surface's clock is monotonic seconds of ITS OWN content time. Its absolute
28
+ * value means nothing; `coverage/session-vitals.ts` only ever asks whether two
29
+ * readings differ, which is what makes camera orbit (which never touches it)
30
+ * irrelevant to the answer.
31
+ *
32
+ * ## THE TRANSPORT IS THE SANCTION
33
+ *
34
+ * "Edit is static" has always meant *nothing plays on its own* — the origin
35
+ * note behind the row says it out loud: a game running "with nothing having
36
+ * pressed ▶". A document's own animation/simulation transport IS that press,
37
+ * so content time advancing WHILE a transport is engaged is the sanctioned
38
+ * case, not the violation. A surface therefore publishes a second reading
39
+ * beside its clock: how many times an ENGAGED transport advanced it
40
+ * ({@link DesignTimeSurface.transportAdvances}). The row fires only when the
41
+ * clock moved and that counter did not.
42
+ */
43
+
44
+ export interface DesignTimeSurface {
45
+ /**
46
+ * Stable per MOUNT — the document id only for the one mount that IS the
47
+ * document. Two mounts of one document (its viewport and a chromeless
48
+ * preview of it) are two surfaces: registration is last-wins and the vitals
49
+ * consumer keys its per-window sample history by this id, so a shared id
50
+ * makes the survivor answer for both — a held preview clock once spoke for a
51
+ * viewport that was visibly animating (measured 2026-08-30). Suffix, or
52
+ * sequence, anything that is not the document itself.
53
+ */
54
+ readonly id: string;
55
+ /** What the vitals row calls it out loud. */
56
+ readonly label: string;
57
+ /**
58
+ * Monotonic seconds of THIS surface's content time, or `null` when the host
59
+ * cannot currently make an honest comparison. Interactive document boot is
60
+ * never such a window: it publishes zero immediately because it performs no
61
+ * hidden simulation.
62
+ */
63
+ readonly contentClock: () => number | null;
64
+ /**
65
+ * Monotonic count of the times an ENGAGED transport (this document's
66
+ * animation transport, its simulation transport's play or step) advanced
67
+ * this surface's content time.
68
+ *
69
+ * Compared the same way the clock is: two readings, and only whether they
70
+ * DIFFER. A counter — not a "is a transport playing right now" boolean —
71
+ * because the question is about the window BETWEEN two samples, and a
72
+ * boolean answers about the instant of the sample: a single-frame step, or
73
+ * a transport paused between two reads, would both report "nothing engaged"
74
+ * over a window in which a transport was the only thing that ran.
75
+ *
76
+ * A surface that omits this publishes no transport at all, so ANY advance of
77
+ * its clock is unsanctioned — which is the honest reading for a surface (a
78
+ * preview card, a turntable) that has no ▶ to press.
79
+ */
80
+ readonly transportAdvances?: () => number;
81
+ }
82
+
83
+ const surfaces = new Map<string, DesignTimeSurface>();
84
+
85
+ /**
86
+ * Publish one live design-time surface. Returns its withdrawal — the ONE
87
+ * teardown path, and it is safe to call after the id has been re-registered by
88
+ * a later mount (it withdraws only its own entry).
89
+ */
90
+ export function registerDesignTimeSurface(surface: DesignTimeSurface): () => void {
91
+ surfaces.set(surface.id, surface);
92
+ return () => {
93
+ if (surfaces.get(surface.id) !== surface) return;
94
+ surfaces.delete(surface.id);
95
+ };
96
+ }
97
+
98
+ /** Every live design-time surface, for the vitals collector. */
99
+ export function allDesignTimeSurfaces(): readonly DesignTimeSurface[] {
100
+ return [...surfaces.values()];
101
+ }
@@ -0,0 +1,11 @@
1
+ /** One current-process evidence ledger shared by panels, relay consumers,
2
+ * coverage, status, and Doctor. It is intentionally ephemeral: project source
3
+ * remains truth and no VGAI evidence sidecar is invented. */
4
+
5
+ import { SeamEvidenceLedger, type SeamEvidenceReceipt } from '@volter/editor-project/adapter';
6
+
7
+ export const liveSeamEvidence = new SeamEvidenceLedger();
8
+
9
+ export function recordLiveSeamEvidence(receipt: SeamEvidenceReceipt): void {
10
+ liveSeamEvidence.record(receipt);
11
+ }