@volter/live 0.5.210 → 0.5.212

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 (67) hide show
  1. package/BUNDLED_NOTICES +13 -13
  2. package/README.md +7 -11
  3. package/dist/chunk-7SZ3C4CC.js +768 -0
  4. package/dist/chunk-7SZ3C4CC.js.map +7 -0
  5. package/dist/chunk-7WKVJGHZ.js +15 -0
  6. package/dist/chunk-7WKVJGHZ.js.map +7 -0
  7. package/dist/chunk-SDIWRX5X.js +189 -0
  8. package/dist/chunk-SDIWRX5X.js.map +7 -0
  9. package/dist/chunk-USXOIBVX.js +81 -0
  10. package/dist/chunk-USXOIBVX.js.map +7 -0
  11. package/dist/chunk-Y5W77HYT.js +123 -0
  12. package/dist/chunk-Y5W77HYT.js.map +7 -0
  13. package/dist/chunk-YPAOTPIF.js +202 -0
  14. package/dist/chunk-YPAOTPIF.js.map +7 -0
  15. package/dist/client.d.ts +370 -0
  16. package/dist/client.js +9 -0
  17. package/dist/client.js.map +7 -0
  18. package/dist/discovery.d.ts +32 -0
  19. package/dist/discovery.js +19 -0
  20. package/dist/discovery.js.map +7 -0
  21. package/dist/editor-document.d.ts +12 -47
  22. package/dist/editor.d.ts +34 -181
  23. package/dist/http-transport.d.ts +6 -0
  24. package/dist/index.d.ts +1 -5
  25. package/dist/index.js +76 -1722
  26. package/dist/index.js.map +4 -4
  27. package/dist/installed-package.d.ts +6 -0
  28. package/dist/installed-package.js +7 -0
  29. package/dist/installed-package.js.map +7 -0
  30. package/dist/lazy-proxy.d.ts +11 -11
  31. package/dist/member-hints.d.ts +6 -9
  32. package/dist/product-create.d.ts +29 -0
  33. package/dist/product-create.js +13 -0
  34. package/dist/product-create.js.map +7 -0
  35. package/dist/product-locator.d.ts +100 -0
  36. package/dist/product-locator.js +25 -0
  37. package/dist/product-locator.js.map +7 -0
  38. package/dist/registry-format.d.ts +44 -0
  39. package/dist/registry-format.js +21 -0
  40. package/dist/registry-format.js.map +7 -0
  41. package/dist/session.d.ts +10 -3
  42. package/dist/singleton.d.ts +1 -13
  43. package/dist/volter-manifest.d.ts +55 -0
  44. package/dist/volter-manifest.js +9 -0
  45. package/dist/volter-manifest.js.map +7 -0
  46. package/dist/workbench-locator.d.ts +84 -0
  47. package/dist/workbench-locator.js +416 -0
  48. package/dist/workbench-locator.js.map +7 -0
  49. package/package.json +35 -3
  50. package/src/client.ts +1052 -0
  51. package/src/discovery.ts +105 -0
  52. package/src/editor-document.ts +12 -49
  53. package/src/editor.ts +45 -212
  54. package/src/http-transport.ts +19 -0
  55. package/src/index.ts +3 -7
  56. package/src/installed-package.ts +15 -0
  57. package/src/lazy-proxy.ts +11 -11
  58. package/src/member-hints.ts +8 -12
  59. package/src/product-create.ts +38 -0
  60. package/src/product-locator.ts +327 -0
  61. package/src/registry-format.ts +185 -0
  62. package/src/session.ts +38 -66
  63. package/src/singleton.ts +1 -16
  64. package/src/volter-manifest.ts +97 -0
  65. package/src/workbench-locator.ts +625 -0
  66. package/dist/tools.d.ts +0 -23
  67. package/src/tools.ts +0 -45
package/dist/editor.d.ts CHANGED
@@ -1,70 +1,31 @@
1
1
  /** Editor and document automation over the shared session command wire.
2
2
  * Modeling executes in the editor tab; this client owns no model state. */
3
- import type { ActiveDocumentCapture, AssetKind, AssetPreviewCapture, AssetPreviewOptions, AssetPreviewShotSetDefinition, AssetPreviewSource, CaptureDimensions, DocumentLookOutcome, StageFrameCostReading, EditorChromeCapture, EditorChromeCaptureOptions, EditorClient, EditorState, EditorView, EditorWorkspaceName, HistoryStep, InspectedFieldWrite, InspectedHierarchy, InspectedInspection, LabeledShotSetCapture, ModelPlayLogReading, OpenedDocument, PresentedEditorView, ShadingMode, StructureOp, StructureOpOptions, StructureOpResult, ViewPreset, ViewportCapture } from '@volter/sdk';
3
+ import type { ActiveDocumentCapture, AssetKind, AssetPreviewCapture, AssetPreviewOptions, AssetPreviewShotSetDefinition, AssetPreviewSource, CaptureDimensions, DocumentLookOutcome, StageFrameCostReading, EditorChromeCapture, EditorChromeCaptureOptions, EditorState, EditorView, EditorWorkspaceName, InspectedFieldWrite, InspectedHierarchy, InspectedInspection, LabeledShotSetCapture, PresentedEditorView, ShadingMode, StructureOp, StructureOpOptions, StructureOpResult, ViewPreset, ViewportCapture } from '@volter/sdk';
4
+ import type { EditorClient, HistoryStep, OpenedDocument } from './client.js';
4
5
  import { LiveEditorDocument } from './editor-document.js';
5
- /** A panel `showPanel` can focus: the viewport tabs, the console, the build
6
- * surface, or any key the editor's own static-panel registry holds
7
- * (`hierarchy`, `assets`, `asset-library`, `inspector`, `history`, …) — which
8
- * is why this is open: the registry, not this union, is the vocabulary. */
9
- export type PanelName = 'viewport-edit' | 'console' | (string & {});
6
+ /** A panel `showPanel` can focus: the console, the build surface, or any key
7
+ * the editor's own static-panel registry holds (`hierarchy`, `asset-library`,
8
+ * `inspector`, `history`, …) — which is why this is open: the registry, not
9
+ * this union, is the vocabulary. */
10
+ export type PanelName = 'console' | (string & {});
10
11
  /**
11
12
  * Lightweight extension-based `AssetKind` guess for `openAsset`'s optional
12
- * `kind` argument. Deliberately independent of (not shared with) the
13
- * editor's own `AssetBrowser.tsx#getAssetKind` — that function is a private,
14
- * React-component-local helper of a package `@volter/live` has no dependency
15
- * on. Callers with an unusual extension can always pass `kind` explicitly.
13
+ * `kind` argument. Callers with an unusual extension can always pass `kind`
14
+ * explicitly.
16
15
  */
17
16
  export declare function inferAssetKind(path: string): AssetKind;
18
17
  export declare class LiveEditor {
19
18
  #private;
20
- /**
21
- * The ACTIVE center document's own DOM: read it, click it, key it, paste
22
- * into it. The one door onto editor chrome that is not play-mode gated, and
23
- * deliberately scoped to that document alone —
24
- * `packages/sdk/src/kit/editor-document-probe.ts` carries the design and the
25
- * refusal contract. Screenshotting the same subject is
26
- * {@link LiveEditor.captureActiveDocument}, not a fifth verb here.
27
- */
19
+ /** Read and drive DOM within a named scope: the active document by default, or editor chrome
20
+ * such as header, shelf, rail, outliner, utility and area. Targets outside the scope are refused.
21
+ * See `@volter/sdk`'s editor-document-probe for scope and gesture contracts. */
28
22
  readonly document: LiveEditorDocument;
29
23
  constructor(client: EditorClient);
30
- /**
31
- * THE BLENDER LANE'S VERBS, from `cyclotron eval`.
32
- *
33
- * Blender runs headless in the editor tab's worker (ARCHITECTURE-CORE, "THE
34
- * BLENDER IN THE TAB IS BLENDER") and answers `blender-start`,
35
- * `blender-execute`, `blender-scene-info`, `blender-object-info`,
36
- * `blender-screenshot-view`, `blender-read-file`, `blender-write-file`,
37
- * `blender-list-files`, `blender-stop` and `blender-status`. They were
38
- * reachable from `@volter/sdk` and through `volter blender-mcp` but from
39
- * no GENERAL door, so driving a session meant writing an MCP client script
40
- * per question — the same discovery failure `eval-surface.ts`'s header
41
- * records, in a lane that had not noticed it yet.
42
- *
43
- * cyclotron eval "await editor.blender('blender-execute', { code: 'import bpy; print(len(bpy.data.objects))' })"
44
- *
45
- * `blender-status` is the only verb that creates nothing: it answers whether
46
- * this tab already has a session without starting one.
47
- */
48
- blender<T extends object = Record<string, unknown>>(type: `blender-${string}`, fields?: Record<string, unknown>): Promise<T>;
49
- /**
50
- * MODEL PLAY'S LOG, from `cyclotron eval` — the same read as
51
- * `cyclotron play-log`. A play script writes it with
52
- * `play.log(kind, facts)`; the runner adds `play-start`, `script-reload`,
53
- * `script-error` and `play-stop`. Every entry carries `simT` (simulation
54
- * seconds) and `tick` (the frame). Each model document keeps its own: the
55
- * current run, or the last one after Stop; Play from a fresh copy empties it.
56
- * `documentId` picks one (`documents` lists them); the active Play's by default.
57
- *
58
- * cyclotron eval "(await editor.modelPlayLog({ kind: 'death' })).entries"
59
- */
60
- modelPlayLog(query?: {
61
- readonly documentId?: string;
62
- readonly since?: number;
63
- readonly kind?: string;
64
- }): Promise<ModelPlayLogReading>;
24
+ /** A verb a composed package contributes (`<package>-<verb>`), waited on for its own row's budget. */
25
+ contributedVerb<T extends object = Record<string, unknown>>(type: string, fields?: Record<string, unknown>): Promise<T>;
65
26
  /**
66
27
  * The active authoring adapter's persistence destination — where a save would
67
- * land (`status().savePath`). A read only: a three root has no scene document
28
+ * land (`status().savePath`). A read only: a stage root has no scene document
68
29
  * to open, and its root is activated instead.
69
30
  */
70
31
  scene(): Promise<string | null>;
@@ -76,19 +37,10 @@ export declare class LiveEditor {
76
37
  present(view: EditorView): Promise<PresentedEditorView>;
77
38
  /** The human editor's actual active document, selection, camera and utility. */
78
39
  currentView(): Promise<EditorView>;
79
- /**
80
- * Capture the same center document the human is currently looking at.
81
- *
82
- * A number is a SQUARE of that size — the default, and the right shape for
83
- * an unstaged look at a model. `{width, height}` asks for a shaped frame, so
84
- * a video-aspect look needs no crop afterwards. Both are bounded by the
85
- * relay budget (64-1024 per side, total no larger than a 1024 square); see
86
- * `@volter/sdk`'s `CaptureDimensions`.
87
- * Supply a view to present and photograph it in one editor request.
88
- */
89
- /** The active document's RENDER alone, at the size asked for: what the document draws,
90
- * without what the viewport draws over it (its navigation gizmo, its readouts). To see a
91
- * stage as the person does, use `captureEditorChrome({ region: 'document' })`. */
40
+ /** Capture the active document's render without viewport navigation gizmos or readouts.
41
+ * A number requests a square; `{width, height}` requests a shaped frame, bounded by
42
+ * `CaptureDimensions`. Supply a view to present and capture it in one request.
43
+ * Use `captureEditorChrome({ region: 'document' })` to include viewport chrome. */
92
44
  captureActiveDocument(size?: CaptureDimensions, view?: EditorView): Promise<ActiveDocumentCapture>;
93
45
  /**
94
46
  * Photograph the editor PAGE — every panel, tab strip and viewport as the
@@ -117,7 +69,7 @@ export declare class LiveEditor {
117
69
  */
118
70
  frame(entityId: string): Promise<void>;
119
71
  /**
120
- * Bare `frame()` frames the OPEN Object3D document's subject instead — its
72
+ * Bare `frame()` frames the OPEN asset document's subject instead — its
121
73
  * selection if it has one, else the whole model: the toolbar's own Frame
122
74
  * button, reachable from a script. `fit` scales the fitted distance (1 is
123
75
  * that button's tight fit, 1.5 stands back a little for a shot).
@@ -128,7 +80,7 @@ export declare class LiveEditor {
128
80
  /**
129
81
  * WATCH THE AGENT LOOK AROUND THE MODEL.
130
82
  *
131
- * Swings the open Object3D document's camera — the camera the human's tab is
83
+ * Swings the open asset document's camera — the camera the human's tab is
132
84
  * showing — around the framed subject by `azimuth`/`elevation` RADIANS,
133
85
  * animated over `duration` seconds (default 0.6), and resolves when the move
134
86
  * ends. This is deliberately not a jump cut: the point of the verb is that a
@@ -173,21 +125,6 @@ export declare class LiveEditor {
173
125
  readonly quality?: 'full' | 'navigation';
174
126
  }): Promise<StageFrameCostReading>;
175
127
  view(preset: ViewPreset): Promise<void>;
176
- /**
177
- * Switch the editor's NAMED WORKSPACE — `await editor.workspace('model')`.
178
- *
179
- * A workspace is a task-named LAYOUT MEMORY over the one dock
180
- * (ARCHITECTURE-CORE §Editor chrome): `game` (the default, the editor's
181
- * standing arrangement), `model`, `sculpt`, `texture`, `animate`, `look`.
182
- * Switching is an EXPLICIT act — nothing in the editor moves chrome on its
183
- * own, opening a document included — and this is the session door to it,
184
- * beside `Window → Workspace` and the registered actions.
185
- *
186
- * Resolves once the dock has finished rebuilding, so a capture taken
187
- * immediately after photographs the arrangement that was asked for. Each
188
- * workspace remembers the user's own hand-tuning per project, so switching
189
- * away and back is lossless.
190
- */
191
128
  workspace(id: EditorWorkspaceName): Promise<void>;
192
129
  /**
193
130
  * Apply a STYLE BUNDLE by id — the chrome's palette, material and icon set in
@@ -198,28 +135,12 @@ export declare class LiveEditor {
198
135
  style(id: string): Promise<void>;
199
136
  /**
200
137
  * A document stage's viewport PRESENTATION — its draw mode, lighting, backdrop and overlays
201
- * (`@volter/sdk/kit/viewport-presentation`) — resolved. With `layer`, that choice is
138
+ * (`@volter/sdk/viewport-presentation`) — resolved. With `layer`, that choice is
202
139
  * recorded for the view first, as a person's toolbar change would be, e.g.
203
140
  * `presentation('model:src/models/cube.blend', { all: { lighting: { studioPreset: 'kit' } } })`.
204
- * With a STRING, the named view of that id (`*.view.ts`, e.g. `'godot'`) is put on the view
205
- * whole; the answer's `viewPresets` lists the ones registered.
206
141
  */
207
142
  presentation(documentId: string, layer?: Parameters<EditorClient['viewportPresentation']>[1]): ReturnType<EditorClient['viewportPresentation']>;
208
- /**
209
- * Set the MATERIAL apart from the bundle that usually carries it.
210
- * Appearance is palette × material, independent axes by ruling, so
211
- * `style()` alone can never say whether a cost belongs to the blur or to
212
- * the palette. This is the door that measures them apart; it answers with
213
- * what the chrome wears afterwards (`style` is `null` when the mix matches
214
- * no registered bundle).
215
- */
216
- appearance(appearance: {
217
- readonly material?: string;
218
- }): Promise<{
219
- material: string;
220
- style: string | null;
221
- }>;
222
- /** Focus an editor panel: a viewport tab, the console, the build surface, or
143
+ /** Focus an editor panel: the console, the build surface, or
223
144
  * any key the editor's static-panel registry holds — an unknown key refuses
224
145
  * naming the ones it does. */
225
146
  showPanel(name: PanelName): Promise<void>;
@@ -228,12 +149,8 @@ export declare class LiveEditor {
228
149
  /**
229
150
  * SELECT a project asset — the browser's single click, which fills the
230
151
  * Inspector without opening a document. `openAsset` is the double click.
231
- *
232
- * This is how a project's own `asset.inspector` section is reached: select
233
- * the file it matches, then `inspect()` lists the verbs that section
234
- * declares and `runAction(id)` runs one. Selecting a path nothing matches
235
- * is not an error — the Inspector shows what it has, exactly as it does
236
- * for a human.
152
+ * Selecting a path nothing matches is not an error — the Inspector shows
153
+ * what it has, exactly as it does for a human.
237
154
  */
238
155
  selectAsset(path: string): Promise<void>;
239
156
  /**
@@ -244,8 +161,8 @@ export declare class LiveEditor {
244
161
  * where it stands under the scene's own lighting, reachable from here — or
245
162
  * RAW GLB BYTES (`assetPreview({ glbBase64 }, …)`), for a model that exists
246
163
  * only in the calling Node process's memory and has never been written to
247
- * disk. `stage` defaults to `'lab'`, the neutral Asset Lab staging this has
248
- * always produced, and the bytes form is lab-only.
164
+ * disk. `stage` defaults to `'lab'`, the neutral Asset Lab staging, and the
165
+ * bytes form is lab-only.
249
166
  */
250
167
  assetPreview(source: string | AssetPreviewSource, options?: AssetPreviewOptions): Promise<AssetPreviewCapture>;
251
168
  /**
@@ -254,72 +171,22 @@ export declare class LiveEditor {
254
171
  * crops, rendered against the asset's own skeleton, with a contact sheet.
255
172
  * Every source {@link assetPreview} takes works here, GLB bytes included:
256
173
  * a shot set stages its own subject, so it needs no place to stand.
257
- *
258
- * Sole in-repo caller today: `project.bake.preview`'s `--orbit` lane.
259
174
  */
260
175
  assetPreviewShots(source: string | AssetPreviewSource, definition: AssetPreviewShotSetDefinition, options?: AssetPreviewOptions): Promise<LabeledShotSetCapture>;
261
176
  grid(on: boolean): Promise<void>;
262
177
  helpers(on: boolean): Promise<void>;
263
178
  stats(on: boolean): Promise<void>;
264
179
  shading(mode: ShadingMode): Promise<void>;
265
- /**
266
- * READ the inspector, as data — the serialized inspection subject
267
- * (`editor.inspect()`; design: `docs/ARCHITECTURE-CORE.md` §Editor chrome,
268
- * "The Inspection Model"). This is the Figma-Inspect analog: whatever a
269
- * human would see in the inspector right now — the subject's identity, its
270
- * verbs, and every identified section in display order, with a `fields`
271
- * section's CURRENT VALUES at their scriptable `path`s.
272
- *
273
- * Reach for it whenever the next step depends on what an object actually
274
- * IS: `await editor.select(id)` then `await editor.inspect()` answers "what
275
- * properties does this thing have, and what are they set to" in one call,
276
- * against the same model the panel renders — no scene-graph reads, no
277
- * guessing at property names.
278
- *
279
- * When the inspector is showing NOTHING — nothing selected on a surface
280
- * with no empty-state subject of its own, which is most of them — the answer
281
- * is `{none: true}`, so "the human sees no inspector" and "the read failed"
282
- * are never the same value. A surface whose empty space IS a real thing (an
283
- * open Asset Lab document) still answers with that subject, and never with
284
- * another surface's.
285
- *
286
- * A `custom` section body is a named opaque: the editor renders it with
287
- * React, so the wire reports its identity rather than pretending to describe
288
- * its rendering — plus, when the section can say what it DISPLAYS, a `data`
289
- * payload in its own vocabulary (`transform` carries
290
- * `{position, rotation, scale}`, rotation in Euler XYZ degrees).
291
- */
292
180
  inspect(): Promise<InspectedInspection>;
293
181
  /** Run one verb listed by `inspect().quickActions`, through the same action
294
182
  * the human Inspector button invokes. */
295
183
  runAction(actionId: string): Promise<InspectedInspection>;
296
184
  /**
297
- * Run ONE command by id — the door to everything the command palette lists.
298
- *
299
- * ONE NAME (orchestrator ruling 2026-09-19). There were briefly TWO doors
300
- * onto the one view-verb table — this one and `editor.viewVerb(view, verb)`,
301
- * which addressed the same registry by its two halves. A second addressing
302
- * of one table is a second name for one thing, and an agent reading
303
- * `--list` had to choose between them with nothing to choose on. This door
304
- * stays because it is strictly wider: it addresses a COMMAND ID, so under
305
- * the frame it reaches everything the workbench knows — a `volter.action.<id>`
306
- * editor action, one of VS Code's own — and not only a view. A VIEW is
307
- * reached by spelling its verb's command id:
308
- *
309
- * await editor.command('volter.blender-uv-view.state')
310
- * await editor.command('volter.blender-uv-view.zoom', { to: 600 })
185
+ * Run a command by id. Under the native frame this uses ICommandService and
186
+ * can invoke editor or VS Code commands. Standalone sessions resolve registered
187
+ * view verbs of the form `volter.<view>.<verb>` and refuse other ids.
311
188
  *
312
- * await editor.command('volter.blender-node-view.view-all')
313
- * await editor.command('volter.blender-node-view.look', { node: 'Principled BSDF' })
314
- *
315
- * Under the Code-OSS frame this is the workbench's own command service, so
316
- * any command id works — ours and VS Code's alike. Standalone the editor's `edit` command
317
- * has no command service and answers the `volter.<view>.<verb>` shape off the
318
- * SAME verb table the frame's commands call, refusing any other id by name.
319
- * One table, two doors, exactly like the keymap's.
320
- *
321
- * Answers with whatever the command returned — a view verb's own state, or
322
- * `null` for a command that returns nothing.
189
+ * Returns the command’s result, or `null` when it returns nothing.
323
190
  */
324
191
  command(commandId: string, args?: unknown): Promise<unknown>;
325
192
  /**
@@ -332,11 +199,6 @@ export declare class LiveEditor {
332
199
  * helpers the menu items call, so there is one implementation of each op and
333
200
  * not a second that can disagree with what a human gets.
334
201
  *
335
- * It exists because the menu is a POINTER surface: every one of these ops was
336
- * reachable only by right-clicking a hierarchy row, which is nothing an agent
337
- * can do — so for an ingest root, whose only authoring surface IS the editor,
338
- * structure was closed entirely.
339
- *
340
202
  * `id`/`ids` default to the current selection. The answer carries the same
341
203
  * per-edit `write` ack `setField` does, so `write.persisted` tells a saved
342
204
  * restructure from a live-only one. An op the active adapter does not provide
@@ -371,23 +233,14 @@ export declare class LiveEditor {
371
233
  *
372
234
  * The companion to {@link inspect}: that one answers "what IS the selected
373
235
  * thing", this one answers "what does the tree LOOK LIKE". It is the panel's
374
- * own output, not a fresh walk of the scene — the adapter's tree after the
375
- * component marks fold implementation subtrees (bones, particle renderers,
376
- * instanced pools), after the internals reveal, the document promotion, the
377
- * child cap, the collapse state, the search filter and the selection scope.
378
- *
379
- * Works in play mode and edit mode; the answer says which (`playState`,
380
- * `activeViewportTab`), because the two are different adapters and a tree
381
- * that looks wrong is very often the wrong adapter's tree.
236
+ * own projection of component marks, document promotion, child caps,
237
+ * collapse state, search and selection scope onto the adapter tree.
382
238
  *
383
239
  * Prefer this over `status().entities`, which is deliberately a different
384
240
  * question — the RAW adapter tree, unprojected. A panel that renders the
385
241
  * wrong rows looks perfectly healthy in that facet.
386
242
  *
387
- * Each row carries `childCount` (what its caret opens), `internalChildCount`
388
- * (what is folded behind "Reveal Internals") and `expandable` (whether the
389
- * panel draws a caret at all), so "this subtree exists but nothing in the UI
390
- * opens it" is a fact you can read rather than one you have to notice.
243
+ * Each row reports the projected child count and whether the panel draws a disclosure control.
391
244
  *
392
245
  * Rejects, naming the panel, when no hierarchy panel is mounted — an empty
393
246
  * tree would be a fabricated answer about a surface nobody is being shown.
@@ -0,0 +1,6 @@
1
+ /** Node session clients need explicit header deadlines for long modeling calls.
2
+ * Some runtimes supply an undici-compatible Agent without destroy(); callers
3
+ * close explicitly when that lifecycle method exists. */
4
+ import { type Dispatcher } from 'undici';
5
+ export declare function createDispatcher(timeoutMs: number): Dispatcher;
6
+ export declare function dispatchFetch(url: string, init?: RequestInit, dispatcher?: Dispatcher): Promise<Response>;
package/dist/index.d.ts CHANGED
@@ -1,17 +1,14 @@
1
1
  import { LiveEditor } from './editor.js';
2
- import { LiveTools } from './tools.js';
3
2
  import { type ResolvedSession, type SessionResolutionDeps } from './session.js';
4
3
  export { LiveEditor, inferAssetKind, type PanelName } from './editor.js';
5
4
  export { LiveEditorDocument } from './editor-document.js';
6
5
  export type { DocumentGestureOptions, DocumentKeyOptions, DocumentPasteOptions } from './editor-document.js';
7
- export { LiveTools } from './tools.js';
8
6
  export { editorMemberHint, withEditorMemberHints } from './member-hints.js';
9
- export { resolveSession, findProjectRootFrom, NO_SESSION_FOR_PROJECT } from './session.js';
7
+ export { resolveSession, findProjectRootFrom, NO_SESSION_FOR_PROJECT, SESSION_MANIFEST_UNREADABLE } from './session.js';
10
8
  export type { ResolvedSession, SessionResolutionDeps, SessionListingTransport, ProjectSessionHint } from './session.js';
11
9
  export type { ActiveDocumentCapture, EditorView, PresentedEditorView } from '@volter/sdk';
12
10
  export interface LiveBindings {
13
11
  editor: LiveEditor;
14
- tools: LiveTools;
15
12
  }
16
13
  export interface LiveSession extends LiveBindings {
17
14
  session: ResolvedSession;
@@ -21,4 +18,3 @@ export declare function unconnectedBindings(): LiveBindings;
21
18
  /** Attach only to the session serving the requested project's canonical path. */
22
19
  export declare function connect(projectDir?: string, deps?: SessionResolutionDeps): Promise<LiveSession>;
23
20
  export declare const editor: LiveEditor;
24
- export declare const tools: LiveTools;