mirror of
https://github.com/arsvendg/Stirling-PDF.git
synced 2026-07-14 10:34:06 +02:00
# Description of Changes ## What & why This PR introduces the **Stirling developer portal** — a new control-plane frontend that sits alongside the existing PDF editor — plus the shared design system and workspace structure needed to host both apps in one frontend. The portal is the parent product surface: where users connect sources, compose pipelines, wire agents, and manage usage / billing / infrastructure, with the PDF editor as one capability inside it. This PR lays the **foundation** — workspace reshape, design system, app shell, navigation, and a mock-driven home — rather than wiring real backends (those surfaces are placeholders for follow-up phases). ## What's in this PR **1. Frontend repo reshape (`frontend/src/` → `frontend/editor/`)** The existing editor app moved under `frontend/editor/`, so `editor`, `portal`, and `shared` are siblings in one workspace. All references were updated accordingly: `LICENSE`, `.dockerignore`, `.gitignore`, build/sign shell scripts, the GH language-check script, the Taskfile, and Docker config. **No editor source logic changed — path references only.** **2. New shared design system (`frontend/shared/`)** - **Design tokens** in `tokens.css` as the single runtime source of truth (light/dark, category accents, gradients). `tokens.ts` now holds only the `Tier` type — the old JS palette mirror was removed (nothing consumed it and it had drifted). - ~30 framework-light **components** (Card, Button, Input, Select, Tabs, Modal, Drawer, Toast, MetricCard, StatusBadge, Skeleton, EmptyState, …) with Storybook stories. - **Typed data catalogues**: `endpoints.ts` (10 verticals / 64 endpoints) and `ops.ts`. **3. New developer portal app (`frontend/portal/`)** - App shell: `Header`, `Sidebar`, `AssistantPanel`, search modal, notifications, tier switcher, theme toggle, MSW toggle. - **Tier-aware** home (free / pay-as-you-go / enterprise): KPI strip, 30-day usage chart, onboarding checklist, quick actions, recent activity, region health, product grid, and a curated **"Popular use cases"** teaser. - **Documents** view hosting the full, tab-filterable endpoint catalogue. - Placeholder views for Sources / Pipelines / Agents / Editor / Infrastructure / Usage & Billing / Developer Docs / Settings (follow-up phases). - **MSW-mocked** API layer: `api/*` issues real `fetch`, intercepted by mocks in dev/Storybook; pointing at a real backend is just a matter of not registering MSW. `react-router` URLs; Tier / View / UI contexts. **4. Tooling & guardrails** - ESLint extended to `portal` + `shared`, with **layering-boundary rules**: `shared/` may depend only on third-party packages and itself (no `@app` / `@portal` / `@core` / `@proprietary` / Tauri), so it stays cleanly extractable into a standalone package later. - `dpdm` circular-dependency check now walks editor + portal + shared (the old glob matched only 2 files). - New **devDependencies only** — Storybook (+ a11y/docs/themes addons), MSW. No runtime dependencies added. - New tasks: `frontend:dev:portal`, `frontend:build:portal`. ## Testing done locally - `tsc` for both `portal` and `shared` projects — clean - `eslint --max-warnings=0` across the whole frontend — clean - `dpdm` circular-dependency check — no cycles - Editor builds clean: `vite build editor --mode core` (✓ built, only the pre-existing >500 kB chunk-size advisory) - Editor runs in dev (core mode) with **zero console errors**; portal runs in dev across all three tiers ## Notes for reviewers - The change is overwhelmingly **additive**: `shared/` and `portal/` are brand-new; the existing editor is path-reference changes only. - The portal is intentionally **mock-driven** at this stage — real backends and the remaining views land in follow-up phases. --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [x] I have performed a self-review of my own code - [x] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### Translations (if applicable) - [ ] I ran [`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have run `task check` to verify linters, typechecks, and tests pass - [x] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#7-testing) for more details. --------- Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
1271 lines
36 KiB
TypeScript
1271 lines
36 KiB
TypeScript
/**
|
|
* The Stirling endpoint catalogue.
|
|
*
|
|
* Document types are grouped by vertical (Insurance, Finance, Legal, …).
|
|
* Each entry carries the route path, tier gate, JSON-shape schema, supported
|
|
* regions, and a category accent. The catalogue is the spine the Docs view,
|
|
* the Pipelines composer, and the Document type grid on Home all read from.
|
|
*
|
|
* Ported faithfully from the prototype's DOCUMENT_TYPES. Schema field shapes
|
|
* are kept as the prototype-style "type-or-list-of-type" string for now; a
|
|
* future revision should convert them to Zod schemas so they double as
|
|
* runtime validators.
|
|
*/
|
|
|
|
import type { Tier } from "@shared/tokens/tokens";
|
|
|
|
/** Canonical vertical keys — these map 1:1 to category-accent CSS variables. */
|
|
export type VerticalKey =
|
|
| "insurance"
|
|
| "compliance"
|
|
| "finance"
|
|
| "legal"
|
|
| "healthcare"
|
|
| "government"
|
|
| "operations"
|
|
| "hr"
|
|
| "realestate"
|
|
| "energy";
|
|
|
|
/**
|
|
* Numeric tier requirement on an endpoint.
|
|
* 0 = free
|
|
* 1 = paid (pro / pay-as-you-go and above)
|
|
* 2 = enterprise only
|
|
*
|
|
* Use `isEndpointAvailable(endpoint, currentTier)` for runtime checks rather
|
|
* than comparing numbers directly.
|
|
*/
|
|
export type EndpointTierGate = 0 | 1 | 2;
|
|
|
|
export interface EndpointSchema {
|
|
/**
|
|
* Prototype-style field shape. Strings like "string", "number", "date",
|
|
* "boolean", "string?" (optional), "[string]" (array), or an inline shape
|
|
* "{start, end}". Replace with a Zod schema when wiring up real requests.
|
|
*/
|
|
[field: string]: string;
|
|
}
|
|
|
|
export interface Endpoint {
|
|
/** Display name shown in cards and docs. */
|
|
name: string;
|
|
/** Route path mounted under the Stirling API. */
|
|
endpoint: string;
|
|
/** Numeric tier gate, see {@link EndpointTierGate}. */
|
|
tier: EndpointTierGate;
|
|
/** One-line description used in cards and docs index. */
|
|
desc: string;
|
|
/** Vertical this endpoint belongs to. */
|
|
vertical: VerticalKey;
|
|
/** Region availability list. "+22" tail means "and N more regions". */
|
|
regions: readonly string[];
|
|
/** Endpoint payload shape. */
|
|
schema: EndpointSchema;
|
|
}
|
|
|
|
export interface Vertical {
|
|
key: VerticalKey;
|
|
label: string;
|
|
/** CSS-variable reference for the category accent. */
|
|
color: string;
|
|
endpoints: readonly Endpoint[];
|
|
}
|
|
|
|
/* ──────────────────────────────────────────────────────────────────────── */
|
|
/* Catalogue */
|
|
/* ──────────────────────────────────────────────────────────────────────── */
|
|
|
|
const insurance: readonly Endpoint[] = [
|
|
{
|
|
name: "Certificates of Insurance",
|
|
endpoint: "/v1/coi",
|
|
tier: 1,
|
|
vertical: "insurance",
|
|
desc: "Live compliance dashboard with coverage gaps, renewal alerts, and AI Q&A for policy verification",
|
|
regions: ["US", "UK", "CA", "AU", "+22"],
|
|
schema: {
|
|
holder: "string",
|
|
insurer: "string",
|
|
policy_number: "string",
|
|
coverage_types: "[string]",
|
|
general_aggregate: "number",
|
|
expiry_date: "date",
|
|
additional_insured: "boolean",
|
|
},
|
|
},
|
|
{
|
|
name: "Loss Run Reports",
|
|
endpoint: "/v1/loss-run",
|
|
tier: 1,
|
|
vertical: "insurance",
|
|
desc: "Claims timeline with loss ratio trends, carrier comparisons, and underwriting AI chat",
|
|
regions: ["US", "UK", "CA"],
|
|
schema: {
|
|
carrier: "string",
|
|
policy_period: "string",
|
|
total_claims: "number",
|
|
total_incurred: "number",
|
|
loss_ratio: "number",
|
|
claims: "[{date, type, incurred, status}]",
|
|
},
|
|
},
|
|
{
|
|
name: "ACORD Forms",
|
|
endpoint: "/v1/acord",
|
|
tier: 1,
|
|
vertical: "insurance",
|
|
desc: "Multi-carrier coverage view with ACORD compliance badges and reconciliation actions",
|
|
regions: ["US"],
|
|
schema: {
|
|
form_number: "string",
|
|
producer: "string",
|
|
insured: "string",
|
|
carriers: "[{name, naic, policy}]",
|
|
coverages: "[{type, limit, deductible}]",
|
|
effective_date: "date",
|
|
},
|
|
},
|
|
{
|
|
name: "Declarations Pages",
|
|
endpoint: "/v1/dec-page",
|
|
tier: 1,
|
|
vertical: "insurance",
|
|
desc: "Coverage summary with gap highlights, endorsement changes, and premium calculator",
|
|
regions: ["US", "UK", "CA", "AU"],
|
|
schema: {
|
|
named_insured: "string",
|
|
policy_number: "string",
|
|
effective: "date",
|
|
expiry: "date",
|
|
coverages: "[{type, limit, deductible, premium}]",
|
|
total_premium: "number",
|
|
endorsements: "[string]",
|
|
},
|
|
},
|
|
{
|
|
name: "Explanation of Benefits",
|
|
endpoint: "/v1/eob",
|
|
tier: 1,
|
|
vertical: "insurance",
|
|
desc: "Benefit breakdown with denial codes, patient cost visibility, and billing action buttons",
|
|
regions: ["US"],
|
|
schema: {
|
|
patient: "string",
|
|
provider: "string",
|
|
service_date: "date",
|
|
services: "[{code, description, billed, allowed, paid, patient_resp}]",
|
|
denial_codes: "[string]?",
|
|
total_patient_owed: "number",
|
|
},
|
|
},
|
|
{
|
|
name: "Subrogation Notices",
|
|
endpoint: "/v1/subrogation",
|
|
tier: 1,
|
|
vertical: "insurance",
|
|
desc: "Recovery opportunity tracker with status updates, lien tracking, and settlement AI",
|
|
regions: ["US", "UK"],
|
|
schema: {
|
|
claim_number: "string",
|
|
claimant: "string",
|
|
liable_party: "string",
|
|
loss_date: "date",
|
|
recovery_sought: "number",
|
|
lien_amount: "number?",
|
|
status: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Surety Bonds",
|
|
endpoint: "/v1/surety-bond",
|
|
tier: 1,
|
|
vertical: "insurance",
|
|
desc: "Bond status dashboard showing obligee requirements, renewal dates, and compliance checklist",
|
|
regions: ["US", "UK", "CA", "AU", "+14"],
|
|
schema: {
|
|
bond_number: "string",
|
|
principal: "string",
|
|
obligee: "string",
|
|
surety: "string",
|
|
bond_amount: "number",
|
|
effective_date: "date",
|
|
expiry_date: "date",
|
|
bond_type: "string",
|
|
},
|
|
},
|
|
];
|
|
|
|
const compliance: readonly Endpoint[] = [
|
|
{
|
|
name: "SOC 2 Reports",
|
|
endpoint: "/v1/soc2",
|
|
tier: 1,
|
|
vertical: "compliance",
|
|
desc: "Control assessment view with exception severity ratings, trust criteria status, and remediation notes",
|
|
regions: ["US", "Global"],
|
|
schema: {
|
|
report_type: "string",
|
|
service_org: "string",
|
|
auditor: "string",
|
|
period: "{start, end}",
|
|
opinion: "string",
|
|
exceptions: "[{control, description}]",
|
|
trust_criteria: "[string]",
|
|
},
|
|
},
|
|
{
|
|
name: "Regulatory Filings",
|
|
endpoint: "/v1/regulatory-filing",
|
|
tier: 1,
|
|
vertical: "compliance",
|
|
desc: "Multi-jurisdiction filing calendar with deadline alerts, status tracking, and submission buttons",
|
|
regions: ["US", "UK", "EU", "SG", "HK", "+31"],
|
|
schema: {
|
|
filing_type: "string",
|
|
jurisdiction: "string",
|
|
entity: "string",
|
|
filing_date: "date",
|
|
deadline: "date",
|
|
status: "string",
|
|
reference_number: "string?",
|
|
},
|
|
},
|
|
{
|
|
name: "Consent Orders",
|
|
endpoint: "/v1/consent-order",
|
|
tier: 1,
|
|
vertical: "compliance",
|
|
desc: "Violation timeline with remediation progress bars, deadline countdowns, and compliance history",
|
|
regions: ["US", "UK", "EU"],
|
|
schema: {
|
|
regulatory_body: "string",
|
|
respondent: "string",
|
|
order_date: "date",
|
|
violations: "[{statute, description}]",
|
|
penalties: "number",
|
|
remediation: "[string]",
|
|
compliance_deadline: "date",
|
|
},
|
|
},
|
|
{
|
|
name: "GDPR Processing Agreements",
|
|
endpoint: "/v1/dpa",
|
|
tier: 1,
|
|
vertical: "compliance",
|
|
desc: "Data processing overview with transfer mechanism validation, sub-processor registry, and approval flow",
|
|
regions: ["EU", "UK", "CH", "Global"],
|
|
schema: {
|
|
controller: "string",
|
|
processor: "string",
|
|
data_categories: "[string]",
|
|
purposes: "[string]",
|
|
sub_processors: "[{name, location}]",
|
|
transfer_mechanism: "string",
|
|
retention_period: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Sanctions Screening Results",
|
|
endpoint: "/v1/sanctions-screen",
|
|
tier: 1,
|
|
vertical: "compliance",
|
|
desc: "Real-time screening results with match confidence scores and one-click disposition",
|
|
regions: ["US", "UK", "EU", "Global"],
|
|
schema: {
|
|
screened_entity: "string",
|
|
lists_checked: "[string]",
|
|
matches: "[{list, name, score, type}]",
|
|
overall_risk: "string",
|
|
disposition: "string",
|
|
screened_date: "date",
|
|
},
|
|
},
|
|
{
|
|
name: "ISO Audit Reports",
|
|
endpoint: "/v1/iso-audit",
|
|
tier: 1,
|
|
vertical: "compliance",
|
|
desc: "Audit findings organized by severity with remediation timelines and compliance tracking",
|
|
regions: ["Global"],
|
|
schema: {
|
|
standard: "string",
|
|
audit_type: "string",
|
|
auditor: "string",
|
|
organization: "string",
|
|
nonconformities: "[{clause, severity, finding}]",
|
|
observations: "[string]",
|
|
recommendation: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Incident Reports",
|
|
endpoint: "/v1/incident-report",
|
|
tier: 1,
|
|
vertical: "compliance",
|
|
desc: "Incident severity dashboard with root cause analysis, remediation tracking, and escalation status",
|
|
regions: ["Global"],
|
|
schema: {
|
|
incident_id: "string",
|
|
date: "date",
|
|
severity: "string",
|
|
category: "string",
|
|
description: "string",
|
|
root_cause: "string?",
|
|
remediation: "string?",
|
|
reported_by: "string",
|
|
},
|
|
},
|
|
];
|
|
|
|
const finance: readonly Endpoint[] = [
|
|
{
|
|
name: "Letters of Credit",
|
|
endpoint: "/v1/loc",
|
|
tier: 1,
|
|
vertical: "finance",
|
|
desc: "LC tracker with condition verification, expiry alerts, and cash call risk assessment",
|
|
regions: ["US", "UK", "HK", "SG", "+34"],
|
|
schema: {
|
|
lc_number: "string",
|
|
issuing_bank: "string",
|
|
applicant: "string",
|
|
beneficiary: "string",
|
|
amount: "number",
|
|
currency: "string",
|
|
conditions: "[string]",
|
|
expiry_date: "date",
|
|
type: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Trade Confirmations",
|
|
endpoint: "/v1/trade-confirm",
|
|
tier: 1,
|
|
vertical: "finance",
|
|
desc: "Trade confirmation with counterparty validation, settlement date verification, and matching status",
|
|
regions: ["US", "UK", "EU", "HK", "JP", "+18"],
|
|
schema: {
|
|
trade_date: "date",
|
|
settlement_date: "date",
|
|
security: "string",
|
|
identifier: "string",
|
|
quantity: "number",
|
|
price: "number",
|
|
counterparty: "string",
|
|
account: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Fund Prospectuses",
|
|
endpoint: "/v1/prospectus",
|
|
tier: 1,
|
|
vertical: "finance",
|
|
desc: "Fund profile with fee breakdown, risk level compliance checks, and mandate alignment flags",
|
|
regions: ["US", "UK", "EU", "LU", "+12"],
|
|
schema: {
|
|
fund_name: "string",
|
|
fund_type: "string",
|
|
objective: "string",
|
|
expense_ratio: "number",
|
|
risk_level: "string",
|
|
min_investment: "number",
|
|
performance: "[{period, return}]",
|
|
manager: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "K-1 Schedules",
|
|
endpoint: "/v1/k1",
|
|
tier: 1,
|
|
vertical: "finance",
|
|
desc: "Partnership income view with equity reconciliation, distribution tracking, and tax line mapping",
|
|
regions: ["US"],
|
|
schema: {
|
|
partnership: "string",
|
|
partner: "string",
|
|
tax_year: "number",
|
|
ordinary_income: "number",
|
|
rental_income: "number?",
|
|
interest_income: "number?",
|
|
capital_gains: "number?",
|
|
distributions: "number",
|
|
capital_account: "number",
|
|
},
|
|
},
|
|
{
|
|
name: "10-K / Annual Reports",
|
|
endpoint: "/v1/10k",
|
|
tier: 1,
|
|
vertical: "finance",
|
|
desc: "Financial summary with risk factor highlights, year-over-year comparisons, and segment performance",
|
|
regions: ["US", "UK", "EU", "JP", "+8"],
|
|
schema: {
|
|
entity: "string",
|
|
fiscal_year: "number",
|
|
revenue: "number",
|
|
net_income: "number",
|
|
total_assets: "number",
|
|
risk_factors: "[string]",
|
|
segments: "[{name, revenue}]",
|
|
auditor: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Bank Statements",
|
|
endpoint: "/v1/bank-statement",
|
|
tier: 1,
|
|
vertical: "finance",
|
|
desc: "Transaction timeline with anomaly detection, balance reconciliation, and cash flow insights",
|
|
regions: ["US", "UK", "EU", "CA", "AU", "+41"],
|
|
schema: {
|
|
institution: "string",
|
|
account_last_4: "string",
|
|
period: "{start, end}",
|
|
opening_balance: "number",
|
|
closing_balance: "number",
|
|
transactions: "[{date, desc, amount, balance}]",
|
|
},
|
|
},
|
|
{
|
|
name: "Invoices",
|
|
endpoint: "/v1/invoice",
|
|
tier: 1,
|
|
vertical: "finance",
|
|
desc: "Three-way match status, approval actions, and AI chat for line-item disputes",
|
|
regions: ["US", "UK", "EU", "DE", "JP", "BR", "+52"],
|
|
schema: {
|
|
vendor_name: "string",
|
|
invoice_number: "string",
|
|
date: "date",
|
|
line_items: "[{desc, qty, unit_price, total}]",
|
|
subtotal: "number",
|
|
tax: "number",
|
|
total: "number",
|
|
payment_terms: "string",
|
|
},
|
|
},
|
|
];
|
|
|
|
const legal: readonly Endpoint[] = [
|
|
{
|
|
name: "Contracts",
|
|
endpoint: "/v1/contract",
|
|
tier: 1,
|
|
vertical: "legal",
|
|
desc: "Clause-by-clause risk highlights, renewal countdown, and negotiation AI",
|
|
regions: ["Global"],
|
|
schema: {
|
|
parties: "[{name, role}]",
|
|
effective_date: "date",
|
|
term_months: "number",
|
|
renewal: "string",
|
|
governing_law: "string",
|
|
signature_status: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Court Filings",
|
|
endpoint: "/v1/court-filing",
|
|
tier: 1,
|
|
vertical: "legal",
|
|
desc: "Docket event timeline with deadline alerts, motion status, and counsel response tracking",
|
|
regions: ["US", "UK", "CA", "AU", "+16"],
|
|
schema: {
|
|
case_number: "string",
|
|
court: "string",
|
|
parties: "[{name, role}]",
|
|
filing_date: "date",
|
|
document_class: "string",
|
|
docket_entries: "[{date, description}]",
|
|
},
|
|
},
|
|
{
|
|
name: "Corporate Formation Docs",
|
|
endpoint: "/v1/corp-formation",
|
|
tier: 1,
|
|
vertical: "legal",
|
|
desc: "Entity status dashboard with good standing checks, officer compliance, and filing tracker",
|
|
regions: ["US", "UK", "DE", "SG", "HK", "+28"],
|
|
schema: {
|
|
entity_name: "string",
|
|
entity_type: "string",
|
|
jurisdiction: "string",
|
|
formation_date: "date",
|
|
officers: "[{name, title}]",
|
|
registered_agent: "string",
|
|
authorized_shares: "number?",
|
|
},
|
|
},
|
|
{
|
|
name: "UCC Filings",
|
|
endpoint: "/v1/ucc",
|
|
tier: 1,
|
|
vertical: "legal",
|
|
desc: "UCC status view with lapse countdown, priority verification, and collateral tracking",
|
|
regions: ["US"],
|
|
schema: {
|
|
filing_number: "string",
|
|
filing_date: "date",
|
|
secured_party: "string",
|
|
debtor: "string",
|
|
collateral: "string",
|
|
filing_office: "string",
|
|
status: "string",
|
|
lapse_date: "date",
|
|
},
|
|
},
|
|
{
|
|
name: "Powers of Attorney",
|
|
endpoint: "/v1/poa",
|
|
tier: 1,
|
|
vertical: "legal",
|
|
desc: "Agent authority scope with durable status verification, witness records, and action permissions",
|
|
regions: ["US", "UK", "EU", "Global"],
|
|
schema: {
|
|
principal: "string",
|
|
agent: "string",
|
|
scope: "[string]",
|
|
effective_date: "date",
|
|
durable: "boolean",
|
|
expiry_date: "date?",
|
|
witnesses: "[string]",
|
|
},
|
|
},
|
|
{
|
|
name: "Patent Applications",
|
|
endpoint: "/v1/patent",
|
|
tier: 1,
|
|
vertical: "legal",
|
|
desc: "Patent prosecution timeline with office action tracking, fee deadlines, and claim status",
|
|
regions: ["US", "EU", "JP", "CN", "KR", "+8"],
|
|
schema: {
|
|
application_number: "string",
|
|
title: "string",
|
|
inventors: "[string]",
|
|
assignee: "string",
|
|
priority_date: "date",
|
|
classifications: "[string]",
|
|
claims_count: "number",
|
|
status: "string",
|
|
},
|
|
},
|
|
];
|
|
|
|
const healthcare: readonly Endpoint[] = [
|
|
{
|
|
name: "Prior Authorizations",
|
|
endpoint: "/v1/prior-auth",
|
|
tier: 1,
|
|
vertical: "healthcare",
|
|
desc: "Decision tracking, medical necessity AI, and automatic payer follow-up notifications",
|
|
regions: ["US"],
|
|
schema: {
|
|
patient_id: "string",
|
|
provider_npi: "string",
|
|
payer: "string",
|
|
procedure_codes: "[string]",
|
|
diagnosis_codes: "[string]",
|
|
medical_necessity: "string",
|
|
decision: "string",
|
|
auth_number: "string?",
|
|
},
|
|
},
|
|
{
|
|
name: "Discharge Summaries",
|
|
endpoint: "/v1/discharge",
|
|
tier: 1,
|
|
vertical: "healthcare",
|
|
desc: "Discharge plan with follow-up order checklist, medication list, and continuity of care actions",
|
|
regions: ["US", "UK", "CA", "AU"],
|
|
schema: {
|
|
patient_id: "string",
|
|
admission_date: "date",
|
|
discharge_date: "date",
|
|
diagnoses: "[{code, description}]",
|
|
procedures: "[string]",
|
|
medications: "[{name, dose, frequency}]",
|
|
follow_up: "[string]",
|
|
},
|
|
},
|
|
{
|
|
name: "Clinical Trial Documents",
|
|
endpoint: "/v1/clinical-trial",
|
|
tier: 1,
|
|
vertical: "healthcare",
|
|
desc: "Trial progress view with enrollment metrics, site performance, and endpoint tracking",
|
|
regions: ["US", "EU", "UK", "JP", "+12"],
|
|
schema: {
|
|
trial_id: "string",
|
|
phase: "string",
|
|
sponsor: "string",
|
|
indication: "string",
|
|
primary_endpoint: "string",
|
|
enrollment: "number",
|
|
sites: "number",
|
|
status: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "FDA Submissions",
|
|
endpoint: "/v1/fda-submission",
|
|
tier: 1,
|
|
vertical: "healthcare",
|
|
desc: "Submission status timeline with decision tracking, reviewer feedback, and compliance alerts",
|
|
regions: ["US"],
|
|
schema: {
|
|
submission_type: "string",
|
|
submission_number: "string",
|
|
applicant: "string",
|
|
product_name: "string",
|
|
classification: "string",
|
|
predicate_device: "string?",
|
|
decision: "string",
|
|
decision_date: "date?",
|
|
},
|
|
},
|
|
{
|
|
name: "Pathology Reports",
|
|
endpoint: "/v1/pathology",
|
|
tier: 1,
|
|
vertical: "healthcare",
|
|
desc: "Pathology summary with diagnostic alerts, biomarker results, and tumor board routing",
|
|
regions: ["US", "UK", "EU", "Global"],
|
|
schema: {
|
|
patient_id: "string",
|
|
specimen_type: "string",
|
|
diagnosis: "string",
|
|
staging: "string?",
|
|
margins: "string",
|
|
biomarkers: "[{marker, result}]",
|
|
pathologist: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Patient Intake Forms",
|
|
endpoint: "/v1/patient-intake",
|
|
tier: 1,
|
|
vertical: "healthcare",
|
|
desc: "Patient profile with allergy alerts, medication conflict detection, and insurance verification",
|
|
regions: ["US", "UK", "CA", "AU", "+18"],
|
|
schema: {
|
|
patient_name: "string",
|
|
dob: "date",
|
|
insurance_provider: "string",
|
|
policy_number: "string",
|
|
allergies: "[string]",
|
|
medications: "[string]",
|
|
chief_complaint: "string",
|
|
},
|
|
},
|
|
];
|
|
|
|
const government: readonly Endpoint[] = [
|
|
{
|
|
name: "Tax Forms",
|
|
endpoint: "/v1/tax-form",
|
|
tier: 1,
|
|
vertical: "government",
|
|
desc: "Tax liability view with filing deadline alerts, jurisdiction tracker, and e-file actions",
|
|
regions: ["US", "UK", "DE", "FR", "BR", "JP", "IN", "+43"],
|
|
schema: {
|
|
form_type: "string",
|
|
jurisdiction: "string",
|
|
tax_year: "number",
|
|
entity: "string",
|
|
gross_income: "number",
|
|
tax_withheld: "number",
|
|
filing_status: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Permits & Licenses",
|
|
endpoint: "/v1/permit",
|
|
tier: 1,
|
|
vertical: "government",
|
|
desc: "Permit dashboard showing status, conditions, renewal dates, and compliance checklist",
|
|
regions: ["US", "UK", "EU", "CA", "AU", "+32"],
|
|
schema: {
|
|
permit_type: "string",
|
|
permit_number: "string",
|
|
issuing_authority: "string",
|
|
holder: "string",
|
|
issue_date: "date",
|
|
expiry_date: "date",
|
|
conditions: "[string]",
|
|
status: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Grant Applications",
|
|
endpoint: "/v1/grant",
|
|
tier: 1,
|
|
vertical: "government",
|
|
desc: "Grant status with approval workflow, funding milestones, and compliance audit tracking",
|
|
regions: ["US", "UK", "EU"],
|
|
schema: {
|
|
applicant: "string",
|
|
program: "string",
|
|
amount_requested: "number",
|
|
project_title: "string",
|
|
period: "{start, end}",
|
|
budget_categories: "[{category, amount}]",
|
|
status: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "FOIA Responses",
|
|
endpoint: "/v1/foia",
|
|
tier: 1,
|
|
vertical: "government",
|
|
desc: "Request status with exemption review, redaction tracker, and disclosure timeline",
|
|
regions: ["US", "UK", "CA", "AU"],
|
|
schema: {
|
|
request_number: "string",
|
|
agency: "string",
|
|
requester: "string",
|
|
responsive_pages: "number",
|
|
redacted_pages: "number",
|
|
exemptions_cited: "[string]",
|
|
disposition: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Municipal Filings",
|
|
endpoint: "/v1/municipal-filing",
|
|
tier: 1,
|
|
vertical: "government",
|
|
desc: "Filing timeline with hearing date alerts, public comment deadline, and status updates",
|
|
regions: ["US", "UK", "CA", "+18"],
|
|
schema: {
|
|
filing_type: "string",
|
|
municipality: "string",
|
|
applicant: "string",
|
|
property_address: "string?",
|
|
date: "date",
|
|
status: "string",
|
|
hearing_date: "date?",
|
|
},
|
|
},
|
|
{
|
|
name: "Customs Declarations",
|
|
endpoint: "/v1/customs",
|
|
tier: 1,
|
|
vertical: "government",
|
|
desc: "Customs entry view with HS code mapping, duty calculation, and tariff classification AI",
|
|
regions: ["US", "UK", "EU", "CN", "JP", "SG", "+48"],
|
|
schema: {
|
|
entry_number: "string",
|
|
importer: "string",
|
|
country_origin: "string",
|
|
items: "[{hs_code, description, value, duty}]",
|
|
total_value: "number",
|
|
total_duty: "number",
|
|
port: "string",
|
|
},
|
|
},
|
|
];
|
|
|
|
const operations: readonly Endpoint[] = [
|
|
{
|
|
name: "Bills of Lading",
|
|
endpoint: "/v1/bol",
|
|
tier: 1,
|
|
vertical: "operations",
|
|
desc: "Shipping document view with incoterm validation, port tracking, and cargo checklist",
|
|
regions: ["Global"],
|
|
schema: {
|
|
bol_number: "string",
|
|
shipper: "string",
|
|
consignee: "string",
|
|
carrier: "string",
|
|
vessel: "string?",
|
|
port_loading: "string",
|
|
port_discharge: "string",
|
|
goods: "[{description, weight, packages}]",
|
|
},
|
|
},
|
|
{
|
|
name: "Certificates of Origin",
|
|
endpoint: "/v1/cert-origin",
|
|
tier: 1,
|
|
vertical: "operations",
|
|
desc: "Certificate details with tariff eligibility verification, rules of origin check, and compliance badges",
|
|
regions: ["US", "EU", "UK", "MX", "CA", "+38"],
|
|
schema: {
|
|
certificate_number: "string",
|
|
exporter: "string",
|
|
importer: "string",
|
|
country_origin: "string",
|
|
goods: "[{description, hs_code, value}]",
|
|
trade_agreement: "string?",
|
|
issued_by: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Warehouse Receipts",
|
|
endpoint: "/v1/warehouse-receipt",
|
|
tier: 1,
|
|
vertical: "operations",
|
|
desc: "Warehouse inventory view with lien holder tracking, withdrawal requests, and storage timeline",
|
|
regions: ["US", "UK", "EU", "+22"],
|
|
schema: {
|
|
receipt_number: "string",
|
|
warehouse: "string",
|
|
depositor: "string",
|
|
goods: "[{description, quantity, unit}]",
|
|
storage_date: "date",
|
|
location: "string",
|
|
lien_status: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Inspection Reports",
|
|
endpoint: "/v1/inspection",
|
|
tier: 1,
|
|
vertical: "operations",
|
|
desc: "Inspection findings with remediation actions, re-audit scheduling, and compliance status",
|
|
regions: ["Global"],
|
|
schema: {
|
|
inspector: "string",
|
|
date: "date",
|
|
location: "string",
|
|
findings: "[{item, status, note}]",
|
|
overall_status: "string",
|
|
next_inspection: "date?",
|
|
},
|
|
},
|
|
{
|
|
name: "Purchase Orders",
|
|
endpoint: "/v1/purchase-order",
|
|
tier: 1,
|
|
vertical: "operations",
|
|
desc: "PO status with approval workflow, invoice matching, and delivery tracking buttons",
|
|
regions: ["Global"],
|
|
schema: {
|
|
po_number: "string",
|
|
vendor: "string",
|
|
date: "date",
|
|
line_items: "[{desc, qty, unit_price, total}]",
|
|
total: "number",
|
|
delivery_terms: "string",
|
|
approved_by: "string?",
|
|
},
|
|
},
|
|
{
|
|
name: "Packing Lists",
|
|
endpoint: "/v1/packing-list",
|
|
tier: 1,
|
|
vertical: "operations",
|
|
desc: "Shipment manifest with PO reconciliation, receiving report actions, and discrepancy alerts",
|
|
regions: ["Global"],
|
|
schema: {
|
|
shipment_id: "string",
|
|
shipper: "string",
|
|
packages: "[{package_id, contents, weight, dimensions}]",
|
|
total_packages: "number",
|
|
total_weight: "string",
|
|
po_reference: "string?",
|
|
},
|
|
},
|
|
];
|
|
|
|
const hr: readonly Endpoint[] = [
|
|
{
|
|
name: "I-9 / Right to Work",
|
|
endpoint: "/v1/i9",
|
|
tier: 1,
|
|
vertical: "hr",
|
|
desc: "Verification status with document validity tracking, expiry alerts, and re-verification scheduler",
|
|
regions: ["US", "UK", "EU", "AU", "CA"],
|
|
schema: {
|
|
employee_name: "string",
|
|
document_type: "string",
|
|
document_number: "string",
|
|
expiration_date: "date?",
|
|
issuing_authority: "string",
|
|
verified: "boolean",
|
|
},
|
|
},
|
|
{
|
|
name: "Employment Verification Letters",
|
|
endpoint: "/v1/employment-verification",
|
|
tier: 1,
|
|
vertical: "hr",
|
|
desc: "Employment history view with title verification, salary details, and underwriting status",
|
|
regions: ["US", "UK", "CA", "AU", "+14"],
|
|
schema: {
|
|
employer: "string",
|
|
employee: "string",
|
|
start_date: "date",
|
|
end_date: "date?",
|
|
title: "string",
|
|
salary: "number?",
|
|
employment_status: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Workers Comp Claims",
|
|
endpoint: "/v1/workers-comp",
|
|
tier: 1,
|
|
vertical: "hr",
|
|
desc: "Claim status with injury timeline, return-to-work plan, and case management actions",
|
|
regions: ["US", "UK", "CA", "AU"],
|
|
schema: {
|
|
claim_number: "string",
|
|
employee: "string",
|
|
injury_date: "date",
|
|
injury_type: "string",
|
|
body_part: "string",
|
|
provider: "string",
|
|
lost_days: "number",
|
|
claim_status: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Benefits Enrollment",
|
|
endpoint: "/v1/benefits-enrollment",
|
|
tier: 1,
|
|
vertical: "hr",
|
|
desc: "Enrollment status with dependent tracking, plan comparison, and open enrollment countdown",
|
|
regions: ["US", "UK", "CA"],
|
|
schema: {
|
|
employee: "string",
|
|
plan_type: "string",
|
|
coverage_tier: "string",
|
|
dependents: "[{name, relationship}]",
|
|
effective_date: "date",
|
|
employee_contribution: "number",
|
|
},
|
|
},
|
|
{
|
|
name: "Separation Agreements",
|
|
endpoint: "/v1/separation",
|
|
tier: 1,
|
|
vertical: "hr",
|
|
desc: "Separation terms dashboard with non-compete tracking, severance payment status, and sign-off",
|
|
regions: ["US", "UK", "EU", "Global"],
|
|
schema: {
|
|
employee: "string",
|
|
employer: "string",
|
|
separation_date: "date",
|
|
severance_amount: "number",
|
|
non_compete_months: "number?",
|
|
release_scope: "string",
|
|
consideration_period_days: "number",
|
|
},
|
|
},
|
|
{
|
|
name: "Resumes / CVs",
|
|
endpoint: "/v1/resume",
|
|
tier: 1,
|
|
vertical: "hr",
|
|
desc: "Candidate profile with skill matching, experience summary, and hiring endpoint status",
|
|
regions: ["Global"],
|
|
schema: {
|
|
name: "string",
|
|
email: "string",
|
|
phone: "string?",
|
|
experience: "[{company, title, start, end}]",
|
|
education: "[{school, degree, year}]",
|
|
skills: "[string]",
|
|
},
|
|
},
|
|
];
|
|
|
|
const realestate: readonly Endpoint[] = [
|
|
{
|
|
name: "Title Reports",
|
|
endpoint: "/v1/title-report",
|
|
tier: 1,
|
|
vertical: "realestate",
|
|
desc: "Title status with defect highlights, lien tracker, and insurance coverage verification",
|
|
regions: ["US", "UK", "CA", "AU"],
|
|
schema: {
|
|
property_address: "string",
|
|
owner: "string",
|
|
legal_description: "string",
|
|
liens: "[{type, holder, amount}]",
|
|
easements: "[string]",
|
|
exceptions: "[string]",
|
|
effective_date: "date",
|
|
},
|
|
},
|
|
{
|
|
name: "Appraisals",
|
|
endpoint: "/v1/appraisal",
|
|
tier: 1,
|
|
vertical: "realestate",
|
|
desc: "Property valuation with comparable analysis, condition assessment, and underwriting routing",
|
|
regions: ["US", "UK", "CA", "AU", "+8"],
|
|
schema: {
|
|
property_address: "string",
|
|
appraised_value: "number",
|
|
approach: "string",
|
|
comparables: "[{address, sale_price, adjustments}]",
|
|
condition: "string",
|
|
appraiser: "string",
|
|
date: "date",
|
|
},
|
|
},
|
|
{
|
|
name: "Environmental Assessments",
|
|
endpoint: "/v1/environmental",
|
|
tier: 1,
|
|
vertical: "realestate",
|
|
desc: "Phase assessment with liability findings, remediation recommendations, and insurance buttons",
|
|
regions: ["US", "UK", "EU", "CA"],
|
|
schema: {
|
|
property_address: "string",
|
|
phase: "string",
|
|
findings: "[{condition, severity, description}]",
|
|
recs: "[{condition, severity}]",
|
|
consultant: "string",
|
|
date: "date",
|
|
clean: "boolean",
|
|
},
|
|
},
|
|
{
|
|
name: "Lease Abstracts",
|
|
endpoint: "/v1/lease-abstract",
|
|
tier: 1,
|
|
vertical: "realestate",
|
|
desc: "Lease timeline with expiration alerts, renewal option tracking, and rent escalation calculator",
|
|
regions: ["US", "UK", "EU", "AU", "+12"],
|
|
schema: {
|
|
tenant: "string",
|
|
landlord: "string",
|
|
premises: "string",
|
|
commencement: "date",
|
|
expiry: "date",
|
|
base_rent: "number",
|
|
escalation: "string",
|
|
renewal_options: "[{term, notice_period}]",
|
|
},
|
|
},
|
|
{
|
|
name: "Closing Disclosures",
|
|
endpoint: "/v1/closing-disclosure",
|
|
tier: 1,
|
|
vertical: "realestate",
|
|
desc: "Closing costs view with TRID compliance check, fee comparison, and settlement team routing",
|
|
regions: ["US"],
|
|
schema: {
|
|
borrower: "string",
|
|
property: "string",
|
|
loan_amount: "number",
|
|
interest_rate: "number",
|
|
monthly_payment: "number",
|
|
closing_costs: "number",
|
|
cash_to_close: "number",
|
|
closing_date: "date",
|
|
},
|
|
},
|
|
{
|
|
name: "Zoning Documents",
|
|
endpoint: "/v1/zoning",
|
|
tier: 1,
|
|
vertical: "realestate",
|
|
desc: "Zoning summary with use restrictions, setback requirements, and variance application buttons",
|
|
regions: ["US", "UK", "CA"],
|
|
schema: {
|
|
property_address: "string",
|
|
zone_class: "string",
|
|
permitted_uses: "[string]",
|
|
setbacks: "{front, side, rear}",
|
|
far: "number",
|
|
max_height: "string",
|
|
variances: "[string]?",
|
|
},
|
|
},
|
|
];
|
|
|
|
const energy: readonly Endpoint[] = [
|
|
{
|
|
name: "Environmental Impact Statements",
|
|
endpoint: "/v1/eis",
|
|
tier: 1,
|
|
vertical: "energy",
|
|
desc: "Impact assessment with alternatives comparison, mitigation tracking, and public comment dashboard",
|
|
regions: ["US", "UK", "EU", "CA", "AU", "+14"],
|
|
schema: {
|
|
project: "string",
|
|
lead_agency: "string",
|
|
alternatives: "[{name, description}]",
|
|
impacts: "[{resource, severity, mitigation}]",
|
|
public_comments: "number",
|
|
record_of_decision: "string?",
|
|
},
|
|
},
|
|
{
|
|
name: "Pipeline Permits",
|
|
endpoint: "/v1/pipeline-permit",
|
|
tier: 1,
|
|
vertical: "energy",
|
|
desc: "Permit status with compliance conditions, route visualization, and segment monitoring tools",
|
|
regions: ["US", "UK", "CA", "AU"],
|
|
schema: {
|
|
permit_number: "string",
|
|
operator: "string",
|
|
route: "string",
|
|
capacity: "string",
|
|
material: "string",
|
|
length_miles: "number",
|
|
conditions: "[string]",
|
|
expiry_date: "date",
|
|
},
|
|
},
|
|
{
|
|
name: "NERC Compliance",
|
|
endpoint: "/v1/nerc",
|
|
tier: 1,
|
|
vertical: "energy",
|
|
desc: "Violation dashboard organized by severity, remediation plan tracking, and completion status",
|
|
regions: ["US", "CA"],
|
|
schema: {
|
|
entity: "string",
|
|
standard: "string",
|
|
finding: "string",
|
|
severity: "string",
|
|
violation_date: "date",
|
|
mitigation_plan: "string",
|
|
completion_date: "date?",
|
|
},
|
|
},
|
|
{
|
|
name: "Interconnection Agreements",
|
|
endpoint: "/v1/interconnection",
|
|
tier: 1,
|
|
vertical: "energy",
|
|
desc: "Generator connection agreement with network upgrade checklist and commercial operation date tracker",
|
|
regions: ["US", "UK", "EU", "AU"],
|
|
schema: {
|
|
generator: "string",
|
|
utility: "string",
|
|
capacity_mw: "number",
|
|
poi: "string",
|
|
voltage: "string",
|
|
commercial_operation_date: "date",
|
|
term_years: "number",
|
|
network_upgrades: "[string]",
|
|
},
|
|
},
|
|
{
|
|
name: "Well Logs",
|
|
endpoint: "/v1/well-log",
|
|
tier: 1,
|
|
vertical: "energy",
|
|
desc: "Well section with formation breakdown, depth tracking, and development planning actions",
|
|
regions: ["US", "CA", "UK", "AU", "+12"],
|
|
schema: {
|
|
well_name: "string",
|
|
api_number: "string",
|
|
operator: "string",
|
|
spud_date: "date",
|
|
total_depth: "number",
|
|
formations: "[{name, top, bottom, lithology}]",
|
|
status: "string",
|
|
},
|
|
},
|
|
{
|
|
name: "Decommissioning Reports",
|
|
endpoint: "/v1/decommissioning",
|
|
tier: 1,
|
|
vertical: "energy",
|
|
desc: "Decommission budget dashboard with remediation items, timeline, and regulatory approval flow",
|
|
regions: ["US", "UK", "EU", "CA"],
|
|
schema: {
|
|
facility: "string",
|
|
operator: "string",
|
|
asset_count: "number",
|
|
estimated_cost: "number",
|
|
timeline: "{start, end}",
|
|
remediation_items: "[{item, status}]",
|
|
regulatory_approval: "string",
|
|
},
|
|
},
|
|
];
|
|
|
|
export const VERTICALS: readonly Vertical[] = [
|
|
{
|
|
key: "insurance",
|
|
label: "Insurance",
|
|
color: "var(--color-cat-insurance)",
|
|
endpoints: insurance,
|
|
},
|
|
{
|
|
key: "compliance",
|
|
label: "Compliance",
|
|
color: "var(--color-cat-compliance)",
|
|
endpoints: compliance,
|
|
},
|
|
{
|
|
key: "finance",
|
|
label: "Finance",
|
|
color: "var(--color-cat-finance)",
|
|
endpoints: finance,
|
|
},
|
|
{
|
|
key: "legal",
|
|
label: "Legal",
|
|
color: "var(--color-cat-legal)",
|
|
endpoints: legal,
|
|
},
|
|
{
|
|
key: "healthcare",
|
|
label: "Healthcare",
|
|
color: "var(--color-cat-healthcare)",
|
|
endpoints: healthcare,
|
|
},
|
|
{
|
|
key: "government",
|
|
label: "Government",
|
|
color: "var(--color-cat-government)",
|
|
endpoints: government,
|
|
},
|
|
{
|
|
key: "operations",
|
|
label: "Supply Chain",
|
|
color: "var(--color-cat-operations)",
|
|
endpoints: operations,
|
|
},
|
|
{ key: "hr", label: "HR", color: "var(--color-cat-hr)", endpoints: hr },
|
|
{
|
|
key: "realestate",
|
|
label: "Real Estate",
|
|
color: "var(--color-cat-realestate)",
|
|
endpoints: realestate,
|
|
},
|
|
{
|
|
key: "energy",
|
|
label: "Energy & Infrastructure",
|
|
color: "var(--color-cat-energy)",
|
|
endpoints: energy,
|
|
},
|
|
];
|
|
|
|
/** Flat list of every endpoint across all verticals. */
|
|
export const ALL_ENDPOINTS: readonly Endpoint[] = VERTICALS.flatMap(
|
|
(v) => v.endpoints,
|
|
);
|
|
|
|
/** Index by path, e.g. ENDPOINTS_BY_PATH['/v1/coi']. */
|
|
export const ENDPOINTS_BY_PATH: Record<string, Endpoint> = Object.fromEntries(
|
|
ALL_ENDPOINTS.map((e) => [e.endpoint, e]),
|
|
);
|
|
|
|
/** Lookup a vertical by its key. */
|
|
export const lookupVertical = (key: VerticalKey): Vertical | null =>
|
|
VERTICALS.find((v) => v.key === key) ?? null;
|
|
|
|
/** Lookup an endpoint by its route path. */
|
|
export const lookupEndpoint = (path: string): Endpoint | null =>
|
|
ENDPOINTS_BY_PATH[path] ?? null;
|
|
|
|
/** Tier-availability gate used by the docs / cards / picker. */
|
|
export function isEndpointAvailable(endpoint: Endpoint, tier: Tier): boolean {
|
|
if (endpoint.tier === 0) return true;
|
|
if (endpoint.tier === 1) return tier === "pro" || tier === "enterprise";
|
|
return tier === "enterprise";
|
|
}
|