@nodetool-ai/deploy 0.7.0-rc.23 → 0.8.2

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 (121) hide show
  1. package/README.md +41 -0
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/admin-client.d.ts +5 -39
  4. package/dist/admin-client.d.ts.map +1 -1
  5. package/dist/admin-client.js +9 -230
  6. package/dist/admin-client.js.map +1 -1
  7. package/dist/api-user-manager.d.ts.map +1 -1
  8. package/dist/api-user-manager.js +5 -2
  9. package/dist/api-user-manager.js.map +1 -1
  10. package/dist/auth.d.ts.map +1 -1
  11. package/dist/auth.js +0 -3
  12. package/dist/auth.js.map +1 -1
  13. package/dist/compose.d.ts.map +1 -1
  14. package/dist/compose.js +5 -6
  15. package/dist/compose.js.map +1 -1
  16. package/dist/configure.d.ts +1 -43
  17. package/dist/configure.d.ts.map +1 -1
  18. package/dist/configure.js +2 -43
  19. package/dist/configure.js.map +1 -1
  20. package/dist/deployment-config.d.ts +28 -786
  21. package/dist/deployment-config.d.ts.map +1 -1
  22. package/dist/deployment-config.js +34 -218
  23. package/dist/deployment-config.js.map +1 -1
  24. package/dist/docker-run.d.ts +2 -1
  25. package/dist/docker-run.d.ts.map +1 -1
  26. package/dist/docker-run.js +6 -22
  27. package/dist/docker-run.js.map +1 -1
  28. package/dist/docker.d.ts +6 -21
  29. package/dist/docker.d.ts.map +1 -1
  30. package/dist/docker.js +6 -53
  31. package/dist/docker.js.map +1 -1
  32. package/dist/image-spec.d.ts +1 -1
  33. package/dist/index.d.ts +0 -14
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +2 -17
  36. package/dist/index.js.map +1 -1
  37. package/dist/manager.d.ts.map +1 -1
  38. package/dist/manager.js +0 -44
  39. package/dist/manager.js.map +1 -1
  40. package/dist/progress.d.ts.map +1 -1
  41. package/dist/progress.js +0 -1
  42. package/dist/progress.js.map +1 -1
  43. package/dist/remote-users.d.ts.map +1 -1
  44. package/dist/remote-users.js +1 -4
  45. package/dist/remote-users.js.map +1 -1
  46. package/dist/runpod-rest.d.ts +114 -0
  47. package/dist/runpod-rest.d.ts.map +1 -0
  48. package/dist/runpod-rest.js +150 -0
  49. package/dist/runpod-rest.js.map +1 -0
  50. package/dist/self-hosted.d.ts +17 -43
  51. package/dist/self-hosted.d.ts.map +1 -1
  52. package/dist/self-hosted.js +50 -124
  53. package/dist/self-hosted.js.map +1 -1
  54. package/dist/ssh.d.ts +9 -0
  55. package/dist/ssh.d.ts.map +1 -1
  56. package/dist/ssh.js +1 -5
  57. package/dist/ssh.js.map +1 -1
  58. package/dist/state.d.ts.map +1 -1
  59. package/dist/state.js +1 -11
  60. package/dist/state.js.map +1 -1
  61. package/dist/workflow-syncer.d.ts +3 -32
  62. package/dist/workflow-syncer.d.ts.map +1 -1
  63. package/dist/workflow-syncer.js +3 -162
  64. package/dist/workflow-syncer.js.map +1 -1
  65. package/package.json +29 -14
  66. package/dist/admin-operations.d.ts +0 -197
  67. package/dist/admin-operations.d.ts.map +0 -1
  68. package/dist/admin-operations.js +0 -433
  69. package/dist/admin-operations.js.map +0 -1
  70. package/dist/admin-routes.d.ts +0 -306
  71. package/dist/admin-routes.d.ts.map +0 -1
  72. package/dist/admin-routes.js +0 -383
  73. package/dist/admin-routes.js.map +0 -1
  74. package/dist/collection-routes.d.ts +0 -37
  75. package/dist/collection-routes.d.ts.map +0 -1
  76. package/dist/collection-routes.js +0 -43
  77. package/dist/collection-routes.js.map +0 -1
  78. package/dist/deploy-to-gcp.d.ts +0 -67
  79. package/dist/deploy-to-gcp.d.ts.map +0 -1
  80. package/dist/deploy-to-gcp.js +0 -268
  81. package/dist/deploy-to-gcp.js.map +0 -1
  82. package/dist/deploy-to-runpod.d.ts +0 -53
  83. package/dist/deploy-to-runpod.d.ts.map +0 -1
  84. package/dist/deploy-to-runpod.js +0 -207
  85. package/dist/deploy-to-runpod.js.map +0 -1
  86. package/dist/fly.d.ts +0 -40
  87. package/dist/fly.d.ts.map +0 -1
  88. package/dist/fly.js +0 -291
  89. package/dist/fly.js.map +0 -1
  90. package/dist/gcp.d.ts +0 -59
  91. package/dist/gcp.d.ts.map +0 -1
  92. package/dist/gcp.js +0 -339
  93. package/dist/gcp.js.map +0 -1
  94. package/dist/google-cloud-run-api.d.ts +0 -134
  95. package/dist/google-cloud-run-api.d.ts.map +0 -1
  96. package/dist/google-cloud-run-api.js +0 -532
  97. package/dist/google-cloud-run-api.js.map +0 -1
  98. package/dist/huggingface.d.ts +0 -69
  99. package/dist/huggingface.d.ts.map +0 -1
  100. package/dist/huggingface.js +0 -346
  101. package/dist/huggingface.js.map +0 -1
  102. package/dist/railway.d.ts +0 -65
  103. package/dist/railway.d.ts.map +0 -1
  104. package/dist/railway.js +0 -284
  105. package/dist/railway.js.map +0 -1
  106. package/dist/runpod-api.d.ts +0 -206
  107. package/dist/runpod-api.d.ts.map +0 -1
  108. package/dist/runpod-api.js +0 -703
  109. package/dist/runpod-api.js.map +0 -1
  110. package/dist/runpod.d.ts +0 -82
  111. package/dist/runpod.d.ts.map +0 -1
  112. package/dist/runpod.js +0 -188
  113. package/dist/runpod.js.map +0 -1
  114. package/dist/storage-routes.d.ts +0 -55
  115. package/dist/storage-routes.d.ts.map +0 -1
  116. package/dist/storage-routes.js +0 -160
  117. package/dist/storage-routes.js.map +0 -1
  118. package/dist/sync.d.ts +0 -38
  119. package/dist/sync.d.ts.map +0 -1
  120. package/dist/sync.js +0 -130
  121. package/dist/sync.js.map +0 -1
@@ -1,433 +0,0 @@
1
- /**
2
- * Admin Operations Module
3
- *
4
- * Provides shared admin operations for model management including:
5
- * - Hugging Face model downloads (with streaming progress)
6
- * - Ollama model downloads (with streaming progress)
7
- * - Cache management and scanning
8
- * - Model deletion
9
- *
10
- * This is a TypeScript port of the Python admin_operations module.
11
- * Platform-specific integrations (huggingface_hub, ollama client) are
12
- * abstracted behind injectable interfaces so callers can provide their
13
- * own implementations.
14
- */
15
- import * as path from "path";
16
- import * as fs from "fs";
17
- /**
18
- * Filter function matching Python's `filter_repo_paths`.
19
- * A simple glob-ish filter: allow_patterns keeps only matches,
20
- * ignore_patterns removes matches.
21
- */
22
- export function filterRepoFiles(files, allowPatterns, ignorePatterns) {
23
- let result = files;
24
- if (allowPatterns && allowPatterns.length > 0) {
25
- result = result.filter((f) => allowPatterns.some((pat) => matchGlob(pat, f.path)));
26
- }
27
- if (ignorePatterns && ignorePatterns.length > 0) {
28
- result = result.filter((f) => !ignorePatterns.some((pat) => matchGlob(pat, f.path)));
29
- }
30
- return result;
31
- }
32
- /** Minimal glob matcher supporting * and ** wildcards. */
33
- function matchGlob(pattern, value) {
34
- const regex = pattern
35
- .replace(/[.+^${}()|[\]\\]/g, "\\$&")
36
- .replace(/\*\*/g, "<<GLOBSTAR>>")
37
- .replace(/\*/g, "[^/]*")
38
- .replace(/<<GLOBSTAR>>/g, ".*");
39
- return new RegExp(`^${regex}$`).test(value);
40
- }
41
- // ── Token resolution ───────────────────────────────────────
42
- /**
43
- * Resolve an HF token.
44
- *
45
- * Priority:
46
- * 1. Explicit token passed in
47
- * 2. HF_TOKEN environment variable
48
- * 3. getSecret callback (e.g. database lookup)
49
- */
50
- export async function getHFToken(options) {
51
- if (options?.token)
52
- return options.token;
53
- const envToken = process.env["HF_TOKEN"];
54
- if (envToken) {
55
- console.debug("getHFToken: found HF_TOKEN in environment");
56
- return envToken;
57
- }
58
- if (options?.userId && options?.getSecret) {
59
- try {
60
- const dbToken = await options.getSecret("HF_TOKEN", options.userId);
61
- if (dbToken) {
62
- console.debug(`getHFToken: found HF_TOKEN in secrets for userId=${options.userId}`);
63
- return dbToken;
64
- }
65
- }
66
- catch (err) {
67
- console.debug(`getHFToken: failed to get HF_TOKEN from secrets: ${err}`);
68
- }
69
- }
70
- console.debug("getHFToken: no HF_TOKEN found");
71
- return null;
72
- }
73
- /**
74
- * Download manager for admin operations that yields progress updates.
75
- */
76
- export class AdminDownloadManager {
77
- token;
78
- hub;
79
- tokenInitialized;
80
- constructor(options) {
81
- this.token = options.token ?? null;
82
- this.hub = options.hub;
83
- this.tokenInitialized = options.token != null;
84
- if (this.token) {
85
- console.debug(`AdminDownloadManager initialized with HF_TOKEN (${this.token.length} chars)`);
86
- }
87
- else {
88
- console.debug("AdminDownloadManager initialized without HF_TOKEN");
89
- }
90
- }
91
- /**
92
- * Factory that resolves the token asynchronously before construction.
93
- */
94
- static async create(hub, options) {
95
- const token = await getHFToken({
96
- userId: options?.userId,
97
- getSecret: options?.getSecret
98
- });
99
- return new AdminDownloadManager({
100
- token: token ?? undefined,
101
- hub
102
- });
103
- }
104
- /**
105
- * Download a HuggingFace model with detailed progress updates.
106
- */
107
- async *downloadWithProgress(options) {
108
- const { repoId, cacheDir = "/app/.cache/huggingface/hub", filePath, ignorePatterns, allowPatterns, userId } = options;
109
- // Lazy token init
110
- if (!this.tokenInitialized && userId) {
111
- this.token = await getHFToken({
112
- userId,
113
- getSecret: options.getSecret
114
- });
115
- this.tokenInitialized = true;
116
- }
117
- try {
118
- console.info(`Starting HF model download: ${repoId}`);
119
- yield {
120
- status: "starting",
121
- repo_id: repoId,
122
- message: `Starting download of ${repoId}`
123
- };
124
- // Single file download
125
- if (filePath) {
126
- yield {
127
- status: "progress",
128
- repo_id: repoId,
129
- message: `Downloading single file: ${filePath}`,
130
- current_file: filePath
131
- };
132
- const localPath = await this.hub.downloadFile(repoId, filePath, cacheDir, this.token ?? undefined);
133
- yield {
134
- status: "completed",
135
- repo_id: repoId,
136
- local_path: localPath,
137
- message: `Successfully downloaded ${repoId}/${filePath}`
138
- };
139
- return;
140
- }
141
- // Repository download
142
- yield {
143
- status: "progress",
144
- repo_id: repoId,
145
- message: "Fetching file list..."
146
- };
147
- let files = await this.hub.listRepoFiles(repoId, this.token ?? undefined);
148
- files = filterRepoFiles(files, allowPatterns, ignorePatterns);
149
- // Partition into cached vs. uncached
150
- const filesToDownload = [];
151
- const cachedPaths = [];
152
- for (const file of files) {
153
- const cachePath = this.hub.tryLoadFromCache(repoId, file.path);
154
- if (cachePath && fs.existsSync(cachePath)) {
155
- cachedPaths.push(file.path);
156
- }
157
- else {
158
- filesToDownload.push(file);
159
- }
160
- }
161
- const totalFiles = filesToDownload.length;
162
- const totalSize = filesToDownload.reduce((s, f) => s + (f.size ?? 0), 0);
163
- yield {
164
- status: "progress",
165
- repo_id: repoId,
166
- message: `Found ${totalFiles} files to download, ${cachedPaths.length} already cached`,
167
- total_files: totalFiles,
168
- total_size: totalSize,
169
- cached_files: cachedPaths.length
170
- };
171
- if (totalFiles === 0) {
172
- yield {
173
- status: "completed",
174
- repo_id: repoId,
175
- message: `All files already cached for ${repoId}`,
176
- total_files: 0,
177
- cached_files: cachedPaths.length
178
- };
179
- return;
180
- }
181
- // Download each file
182
- const downloadedFiles = [];
183
- let downloadedSize = 0;
184
- for (let i = 0; i < filesToDownload.length; i++) {
185
- const file = filesToDownload[i];
186
- yield {
187
- status: "progress",
188
- repo_id: repoId,
189
- message: `Downloading ${file.path}`,
190
- current_file: file.path,
191
- file_progress: i + 1,
192
- total_files: totalFiles,
193
- downloaded_size: downloadedSize,
194
- total_size: totalSize
195
- };
196
- try {
197
- await this.hub.downloadFile(repoId, file.path, cacheDir, this.token ?? undefined);
198
- downloadedFiles.push(file.path);
199
- downloadedSize += file.size ?? 0;
200
- yield {
201
- status: "progress",
202
- repo_id: repoId,
203
- message: `Downloaded ${file.path}`,
204
- current_file: file.path,
205
- file_progress: i + 1,
206
- total_files: totalFiles,
207
- downloaded_files: downloadedFiles.length,
208
- downloaded_size: downloadedSize,
209
- total_size: totalSize
210
- };
211
- }
212
- catch (err) {
213
- console.error(`Error downloading file ${file.path}: ${err}`);
214
- yield {
215
- status: "progress",
216
- repo_id: repoId,
217
- message: `Error downloading ${file.path}: ${err}`,
218
- current_file: file.path,
219
- error_file: file.path
220
- };
221
- }
222
- }
223
- yield {
224
- status: "completed",
225
- repo_id: repoId,
226
- message: `Successfully downloaded ${downloadedFiles.length}/${totalFiles} files for ${repoId}`,
227
- downloaded_files: downloadedFiles.length,
228
- total_files: totalFiles,
229
- total_size: totalSize,
230
- downloaded_size: downloadedSize
231
- };
232
- }
233
- catch (err) {
234
- console.error(`Error in HF model download ${repoId}: ${err}`);
235
- yield {
236
- status: "error",
237
- repo_id: repoId,
238
- error: String(err),
239
- message: `Error downloading ${repoId}: ${err}`
240
- };
241
- }
242
- }
243
- }
244
- // ── Standalone streaming functions ─────────────────────────
245
- /**
246
- * Stream Ollama model download progress.
247
- */
248
- export async function* streamOllamaModelPull(modelName, ollama) {
249
- try {
250
- console.info(`Starting Ollama model pull: ${modelName}`);
251
- yield {
252
- status: "starting",
253
- model: modelName,
254
- message: `Starting download of ${modelName}`
255
- };
256
- for await (const chunk of ollama.pull(modelName)) {
257
- yield chunk;
258
- }
259
- yield {
260
- status: "completed",
261
- model: modelName,
262
- message: `Successfully downloaded ${modelName}`
263
- };
264
- }
265
- catch (err) {
266
- console.error(`Error pulling Ollama model ${modelName}: ${err}`);
267
- yield {
268
- status: "error",
269
- model: modelName,
270
- error: String(err)
271
- };
272
- }
273
- }
274
- /**
275
- * Stream HuggingFace model download progress using AdminDownloadManager.
276
- */
277
- export async function* streamHFModelDownload(hub, options) {
278
- const manager = await AdminDownloadManager.create(hub, {
279
- userId: options.userId,
280
- getSecret: options.getSecret
281
- });
282
- yield* manager.downloadWithProgress(options);
283
- }
284
- /**
285
- * Download HuggingFace model with optional streaming.
286
- * When `stream` is false, only the final progress update is yielded.
287
- */
288
- export async function* downloadHFModel(hub, options) {
289
- const { repoId, stream = true } = options;
290
- if (!repoId) {
291
- throw new Error("repoId is required for HuggingFace download");
292
- }
293
- if (stream) {
294
- yield* streamHFModelDownload(hub, options);
295
- }
296
- else {
297
- const manager = await AdminDownloadManager.create(hub, {
298
- userId: options.userId,
299
- getSecret: options.getSecret
300
- });
301
- let finalResult = null;
302
- for await (const update of manager.downloadWithProgress(options)) {
303
- finalResult = update;
304
- }
305
- if (finalResult) {
306
- yield finalResult;
307
- }
308
- }
309
- }
310
- /**
311
- * Download Ollama model with optional streaming.
312
- */
313
- export async function* downloadOllamaModel(ollama, modelName, stream = true) {
314
- if (!modelName) {
315
- throw new Error("modelName is required for Ollama download");
316
- }
317
- if (stream) {
318
- yield* streamOllamaModelPull(modelName, ollama);
319
- }
320
- else {
321
- try {
322
- // For non-streaming, consume the full stream but only yield completion
323
- for await (const _chunk of ollama.pull(modelName)) {
324
- // consume stream
325
- }
326
- yield {
327
- status: "completed",
328
- model: modelName,
329
- message: `Successfully downloaded ${modelName}`
330
- };
331
- }
332
- catch (err) {
333
- console.error(`Error downloading Ollama model ${modelName}: ${err}`);
334
- yield {
335
- status: "error",
336
- model: modelName,
337
- error: String(err)
338
- };
339
- }
340
- }
341
- }
342
- /**
343
- * Scan HuggingFace cache directory.
344
- */
345
- export async function* scanHFCache(hub, cacheDir) {
346
- try {
347
- const cacheInfo = hub.scanCache(cacheDir);
348
- yield { status: "completed", cache_info: cacheInfo };
349
- }
350
- catch (err) {
351
- console.error(`Error scanning cache: ${err}`);
352
- yield { status: "error", error: String(err) };
353
- }
354
- }
355
- /**
356
- * Delete a HuggingFace model from cache.
357
- */
358
- export async function* deleteHFModel(hub, repoId) {
359
- if (!repoId) {
360
- throw new Error("repoId is required for HuggingFace model deletion");
361
- }
362
- try {
363
- await hub.deleteCachedModel(repoId);
364
- yield {
365
- status: "completed",
366
- repo_id: repoId,
367
- message: `Successfully deleted ${repoId}`
368
- };
369
- }
370
- catch (err) {
371
- console.error(`Error deleting HF model ${repoId}: ${err}`);
372
- yield { status: "error", repo_id: repoId, error: String(err) };
373
- }
374
- }
375
- // ── Cache size calculation ─────────────────────────────────
376
- /**
377
- * Recursively calculate total size of files in a directory.
378
- */
379
- function calculateCacheSizeSync(cacheDir) {
380
- let totalSize = 0;
381
- let error = null;
382
- try {
383
- if (fs.existsSync(cacheDir)) {
384
- const walk = (dir) => {
385
- const entries = fs.readdirSync(dir, { withFileTypes: true });
386
- for (const entry of entries) {
387
- const fullPath = path.join(dir, entry.name);
388
- if (entry.isDirectory()) {
389
- walk(fullPath);
390
- }
391
- else if (entry.isFile()) {
392
- try {
393
- const stat = fs.statSync(fullPath);
394
- totalSize += stat.size;
395
- }
396
- catch {
397
- // Skip files we can't stat
398
- }
399
- }
400
- }
401
- };
402
- walk(cacheDir);
403
- }
404
- }
405
- catch (err) {
406
- error = String(err);
407
- }
408
- return { totalSize, error };
409
- }
410
- /**
411
- * Calculate total cache size, yielding a single result.
412
- */
413
- export async function* calculateCacheSize(cacheDir = "/app/.cache/huggingface/hub") {
414
- try {
415
- const { totalSize, error } = calculateCacheSizeSync(cacheDir);
416
- if (error) {
417
- yield { status: "error", cache_dir: cacheDir, error };
418
- return;
419
- }
420
- const sizeGb = totalSize / 1024 ** 3;
421
- yield {
422
- success: true,
423
- cache_dir: cacheDir,
424
- total_size_bytes: totalSize,
425
- size_gb: Math.round(sizeGb * 100) / 100
426
- };
427
- }
428
- catch (err) {
429
- console.error(`Error calculating cache size: ${err}`);
430
- yield { status: "error", cache_dir: cacheDir, error: String(err) };
431
- }
432
- }
433
- //# sourceMappingURL=admin-operations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"admin-operations.js","sourceRoot":"","sources":["../src/admin-operations.ts"],"names":[],"mappings":"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"}