@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,310 @@
1
+ /**
2
+ * MCP tools — File operations
3
+ *
4
+ * Handles upload with client-side encryption for private vaults,
5
+ * download with decryption and rehydration polling for cold files.
6
+ */
7
+ import { z } from 'zod';
8
+ import { readFileSync, writeFileSync, statSync } from 'fs';
9
+ import { basename, resolve } from 'path';
10
+ import { lookup } from 'mime-types';
11
+ import { encryptBuffer, decryptBuffer } from '../../crypto.js';
12
+ import { wrapToolError } from './helpers.js';
13
+ // ---------------------------------------------------------------------------
14
+ // Shared helpers
15
+ // ---------------------------------------------------------------------------
16
+ /** MIME types that should be returned as text rather than base64. */
17
+ function isTextMimeType(mimeType) {
18
+ if (mimeType.startsWith('text/'))
19
+ return true;
20
+ const textTypes = [
21
+ 'application/json',
22
+ 'application/xml',
23
+ 'application/javascript',
24
+ 'application/typescript',
25
+ 'application/x-yaml',
26
+ 'application/yaml',
27
+ 'application/toml',
28
+ 'application/x-sh',
29
+ 'application/sql',
30
+ 'application/graphql',
31
+ 'application/xhtml+xml',
32
+ 'application/svg+xml',
33
+ 'application/x-httpd-php',
34
+ ];
35
+ return textTypes.includes(mimeType) || mimeType.endsWith('+json') || mimeType.endsWith('+xml');
36
+ }
37
+ /**
38
+ * Fetch a file from Tusky, handle rehydration polling and decryption.
39
+ * Returns the plaintext buffer and encryption info.
40
+ */
41
+ async function fetchAndDecryptFile(fileId, ctx) {
42
+ let dlResponse = await ctx.sdk.files.getDownloadUrl(fileId);
43
+ let { downloadUrl, status, encryption } = dlResponse;
44
+ // Handle rehydration from Walrus (cold files)
45
+ if (status === 'rehydrating') {
46
+ for (let i = 0; i < 30; i++) {
47
+ await new Promise((r) => setTimeout(r, 2000));
48
+ const check = await ctx.sdk.files.getDownloadUrl(fileId);
49
+ if (check.status === 'ready') {
50
+ downloadUrl = check.downloadUrl;
51
+ encryption = check.encryption;
52
+ status = 'ready';
53
+ break;
54
+ }
55
+ }
56
+ if (status !== 'ready') {
57
+ throw new Error('File rehydration timed out (60s). The file is being retrieved from Walrus. Try again later.');
58
+ }
59
+ }
60
+ if (!downloadUrl) {
61
+ throw new Error('No download URL available for this file.');
62
+ }
63
+ // Download
64
+ const response = await fetch(downloadUrl);
65
+ if (!response.ok) {
66
+ throw new Error(`Download failed: HTTP ${response.status}`);
67
+ }
68
+ const arrayBuf = await response.arrayBuffer();
69
+ let fileBuffer = Buffer.from(arrayBuf);
70
+ // Decrypt if needed
71
+ if (encryption?.encrypted) {
72
+ const masterKey = ctx.getMasterKey();
73
+ if (!masterKey) {
74
+ throw new Error('Encryption passphrase required to decrypt this file. ' +
75
+ 'Set the TUSKYDP_PASSWORD environment variable in your MCP server config.');
76
+ }
77
+ fileBuffer = decryptBuffer(fileBuffer, encryption.wrappedKey, encryption.iv, masterKey, encryption.plaintextChecksumSha256 ?? undefined);
78
+ }
79
+ return { fileBuffer, encryption };
80
+ }
81
+ /**
82
+ * Encrypt (if private vault) and upload a buffer to Tusky.
83
+ * Shared by tusky_file_upload (from disk) and tusky_file_create (from content).
84
+ */
85
+ async function encryptAndUpload(fileBuffer, fileName, mimeType, vaultId, folderId, ctx) {
86
+ const vault = await ctx.sdk.vaults.get(vaultId);
87
+ const isPrivate = vault.visibility === 'private';
88
+ let uploadBody;
89
+ let encryptionMeta = {};
90
+ if (isPrivate) {
91
+ const masterKey = ctx.getMasterKey();
92
+ if (!masterKey) {
93
+ throw new Error('Encryption passphrase required for private vault uploads. ' +
94
+ 'Set the TUSKYDP_PASSWORD environment variable in your MCP server config.');
95
+ }
96
+ const { ciphertext, wrappedKey, iv, plaintextChecksum } = encryptBuffer(fileBuffer, masterKey);
97
+ uploadBody = ciphertext;
98
+ encryptionMeta = {
99
+ wrappedKey,
100
+ encryptionIv: iv,
101
+ plaintextSizeBytes: fileBuffer.length,
102
+ plaintextChecksumSha256: plaintextChecksum,
103
+ };
104
+ }
105
+ else {
106
+ uploadBody = fileBuffer;
107
+ }
108
+ // Request presigned upload URL
109
+ const { fileId, uploadUrl } = await ctx.sdk.files.requestUpload({
110
+ name: fileName,
111
+ mimeType,
112
+ sizeBytes: uploadBody.length,
113
+ vaultId,
114
+ folderId,
115
+ ...encryptionMeta,
116
+ });
117
+ // PUT to presigned URL
118
+ const putRes = await fetch(uploadUrl, {
119
+ method: 'PUT',
120
+ headers: { 'Content-Type': 'application/octet-stream' },
121
+ body: new Uint8Array(uploadBody),
122
+ });
123
+ if (!putRes.ok) {
124
+ const errText = await putRes.text().catch(() => putRes.statusText);
125
+ throw new Error(`Upload PUT failed (${putRes.status}): ${errText}`);
126
+ }
127
+ // Confirm upload
128
+ const file = await ctx.sdk.files.confirmUpload(fileId);
129
+ return { file, isPrivate, uploadedSizeBytes: uploadBody.length };
130
+ }
131
+ // ---------------------------------------------------------------------------
132
+ // Tool registration
133
+ // ---------------------------------------------------------------------------
134
+ export function registerFileTools(server, ctx) {
135
+ // ── Upload file from disk ──────────────────────────────────────────────
136
+ server.tool('tusky_file_upload', 'Upload a file from a local filesystem path to a vault. Handles encryption transparently for private vaults. Use tusky_file_create instead if you want to upload content directly without a file on disk.', {
137
+ filePath: z.string().describe('Absolute or relative path to the local file to upload'),
138
+ vaultId: z.string().describe('Target vault ID'),
139
+ folderId: z.string().optional().describe('Target folder ID within the vault (omit for vault root)'),
140
+ }, async ({ filePath, vaultId, folderId }) => {
141
+ try {
142
+ const resolvedPath = resolve(filePath);
143
+ // Validate file exists
144
+ let stat;
145
+ try {
146
+ stat = statSync(resolvedPath);
147
+ }
148
+ catch {
149
+ return wrapToolError(new Error(`File not found: ${resolvedPath}`));
150
+ }
151
+ if (!stat.isFile()) {
152
+ return wrapToolError(new Error(`Not a file: ${resolvedPath}`));
153
+ }
154
+ const fileBuffer = readFileSync(resolvedPath);
155
+ const fileName = basename(resolvedPath);
156
+ const mimeType = lookup(resolvedPath) || 'application/octet-stream';
157
+ const { file, isPrivate, uploadedSizeBytes } = await encryptAndUpload(fileBuffer, fileName, mimeType, vaultId, folderId, ctx);
158
+ return {
159
+ content: [{ type: 'text', text: JSON.stringify({
160
+ ...file,
161
+ localPath: resolvedPath,
162
+ encrypted: isPrivate,
163
+ uploadedSizeBytes,
164
+ }, null, 2) }],
165
+ };
166
+ }
167
+ catch (err) {
168
+ return wrapToolError(err);
169
+ }
170
+ });
171
+ // ── Create file from content ─────────────────────────────────────────
172
+ server.tool('tusky_file_create', 'Create a file in a vault from raw content (text or base64-encoded binary). Use this when you want to upload content directly without needing a file on disk. Handles encryption transparently for private vaults.', {
173
+ name: z.string().describe('File name including extension (e.g. "report.md", "data.json", "image.png")'),
174
+ content: z.string().describe('File content: plain text for text files, or base64-encoded string for binary files'),
175
+ encoding: z.enum(['utf-8', 'base64']).optional().describe('Content encoding. "utf-8" (default) for text content, "base64" for binary content.'),
176
+ vaultId: z.string().describe('Target vault ID'),
177
+ folderId: z.string().optional().describe('Target folder ID within the vault (omit for vault root)'),
178
+ }, async ({ name, content, encoding, vaultId, folderId }) => {
179
+ try {
180
+ const enc = encoding ?? 'utf-8';
181
+ const fileBuffer = enc === 'base64'
182
+ ? Buffer.from(content, 'base64')
183
+ : Buffer.from(content, 'utf-8');
184
+ const mimeType = lookup(name) || 'application/octet-stream';
185
+ const { file, isPrivate, uploadedSizeBytes } = await encryptAndUpload(fileBuffer, name, mimeType, vaultId, folderId, ctx);
186
+ return {
187
+ content: [{ type: 'text', text: JSON.stringify({
188
+ ...file,
189
+ encrypted: isPrivate,
190
+ uploadedSizeBytes,
191
+ }, null, 2) }],
192
+ };
193
+ }
194
+ catch (err) {
195
+ return wrapToolError(err);
196
+ }
197
+ });
198
+ // ── Download file (to disk) ────────────────────────────────────────────
199
+ server.tool('tusky_file_download', 'Download a file by ID and save it to a local path on disk. Handles decryption for private vaults and rehydration for cold files. Use tusky_file_read instead if you just want the file content returned directly.', {
200
+ fileId: z.string().describe('File ID to download'),
201
+ outputPath: z.string().describe('Local path to save the file (must be writable)'),
202
+ }, async ({ fileId, outputPath }) => {
203
+ try {
204
+ const { fileBuffer, encryption } = await fetchAndDecryptFile(fileId, ctx);
205
+ const fileInfo = await ctx.sdk.files.getStatus(fileId);
206
+ const finalPath = resolve(outputPath);
207
+ writeFileSync(finalPath, fileBuffer);
208
+ const result = {
209
+ fileId,
210
+ name: fileInfo.name,
211
+ savedTo: finalPath,
212
+ sizeBytes: fileBuffer.length,
213
+ mimeType: fileInfo.mimeType,
214
+ wasEncrypted: encryption?.encrypted ?? false,
215
+ };
216
+ return {
217
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
218
+ };
219
+ }
220
+ catch (err) {
221
+ return wrapToolError(err);
222
+ }
223
+ });
224
+ // ── Read file content (inline) ───────────────────────────────────────
225
+ server.tool('tusky_file_read', 'Read a file\'s content and return it directly. For text files the content is returned as text. For binary files it is returned as base64. Handles decryption for private vaults and rehydration for cold files transparently. Prefer this over tusky_file_download when you need to inspect file content.', {
226
+ fileId: z.string().describe('File ID to read'),
227
+ }, async ({ fileId }) => {
228
+ try {
229
+ const { fileBuffer, encryption } = await fetchAndDecryptFile(fileId, ctx);
230
+ const fileInfo = await ctx.sdk.files.getStatus(fileId);
231
+ const isText = isTextMimeType(fileInfo.mimeType);
232
+ if (isText) {
233
+ return {
234
+ content: [
235
+ {
236
+ type: 'text',
237
+ text: `--- ${fileInfo.name} (${fileInfo.mimeType}, ${fileBuffer.length} bytes${encryption?.encrypted ? ', decrypted' : ''}) ---\n\n${fileBuffer.toString('utf-8')}`,
238
+ },
239
+ ],
240
+ };
241
+ }
242
+ // Binary file — return as base64
243
+ return {
244
+ content: [
245
+ {
246
+ type: 'text',
247
+ text: JSON.stringify({
248
+ fileId,
249
+ name: fileInfo.name,
250
+ mimeType: fileInfo.mimeType,
251
+ sizeBytes: fileBuffer.length,
252
+ wasEncrypted: encryption?.encrypted ?? false,
253
+ encoding: 'base64',
254
+ data: fileBuffer.toString('base64'),
255
+ }, null, 2),
256
+ },
257
+ ],
258
+ };
259
+ }
260
+ catch (err) {
261
+ return wrapToolError(err);
262
+ }
263
+ });
264
+ // ── List files ───────────────────────────────────────────────────────
265
+ server.tool('tusky_file_list', 'List files, optionally filtered by vault or folder. Returns file metadata including status.', {
266
+ vaultId: z.string().optional().describe('Filter by vault ID'),
267
+ folderId: z.string().optional().describe('Filter by folder ID'),
268
+ limit: z.number().optional().describe('Max number of files to return (default 50)'),
269
+ cursor: z.string().optional().describe('Pagination cursor from a previous response'),
270
+ }, async ({ vaultId, folderId, limit, cursor }) => {
271
+ try {
272
+ const result = await ctx.sdk.files.list({ vaultId, folderId, limit, cursor });
273
+ return {
274
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
275
+ };
276
+ }
277
+ catch (err) {
278
+ return wrapToolError(err);
279
+ }
280
+ });
281
+ // ── Get file info ────────────────────────────────────────────────────
282
+ server.tool('tusky_file_get', 'Get detailed metadata for a specific file by ID', {
283
+ fileId: z.string().describe('File ID'),
284
+ }, async ({ fileId }) => {
285
+ try {
286
+ const file = await ctx.sdk.files.get(fileId);
287
+ return {
288
+ content: [{ type: 'text', text: JSON.stringify(file, null, 2) }],
289
+ };
290
+ }
291
+ catch (err) {
292
+ return wrapToolError(err);
293
+ }
294
+ });
295
+ // ── Delete file ──────────────────────────────────────────────────────
296
+ server.tool('tusky_file_delete', 'Soft-delete a file (moves to trash). Can be restored within 7 days.', {
297
+ fileId: z.string().describe('File ID to delete'),
298
+ }, async ({ fileId }) => {
299
+ try {
300
+ await ctx.sdk.files.delete(fileId);
301
+ return {
302
+ content: [{ type: 'text', text: `File ${fileId} moved to trash.` }],
303
+ };
304
+ }
305
+ catch (err) {
306
+ return wrapToolError(err);
307
+ }
308
+ });
309
+ }
310
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../../../src/mcp/tools/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP tools — Folder management
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type { McpContext } from '../context.js';
6
+ export declare function registerFolderTools(server: McpServer, ctx: McpContext): void;
7
+ //# sourceMappingURL=folders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/folders.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,QA+ErE"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * MCP tools — Folder management
3
+ */
4
+ import { z } from 'zod';
5
+ import { wrapToolError } from './helpers.js';
6
+ export function registerFolderTools(server, ctx) {
7
+ // ── Create folder ────────────────────────────────────────────────────
8
+ server.tool('tusky_folder_create', 'Create a folder inside a vault', {
9
+ vaultId: z.string().describe('Vault ID'),
10
+ name: z.string().describe('Folder name'),
11
+ parentId: z.string().optional().describe('Parent folder ID (omit for root)'),
12
+ }, async ({ vaultId, name, parentId }) => {
13
+ try {
14
+ const folder = await ctx.sdk.folders.create({ vaultId, name, parentId });
15
+ return {
16
+ content: [{ type: 'text', text: JSON.stringify(folder, null, 2) }],
17
+ };
18
+ }
19
+ catch (err) {
20
+ return wrapToolError(err);
21
+ }
22
+ });
23
+ // ── List folders ─────────────────────────────────────────────────────
24
+ server.tool('tusky_folder_list', 'List folders in a vault (optionally within a parent folder)', {
25
+ vaultId: z.string().describe('Vault ID'),
26
+ parentId: z.string().optional().describe('Parent folder ID (omit for root-level folders)'),
27
+ }, async ({ vaultId, parentId }) => {
28
+ try {
29
+ const folders = await ctx.sdk.folders.list({ vaultId, parentId });
30
+ return {
31
+ content: [{ type: 'text', text: JSON.stringify(folders, null, 2) }],
32
+ };
33
+ }
34
+ catch (err) {
35
+ return wrapToolError(err);
36
+ }
37
+ });
38
+ // ── Get folder contents ──────────────────────────────────────────────
39
+ server.tool('tusky_folder_get_contents', 'Get the contents (files and subfolders) of a folder', {
40
+ folderId: z.string().describe('Folder ID'),
41
+ }, async ({ folderId }) => {
42
+ try {
43
+ const contents = await ctx.sdk.folders.getContents(folderId);
44
+ return {
45
+ content: [{ type: 'text', text: JSON.stringify(contents, null, 2) }],
46
+ };
47
+ }
48
+ catch (err) {
49
+ return wrapToolError(err);
50
+ }
51
+ });
52
+ // ── Delete folder ────────────────────────────────────────────────────
53
+ server.tool('tusky_folder_delete', 'Delete a folder', {
54
+ folderId: z.string().describe('Folder ID'),
55
+ }, async ({ folderId }) => {
56
+ try {
57
+ await ctx.sdk.folders.delete(folderId);
58
+ return {
59
+ content: [{ type: 'text', text: `Folder ${folderId} deleted successfully.` }],
60
+ };
61
+ }
62
+ catch (err) {
63
+ return wrapToolError(err);
64
+ }
65
+ });
66
+ }
67
+ //# sourceMappingURL=folders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.js","sourceRoot":"","sources":["../../../../src/mcp/tools/folders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Shared helpers for MCP tool handlers.
3
+ */
4
+ /**
5
+ * Wraps an error into an MCP tool error result.
6
+ * Extracts meaningful messages from TuskyError or generic Error instances.
7
+ */
8
+ export declare function wrapToolError(err: unknown): {
9
+ content: {
10
+ type: 'text';
11
+ text: string;
12
+ }[];
13
+ isError: true;
14
+ };
15
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG;IAC3C,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,OAAO,EAAE,IAAI,CAAC;CACf,CAcA"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Shared helpers for MCP tool handlers.
3
+ */
4
+ import { TuskyError } from '@tuskydp/sdk';
5
+ /**
6
+ * Wraps an error into an MCP tool error result.
7
+ * Extracts meaningful messages from TuskyError or generic Error instances.
8
+ */
9
+ export function wrapToolError(err) {
10
+ let message;
11
+ if (err instanceof TuskyError) {
12
+ message = `Tusky API error (${err.statusCode}): ${err.message}`;
13
+ }
14
+ else if (err instanceof Error) {
15
+ message = err.message;
16
+ }
17
+ else {
18
+ message = String(err);
19
+ }
20
+ return {
21
+ content: [{ type: 'text', text: message }],
22
+ isError: true,
23
+ };
24
+ }
25
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/mcp/tools/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IAIxC,IAAI,OAAe,CAAC;IACpB,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;QAC9B,OAAO,GAAG,oBAAoB,GAAG,CAAC,UAAU,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IAClE,CAAC;SAAM,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QAChC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACnD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP tools — Trash management
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type { McpContext } from '../context.js';
6
+ export declare function registerTrashTools(server: McpServer, ctx: McpContext): void;
7
+ //# sourceMappingURL=trash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trash.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/trash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,QAqDpE"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * MCP tools — Trash management
3
+ */
4
+ import { z } from 'zod';
5
+ import { wrapToolError } from './helpers.js';
6
+ export function registerTrashTools(server, ctx) {
7
+ // ── List trash ───────────────────────────────────────────────────────
8
+ server.tool('tusky_trash_list', 'List all soft-deleted files and vaults in the trash', {}, async () => {
9
+ try {
10
+ const trash = await ctx.sdk.trash.list();
11
+ return {
12
+ content: [{ type: 'text', text: JSON.stringify(trash, null, 2) }],
13
+ };
14
+ }
15
+ catch (err) {
16
+ return wrapToolError(err);
17
+ }
18
+ });
19
+ // ── Restore from trash ───────────────────────────────────────────────
20
+ server.tool('tusky_trash_restore', 'Restore a file or vault from the trash', {
21
+ id: z.string().describe('ID of the trashed file or vault to restore'),
22
+ }, async ({ id }) => {
23
+ try {
24
+ const result = await ctx.sdk.trash.restore(id);
25
+ return {
26
+ content: [{ type: 'text', text: `Restored ${result.type ?? 'item'} ${id} successfully.` }],
27
+ };
28
+ }
29
+ catch (err) {
30
+ return wrapToolError(err);
31
+ }
32
+ });
33
+ // ── Empty trash ──────────────────────────────────────────────────────
34
+ server.tool('tusky_trash_empty', 'Permanently delete ALL items in the trash. This action cannot be undone.', {}, async () => {
35
+ try {
36
+ await ctx.sdk.trash.empty();
37
+ return {
38
+ content: [{ type: 'text', text: 'Trash emptied successfully. All items permanently deleted.' }],
39
+ };
40
+ }
41
+ catch (err) {
42
+ return wrapToolError(err);
43
+ }
44
+ });
45
+ }
46
+ //# sourceMappingURL=trash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trash.js","sourceRoot":"","sources":["../../../../src/mcp/tools/trash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,GAAe;IACnE,wEAAwE;IACxE,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,qDAAqD,EACrD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACzC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC3E,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,wEAAwE;IACxE,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,wCAAwC,EACxC;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;KACtE,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC/C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,MAAM,CAAC,IAAI,IAAI,MAAM,IAAI,EAAE,gBAAgB,EAAE,CAAC;aACpG,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;IAEF,wEAAwE;IACxE,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,0EAA0E,EAC1E,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAC5B,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,4DAA4D,EAAE,CAAC;aACzG,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP tools — Vault management
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type { McpContext } from '../context.js';
6
+ export declare function registerVaultTools(server: McpServer, ctx: McpContext): void;
7
+ //# sourceMappingURL=vaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vaults.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/vaults.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,QAwGpE"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * MCP tools — Vault management
3
+ */
4
+ import { z } from 'zod';
5
+ import { wrapToolError } from './helpers.js';
6
+ export function registerVaultTools(server, ctx) {
7
+ // ── Create vault ─────────────────────────────────────────────────────
8
+ server.tool('tusky_vault_create', 'Create a new storage vault. Visibility is immutable after creation.', {
9
+ name: z.string().describe('Vault name'),
10
+ description: z.string().optional().describe('Vault description'),
11
+ visibility: z.enum(['public', 'private']).optional().describe('Vault visibility. "private" enables client-side encryption. Defaults to "private".'),
12
+ }, async ({ name, description, visibility }) => {
13
+ try {
14
+ const vault = await ctx.sdk.vaults.create({
15
+ name,
16
+ description,
17
+ visibility: visibility ?? 'private',
18
+ });
19
+ return {
20
+ content: [{ type: 'text', text: JSON.stringify(vault, null, 2) }],
21
+ };
22
+ }
23
+ catch (err) {
24
+ return wrapToolError(err);
25
+ }
26
+ });
27
+ // ── List vaults ──────────────────────────────────────────────────────
28
+ server.tool('tusky_vault_list', 'List all vaults in the account', {}, async () => {
29
+ try {
30
+ const vaults = await ctx.sdk.vaults.list();
31
+ return {
32
+ content: [{ type: 'text', text: JSON.stringify(vaults, null, 2) }],
33
+ };
34
+ }
35
+ catch (err) {
36
+ return wrapToolError(err);
37
+ }
38
+ });
39
+ // ── Get vault ────────────────────────────────────────────────────────
40
+ server.tool('tusky_vault_get', 'Get details of a specific vault by ID', {
41
+ vaultId: z.string().describe('Vault ID'),
42
+ }, async ({ vaultId }) => {
43
+ try {
44
+ const vault = await ctx.sdk.vaults.get(vaultId);
45
+ return {
46
+ content: [{ type: 'text', text: JSON.stringify(vault, null, 2) }],
47
+ };
48
+ }
49
+ catch (err) {
50
+ return wrapToolError(err);
51
+ }
52
+ });
53
+ // ── Update vault ─────────────────────────────────────────────────────
54
+ server.tool('tusky_vault_update', 'Update a vault name or description (visibility cannot be changed)', {
55
+ vaultId: z.string().describe('Vault ID'),
56
+ name: z.string().optional().describe('New vault name'),
57
+ description: z.string().optional().describe('New vault description'),
58
+ }, async ({ vaultId, name, description }) => {
59
+ try {
60
+ const vault = await ctx.sdk.vaults.update(vaultId, { name, description });
61
+ return {
62
+ content: [{ type: 'text', text: JSON.stringify(vault, null, 2) }],
63
+ };
64
+ }
65
+ catch (err) {
66
+ return wrapToolError(err);
67
+ }
68
+ });
69
+ // ── Delete vault ─────────────────────────────────────────────────────
70
+ server.tool('tusky_vault_delete', 'Delete a vault. Use force=true to delete even if the vault contains files.', {
71
+ vaultId: z.string().describe('Vault ID'),
72
+ force: z.boolean().optional().describe('Force delete even if vault contains files'),
73
+ }, async ({ vaultId, force }) => {
74
+ try {
75
+ await ctx.sdk.vaults.delete(vaultId, { force });
76
+ return {
77
+ content: [{ type: 'text', text: `Vault ${vaultId} deleted successfully.` }],
78
+ };
79
+ }
80
+ catch (err) {
81
+ return wrapToolError(err);
82
+ }
83
+ });
84
+ }
85
+ //# sourceMappingURL=vaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vaults.js","sourceRoot":"","sources":["../../../../src/mcp/tools/vaults.ts"],"names":[],"mappings":"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"}