@rool-dev/svelte 0.10.2 → 0.11.0

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/README.md CHANGED
@@ -2,9 +2,7 @@
2
2
 
3
3
  Svelte 5 bindings for Rool Spaces. Adds reactive state to the SDK using `$state` runes.
4
4
 
5
- > **Building a new Rool extension?** Start with [`@rool-dev/extension`](/extension/) it includes a reactive channel and handles hosting for you. This package is for integrating Rool into an existing Svelte application that manages its own auth, routing, and build setup.
6
-
7
- **Requires Svelte 5.** For core concepts (objects, references, AI placeholders, undo/redo), see the [SDK documentation](../sdk/README.md).
5
+ **Requires Svelte 5.** For core concepts (objects, references, AI, WebDAV files, undo/redo), see the [SDK documentation](../sdk/README.md).
8
6
 
9
7
  ## Installation
10
8
 
@@ -15,16 +13,18 @@ npm install @rool-dev/svelte
15
13
  ## Quick Start
16
14
 
17
15
  ```svelte
18
- <script>
19
- import { createRool } from '@rool-dev/svelte';
16
+ <script lang="ts">
17
+ import { createRool, type ReactiveChannel } from '@rool-dev/svelte';
20
18
 
21
19
  const rool = createRool();
22
- rool.init();
20
+ void rool.init();
23
21
 
24
- let channel = $state(null);
22
+ let channel = $state<ReactiveChannel | null>(null);
25
23
  </script>
26
24
 
27
- {#if !rool.authenticated}
25
+ {#if rool.authenticated === null}
26
+ <p>Checking session...</p>
27
+ {:else if !rool.authenticated}
28
28
  <button onclick={() => rool.login('My App')}>Login</button>
29
29
  {:else}
30
30
  <h1>My Spaces</h1>
@@ -50,14 +50,16 @@ The Svelte wrapper adds reactive state on top of the SDK:
50
50
  | Reactive Property | Description |
51
51
  |-------------------|-------------|
52
52
  | `rool.authenticated` | Auth state (`null` = checking, `true`/`false` = known) |
53
+ | `rool.currentUser` | Current user profile after authentication |
53
54
  | `rool.spaces` | List of available spaces |
54
55
  | `rool.spacesLoading` | Whether spaces are loading |
55
56
  | `rool.spacesError` | Error from loading spaces |
56
- | `rool.connectionState` | SSE connection state |
57
+ | `rool.connectionState` | Client SSE connection state |
57
58
  | `rool.userStorage` | User storage (cross-device preferences) |
58
- | `channel.interactions` | Channel interactions (auto-updates) |
59
- | `channel.objectLocations` | All object locations in the space (auto-updates on create/delete/move) |
60
- | `channel.collections` | Collection names from the schema (auto-updates) |
59
+ | `space.fileTree` | Canonical reactive WebDAV tree for `/`, including `/space` objects and `/rool-drive` user files |
60
+ | `channel.interactions` | Current conversation interactions |
61
+ | `channel.objectPaths` | Object paths derived from `space.fileTree` |
62
+ | `channel.collections` | Collection directories derived from `space.fileTree` |
61
63
  | `channel.conversations` | Conversations in this channel (auto-updates on create/delete/rename) |
62
64
  | `thread.interactions` | Interactions for a specific conversation (auto-updates) |
63
65
  | `watch.objects` | Objects matching a filter (auto-updates) |
@@ -65,6 +67,22 @@ The Svelte wrapper adds reactive state on top of the SDK:
65
67
 
66
68
  Everything else passes through to the SDK directly. See the [SDK documentation](../sdk/README.md) for full API details.
67
69
 
70
+ ### Reactive File Tree
71
+
72
+ Every `ReactiveSpace` owns a canonical reactive WebDAV tree. It is kept current with server `filesChanged`/`filesReset` events and WebDAV `sync-collection`, so it covers both object files and user files without polling.
73
+
74
+ ```ts
75
+ const space = await rool.openSpace(spaceId);
76
+
77
+ space.fileTree.nodes; // ReactiveFileNode[]
78
+ space.fileTree.byPath['/space']; // lookup by machine/WebDAV path
79
+ space.fileTree.childrenOf('/'); // /space and /rool-drive
80
+ space.fileTree.childrenOf('/rool-drive');
81
+ space.fileTree.objectPaths(); // object paths from /space/**/*.json
82
+ ```
83
+
84
+ Use this tree when UI needs to react to both files and objects. Object helpers like `channel.object()`, `channel.watch()`, `channel.objectPaths`, and `channel.collections` are backed by this tree.
85
+
68
86
  ## API
69
87
 
70
88
  ### Lifecycle
@@ -72,7 +90,7 @@ Everything else passes through to the SDK directly. See the [SDK documentation](
72
90
  ```typescript
73
91
  const rool = createRool();
74
92
 
75
- rool.init(); // Process auth callbacks (call on app startup)
93
+ void rool.init(); // Process auth callbacks (call on app startup)
76
94
  rool.login('My App'); // Redirect to login page
77
95
  rool.signup('My App'); // Redirect to signup page
78
96
  rool.verify(token); // Sign in from an email verification link (used by the official Rool app)
@@ -91,6 +109,7 @@ rool.destroy(); // Clean up all resources
91
109
  // rool.spacesError → Error | null
92
110
  // rool.connectionState → 'connected' | 'disconnected' | 'reconnecting'
93
111
  // rool.userStorage → Record<string, unknown>
112
+ // rool.currentUser → CurrentUser | null
94
113
  </script>
95
114
 
96
115
  {#if rool.spacesLoading}
@@ -109,9 +128,10 @@ rool.destroy(); // Clean up all resources
109
128
  Reactive cross-device storage for user preferences. Synced from server on `init()`, then kept up-to-date via SSE.
110
129
 
111
130
  ```svelte
112
- <script>
131
+ <script lang="ts">
132
+ import { createRool } from '@rool-dev/svelte';
113
133
  const rool = createRool();
114
- rool.init();
134
+ void rool.init();
115
135
  </script>
116
136
 
117
137
  <!-- Reactive binding to storage values -->
@@ -122,9 +142,7 @@ Reactive cross-device storage for user preferences. Synced from server on `init(
122
142
  {/if}
123
143
 
124
144
  <!-- Theme toggle -->
125
- <button onclick={() => rool.setUserStorage('theme',
126
- rool.userStorage.theme === 'dark' ? 'light' : 'dark'
127
- )}>
145
+ <button onclick={() => rool.setUserStorage('theme', rool.userStorage.theme === 'dark' ? 'light' : 'dark')}>
128
146
  Toggle theme
129
147
  </button>
130
148
  ```
@@ -161,47 +179,55 @@ space.close();
161
179
 
162
180
  ### ReactiveChannel
163
181
 
164
- `space.openChannel()` returns a `ReactiveChannel` — the SDK's `RoolChannel` with reactive `interactions` and `objectLocations`:
182
+ `space.openChannel()` returns a `ReactiveChannel` — the SDK's `RoolChannel` with reactive `interactions`, `objectPaths`, `collections`, `conversations`, and file-tree-backed object helpers:
165
183
 
166
184
  ```svelte
167
- <script>
168
- let space = $state(null);
169
- let channel = $state(null);
185
+ <script lang="ts">
186
+ import { createRool, type ReactiveChannel, type ReactiveSpace } from '@rool-dev/svelte';
187
+
188
+ const rool = createRool();
189
+ void rool.init();
190
+
191
+ let space = $state<ReactiveSpace | null>(null);
192
+ let channel = $state<ReactiveChannel | null>(null);
170
193
 
171
- async function open(spaceId) {
194
+ async function open(spaceId: string) {
172
195
  space = await rool.openSpace(spaceId);
173
196
  channel = await space.openChannel('main');
174
197
  }
175
198
  </script>
176
199
 
177
200
  {#if channel}
178
- <!-- Reactive: updates as AI makes tool calls -->
201
+ <!-- Reactive: updates when the current conversation changes -->
179
202
  {#each channel.interactions as interaction}
180
203
  <div>
181
- <strong>{interaction.operation}</strong>: {interaction.output}
204
+ <strong>{interaction.operation}</strong>: {interaction.output ?? ''}
182
205
  </div>
183
206
  {/each}
184
207
 
185
208
  <!-- All SDK methods work directly -->
186
- <button onclick={() => channel.prompt('Hello')}>Send</button>
209
+ <button onclick={() => void channel.prompt('Hello')}>Send</button>
187
210
  {/if}
188
211
  ```
189
212
 
190
213
  ### Reactive Object
191
214
 
192
- Track a single object by location with auto-updates:
215
+ Track a single object by machine path with auto-updates:
193
216
 
194
217
  ```svelte
195
- <script>
196
- let channel = $state(null);
197
- let item = $state(null);
218
+ <script lang="ts">
219
+ import { createRool, type ReactiveChannel, type ReactiveObject } from '@rool-dev/svelte';
198
220
 
199
- let space = $state(null);
221
+ const rool = createRool();
222
+ void rool.init();
200
223
 
201
- async function open(spaceId, location) {
202
- space = await rool.openSpace(spaceId);
224
+ let channel = $state<ReactiveChannel | null>(null);
225
+ let item = $state<ReactiveObject | null>(null);
226
+
227
+ async function open(spaceId: string, path: string) {
228
+ const space = await rool.openSpace(spaceId);
203
229
  channel = await space.openChannel('main');
204
- item = channel.object(location); // e.g. '/space/article/welcome.json'
230
+ item = channel.object(path); // e.g. '/space/article/welcome.json'
205
231
  }
206
232
  </script>
207
233
 
@@ -209,7 +235,7 @@ Track a single object by location with auto-updates:
209
235
  {#if item.loading}
210
236
  <p>Loading...</p>
211
237
  {:else if item.data}
212
- <div>{item.data.body.title}</div>
238
+ <div>{String(item.data.body.title ?? '')}</div>
213
239
  {:else}
214
240
  <p>Object not found</p>
215
241
  {/if}
@@ -233,13 +259,16 @@ item.close() // Stop listening for updates
233
259
  Create auto-updating watches of objects filtered by field values:
234
260
 
235
261
  ```svelte
236
- <script>
237
- let channel = $state(null);
238
- let articles = $state(null);
262
+ <script lang="ts">
263
+ import { createRool, type ReactiveChannel, type ReactiveSpace, type ReactiveWatch } from '@rool-dev/svelte';
239
264
 
240
- let space = $state(null);
265
+ const rool = createRool();
266
+ void rool.init();
241
267
 
242
- async function open(spaceId) {
268
+ let space = $state<ReactiveSpace | null>(null);
269
+ let channel = $state<ReactiveChannel | null>(null);
270
+ let articles = $state<ReactiveWatch | null>(null);
271
+ async function open(spaceId: string) {
243
272
  space = await rool.openSpace(spaceId);
244
273
  channel = await space.openChannel('main');
245
274
  // Create a reactive watch of all objects in the 'article' collection
@@ -252,18 +281,18 @@ Create auto-updating watches of objects filtered by field values:
252
281
  <p>Loading...</p>
253
282
  {:else}
254
283
  {#each articles.objects as article}
255
- <div>{article.body.title}</div>
284
+ <div>{String(article.body.title ?? '')}</div>
256
285
  {/each}
257
286
  {/if}
258
287
  {/if}
259
288
  ```
260
289
 
261
- Watches automatically re-fetch when objects matching the filter are created, updated, or deleted. Since the SDK caches objects locally, re-fetches are typically instant (no network round-trip).
290
+ Watches automatically re-fetch when matching object files change in `space.fileTree`.
262
291
 
263
292
  **Lifecycle:** Watches are tied to their channel. Closing the channel stops all updates — existing watches will retain their last data but no longer refresh. Calling `channel.watch()` after `close()` throws.
264
293
 
265
294
  ```typescript
266
- // Watch options (same as findObjects, but no AI prompt)
295
+ // Watch options
267
296
  const articles = channel.watch({
268
297
  collection: 'article',
269
298
  where: { status: 'published' },
@@ -282,36 +311,51 @@ articles.close() // Stop listening for updates
282
311
 
283
312
  ### Reactive Channel List
284
313
 
285
- `space.channels` is a reactive `ChannelInfo[]` that auto-updates as channels are created, renamed, or deleted.
314
+ `space.channels` is a reactive `ChannelInfo[]` on an opened `ReactiveSpace`. If you only need a live channel list without managing a `ReactiveSpace`, use `rool.channels(spaceId)` and call `close()` when done.
286
315
 
287
316
  ```svelte
288
- <script>
289
- let space = $state(null);
317
+ <script lang="ts">
318
+ import { createRool, type ReactiveSpace } from '@rool-dev/svelte';
319
+
320
+ const rool = createRool();
321
+ void rool.init();
290
322
 
291
- async function open(spaceId) {
323
+ let space = $state<ReactiveSpace | null>(null);
324
+ async function open(spaceId: string) {
292
325
  space = await rool.openSpace(spaceId);
293
326
  }
294
327
  </script>
295
328
 
296
329
  {#if space}
297
330
  {#each space.channels as ch}
298
- <button onclick={() => space.openChannel(ch.id)}>{ch.name ?? ch.id}</button>
331
+ <button onclick={() => void space.openChannel(ch.id)}>{ch.name ?? ch.id}</button>
299
332
  {/each}
300
333
  {/if}
301
334
  ```
302
335
 
336
+ ```typescript
337
+ const channels = rool.channels(spaceId);
338
+ channels.list; // ChannelInfo[]
339
+ channels.loading; // boolean
340
+ await channels.refresh();
341
+ channels.close();
342
+ ```
343
+
303
344
  ### Reactive Conversation Handle
304
345
 
305
346
  For apps with multiple independent interaction threads (e.g., chat with threads), use `channel.conversation()` to get a handle with reactive interactions:
306
347
 
307
348
  ```svelte
308
- <script>
309
- let channel = $state(null);
310
- let thread = $state(null);
349
+ <script lang="ts">
350
+ import { createRool, type ReactiveChannel, type ReactiveConversationHandle, type ReactiveSpace } from '@rool-dev/svelte';
311
351
 
312
- let space = $state(null);
352
+ const rool = createRool();
353
+ void rool.init();
313
354
 
314
- async function openThread(spaceId, threadId) {
355
+ let space = $state<ReactiveSpace | null>(null);
356
+ let channel = $state<ReactiveChannel | null>(null);
357
+ let thread = $state<ReactiveConversationHandle | null>(null);
358
+ async function openThread(spaceId: string, threadId: string) {
315
359
  space = await rool.openSpace(spaceId);
316
360
  channel = await space.openChannel('main');
317
361
  thread = channel.conversation(threadId);
@@ -323,17 +367,18 @@ For apps with multiple independent interaction threads (e.g., chat with threads)
323
367
  <div>{interaction.output}</div>
324
368
  {/each}
325
369
 
326
- <button onclick={() => thread.prompt('Hello')}>Send</button>
370
+ <button onclick={() => void thread.prompt('Hello')}>Send</button>
327
371
  {/if}
328
372
  ```
329
373
 
330
374
  ```typescript
331
375
  // Reactive state
332
- thread.interactions // $state<Interaction[]> — auto-updates via SSE
376
+ thread.interactions // $state<Interaction[]> — updates from space/channel events
333
377
 
334
- // All conversation-scoped methods
378
+ // Conversation-scoped methods
335
379
  await thread.prompt('Hello')
336
- await thread.createObject('note', { text: 'Note' })
380
+ await thread.putObject('/space/note/welcome.json', { text: 'Note' })
381
+ await thread.patchObject('/space/note/welcome.json', { data: { text: 'Updated' } })
337
382
  await thread.setSystemInstruction('Respond in haiku')
338
383
  await thread.rename('Research Thread')
339
384
  thread.getInteractions() // Manual read
@@ -343,7 +388,7 @@ thread.getSystemInstruction()
343
388
  thread.close() // Stop listening for updates
344
389
  ```
345
390
 
346
- Conversations are auto-created on first interaction. All conversations share one SSE connection per channel.
391
+ Conversations are auto-created when you first write history or settings. Real-time events are owned by the space subscription; conversation handles subscribe to channel events locally.
347
392
 
348
393
  ### Channel Management
349
394
 
@@ -369,14 +414,13 @@ channel.name
369
414
  channel.role
370
415
  channel.channelId
371
416
 
372
- // Object operations — addressed by location (`/space/<collection>/<basename>.json`)
373
- await channel.getObject(location)
374
- await channel.createObject('note', { text: 'Hello' })
375
- await channel.createObject('note', { text: 'Hello' }, { basename: 'welcome' })
376
- await channel.updateObject(location, { data: { text: 'Updated' } })
377
- await channel.moveObject(from, to)
378
- await channel.deleteObjects([location])
379
- await channel.findObjects({ collection: 'note' })
417
+ // Object operations — addressed by exact machine paths
418
+ const path = '/space/note/welcome.json';
419
+ await channel.getObject(path)
420
+ await channel.putObject(path, { text: 'Hello' })
421
+ await channel.patchObject(path, { data: { text: 'Updated' } })
422
+ await channel.moveObject(path, '/space/note/renamed.json')
423
+ await channel.deleteObjects(['/space/note/renamed.json'])
380
424
 
381
425
  // AI
382
426
  await channel.prompt('Summarize everything')
@@ -387,7 +431,7 @@ await channel.createCollection('article', [
387
431
  { name: 'title', type: { kind: 'string' } },
388
432
  { name: 'status', type: { kind: 'enum', values: ['draft', 'published'] } },
389
433
  ])
390
- await channel.alterCollection('article', [...updatedProps])
434
+ await channel.alterCollection('article', updatedFields)
391
435
  await channel.dropCollection('article')
392
436
 
393
437
  // Undo/Redo
@@ -405,7 +449,7 @@ await channel.renameConversation('Research')
405
449
  // Conversation handles (reactive interactions for specific conversations)
406
450
  const thread = channel.conversation('thread-42');
407
451
  await thread.prompt('Hello'); // Uses thread-42's interaction history
408
- // thread.interactions is reactive $state — auto-updates via SSE
452
+ // thread.interactions is reactive $state — updates from space/channel events
409
453
  thread.close(); // Stop listening when done
410
454
 
411
455
  // Channel admin
@@ -417,22 +461,23 @@ See the [SDK documentation](../sdk/README.md) for complete API details.
417
461
  ### Utilities
418
462
 
419
463
  ```typescript
420
- import { generateBasename, loc, parseLocation, normalizeLocation } from '@rool-dev/svelte';
464
+ import { machinePath, machineUri, isObjectPath, generateId } from '@rool-dev/svelte';
421
465
 
422
- // 6-character alphanumeric basename
423
- const basename = generateBasename();
466
+ machinePath('rool-machine:/rool-drive/docs/read%20me.md');
467
+ // '/rool-drive/docs/read me.md'
424
468
 
425
- // Build / parse location strings
426
- const location = loc('article', basename); // '/space/article/<basename>.json'
427
- const parts = parseLocation(location); // { collection, basename }
428
- const canonical = normalizeLocation('article/welcome'); // '/space/article/welcome.json'
469
+ machineUri('/space/article/welcome.json');
470
+ // 'rool-machine:/space/article/welcome.json'
471
+
472
+ isObjectPath('/space/article/welcome.json'); // true
473
+ generateId(); // 6-character alphanumeric ID
429
474
  ```
430
475
 
431
476
  ## Exported Types
432
477
 
433
478
  ```typescript
434
479
  // Package types
435
- import type { Rool, ReactiveChannel, ReactiveConversationHandle, ReactiveObject, ReactiveWatch, WatchOptions, ReactiveChannelList } from '@rool-dev/svelte';
480
+ import type { Rool, ReactiveSpace, ReactiveChannel, ReactiveConversationHandle, ReactiveObject, ReactiveWatch, WatchOptions, ReactiveChannelList, ReactiveFileTree, ReactiveFileNode, ReactiveFileRoot, ReactiveFileTreeEvent, ReactiveFileTreeSyncResult } from '@rool-dev/svelte';
436
481
 
437
482
  // Re-exported from @rool-dev/sdk
438
483
  import type {
@@ -442,6 +487,7 @@ import type {
442
487
  RoolSpace,
443
488
  RoolSpaceInfo,
444
489
  RoolObject,
490
+ GetObjectsResult,
445
491
  RoolObjectStat,
446
492
  RoolUserRole,
447
493
  ConnectionState,
@@ -450,30 +496,27 @@ import type {
450
496
  ConversationInfo,
451
497
  CurrentUser,
452
498
  Interaction,
453
- FindObjectsOptions,
454
499
  PromptOptions,
455
- CreateObjectOptions,
500
+ PromptAttachment,
456
501
  UpdateObjectOptions,
457
502
  MoveObjectOptions,
503
+ CollectionOptions,
458
504
  FieldType,
459
505
  FieldDef,
460
506
  CollectionDef,
461
507
  SpaceSchema,
462
508
  SpaceMember,
463
509
  UserResult,
464
- PublishedExtensionInfo,
465
- PublishExtensionOptions,
466
- ExtensionManifest,
467
- FindExtensionsOptions,
468
-
510
+ SpaceFileStorageUsage,
511
+ RoolSpaceEvents,
512
+ WebDAVDepth,
513
+ WebDAVSyncLevel,
514
+ WebDAVPropName,
515
+ WebDAVResponse,
516
+ WebDAVProps,
469
517
  } from '@rool-dev/svelte';
470
518
  ```
471
519
 
472
- ## Examples
473
-
474
- - [soft-sql](../../examples/soft-sql) — SQL-style natural language queries with live tool call progress
475
- - [flashcards](../../examples/flashcards) — Spaced repetition with AI-generated cards
476
-
477
520
  ## License
478
521
 
479
522
  MIT - see [LICENSE](../../LICENSE) for details.
@@ -1,7 +1,8 @@
1
1
  import type { RoolChannel, RoolSpace, Interaction, RoolObject, ChannelInfo, ConversationInfo, ConversationHandle } from '@rool-dev/sdk';
2
+ import { ReactiveFileTree } from './file-tree.svelte.js';
2
3
  /**
3
4
  * Options for creating a reactive watch.
4
- * Same as FindObjectsOptions but without `prompt` (AI queries are too slow for reactive updates).
5
+ * Structured object filter for reactive updates.
5
6
  */
6
7
  export interface WatchOptions {
7
8
  /** Field requirements for exact matching */
@@ -14,16 +15,14 @@ export interface WatchOptions {
14
15
  order?: 'asc' | 'desc';
15
16
  }
16
17
  /**
17
- * A reactive watch of objects that auto-updates when matching objects change.
18
+ * A reactive watch of objects that auto-updates when matching object files change.
18
19
  */
19
20
  declare class ReactiveWatchImpl {
20
21
  #private;
21
22
  objects: RoolObject[];
22
23
  loading: boolean;
23
- constructor(channel: RoolChannel, options: WatchOptions);
24
- /**
25
- * Re-fetch the watched objects from the channel.
26
- */
24
+ constructor(channel: RoolChannel, fileTree: ReactiveFileTree, options: WatchOptions);
25
+ /** Re-fetch matching objects using the canonical file tree for paths. */
27
26
  refresh(): Promise<void>;
28
27
  close(): void;
29
28
  }
@@ -35,7 +34,7 @@ declare class ReactiveObjectImpl {
35
34
  #private;
36
35
  data: RoolObject | undefined;
37
36
  loading: boolean;
38
- constructor(channel: RoolChannel, location: string);
37
+ constructor(channel: RoolChannel, fileTree: ReactiveFileTree, path: string);
39
38
  refresh(): Promise<void>;
40
39
  close(): void;
41
40
  }
@@ -52,15 +51,11 @@ declare class ReactiveConversationHandleImpl {
52
51
  getSystemInstruction(): string | undefined;
53
52
  setSystemInstruction(...args: Parameters<ConversationHandle['setSystemInstruction']>): Promise<void>;
54
53
  rename(...args: Parameters<ConversationHandle['rename']>): Promise<void>;
55
- findObjects(...args: Parameters<ConversationHandle['findObjects']>): Promise<{
56
- objects: RoolObject[];
57
- message: string;
58
- }>;
59
- createObject(...args: Parameters<ConversationHandle['createObject']>): Promise<{
54
+ putObject(...args: Parameters<ConversationHandle['putObject']>): Promise<{
60
55
  object: RoolObject;
61
56
  message: string;
62
57
  }>;
63
- updateObject(...args: Parameters<ConversationHandle['updateObject']>): Promise<{
58
+ patchObject(...args: Parameters<ConversationHandle['patchObject']>): Promise<{
64
59
  object: RoolObject;
65
60
  message: string;
66
61
  }>;
@@ -69,6 +64,8 @@ declare class ReactiveConversationHandleImpl {
69
64
  message: string;
70
65
  }>;
71
66
  deleteObjects(...args: Parameters<ConversationHandle['deleteObjects']>): Promise<void>;
67
+ /** @deprecated Use deleteObjects instead. */
68
+ deletePaths(...args: Parameters<ConversationHandle['deletePaths']>): Promise<void>;
72
69
  prompt(...args: Parameters<ConversationHandle['prompt']>): Promise<{
73
70
  message: string;
74
71
  objects: RoolObject[];
@@ -87,10 +84,10 @@ export type ReactiveConversationHandle = ReactiveConversationHandleImpl;
87
84
  declare class ReactiveChannelImpl {
88
85
  #private;
89
86
  interactions: Interaction[];
90
- objectLocations: string[];
87
+ objectPaths: string[];
91
88
  collections: string[];
92
89
  conversations: ConversationInfo[];
93
- constructor(channel: RoolChannel);
90
+ constructor(channel: RoolChannel, fileTree: ReactiveFileTree);
94
91
  get id(): string;
95
92
  get name(): string;
96
93
  get role(): import("@rool-dev/sdk").RoolUserRole;
@@ -99,22 +96,16 @@ declare class ReactiveChannelImpl {
99
96
  get channelName(): string | null;
100
97
  get isReadOnly(): boolean;
101
98
  get linkAccess(): import("@rool-dev/sdk").LinkAccess;
102
- get extensionUrl(): string | null;
103
- get manifest(): import("@rool-dev/sdk").ExtensionManifest | null;
104
99
  get isClosed(): boolean;
105
100
  close(): void;
106
101
  getObject(...args: Parameters<RoolChannel['getObject']>): Promise<RoolObject | undefined>;
102
+ getObjects(...args: Parameters<RoolChannel['getObjects']>): Promise<import("@rool-dev/sdk").GetObjectsResult>;
107
103
  stat(...args: Parameters<RoolChannel['stat']>): import("@rool-dev/sdk").RoolObjectStat | undefined;
108
- findObjects(...args: Parameters<RoolChannel['findObjects']>): Promise<{
109
- objects: RoolObject[];
110
- message: string;
111
- }>;
112
- getObjectLocations(...args: Parameters<RoolChannel['getObjectLocations']>): string[];
113
- createObject(...args: Parameters<RoolChannel['createObject']>): Promise<{
104
+ putObject(...args: Parameters<RoolChannel['putObject']>): Promise<{
114
105
  object: RoolObject;
115
106
  message: string;
116
107
  }>;
117
- updateObject(...args: Parameters<RoolChannel['updateObject']>): Promise<{
108
+ patchObject(...args: Parameters<RoolChannel['patchObject']>): Promise<{
118
109
  object: RoolObject;
119
110
  message: string;
120
111
  }>;
@@ -123,6 +114,8 @@ declare class ReactiveChannelImpl {
123
114
  message: string;
124
115
  }>;
125
116
  deleteObjects(...args: Parameters<RoolChannel['deleteObjects']>): Promise<void>;
117
+ /** @deprecated Use deleteObjects instead. */
118
+ deletePaths(...args: Parameters<RoolChannel['deletePaths']>): Promise<void>;
126
119
  prompt(...args: Parameters<RoolChannel['prompt']>): Promise<{
127
120
  message: string;
128
121
  objects: RoolObject[];
@@ -155,15 +148,15 @@ declare class ReactiveChannelImpl {
155
148
  on(...args: Parameters<RoolChannel['on']>): () => void;
156
149
  off(...args: Parameters<RoolChannel['off']>): void;
157
150
  /**
158
- * Create a reactive object that auto-updates when the object at this location changes.
151
+ * Create a reactive object that auto-updates when the object at this path changes.
159
152
  */
160
- object(location: string): ReactiveObject;
153
+ object(path: string): ReactiveObject;
161
154
  /**
162
155
  * Create a reactive watch that auto-updates when matching objects change.
163
156
  */
164
157
  watch(options: WatchOptions): ReactiveWatch;
165
158
  }
166
- export declare function wrapChannel(channel: RoolChannel): ReactiveChannel;
159
+ export declare function wrapChannel(channel: RoolChannel, fileTree: ReactiveFileTree): ReactiveChannel;
167
160
  export type ReactiveChannel = ReactiveChannelImpl;
168
161
  /**
169
162
  * A reactive list of channels for a space that auto-updates via SSE events.
@@ -1 +1 @@
1
- {"version":3,"file":"channel.svelte.d.ts","sourceRoot":"","sources":["../src/channel.svelte.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channel.svelte.d.ts","sourceRoot":"","sources":["../src/channel.svelte.ts"],"names":[],"mappings":"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"}