@volter/live 0.5.211 → 0.5.213

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 (73) hide show
  1. package/BUNDLED_NOTICES +13 -13
  2. package/README.md +10 -11
  3. package/dist/asset-library.d.ts +98 -0
  4. package/dist/asset-library.js +7 -0
  5. package/dist/asset-library.js.map +7 -0
  6. package/dist/chunk-7WKVJGHZ.js +15 -0
  7. package/dist/chunk-7WKVJGHZ.js.map +7 -0
  8. package/dist/chunk-B2HUWFTT.js +25 -0
  9. package/dist/chunk-B2HUWFTT.js.map +7 -0
  10. package/dist/chunk-IZJOOON2.js +805 -0
  11. package/dist/chunk-IZJOOON2.js.map +7 -0
  12. package/dist/chunk-JDOIPALX.js +158 -0
  13. package/dist/chunk-JDOIPALX.js.map +7 -0
  14. package/dist/chunk-JFAHP5CC.js +218 -0
  15. package/dist/chunk-JFAHP5CC.js.map +7 -0
  16. package/dist/chunk-PC56TDHV.js +189 -0
  17. package/dist/chunk-PC56TDHV.js.map +7 -0
  18. package/dist/chunk-WIAH4XZE.js +82 -0
  19. package/dist/chunk-WIAH4XZE.js.map +7 -0
  20. package/dist/client.d.ts +376 -0
  21. package/dist/client.js +10 -0
  22. package/dist/client.js.map +7 -0
  23. package/dist/discovery.d.ts +32 -0
  24. package/dist/discovery.js +19 -0
  25. package/dist/discovery.js.map +7 -0
  26. package/dist/editor-document.d.ts +12 -47
  27. package/dist/editor.d.ts +45 -183
  28. package/dist/http-transport.d.ts +6 -0
  29. package/dist/index.d.ts +3 -6
  30. package/dist/index.js +83 -1762
  31. package/dist/index.js.map +4 -4
  32. package/dist/installed-package.d.ts +6 -0
  33. package/dist/installed-package.js +7 -0
  34. package/dist/installed-package.js.map +7 -0
  35. package/dist/lazy-proxy.d.ts +11 -11
  36. package/dist/member-hints.d.ts +6 -9
  37. package/dist/product-create.d.ts +29 -0
  38. package/dist/product-create.js +13 -0
  39. package/dist/product-create.js.map +7 -0
  40. package/dist/product-locator.d.ts +100 -0
  41. package/dist/product-locator.js +25 -0
  42. package/dist/product-locator.js.map +7 -0
  43. package/dist/registry-format.d.ts +72 -0
  44. package/dist/registry-format.js +31 -0
  45. package/dist/registry-format.js.map +7 -0
  46. package/dist/session.d.ts +11 -15
  47. package/dist/singleton.d.ts +1 -13
  48. package/dist/volter-manifest.d.ts +55 -0
  49. package/dist/volter-manifest.js +9 -0
  50. package/dist/volter-manifest.js.map +7 -0
  51. package/dist/workbench-locator.d.ts +84 -0
  52. package/dist/workbench-locator.js +416 -0
  53. package/dist/workbench-locator.js.map +7 -0
  54. package/package.json +39 -3
  55. package/src/asset-library.ts +104 -0
  56. package/src/client.ts +1093 -0
  57. package/src/discovery.ts +105 -0
  58. package/src/editor-document.ts +12 -49
  59. package/src/editor.ts +56 -215
  60. package/src/http-transport.ts +19 -0
  61. package/src/index.ts +5 -8
  62. package/src/installed-package.ts +15 -0
  63. package/src/lazy-proxy.ts +11 -11
  64. package/src/member-hints.ts +8 -12
  65. package/src/product-create.ts +38 -0
  66. package/src/product-locator.ts +327 -0
  67. package/src/registry-format.ts +248 -0
  68. package/src/session.ts +36 -144
  69. package/src/singleton.ts +1 -16
  70. package/src/volter-manifest.ts +97 -0
  71. package/src/workbench-locator.ts +625 -0
  72. package/dist/tools.d.ts +0 -23
  73. package/src/tools.ts +0 -45
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/project@0.5.211
6
+ @volter/project@0.5.213
7
7
  Declared license: Apache-2.0
8
- Source: the unmodified npm package @volter/project@0.5.211, from https://github.com/volter-ai/editor.git
8
+ Source: the unmodified npm package @volter/project@0.5.213, from https://github.com/volter-ai/editor.git
9
9
 
10
10
  --- packages/project/LICENSE ---
11
11
 
@@ -219,13 +219,13 @@ Copyright 2026 Volter AI, Inc.
219
219
 
220
220
  The project contract was transferred from the Apache-2.0 packages of
221
221
  volter-ai/volter-engine and is developed in the public volter-ai/editor
222
- repository. Original source hashes and revision are recorded in
223
- provenance/editor-contracts.json. LICENSE contains the Apache-2.0 text.
222
+ repository. Original source revision:
223
+ cf9cb8e22dd7ae5709ed0dd8a46dd6f16d1e4945. LICENSE contains the Apache-2.0 text.
224
224
 
225
225
 
226
- @volter/sdk@0.5.211
226
+ @volter/sdk@0.5.213
227
227
  Declared license: Apache-2.0
228
- Source: the unmodified npm package @volter/sdk@0.5.211, from https://github.com/volter-ai/editor.git
228
+ Source: the unmodified npm package @volter/sdk@0.5.213, from https://github.com/volter-ai/editor.git
229
229
 
230
230
  --- packages/sdk/LICENSE ---
231
231
 
@@ -438,16 +438,16 @@ Source: the unmodified npm package @volter/sdk@0.5.211, from https://github.com/
438
438
  Copyright 2026 Volter AI, Inc.
439
439
 
440
440
  Project tool registry, provider execution and related types were transferred
441
- from the Apache-2.0 SDK package of volter-ai/volter-engine. Original source
442
- hashes and revision are
443
- recorded in provenance/editor-server.json.
441
+ from the Apache-2.0 SDK package of volter-ai/volter-engine. The original source
442
+ revision is cf9cb8e22dd7ae5709ed0dd8a46dd6f16d1e4945.
444
443
 
445
444
  The project output-root policy is Apache-2.0, transferred from the original
446
- SDK; its exact source is recorded in provenance/editor-server.json.
445
+ SDK at revision cf9cb8e22dd7ae5709ed0dd8a46dd6f16d1e4945.
447
446
 
448
- src/kit/ holds the kit modules integrations share. They were moved here from
449
- @volter/editor-core's src/ (commits 818f6de1, 94a374b7, 98b22ef6, cb5c1539 and
450
- the moves after them, all in this repository), where they carried
447
+ The modules integrations share, which sat in src/kit/ and now sit directly
448
+ under src/, were moved here from @volter/editor-core's src/ (commits 818f6de1,
449
+ 94a374b7, 98b22ef6, cb5c1539 and the moves after them, all in this repository),
450
+ where they carried
451
451
  AGPL-3.0-only as part of the editor package imported from
452
452
  volter-ai/volter-engine. They are Volter AI, Inc.'s own work and are licensed
453
453
  under Apache-2.0 here. The owner's words are "the runtime should be apache,
package/README.md CHANGED
@@ -1,20 +1,19 @@
1
1
  # Live client
2
2
 
3
- Attach to an existing editor session and drive its documents, Blender commands,
4
- inspection, history and registered project tools. This package never starts a
5
- session or runs Blender outside the editor tab.
3
+ Attach to an existing editor session and drive its documents, contributed
4
+ verbs, inspection, history and registered project tools. This package never
5
+ starts a session or runs an integration outside the editor tab.
6
6
 
7
7
  ```js
8
8
  import { connect } from '@volter/live';
9
9
  const { editor } = await connect('/path/to/project');
10
- await editor.blender('blender-status');
10
+ await editor.contributedVerb('<package>-status');
11
11
  ```
12
12
 
13
13
  Connection selection matches the project's canonical path and refuses a missing
14
- or mismatched session. Gameplay control, recording and game-page automation are
15
- not part of this modeling release. Runtime JavaScript is bundled for plain Node;
16
- source and declarations ship alongside it.
17
-
18
- Private migration staging: the new product's launcher is not available yet.
19
- Existing session storage and wire identifiers remain until their producers move
20
- with them. See the repository WORK.md for the remaining release gates.
14
+ or mismatched session. A session answers only requests that carry its connection
15
+ token, which this package reads from the session's entry in the owner's session
16
+ registry (`~/.volter/editor-sessions.json`); a script's own request to a session
17
+ goes through `sessionFetch` from `@volter/live/registry-format`, which adds it. Runtime JavaScript is bundled for Node; source and
18
+ declarations ship beside it. The running document's registered commands remain
19
+ the authority for the operations an integration exposes.
@@ -0,0 +1,98 @@
1
+ /**
2
+ * THE ASSET LIBRARY, as the session's `/__editor/asset-library/*` routes answer it (editor-core's
3
+ * `server/asset-library-routes.ts`, which takes these shapes from here): search a source, list an asset's files, and
4
+ * download one into the project. `editor.assetLibrary` reaches it through `EditorClient`, so a request carries the
5
+ * session's connection token as every other one does.
6
+ */
7
+ import type { EditorClient } from './client.js';
8
+ /** An asset as a search answers it. */
9
+ export interface OnlineAsset {
10
+ id: string;
11
+ source: 'polyhaven' | 'ambientcg' | 'local';
12
+ name: string;
13
+ type: 'model' | 'animation' | 'source' | 'hdri' | 'texture' | 'material';
14
+ thumbnailUrl: string;
15
+ categories: string[];
16
+ tags: string[];
17
+ downloadCount?: number;
18
+ license?: string;
19
+ author?: string;
20
+ sourceUrl?: string;
21
+ cloudHosted?: boolean;
22
+ variantId?: string;
23
+ variantCount?: number;
24
+ sizeBytes?: number;
25
+ animationCount?: number;
26
+ deliveryKinds?: ('local-ssd' | 'cloud' | 'remote')[];
27
+ addedAt?: string;
28
+ capabilities?: {
29
+ previewable: boolean;
30
+ importable: boolean;
31
+ runtimeReady: boolean;
32
+ animated: boolean;
33
+ deliveryAvailable: boolean;
34
+ health: 'healthy' | 'source-only' | 'unsupported';
35
+ };
36
+ }
37
+ /** One file of an asset that can be downloaded (`files`); `download` takes it with the asset. */
38
+ export interface AssetFileOption {
39
+ label: string;
40
+ format: string;
41
+ url: string;
42
+ sizeBytes?: number;
43
+ /** Additional files that must be downloaded alongside the main URL (GLTF includes). */
44
+ includes?: {
45
+ relativePath: string;
46
+ url: string;
47
+ size: number;
48
+ }[];
49
+ }
50
+ /** `GET /search`'s query. `type` is the kind the source names (`model`, `hdri`, …; `all` in the local catalog). */
51
+ export interface AssetSearchQuery {
52
+ source: OnlineAsset['source'];
53
+ type: string;
54
+ q?: string;
55
+ category?: string;
56
+ offset?: number;
57
+ limit?: number;
58
+ }
59
+ /** `POST /download`'s body: the asset and the file `files` offered for it. `license` is the search result's, which the
60
+ * route records for a remote source; the local catalog's own license is recorded whatever is passed. */
61
+ export interface AssetDownloadRequest {
62
+ source: OnlineAsset['source'];
63
+ id: string;
64
+ name: string;
65
+ url: string;
66
+ format: string;
67
+ includes?: AssetFileOption['includes'];
68
+ license?: string;
69
+ }
70
+ /** What a download answers: the file's path under the project's `public/`, the provenance operation that wrote it, and
71
+ * `ledgerError` when the asset and its license could not be recorded in `.volter/assets.json`. */
72
+ export interface AssetDownloadResult {
73
+ ok: true;
74
+ path: string;
75
+ provenanceOperationId?: string;
76
+ ledgerError?: string;
77
+ alreadyExists?: boolean;
78
+ }
79
+ /** `editor.assetLibrary`: the routes, one call each. */
80
+ export declare class LiveAssetLibrary {
81
+ #private;
82
+ constructor(client: EditorClient);
83
+ /** Search one source: `{ assets, total }`, each asset with its tags, license, author and source address. */
84
+ search(query: AssetSearchQuery): Promise<{
85
+ assets: OnlineAsset[];
86
+ total: number;
87
+ }>;
88
+ /** The files an asset can be downloaded as. */
89
+ files(asset: {
90
+ source: OnlineAsset['source'];
91
+ id: string;
92
+ }): Promise<{
93
+ files: AssetFileOption[];
94
+ }>;
95
+ /** Download one file of an asset into the project's `public/asset-library/`, recording the asset and its license in
96
+ * the project's `.volter/assets.json`. */
97
+ download(request: AssetDownloadRequest): Promise<AssetDownloadResult>;
98
+ }
@@ -0,0 +1,7 @@
1
+ import {
2
+ LiveAssetLibrary
3
+ } from "./chunk-B2HUWFTT.js";
4
+ export {
5
+ LiveAssetLibrary
6
+ };
7
+ //# sourceMappingURL=asset-library.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,15 @@
1
+ // src/installed-package.ts
2
+ import { existsSync, realpathSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ function installedPackageDir(fromDir, name) {
5
+ for (let dir = fromDir; ; dir = dirname(dir)) {
6
+ const candidate = join(dir, "node_modules", ...name.split("/"));
7
+ if (existsSync(join(candidate, "package.json"))) return realpathSync(candidate);
8
+ if (dirname(dir) === dir) return null;
9
+ }
10
+ }
11
+
12
+ export {
13
+ installedPackageDir
14
+ };
15
+ //# sourceMappingURL=chunk-7WKVJGHZ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/installed-package.ts"],
4
+ "sourcesContent": ["import { existsSync, realpathSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\n/**\n * The real directory of installed package `name` as Node finds it from `fromDir`: up the `node_modules` folders, or\n * null when none holds it. It is found by its folder rather than by resolving `<name>/package.json`, which fails for a\n * package whose `exports` does not list that file (`@volter/sdk`).\n */\nexport function installedPackageDir(fromDir: string, name: string): string | null {\n for (let dir = fromDir; ; dir = dirname(dir)) {\n const candidate = join(dir, 'node_modules', ...name.split('/'));\n if (existsSync(join(candidate, 'package.json'))) return realpathSync(candidate);\n if (dirname(dir) === dir) return null;\n }\n}\n"],
5
+ "mappings": ";AAAA,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAS,YAAY;AAOvB,SAAS,oBAAoB,SAAiB,MAA6B;AAChF,WAAS,MAAM,WAAW,MAAM,QAAQ,GAAG,GAAG;AAC5C,UAAM,YAAY,KAAK,KAAK,gBAAgB,GAAG,KAAK,MAAM,GAAG,CAAC;AAC9D,QAAI,WAAW,KAAK,WAAW,cAAc,CAAC,EAAG,QAAO,aAAa,SAAS;AAC9E,QAAI,QAAQ,GAAG,MAAM,IAAK,QAAO;AAAA,EACnC;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,25 @@
1
+ // src/asset-library.ts
2
+ var LiveAssetLibrary = class {
3
+ #client;
4
+ constructor(client) {
5
+ this.#client = client;
6
+ }
7
+ /** Search one source: `{ assets, total }`, each asset with its tags, license, author and source address. */
8
+ async search(query) {
9
+ return this.#client.assetLibraryRequest("GET", "search", query);
10
+ }
11
+ /** The files an asset can be downloaded as. */
12
+ async files(asset) {
13
+ return this.#client.assetLibraryRequest("GET", "files", asset);
14
+ }
15
+ /** Download one file of an asset into the project's `public/asset-library/`, recording the asset and its license in
16
+ * the project's `.volter/assets.json`. */
17
+ async download(request) {
18
+ return this.#client.assetLibraryRequest("POST", "download", request);
19
+ }
20
+ };
21
+
22
+ export {
23
+ LiveAssetLibrary
24
+ };
25
+ //# sourceMappingURL=chunk-B2HUWFTT.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/asset-library.ts"],
4
+ "sourcesContent": ["/**\n * THE ASSET LIBRARY, as the session's `/__editor/asset-library/*` routes answer it (editor-core's\n * `server/asset-library-routes.ts`, which takes these shapes from here): search a source, list an asset's files, and\n * download one into the project. `editor.assetLibrary` reaches it through `EditorClient`, so a request carries the\n * session's connection token as every other one does.\n */\nimport type { EditorClient } from './client.js';\n\n/** An asset as a search answers it. */\nexport interface OnlineAsset {\n id: string;\n source: 'polyhaven' | 'ambientcg' | 'local';\n name: string;\n type: 'model' | 'animation' | 'source' | 'hdri' | 'texture' | 'material';\n thumbnailUrl: string;\n categories: string[];\n tags: string[];\n downloadCount?: number;\n license?: string;\n author?: string;\n sourceUrl?: string;\n cloudHosted?: boolean;\n variantId?: string;\n variantCount?: number;\n sizeBytes?: number;\n animationCount?: number;\n deliveryKinds?: ('local-ssd' | 'cloud' | 'remote')[];\n addedAt?: string;\n capabilities?: {\n previewable: boolean;\n importable: boolean;\n runtimeReady: boolean;\n animated: boolean;\n deliveryAvailable: boolean;\n health: 'healthy' | 'source-only' | 'unsupported';\n };\n}\n\n/** One file of an asset that can be downloaded (`files`); `download` takes it with the asset. */\nexport interface AssetFileOption {\n label: string;\n format: string;\n url: string;\n sizeBytes?: number;\n /** Additional files that must be downloaded alongside the main URL (GLTF includes). */\n includes?: { relativePath: string; url: string; size: number }[];\n}\n\n/** `GET /search`'s query. `type` is the kind the source names (`model`, `hdri`, \u2026; `all` in the local catalog). */\nexport interface AssetSearchQuery {\n source: OnlineAsset['source'];\n type: string;\n q?: string;\n category?: string;\n offset?: number;\n limit?: number;\n}\n\n/** `POST /download`'s body: the asset and the file `files` offered for it. `license` is the search result's, which the\n * route records for a remote source; the local catalog's own license is recorded whatever is passed. */\nexport interface AssetDownloadRequest {\n source: OnlineAsset['source'];\n id: string;\n name: string;\n url: string;\n format: string;\n includes?: AssetFileOption['includes'];\n license?: string;\n}\n\n/** What a download answers: the file's path under the project's `public/`, the provenance operation that wrote it, and\n * `ledgerError` when the asset and its license could not be recorded in `.volter/assets.json`. */\nexport interface AssetDownloadResult {\n ok: true;\n path: string;\n provenanceOperationId?: string;\n ledgerError?: string;\n alreadyExists?: boolean;\n}\n\n/** `editor.assetLibrary`: the routes, one call each. */\nexport class LiveAssetLibrary {\n readonly #client: EditorClient;\n\n constructor(client: EditorClient) {\n this.#client = client;\n }\n\n /** Search one source: `{ assets, total }`, each asset with its tags, license, author and source address. */\n async search(query: AssetSearchQuery): Promise<{ assets: OnlineAsset[]; total: number }> {\n return this.#client.assetLibraryRequest('GET', 'search', query);\n }\n\n /** The files an asset can be downloaded as. */\n async files(asset: { source: OnlineAsset['source']; id: string }): Promise<{ files: AssetFileOption[] }> {\n return this.#client.assetLibraryRequest('GET', 'files', asset);\n }\n\n /** Download one file of an asset into the project's `public/asset-library/`, recording the asset and its license in\n * the project's `.volter/assets.json`. */\n async download(request: AssetDownloadRequest): Promise<AssetDownloadResult> {\n return this.#client.assetLibraryRequest('POST', 'download', request);\n }\n}\n"],
5
+ "mappings": ";AAiFO,IAAM,mBAAN,MAAuB;AAAA,EACnB;AAAA,EAET,YAAY,QAAsB;AAChC,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA,EAGA,MAAM,OAAO,OAA4E;AACvF,WAAO,KAAK,QAAQ,oBAAoB,OAAO,UAAU,KAAK;AAAA,EAChE;AAAA;AAAA,EAGA,MAAM,MAAM,OAA6F;AACvG,WAAO,KAAK,QAAQ,oBAAoB,OAAO,SAAS,KAAK;AAAA,EAC/D;AAAA;AAAA;AAAA,EAIA,MAAM,SAAS,SAA6D;AAC1E,WAAO,KAAK,QAAQ,oBAAoB,QAAQ,YAAY,OAAO;AAAA,EACrE;AACF;",
6
+ "names": []
7
+ }