{entries.map((entry, i) => {
@@ -68,7 +68,7 @@ const BeatApps: React.FC<{
}}
>
{entry.icon}
-
{entry.name}
+
{entry.name}
);
})}
diff --git a/frontend/src/app/components/OnboardingV3/beats/BeatCard.tsx b/frontend/src/app/components/OnboardingV3/beats/BeatCard.tsx
index c8ce1aa2..9e33a00d 100644
--- a/frontend/src/app/components/OnboardingV3/beats/BeatCard.tsx
+++ b/frontend/src/app/components/OnboardingV3/beats/BeatCard.tsx
@@ -240,17 +240,17 @@ const BeatCard: React.FC<{
placeholder="Your name"
style={{
marginTop: 20, border: 'none', outline: 'none', background: 'transparent',
- fontSize: '1.7rem', fontWeight: 800, color: ink, fontFamily: 'inherit',
+ fontSize: '1.75rem', fontWeight: 800, color: ink, fontFamily: 'inherit',
width: '100%', padding: 0,
}}
/>
-
+
{epithet}
OPENSWARM
@@ -260,7 +260,7 @@ const BeatCard: React.FC<{
}} />
{today.toUpperCase()}
-
+
OPEN
SWARM
diff --git a/frontend/src/app/components/OnboardingV3/beats/BeatConnect.tsx b/frontend/src/app/components/OnboardingV3/beats/BeatConnect.tsx
index 13d494b5..edac464a 100644
--- a/frontend/src/app/components/OnboardingV3/beats/BeatConnect.tsx
+++ b/frontend/src/app/components/OnboardingV3/beats/BeatConnect.tsx
@@ -107,10 +107,10 @@ const BeatConnect: React.FC<{
boxShadow: isConnected ? 'inset 0 0 0 3px #ffffff' : 'none',
}} />
- {p.name}
+ {p.name}
{/* The green ring + filled radio already signal connected, so no redundant "Connected" text. */}
{!isConnected && isThis && !connected
- ? waiting for sign-in...
+ ? waiting for sign-in...
: null}
{/* Arc's icon tile: a full-height soft-tinted zone on the row's right edge, real brand mark inside. */}
@@ -124,12 +124,12 @@ const BeatConnect: React.FC<{
);
})}
{userCode && !connected && (
-
+
Your code: {userCode}
)}
{!canContinue && (
-
+
Pick a subscription above to continue.
)}
diff --git a/frontend/src/app/components/OnboardingV3/beats/BeatShell.tsx b/frontend/src/app/components/OnboardingV3/beats/BeatShell.tsx
index b6263170..77b963b1 100644
--- a/frontend/src/app/components/OnboardingV3/beats/BeatShell.tsx
+++ b/frontend/src/app/components/OnboardingV3/beats/BeatShell.tsx
@@ -106,7 +106,7 @@ const BeatShell: React.FC<{
style={{
display: 'inline-flex', alignItems: 'center', gap: 6, alignSelf: 'flex-start',
marginBottom: 18, padding: 0, border: 'none', background: 'transparent',
- color: 'rgba(255,255,255,0.47)', fontSize: '0.85rem', cursor: 'pointer', fontFamily: 'inherit',
+ color: 'rgba(255,255,255,0.47)', fontSize: '0.875rem', cursor: 'pointer', fontFamily: 'inherit',
position: wide ? 'absolute' : 'relative', top: wide ? 24 : undefined, left: wide ? 28 : undefined,
}}
>
@@ -117,7 +117,7 @@ const BeatShell: React.FC<{
{title}
-
+
{body}
{/* Arc pins the CTA to the panel's bottom on card beats; on the wide account beat it follows the content. */}
@@ -141,7 +141,7 @@ const BeatShell: React.FC<{
onClick={() => armed && onSecondary()}
style={{
marginTop: 12, width: '100%', border: 'none', background: 'transparent',
- color: 'rgba(255,255,255,0.55)', fontSize: '0.88rem', fontWeight: 500,
+ color: 'rgba(255,255,255,0.55)', fontSize: '0.875rem', fontWeight: 500,
cursor: 'pointer', fontFamily: 'inherit', padding: 4,
}}
>
diff --git a/frontend/src/app/components/OnboardingV3/beats/BeatSignIn.tsx b/frontend/src/app/components/OnboardingV3/beats/BeatSignIn.tsx
index 260a1bbf..7be6f51b 100644
--- a/frontend/src/app/components/OnboardingV3/beats/BeatSignIn.tsx
+++ b/frontend/src/app/components/OnboardingV3/beats/BeatSignIn.tsx
@@ -84,9 +84,9 @@ const BeatSignIn: React.FC<{
- You're signed in
+ You're signed in
{userEmail && (
- {userEmail}
+ {userEmail}
)}
@@ -109,12 +109,12 @@ const BeatSignIn: React.FC<{
}}
>
{row.icon}
-
+
{row.hint ? row.hint : row.name}
))}
-
+
Sign in to continue.
>
diff --git a/frontend/src/app/components/RunInDesktopMessage.tsx b/frontend/src/app/components/RunInDesktopMessage.tsx
index 2237c415..07d3179c 100644
--- a/frontend/src/app/components/RunInDesktopMessage.tsx
+++ b/frontend/src/app/components/RunInDesktopMessage.tsx
@@ -25,10 +25,10 @@ const RunInDesktopMessage: React.FC
= ({ kind = 'browser' }) => {
userSelect: 'none',
}}
>
-
+
Open this in the OpenSwarm desktop app
-
+
{noun} run inside the OpenSwarm desktop window, not a regular web browser. It looks like you opened the dev URL directly in a browser; launch OpenSwarm (the Electron window from bash run.sh) and use it there instead.
diff --git a/frontend/src/app/components/editor/CommandPicker.tsx b/frontend/src/app/components/editor/CommandPicker.tsx
index 04213763..ffcb1526 100644
--- a/frontend/src/app/components/editor/CommandPicker.tsx
+++ b/frontend/src/app/components/editor/CommandPicker.tsx
@@ -412,7 +412,7 @@ const CommandPicker: React.FC = ({ trigger, filter, onSelect, onClose, vi
component="span"
sx={{
color: c.text.primary,
- fontSize: '0.8rem',
+ fontSize: '0.8125rem',
fontWeight: 500,
fontFamily: c.font.mono,
whiteSpace: 'nowrap',
@@ -425,7 +425,7 @@ const CommandPicker: React.FC = ({ trigger, filter, onSelect, onClose, vi
component="span"
sx={{
color: c.text.muted,
- fontSize: '0.72rem',
+ fontSize: '0.75rem',
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
@@ -459,7 +459,7 @@ const CommandPicker: React.FC = ({ trigger, filter, onSelect, onClose, vi
= ({ trigger, filter, onSelect, onClose, vi
>
{keys}
-
+
{label}
diff --git a/frontend/src/app/components/editor/DirectoryBrowser.tsx b/frontend/src/app/components/editor/DirectoryBrowser.tsx
index 0934fe65..996f1ab4 100644
--- a/frontend/src/app/components/editor/DirectoryBrowser.tsx
+++ b/frontend/src/app/components/editor/DirectoryBrowser.tsx
@@ -149,7 +149,7 @@ const DirectoryBrowser: React.FC = ({ open, onClose, onSe
sx={{
'& .MuiOutlinedInput-root': {
bgcolor: c.bg.page,
- fontSize: '0.85rem',
+ fontSize: '0.875rem',
fontFamily: c.font.mono,
},
}}
@@ -192,7 +192,7 @@ const DirectoryBrowser: React.FC = ({ open, onClose, onSe
component="button"
underline="hover"
onClick={() => browse('/')}
- sx={{ color: c.text.tertiary, fontSize: '0.78rem' }}
+ sx={{ color: c.text.tertiary, fontSize: '0.75rem' }}
>
/
@@ -200,7 +200,7 @@ const DirectoryBrowser: React.FC = ({ open, onClose, onSe
const fullPath = '/' + pathSegments.slice(0, i + 1).join('/');
const isLast = i === pathSegments.length - 1;
return isLast ? (
-
+
{seg}
) : (
@@ -209,7 +209,7 @@ const DirectoryBrowser: React.FC = ({ open, onClose, onSe
component="button"
underline="hover"
onClick={() => browse(fullPath)}
- sx={{ color: c.text.tertiary, fontSize: '0.78rem' }}
+ sx={{ color: c.text.tertiary, fontSize: '0.75rem' }}
>
{seg}
@@ -220,7 +220,7 @@ const DirectoryBrowser: React.FC = ({ open, onClose, onSe
)}
{error && (
-
+
{error}
)}
@@ -250,7 +250,7 @@ const DirectoryBrowser: React.FC = ({ open, onClose, onSe
) : !hasEntries ? (
-
+
Empty directory
@@ -277,7 +277,7 @@ const DirectoryBrowser: React.FC = ({ open, onClose, onSe
))}
@@ -301,7 +301,7 @@ const DirectoryBrowser: React.FC = ({ open, onClose, onSe
))}
@@ -310,7 +310,7 @@ const DirectoryBrowser: React.FC = ({ open, onClose, onSe
-
+
{selected
? `Selected: ${selected.name}`
: 'Click to select, double-click folders to open'}
diff --git a/frontend/src/app/components/editor/richEditorUtils.ts b/frontend/src/app/components/editor/richEditorUtils.ts
index 543fd99b..b5beb82b 100644
--- a/frontend/src/app/components/editor/richEditorUtils.ts
+++ b/frontend/src/app/components/editor/richEditorUtils.ts
@@ -49,7 +49,7 @@ export function createSkillPillElement(
borderRadius: '999px',
background: `${SKILL_COLOR}18`,
color: SKILL_COLOR,
- fontSize: '0.72rem',
+ fontSize: '0.75rem',
fontFamily: monoFont,
lineHeight: '1.8',
verticalAlign: 'baseline',
@@ -116,7 +116,7 @@ export function createPasteCardElement(
borderRadius: '6px',
background: `${PASTE_CARD_COLOR}1A`,
color: PASTE_CARD_COLOR,
- fontSize: '0.72rem',
+ fontSize: '0.75rem',
fontFamily: monoFont,
lineHeight: '1.8',
verticalAlign: 'baseline',
diff --git a/frontend/src/app/components/feedback/Loading.tsx b/frontend/src/app/components/feedback/Loading.tsx
index f36c8156..49cffd42 100644
--- a/frontend/src/app/components/feedback/Loading.tsx
+++ b/frontend/src/app/components/feedback/Loading.tsx
@@ -105,7 +105,7 @@ export const EmptyState: React.FC = ({ icon, title, hint, delay
}}
>
{icon && {icon}}
-
+
{title}
{hint && (
diff --git a/frontend/src/app/components/nudges/AutomationChips.tsx b/frontend/src/app/components/nudges/AutomationChips.tsx
index 17c9ea6e..dff1780c 100644
--- a/frontend/src/app/components/nudges/AutomationChips.tsx
+++ b/frontend/src/app/components/nudges/AutomationChips.tsx
@@ -66,7 +66,7 @@ const AutomationChips: React.FC<{ c: ClaudeTokens }> = ({ c }) => {
border: `1px dashed ${done ? c.status.success : c.border.strong}`,
background: done ? c.status.successBg : 'transparent',
color: done ? c.status.success : c.text.secondary,
- fontSize: '0.88rem', fontWeight: 500,
+ fontSize: '0.875rem', fontWeight: 500,
cursor: done ? 'default' : 'pointer', fontFamily: 'inherit',
}}
>
diff --git a/frontend/src/app/components/nudges/RevealHero.tsx b/frontend/src/app/components/nudges/RevealHero.tsx
index 47085f09..a55b756f 100644
--- a/frontend/src/app/components/nudges/RevealHero.tsx
+++ b/frontend/src/app/components/nudges/RevealHero.tsx
@@ -85,10 +85,10 @@ const RevealHero: React.FC = () => {
-
+
{userName ? `${userName}, while you set up I got to work` : `While you set up, I got to work`}
-
+
{doneCount === jobs.length ? `All done, here on your canvas` : `${doneCount} of ${jobs.length} done, the rest are running`}
@@ -114,17 +114,17 @@ const RevealHero: React.FC = () => {
}}>
{iconFor(job.kind)}
-
+
{lineFor(job, st)}
{st === 'done' ? (
-
+
done
) : st === 'snag' ? (
- needs a look
+ needs a look
) : (
-
+
{
);
})}
-
+
It's all on your canvas below. Nothing's saved or deleted without you, keep it or clear it anytime.
diff --git a/frontend/src/app/components/overlays/DynamicIsland.tsx b/frontend/src/app/components/overlays/DynamicIsland.tsx
index 4e795839..25fd5bbe 100644
--- a/frontend/src/app/components/overlays/DynamicIsland.tsx
+++ b/frontend/src/app/components/overlays/DynamicIsland.tsx
@@ -113,7 +113,7 @@ const AgentStatusRow: React.FC<{
1 && (
0 && (
1 && (
{ e.stopPropagation(); onClearAllFinished(); }}
sx={{
- fontSize: '0.58rem',
+ fontSize: '0.625rem',
fontWeight: 600,
color: c.text.ghost,
cursor: 'pointer',
diff --git a/frontend/src/app/components/overlays/GlobalSearchPalette.tsx b/frontend/src/app/components/overlays/GlobalSearchPalette.tsx
index e792e4c9..2633bbae 100644
--- a/frontend/src/app/components/overlays/GlobalSearchPalette.tsx
+++ b/frontend/src/app/components/overlays/GlobalSearchPalette.tsx
@@ -233,7 +233,7 @@ const GlobalSearchPalette: React.FC = ({ open, onClose }) => {
>
{/* Input row */}
-
+
= ({ open, onClose }) => {
placeholder="Search, or type a command…"
fullWidth
sx={{
- fontSize: '1.05rem',
+ fontSize: '1rem',
fontFamily: c.font.sans,
color: c.text.primary,
'& input::placeholder': { color: c.text.muted, opacity: 1 },
}}
/>
{isStillSearching && }
-
+
esc
@@ -256,7 +256,7 @@ const GlobalSearchPalette: React.FC = ({ open, onClose }) => {
{/* Results */}
{results.length === 0 ? (
-
+
{query.trim() ? 'No matches' : 'No dashboards or chats yet'}
) : (
@@ -330,7 +330,7 @@ const GlobalSearchPalette: React.FC = ({ open, onClose }) => {
gap: 1.5,
alignItems: 'center',
color: c.text.ghost,
- fontSize: '0.7rem',
+ fontSize: '0.6875rem',
}}
>
↑↓ navigate
@@ -348,7 +348,7 @@ const SectionHeader: React.FC<{ label: string; c: ReturnType = ({ icon, title, subtitle, selected, onClic
= ({ icon, title, subtitle, selected, onClic
{subtitle && (
= ({
sx={{
'& .MuiToggleButton-root': {
textTransform: 'none',
- fontSize: '0.78rem',
+ fontSize: '0.75rem',
fontWeight: 500,
px: 2,
py: 0.5,
diff --git a/frontend/src/app/components/overlays/PlanPickerModal.tsx b/frontend/src/app/components/overlays/PlanPickerModal.tsx
index 0e1321be..0efd6fe5 100644
--- a/frontend/src/app/components/overlays/PlanPickerModal.tsx
+++ b/frontend/src/app/components/overlays/PlanPickerModal.tsx
@@ -49,7 +49,7 @@ const PlanPickerModal: React.FC = ({
boxShadow: '0 20px 60px rgba(0,0,0,0.4)',
}}>
-
+
{title}
{
return (
-
+
Trusted file patterns
-
+
Files like SSH keys and shell startup files normally ask before each write, even when you've set Write to "always allow". Patterns you've chosen to always allow appear below. Remove one to start asking again.
@@ -97,10 +97,10 @@ export const TrustedFilePatterns: React.FC = () => {
}}
>
-
+
{PATTERN_LABELS[pat] || pat}
-
+
{pat}
diff --git a/frontend/src/app/components/share/ImportModal.tsx b/frontend/src/app/components/share/ImportModal.tsx
index 46b6776b..5987457b 100644
--- a/frontend/src/app/components/share/ImportModal.tsx
+++ b/frontend/src/app/components/share/ImportModal.tsx
@@ -43,7 +43,7 @@ const ImportModal: React.FC = ({ preflight, open, committing, onConfirm,
{preflight && (
<>
-
+
Add {preflight.summary.root.name}?
@@ -55,13 +55,13 @@ const ImportModal: React.FC = ({ preflight, open, committing, onConfirm,
{preflight.review && preflight.review.findings.length > 0 && (
-
+
{preflight.review.findings.join(' ')}
)}
{preflight.conflicts.length > 0 && (
-
+
Some items already exist and will be added as copies.
)}
@@ -82,7 +82,7 @@ const ImportModal: React.FC = ({ preflight, open, committing, onConfirm,
borderRadius: `${c.radius.md}px`,
px: 2.5,
py: 0.6,
- fontSize: '0.85rem',
+ fontSize: '0.875rem',
fontWeight: 600,
boxShadow: 'none',
}}
diff --git a/frontend/src/app/components/share/IncludesList.tsx b/frontend/src/app/components/share/IncludesList.tsx
index 7e9a8090..df5595fc 100644
--- a/frontend/src/app/components/share/IncludesList.tsx
+++ b/frontend/src/app/components/share/IncludesList.tsx
@@ -51,7 +51,7 @@ const IncludesList: React.FC<{ summary: BundleSummary }> = ({ summary }) => {
{/* Lead: the bundle's type + a one-line count. The name is in the title. */}
-
+
{rootLabel}
{countLine && ` · ${countLine}`}
@@ -60,7 +60,7 @@ const IncludesList: React.FC<{ summary: BundleSummary }> = ({ summary }) => {
onClick={() => setExpanded((v) => !v)}
sx={{ display: 'flex', alignItems: 'center', gap: 0.25, color: c.text.tertiary, cursor: 'pointer', '&:hover': { color: c.accent.primary } }}
>
- {expanded ? 'Hide' : 'Show'}
+ {expanded ? 'Hide' : 'Show'}
)}
@@ -70,10 +70,10 @@ const IncludesList: React.FC<{ summary: BundleSummary }> = ({ summary }) => {
{includes.map((it, i) => (
-
+
{KIND_LABEL[it.type] || it.type}
-
+
{it.name}
@@ -83,7 +83,7 @@ const IncludesList: React.FC<{ summary: BundleSummary }> = ({ summary }) => {
{summary.requirements.length > 0 && (
-
+
Needs
{summary.requirements.map((r, i) => (
@@ -97,7 +97,7 @@ const IncludesList: React.FC<{ summary: BundleSummary }> = ({ summary }) => {
}}
>
{REQ_ICON[r.kind] || }
-
+
{r.label}
diff --git a/frontend/src/app/components/share/PublishModal.tsx b/frontend/src/app/components/share/PublishModal.tsx
index d575af41..07fb596c 100644
--- a/frontend/src/app/components/share/PublishModal.tsx
+++ b/frontend/src/app/components/share/PublishModal.tsx
@@ -153,7 +153,7 @@ const PublishModal: React.FC = ({ outputId, outputName, open, onClose })
return center(
<>
- Checking your app before it goes live...
+ Checking your app before it goes live...
>,
);
@@ -162,7 +162,7 @@ const PublishModal: React.FC = ({ outputId, outputName, open, onClose })
return center(
<>
- Building and publishing your app...
+ Building and publishing your app...
>,
);
@@ -170,8 +170,8 @@ const PublishModal: React.FC = ({ outputId, outputName, open, onClose })
if (phase === 'error') {
return center(
<>
- Something went wrong
- {errorMsg}
+ Something went wrong
+ {errorMsg}
>,
);
}
@@ -179,8 +179,8 @@ const PublishModal: React.FC = ({ outputId, outputName, open, onClose })
if (confirmUnpublish) {
return center(
<>
- Take this app offline?
-
+ Take this app offline?
+
The public link will stop working for anyone you've shared it with.
>,
@@ -190,7 +190,7 @@ const PublishModal: React.FC = ({ outputId, outputName, open, onClose })
- Your app is live
+ Your app is live
= ({ outputId, outputName, open, onClose })
border: `1px solid ${c.border.subtle}`, bgcolor: c.bg.secondary,
}}
>
-
+
{liveUrl}
@@ -212,7 +212,7 @@ const PublishModal: React.FC = ({ outputId, outputName, open, onClose })
return center(
<>
- Looks good. Ready to publish.
+ Looks good. Ready to publish.
>,
);
}
@@ -220,18 +220,18 @@ const PublishModal: React.FC = ({ outputId, outputName, open, onClose })
-
+
{findings.length} security risk{findings.length === 1 ? '' : 's'} found
-
+
You can still publish, fix them first, or cancel.
-
@@ -687,7 +687,7 @@ const GenericApprovalBar: React.FC = ({ request, onApprove, onDeny }) =>
variant="outlined"
startIcon={}
onClick={() => onApprove(request.id, undefined, false, true)}
- sx={{ borderColor: c.status.success, color: c.status.success, '&:hover': { borderColor: '#1e4d15', bgcolor: 'rgba(45,122,31,0.06)' }, fontWeight: 600, fontSize: '0.8rem' }}
+ sx={{ borderColor: c.status.success, color: c.status.success, '&:hover': { borderColor: '#1e4d15', bgcolor: 'rgba(45,122,31,0.06)' }, fontWeight: 600, fontSize: '0.8125rem' }}
>
Always approve
@@ -696,7 +696,7 @@ const GenericApprovalBar: React.FC = ({ request, onApprove, onDeny }) =>
variant="outlined"
startIcon={}
onClick={() => onDeny(request.id)}
- sx={{ borderColor: c.status.error, color: c.status.error, '&:hover': { borderColor: '#8f2828', bgcolor: 'rgba(181,51,51,0.04)' }, fontWeight: 600, fontSize: '0.8rem' }}
+ sx={{ borderColor: c.status.error, color: c.status.error, '&:hover': { borderColor: '#8f2828', bgcolor: 'rgba(181,51,51,0.04)' }, fontWeight: 600, fontSize: '0.8125rem' }}
>
Deny
@@ -736,7 +736,7 @@ const GenericApprovalBar: React.FC = ({ request, onApprove, onDeny }) =>
-
+
{displayName}
= ({ request, onApprove, onDeny }) =>
size="small"
sx={{
height: 18,
- fontSize: '0.65rem',
+ fontSize: '0.625rem',
fontWeight: 500,
bgcolor: `${accentColor}12`,
color: accentColor,
@@ -757,7 +757,7 @@ const GenericApprovalBar: React.FC = ({ request, onApprove, onDeny }) =>
= ({ request, onApprove, onDeny }) =>
= ({ request, onApprove, onDeny }) =>
bgcolor: c.status.success,
'&:hover': { bgcolor: '#1e4d15' },
fontWeight: 600,
- fontSize: '0.8rem',
+ fontSize: '0.8125rem',
textTransform: 'none',
borderRadius: 1.5,
px: 2,
@@ -836,7 +836,7 @@ const GenericApprovalBar: React.FC = ({ request, onApprove, onDeny }) =>
color: c.status.success,
'&:hover': { borderColor: '#1e4d15', bgcolor: 'rgba(45,122,31,0.06)' },
fontWeight: 600,
- fontSize: '0.8rem',
+ fontSize: '0.8125rem',
textTransform: 'none',
borderRadius: 1.5,
px: 2,
@@ -853,7 +853,7 @@ const GenericApprovalBar: React.FC = ({ request, onApprove, onDeny }) =>
color: c.status.error,
'&:hover': { borderColor: '#8f2828', bgcolor: 'rgba(181,51,51,0.04)' },
fontWeight: 600,
- fontSize: '0.8rem',
+ fontSize: '0.8125rem',
textTransform: 'none',
borderRadius: 1.5,
px: 2,
@@ -957,7 +957,7 @@ export const BatchApprovalBar: React.FC = ({ requests, on
bgcolor: c.status.warningBg,
}}
>
-
+
{nonQuestions.length} pending approvals
= ({ requests, on
bgcolor: c.status.success,
'&:hover': { bgcolor: '#1e4d15' },
fontWeight: 600,
- fontSize: '0.78rem',
+ fontSize: '0.75rem',
textTransform: 'none',
borderRadius: 1.5,
px: 1.5,
@@ -988,7 +988,7 @@ export const BatchApprovalBar: React.FC = ({ requests, on
color: c.status.success,
'&:hover': { borderColor: '#1e4d15', bgcolor: 'rgba(45,122,31,0.06)' },
fontWeight: 600,
- fontSize: '0.78rem',
+ fontSize: '0.75rem',
textTransform: 'none',
borderRadius: 1.5,
px: 1.5,
@@ -1007,7 +1007,7 @@ export const BatchApprovalBar: React.FC = ({ requests, on
color: c.status.error,
'&:hover': { borderColor: '#8f2828', bgcolor: 'rgba(181,51,51,0.04)' },
fontWeight: 600,
- fontSize: '0.78rem',
+ fontSize: '0.75rem',
textTransform: 'none',
borderRadius: 1.5,
px: 1.5,
@@ -1087,7 +1087,7 @@ const GroupRow: React.FC = ({ group, expanded, onToggle, onApprov
: getToolIcon(group.toolName)}
-
+
{group.parsed.isMcp ? group.parsed.displayName : group.toolName}
@@ -1097,7 +1097,7 @@ const GroupRow: React.FC = ({ group, expanded, onToggle, onApprov
sx={{
height: 20,
minWidth: 24,
- fontSize: '0.72rem',
+ fontSize: '0.75rem',
fontWeight: 700,
bgcolor: `${accentColor}18`,
color: accentColor,
@@ -1114,7 +1114,7 @@ const GroupRow: React.FC = ({ group, expanded, onToggle, onApprov
sx={{
color: c.status.success,
fontWeight: 600,
- fontSize: '0.72rem',
+ fontSize: '0.75rem',
textTransform: 'none',
minWidth: 0,
px: 1,
@@ -1130,7 +1130,7 @@ const GroupRow: React.FC = ({ group, expanded, onToggle, onApprov
sx={{
color: c.status.error,
fontWeight: 600,
- fontSize: '0.72rem',
+ fontSize: '0.75rem',
textTransform: 'none',
minWidth: 0,
px: 1,
diff --git a/frontend/src/app/pages/AgentChat/shell/BranchNavigator.tsx b/frontend/src/app/pages/AgentChat/shell/BranchNavigator.tsx
index e506f8c5..eec1b3e0 100644
--- a/frontend/src/app/pages/AgentChat/shell/BranchNavigator.tsx
+++ b/frontend/src/app/pages/AgentChat/shell/BranchNavigator.tsx
@@ -41,7 +41,7 @@ const BranchNavigator: React.FC = ({ currentIndex, totalBranches, onPrevi
>
-
+
{currentIndex + 1} / {totalBranches}
= ({ parentSessionId, browserId })
= ({ parentSessionId, browserId })
{!showLabels && entries.length === 0 && session.status === 'running' && (
= ({ parentSessionId, browserId })
= ({ open, sentiment, sessionId, messageId
PaperProps={{ sx: { bgcolor: c.bg.elevated, borderRadius: 3, p: 1, minWidth: 420, maxWidth: 480 } }}
>
-
+
{isUp ? 'Give positive feedback' : 'Give negative feedback'}
-
+
Please provide details: (optional)
= ({ open, sentiment, sessionId, messageId
'& .MuiOutlinedInput-root': {
bgcolor: c.bg.page,
color: c.text.primary,
- fontSize: '0.9rem',
+ fontSize: '0.875rem',
'& fieldset': { borderColor: c.border.medium },
'&:hover fieldset': { borderColor: c.border.strong },
'&.Mui-focused fieldset': { borderColor: c.accent.primary },
diff --git a/frontend/src/app/pages/AgentChat/shell/MessageActionBar.tsx b/frontend/src/app/pages/AgentChat/shell/MessageActionBar.tsx
index eb69863e..e97cad2e 100644
--- a/frontend/src/app/pages/AgentChat/shell/MessageActionBar.tsx
+++ b/frontend/src/app/pages/AgentChat/shell/MessageActionBar.tsx
@@ -117,7 +117,7 @@ const MessageActionBar: React.FC = ({
=
overflowX: 'hidden',
color: c.text.secondary,
fontFamily: c.font.sans,
- fontSize: '0.78rem',
+ fontSize: '0.75rem',
lineHeight: 1.65,
overflowWrap: 'anywhere',
wordBreak: 'break-word',
@@ -28,8 +28,8 @@ export const AgentResponseBody: React.FC<{ open: boolean; markdown: string }> =
color: c.text.primary, fontFamily: c.font.sans,
mt: 1, mb: 0.5, '&:first-of-type': { mt: 0 },
},
- '& h1': { fontSize: '0.88rem' }, '& h2': { fontSize: '0.84rem' },
- '& h3': { fontSize: '0.8rem' }, '& h4': { fontSize: '0.78rem' },
+ '& h1': { fontSize: '0.875rem' }, '& h2': { fontSize: '0.8125rem' },
+ '& h3': { fontSize: '0.8125rem' }, '& h4': { fontSize: '0.75rem' },
'& strong': { color: c.text.primary, fontWeight: 600 },
'& a': { color: c.accent.primary, textDecoration: 'none', '&:hover': { textDecoration: 'underline' } },
'& ul, & ol': { pl: 2, mb: 0.75, mt: 0 },
@@ -41,11 +41,11 @@ export const AgentResponseBody: React.FC<{ open: boolean; markdown: string }> =
},
'& code': {
bgcolor: c.bg.secondary, px: 0.4, py: 0.15,
- borderRadius: 0.5, fontSize: '0.72rem', fontFamily: c.font.mono,
+ borderRadius: 0.5, fontSize: '0.75rem', fontFamily: c.font.mono,
},
'& pre': {
bgcolor: c.bg.secondary, borderRadius: 1, p: 1,
- overflow: 'auto', fontSize: '0.72rem', fontFamily: c.font.mono,
+ overflow: 'auto', fontSize: '0.75rem', fontFamily: c.font.mono,
m: 0, mb: 0.75,
},
'& pre code': { bgcolor: 'transparent', p: 0 },
diff --git a/frontend/src/app/pages/AgentChat/tool-bubbles/CompactMcpBubble.tsx b/frontend/src/app/pages/AgentChat/tool-bubbles/CompactMcpBubble.tsx
index 584dd231..5dc598c1 100644
--- a/frontend/src/app/pages/AgentChat/tool-bubbles/CompactMcpBubble.tsx
+++ b/frontend/src/app/pages/AgentChat/tool-bubbles/CompactMcpBubble.tsx
@@ -96,7 +96,7 @@ export const CompactMcpBubble: React.FC = ({
= ({
= ({
{isDenied && (
- denied
+ denied
)}
{result && !isDenied && (
@@ -154,7 +154,7 @@ export const CompactMcpBubble: React.FC = ({
{/* Timings are debug detail, not content: ghosted at rest, legible on row hover
(LibreChat/ChatGPT show none at all; we keep them one hover away). */}
{resultElapsedMs != null && (
-
+
{formatElapsed(resultElapsedMs)}
)}
@@ -170,7 +170,7 @@ export const CompactMcpBubble: React.FC = ({
= ({
) : parsedResult ? (
{parsedResult.type === 'text' ? parsedResult.content : ''}
diff --git a/frontend/src/app/pages/AgentChat/tool-bubbles/CreateAgentBubble.tsx b/frontend/src/app/pages/AgentChat/tool-bubbles/CreateAgentBubble.tsx
index 7db5815a..ac2435f9 100644
--- a/frontend/src/app/pages/AgentChat/tool-bubbles/CreateAgentBubble.tsx
+++ b/frontend/src/app/pages/AgentChat/tool-bubbles/CreateAgentBubble.tsx
@@ -72,7 +72,7 @@ export const CreateAgentBubble: React.FC = ({
= ({
= ({
sx={{
flex: 1,
minWidth: 0,
- fontSize: '0.73rem',
+ fontSize: '0.75rem',
color: c.text.tertiary,
fontFamily: c.font.sans,
}}
@@ -125,7 +125,7 @@ export const CreateAgentBubble: React.FC = ({
{isDenied && (
- denied
+ denied
)}
@@ -135,7 +135,7 @@ export const CreateAgentBubble: React.FC = ({
)}
{resultElapsedMs != null && (
-
+
{formatElapsed(resultElapsedMs)}
)}
diff --git a/frontend/src/app/pages/AgentChat/tool-bubbles/DefaultToolBubble.tsx b/frontend/src/app/pages/AgentChat/tool-bubbles/DefaultToolBubble.tsx
index 7a5aaebb..0d5574e3 100644
--- a/frontend/src/app/pages/AgentChat/tool-bubbles/DefaultToolBubble.tsx
+++ b/frontend/src/app/pages/AgentChat/tool-bubbles/DefaultToolBubble.tsx
@@ -131,7 +131,7 @@ export const DefaultToolBubble: React.FC = ({
= ({
{isDenied && (
-
+
denied
@@ -180,7 +180,7 @@ export const DefaultToolBubble: React.FC = ({
<>
{resultSummary && (
-
+
{resultSummary}
)}
@@ -189,7 +189,7 @@ export const DefaultToolBubble: React.FC = ({
{resultElapsedMs != null && (
= ({
whiteSpace: 'pre-wrap',
wordBreak: 'break-word',
fontFamily: c.font.mono,
- fontSize: '0.73rem',
+ fontSize: '0.75rem',
lineHeight: 1.5,
}}
>
@@ -278,7 +278,7 @@ export const DefaultToolBubble: React.FC = ({
whiteSpace: 'pre-wrap',
wordBreak: 'break-word',
fontFamily: c.font.mono,
- fontSize: '0.73rem',
+ fontSize: '0.75rem',
lineHeight: 1.5,
}}
>
@@ -324,7 +324,7 @@ export const DefaultToolBubble: React.FC = ({
= ({
= ({
= ({
sx={{
flex: 1,
minWidth: 0,
- fontSize: '0.73rem',
+ fontSize: '0.75rem',
color: c.text.tertiary,
fontFamily: c.font.sans,
}}
@@ -125,7 +125,7 @@ export const InvokeAgentBubble: React.FC = ({
{isDenied && (
- denied
+ denied
)}
@@ -135,12 +135,12 @@ export const InvokeAgentBubble: React.FC = ({
)}
{resultElapsedMs != null && (
-
+
{formatElapsed(resultElapsedMs)}
)}
{costLabel && (
-
+
{costLabel}
)}
diff --git a/frontend/src/app/pages/AgentChat/tool-bubbles/SourceFavicons.tsx b/frontend/src/app/pages/AgentChat/tool-bubbles/SourceFavicons.tsx
index 8574aaf5..a6411542 100644
--- a/frontend/src/app/pages/AgentChat/tool-bubbles/SourceFavicons.tsx
+++ b/frontend/src/app/pages/AgentChat/tool-bubbles/SourceFavicons.tsx
@@ -74,7 +74,7 @@ export const SourceFavicons: React.FC<{ domains: string[]; size?: number }> = ({
border: `1.5px solid ${c.bg.elevated}`,
bgcolor: c.bg.secondary,
color: c.text.tertiary,
- fontSize: '0.6rem',
+ fontSize: '0.625rem',
fontWeight: 600,
display: 'inline-flex',
alignItems: 'center',
diff --git a/frontend/src/app/pages/AgentChat/tool-bubbles/ToolGroupBubble.tsx b/frontend/src/app/pages/AgentChat/tool-bubbles/ToolGroupBubble.tsx
index 2a72de4c..9e855aa5 100644
--- a/frontend/src/app/pages/AgentChat/tool-bubbles/ToolGroupBubble.tsx
+++ b/frontend/src/app/pages/AgentChat/tool-bubbles/ToolGroupBubble.tsx
@@ -166,21 +166,21 @@ const ToolGroupBubble: React.FC = React.memo(({ group, isSessionRunning =
}}
>
{webDomains && webDomains.length > 0 && }
-
+
{webGroupLabel ?? `${group.callCount} tool call${group.callCount === 1 ? '' : 's'}`}
{!allDone && (
-
+
{completedCount}/{group.callCount}
)}
{allDone && webDomains && webDomains.length > 0 && (
-
+
{webDomains.length} source{webDomains.length === 1 ? '' : 's'}
)}
{deniedCount > 0 && (
-
+
{deniedCount} denied
)}
@@ -217,7 +217,7 @@ const ToolGroupBubble: React.FC = React.memo(({ group, isSessionRunning =
= React.memo(({ group, isSessionRunning =
)}
{deniedCount > 0 && (
-
+
{deniedCount} denied
)}
@@ -236,12 +236,12 @@ const ToolGroupBubble: React.FC = React.memo(({ group, isSessionRunning =
makes the separate ×N chip redundant. tabular-nums +
minWidth keep the position stable as digits change. */}
{allDone && completedCount > 0 && (
-
+
{completedCount}/{group.callCount}
)}
{!allDone && pendingCount > 0 && (
-
+
{completedCount}/{group.callCount}
)}
@@ -282,7 +282,7 @@ const ToolGroupBubble: React.FC = React.memo(({ group, isSessionRunning =
) : (
{entry.text}
diff --git a/frontend/src/app/pages/AgentChat/tool-ui/AskUiBubble.tsx b/frontend/src/app/pages/AgentChat/tool-ui/AskUiBubble.tsx
index ff3fa3ee..da649def 100644
--- a/frontend/src/app/pages/AgentChat/tool-ui/AskUiBubble.tsx
+++ b/frontend/src/app/pages/AgentChat/tool-ui/AskUiBubble.tsx
@@ -131,7 +131,7 @@ function AskUiBubble({ pair, sessionId, isPending, suppressReveal }: AskUiBubble
onChange={(e) => setFreeText(e.target.value)}
placeholder="Or type your own answer..."
inputProps={{ 'aria-label': 'Type your own answer' }}
- sx={{ flex: 1, fontSize: '0.8rem' }}
+ sx={{ flex: 1, fontSize: '0.8125rem' }}
/>
@@ -139,15 +139,15 @@ function AskUiBubble({ pair, sessionId, isPending, suppressReveal }: AskUiBubble
)}
{freeTextAnswer !== null && (
-
+
✓ Answered: {freeTextAnswer}
)}
{submitted && pair.result === null && (
- Sent to the agent...
+ Sent to the agent...
)}
{orphaned && (
-
+
No agent is waiting for this answer (the request expired or this is an old transcript).
)}
diff --git a/frontend/src/app/pages/AgentChat/tool-ui/LinksWidget.tsx b/frontend/src/app/pages/AgentChat/tool-ui/LinksWidget.tsx
index 8d980491..309a5fe0 100644
--- a/frontend/src/app/pages/AgentChat/tool-ui/LinksWidget.tsx
+++ b/frontend/src/app/pages/AgentChat/tool-ui/LinksWidget.tsx
@@ -36,14 +36,14 @@ function LinksWidget({ props }: { props: LinksProps }): React.ReactElement {
'&:hover': { borderColor: c.border.strong },
}}
>
-
+
{hostOf(l.url)}
-
+
{l.title}
{l.description && (
-
+
{l.description}
)}
diff --git a/frontend/src/app/pages/AgentChat/tool-ui/PlanWidget.tsx b/frontend/src/app/pages/AgentChat/tool-ui/PlanWidget.tsx
index 92b6fd8a..44334ab7 100644
--- a/frontend/src/app/pages/AgentChat/tool-ui/PlanWidget.tsx
+++ b/frontend/src/app/pages/AgentChat/tool-ui/PlanWidget.tsx
@@ -27,11 +27,11 @@ function PlanWidget({ props }: { props: PlanProps }): React.ReactElement {
}}
>
{props.title && (
-
+
{props.title}
)}
-
+
{done} of {props.steps.length} complete
@@ -48,7 +48,7 @@ function PlanWidget({ props }: { props: PlanProps }): React.ReactElement {
)}
{props.title && (
-
+
{props.title}
)}
@@ -30,10 +30,10 @@ function StatsWidget({ props }: { props: StatsProps }): React.ReactElement {
py: 1.25,
}}
>
-
+
{s.label}
-
+
{s.value}
{s.delta && (
@@ -43,7 +43,7 @@ function StatsWidget({ props }: { props: StatsProps }): React.ReactElement {
) : (
)}
-
+
{s.delta}
diff --git a/frontend/src/app/pages/Analytics/Analytics.tsx b/frontend/src/app/pages/Analytics/Analytics.tsx
index 7b03defa..4c1377a3 100644
--- a/frontend/src/app/pages/Analytics/Analytics.tsx
+++ b/frontend/src/app/pages/Analytics/Analytics.tsx
@@ -27,10 +27,10 @@ const Analytics: React.FC = () => {
-
+
Your usage
-
+
Usage data is automatically collected: sessions, costs, tool usage, model distribution, and task categories.
All data is anonymous and can be disabled in Settings.
@@ -45,10 +45,10 @@ const Analytics: React.FC = () => {
{ label: 'Retention & Funnels', desc: 'User engagement, feature adoption, onboarding flow' },
].map((item) => (
-
+
{item.label}
-
+
{item.desc}
diff --git a/frontend/src/app/pages/Analytics/PixelChart.tsx b/frontend/src/app/pages/Analytics/PixelChart.tsx
index f889517b..d28ca073 100644
--- a/frontend/src/app/pages/Analytics/PixelChart.tsx
+++ b/frontend/src/app/pages/Analytics/PixelChart.tsx
@@ -360,7 +360,7 @@ const PixelChart: React.FC = ({
key={xl.idx}
sx={{
color: c.text.ghost,
- fontSize: '0.58rem',
+ fontSize: '0.625rem',
fontFamily: c.font.mono,
whiteSpace: 'nowrap',
overflow: 'hidden',
@@ -383,7 +383,7 @@ const PixelChart: React.FC = ({
transition: 'opacity 0.12s',
bgcolor: c.bg.inverse,
color: c.text.inverse,
- fontSize: '0.7rem',
+ fontSize: '0.6875rem',
fontFamily: c.font.mono,
fontWeight: 500,
px: 1,
diff --git a/frontend/src/app/pages/Commands/Commands.tsx b/frontend/src/app/pages/Commands/Commands.tsx
index ea9451ac..445c40a0 100644
--- a/frontend/src/app/pages/Commands/Commands.tsx
+++ b/frontend/src/app/pages/Commands/Commands.tsx
@@ -55,7 +55,7 @@ const SectionHeader: React.FC<{
size="small"
sx={{
height: 20,
- fontSize: '0.7rem',
+ fontSize: '0.6875rem',
fontWeight: 600,
bgcolor: `${c.accent.primary}15`,
color: c.accent.primary,
@@ -63,7 +63,7 @@ const SectionHeader: React.FC<{
/>
)}
- {subtitle}
+ {subtitle}
);
@@ -230,7 +230,7 @@ export const CommandsContent: React.FC = () => {
}}
>
-
+
No slash commands yet. Create skills or modes to see them here.
@@ -264,7 +264,7 @@ export const CommandsContent: React.FC = () => {
{
size="small"
sx={{
height: 20,
- fontSize: '0.65rem',
+ fontSize: '0.625rem',
fontWeight: 600,
textTransform: 'uppercase',
bgcolor: cmd.type === 'mode' ? `${modesMap[cmd.id]?.color || c.accent.primary}15`
@@ -289,7 +289,7 @@ export const CommandsContent: React.FC = () => {
{
}}
>
-
+
No @ commands yet. Install MCP actions to see them here.
@@ -367,7 +367,7 @@ export const CommandsContent: React.FC = () => {
size="small"
sx={{
height: 20,
- fontSize: '0.65rem',
+ fontSize: '0.625rem',
fontWeight: 600,
textTransform: 'uppercase',
bgcolor: cmd.source === 'builtin' ? `${c.accent.primary}12` : cmd.source === 'view' ? '#f472b615' : `${c.status.info}15`,
@@ -377,7 +377,7 @@ export const CommandsContent: React.FC = () => {
(
placeholder="Search apps..."
sx={{
flex: 1,
- fontSize: '0.85rem',
+ fontSize: '0.875rem',
color: c.text.primary,
fontFamily: c.font.sans,
'& input::placeholder': { color: c.text.ghost, opacity: 1 },
@@ -515,7 +515,7 @@ const DashboardToolbar = React.forwardRef(
>
{filteredOutputs.length === 0 ? (
-
+
{outputList.length === 0 ? 'No apps created yet' : 'No matching apps'}
@@ -572,7 +572,7 @@ const DashboardToolbar = React.forwardRef(
(
{output.description && (
= ({
= ({
/>
{item.name}
{friendlyStatusLabel(item.status)}
@@ -242,7 +242,7 @@ const DashboardHeader: React.FC = ({
handleFocus(item.id, item.card)} c={c}>
{item.name}
@@ -257,13 +257,13 @@ const DashboardHeader: React.FC = ({
handleFocus(item.id, item.card)} c={c}>
{item.title}
{cleanUrl(item.url)}
@@ -305,10 +305,10 @@ const CategoryGroup: React.FC<{
}}
>
svg': { fontSize: 15 } }}>{icon}
-
+
{label}
-
+
{count}
diff --git a/frontend/src/app/pages/Dashboard/cards/AgentCard.tsx b/frontend/src/app/pages/Dashboard/cards/AgentCard.tsx
index c75dccad..96433575 100644
--- a/frontend/src/app/pages/Dashboard/cards/AgentCard.tsx
+++ b/frontend/src/app/pages/Dashboard/cards/AgentCard.tsx
@@ -1088,14 +1088,14 @@ const AgentCard: React.FC = ({
dispatch(renameSession({ sessionId: session.id, name }))}
- sx={{ flex: '0 1 auto', minWidth: 0, maxWidth: '100%', color: c.text.primary, fontWeight: 600, fontSize: '0.95rem' }}
+ sx={{ flex: '0 1 auto', minWidth: 0, maxWidth: '100%', color: c.text.primary, fontWeight: 600, fontSize: '1rem' }}
>
{(t) => (
-
+
{t}
)}
@@ -1131,7 +1131,7 @@ const AgentCard: React.FC = ({
color: accentColor,
border: `1px solid ${accentColor}33`,
fontWeight: 600,
- fontSize: '0.68rem',
+ fontSize: '0.6875rem',
height: 22,
flexShrink: 0,
'& .MuiChip-icon': { ml: '4px' },
@@ -1225,7 +1225,7 @@ const AgentCard: React.FC = ({
variant="body2"
sx={{
color: isStreaming ? c.text.secondary : c.text.muted,
- fontSize: '0.8rem',
+ fontSize: '0.8125rem',
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
@@ -1277,7 +1277,7 @@ const AgentCard: React.FC = ({
= ({
bgcolor: c.status.success,
'&:hover': { bgcolor: '#1e4d15' },
fontWeight: 600,
- fontSize: '0.72rem',
+ fontSize: '0.75rem',
textTransform: 'none',
borderRadius: 1.5,
px: 1.25,
@@ -1366,7 +1366,7 @@ const AgentCard: React.FC = ({
color: c.status.error,
'&:hover': { borderColor: '#8f2828', bgcolor: 'rgba(181,51,51,0.04)' },
fontWeight: 600,
- fontSize: '0.72rem',
+ fontSize: '0.75rem',
textTransform: 'none',
borderRadius: 1.5,
px: 1.25,
diff --git a/frontend/src/app/pages/Dashboard/cards/BrowserAgentOverlay.tsx b/frontend/src/app/pages/Dashboard/cards/BrowserAgentOverlay.tsx
index fb4f3d36..56c6c0c7 100644
--- a/frontend/src/app/pages/Dashboard/cards/BrowserAgentOverlay.tsx
+++ b/frontend/src/app/pages/Dashboard/cards/BrowserAgentOverlay.tsx
@@ -235,7 +235,7 @@ const BrowserAgentOverlay: React.FC = ({ session, browserWidth, browserHe
= ({ session, browserWidth, browserHe
{/* Body: intervention prompt OR scrollable action log */}
{intervention ? (
-
+
{interventionProblem}
{interventionInstruction && (
-
+
{interventionInstruction}
)}
-
+
Resolve the issue in the browser above, then click Done.
{showSkipInput ? (
@@ -319,7 +319,7 @@ const BrowserAgentOverlay: React.FC = ({ session, browserWidth, browserHe
}}
sx={{
flex: 1,
- fontSize: '0.68rem',
+ fontSize: '0.6875rem',
color: 'rgba(255,255,255,0.8)',
bgcolor: 'rgba(255,255,255,0.08)',
borderRadius: '6px',
@@ -350,7 +350,7 @@ const BrowserAgentOverlay: React.FC = ({ session, browserWidth, browserHe
bgcolor: '#f59e0b',
'&:hover': { bgcolor: '#d97706' },
textTransform: 'none',
- fontSize: '0.68rem',
+ fontSize: '0.6875rem',
fontWeight: 600,
borderRadius: '6px',
px: 1.5,
@@ -368,7 +368,7 @@ const BrowserAgentOverlay: React.FC = ({ session, browserWidth, browserHe
color: 'rgba(255,255,255,0.4)',
'&:hover': { color: 'rgba(255,255,255,0.7)' },
textTransform: 'none',
- fontSize: '0.68rem',
+ fontSize: '0.6875rem',
px: 1,
py: 0.4,
minWidth: 'auto',
@@ -400,7 +400,7 @@ const BrowserAgentOverlay: React.FC = ({ session, browserWidth, browserHe
}}
>
{entries.length === 0 && isRunning && (
-
+
Starting...
)}
@@ -421,7 +421,7 @@ const BrowserAgentOverlay: React.FC = ({ session, browserWidth, browserHe
/>
= ({ session, browserWidth, browserHe
/>
= ({
= ({
},
}}
/>
-
+
AI
@@ -1260,7 +1260,7 @@ const BrowserCard: React.FC = ({
placeholder="Search Google or enter URL..."
sx={{
flex: 1,
- fontSize: '0.74rem',
+ fontSize: '0.75rem',
fontFamily: c.font.mono,
color: CHROME_TEXT,
py: 0,
@@ -1330,7 +1330,7 @@ const BrowserCard: React.FC = ({
bgcolor: c.bg.surface,
}}
>
-
+
{activeTitle || activeUrl}
@@ -1379,14 +1379,14 @@ const BrowserCard: React.FC = ({
bgcolor: c.bg.surface,
}}
>
-
+
{endingState?.status === 'error' ? 'Task ended with an error.' : 'Task done.'}
dispatch(cancelBrowserCardEnding(browserId))}
sx={{
textTransform: 'none',
- fontSize: '0.82rem',
+ fontSize: '0.8125rem',
fontWeight: 600,
bgcolor: c.accent.primary,
color: '#fff',
@@ -1414,7 +1414,7 @@ const BrowserCard: React.FC = ({
bgcolor: c.bg.surface,
}}
>
-
+
This page stopped responding.
= ({
startIcon={}
sx={{
textTransform: 'none',
- fontSize: '0.82rem',
+ fontSize: '0.8125rem',
fontWeight: 600,
bgcolor: c.accent.primary,
color: '#fff',
@@ -1455,7 +1455,7 @@ const BrowserCard: React.FC = ({
Passkeys aren't supported
-
+
Sorry, OpenSwarm doesn't support passkeys. Please sign in with a password or another method.
@@ -1464,7 +1464,7 @@ const BrowserCard: React.FC = ({
onClick={() => setPasskeyDialogOpen(false)}
sx={{
textTransform: 'none',
- fontSize: '0.82rem',
+ fontSize: '0.8125rem',
fontWeight: 600,
bgcolor: c.accent.primary,
color: '#fff',
diff --git a/frontend/src/app/pages/Dashboard/cards/DashboardViewCard.tsx b/frontend/src/app/pages/Dashboard/cards/DashboardViewCard.tsx
index e5bd3ac3..32dbb972 100644
--- a/frontend/src/app/pages/Dashboard/cards/DashboardViewCard.tsx
+++ b/frontend/src/app/pages/Dashboard/cards/DashboardViewCard.tsx
@@ -121,9 +121,9 @@ const BootingBody: React.FC = () => {
},
}}
/>
- Starting preview
+ Starting preview
-
+
First run sets the app up, this can take a moment.
@@ -642,7 +642,7 @@ const DashboardViewCard: React.FC = ({
= ({
{output.name}
{instance > 1 && (
-
+
#{instance}
)}
@@ -845,10 +845,10 @@ const DashboardViewCard: React.FC = ({
>
-
+
Reset & Hard Reload
-
+
Restart backend.py + reload preview
@@ -895,7 +895,7 @@ const BuildingOverlay: React.FC<{ show: boolean }> = ({ show }) => {
},
}}
/>
-
+
Building…
@@ -993,14 +993,14 @@ const DashboardOutputPreview: React.FC<{
textAlign: 'center',
}}
>
-
+
This app's files are missing.
void removeViewCardCleanly(cardKey ?? output.id, dispatch)}
sx={{
color: tokens.accent.primary,
- fontSize: '0.85rem',
+ fontSize: '0.875rem',
fontWeight: 600,
cursor: 'pointer',
'&:hover': { textDecoration: 'underline' },
@@ -1031,8 +1031,8 @@ const DashboardOutputPreview: React.FC<{
- {output.name || 'Your app'}
- Built for you, click to open
+ {output.name || 'Your app'}
+ Built for you, click to open
);
}
@@ -1042,7 +1042,7 @@ const DashboardOutputPreview: React.FC<{
) : (
- {output.name || 'App'}
+ {output.name || 'App'}
)}
diff --git a/frontend/src/app/pages/Dashboard/cards/NoteCard.tsx b/frontend/src/app/pages/Dashboard/cards/NoteCard.tsx
index 267b3c9f..9f0827a8 100644
--- a/frontend/src/app/pages/Dashboard/cards/NoteCard.tsx
+++ b/frontend/src/app/pages/Dashboard/cards/NoteCard.tsx
@@ -345,7 +345,7 @@ const NoteCard: React.FC = ({
handleRemove()} onMinimize={onMinimize} onTile={onTile} tiled={!!tileZone} fullscreen={tileZone === 'fullscreen'} />
{isMinimized && (
-
+
{content.trim() || 'Note'}
)}
diff --git a/frontend/src/app/pages/Dashboard/cards/WindowControls.tsx b/frontend/src/app/pages/Dashboard/cards/WindowControls.tsx
index 7dd0fd03..b1caf31e 100644
--- a/frontend/src/app/pages/Dashboard/cards/WindowControls.tsx
+++ b/frontend/src/app/pages/Dashboard/cards/WindowControls.tsx
@@ -118,7 +118,7 @@ function WindowControls({ onClose, onMinimize, onTile, tiled, fullscreen, noTile
}}>
{GROUPS.map((g) => (
- {g.label}
+ {g.label}
{g.zones.map((zone) => {
const z = TILE_ZONES[zone];
diff --git a/frontend/src/app/pages/Dashboard/controls/CanvasControls.tsx b/frontend/src/app/pages/Dashboard/controls/CanvasControls.tsx
index db8fab0e..cf0e7b4d 100644
--- a/frontend/src/app/pages/Dashboard/controls/CanvasControls.tsx
+++ b/frontend/src/app/pages/Dashboard/controls/CanvasControls.tsx
@@ -140,7 +140,7 @@ const CanvasControls: React.FC = ({ zoom, actions, onFitToView, onTidy, o
onClick={onFitToView}
data-onboarding="canvas-fit-to-view"
sx={{
- fontSize: '0.72rem',
+ fontSize: '0.75rem',
fontWeight: 500,
color: 'rgba(255,255,255,0.78)',
minWidth: 38,
diff --git a/frontend/src/app/pages/Dashboard/controls/CardSearchPalette.tsx b/frontend/src/app/pages/Dashboard/controls/CardSearchPalette.tsx
index b961f40c..2445e758 100644
--- a/frontend/src/app/pages/Dashboard/controls/CardSearchPalette.tsx
+++ b/frontend/src/app/pages/Dashboard/controls/CardSearchPalette.tsx
@@ -159,7 +159,7 @@ const CardSearchPalette: React.FC = ({
>
{/* Search input */}
-
+
= ({
placeholder="Search cards..."
fullWidth
sx={{
- fontSize: '0.9375rem',
+ fontSize: '0.875rem',
fontFamily: c.font.sans,
color: c.text.primary,
'& input::placeholder': { color: c.text.muted, opacity: 1 },
diff --git a/frontend/src/app/pages/Dashboard/controls/DirectionHints.tsx b/frontend/src/app/pages/Dashboard/controls/DirectionHints.tsx
index b251eb8b..c514038f 100644
--- a/frontend/src/app/pages/Dashboard/controls/DirectionHints.tsx
+++ b/frontend/src/app/pages/Dashboard/controls/DirectionHints.tsx
@@ -72,7 +72,7 @@ const DirectionHints: React.FC = ({ hasLeft, hasRight, hasUp, hasDown, sh
...(shakeDirection === 'left' ? shakingSx('left') : hintSx),
left: 16, top: '50%', transform: 'translateY(-50%)',
}}>
-
+
)}
{showRight && (
@@ -80,7 +80,7 @@ const DirectionHints: React.FC = ({ hasLeft, hasRight, hasUp, hasDown, sh
...(shakeDirection === 'right' ? shakingSx('right') : hintSx),
right: 16, top: '50%', transform: 'translateY(-50%)',
}}>
-
+
)}
{showUp && (
@@ -88,7 +88,7 @@ const DirectionHints: React.FC = ({ hasLeft, hasRight, hasUp, hasDown, sh
...(shakeDirection === 'up' ? shakingSx('up') : hintSx),
top: 16, left: '50%', transform: 'translateX(-50%)',
}}>
-
+
)}
{showDown && (
@@ -96,7 +96,7 @@ const DirectionHints: React.FC = ({ hasLeft, hasRight, hasUp, hasDown, sh
...(shakeDirection === 'down' ? shakingSx('down') : hintSx),
bottom: 56, left: '50%', transform: 'translateX(-50%)',
}}>
-
+
)}
>
diff --git a/frontend/src/app/pages/Dashboard/desktop/AgentNarratorPill.tsx b/frontend/src/app/pages/Dashboard/desktop/AgentNarratorPill.tsx
index 9c942d4f..336b95d5 100644
--- a/frontend/src/app/pages/Dashboard/desktop/AgentNarratorPill.tsx
+++ b/frontend/src/app/pages/Dashboard/desktop/AgentNarratorPill.tsx
@@ -66,7 +66,7 @@ function AgentNarratorPill({ label, running, todos, artifact, browserShot, selec
}}
>
-
+
{label}
@@ -125,7 +125,7 @@ function AgentNarratorPill({ label, running, todos, artifact, browserShot, selec
-
+
Thinking...
diff --git a/frontend/src/app/pages/Dashboard/desktop/ApplicationsWindow.tsx b/frontend/src/app/pages/Dashboard/desktop/ApplicationsWindow.tsx
index 8a21d6be..b1915553 100644
--- a/frontend/src/app/pages/Dashboard/desktop/ApplicationsWindow.tsx
+++ b/frontend/src/app/pages/Dashboard/desktop/ApplicationsWindow.tsx
@@ -36,7 +36,7 @@ function LetterTile({ name }: { name: string }): React.ReactElement {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
- fontSize: '1.3rem',
+ fontSize: '1.375rem',
fontWeight: 700,
color: 'rgba(255,255,255,0.85)',
}}
@@ -123,8 +123,8 @@ function ApplicationsWindow({ onClose }: ApplicationsWindowProps): React.ReactEl
}}
>
- 🐙
-
+ 🐙
+
Applications
@@ -141,7 +141,7 @@ function ApplicationsWindow({ onClose }: ApplicationsWindowProps): React.ReactEl
borderRadius: 999,
flexShrink: 0,
cursor: 'pointer',
- fontSize: '0.72rem',
+ fontSize: '0.75rem',
fontWeight: 500,
color: category === cat ? '#fff' : 'rgba(255,255,255,0.6)',
background: category === cat ? 'rgba(255,255,255,0.18)' : 'rgba(255,255,255,0.08)',
@@ -161,7 +161,7 @@ function ApplicationsWindow({ onClose }: ApplicationsWindowProps): React.ReactEl
)}
{error && (
-
+
Could not read /Applications.
)}
@@ -188,7 +188,7 @@ function ApplicationsWindow({ onClose }: ApplicationsWindowProps): React.ReactEl
) : (
)}
-
+
{name}
diff --git a/frontend/src/app/pages/Dashboard/desktop/DesktopDock.tsx b/frontend/src/app/pages/Dashboard/desktop/DesktopDock.tsx
index 9dd9cb24..ab7c1a13 100644
--- a/frontend/src/app/pages/Dashboard/desktop/DesktopDock.tsx
+++ b/frontend/src/app/pages/Dashboard/desktop/DesktopDock.tsx
@@ -389,11 +389,11 @@ function DesktopDock({
) : (
-
+
{hoveredEntry.label}
{hoveredEntry.snippet && (
-
+
{hoveredEntry.snippet}
)}
diff --git a/frontend/src/app/pages/Dashboard/desktop/DesktopSpawnPill.tsx b/frontend/src/app/pages/Dashboard/desktop/DesktopSpawnPill.tsx
index 62cedf60..664bfb4b 100644
--- a/frontend/src/app/pages/Dashboard/desktop/DesktopSpawnPill.tsx
+++ b/frontend/src/app/pages/Dashboard/desktop/DesktopSpawnPill.tsx
@@ -103,7 +103,7 @@ function DesktopSpawnPill({
}}
>
-
+
{label}
@@ -130,7 +130,7 @@ function DesktopSpawnPill({
>
dispatch(addBrowserCard({ url: HELP_URL }))}
>
-
+
{recording ? 'Listening' : transcribing ? 'Transcribing' : preparing ? `Preparing ${pct}%` : 'Help'}
diff --git a/frontend/src/app/pages/Dashboard/desktop/MinimizedStack.tsx b/frontend/src/app/pages/Dashboard/desktop/MinimizedStack.tsx
index 4b0a675f..f19f866e 100644
--- a/frontend/src/app/pages/Dashboard/desktop/MinimizedStack.tsx
+++ b/frontend/src/app/pages/Dashboard/desktop/MinimizedStack.tsx
@@ -95,7 +95,7 @@ function MinimizedStack({ browserCards, onRestore }: MinimizedStackProps): React
) : (
)}
-
+
{activeTab?.title || 'Browser'}
diff --git a/frontend/src/app/pages/DashboardSelection/DashboardSelection.tsx b/frontend/src/app/pages/DashboardSelection/DashboardSelection.tsx
index b3898b6c..1fd61b8d 100644
--- a/frontend/src/app/pages/DashboardSelection/DashboardSelection.tsx
+++ b/frontend/src/app/pages/DashboardSelection/DashboardSelection.tsx
@@ -159,7 +159,7 @@ const DashboardSelection: React.FC = () => {
Dashboards
-
+
Monitor and manage your agents from a single workspace.
@@ -212,10 +212,10 @@ const DashboardSelection: React.FC = () => {
) : dashboards.length === 0 ? (
-
+
{search ? 'No dashboards match your search' : 'No dashboards yet'}
-
+
{search ? 'Try a different search term' : 'Create your first dashboard to get started'}
@@ -320,7 +320,7 @@ const DashboardSelection: React.FC = () => {
onClick={(e) => e.stopPropagation()}
sx={{
'& .MuiOutlinedInput-root': {
- fontSize: '0.95rem',
+ fontSize: '1rem',
fontWeight: 600,
},
}}
@@ -328,7 +328,7 @@ const DashboardSelection: React.FC = () => {
) : (
= ({ styles }) =>
borderRadius: 2.5,
maxWidth: 360,
};
- const titleSx = { color: c.text.primary, fontSize: '0.95rem', fontWeight: 600, mb: 1 };
- const bodySx = { color: c.text.secondary, fontSize: '0.8rem', lineHeight: 1.5, mb: 2 };
+ const titleSx = { color: c.text.primary, fontSize: '1rem', fontWeight: 600, mb: 1 };
+ const bodySx = { color: c.text.secondary, fontSize: '0.8125rem', lineHeight: 1.5, mb: 2 };
const errSx = { color: c.status.error, fontSize: '0.75rem', mb: 1.5 };
const cancelSx = { color: c.text.secondary, textTransform: 'none', fontWeight: 500 };
const actionRowSx = { display: 'flex', justifyContent: 'flex-end', gap: 1 };
@@ -98,7 +98,7 @@ const DataPrivacySection: React.FC<{ styles: SettingsStyles }> = ({ styles }) =>
color: c.text.secondary,
borderColor: c.border.medium,
textTransform: 'none' as const,
- fontSize: '0.8rem',
+ fontSize: '0.8125rem',
whiteSpace: 'nowrap' as const,
'&:hover': { color: c.accent.primary, borderColor: c.accent.primary },
};
@@ -180,7 +180,7 @@ const DataPrivacySection: React.FC<{ styles: SettingsStyles }> = ({ styles }) =>
size="small"
autoFocus
disabled={busy}
- sx={{ mb: 2, '& .MuiOutlinedInput-root': { fontSize: '0.8rem' } }}
+ sx={{ mb: 2, '& .MuiOutlinedInput-root': { fontSize: '0.8125rem' } }}
/>
{err && {err}}
diff --git a/frontend/src/app/pages/Settings/sections/general/GeneralAdvanced.tsx b/frontend/src/app/pages/Settings/sections/general/GeneralAdvanced.tsx
index 42b4af45..b731ce06 100644
--- a/frontend/src/app/pages/Settings/sections/general/GeneralAdvanced.tsx
+++ b/frontend/src/app/pages/Settings/sections/general/GeneralAdvanced.tsx
@@ -123,7 +123,7 @@ const GeneralAdvanced: React.FC<{
color: c.text.secondary,
borderColor: c.border.medium,
textTransform: 'none',
- fontSize: '0.8rem',
+ fontSize: '0.8125rem',
whiteSpace: 'nowrap',
'&:hover': { color: c.accent.primary, borderColor: c.accent.primary },
}}
diff --git a/frontend/src/app/pages/Settings/sections/general/GeneralAgentDefaults.tsx b/frontend/src/app/pages/Settings/sections/general/GeneralAgentDefaults.tsx
index d02e9658..9e8b0ef7 100644
--- a/frontend/src/app/pages/Settings/sections/general/GeneralAgentDefaults.tsx
+++ b/frontend/src/app/pages/Settings/sections/general/GeneralAgentDefaults.tsx
@@ -72,7 +72,7 @@ const GeneralAgentDefaults: React.FC<{
sx={{
'& .MuiOutlinedInput-root': {
fontFamily: c.font.mono,
- fontSize: '0.8rem',
+ fontSize: '0.8125rem',
lineHeight: 1.6,
color: c.text.secondary,
},
@@ -110,7 +110,7 @@ const GeneralAgentDefaults: React.FC<{
textTransform: 'none',
whiteSpace: 'nowrap',
minWidth: 'auto',
- fontSize: '0.8rem',
+ fontSize: '0.8125rem',
'&:hover': { color: c.accent.primary, borderColor: c.accent.primary },
}}
>
@@ -128,7 +128,7 @@ const GeneralAgentDefaults: React.FC<{
);
@@ -94,7 +94,7 @@ const BrowserLoginConnect: React.FC = ({ ig, isDisabled }) => {
size="small"
variant="outlined"
startIcon={}
- sx={{ borderColor: `${ig.color}40`, color: ig.color, '&:hover': { borderColor: ig.color, bgcolor: `${ig.color}10` }, textTransform: 'none', fontSize: '0.78rem', borderRadius: 1.5, py: 0.5, flexShrink: 0 }}
+ sx={{ borderColor: `${ig.color}40`, color: ig.color, '&:hover': { borderColor: ig.color, bgcolor: `${ig.color}10` }, textTransform: 'none', fontSize: '0.75rem', borderRadius: 1.5, py: 0.5, flexShrink: 0 }}
>
{ig.connectLabel || 'Sign in'}
diff --git a/frontend/src/app/pages/Tools/cards/BrowserPermissionCard.tsx b/frontend/src/app/pages/Tools/cards/BrowserPermissionCard.tsx
index 5fb2ce38..3e9c5c68 100644
--- a/frontend/src/app/pages/Tools/cards/BrowserPermissionCard.tsx
+++ b/frontend/src/app/pages/Tools/cards/BrowserPermissionCard.tsx
@@ -63,10 +63,10 @@ const BrowserPermissionCard: React.FC = ({
- Browser
-
+ Browser
+
- Browser automation delegation and individual browser tools
+ Browser automation delegation and individual browser tools
e.stopPropagation()}>
= ({
- Tool Permissions
-
+ Tool Permissions
+
@@ -109,8 +109,8 @@ const BrowserPermissionCard: React.FC = ({
>
- Delegation
-
+ Delegation
+
e.stopPropagation()}>
handleBuiltinCategoryPermissionChange(browserDelegationTools.map((t) => t.name), 'always_allow')} sx={{ p: 0.4, borderRadius: 1, bgcolor: groupPolicy === 'always_allow' ? `${c.status.success}20` : 'transparent', color: groupPolicy === 'always_allow' ? c.status.success : c.text.ghost, '&:hover': { bgcolor: `${c.status.success}15`, color: c.status.success } }}>
@@ -125,8 +125,8 @@ const BrowserPermissionCard: React.FC = ({
return (
- {bt.display_name || bt.name}
- {bt.description && {bt.description}}
+ {bt.display_name || bt.name}
+ {bt.description && {bt.description}}
e.stopPropagation()}>
handleBuiltinPermissionChange(bt.name, 'always_allow')} sx={{ p: 0.4, borderRadius: 1, bgcolor: toolPolicy === 'always_allow' ? `${c.status.success}20` : 'transparent', color: toolPolicy === 'always_allow' ? c.status.success : c.text.ghost, '&:hover': { bgcolor: `${c.status.success}15`, color: c.status.success } }}>
@@ -156,8 +156,8 @@ const BrowserPermissionCard: React.FC = ({
>
- Browser Tools
-
+ Browser Tools
+
e.stopPropagation()}>
handleBuiltinCategoryPermissionChange(browserActionTools.map((t) => t.name), 'always_allow')} sx={{ p: 0.4, borderRadius: 1, bgcolor: groupPolicy === 'always_allow' ? `${c.status.success}20` : 'transparent', color: groupPolicy === 'always_allow' ? c.status.success : c.text.ghost, '&:hover': { bgcolor: `${c.status.success}15`, color: c.status.success } }}>
@@ -172,8 +172,8 @@ const BrowserPermissionCard: React.FC = ({
return (
- {bt.display_name || bt.name}
- {bt.description && {bt.description}}
+ {bt.display_name || bt.name}
+ {bt.description && {bt.description}}
e.stopPropagation()}>
handleBuiltinPermissionChange(bt.name, 'always_allow')} sx={{ p: 0.4, borderRadius: 1, bgcolor: toolPolicy === 'always_allow' ? `${c.status.success}20` : 'transparent', color: toolPolicy === 'always_allow' ? c.status.success : c.text.ghost, '&:hover': { bgcolor: `${c.status.success}15`, color: c.status.success } }}>
diff --git a/frontend/src/app/pages/Tools/cards/CustomToolCard.tsx b/frontend/src/app/pages/Tools/cards/CustomToolCard.tsx
index d6c7da39..ea28cb84 100644
--- a/frontend/src/app/pages/Tools/cards/CustomToolCard.tsx
+++ b/frontend/src/app/pages/Tools/cards/CustomToolCard.tsx
@@ -111,7 +111,7 @@ const CustomToolCard: React.FC = ({
{ig && (
{ig.icon}
@@ -119,23 +119,23 @@ const CustomToolCard: React.FC = ({
)}
- {tool.name}
+ {tool.name}
{isMcp && } label={isStdio ? 'MCP · stdio' : 'MCP'} size="small" sx={{ bgcolor: `${c.status.warning}20`, color: c.status.warning, fontSize: '0.75rem', height: 24 }} />}
- {tool.command && } label={`/${tool.command}`} size="small" sx={{ bgcolor: 'rgba(174,86,48,0.12)', color: c.accent.hover, fontSize: '0.72rem', height: 22 }} />}
+ {tool.command && } label={`/${tool.command}`} size="small" sx={{ bgcolor: 'rgba(174,86,48,0.12)', color: c.accent.hover, fontSize: '0.75rem', height: 22 }} />}
{tool.auth_status === 'connected' && !ig && (
- } label={tool.connected_account_email ? `Connected · ${tool.connected_account_email}` : 'Connected'} size="small" sx={{ bgcolor: c.status.successBg, color: c.status.success, fontSize: '0.7rem', height: 20, '& .MuiChip-icon': { color: c.status.success } }} />
+ } label={tool.connected_account_email ? `Connected · ${tool.connected_account_email}` : 'Connected'} size="small" sx={{ bgcolor: c.status.successBg, color: c.status.success, fontSize: '0.6875rem', height: 20, '& .MuiChip-icon': { color: c.status.success } }} />
)}
{tool.auth_status === 'configured' && !ig?.credentialFields && (
- } label="Configured" size="small" sx={{ bgcolor: c.status.warningBg, color: c.status.warning, fontSize: '0.7rem', height: 20, '& .MuiChip-icon': { color: c.status.warning } }} />
+ } label="Configured" size="small" sx={{ bgcolor: c.status.warningBg, color: c.status.warning, fontSize: '0.6875rem', height: 20, '& .MuiChip-icon': { color: c.status.warning } }} />
)}
{ig && totalToolCount > 0 && (
-
+
)}
{ig && (
- } label="docs" size="small" sx={{ bgcolor: c.bg.secondary, color: c.text.ghost, fontSize: '0.65rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, fontSize: 10 } }} />
+ } label="docs" size="small" sx={{ bgcolor: c.bg.secondary, color: c.text.ghost, fontSize: '0.625rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, fontSize: 10 } }} />
)}
- {tool.description && {tool.description}}
+ {tool.description && {tool.description}}
= ({
- Tool Permissions
- {hasPerms && }
+ Tool Permissions
+ {hasPerms && }
{hasPerms && (
<>
- handleBulkReadOnly(tool.id)} sx={{ color: c.status.info, textTransform: 'none', fontSize: '0.7rem', minWidth: 'auto', px: 1, py: 0.25 }}>
+ handleBulkReadOnly(tool.id)} sx={{ color: c.status.info, textTransform: 'none', fontSize: '0.6875rem', minWidth: 'auto', px: 1, py: 0.25 }}>
Allow reads
- handleResetPermissions(tool.id)} sx={{ color: c.text.ghost, textTransform: 'none', fontSize: '0.7rem', minWidth: 'auto', px: 1, py: 0.25 }}>
+ handleResetPermissions(tool.id)} sx={{ color: c.text.ghost, textTransform: 'none', fontSize: '0.6875rem', minWidth: 'auto', px: 1, py: 0.25 }}>
Reset
@@ -224,19 +224,19 @@ const CustomToolCard: React.FC = ({
{!hasPerms ? (
- No tools discovered yet
+ No tools discovered yet
: }
onClick={() => handleDiscover(tool.id)}
disabled={discovering || !canDiscover}
- sx={{ borderColor: c.border.medium, color: c.text.secondary, '&:hover': { borderColor: c.accent.primary, color: c.accent.primary }, textTransform: 'none', fontSize: '0.78rem', borderRadius: 1.5 }}
+ sx={{ borderColor: c.border.medium, color: c.text.secondary, '&:hover': { borderColor: c.accent.primary, color: c.accent.primary }, textTransform: 'none', fontSize: '0.75rem', borderRadius: 1.5 }}
>
Discover Tools
{!canDiscover && (
- Add an MCP configuration to enable tool discovery
+ Add an MCP configuration to enable tool discovery
)}
) : (
diff --git a/frontend/src/app/pages/Tools/cards/CustomToolConnect.tsx b/frontend/src/app/pages/Tools/cards/CustomToolConnect.tsx
index 9b26064e..29d13214 100644
--- a/frontend/src/app/pages/Tools/cards/CustomToolConnect.tsx
+++ b/frontend/src/app/pages/Tools/cards/CustomToolConnect.tsx
@@ -40,7 +40,7 @@ const CustomToolConnect: React.FC = ({
variant="outlined"
startIcon={}
onClick={(e) => { e.stopPropagation(); handleOAuthConnect(tool.id); }}
- sx={{ borderColor: `${c.status.info}40`, color: c.status.info, '&:hover': { borderColor: c.status.info, bgcolor: `${c.status.info}10` }, textTransform: 'none', fontSize: '0.78rem', borderRadius: 1.5, py: 0.5, flexShrink: 0 }}
+ sx={{ borderColor: `${c.status.info}40`, color: c.status.info, '&:hover': { borderColor: c.status.info, bgcolor: `${c.status.info}10` }, textTransform: 'none', fontSize: '0.75rem', borderRadius: 1.5, py: 0.5, flexShrink: 0 }}
>
{ig?.id === 'discord' && tool.auth_status === 'connected' ? 'Add server' : `Connect ${tool.name}`}
@@ -51,7 +51,7 @@ const CustomToolConnect: React.FC = ({
variant="outlined"
startIcon={}
onClick={(e) => { e.stopPropagation(); handleDeviceCodeConnect(tool.id); }}
- sx={{ borderColor: `${ig.color}40`, color: ig.color, '&:hover': { borderColor: ig.color, bgcolor: `${ig.color}10` }, textTransform: 'none', fontSize: '0.78rem', borderRadius: 1.5, py: 0.5, flexShrink: 0 }}
+ sx={{ borderColor: `${ig.color}40`, color: ig.color, '&:hover': { borderColor: ig.color, bgcolor: `${ig.color}10` }, textTransform: 'none', fontSize: '0.75rem', borderRadius: 1.5, py: 0.5, flexShrink: 0 }}
>
Connect Microsoft 365
@@ -62,7 +62,7 @@ const CustomToolConnect: React.FC = ({
variant="outlined"
startIcon={}
onClick={(e) => { e.stopPropagation(); openCredentialsDialog(tool.id, ig); }}
- sx={{ borderColor: `${ig.color}40`, color: ig.color, '&:hover': { borderColor: ig.color, bgcolor: `${ig.color}10` }, textTransform: 'none', fontSize: '0.78rem', borderRadius: 1.5, py: 0.5, flexShrink: 0 }}
+ sx={{ borderColor: `${ig.color}40`, color: ig.color, '&:hover': { borderColor: ig.color, bgcolor: `${ig.color}10` }, textTransform: 'none', fontSize: '0.75rem', borderRadius: 1.5, py: 0.5, flexShrink: 0 }}
>
{ig.connectLabel || 'Connect'}
@@ -75,7 +75,7 @@ const CustomToolConnect: React.FC = ({
size="small"
onDelete={(ig.credentialFields || ig.authType === 'oauth2' || ig.authType === 'device_code') ? (e: React.SyntheticEvent) => { e.stopPropagation(); ig.authType === 'device_code' ? handleM365Disconnect(tool.id) : handleDisconnectIntegration(tool.id, ig); } : undefined}
onClick={(e) => e.stopPropagation()}
- sx={{ bgcolor: c.status.successBg, color: c.status.success, fontSize: '0.7rem', height: 22, '& .MuiChip-icon': { color: c.status.success }, '& .MuiChip-deleteIcon': { color: c.status.success, '&:hover': { color: c.status.error } }, flexShrink: 0 }}
+ sx={{ bgcolor: c.status.successBg, color: c.status.success, fontSize: '0.6875rem', height: 22, '& .MuiChip-icon': { color: c.status.success }, '& .MuiChip-deleteIcon': { color: c.status.success, '&:hover': { color: c.status.error } }, flexShrink: 0 }}
/>
)}
diff --git a/frontend/src/app/pages/Tools/cards/CustomToolDevInfo.tsx b/frontend/src/app/pages/Tools/cards/CustomToolDevInfo.tsx
index 62424010..1f5f9fc9 100644
--- a/frontend/src/app/pages/Tools/cards/CustomToolDevInfo.tsx
+++ b/frontend/src/app/pages/Tools/cards/CustomToolDevInfo.tsx
@@ -9,11 +9,11 @@ const CustomToolDevInfo: React.FC<{ tool: ToolDefinition }> = ({ tool }) => {
const c = useClaudeTokens();
return (
-
+
Developer Info
-
+
MCP Config
@@ -22,25 +22,25 @@ const CustomToolDevInfo: React.FC<{ tool: ToolDefinition }> = ({ tool }) => {
- Auth type:
- {tool.auth_type || 'none'}
+ Auth type:
+ {tool.auth_type || 'none'}
- Status:
- {tool.auth_status || 'none'}
+ Status:
+ {tool.auth_status || 'none'}
{tool.connected_account_email && (
- Account:
- {tool.connected_account_email}
+ Account:
+ {tool.connected_account_email}
)}
{tool.credentials && Object.keys(tool.credentials).length > 0 && (
- Credentials:
+ Credentials:
{Object.keys(tool.credentials).map((key) => (
-
+
))}
)}
diff --git a/frontend/src/app/pages/Tools/cards/IntegrationGalleryCard.tsx b/frontend/src/app/pages/Tools/cards/IntegrationGalleryCard.tsx
index 5b1bcbc1..0779ba92 100644
--- a/frontend/src/app/pages/Tools/cards/IntegrationGalleryCard.tsx
+++ b/frontend/src/app/pages/Tools/cards/IntegrationGalleryCard.tsx
@@ -27,16 +27,16 @@ const IntegrationGalleryCard: React.FC = ({ integra
{ig.icon}
- {ig.name}
- } label="docs" size="small" sx={{ bgcolor: c.bg.secondary, color: c.text.ghost, fontSize: '0.65rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, fontSize: 10 } }} />
+ {ig.name}
+ } label="docs" size="small" sx={{ bgcolor: c.bg.secondary, color: c.text.ghost, fontSize: '0.625rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, fontSize: 10 } }} />
- {ig.description}
+ {ig.description}
= ({
devMode && schema && setExpandedSchema((p) => p === schemaKey ? null : schemaKey)}>
- {toDisplayName(name, serviceName)}
- {descriptions[name] && {firstSentence(descriptions[name])}}
+ {toDisplayName(name, serviceName)}
+ {descriptions[name] && {firstSentence(descriptions[name])}}
handlePermissionChange(tool.id, name, v)} size={14} />
{devMode && expandedSchema === schemaKey && schemaProps && (
- Input Parameters
+ Input Parameters
{Object.entries(schemaProps).map(([pName, pDef]: [string, any]) => (
- {pName}
- {pDef?.type || 'any'}
- {schemaRequired.includes(pName) && }
- {pDef?.description && {pDef.description}}
+ {pName}
+ {pDef?.type || 'any'}
+ {schemaRequired.includes(pName) && }
+ {pDef?.description && {pDef.description}}
))}
@@ -137,8 +137,8 @@ const ServiceGroup: React.FC = ({
>
- {serviceName}
-
+ {serviceName}
+
handleGroupPermissionChange(tool.id, allNames, v)} />
@@ -151,8 +151,8 @@ const ServiceGroup: React.FC = ({
- Read-only
-
+ Read-only
+
handleGroupPermissionChange(tool.id, data.read!, v)} size={14} />
@@ -164,8 +164,8 @@ const ServiceGroup: React.FC = ({
- Write / delete
-
+ Write / delete
+
handleGroupPermissionChange(tool.id, data.write!, v)} size={14} />
diff --git a/frontend/src/app/pages/Tools/cards/ToolSection.tsx b/frontend/src/app/pages/Tools/cards/ToolSection.tsx
index 68597e49..e42778f3 100644
--- a/frontend/src/app/pages/Tools/cards/ToolSection.tsx
+++ b/frontend/src/app/pages/Tools/cards/ToolSection.tsx
@@ -109,13 +109,13 @@ const ToolSection: React.FC = ({
- {label}
-
+ {label}
+
{deferred && (
-
+
)}
- {sectionDescription}
+ {sectionDescription}
e.stopPropagation()}>
= ({
- Tool Permissions
-
+ Tool Permissions
+
@@ -158,8 +158,8 @@ const ToolSection: React.FC = ({
>
- {meta.label}
-
+ {meta.label}
+
onCategoryPermissionChange(catTools.map((t) => t.name), v)} />
@@ -170,8 +170,8 @@ const ToolSection: React.FC = ({
return (
- {bt.display_name || bt.name}
- {bt.description && {firstSentence(bt.description)}}
+ {bt.display_name || bt.name}
+ {bt.description && {firstSentence(bt.description)}}
onPermissionChange(bt.name, v)} size={14} />
diff --git a/frontend/src/app/pages/Tools/dialogs/McpConfigDialog.tsx b/frontend/src/app/pages/Tools/dialogs/McpConfigDialog.tsx
index e353e8c7..7e0d7882 100644
--- a/frontend/src/app/pages/Tools/dialogs/McpConfigDialog.tsx
+++ b/frontend/src/app/pages/Tools/dialogs/McpConfigDialog.tsx
@@ -54,15 +54,15 @@ const McpConfigDialog: React.FC = ({
{mcpConfigServer.iconUrl ? null : (mcpConfigServer.title || cleanServerName(mcpConfigServer.name)).charAt(0).toUpperCase()}
-
+
{mcpConfigServer.title || cleanServerName(mcpConfigServer.name)}
- {mcpConfigServer.description}
+ {mcpConfigServer.description}
)}
@@ -77,7 +77,7 @@ const McpConfigDialog: React.FC = ({
maxRows={8}
error={!!mcpConfigError}
helperText={mcpConfigError || 'Transport config passed to claude_agent_sdk (type, url, command, args, etc.)'}
- sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.page, fontFamily: c.font.mono, fontSize: '0.85rem' } }}
+ sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.page, fontFamily: c.font.mono, fontSize: '0.875rem' } }}
/>
@@ -100,7 +100,7 @@ const McpConfigDialog: React.FC = ({
{mcpAuthType !== 'none' && (
-
+
Environment Variables
{Object.entries(mcpCredentials).map(([key, val]) => (
@@ -112,14 +112,14 @@ const McpConfigDialog: React.FC = ({
fullWidth
size="small"
type={key.toLowerCase().includes('secret') ? 'password' : 'text'}
- sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.elevated, fontFamily: c.font.mono, fontSize: '0.85rem' } }}
+ sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.elevated, fontFamily: c.font.mono, fontSize: '0.875rem' } }}
/>
))}
{mcpAuthType === 'env_vars' && (
setMcpCredentials({ ...mcpCredentials, [`VAR_${Object.keys(mcpCredentials).length + 1}`]: '' })}
- sx={{ color: c.accent.primary, textTransform: 'none', fontSize: '0.78rem', alignSelf: 'flex-start' }}
+ sx={{ color: c.accent.primary, textTransform: 'none', fontSize: '0.75rem', alignSelf: 'flex-start' }}
>
+ Add Variable
diff --git a/frontend/src/app/pages/Tools/dialogs/RegistryBrowserDialog.tsx b/frontend/src/app/pages/Tools/dialogs/RegistryBrowserDialog.tsx
index 06c3ccd0..247e66d1 100644
--- a/frontend/src/app/pages/Tools/dialogs/RegistryBrowserDialog.tsx
+++ b/frontend/src/app/pages/Tools/dialogs/RegistryBrowserDialog.tsx
@@ -97,10 +97,10 @@ const RegistryBrowserDialog: React.FC = ({
: `${regStats.total.toLocaleString()} servers`
}
size="small"
- sx={{ bgcolor: c.bg.secondary, color: c.text.muted, fontSize: '0.7rem', height: 20, ml: 'auto' }}
+ sx={{ bgcolor: c.bg.secondary, color: c.text.muted, fontSize: '0.6875rem', height: 20, ml: 'auto' }}
/>
{devMode && regStats.lastUpdated > 0 && (
-
+
Synced {Math.round((Date.now() / 1000 - regStats.lastUpdated) / 60)}m ago
)}
@@ -139,7 +139,7 @@ const RegistryBrowserDialog: React.FC = ({
flexShrink: 0,
'& .MuiToggleButton-root': {
color: c.text.ghost, border: `1px solid ${c.border.medium}`, textTransform: 'none',
- fontSize: '0.72rem', py: 0.5, px: 1.2, lineHeight: 1.4,
+ fontSize: '0.75rem', py: 0.5, px: 1.2, lineHeight: 1.4,
'&.Mui-selected': { bgcolor: c.bg.secondary, color: c.text.primary, borderColor: c.border.strong },
'&:hover': { bgcolor: c.bg.secondary },
},
@@ -180,7 +180,7 @@ const RegistryBrowserDialog: React.FC = ({
) : regServers.length === 0 ? (
- No servers found matching "{regQuery}"
+ No servers found matching "{regQuery}"
) : (
= ({
{regLoading ? : null}
Load More
diff --git a/frontend/src/app/pages/Tools/dialogs/RegistryServerRow.tsx b/frontend/src/app/pages/Tools/dialogs/RegistryServerRow.tsx
index a0955b26..ca94c700 100644
--- a/frontend/src/app/pages/Tools/dialogs/RegistryServerRow.tsx
+++ b/frontend/src/app/pages/Tools/dialogs/RegistryServerRow.tsx
@@ -55,39 +55,39 @@ const RegistryServerRow: React.FC = ({
src={srv.iconUrl || undefined}
sx={{
width: 24, height: 24, flexShrink: 0, bgcolor: c.bg.secondary,
- fontSize: '0.7rem', fontWeight: 700, color: c.text.muted,
+ fontSize: '0.6875rem', fontWeight: 700, color: c.text.muted,
}}
>
{srv.iconUrl ? null : (srv.title || cleanServerName(srv.name)).charAt(0).toUpperCase()}
-
+
{srv.title || cleanServerName(srv.name)}
- {srv.version && }
- {srv.remoteType && }
+ {srv.version && }
+ {srv.remoteType && }
{srv.source === 'google' ? (
- } label="Google" size="small" sx={{ bgcolor: `${c.status.info}15`, color: c.status.info, fontSize: '0.65rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, color: c.status.info } }} />
+ } label="Google" size="small" sx={{ bgcolor: `${c.status.info}15`, color: c.status.info, fontSize: '0.625rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, color: c.status.info } }} />
) : (
- } label="Community" size="small" sx={{ bgcolor: 'rgba(174,86,48,0.08)', color: c.accent.primary, fontSize: '0.65rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, color: c.accent.primary } }} />
+ } label="Community" size="small" sx={{ bgcolor: 'rgba(174,86,48,0.08)', color: c.accent.primary, fontSize: '0.625rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, color: c.accent.primary } }} />
)}
{srv.stars != null && (
-
+
{srv.stars >= 1000 ? `${(srv.stars / 1000).toFixed(1)}k` : srv.stars.toLocaleString()}
)}
{devMode && !srv.remoteType && (
-
+
)}
{isInstalled && (
- } label="Installed" size="small" sx={{ bgcolor: `${c.status.success}15`, color: c.status.success, fontSize: '0.65rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, color: c.status.success } }} />
+ } label="Installed" size="small" sx={{ bgcolor: `${c.status.success}15`, color: c.status.success, fontSize: '0.625rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, color: c.status.success } }} />
)}
-
+
{srv.description}
@@ -96,18 +96,18 @@ const RegistryServerRow: React.FC = ({
-
+
{srv.description}
-
+
{srv.name}
{srv.remoteUrl && (
- Endpoint
- {srv.remoteUrl}
+ Endpoint
+ {srv.remoteUrl}
)}
@@ -119,7 +119,7 @@ const RegistryServerRow: React.FC = ({
icon={}
label="Website"
size="small"
- sx={{ bgcolor: c.bg.secondary, color: c.text.muted, fontSize: '0.7rem', height: 22 }}
+ sx={{ bgcolor: c.bg.secondary, color: c.text.muted, fontSize: '0.6875rem', height: 22 }}
/>
)}
{srv.repositoryUrl && (
@@ -130,7 +130,7 @@ const RegistryServerRow: React.FC = ({
icon={}
label="Repository"
size="small"
- sx={{ bgcolor: c.bg.secondary, color: c.text.muted, fontSize: '0.7rem', height: 22 }}
+ sx={{ bgcolor: c.bg.secondary, color: c.text.muted, fontSize: '0.6875rem', height: 22 }}
/>
)}
@@ -145,16 +145,16 @@ const RegistryServerRow: React.FC = ({
{(regDetail.keywords?.length > 0 || regDetail.license) && (
{regDetail.license && (
-
+
)}
{regDetail.keywords?.map((kw) => (
-
+
))}
)}
{regDetail.environmentVariables?.length > 0 && (
-
+
Required Environment Variables
{regDetail.environmentVariables.map((ev) => (
@@ -163,7 +163,7 @@ const RegistryServerRow: React.FC = ({
{ev.name}
{ev.description && (
-
+
{ev.description}
)}
@@ -182,7 +182,7 @@ const RegistryServerRow: React.FC = ({
variant="contained"
startIcon={}
onClick={(e) => { e.stopPropagation(); handleInstall(srv); }}
- sx={{ bgcolor: c.accent.primary, '&:hover': { bgcolor: c.accent.pressed }, textTransform: 'none', fontSize: '0.78rem', borderRadius: 1.5, py: 0.5 }}
+ sx={{ bgcolor: c.accent.primary, '&:hover': { bgcolor: c.accent.pressed }, textTransform: 'none', fontSize: '0.75rem', borderRadius: 1.5, py: 0.5 }}
>
Install
@@ -191,7 +191,7 @@ const RegistryServerRow: React.FC = ({
variant="outlined"
startIcon={}
onClick={(e) => { e.stopPropagation(); handleEditInstall(srv); }}
- sx={{ borderColor: c.border.strong, color: c.text.secondary, '&:hover': { borderColor: c.accent.primary, color: c.text.primary }, textTransform: 'none', fontSize: '0.78rem', borderRadius: 1.5, py: 0.5 }}
+ sx={{ borderColor: c.border.strong, color: c.text.secondary, '&:hover': { borderColor: c.accent.primary, color: c.text.primary }, textTransform: 'none', fontSize: '0.75rem', borderRadius: 1.5, py: 0.5 }}
>
Edit & Install
diff --git a/frontend/src/app/pages/Tools/dialogs/ToolDialogs.tsx b/frontend/src/app/pages/Tools/dialogs/ToolDialogs.tsx
index b27b26da..ede75323 100644
--- a/frontend/src/app/pages/Tools/dialogs/ToolDialogs.tsx
+++ b/frontend/src/app/pages/Tools/dialogs/ToolDialogs.tsx
@@ -110,36 +110,36 @@ const ToolDialogs: React.FC = ({
{deviceCodeStatus === 'loading' && (
- Generating login code...
+ Generating login code...
)}
{deviceCodeStatus === 'awaiting' && (
<>
-
+
Open the link below and enter the code to sign in:
-
+
{deviceCodeUrl}
-
+
{deviceCode}
- Waiting for you to sign in...
+ Waiting for you to sign in...
>
)}
{deviceCodeStatus === 'connected' && (
- Connected successfully!
+ Connected successfully!
)}
{deviceCodeStatus === 'error' && (
-
+
Login failed. Please try again.
)}
@@ -171,13 +171,13 @@ const ToolDialogs: React.FC = ({
{credDialogIntegration?.id === 'slack' ? (
-
+
Click Sign in with Slack below; a Slack window will open. Sign in normally and the window will close automatically once you reach your workspace.
) : (
<>
{credDialogIntegration?.connectInstructions && (
-
+
{credDialogIntegration.connectInstructions}
)}
@@ -191,7 +191,7 @@ const ToolDialogs: React.FC = ({
fullWidth
size="small"
helperText={field.helpText}
- sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.page, fontFamily: c.font.mono, fontSize: '0.85rem' } }}
+ sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.page, fontFamily: c.font.mono, fontSize: '0.875rem' } }}
/>
))}
>
diff --git a/frontend/src/app/pages/Views/AppCodePanel.tsx b/frontend/src/app/pages/Views/AppCodePanel.tsx
index a3b79e95..a0691244 100644
--- a/frontend/src/app/pages/Views/AppCodePanel.tsx
+++ b/frontend/src/app/pages/Views/AppCodePanel.tsx
@@ -101,7 +101,7 @@ const AppCodePanel: React.FC = ({ workspaceId, onFileSaved }) => {
))}
{filePaths.length === 0 && (
-
+
Loading files…
)}
@@ -109,7 +109,7 @@ const AppCodePanel: React.FC = ({ workspaceId, onFileSaved }) => {
{activeFile && oversizeFiles[activeFile] != null ? (
-
+
This file is {(oversizeFiles[activeFile] / (1024 * 1024)).toFixed(1)} MB, too large to edit here.
@@ -123,7 +123,7 @@ const AppCodePanel: React.FC = ({ workspaceId, onFileSaved }) => {
/>
) : (
-
+
Select a file to edit
diff --git a/frontend/src/app/pages/Views/AppFileTree.tsx b/frontend/src/app/pages/Views/AppFileTree.tsx
index 84b80447..99975547 100644
--- a/frontend/src/app/pages/Views/AppFileTree.tsx
+++ b/frontend/src/app/pages/Views/AppFileTree.tsx
@@ -128,7 +128,7 @@ export const FileTreeItem: React.FC = ({ node, depth, activeF
>
-
+
{node.name}
@@ -167,7 +167,7 @@ export const FileTreeItem: React.FC = ({ node, depth, activeF
= ({ outputId, isAgentActive, saveLabel, onB
return (
- History
+ History
}
onClick={handleSave}
disabled={saving || isAgentActive}
- sx={{ textTransform: 'none', fontSize: '0.78rem', color: c.accent.primary, '&:hover': { bgcolor: `${c.accent.primary}12` } }}
+ sx={{ textTransform: 'none', fontSize: '0.75rem', color: c.accent.primary, '&:hover': { bgcolor: `${c.accent.primary}12` } }}
>
{saving ? 'Saving' : 'Save this version'}
@@ -148,7 +148,7 @@ const HistoryPanel: React.FC = ({ outputId, isAgentActive, saveLabel, onB
@@ -164,7 +164,7 @@ const HistoryPanel: React.FC = ({ outputId, isAgentActive, saveLabel, onB
) : versions.length === 0 ? (
-
+
No history yet. Every time you change your app, we'll save a snapshot here so you can go back.
@@ -172,7 +172,7 @@ const HistoryPanel: React.FC = ({ outputId, isAgentActive, saveLabel, onB
<>
- Now (current)
+ Now (current)
{versions.map((v) => (
= ({ outputId, isAgentActive, saveLabel, onB
: }
-
+
{describe(v)}
-
+
{timeAgo(v.created_at)}{v.source === 'manual' ? ' · saved by you' : v.source === 'pre_restore' ? ' · auto-backup' : ''}
@@ -205,7 +205,7 @@ const HistoryPanel: React.FC = ({ outputId, isAgentActive, saveLabel, onB
startIcon={busyId === v.id ? : }
onClick={() => setConfirmId(v.id)}
disabled={!!busyId || isAgentActive}
- sx={{ textTransform: 'none', fontSize: '0.74rem', color: c.text.secondary, minWidth: 0, '&:hover': { bgcolor: `${c.text.primary}08` } }}
+ sx={{ textTransform: 'none', fontSize: '0.75rem', color: c.text.secondary, minWidth: 0, '&:hover': { bgcolor: `${c.text.primary}08` } }}
>
Restore
@@ -214,7 +214,7 @@ const HistoryPanel: React.FC = ({ outputId, isAgentActive, saveLabel, onB
startIcon={}
onClick={() => handleBranch(v.id)}
disabled={!!busyId}
- sx={{ textTransform: 'none', fontSize: '0.74rem', color: c.text.secondary, minWidth: 0, '&:hover': { bgcolor: `${c.text.primary}08` } }}
+ sx={{ textTransform: 'none', fontSize: '0.75rem', color: c.text.secondary, minWidth: 0, '&:hover': { bgcolor: `${c.text.primary}08` } }}
>
Save as new app
@@ -227,10 +227,10 @@ const HistoryPanel: React.FC = ({ outputId, isAgentActive, saveLabel, onB
@@ -589,7 +589,7 @@ function MonthDayOverflow({ date, count, events, now, fontSize, onSelectWorkflow
anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
transformOrigin={{ vertical: 'top', horizontal: 'left' }}>
-
+
{`${events.length} scheduled · ${date.toLocaleString('en', { weekday: 'short', month: 'short', day: 'numeric' })}`}
{events.map((e, idx) => (
@@ -598,8 +598,8 @@ function MonthDayOverflow({ date, count, events, now, fontSize, onSelectWorkflow
onClick={() => { setAnchor(null); onSelectWorkflow?.(e.workflow.id, e.date); }}
sx={{ display: 'flex', alignItems: 'center', gap: 1, px: 0.5, py: 0.5, borderRadius: `${c.radius.md}px`, cursor: 'pointer', '&:hover': { bgcolor: c.bg.elevated } }}>
- {e.workflow.title}
- {formatTime(e.date.getHours(), e.date.getMinutes())}
+ {e.workflow.title}
+ {formatTime(e.date.getHours(), e.date.getMinutes())}
))}
@@ -614,7 +614,7 @@ function EventTooltipBody({ event }: { event: { workflow: Workflow; date: Date }
const cost = wf.cost_estimate?.last_run_usd;
const monthly = wf.cost_estimate?.monthly_usd;
return (
-
+
{wf.title}
{`Fires at ${formatTime(event.date.getHours(), event.date.getMinutes())}`}
{status && {`Last run: ${status}`}
}
diff --git a/frontend/src/app/pages/Workflows/SchedulePopover.tsx b/frontend/src/app/pages/Workflows/SchedulePopover.tsx
index 690cd96f..c0064f95 100644
--- a/frontend/src/app/pages/Workflows/SchedulePopover.tsx
+++ b/frontend/src/app/pages/Workflows/SchedulePopover.tsx
@@ -130,7 +130,7 @@ export default function SchedulePopover({
{!chatHistoryOnly && mode !== 'schedule' && (
{([['search', 'Chat history'], ['runs', 'Scheduled tasks']] as const).map(([m, label]) => (
- onModeChange(m)} role="button" sx={{ fontSize: '0.85rem', fontWeight: mode === m ? 700 : 500, px: 0.75, pt: 0.4, pb: 0.55, color: mode === m ? c.text.primary : c.text.muted, borderBottom: `2px solid ${mode === m ? c.accent.primary : 'transparent'}`, cursor: 'pointer', '&:hover': { color: c.text.primary } }}>{label}
+ onModeChange(m)} role="button" sx={{ fontSize: '0.875rem', fontWeight: mode === m ? 700 : 500, px: 0.75, pt: 0.4, pb: 0.55, color: mode === m ? c.text.primary : c.text.muted, borderBottom: `2px solid ${mode === m ? c.accent.primary : 'transparent'}`, cursor: 'pointer', '&:hover': { color: c.text.primary } }}>{label}
))}
)}
@@ -151,10 +151,10 @@ export default function SchedulePopover({
value={historyQuery}
onChange={(e) => onHistoryQueryChange(e.target.value)}
placeholder="Search past chats..."
- sx={{ flex: 1, fontSize: '0.85rem', color: c.text.primary, '& input::placeholder': { color: c.text.ghost, opacity: 1 } }}
+ sx={{ flex: 1, fontSize: '0.875rem', color: c.text.primary, '& input::placeholder': { color: c.text.ghost, opacity: 1 } }}
/>
{!hideTopChrome && (
-
+
New
@@ -162,13 +162,13 @@ export default function SchedulePopover({
{historyResults.length === 0 && !historyLoading && (
- {historyQuery ? 'No matching chats' : 'No chat history yet'}
+ {historyQuery ? 'No matching chats' : 'No chat history yet'}
)}
{historyResults.map((entry) => {
const hasWorkflow = Boolean(workflowIconMap[entry.id]);
return (
onHistorySelect(entry.id)} sx={{ display: 'flex', alignItems: 'center', gap: 1, px: 1.5, py: 0.9, cursor: 'pointer', '&:hover': { bgcolor: c.bg.elevated } }}>
- {entry.name}
+ {entry.name}
{/* Only annotate chats that became saved workflows.
A small workflow glyph reads as a tag, where the
old single-letter chip read as a random initial. */}
@@ -179,7 +179,7 @@ export default function SchedulePopover({
)}
- {relTime(entry.closed_at)}
+ {relTime(entry.closed_at)}
);
})}
@@ -191,7 +191,7 @@ export default function SchedulePopover({
{allRunsLoading && allRuns.length === 0 ? (
- Loading runs...
+ Loading runs...
) : (
)}
@@ -203,10 +203,10 @@ export default function SchedulePopover({
{(['List', 'Week', 'Month'] as const).map((v) => (
- setCalendarView(v)} role="button" sx={{ fontSize: '0.85rem', fontWeight: calendarView === v ? 700 : 500, px: 0.75, pt: 0.4, pb: 0.55, color: calendarView === v ? c.text.primary : c.text.muted, borderBottom: `2px solid ${calendarView === v ? c.accent.primary : 'transparent'}`, cursor: 'pointer', '&:hover': { color: c.text.primary } }}>{v}
+ setCalendarView(v)} role="button" sx={{ fontSize: '0.875rem', fontWeight: calendarView === v ? 700 : 500, px: 0.75, pt: 0.4, pb: 0.55, color: calendarView === v ? c.text.primary : c.text.muted, borderBottom: `2px solid ${calendarView === v ? c.accent.primary : 'transparent'}`, cursor: 'pointer', '&:hover': { color: c.text.primary } }}>{v}
))}
-
+
Expand
@@ -219,14 +219,14 @@ export default function SchedulePopover({
onClick={() => setRefDate(new Date())}
role="button"
sx={{
- fontSize: '0.78rem', fontWeight: 600, color: c.text.secondary,
+ fontSize: '0.75rem', fontWeight: 600, color: c.text.secondary,
border: `1px solid ${c.border.subtle}`, px: 0.95, py: 0.3,
borderRadius: `${c.radius.md}px`, cursor: 'pointer',
'&:hover': { color: c.text.primary, borderColor: c.border.medium },
}}>Today
- {periodLabel}
+ {periodLabel}
@@ -250,7 +250,7 @@ function ModeChip({ label, icon, active, onClick }: { label: string; icon: React
role="button"
sx={{
display: 'inline-flex', alignItems: 'center', gap: 0.5,
- fontSize: '0.82rem', fontWeight: active ? 700 : 500,
+ fontSize: '0.8125rem', fontWeight: active ? 700 : 500,
px: 1.1, py: 0.45,
cursor: 'pointer',
color: active ? c.text.primary : c.text.muted,
diff --git a/frontend/src/app/pages/Workflows/ScheduleTestWarningDialog.tsx b/frontend/src/app/pages/Workflows/ScheduleTestWarningDialog.tsx
index a53f1012..a7921613 100644
--- a/frontend/src/app/pages/Workflows/ScheduleTestWarningDialog.tsx
+++ b/frontend/src/app/pages/Workflows/ScheduleTestWarningDialog.tsx
@@ -21,7 +21,7 @@ export default function ScheduleTestWarningDialog({ open, onClose, onTestFirst,
{hiddenCount > 0 && (
void }
onClick={onClick}
role="button"
sx={{
- fontSize: '0.86rem', fontWeight: 500, color: c.text.secondary,
+ fontSize: '0.875rem', fontWeight: 500, color: c.text.secondary,
cursor: 'pointer', px: 0.75, py: 0.5,
'&:hover': { color: c.text.primary },
}}>
@@ -171,7 +171,7 @@ export function RunningView({ workflow, steps, runs, mode = 'card' }: {
return (
-
+
{completeCount} of {total} complete
@@ -275,7 +275,7 @@ export function CompletedView({ workflow, steps, runs, mode = 'card' }: {
✓
-
+
{steps.length} of {steps.length} complete
@@ -300,10 +300,10 @@ export function CompletedView({ workflow, steps, runs, mode = 'card' }: {
-
+
Workflow Success!
-
+
If you're curious, you can click the green button below to see exactly what the agent did.
@@ -407,10 +407,10 @@ export function FailedView({ workflow, steps, runs, mode = 'card' }: {
-
+
Fix with an Agent
-
+
Have an agent modify, test, and iterate on the workflow until it works as expected.
@@ -479,7 +479,7 @@ export function useHeaderActions(workflow: Workflow | null, view: string): Heade
dispatch(updateWorkflowCard({ workflowId: workflow.id, patch: { view: 'history' } }))}
role="button"
- sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.4, fontSize: '0.82rem', fontWeight: 600, px: 1, py: 0.4, color: c.text.secondary, cursor: 'pointer', '&:hover': { color: c.text.primary } }}>
+ sx={{ display: 'inline-flex', alignItems: 'center', gap: 0.4, fontSize: '0.8125rem', fontWeight: 600, px: 1, py: 0.4, color: c.text.secondary, cursor: 'pointer', '&:hover': { color: c.text.primary } }}>
History
@@ -488,7 +488,7 @@ export function useHeaderActions(workflow: Workflow | null, view: string): Heade
role="button"
sx={{
display: 'inline-flex', alignItems: 'center', gap: 0.35,
- fontSize: '0.82rem', fontWeight: 700,
+ fontSize: '0.8125rem', fontWeight: 700,
px: 1.1, py: 0.4, borderRadius: 999,
bgcolor: c.accent.primary, color: '#fff', cursor: 'pointer',
'&:hover': { filter: 'brightness(1.05)' },
@@ -502,13 +502,13 @@ export function useHeaderActions(workflow: Workflow | null, view: string): Heade
return {
right: (
<>
-
+
Stop
-
+
Schedule this workflow?
-
+
You can have workflows run on a recurring basis, automatically.
@@ -239,7 +239,7 @@ export function PreviewView({ workflowId, steps, sourceSessionId, initialDraft,
onClick={onIgnore}
role="button"
sx={{
- fontSize: '0.86rem', fontWeight: 500, color: c.text.secondary,
+ fontSize: '0.875rem', fontWeight: 500, color: c.text.secondary,
cursor: busy ? 'wait' : 'pointer', px: 0.75, py: 0.5,
opacity: busy ? 0.6 : 1,
'&:hover': { color: c.text.primary },
@@ -252,7 +252,7 @@ export function PreviewView({ workflowId, steps, sourceSessionId, initialDraft,
title={canSave ? undefined : 'Add at least one step before saving'}
sx={{
display: 'inline-flex', alignItems: 'center', gap: 0.5,
- fontSize: '0.88rem', fontWeight: 700,
+ fontSize: '0.875rem', fontWeight: 700,
px: 1.75, py: 0.6, borderRadius: c.radius.full,
color: '#fff', bgcolor: c.accent.primary,
cursor: busy ? 'wait' : canSave ? 'pointer' : 'not-allowed',
@@ -265,7 +265,7 @@ export function PreviewView({ workflowId, steps, sourceSessionId, initialDraft,
-
+
Schedule this workflow?
-
+
You can have workflows run on a recurring basis, automatically.
@@ -437,7 +437,7 @@ export function SavedView({ workflow, steps, runs, activeRunId }: { workflow: Wo
onClick={onNotNow}
role="button"
sx={{
- fontSize: '0.86rem', fontWeight: 500, color: c.text.secondary,
+ fontSize: '0.875rem', fontWeight: 500, color: c.text.secondary,
cursor: 'pointer', px: 0.75, py: 0.5,
'&:hover': { color: c.text.primary },
}}>
@@ -448,7 +448,7 @@ export function SavedView({ workflow, steps, runs, activeRunId }: { workflow: Wo
role="button"
sx={{
display: 'inline-flex', alignItems: 'center', gap: 0.5,
- fontSize: '0.88rem', fontWeight: 700,
+ fontSize: '0.875rem', fontWeight: 700,
px: 1.75, py: 0.6, borderRadius: c.radius.full,
color: '#fff', bgcolor: c.accent.primary,
cursor: 'pointer',
@@ -467,7 +467,7 @@ export function SavedView({ workflow, steps, runs, activeRunId }: { workflow: Wo
role={scheduleClickable ? 'button' : undefined}
sx={{
display: 'inline-flex', alignItems: 'center', gap: 0.6,
- color: c.text.secondary, fontSize: '0.86rem', minWidth: 0,
+ color: c.text.secondary, fontSize: '0.875rem', minWidth: 0,
cursor: scheduleClickable ? 'pointer' : 'default',
'&:hover': scheduleClickable ? { color: c.text.primary } : {},
}}>
@@ -480,7 +480,7 @@ export function SavedView({ workflow, steps, runs, activeRunId }: { workflow: Wo
role="button"
sx={{
display: 'inline-flex', alignItems: 'center', gap: 0.45,
- fontSize: '0.82rem', fontWeight: 600,
+ fontSize: '0.8125rem', fontWeight: 600,
px: 1.25, py: 0.5,
borderRadius: c.radius.full,
cursor: 'pointer',
@@ -568,7 +568,7 @@ function AuditTraceLink({ workflowId }: { workflowId: string }) {
@@ -583,12 +583,12 @@ function AuditTraceLink({ workflowId }: { workflowId: string }) {
anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
transformOrigin={{ vertical: 'top', horizontal: 'right' }}>
-
+
RECENT EDITS
- {loading && Loading…}
+ {loading && Loading…}
{!loading && (entries === null || entries.length === 0) && (
- No edits yet.
+ No edits yet.
)}
{!loading && entries && entries.map((e, idx) => {
const fields = Object.keys(e.diff || {}).filter((k) => k !== 'updated_at');
@@ -596,10 +596,10 @@ function AuditTraceLink({ workflowId }: { workflowId: string }) {
return (
- {e.who || 'user'}
- {relTimeShort(e.ts)}
+ {e.who || 'user'}
+ {relTimeShort(e.ts)}
- {summary}
+ {summary}
);
})}
@@ -666,20 +666,20 @@ export function HistoryList({ runs, onOpen, showWorkflow = false, workflowTitleF
return out;
}, [filtered]);
if (!runs || runs.length === 0) {
- return No runs yet;
+ return No runs yet;
}
return (
{groups.length > 0 && (
-
+
{groups[0].key.toUpperCase()}
)}
{(['all', 'success', 'failure', 'skipped'] as const).map((k) => (
setFilter(k)} role="button" sx={{
- fontSize: '0.72rem', fontWeight: 600,
+ fontSize: '0.75rem', fontWeight: 600,
color: filter === k ? c.accent.primary : c.text.muted,
bgcolor: filter === k ? c.accent.primary + '14' : 'transparent',
border: `1px solid ${filter === k ? c.accent.primary + '40' : c.border.subtle}`,
@@ -693,7 +693,7 @@ export function HistoryList({ runs, onOpen, showWorkflow = false, workflowTitleF
{groups.map(({ key, runs: gRuns }, gi) => (
{gi > 0 && (
-
+
{key.toUpperCase()}
)}
@@ -705,35 +705,35 @@ export function HistoryList({ runs, onOpen, showWorkflow = false, workflowTitleF
setExpandedId(expanded ? null : r.id)}
sx={{ display: 'flex', alignItems: 'center', gap: 1.25, py: 0.6, px: 0.5, cursor: 'pointer', borderRadius: c.radius.sm, '&:hover': { bgcolor: c.bg.elevated } }}>
-
+
{labelForStatus(r.status)}
{showWorkflow && workflowTitleFor ? (
- {workflowTitleFor(r.workflow_id)}
- {formatRunDate(r.started_at)}
+ {workflowTitleFor(r.workflow_id)}
+ {formatRunDate(r.started_at)}
) : (
- {formatRunDate(r.started_at)}
+ {formatRunDate(r.started_at)}
)}
- {dur && {dur}}
- {r.cost_usd > 0 && ${r.cost_usd.toFixed(4)}}
+ {dur && {dur}}
+ {r.cost_usd > 0 && ${r.cost_usd.toFixed(4)}}
{/* Chevron makes the row read as expandable instead of
static text. Rotates 180° while open so the affordance
stays visible after click. */}
- ▾
+ ▾
{expanded && (
{r.error ? (
- {r.error}
+ {r.error}
) : r.session_id ? (
- { e.stopPropagation(); onOpen(r); }} role="button" sx={{ fontSize: '0.78rem', fontWeight: 600, color: c.accent.primary, cursor: 'pointer', '&:hover': { textDecoration: 'underline' } }}>
+ { e.stopPropagation(); onOpen(r); }} role="button" sx={{ fontSize: '0.75rem', fontWeight: 600, color: c.accent.primary, cursor: 'pointer', '&:hover': { textDecoration: 'underline' } }}>
Click to see the full conversation →
) : (
- No session was recorded for this run.
+ No session was recorded for this run.
)}
)}
@@ -748,20 +748,20 @@ export function HistoryList({ runs, onOpen, showWorkflow = false, workflowTitleF
export function HistoryDetail({ run, onBack }: { run: WorkflowRun | null; onBack: () => void }) {
const c = useClaudeTokens();
- if (!run) return Run not found;
+ if (!run) return Run not found;
return (
- ← back
- {labelForStatus(run.status)}
- {formatRunDate(run.started_at)}
+ ← back
+ {labelForStatus(run.status)}
+ {formatRunDate(run.started_at)}
{run.error && (
- {run.error}
+ {run.error}
)}
- Started {formatRunDate(run.started_at)}, finished {run.finished_at ? formatRunDate(run.finished_at) : 'in progress'}.
+ Started {formatRunDate(run.started_at)}, finished {run.finished_at ? formatRunDate(run.finished_at) : 'in progress'}.
{run.session_id && (
- Session: {run.session_id.slice(0, 8)}
+ Session: {run.session_id.slice(0, 8)}
)}
);
diff --git a/frontend/src/app/pages/Workflows/workflowVisuals.tsx b/frontend/src/app/pages/Workflows/workflowVisuals.tsx
index 7b503fb1..acbd67bd 100644
--- a/frontend/src/app/pages/Workflows/workflowVisuals.tsx
+++ b/frontend/src/app/pages/Workflows/workflowVisuals.tsx
@@ -73,7 +73,7 @@ export function StatusDot({ status }: { status: LastRunStatus | null | undefined
flexShrink: 0,
}}>
-
+
{word}
@@ -115,7 +115,7 @@ export function WeekdayDots({ on_days }: { on_days: number[] }) {
(
{permIcon(t.kind)}
- {i < tiers.length - 1 && →}
+ {i < tiers.length - 1 && →}
))}
@@ -189,7 +189,7 @@ export function ScheduleChip({ workflow }: { workflow: Workflow }) {
role={enabled ? 'button' : undefined}
sx={{
display: 'inline-flex', alignItems: 'center', gap: 0.4,
- fontSize: '0.74rem', fontWeight: 600,
+ fontSize: '0.75rem', fontWeight: 600,
color: enabled ? c.accent.primary : c.text.muted,
bgcolor: enabled ? c.accent.primary + '14' : c.bg.elevated,
border: `1px solid ${enabled ? c.accent.primary + '40' : c.border.subtle}`,
@@ -211,7 +211,7 @@ export function ScheduleChip({ workflow }: { workflow: Workflow }) {
anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
transformOrigin={{ vertical: 'top', horizontal: 'left' }}>
-
+
QUICK TIME EDIT
@@ -223,17 +223,17 @@ export function ScheduleChip({ workflow }: { workflow: Workflow }) {
const isPm = sched.hour >= 12;
patchSched({ hour: (h12 % 12) + (isPm ? 12 : 0) });
}}
- sx={{ fontSize: '0.78rem', '& .MuiSelect-select': { py: 0.4 } }}>
+ sx={{ fontSize: '0.75rem', '& .MuiSelect-select': { py: 0.4 } }}>
{Array.from({ length: 12 }, (_, i) => i + 1).map((h) => (
{h}
))}
- :
+ :
-
+
Saved as you change.
@@ -330,7 +330,7 @@ export function CostChip({ workflow, connectionMode }: { workflow: Workflow; con
function chipSx(c: ReturnType) {
return {
display: 'inline-flex', alignItems: 'center', gap: 0.3,
- fontSize: '0.74rem', fontWeight: 600,
+ fontSize: '0.75rem', fontWeight: 600,
color: c.text.secondary,
bgcolor: c.bg.elevated,
border: `1px solid ${c.border.subtle}`,
@@ -345,7 +345,7 @@ export function LastFiredHint({ workflow }: { workflow: Workflow }) {
const ms = Date.now() - new Date(workflow.last_run_at).getTime();
const ago = relTime(ms);
return (
- Last ran {ago}
+ Last ran {ago}
);
}
@@ -408,7 +408,7 @@ export function StreakBadge({ runs }: { runs: WorkflowRun[] | undefined }) {
{
WebkitBackdropFilter: 'blur(20px) saturate(160%)',
boxShadow: '0 8px 28px rgba(0,0,0,0.4)',
color: 'rgba(255,255,255,0.92)',
- fontSize: '0.82rem',
+ fontSize: '0.8125rem',
fontWeight: 500,
'@keyframes vin': { from: { opacity: 0, transform: 'translate(-50%, 6px)' }, to: { opacity: 1, transform: 'translate(-50%, 0)' } },
animation: 'vin 0.16s ease-out',