@volter/editor-live 0.5.68 → 0.5.70

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 CHANGED
@@ -3,9 +3,9 @@ Bundled license notices
3
3
  These notices accompany code incorporated into this package. Separate npm dependencies retain their own licenses.
4
4
 
5
5
 
6
- @volter/editor-project@0.5.68
6
+ @volter/editor-project@0.5.70
7
7
  Declared license: Apache-2.0
8
- Source: the unmodified npm package @volter/editor-project@0.5.68, from https://github.com/volter-ai/editor.git
8
+ Source: the unmodified npm package @volter/editor-project@0.5.70, from https://github.com/volter-ai/editor.git
9
9
 
10
10
  --- packages/editor-project/LICENSE ---
11
11
 
@@ -213,9 +213,9 @@ Source: the unmodified npm package @volter/editor-project@0.5.68, from https://g
213
213
  limitations under the License.
214
214
 
215
215
 
216
- @volter/editor-sdk@0.5.68
216
+ @volter/editor-sdk@0.5.70
217
217
  Declared license: Apache-2.0
218
- Source: the unmodified npm package @volter/editor-sdk@0.5.68, from https://github.com/volter-ai/editor.git
218
+ Source: the unmodified npm package @volter/editor-sdk@0.5.70, from https://github.com/volter-ai/editor.git
219
219
 
220
220
  --- packages/editor-sdk/LICENSE ---
221
221
 
@@ -428,7 +428,8 @@ Source: the unmodified npm package @volter/editor-sdk@0.5.68, from https://githu
428
428
  Copyright 2026 Volter AI, Inc.
429
429
 
430
430
  Project tool registry, provider execution and related types were transferred
431
- from the Apache-2.0 @vgai/sdk package. Original source hashes and revision are
431
+ from the Apache-2.0 SDK package of volter-ai/volter-engine. Original source
432
+ hashes and revision are
432
433
  recorded in provenance/editor-server.json.
433
434
 
434
435
  The project output-root policy is Apache-2.0, transferred from the original
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * WHY IT IS A SEPARATE OBJECT, and why the verbs are these, is recorded once
5
5
  * in the implementation's header
6
- * (`packages/editor/src/editor-document-probe.ts`); the short version is that
6
+ * (`packages/editor-sdk/src/kit/editor-document-probe.ts`); the short version is that
7
7
  * `game.page()` is play-mode-gated and rooted at the GAME container, so an
8
8
  * editor surface that is not a running game could be neither read nor driven
9
9
  * through the product.
@@ -28,7 +28,7 @@
28
28
  * active; `editor.hierarchy()` / `editor.inspect()` keep answering what those
29
29
  * panels RESOLVED, where this door answers what they DREW.
30
30
  *
31
- * A field on `LiveEditor` rather than methods on it, so `vgai eval --list`
31
+ * A field on `LiveEditor` rather than methods on it, so the editor's `eval --list` command
32
32
  * shows the verbs as one named surface — the same reason `game.input`
33
33
  * and `game.events` are instance fields.
34
34
  */
@@ -74,13 +74,13 @@ export declare class LiveEditorDocument {
74
74
  * `styles` additionally resolves named properties per match — and resolving
75
75
  * is the point, because a theme token is an expression until an element
76
76
  * paints it. Ask for the standard property to learn the colour a person
77
- * sees; ask for a `--vgai-…` custom property to learn what a rule WOULD
77
+ * sees; ask for a `--volter-…` custom property to learn what a rule WOULD
78
78
  * paint, which is the only way to measure a `:hover` colour (`:hover` is a
79
79
  * browser state no synthetic event can enter, so there is deliberately no
80
80
  * hover verb on this door).
81
81
  *
82
- * await editor.document.query('.vgai-tree-row', {
83
- * styles: ['backgroundColor', '--vgai-widget-regular-hover'],
82
+ * await editor.document.query('.volter-tree-row', {
83
+ * styles: ['backgroundColor', '--volter-widget-regular-hover'],
84
84
  * });
85
85
  */
86
86
  query(selector: string, options?: DocumentScopeOption & {
package/dist/editor.d.ts CHANGED
@@ -21,7 +21,7 @@ export declare class LiveEditor {
21
21
  * The ACTIVE center document's own DOM: read it, click it, key it, paste
22
22
  * into it. The one door onto editor chrome that is not play-mode gated, and
23
23
  * deliberately scoped to that document alone —
24
- * `packages/editor/src/editor-document-probe.ts` carries the design and the
24
+ * `packages/editor-sdk/src/kit/editor-document-probe.ts` carries the design and the
25
25
  * refusal contract. Screenshotting the same subject is
26
26
  * {@link LiveEditor.captureActiveDocument}, not a fifth verb here.
27
27
  */
@@ -35,7 +35,7 @@ export declare class LiveEditor {
35
35
  * `blender-execute`, `blender-scene-info`, `blender-object-info`,
36
36
  * `blender-screenshot-view`, `blender-read-file`, `blender-write-file`,
37
37
  * `blender-list-files`, `blender-stop` and `blender-status`. They were
38
- * reachable from `@volter/editor-sdk` and through `vgai blender-mcp` but from
38
+ * reachable from `@volter/editor-sdk` and through `volter blender-mcp` but from
39
39
  * no GENERAL door, so driving a session meant writing an MCP client script
40
40
  * per question — the same discovery failure `eval-surface.ts`'s header
41
41
  * records, in a lane that had not noticed it yet.
@@ -76,7 +76,7 @@ export declare class LiveEditor {
76
76
  captureActiveDocument(size?: CaptureDimensions, view?: EditorView): Promise<ActiveDocumentCapture>;
77
77
  /**
78
78
  * Photograph the editor PAGE — every panel, tab strip and viewport as the
79
- * person sees it. `vgai screenshot editor` is this verb from the shell. The
79
+ * person sees it. the editor's `screenshot editor` command is this verb from the shell. The
80
80
  * one door for judging chrome sighted: a skin, a workspace arrangement or a
81
81
  * contributed panel is looked at through this, never guessed at from DOM
82
82
  * probes. The page at its own layout, `scale` output pixels per CSS pixel
@@ -85,11 +85,11 @@ export declare class LiveEditor {
85
85
  * at, and the result reports its own `size` and `scale`.
86
86
  */
87
87
  captureEditorChrome(options?: EditorChromeCaptureOptions): Promise<EditorChromeCapture>;
88
- /** `'all'` -> `EditorClient.selectAll()` (mirrors `vgai select --all`); otherwise `EditorClient.select(id)` (mirrors `vgai select <entityId>`). */
88
+ /** `'all'` -> `EditorClient.selectAll()` (mirrors `volter select --all`); otherwise `EditorClient.select(id)` (mirrors `volter select <entityId>`). */
89
89
  select(id: string | 'all'): Promise<void>;
90
- /** Mirrors `vgai deselect`. */
90
+ /** Mirrors `volter deselect`. */
91
91
  deselect(): Promise<void>;
92
- /** No `id` -> focus the current selection (mirrors bare `vgai focus`); `id` given -> focus that entity. */
92
+ /** No `id` -> focus the current selection (mirrors bare `volter focus`); `id` given -> focus that entity. */
93
93
  focus(id?: string): Promise<void>;
94
94
  /**
95
95
  * Frame the edit viewport camera on one entity. Same framing as
@@ -274,19 +274,19 @@ export declare class LiveEditor {
274
274
  * of one table is a second name for one thing, and an agent reading
275
275
  * `--list` had to choose between them with nothing to choose on. This door
276
276
  * stays because it is strictly wider: it addresses a COMMAND ID, so under
277
- * the frame it reaches everything the workbench knows — a `vgai.action.<id>`
277
+ * the frame it reaches everything the workbench knows — a `volter.action.<id>`
278
278
  * editor action, one of VS Code's own — and not only a view. A VIEW is
279
279
  * reached by spelling its verb's command id:
280
280
  *
281
- * await editor.command('vgai.blender-uv-view.state')
282
- * await editor.command('vgai.blender-uv-view.zoom', { to: 600 })
281
+ * await editor.command('volter.blender-uv-view.state')
282
+ * await editor.command('volter.blender-uv-view.zoom', { to: 600 })
283
283
  *
284
- * await editor.command('vgai.blender-node-view.view-all')
285
- * await editor.command('vgai.blender-node-view.look', { node: 'Principled BSDF' })
284
+ * await editor.command('volter.blender-node-view.view-all')
285
+ * await editor.command('volter.blender-node-view.look', { node: 'Principled BSDF' })
286
286
  *
287
287
  * Under the Code-OSS frame this is the workbench's own command service, so
288
- * any command id works — ours and VS Code's alike. Standalone `vgai edit`
289
- * has no command service and answers the `vgai.<view>.<verb>` shape off the
288
+ * any command id works — ours and VS Code's alike. Standalone the editor's `edit` command
289
+ * has no command service and answers the `volter.<view>.<verb>` shape off the
290
290
  * SAME verb table the frame's commands call, refusing any other id by name.
291
291
  * One table, two doors, exactly like the keymap's.
292
292
  *
@@ -406,7 +406,7 @@ export declare class LiveEditor {
406
406
  redo(): Promise<HistoryStep>;
407
407
  /** Reload the editor's page and resolve once the new document answers. */
408
408
  reloadPage(): Promise<void>;
409
- /** Mirrors `vgai status` — the full live editor state as JSON. */
409
+ /** Mirrors the editor's `status` command — the full live editor state as JSON. */
410
410
  status(): Promise<EditorState>;
411
411
  /** A live viewport PNG (`EditorClient.captureViewport`) — no direct CLI verb exists; this is the closest wire read. */
412
412
  screenshot(size?: number): Promise<ViewportCapture>;
package/dist/index.js CHANGED
@@ -27,7 +27,7 @@ var EditorCommandError = class extends Error {
27
27
  * the receipt window closing unanswered, a beating-but-dead tab, and no tab
28
28
  * present at all. The last four can fail in milliseconds.
29
29
  *
30
- * A caller that converges by retrying (`vgai restart`) needs the distinction
30
+ * A caller that converges by retrying (the editor's `restart` command) needs the distinction
31
31
  * because a refusal the editor ANSWERED may go differently next time, while
32
32
  * a command the relay abandoned tells you nothing new on a second identical
33
33
  * attempt — and when the abandonment was a 120s budget, re-running it three
@@ -205,22 +205,22 @@ var EditorClient = class {
205
205
  return data;
206
206
  }
207
207
  // --- Play control ---
208
- /** `opts.seed` (D15/T-D15.6, objection-4 fix) — `vgai play --seed <n>`'s
208
+ /** `opts.seed` (D15/T-D15.6, objection-4 fix) — the editor's `play --seed <n>` command's
209
209
  * explicit config leg, relayed as `cmd['seed']`; `handleCommand`'s
210
210
  * `'play'` case threads it into `enterPlayMode`'s highest-precedence seed
211
- * argument (beats manifest.determinism.defaultSeed/?vgai-seed=). Omitted,
211
+ * argument (beats manifest.determinism.defaultSeed/?volter-seed=). Omitted,
212
212
  * boot seeding falls back to that precedence unchanged.
213
213
  *
214
- * `opts.name` (`vgai play --name <text>`) — an OPTIONAL label for this run,
214
+ * `opts.name` (the editor's `play --name <text>` command) — an OPTIONAL label for this run,
215
215
  * relayed as `cmd['name']` and slugified server-side into the run's
216
216
  * `logs/play-*.jsonl` filename and its session-journal line. Findability
217
217
  * only: no registry, no uniqueness, no lookup verb — grep and `ls` are the
218
218
  * query engine. Omitted, the filename keeps its exact unnamed shape. */
219
- /* `opts.record` (`vgai play --record <name>`) — NAMES this run's recording
219
+ /* `opts.record` (the editor's `play --record <name>` command) — NAMES this run's recording
220
220
  * file. It does not ENABLE recording: every relayed play records, with no
221
- * flag (see `@vgai/game`'s `src/play/play-recording.ts`). Omitted, the clip is named for
221
+ * flag (see `@volter/editor-game`'s `src/play/play-recording.ts`). Omitted, the clip is named for
222
222
  * the durable Gameplay Session; named, it becomes an explicit keepsake in
223
- * `.vgai/recordings/<name>.webm`. */
223
+ * `.volter/recordings/<name>.webm`. */
224
224
  async play(opts) {
225
225
  return this.command({
226
226
  type: "play",
@@ -321,9 +321,9 @@ var EditorClient = class {
321
321
  return { base64: data.base64, mimeType: data.mimeType };
322
322
  }
323
323
  /**
324
- * Unit 4 (live-front-door wave) — capture the RUNNING GAME (`vgai
325
- * screenshot`'s wire leg). Sends the SAME `bridge-screenshot` relay op
326
- * `@vgai/live`'s `RelayTransport.screenshot` (and therefore
324
+ * Unit 4 (live-front-door wave) — capture the RUNNING GAME (the editor's
325
+ * `screenshot`'s wire leg). Sends the SAME `bridge-screenshot` relay op
326
+ * `@volter/game-live`'s `RelayTransport.screenshot` (and therefore
327
327
  * `game.screenshot()` on the relay path) already sends, so all three
328
328
  * surfaces composite the identical full game stack — canvas(es) plus the
329
329
  * HUD/react DOM layers — rather than any of them inventing a second,
@@ -341,8 +341,8 @@ var EditorClient = class {
341
341
  * refuses it with `BRIDGE_SCREENSHOT_STALE` rather than pass it off as
342
342
  * current. Setting this asks the relay to render exactly ONE deterministic
343
343
  * tick (`runTicks(1, {render:'last'})`) first — the same escape
344
- * `@vgai/live`'s `RelayTransport.screenshot` has always used, which is why
345
- * `vgai eval` could recover these frames while `vgai screenshot` could not.
344
+ * `@volter/game-live`'s `RelayTransport.screenshot` has always used, which is why
345
+ * the editor's `eval` command could recover these frames while the editor's `screenshot` command could not.
346
346
  * Off by default: a caller who does not ask must never be handed a frame
347
347
  * that only exists because the capture drove the game.
348
348
  */
@@ -427,8 +427,8 @@ var EditorClient = class {
427
427
  ...source,
428
428
  ...options
429
429
  },
430
- // Photographing changes nothing, and this is the relay `vgai screenshot
431
- // <module>` / `project.bake.preview` rides — the lane where a momentary
430
+ // Photographing changes nothing, and this is the relay the editor's `screenshot
431
+ // <module>` command and `project.bake.preview` ride — the lane where a momentary
432
432
  // transport failure cost a cold agent three probe modules.
433
433
  { retryTransport: true }
434
434
  );
@@ -442,11 +442,11 @@ var EditorClient = class {
442
442
  };
443
443
  }
444
444
  /**
445
- * A project-defined labeled shot set (`vgai screenshot <target> --shots <set>`):
445
+ * A project-defined labeled shot set (the editor's `screenshot <target> --shots <set>` command):
446
446
  * the DEFINITION travels with the command (project data — see
447
447
  * `AssetPreviewShotSetDefinition`; the CLI resolves it from the registered
448
448
  * `project.<set>.previewShots` tool), and the editor's generic
449
- * capture engine renders it — see `packages/editor/src/asset-preview.ts`'s
449
+ * capture engine renders it — see `packages/editor-threejs/src/kit/asset-preview.ts`'s
450
450
  * `captureShotSetAssetPreview`. Throws (via `command`'s `{ok:false}`
451
451
  * unwrap) with a clear message naming the missing joint(s) when the asset
452
452
  * lacks a bone the definition requires.
@@ -471,8 +471,8 @@ var EditorClient = class {
471
471
  };
472
472
  }
473
473
  /**
474
- * B8.4 — score the asset against a reference GLB (`vgai screenshot
475
- * <model.glb> --compare <ref.glb>`): matched orthographic front + side silhouettes
474
+ * B8.4 — score the asset against a reference GLB (the editor's `screenshot
475
+ * <model.glb> --compare <ref.glb>` command): matched orthographic front + side silhouettes
476
476
  * (equal-height bounding-box framing, both yaw-normalized to face the
477
477
  * camera), per-view IoU numbers, and overlay evidence images. The
478
478
  * reference GLB's raw bytes travel base64 in the command; the editor
@@ -489,7 +489,7 @@ var EditorClient = class {
489
489
  return { width: data.width, height: data.height, views: data.views };
490
490
  }
491
491
  /**
492
- * The STORY lane (`vgai screenshot <file>.stories.tsx`): every CSF export of
492
+ * The STORY lane (the editor's `screenshot <file>.stories.tsx` command): every CSF export of
493
493
  * one project story file rendered in the live session's DOM and captured
494
494
  * through the same composite leg {@link captureGame} uses, returned as
495
495
  * per-export images plus one variant sheet. `options.story` narrows to a
@@ -621,9 +621,9 @@ var EditorClient = class {
621
621
  * Run ONE command by id — the door to everything the command palette lists.
622
622
  *
623
623
  * Under the Code-OSS frame this is the workbench's own `ICommandService`, so
624
- * any command id works: a view's `vgai.<view>.<verb>`, an editor action's
625
- * `vgai.action.<id>`, or one of VS Code's own. Standalone `vgai edit` has no
626
- * command service and answers the `vgai.<view>.<verb>` shape directly off
624
+ * any command id works: a view's `volter.<view>.<verb>`, an editor action's
625
+ * `volter.action.<id>`, or one of VS Code's own. Standalone the editor's `edit` command has no
626
+ * command service and answers the `volter.<view>.<verb>` shape directly off
627
627
  * the views registry, refusing anything else BY NAME.
628
628
  *
629
629
  * The result is whatever the command answered — a view verb's state, or
@@ -803,14 +803,14 @@ var EditorClient = class {
803
803
  * {@link captureActiveDocument} photographs. NOT play-mode gated, and NOT
804
804
  * page automation: a target outside the active document's container is
805
805
  * refused by name. Design and scope contract:
806
- * `packages/editor/src/editor-document-probe.ts`.
806
+ * `packages/editor-sdk/src/kit/editor-document-probe.ts`.
807
807
  */
808
808
  async documentProbe(step) {
809
809
  return this.command({ type: "document-probe", step });
810
810
  }
811
811
  /**
812
812
  * Run a wire-carried step against the ACTIVE document's published context
813
- * (`packages/editor/src/document-context-registry.ts`) — the REPL door over
813
+ * (`packages/editor-sdk/src/kit/document-context-registry.ts`) — the REPL door over
814
814
  * an open document, in Edit mode. `src` is the step's own `toString()`;
815
815
  * same serialization contract as `page-script` (no closures survive).
816
816
  */
@@ -819,7 +819,7 @@ var EditorClient = class {
819
819
  * `blender-object-info`, `blender-screenshot-view`, `blender-read-file`,
820
820
  * `blender-write-file`, `blender-list-files`, `blender-start`,
821
821
  * `blender-status`): Blender runs in the editor tab's worker, and
822
- * `vgai blender-mcp` is transport onto these. `blender-status` is the only
822
+ * `volter blender-mcp` is transport onto these. `blender-status` is the only
823
823
  * one that creates nothing — it answers whether this tab already has a
824
824
  * session, which is how a caller survives an editor restart.
825
825
  */
@@ -893,7 +893,7 @@ var EditorClient = class {
893
893
  return data.projects;
894
894
  }
895
895
  // --- Registered project tools ---
896
- /** List tools explicitly registered in `package.json#vgai.tools`.
896
+ /** List tools explicitly registered in `package.json#volter.tools`.
897
897
  * The editor server loads callable metadata in Node; modules never enter the
898
898
  * editor browser merely because they were listed. */
899
899
  async listProjectTools() {
@@ -1149,13 +1149,13 @@ var LiveEditorDocument = class {
1149
1149
  * `styles` additionally resolves named properties per match — and resolving
1150
1150
  * is the point, because a theme token is an expression until an element
1151
1151
  * paints it. Ask for the standard property to learn the colour a person
1152
- * sees; ask for a `--vgai-…` custom property to learn what a rule WOULD
1152
+ * sees; ask for a `--volter-…` custom property to learn what a rule WOULD
1153
1153
  * paint, which is the only way to measure a `:hover` colour (`:hover` is a
1154
1154
  * browser state no synthetic event can enter, so there is deliberately no
1155
1155
  * hover verb on this door).
1156
1156
  *
1157
- * await editor.document.query('.vgai-tree-row', {
1158
- * styles: ['backgroundColor', '--vgai-widget-regular-hover'],
1157
+ * await editor.document.query('.volter-tree-row', {
1158
+ * styles: ['backgroundColor', '--volter-widget-regular-hover'],
1159
1159
  * });
1160
1160
  */
1161
1161
  async query(selector, options) {
@@ -1326,7 +1326,7 @@ var LiveEditor = class {
1326
1326
  * The ACTIVE center document's own DOM: read it, click it, key it, paste
1327
1327
  * into it. The one door onto editor chrome that is not play-mode gated, and
1328
1328
  * deliberately scoped to that document alone —
1329
- * `packages/editor/src/editor-document-probe.ts` carries the design and the
1329
+ * `packages/editor-sdk/src/kit/editor-document-probe.ts` carries the design and the
1330
1330
  * refusal contract. Screenshotting the same subject is
1331
1331
  * {@link LiveEditor.captureActiveDocument}, not a fifth verb here.
1332
1332
  */
@@ -1343,7 +1343,7 @@ var LiveEditor = class {
1343
1343
  * `blender-execute`, `blender-scene-info`, `blender-object-info`,
1344
1344
  * `blender-screenshot-view`, `blender-read-file`, `blender-write-file`,
1345
1345
  * `blender-list-files`, `blender-stop` and `blender-status`. They were
1346
- * reachable from `@volter/editor-sdk` and through `vgai blender-mcp` but from
1346
+ * reachable from `@volter/editor-sdk` and through `volter blender-mcp` but from
1347
1347
  * no GENERAL door, so driving a session meant writing an MCP client script
1348
1348
  * per question — the same discovery failure `eval-surface.ts`'s header
1349
1349
  * records, in a lane that had not noticed it yet.
@@ -1395,7 +1395,7 @@ var LiveEditor = class {
1395
1395
  }
1396
1396
  /**
1397
1397
  * Photograph the editor PAGE — every panel, tab strip and viewport as the
1398
- * person sees it. `vgai screenshot editor` is this verb from the shell. The
1398
+ * person sees it. the editor's `screenshot editor` command is this verb from the shell. The
1399
1399
  * one door for judging chrome sighted: a skin, a workspace arrangement or a
1400
1400
  * contributed panel is looked at through this, never guessed at from DOM
1401
1401
  * probes. The page at its own layout, `scale` output pixels per CSS pixel
@@ -1406,7 +1406,7 @@ var LiveEditor = class {
1406
1406
  async captureEditorChrome(options) {
1407
1407
  return this.#client.captureEditorChrome(options);
1408
1408
  }
1409
- /** `'all'` -> `EditorClient.selectAll()` (mirrors `vgai select --all`); otherwise `EditorClient.select(id)` (mirrors `vgai select <entityId>`). */
1409
+ /** `'all'` -> `EditorClient.selectAll()` (mirrors `volter select --all`); otherwise `EditorClient.select(id)` (mirrors `volter select <entityId>`). */
1410
1410
  async select(id) {
1411
1411
  if (id === "all") {
1412
1412
  await this.#client.selectAll();
@@ -1414,11 +1414,11 @@ var LiveEditor = class {
1414
1414
  }
1415
1415
  await this.#client.select(id);
1416
1416
  }
1417
- /** Mirrors `vgai deselect`. */
1417
+ /** Mirrors `volter deselect`. */
1418
1418
  async deselect() {
1419
1419
  await this.#client.select(null);
1420
1420
  }
1421
- /** No `id` -> focus the current selection (mirrors bare `vgai focus`); `id` given -> focus that entity. */
1421
+ /** No `id` -> focus the current selection (mirrors bare `volter focus`); `id` given -> focus that entity. */
1422
1422
  async focus(id) {
1423
1423
  if (id !== void 0) {
1424
1424
  await this.#client.focusEntity(id);
@@ -1641,19 +1641,19 @@ var LiveEditor = class {
1641
1641
  * of one table is a second name for one thing, and an agent reading
1642
1642
  * `--list` had to choose between them with nothing to choose on. This door
1643
1643
  * stays because it is strictly wider: it addresses a COMMAND ID, so under
1644
- * the frame it reaches everything the workbench knows — a `vgai.action.<id>`
1644
+ * the frame it reaches everything the workbench knows — a `volter.action.<id>`
1645
1645
  * editor action, one of VS Code's own — and not only a view. A VIEW is
1646
1646
  * reached by spelling its verb's command id:
1647
1647
  *
1648
- * await editor.command('vgai.blender-uv-view.state')
1649
- * await editor.command('vgai.blender-uv-view.zoom', { to: 600 })
1648
+ * await editor.command('volter.blender-uv-view.state')
1649
+ * await editor.command('volter.blender-uv-view.zoom', { to: 600 })
1650
1650
  *
1651
- * await editor.command('vgai.blender-node-view.view-all')
1652
- * await editor.command('vgai.blender-node-view.look', { node: 'Principled BSDF' })
1651
+ * await editor.command('volter.blender-node-view.view-all')
1652
+ * await editor.command('volter.blender-node-view.look', { node: 'Principled BSDF' })
1653
1653
  *
1654
1654
  * Under the Code-OSS frame this is the workbench's own command service, so
1655
- * any command id works — ours and VS Code's alike. Standalone `vgai edit`
1656
- * has no command service and answers the `vgai.<view>.<verb>` shape off the
1655
+ * any command id works — ours and VS Code's alike. Standalone the editor's `edit` command
1656
+ * has no command service and answers the `volter.<view>.<verb>` shape off the
1657
1657
  * SAME verb table the frame's commands call, refusing any other id by name.
1658
1658
  * One table, two doors, exactly like the keymap's.
1659
1659
  *
@@ -1794,7 +1794,7 @@ var LiveEditor = class {
1794
1794
  async reloadPage() {
1795
1795
  await this.#client.reloadPage();
1796
1796
  }
1797
- /** Mirrors `vgai status` — the full live editor state as JSON. */
1797
+ /** Mirrors the editor's `status` command — the full live editor state as JSON. */
1798
1798
  async status() {
1799
1799
  return this.#client.getState();
1800
1800
  }
@@ -1811,7 +1811,7 @@ var LiveTools = class {
1811
1811
  constructor(client) {
1812
1812
  this.#client = client;
1813
1813
  }
1814
- /** Enumerate the exact `package.json#vgai.tools` catalog without executing it. */
1814
+ /** Enumerate the exact `package.json#volter.tools` catalog without executing it. */
1815
1815
  async list() {
1816
1816
  return this.#client.listProjectTools();
1817
1817
  }
@@ -1878,8 +1878,8 @@ import { existsSync } from "node:fs";
1878
1878
  import { join } from "node:path";
1879
1879
 
1880
1880
  // ../editor-project/src/manifest/filename.ts
1881
- var MANIFEST_FILENAME = "vgai.project.json";
1882
- var REMOVED_MANIFEST_FILENAME = "vgai.game.json";
1881
+ var MANIFEST_FILENAME = "volter.project.json";
1882
+ var REMOVED_MANIFEST_FILENAME = "volter.game.json";
1883
1883
  function removedManifestFilenameMessage(where) {
1884
1884
  return `${where}: found \`${REMOVED_MANIFEST_FILENAME}\` and no \`${MANIFEST_FILENAME}\`. \`${REMOVED_MANIFEST_FILENAME}\` was REMOVED (the legacy-removal doctrine, docs/ARCHITECTURE-CORE.md \xA7Vocabulary) \u2014 nothing reads it any more, and it is deliberately NOT read as a fallback, because a second accepted name is the defect.
1885
1885
  Fix: rename it \u2014 \`git mv ${REMOVED_MANIFEST_FILENAME} ${MANIFEST_FILENAME}\`. The contents are unchanged; only the filename moved.`;
@@ -1901,12 +1901,12 @@ import { existsSync as existsSync2, readFileSync } from "node:fs";
1901
1901
  import { createRequire } from "node:module";
1902
1902
  import { dirname, join as join2 } from "node:path";
1903
1903
  import { pathToFileURL } from "node:url";
1904
- var PRODUCT_DECLARATION_KEY = "vgai.product";
1904
+ var PRODUCT_DECLARATION_KEY = "volter.product";
1905
1905
  var PRODUCT_INSTALL_LINES = [
1906
1906
  " npm install --save-dev @volter/model-editor",
1907
1907
  " npm install --save-dev @volter/game-editor"
1908
1908
  ];
1909
- var PRODUCT_CREATE_LINES = [" npx @volter/editor create <name>"];
1909
+ var PRODUCT_CREATE_LINES = [" npx @volter/editor-core create <name>"];
1910
1910
  var PRODUCT_COLOR_THEMES = ["dark", "light"];
1911
1911
  function readProductManifest(packageDir) {
1912
1912
  const manifestPath = join2(packageDir, "package.json");
@@ -1916,7 +1916,7 @@ function readProductManifest(packageDir) {
1916
1916
  } catch {
1917
1917
  return null;
1918
1918
  }
1919
- const declared = manifest.vgai?.product;
1919
+ const declared = manifest.volter?.product;
1920
1920
  if (declared === void 0) return null;
1921
1921
  const entry = declared.entry;
1922
1922
  if (typeof entry !== "string" || !entry.startsWith("./"))
@@ -1961,7 +1961,7 @@ function readProductManifest(packageDir) {
1961
1961
  }
1962
1962
  var SHA256_HEX = /^[0-9a-f]{64}$/;
1963
1963
  function readProductWorkbench(manifestPath, declared) {
1964
- const example = ' "vgai": { "product": { "workbench": { "release": "<product>-<fork sha 12>-<platform>", "tarballSha256": "<64 hex>" } } }\n`node scripts/workbench/build-release.mjs --publish --out <release dir>` cuts the release and prints exactly that block.';
1964
+ const example = ' "volter": { "product": { "workbench": { "release": "<product>-<fork sha 12>-<platform>", "tarballSha256": "<64 hex>" } } }\n`node scripts/workbench/build-release.mjs --publish --out <release dir>` cuts the release and prints exactly that block.';
1965
1965
  if (typeof declared !== "object" || declared === null || Array.isArray(declared))
1966
1966
  throw new Error(
1967
1967
  `${manifestPath} declares ${PRODUCT_DECLARATION_KEY} but its "workbench" is ${JSON.stringify(declared)}. A product IS the Code-OSS workbench it was compiled into, so it names the published release those bytes are:
@@ -1988,7 +1988,7 @@ ${example}`
1988
1988
  );
1989
1989
  return { release, tarballSha256 };
1990
1990
  }
1991
- function declaredVgaiPackages(projectRoot) {
1991
+ function declaredVolterPackages(projectRoot) {
1992
1992
  let manifest;
1993
1993
  try {
1994
1994
  manifest = JSON.parse(
@@ -2024,7 +2024,7 @@ function locatePackage(projectRoot, name) {
2024
2024
  }
2025
2025
  function declaredProducts(projectRoot) {
2026
2026
  const found = [];
2027
- for (const name of declaredVgaiPackages(projectRoot)) {
2027
+ for (const name of declaredVolterPackages(projectRoot)) {
2028
2028
  const dir = locatePackage(projectRoot, name);
2029
2029
  if (dir === null) continue;
2030
2030
  const product = readProductManifest(dir);
@@ -2064,7 +2064,7 @@ import {
2064
2064
  } from "node:fs";
2065
2065
  import { homedir } from "node:os";
2066
2066
  import { join as join3, resolve } from "node:path";
2067
- var EDITOR_SESSIONS_REGISTRY_FILE = join3(homedir(), ".vgai", "editor-sessions.json");
2067
+ var EDITOR_SESSIONS_REGISTRY_FILE = join3(homedir(), ".volter", "editor-sessions.json");
2068
2068
  function isEditorSessionEntry(v) {
2069
2069
  if (typeof v !== "object" || v === null) return false;
2070
2070
  const s = v;
@@ -2190,7 +2190,7 @@ function canonicalPath(path) {
2190
2190
  function readProjectSession(projectRoot) {
2191
2191
  try {
2192
2192
  const value = JSON.parse(
2193
- readFileSync3(join4(projectRoot, ".vgai", "session.json"), "utf8")
2193
+ readFileSync3(join4(projectRoot, ".volter", "session.json"), "utf8")
2194
2194
  );
2195
2195
  if (typeof value !== "object" || value === null) return null;
2196
2196
  const hint = value;
@@ -2215,7 +2215,7 @@ async function probeServedProject(port) {
2215
2215
  }
2216
2216
  function manifestRefusal(projectRoot, manifestError) {
2217
2217
  return new Error(
2218
- `@volter/editor-live: the editor session for ${projectRoot} is live, but its vgai.project.json does not load, so there is no editor or game to drive \u2014 the editor page is showing this same error. Fix the manifest and retry; the session recovers on save, no restart needed.
2218
+ `@volter/editor-live: the editor session for ${projectRoot} is live, but its volter.project.json does not load, so there is no editor or game to drive \u2014 the editor page is showing this same error. Fix the manifest and retry; the session recovers on save, no restart needed.
2219
2219
  ${manifestError}`
2220
2220
  );
2221
2221
  }
@@ -2245,7 +2245,7 @@ async function resolveSession(projectDir = process.cwd(), deps = {}) {
2245
2245
  const projectRoot = findRoot(projectDir);
2246
2246
  if (projectRoot === null) {
2247
2247
  throw new Error(
2248
- `@volter/editor-live: no vgai.project.json found in ${projectDir} or any parent directory \u2014 is this a project?`
2248
+ `@volter/editor-live: no volter.project.json found in ${projectDir} or any parent directory \u2014 is this a project?`
2249
2249
  );
2250
2250
  }
2251
2251
  const localHint = (deps.readProjectSession ?? readProjectSession)(projectRoot);