nosana-mcp 0.2.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 (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -0
  3. package/dist/cli/commands/account.d.ts +7 -0
  4. package/dist/cli/commands/account.js +108 -0
  5. package/dist/cli/commands/account.js.map +1 -0
  6. package/dist/cli/commands/deploy.d.ts +3 -0
  7. package/dist/cli/commands/deploy.js +311 -0
  8. package/dist/cli/commands/deploy.js.map +1 -0
  9. package/dist/cli/commands/gpus.d.ts +3 -0
  10. package/dist/cli/commands/gpus.js +38 -0
  11. package/dist/cli/commands/gpus.js.map +1 -0
  12. package/dist/cli/commands/job.d.ts +3 -0
  13. package/dist/cli/commands/job.js +31 -0
  14. package/dist/cli/commands/job.js.map +1 -0
  15. package/dist/cli/commands/run.d.ts +33 -0
  16. package/dist/cli/commands/run.js +365 -0
  17. package/dist/cli/commands/run.js.map +1 -0
  18. package/dist/cli/commands/templates.d.ts +3 -0
  19. package/dist/cli/commands/templates.js +115 -0
  20. package/dist/cli/commands/templates.js.map +1 -0
  21. package/dist/cli/index.d.ts +2 -0
  22. package/dist/cli/index.js +45 -0
  23. package/dist/cli/index.js.map +1 -0
  24. package/dist/core/client.d.ts +23 -0
  25. package/dist/core/client.js +38 -0
  26. package/dist/core/client.js.map +1 -0
  27. package/dist/core/config.d.ts +18 -0
  28. package/dist/core/config.js +52 -0
  29. package/dist/core/config.js.map +1 -0
  30. package/dist/core/credits.d.ts +9 -0
  31. package/dist/core/credits.js +9 -0
  32. package/dist/core/credits.js.map +1 -0
  33. package/dist/core/deploy.d.ts +146 -0
  34. package/dist/core/deploy.js +400 -0
  35. package/dist/core/deploy.js.map +1 -0
  36. package/dist/core/format.d.ts +25 -0
  37. package/dist/core/format.js +144 -0
  38. package/dist/core/format.js.map +1 -0
  39. package/dist/core/markets.d.ts +74 -0
  40. package/dist/core/markets.js +146 -0
  41. package/dist/core/markets.js.map +1 -0
  42. package/dist/core/templates.d.ts +61 -0
  43. package/dist/core/templates.js +190 -0
  44. package/dist/core/templates.js.map +1 -0
  45. package/dist/mcp/index.d.ts +2 -0
  46. package/dist/mcp/index.js +73 -0
  47. package/dist/mcp/index.js.map +1 -0
  48. package/dist/mcp/tools.d.ts +52 -0
  49. package/dist/mcp/tools.js +994 -0
  50. package/dist/mcp/tools.js.map +1 -0
  51. package/docs/CLI.md +144 -0
  52. package/docs/COST.md +32 -0
  53. package/docs/MINIMAX-H3.md +79 -0
  54. package/examples/hello-world.json +18 -0
  55. package/examples/minimax-h3-i2v-32gb.json +56 -0
  56. package/package.json +66 -0
@@ -0,0 +1,400 @@
1
+ import pc from 'picocolors';
2
+ import { CliError } from './client.js';
3
+ import { elapsed, fmtDate, short, sleep, statusColor, table, withRetry } from './format.js';
4
+ import { fitsVram } from './markets.js';
5
+ import { exposesPorts, kindOfDefinition, llmFlavor, readinessPath, typicalBootMinutes } from './templates.js';
6
+ /** Nosana refuses credit-paid jobs shorter than 3600 seconds, so every deployment needs at least this timeout. */
7
+ export const MIN_TIMEOUT_MINUTES = 60;
8
+ export const STRATEGIES = ['SIMPLE', 'SIMPLE-EXTEND', 'SCHEDULED', 'INFINITE'];
9
+ export function parseStrategy(value) {
10
+ if (!value)
11
+ return 'SIMPLE';
12
+ const upper = value.trim().toUpperCase().replace('_', '-');
13
+ const found = STRATEGIES.find((s) => s === upper);
14
+ if (!found)
15
+ throw new CliError(`Unknown strategy "${value}". Use one of: ${STRATEGIES.join(', ')}.`, 2);
16
+ return found;
17
+ }
18
+ export function defaultDeploymentName(label) {
19
+ const stamp = new Date().toISOString().replace(/[-:]/g, '').replace('T', '-').slice(0, 13);
20
+ const base = label.toLowerCase().replace(/\.json$/, '').replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'workload';
21
+ return `${base}-${stamp}`;
22
+ }
23
+ export function assessPlan(plan, fit, creditsAvailable, options = {}) {
24
+ const blocking = [];
25
+ const advisories = [];
26
+ const gpu = plan.gpu;
27
+ if (!fitsVram(gpu, fit.minVramGb)) {
28
+ blocking.push(`${gpu.name} has ${gpu.vramGb ?? '?'} GB VRAM but the workload asks for ${fit.minVramGb} GB.`);
29
+ }
30
+ if (fit.recommend && !fit.recommend(gpu)) {
31
+ blocking.push(`${gpu.name} is not a Blackwell card; this template's weights need RTX 5090 or RTX PRO 6000 class hardware.`);
32
+ }
33
+ const cost = estimateCost(plan);
34
+ if (cost.total > creditsAvailable) {
35
+ blocking.push(`Estimated ${cost.total.toFixed(3)} credits exceed the ${creditsAvailable.toFixed(3)} available. Top up at https://deploy.nosana.com (Billing).`);
36
+ }
37
+ if (gpu.availableNodes === 0) {
38
+ const note = `No idle ${gpu.name} host right now; the job would queue until one frees up.`;
39
+ if (options.requireIdle)
40
+ blocking.push(`${note} Pass accept_queue=true if the user agrees to wait, or pick a GPU from ready_now.`);
41
+ else
42
+ advisories.push(note);
43
+ }
44
+ return { blocking, advisories, warnings: [...blocking, ...advisories], cost };
45
+ }
46
+ /** 1 credit is priced like 1 USD on the dashboard; the estimate covers one full timeout window. */
47
+ export function estimateCost(plan) {
48
+ const perHour = plan.gpu.pricePerHour * plan.replicas;
49
+ const hours = plan.timeoutMinutes / 60;
50
+ return { perHour, hours, total: perHour * hours, recurring: plan.strategy !== 'SIMPLE' };
51
+ }
52
+ export function validatePlan(plan) {
53
+ if (!plan.name.trim())
54
+ throw new CliError('Deployment name is required.', 2);
55
+ if (!Number.isInteger(plan.replicas) || plan.replicas < 1)
56
+ throw new CliError('--replicas must be a whole number >= 1.', 2);
57
+ if (!Number.isInteger(plan.timeoutMinutes) || plan.timeoutMinutes < MIN_TIMEOUT_MINUTES) {
58
+ throw new CliError(`--timeout must be a whole number of minutes >= ${MIN_TIMEOUT_MINUTES}: Nosana only schedules credit-paid jobs that run for at least 3600 seconds.`, 2);
59
+ }
60
+ if (plan.strategy === 'SCHEDULED' && !plan.schedule) {
61
+ throw new CliError('--schedule <cron> is required for SCHEDULED deployments (5 fields, e.g. "0 9 * * 1-5").', 2);
62
+ }
63
+ if (plan.strategy !== 'SCHEDULED' && plan.schedule)
64
+ throw new CliError('--schedule only applies to --strategy SCHEDULED.', 2);
65
+ if (plan.strategy === 'INFINITE') {
66
+ if (plan.startupTimeoutMinutes !== undefined && !exposesPorts(plan.jobDefinition)) {
67
+ throw new CliError('--startup-timeout requires a job definition that exposes a port.', 2);
68
+ }
69
+ }
70
+ else if (plan.rotationTime !== undefined || plan.startupTimeoutMinutes !== undefined) {
71
+ throw new CliError('--rotation-time and --startup-timeout only apply to --strategy INFINITE.', 2);
72
+ }
73
+ if (plan.sshPublicKeys && plan.sshPublicKeys.length > 10)
74
+ throw new CliError('At most 10 SSH public keys are allowed.', 2);
75
+ }
76
+ export function buildCreateBody(plan) {
77
+ const body = {
78
+ name: plan.name,
79
+ market: plan.gpu.address,
80
+ replicas: plan.replicas,
81
+ timeout: plan.timeoutMinutes,
82
+ confidential: plan.confidential,
83
+ job_definition: plan.jobDefinition,
84
+ strategy: plan.strategy,
85
+ };
86
+ if (plan.sshPublicKeys?.length)
87
+ body.ssh_public_keys = plan.sshPublicKeys;
88
+ if (plan.strategy === 'SCHEDULED')
89
+ body.schedule = plan.schedule;
90
+ if (plan.strategy === 'INFINITE') {
91
+ if (plan.rotationTime !== undefined)
92
+ body.rotation_time = plan.rotationTime;
93
+ if (plan.startupTimeoutMinutes !== undefined)
94
+ body.startup_timeout = plan.startupTimeoutMinutes;
95
+ }
96
+ return body;
97
+ }
98
+ export async function createDeployment(client, plan) {
99
+ validatePlan(plan);
100
+ return (await client.api.deployments.create(buildCreateBody(plan)));
101
+ }
102
+ export const dashboardUrl = (id, network) => `https://deploy.nosana.com/deployments/${id}${network === 'devnet' ? '?network=devnet' : ''}`;
103
+ export const explorerJobUrl = (job, network) => `https://explore.nosana.com/jobs/${job}${network === 'devnet' ? '?network=devnet' : ''}`;
104
+ const JOB_STATES = { '0': 'QUEUED', '1': 'RUNNING', '2': 'COMPLETED', '3': 'STOPPED' };
105
+ export const normalizeJobState = (state) => JOB_STATES[String(state)] ?? String(state ?? 'UNKNOWN');
106
+ export function summarizeDeployment(dep, network) {
107
+ const extra = dep;
108
+ const strategyBits = [dep.strategy];
109
+ if (extra.schedule)
110
+ strategyBits.push(`schedule "${extra.schedule}"`);
111
+ if (extra.rotation_time !== undefined)
112
+ strategyBits.push(`rotation ${extra.rotation_time}`);
113
+ if (extra.startup_timeout !== undefined)
114
+ strategyBits.push(`startup timeout ${extra.startup_timeout} min`);
115
+ const lines = [
116
+ `${pc.bold('Deployment')} ${dep.id}`,
117
+ `Name ${dep.name}`,
118
+ `Status ${statusColor(dep.status)}`,
119
+ `Market ${dep.market}`,
120
+ `Strategy ${strategyBits.join(', ')}`,
121
+ `Timeout ${dep.timeout} min`,
122
+ `Replicas ${dep.replicas} (active jobs: ${dep.active_jobs})`,
123
+ `Confidential ${dep.confidential ? 'yes' : 'no'}`,
124
+ `Revision ${dep.active_revision}`,
125
+ `Created ${fmtDate(dep.created_at)}`,
126
+ `Updated ${fmtDate(dep.updated_at)}`,
127
+ `Dashboard ${dashboardUrl(dep.id, network)}`,
128
+ ];
129
+ if (dep.endpoints?.length) {
130
+ lines.push('Endpoints');
131
+ for (const endpoint of dep.endpoints) {
132
+ lines.push(` ${endpoint.online ? pc.green('online ') : pc.dim('offline')} ${endpoint.url} (${endpoint.opId}:${endpoint.port})`);
133
+ }
134
+ }
135
+ return lines;
136
+ }
137
+ export function deploymentsTable(deps) {
138
+ return table(['ID', 'Name', 'Status', 'Strategy', 'Jobs', 'Timeout', 'Updated'], deps.map((d) => [
139
+ d.id,
140
+ d.name,
141
+ statusColor(d.status),
142
+ d.strategy,
143
+ String(d.active_jobs),
144
+ `${d.timeout} min`,
145
+ fmtDate(d.updated_at),
146
+ ]));
147
+ }
148
+ export async function inspectDefinition(dep) {
149
+ let definition = null;
150
+ try {
151
+ const revisions = await dep.getRevisions({ limit: 10 });
152
+ const items = revisions.revisions;
153
+ const active = items.find((r) => r.revision === dep.active_revision) ?? items[0];
154
+ if (active?.job_definition)
155
+ definition = active.job_definition;
156
+ }
157
+ catch {
158
+ /* fall through */
159
+ }
160
+ if (!definition) {
161
+ return { jobDefinition: null, exposes: (dep.endpoints?.length ?? 0) > 0, kind: 'custom', readinessPath: '/', bootMinutes: 3, opId: dep.endpoints?.[0]?.opId ?? null };
162
+ }
163
+ const kind = kindOfDefinition(definition);
164
+ const ops = definition.ops ?? [];
165
+ return {
166
+ jobDefinition: definition,
167
+ exposes: exposesPorts(definition),
168
+ kind,
169
+ readinessPath: readinessPath(kind, llmFlavor(definition)),
170
+ bootMinutes: typicalBootMinutes(definition, kind),
171
+ opId: ops[0]?.id ?? null,
172
+ };
173
+ }
174
+ /** Where a deployment is in its life, derived from status, jobs and endpoint probes. */
175
+ export function computePhase(dep, jobs, endpoints, exposes) {
176
+ if (dep.status === 'DRAFT')
177
+ return 'draft';
178
+ if (dep.status === 'ERROR' || dep.status === 'INSUFFICIENT_FUNDS')
179
+ return 'error';
180
+ const states = jobs.map((j) => normalizeJobState(j.state));
181
+ if (states.includes('COMPLETED') && !exposes)
182
+ return 'completed';
183
+ if (TERMINAL_STATUSES.has(dep.status))
184
+ return 'stopped';
185
+ if (endpoints.some((e) => e.service_ready))
186
+ return 'ready';
187
+ if (states.includes('RUNNING'))
188
+ return endpoints.some((e) => e.tunnel_online) ? 'initializing' : 'starting';
189
+ if (states.includes('QUEUED'))
190
+ return 'queued';
191
+ return 'scheduling';
192
+ }
193
+ export const PHASE_HINTS = {
194
+ draft: { message: 'Created but not started.', pollAfterSeconds: 0 },
195
+ scheduling: { message: 'Nosana is listing the job on the market.', pollAfterSeconds: 10 },
196
+ queued: { message: 'Job is queued, waiting for an idle host on this GPU market.', pollAfterSeconds: 30 },
197
+ starting: { message: 'A host picked the job and is pulling the image and any model weights before the container opens its tunnel.', pollAfterSeconds: 20 },
198
+ initializing: { message: 'Tunnel is up; the service is still starting (downloading weights or loading the model).', pollAfterSeconds: 30 },
199
+ ready: { message: 'The service answers.', pollAfterSeconds: 0 },
200
+ completed: { message: 'The job finished.', pollAfterSeconds: 0 },
201
+ stopped: { message: 'The deployment is stopped (by the user or by its timeout), not failed.', pollAfterSeconds: 0 },
202
+ error: { message: 'The deployment is in an error state.', pollAfterSeconds: 0 },
203
+ };
204
+ export async function snapshotDeployment(client, id, facts) {
205
+ const dep = (await withRetry(() => client.api.deployments.get(id)));
206
+ const resolvedFacts = facts ?? (await inspectDefinition(dep));
207
+ const [jobsRaw, eventsRaw] = await Promise.all([
208
+ dep.getJobs({ limit: 10 }).then((r) => r.jobs).catch(() => []),
209
+ dep.getEvents({ limit: 10, sort_order: 'desc' }).then((r) => r.events).catch(() => []),
210
+ ]);
211
+ const endpoints = await Promise.all((dep.endpoints ?? []).map(async (e) => ({
212
+ url: e.url,
213
+ op: e.opId,
214
+ port: e.port,
215
+ tunnel_online: e.online,
216
+ service_ready: e.online ? (await probeEndpoint(e.url, resolvedFacts.readinessPath)) === 'ready' : false,
217
+ })));
218
+ const jobs = jobsRaw.slice(0, 5).map((j) => ({ job: j.job, state: normalizeJobState(j.state), node: j.node ?? null, created_at: j.created_at, time_start: j.time_start }));
219
+ const running = jobsRaw.find((j) => normalizeJobState(j.state) === 'RUNNING' && j.time_start);
220
+ const since = running?.time_start ? running.time_start * 1000 : new Date(dep.updated_at ?? dep.created_at).getTime();
221
+ return {
222
+ deployment: dep,
223
+ facts: resolvedFacts,
224
+ phase: computePhase(dep, jobsRaw, endpoints, resolvedFacts.exposes),
225
+ endpoints,
226
+ readyUrls: endpoints.filter((e) => e.service_ready).map((e) => e.url),
227
+ jobs,
228
+ events: eventsRaw.slice(0, 5).map((e) => ({ at: e.created_at, type: e.type, message: e.message })),
229
+ elapsedSeconds: Math.max(0, Math.round((Date.now() - since) / 1000)),
230
+ };
231
+ }
232
+ const TERMINAL_STATUSES = new Set(['STOPPED', 'ERROR', 'INSUFFICIENT_FUNDS', 'ARCHIVED']);
233
+ const trimMessage = (message) => message.replace(/\.?\s*TX\s+\S+$/i, '').trim();
234
+ /** Scheduler errors that will never resolve by retrying (bad config, no funds, no access). */
235
+ const FATAL_ERROR_PATTERN = /must have|invalid|not allowed|insufficient|unauthorized|forbidden|does not exist|not found/i;
236
+ const REPEATED_ERROR_LIMIT = 3;
237
+ /** Consecutive failed status polls tolerated before giving up on a watch. */
238
+ const MAX_CONSECUTIVE_FAILURES = 12;
239
+ /**
240
+ * The deployment manager marks an endpoint online as soon as the host's tunnel answers, which can be
241
+ * long before the container does: Nosana then serves a 503 "Service Initializing" page. Probe the URL
242
+ * so "online" means the workload itself responds.
243
+ */
244
+ export async function probeEndpoint(url, path = '/') {
245
+ try {
246
+ const target = path === '/' ? url : `${url.replace(/\/$/, '')}${path}`;
247
+ const response = await fetch(target, { method: 'GET', redirect: 'manual', signal: AbortSignal.timeout(10_000) });
248
+ if (response.status === 502 || response.status === 503 || response.status === 504)
249
+ return 'initializing';
250
+ return 'ready';
251
+ }
252
+ catch {
253
+ return 'unreachable';
254
+ }
255
+ }
256
+ export async function waitForDeployment(client, id, options) {
257
+ const startedAt = Date.now();
258
+ const deadline = startedAt + options.timeoutMinutes * 60_000;
259
+ const interval = (options.intervalSeconds ?? 5) * 1000;
260
+ const seenEvents = new Set();
261
+ const jobStates = new Map();
262
+ const endpointStates = new Map();
263
+ const errorCounts = new Map();
264
+ let lastStatus = '';
265
+ let facts = null;
266
+ let firstPass = true;
267
+ let lastInitializingLog = 0;
268
+ let lastPhase = 'scheduling';
269
+ const log = (message) => {
270
+ const line = `${pc.dim(elapsed(startedAt))} ${message}`;
271
+ if (options.onLog)
272
+ options.onLog(line);
273
+ else if (!options.quiet)
274
+ console.log(line);
275
+ };
276
+ let consecutiveFailures = 0;
277
+ for (;;) {
278
+ let dep;
279
+ try {
280
+ dep = (await client.api.deployments.get(id));
281
+ consecutiveFailures = 0;
282
+ }
283
+ catch (error) {
284
+ consecutiveFailures += 1;
285
+ const message = error instanceof Error ? error.message : String(error);
286
+ if (consecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {
287
+ throw new CliError(`Lost contact with the Nosana API while watching ${id} (${message}). The deployment keeps running; retry with: nosana-deploy deploy watch ${id}`);
288
+ }
289
+ log(pc.dim(`network hiccup (${message.split('|')[0].trim()}), retrying in ${Math.round(interval / 1000)}s`));
290
+ if (Date.now() >= deadline)
291
+ throw new CliError(`Watch window elapsed while the API was unreachable. Retry with: nosana-deploy deploy watch ${id}`);
292
+ await sleep(interval);
293
+ continue;
294
+ }
295
+ if (facts === null)
296
+ facts = await inspectDefinition(dep);
297
+ const expectEndpoint = facts.exposes;
298
+ if (dep.status !== lastStatus) {
299
+ log(`deployment ${statusColor(dep.status)}`);
300
+ lastStatus = dep.status;
301
+ }
302
+ try {
303
+ const result = await dep.getEvents({ limit: 20, sort_order: 'desc' });
304
+ const events = [...result.events].reverse();
305
+ for (const event of events) {
306
+ const key = `${event.created_at}|${event.type ?? event.event}|${event.message}`;
307
+ if (seenEvents.has(key))
308
+ continue;
309
+ seenEvents.add(key);
310
+ if (firstPass && !options.replayEvents)
311
+ continue;
312
+ const label = event.type ?? event.event ?? 'event';
313
+ const message = event.message ? trimMessage(event.message) : '';
314
+ const isError = /ERROR|FAIL/i.test(label);
315
+ log(`${pc.dim('event')} ${isError ? pc.red(label) : label}${message ? `: ${message}` : ''}`);
316
+ if (isError && message) {
317
+ const count = (errorCounts.get(message) ?? 0) + 1;
318
+ errorCounts.set(message, count);
319
+ if (FATAL_ERROR_PATTERN.test(message) || count >= REPEATED_ERROR_LIMIT) {
320
+ return { kind: 'failed', deployment: dep, reason: dep.status, error: message };
321
+ }
322
+ }
323
+ }
324
+ }
325
+ catch {
326
+ /* events are informational only */
327
+ }
328
+ let jobsSeen = [];
329
+ try {
330
+ const list = await dep.getJobs({ limit: 20 });
331
+ jobsSeen = list.jobs;
332
+ for (const raw of jobsSeen) {
333
+ const state = normalizeJobState(raw.state);
334
+ if (jobStates.get(raw.job) !== state) {
335
+ jobStates.set(raw.job, state);
336
+ log(`job ${pc.dim(short(raw.job))} ${statusColor(state)}${raw.node ? ` on host ${short(raw.node)}` : ''}`);
337
+ }
338
+ if (!expectEndpoint && state === 'COMPLETED')
339
+ return { kind: 'completed', deployment: dep, job: raw.job };
340
+ }
341
+ }
342
+ catch {
343
+ /* retry next tick */
344
+ }
345
+ for (const endpoint of dep.endpoints ?? []) {
346
+ const key = `${endpoint.url}:${endpoint.port}`;
347
+ if (endpointStates.get(key) !== endpoint.online) {
348
+ endpointStates.set(key, endpoint.online);
349
+ log(`endpoint ${endpoint.online ? pc.green('online') : pc.yellow('not reachable yet')} ${endpoint.url}`);
350
+ }
351
+ }
352
+ if (expectEndpoint) {
353
+ const online = (dep.endpoints ?? []).filter((e) => e.online);
354
+ if (online.length) {
355
+ const readiness = facts.readinessPath;
356
+ const probes = await Promise.all(online.map(async (e) => ({ url: e.url, state: await probeEndpoint(e.url, readiness) })));
357
+ const ready = probes.filter((p) => p.state === 'ready').map((p) => p.url);
358
+ if (ready.length)
359
+ return { kind: 'online', deployment: dep, readyUrls: [...new Set(ready)] };
360
+ if (Date.now() - lastInitializingLog >= 60_000) {
361
+ lastInitializingLog = Date.now();
362
+ const initializing = probes.some((p) => p.state === 'initializing');
363
+ log(pc.dim(initializing ? 'tunnel is up, service still starting (image pull or weights download in progress)' : 'tunnel is up, service not answering yet'));
364
+ }
365
+ }
366
+ }
367
+ if (TERMINAL_STATUSES.has(dep.status)) {
368
+ const completed = [...jobStates.entries()].find(([, state]) => state === 'COMPLETED');
369
+ if (completed && !expectEndpoint)
370
+ return { kind: 'completed', deployment: dep, job: completed[0] };
371
+ if (dep.status === 'STOPPED' || dep.status === 'ARCHIVED')
372
+ return { kind: 'stopped', deployment: dep };
373
+ return { kind: 'failed', deployment: dep, reason: dep.status };
374
+ }
375
+ lastPhase = computePhase(dep, jobsSeen, (dep.endpoints ?? []).map((e) => ({ tunnel_online: e.online, service_ready: false })), expectEndpoint);
376
+ if (Date.now() >= deadline)
377
+ return { kind: 'timeout', deployment: dep, phase: lastPhase };
378
+ firstPass = false;
379
+ await sleep(interval);
380
+ }
381
+ }
382
+ export function formatJobResult(result) {
383
+ const r = result;
384
+ if (!r)
385
+ return [pc.dim('(no results reported yet)')];
386
+ const lines = [`Result status: ${r.status ?? '?'}`];
387
+ for (const op of r.opStates ?? []) {
388
+ lines.push(`${pc.bold(op.operationId ?? 'op')} status=${op.status ?? '?'} exit=${op.exitCode ?? '?'}`);
389
+ if (op.error?.message)
390
+ lines.push(pc.red(` error: ${op.error.message}`));
391
+ for (const entry of op.logs ?? []) {
392
+ const text = (entry.log ?? '').replace(/\n$/, '');
393
+ if (!text)
394
+ continue;
395
+ lines.push(entry.type === 'stderr' || entry.type === 'nodeerr' ? pc.red(` ${text}`) : ` ${text}`);
396
+ }
397
+ }
398
+ return lines;
399
+ }
400
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/core/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export declare const stripAnsi: (s: string) => string;
2
+ export declare function table(headers: string[], rows: string[][], indent?: number): string;
3
+ export declare const usd: (n: number, digits?: number) => string;
4
+ export declare const printJson: (value: unknown) => void;
5
+ export declare const sym: {
6
+ ok: string;
7
+ warn: string;
8
+ err: string;
9
+ info: string;
10
+ };
11
+ export declare const heading: (s: string) => void;
12
+ export declare function fmtDate(d: string | Date | number | undefined | null): string;
13
+ export declare function fmtMinutes(minutes: number): string;
14
+ export declare function elapsed(sinceMs: number): string;
15
+ export declare const short: (address: string, keep?: number) => string;
16
+ export declare function statusColor(status: string): string;
17
+ export declare function formatError(error: unknown): string;
18
+ export declare const sleep: (ms: number) => Promise<void>;
19
+ export declare function withTimeout<T>(promise: Promise<T>, ms: number, label?: string): Promise<T>;
20
+ export declare function parseIntStrict(value: string, flag: string, min?: number): number;
21
+ /** Nosana list endpoints accept page sizes of 10, 20, 50 or 100 only. */
22
+ export declare function pageSize(requested: number): 10 | 20 | 50 | 100;
23
+ export declare function isTransientError(error: unknown): boolean;
24
+ /** Retry read-only calls on transient network or 5xx failures with exponential backoff. */
25
+ export declare function withRetry<T>(fn: () => Promise<T>, attempts?: number, baseDelayMs?: number): Promise<T>;
@@ -0,0 +1,144 @@
1
+ import pc from 'picocolors';
2
+ const ANSI = new RegExp(`${String.fromCharCode(27)}\\[[0-9;]*m`, 'g');
3
+ export const stripAnsi = (s) => s.replace(ANSI, '');
4
+ export function table(headers, rows, indent = 0) {
5
+ const widths = headers.map((h, i) => Math.max(stripAnsi(h).length, ...rows.map((r) => stripAnsi(r[i] ?? '').length)));
6
+ const pad = (s, w) => s + ' '.repeat(Math.max(0, w - stripAnsi(s).length));
7
+ const prefix = ' '.repeat(indent);
8
+ const render = (cells) => (prefix + cells.map((c, i) => pad(c ?? '', widths[i])).join(' ')).trimEnd();
9
+ return [
10
+ render(headers.map((h) => pc.bold(h))),
11
+ prefix + widths.map((w) => '-'.repeat(w)).join(' '),
12
+ ...rows.map(render),
13
+ ].join('\n');
14
+ }
15
+ export const usd = (n, digits = 3) => `$${n.toFixed(digits)}`;
16
+ export const printJson = (value) => console.log(JSON.stringify(value, null, 2));
17
+ export const sym = {
18
+ ok: pc.green('OK '),
19
+ warn: pc.yellow('! '),
20
+ err: pc.red('ERR'),
21
+ info: pc.cyan('> '),
22
+ };
23
+ export const heading = (s) => console.log(`\n${pc.bold(s)}`);
24
+ export function fmtDate(d) {
25
+ if (d === undefined || d === null || d === '')
26
+ return '-';
27
+ const date = typeof d === 'number' ? new Date(d < 1e12 ? d * 1000 : d) : new Date(d);
28
+ if (Number.isNaN(date.getTime()))
29
+ return String(d);
30
+ return `${date.toISOString().replace('T', ' ').slice(0, 19)}Z`;
31
+ }
32
+ export function fmtMinutes(minutes) {
33
+ if (minutes < 60)
34
+ return `${minutes} min`;
35
+ const h = Math.floor(minutes / 60);
36
+ const m = minutes % 60;
37
+ return m ? `${h} h ${m} min` : `${h} h`;
38
+ }
39
+ export function elapsed(sinceMs) {
40
+ const total = Math.max(0, Math.floor((Date.now() - sinceMs) / 1000));
41
+ const m = Math.floor(total / 60);
42
+ const s = total % 60;
43
+ return `${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`;
44
+ }
45
+ export const short = (address, keep = 4) => address.length > keep * 2 + 3 ? `${address.slice(0, keep)}...${address.slice(-keep)}` : address;
46
+ export function statusColor(status) {
47
+ switch (status) {
48
+ case 'RUNNING':
49
+ case 'COMPLETED':
50
+ return pc.green(status);
51
+ case 'STARTING':
52
+ case 'QUEUED':
53
+ case 'STOPPING':
54
+ return pc.yellow(status);
55
+ case 'ERROR':
56
+ case 'INSUFFICIENT_FUNDS':
57
+ return pc.red(status);
58
+ case 'STOPPED':
59
+ case 'ARCHIVED':
60
+ case 'DRAFT':
61
+ return pc.dim(status);
62
+ default:
63
+ return status;
64
+ }
65
+ }
66
+ export function formatError(error) {
67
+ if (error instanceof Error) {
68
+ const extra = error;
69
+ const parts = [error.message];
70
+ for (const key of ['status', 'statusCode']) {
71
+ if (extra[key] !== undefined && !parts[0].includes(String(extra[key])))
72
+ parts.push(`HTTP ${String(extra[key])}`);
73
+ }
74
+ for (const key of ['body', 'data']) {
75
+ const value = extra[key];
76
+ if (value === undefined || value === null)
77
+ continue;
78
+ const text = typeof value === 'string' ? value : JSON.stringify(value);
79
+ if (text && !parts[0].includes(text))
80
+ parts.push(text);
81
+ }
82
+ if (extra.cause instanceof Error && extra.cause.message && !parts[0].includes(extra.cause.message)) {
83
+ parts.push(`cause: ${extra.cause.message}`);
84
+ }
85
+ return parts.join(' | ');
86
+ }
87
+ if (typeof error === 'object' && error !== null)
88
+ return JSON.stringify(error);
89
+ return String(error);
90
+ }
91
+ export const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
92
+ export function withTimeout(promise, ms, label = 'operation') {
93
+ return new Promise((resolve, reject) => {
94
+ const timer = setTimeout(() => reject(new Error(`${label} timed out after ${Math.round(ms / 1000)}s`)), ms);
95
+ promise.then((value) => {
96
+ clearTimeout(timer);
97
+ resolve(value);
98
+ }, (error) => {
99
+ clearTimeout(timer);
100
+ reject(error);
101
+ });
102
+ });
103
+ }
104
+ export function parseIntStrict(value, flag, min = 1) {
105
+ const n = Number(value);
106
+ if (!/^\d+$/.test(String(value).trim()) || !Number.isInteger(n) || n < min) {
107
+ throw new Error(`${flag} must be a whole number >= ${min} (got "${value}").`);
108
+ }
109
+ return n;
110
+ }
111
+ /** Nosana list endpoints accept page sizes of 10, 20, 50 or 100 only. */
112
+ export function pageSize(requested) {
113
+ if (requested <= 10)
114
+ return 10;
115
+ if (requested <= 20)
116
+ return 20;
117
+ if (requested <= 50)
118
+ return 50;
119
+ return 100;
120
+ }
121
+ const TRANSIENT = /fetch failed|timed? ?out|ECONN|ENOTFOUND|EAI_AGAIN|socket hang up|\b50[234]\b|Bad Gateway|Service Unavailable|Gateway Time-out/i;
122
+ export function isTransientError(error) {
123
+ const status = error.status ?? error.statusCode;
124
+ if (typeof status === 'number' && status >= 500)
125
+ return true;
126
+ return TRANSIENT.test(error instanceof Error ? `${error.message} ${error.cause?.message ?? ''}` : String(error));
127
+ }
128
+ /** Retry read-only calls on transient network or 5xx failures with exponential backoff. */
129
+ export async function withRetry(fn, attempts = 3, baseDelayMs = 400) {
130
+ let lastError;
131
+ for (let attempt = 0; attempt < attempts; attempt += 1) {
132
+ try {
133
+ return await fn();
134
+ }
135
+ catch (error) {
136
+ lastError = error;
137
+ if (!isTransientError(error) || attempt === attempts - 1)
138
+ throw error;
139
+ await sleep(baseDelayMs * 2 ** attempt);
140
+ }
141
+ }
142
+ throw lastError;
143
+ }
144
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/core/format.ts"],"names":[],"mappings":"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"}