diff --git a/cli/src/commands/upload.ts b/cli/src/commands/upload.ts index 903f178..78b70f1 100644 --- a/cli/src/commands/upload.ts +++ b/cli/src/commands/upload.ts @@ -1,5 +1,6 @@ import { readFile } from 'node:fs/promises' import path from 'node:path' +import type { FailedAttempt } from '@filoz/synapse-sdk' import { Synapse } from '@filoz/synapse-sdk' import { z } from 'incur' import { privateKeyClient } from '../client.ts' @@ -32,6 +33,8 @@ export const uploadCommand = { pieceCid: z.string(), pieceScannerUrl: z.string(), size: z.number(), + requestedCopies: z.number(), + complete: z.boolean(), copyResults: z.array( z.object({ dataSetId: z.string(), @@ -122,18 +125,20 @@ export const uploadCommand = { providerRole: copy.role, })) const copyFailures = result.failedAttempts.map((failure: any) => ({ - providerId: failure.providerId, + providerId: failure.providerId.toString(), role: failure.role, - error: failure instanceof Error ? failure.message : String(failure), - explicit: failure.explicit, + error: formatFailedAttemptError(failure), + explicit: Boolean(failure.explicit), })) return out.done({ - status: 'uploaded', + status: result.complete ? 'uploaded' : 'partially_uploaded', result: { pieceCid: cidStr, pieceScannerUrl: pieceScannerUrl(cidStr, chain), size: result.size, + requestedCopies: result.requestedCopies, + complete: result.complete, copyResults, copyFailures, }, @@ -144,3 +149,13 @@ export const uploadCommand = { } }, } + +function formatFailedAttemptError(failure: FailedAttempt | Error | unknown) { + if (failure instanceof Error) return failure.message + if (failure && typeof failure === 'object' && 'error' in failure) { + const error = failure.error + if (error instanceof Error) return error.message + if (error !== undefined && error !== null) return String(error) + } + return String(failure) +} diff --git a/cli/src/commands/wallet/summary.ts b/cli/src/commands/wallet/summary.ts index 30e9aee..dc3b020 100644 --- a/cli/src/commands/wallet/summary.ts +++ b/cli/src/commands/wallet/summary.ts @@ -19,6 +19,7 @@ export const summaryCommand = { availableFunds: z.string(), timeRemaining: z.string(), totalLockup: z.string(), + rateBasedLockup: z.string(), monthlyAccountRate: z.string(), monthlyStorageRate: z.string(), funds: z.string(), @@ -39,9 +40,12 @@ export const summaryCommand = { availableFunds: formatBalance({ value: summary.availableFunds }), timeRemaining, totalLockup: formatBalance({ value: summary.totalLockup }), - monthlyAccountRate: formatBalance({ + rateBasedLockup: formatBalance({ value: summary.totalRateBasedLockup, }), + monthlyAccountRate: formatBalance({ + value: summary.lockupRatePerMonth, + }), monthlyStorageRate: formatBalance({ value: summary.lockupRatePerMonth, }), diff --git a/cli/tests/command-mocks.ts b/cli/tests/command-mocks.ts index e0e63a8..ca76df0 100644 --- a/cli/tests/command-mocks.ts +++ b/cli/tests/command-mocks.ts @@ -60,6 +60,8 @@ export const synapseStorage = { upload: mock(async () => ({ pieceCid: cid('baga-upload'), size: 4, + requestedCopies: 0, + complete: true, copies: [], failedAttempts: [], })), diff --git a/cli/tests/synapse-commands.test.ts b/cli/tests/synapse-commands.test.ts index 881f46f..4dbc05e 100644 --- a/cli/tests/synapse-commands.test.ts +++ b/cli/tests/synapse-commands.test.ts @@ -125,6 +125,8 @@ describe('top-level upload commands', () => { synapseStorage.upload.mockImplementation(async () => ({ pieceCid: cid('baga-upload'), size: 4, + requestedCopies: 3, + complete: false, copies: [ { dataSetId: 42n, @@ -141,9 +143,6 @@ describe('top-level upload commands', () => { role: 'secondary', error: 'temporarily unavailable', explicit: false, - toString() { - return this.error - }, }, ], })) @@ -172,11 +171,13 @@ describe('top-level upload commands', () => { contexts, withCDN: true, }) - expect(result.status).toBe('uploaded') + expect(result.status).toBe('partially_uploaded') expect(result.result).toEqual({ pieceCid: 'baga-upload', pieceScannerUrl: 'https://pdp.vxb.ai/calibration/piece/baga-upload', size: 4, + requestedCopies: 3, + complete: false, copyResults: [ { dataSetId: '42', @@ -426,7 +427,8 @@ describe('wallet commands', () => { availableFunds: 'formatted:1', timeRemaining: '1h 0d 0w 0m 0y', totalLockup: 'formatted:2', - monthlyAccountRate: 'formatted:3', + rateBasedLockup: 'formatted:3', + monthlyAccountRate: 'formatted:4', monthlyStorageRate: 'formatted:4', funds: 'formatted:5', })