From c5e2acf30b42a2921a31fa491ad85575e3524c28 Mon Sep 17 00:00:00 2001 From: Vigneshraj Sekar Babu Date: Fri, 9 Oct 2026 15:36:17 -0700 Subject: [PATCH 1/2] chore: update sites api types Regenerated with pnpm generate:api; only the Sites types this change uses are committed. --- src/lib/generated/listSitesParams.ts | 3 +++ src/lib/generated/listSitesView.ts | 1 + src/lib/generated/site.ts | 7 +++++++ src/lib/generated/sitePermissions.ts | 1 + src/lib/generated/siteStatus.ts | 1 + src/lib/generated/sitesCapabilities.ts | 5 +++++ tests/sites.test.ts | 1 + 7 files changed, 19 insertions(+) diff --git a/src/lib/generated/listSitesParams.ts b/src/lib/generated/listSitesParams.ts index 0065661..d46093d 100644 --- a/src/lib/generated/listSitesParams.ts +++ b/src/lib/generated/listSitesParams.ts @@ -8,6 +8,9 @@ import type { ListSitesView } from './listSitesView.js'; export type ListSitesParams = { +/** + * deleted lists the caller's deleted sites that can still be restored. + */ view?: ListSitesView; q?: string; /** diff --git a/src/lib/generated/listSitesView.ts b/src/lib/generated/listSitesView.ts index 8d3ba8a..d62d5a4 100644 --- a/src/lib/generated/listSitesView.ts +++ b/src/lib/generated/listSitesView.ts @@ -14,4 +14,5 @@ export const ListSitesView = { mine: 'mine', public: 'public', all: 'all', + deleted: 'deleted', } as const; diff --git a/src/lib/generated/site.ts b/src/lib/generated/site.ts index 8e2a9b5..4132820 100644 --- a/src/lib/generated/site.ts +++ b/src/lib/generated/site.ts @@ -34,6 +34,13 @@ export interface Site { updatedAt: string | null; /** @nullable */ expiresAt: string | null; + /** @nullable */ + deletedAt: string | null; + /** + * Last moment a deleted site can be restored; null unless the site is deleted. + * @nullable + */ + restorableUntil: string | null; /** @minimum 0 */ fileCount: number; /** @minimum 0 */ diff --git a/src/lib/generated/sitePermissions.ts b/src/lib/generated/sitePermissions.ts index ea48c03..38ae1a5 100644 --- a/src/lib/generated/sitePermissions.ts +++ b/src/lib/generated/sitePermissions.ts @@ -11,4 +11,5 @@ export type SitePermissions = { canEdit: boolean; canDelete: boolean; canChangeVisibility: boolean; + canRestore: boolean; }; diff --git a/src/lib/generated/siteStatus.ts b/src/lib/generated/siteStatus.ts index 58b466d..30df403 100644 --- a/src/lib/generated/siteStatus.ts +++ b/src/lib/generated/siteStatus.ts @@ -14,4 +14,5 @@ export const SiteStatus = { active: 'active', deleted: 'deleted', expired: 'expired', + purged: 'purged', } as const; diff --git a/src/lib/generated/sitesCapabilities.ts b/src/lib/generated/sitesCapabilities.ts index 4bb8acd..e1ac9d7 100644 --- a/src/lib/generated/sitesCapabilities.ts +++ b/src/lib/generated/sitesCapabilities.ts @@ -15,4 +15,9 @@ export interface SitesCapabilities { defaultVisibility: SitesCapabilitiesDefaultVisibility; allowedVisibilities: SitesCapabilitiesAllowedVisibilitiesItem[]; upload: SitesCapabilitiesUpload; + /** + * Days a deleted site stays restorable before its content is purged. + * @minimum 0 + */ + deletedRetentionDays: number; } diff --git a/tests/sites.test.ts b/tests/sites.test.ts index 6668b9f..c60cdec 100644 --- a/tests/sites.test.ts +++ b/tests/sites.test.ts @@ -12,6 +12,7 @@ const capabilities: SitesCapabilities = { defaultVisibility: 'public', allowedVisibilities: ['public'], upload: { maxUploadBytes: 100, maxExtractedBytes: 100, maxFiles: 3, allowedExtensions: ['html'] }, + deletedRetentionDays: 30, }; afterEach(() => vi.unstubAllGlobals()); function mockResponse(data: unknown) { From 872ab70351836e989dc1dddcaad75393996a6d7f Mon Sep 17 00:00:00 2001 From: Vigneshraj Sekar Babu Date: Fri, 9 Oct 2026 15:36:43 -0700 Subject: [PATCH 2/2] feat(sites): add restore command and deleted listing Add lfc sites restore and lfc sites list --deleted, show how long deleted sites are kept (from sites capabilities), and point delete output at restore. The delete prompt only promises a restore window when the server reports one. --- README.md | 6 +- src/commands/llms.ts | 5 +- src/commands/sites.ts | 72 ++++++++++++++++++-- src/lib/api.ts | 7 ++ src/lib/sites.ts | 12 +++- tests/sites-command.test.ts | 127 +++++++++++++++++++++++++++++++++++- tests/sites.test.ts | 24 ++++++- 7 files changed, 240 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 0839331..6df5c4d 100644 --- a/README.md +++ b/README.md @@ -159,7 +159,7 @@ Runs fully offline (no auth needed) except `--repo/--branch`. Exit codes: `0` va Upload a ZIP, a single HTML file, or a directory (auto-zipped) and get a stable URL back: -User and personal-key uploads are private by default. Service-key uploads default to public for automation. An explicit unsupported visibility is rejected before upload. Only the owner can replace, extend, delete, or change visibility. Public sites allow anyone with the link to view them. +User and personal-key uploads are private by default. Service-key uploads default to public for automation. An explicit unsupported visibility is rejected before upload. Only the owner can replace, extend, delete, restore, or change visibility. Public sites allow anyone with the link to view them. Use `openUrl` for a stable opening link. Visibility changes keep the Site ID and content URL; saved copies cannot be recalled. Named-user sharing is not included in this version. @@ -176,7 +176,9 @@ lfc sites get a1b2c3d4e5 lfc sites update a1b2c3d4e5 ./dist # replace content (new version) lfc sites visibility a1b2c3d4e5 private --yes lfc sites extend a1b2c3d4e5 # push out the TTL/expiry -lfc sites delete a1b2c3d4e5 --yes +lfc sites delete a1b2c3d4e5 --yes # recoverable until its restore deadline +lfc sites list --deleted # your deleted sites that can still be restored +lfc sites restore a1b2c3d4e5 # same id and URL as before ``` Directory uploads honor default ignores such as `.git`, `node_modules`, `.DS_Store`, `.next/cache`, `dist/.cache`, and `coverage`. diff --git a/src/commands/llms.ts b/src/commands/llms.ts index 6a63dcf..274973d 100644 --- a/src/commands/llms.ts +++ b/src/commands/llms.ts @@ -152,12 +152,13 @@ Static sites: lfc sites create [--name