@rool-dev/svelte 0.2.0 → 0.3.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
@@ -19,7 +19,7 @@ npm install @rool-dev/svelte
19
19
  const rool = createRool();
20
20
  rool.init();
21
21
 
22
- let currentSpace = $state(null);
22
+ let channel = $state(null);
23
23
  </script>
24
24
 
25
25
  {#if !rool.authenticated}
@@ -27,13 +27,13 @@ npm install @rool-dev/svelte
27
27
  {:else}
28
28
  <h1>My Spaces</h1>
29
29
  {#each rool.spaces ?? [] as space}
30
- <button onclick={async () => currentSpace = await rool.openSpace(space.id)}>
30
+ <button onclick={async () => channel = await rool.openChannel(space.id, 'main')}>
31
31
  {space.name}
32
32
  </button>
33
33
  {/each}
34
34
 
35
- {#if currentSpace}
36
- <p>Interactions: {currentSpace.interactions.length}</p>
35
+ {#if channel}
36
+ <p>Interactions: {channel.interactions.length}</p>
37
37
  {/if}
38
38
  {/if}
39
39
  ```
@@ -50,9 +50,9 @@ The Svelte wrapper adds reactive state on top of the SDK:
50
50
  | `rool.spacesError` | Error from loading spaces |
51
51
  | `rool.connectionState` | SSE connection state |
52
52
  | `rool.userStorage` | User storage (cross-device preferences) |
53
- | `space.interactions` | Conversation interactions (auto-updates) |
54
- | `collection.objects` | Objects matching a filter (auto-updates) |
55
- | `collection.loading` | Whether collection is loading |
53
+ | `channel.interactions` | Channel interactions (auto-updates) |
54
+ | `watch.objects` | Objects matching a filter (auto-updates) |
55
+ | `watch.loading` | Whether watch is loading |
56
56
 
57
57
  Everything else passes through to the SDK directly. See the [SDK documentation](../sdk/README.md) for full API details.
58
58
 
@@ -65,7 +65,7 @@ const rool = createRool();
65
65
 
66
66
  rool.init(); // Process auth callbacks (call on app startup)
67
67
  rool.login('My App'); // Redirect to login page
68
- rool.logout(); // Clear auth state and close all spaces
68
+ rool.logout(); // Clear auth state and close all channels
69
69
  rool.destroy(); // Clean up all resources
70
70
  ```
71
71
 
@@ -118,60 +118,108 @@ Reactive cross-device storage for user preferences. Synced from server on `init(
118
118
  </button>
119
119
  ```
120
120
 
121
- ### Opening Spaces
121
+ ### Spaces & Channels
122
122
 
123
123
  ```typescript
124
- const space = await rool.openSpace('space-id');
125
- const space = await rool.openSpace('space-id', { conversationId: 'my-convo' });
124
+ // Open a channel — reactive, with SSE
125
+ const channel = await rool.openChannel('space-id', 'my-channel');
126
+
127
+ // Create a space, then open a channel on it
126
128
  const space = await rool.createSpace('My New Space');
129
+ const channel = await space.openChannel('main');
130
+
131
+ // Open a space for admin operations (lightweight, no SSE)
132
+ const space = await rool.openSpace('space-id');
133
+ await space.rename('New Name');
134
+ await space.addUser(userId, 'editor');
127
135
 
128
- // Multiple spaces can be open at once
129
- const spaceA = await rool.openSpace('space-a');
130
- const spaceB = await rool.openSpace('space-b');
136
+ // Delete a space
137
+ await rool.deleteSpace('space-id');
138
+
139
+ // Import a space from a zip archive
140
+ const space = await rool.importArchive('Imported', archiveBlob);
131
141
 
132
142
  // Clean up
133
- space.close();
143
+ channel.close();
134
144
  ```
135
145
 
136
- ### ReactiveSpace
146
+ ### ReactiveChannel
137
147
 
138
- `openSpace` and `createSpace` return a `ReactiveSpace` — the SDK's `RoolSpace` with reactive `interactions`:
148
+ `openChannel` returns a `ReactiveChannel` — the SDK's `RoolChannel` with reactive `interactions`:
139
149
 
140
150
  ```svelte
141
151
  <script>
142
- let space = $state(null);
152
+ let channel = $state(null);
143
153
 
144
- async function open(id) {
145
- space = await rool.openSpace(id);
154
+ async function open(spaceId) {
155
+ channel = await rool.openChannel(spaceId, 'main');
146
156
  }
147
157
  </script>
148
158
 
149
- {#if space}
159
+ {#if channel}
150
160
  <!-- Reactive: updates as AI makes tool calls -->
151
- {#each space.interactions as interaction}
161
+ {#each channel.interactions as interaction}
152
162
  <div>
153
163
  <strong>{interaction.operation}</strong>: {interaction.output}
154
164
  </div>
155
165
  {/each}
156
166
 
157
167
  <!-- All SDK methods work directly -->
158
- <button onclick={() => space.prompt('Hello')}>Send</button>
168
+ <button onclick={() => channel.prompt('Hello')}>Send</button>
159
169
  {/if}
160
170
  ```
161
171
 
162
- ### Reactive Collections
172
+ ### Reactive Object
163
173
 
164
- Create auto-updating collections of objects filtered by field values:
174
+ Track a single object by ID with auto-updates:
165
175
 
166
176
  ```svelte
167
177
  <script>
168
- let space = $state(null);
178
+ let channel = $state(null);
179
+ let item = $state(null);
180
+
181
+ async function open(spaceId, objectId) {
182
+ channel = await rool.openChannel(spaceId, 'main');
183
+ item = channel.object(objectId);
184
+ }
185
+ </script>
186
+
187
+ {#if item}
188
+ {#if item.loading}
189
+ <p>Loading...</p>
190
+ {:else if item.data}
191
+ <div>{item.data.title}</div>
192
+ {:else}
193
+ <p>Object not found</p>
194
+ {/if}
195
+ {/if}
196
+ ```
197
+
198
+ ```typescript
199
+ // Reactive state
200
+ item.data // $state<RoolObject | undefined>
201
+ item.loading // $state<boolean>
202
+
203
+ // Methods
204
+ item.refresh() // Manual re-fetch
205
+ item.close() // Stop listening for updates
206
+ ```
207
+
208
+ **Lifecycle:** Reactive objects are tied to their channel. Closing the channel stops all updates — existing reactive objects will retain their last data but no longer refresh. Calling `channel.object()` after `close()` throws.
209
+
210
+ ### Reactive Watches
211
+
212
+ Create auto-updating watches of objects filtered by field values:
213
+
214
+ ```svelte
215
+ <script>
216
+ let channel = $state(null);
169
217
  let articles = $state(null);
170
218
 
171
- async function open(id) {
172
- space = await rool.openSpace(id);
173
- // Create a reactive collection of all objects where type === 'article'
174
- articles = space.collection({ where: { type: 'article' } });
219
+ async function open(spaceId) {
220
+ channel = await rool.openChannel(spaceId, 'main');
221
+ // Create a reactive watch of all objects where type === 'article'
222
+ articles = channel.watch({ where: { type: 'article' } });
175
223
  }
176
224
  </script>
177
225
 
@@ -186,11 +234,13 @@ Create auto-updating collections of objects filtered by field values:
186
234
  {/if}
187
235
  ```
188
236
 
189
- Collections 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).
237
+ 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).
238
+
239
+ **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.
190
240
 
191
241
  ```typescript
192
- // Collection options (same as findObjects, but no AI prompt)
193
- const articles = space.collection({
242
+ // Watch options (same as findObjects, but no AI prompt)
243
+ const articles = channel.watch({
194
244
  where: { type: 'article', status: 'published' },
195
245
  order: 'desc', // by modifiedAt (default)
196
246
  limit: 20,
@@ -205,36 +255,92 @@ articles.refresh() // Manual re-fetch
205
255
  articles.close() // Stop listening for updates
206
256
  ```
207
257
 
258
+ ### Reactive Channel List
259
+
260
+ List channels for a space with auto-updates:
261
+
262
+ ```svelte
263
+ <script>
264
+ const channelList = rool.channels('space-id');
265
+
266
+ // Clean up when done
267
+ import { onDestroy } from 'svelte';
268
+ onDestroy(() => channelList.close());
269
+ </script>
270
+
271
+ {#if channelList.loading}
272
+ <p>Loading channels...</p>
273
+ {:else}
274
+ {#each channelList.list as ch}
275
+ <button onclick={() => openChannel(ch.id)}>{ch.name ?? ch.id}</button>
276
+ {/each}
277
+ {/if}
278
+ ```
279
+
280
+ ```typescript
281
+ // Reactive state
282
+ channelList.list // $state<ChannelInfo[]>
283
+ channelList.loading // $state<boolean>
284
+
285
+ // Methods
286
+ channelList.refresh() // Manual re-fetch
287
+ channelList.close() // Stop listening for updates
288
+ ```
289
+
290
+ ### Channel Management
291
+
292
+ ```typescript
293
+ // Rename a channel (thin GraphQL call, no SSE needed)
294
+ await rool.renameChannel('space-id', 'channel-id', 'New Name');
295
+
296
+ // Delete a channel
297
+ await rool.deleteChannel('space-id', 'channel-id');
298
+
299
+ // Rename from within a channel
300
+ await channel.rename('New Name');
301
+ ```
302
+
208
303
  ### Using the SDK
209
304
 
210
- All `RoolSpace` methods and properties are available on `ReactiveSpace`:
305
+ All `RoolChannel` methods and properties are available on `ReactiveChannel`:
211
306
 
212
307
  ```typescript
213
308
  // Properties
214
- space.id
215
- space.name
216
- space.role
217
- space.conversationId
309
+ channel.id
310
+ channel.name
311
+ channel.role
312
+ channel.channelId
218
313
 
219
314
  // Object operations
220
- await space.getObject(id)
221
- await space.createObject({ data: { type: 'note', text: 'Hello' } })
222
- await space.updateObject(id, { data: { text: 'Updated' } })
223
- await space.deleteObjects([id])
224
- await space.findObjects({ where: { type: 'note' } })
315
+ await channel.getObject(id)
316
+ await channel.createObject({ data: { type: 'note', text: 'Hello' } })
317
+ await channel.updateObject(id, { data: { text: 'Updated' } })
318
+ await channel.deleteObjects([id])
319
+ await channel.findObjects({ where: { type: 'note' } })
225
320
 
226
321
  // AI
227
- await space.prompt('Summarize everything')
322
+ await channel.prompt('Summarize everything')
323
+
324
+ // Schema
325
+ channel.getSchema()
326
+ await channel.createCollection('article', [
327
+ { name: 'title', type: { kind: 'string' } },
328
+ { name: 'status', type: { kind: 'enum', values: ['draft', 'published'] } },
329
+ ])
330
+ await channel.alterCollection('article', [...updatedProps])
331
+ await channel.dropCollection('article')
228
332
 
229
333
  // Undo/Redo
230
- await space.checkpoint('Before edit')
231
- await space.undo()
232
- await space.redo()
233
-
234
- // Conversations
235
- await space.setSystemInstruction('You are helpful')
236
- await space.renameConversation('id', 'Research')
237
- space.getInteractions()
334
+ await channel.checkpoint('Before edit')
335
+ await channel.undo()
336
+ await channel.redo()
337
+
338
+ // Interaction history
339
+ await channel.setSystemInstruction('You are helpful')
340
+ channel.getInteractions()
341
+
342
+ // Channel admin
343
+ await channel.rename('New Name')
238
344
  ```
239
345
 
240
346
  See the [SDK documentation](../sdk/README.md) for complete API details.
@@ -252,21 +358,26 @@ const id = generateId();
252
358
 
253
359
  ```typescript
254
360
  // Package types
255
- import type { Rool, ReactiveSpace, ReactiveCollection, CollectionOptions } from '@rool-dev/svelte';
361
+ import type { Rool, ReactiveChannel, ReactiveObject, ReactiveWatch, WatchOptions, ReactiveChannelList } from '@rool-dev/svelte';
256
362
 
257
363
  // Re-exported from @rool-dev/sdk
258
364
  import type {
365
+ RoolChannel,
259
366
  RoolSpace,
260
367
  RoolSpaceInfo,
261
368
  RoolObject,
262
369
  RoolUserRole,
263
370
  ConnectionState,
264
- ConversationInfo,
371
+ ChannelInfo,
265
372
  Interaction,
266
373
  FindObjectsOptions,
267
374
  PromptOptions,
268
375
  CreateObjectOptions,
269
376
  UpdateObjectOptions,
377
+ FieldType,
378
+ FieldDef,
379
+ CollectionDef,
380
+ SpaceSchema,
270
381
  } from '@rool-dev/svelte';
271
382
  ```
272
383
 
@@ -0,0 +1,143 @@
1
+ import type { RoolChannel, RoolClient, Interaction, RoolObject, ChannelInfo } from '@rool-dev/sdk';
2
+ /**
3
+ * Options for creating a reactive watch.
4
+ * Same as FindObjectsOptions but without `prompt` (AI queries are too slow for reactive updates).
5
+ */
6
+ export interface WatchOptions {
7
+ /** Field requirements for exact matching */
8
+ where?: Record<string, unknown>;
9
+ /** Maximum number of objects */
10
+ limit?: number;
11
+ /** Sort order by modifiedAt: 'asc' or 'desc' (default: 'desc') */
12
+ order?: 'asc' | 'desc';
13
+ }
14
+ /**
15
+ * A reactive watch of objects that auto-updates when matching objects change.
16
+ */
17
+ declare class ReactiveWatchImpl {
18
+ #private;
19
+ objects: RoolObject[];
20
+ loading: boolean;
21
+ constructor(channel: RoolChannel, options: WatchOptions);
22
+ /**
23
+ * Re-fetch the watched objects from the channel.
24
+ */
25
+ refresh(): Promise<void>;
26
+ /**
27
+ * Stop listening for updates and clean up.
28
+ */
29
+ close(): void;
30
+ }
31
+ export type ReactiveWatch = ReactiveWatchImpl;
32
+ /**
33
+ * A reactive single object that auto-updates when the object changes.
34
+ */
35
+ declare class ReactiveObjectImpl {
36
+ #private;
37
+ data: RoolObject | undefined;
38
+ loading: boolean;
39
+ constructor(channel: RoolChannel, objectId: string);
40
+ /**
41
+ * Re-fetch the object from the channel.
42
+ */
43
+ refresh(): Promise<void>;
44
+ /**
45
+ * Stop listening for updates and clean up.
46
+ */
47
+ close(): void;
48
+ }
49
+ export type ReactiveObject = ReactiveObjectImpl;
50
+ /**
51
+ * Minimal wrapper that adds reactive `interactions` to RoolChannel.
52
+ * All other properties and methods are proxied to the underlying channel.
53
+ */
54
+ declare class ReactiveChannelImpl {
55
+ #private;
56
+ interactions: Interaction[];
57
+ constructor(channel: RoolChannel);
58
+ get id(): string;
59
+ get name(): string;
60
+ get role(): import("@rool-dev/sdk").RoolUserRole;
61
+ get userId(): string;
62
+ get channelId(): string;
63
+ get isReadOnly(): boolean;
64
+ get linkAccess(): import("@rool-dev/sdk").LinkAccess;
65
+ close(): void;
66
+ getObject(...args: Parameters<RoolChannel['getObject']>): Promise<RoolObject | undefined>;
67
+ stat(...args: Parameters<RoolChannel['stat']>): import("@rool-dev/sdk").RoolObjectStat | undefined;
68
+ findObjects(...args: Parameters<RoolChannel['findObjects']>): Promise<{
69
+ objects: RoolObject[];
70
+ message: string;
71
+ }>;
72
+ getObjectIds(...args: Parameters<RoolChannel['getObjectIds']>): string[];
73
+ createObject(...args: Parameters<RoolChannel['createObject']>): Promise<{
74
+ object: RoolObject;
75
+ message: string;
76
+ }>;
77
+ updateObject(...args: Parameters<RoolChannel['updateObject']>): Promise<{
78
+ object: RoolObject;
79
+ message: string;
80
+ }>;
81
+ deleteObjects(...args: Parameters<RoolChannel['deleteObjects']>): Promise<void>;
82
+ prompt(...args: Parameters<RoolChannel['prompt']>): Promise<{
83
+ message: string;
84
+ objects: RoolObject[];
85
+ }>;
86
+ checkpoint(...args: Parameters<RoolChannel['checkpoint']>): Promise<string>;
87
+ canUndo(): Promise<boolean>;
88
+ canRedo(): Promise<boolean>;
89
+ undo(): Promise<boolean>;
90
+ redo(): Promise<boolean>;
91
+ clearHistory(): Promise<void>;
92
+ setMetadata(...args: Parameters<RoolChannel['setMetadata']>): void;
93
+ getMetadata(...args: Parameters<RoolChannel['getMetadata']>): unknown;
94
+ getAllMetadata(): Record<string, unknown>;
95
+ getInteractions(): Interaction[];
96
+ getSystemInstruction(): string | undefined;
97
+ setSystemInstruction(...args: Parameters<RoolChannel['setSystemInstruction']>): Promise<void>;
98
+ getSchema(): import("@rool-dev/sdk").SpaceSchema;
99
+ createCollection(...args: Parameters<RoolChannel['createCollection']>): Promise<import("@rool-dev/sdk").CollectionDef>;
100
+ alterCollection(...args: Parameters<RoolChannel['alterCollection']>): Promise<import("@rool-dev/sdk").CollectionDef>;
101
+ dropCollection(...args: Parameters<RoolChannel['dropCollection']>): Promise<void>;
102
+ uploadMedia(...args: Parameters<RoolChannel['uploadMedia']>): Promise<string>;
103
+ fetchMedia(...args: Parameters<RoolChannel['fetchMedia']>): Promise<import("@rool-dev/sdk").MediaResponse>;
104
+ deleteMedia(...args: Parameters<RoolChannel['deleteMedia']>): Promise<void>;
105
+ listMedia(): Promise<import("@rool-dev/sdk").MediaInfo[]>;
106
+ rename(...args: Parameters<RoolChannel['rename']>): Promise<void>;
107
+ on(...args: Parameters<RoolChannel['on']>): () => void;
108
+ off(...args: Parameters<RoolChannel['off']>): void;
109
+ /**
110
+ * Create a reactive object that auto-updates when the object changes.
111
+ * Throws if the channel has been closed.
112
+ */
113
+ object(objectId: string): ReactiveObject;
114
+ /**
115
+ * Create a reactive watch that auto-updates when matching objects change.
116
+ * Throws if the channel has been closed.
117
+ */
118
+ watch(options: WatchOptions): ReactiveWatch;
119
+ }
120
+ export declare function wrapChannel(channel: RoolChannel): ReactiveChannel;
121
+ export type ReactiveChannel = ReactiveChannelImpl;
122
+ /**
123
+ * A reactive list of channels for a space that auto-updates via SSE events.
124
+ */
125
+ declare class ReactiveChannelListImpl {
126
+ #private;
127
+ list: ChannelInfo[];
128
+ loading: boolean;
129
+ constructor(client: RoolClient, spaceId: string);
130
+ /**
131
+ * Re-fetch the channel list from the server.
132
+ * Opens a lightweight space handle to get the channel list.
133
+ */
134
+ refresh(): Promise<void>;
135
+ /**
136
+ * Stop listening for updates and clean up.
137
+ */
138
+ close(): void;
139
+ }
140
+ export declare function createChannelList(client: RoolClient, spaceId: string): ReactiveChannelList;
141
+ export type ReactiveChannelList = ReactiveChannelListImpl;
142
+ export {};
143
+ //# sourceMappingURL=channel.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.svelte.d.ts","sourceRoot":"","sources":["../src/channel.svelte.ts"],"names":[],"mappings":"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"}