@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.
- package/BUNDLED_NOTICES +1527 -0
- package/LICENSE +686 -0
- package/LICENSE-APACHE +202 -0
- package/NOTICE +18 -0
- package/README.md +24 -0
- package/dist/build/chunk-JS4D4XZ3.js +175 -0
- package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
- package/dist/build/vite-plugin-product-contributions.js +100 -0
- package/dist/build/vite-plugin-product-contributions.js.map +7 -0
- package/dist/build/vite-plugin-shared-react.js +25 -0
- package/dist/build/vite-plugin-shared-react.js.map +7 -0
- package/dist/build/vite-plugin-shared-three.js +86 -0
- package/dist/build/vite-plugin-shared-three.js.map +7 -0
- package/dist/server/chunk-KMJC7AGO.js +98 -0
- package/dist/server/chunk-KMJC7AGO.js.map +7 -0
- package/dist/server/chunk-PSILUMGS.js +46 -0
- package/dist/server/chunk-PSILUMGS.js.map +7 -0
- package/dist/server/frame-proxy.js +255 -0
- package/dist/server/frame-proxy.js.map +7 -0
- package/dist/server/open-browser.js +53 -0
- package/dist/server/open-browser.js.map +7 -0
- package/dist/server/process-shutdown.js +127 -0
- package/dist/server/process-shutdown.js.map +7 -0
- package/dist/server/session-registry.js +141 -0
- package/dist/server/session-registry.js.map +7 -0
- package/dist/server/spawn-opener.js +11 -0
- package/dist/server/spawn-opener.js.map +7 -0
- package/dist/server/worktree-identity.js +11 -0
- package/dist/server/worktree-identity.js.map +7 -0
- package/dist-server/packaged.mjs +88816 -0
- package/package.json +118 -0
- package/scripts/build-plugins.mjs +14 -0
- package/scripts/build-server.mjs +26 -0
- package/scripts/build-session.mjs +9 -0
- package/server/account-credentials.ts +60 -0
- package/server/account-service.ts +1434 -0
- package/server/adapter-region-includes.ts +47 -0
- package/server/asset-catalog-v2.ts +175 -0
- package/server/asset-history-snapshots.ts +196 -0
- package/server/asset-ledger-store.ts +195 -0
- package/server/asset-library-routes.ts +1595 -0
- package/server/blender-wasm-artifact.ts +430 -0
- package/server/boot-timings.ts +106 -0
- package/server/canonical-path.ts +50 -0
- package/server/checkout-workspace-preflight.ts +349 -0
- package/server/cloud-asset-catalog.ts +158 -0
- package/server/coding-inference-launch.ts +237 -0
- package/server/collaboration-account-client.ts +202 -0
- package/server/collaboration-attribution.ts +122 -0
- package/server/collaboration-session.ts +934 -0
- package/server/comfyui-bridge.ts +248 -0
- package/server/console-ledger.ts +499 -0
- package/server/creation-site-transform.ts +304 -0
- package/server/creation-site-write.ts +648 -0
- package/server/data-file-serialize.ts +158 -0
- package/server/editor-brand-html.ts +72 -0
- package/server/editor-control-socket.ts +366 -0
- package/server/editor-server-options.ts +190 -0
- package/server/editor-server.ts +1483 -0
- package/server/editor-sse.ts +352 -0
- package/server/engine-provenance.ts +169 -0
- package/server/engine-source-restart.ts +117 -0
- package/server/frame-bridge.ts +115 -0
- package/server/frame-proxy.ts +490 -0
- package/server/frame-workbench.ts +259 -0
- package/server/frontend-handoff.ts +229 -0
- package/server/game-globals-shadow.ts +113 -0
- package/server/gameplay-session-retention.ts +149 -0
- package/server/gameplay-sessions.ts +123 -0
- package/server/generation-jobs.ts +201 -0
- package/server/generation-reconciler.ts +137 -0
- package/server/generative-execution-context.ts +59 -0
- package/server/git-workflow.ts +612 -0
- package/server/harness-chat-caller.ts +36 -0
- package/server/harness-chat-service.ts +1681 -0
- package/server/idle-shutdown.ts +170 -0
- package/server/js-profiling-policy.ts +52 -0
- package/server/launcher-settings.ts +84 -0
- package/server/local-asset-catalog.ts +410 -0
- package/server/managed-account-defaults.ts +22 -0
- package/server/mock-control-plane.ts +540 -0
- package/server/model-import-conversion.ts +345 -0
- package/server/native-credential-store.ts +162 -0
- package/server/open-browser.ts +118 -0
- package/server/packaged.ts +1192 -0
- package/server/play-stall.ts +126 -0
- package/server/process-shutdown.ts +218 -0
- package/server/product-presets.ts +55 -0
- package/server/project-build-artifact.ts +95 -0
- package/server/project-components.ts +100 -0
- package/server/project-dependency-invalidation.ts +114 -0
- package/server/project-file-scan.ts +235 -0
- package/server/project-hmr-files.ts +215 -0
- package/server/project-install-roots.ts +210 -0
- package/server/project-kinds.ts +71 -0
- package/server/project-mcp-servers.ts +82 -0
- package/server/project-module-freshness.ts +109 -0
- package/server/project-module-instance.ts +375 -0
- package/server/project-optimize-deps-entries.ts +827 -0
- package/server/project-output-writer.ts +679 -0
- package/server/project-package-origin.ts +63 -0
- package/server/project-root-surface.ts +831 -0
- package/server/project-scratch-path.ts +47 -0
- package/server/project-script-hmr.ts +619 -0
- package/server/project-serving-plugins.ts +236 -0
- package/server/project-tools.ts +653 -0
- package/server/project-validation.ts +250 -0
- package/server/project-verbs.ts +127 -0
- package/server/project-view.ts +52 -0
- package/server/project-watch.ts +1134 -0
- package/server/project-work-coordinator.ts +288 -0
- package/server/provider-credentials.ts +331 -0
- package/server/recent-projects-store.ts +98 -0
- package/server/redact-secrets.ts +71 -0
- package/server/repository-presence.ts +267 -0
- package/server/routes/account.ts +357 -0
- package/server/routes/agents.ts +60 -0
- package/server/routes/assets.ts +154 -0
- package/server/routes/build.ts +13 -0
- package/server/routes/collaboration.ts +595 -0
- package/server/routes/configurations.ts +419 -0
- package/server/routes/context.ts +264 -0
- package/server/routes/control-plane.ts +1811 -0
- package/server/routes/logs.ts +272 -0
- package/server/routes/project-identity.ts +302 -0
- package/server/routes/project-open.ts +429 -0
- package/server/routes/project-source.ts +686 -0
- package/server/routes/project-state.ts +383 -0
- package/server/routes/relay.ts +1029 -0
- package/server/routes/route-helpers.ts +29 -0
- package/server/routes/served-modules.ts +138 -0
- package/server/routes/session-tabs.ts +196 -0
- package/server/routes/settings.ts +121 -0
- package/server/routes/share-control.ts +486 -0
- package/server/routes/themes.ts +116 -0
- package/server/routes/tools.ts +230 -0
- package/server/routes/worktrees.ts +595 -0
- package/server/scoped-game-css.ts +461 -0
- package/server/server-utils.ts +1194 -0
- package/server/session-product.ts +112 -0
- package/server/session-registry.ts +230 -0
- package/server/share-claims.ts +138 -0
- package/server/share-host.ts +526 -0
- package/server/share-session-gateway.ts +1362 -0
- package/server/share-tunnel.ts +123 -0
- package/server/spawn-opener.ts +74 -0
- package/server/support/play/log-format.ts +76 -0
- package/server/support/play/session-record.ts +199 -0
- package/server/support/project/build-discipline.ts +718 -0
- package/server/support/project/inspection-node.ts +119 -0
- package/server/support/project/log-naming.ts +54 -0
- package/server/support/project/provenance.ts +290 -0
- package/server/support/project/run-name.ts +18 -0
- package/server/support/project/session-journal.ts +830 -0
- package/server/support/project/shared.ts +327 -0
- package/server/tab-bootstrap.ts +62 -0
- package/server/tab-heartbeat.ts +477 -0
- package/server/tab-lifecycle.ts +550 -0
- package/server/tab-presence.ts +1508 -0
- package/server/team-agent-mirror.ts +95 -0
- package/server/twin-auth.ts +138 -0
- package/server/vendored-lock-recorder.ts +968 -0
- package/server/worktree-identity.ts +121 -0
- package/server/worktree-management.ts +398 -0
- package/server/worktree-retention.d.mts +13 -0
- package/server/worktree-retention.mjs +205 -0
- package/src/EditorContext.tsx +169 -0
- package/src/account.ts +333 -0
- package/src/action-registry.ts +532 -0
- package/src/active-product.ts +74 -0
- package/src/active-project.ts +155 -0
- package/src/adapter-editor-config.ts +25 -0
- package/src/adapter-observation.ts +49 -0
- package/src/animation/stage-transport.ts +379 -0
- package/src/animation/three-clips-subject.ts +172 -0
- package/src/api/asset-library-wire.ts +45 -0
- package/src/api/assets.ts +365 -0
- package/src/api/base.ts +10 -0
- package/src/api/build.ts +99 -0
- package/src/api/git-wire.ts +56 -0
- package/src/api/logs.ts +92 -0
- package/src/api/project-identity.ts +74 -0
- package/src/api/project-open.ts +355 -0
- package/src/api/project-source.ts +162 -0
- package/src/api/project-state.ts +107 -0
- package/src/api/relay.ts +268 -0
- package/src/api/settings.ts +36 -0
- package/src/api/themes.ts +45 -0
- package/src/api/worktrees.ts +257 -0
- package/src/asset-compare-core.ts +171 -0
- package/src/asset-compare.ts +294 -0
- package/src/asset-editor-context.tsx +100 -0
- package/src/asset-events.ts +97 -0
- package/src/asset-inspector-actions.ts +87 -0
- package/src/asset-preview-framing.ts +357 -0
- package/src/asset-preview.ts +2802 -0
- package/src/asset-selection-viewer-registry.ts +113 -0
- package/src/asset-selection.ts +133 -0
- package/src/asset-workflow/asset-capabilities.ts +344 -0
- package/src/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/asset-workflow/asset-ledger.ts +156 -0
- package/src/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/asset-workflow/asset-types.ts +142 -0
- package/src/asset-workflow/asset-workflow-quality.ts +61 -0
- package/src/asset-workflow/audio-preview-player.ts +193 -0
- package/src/asset-workflow/audio-waveform.ts +22 -0
- package/src/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/asset-workflow/folder-preview.ts +345 -0
- package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/asset-workflow/image-view-scale.ts +32 -0
- package/src/asset-workflow/import-contract.ts +124 -0
- package/src/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/asset-workflow/model-inspection.ts +818 -0
- package/src/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/asset-workflow/project-asset-commands.ts +23 -0
- package/src/asset-workflow/project-asset-health.ts +139 -0
- package/src/asset-workflow/project-asset-operations.ts +154 -0
- package/src/asset-workflow/project-asset-roots.ts +68 -0
- package/src/asset-workflow/project-content.ts +288 -0
- package/src/asset-workflow/project-source-index.ts +550 -0
- package/src/asset-workflow/thumbnail-system.ts +256 -0
- package/src/authoring/active-adapter.ts +199 -0
- package/src/authoring/active-systems.ts +422 -0
- package/src/authoring/adapter-key.ts +18 -0
- package/src/authoring/authoring-asset-url.ts +27 -0
- package/src/authoring/bootstrap-state.ts +49 -0
- package/src/authoring/boundary-authoring-adapter.ts +184 -0
- package/src/authoring/breakpoint-state.ts +43 -0
- package/src/authoring/canvas-scene-guides.ts +76 -0
- package/src/authoring/component-instance-root.ts +171 -0
- package/src/authoring/composite-authoring-adapter.ts +2110 -0
- package/src/authoring/consumer-actions.ts +520 -0
- package/src/authoring/css-numeric-style.ts +97 -0
- package/src/authoring/design-time-layers.ts +849 -0
- package/src/authoring/design-time-mount-registry.ts +235 -0
- package/src/authoring/design-time-settle.ts +343 -0
- package/src/authoring/edit-mode-authoring.ts +619 -0
- package/src/authoring/eyedropper-session.ts +60 -0
- package/src/authoring/instance-source-menu-register.ts +13 -0
- package/src/authoring/instance-source-menu.ts +135 -0
- package/src/authoring/layered-pick.ts +183 -0
- package/src/authoring/live-gesture-lock.ts +50 -0
- package/src/authoring/live-object-transform.ts +62 -0
- package/src/authoring/mount-failure-report.ts +154 -0
- package/src/authoring/mounted-root-subjects.ts +144 -0
- package/src/authoring/no-authoring-adapter.ts +55 -0
- package/src/authoring/null-inspection-subjects.tsx +75 -0
- package/src/authoring/object3d-document-persistence.ts +106 -0
- package/src/authoring/object3d-document-session-registry.ts +120 -0
- package/src/authoring/object3d-document-session.ts +1326 -0
- package/src/authoring/object3d-gesture-controller.ts +113 -0
- package/src/authoring/panel-authoring.ts +121 -0
- package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
- package/src/authoring/prefab-instance-section-model.ts +55 -0
- package/src/authoring/project-authoring-session.ts +105 -0
- package/src/authoring/provenance.ts +99 -0
- package/src/authoring/quarks-particle-systems.ts +19 -0
- package/src/authoring/react-canvas-navigation.ts +255 -0
- package/src/authoring/react-design-canvas-style.ts +20 -0
- package/src/authoring/react-story-board.ts +937 -0
- package/src/authoring/selection-scope.ts +195 -0
- package/src/authoring/shell-document-ops.ts +169 -0
- package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
- package/src/authoring/shell-viewport-policy.ts +48 -0
- package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
- package/src/authoring/stories-scope.ts +35 -0
- package/src/authoring/story-board-chrome-fit.ts +107 -0
- package/src/authoring/story-board-presentation.ts +111 -0
- package/src/authoring/three-projection-core.ts +226 -0
- package/src/authoring/viewport-pick-context.ts +40 -0
- package/src/authoring/viewport-raycast.ts +240 -0
- package/src/authoring/viewport-tool-context.ts +73 -0
- package/src/authoring/world-canvas-viewport-state.ts +35 -0
- package/src/authoring/world-hidden-viewport.ts +152 -0
- package/src/authoring/world-pan-state.ts +198 -0
- package/src/authoring/world-session-state.ts +101 -0
- package/src/authoring/write-pipe.ts +173 -0
- package/src/availability-tick.ts +66 -0
- package/src/bitmap-label.ts +120 -0
- package/src/blender-tab-metrics.ts +161 -0
- package/src/board-open-actions.ts +20 -0
- package/src/boot-routing.ts +391 -0
- package/src/build-identity.ts +15 -0
- package/src/bytes-codec.ts +62 -0
- package/src/camera-authoring.ts +175 -0
- package/src/cancellation-reason.ts +58 -0
- package/src/canvas-preview-frames.ts +482 -0
- package/src/capture-camera-pose.ts +77 -0
- package/src/chrome-registry.ts +159 -0
- package/src/chrome-slot-registry.ts +91 -0
- package/src/collaboration-client.ts +264 -0
- package/src/collaboration-presence.ts +41 -0
- package/src/command-dispatch.ts +19 -0
- package/src/command-listener.ts +2743 -0
- package/src/command-registry.ts +70 -0
- package/src/component-board-registry.ts +205 -0
- package/src/component-states-registry.ts +200 -0
- package/src/components/AgentPresentationNotice.tsx +75 -0
- package/src/components/AlignToolbar.tsx +204 -0
- package/src/components/AppRoot.tsx +394 -0
- package/src/components/ApplicationMenus.tsx +415 -0
- package/src/components/AssetBrowser.tsx +2843 -0
- package/src/components/AssetEditorShell.tsx +216 -0
- package/src/components/AssetInspectorToolSection.tsx +124 -0
- package/src/components/BoardRulers.tsx +354 -0
- package/src/components/CameraInfo.tsx +81 -0
- package/src/components/CanvasSceneViewport.tsx +556 -0
- package/src/components/CapabilityCoverageSection.tsx +185 -0
- package/src/components/CenterDocuments.tsx +22 -0
- package/src/components/ChromeSlot.tsx +20 -0
- package/src/components/CodeView.tsx +470 -0
- package/src/components/CollaborationHeaderControl.css +74 -0
- package/src/components/CompactInspectorCard.tsx +190 -0
- package/src/components/CompactInspectorShell.tsx +39 -0
- package/src/components/ConsolePanel.css +55 -0
- package/src/components/ConsolePanel.tsx +270 -0
- package/src/components/DefaultEditorLayout.tsx +106 -0
- package/src/components/DocumentHeaderStrip.tsx +96 -0
- package/src/components/DocumentShelfRail.tsx +45 -0
- package/src/components/DocumentThumbnail.tsx +345 -0
- package/src/components/EditorLeaseGuard.tsx +372 -0
- package/src/components/ErrorBanner.tsx +123 -0
- package/src/components/FolderPreviewTile.tsx +159 -0
- package/src/components/GameHierarchy.tsx +3842 -0
- package/src/components/GameplaySessionTimeline.tsx +295 -0
- package/src/components/InspectionProjection.tsx +968 -0
- package/src/components/Inspector.tsx +233 -0
- package/src/components/InspectorCanvasPreview.tsx +35 -0
- package/src/components/InspectorFieldsSection.tsx +290 -0
- package/src/components/InspectorObjectPreview.tsx +57 -0
- package/src/components/InspectorStoriesSection.tsx +92 -0
- package/src/components/InspectorToolSection.tsx +96 -0
- package/src/components/InspectorTransformSection.tsx +245 -0
- package/src/components/LightExplorerPanel.tsx +433 -0
- package/src/components/MediaProperties.tsx +145 -0
- package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
- package/src/components/Object3DDocumentToolbar.css +100 -0
- package/src/components/Object3DDocumentToolbar.tsx +454 -0
- package/src/components/Object3DDocumentViewport.tsx +58 -0
- package/src/components/ProjectHeader.css +617 -0
- package/src/components/ProjectHeader.tsx +328 -0
- package/src/components/ProjectLayout.tsx +249 -0
- package/src/components/ReactCanvasControls.tsx +284 -0
- package/src/components/RootSelectionOverlay.tsx +3162 -0
- package/src/components/RootTextEditor.tsx +79 -0
- package/src/components/SaveStatus.tsx +70 -0
- package/src/components/StageHost.tsx +1954 -0
- package/src/components/StageOverlays.tsx +21 -0
- package/src/components/StartupErrorScreen.tsx +76 -0
- package/src/components/StartupLoadingScreen.tsx +65 -0
- package/src/components/StatsOverlay.tsx +78 -0
- package/src/components/SurfaceStateOverlay.tsx +24 -0
- package/src/components/ToolContributionSurfaces.tsx +65 -0
- package/src/components/ToolHost.tsx +370 -0
- package/src/components/ToolObject3DPreview.tsx +39 -0
- package/src/components/Toolbar.tsx +595 -0
- package/src/components/TransientHint.tsx +44 -0
- package/src/components/TransportStrip.tsx +174 -0
- package/src/components/VersionControlSection.tsx +470 -0
- package/src/components/VgaiLogo.css +83 -0
- package/src/components/VgaiLogo.tsx +35 -0
- package/src/components/ViewportControlsHint.tsx +60 -0
- package/src/components/ViewportFurniture.tsx +401 -0
- package/src/components/ViewportOverlay.tsx +145 -0
- package/src/components/ViewportOverlaysMenu.tsx +153 -0
- package/src/components/ViewportShadingMenu.tsx +300 -0
- package/src/components/ViewportViewMenu.tsx +101 -0
- package/src/components/WorkspaceDocumentSurface.tsx +204 -0
- package/src/components/WorkspaceUtilitySurface.tsx +22 -0
- package/src/components/WorktreeSwitcher.css +239 -0
- package/src/components/WorktreeSwitcher.tsx +890 -0
- package/src/components/account-documents.tsx +1162 -0
- package/src/components/asset-documents.tsx +812 -0
- package/src/components/asset-editor-persistence.ts +216 -0
- package/src/components/asset-selection-section.tsx +535 -0
- package/src/components/asset-thumbnails.tsx +312 -0
- package/src/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
- package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
- package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
- package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
- package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
- package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
- package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
- package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
- package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
- package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
- package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/components/asset-viewers/shader-source.ts +144 -0
- package/src/components/asset-workflow.css +731 -0
- package/src/components/board-guides.ts +150 -0
- package/src/components/compact-inspector.css +539 -0
- package/src/components/core-utilities.tsx +90 -0
- package/src/components/editor-notifications.css +40 -0
- package/src/components/engine-workspace.css +274 -0
- package/src/components/inspector-preview-section.tsx +238 -0
- package/src/components/inspector-property-grouping.ts +64 -0
- package/src/components/inspector-revert-label.ts +20 -0
- package/src/components/inspector-selection.ts +42 -0
- package/src/components/inspector-stories-gating.ts +171 -0
- package/src/components/inspector-transform-subject.ts +11 -0
- package/src/components/inspector-transform.ts +75 -0
- package/src/components/kind-documents.tsx +500 -0
- package/src/components/palette-action-publisher.tsx +140 -0
- package/src/components/primitives/DraftColorInput.tsx +74 -0
- package/src/components/product-shell.css +1829 -0
- package/src/components/project-tool-documents.tsx +410 -0
- package/src/components/scene-documents.tsx +223 -0
- package/src/components/stage-keyboard.tsx +37 -0
- package/src/components/stage-overlay-set.tsx +107 -0
- package/src/components/stage-presence-markers.ts +478 -0
- package/src/components/standard-viewport-dressing.ts +417 -0
- package/src/components/status-contributions.tsx +403 -0
- package/src/components/tool-documents.tsx +309 -0
- package/src/components/tool-schema-form.tsx +262 -0
- package/src/components/use-after-paint.ts +41 -0
- package/src/components/use-project-image-assets.ts +86 -0
- package/src/components/viewport-header-controls.css +90 -0
- package/src/components/viewport-surface-status.tsx +55 -0
- package/src/components/workspace-history.ts +32 -0
- package/src/components/workspace-static-panel-registry.tsx +152 -0
- package/src/components/workspace-surfaces.css +621 -0
- package/src/components/world-documents.tsx +586 -0
- package/src/components/world-overlay-gestures.ts +1694 -0
- package/src/composite-screenshot.ts +1641 -0
- package/src/console-sync.ts +131 -0
- package/src/constraint-helper.ts +338 -0
- package/src/content-entry-source-registry.ts +184 -0
- package/src/coverage/authoring-seam-evidence.ts +300 -0
- package/src/coverage/canvas-reveal.ts +192 -0
- package/src/coverage/design-time-surfaces.ts +101 -0
- package/src/coverage/live-seam-evidence.ts +11 -0
- package/src/coverage/ontology-invariants.ts +466 -0
- package/src/coverage/session-vitals.ts +501 -0
- package/src/coverage/system-seam-evidence.ts +72 -0
- package/src/crash-null-boundary.ts +36 -0
- package/src/creation-site-edit.ts +1479 -0
- package/src/creation-site-registry.ts +160 -0
- package/src/delegate-harness-registry.ts +143 -0
- package/src/document-context-registry.ts +177 -0
- package/src/document-open-registry.ts +200 -0
- package/src/document-preview-source.ts +20 -0
- package/src/document-renderer-session.ts +138 -0
- package/src/editor-api.ts +46 -0
- package/src/editor-chrome-capture.ts +139 -0
- package/src/editor-commands.ts +164 -0
- package/src/editor-console.ts +563 -0
- package/src/editor-current-view.ts +82 -0
- package/src/editor-document-probe.ts +881 -0
- package/src/editor-git-client.ts +115 -0
- package/src/editor-host-door.ts +462 -0
- package/src/editor-hotkeys.ts +842 -0
- package/src/editor-lease-view.ts +39 -0
- package/src/editor-lease.ts +415 -0
- package/src/editor-mode.ts +19 -0
- package/src/editor-notifications.ts +140 -0
- package/src/editor-presence.ts +563 -0
- package/src/editor-presentation-activity.ts +50 -0
- package/src/editor-presentation-notice.ts +42 -0
- package/src/editor-runtime.tsx +145 -0
- package/src/editor-server-response.ts +86 -0
- package/src/editor-session-attribution.ts +75 -0
- package/src/editor-session-mode.ts +54 -0
- package/src/editor-shell-store.ts +1304 -0
- package/src/editor-state-facets.ts +74 -0
- package/src/editor-styles.css +33 -0
- package/src/editor-view-presentation.ts +810 -0
- package/src/editor-viewport.ts +5302 -0
- package/src/entity-lod.ts +31 -0
- package/src/entity-object.ts +91 -0
- package/src/files/file-provider.ts +62 -0
- package/src/files/project-files.ts +264 -0
- package/src/finders/index.ts +136 -0
- package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/frame/bridge.tsx +1408 -0
- package/src/frame/product.ts +77 -0
- package/src/gameplay-dom-recording.ts +319 -0
- package/src/gameplay-export-state.ts +14 -0
- package/src/gameplay-replay.ts +417 -0
- package/src/gameplay-session-time.ts +9 -0
- package/src/gameplay-sessions.ts +204 -0
- package/src/harness-chat-types.ts +253 -0
- package/src/hierarchy-component-marks.ts +298 -0
- package/src/hierarchy-drop.ts +91 -0
- package/src/hierarchy-expansion-state.ts +80 -0
- package/src/hierarchy-header-slot.ts +52 -0
- package/src/hierarchy-internals.ts +197 -0
- package/src/hierarchy-kind-icon.ts +217 -0
- package/src/hierarchy-mark-reader.ts +73 -0
- package/src/hierarchy-menu-registry.ts +67 -0
- package/src/hierarchy-node-rows.ts +307 -0
- package/src/hierarchy-panel-view.ts +280 -0
- package/src/hierarchy-projection.ts +76 -0
- package/src/hierarchy-row-cache.ts +243 -0
- package/src/hierarchy-row-model.ts +308 -0
- package/src/hierarchy-rows.ts +11 -0
- package/src/hierarchy-walk.ts +86 -0
- package/src/history/editor-session.ts +25 -0
- package/src/history/history-commands.ts +147 -0
- package/src/history/history-delegate.ts +163 -0
- package/src/history/history-limit-notices.ts +43 -0
- package/src/history/history-service.ts +1173 -0
- package/src/history/persistence-coordinator.ts +35 -0
- package/src/history/project-file-history.ts +386 -0
- package/src/history/project-root-history-backends.ts +139 -0
- package/src/history/resource-registry.ts +209 -0
- package/src/history/snapshot-store.ts +103 -0
- package/src/history/source-history-backend.ts +546 -0
- package/src/history/types.ts +124 -0
- package/src/hmr-registration-group.ts +67 -0
- package/src/hmr-stable-react-context.ts +23 -0
- package/src/hotkeys.ts +188 -0
- package/src/inference-diagnostics.ts +69 -0
- package/src/initial-project.ts +80 -0
- package/src/inspection/active-subject.ts +578 -0
- package/src/inspection/active-surface.ts +142 -0
- package/src/inspection/compose.ts +1064 -0
- package/src/inspection/display.ts +170 -0
- package/src/inspection/document-subject.ts +109 -0
- package/src/inspection/game-subject.ts +85 -0
- package/src/inspection/model.ts +542 -0
- package/src/inspection/null-subject.ts +115 -0
- package/src/inspection/serialize.ts +357 -0
- package/src/inspection/use-active-inspection.ts +180 -0
- package/src/inspector-presentation.ts +201 -0
- package/src/inspector-section-registry.ts +221 -0
- package/src/instance-source-actions.ts +163 -0
- package/src/instanced-presentation.ts +164 -0
- package/src/js-heap.ts +71 -0
- package/src/key-actions.ts +91 -0
- package/src/keymap-presets.ts +401 -0
- package/src/layout-policy.ts +31 -0
- package/src/learn-links.ts +73 -0
- package/src/light-explorer-model.ts +134 -0
- package/src/live-canvas-frame.ts +55 -0
- package/src/live-document.ts +279 -0
- package/src/live-module-source.ts +230 -0
- package/src/live-session-registry.ts +220 -0
- package/src/live-transition.ts +633 -0
- package/src/manifest-project.ts +107 -0
- package/src/model-thumbnail.ts +523 -0
- package/src/native-selection-style.ts +202 -0
- package/src/object3d-document-write-policy.ts +137 -0
- package/src/packaged-runtime.ts +108 -0
- package/src/palettes/maya.palette.json +57 -0
- package/src/palettes/substance.palette.json +57 -0
- package/src/pasteboard-module.ts +81 -0
- package/src/performance-profiler.ts +367 -0
- package/src/performance-sources.ts +69 -0
- package/src/play-boot-phase.ts +145 -0
- package/src/presentation-surface.ts +248 -0
- package/src/project-adapter.ts +1143 -0
- package/src/project-asset-refresh.ts +26 -0
- package/src/project-declaration-refresh.ts +31 -0
- package/src/project-local-state.ts +118 -0
- package/src/project-manager.ts +243 -0
- package/src/project-module-changes.ts +163 -0
- package/src/project-module-split.ts +266 -0
- package/src/project-provenance.ts +115 -0
- package/src/project-ready.ts +42 -0
- package/src/project-session-reset.ts +67 -0
- package/src/project-shape.ts +68 -0
- package/src/project-tool-discovery.ts +66 -0
- package/src/project-tools.ts +107 -0
- package/src/project-work-types.ts +149 -0
- package/src/projection/three.ts +898 -0
- package/src/projection/types.ts +44 -0
- package/src/readiness.ts +113 -0
- package/src/reflection-probe-helper.ts +142 -0
- package/src/reported-play-state.ts +90 -0
- package/src/resolve-relative-specifier.ts +33 -0
- package/src/scene-document-plan.ts +315 -0
- package/src/scene-framing.ts +315 -0
- package/src/scene-live-open.ts +210 -0
- package/src/scene-view-fog.ts +89 -0
- package/src/scoped-game-css.ts +152 -0
- package/src/session-orphan-record.ts +193 -0
- package/src/session-tombstone.ts +126 -0
- package/src/settings/settings-provider.ts +82 -0
- package/src/settings-store.ts +345 -0
- package/src/shared-view-restore.ts +42 -0
- package/src/shell-store-door.ts +45 -0
- package/src/source-conflict.ts +122 -0
- package/src/spatial-handle-visuals.ts +332 -0
- package/src/stage-context.ts +341 -0
- package/src/stage-store-registry.ts +63 -0
- package/src/stale-chunk-recovery.ts +34 -0
- package/src/state-report-deferral.ts +73 -0
- package/src/storage/host-files-storage.ts +97 -0
- package/src/storage/http-storage.ts +174 -0
- package/src/storage/index.ts +75 -0
- package/src/storage/mem-storage.ts +149 -0
- package/src/storage/path-lock.ts +44 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/types.ts +116 -0
- package/src/stories/StoryComponentThumbnail.tsx +184 -0
- package/src/stories/StoryPreviewMount.tsx +306 -0
- package/src/stories/component-content-source.tsx +106 -0
- package/src/stories/component-states-source.ts +78 -0
- package/src/stories/compose-project-stories.ts +255 -0
- package/src/stories/pixi-story-model.ts +30 -0
- package/src/stories/prefabs-finder.ts +54 -0
- package/src/stories/prefabs-from-stories.ts +182 -0
- package/src/stories/project-story-discovery.ts +78 -0
- package/src/stories/project-story-regions.ts +24 -0
- package/src/stories/story-actions.ts +54 -0
- package/src/stories/story-capture-command.ts +124 -0
- package/src/stories/story-capture.ts +584 -0
- package/src/stories/story-declared-medium.ts +126 -0
- package/src/stories/story-discovery.ts +176 -0
- package/src/stories/story-document-openers.ts +36 -0
- package/src/stories/story-dom-runtime.ts +78 -0
- package/src/stories/story-grouping.ts +111 -0
- package/src/stories/story-lane.ts +88 -0
- package/src/stories/story-mount-turn.ts +27 -0
- package/src/stories/story-opener.ts +260 -0
- package/src/stories/story-pixi-preview.ts +408 -0
- package/src/stories/story-presentation.ts +215 -0
- package/src/stories/story-registry.ts +517 -0
- package/src/stories/story-three-preview.ts +807 -0
- package/src/stories/three-story-model.ts +96 -0
- package/src/story-three-preview-runtime.ts +56 -0
- package/src/surface-keyboard.ts +112 -0
- package/src/surface-state.ts +124 -0
- package/src/tab-bootstrap.js +628 -0
- package/src/tab-census.ts +198 -0
- package/src/tab-lifecycle-client.ts +196 -0
- package/src/theme-library.ts +844 -0
- package/src/theme-preference.ts +378 -0
- package/src/theme.css +3437 -0
- package/src/three-viewport/bone-selection-highlight.ts +119 -0
- package/src/three-viewport/camera-fit.ts +41 -0
- package/src/three-viewport/interactive-renderer.ts +132 -0
- package/src/three-viewport/selection-brackets.ts +310 -0
- package/src/three-viewport/selection-outline.ts +183 -0
- package/src/three-viewport/skeleton-helper.ts +61 -0
- package/src/three-viewport/source-color.ts +167 -0
- package/src/three-viewport/studio-environment.ts +96 -0
- package/src/three-viewport-presentation.ts +23 -0
- package/src/tool-contribution-play.ts +74 -0
- package/src/tool-loader.ts +1798 -0
- package/src/transform-mode-request.ts +57 -0
- package/src/transient-hint.ts +78 -0
- package/src/trigger-volume-helper.ts +116 -0
- package/src/ui-source/adapter-region-includes.ts +241 -0
- package/src/ui-source/ensure-import.ts +132 -0
- package/src/ui-source/file-region-resolver.ts +302 -0
- package/src/ui-source/inspect.ts +775 -0
- package/src/ui-source/oid-transform.ts +1845 -0
- package/src/ui-source/plan-csf-story.ts +196 -0
- package/src/ui-source/plan-extract-component.ts +421 -0
- package/src/ui-source/plan-fork-component.ts +621 -0
- package/src/ui-source/plan-named-style.ts +95 -0
- package/src/ui-source/plan-source-edit.ts +353 -0
- package/src/ui-source/r3f-contract-resolver.ts +327 -0
- package/src/ui-source/r3f-diagnostic-index.ts +165 -0
- package/src/ui-source/r3f-environment-binding.ts +133 -0
- package/src/ui-source/r3f-joint-binding.ts +251 -0
- package/src/ui-source/r3f-lod-binding.ts +91 -0
- package/src/ui-source/r3f-particle-binding.ts +235 -0
- package/src/ui-source/r3f-physics-binding.ts +483 -0
- package/src/ui-source/r3f-project-contracts.ts +444 -0
- package/src/ui-source/relative-import-specifier.ts +34 -0
- package/src/ui-source/reparent-guard.ts +544 -0
- package/src/ui-source/source-edit-request.ts +97 -0
- package/src/ui-source/source-write-backend.ts +618 -0
- package/src/ui-source/syntactic-prop-specs.ts +296 -0
- package/src/ui-source/tier-source-write-backend.ts +279 -0
- package/src/ui-source/ts-ast.ts +171 -0
- package/src/ui-source/utility-class-support.ts +169 -0
- package/src/ui-source/write-component-default.ts +133 -0
- package/src/ui-source/writer.ts +1989 -0
- package/src/viewport-activation-timings.ts +840 -0
- package/src/viewport-authoring-policy.ts +186 -0
- package/src/viewport-controls-hint.ts +57 -0
- package/src/viewport-door.ts +237 -0
- package/src/viewport-shading-boundary.ts +12 -0
- package/src/vite-error-surface.ts +141 -0
- package/src/wait-until.ts +37 -0
- package/src/workspace-areas.ts +156 -0
- package/src/workspace-aux-commands.ts +11 -0
- package/src/workspace-available-documents.ts +127 -0
- package/src/workspace-core-utilities.ts +31 -0
- package/src/workspace-document-ids.ts +59 -0
- package/src/workspace-document-registry.ts +612 -0
- package/src/workspace-document-restore.ts +145 -0
- package/src/workspace-host-commands.ts +141 -0
- package/src/workspace-persistence-gate.ts +40 -0
- package/src/workspace-play-utilities.ts +44 -0
- package/src/workspace-presets.ts +425 -0
- package/src/workspace-regions.ts +294 -0
- package/src/workspace-state-persistence.ts +536 -0
- package/src/workspace-static-panels.ts +73 -0
- package/src/workspace-status-registry.ts +121 -0
- package/src/workspace-style.ts +239 -0
- package/src/workspace-utility-commands.ts +74 -0
- package/src/workspace-utility-registry.ts +263 -0
- package/src/workspace-viewport-rect.ts +97 -0
- package/src/world-adoption.ts +115 -0
- package/src/world-document-routing.ts +104 -0
- package/vite-plugin-creation-site-write.ts +184 -0
- package/vite-plugin-creation-site.ts +80 -0
- package/vite-plugin-game-static.ts +303 -0
- package/vite-plugin-module-doorways.ts +336 -0
- package/vite-plugin-product-contributions.ts +197 -0
- package/vite-plugin-project-game-static.ts +125 -0
- package/vite-plugin-project-jsx-js.ts +65 -0
- package/vite-plugin-project-root-absolute-assets.ts +359 -0
- package/vite-plugin-shared-react.ts +420 -0
- package/vite-plugin-shared-three.ts +203 -0
- package/vite-plugin-ui-oid.ts +2106 -0
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE UNRESOLVED CONSOLE SET — the session's errors and warnings, held by the
|
|
3
|
+
* SERVER so they outlive the page that reported them.
|
|
4
|
+
*
|
|
5
|
+
* Why this exists at all (owner convention, measured failure 2026-08-14): the
|
|
6
|
+
* editor console's errors and warnings must chase an agent through every
|
|
7
|
+
* `vgai` invocation, so that nobody ever has to LOOK at the editor to learn a
|
|
8
|
+
* session has errors. Before this, every fact about them lived in the browser:
|
|
9
|
+
* `editor-console.ts`'s ring buffer, summarized to a `{count, recent[]}` facet
|
|
10
|
+
* the page POSTed with its state. That has three fatal properties for the
|
|
11
|
+
* convention:
|
|
12
|
+
*
|
|
13
|
+
* 1. **Tab death destroys the record.** A killed renderer takes the ring
|
|
14
|
+
* buffer with it; a session with eleven errors reported one journal row
|
|
15
|
+
* and then nothing.
|
|
16
|
+
* 2. **A reload silently resets it** — the store is module state, so the
|
|
17
|
+
* count went to zero whether or not the condition was fixed.
|
|
18
|
+
* 3. **Repeats deduped to silence.** The page collapses consecutive identical
|
|
19
|
+
* messages onto one entry; a message that fired 400 times and a message
|
|
20
|
+
* that fired once looked the same downstream.
|
|
21
|
+
*
|
|
22
|
+
* So the durable set lives here. The page reports OCCURRENCE DELTAS; this
|
|
23
|
+
* ledger keys them by fingerprint and SUMS. Nothing is ever dropped for being
|
|
24
|
+
* a repeat — the repeat becomes a count.
|
|
25
|
+
*
|
|
26
|
+
* CLEARING IS DELIBERATELY HARD (there is no auto-expiry, and reconnecting is
|
|
27
|
+
* not a reset):
|
|
28
|
+
*
|
|
29
|
+
* (a) **The page reloads and the condition does not recur.** A reload is the
|
|
30
|
+
* one event that re-runs the code that errored, so it is the one honest
|
|
31
|
+
* re-test. `noteLoad` records the new page-load; an entry last seen in an
|
|
32
|
+
* OLDER load retires once the new load has been settled for
|
|
33
|
+
* {@link LOAD_SETTLE_MS}. If it recurs, the same fingerprint is observed
|
|
34
|
+
* again under the new load id and its count keeps climbing.
|
|
35
|
+
* (b) **Somebody acknowledges it by name**, with a reason — `vgai console ack
|
|
36
|
+
* <id> --reason "..."`. That still leaves the entry here (acked, with who
|
|
37
|
+
* and why) and a `console-ack` row in the session journal. An
|
|
38
|
+
* acknowledgment is an audit record, not an erasure.
|
|
39
|
+
* (c) **The condition's OWNER proves it resolved** — {@link ConsoleLedger.resolve}.
|
|
40
|
+
* Rule (a) reads a page reload as the one honest re-test, and for
|
|
41
|
+
* page-scoped conditions it is. But some conditions are resolved by an
|
|
42
|
+
* event that is not a page load, and then rule (a) can never see it:
|
|
43
|
+
* measured 2026-08-29, `[play-mode] Restart required: X changed` survived
|
|
44
|
+
* `vgai restart` forever — the remount genuinely cleared the staleness
|
|
45
|
+
* (`clearRestartRequired` runs in `enterPlayMode`), but a remount is not a
|
|
46
|
+
* page load, so the ledger had no door to learn it and only
|
|
47
|
+
* `game.reloadPage()` could silence a warning whose own named verb had
|
|
48
|
+
* already fixed it. A named verb must be able to clear its own named
|
|
49
|
+
* condition. This door is for the code that RAISED a condition and knows
|
|
50
|
+
* the moment it is gone — never a general "clear the console".
|
|
51
|
+
*
|
|
52
|
+
* Pure and clock-injected — no I/O, no timers, no globals — so
|
|
53
|
+
* `packages/editor/test/console-ledger.test.ts` drives every one of those
|
|
54
|
+
* transitions directly.
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
export type ConsoleSeverity = 'error' | 'warn';
|
|
58
|
+
|
|
59
|
+
/** One occurrence report from a page. `occurrences` is a DELTA: the page sends
|
|
60
|
+
* how many times this fired since its last report, never a running total, so
|
|
61
|
+
* two pages reporting the same condition sum instead of racing. */
|
|
62
|
+
export interface ConsoleObservation {
|
|
63
|
+
readonly severity: ConsoleSeverity;
|
|
64
|
+
readonly message: string;
|
|
65
|
+
readonly source?: string | null;
|
|
66
|
+
readonly occurrences?: number;
|
|
67
|
+
/** The page-load (control-connection client id) that saw it. */
|
|
68
|
+
readonly loadId: string;
|
|
69
|
+
readonly at?: number;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface ConsoleAck {
|
|
73
|
+
readonly at: number;
|
|
74
|
+
readonly by: string;
|
|
75
|
+
readonly reason: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface ConsoleLedgerEntry {
|
|
79
|
+
/** Stable across restarts and across pages: a hash of severity+message
|
|
80
|
+
* (source is attribution, not identity — see {@link consoleEntryId}), so
|
|
81
|
+
* `vgai console ack <id>` names the CONDITION, not a serial number. */
|
|
82
|
+
readonly id: string;
|
|
83
|
+
readonly severity: ConsoleSeverity;
|
|
84
|
+
readonly message: string;
|
|
85
|
+
readonly source: string | null;
|
|
86
|
+
/** Total occurrences observed, summed across every page-load. */
|
|
87
|
+
readonly count: number;
|
|
88
|
+
readonly firstAt: number;
|
|
89
|
+
readonly lastAt: number;
|
|
90
|
+
readonly firstLoadId: string;
|
|
91
|
+
readonly lastLoadId: string;
|
|
92
|
+
readonly acked: ConsoleAck | null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** The counts every CLI response envelope carries. Distinct CONDITIONS in
|
|
96
|
+
* `errors`/`warnings`; total firings in the `*Occurrences` pair, because "3
|
|
97
|
+
* errors" and "3 errors that fired 900 times" are different situations and
|
|
98
|
+
* the banner says both. */
|
|
99
|
+
export interface UnresolvedConsoleSummary {
|
|
100
|
+
readonly errors: number;
|
|
101
|
+
readonly warnings: number;
|
|
102
|
+
readonly errorOccurrences: number;
|
|
103
|
+
readonly warningOccurrences: number;
|
|
104
|
+
readonly acked: number;
|
|
105
|
+
/** Distinct conditions evicted by {@link MAX_ENTRIES}. Never silent: the
|
|
106
|
+
* banner says so, because a dropped error is exactly what this file exists
|
|
107
|
+
* to prevent. */
|
|
108
|
+
readonly dropped: number;
|
|
109
|
+
/**
|
|
110
|
+
* WHEN THESE COUNTS WERE COUNTED. The banner that prints them is assembled
|
|
111
|
+
* once per CLI process and re-printed at exit, and the counts can arrive by
|
|
112
|
+
* two routes with different ages (a preflight GET before the verb ran, a
|
|
113
|
+
* command envelope after it), so a banner with no time on it invites the
|
|
114
|
+
* reader to treat whichever one they saw as current. The CLI subtracts this
|
|
115
|
+
* from its own clock and prints the age; see `console-loudness.ts`.
|
|
116
|
+
*/
|
|
117
|
+
readonly measuredAt: number;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export type ConsoleLedgerJournalEvent =
|
|
121
|
+
| {
|
|
122
|
+
readonly kind: 'console-entry';
|
|
123
|
+
readonly id: string;
|
|
124
|
+
readonly severity: ConsoleSeverity;
|
|
125
|
+
readonly source: string | null;
|
|
126
|
+
readonly added: number;
|
|
127
|
+
readonly count: number;
|
|
128
|
+
readonly message: string;
|
|
129
|
+
}
|
|
130
|
+
| {
|
|
131
|
+
readonly kind: 'console-retired';
|
|
132
|
+
readonly id: string;
|
|
133
|
+
readonly severity: ConsoleSeverity;
|
|
134
|
+
readonly count: number;
|
|
135
|
+
readonly message: string;
|
|
136
|
+
}
|
|
137
|
+
| {
|
|
138
|
+
readonly kind: 'console-ack';
|
|
139
|
+
readonly id: string;
|
|
140
|
+
readonly severity: ConsoleSeverity;
|
|
141
|
+
readonly count: number;
|
|
142
|
+
readonly by: string;
|
|
143
|
+
readonly reason: string;
|
|
144
|
+
readonly message: string;
|
|
145
|
+
}
|
|
146
|
+
| {
|
|
147
|
+
readonly kind: 'console-resolved';
|
|
148
|
+
readonly id: string;
|
|
149
|
+
readonly severity: ConsoleSeverity;
|
|
150
|
+
readonly count: number;
|
|
151
|
+
/** The owner that proved it gone — `play-mode`, never a person. */
|
|
152
|
+
readonly by: string;
|
|
153
|
+
readonly message: string;
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* How long a NEW page-load must have been settled before entries that only the
|
|
158
|
+
* PREVIOUS load saw are retired. Long enough that a boot-time error has fired
|
|
159
|
+
* again (the editor's own boot is well under a second), short enough that a
|
|
160
|
+
* genuine fix is visible on the next command.
|
|
161
|
+
*/
|
|
162
|
+
export const LOAD_SETTLE_MS = 4_000;
|
|
163
|
+
|
|
164
|
+
/** Distinct conditions retained. Occurrences of a retained condition are
|
|
165
|
+
* unbounded (they are a counter); it is the number of DIFFERENT messages that
|
|
166
|
+
* needs a ceiling, and a game logging 500 distinct errors has already made
|
|
167
|
+
* the point. */
|
|
168
|
+
const MAX_ENTRIES = 500;
|
|
169
|
+
const MESSAGE_MAX_CHARS = 4_000;
|
|
170
|
+
|
|
171
|
+
/** Remove tokens that name an OCCURRENCE rather than a condition. Kept narrow:
|
|
172
|
+
* ordinary numbers, entity ids, paths and line numbers remain significant;
|
|
173
|
+
* only timestamp/cache-buster forms, UUIDs, and explicitly labelled
|
|
174
|
+
* transport/job ids collapse. The original text is still what the ledger
|
|
175
|
+
* displays and journals. */
|
|
176
|
+
export function normalizeConsoleFingerprintText(text: string): string {
|
|
177
|
+
return (
|
|
178
|
+
text
|
|
179
|
+
.replace(
|
|
180
|
+
/\b\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?\b/g,
|
|
181
|
+
'<timestamp>',
|
|
182
|
+
)
|
|
183
|
+
.replace(/\b1\d{12}\b/g, '<timestamp-ms>')
|
|
184
|
+
.replace(
|
|
185
|
+
/\b[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\b/gi,
|
|
186
|
+
'<uuid>',
|
|
187
|
+
)
|
|
188
|
+
.replace(/([?&](?:t|v)=)\d{8,}/gi, '$1<cache-buster>')
|
|
189
|
+
.replace(
|
|
190
|
+
/\b((?:request|session|client|load|tab|operation|job|trace|event)(?:[-_ ]?id)?\s*(?::|=|\bis\b)\s*)(["']?)[a-z0-9][a-z0-9._:-]{5,}\2/gi,
|
|
191
|
+
'$1<volatile-id>',
|
|
192
|
+
)
|
|
193
|
+
// A client-instance ordinal after an @-tagged identity names an
|
|
194
|
+
// OCCURRENCE, not a condition: Supabase logs `GoTrueClient@<key>:1`,
|
|
195
|
+
// `:2`, `:3`… — one per module-graph evaluation — and each ordinal minted
|
|
196
|
+
// a distinct ledger id, so ONE standing fact demanded four separate acks
|
|
197
|
+
// (measured on racing's doctor walk). `@` is required so `file.ts:103`
|
|
198
|
+
// line references stay condition-significant.
|
|
199
|
+
.replace(/(@[\w.-]+):\d+\b/g, '$1:<instance>')
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/** FNV-1a over normalized severity|message → 8 lowercase hex chars.
|
|
204
|
+
* Short enough to type into `vgai console ack`, wide enough that a session's
|
|
205
|
+
* few hundred conditions never collide.
|
|
206
|
+
*
|
|
207
|
+
* Source is deliberately NOT part of the fingerprint. The CONDITION is what
|
|
208
|
+
* fired (severity + message); WHO it belongs to is an attribute the capture
|
|
209
|
+
* learns about it, and that learning is best-effort — a game library's warn
|
|
210
|
+
* deferred into a promise microtask reaches the console capture with no
|
|
211
|
+
* game-realm marker on the stack (there is no async-context door in the
|
|
212
|
+
* platform), so one standing fact can arrive labelled 'editor' on some
|
|
213
|
+
* occurrences and 'game' on others. Keying the id on source split that one
|
|
214
|
+
* fact into two rows demanding two separate acks (measured: racing's
|
|
215
|
+
* GoTrueClient warning). One condition, one id; the row's `source` keeps the
|
|
216
|
+
* strongest attribution any occurrence proved — see the observe() rule. */
|
|
217
|
+
export function consoleEntryId(severity: ConsoleSeverity, message: string): string {
|
|
218
|
+
const key = `${severity}|${normalizeConsoleFingerprintText(message)}`;
|
|
219
|
+
let hash = 0x811c9dc5;
|
|
220
|
+
for (let i = 0; i < key.length; i++) {
|
|
221
|
+
hash ^= key.charCodeAt(i);
|
|
222
|
+
hash = Math.imul(hash, 0x01000193) >>> 0;
|
|
223
|
+
}
|
|
224
|
+
return hash.toString(16).padStart(8, '0');
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
interface MutableEntry {
|
|
228
|
+
id: string;
|
|
229
|
+
severity: ConsoleSeverity;
|
|
230
|
+
message: string;
|
|
231
|
+
source: string | null;
|
|
232
|
+
count: number;
|
|
233
|
+
firstAt: number;
|
|
234
|
+
lastAt: number;
|
|
235
|
+
firstLoadId: string;
|
|
236
|
+
lastLoadId: string;
|
|
237
|
+
acked: ConsoleAck | null;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export interface ConsoleLedger {
|
|
241
|
+
/** Record one occurrence delta. Returns the entry as it now stands. */
|
|
242
|
+
observe(observation: ConsoleObservation): ConsoleLedgerEntry;
|
|
243
|
+
/** A page-load became the current one (its command listener attached). Starts
|
|
244
|
+
* the settle window that retires conditions the previous load owned. */
|
|
245
|
+
noteLoad(loadId: string, at?: number): void;
|
|
246
|
+
/** Acknowledge by id, with who and why. `null` when no such entry. */
|
|
247
|
+
ack(id: string, ack: { by: string; reason: string; at?: number }): ConsoleLedgerEntry | null;
|
|
248
|
+
/**
|
|
249
|
+
* Clearing rule (c) — the condition's OWNER proves it resolved. Named by the
|
|
250
|
+
* severity+message it was raised with, so the caller never has to reproduce
|
|
251
|
+
* this module's fingerprint hash. Returns the ids actually retired.
|
|
252
|
+
*
|
|
253
|
+
* An ACKED entry is left alone: that record carries a human's reason and
|
|
254
|
+
* retiring it would erase it (same rule the page-load sweep follows).
|
|
255
|
+
*
|
|
256
|
+
* NO TIMESTAMP FENCE, deliberately. A recurrence is reported through the same
|
|
257
|
+
* control connection this call arrives on, so a condition that fires again
|
|
258
|
+
* after the owner declared it gone is observed AFTER this and simply
|
|
259
|
+
* re-created — the ordering does the fencing, and a clock the page and the
|
|
260
|
+
* server would have to agree on does not exist.
|
|
261
|
+
*/
|
|
262
|
+
resolve(
|
|
263
|
+
conditions: readonly { severity: ConsoleSeverity; message: string }[],
|
|
264
|
+
by: string,
|
|
265
|
+
): string[];
|
|
266
|
+
/** Unresolved conditions (never acked, not retired), oldest first. */
|
|
267
|
+
unresolved(): ConsoleLedgerEntry[];
|
|
268
|
+
/** Everything still held, acked included — what `vgai console --all` shows. */
|
|
269
|
+
all(): ConsoleLedgerEntry[];
|
|
270
|
+
summary(): UnresolvedConsoleSummary;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
export function createConsoleLedger(options?: {
|
|
274
|
+
readonly now?: () => number;
|
|
275
|
+
readonly journal?: (event: ConsoleLedgerJournalEvent) => void;
|
|
276
|
+
}): ConsoleLedger {
|
|
277
|
+
const now = options?.now ?? Date.now;
|
|
278
|
+
const journal = options?.journal ?? ((): void => {});
|
|
279
|
+
const entries = new Map<string, MutableEntry>();
|
|
280
|
+
let currentLoadId: string | null = null;
|
|
281
|
+
let currentLoadAt = 0;
|
|
282
|
+
let dropped = 0;
|
|
283
|
+
|
|
284
|
+
/** Retire what condition (a) covers: last seen in an older page-load, and the
|
|
285
|
+
* current load has been settled long enough that a recurrence would already
|
|
286
|
+
* have been reported. Runs on every read so no caller can see a stale set. */
|
|
287
|
+
function sweep(): void {
|
|
288
|
+
if (currentLoadId === null) return;
|
|
289
|
+
if (now() - currentLoadAt < LOAD_SETTLE_MS) return;
|
|
290
|
+
for (const entry of [...entries.values()]) {
|
|
291
|
+
if (entry.lastLoadId === currentLoadId) continue;
|
|
292
|
+
// An entry observed at-or-after the current load began belongs to a page
|
|
293
|
+
// that raced ahead of (or never reached) command-listener attach — a
|
|
294
|
+
// fresh boot error, or a guest tab that can never attach. Retiring it
|
|
295
|
+
// would silence a live condition forever, because the page-side delta
|
|
296
|
+
// bookkeeping never re-reports an occurrence it already sent.
|
|
297
|
+
if (entry.lastAt >= currentLoadAt) continue;
|
|
298
|
+
// An acked entry is an audit record; retiring it would erase the reason.
|
|
299
|
+
if (entry.acked !== null) continue;
|
|
300
|
+
entries.delete(entry.id);
|
|
301
|
+
journal({
|
|
302
|
+
kind: 'console-retired',
|
|
303
|
+
id: entry.id,
|
|
304
|
+
severity: entry.severity,
|
|
305
|
+
count: entry.count,
|
|
306
|
+
message: entry.message,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function snapshot(entry: MutableEntry): ConsoleLedgerEntry {
|
|
312
|
+
return { ...entry };
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
return {
|
|
316
|
+
observe(observation: ConsoleObservation): ConsoleLedgerEntry {
|
|
317
|
+
const at = observation.at ?? now();
|
|
318
|
+
const message = observation.message.slice(0, MESSAGE_MAX_CHARS);
|
|
319
|
+
const source = observation.source ?? null;
|
|
320
|
+
const added = Math.max(1, Math.trunc(observation.occurrences ?? 1));
|
|
321
|
+
const id = consoleEntryId(observation.severity, message);
|
|
322
|
+
const existing = entries.get(id);
|
|
323
|
+
if (existing) {
|
|
324
|
+
// The id names the normalized condition; retain the newest raw detail
|
|
325
|
+
// so UUID/timestamp normalization never makes the human-facing record
|
|
326
|
+
// stale or vague.
|
|
327
|
+
existing.message = message;
|
|
328
|
+
// Keep the STRONGEST attribution any occurrence proved. 'editor' is
|
|
329
|
+
// the capture's default label (least evidence — see consoleEntryId's
|
|
330
|
+
// note on why one fact can arrive under two labels), so it never
|
|
331
|
+
// overwrites a specific one; between specific sources, newest wins.
|
|
332
|
+
existing.source =
|
|
333
|
+
source === null || (source === 'editor' && existing.source !== null)
|
|
334
|
+
? existing.source
|
|
335
|
+
: source;
|
|
336
|
+
existing.count += added;
|
|
337
|
+
existing.lastAt = at;
|
|
338
|
+
existing.lastLoadId = observation.loadId;
|
|
339
|
+
journal({
|
|
340
|
+
kind: 'console-entry',
|
|
341
|
+
id,
|
|
342
|
+
severity: existing.severity,
|
|
343
|
+
source,
|
|
344
|
+
added,
|
|
345
|
+
count: existing.count,
|
|
346
|
+
message,
|
|
347
|
+
});
|
|
348
|
+
return snapshot(existing);
|
|
349
|
+
}
|
|
350
|
+
if (entries.size >= MAX_ENTRIES) {
|
|
351
|
+
// Evict the oldest ACKED record first — it has already been read and
|
|
352
|
+
// reasoned about. Only when there is no such record does an unresolved
|
|
353
|
+
// one go, and that is counted and reported, never silent.
|
|
354
|
+
const victim =
|
|
355
|
+
[...entries.values()]
|
|
356
|
+
.filter((e) => e.acked !== null)
|
|
357
|
+
.sort((a, b) => a.lastAt - b.lastAt)[0] ??
|
|
358
|
+
[...entries.values()].sort((a, b) => a.lastAt - b.lastAt)[0];
|
|
359
|
+
if (victim) {
|
|
360
|
+
entries.delete(victim.id);
|
|
361
|
+
if (victim.acked === null) dropped++;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
const entry: MutableEntry = {
|
|
365
|
+
id,
|
|
366
|
+
severity: observation.severity,
|
|
367
|
+
message,
|
|
368
|
+
source,
|
|
369
|
+
count: added,
|
|
370
|
+
firstAt: at,
|
|
371
|
+
lastAt: at,
|
|
372
|
+
firstLoadId: observation.loadId,
|
|
373
|
+
lastLoadId: observation.loadId,
|
|
374
|
+
acked: null,
|
|
375
|
+
};
|
|
376
|
+
entries.set(id, entry);
|
|
377
|
+
journal({
|
|
378
|
+
kind: 'console-entry',
|
|
379
|
+
id,
|
|
380
|
+
severity: entry.severity,
|
|
381
|
+
source,
|
|
382
|
+
added,
|
|
383
|
+
count: added,
|
|
384
|
+
message,
|
|
385
|
+
});
|
|
386
|
+
return snapshot(entry);
|
|
387
|
+
},
|
|
388
|
+
|
|
389
|
+
noteLoad(loadId: string, at?: number): void {
|
|
390
|
+
if (loadId === currentLoadId) return;
|
|
391
|
+
currentLoadId = loadId;
|
|
392
|
+
currentLoadAt = at ?? now();
|
|
393
|
+
},
|
|
394
|
+
|
|
395
|
+
ack(id: string, ack: { by: string; reason: string; at?: number }): ConsoleLedgerEntry | null {
|
|
396
|
+
const entry = entries.get(id);
|
|
397
|
+
if (!entry) return null;
|
|
398
|
+
entry.acked = { at: ack.at ?? now(), by: ack.by, reason: ack.reason };
|
|
399
|
+
journal({
|
|
400
|
+
kind: 'console-ack',
|
|
401
|
+
id,
|
|
402
|
+
severity: entry.severity,
|
|
403
|
+
count: entry.count,
|
|
404
|
+
by: entry.acked.by,
|
|
405
|
+
reason: entry.acked.reason,
|
|
406
|
+
message: entry.message,
|
|
407
|
+
});
|
|
408
|
+
return snapshot(entry);
|
|
409
|
+
},
|
|
410
|
+
|
|
411
|
+
resolve(
|
|
412
|
+
conditions: readonly { severity: ConsoleSeverity; message: string }[],
|
|
413
|
+
by: string,
|
|
414
|
+
): string[] {
|
|
415
|
+
const retired: string[] = [];
|
|
416
|
+
for (const condition of conditions) {
|
|
417
|
+
const id = consoleEntryId(
|
|
418
|
+
condition.severity,
|
|
419
|
+
condition.message.slice(0, MESSAGE_MAX_CHARS),
|
|
420
|
+
);
|
|
421
|
+
const entry = entries.get(id);
|
|
422
|
+
if (!entry || entry.acked !== null) continue;
|
|
423
|
+
entries.delete(id);
|
|
424
|
+
retired.push(id);
|
|
425
|
+
journal({
|
|
426
|
+
kind: 'console-resolved',
|
|
427
|
+
id,
|
|
428
|
+
severity: entry.severity,
|
|
429
|
+
count: entry.count,
|
|
430
|
+
by,
|
|
431
|
+
message: entry.message,
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
return retired;
|
|
435
|
+
},
|
|
436
|
+
|
|
437
|
+
unresolved(): ConsoleLedgerEntry[] {
|
|
438
|
+
sweep();
|
|
439
|
+
return [...entries.values()]
|
|
440
|
+
.filter((e) => e.acked === null)
|
|
441
|
+
.sort((a, b) => a.firstAt - b.firstAt)
|
|
442
|
+
.map(snapshot);
|
|
443
|
+
},
|
|
444
|
+
|
|
445
|
+
all(): ConsoleLedgerEntry[] {
|
|
446
|
+
sweep();
|
|
447
|
+
return [...entries.values()].sort((a, b) => a.firstAt - b.firstAt).map(snapshot);
|
|
448
|
+
},
|
|
449
|
+
|
|
450
|
+
summary(): UnresolvedConsoleSummary {
|
|
451
|
+
sweep();
|
|
452
|
+
let errors = 0;
|
|
453
|
+
let warnings = 0;
|
|
454
|
+
let errorOccurrences = 0;
|
|
455
|
+
let warningOccurrences = 0;
|
|
456
|
+
let acked = 0;
|
|
457
|
+
for (const entry of entries.values()) {
|
|
458
|
+
if (entry.acked !== null) {
|
|
459
|
+
acked++;
|
|
460
|
+
continue;
|
|
461
|
+
}
|
|
462
|
+
if (entry.severity === 'error') {
|
|
463
|
+
errors++;
|
|
464
|
+
errorOccurrences += entry.count;
|
|
465
|
+
} else {
|
|
466
|
+
warnings++;
|
|
467
|
+
warningOccurrences += entry.count;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
return {
|
|
471
|
+
errors,
|
|
472
|
+
warnings,
|
|
473
|
+
errorOccurrences,
|
|
474
|
+
warningOccurrences,
|
|
475
|
+
acked,
|
|
476
|
+
dropped,
|
|
477
|
+
measuredAt: now(),
|
|
478
|
+
};
|
|
479
|
+
},
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/** The zero summary — what a caller reports when it never reached a session.
|
|
484
|
+
* Named rather than spelled inline so "no session" and "no errors" cannot
|
|
485
|
+
* drift into different shapes across the CLI's response readers.
|
|
486
|
+
*
|
|
487
|
+
* `measuredAt: 0` is deliberate and is NOT a time: nothing was measured, so
|
|
488
|
+
* the age readers compute from it is meaningless and they say "unknown"
|
|
489
|
+
* rather than "56 years". A fabricated `Date.now()` here would make "we never
|
|
490
|
+
* reached the session" print as a fresh reading. */
|
|
491
|
+
export const EMPTY_UNRESOLVED_CONSOLE: UnresolvedConsoleSummary = {
|
|
492
|
+
errors: 0,
|
|
493
|
+
warnings: 0,
|
|
494
|
+
errorOccurrences: 0,
|
|
495
|
+
warningOccurrences: 0,
|
|
496
|
+
acked: 0,
|
|
497
|
+
dropped: 0,
|
|
498
|
+
measuredAt: 0,
|
|
499
|
+
};
|