@rool-dev/sdk 0.12.5 → 2.0.0-dev.4adc2c2

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 (108) hide show
  1. package/README.md +434 -786
  2. package/dist/agents.d.ts +130 -0
  3. package/dist/agents.d.ts.map +1 -0
  4. package/dist/agents.js +348 -0
  5. package/dist/agents.js.map +1 -0
  6. package/dist/auth-base.d.ts +43 -88
  7. package/dist/auth-base.d.ts.map +1 -1
  8. package/dist/auth-base.js +178 -302
  9. package/dist/auth-base.js.map +1 -1
  10. package/dist/auth-browser.d.ts +7 -25
  11. package/dist/auth-browser.d.ts.map +1 -1
  12. package/dist/auth-browser.js +45 -82
  13. package/dist/auth-browser.js.map +1 -1
  14. package/dist/auth-native.d.ts +9 -56
  15. package/dist/auth-native.d.ts.map +1 -1
  16. package/dist/auth-native.js +88 -177
  17. package/dist/auth-native.js.map +1 -1
  18. package/dist/auth-node.d.ts +32 -36
  19. package/dist/auth-node.d.ts.map +1 -1
  20. package/dist/auth-node.js +338 -265
  21. package/dist/auth-node.js.map +1 -1
  22. package/dist/auth-url.d.ts +6 -0
  23. package/dist/auth-url.d.ts.map +1 -0
  24. package/dist/auth-url.js +30 -0
  25. package/dist/auth-url.js.map +1 -0
  26. package/dist/client.d.ts +35 -290
  27. package/dist/client.d.ts.map +1 -1
  28. package/dist/client.js +275 -637
  29. package/dist/client.js.map +1 -1
  30. package/dist/events.d.ts +40 -0
  31. package/dist/events.d.ts.map +1 -0
  32. package/dist/events.js +175 -0
  33. package/dist/events.js.map +1 -0
  34. package/dist/files.d.ts +170 -0
  35. package/dist/files.d.ts.map +1 -0
  36. package/dist/files.js +846 -0
  37. package/dist/files.js.map +1 -0
  38. package/dist/index.d.ts +16 -19
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +7 -20
  41. package/dist/index.js.map +1 -1
  42. package/dist/machine.d.ts +49 -0
  43. package/dist/machine.d.ts.map +1 -0
  44. package/dist/machine.js +142 -0
  45. package/dist/machine.js.map +1 -0
  46. package/dist/problem.d.ts +11 -0
  47. package/dist/problem.d.ts.map +1 -0
  48. package/dist/problem.js +20 -0
  49. package/dist/problem.js.map +1 -0
  50. package/dist/structured.d.ts +84 -0
  51. package/dist/structured.d.ts.map +1 -0
  52. package/dist/structured.js +405 -0
  53. package/dist/structured.js.map +1 -0
  54. package/dist/types.d.ts +119 -520
  55. package/dist/types.d.ts.map +1 -1
  56. package/package.json +11 -16
  57. package/dist/auth.d.ts +0 -99
  58. package/dist/auth.d.ts.map +0 -1
  59. package/dist/auth.js +0 -217
  60. package/dist/auth.js.map +0 -1
  61. package/dist/client-info.d.ts +0 -18
  62. package/dist/client-info.d.ts.map +0 -1
  63. package/dist/client-info.js +0 -25
  64. package/dist/client-info.js.map +0 -1
  65. package/dist/event-emitter.d.ts +0 -45
  66. package/dist/event-emitter.d.ts.map +0 -1
  67. package/dist/event-emitter.js +0 -86
  68. package/dist/event-emitter.js.map +0 -1
  69. package/dist/graphql.d.ts +0 -90
  70. package/dist/graphql.d.ts.map +0 -1
  71. package/dist/graphql.js +0 -471
  72. package/dist/graphql.js.map +0 -1
  73. package/dist/logger.d.ts +0 -13
  74. package/dist/logger.d.ts.map +0 -1
  75. package/dist/logger.js +0 -17
  76. package/dist/logger.js.map +0 -1
  77. package/dist/path.d.ts +0 -6
  78. package/dist/path.d.ts.map +0 -1
  79. package/dist/path.js +0 -47
  80. package/dist/path.js.map +0 -1
  81. package/dist/reroute.d.ts +0 -22
  82. package/dist/reroute.d.ts.map +0 -1
  83. package/dist/reroute.js +0 -70
  84. package/dist/reroute.js.map +0 -1
  85. package/dist/rest.d.ts +0 -54
  86. package/dist/rest.d.ts.map +0 -1
  87. package/dist/rest.js +0 -171
  88. package/dist/rest.js.map +0 -1
  89. package/dist/router.d.ts +0 -20
  90. package/dist/router.d.ts.map +0 -1
  91. package/dist/router.js +0 -54
  92. package/dist/router.js.map +0 -1
  93. package/dist/space-session.d.ts +0 -30
  94. package/dist/space-session.d.ts.map +0 -1
  95. package/dist/space-session.js +0 -83
  96. package/dist/space-session.js.map +0 -1
  97. package/dist/space.d.ts +0 -161
  98. package/dist/space.d.ts.map +0 -1
  99. package/dist/space.js +0 -618
  100. package/dist/space.js.map +0 -1
  101. package/dist/subscription.d.ts +0 -36
  102. package/dist/subscription.d.ts.map +0 -1
  103. package/dist/subscription.js +0 -419
  104. package/dist/subscription.js.map +0 -1
  105. package/dist/webdav.d.ts +0 -171
  106. package/dist/webdav.d.ts.map +0 -1
  107. package/dist/webdav.js +0 -481
  108. package/dist/webdav.js.map +0 -1
package/dist/path.js DELETED
@@ -1,47 +0,0 @@
1
- const MACHINE_URI_RE = /^rool-machine(?::|%3A)(.*)$/i;
2
- export function machinePath(input, ctx = {}) {
3
- let value = input.trim();
4
- const machine = MACHINE_URI_RE.exec(value);
5
- if (machine)
6
- value = machine[1] || '/';
7
- if (/^[a-z][a-z0-9+.-]*:/i.test(value)) {
8
- value = new URL(value).pathname;
9
- }
10
- let parts = value.split('/').filter(Boolean).map(decodePart);
11
- if (ctx.spaceId && parts[0] === 'space' && parts[1] === ctx.spaceId) {
12
- parts = parts.slice(2);
13
- }
14
- else if (ctx.spaceId && parts[0] === 'dav' && parts[1] === ctx.spaceId) {
15
- parts = ['rool-drive', ...parts.slice(2)];
16
- }
17
- const path = parts.length ? `/${parts.join('/')}` : '/';
18
- if (path.includes('\\') || /[\x00-\x1f\x7f]/.test(path)) {
19
- throw new Error('Invalid machine path');
20
- }
21
- return path;
22
- }
23
- export function isObjectPath(input) {
24
- try {
25
- const parts = machinePath(input).split('/').filter(Boolean);
26
- return (parts.length === 3 &&
27
- parts[0] === 'space' &&
28
- !parts[1].startsWith('.') &&
29
- !parts[2].startsWith('.') &&
30
- parts[2].endsWith('.json'));
31
- }
32
- catch {
33
- return false;
34
- }
35
- }
36
- export function machineUri(path) {
37
- return `rool-machine:${machinePath(path).split('/').map(encodeURIComponent).join('/')}`;
38
- }
39
- function decodePart(value) {
40
- try {
41
- return decodeURIComponent(value);
42
- }
43
- catch {
44
- return value;
45
- }
46
- }
47
- //# sourceMappingURL=path.js.map
package/dist/path.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"path.js","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,8BAA8B,CAAC;AAEtD,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,MAA4B,EAAE;IACvE,IAAI,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,OAAO;QAAE,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IAEvC,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7D,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;QACpE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;SAAM,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;QACzE,KAAK,GAAG,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACxD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5D,OAAO,CACL,KAAK,CAAC,MAAM,KAAK,CAAC;YAClB,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO;YACpB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YACzB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YACzB,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC3B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,gBAAgB,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1F,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/dist/reroute.d.ts DELETED
@@ -1,22 +0,0 @@
1
- export declare function isThrowRetryable(method?: string): boolean;
2
- export interface RerouteOptions {
3
- /** Issue the request against the current (possibly just-rerouted) node. */
4
- send: () => Promise<Response>;
5
- /** Re-resolve the owning node and update client URL state. Throws if it fails. */
6
- reroute?: () => Promise<void>;
7
- /**
8
- * Whether the request may be re-sent after a thrown fetch (opaque network/CORS
9
- * failure). Only true for idempotent requests — see THROW_RETRYABLE.
10
- */
11
- retryOnThrow: boolean;
12
- }
13
- /**
14
- * Fetch with shard-reroute retries. A node being drained returns a readable
15
- * 421/503: re-resolve the owner and retry. A node that has fully rolled away no
16
- * longer answers, so the LB's CORS-less 5xx makes fetch reject opaquely (no
17
- * status to inspect); for idempotent requests we treat that throw as the same
18
- * reroute signal, since otherwise the request keeps targeting a dead node and
19
- * surfaces only as an opaque CORS error.
20
- */
21
- export declare function fetchWithReroute(opts: RerouteOptions): Promise<Response>;
22
- //# sourceMappingURL=reroute.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reroute.d.ts","sourceRoot":"","sources":["../src/reroute.ts"],"names":[],"mappings":"AAgBA,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CA+C9E"}
package/dist/reroute.js DELETED
@@ -1,70 +0,0 @@
1
- const REQUEST_MAX_RETRIES = 6;
2
- const RETRY_BASE_MS = 150;
3
- const RETRY_MAX_MS = 5_000;
4
- const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
5
- function retryBackoffMs(attempt) {
6
- const ceil = Math.min(RETRY_BASE_MS * 2 ** attempt, RETRY_MAX_MS);
7
- return ceil / 2 + Math.random() * (ceil / 2);
8
- }
9
- // Methods safe to re-send after a thrown fetch: reads, plus the idempotent
10
- // writes. A node that has fully rolled away makes fetch reject opaquely instead
11
- // of returning a readable 503, and we can't prove the request didn't execute, so
12
- // we only re-send when re-sending is harmless. POST/MKCOL/MOVE/COPY/LOCK are not.
13
- const THROW_RETRYABLE = new Set(['GET', 'HEAD', 'OPTIONS', 'PROPFIND', 'REPORT', 'PUT', 'DELETE']);
14
- export function isThrowRetryable(method) {
15
- return method ? THROW_RETRYABLE.has(method.toUpperCase()) : false;
16
- }
17
- /**
18
- * Fetch with shard-reroute retries. A node being drained returns a readable
19
- * 421/503: re-resolve the owner and retry. A node that has fully rolled away no
20
- * longer answers, so the LB's CORS-less 5xx makes fetch reject opaquely (no
21
- * status to inspect); for idempotent requests we treat that throw as the same
22
- * reroute signal, since otherwise the request keeps targeting a dead node and
23
- * surfaces only as an opaque CORS error.
24
- */
25
- export async function fetchWithReroute(opts) {
26
- const { send, reroute, retryOnThrow } = opts;
27
- let response = null;
28
- let thrown;
29
- try {
30
- response = await send();
31
- }
32
- catch (error) {
33
- if (!reroute || !retryOnThrow)
34
- throw error;
35
- thrown = error;
36
- }
37
- for (let attempt = 0; reroute && attempt < REQUEST_MAX_RETRIES &&
38
- (response === null || response.status === 421 || response.status === 503); attempt++) {
39
- await delay(retryBackoffMs(attempt));
40
- try {
41
- await reroute();
42
- }
43
- catch {
44
- continue; // reroute itself failed (e.g. /route exhausted its own retries); keep backing off
45
- }
46
- try {
47
- response = await send();
48
- thrown = undefined;
49
- }
50
- catch (error) {
51
- if (!retryOnThrow)
52
- throw error;
53
- response = null;
54
- thrown = error;
55
- }
56
- }
57
- if (response === null)
58
- throw thrown;
59
- // A suspended account is rejected on every authenticated request with 403 +
60
- // { code: 'SUSPENDED', error }. Surface the server's message so callers'
61
- // error toasts read well.
62
- if (response.status === 403) {
63
- const body = (await response.clone().json().catch(() => null));
64
- if (body?.code === 'SUSPENDED') {
65
- throw new Error(body.error ?? 'Your account has been suspended.');
66
- }
67
- }
68
- return response;
69
- }
70
- //# sourceMappingURL=reroute.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reroute.js","sourceRoot":"","sources":["../src/reroute.ts"],"names":[],"mappings":"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"}
package/dist/rest.d.ts DELETED
@@ -1,54 +0,0 @@
1
- import type { AuthManager } from './auth.js';
2
- import type { GetObjectsResult, Gift, GiftClaimResult, GiftList, GiftPreview, GiftUpdate, InvitePreview, InviteRedeemResult } from './types.js';
3
- import { type RoolClientInfo } from './client-info.js';
4
- export type InviteErrorCode = 'INVITE_INVALID' | 'INVITE_EXPIRED' | 'INVITE_REVOKED' | 'INVITE_EXHAUSTED' | 'INVITE_EMAIL_MISMATCH';
5
- export declare class InviteError extends Error {
6
- readonly code: InviteErrorCode;
7
- constructor(code: InviteErrorCode, message: string);
8
- }
9
- export type GiftErrorCode = 'gift_invalid' | 'gift_claimed';
10
- export declare class GiftError extends Error {
11
- readonly code: GiftErrorCode;
12
- constructor(code: GiftErrorCode, message: string);
13
- }
14
- export interface RestClientConfig {
15
- apiUrl: string;
16
- authManager: AuthManager;
17
- clientInfo?: RoolClientInfo;
18
- /** Called on shard refusal/drain (421/503). Return the new API base URL. */
19
- onRefused?: () => Promise<string>;
20
- }
21
- export declare class RestClient {
22
- private apiUrl;
23
- private authManager;
24
- private onRefused?;
25
- private clientInfo;
26
- constructor(config: RestClientConfig);
27
- /** Update the API base URL (used after shard rerouting). */
28
- setApiUrl(apiUrl: string): void;
29
- /** Wire the shard-reroute callback (used after shard rerouting). */
30
- setOnRefused(onRefused: () => Promise<string>): void;
31
- proxyFetch(spaceId: string, url: string, init?: {
32
- method?: string;
33
- headers?: Record<string, string>;
34
- body?: unknown;
35
- }): Promise<Response>;
36
- getObjects(spaceId: string, paths: string[]): Promise<GetObjectsResult>;
37
- importArchive(name: string, archive: Blob): Promise<string>;
38
- /** Look up an invite by token. Works without authentication (join page before sign-in). */
39
- previewInvite(token: string): Promise<InvitePreview>;
40
- /** Redeem an invite for the authenticated user, joining (or upgrading in) the space. */
41
- redeemInvite(token: string): Promise<InviteRedeemResult>;
42
- /** Look up a gift by its code. Works without authentication (claim page before sign-up). */
43
- previewGift(code: string): Promise<GiftPreview>;
44
- /** Claim a gift for the authenticated user, granting what it holds. */
45
- claimGift(code: string): Promise<GiftClaimResult>;
46
- /** The authenticated user's gifts, spent and unspent. */
47
- listGifts(): Promise<GiftList>;
48
- /** Mint a new code for a gift; the old code and link stop working. */
49
- rotateGiftCode(giftId: string): Promise<Gift>;
50
- /** Update a gift's note and/or archived state. Returns the updated gift. */
51
- updateGift(giftId: string, changes: GiftUpdate): Promise<Gift>;
52
- private authenticatedFetch;
53
- }
54
- //# sourceMappingURL=rest.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest.d.ts","sourceRoot":"","sources":["../src/rest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EACV,gBAAgB,EAChB,IAAI,EACJ,eAAe,EACf,QAAQ,EACR,WAAW,EACX,UAAU,EACV,aAAa,EACb,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAA2C,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEhG,MAAM,MAAM,eAAe,GACvB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,uBAAuB,CAAC;AAE5B,qBAAa,WAAY,SAAQ,KAAK;IACxB,QAAQ,CAAC,IAAI,EAAE,eAAe;gBAArB,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM;CAI5D;AAQD,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,cAAc,CAAC;AAE5D,qBAAa,SAAU,SAAQ,KAAK;IACtB,QAAQ,CAAC,IAAI,EAAE,aAAa;gBAAnB,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM;CAI1D;AAWD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAC,CAAwB;IAC1C,OAAO,CAAC,UAAU,CAAiB;gBAEvB,MAAM,EAAE,gBAAgB;IAOpC,4DAA4D;IAC5D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,oEAAoE;IACpE,YAAY,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI;IAI9C,UAAU,CACd,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAC3E,OAAO,CAAC,QAAQ,CAAC;IAed,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsBvE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBjE,2FAA2F;IACrF,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAM1D,wFAAwF;IAClF,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAQ9D,4FAA4F;IACtF,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAMrD,uEAAuE;IACjE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQvD,yDAAyD;IACnD,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC;IAMpC,sEAAsE;IAChE,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnD,4EAA4E;IACtE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YAUtD,kBAAkB;CAgBjC"}
package/dist/rest.js DELETED
@@ -1,171 +0,0 @@
1
- import { fetchWithReroute, isThrowRetryable } from './reroute.js';
2
- import { addClientInfoHeaders, resolveClientInfo } from './client-info.js';
3
- export class InviteError extends Error {
4
- code;
5
- constructor(code, message) {
6
- super(message);
7
- this.code = code;
8
- this.name = 'InviteError';
9
- }
10
- }
11
- async function throwInviteError(response) {
12
- const body = await response.json().catch(() => null);
13
- if (body?.code)
14
- throw new InviteError(body.code, body.error ?? body.code);
15
- throw new Error(`Invite request failed: ${response.status}`);
16
- }
17
- export class GiftError extends Error {
18
- code;
19
- constructor(code, message) {
20
- super(message);
21
- this.code = code;
22
- this.name = 'GiftError';
23
- }
24
- }
25
- // Gift endpoints are v2: errors arrive as application/problem+json.
26
- async function throwGiftError(response) {
27
- const body = await response.json().catch(() => null);
28
- if (body?.code?.startsWith('gift_')) {
29
- throw new GiftError(body.code, body.detail ?? body.code);
30
- }
31
- throw new Error(`Gift request failed: ${response.status}${body?.detail ? ` ${body.detail}` : ''}`);
32
- }
33
- export class RestClient {
34
- apiUrl;
35
- authManager;
36
- onRefused;
37
- clientInfo;
38
- constructor(config) {
39
- this.apiUrl = config.apiUrl.replace(/\/+$/, '');
40
- this.authManager = config.authManager;
41
- this.onRefused = config.onRefused;
42
- this.clientInfo = config.clientInfo ?? resolveClientInfo();
43
- }
44
- /** Update the API base URL (used after shard rerouting). */
45
- setApiUrl(apiUrl) {
46
- this.apiUrl = apiUrl.replace(/\/+$/, '');
47
- }
48
- /** Wire the shard-reroute callback (used after shard rerouting). */
49
- setOnRefused(onRefused) {
50
- this.onRefused = onRefused;
51
- }
52
- async proxyFetch(spaceId, url, init) {
53
- const response = await this.authenticatedFetch(`/fetch/${encodeURIComponent(spaceId)}`, {
54
- method: 'POST',
55
- headers: { 'Content-Type': 'application/json' },
56
- body: JSON.stringify({
57
- url,
58
- method: init?.method,
59
- headers: init?.headers,
60
- body: init?.body,
61
- }),
62
- });
63
- return response;
64
- }
65
- async getObjects(spaceId, paths) {
66
- const response = await this.authenticatedFetch(`/spaces/${encodeURIComponent(spaceId)}/getObjects`, {
67
- method: 'POST',
68
- headers: { 'Content-Type': 'application/json' },
69
- body: JSON.stringify({ paths }),
70
- });
71
- if (!response.ok) {
72
- const errorText = await response.text().catch(() => response.statusText);
73
- throw new Error(`Failed to get objects: ${response.status} ${errorText}`);
74
- }
75
- const result = await response.json();
76
- return {
77
- objects: result.objects.map((object) => ({ path: object.path, body: object.body })),
78
- missing: result.missing,
79
- };
80
- }
81
- async importArchive(name, archive) {
82
- const formData = new FormData();
83
- formData.append('name', name);
84
- formData.append('archive', archive, 'archive.zip');
85
- const response = await this.authenticatedFetch('/spaces/import', {
86
- method: 'POST',
87
- body: formData,
88
- });
89
- if (!response.ok) {
90
- const errorText = await response.text().catch(() => response.statusText);
91
- throw new Error(`Failed to import space: ${response.status} ${errorText}`);
92
- }
93
- const result = await response.json();
94
- return result.spaceId;
95
- }
96
- /** Look up an invite by token. Works without authentication (join page before sign-in). */
97
- async previewInvite(token) {
98
- const response = await fetch(`${this.apiUrl}/invites/${encodeURIComponent(token)}`);
99
- if (!response.ok)
100
- await throwInviteError(response);
101
- return await response.json();
102
- }
103
- /** Redeem an invite for the authenticated user, joining (or upgrading in) the space. */
104
- async redeemInvite(token) {
105
- const response = await this.authenticatedFetch(`/invites/${encodeURIComponent(token)}/redeem`, {
106
- method: 'POST',
107
- });
108
- if (!response.ok)
109
- await throwInviteError(response);
110
- return await response.json();
111
- }
112
- /** Look up a gift by its code. Works without authentication (claim page before sign-up). */
113
- async previewGift(code) {
114
- const response = await fetch(`${this.apiUrl}/v2/gifts/${encodeURIComponent(code)}`);
115
- if (!response.ok)
116
- await throwGiftError(response);
117
- return await response.json();
118
- }
119
- /** Claim a gift for the authenticated user, granting what it holds. */
120
- async claimGift(code) {
121
- const response = await this.authenticatedFetch(`/v2/gifts/${encodeURIComponent(code)}/claim`, {
122
- method: 'POST',
123
- });
124
- if (!response.ok)
125
- await throwGiftError(response);
126
- return await response.json();
127
- }
128
- /** The authenticated user's gifts, spent and unspent. */
129
- async listGifts() {
130
- const response = await this.authenticatedFetch('/v2/me/gifts', { method: 'GET' });
131
- if (!response.ok)
132
- await throwGiftError(response);
133
- return await response.json();
134
- }
135
- /** Mint a new code for a gift; the old code and link stop working. */
136
- async rotateGiftCode(giftId) {
137
- const response = await this.authenticatedFetch(`/v2/me/gifts/${encodeURIComponent(giftId)}/code`, {
138
- method: 'POST',
139
- });
140
- if (!response.ok)
141
- await throwGiftError(response);
142
- return await response.json();
143
- }
144
- /** Update a gift's note and/or archived state. Returns the updated gift. */
145
- async updateGift(giftId, changes) {
146
- const response = await this.authenticatedFetch(`/v2/me/gifts/${encodeURIComponent(giftId)}`, {
147
- method: 'PATCH',
148
- headers: { 'Content-Type': 'application/json' },
149
- body: JSON.stringify(changes),
150
- });
151
- if (!response.ok)
152
- await throwGiftError(response);
153
- return await response.json();
154
- }
155
- async authenticatedFetch(path, init) {
156
- const tokens = await this.authManager.getTokens();
157
- if (!tokens)
158
- throw new Error('Not authenticated');
159
- const headers = new Headers(init.headers);
160
- headers.set('Authorization', `Bearer ${tokens.accessToken}`);
161
- headers.set('X-Rool-Token', tokens.roolToken);
162
- addClientInfoHeaders(headers, this.clientInfo);
163
- const onRefused = this.onRefused;
164
- return fetchWithReroute({
165
- send: () => fetch(`${this.apiUrl}${path}`, { ...init, headers }),
166
- reroute: onRefused ? async () => this.setApiUrl(await onRefused()) : undefined,
167
- retryOnThrow: isThrowRetryable(init.method),
168
- });
169
- }
170
- }
171
- //# sourceMappingURL=rest.js.map
package/dist/rest.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest.js","sourceRoot":"","sources":["../src/rest.ts"],"names":[],"mappings":"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"}
package/dist/router.d.ts DELETED
@@ -1,20 +0,0 @@
1
- import type { AuthManager } from './auth.js';
2
- import { type RoolClientInfo } from './client-info.js';
3
- export interface RouteInfo {
4
- server: string;
5
- }
6
- export interface SpaceRouterConfig {
7
- apiUrl: string;
8
- authManager: AuthManager;
9
- clientInfo?: RoolClientInfo;
10
- }
11
- export declare class SpaceRouter {
12
- private apiUrl;
13
- private authManager;
14
- private clientInfo;
15
- private inflight;
16
- constructor(config: SpaceRouterConfig);
17
- resolve(spaceId: string): Promise<RouteInfo>;
18
- private fetchRoute;
19
- }
20
- //# sourceMappingURL=router.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAA2C,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAWhG,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,QAAQ,CAAyC;gBAE7C,MAAM,EAAE,iBAAiB;IAMrC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;YAW9B,UAAU;CAwBzB"}
package/dist/router.js DELETED
@@ -1,54 +0,0 @@
1
- import { addClientInfoHeaders, resolveClientInfo } from './client-info.js';
2
- const ROUTE_MAX_RETRIES = 6;
3
- const ROUTE_RETRY_BASE_MS = 150;
4
- const ROUTE_RETRY_MAX_MS = 2_000;
5
- const delay = (ms) => new Promise((r) => setTimeout(r, ms));
6
- function routeBackoffMs(attempt) {
7
- const ceil = Math.min(ROUTE_RETRY_BASE_MS * 2 ** attempt, ROUTE_RETRY_MAX_MS);
8
- return ceil / 2 + Math.random() * (ceil / 2);
9
- }
10
- export class SpaceRouter {
11
- apiUrl;
12
- authManager;
13
- clientInfo;
14
- inflight = new Map();
15
- constructor(config) {
16
- this.apiUrl = config.apiUrl.replace(/\/+$/, '');
17
- this.authManager = config.authManager;
18
- this.clientInfo = config.clientInfo ?? resolveClientInfo();
19
- }
20
- resolve(spaceId) {
21
- const existing = this.inflight.get(spaceId);
22
- if (existing)
23
- return existing;
24
- const promise = this.fetchRoute(spaceId).finally(() => {
25
- this.inflight.delete(spaceId);
26
- });
27
- this.inflight.set(spaceId, promise);
28
- return promise;
29
- }
30
- async fetchRoute(spaceId) {
31
- const tokens = await this.authManager.getTokens();
32
- if (!tokens)
33
- throw new Error('Not authenticated');
34
- // A draining shard 503s /route (it must not re-claim the lease for a dying
35
- // instance). /route is any-shard, so retry until a live shard answers.
36
- for (let attempt = 0;; attempt++) {
37
- const headers = new Headers({
38
- Authorization: `Bearer ${tokens.accessToken}`,
39
- 'X-Rool-Token': tokens.roolToken,
40
- });
41
- addClientInfoHeaders(headers, this.clientInfo);
42
- const response = await fetch(`${this.apiUrl}/route/${encodeURIComponent(spaceId)}`, { headers });
43
- if (response.ok) {
44
- const data = await response.json();
45
- return { server: data.server };
46
- }
47
- if (response.status !== 503 || attempt >= ROUTE_MAX_RETRIES) {
48
- throw new Error(`Route resolution failed: ${response.status} ${response.statusText}`);
49
- }
50
- await delay(routeBackoffMs(attempt));
51
- }
52
- }
53
- }
54
- //# sourceMappingURL=router.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
@@ -1,30 +0,0 @@
1
- import type { RoolSpace } from './space.js';
2
- import type { Conversation, Interaction, PromptOptions, RoolObject } from './types.js';
3
- export declare function generateEntityId(): string;
4
- /** Find the most recently updated leaf in a conversation tree. */
5
- export declare function defaultConversationLeaf(conversation: Conversation | null): string | undefined;
6
- /** Return one conversation branch in root-to-leaf order. */
7
- export declare function conversationBranch(conversation: Conversation | null, leafId?: string | undefined): Interaction[];
8
- /** An imperative API scoped to one conversation. It retains no conversation state. */
9
- export declare class ConversationHandle {
10
- private space;
11
- readonly conversationId: string;
12
- constructor(space: RoolSpace, conversationId: string);
13
- /** Fetch the current conversation contents. */
14
- get(): Promise<Conversation | null>;
15
- /** Set the conversation system instruction. Pass null to clear it. */
16
- setSystemInstruction(instruction: string | null): Promise<void>;
17
- rename(name: string): Promise<void>;
18
- delete(): Promise<void>;
19
- /**
20
- * Prompt this conversation. With no explicit parent, continue from the
21
- * current default leaf without retaining a client-side cursor.
22
- */
23
- prompt(text: string, options?: PromptOptions): Promise<{
24
- message: string;
25
- objects: RoolObject[];
26
- creditsUsed: number;
27
- }>;
28
- stop(): Promise<boolean>;
29
- }
30
- //# sourceMappingURL=space-session.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"space-session.d.ts","sourceRoot":"","sources":["../src/space-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIvF,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAED,kEAAkE;AAClE,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAc7F;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,MAAM,qBAAwC,GAC7C,WAAW,EAAE,CAYf;AAED,sFAAsF;AACtF,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,KAAK;IACb,QAAQ,CAAC,cAAc,EAAE,MAAM;gBADvB,KAAK,EAAE,SAAS,EACf,cAAc,EAAE,MAAM;IAGjC,+CAA+C;IACzC,GAAG,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAIzC,sEAAsE;IAChE,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B;;;OAGG;IACG,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,UAAU,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAarE,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;CAG/B"}
@@ -1,83 +0,0 @@
1
- const ENTITY_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
2
- export function generateEntityId() {
3
- let result = '';
4
- for (let i = 0; i < 6; i++) {
5
- result += ENTITY_CHARS[Math.floor(Math.random() * ENTITY_CHARS.length)];
6
- }
7
- return result;
8
- }
9
- /** Find the most recently updated leaf in a conversation tree. */
10
- export function defaultConversationLeaf(conversation) {
11
- if (!conversation)
12
- return undefined;
13
- const parents = new Set();
14
- for (const interaction of Object.values(conversation.interactions)) {
15
- if (interaction.parentId)
16
- parents.add(interaction.parentId);
17
- }
18
- let leaf;
19
- for (const interaction of Object.values(conversation.interactions)) {
20
- if (parents.has(interaction.id))
21
- continue;
22
- if (!leaf || interaction.timestamp > leaf.timestamp)
23
- leaf = interaction;
24
- }
25
- return leaf?.id;
26
- }
27
- /** Return one conversation branch in root-to-leaf order. */
28
- export function conversationBranch(conversation, leafId = defaultConversationLeaf(conversation)) {
29
- if (!conversation || !leafId)
30
- return [];
31
- const branch = [];
32
- let currentId = leafId;
33
- while (currentId) {
34
- const interaction = conversation.interactions[currentId];
35
- if (!interaction)
36
- break;
37
- branch.push(interaction);
38
- currentId = interaction.parentId;
39
- }
40
- return branch.reverse();
41
- }
42
- /** An imperative API scoped to one conversation. It retains no conversation state. */
43
- export class ConversationHandle {
44
- space;
45
- conversationId;
46
- constructor(space, conversationId) {
47
- this.space = space;
48
- this.conversationId = conversationId;
49
- }
50
- /** Fetch the current conversation contents. */
51
- async get() {
52
- return this.space.getConversation(this.conversationId);
53
- }
54
- /** Set the conversation system instruction. Pass null to clear it. */
55
- async setSystemInstruction(instruction) {
56
- await this.space._updateConversation(this.conversationId, { systemInstruction: instruction });
57
- }
58
- async rename(name) {
59
- await this.space._updateConversation(this.conversationId, { name });
60
- }
61
- async delete() {
62
- await this.space.deleteConversation(this.conversationId);
63
- }
64
- /**
65
- * Prompt this conversation. With no explicit parent, continue from the
66
- * current default leaf without retaining a client-side cursor.
67
- */
68
- async prompt(text, options) {
69
- const interactionId = options?.interactionId ?? generateEntityId();
70
- const parentInteractionId = options?.parentInteractionId === undefined
71
- ? defaultConversationLeaf(await this.get()) ?? null
72
- : options.parentInteractionId;
73
- return this.space._prompt(text, this.conversationId, {
74
- ...options,
75
- interactionId,
76
- parentInteractionId,
77
- });
78
- }
79
- async stop() {
80
- return this.space.stopConversation(this.conversationId);
81
- }
82
- }
83
- //# sourceMappingURL=space-session.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"space-session.js","sourceRoot":"","sources":["../src/space-session.ts"],"names":[],"mappings":"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"}