@tuskydp/cli 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 (153) hide show
  1. package/dist/bin/tuskydp.d.ts +3 -0
  2. package/dist/bin/tuskydp.d.ts.map +1 -0
  3. package/dist/bin/tuskydp.js +3 -0
  4. package/dist/bin/tuskydp.js.map +1 -0
  5. package/dist/src/client.d.ts +120 -0
  6. package/dist/src/client.d.ts.map +1 -0
  7. package/dist/src/client.js +152 -0
  8. package/dist/src/client.js.map +1 -0
  9. package/dist/src/commands/account.d.ts +3 -0
  10. package/dist/src/commands/account.d.ts.map +1 -0
  11. package/dist/src/commands/account.js +66 -0
  12. package/dist/src/commands/account.js.map +1 -0
  13. package/dist/src/commands/auth.d.ts +3 -0
  14. package/dist/src/commands/auth.d.ts.map +1 -0
  15. package/dist/src/commands/auth.js +171 -0
  16. package/dist/src/commands/auth.js.map +1 -0
  17. package/dist/src/commands/decrypt.d.ts +15 -0
  18. package/dist/src/commands/decrypt.d.ts.map +1 -0
  19. package/dist/src/commands/decrypt.js +224 -0
  20. package/dist/src/commands/decrypt.js.map +1 -0
  21. package/dist/src/commands/download.d.ts +5 -0
  22. package/dist/src/commands/download.d.ts.map +1 -0
  23. package/dist/src/commands/download.js +67 -0
  24. package/dist/src/commands/download.js.map +1 -0
  25. package/dist/src/commands/encryption.d.ts +3 -0
  26. package/dist/src/commands/encryption.d.ts.map +1 -0
  27. package/dist/src/commands/encryption.js +254 -0
  28. package/dist/src/commands/encryption.js.map +1 -0
  29. package/dist/src/commands/export.d.ts +70 -0
  30. package/dist/src/commands/export.d.ts.map +1 -0
  31. package/dist/src/commands/export.js +178 -0
  32. package/dist/src/commands/export.js.map +1 -0
  33. package/dist/src/commands/files.d.ts +3 -0
  34. package/dist/src/commands/files.d.ts.map +1 -0
  35. package/dist/src/commands/files.js +179 -0
  36. package/dist/src/commands/files.js.map +1 -0
  37. package/dist/src/commands/mcp.d.ts +8 -0
  38. package/dist/src/commands/mcp.d.ts.map +1 -0
  39. package/dist/src/commands/mcp.js +178 -0
  40. package/dist/src/commands/mcp.js.map +1 -0
  41. package/dist/src/commands/rehydrate.d.ts +5 -0
  42. package/dist/src/commands/rehydrate.d.ts.map +1 -0
  43. package/dist/src/commands/rehydrate.js +27 -0
  44. package/dist/src/commands/rehydrate.js.map +1 -0
  45. package/dist/src/commands/tui.d.ts +3 -0
  46. package/dist/src/commands/tui.d.ts.map +1 -0
  47. package/dist/src/commands/tui.js +10 -0
  48. package/dist/src/commands/tui.js.map +1 -0
  49. package/dist/src/commands/upload.d.ts +6 -0
  50. package/dist/src/commands/upload.d.ts.map +1 -0
  51. package/dist/src/commands/upload.js +121 -0
  52. package/dist/src/commands/upload.js.map +1 -0
  53. package/dist/src/commands/vault.d.ts +3 -0
  54. package/dist/src/commands/vault.d.ts.map +1 -0
  55. package/dist/src/commands/vault.js +118 -0
  56. package/dist/src/commands/vault.js.map +1 -0
  57. package/dist/src/config.d.ts +15 -0
  58. package/dist/src/config.d.ts.map +1 -0
  59. package/dist/src/config.js +26 -0
  60. package/dist/src/config.js.map +1 -0
  61. package/dist/src/crypto.d.ts +16 -0
  62. package/dist/src/crypto.d.ts.map +1 -0
  63. package/dist/src/crypto.js +95 -0
  64. package/dist/src/crypto.js.map +1 -0
  65. package/dist/src/index.d.ts +2 -0
  66. package/dist/src/index.d.ts.map +1 -0
  67. package/dist/src/index.js +59 -0
  68. package/dist/src/index.js.map +1 -0
  69. package/dist/src/lib/keyring.d.ts +4 -0
  70. package/dist/src/lib/keyring.d.ts.map +1 -0
  71. package/dist/src/lib/keyring.js +51 -0
  72. package/dist/src/lib/keyring.js.map +1 -0
  73. package/dist/src/lib/output.d.ts +6 -0
  74. package/dist/src/lib/output.d.ts.map +1 -0
  75. package/dist/src/lib/output.js +37 -0
  76. package/dist/src/lib/output.js.map +1 -0
  77. package/dist/src/lib/progress.d.ts +2 -0
  78. package/dist/src/lib/progress.d.ts.map +1 -0
  79. package/dist/src/lib/progress.js +5 -0
  80. package/dist/src/lib/progress.js.map +1 -0
  81. package/dist/src/lib/resolve.d.ts +3 -0
  82. package/dist/src/lib/resolve.d.ts.map +1 -0
  83. package/dist/src/lib/resolve.js +25 -0
  84. package/dist/src/lib/resolve.js.map +1 -0
  85. package/dist/src/mcp/context.d.ts +19 -0
  86. package/dist/src/mcp/context.d.ts.map +1 -0
  87. package/dist/src/mcp/context.js +8 -0
  88. package/dist/src/mcp/context.js.map +1 -0
  89. package/dist/src/mcp/server.d.ts +13 -0
  90. package/dist/src/mcp/server.d.ts.map +1 -0
  91. package/dist/src/mcp/server.js +113 -0
  92. package/dist/src/mcp/server.js.map +1 -0
  93. package/dist/src/mcp/tools/account.d.ts +7 -0
  94. package/dist/src/mcp/tools/account.d.ts.map +1 -0
  95. package/dist/src/mcp/tools/account.js +31 -0
  96. package/dist/src/mcp/tools/account.js.map +1 -0
  97. package/dist/src/mcp/tools/files.d.ts +10 -0
  98. package/dist/src/mcp/tools/files.d.ts.map +1 -0
  99. package/dist/src/mcp/tools/files.js +310 -0
  100. package/dist/src/mcp/tools/files.js.map +1 -0
  101. package/dist/src/mcp/tools/folders.d.ts +7 -0
  102. package/dist/src/mcp/tools/folders.d.ts.map +1 -0
  103. package/dist/src/mcp/tools/folders.js +67 -0
  104. package/dist/src/mcp/tools/folders.js.map +1 -0
  105. package/dist/src/mcp/tools/helpers.d.ts +15 -0
  106. package/dist/src/mcp/tools/helpers.d.ts.map +1 -0
  107. package/dist/src/mcp/tools/helpers.js +25 -0
  108. package/dist/src/mcp/tools/helpers.js.map +1 -0
  109. package/dist/src/mcp/tools/trash.d.ts +7 -0
  110. package/dist/src/mcp/tools/trash.d.ts.map +1 -0
  111. package/dist/src/mcp/tools/trash.js +46 -0
  112. package/dist/src/mcp/tools/trash.js.map +1 -0
  113. package/dist/src/mcp/tools/vaults.d.ts +7 -0
  114. package/dist/src/mcp/tools/vaults.d.ts.map +1 -0
  115. package/dist/src/mcp/tools/vaults.js +85 -0
  116. package/dist/src/mcp/tools/vaults.js.map +1 -0
  117. package/dist/src/sdk.d.ts +53 -0
  118. package/dist/src/sdk.d.ts.map +1 -0
  119. package/dist/src/sdk.js +88 -0
  120. package/dist/src/sdk.js.map +1 -0
  121. package/dist/src/tui/auth-screen.d.ts +6 -0
  122. package/dist/src/tui/auth-screen.d.ts.map +1 -0
  123. package/dist/src/tui/auth-screen.js +165 -0
  124. package/dist/src/tui/auth-screen.js.map +1 -0
  125. package/dist/src/tui/dialogs.d.ts +10 -0
  126. package/dist/src/tui/dialogs.d.ts.map +1 -0
  127. package/dist/src/tui/dialogs.js +303 -0
  128. package/dist/src/tui/dialogs.js.map +1 -0
  129. package/dist/src/tui/files-panel.d.ts +34 -0
  130. package/dist/src/tui/files-panel.d.ts.map +1 -0
  131. package/dist/src/tui/files-panel.js +135 -0
  132. package/dist/src/tui/files-panel.js.map +1 -0
  133. package/dist/src/tui/helpers.d.ts +38 -0
  134. package/dist/src/tui/helpers.d.ts.map +1 -0
  135. package/dist/src/tui/helpers.js +187 -0
  136. package/dist/src/tui/helpers.js.map +1 -0
  137. package/dist/src/tui/index.d.ts +2 -0
  138. package/dist/src/tui/index.d.ts.map +1 -0
  139. package/dist/src/tui/index.js +382 -0
  140. package/dist/src/tui/index.js.map +1 -0
  141. package/dist/src/tui/overview.d.ts +4 -0
  142. package/dist/src/tui/overview.d.ts.map +1 -0
  143. package/dist/src/tui/overview.js +136 -0
  144. package/dist/src/tui/overview.js.map +1 -0
  145. package/dist/src/tui/status-bar.d.ts +18 -0
  146. package/dist/src/tui/status-bar.d.ts.map +1 -0
  147. package/dist/src/tui/status-bar.js +54 -0
  148. package/dist/src/tui/status-bar.js.map +1 -0
  149. package/dist/src/tui/vaults-panel.d.ts +26 -0
  150. package/dist/src/tui/vaults-panel.d.ts.map +1 -0
  151. package/dist/src/tui/vaults-panel.js +118 -0
  152. package/dist/src/tui/vaults-panel.js.map +1 -0
  153. package/package.json +42 -0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import '../src/index.js';
3
+ //# sourceMappingURL=tuskydp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuskydp.d.ts","sourceRoot":"","sources":["../../bin/tuskydp.ts"],"names":[],"mappings":";AACA,OAAO,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import '../src/index.js';
3
+ //# sourceMappingURL=tuskydp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuskydp.js","sourceRoot":"","sources":["../../bin/tuskydp.ts"],"names":[],"mappings":";AACA,OAAO,iBAAiB,CAAC"}
@@ -0,0 +1,120 @@
1
+ export declare class TuskyDPApiError extends Error {
2
+ statusCode: number;
3
+ constructor(statusCode: number, message: string);
4
+ }
5
+ export declare class TuskyDPClient {
6
+ private apiUrl;
7
+ private apiKey;
8
+ constructor(apiUrl: string, apiKey: string);
9
+ private request;
10
+ createVault(name: string, description?: string, visibility?: 'public' | 'private'): Promise<{
11
+ vault: any;
12
+ }>;
13
+ listVaults(): Promise<{
14
+ vaults: any[];
15
+ }>;
16
+ getVault(vaultId: string): Promise<{
17
+ vault: any;
18
+ }>;
19
+ updateVault(vaultId: string, updates: {
20
+ name?: string;
21
+ description?: string;
22
+ }): Promise<{
23
+ vault: any;
24
+ }>;
25
+ deleteVault(vaultId: string, force?: boolean): Promise<{
26
+ success: boolean;
27
+ }>;
28
+ requestUpload(params: {
29
+ name: string;
30
+ mimeType: string;
31
+ sizeBytes: number;
32
+ vaultId: string;
33
+ wrappedKey?: string;
34
+ encryptionIv?: string;
35
+ plaintextSizeBytes?: number;
36
+ plaintextChecksumSha256?: string;
37
+ }): Promise<{
38
+ fileId: string;
39
+ uploadUrl: string;
40
+ spacesKey: string;
41
+ }>;
42
+ confirmUpload(fileId: string): Promise<{
43
+ file: any;
44
+ }>;
45
+ getDownloadUrl(fileId: string): Promise<{
46
+ downloadUrl: string | null;
47
+ status: string;
48
+ encryption: any;
49
+ message?: string;
50
+ pollUrl?: string;
51
+ }>;
52
+ listFiles(params?: {
53
+ vaultId?: string;
54
+ limit?: number;
55
+ sortBy?: string;
56
+ order?: string;
57
+ }): Promise<{
58
+ files: any[];
59
+ nextCursor: string | null;
60
+ }>;
61
+ getFileInfo(fileId: string): Promise<any>;
62
+ deleteFile(fileId: string): Promise<{
63
+ success: boolean;
64
+ }>;
65
+ retryFile(fileId: string): Promise<{
66
+ file: any;
67
+ message: string;
68
+ }>;
69
+ retryAllFiles(): Promise<{
70
+ retriedCount: number;
71
+ message: string;
72
+ }>;
73
+ getEncryptionParams(): Promise<{
74
+ setupComplete: boolean;
75
+ salt?: string;
76
+ verifier?: string;
77
+ encryptedMasterKey?: string;
78
+ }>;
79
+ setupEncryption(salt: string, verifier: string, encryptedMasterKey: string, wrappedMasterKeyBackup: string): Promise<{
80
+ success: boolean;
81
+ }>;
82
+ getRecoveryData(): Promise<{
83
+ wrappedMasterKeyBackup: string;
84
+ }>;
85
+ resetEncryption(salt: string, verifier: string, encryptedMasterKey: string, wrappedMasterKeyBackup: string): Promise<{
86
+ success: boolean;
87
+ }>;
88
+ register(email: string, password: string, displayName?: string): Promise<{
89
+ user: any;
90
+ accessToken: string;
91
+ refreshToken: string;
92
+ }>;
93
+ login(email: string, password: string): Promise<{
94
+ user: any;
95
+ accessToken: string;
96
+ refreshToken: string;
97
+ }>;
98
+ createApiKeyWithJwt(accessToken: string, name: string): Promise<{
99
+ apiKey: string;
100
+ name: string;
101
+ keyPrefix: string;
102
+ }>;
103
+ getAccount(): Promise<any>;
104
+ getPlans(): Promise<{
105
+ plans: any[];
106
+ }>;
107
+ createApiKey(params: {
108
+ name: string;
109
+ scopes?: string[];
110
+ vaultIds?: string[];
111
+ expiresInDays?: number;
112
+ }): Promise<any>;
113
+ listApiKeys(): Promise<{
114
+ apiKeys: any[];
115
+ }>;
116
+ revokeApiKey(keyId: string): Promise<{
117
+ success: boolean;
118
+ }>;
119
+ }
120
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAEA,qBAAa,eAAgB,SAAQ,KAAK;IACrB,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIvD;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;YAK5B,OAAO;IAuBf,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS;eACxD,GAAG;;IAE5B,UAAU;gBACgB,GAAG,EAAE;;IAE/B,QAAQ,CAAC,OAAO,EAAE,MAAM;eACC,GAAG;;IAE5B,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;eACpD,GAAG;;IAE5B,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,UAAQ;iBACf,OAAO;;IAIlC,aAAa,CAAC,MAAM,EAAE;QAC1B,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QACnE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;KAC/D;gBAC+B,MAAM;mBAAa,MAAM;mBAAa,MAAM;;IAEtE,aAAa,CAAC,MAAM,EAAE,MAAM;cACJ,GAAG;;IAE3B,cAAc,CAAC,MAAM,EAAE,MAAM;qBACE,MAAM,GAAG,IAAI;gBAAU,MAAM;oBAAc,GAAG;kBAAY,MAAM;kBAAY,MAAM;;IAEjH,SAAS,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;eAI/D,GAAG,EAAE;oBAAc,MAAM,GAAG,IAAI;;IAEzD,WAAW,CAAC,MAAM,EAAE,MAAM;IAG1B,UAAU,CAAC,MAAM,EAAE,MAAM;iBACE,OAAO;;IAElC,SAAS,CAAC,MAAM,EAAE,MAAM;cACA,GAAG;iBAAW,MAAM;;IAE5C,aAAa;sBACmB,MAAM;iBAAW,MAAM;;IAIvD,mBAAmB;uBACc,OAAO;eAAS,MAAM;mBAAa,MAAM;6BAAuB,MAAM;;IAEvG,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM;iBAC/E,OAAO;;IAElC,eAAe;gCAC2B,MAAM;;IAEhD,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM;iBAC/E,OAAO;;IAIlC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;cAUxB,GAAG;qBAAe,MAAM;sBAAgB,MAAM;;IAGpF,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;cAUC,GAAG;qBAAe,MAAM;sBAAgB,MAAM;;IAGpF,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;gBAcb,MAAM;cAAQ,MAAM;mBAAa,MAAM;;IAI/E,UAAU;IAKV,QAAQ;eAEiB,GAAG,EAAE;;IAI9B,YAAY,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE;IAGrG,WAAW;iBACgB,GAAG,EAAE;;IAEhC,YAAY,CAAC,KAAK,EAAE,MAAM;iBACC,OAAO;;CAEzC"}
@@ -0,0 +1,152 @@
1
+ const VERSION = '0.1.0';
2
+ export class TuskyDPApiError extends Error {
3
+ statusCode;
4
+ constructor(statusCode, message) {
5
+ super(message);
6
+ this.statusCode = statusCode;
7
+ this.name = 'TuskyDPApiError';
8
+ }
9
+ }
10
+ export class TuskyDPClient {
11
+ apiUrl;
12
+ apiKey;
13
+ constructor(apiUrl, apiKey) {
14
+ this.apiUrl = apiUrl.replace(/\/$/, '');
15
+ this.apiKey = apiKey;
16
+ }
17
+ async request(method, path, body) {
18
+ const headers = {
19
+ 'Authorization': `Bearer ${this.apiKey}`,
20
+ 'User-Agent': `tusky-cli/${VERSION}`,
21
+ };
22
+ if (body) {
23
+ headers['Content-Type'] = 'application/json';
24
+ }
25
+ const response = await fetch(`${this.apiUrl}${path}`, {
26
+ method,
27
+ headers,
28
+ body: body ? JSON.stringify(body) : undefined,
29
+ });
30
+ if (!response.ok) {
31
+ const error = await response.json().catch(() => ({ error: response.statusText }));
32
+ throw new TuskyDPApiError(response.status, error.error || 'Unknown error');
33
+ }
34
+ return response.json();
35
+ }
36
+ // Vaults
37
+ async createVault(name, description, visibility) {
38
+ return this.request('POST', '/api/vaults', { name, description, visibility: visibility || 'private' });
39
+ }
40
+ async listVaults() {
41
+ return this.request('GET', '/api/vaults');
42
+ }
43
+ async getVault(vaultId) {
44
+ return this.request('GET', `/api/vaults/${vaultId}`);
45
+ }
46
+ async updateVault(vaultId, updates) {
47
+ return this.request('PATCH', `/api/vaults/${vaultId}`, updates);
48
+ }
49
+ async deleteVault(vaultId, force = false) {
50
+ return this.request('DELETE', `/api/vaults/${vaultId}?force=${force}`);
51
+ }
52
+ // Files
53
+ async requestUpload(params) {
54
+ return this.request('POST', '/api/files/upload', params);
55
+ }
56
+ async confirmUpload(fileId) {
57
+ return this.request('POST', `/api/files/${fileId}/confirm`);
58
+ }
59
+ async getDownloadUrl(fileId) {
60
+ return this.request('GET', `/api/files/${fileId}/download`);
61
+ }
62
+ async listFiles(params) {
63
+ const qs = params ? new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined).map(([k, v]) => [k, String(v)]))).toString() : '';
64
+ return this.request('GET', `/api/files${qs ? `?${qs}` : ''}`);
65
+ }
66
+ async getFileInfo(fileId) {
67
+ return this.request('GET', `/api/files/${fileId}/status`);
68
+ }
69
+ async deleteFile(fileId) {
70
+ return this.request('DELETE', `/api/files/${fileId}`);
71
+ }
72
+ async retryFile(fileId) {
73
+ return this.request('POST', `/api/files/${fileId}/retry`);
74
+ }
75
+ async retryAllFiles() {
76
+ return this.request('POST', '/api/files/retry-all');
77
+ }
78
+ // Encryption
79
+ async getEncryptionParams() {
80
+ return this.request('GET', '/api/account/encryption/params');
81
+ }
82
+ async setupEncryption(salt, verifier, encryptedMasterKey, wrappedMasterKeyBackup) {
83
+ return this.request('POST', '/api/account/encryption/setup', { salt, verifier, encryptedMasterKey, wrappedMasterKeyBackup });
84
+ }
85
+ async getRecoveryData() {
86
+ return this.request('GET', '/api/account/encryption/recovery');
87
+ }
88
+ async resetEncryption(salt, verifier, encryptedMasterKey, wrappedMasterKeyBackup) {
89
+ return this.request('POST', '/api/account/encryption/reset', { salt, verifier, encryptedMasterKey, wrappedMasterKeyBackup });
90
+ }
91
+ // Auth (no stored API key needed)
92
+ async register(email, password, displayName) {
93
+ const response = await fetch(`${this.apiUrl}/api/auth/register`, {
94
+ method: 'POST',
95
+ headers: { 'Content-Type': 'application/json', 'User-Agent': `tusky-cli/${VERSION}` },
96
+ body: JSON.stringify({ email, password, displayName }),
97
+ });
98
+ if (!response.ok) {
99
+ const error = await response.json().catch(() => ({ error: response.statusText }));
100
+ throw new TuskyDPApiError(response.status, error.error || 'Unknown error');
101
+ }
102
+ return response.json();
103
+ }
104
+ async login(email, password) {
105
+ const response = await fetch(`${this.apiUrl}/api/auth/login`, {
106
+ method: 'POST',
107
+ headers: { 'Content-Type': 'application/json', 'User-Agent': `tusky-cli/${VERSION}` },
108
+ body: JSON.stringify({ email, password }),
109
+ });
110
+ if (!response.ok) {
111
+ const error = await response.json().catch(() => ({ error: response.statusText }));
112
+ throw new TuskyDPApiError(response.status, error.error || 'Unknown error');
113
+ }
114
+ return response.json();
115
+ }
116
+ async createApiKeyWithJwt(accessToken, name) {
117
+ const response = await fetch(`${this.apiUrl}/api/auth/api-keys`, {
118
+ method: 'POST',
119
+ headers: {
120
+ 'Content-Type': 'application/json',
121
+ 'Authorization': `Bearer ${accessToken}`,
122
+ 'User-Agent': `tusky-cli/${VERSION}`,
123
+ },
124
+ body: JSON.stringify({ name, scopes: ['files:read', 'files:write', 'vaults:read', 'vaults:write'] }),
125
+ });
126
+ if (!response.ok) {
127
+ const error = await response.json().catch(() => ({ error: response.statusText }));
128
+ throw new TuskyDPApiError(response.status, error.error || 'Unknown error');
129
+ }
130
+ return response.json();
131
+ }
132
+ // Account
133
+ async getAccount() {
134
+ return this.request('GET', '/api/account');
135
+ }
136
+ // Plans
137
+ async getPlans() {
138
+ // Public endpoint — no auth needed but request() adds it harmlessly
139
+ return this.request('GET', '/api/plans');
140
+ }
141
+ // API Keys
142
+ async createApiKey(params) {
143
+ return this.request('POST', '/api/auth/api-keys', params);
144
+ }
145
+ async listApiKeys() {
146
+ return this.request('GET', '/api/auth/api-keys');
147
+ }
148
+ async revokeApiKey(keyId) {
149
+ return this.request('DELETE', `/api/auth/api-keys/${keyId}`);
150
+ }
151
+ }
152
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerAccountCommands(program: Command): void;
3
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../src/commands/account.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QAwEvD"}
@@ -0,0 +1,66 @@
1
+ import chalk from 'chalk';
2
+ import { cliConfig, getApiUrl, getApiKey } from '../config.js';
3
+ import { createSDKClient, AuthClient } from '../sdk.js';
4
+ import { formatBytes } from '@tuskydp/shared/plans.js';
5
+ export function registerAccountCommands(program) {
6
+ const account = program.command('account').description('Account management');
7
+ account.command('info')
8
+ .description('Show account info')
9
+ .action(async () => {
10
+ const apiUrl = getApiUrl(program.opts().apiUrl);
11
+ const apiKey = getApiKey(program.opts().apiKey);
12
+ const sdk = createSDKClient(apiUrl, apiKey);
13
+ const format = program.opts().format || cliConfig.get('outputFormat');
14
+ const acct = await sdk.account.get();
15
+ if (format === 'json') {
16
+ console.log(JSON.stringify(acct, null, 2));
17
+ return;
18
+ }
19
+ console.log(`Email: ${acct.email}`);
20
+ console.log(`Plan: ${acct.planName}`);
21
+ console.log(`Storage Used: ${formatBytes(acct.storageUsedBytes)} / ${formatBytes(acct.storageLimitBytes)} (${((acct.storageUsedBytes / acct.storageLimitBytes) * 100).toFixed(1)}%)`);
22
+ console.log(`Encryption: ${acct.encryptionSetupComplete ? chalk.green('Set up') : chalk.yellow('Not set up')}`);
23
+ });
24
+ account.command('plan')
25
+ .description('Show current plan and available upgrades')
26
+ .action(async () => {
27
+ const apiUrl = getApiUrl(program.opts().apiUrl);
28
+ const apiKey = getApiKey(program.opts().apiKey);
29
+ const sdk = createSDKClient(apiUrl, apiKey);
30
+ const authClient = new AuthClient(apiUrl);
31
+ const acct = await sdk.account.get();
32
+ const { plans } = await authClient.getPlans();
33
+ const currentTier = acct.planTier;
34
+ console.log(chalk.bold('Available Plans:\n'));
35
+ for (const plan of plans) {
36
+ const isCurrent = plan.tier === currentTier;
37
+ const prefix = isCurrent ? chalk.green('> ') : ' ';
38
+ const label = isCurrent ? chalk.green.bold(plan.displayName) : plan.displayName;
39
+ const price = plan.priceMonthly === 0 ? 'Free' : `$${(plan.priceMonthly / 100).toFixed(0)}/mo`;
40
+ console.log(`${prefix}${label} (${price})`);
41
+ console.log(` Storage: ${formatBytes(plan.storageLimitBytes)}, Max file: ${formatBytes(plan.maxFileSizeBytes)}`);
42
+ }
43
+ });
44
+ account.command('usage')
45
+ .description('Show detailed usage breakdown')
46
+ .action(async () => {
47
+ const apiUrl = getApiUrl(program.opts().apiUrl);
48
+ const apiKey = getApiKey(program.opts().apiKey);
49
+ const sdk = createSDKClient(apiUrl, apiKey);
50
+ const acct = await sdk.account.get();
51
+ const vaults = await sdk.vaults.list();
52
+ console.log(chalk.bold('Storage Usage by Vault:\n'));
53
+ for (const v of vaults) {
54
+ const icon = v.visibility === 'private' ? '[private]' : '[public]';
55
+ console.log(` ${v.name} ${icon} — ${v.fileCount} files, ${formatBytes(v.totalSizeBytes)}`);
56
+ }
57
+ console.log('');
58
+ console.log(` Total: ${formatBytes(acct.storageUsedBytes)} / ${formatBytes(acct.storageLimitBytes)}`);
59
+ });
60
+ // Default action for `tuskydp account` with no subcommand
61
+ account.action(async () => {
62
+ // Run `info` subcommand
63
+ await account.commands.find(c => c.name() === 'info')?.parseAsync([], { from: 'user' });
64
+ });
65
+ }
66
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../../../src/commands/account.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerAuthCommands(program: Command): void;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAqLpD"}
@@ -0,0 +1,171 @@
1
+ import chalk from 'chalk';
2
+ import { cliConfig, getApiUrl, getApiKey } from '../config.js';
3
+ import { createSDKClient, AuthClient } from '../sdk.js';
4
+ import { createTable, formatDate } from '../lib/output.js';
5
+ import { clearSession } from '../lib/keyring.js';
6
+ export function registerAuthCommands(program) {
7
+ program.command('signup')
8
+ .description('Create a new account')
9
+ .argument('<email>', 'Email address')
10
+ .argument('<password>', 'Password')
11
+ .option('--name <name>', 'Display name for the account')
12
+ .action(async (email, password, options) => {
13
+ const apiUrl = getApiUrl(program.opts().apiUrl);
14
+ const authClient = new AuthClient(apiUrl);
15
+ try {
16
+ const { user, accessToken } = await authClient.register(email, password, options.name);
17
+ const keyResult = await authClient.createApiKeyWithJwt(accessToken, 'CLI Key');
18
+ cliConfig.set('apiKey', keyResult.apiKey);
19
+ cliConfig.set('apiUrl', apiUrl);
20
+ console.log(chalk.green(`✓ Account created: ${user.email}`));
21
+ console.log(chalk.dim(`API: ${apiUrl}`));
22
+ console.log('');
23
+ console.log(chalk.yellow('Save this API key — it will not be shown again:'));
24
+ console.log(chalk.bold(keyResult.apiKey));
25
+ console.log('');
26
+ console.log(chalk.dim('API key auto-saved to config. You\'re logged in.'));
27
+ }
28
+ catch (err) {
29
+ console.error(chalk.red(`Signup failed: ${err.message}`));
30
+ process.exit(1);
31
+ }
32
+ });
33
+ program.command('login')
34
+ .description('Authenticate with TuskyDP')
35
+ .option('--api-key <key>', 'Authenticate with an existing API key')
36
+ .option('--email <email>', 'Email address for login')
37
+ .option('--password <password>', 'Password for login')
38
+ .action(async (options) => {
39
+ // Check both local and parent-level --api-key (Commander.js may assign to parent)
40
+ const apiKey = options.apiKey || program.opts().apiKey;
41
+ if (apiKey) {
42
+ const apiUrl = getApiUrl(program.opts().apiUrl);
43
+ try {
44
+ const sdk = createSDKClient(apiUrl, apiKey);
45
+ const account = await sdk.account.get();
46
+ cliConfig.set('apiKey', apiKey);
47
+ cliConfig.set('apiUrl', apiUrl);
48
+ console.log(chalk.green(`Authenticated as ${account.email} (${account.planName} plan)`));
49
+ console.log(chalk.dim(`API: ${apiUrl}`));
50
+ console.log(chalk.dim(`API key stored in config`));
51
+ }
52
+ catch (err) {
53
+ console.error(chalk.red(`Authentication failed: ${err.message}`));
54
+ process.exit(1);
55
+ }
56
+ return;
57
+ }
58
+ if (options.email && options.password) {
59
+ const apiUrl = getApiUrl(program.opts().apiUrl);
60
+ const authClient = new AuthClient(apiUrl);
61
+ try {
62
+ const { accessToken } = await authClient.login(options.email, options.password);
63
+ const keyResult = await authClient.createApiKeyWithJwt(accessToken, 'CLI Key');
64
+ cliConfig.set('apiKey', keyResult.apiKey);
65
+ cliConfig.set('apiUrl', apiUrl);
66
+ console.log(chalk.green(`Authenticated as ${options.email}`));
67
+ console.log(chalk.dim(`API: ${apiUrl}`));
68
+ console.log('');
69
+ console.log(chalk.yellow('Save this API key — it will not be shown again:'));
70
+ console.log(chalk.bold(keyResult.apiKey));
71
+ console.log('');
72
+ console.log(chalk.dim('API key auto-saved to config. You\'re logged in.'));
73
+ }
74
+ catch (err) {
75
+ console.error(chalk.red(`Login failed: ${err.message}`));
76
+ process.exit(1);
77
+ }
78
+ return;
79
+ }
80
+ console.log(chalk.yellow('Please provide credentials to log in.'));
81
+ console.log(chalk.dim('Use: tusky login --email <email> --password <password>'));
82
+ console.log(chalk.dim(' or: tusky login --api-key <key>'));
83
+ });
84
+ program.command('logout')
85
+ .description('Clear stored credentials and encryption session')
86
+ .action(() => {
87
+ cliConfig.delete('apiKey');
88
+ cliConfig.delete('defaultVault');
89
+ clearSession();
90
+ console.log(chalk.green('Logged out. Credentials and session cleared.'));
91
+ });
92
+ program.command('whoami')
93
+ .description('Show current user, plan, and storage usage')
94
+ .action(async () => {
95
+ const apiUrl = getApiUrl(program.opts().apiUrl);
96
+ const apiKey = getApiKey(program.opts().apiKey);
97
+ const sdk = createSDKClient(apiUrl, apiKey);
98
+ const account = await sdk.account.get();
99
+ console.log(`Email: ${account.email}`);
100
+ console.log(`Plan: ${account.planName} (${account.planTier})`);
101
+ console.log(`Storage: ${account.storageUsedFormatted} / ${account.storageLimitFormatted}`);
102
+ console.log(`Encryption: ${account.encryptionSetupComplete ? chalk.green('Set up') : chalk.yellow('Not set up')}`);
103
+ console.log(`Account ID: ${chalk.dim(account.id)}`);
104
+ });
105
+ // API Key subcommands
106
+ const apiKeys = program.command('api-keys').description('Manage API keys');
107
+ apiKeys.command('list')
108
+ .description('List all API keys')
109
+ .action(async () => {
110
+ const apiUrl = getApiUrl(program.opts().apiUrl);
111
+ const apiKey = getApiKey(program.opts().apiKey);
112
+ const sdk = createSDKClient(apiUrl, apiKey);
113
+ const format = program.opts().format || cliConfig.get('outputFormat');
114
+ const keys = await sdk.apiKeys.list();
115
+ if (format === 'json') {
116
+ console.log(JSON.stringify(keys, null, 2));
117
+ return;
118
+ }
119
+ if (keys.length === 0) {
120
+ console.log(chalk.dim('No API keys found.'));
121
+ return;
122
+ }
123
+ const table = createTable(['Name', 'Prefix', 'Scopes', 'Last Used', 'Created']);
124
+ for (const k of keys) {
125
+ table.push([
126
+ k.name,
127
+ chalk.dim(k.keyPrefix + '...'),
128
+ k.scopes?.join(', ') || chalk.dim('all'),
129
+ k.lastUsedAt ? formatDate(k.lastUsedAt) : chalk.dim('never'),
130
+ formatDate(k.createdAt),
131
+ ]);
132
+ }
133
+ console.log(table.toString());
134
+ });
135
+ apiKeys.command('create <name>')
136
+ .description('Create a new API key')
137
+ .option('--scopes <scopes>', 'Comma-separated scopes')
138
+ .option('--vaults <vaults>', 'Comma-separated vault IDs')
139
+ .option('--expires <days>', 'Auto-expire after N days', parseInt)
140
+ .action(async (name, options) => {
141
+ const apiUrl = getApiUrl(program.opts().apiUrl);
142
+ const apiKey = getApiKey(program.opts().apiKey);
143
+ const sdk = createSDKClient(apiUrl, apiKey);
144
+ const result = await sdk.apiKeys.create({
145
+ name,
146
+ scopes: options.scopes?.split(','),
147
+ vaultIds: options.vaults?.split(','),
148
+ expiresInDays: options.expires,
149
+ });
150
+ console.log(chalk.yellow('Save this API key — it will not be shown again:'));
151
+ console.log('');
152
+ console.log(chalk.bold(result.apiKey));
153
+ console.log('');
154
+ console.log(`Name: ${result.name}`);
155
+ console.log(`Prefix: ${result.keyPrefix}`);
156
+ if (result.scopes)
157
+ console.log(`Scopes: ${result.scopes.join(', ')}`);
158
+ if (result.expiresAt)
159
+ console.log(`Expires: ${new Date(result.expiresAt).toLocaleDateString()}`);
160
+ });
161
+ apiKeys.command('revoke <key-id>')
162
+ .description('Revoke an API key')
163
+ .action(async (keyId) => {
164
+ const apiUrl = getApiUrl(program.opts().apiUrl);
165
+ const apiKey = getApiKey(program.opts().apiKey);
166
+ const sdk = createSDKClient(apiUrl, apiKey);
167
+ await sdk.apiKeys.revoke(keyId);
168
+ console.log(chalk.green('API key revoked.'));
169
+ });
170
+ }
171
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `tusky decrypt` — Decrypt a file downloaded from Walrus.
3
+ *
4
+ * Works in two modes:
5
+ * 1. With --export <manifest.json> — reads wrappedKey/iv from the export
6
+ * manifest, derives master key from passphrase + salt. Fully offline.
7
+ * 2. Without --export — fetches encryption params from the Tusky API and
8
+ * looks up the file metadata by ID. Requires API access.
9
+ *
10
+ * In both modes, the passphrase is resolved from:
11
+ * --passphrase flag > TUSKYDP_PASSWORD env var > interactive prompt
12
+ */
13
+ import type { Command } from 'commander';
14
+ export declare function registerDecryptCommand(program: Command): void;
15
+ //# sourceMappingURL=decrypt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decrypt.d.ts","sourceRoot":"","sources":["../../../src/commands/decrypt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4EzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QA0LtD"}