@rool-dev/sdk 0.1.0-dev.8511433

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 (54) hide show
  1. package/README.md +1070 -0
  2. package/dist/apps.d.ts +29 -0
  3. package/dist/apps.d.ts.map +1 -0
  4. package/dist/apps.js +88 -0
  5. package/dist/apps.js.map +1 -0
  6. package/dist/auth-browser.d.ts +80 -0
  7. package/dist/auth-browser.d.ts.map +1 -0
  8. package/dist/auth-browser.js +370 -0
  9. package/dist/auth-browser.js.map +1 -0
  10. package/dist/auth-node.d.ts +46 -0
  11. package/dist/auth-node.d.ts.map +1 -0
  12. package/dist/auth-node.js +315 -0
  13. package/dist/auth-node.js.map +1 -0
  14. package/dist/auth.d.ts +56 -0
  15. package/dist/auth.d.ts.map +1 -0
  16. package/dist/auth.js +96 -0
  17. package/dist/auth.js.map +1 -0
  18. package/dist/client.d.ts +202 -0
  19. package/dist/client.d.ts.map +1 -0
  20. package/dist/client.js +472 -0
  21. package/dist/client.js.map +1 -0
  22. package/dist/event-emitter.d.ts +38 -0
  23. package/dist/event-emitter.d.ts.map +1 -0
  24. package/dist/event-emitter.js +80 -0
  25. package/dist/event-emitter.js.map +1 -0
  26. package/dist/graphql.d.ts +71 -0
  27. package/dist/graphql.d.ts.map +1 -0
  28. package/dist/graphql.js +487 -0
  29. package/dist/graphql.js.map +1 -0
  30. package/dist/index.d.ts +6 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +11 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/jsonld.d.ts +47 -0
  35. package/dist/jsonld.d.ts.map +1 -0
  36. package/dist/jsonld.js +137 -0
  37. package/dist/jsonld.js.map +1 -0
  38. package/dist/media.d.ts +52 -0
  39. package/dist/media.d.ts.map +1 -0
  40. package/dist/media.js +173 -0
  41. package/dist/media.js.map +1 -0
  42. package/dist/space.d.ts +358 -0
  43. package/dist/space.d.ts.map +1 -0
  44. package/dist/space.js +1121 -0
  45. package/dist/space.js.map +1 -0
  46. package/dist/subscription.d.ts +57 -0
  47. package/dist/subscription.d.ts.map +1 -0
  48. package/dist/subscription.js +296 -0
  49. package/dist/subscription.js.map +1 -0
  50. package/dist/types.d.ts +409 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +6 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +65 -0
@@ -0,0 +1,487 @@
1
+ // =============================================================================
2
+ // GraphQL Client
3
+ // Handles all GraphQL queries and mutations for the Rool API
4
+ // =============================================================================
5
+ import { gzipSync } from 'fflate';
6
+ const COMPRESSION_THRESHOLD = 2048; // Compress payloads > 2KB
7
+ /** Get the client's IANA timezone (e.g., "America/New_York") */
8
+ function getTimezone() {
9
+ try {
10
+ return Intl.DateTimeFormat().resolvedOptions().timeZone;
11
+ }
12
+ catch {
13
+ return undefined;
14
+ }
15
+ }
16
+ export class GraphQLClient {
17
+ config;
18
+ constructor(config) {
19
+ this.config = config;
20
+ }
21
+ get graphqlUrl() {
22
+ return this.config.graphqlUrl;
23
+ }
24
+ async listSpaces() {
25
+ const query = `
26
+ query ListSpaces {
27
+ listSpaces {
28
+ id
29
+ name
30
+ role
31
+ ownerId
32
+ size
33
+ createdAt
34
+ updatedAt
35
+ }
36
+ }
37
+ `;
38
+ const response = await this.request(query);
39
+ return response.listSpaces;
40
+ }
41
+ async getSpace(spaceId) {
42
+ const query = `
43
+ query GetSpace($id: String!) {
44
+ getSpace(id: $id) {
45
+ data
46
+ name
47
+ role
48
+ userId
49
+ }
50
+ }
51
+ `;
52
+ const response = await this.request(query, { id: spaceId });
53
+ return {
54
+ data: JSON.parse(response.getSpace.data),
55
+ name: response.getSpace.name,
56
+ role: response.getSpace.role,
57
+ userId: response.getSpace.userId,
58
+ };
59
+ }
60
+ // ===========================================================================
61
+ // Space Lifecycle Operations (called from RoolClient)
62
+ // These use a placeholder conversationId since client events aren't filtered
63
+ // ===========================================================================
64
+ async createSpace(spaceId, name, conversationId) {
65
+ const mutation = `
66
+ mutation CreateSpace($id: String!, $name: String!, $conversationId: String!) {
67
+ createSpace(id: $id, name: $name, conversationId: $conversationId)
68
+ }
69
+ `;
70
+ await this.request(mutation, {
71
+ id: spaceId,
72
+ name,
73
+ conversationId,
74
+ });
75
+ }
76
+ async deleteSpace(spaceId, conversationId) {
77
+ const mutation = `
78
+ mutation DeleteSpace($id: String!, $conversationId: String!) {
79
+ deleteSpace(id: $id, conversationId: $conversationId)
80
+ }
81
+ `;
82
+ await this.request(mutation, {
83
+ id: spaceId,
84
+ conversationId,
85
+ });
86
+ }
87
+ async renameSpace(spaceId, name, conversationId) {
88
+ const mutation = `
89
+ mutation RenameSpace($id: String!, $name: String!, $conversationId: String!) {
90
+ renameSpace(id: $id, name: $name, conversationId: $conversationId)
91
+ }
92
+ `;
93
+ await this.request(mutation, {
94
+ id: spaceId,
95
+ name,
96
+ conversationId,
97
+ });
98
+ }
99
+ // ===========================================================================
100
+ // Space Content Operations (called from RoolSpace)
101
+ // These require conversationId for AI context
102
+ // ===========================================================================
103
+ async setSpaceMeta(spaceId, meta, conversationId) {
104
+ const mutation = `
105
+ mutation SetSpaceMeta($id: String!, $meta: String!, $conversationId: String!) {
106
+ setSpaceMeta(id: $id, meta: $meta, conversationId: $conversationId)
107
+ }
108
+ `;
109
+ await this.request(mutation, {
110
+ id: spaceId,
111
+ meta: JSON.stringify(meta),
112
+ conversationId,
113
+ });
114
+ }
115
+ async link(spaceId, source, relation, target, conversationId) {
116
+ const mutation = `
117
+ mutation Link($spaceId: String!, $source: String!, $relation: String!, $target: String!, $conversationId: String!) {
118
+ link(spaceId: $spaceId, source: $source, relation: $relation, target: $target, conversationId: $conversationId)
119
+ }
120
+ `;
121
+ await this.request(mutation, {
122
+ spaceId,
123
+ source,
124
+ relation,
125
+ target,
126
+ conversationId,
127
+ });
128
+ }
129
+ async unlink(spaceId, source, relation, target, conversationId) {
130
+ const mutation = `
131
+ mutation Unlink($spaceId: String!, $source: String!, $relation: String, $target: String, $conversationId: String!) {
132
+ unlink(spaceId: $spaceId, source: $source, relation: $relation, target: $target, conversationId: $conversationId)
133
+ }
134
+ `;
135
+ await this.request(mutation, {
136
+ spaceId,
137
+ source,
138
+ relation: relation ?? null,
139
+ target: target ?? null,
140
+ conversationId,
141
+ });
142
+ }
143
+ async deleteObjects(spaceId, ids, conversationId) {
144
+ const mutation = `
145
+ mutation DeleteObjects($spaceId: String!, $ids: [String!]!, $conversationId: String!) {
146
+ deleteObjects(spaceId: $spaceId, ids: $ids, conversationId: $conversationId)
147
+ }
148
+ `;
149
+ await this.request(mutation, {
150
+ spaceId,
151
+ ids,
152
+ conversationId,
153
+ });
154
+ }
155
+ async deleteConversation(spaceId, conversationId) {
156
+ const mutation = `
157
+ mutation DeleteConversation($spaceId: String!, $conversationId: String!) {
158
+ deleteConversation(spaceId: $spaceId, conversationId: $conversationId)
159
+ }
160
+ `;
161
+ await this.request(mutation, {
162
+ spaceId,
163
+ conversationId,
164
+ });
165
+ }
166
+ async renameConversation(spaceId, conversationId, name) {
167
+ const mutation = `
168
+ mutation RenameConversation($spaceId: String!, $conversationId: String!, $name: String!) {
169
+ renameConversation(spaceId: $spaceId, conversationId: $conversationId, name: $name)
170
+ }
171
+ `;
172
+ await this.request(mutation, {
173
+ spaceId,
174
+ conversationId,
175
+ name,
176
+ });
177
+ }
178
+ async listConversations(spaceId) {
179
+ const query = `
180
+ query ListConversations($spaceId: String!) {
181
+ listConversations(spaceId: $spaceId) {
182
+ id
183
+ name
184
+ createdAt
185
+ interactionCount
186
+ }
187
+ }
188
+ `;
189
+ const result = await this.request(query, {
190
+ spaceId,
191
+ });
192
+ return result.listConversations;
193
+ }
194
+ // ===========================================================================
195
+ // Checkpoint / Undo / Redo Operations
196
+ // ===========================================================================
197
+ async checkpoint(spaceId, label, conversationId) {
198
+ const mutation = `
199
+ mutation Checkpoint($spaceId: String!, $label: String, $conversationId: String!) {
200
+ checkpoint(spaceId: $spaceId, label: $label, conversationId: $conversationId) {
201
+ checkpointId
202
+ }
203
+ }
204
+ `;
205
+ const result = await this.request(mutation, {
206
+ spaceId,
207
+ label,
208
+ conversationId,
209
+ });
210
+ return result.checkpoint;
211
+ }
212
+ async undo(spaceId, conversationId) {
213
+ const mutation = `
214
+ mutation Undo($spaceId: String!, $conversationId: String!) {
215
+ undo(spaceId: $spaceId, conversationId: $conversationId) {
216
+ success
217
+ }
218
+ }
219
+ `;
220
+ const result = await this.request(mutation, {
221
+ spaceId,
222
+ conversationId,
223
+ });
224
+ return result.undo;
225
+ }
226
+ async redo(spaceId, conversationId) {
227
+ const mutation = `
228
+ mutation Redo($spaceId: String!, $conversationId: String!) {
229
+ redo(spaceId: $spaceId, conversationId: $conversationId) {
230
+ success
231
+ }
232
+ }
233
+ `;
234
+ const result = await this.request(mutation, {
235
+ spaceId,
236
+ conversationId,
237
+ });
238
+ return result.redo;
239
+ }
240
+ async checkpointStatus(spaceId, conversationId) {
241
+ const query = `
242
+ query CheckpointStatus($spaceId: String!, $conversationId: String!) {
243
+ checkpointStatus(spaceId: $spaceId, conversationId: $conversationId) {
244
+ canUndo
245
+ canRedo
246
+ }
247
+ }
248
+ `;
249
+ const result = await this.request(query, {
250
+ spaceId,
251
+ conversationId,
252
+ });
253
+ return result.checkpointStatus;
254
+ }
255
+ async clearCheckpointHistory(spaceId, conversationId) {
256
+ const mutation = `
257
+ mutation ClearCheckpointHistory($spaceId: String!, $conversationId: String!) {
258
+ clearCheckpointHistory(spaceId: $spaceId, conversationId: $conversationId)
259
+ }
260
+ `;
261
+ await this.request(mutation, {
262
+ spaceId,
263
+ conversationId,
264
+ });
265
+ }
266
+ async createObject(spaceId, data, conversationId, prompt, ephemeral) {
267
+ const mutation = `
268
+ mutation CreateObject($spaceId: String!, $data: String!, $prompt: String, $conversationId: String!, $ephemeral: Boolean) {
269
+ createObject(spaceId: $spaceId, data: $data, prompt: $prompt, conversationId: $conversationId, ephemeral: $ephemeral)
270
+ }
271
+ `;
272
+ const result = await this.request(mutation, {
273
+ spaceId,
274
+ data: JSON.stringify(data),
275
+ prompt,
276
+ conversationId,
277
+ ephemeral,
278
+ });
279
+ return result.createObject;
280
+ }
281
+ async updateObject(spaceId, id, conversationId, data, prompt, ephemeral) {
282
+ const mutation = `
283
+ mutation UpdateObject($spaceId: String!, $id: String!, $data: String, $prompt: String, $conversationId: String!, $ephemeral: Boolean) {
284
+ updateObject(spaceId: $spaceId, id: $id, data: $data, prompt: $prompt, conversationId: $conversationId, ephemeral: $ephemeral)
285
+ }
286
+ `;
287
+ const result = await this.request(mutation, {
288
+ spaceId,
289
+ id,
290
+ data: data ? JSON.stringify(data) : undefined,
291
+ prompt,
292
+ conversationId,
293
+ ephemeral,
294
+ });
295
+ return result.updateObject;
296
+ }
297
+ async findObjects(spaceId, options, conversationId) {
298
+ const query = `
299
+ query FindObjects($spaceId: String!, $where: String, $prompt: String, $limit: Int, $objectIds: [String!], $order: String, $conversationId: String!, $ephemeral: Boolean) {
300
+ findObjects(spaceId: $spaceId, where: $where, prompt: $prompt, limit: $limit, objectIds: $objectIds, order: $order, conversationId: $conversationId, ephemeral: $ephemeral) {
301
+ objects
302
+ message
303
+ }
304
+ }
305
+ `;
306
+ const result = await this.request(query, {
307
+ spaceId,
308
+ where: options.where ? JSON.stringify(options.where) : undefined,
309
+ prompt: options.prompt,
310
+ limit: options.limit,
311
+ objectIds: options.objectIds ?? [],
312
+ order: options.order,
313
+ conversationId,
314
+ ephemeral: options.ephemeral,
315
+ });
316
+ return {
317
+ objects: JSON.parse(result.findObjects.objects),
318
+ message: result.findObjects.message,
319
+ };
320
+ }
321
+ // ===========================================================================
322
+ // AI Operations
323
+ // ===========================================================================
324
+ async prompt(spaceId, prompt, conversationId, options = {}) {
325
+ const mutation = `
326
+ mutation Prompt($spaceId: String!, $prompt: String!, $objectIds: [String!], $responseSchema: JSON, $conversationId: String!, $effort: PromptEffort, $ephemeral: Boolean, $readOnly: Boolean) {
327
+ prompt(spaceId: $spaceId, prompt: $prompt, objectIds: $objectIds, responseSchema: $responseSchema, conversationId: $conversationId, effort: $effort, ephemeral: $ephemeral, readOnly: $readOnly) {
328
+ message
329
+ modifiedObjectIds
330
+ }
331
+ }
332
+ `;
333
+ const response = await this.request(mutation, {
334
+ spaceId,
335
+ prompt,
336
+ objectIds: options.objectIds ?? [],
337
+ responseSchema: options.responseSchema,
338
+ conversationId,
339
+ effort: options.effort,
340
+ ephemeral: options.ephemeral,
341
+ readOnly: options.readOnly,
342
+ });
343
+ return response.prompt;
344
+ }
345
+ // ===========================================================================
346
+ // User / Collaboration Operations
347
+ // ===========================================================================
348
+ async getAccount() {
349
+ const query = `
350
+ query GetAccount {
351
+ getAccount {
352
+ id
353
+ email
354
+ name
355
+ slug
356
+ plan
357
+ creditsBalance
358
+ createdAt
359
+ lastActivity
360
+ processedAt
361
+ storage
362
+ }
363
+ }
364
+ `;
365
+ const response = await this.request(query);
366
+ return response.getAccount;
367
+ }
368
+ async setSlug(slug) {
369
+ const mutation = `
370
+ mutation SetSlug($slug: String!) {
371
+ setSlug(slug: $slug)
372
+ }
373
+ `;
374
+ await this.request(mutation, { slug });
375
+ }
376
+ async setUserStorage(key, value) {
377
+ const mutation = `
378
+ mutation SetUserStorage($key: String!, $value: JSON) {
379
+ setUserStorage(key: $key, value: $value)
380
+ }
381
+ `;
382
+ await this.request(mutation, { key, value: value ?? null });
383
+ }
384
+ async searchUser(email) {
385
+ const query = `
386
+ query SearchUser($email: String!) {
387
+ searchUser(email: $email) {
388
+ id
389
+ email
390
+ name
391
+ }
392
+ }
393
+ `;
394
+ try {
395
+ const response = await this.request(query, { email });
396
+ return response.searchUser;
397
+ }
398
+ catch {
399
+ return null;
400
+ }
401
+ }
402
+ async listSpaceUsers(spaceId) {
403
+ const query = `
404
+ query ListSpaceUsers($spaceId: String!) {
405
+ listSpaceUsers(spaceId: $spaceId) {
406
+ id
407
+ email
408
+ role
409
+ }
410
+ }
411
+ `;
412
+ const response = await this.request(query, { spaceId });
413
+ return response.listSpaceUsers;
414
+ }
415
+ async addSpaceUser(spaceId, userId, role) {
416
+ const mutation = `
417
+ mutation AddSpaceUser($spaceId: String!, $userId: String!, $role: String!) {
418
+ addSpaceUser(spaceId: $spaceId, userId: $userId, role: $role)
419
+ }
420
+ `;
421
+ await this.request(mutation, { spaceId, userId, role });
422
+ }
423
+ async removeSpaceUser(spaceId, userId) {
424
+ const mutation = `
425
+ mutation RemoveSpaceUser($spaceId: String!, $userId: String!) {
426
+ removeSpaceUser(spaceId: $spaceId, userId: $userId)
427
+ }
428
+ `;
429
+ await this.request(mutation, { spaceId, userId });
430
+ }
431
+ // ===========================================================================
432
+ // Generic Query (escape hatch for app-specific queries)
433
+ // ===========================================================================
434
+ /**
435
+ * Execute an arbitrary GraphQL query or mutation.
436
+ * Use this for app-specific operations not covered by the typed methods.
437
+ */
438
+ async query(query, variables) {
439
+ return this.request(query, variables);
440
+ }
441
+ // ===========================================================================
442
+ // Private Methods
443
+ // ===========================================================================
444
+ async request(query, variables) {
445
+ const token = await this.config.authManager.getToken();
446
+ if (!token) {
447
+ throw new Error('Not authenticated');
448
+ }
449
+ const body = JSON.stringify({ query, variables });
450
+ const headers = {
451
+ 'Content-Type': 'application/json',
452
+ Authorization: `Bearer ${token}`,
453
+ };
454
+ const timezone = getTimezone();
455
+ if (timezone) {
456
+ headers['X-Timezone'] = timezone;
457
+ }
458
+ let fetchBody = body;
459
+ // Compress large payloads
460
+ if (body.length > COMPRESSION_THRESHOLD) {
461
+ const gzipped = gzipSync(new TextEncoder().encode(body));
462
+ headers['Content-Encoding'] = 'gzip';
463
+ // Convert to ArrayBuffer for fetch compatibility
464
+ fetchBody = gzipped.buffer.slice(gzipped.byteOffset, gzipped.byteOffset + gzipped.byteLength);
465
+ }
466
+ const response = await fetch(this.graphqlUrl, {
467
+ method: 'POST',
468
+ headers,
469
+ body: fetchBody,
470
+ });
471
+ if (!response.ok) {
472
+ throw new Error(`GraphQL request failed: ${response.status} ${response.statusText}`);
473
+ }
474
+ const result = await response.json();
475
+ if (result.errors && result.errors.length > 0) {
476
+ const error = result.errors[0];
477
+ const err = new Error(error.message);
478
+ err.extensions = error.extensions;
479
+ throw err;
480
+ }
481
+ if (!result.data) {
482
+ throw new Error('GraphQL response missing data');
483
+ }
484
+ return result.data;
485
+ }
486
+ }
487
+ //# sourceMappingURL=graphql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.js","sourceRoot":"","sources":["../src/graphql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { RoolClient } from './client.js';
2
+ export { RoolSpace, generateEntityId } from './space.js';
3
+ export { EventEmitter } from './event-emitter.js';
4
+ export type { JsonLdDocument, JsonLdNode } from './jsonld.js';
5
+ export type { RoolObject, RoolObjectEntry, RoolObjectStat, RoolSpaceData, RoolSpaceInfo, JSONPatchOp, ClientEvent, ClientEventType, SpaceEvent, SpaceEventType, RoolEventSource, SpaceMember, RoolUserRole, UserResult, CurrentUser, AuthUser, MediaInfo, MediaResponse, PublishAppOptions, PublishedAppInfo, PromptOptions, FindObjectsOptions, ConnectionState, SpaceEvents, ObjectCreatedEvent, ObjectUpdatedEvent, ObjectDeletedEvent, LinkedEvent, UnlinkedEvent, MetadataUpdatedEvent, ConversationUpdatedEvent, SpaceResetEvent, Conversation, ConversationInfo, Interaction, RoolClientConfig, RoolClientEvents, AuthTokens, AuthProvider, } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9D,YAAY,EAEV,UAAU,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACb,aAAa,EACb,WAAW,EAGX,WAAW,EACX,eAAe,EACf,UAAU,EACV,cAAc,EACd,eAAe,EAGf,WAAW,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACX,QAAQ,EAGR,SAAS,EACT,aAAa,EAGb,iBAAiB,EACjB,gBAAgB,EAGhB,aAAa,EACb,kBAAkB,EAGlB,eAAe,EAGf,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,EAGf,YAAY,EACZ,gBAAgB,EAChB,WAAW,EAGX,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ // =============================================================================
2
+ // Rool Client
3
+ // Generic TypeScript client library for the Rool server API
4
+ // =============================================================================
5
+ // Main client
6
+ export { RoolClient } from './client.js';
7
+ // Space class
8
+ export { RoolSpace, generateEntityId } from './space.js';
9
+ // Event emitter (for extending)
10
+ export { EventEmitter } from './event-emitter.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,cAAc;AACd,4DAA4D;AAC5D,gFAAgF;AAEhF,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEzD,gCAAgC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { RoolSpaceData } from './types.js';
2
+ export interface JsonLdDocument {
3
+ '@context': {
4
+ '@vocab': string;
5
+ id: string;
6
+ };
7
+ '@graph': JsonLdNode[];
8
+ }
9
+ export interface JsonLdNode {
10
+ id: string;
11
+ [key: string]: unknown;
12
+ }
13
+ export interface ParsedImport {
14
+ objects: Array<{
15
+ id: string;
16
+ data: Record<string, unknown>;
17
+ relations: Array<{
18
+ relation: string;
19
+ targetId: string;
20
+ }>;
21
+ }>;
22
+ }
23
+ /**
24
+ * Convert space data to JSON-LD format.
25
+ * Filters out orphan links (links to non-existent objects) to ensure clean exports.
26
+ */
27
+ export declare function toJsonLd(data: RoolSpaceData): JsonLdDocument;
28
+ /**
29
+ * Parse JSON-LD into objects and relations for import.
30
+ *
31
+ * Uses two-pass parsing to distinguish relations from data:
32
+ * - First pass: collect all object IDs in the graph
33
+ * - Second pass: string arrays where ALL values are valid object IDs are treated as relations;
34
+ * otherwise they are treated as data fields
35
+ */
36
+ export declare function fromJsonLd(jsonld: unknown): ParsedImport;
37
+ /**
38
+ * Recursively find all string values in a JSON-LD document.
39
+ * Used to detect media URLs for archive export.
40
+ */
41
+ export declare function findAllStrings(doc: JsonLdDocument): Set<string>;
42
+ /**
43
+ * Rewrite string values in a JSON-LD document using a mapping.
44
+ * Returns a new document (does not mutate the original).
45
+ */
46
+ export declare function rewriteStrings(doc: JsonLdDocument, mapping: Map<string, string>): JsonLdDocument;
47
+ //# sourceMappingURL=jsonld.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonld.d.ts","sourceRoot":"","sources":["../src/jsonld.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,SAAS,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC1D,CAAC,CAAC;CACJ;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,CAwB5D;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,YAAY,CA4DxD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,CAmB/D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,cAAc,CAoBhB"}