@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,159 @@
1
+ /**
2
+ * CONTRIBUTED CHROME — the registry behind `@volter/editor-sdk/chrome`: the
3
+ * palette actions, application-menu items and header items a package
4
+ * contributes.
5
+ *
6
+ * WHO READS IT, measured rather than assumed: `palette-action-publisher.tsx`
7
+ * takes {@link contributedActions} into the table the frame registers as
8
+ * `MenuId.CommandPalette` items (so ⌘⇧P lists a package's actions with its own
9
+ * labels); `components/ApplicationMenus.tsx` appends
10
+ * {@link contributedMenuItems} per menu id; `components/ProjectHeader.tsx` and
11
+ * `components/Object3DDocumentToolbar.tsx` draw {@link contributedHeaderItems}
12
+ * in the title bar and the document's own strip; `tool-loader.ts` registers
13
+ * what a package declares. Ids are namespaced `tool:` so they never collide
14
+ * with the host's.
15
+ */
16
+
17
+ import type {
18
+ ActionContribution,
19
+ ContributableMenu,
20
+ ContributedAction,
21
+ ContributedMenuItem,
22
+ DocumentHeaderItemProps,
23
+ HeaderPlacement,
24
+ MenuContribution,
25
+ } from '@volter/editor-sdk/chrome';
26
+ import type { ComponentType } from 'react';
27
+
28
+ const CONTRIBUTABLE_MENUS: readonly ContributableMenu[] = [
29
+ 'asset',
30
+ 'view',
31
+ 'window',
32
+ 'debug',
33
+ 'tools',
34
+ 'help',
35
+ ];
36
+
37
+ export interface ContributedHeaderItem {
38
+ readonly id: string;
39
+ readonly order: number;
40
+ readonly placement: HeaderPlacement;
41
+ readonly Component: ComponentType<DocumentHeaderItemProps>;
42
+ }
43
+
44
+ let headerItems: ContributedHeaderItem[] = [];
45
+ let actionRegistrations: readonly ActionContribution[] = [];
46
+ let menuItems: Array<{ menu: ContributableMenu; item: ContributedMenuItem }> = [];
47
+ let version = 0;
48
+ const listeners = new Set<() => void>();
49
+ function notify(): void {
50
+ version++;
51
+ for (const listener of listeners) listener();
52
+ }
53
+
54
+ export function subscribeContributedChrome(listener: () => void): () => void {
55
+ listeners.add(listener);
56
+ return () => listeners.delete(listener);
57
+ }
58
+
59
+ export function contributedChromeVersion(): number {
60
+ return version;
61
+ }
62
+
63
+ /** Header items in `order`, ties by registration. */
64
+ export function contributedHeaderItems(
65
+ placement: HeaderPlacement = 'transport',
66
+ ): readonly ContributedHeaderItem[] {
67
+ return headerItems
68
+ .filter((item) => item.placement === placement)
69
+ .sort((a, b) => a.order - b.order);
70
+ }
71
+
72
+ /** Register one header item (`.header.tsx`, `tool:<id>`). Returns the unregister. */
73
+ export function registerContributedHeaderItem(item: ContributedHeaderItem): () => void {
74
+ if (headerItems.some((existing) => existing.id === item.id))
75
+ throw new Error(`header item "${item.id}" is already contributed.`);
76
+ headerItems = [...headerItems, item];
77
+ notify();
78
+ return () => {
79
+ headerItems = headerItems.filter((existing) => existing !== item);
80
+ notify();
81
+ };
82
+ }
83
+
84
+ export function contributedActions(): readonly ContributedAction[] {
85
+ const seen = new Set<string>();
86
+ const out: ContributedAction[] = [];
87
+ for (const registration of actionRegistrations) {
88
+ const list =
89
+ typeof registration.actions === 'function' ? registration.actions() : registration.actions;
90
+ for (const action of list) {
91
+ const id = `tool:${action.id}`;
92
+ // A live set may repeat a static id across its own reads; first wins.
93
+ if (seen.has(id)) continue;
94
+ seen.add(id);
95
+ out.push({ ...action, id });
96
+ }
97
+ }
98
+ return out;
99
+ }
100
+
101
+ export function contributedMenuItems(menu: ContributableMenu): readonly ContributedMenuItem[] {
102
+ return menuItems.filter((entry) => entry.menu === menu).map((entry) => entry.item);
103
+ }
104
+
105
+ export function isContributableMenu(value: unknown): value is ContributableMenu {
106
+ return typeof value === 'string' && (CONTRIBUTABLE_MENUS as readonly string[]).includes(value);
107
+ }
108
+
109
+ /**
110
+ * Register a contribution's actions, each under `tool:<id>`. A fixed list is
111
+ * checked for duplicate ids now; a live one (`actions` as a function) is read
112
+ * on every listing and re-listed whenever its `subscribe` fires. Returns the
113
+ * unregister.
114
+ */
115
+ export function registerContributedActions(contribution: ActionContribution): () => void {
116
+ if (typeof contribution.actions !== 'function') {
117
+ const listed = contributedActions();
118
+ for (const action of contribution.actions)
119
+ if (listed.some((existing) => existing.id === `tool:${action.id}`))
120
+ throw new Error(`action "tool:${action.id}" is already contributed.`);
121
+ }
122
+ actionRegistrations = [...actionRegistrations, contribution];
123
+ const stop = contribution.subscribe?.(notify);
124
+ notify();
125
+ return () => {
126
+ stop?.();
127
+ actionRegistrations = actionRegistrations.filter((existing) => existing !== contribution);
128
+ notify();
129
+ };
130
+ }
131
+
132
+ /** Register a contribution's menu items on one menu. Returns the unregister. */
133
+ export function registerContributedMenu(contribution: MenuContribution): () => void {
134
+ const added = contribution.items.map((item) => ({
135
+ menu: contribution.menu,
136
+ item: { ...item, id: `tool:${item.id}` },
137
+ }));
138
+ for (const entry of added)
139
+ if (menuItems.some((existing) => existing.item.id === entry.item.id))
140
+ throw new Error(`menu item "${entry.item.id}" is already contributed.`);
141
+ menuItems = [...menuItems, ...added];
142
+ notify();
143
+ return () => {
144
+ menuItems = menuItems.filter((entry) => !added.includes(entry));
145
+ notify();
146
+ };
147
+ }
148
+
149
+ /**
150
+ * A fingerprint of every contributed item's CURRENT `disabled` answer, across
151
+ * every menu. The point (`@volter/editor-sdk/chrome`) promises that `disabled`
152
+ * is asked at render and may follow session state — which is only true if
153
+ * something re-renders the bar when that state moves. `ApplicationMenus`
154
+ * samples this on the shared availability tick while a menu is OPEN, so an
155
+ * item can go live or dead under the cursor and costs nothing when closed.
156
+ */
157
+ export function contributedDisabledFingerprint(): string {
158
+ return menuItems.map((entry) => (entry.item.disabled?.({}) ? '1' : '0')).join('');
159
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * A CHROME SLOT IS A PLACE, NOT A PANEL — the third registry in the same
3
+ * family as `workspace-document-restore.ts` (a kind owns its persisted state)
4
+ * and `document-open-registry.ts` (a kind owns how it opens). Here: the host
5
+ * owns WHERE something sits and how big it is; a package owns WHAT sits there.
6
+ *
7
+ * WHY IT EXISTS. The host's chrome had two places whose CONTENT was a product
8
+ * opinion rather than a workbench concern: the `agent` static panel
9
+ * (`components/workspace-static-panel-registry.tsx` imported
10
+ * `ConversationPanel`) and the bottom bar beside the status line
11
+ * (`components/EditorBottomBar.tsx` imported `HarnessConversationTray`). Both
12
+ * are an AGENT-HARNESS conversation surface — it talks to coding harnesses, not
13
+ * to a game, not to a document — so a base library for making IDEs should not
14
+ * carry it, and neither of the two existing seams fits: it is not a document,
15
+ * so it neither opens nor persists (WORK.md §The open-source launch, phase 1
16
+ * unit 6 half A).
17
+ *
18
+ * WHAT A SLOT ID IS. A plain string in the host's own vocabulary, spelled at
19
+ * the ONE host call site that renders the slot. The host declares the place in
20
+ * its own layout inventory (`workspace-static-panels.ts` still lists the
21
+ * `agent` panel's title, hotkey scope and placement, because the frame
22
+ * PERSISTS panel ids and the tab's own chrome is the dock's); what it no
23
+ * longer holds is the surface.
24
+ *
25
+ * NOTHING REGISTERED IS A REAL ANSWER. A build whose package list carries no
26
+ * filler for a slot renders nothing there — the same honest emptiness a
27
+ * document kind with no registered opener gives.
28
+ */
29
+
30
+ import type { ComponentType } from 'react';
31
+
32
+ export interface ChromeSlotFiller {
33
+ /** The place, in the host's vocabulary (`panel:agent`, `bottom-bar`). */
34
+ readonly slot: string;
35
+ /** Which module registered it. Re-registering the same owner+slot REPLACES,
36
+ * so an HMR re-evaluation leaves one filler, not two. */
37
+ readonly owner: string;
38
+ /** Ascending; ties keep registration order. */
39
+ readonly order?: number;
40
+ readonly Content: ComponentType;
41
+ }
42
+
43
+ const _fillers = new Map<string, ChromeSlotFiller[]>();
44
+ const listeners = new Set<() => void>();
45
+ let version = 0;
46
+
47
+ function publish(): void {
48
+ version++;
49
+ for (const listener of listeners) listener();
50
+ }
51
+
52
+ /** Install a filler. Returns the teardown. */
53
+ export function registerChromeSlot(filler: ChromeSlotFiller): () => void {
54
+ const existing = _fillers.get(filler.slot) ?? [];
55
+ const next = existing.filter((item) => item.owner !== filler.owner);
56
+ next.push(filler);
57
+ next.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
58
+ _fillers.set(filler.slot, next);
59
+ publish();
60
+ return () => {
61
+ const current = _fillers.get(filler.slot);
62
+ if (!current) return;
63
+ const remaining = current.filter((item) => item !== filler);
64
+ if (remaining.length === 0) _fillers.delete(filler.slot);
65
+ else _fillers.set(filler.slot, remaining);
66
+ publish();
67
+ };
68
+ }
69
+
70
+ /** Everything registered for `slot`, in order. A stable array per version, so
71
+ * it is a safe `useSyncExternalStore` snapshot. */
72
+ export function chromeSlotFillers(slot: string): readonly ChromeSlotFiller[] {
73
+ return _fillers.get(slot) ?? EMPTY;
74
+ }
75
+
76
+ const EMPTY: readonly ChromeSlotFiller[] = [];
77
+
78
+ export function subscribeChromeSlots(listener: () => void): () => void {
79
+ listeners.add(listener);
80
+ return () => listeners.delete(listener);
81
+ }
82
+
83
+ export function chromeSlotRegistryVersion(): number {
84
+ return version;
85
+ }
86
+
87
+ /** Test-only reset (mirrors the restore and open registries' own). */
88
+ export function __resetChromeSlotsForTest(): void {
89
+ _fillers.clear();
90
+ publish();
91
+ }
@@ -0,0 +1,264 @@
1
+ import type {
2
+ CollaborationEvent,
3
+ CollaborationPresence,
4
+ CollaborationRole,
5
+ CollaborationSnapshot,
6
+ TeamMessage,
7
+ TeamMessageReference,
8
+ TeamPlaytest,
9
+ } from '@volter/editor-sdk/session/collaboration-types';
10
+ import { connectEvents, EDITOR_PARTICIPANT_ID, type EditorEventSource } from './editor-presence';
11
+ import { assertEditorServerAnswered } from './editor-server-response';
12
+ import { setCollaborationRevision } from './editor-session-attribution';
13
+
14
+ const BASE = '/__editor/collaboration';
15
+ const EVENT_CHANNELS = [
16
+ 'participants',
17
+ 'presence',
18
+ 'messages',
19
+ 'revisions',
20
+ 'audit',
21
+ 'team-test',
22
+ ] as const;
23
+ let current: CollaborationSnapshot | null = null;
24
+ const listeners = new Set<(snapshot: CollaborationSnapshot) => void>();
25
+ const revisionListeners = new Set<(revision: number) => void>();
26
+ // High-water mark of already-published source revisions. Only a SOURCE
27
+ // revision advances `revision`; presence-only publishes reuse it. Tracked on
28
+ // EVERY publish (with or without revision listeners), so a subscriber's
29
+ // baseline is the current revision at subscribe time and it never fires
30
+ // retroactively for a revision already in effect.
31
+ let lastNotifiedRevision = 0;
32
+
33
+ function publish(snapshot: CollaborationSnapshot): void {
34
+ current = snapshot;
35
+ setCollaborationRevision(snapshot.revision);
36
+ for (const listener of listeners) listener(snapshot);
37
+ if (snapshot.revision > lastNotifiedRevision) {
38
+ lastNotifiedRevision = snapshot.revision;
39
+ for (const listener of revisionListeners) listener(snapshot.revision);
40
+ }
41
+ }
42
+
43
+ async function json<T>(path: string, init?: RequestInit): Promise<T> {
44
+ const response = await fetch(`${BASE}${path}`, init);
45
+ // 204 carries no body and so no content type; everything else here is JSON,
46
+ // failures included. A shared session reaches this route through a TUNNEL,
47
+ // where a page fallback is a live possibility rather than a theoretical one.
48
+ if (response.status !== 204) {
49
+ assertEditorServerAnswered(response, `Collaboration request ${path} failed`);
50
+ }
51
+ if (!response.ok) {
52
+ const body = (await response.json().catch(() => null)) as { error?: unknown } | null;
53
+ throw new Error(typeof body?.error === 'string' ? body.error : `Collaboration request failed.`);
54
+ }
55
+ return (response.status === 204 ? undefined : await response.json()) as T;
56
+ }
57
+
58
+ export function collaborationSnapshot(): CollaborationSnapshot | null {
59
+ return current;
60
+ }
61
+
62
+ let streamRelease: (() => void) | null = null;
63
+ let streamRefCount = 0;
64
+
65
+ /**
66
+ * Connect ONCE to the shared editor SSE stream and drive `publish` from it,
67
+ * ref-counted so every consumer — the collaboration panel AND a design
68
+ * session subscribing for revision advances — shares ONE set of collaboration
69
+ * listeners over the single page-lifetime `connectEvents()` socket. The last
70
+ * release removes those listeners and closes its `connectEvents` handle.
71
+ */
72
+ function acquireCollaborationStream(): () => void {
73
+ streamRefCount++;
74
+ if (!streamRelease) {
75
+ const events: EditorEventSource = connectEvents();
76
+ const onSnapshot = (event: MessageEvent) => {
77
+ try {
78
+ publish(JSON.parse(event.data) as CollaborationSnapshot);
79
+ } catch {
80
+ // A malformed event is ignored; the next complete snapshot repairs it.
81
+ }
82
+ };
83
+ let refreshPending = false;
84
+ const refresh = () => {
85
+ if (refreshPending) return;
86
+ refreshPending = true;
87
+ void json<CollaborationSnapshot>('')
88
+ .then(publish)
89
+ .catch(() => {})
90
+ .finally(() => {
91
+ refreshPending = false;
92
+ });
93
+ };
94
+ const onTypedEvent = (message: MessageEvent) => {
95
+ try {
96
+ const event = JSON.parse(message.data) as CollaborationEvent;
97
+ if (!current || event.sequence <= current.sequence) return;
98
+ if (event.channel !== 'presence') {
99
+ refresh();
100
+ return;
101
+ }
102
+ const payload = event.payload as { participantId?: unknown; presence?: unknown };
103
+ if (typeof payload.participantId !== 'string' || !payload.presence) return;
104
+ publish({
105
+ ...current,
106
+ sequence: event.sequence,
107
+ participants: current.participants.map((participant) =>
108
+ participant.participantId === payload.participantId
109
+ ? { ...participant, presence: payload.presence as CollaborationPresence }
110
+ : participant,
111
+ ),
112
+ });
113
+ } catch {
114
+ // The next snapshot or typed event repairs malformed transient input.
115
+ }
116
+ };
117
+ events.addEventListener('collaboration-snapshot', onSnapshot);
118
+ for (const channel of EVENT_CHANNELS) {
119
+ events.addEventListener(`collaboration-${channel}`, onTypedEvent);
120
+ }
121
+ void json<CollaborationSnapshot>('')
122
+ .then(publish)
123
+ .catch(() => {});
124
+ streamRelease = () => {
125
+ events.removeEventListener('collaboration-snapshot', onSnapshot);
126
+ for (const channel of EVENT_CHANNELS) {
127
+ events.removeEventListener(`collaboration-${channel}`, onTypedEvent);
128
+ }
129
+ events.close();
130
+ };
131
+ }
132
+ let released = false;
133
+ return () => {
134
+ if (released) return;
135
+ released = true;
136
+ streamRefCount--;
137
+ if (streamRefCount <= 0) {
138
+ streamRefCount = 0;
139
+ streamRelease?.();
140
+ streamRelease = null;
141
+ }
142
+ };
143
+ }
144
+
145
+ export function connectCollaboration(
146
+ listener: (snapshot: CollaborationSnapshot) => void,
147
+ ): () => void {
148
+ listeners.add(listener);
149
+ if (current) listener(current);
150
+ const releaseStream = acquireCollaborationStream();
151
+ return () => {
152
+ listeners.delete(listener);
153
+ releaseStream();
154
+ };
155
+ }
156
+
157
+ /**
158
+ * Fire `listener(revision)` whenever the collaboration snapshot's source
159
+ * revision strictly ADVANCES — the reliable signal that a collaborator (or
160
+ * this editor) changed project source, delivered over the same SSE stream
161
+ * presence rides rather than the fragile HMR websocket. It ensures that
162
+ * stream is connected, so a subscriber is self-sufficient even if the
163
+ * collaboration panel never opened, and shares the single ref-counted
164
+ * connection every other consumer uses (the last unsubscribe closes it). The
165
+ * current revision is the baseline: a subscriber never fires for a revision
166
+ * already in effect at subscribe time, only for a strictly greater one after.
167
+ */
168
+ export function subscribeCollaborationRevision(listener: (revision: number) => void): () => void {
169
+ revisionListeners.add(listener);
170
+ const releaseStream = acquireCollaborationStream();
171
+ let released = false;
172
+ return () => {
173
+ if (released) return;
174
+ released = true;
175
+ revisionListeners.delete(listener);
176
+ releaseStream();
177
+ };
178
+ }
179
+
180
+ export async function updateCollaborationPresence(presence: CollaborationPresence): Promise<void> {
181
+ await json<void>('/presence', {
182
+ method: 'POST',
183
+ headers: { 'Content-Type': 'application/json' },
184
+ body: JSON.stringify({ participantId: EDITOR_PARTICIPANT_ID, presence }),
185
+ });
186
+ }
187
+
188
+ export async function postTeamMessage(
189
+ text: string,
190
+ options: {
191
+ mentions?: readonly string[];
192
+ references?: readonly TeamMessageReference[];
193
+ threadId?: string | null;
194
+ } = {},
195
+ ): Promise<TeamMessage> {
196
+ return json<TeamMessage>('/message', {
197
+ method: 'POST',
198
+ headers: { 'Content-Type': 'application/json' },
199
+ body: JSON.stringify({
200
+ authorId: EDITOR_PARTICIPANT_ID,
201
+ text,
202
+ mentions: options.mentions ?? [],
203
+ references: options.references ?? [],
204
+ threadId: options.threadId ?? null,
205
+ }),
206
+ });
207
+ }
208
+
209
+ export async function editTeamMessage(messageId: string, text: string): Promise<TeamMessage> {
210
+ return json<TeamMessage>(`/messages/${encodeURIComponent(messageId)}`, {
211
+ method: 'PATCH',
212
+ headers: { 'Content-Type': 'application/json' },
213
+ body: JSON.stringify({ actorId: EDITOR_PARTICIPANT_ID, text }),
214
+ });
215
+ }
216
+
217
+ export async function deleteTeamMessage(messageId: string): Promise<TeamMessage> {
218
+ return json<TeamMessage>(`/messages/${encodeURIComponent(messageId)}`, {
219
+ method: 'DELETE',
220
+ headers: { 'Content-Type': 'application/json' },
221
+ body: JSON.stringify({ actorId: EDITOR_PARTICIPANT_ID }),
222
+ });
223
+ }
224
+
225
+ export async function toggleTeamMessageReaction(
226
+ messageId: string,
227
+ reaction: string,
228
+ ): Promise<TeamMessage> {
229
+ return json<TeamMessage>(`/messages/${encodeURIComponent(messageId)}/reactions`, {
230
+ method: 'POST',
231
+ headers: { 'Content-Type': 'application/json' },
232
+ body: JSON.stringify({ actorId: EDITOR_PARTICIPANT_ID, reaction }),
233
+ });
234
+ }
235
+
236
+ export async function setCollaborationRole(
237
+ participantId: string,
238
+ role: CollaborationRole,
239
+ ): Promise<void> {
240
+ await json<void>('/role', {
241
+ method: 'POST',
242
+ headers: { 'Content-Type': 'application/json' },
243
+ body: JSON.stringify({ actorId: EDITOR_PARTICIPANT_ID, participantId, role }),
244
+ });
245
+ }
246
+
247
+ export async function startTeamTest(): Promise<TeamPlaytest> {
248
+ return json('/team-test', {
249
+ method: 'POST',
250
+ headers: { 'Content-Type': 'application/json' },
251
+ body: JSON.stringify({ participantId: EDITOR_PARTICIPANT_ID }),
252
+ });
253
+ }
254
+
255
+ export async function stopTeamTest(playtestId: string): Promise<void> {
256
+ await json<void>('/team-test/stop', {
257
+ method: 'POST',
258
+ headers: { 'Content-Type': 'application/json' },
259
+ body: JSON.stringify({
260
+ participantId: EDITOR_PARTICIPANT_ID,
261
+ playtestId,
262
+ }),
263
+ });
264
+ }
@@ -0,0 +1,41 @@
1
+ import type { CollaborationPresence } from '@volter/editor-sdk/session/collaboration-types';
2
+ import { updateCollaborationPresence } from './collaboration-client';
3
+
4
+ let presence: CollaborationPresence = {
5
+ document: null,
6
+ file: null,
7
+ oid: null,
8
+ selection: [],
9
+ camera: null,
10
+ gesture: null,
11
+ };
12
+ let sent = '';
13
+ let scheduled = false;
14
+ let inFlight = false;
15
+
16
+ const PRESENCE_INTERVAL_MS = 100;
17
+
18
+ function schedulePresence(): void {
19
+ if (scheduled || inFlight) return;
20
+ scheduled = true;
21
+ globalThis.setTimeout(() => {
22
+ scheduled = false;
23
+ const serialized = JSON.stringify(presence);
24
+ if (serialized === sent) return;
25
+ sent = serialized;
26
+ inFlight = true;
27
+ void updateCollaborationPresence(presence)
28
+ .catch(() => {
29
+ sent = '';
30
+ })
31
+ .finally(() => {
32
+ inFlight = false;
33
+ if (JSON.stringify(presence) !== sent) schedulePresence();
34
+ });
35
+ }, PRESENCE_INTERVAL_MS);
36
+ }
37
+
38
+ export function reportCollaborationPresence(patch: Partial<CollaborationPresence>): void {
39
+ presence = { ...presence, ...patch };
40
+ schedulePresence();
41
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * EVERY RELAYED COMMAND, observed — the host's side of
3
+ * `host.session.onCommandDispatched`. `command-listener.ts` notes each
4
+ * command's type at the top of its dispatch; an idle watchdog (Play's
5
+ * recording: "an agent still driving through `vgai eval` is not idle,
6
+ * whatever the command was") subscribes rather than being named there.
7
+ */
8
+ const listeners = new Set<(type: string) => void>();
9
+
10
+ export function onCommandDispatched(fn: (type: string) => void): () => void {
11
+ listeners.add(fn);
12
+ return () => {
13
+ listeners.delete(fn);
14
+ };
15
+ }
16
+
17
+ export function noteCommandDispatched(type: string): void {
18
+ for (const fn of listeners) fn(type);
19
+ }