@airstore/sdk 0.1.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.
Files changed (134) hide show
  1. package/README.md +341 -0
  2. package/dist/cjs/airstore.js +127 -0
  3. package/dist/cjs/airstore.js.map +1 -0
  4. package/dist/cjs/client.js +214 -0
  5. package/dist/cjs/client.js.map +1 -0
  6. package/dist/cjs/errors.js +129 -0
  7. package/dist/cjs/errors.js.map +1 -0
  8. package/dist/cjs/index.js +40 -0
  9. package/dist/cjs/index.js.map +1 -0
  10. package/dist/cjs/resources/connections.js +74 -0
  11. package/dist/cjs/resources/connections.js.map +1 -0
  12. package/dist/cjs/resources/filesystem.js +101 -0
  13. package/dist/cjs/resources/filesystem.js.map +1 -0
  14. package/dist/cjs/resources/index.js +18 -0
  15. package/dist/cjs/resources/index.js.map +1 -0
  16. package/dist/cjs/resources/members.js +63 -0
  17. package/dist/cjs/resources/members.js.map +1 -0
  18. package/dist/cjs/resources/oauth.js +85 -0
  19. package/dist/cjs/resources/oauth.js.map +1 -0
  20. package/dist/cjs/resources/smart-folders.js +102 -0
  21. package/dist/cjs/resources/smart-folders.js.map +1 -0
  22. package/dist/cjs/resources/tokens.js +73 -0
  23. package/dist/cjs/resources/tokens.js.map +1 -0
  24. package/dist/cjs/resources/workspaces.js +75 -0
  25. package/dist/cjs/resources/workspaces.js.map +1 -0
  26. package/dist/cjs/types/connections.js +3 -0
  27. package/dist/cjs/types/connections.js.map +1 -0
  28. package/dist/cjs/types/filesystem.js +3 -0
  29. package/dist/cjs/types/filesystem.js.map +1 -0
  30. package/dist/cjs/types/index.js +25 -0
  31. package/dist/cjs/types/index.js.map +1 -0
  32. package/dist/cjs/types/members.js +3 -0
  33. package/dist/cjs/types/members.js.map +1 -0
  34. package/dist/cjs/types/oauth.js +3 -0
  35. package/dist/cjs/types/oauth.js.map +1 -0
  36. package/dist/cjs/types/shared.js +3 -0
  37. package/dist/cjs/types/shared.js.map +1 -0
  38. package/dist/cjs/types/smart-folders.js +3 -0
  39. package/dist/cjs/types/smart-folders.js.map +1 -0
  40. package/dist/cjs/types/tokens.js +3 -0
  41. package/dist/cjs/types/tokens.js.map +1 -0
  42. package/dist/cjs/types/workspaces.js +3 -0
  43. package/dist/cjs/types/workspaces.js.map +1 -0
  44. package/dist/cjs/version.js +6 -0
  45. package/dist/cjs/version.js.map +1 -0
  46. package/dist/esm/airstore.js +123 -0
  47. package/dist/esm/airstore.js.map +1 -0
  48. package/dist/esm/client.js +209 -0
  49. package/dist/esm/client.js.map +1 -0
  50. package/dist/esm/errors.js +115 -0
  51. package/dist/esm/errors.js.map +1 -0
  52. package/dist/esm/index.js +16 -0
  53. package/dist/esm/index.js.map +1 -0
  54. package/dist/esm/resources/connections.js +70 -0
  55. package/dist/esm/resources/connections.js.map +1 -0
  56. package/dist/esm/resources/filesystem.js +97 -0
  57. package/dist/esm/resources/filesystem.js.map +1 -0
  58. package/dist/esm/resources/index.js +8 -0
  59. package/dist/esm/resources/index.js.map +1 -0
  60. package/dist/esm/resources/members.js +59 -0
  61. package/dist/esm/resources/members.js.map +1 -0
  62. package/dist/esm/resources/oauth.js +81 -0
  63. package/dist/esm/resources/oauth.js.map +1 -0
  64. package/dist/esm/resources/smart-folders.js +98 -0
  65. package/dist/esm/resources/smart-folders.js.map +1 -0
  66. package/dist/esm/resources/tokens.js +69 -0
  67. package/dist/esm/resources/tokens.js.map +1 -0
  68. package/dist/esm/resources/workspaces.js +71 -0
  69. package/dist/esm/resources/workspaces.js.map +1 -0
  70. package/dist/esm/types/connections.js +2 -0
  71. package/dist/esm/types/connections.js.map +1 -0
  72. package/dist/esm/types/filesystem.js +2 -0
  73. package/dist/esm/types/filesystem.js.map +1 -0
  74. package/dist/esm/types/index.js +9 -0
  75. package/dist/esm/types/index.js.map +1 -0
  76. package/dist/esm/types/members.js +2 -0
  77. package/dist/esm/types/members.js.map +1 -0
  78. package/dist/esm/types/oauth.js +2 -0
  79. package/dist/esm/types/oauth.js.map +1 -0
  80. package/dist/esm/types/shared.js +2 -0
  81. package/dist/esm/types/shared.js.map +1 -0
  82. package/dist/esm/types/smart-folders.js +2 -0
  83. package/dist/esm/types/smart-folders.js.map +1 -0
  84. package/dist/esm/types/tokens.js +2 -0
  85. package/dist/esm/types/tokens.js.map +1 -0
  86. package/dist/esm/types/workspaces.js +2 -0
  87. package/dist/esm/types/workspaces.js.map +1 -0
  88. package/dist/esm/version.js +3 -0
  89. package/dist/esm/version.js.map +1 -0
  90. package/dist/types/airstore.d.ts +114 -0
  91. package/dist/types/airstore.d.ts.map +1 -0
  92. package/dist/types/client.d.ts +86 -0
  93. package/dist/types/client.d.ts.map +1 -0
  94. package/dist/types/errors.d.ts +61 -0
  95. package/dist/types/errors.d.ts.map +1 -0
  96. package/dist/types/index.d.ts +21 -0
  97. package/dist/types/index.d.ts.map +1 -0
  98. package/dist/types/resources/connections.d.ts +50 -0
  99. package/dist/types/resources/connections.d.ts.map +1 -0
  100. package/dist/types/resources/filesystem.d.ts +81 -0
  101. package/dist/types/resources/filesystem.d.ts.map +1 -0
  102. package/dist/types/resources/index.d.ts +8 -0
  103. package/dist/types/resources/index.d.ts.map +1 -0
  104. package/dist/types/resources/members.d.ts +49 -0
  105. package/dist/types/resources/members.d.ts.map +1 -0
  106. package/dist/types/resources/oauth.d.ts +57 -0
  107. package/dist/types/resources/oauth.d.ts.map +1 -0
  108. package/dist/types/resources/smart-folders.d.ts +70 -0
  109. package/dist/types/resources/smart-folders.d.ts.map +1 -0
  110. package/dist/types/resources/tokens.d.ts +54 -0
  111. package/dist/types/resources/tokens.d.ts.map +1 -0
  112. package/dist/types/resources/workspaces.d.ts +63 -0
  113. package/dist/types/resources/workspaces.d.ts.map +1 -0
  114. package/dist/types/types/connections.d.ts +41 -0
  115. package/dist/types/types/connections.d.ts.map +1 -0
  116. package/dist/types/types/filesystem.d.ts +39 -0
  117. package/dist/types/types/filesystem.d.ts.map +1 -0
  118. package/dist/types/types/index.d.ts +9 -0
  119. package/dist/types/types/index.d.ts.map +1 -0
  120. package/dist/types/types/members.d.ts +30 -0
  121. package/dist/types/types/members.d.ts.map +1 -0
  122. package/dist/types/types/oauth.d.ts +40 -0
  123. package/dist/types/types/oauth.d.ts.map +1 -0
  124. package/dist/types/types/shared.d.ts +27 -0
  125. package/dist/types/types/shared.d.ts.map +1 -0
  126. package/dist/types/types/smart-folders.d.ts +45 -0
  127. package/dist/types/types/smart-folders.d.ts.map +1 -0
  128. package/dist/types/types/tokens.d.ts +40 -0
  129. package/dist/types/types/tokens.d.ts.map +1 -0
  130. package/dist/types/types/workspaces.d.ts +26 -0
  131. package/dist/types/types/workspaces.d.ts.map +1 -0
  132. package/dist/types/version.d.ts +3 -0
  133. package/dist/types/version.d.ts.map +1 -0
  134. package/package.json +45 -0
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Tokens = void 0;
4
+ /**
5
+ * Manage workspace-scoped authentication tokens.
6
+ *
7
+ * Tokens are used for CLI mounting (`airstore start --token <token>`)
8
+ * and per-workspace programmatic access.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const token = await airstore.tokens.create("ws_abc", {
13
+ * email: "agent@internal",
14
+ * name: "vm-mount",
15
+ * });
16
+ * // token.token -> pass to: airstore start --token <this>
17
+ * ```
18
+ */
19
+ class Tokens {
20
+ client;
21
+ constructor(client) {
22
+ this.client = client;
23
+ }
24
+ /**
25
+ * Create a workspace-scoped token.
26
+ *
27
+ * Either `memberId` or `email` must be provided. If `email` is given
28
+ * and no member with that email exists, one is auto-created.
29
+ *
30
+ * @param workspaceId - Workspace external ID.
31
+ * @param params - Token creation parameters.
32
+ * @param options - Per-request overrides.
33
+ * @returns The created token with raw value (shown once — store it safely).
34
+ */
35
+ async create(workspaceId, params, options) {
36
+ const body = {};
37
+ if (params.memberId !== undefined)
38
+ body['member_id'] = params.memberId;
39
+ if (params.email !== undefined)
40
+ body['email'] = params.email;
41
+ if (params.name !== undefined)
42
+ body['name'] = params.name;
43
+ if (params.expiresIn !== undefined)
44
+ body['expires_in'] = params.expiresIn;
45
+ return this.client.request('POST', `/workspaces/${workspaceId}/tokens`, body, undefined, options);
46
+ }
47
+ /**
48
+ * List tokens in a workspace.
49
+ *
50
+ * Raw token values are never returned — only metadata.
51
+ *
52
+ * @param workspaceId - Workspace external ID.
53
+ * @param options - Per-request overrides.
54
+ * @returns Array of token metadata.
55
+ */
56
+ async list(workspaceId, options) {
57
+ return this.client.request('GET', `/workspaces/${workspaceId}/tokens`, undefined, undefined, options);
58
+ }
59
+ /**
60
+ * Revoke (delete) a token. Once revoked, the token can no longer be used.
61
+ *
62
+ * @param workspaceId - Workspace external ID.
63
+ * @param tokenId - Token external ID.
64
+ * @param options - Per-request overrides.
65
+ *
66
+ * @throws {NotFoundError} If the token doesn't exist.
67
+ */
68
+ async revoke(workspaceId, tokenId, options) {
69
+ await this.client.request('DELETE', `/workspaces/${workspaceId}/tokens/${tokenId}`, undefined, undefined, options);
70
+ }
71
+ }
72
+ exports.Tokens = Tokens;
73
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../../src/resources/tokens.ts"],"names":[],"mappings":";;;AAGA;;;;;;;;;;;;;;GAcG;AACH,MAAa,MAAM;IACY;IAA7B,YAA6B,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;IAAG,CAAC;IAEnD;;;;;;;;;;OAUG;IACH,KAAK,CAAC,MAAM,CACV,WAAmB,EACnB,MAAyB,EACzB,OAAwB;QAExB,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;QACvE,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QAC7D,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;QAC1D,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;YAAE,IAAI,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;QAE1E,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,MAAM,EACN,eAAe,WAAW,SAAS,EACnC,IAAI,EACJ,SAAS,EACT,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CAAC,WAAmB,EAAE,OAAwB;QACtD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,KAAK,EACL,eAAe,WAAW,SAAS,EACnC,SAAS,EACT,SAAS,EACT,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,MAAM,CACV,WAAmB,EACnB,OAAe,EACf,OAAwB;QAExB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACvB,QAAQ,EACR,eAAe,WAAW,WAAW,OAAO,EAAE,EAC9C,SAAS,EACT,SAAS,EACT,OAAO,CACR,CAAC;IACJ,CAAC;CACF;AA3ED,wBA2EC"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Workspaces = void 0;
4
+ /**
5
+ * Manage workspaces.
6
+ *
7
+ * Workspaces are the top-level container for connections, smart folders,
8
+ * members, and the virtual filesystem. When using an organization token,
9
+ * workspaces are automatically scoped to the token's tenant.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const ws = await airstore.workspaces.create({ name: "user-123" });
14
+ * console.log(ws.external_id);
15
+ * ```
16
+ */
17
+ class Workspaces {
18
+ client;
19
+ constructor(client) {
20
+ this.client = client;
21
+ }
22
+ /**
23
+ * Create a new workspace.
24
+ *
25
+ * When called with an organization token, the workspace is automatically
26
+ * tagged with the token's `tenant_id`.
27
+ *
28
+ * @param params - Workspace creation parameters.
29
+ * @param options - Per-request overrides.
30
+ * @returns The newly created workspace.
31
+ *
32
+ * @throws {AuthenticationError} If the API key is invalid or missing.
33
+ * @throws {PermissionDeniedError} If the token lacks workspace creation rights.
34
+ */
35
+ async create(params, options) {
36
+ return this.client.request('POST', '/workspaces', params, undefined, options);
37
+ }
38
+ /**
39
+ * List all workspaces accessible to the authenticated token.
40
+ *
41
+ * Organization tokens only see workspaces belonging to their tenant.
42
+ * Cluster admin tokens see all workspaces.
43
+ *
44
+ * @param options - Per-request overrides.
45
+ * @returns Array of workspaces.
46
+ */
47
+ async list(options) {
48
+ return this.client.request('GET', '/workspaces', undefined, undefined, options);
49
+ }
50
+ /**
51
+ * Retrieve a workspace by its external ID.
52
+ *
53
+ * @param id - Workspace external ID (UUID).
54
+ * @param options - Per-request overrides.
55
+ * @returns The workspace.
56
+ *
57
+ * @throws {NotFoundError} If the workspace doesn't exist.
58
+ */
59
+ async retrieve(id, options) {
60
+ return this.client.request('GET', `/workspaces/${id}`, undefined, undefined, options);
61
+ }
62
+ /**
63
+ * Delete a workspace and all associated data.
64
+ *
65
+ * @param id - Workspace external ID (UUID).
66
+ * @param options - Per-request overrides.
67
+ *
68
+ * @throws {NotFoundError} If the workspace doesn't exist.
69
+ */
70
+ async del(id, options) {
71
+ await this.client.request('DELETE', `/workspaces/${id}`, undefined, undefined, options);
72
+ }
73
+ }
74
+ exports.Workspaces = Workspaces;
75
+ //# sourceMappingURL=workspaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../../src/resources/workspaces.ts"],"names":[],"mappings":";;;AAGA;;;;;;;;;;;;GAYG;AACH,MAAa,UAAU;IACQ;IAA7B,YAA6B,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;IAAG,CAAC;IAEnD;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,MAAM,CACV,MAA6B,EAC7B,OAAwB;QAExB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,MAAM,EACN,aAAa,EACb,MAAM,EACN,SAAS,EACT,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CAAC,OAAwB;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,KAAK,EACL,aAAa,EACb,SAAS,EACT,SAAS,EACT,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,OAAwB;QACjD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,KAAK,EACL,eAAe,EAAE,EAAE,EACnB,SAAS,EACT,SAAS,EACT,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,GAAG,CAAC,EAAU,EAAE,OAAwB;QAC5C,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACvB,QAAQ,EACR,eAAe,EAAE,EAAE,EACnB,SAAS,EACT,SAAS,EACT,OAAO,CACR,CAAC;IACJ,CAAC;CACF;AApFD,gCAoFC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=connections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections.js","sourceRoot":"","sources":["../../../src/types/connections.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../../src/types/filesystem.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./shared.js"), exports);
18
+ __exportStar(require("./workspaces.js"), exports);
19
+ __exportStar(require("./connections.js"), exports);
20
+ __exportStar(require("./smart-folders.js"), exports);
21
+ __exportStar(require("./tokens.js"), exports);
22
+ __exportStar(require("./members.js"), exports);
23
+ __exportStar(require("./oauth.js"), exports);
24
+ __exportStar(require("./filesystem.js"), exports);
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,kDAAgC;AAChC,mDAAiC;AACjC,qDAAmC;AACnC,8CAA4B;AAC5B,+CAA6B;AAC7B,6CAA2B;AAC3B,kDAAgC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=members.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"members.js","sourceRoot":"","sources":["../../../src/types/members.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/types/oauth.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/types/shared.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=smart-folders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-folders.js","sourceRoot":"","sources":["../../../src/types/smart-folders.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../../src/types/tokens.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=workspaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../../src/types/workspaces.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VERSION = void 0;
4
+ /** SDK version. Injected during build. */
5
+ exports.VERSION = '0.1.0';
6
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAA,0CAA0C;AAC7B,QAAA,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { CoreClient } from './client.js';
2
+ import { Workspaces } from './resources/workspaces.js';
3
+ import { Connections } from './resources/connections.js';
4
+ import { SmartFolders } from './resources/smart-folders.js';
5
+ import { Tokens } from './resources/tokens.js';
6
+ import { Members } from './resources/members.js';
7
+ import { OAuth } from './resources/oauth.js';
8
+ import { Filesystem } from './resources/filesystem.js';
9
+ /**
10
+ * The Airstore SDK client.
11
+ *
12
+ * Create an instance with your API key to interact with workspaces,
13
+ * connections, smart folders, tokens, members, the virtual filesystem,
14
+ * and OAuth sessions.
15
+ *
16
+ * @example Basic provisioning flow
17
+ * ```ts
18
+ * import Airstore from '@airstore/sdk';
19
+ *
20
+ * const airstore = new Airstore({ apiKey: 'org_...' });
21
+ *
22
+ * // 1. Create a workspace for a new user
23
+ * const ws = await airstore.workspaces.create({ name: 'user-123' });
24
+ *
25
+ * // 2. Connect their Gmail with existing OAuth tokens
26
+ * await airstore.connections.create(ws.external_id, {
27
+ * integrationType: 'gmail',
28
+ * accessToken: existingAccessToken,
29
+ * refreshToken: existingRefreshToken,
30
+ * });
31
+ *
32
+ * // 3. Set up a smart folder
33
+ * await airstore.smartFolders.create(ws.external_id, {
34
+ * integration: 'gmail',
35
+ * name: 'Recent Emails',
36
+ * guidance: 'Last 7 days of emails from the inbox',
37
+ * });
38
+ *
39
+ * // 4. Generate a mount token for the user's VM
40
+ * const token = await airstore.tokens.create(ws.external_id, {
41
+ * email: 'agent@internal',
42
+ * name: 'vm-mount',
43
+ * });
44
+ * // Pass token.token to: airstore start --token <token>
45
+ * ```
46
+ *
47
+ * @example Per-request options
48
+ * ```ts
49
+ * const ws = await airstore.workspaces.list({
50
+ * timeout: 10_000,
51
+ * maxRetries: 5,
52
+ * });
53
+ * ```
54
+ */
55
+ export class Airstore extends CoreClient {
56
+ /**
57
+ * Manage workspaces.
58
+ *
59
+ * Workspaces are the top-level container for connections, smart folders,
60
+ * members, and the virtual filesystem.
61
+ */
62
+ workspaces;
63
+ /**
64
+ * Manage connections (integrations) within a workspace.
65
+ *
66
+ * Pass existing OAuth tokens or API keys to connect external services
67
+ * like Gmail, GitHub, Notion, etc.
68
+ */
69
+ connections;
70
+ /**
71
+ * Manage smart folders (filesystem queries).
72
+ *
73
+ * Smart folders use LLM inference to automatically organize and filter
74
+ * data from connected integrations into virtual folders or files.
75
+ */
76
+ smartFolders;
77
+ /**
78
+ * Manage workspace-scoped authentication tokens.
79
+ *
80
+ * Tokens are used for CLI mounting and per-workspace programmatic access.
81
+ */
82
+ tokens;
83
+ /**
84
+ * Manage workspace members.
85
+ *
86
+ * Members are users with roles (admin, member, viewer) in a workspace.
87
+ */
88
+ members;
89
+ /**
90
+ * OAuth session management for interactive connection setup.
91
+ *
92
+ * Use this for browser-redirect flows where users authorize
93
+ * integrations themselves.
94
+ */
95
+ oauth;
96
+ /**
97
+ * Read-only access to the workspace virtual filesystem.
98
+ *
99
+ * Browse directories, read files, and inspect metadata across
100
+ * all connected integrations.
101
+ */
102
+ fs;
103
+ /**
104
+ * Create a new Airstore SDK client.
105
+ *
106
+ * @param opts - Client configuration. At minimum, provide an `apiKey`
107
+ * or set the `AIRSTORE_API_KEY` environment variable.
108
+ *
109
+ * @throws {AirstoreError} If no API key is provided.
110
+ */
111
+ constructor(opts) {
112
+ super(opts);
113
+ this.workspaces = new Workspaces(this);
114
+ this.connections = new Connections(this);
115
+ this.smartFolders = new SmartFolders(this);
116
+ this.tokens = new Tokens(this);
117
+ this.members = new Members(this);
118
+ this.oauth = new OAuth(this);
119
+ this.fs = new Filesystem(this);
120
+ }
121
+ }
122
+ export default Airstore;
123
+ //# sourceMappingURL=airstore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"airstore.js","sourceRoot":"","sources":["../../src/airstore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,MAAM,OAAO,QAAS,SAAQ,UAAU;IACtC;;;;;OAKG;IACM,UAAU,CAAa;IAEhC;;;;;OAKG;IACM,WAAW,CAAc;IAElC;;;;;OAKG;IACM,YAAY,CAAe;IAEpC;;;;OAIG;IACM,MAAM,CAAS;IAExB;;;;OAIG;IACM,OAAO,CAAU;IAE1B;;;;;OAKG;IACM,KAAK,CAAQ;IAEtB;;;;;OAKG;IACM,EAAE,CAAa;IAExB;;;;;;;OAOG;IACH,YAAY,IAAoB;QAC9B,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;CACF;AAED,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,209 @@
1
+ import { VERSION } from './version.js';
2
+ import { APIError, APIConnectionError, APIConnectionTimeoutError, AirstoreError, } from './errors.js';
3
+ export function attachResponseMeta(obj, meta) {
4
+ Object.defineProperty(obj, 'lastResponse', {
5
+ value: meta,
6
+ enumerable: false,
7
+ configurable: true,
8
+ });
9
+ return obj;
10
+ }
11
+ /** Retryable status codes. */
12
+ const RETRYABLE_STATUS_CODES = new Set([408, 409, 429, 500, 502, 503, 504]);
13
+ /** Base backoff in ms. */
14
+ const BASE_BACKOFF_MS = 500;
15
+ /** Max backoff in ms. */
16
+ const MAX_BACKOFF_MS = 8000;
17
+ /**
18
+ * Core HTTP client for the Airstore API.
19
+ *
20
+ * Handles authentication, automatic retries with exponential backoff,
21
+ * timeout, and per-request option overrides.
22
+ */
23
+ export class CoreClient {
24
+ apiKey;
25
+ baseURL;
26
+ timeout;
27
+ maxRetries;
28
+ defaultHeaders;
29
+ constructor(opts = {}) {
30
+ this.apiKey =
31
+ opts.apiKey ??
32
+ (typeof process !== 'undefined' ? process.env?.['AIRSTORE_API_KEY'] ?? '' : '');
33
+ if (!this.apiKey) {
34
+ throw new AirstoreError('API key is required. Pass it via the `apiKey` option or set the AIRSTORE_API_KEY environment variable.');
35
+ }
36
+ const envBaseURL = typeof process !== 'undefined'
37
+ ? (process.env?.['AIRSTORE_BASE_URL'] ?? '')
38
+ : '';
39
+ this.baseURL = (opts.baseURL ?? (envBaseURL || 'https://api.airstore.ai/api/v1')).replace(/\/+$/, '');
40
+ this.timeout = opts.timeout ?? 60_000;
41
+ this.maxRetries = opts.maxRetries ?? 2;
42
+ this.defaultHeaders = opts.defaultHeaders ?? {};
43
+ }
44
+ /** Make an API request with retry and timeout. */
45
+ async request(method, path, body, params, reqOpts) {
46
+ const url = this._buildURL(path, params);
47
+ const timeout = reqOpts?.timeout ?? this.timeout;
48
+ const maxRetries = reqOpts?.maxRetries ?? this.maxRetries;
49
+ const headers = this._buildHeaders(reqOpts?.headers);
50
+ let lastError;
51
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
52
+ if (attempt > 0) {
53
+ await this._sleep(this._backoffMs(attempt, lastError));
54
+ }
55
+ const controller = new AbortController();
56
+ if (reqOpts?.signal) {
57
+ reqOpts.signal.addEventListener('abort', () => controller.abort(), { once: true });
58
+ }
59
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
60
+ try {
61
+ const fetchOpts = {
62
+ method,
63
+ headers,
64
+ signal: controller.signal,
65
+ };
66
+ if (body !== undefined && method !== 'GET' && method !== 'HEAD') {
67
+ fetchOpts.body = JSON.stringify(body);
68
+ }
69
+ const response = await fetch(url, fetchOpts);
70
+ clearTimeout(timeoutId);
71
+ const meta = {
72
+ statusCode: response.status,
73
+ headers: response.headers,
74
+ requestId: response.headers.get('x-request-id') ??
75
+ response.headers.get('X-Request-Id') ??
76
+ undefined,
77
+ };
78
+ if (response.ok) {
79
+ const data = (await response.json());
80
+ // Airstore API wraps responses in { success, data }
81
+ const result = (data.data ?? data);
82
+ return attachResponseMeta(result, meta);
83
+ }
84
+ // Non-retryable error
85
+ if (!RETRYABLE_STATUS_CODES.has(response.status) || attempt === maxRetries) {
86
+ let errorMessage = `Request failed with status ${response.status}`;
87
+ try {
88
+ const errBody = await response.json();
89
+ errorMessage = errBody?.error ?? errBody?.message ?? errorMessage;
90
+ }
91
+ catch {
92
+ // ignore parse errors
93
+ }
94
+ throw APIError.generate(response.status, null, errorMessage, response.headers);
95
+ }
96
+ // Retryable — store error and continue
97
+ lastError = APIError.generate(response.status, null, `Retryable error (${response.status})`, response.headers);
98
+ }
99
+ catch (err) {
100
+ clearTimeout(timeoutId);
101
+ if (err instanceof APIError) {
102
+ if (!RETRYABLE_STATUS_CODES.has(err.status) || attempt === maxRetries) {
103
+ throw err;
104
+ }
105
+ lastError = err;
106
+ continue;
107
+ }
108
+ if (err instanceof DOMException && err.name === 'AbortError') {
109
+ if (reqOpts?.signal?.aborted) {
110
+ throw new AirstoreError('Request was cancelled');
111
+ }
112
+ throw new APIConnectionTimeoutError();
113
+ }
114
+ if (attempt === maxRetries) {
115
+ throw new APIConnectionError(`Connection error: ${err instanceof Error ? err.message : String(err)}`, err);
116
+ }
117
+ lastError = err;
118
+ }
119
+ }
120
+ throw lastError ?? new AirstoreError('Request failed after retries');
121
+ }
122
+ /**
123
+ * Build full URL with query params.
124
+ *
125
+ * Uses string concatenation to preserve the base path prefix (e.g. `/api/v1`).
126
+ * `new URL(path, base)` would resolve absolute paths against the origin,
127
+ * dropping the base path — so we avoid it.
128
+ */
129
+ _buildURL(path, params) {
130
+ const suffix = path.startsWith('/') ? path : `/${path}`;
131
+ const url = new URL(`${this.baseURL}${suffix}`);
132
+ if (params) {
133
+ for (const [key, value] of Object.entries(params)) {
134
+ if (value !== undefined && value !== '') {
135
+ url.searchParams.set(key, value);
136
+ }
137
+ }
138
+ }
139
+ return url.toString();
140
+ }
141
+ /** Build request headers. */
142
+ _buildHeaders(extra) {
143
+ return {
144
+ 'Content-Type': 'application/json',
145
+ Authorization: `Bearer ${this.apiKey}`,
146
+ 'User-Agent': `airstore-sdk-typescript/${VERSION}`,
147
+ ...this.defaultHeaders,
148
+ ...extra,
149
+ };
150
+ }
151
+ /** Calculate backoff with jitter. */
152
+ _backoffMs(attempt, lastError) {
153
+ // Respect Retry-After headers if present.
154
+ // retry-after-ms is already in milliseconds; retry-after is in seconds.
155
+ if (lastError instanceof APIError) {
156
+ const retryAfterMs = lastError.headers.get('retry-after-ms');
157
+ if (retryAfterMs) {
158
+ const ms = Number(retryAfterMs);
159
+ if (!isNaN(ms))
160
+ return ms;
161
+ }
162
+ const retryAfter = lastError.headers.get('retry-after');
163
+ if (retryAfter) {
164
+ const seconds = Number(retryAfter);
165
+ if (!isNaN(seconds))
166
+ return seconds * 1000;
167
+ }
168
+ }
169
+ const base = BASE_BACKOFF_MS * Math.pow(2, attempt - 1);
170
+ const jitter = Math.random() * base * 0.5;
171
+ return Math.min(base + jitter, MAX_BACKOFF_MS);
172
+ }
173
+ /** Sleep helper. */
174
+ _sleep(ms) {
175
+ return new Promise((resolve) => setTimeout(resolve, ms));
176
+ }
177
+ /**
178
+ * Make a raw HTTP request to any API path.
179
+ * Escape hatch for endpoints not yet covered by the SDK.
180
+ */
181
+ async rawRequest(method, path, opts) {
182
+ const url = this._buildURL(path, opts?.params);
183
+ const headers = this._buildHeaders(opts?.headers);
184
+ const controller = new AbortController();
185
+ if (opts?.signal) {
186
+ opts.signal.addEventListener('abort', () => controller.abort(), { once: true });
187
+ }
188
+ const timeoutMs = opts?.timeout ?? this.timeout;
189
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
190
+ try {
191
+ const fetchOpts = {
192
+ method,
193
+ headers,
194
+ signal: controller.signal,
195
+ };
196
+ if (opts?.body !== undefined) {
197
+ fetchOpts.body = JSON.stringify(opts.body);
198
+ }
199
+ const resp = await fetch(url, fetchOpts);
200
+ clearTimeout(timeoutId);
201
+ return resp;
202
+ }
203
+ catch (err) {
204
+ clearTimeout(timeoutId);
205
+ throw new APIConnectionError(`Raw request failed: ${err instanceof Error ? err.message : String(err)}`, err);
206
+ }
207
+ }
208
+ }
209
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}