diff --git a/ui/src/App.tsx b/ui/src/App.tsx index 38b5f4bc..8294e564 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -1,4 +1,5 @@ import { Navigate, Outlet, Route, Routes, useLocation, useParams } from "@/lib/router"; +import { VOCAB } from "@paperclipai/branding"; import { useQuery } from "@tanstack/react-query"; import { Button } from "@/components/ui/button"; import { Layout } from "./components/Layout"; @@ -55,8 +56,8 @@ function BootstrapPendingPage({ hasActiveInvite = false }: { hasActiveInvite?: b

Instance setup required

{hasActiveInvite - ? "No instance admin exists yet. A bootstrap invite is already active. Check your Paperclip startup logs for the first admin invite URL, or run this command to rotate it:" - : "No instance admin exists yet. Run this command in your Paperclip environment to generate the first admin invite URL:"} + ? `No instance admin exists yet. A bootstrap invite is already active. Check your ${VOCAB.appName} startup logs for the first admin invite URL, or run this command to rotate it:` + : `No instance admin exists yet. Run this command in your ${VOCAB.appName} environment to generate the first admin invite URL:`}

 {`pnpm paperclipai auth bootstrap-ceo`}
diff --git a/ui/src/pages/InviteLanding.tsx b/ui/src/pages/InviteLanding.tsx
index e288babe..7e156fa7 100644
--- a/ui/src/pages/InviteLanding.tsx
+++ b/ui/src/pages/InviteLanding.tsx
@@ -1,4 +1,5 @@
 import { useEffect, useMemo, useState } from "react";
+import { VOCAB } from "@paperclipai/branding";
 import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
 import { Link, useParams } from "@/lib/router";
 import { accessApi } from "../api/access";
@@ -191,7 +192,7 @@ export function InviteLandingPage() {
           )}
           {(onboardingSkillUrl || onboardingSkillPath || onboardingInstallPath) && (
             
-

Paperclip skill bootstrap

+

{VOCAB.appName} skill bootstrap

{onboardingSkillUrl &&

GET {onboardingSkillUrl}

} {!onboardingSkillUrl && onboardingSkillPath &&

GET {onboardingSkillPath}

} {onboardingInstallPath &&

Install to {onboardingInstallPath}

} @@ -226,7 +227,7 @@ export function InviteLandingPage() {

- {invite.inviteType === "bootstrap_ceo" ? "Bootstrap your Paperclip instance" : "Join this Paperclip company"} + {invite.inviteType === "bootstrap_ceo" ? `Bootstrap your ${VOCAB.appName} instance` : `Join this ${VOCAB.appName} ${VOCAB.company.toLowerCase()}`}

Invite expires {dateTime(invite.expiresAt)}.

diff --git a/ui/src/pages/IssueDetail.tsx b/ui/src/pages/IssueDetail.tsx index 1aaa0b87..c361b7ca 100644 --- a/ui/src/pages/IssueDetail.tsx +++ b/ui/src/pages/IssueDetail.tsx @@ -1,4 +1,5 @@ import { useEffect, useMemo, useRef, useState, type ChangeEvent, type DragEvent } from "react"; +import { VOCAB } from "@paperclipai/branding"; import { pickTextColorForPillBg } from "@/lib/color-contrast"; import { Link, useLocation, useNavigate, useParams } from "@/lib/router"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; @@ -191,7 +192,7 @@ function ActorIdentity({ evt, agentMap }: { evt: ActivityEvent; agentMap: Map; } if (evt.actorType === "system") return ; - if (evt.actorType === "user") return ; + if (evt.actorType === "user") return ; return ; } diff --git a/ui/src/pages/NewAgent.tsx b/ui/src/pages/NewAgent.tsx index b8787be2..bf103e01 100644 --- a/ui/src/pages/NewAgent.tsx +++ b/ui/src/pages/NewAgent.tsx @@ -1,4 +1,5 @@ import { useState, useEffect } from "react"; +import { VOCAB } from "@paperclipai/branding"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { useNavigate, useSearchParams } from "@/lib/router"; import { useCompany } from "../context/CompanyContext"; @@ -111,8 +112,8 @@ export function NewAgent() { useEffect(() => { if (isFirstAgent) { - if (!name) setName("CEO"); - if (!title) setTitle("CEO"); + if (!name) setName(VOCAB.ceo); + if (!title) setTitle(VOCAB.ceo); } }, [isFirstAgent]); // eslint-disable-line react-hooks/exhaustive-deps diff --git a/ui/src/pages/NotFound.tsx b/ui/src/pages/NotFound.tsx index bcaf3898..217d95e1 100644 --- a/ui/src/pages/NotFound.tsx +++ b/ui/src/pages/NotFound.tsx @@ -1,4 +1,5 @@ import { useEffect } from "react"; +import { VOCAB } from "@paperclipai/branding"; import { Link, useLocation } from "@/lib/router"; import { AlertTriangle, Compass } from "lucide-react"; import { Button } from "@/components/ui/button"; @@ -26,7 +27,7 @@ export function NotFoundPage({ scope = "global", requestedPrefix }: NotFoundPage const currentPath = `${location.pathname}${location.search}${location.hash}`; const normalizedPrefix = requestedPrefix?.toUpperCase(); - const title = scope === "invalid_company_prefix" ? "Company not found" : "Page not found"; + const title = scope === "invalid_company_prefix" ? `${VOCAB.company} not found` : "Page not found"; const description = scope === "invalid_company_prefix" ? `No company matches prefix "${normalizedPrefix ?? "unknown"}".` diff --git a/ui/src/pages/PluginManager.tsx b/ui/src/pages/PluginManager.tsx index 3d422f23..4efb1552 100644 --- a/ui/src/pages/PluginManager.tsx +++ b/ui/src/pages/PluginManager.tsx @@ -5,6 +5,7 @@ * @see PLUGIN_SPEC.md §9 — Plugin Marketplace / Manager */ import { useEffect, useMemo, useState } from "react"; +import { VOCAB } from "@paperclipai/branding"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import type { PluginRecord } from "@paperclipai/shared"; import { Link } from "@/lib/router"; @@ -74,7 +75,7 @@ export function PluginManager() { useEffect(() => { setBreadcrumbs([ - { label: selectedCompany?.name ?? "Company", href: "/dashboard" }, + { label: selectedCompany?.name ?? VOCAB.company, href: "/dashboard" }, { label: "Settings", href: "/instance/settings/heartbeats" }, { label: "Plugins" }, ]); diff --git a/ui/src/pages/PluginSettings.tsx b/ui/src/pages/PluginSettings.tsx index 0d36b3d8..436f3974 100644 --- a/ui/src/pages/PluginSettings.tsx +++ b/ui/src/pages/PluginSettings.tsx @@ -1,4 +1,5 @@ import { useCallback, useEffect, useRef, useState } from "react"; +import { VOCAB } from "@paperclipai/branding"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { Puzzle, ArrowLeft, ShieldAlert, ActivitySquare, CheckCircle, XCircle, Loader2, Clock, Cpu, Webhook, CalendarClock, AlertTriangle } from "lucide-react"; import { useCompany } from "@/context/CompanyContext"; @@ -114,7 +115,7 @@ export function PluginSettings() { useEffect(() => { setBreadcrumbs([ - { label: selectedCompany?.name ?? "Company", href: "/dashboard" }, + { label: selectedCompany?.name ?? VOCAB.company, href: "/dashboard" }, { label: "Settings", href: "/instance/settings/heartbeats" }, { label: "Plugins", href: "/instance/settings/plugins" }, { label: plugin?.manifestJson?.displayName ?? plugin?.packageName ?? "Plugin Details" }, diff --git a/ui/src/pages/Routines.tsx b/ui/src/pages/Routines.tsx index a0d59d03..8fc6b91f 100644 --- a/ui/src/pages/Routines.tsx +++ b/ui/src/pages/Routines.tsx @@ -1,4 +1,5 @@ import { useEffect, useMemo, useRef, useState } from "react"; +import { VOCAB } from "@paperclipai/branding"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useNavigate } from "@/lib/router"; import { ChevronDown, ChevronRight, MoreHorizontal, Play, Plus, Repeat } from "lucide-react"; @@ -155,7 +156,7 @@ export function Routines() { onError: (mutationError) => { pushToast({ title: "Failed to update routine", - body: mutationError instanceof Error ? mutationError.message : "Paperclip could not update the routine.", + body: mutationError instanceof Error ? mutationError.message : `${VOCAB.appName} could not update the routine.`, tone: "error", }); }, @@ -178,7 +179,7 @@ export function Routines() { onError: (mutationError) => { pushToast({ title: "Routine run failed", - body: mutationError instanceof Error ? mutationError.message : "Paperclip could not start the routine run.", + body: mutationError instanceof Error ? mutationError.message : `${VOCAB.appName} could not start the routine run.`, tone: "error", }); }, @@ -464,7 +465,7 @@ export function Routines() {
- After creation, Paperclip takes you straight to trigger setup for schedules, webhooks, or internal runs. + After creation, {VOCAB.appName} takes you straight to trigger setup for schedules, webhooks, or internal runs.