Ctrl K
ComunidadGuías…

electron/cloud-account.d.mts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
/** Remove from list's answer: done (`removed`), refused by the Admin now, the Cloud no longer theirs (`gone`), an Admin
 * without it (`unsupported`), or no answer (`failed`). */
export type CloudRemoveOutcome = "removed" | "refused" | "gone" | "unsupported" | "failed";
export interface CloudAccountState {
  status: "signed-out" | "connecting" | "connected" | "reauth-required" | "unavailable";
  message?: string;
  enrollment?: { userCode: string; expiresAt: number };
  account?: { id: string; email: string };
  deviceId?: string;
  expiresAt?: number;
  /** Only a current server-verified session can include an entitlement
   * (verified within the last few minutes; a failed re-check keeps it).
   * `plan` "pro" means any paid plan; `tier` names it ("starter", "personal",
   * "pro", "max", or one newer than this app) when the Admin sends one. */
  entitlement?: { plan: "free" | "pro"; tier?: string; status: "active" | "inactive"; expiresAt: number | null; version: number };
  verifiedAt?: number;
  verifiedUntil?: number;
  /** Connected, but the last checks with OMB Cloud failed; the snapshot is the last verified one. */
  checking?: true;
  /** Not connected (unavailable, or the sign-in ended): the paid plan last
   * verified for this account, for display only. It activates nothing. */
  lastPlan?: { tier?: string; active: boolean };
  /** The person's Cloud home machine, when their plan has one. */
  machine?: import("./cloud-home.mjs").CloudMachine;
  /** Connected: the teams this account is in, each with its Cloud; absent while it is in none. */
  teams?: import("./cloud-home.mjs").CloudTeam[];
  /** Connected, with no Cloud of the account's own: the team it was invited into, which opens first, before any plan is
   * offered (the Admin's `landing`). */
  landing?: { teamId: string };
  /** Connected to an Admin that lists every Cloud of the person's (contract v1 `clouds`): each of them, My Cloud first.
   * Absent from an older Admin, whose `machine` and `teams` say everything. */
  clouds?: import("./cloud-list.mjs").CloudListEntry[];
  /** With `clouds`: whether the Admin opens another Cloud's checkout now, and why not. */
  addCloud?: { canAdd: true } | { canAdd: false; blocked: CloudAddBlock };
  /** With `clouds`, for the account a Team plan with organizations is billed to: whether + may add one to it now. */
  organizations?: import("./cloud-list.mjs").CloudOrganizations;
  /** The newest OpenMausBot release the Admin knows, while it follows releases (with `clouds`); absent otherwise. */
  latestVersion?: string;
  /** Another Cloud this app is buying (in the last 24 hours): its id, name, swatch and plan, when its checkout opened,
   * whether main keeps that page (`link`), and `done` once it was opened or announced. */
  /** `cloudId` null: a checkout the Admin said is still open, before the session lists its Cloud. */
  adding?: { cloudId: string | null; name: string; color: import("./cloud-list.mjs").CloudSwatch | null; tier: string | null; startedAt: number; link?: true; done?: true };
  /** A payment OMB Cloud received and is still linking to this account. */
  purchase?: import("./cloud-home.mjs").CloudPurchase;
  /** Connected: the free trial on this account's Cloud, when the Admin says (display only). */
  trial?: import("./cloud-home.mjs").CloudTrial;
  /** Connected: the trial's Claude credit, while it lasts. */
  credit?: import("./cloud-home.mjs").CloudCredit;
  /** Connected: what this account may buy now (the session's `offer`), for wording only. */
  offer?: import("./cloud-home.mjs").CloudOffer;
  /** Connected with an active plan: its allowances and this month's use of them, and the bigger plans the app can move to (display only). */
  usage?: import("./cloud-home.mjs").CloudUsage;
  /** Connected beside `usage`: the Cloud is short on room (display only; its plan moves through the usual upgrade). */
  room?: import("./cloud-home.mjs").CloudRoom;
  /** A checkout this app opened (or a sign-in it started on the way to
   * one: `signIn`) in the last 24 hours: the plan, and when (Reopen checkout
   * starts the 30-minute watch again). `link`: main keeps its page, so Reopen
   * and Copy link use that same page. */
  checkout?: { plan: string; startedAt: number; signIn?: true; link?: true; done?: true };
  /** This app talks to the staging Admin (OMB_CLOUD_STAGING=1): test payments, test Clouds. */
  staging?: true;
  /** Connected: opening My Cloud waits for it to wake. */
  waking?: true;
  /** Connected: the plan's renewal, only while this account pays for a plan that runs: what Cancel and Keep act on (display only). */
  renewal?: import("./cloud-list.mjs").CloudRenewal;
}
/** The cancel sheet's reasons. */
export type CloudCancelAnswer = "feature" | "price" | "setup" | "broken" | "later" | "other";
/** The cancel sheet's survey: one reason (words without one are kept as `other`) and two optional boxes, at most 2,000 characters each. */
export interface CloudCancelSurvey { answer?: CloudCancelAnswer | null; expected?: string; improve?: string }
/** What Cancel or Keep my plan did: `cancelled` (with when it ends, from the Admin's answer, and whether the survey was kept),
 * `kept`, `browser` (this Admin can't do it from the app yet, so the Cloud page's billing opened instead), or `failed`
 * (nothing changed). */
export type CloudRenewalResult =
  | { outcome: "cancelled"; renewal: import("./cloud-list.mjs").CloudRenewal | null; surveyed: boolean; state: CloudAccountState }
  | { outcome: "kept"; state: CloudAccountState }
  | { outcome: "browser" }
  | { outcome: "failed"; state: CloudAccountState };
/** The email-code sign-in (cloud-signin.mjs). `sent`: the code is on its
 * way (`resendAt`: when another may be asked for). `browser`: this Cloud signs
 * in only in the browser (single sign-on there, or an older Admin). */
export type CloudSignInStart =
  | { outcome: "sent"; email: string; expiresAt: number; resendAt: number; /** False: new accounts are closed, so only an existing one gets a code. */ signupOpen: boolean }
  | { outcome: import("./cloud-signin.mjs").CloudSignInStartFailure };
/** `signed-in`: stored and read like the browser sign-in; `wrong-code` says
 * the tries left; `expired` needs a new code. */
export type CloudSignInVerify =
  | { outcome: "signed-in"; state: CloudAccountState }
  | { outcome: "wrong-code"; triesLeft: number }
  | { outcome: Exclude<import("./cloud-signin.mjs").CloudSignInVerifyFailure, "wrong-code"> };
/** How the Cloud is shown in this app's switcher and Settings → Servers. */
export interface CloudHomeLook { name: string; color: import("./cloud-buy.mjs").CloudColor }
/** Why the Admin opens no other Cloud's checkout now (contract v1 `addBlocked`). */
export type CloudAddBlock = "cap" | "checkout_open" | "rate" | "signups_closed";
export declare const ADD_BLOCKS: readonly CloudAddBlock[];
/** What buying another Cloud did: `opened` its checkout in the browser; `unsupported` (this Admin sells one Cloud per
 * account); `blocked` with the Admin's reason; or `failed` (nothing was opened). */
export type CloudAddResult =
  | { outcome: "opened"; state: CloudAccountState }
  | { outcome: "unsupported" | "failed" }
  | { outcome: "blocked"; blocked: CloudAddBlock };
/** What adding an organization did: `added` (its Cloud is being set up), `taken` (another of the plan's has that name),
 * `blocked` with the Admin's reason, `unsupported` (an Admin without organizations), or `failed` (nothing was added). */
export type OrganizationAddResult =
  | { outcome: "added"; cloudId?: string }
  | { outcome: "taken" | "unsupported" | "failed" }
  | { outcome: "blocked"; blocked: import("./cloud-list.mjs").OrganizationBlock };
/** What opening a checkout did: `opened` in the browser; `signing-in` (signed
 * out, the browser signs in first); `conflict` (the account changed, now read
 * again); `rate-limited`; or `failed` (nothing was opened). */
export type CloudCheckoutOutcome = "opened" | "signing-in" | "conflict" | "rate-limited" | "failed";
export interface CloudCheckoutResult { outcome: CloudCheckoutOutcome; state: CloudAccountState }
/** What moving up to a bigger plan would cost now, from Dodo's own preview (US cents): `price` a month before tax, `chargeNow`
 * today with its `tax` (0 for a free trial, whose first charge becomes `price` on `nextBillingAt`). The confirmation stays in main. */
export interface CloudUpgradePreview { plan: string; from?: string; trial: boolean; price: number; chargeNow: number; tax: number; nextBillingAt?: number; expiresAt: number }
/** The Admin's refusals the app words itself. */
export type CloudUpgradeRefusal = "payment_failed" | "not_subscribed" | "already_on_plan" | "plan_change_unavailable" | "confirmation_required" | "price_changed" | "rate_limited";
/** `preview`: show it and ask; `settled`: a change already going through, where it is now; `browser`: this Admin doesn't change
 * plans from the app, so the Cloud page opened instead; `refused` with its code; `failed`: nothing changed. */
export type CloudUpgradePreviewResult =
  | { outcome: "preview"; preview: CloudUpgradePreview }
  | { outcome: "settled"; status: "upgraded" | "pending"; tier: string }
  | { outcome: "browser" }
  | { outcome: "refused"; code: CloudUpgradeRefusal }
  | { outcome: "failed" };
/** `upgraded`: on the new plan; `pending`: Dodo is still taking the payment; `unconfirmed`: no answer, so the session will say. */
export type CloudUpgradeResult =
  | { outcome: "upgraded" | "pending"; tier: string }
  | { outcome: "unconfirmed" }
  | { outcome: "refused"; code: CloudUpgradeRefusal }
  | { outcome: "failed" };
export interface CloudAccountBridge {
  state(): Promise<CloudAccountState>;
  begin(): Promise<CloudAccountState>;
  /** Only when the sign-in has ended: forget it and start a new one. */
  signInAgain(): Promise<CloudAccountState>;
  reopen(): Promise<CloudAccountState>;
  cancel(): Promise<CloudAccountState>;
  refresh(): Promise<CloudAccountState>;
  signOut(): Promise<CloudAccountState>;
  openDashboard(): Promise<CloudAccountState>;
  /** What this person may buy now (cloud-account.mjs offer), or null. */
  offer?(): Promise<import("./cloud-home.mjs").CloudOffer | null>;
  /** Opens a checkout for a plan of the offer in the browser; `source` is one of CHECKOUT_SOURCES. */
  checkout?(plan: string, source: string): Promise<CloudCheckoutResult>;
  /** The email-code sign-in; the attempt and the token never reach the page. Absent on an older app. */
  signInStart?(email: string): Promise<CloudSignInStart>;
  signInVerify?(code: string): Promise<CloudSignInVerify>;
  signInCancel?(): Promise<void>;
  /** The checkout this app opened, again (never a new one while main keeps it); the plan and source only when none is kept. */
  reopenCheckout?(plan: string, source: string): Promise<CloudCheckoutResult>;
  /** Copies that checkout's page to the clipboard in main; false when none is kept. */
  copyCheckoutLink?(): Promise<boolean>;
  /** "Email me when I can add another". */
  interest?(): Promise<void>;
  /** Moving up to a bigger plan: what it costs now (changes nothing), then the change, only after this app's own preview of it. Absent on an older app. */
  upgradePreview?(plan: string, source: string): Promise<CloudUpgradePreviewResult>;
  upgrade?(plan: string, source: string): Promise<CloudUpgradeResult>;
  /** The Cloud's name and colour (chosen while it is set up), and saving them. */
  look?(): Promise<CloudHomeLook>;
  setLook?(name: string, color: string): Promise<CloudHomeLook>;
  /** The buying sheet is open on this page (main then opens the ready Cloud there rather than notifying). */
  sheet?(open: boolean): Promise<void>;
  /** The sheet showed the ready Cloud: the purchase is over. */
  readySeen?(): Promise<void>;
  /** Lists the Cloud machine under Servers and opens it in this window. */
  connectHome(): Promise<CloudAccountState>;
  /** The same, opening the Cloud's Settings on its phone pairing. */
  connectHomeForPhone(): Promise<CloudAccountState>;
  /** Opens a team's Cloud in this window, as the switcher does: one the verified session lists, by its id. Absent on an older app. */
  openTeam?(teamId: string): Promise<void>;
  /** Cancel trial / Cancel plan, after the survey when it says anything; Keep my plan. The Cloud is the verified session's own, never the page's. Absent on an older app. */
  cancelPlan?(survey: CloudCancelSurvey | null): Promise<CloudRenewalResult>;
  keepPlan?(): Promise<CloudRenewalResult>;
  onState(callback: (state: CloudAccountState) => void): () => void;
  files?: import("./cloud-sync.mjs").CloudFilesBridge;
}
/** Who is signed in on this device, as the You menu shows it. `signIn`: this account's sign-in has ended here. */
export interface AccountRow { id: string; email: string; signIn?: true }
export interface AccountsView { active: AccountRow | null }
export interface AccountSwitchResult { outcome: "switched" | "signed-out" | "moving" | "sign-in" | "gone" | "failed"; email?: string; view: AccountsView }
/** What a click on a place of another account answers when it didn't switch: nothing moved. `sign-in`: that sign-in has ended. */
export interface RailOpenResult { outcome: "switched" | "moving" | "sign-in" | "gone" | "failed"; email?: string }
/** `added`: kept signed in, not switched to, while this computer's move finishes; `already`: that account is the one signed in. */
export type AccountAddResult =
  | { outcome: "switched" | "added" | "already"; email?: string; view: AccountsView }
  | { outcome: "wrong-code"; triesLeft: number }
  | { outcome: Exclude<import("./cloud-signin.mjs").CloudSignInVerifyFailure, "wrong-code"> };
/** This app's own pages only: main refuses any other page. Absent on an older app. */
export interface AccountsBridge {
  list(): Promise<AccountsView>;
  /** Removes that account from this device; the window goes to another signed in here, else the app is signed out. */
  signOut(id: string): Promise<AccountSwitchResult>;
  /** Add another account: the active account goes on until this succeeds. The attempt and the token stay in main. */
  addStart(email: string): Promise<CloudSignInStart>;
  addVerify(code: string): Promise<AccountAddResult>;
  addBrowser(): Promise<{ outcome: "browser" | "failed"; code?: string }>;
  addReopen(): Promise<void>;
  /** How the browser's way ended, asked once the list changes: null until it has. */
  addResult(): Promise<{ outcome: "switched" | "added" | "already" | "failed"; email?: string } | null>;
  addCancel(): Promise<void>;
  sheetPending(): Promise<boolean>;
  sheetClosed(): Promise<void>;
  onChanged(callback: () => void): () => void;
  onOpenSheet(callback: () => void): () => void;
}
/** Any place's own page, from the person's click: the accounts sheet opens on the rail's page, and this page learns nothing of them. */
export interface AccountSheetBridge { offered(): Promise<boolean>; open(): Promise<void> }
/** On the person's own Cloud, open in this app's window: the plan, read
 * only, Manage in the browser, and Sign in again. No account, credential or address. */
/** `signin`: this computer's sign-in ended; `tier` names the plan last verified, if any. */
export interface CloudPlanSnapshot {
  status: "paid" | "attention" | "checking" | "signin" | "none";
  tier?: string;
  /** Verified: the free trial on the Cloud and its Claude credit. */
  trial?: import("./cloud-home.mjs").CloudTrial;
  credit?: import("./cloud-home.mjs").CloudCredit;
  /** The trial's popup due now, not yet shown today on either page. */
  notice?: import("./cloud-home.mjs").CloudTrialState;
  /** Verified: the plan sleeps when idle. */
  sleeps?: true;
  /** This window's home is this Cloud: the person's bots moved here (home-window.mjs). */
  home?: true;
  /** Verified, with an active plan: its allowances and their use this month (the usage meter). */
  usage?: import("./cloud-home.mjs").CloudUsage;
  /** Verified, beside `usage`: this Cloud is short on room, and the plan that fixes it or a tip (the room card). */
  room?: import("./cloud-home.mjs").CloudRoom;
  /** Verified, while this account pays for a plan that runs: what Cancel and Keep act on. */
  renewal?: import("./cloud-list.mjs").CloudRenewal;
}
export interface CloudPlanBridge {
  state(): Promise<CloudPlanSnapshot>;
  manage(): Promise<void>;
  /** This device's MausBot Cloud sign-in, again, once it has ended: only from the person's click. */
  signIn?(): Promise<void>;
  /** The trial's popup due now was shown: main shows it no more today. Absent on an older app. */
  noticeSeen?(): Promise<void>;
  /** The usage meter's Upgrade: the preview, then the change (only from the person's click). Absent on an older app. */
  upgradePreview?(plan: string, source: string): Promise<CloudUpgradePreviewResult>;
  upgrade?(plan: string, source: string): Promise<CloudUpgradeResult>;
  /** Cancel trial / Cancel plan and Keep my plan on the Cloud's own page (only from the person's click). Absent on an older app. */
  cancel?(survey: CloudCancelSurvey | null): Promise<CloudRenewalResult>;
  keep?(): Promise<CloudRenewalResult>;
  /** The room card's Not now, and Restart now after its upgrade (only from the person's click). Absent on an older app. */
  roomNotNow?(id: string): Promise<boolean>;
  restartNow?(): Promise<"restarting" | "current" | "failed">;
}

export declare const CLOUD_ORIGIN: string;
export declare const STAGING_CLOUD_ORIGIN: string;
export declare function cloudTarget(env?: Record<string, string | undefined>): {
  origin: string; staging: boolean;
  /** Under userData: the sign-in, saved servers, Files' folder, the Cloud's chosen name. */
  file: string; saved: string; places: string; environments: string; sync: string; look: string;
};
export declare const CHECKOUT_SOURCES: readonly string[];
export declare const UPGRADE_SOURCES: readonly string[];
export declare const CLOUD_CANCEL_ANSWERS: readonly CloudCancelAnswer[];
/** The survey as main sends it (trimmed; words without a reason as `other`), or null when it says nothing or isn't one. */
export declare function cancelSurvey(input: unknown): { answer: CloudCancelAnswer; expected?: string; improve?: string } | null;
export declare function checkoutDestination(value: unknown, options?: { fixture?: boolean; staging?: boolean }): string | null;
export declare function cloudOrigin(value?: string, fixture?: boolean): string;
export interface CloudAccountStore {
  read(): Promise<unknown>;
  write(value: unknown): Promise<void>;
}
export declare function createCloudAccountStore(options: {
  file: string;
  encryption: {
    available(): boolean | Promise<boolean>;
    encrypt(value: string): Buffer | Promise<Buffer>;
    /** A string, or Electron 43's { shouldReEncrypt, result } (safeStorage.decryptStringAsync). */
    decrypt(value: Buffer): string | { result: string } | Promise<string | { result: string }>;
  };
}): CloudAccountStore;
export interface CloudAccountClient {
  state(): CloudAccountState;
  start(): Promise<CloudAccountState>;
  begin(): Promise<CloudAccountState>;
  /** Only when the sign-in has ended: forget it and start a new one. */
  signInAgain(): Promise<CloudAccountState>;
  reopen(): Promise<CloudAccountState>;
  cancel(): Promise<CloudAccountState>;
  refresh(): Promise<CloudAccountState>;
  signOut(): Promise<CloudAccountState>;
  openDashboard(): Promise<CloudAccountState>;
  offer(): Promise<import("./cloud-home.mjs").CloudOffer | null>;
  checkout(plan: string, source: string): Promise<CloudCheckoutResult>;
  emailStart(email: string): Promise<CloudSignInStart>;
  emailVerify(code: string): Promise<CloudSignInVerify>;
  emailCancel(): void;
  reopenCheckout(plan?: string, source?: string): Promise<CloudCheckoutResult>;
  /** Main only (the clipboard): the kept checkout page, or null. */
  checkoutLink(): string | null;
  /** The Cloud this checkout bought was opened, announced or shown ready. */
  checkoutDone(): void;
  /** Waiting on a checkout this app opened (the first 30 minutes). */
  checkoutPending(): boolean;
  interest(kind: "another_cloud"): Promise<void>;
  /** POST /api/cloud/desktop/upgrade/preview; keeps the confirmation in main. */
  upgradePreview(plan: string, source: string): Promise<CloudUpgradePreviewResult>;
  /** POST /api/cloud/desktop/upgrade with this app's own preview's confirmation, or nothing is asked. */
  upgrade(plan: string, source: string): Promise<CloudUpgradeResult>;
  /** POST /api/cloud/desktop/feedback when the survey says anything (never in the cancel's way), then POST
   * /api/cloud/desktop/clouds/<the session's own Cloud>/cancel. */
  cancelPlan(survey: unknown): Promise<CloudRenewalResult>;
  /** POST /api/cloud/desktop/clouds/<the session's own Cloud>/keep. */
  keepPlan(): Promise<CloudRenewalResult>;
  /** POST /api/cloud/desktop/room: Not now on the room card for the session's own Cloud; false when it couldn't be said. */
  roomNotNow(id: string): Promise<boolean>;
  /** POST /api/cloud/desktop/resize-now: the bigger size after an upgrade goes at once. */
  restartNow(): Promise<"restarting" | "current" | "failed">;
  homeTarget(): { origin: string } | null;
  /** The Admin's last word on a Cloud whose plan sleeps; null for any other. */
  power(): import("./cloud-power.mjs").CloudPower | null;
  /** Asks the Admin to start a sleeping Cloud (POST /api/cloud/desktop/wake), then reads the session again. */
  wakeHome(): Promise<"awake" | "waking" | null>;
  setWaking(on: boolean): void;
  /** My Cloud's one-time code, or (`cloudId`) another Cloud of the person's own that the verified session lists, its
   * grant for that Cloud's own address only. Rejects with `gone: true` once that Cloud is no longer theirs. */
  pairHome(cloudId?: string | null): Promise<import("./cloud-home.mjs").CloudHomeGrant>;
  /** `origin` is a Cloud the person owns (My Cloud or another of theirs), by the verified session only. */
  isOwnCloud(origin: string | null | undefined): boolean;
  /** Buys another Cloud (POST /api/cloud/desktop/clouds): its checkout opens in the browser. */
  /** `source`: where the checkout started (CHECKOUT_SOURCES), for the Admin's funnel. */
  addCloud(input: { tier: string; interval?: "month" | "year"; name: string; color?: import("./cloud-list.mjs").CloudSwatch | null; source?: string | null }): Promise<CloudAddResult>;
  /** A new organization on the Team plan this account pays for (POST /api/cloud/desktop/organizations): no checkout. */
  addOrganization(input: { name: string; color?: import("./cloud-list.mjs").CloudSwatch | null }): Promise<OrganizationAddResult>;
  /** A Cloud's colour on the Admin (PATCH /api/cloud/desktop/clouds/:id), for its owner or its team's Super admin and Admins. */
  setCloudColor(cloudId: string, color: import("./cloud-list.mjs").CloudSwatch | null): Promise<{ outcome: "saved" | "refused" | "unsupported" | "failed" }>;
  /** Remove from list: one of the person's own Clouds the session says is `removable` leaves their list on the Admin. */
  hideCloud(cloudId: string): Promise<{ outcome: CloudRemoveOutcome }>;
  /** That checkout's page again (never a new one); false when none is kept. */
  reopenAdd(): Promise<boolean>;
  /** Main only (the clipboard): that checkout's page, or null. */
  addLink(): string | null;
  /** The Cloud being bought was opened or announced: that purchase is over. */
  addDone(): void;
  /** A one-time code for a team's Cloud, signed by the Admin with this person's membership (POST
   * /api/cloud/desktop/teams/<id>/pairing). Rejects with `gone: true` once they are no longer in the team. */
  pairTeam(teamId: string): Promise<import("./cloud-home.mjs").CloudHomeGrant>;
  /** A Cloud that ended and that the Admin still holds, started for its owner's export only. */
  exportHome(options?: { installation?: string }): Promise<{ starting: true } | { notHeld: true } | { deleted: true } | { grant: import("./cloud-home.mjs").CloudHomeGrant }>;
  /** Tells the Admin that this computer's move to My Cloud is done (POST /api/cloud/desktop/moved); false when it can't take it yet. */
  reportMove(options: { installation: string }): Promise<boolean>;
  /** This computer keeps its bots on itself again: it no longer counts as moved. False when the Admin can't take it yet. */
  reportKept(options: { installation: string }): Promise<boolean>;
  /** The Admin's word on this account's own Cloud at `origin` (POST /api/cloud/desktop/moved-to): deleted, ended (stopped and
   * kept only until it is deleted), live, or unknown (none of this account's). Null without a verified sign-in, or from an
   * Admin that doesn't say. */
  movedTo(origin: string): Promise<"deleted" | "ended" | "live" | "unknown" | null>;
  /** Tells the Admin where this computer's move to My Cloud stands (POST /api/cloud/desktop/move-status); false without a
   * sign-in or when the Admin doesn't take it yet. */
  reportMoveStatus(report: import("./move-status.mjs").MoveStatusReport): Promise<boolean>;
  growDisk(sizeGb: number): Promise<{ supported: false } | { supported: true; refused: true } | { supported: true; disk: { gb: number; maxGb: number } }>;
  /** This sign-in's own X research relay access while its plan is paid; null without one. */
  xResearchAccess(): Promise<{ url: string; token: string } | null>;
  pagesAccess(): Promise<{ url: string; token: string } | null>;
  /** GET /api/cloud/desktop/updates-consent, as the Admin answers it (updates-consent.mjs parseAccountConsent reads it). */
  updatesConsent(): Promise<unknown>;
  recordUpdatesConsent(status: import("./updates-consent.mjs").UpdatesConsentStatus, textVersion: string): Promise<void>;
  /** No sign-in needed: returns the Admin's receipt for this email-only answer. */
  updatesConsentByEmail(input: { email: string; installId: string; textVersion: string }): Promise<string>;
  withdrawUpdatesConsent(input: { status: "declined" | "withdrawn"; receipt: string }): Promise<void>;
  /** Another account takes over: nothing more is asked or written for this sign-in. */
  quiesce(): void;
  /** Reads the sign-in saved in `store` afresh, keeping nothing of the one before. */
  reload(): Promise<CloudAccountState>;
  /** Ends a sign-in that waits on this device, at the Admin. */
  revokeSaved(record: unknown): Promise<void>;
  close(): void;
}
export declare function createCloudAccountClient(options: {
  store: CloudAccountStore;
  openBrowser(url: string): Promise<unknown>;
  platform: string;
  deviceName: string;
  appVersion?: string;
  origin?: string;
  /** Enables HTTP loopback only for isolated fixtures. Production main never sets it. */
  fixture?: boolean;
  fetch?: typeof fetch;
  now?: () => number;
  onState?: (state: CloudAccountState) => void;
  /** Told once per plan name this app predates. Defaults to console.warn. */
  warn?: (message: string) => void;
  /** Files or lending waits for a sleeping Cloud to wake: the session is read every 15 s. */
  awaitingWake?: () => boolean;
  t?: (key: string, params?: Record<string, string | number>) => string;
}): CloudAccountClient;
export declare function cloudPlanSnapshot(state: CloudAccountState | null | undefined, extra?: { notice?: import("./cloud-home.mjs").CloudTrialState | null }): CloudPlanSnapshot;
/** My Cloud's line under its name in the server menus, or null for none. */
export declare function cloudMenuSublabel(state: CloudAccountState | null | undefined, date: (value: number) => string, t?: (key: string, params?: Record<string, string | number>) => string): string | null;