@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,237 @@
1
+ /**
2
+ * A CODING HARNESS IS NOT A PROVIDER (owner ruling, 2026-09-21; docs/ARCHITECTURE-CORE.md
3
+ * §Managed services). Claude Code, Codex, Grok and every harness Supercode runs are
4
+ * programs the person has ALREADY signed into, so the DEFAULT launch injects nothing —
5
+ * no model key, no base URL, no provider config — and a harness that is not signed in is
6
+ * refused BY NAME with its own login command instead of being routed to a metered key.
7
+ *
8
+ * `managedInferenceLaunch` below is the ONE opt-in exception: the OpenRouter provider
9
+ * table a person reaches only by choosing managed or BYOK coding inference for
10
+ * themselves in the account panel. Its single caller is `withCodingInference` at the
11
+ * bottom of this file, which reads that explicit `preferredRoute` and passes the backend
12
+ * params through untouched for every other value — `'auto'` is not a choice.
13
+ * `scripts/validate-harness-launch.mjs` refuses any provider credential or provider
14
+ * config written outside that one function, and refuses it gaining a second caller.
15
+ */
16
+
17
+ import { mkdir, writeFile } from 'node:fs/promises';
18
+ import { dirname } from 'node:path';
19
+ import type { ResolvedCodingInference } from './account-service';
20
+
21
+ export interface HarnessRuntimeLaunch {
22
+ program: string;
23
+ arguments: string[];
24
+ env: Record<string, string>;
25
+ }
26
+
27
+ /** What Supercode's own inventory says about a harness the person would run on their
28
+ * own login. `repair` is Supercode's registry text — the login or install command for
29
+ * that exact harness — and is quoted verbatim rather than restated here. */
30
+ export interface HarnessReadiness {
31
+ id: string;
32
+ label: string;
33
+ installed: boolean;
34
+ auth: 'ready' | 'configured' | 'required' | 'unknown';
35
+ reason: string | null;
36
+ repair: string | null;
37
+ }
38
+
39
+ interface RuntimeBackendParams {
40
+ harness?: unknown;
41
+ launch?: unknown;
42
+ [key: string]: unknown;
43
+ }
44
+
45
+ /** The opt-in sentence every refusal ends with: the other way out is the account panel. */
46
+ const OPT_IN_HINT =
47
+ 'or choose managed inference for this harness in the account panel (Account → Generation routing → Preferred route).';
48
+
49
+ function toml(value: string): string {
50
+ return JSON.stringify(value);
51
+ }
52
+
53
+ function openCodeModel(model: string): string {
54
+ return `openrouter/${model}`;
55
+ }
56
+
57
+ /**
58
+ * THE OPT-IN, AND THE ONLY PLACE IN THE ESTATE THAT MAY WRITE A PROVIDER CREDENTIAL OR
59
+ * PROVIDER CONFIG INTO A HARNESS LAUNCH. Everything the table needs — the process token
60
+ * name, the Pi extension it materializes — lives inside this function so the guard's
61
+ * span is exactly this function and nothing leaks to module scope.
62
+ *
63
+ * Reached only by a person who chose managed or BYOK coding inference for themselves
64
+ * because they have no subscription for this harness. Returns `undefined` for a harness
65
+ * whose CLI takes no provider configuration at all — Grok is the measured case
66
+ * (`grok --help`, 1.0.40: `login`/`logout` subcommands and `--model`, but no provider,
67
+ * base-URL or API-root option; Supercode's own `runtime_launch`, `HarnessId::GROK` in
68
+ * `crates/harness/src/harness_service.rs`, starts it as `grok … agent … stdio` with only
69
+ * `GROK_AGENT_DASHBOARD=0` in its env) — so Grok is device-login only and the caller
70
+ * refuses the opt-in for it by name.
71
+ */
72
+ export async function managedInferenceLaunch(
73
+ harness: string,
74
+ inference: ResolvedCodingInference,
75
+ piExtensionPath: string,
76
+ ): Promise<HarnessRuntimeLaunch | undefined> {
77
+ const PROCESS_TOKEN = 'VGAI_OPENROUTER_TOKEN';
78
+ const commonEnv = {
79
+ [PROCESS_TOKEN]: inference.apiKey,
80
+ OPENROUTER_API_KEY: inference.apiKey,
81
+ };
82
+ if (harness === 'codex') {
83
+ const provider = 'vgai-openrouter';
84
+ return {
85
+ program: 'codex',
86
+ arguments: [
87
+ '--dangerously-bypass-approvals-and-sandbox',
88
+ '--dangerously-bypass-hook-trust',
89
+ '-c',
90
+ `model_provider=${toml(provider)}`,
91
+ '-c',
92
+ `model=${toml(inference.model)}`,
93
+ '-c',
94
+ `model_providers.${provider}.name=${toml('OpenRouter via Volter Editor')}`,
95
+ '-c',
96
+ `model_providers.${provider}.base_url=${toml(inference.baseUrl)}`,
97
+ '-c',
98
+ `model_providers.${provider}.env_key=${toml(PROCESS_TOKEN)}`,
99
+ '-c',
100
+ `model_providers.${provider}.wire_api=${toml('responses')}`,
101
+ 'app-server',
102
+ ],
103
+ env: commonEnv,
104
+ };
105
+ }
106
+ if (harness === 'claude-code') {
107
+ return {
108
+ program: 'claude',
109
+ arguments: [
110
+ '--dangerously-skip-permissions',
111
+ '--model',
112
+ inference.model,
113
+ '--print',
114
+ '--input-format',
115
+ 'stream-json',
116
+ '--output-format',
117
+ 'stream-json',
118
+ '--verbose',
119
+ ],
120
+ env: {
121
+ ...commonEnv,
122
+ ANTHROPIC_BASE_URL: inference.baseUrl.replace(/\/v1$/, ''),
123
+ ANTHROPIC_AUTH_TOKEN: inference.apiKey,
124
+ ANTHROPIC_API_KEY: '',
125
+ },
126
+ };
127
+ }
128
+ if (harness === 'opencode') {
129
+ return {
130
+ program: 'opencode',
131
+ arguments: ['--model', openCodeModel(inference.model), 'serve'],
132
+ env: {
133
+ ...commonEnv,
134
+ OPENCODE_CONFIG_CONTENT: JSON.stringify({
135
+ provider: {
136
+ openrouter: {
137
+ options: {
138
+ apiKey: `{env:${PROCESS_TOKEN}}`,
139
+ baseURL: inference.baseUrl,
140
+ },
141
+ models: { [inference.model]: {} },
142
+ },
143
+ },
144
+ }),
145
+ },
146
+ };
147
+ }
148
+ if (harness === 'pi') {
149
+ const managed = inference.route === 'managed';
150
+ if (managed) {
151
+ await mkdir(dirname(piExtensionPath), { recursive: true, mode: 0o700 });
152
+ await writeFile(
153
+ piExtensionPath,
154
+ `export default function vgaiOpenRouter(pi) {
155
+ const baseUrl = process.env.VGAI_OPENROUTER_BASE_URL;
156
+ if (!baseUrl) throw new Error('VGAI_OPENROUTER_BASE_URL is required.');
157
+ pi.registerProvider('openrouter', { baseUrl, apiKey: '$OPENROUTER_API_KEY' });
158
+ }\n`,
159
+ { encoding: 'utf8', mode: 0o600 },
160
+ );
161
+ }
162
+ return {
163
+ program: 'pi',
164
+ arguments: [
165
+ '--approve',
166
+ '--provider',
167
+ 'openrouter',
168
+ '--model',
169
+ inference.model,
170
+ ...(managed ? ['--extension', piExtensionPath] : []),
171
+ '--mode',
172
+ 'rpc',
173
+ ],
174
+ env: {
175
+ ...commonEnv,
176
+ VGAI_OPENROUTER_BASE_URL: inference.baseUrl,
177
+ },
178
+ };
179
+ }
180
+ return undefined;
181
+ }
182
+
183
+ /**
184
+ * The sentence a person sees instead of a silently metered harness. `null` means start
185
+ * it on the login they already did.
186
+ *
187
+ * `'required'` is the only auth state that means NOT SIGNED IN: Supercode sets it when
188
+ * it either found no native credential or watched the handshake fail with an auth error.
189
+ * `'unknown'` is Supercode explicitly declining to give a verdict — measured 2026-09-21,
190
+ * OpenCode reads `unknown` passively and `ready` under a handshake — so it is never a
191
+ * refusal here; the caller escalates the probe first, and a harness that still cannot be
192
+ * classified starts and reports its own error rather than being convicted on silence.
193
+ */
194
+ export function harnessReadinessRefusal(readiness: HarnessReadiness): string | null {
195
+ if (!readiness.installed) {
196
+ const repair = readiness.repair ?? `Install ${readiness.label} and put its command on PATH`;
197
+ return `${readiness.label} is not installed on this machine, so there is nothing to sign in to. ${repair} — ${OPT_IN_HINT}`;
198
+ }
199
+ if (readiness.auth !== 'required') return null;
200
+ const repair =
201
+ readiness.repair ?? `Run \`supercode harness login ${readiness.id}\` and complete sign-in`;
202
+ return `${readiness.label} is not signed in on this machine, and Volter Editor never starts a harness on an account credential. ${repair} — ${OPT_IN_HINT}`;
203
+ }
204
+
205
+ /**
206
+ * The launch seam. By default it hands Supercode the backend params UNCHANGED so the
207
+ * stock CLI starts on the login the person already did, after asking Supercode whether
208
+ * that harness is ready; only an explicit `preferredRoute` of `'managed'` or `'byok'`
209
+ * reaches `managedInferenceLaunch`.
210
+ */
211
+ export async function withCodingInference(
212
+ params: unknown,
213
+ resolveInference: () => Promise<ResolvedCodingInference | null>,
214
+ piExtensionPath: string,
215
+ readHarnessReadiness: (harness: string) => Promise<HarnessReadiness | null>,
216
+ ): Promise<unknown> {
217
+ if (!params || typeof params !== 'object' || Array.isArray(params)) return params;
218
+ const backend = params as RuntimeBackendParams;
219
+ if (backend.launch !== undefined || typeof backend.harness !== 'string') return params;
220
+ const harness = backend.harness;
221
+ const inference = await resolveInference();
222
+ const preferredRoute = inference?.preferredRoute ?? 'auto';
223
+ if (preferredRoute !== 'managed' && preferredRoute !== 'byok') {
224
+ const readiness = await readHarnessReadiness(harness);
225
+ const refusal = readiness ? harnessReadinessRefusal(readiness) : null;
226
+ if (refusal) throw new Error(refusal);
227
+ return params;
228
+ }
229
+ if (!inference) return params;
230
+ const launch = await managedInferenceLaunch(harness, inference, piExtensionPath);
231
+ if (!launch) {
232
+ throw new Error(
233
+ `${harness} takes no provider configuration — it runs on its own device login only. Sign in with \`supercode harness login ${harness}\`, or pick a harness managed inference can configure (Codex, Claude Code, OpenCode, Pi).`,
234
+ );
235
+ }
236
+ return { ...backend, launch };
237
+ }
@@ -0,0 +1,202 @@
1
+ import type { CollaborationAccountSession } from './account-service';
2
+ import {
3
+ type ShareAccountProjection,
4
+ type ShareGrantRedemption,
5
+ ShareGrantServiceError,
6
+ } from './share-session-gateway';
7
+
8
+ function accountOrganizations(
9
+ value: unknown,
10
+ ): NonNullable<ShareAccountProjection['organizations']> {
11
+ if (!Array.isArray(value) || value.length > 100) {
12
+ throw new Error('Volter Editor collaboration grant returned invalid organization membership.');
13
+ }
14
+ return value.map((candidate) => {
15
+ if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {
16
+ throw new Error('Volter Editor collaboration grant returned invalid organization membership.');
17
+ }
18
+ const organization = candidate as Record<string, unknown>;
19
+ const domains = organization['domains'];
20
+ if (
21
+ typeof organization['id'] !== 'string' ||
22
+ typeof organization['name'] !== 'string' ||
23
+ typeof organization['role'] !== 'string' ||
24
+ !Array.isArray(domains) ||
25
+ domains.length > 50
26
+ ) {
27
+ throw new Error('Volter Editor collaboration grant returned invalid organization membership.');
28
+ }
29
+ return {
30
+ id: organization['id'],
31
+ name: organization['name'],
32
+ ...(typeof organization['slug'] === 'string' ? { slug: organization['slug'] } : {}),
33
+ role: organization['role'],
34
+ domains: domains.map((domainValue) => {
35
+ if (!domainValue || typeof domainValue !== 'object' || Array.isArray(domainValue)) {
36
+ throw new Error('Volter Editor collaboration grant returned an invalid organization domain.');
37
+ }
38
+ const domain = domainValue as Record<string, unknown>;
39
+ const enrollmentMode = domain['enrollmentMode'];
40
+ if (
41
+ typeof domain['name'] !== 'string' ||
42
+ typeof domain['verified'] !== 'boolean' ||
43
+ ![
44
+ 'manual_invitation',
45
+ 'automatic_invitation',
46
+ 'automatic_suggestion',
47
+ 'enterprise_sso',
48
+ ].includes(String(enrollmentMode))
49
+ ) {
50
+ throw new Error('Volter Editor collaboration grant returned an invalid organization domain.');
51
+ }
52
+ return {
53
+ name: domain['name'],
54
+ verified: domain['verified'],
55
+ enrollmentMode: enrollmentMode as NonNullable<
56
+ ShareAccountProjection['organizations']
57
+ >[number]['domains'][number]['enrollmentMode'],
58
+ };
59
+ }),
60
+ };
61
+ });
62
+ }
63
+
64
+ export async function createCollaborationAccountHandoff(
65
+ account: CollaborationAccountSession,
66
+ binding: { callbackUrl: string; sessionId: string; invitationId: string },
67
+ ): Promise<{ authorizationUrl: string; deliveryAuthorization: string; expiresAt: number }> {
68
+ const response = await fetch(`${account.authUrl}/collaboration/handoff`, {
69
+ method: 'POST',
70
+ headers: {
71
+ Authorization: `Bearer ${account.accessToken}`,
72
+ 'Content-Type': 'application/json',
73
+ },
74
+ body: JSON.stringify(binding),
75
+ });
76
+ const body = (await response.json().catch(() => undefined)) as
77
+ | {
78
+ authorizationUrl?: unknown;
79
+ deliveryAuthorization?: unknown;
80
+ expiresAt?: unknown;
81
+ error?: unknown;
82
+ }
83
+ | undefined;
84
+ if (
85
+ !response.ok ||
86
+ typeof body?.authorizationUrl !== 'string' ||
87
+ typeof body.deliveryAuthorization !== 'string' ||
88
+ typeof body.expiresAt !== 'number'
89
+ ) {
90
+ throw new Error(
91
+ typeof body?.error === 'string'
92
+ ? body.error
93
+ : `Volter Editor collaboration authorization failed (${response.status}).`,
94
+ );
95
+ }
96
+ return {
97
+ authorizationUrl: body.authorizationUrl,
98
+ deliveryAuthorization: body.deliveryAuthorization,
99
+ expiresAt: body.expiresAt,
100
+ };
101
+ }
102
+
103
+ export async function deliverCollaborationInvitation(
104
+ account: CollaborationAccountSession,
105
+ input: {
106
+ emailAddress: string;
107
+ redirectUrl: string;
108
+ callbackUrl: string;
109
+ sessionId: string;
110
+ invitationId: string;
111
+ deliveryAuthorization: string;
112
+ expiresAt: number;
113
+ },
114
+ ): Promise<{ id: string; status: string; emailAddress: string }> {
115
+ const response = await fetch(`${account.authUrl}/collaboration/invitations`, {
116
+ method: 'POST',
117
+ headers: {
118
+ Authorization: `Bearer ${account.accessToken}`,
119
+ 'Content-Type': 'application/json',
120
+ },
121
+ body: JSON.stringify(input),
122
+ });
123
+ const body = (await response.json().catch(() => undefined)) as
124
+ | { id?: unknown; status?: unknown; emailAddress?: unknown; error?: unknown }
125
+ | undefined;
126
+ if (
127
+ !response.ok ||
128
+ typeof body?.id !== 'string' ||
129
+ typeof body.status !== 'string' ||
130
+ typeof body.emailAddress !== 'string'
131
+ ) {
132
+ throw new Error(
133
+ typeof body?.error === 'string'
134
+ ? body.error
135
+ : `Volter Editor collaboration invitation delivery failed (${response.status}).`,
136
+ );
137
+ }
138
+ return { id: body.id, status: body.status, emailAddress: body.emailAddress };
139
+ }
140
+
141
+ export async function redeemCollaborationAccountGrant(
142
+ authUrl: string,
143
+ binding: { grant: string; sessionId: string; invitationId: string },
144
+ ): Promise<ShareGrantRedemption> {
145
+ // The gateway may try several live invitations against one grant, so
146
+ // "this invitation does not own that grant" (4xx) has to stay separable from
147
+ // "the account service never answered" — the second must not be reported as
148
+ // a rejected grant to the person waiting on the callback page.
149
+ let response: Response;
150
+ try {
151
+ response = await fetch(`${authUrl.replace(/\/$/, '')}/collaboration/redeem`, {
152
+ method: 'POST',
153
+ headers: { 'Content-Type': 'application/json' },
154
+ body: JSON.stringify(binding),
155
+ });
156
+ } catch (error) {
157
+ throw new ShareGrantServiceError(
158
+ `Volter Editor collaboration grant redemption could not reach the account service: ${
159
+ error instanceof Error ? error.message : String(error)
160
+ }`,
161
+ );
162
+ }
163
+ if (response.status >= 500) {
164
+ throw new ShareGrantServiceError(
165
+ `Volter Editor collaboration grant redemption failed (${response.status}).`,
166
+ );
167
+ }
168
+ const body = (await response.json().catch(() => undefined)) as
169
+ | {
170
+ jti?: unknown;
171
+ participant?: {
172
+ id?: unknown;
173
+ email?: unknown;
174
+ name?: unknown;
175
+ organizations?: unknown;
176
+ };
177
+ error?: unknown;
178
+ }
179
+ | undefined;
180
+ if (
181
+ !response.ok ||
182
+ typeof body?.jti !== 'string' ||
183
+ typeof body.participant?.id !== 'string' ||
184
+ typeof body.participant.email !== 'string' ||
185
+ (body.participant.name !== undefined && typeof body.participant.name !== 'string') ||
186
+ !Array.isArray(body.participant.organizations)
187
+ )
188
+ throw new Error(
189
+ typeof body?.error === 'string'
190
+ ? body.error
191
+ : `Volter Editor collaboration grant redemption failed (${response.status}).`,
192
+ );
193
+ return {
194
+ jti: body.jti,
195
+ participant: {
196
+ id: body.participant.id,
197
+ email: body.participant.email,
198
+ ...(body.participant.name ? { name: body.participant.name } : {}),
199
+ organizations: accountOrganizations(body.participant.organizations),
200
+ },
201
+ };
202
+ }
@@ -0,0 +1,122 @@
1
+ /**
2
+ * WHO a change is attributed to, and what a participant is allowed to be.
3
+ *
4
+ * The agent-author lease is the load-bearing piece: a filesystem write made
5
+ * while an agent turn is running is that agent's, and a turn that has ended
6
+ * keeps a grace window so the write that lands a beat after the turn does not
7
+ * get filed as the human's. `running` closes on the observed turn and stays
8
+ * closed, so a later idle snapshot cannot re-open it.
9
+ */
10
+
11
+ import type { CollaborationRole } from '@volter/editor-sdk/session/collaboration-types';
12
+ import type { CollaborationSession } from './collaboration-session';
13
+ import type { ShareHost } from './share-host';
14
+ import { isShareRole } from './share-session-gateway';
15
+
16
+ /**
17
+ * How long an agent's authorship survives its turn. Long enough to cover the
18
+ * write that lands a beat after the turn ends; short enough that the next
19
+ * human edit is not filed as the agent's.
20
+ */
21
+ export const AGENT_AUTHOR_LEASE_MS = 60_000;
22
+
23
+ export interface AgentAuthorLease {
24
+ participantId: string;
25
+ until: number;
26
+ /** Open on an observed running turn; false once the turn's grace window is
27
+ * all that is left, so a later idle snapshot cannot re-close it. */
28
+ running: boolean;
29
+ }
30
+
31
+ /** The lease a freshly-observed running turn opens. */
32
+ export function agentAuthorLease(
33
+ participantId: string,
34
+ now: number = Date.now(),
35
+ ): AgentAuthorLease {
36
+ return { participantId, until: now + AGENT_AUTHOR_LEASE_MS, running: true };
37
+ }
38
+
39
+ /** Who a host-side filesystem write is credited to. `'host'` is the floor: an
40
+ * expired lease is indistinguishable from no agent having been here at all. */
41
+ export function filesystemMutationAuthor(
42
+ lease: Pick<AgentAuthorLease, 'participantId' | 'until'> | null,
43
+ now: number = Date.now(),
44
+ ): string {
45
+ return lease && lease.until >= now ? lease.participantId : 'host';
46
+ }
47
+
48
+ /**
49
+ * The role a LOOPBACK page joins (or rejoins) the room with.
50
+ *
51
+ * A remote participant never reaches this: its invitation role is a
52
+ * connection-scoped ceiling supplied by the gateway. A loopback page is the
53
+ * editor's owner — it already holds the checkout on disk — which is why it, and
54
+ * only it, is the recovery for a room that has lost its last maintainer. That
55
+ * room is otherwise unmanageable forever: handing 'maintain' back requires
56
+ * 'maintain', and the last-maintainer guard only refuses DEMOTION, not the sole
57
+ * maintainer closing their tab.
58
+ */
59
+ export function localCollaborationRole(
60
+ hasMaintainer: boolean,
61
+ recalledRole: CollaborationRole | null,
62
+ ): CollaborationRole {
63
+ if (!hasMaintainer) return 'maintainer';
64
+ return recalledRole ?? 'editor';
65
+ }
66
+
67
+ /**
68
+ * THE role write for a participant who reached this editor through the share
69
+ * gateway — used by `/__editor/share-control/participants/:id/role` and by
70
+ * `/__editor/collaboration/role` alike.
71
+ *
72
+ * A gateway participant has exactly one durable role, and the gateway holds
73
+ * it: `shareRoleAllows` gates every proxied request on the gateway's copy, and
74
+ * the gateway's assigned-role map is what a re-redemption restores. The
75
+ * session's copy is a projection for the UI — writing only the session moves
76
+ * the badge while the tunnel keeps authorizing the old capabilities, and the
77
+ * participant's next ephemeral re-join puts the old badge back.
78
+ *
79
+ * Order matters: the actor's authority is checked BEFORE the gateway is
80
+ * touched, so an unauthorized caller cannot demote anyone by having the
81
+ * session write fail afterwards.
82
+ *
83
+ * Everything that can refuse the change is therefore checked before EITHER
84
+ * store moves. Past that point the gateway's write is the outcome, and the
85
+ * session's projection can still fall behind it — most easily through the
86
+ * session's own ephemeral ceiling, which is a snapshot of the gateway role the
87
+ * participant last CONNECTED with, not of the invitation. Reporting that as a
88
+ * failure would tell the caller nothing happened about a change that did
89
+ * happen, so it returns a warning instead: the projection re-derives from the
90
+ * gateway on the participant's next connection.
91
+ */
92
+ export function setGatewayParticipantRole(input: {
93
+ shareHost: Pick<ShareHost, 'setParticipantRole'>;
94
+ collaboration: CollaborationSession | null;
95
+ /** The participant performing the change, or null when the caller is the
96
+ * local owner acting through private session control (no session actor). */
97
+ actorId: string | null;
98
+ participantId: string;
99
+ role: CollaborationRole;
100
+ }): { warning: string | null } {
101
+ const { shareHost, collaboration, actorId, participantId, role } = input;
102
+ if (actorId !== null && collaboration && !collaboration.allows(actorId, 'maintain')) {
103
+ throw new Error(`${actorId} does not have 'maintain' permission.`);
104
+ }
105
+ if (!isShareRole(role)) {
106
+ throw new Error('The requested role exceeds this participant invitation ceiling.');
107
+ }
108
+ shareHost.setParticipantRole(participantId, role);
109
+ // A gateway participant that redeemed but never opened the editor has no
110
+ // session record to mirror into; the gateway's own role still moved.
111
+ if (actorId === null || !collaboration?.allows(participantId, 'view')) return { warning: null };
112
+ try {
113
+ collaboration.setRole(actorId, participantId, role);
114
+ } catch (error) {
115
+ return {
116
+ warning: `The share role is now ${role}, but this editor session still shows ${
117
+ collaboration.roleFor(participantId) ?? 'no role'
118
+ } until the participant reconnects: ${error instanceof Error ? error.message : String(error)}`,
119
+ };
120
+ }
121
+ return { warning: null };
122
+ }