@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,173 @@
1
+ /**
2
+ * THE ONE PERSISTENCE PIPE — `resolve(anchor) → write(dialect) → record(recorder)`.
3
+ *
4
+ * Every authored write, from every lane, runs through {@link runWritePipe}.
5
+ * The lanes that used to be parallel stacks are now this pipe's PLUG POINTS:
6
+ * a lane supplies a resolution (which anchor this edit lands at), a dialect
7
+ * writer (the bytes), and a recorder (history), and the pipe supplies the
8
+ * ordering, the awaiting, and the ack.
9
+ *
10
+ * ## The three defects it exists for, all measured on the vendored racing game
11
+ *
12
+ * 1. **The ack was the ADAPTER'S blanket answer, not this edit's.** The
13
+ * composite joined only its persist-CAPABLE children, so a three-root edit
14
+ * acked the DOM root's destination with `persisted: true`. Here the ack is
15
+ * produced by the component that performed the write, about that write, and
16
+ * there is nowhere else for a caller to get one.
17
+ * 2. **The classifier and the writer were different components.** A subject the
18
+ * adapter classified `live-only` still wrote a real prop into the game's
19
+ * source, because the code answering `TruthProvider.resolve` was not
20
+ * the code performing the write. Here the anchor is resolved ONCE, and a
21
+ * `live-only` resolution has no `write` member at all — reaching a dialect
22
+ * writer from it is a type error, not a discipline.
23
+ * 3. **The write was fired un-awaited, so the ack raced the byte.** Here the
24
+ * pipe awaits the dialect writer and the recorder before it acks.
25
+ *
26
+ * ## Why `live-only` is a destination and not a failure
27
+ *
28
+ * `live-only` (and its play-mode sibling, ephemeral) is a real
29
+ * {@link WriteAnchorKind}: the edit lands on the running object for the session
30
+ * and nothing else, and the contract of that kind is that the surface SAYS SO.
31
+ * So the pipe's live-only branch still applies the edit — the caller has
32
+ * already done that, synchronously, which is what keeps an `endEdit(); undo()`
33
+ * sequence working — and answers `persisted: false` with the reason reported
34
+ * where a user can read it. What the pipe forbids is the inverse: naming a
35
+ * destination no byte reached.
36
+ */
37
+
38
+ import type { WriteAck, WriteAnchorKind } from '@volter/editor-project/adapter';
39
+
40
+ export type { WriteAck } from '@volter/editor-project/adapter';
41
+
42
+ /** What a surface reports when nothing this session does reaches a file. */
43
+ export const LIVE_ONLY_DESTINATION = 'live-only (not saved)';
44
+
45
+ /** What a play-mode adoption reports: edits are real, and die with the session. */
46
+ export const EPHEMERAL_DESTINATION = 'ephemeral (discarded on stop)';
47
+
48
+ /** What `CompositeAuthoringAdapter.persistence` reports when no child of the
49
+ * composition can persist at all. That provider answers the SAVE-status
50
+ * question ("where do this surface's saves go"), never the per-edit one — the
51
+ * pipe's ack is the only answer to that. */
52
+ export const NO_PERSISTABLE_CHILD_DESTINATION = '(no persistable child)';
53
+
54
+ /** The honest floor, as a value: no write was performed, and saying so is the
55
+ * whole point. Frozen because it is shared by every lane that has no write. */
56
+ export const LIVE_ONLY_ACK: WriteAck = Object.freeze({
57
+ destination: LIVE_ONLY_DESTINATION,
58
+ persisted: false,
59
+ });
60
+
61
+ /**
62
+ * A CLIPBOARD gesture reports itself by its WRITE, never by the clipboard half
63
+ * that already succeeded.
64
+ *
65
+ * `StructuralClipboardOutcome` (`@volter/editor-project/adapter`) keeps `false` as the refusal
66
+ * channel and reserves the {@link WriteAck} for a SUCCESSFUL cut/paste. A cut
67
+ * whose removal reached no byte is a COPY: handing its `persisted: false` ack
68
+ * straight back is truthy, so every caller — `consumer-actions.ts`'s
69
+ * `clipboardStructureWrite`, which only shortcuts on `=== false`, and the
70
+ * composite's `cut`, which claims clipboard ownership on anything else — reads
71
+ * a refusal as a landed edit.
72
+ *
73
+ * ONE owner, because the four lanes each said this inline and one commit
74
+ * deleted all four collapses together while widening the return type.
75
+ */
76
+ export function clipboardOutcome(ack: WriteAck): false | WriteAck {
77
+ return ack.persisted ? ack : false;
78
+ }
79
+
80
+ /** An anchor kind that has somewhere to land. `live-only` is excluded BY THE
81
+ * TYPE, which is what makes "a live-only resolution cannot reach a writer" a
82
+ * compile-time fact rather than a convention. */
83
+ export type AnchoredWriteKind = Exclude<WriteAnchorKind, 'live-only'>;
84
+
85
+ /**
86
+ * Step 1's product: what THIS edit's anchor resolved to.
87
+ *
88
+ * The two arms are not "success" and "failure" — they are the two honest
89
+ * outcomes of asking where an edit lands. Only the `writer` arm carries a
90
+ * `write`, so a lane cannot accidentally write through a resolution that said
91
+ * there was nowhere to write.
92
+ */
93
+ export type WriteResolution =
94
+ | {
95
+ readonly reaches: 'writer';
96
+ /** Which lane carries it — the SAME fact `TruthProvider.resolve`
97
+ * must report for this subject, because both read this resolution. */
98
+ readonly anchorKind: AnchoredWriteKind;
99
+ /** Where the bytes go, in the dialect writer's own words. */
100
+ readonly destination: string;
101
+ /** Step 2 — the dialect writer, already bound to this edit. `true` ⇒ the
102
+ * bytes landed and the writer's own transaction carries both halves. */
103
+ readonly write: () => Promise<boolean>;
104
+ }
105
+ | {
106
+ readonly reaches: 'live-only';
107
+ /** {@link LIVE_ONLY_DESTINATION} or {@link EPHEMERAL_DESTINATION}. */
108
+ readonly destination: string;
109
+ /** Why there is nowhere to write — reported to the user by the lane's
110
+ * own reporter, never swallowed. */
111
+ readonly reason: string;
112
+ };
113
+
114
+ /** One edit, offered to the pipe. */
115
+ export interface PipedWrite {
116
+ /**
117
+ * Step 1 — resolve THIS edit's anchor. Called EXACTLY ONCE by the pipe, so
118
+ * the classification a caller reads and the route the write takes are the
119
+ * same object rather than two evaluations that can disagree.
120
+ */
121
+ resolve(): WriteResolution;
122
+ /**
123
+ * Step 3 — the recorder. Called exactly once, after the write step settled,
124
+ * with what actually happened. `persisted: true` ⇒ the dialect writer's own
125
+ * transaction already carries both the file and the live half, so the
126
+ * recorder skips its session journal rather than adding a second entry.
127
+ *
128
+ * This is where undo/redo integrates, and it is the ONLY place: a lane that
129
+ * journals outside the pipe forks history, which is what the pipe replaced.
130
+ */
131
+ record(persisted: boolean): void;
132
+ /**
133
+ * Show a live-only reason where the user can read it. Called only for the
134
+ * `live-only` arm, and only when the lane wants it said (an unarmed backend
135
+ * refusing on every frame of a game somebody is playing is noise, so lanes
136
+ * gate this themselves).
137
+ */
138
+ report?(reason: string): void;
139
+ }
140
+
141
+ /**
142
+ * RUN ONE EDIT THROUGH THE PIPE, and answer for it.
143
+ *
144
+ * The ordering is the contract: resolve, then write (awaited), then record
145
+ * (before the ack). A caller that awaits this ack has awaited the byte.
146
+ *
147
+ * A dialect writer that comes back `false` has already reported its own reason
148
+ * (that is its contract — every refusal names its gate), and the edit degrades
149
+ * to the live-only floor: the value is on the running object, the recorder
150
+ * journals it so it can be undone, and the ack says no byte moved.
151
+ */
152
+ export async function runWritePipe(edit: PipedWrite): Promise<WriteAck> {
153
+ const resolution = edit.resolve();
154
+ if (resolution.reaches === 'live-only') {
155
+ edit.report?.(resolution.reason);
156
+ edit.record(false);
157
+ return { destination: resolution.destination, persisted: false };
158
+ }
159
+ const persisted = await resolution.write();
160
+ edit.record(persisted);
161
+ return persisted
162
+ ? { destination: resolution.destination, persisted: true }
163
+ : { destination: LIVE_ONLY_DESTINATION, persisted: false };
164
+ }
165
+
166
+ /** Spell a live-only resolution — the one form, so no lane invents a second
167
+ * phrasing of "there is nowhere to write". */
168
+ export function resolvesLiveOnly(
169
+ reason: string,
170
+ destination: string = LIVE_ONLY_DESTINATION,
171
+ ): WriteResolution {
172
+ return { reaches: 'live-only', destination, reason };
173
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * ONE shared 250ms availability tick replacing the three independent
3
+ * `setInterval(…, 250)` pollers that W4 left behind (utility availability,
4
+ * the Dev utility's live-plane gate, and ConnectionStatus's networking-adapter
5
+ * poll).
6
+ *
7
+ * These gates all watch the SAME kind of out-of-band signal — a live play
8
+ * session's adapters appearing/disappearing without any store/registry
9
+ * notification — so they don't need three timers, three wakeups, and three
10
+ * interleaved re-render schedules; they need one heartbeat. The interval is
11
+ * refcounted: it starts with the first subscriber and stops with the last,
12
+ * so an idle editor (none of the three consumers mounted) runs no timer at
13
+ * all — strictly better than the three always-on intervals it replaces.
14
+ *
15
+ * `useSyncExternalStore`-shaped on purpose: consumers subscribe and SELECT
16
+ * the derived value they actually read (`getActiveDebug()` presence, a
17
+ * connection state, an availability fingerprint) — they re-render only when
18
+ * that value changes, never on the tick itself. The former version-counter
19
+ * hook (`useAvailabilityTick`) re-rendered every subscriber 4×/s
20
+ * unconditionally; with the workspace and every panel subscribed
21
+ * that measured ~27ms of React work per tick (~110ms/s) in an idle editor —
22
+ * found 2026-07-31 by the Profiler's long-animation-frame attribution.
23
+ */
24
+
25
+ import { useSyncExternalStore } from 'react';
26
+
27
+ const TICK_MS = 250;
28
+
29
+ let _version = 0;
30
+ let _intervalId: ReturnType<typeof setInterval> | null = null;
31
+ const _listeners = new Set<() => void>();
32
+
33
+ function onTick(): void {
34
+ _version++;
35
+ for (const fn of _listeners) fn();
36
+ }
37
+
38
+ /** Subscribe to the shared 250ms tick. Starts the timer on first subscriber,
39
+ * stops it with the last. Returns unsubscribe. */
40
+ export function subscribeAvailabilityTick(fn: () => void): () => void {
41
+ _listeners.add(fn);
42
+ if (_intervalId === null) _intervalId = setInterval(onTick, TICK_MS);
43
+ return () => {
44
+ _listeners.delete(fn);
45
+ if (_listeners.size === 0 && _intervalId !== null) {
46
+ clearInterval(_intervalId);
47
+ _intervalId = null;
48
+ }
49
+ };
50
+ }
51
+
52
+ /** Monotonic tick counter — exposed for tests that assert the timer runs. */
53
+ export function availabilityTickVersion(): number {
54
+ return _version;
55
+ }
56
+
57
+ /**
58
+ * Re-evaluate `select` on every shared availability tick, re-rendering the
59
+ * caller ONLY when its result changes (`Object.is`). `select` must return a
60
+ * primitive or a stable reference (an adapter identity, a joined-id string,
61
+ * a bitmask) — a fresh object every call would defeat the point and re-render
62
+ * per tick. It runs 4×/s plus once per render, so keep it a cheap read.
63
+ */
64
+ export function useAvailabilitySelector<T>(select: () => T): T {
65
+ return useSyncExternalStore(subscribeAvailabilityTick, select, select);
66
+ }
@@ -0,0 +1,120 @@
1
+ /**
2
+ * The 5x7 bitmap label drawn onto every contact sheet cell.
3
+ *
4
+ * Extracted from `asset-preview.ts` (where it was `drawBitmapLabel` plus its
5
+ * `LABEL_GLYPHS` table) when the STORY lane needed the same labels: a story
6
+ * variant sheet is composited from DOM captures and has no business importing
7
+ * the three.js asset-preview engine to draw a caption. Same pixels, one owner
8
+ * — a second hand-rolled label routine is exactly how two sheets start
9
+ * looking like two products.
10
+ *
11
+ * A bitmap font rather than `fillText`: the sheet is evidence, and canvas text
12
+ * rendering varies by platform font stack, which would make two runs of the
13
+ * same capture differ in a way that has nothing to do with the subject.
14
+ */
15
+
16
+ const LABEL_GLYPHS: Record<string, readonly string[]> = {
17
+ F: ['11111', '10000', '10000', '11110', '10000', '10000', '10000'],
18
+ R: ['11110', '10001', '10001', '11110', '10100', '10010', '10001'],
19
+ O: ['01110', '10001', '10001', '10001', '10001', '10001', '01110'],
20
+ N: ['10001', '11001', '11001', '10101', '10011', '10011', '10001'],
21
+ T: ['11111', '00100', '00100', '00100', '00100', '00100', '00100'],
22
+ I: ['11111', '00100', '00100', '00100', '00100', '00100', '11111'],
23
+ G: ['01110', '10001', '10000', '10111', '10001', '10001', '01110'],
24
+ H: ['10001', '10001', '10001', '11111', '10001', '10001', '10001'],
25
+ P: ['11110', '10001', '10001', '11110', '10000', '10000', '10000'],
26
+ '3': ['11110', '00001', '00001', '01110', '00001', '00001', '11110'],
27
+ '/': ['00001', '00010', '00100', '00100', '01000', '10000', '10000'],
28
+ '4': ['00010', '00110', '01010', '10010', '11111', '00010', '00010'],
29
+ // Labeled shot sets (project-defined labels like 'ZOOM-HEAD'/'BEND-Q')
30
+ // pull in these additional glyphs, same 5x7 bitmap style as the set
31
+ // above. The font covers A-Z and 0-9 outright rather than the subset the
32
+ // in-repo sets happen to spell: a missing glyph renders as a BLANK CELL,
33
+ // so a partial font mislabels a project's shot silently — the dragon set's
34
+ // 'ZOOM-WINGTIP-UP' drew as 'ZOOM- INGTIP-UP' for want of a W.
35
+ A: ['01110', '10001', '10001', '11111', '10001', '10001', '10001'],
36
+ B: ['11110', '10001', '10001', '11110', '10001', '10001', '11110'],
37
+ C: ['01111', '10000', '10000', '10000', '10000', '10000', '01111'],
38
+ D: ['11110', '10001', '10001', '10001', '10001', '10001', '11110'],
39
+ E: ['11111', '10000', '10000', '11110', '10000', '10000', '11111'],
40
+ K: ['10001', '10010', '10100', '11000', '10100', '10010', '10001'],
41
+ L: ['10000', '10000', '10000', '10000', '10000', '10000', '11111'],
42
+ M: ['10001', '11011', '10101', '10101', '10001', '10001', '10001'],
43
+ Q: ['01110', '10001', '10001', '10001', '10101', '10010', '01101'],
44
+ S: ['01111', '10000', '10000', '01110', '00001', '00001', '11110'],
45
+ U: ['10001', '10001', '10001', '10001', '10001', '10001', '01110'],
46
+ Z: ['11111', '00001', '00010', '00100', '01000', '10000', '11111'],
47
+ J: ['00111', '00010', '00010', '00010', '00010', '10010', '01100'],
48
+ V: ['10001', '10001', '10001', '10001', '10001', '01010', '00100'],
49
+ W: ['10001', '10001', '10001', '10101', '10101', '11011', '10001'],
50
+ X: ['10001', '10001', '01010', '00100', '01010', '10001', '10001'],
51
+ Y: ['10001', '10001', '01010', '00100', '00100', '00100', '00100'],
52
+ '0': ['01110', '10001', '10011', '10101', '11001', '10001', '01110'],
53
+ '1': ['00100', '01100', '00100', '00100', '00100', '00100', '01110'],
54
+ '2': ['01110', '10001', '00001', '00010', '00100', '01000', '11111'],
55
+ '5': ['11111', '10000', '11110', '00001', '00001', '10001', '01110'],
56
+ '6': ['00110', '01000', '10000', '11110', '10001', '10001', '01110'],
57
+ '7': ['11111', '00001', '00010', '00100', '01000', '01000', '01000'],
58
+ '8': ['01110', '10001', '10001', '01110', '10001', '10001', '01110'],
59
+ '9': ['01110', '10001', '10001', '01111', '00001', '00010', '01100'],
60
+ '-': ['00000', '00000', '00000', '11111', '00000', '00000', '00000'],
61
+ // Axis-orientation annotations (asset-preview's authored-axis markers).
62
+ '+': ['00000', '00100', '00100', '11111', '00100', '00100', '00000'],
63
+ '<': ['00010', '00100', '01000', '10000', '01000', '00100', '00010'],
64
+ '>': ['01000', '00100', '00010', '00001', '00010', '00100', '01000'],
65
+ };
66
+
67
+ /**
68
+ * The pixel box {@link drawBitmapLabel} will paint for `label` in a cell of
69
+ * this size — exported so a caller can right- or bottom-align a label inside
70
+ * its cell instead of duplicating the font's scale arithmetic.
71
+ */
72
+ export function measureBitmapLabel(
73
+ label: string,
74
+ cellWidth: number,
75
+ cellHeight: number,
76
+ ): { width: number; height: number } {
77
+ const scale = Math.max(1, Math.floor(Math.min(cellWidth, cellHeight) / 128));
78
+ const padding = scale * 3;
79
+ return {
80
+ width: label.length * scale * 6 - scale + padding * 2,
81
+ height: scale * 7 + padding * 2,
82
+ };
83
+ }
84
+
85
+ export function drawBitmapLabel(
86
+ context: CanvasRenderingContext2D,
87
+ label: string,
88
+ x: number,
89
+ y: number,
90
+ cellWidth: number,
91
+ cellHeight: number,
92
+ tone: 'normal' | 'warning' = 'normal',
93
+ ): void {
94
+ const scale = Math.max(1, Math.floor(Math.min(cellWidth, cellHeight) / 128));
95
+ const padding = scale * 3;
96
+ const advance = scale * 6;
97
+ const width = label.length * advance - scale + padding * 2;
98
+ const height = scale * 7 + padding * 2;
99
+ context.fillStyle = tone === 'warning' ? 'rgba(154, 24, 24, 0.92)' : 'rgba(0, 0, 0, 0.62)';
100
+ context.fillRect(x, y, width, height);
101
+ context.fillStyle = '#ffffff';
102
+ for (let glyphIndex = 0; glyphIndex < label.length; glyphIndex++) {
103
+ // Labels are project data now — a character outside the bitmap font
104
+ // renders as a blank cell rather than crashing the capture.
105
+ const glyph = LABEL_GLYPHS[label[glyphIndex]!];
106
+ if (!glyph) continue;
107
+ for (let row = 0; row < glyph.length; row++) {
108
+ for (let column = 0; column < glyph[row]!.length; column++) {
109
+ if (glyph[row]![column] === '1') {
110
+ context.fillRect(
111
+ x + padding + glyphIndex * advance + column * scale,
112
+ y + padding + row * scale,
113
+ scale,
114
+ scale,
115
+ );
116
+ }
117
+ }
118
+ }
119
+ }
120
+ }
@@ -0,0 +1,161 @@
1
+ /**
2
+ * THE BLENDER TWIN'S STALLS, measured by the page and carried to `vgai status`.
3
+ *
4
+ * WHY (measured 2026-09-16): one `blender-execute` held the Blender worker for
5
+ * over 1,800s and wedged the tab; the only report anyone got was a replay
6
+ * harness timing out. Separately, a 0.86s-per-call cost in a 225-mesh scene
7
+ * stretched under load into heartbeat timeouts that read as "tab present, did
8
+ * not respond". The product had a number for NEITHER. Owner ruling: a tab that
9
+ * stops answering is the product's defect regardless of what the machine is
10
+ * doing, and the product must surface it.
11
+ *
12
+ * TWO MEASUREMENTS, BOTH TAKEN FROM THE PAGE, because neither blocked party can
13
+ * report on itself:
14
+ * - the WORKER's call times come from `BlenderRuntime.metrics()`, which stamps
15
+ * each `postMessage` and its reply (`packages/blender-engine/browser/runtime.ts`);
16
+ * a blocked worker cannot send, but the side that posted still has a clock.
17
+ * - the MAIN THREAD's stalls come from the `longtask` PerformanceObserver kept
18
+ * here. (The sky work measured this ad hoc through a `window.__skyStall`
19
+ * global; this is that measurement as a proper field of the runtime host,
20
+ * with no global.)
21
+ *
22
+ * WHY A REGISTRY AND NOT A DIRECT IMPORT. The census sampler
23
+ * (`tab-census.ts`) must not pull the Blender stack — three.js, the display
24
+ * LUT contributions, the worker URL — into its import closure just to ask a
25
+ * question that is usually answered "no session". The lane publishes its meter
26
+ * here when it constructs its runtime, exactly the way a mounted game publishes
27
+ * its render-debug adapter to `authoring/active-systems`.
28
+ *
29
+ * THE LANE IS A PACKAGE AND REACHES THIS THROUGH THE DOOR (2026-09-19):
30
+ * `@volter/editor-blender` calls `host.session.reportWorkerCallMeter`
31
+ * (`editor-host-door.ts`), which is this module's `setBlenderCallMeter`. It
32
+ * used to import this file directly through `@editor/*` and also START the
33
+ * observer below, which is the half that was never the package's: the LONG
34
+ * TASKS are the host page's own, measured whether or not a lane is running,
35
+ * and a package cannot be the thing that decides the page is being watched.
36
+ * So publishing a meter is now what starts the watch.
37
+ *
38
+ * MEASUREMENT ONLY. Nothing here cancels, kills, or budgets a call, and no
39
+ * threshold is enforced anywhere: a budget is the owner's policy, and these are
40
+ * the numbers such a policy would have to be made from.
41
+ */
42
+
43
+ import type { EditorHostWorkerCallMetrics } from '@volter/editor-sdk/host';
44
+ import type { BlenderTabMetrics } from '@volter/editor-sdk/tab-census';
45
+
46
+ /** What the lane publishes: a read of the live call meter. The SHAPE is the
47
+ * SDK's (`host.session.reportWorkerCallMeter`), and structural, so this module
48
+ * does not import `@volter/blender-engine/browser` (and `BlenderRuntime` does not
49
+ * import the editor or the SDK). */
50
+ export type BlenderCallMeter = () => EditorHostWorkerCallMetrics;
51
+
52
+ let meter: BlenderCallMeter | null = null;
53
+
54
+ /**
55
+ * Publish (or retract, with null) the tab's Blender call meter, and start the
56
+ * page's own stall watch behind it.
57
+ *
58
+ * ONE OWNER: the lane's own runtime singleton — the same lifetime as the
59
+ * session itself. There is no per-document or per-play teardown that may
60
+ * retract it, because the session outlives both. ONE METER rides the census, so
61
+ * a second publisher replaces the first.
62
+ */
63
+ export function setBlenderCallMeter(read: BlenderCallMeter | null): void {
64
+ meter = read;
65
+ // The observer's lifetime is the PAGE's (its history is what "during the
66
+ // last call" is answered from), so it is started, never stopped: a retracted
67
+ // meter simply stops the census from carrying a `blender` block at all.
68
+ if (read !== null) startStallObserver();
69
+ }
70
+
71
+ /** A long task, kept only as long as it can still be attributed to a call. */
72
+ interface StallEntry {
73
+ readonly start: number;
74
+ readonly duration: number;
75
+ }
76
+
77
+ /**
78
+ * How many recent long tasks to keep for the "during the last call" question.
79
+ *
80
+ * A long task is >50ms by spec, so this is minutes of a badly-stalled tab and
81
+ * nothing at all on a healthy one. Bounded because the observer runs for the
82
+ * life of the page.
83
+ */
84
+ const STALL_HISTORY = 128;
85
+
86
+ let recent: StallEntry[] = [];
87
+ let longestTaskMs: number | null = null;
88
+ let tasksOver100ms = 0;
89
+ let observing = false;
90
+
91
+ /**
92
+ * Start watching the main thread. Idempotent, and silent where the Long Tasks
93
+ * API does not exist (Safari/Firefox): `longestTaskMs` then stays null, which
94
+ * says "nobody measured" rather than the falsehood a 0 would tell.
95
+ *
96
+ * Internal: {@link setBlenderCallMeter} is the one caller, so the page's watch
97
+ * begins the moment a lane has calls to attribute stalls to, and no package has
98
+ * to know the page is watched at all.
99
+ */
100
+ function startStallObserver(): () => void {
101
+ if (observing) return () => {};
102
+ if (typeof PerformanceObserver === 'undefined') return () => {};
103
+ let observer: PerformanceObserver;
104
+ try {
105
+ observer = new PerformanceObserver((list) => {
106
+ for (const entry of list.getEntries()) {
107
+ const duration = entry.duration;
108
+ if (longestTaskMs === null || duration > longestTaskMs) longestTaskMs = duration;
109
+ if (duration >= 100) tasksOver100ms += 1;
110
+ recent.push({ start: entry.startTime, duration });
111
+ if (recent.length > STALL_HISTORY) recent = recent.slice(-STALL_HISTORY);
112
+ }
113
+ });
114
+ // `buffered` picks up the boot-time stalls that happened before this ran —
115
+ // a cold editor boot is one of the longest tasks a session ever has, and it
116
+ // is not measurable any other way.
117
+ observer.observe({ type: 'longtask', buffered: true });
118
+ } catch {
119
+ // An unsupported entry type throws here on some engines. Same answer as an
120
+ // absent API: no numbers, rather than invented ones.
121
+ return () => {};
122
+ }
123
+ observing = true;
124
+ return () => {
125
+ observer.disconnect();
126
+ observing = false;
127
+ };
128
+ }
129
+
130
+ /**
131
+ * The tab's Blender block, or null when this tab has no Blender session — the
132
+ * census then carries no `blender` key at all, because "absent" and "idle" are
133
+ * different claims.
134
+ */
135
+ export function blenderTabMetrics(now: number = performance.now()): BlenderTabMetrics | null {
136
+ const read = meter;
137
+ if (read === null) return null;
138
+ const calls = read();
139
+ const window = calls.lastCallWindow;
140
+ let duringCall: number | null = null;
141
+ if (window !== null) {
142
+ const end = window.end ?? now;
143
+ for (const task of recent) {
144
+ // Overlap, not containment: the task that matters most is the one that
145
+ // was ALREADY running when the call was posted.
146
+ if (task.start + task.duration < window.start || task.start > end) continue;
147
+ if (duringCall === null || task.duration > duringCall) duringCall = task.duration;
148
+ }
149
+ }
150
+ return {
151
+ inFlightMs: calls.inFlightMs,
152
+ lastCallMs: calls.lastCallMs,
153
+ maxCallMs: calls.maxCallMs,
154
+ callsOver5s: calls.callsOver5s,
155
+ callsOver30s: calls.callsOver30s,
156
+ longestTaskMs: longestTaskMs === null ? null : Math.round(longestTaskMs),
157
+ tasksOver100ms,
158
+ lastCallLongestTaskMs: duringCall === null ? null : Math.round(duringCall),
159
+ wasmMemoryMB: calls.wasmMemoryMB,
160
+ };
161
+ }
@@ -0,0 +1,20 @@
1
+ /** Palette actions over discoverable component canvases, including closed tabs.
2
+ * The registry retains the board descriptor; opening does not create another board. */
3
+
4
+ import type { EditorAction } from './action-registry';
5
+ import {
6
+ availableWorkspaceDocuments,
7
+ openAvailableWorkspaceDocument,
8
+ } from './workspace-available-documents';
9
+
10
+ /** Commands stay available when a board's tab is closed. */
11
+ export function buildBoardOpenActions(): EditorAction[] {
12
+ return availableWorkspaceDocuments()
13
+ .filter((entry) => entry.category === 'canvas')
14
+ .map(({ descriptor }) => ({
15
+ id: `board:${descriptor.id}`,
16
+ label: `Open ${descriptor.title}`,
17
+ category: 'action',
18
+ execute: () => void openAvailableWorkspaceDocument(descriptor.id),
19
+ }));
20
+ }