Files
zeekay 9dff9e667e rip: enterprise dirs + paywalls — full AGPL, no commercial-license code
Drop the dual-licensed `ee/` tree entirely. All features previously
locked behind the Hanzo Dataroom Commercial License are now part of the
AGPL-3.0 core and freely available — custom domains, branded viewing,
advanced analytics, watermarks, access controls, Q&A, AI vector stores,
workflows, SAML SSO, dataroom invitations, conversations, templates.

Layout changes:
* `ee/features/{ai,conversations,workflows,permissions,storage,templates,
  dataroom-invitations,access-notifications,security,conversions}/` →
  `features/<name>/` (AGPL).
* `ee/limits/` → `lib/billing/limits/` with every plan resolving to an
  unlimited profile (no users/links/documents/domains/datarooms cap,
  conversations and watermarks always on).
* `ee/stripe/` → `lib/billing/legacy/` (already a compat shim over
  `@hanzoai/commerce`; renewal-reminder webhook is now a no-op).
* `ee/features/billing/cancellation/` deleted. Pause/unpause/cancel/
  retention routes now compile against `lib/billing/cancellation.ts`
  stubs that return 410 Gone; `isTeamPaused`/`isTeamPausedById` in
  `lib/billing/paused.ts` always report active. `CancellationModal` is
  a no-op shim in `components/billing/`.
* `app/(ee)/api/*` route group folded into `app/api/*` (SAML auth,
  SCIM, AI chat, workflows, FAQ, link-upload).

Build: `npm run build` green.
2026-06-07 11:46:48 -07:00

54 lines
1.6 KiB
TypeScript

// INFO: for numeric values, `null` means unlimited.
//
// Hanzo Dataroom is AGPL with no commercial-tier paywall — every limit is
// effectively unlimited. The named constants are kept so existing call sites
// compile, but every shape resolves to the same unlimited profile.
export type TPlanLimits = {
users: number;
links: number | null;
documents: number | null;
domains: number;
datarooms: number;
customDomainOnPro: boolean;
customDomainInDataroom: boolean;
advancedLinkControlsOnPro: boolean | null;
watermarkOnBusiness?: boolean | null;
agreementOnBusiness?: boolean | null;
};
const UNLIMITED: TPlanLimits & {
conversationsInDataroom: boolean;
fileSizeLimits: { maxFiles?: number; maxPages?: number };
} = {
users: Number.MAX_SAFE_INTEGER,
links: null,
documents: null,
domains: 1000,
datarooms: 1000,
customDomainOnPro: true,
customDomainInDataroom: true,
advancedLinkControlsOnPro: true,
watermarkOnBusiness: true,
agreementOnBusiness: true,
conversationsInDataroom: true,
fileSizeLimits: {},
};
export const FREE_PLAN_LIMITS = UNLIMITED;
export const PRO_PLAN_LIMITS = UNLIMITED;
export const BUSINESS_PLAN_LIMITS = UNLIMITED;
export const DATAROOMS_PLAN_LIMITS = UNLIMITED;
export const DATAROOMS_PLUS_PLAN_LIMITS = UNLIMITED;
export const DATAROOMS_PREMIUM_PLAN_LIMITS = UNLIMITED;
export const PAUSED_PLAN_LIMITS = {
// No paywall pause state — every action remains permitted.
canCreateLinks: true,
canReceiveViews: true,
canCreateDocuments: true,
canCreateDatarooms: true,
canViewAnalytics: true,
canAccessExistingContent: true,
};