History

refactor(web): keep feature component helpers private (#10226)

Julius Marminge committed 2 months ago

Commit 226abe51 parent fdcc49131 files · +46 −79Browse files

Unified · Split

31 files
  1. apps/web/src/components/BranchToolbarEnvModeSelector.tsx +1 −1
  2. apps/web/src/components/ConfirmDialogHost.tsx +1 −1
  3. apps/web/src/components/DiffPanel.tsx +0 −2
  4. apps/web/src/components/EnvironmentMachineIcon.tsx +2 −2
  5. apps/web/src/components/LegacySidebar.tsx +1 −1
  6. apps/web/src/components/ProviderUpdateLaunchNotification.logic.ts +2 −2
  7. apps/web/src/components/Sidebar.logic.ts +4 −11
  8. apps/web/src/components/ThreadCommandSubtitle.tsx +1 −2
  9. apps/web/src/components/chat/ComposerPendingElementContexts.tsx +1 −1
  10. apps/web/src/components/chat/ComposerPendingTerminalContexts.tsx +0 −22
  11. apps/web/src/components/chat/ContextWindowMeter.logic.ts +2 −2
  12. apps/web/src/components/chat/MessagesTimeline.logic.ts +8 −9
  13. apps/web/src/components/chat/externalLinkContextMenu.ts +1 −1
  14. apps/web/src/components/cloud/CloudEnvironmentConnectList.tsx +1 −1
  15. apps/web/src/components/composerFooterLayout.ts +1 −1
  16. apps/web/src/components/files/projectFilesQueryState.ts +1 −1
  17. apps/web/src/components/media/MediaActions.tsx +1 −1
  18. apps/web/src/components/preview/previewAutomationErrors.ts +1 −1
  19. apps/web/src/components/preview/previewMiniPlayerLayout.ts +1 −1
  20. apps/web/src/components/projectScriptEditor.tsx +1 −1
  21. apps/web/src/components/pullRequest/PullRequestCodeTab.tsx +1 −1
  22. apps/web/src/components/pullRequest/pullRequestLinkContextMenu.ts +1 −1
  23. apps/web/src/components/pullRequest/pullRequestList.logic.ts +1 −1
  24. apps/web/src/components/pullRequest/pullRequestListPreferences.ts +1 −1
  25. apps/web/src/components/settings/KeybindingsSettings.logic.ts +1 −1
  26. apps/web/src/components/settings/ProjectSettingsPanel.tsx +3 −3
  27. apps/web/src/components/settings/SettingsSidebarNav.tsx +1 −1
  28. apps/web/src/components/settings/ThemeWireframe.tsx +1 −1
  29. apps/web/src/components/settings/customModelEditor.logic.ts +2 −2
  30. apps/web/src/components/settings/providerDriverMeta.ts +2 −2
  31. apps/web/src/components/settings/themeInspector.ts +1 −1
apps/web/src/components/BranchToolbarEnvModeSelector.tsx+1−1
@@ -18,7 +18,7 @@ import { · 17 unmodified lines
1818 SelectValue,
1919 } from "./ui/select";
2020
21−export const PREVIOUS_WORKTREE_SELECT_VALUE = "previous-worktree";
21+const PREVIOUS_WORKTREE_SELECT_VALUE = "previous-worktree";
2222
2323 interface BranchToolbarEnvModeSelectorProps {
2424 envLocked: boolean;
apps/web/src/components/ConfirmDialogHost.tsx+1−1
@@ -23,7 +23,7 @@ type ConfirmationCopy = { · 22 unmodified lines
2323 readonly description: string | null;
2424 };
2525
26−export function resolveConfirmDialogCopy(message: string): ConfirmationCopy {
26+function resolveConfirmDialogCopy(message: string): ConfirmationCopy {
2727 const normalizedMessage = message.trim();
2828 const lines = normalizedMessage.split("\n");
2929 const questionLineIndex = lines.findIndex((line) => line.trim().endsWith("?"));
apps/web/src/components/DiffPanel.tsx+0−2
@@ -104,8 +104,6 @@ interface DiffPanelProps { · 103 unmodified lines
104104 workspaceMutationId: string | null;
105105 }
106106
107−export { DiffWorkerPoolProvider } from "./DiffWorkerPoolProvider";
108−
109107 export default function DiffPanel({
110108 mode = "inline",
111109 composerDraftTarget,
apps/web/src/components/EnvironmentMachineIcon.tsx+2−2
@@ -23,7 +23,7 @@ function LucideLike(props: SVGProps<SVGSVGElement>) { · 22 unmodified lines
2323 }
2424
2525 /** A Mac mini: squat rounded slab with a front-edge LED. */
26−export function MacMiniIcon(props: SVGProps<SVGSVGElement>) {
26+function MacMiniIcon(props: SVGProps<SVGSVGElement>) {
2727 return (
2828 <LucideLike {...props}>
2929 <rect width="20" height="8" x="2" y="8" rx="2" />
@@ -33,7 +33,7 @@ export function MacMiniIcon(props: SVGProps<SVGSVGElement>) { · 3 unmodified lines
3333 }
3434
3535 /** A Mac Studio: the same slab twice as tall, ports along the front foot. */
36−export function MacStudioIcon(props: SVGProps<SVGSVGElement>) {
36+function MacStudioIcon(props: SVGProps<SVGSVGElement>) {
3737 return (
3838 <LucideLike {...props}>
3939 <rect width="18" height="14" x="3" y="5" rx="2" />
apps/web/src/components/LegacySidebar.tsx+1−1
@@ -354,7 +354,7 @@ interface SidebarThreadRowProps { · 353 unmodified lines
354354 ) => boolean;
355355 }
356356
357−export const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThreadRowProps) {
357+const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThreadRowProps) {
358358 const {
359359 orderedProjectThreadKeys,
360360 isActive,
apps/web/src/components/ProviderUpdateLaunchNotification.logic.ts+2−2
@@ -220,7 +220,7 @@ export function providerUpdateNotificationKey( · 219 unmodified lines
220220 return parts.length > 0 ? parts.join("|") : null;
221221 }
222222
223−export function formatProviderList(providers: ReadonlyArray<Pick<ServerProvider, "driver">>) {
223+function formatProviderList(providers: ReadonlyArray<Pick<ServerProvider, "driver">>) {
224224 const names = providers.map(
225225 (provider) => PROVIDER_DISPLAY_NAMES[provider.driver] ?? provider.driver,
226226 );
@@ -249,7 +249,7 @@ export function shouldShowPrimaryProviderUpdateToast(view: ProviderUpdateToastVi · 22 unmodified lines
249249 return view.phase !== "running";
250250 }
251251
252−export function getProviderUpdateRunningToastView(providerCount: number): ProviderUpdateToastView {
252+function getProviderUpdateRunningToastView(providerCount: number): ProviderUpdateToastView {
253253 return {
254254 phase: "running",
255255 type: "loading",
apps/web/src/components/Sidebar.logic.ts+4−11
@@ -15,7 +15,7 @@ import type { SidebarThreadSummary, Thread } from "../types"; · 14 unmodified lines
1515 import { cn } from "../lib/utils";
1616 import { isLatestTurnSettled } from "../session-logic";
1717
18−export const THREAD_SELECTION_SAFE_SELECTOR = "[data-thread-item], [data-thread-selection-safe]";
18+const THREAD_SELECTION_SAFE_SELECTOR = "[data-thread-item], [data-thread-selection-safe]";
1919 export const THREAD_JUMP_HINT_SHOW_DELAY_MS = 200;
2020 // Visible sidebar rows are prewarmed into the thread-detail cache so opening a
2121 // nearby thread usually reuses an already-hot subscription. Each prewarmed
@@ -23,10 +23,10 @@ export const THREAD_JUMP_HINT_SHOW_DELAY_MS = 200; · 1 unmodified line
2323 // activities, growing as agents work) for as long as the row stays visible,
2424 // so this limit is a direct renderer-heap and server-load multiplier — keep
2525 // it small; cold opens still render instantly from the cached snapshot.
26−export const SIDEBAR_THREAD_PREWARM_LIMIT = 3;
26+const SIDEBAR_THREAD_PREWARM_LIMIT = 3;
2727 // A small buffer keeps the next few rows warm without leasing every row that
2828 // content-visibility leaves mounted below the scroll viewport.
29−export const SIDEBAR_ROW_SUBSCRIPTION_OVERSCAN_PX = 160;
29+const SIDEBAR_ROW_SUBSCRIPTION_OVERSCAN_PX = 160;
3030
3131 export function useSidebarRowSubscriptionLease(isActive: boolean): {
3232 readonly leaseLiveStatus: boolean;
@@ -544,13 +544,6 @@ export function resolveSidebarThreadStatus(thread: SidebarThreadStatusInput): Si · 511 unmodified lines
544544 return "ready";
545545 }
546546
547−/** NaN-safe Date.parse for sort comparators: a malformed timestamp must not
548− poison the whole ordering, so it sinks to the epoch instead. */
549−export function parseTimestampMs(isoDate: string): number {
550− const parsed = Date.parse(isoDate);
551− return Number.isNaN(parsed) ? 0 : parsed;
552−}
553−
554547 /** First VALID timestamp wins: `a ?? b` falls through on null, but a present-
555548 yet-malformed string must also fall through to the next candidate rather
556549 than sink the row to the epoch. */
@@ -567,7 +560,7 @@ export function firstValidTimestampMs( · 10 unmodified lines
567560
568561 /** String twin of firstValidTimestampMs for callers that need the ISO string
569562 (display labels, tick anchors) rather than epoch ms. */
570−export function firstValidTimestamp(
563+function firstValidTimestamp(
571564 ...candidates: ReadonlyArray<string | null | undefined>
572565 ): string | null {
573566 for (const candidate of candidates) {
apps/web/src/components/ThreadCommandSubtitle.tsx+1−2
@@ -15,8 +15,7 @@ export type ThreadCommandSubtitleVariant = · 14 unmodified lines
1515 | "favicon-workspace"
1616 | "favicon-branch-harness";
1717
18−export const THREAD_COMMAND_SUBTITLE_VARIANT: ThreadCommandSubtitleVariant =
19− "favicon-workspace-harness";
18+const THREAD_COMMAND_SUBTITLE_VARIANT: ThreadCommandSubtitleVariant = "favicon-workspace-harness";
2019
2120 export const COMMAND_PALETTE_META_ICON_CLASS = "size-3 shrink-0 text-muted-foreground/70";
2221
apps/web/src/components/chat/ComposerPendingElementContexts.tsx+1−1
@@ -39,7 +39,7 @@ function buildTooltipContent(context: ElementContextDraft): string { · 38 unmodified lines
3939 return lines.join("\n");
4040 }
4141
42−export function ComposerPendingElementContextChip({
42+function ComposerPendingElementContextChip({
4343 context,
4444 onRemove,
4545 }: ComposerPendingElementContextChipProps) {
apps/web/src/components/chat/ComposerPendingTerminalContexts.tsx+0−22
@@ -1,4 +1,3 @@
1−import { cn } from "~/lib/utils";
21 import {
32 type TerminalContextDraft,
43 formatTerminalContextLabel,
@@ -6,11 +5,6 @@ import { · 1 unmodified line
65 } from "~/lib/terminalContext";
76 import { TerminalContextInlineChip } from "./TerminalContextInlineChip";
87
9−interface ComposerPendingTerminalContextsProps {
10− contexts: ReadonlyArray<TerminalContextDraft>;
11− className?: string;
12−}
13−
148 interface ComposerPendingTerminalContextChipProps {
159 context: TerminalContextDraft;
1610 }
@@ -26,19 +20,3 @@ export function ComposerPendingTerminalContextChip({ · 9 unmodified lines
2620
2721 return <TerminalContextInlineChip label={label} tooltipText={tooltipText} expired={expired} />;
2822 }
29−
30−export function ComposerPendingTerminalContexts(props: ComposerPendingTerminalContextsProps) {
31− const { contexts, className } = props;
32−
33− if (contexts.length === 0) {
34− return null;
35− }
36−
37− return (
38− <div className={cn("flex flex-wrap gap-1.5", className)}>
39− {contexts.map((context) => (
40− <ComposerPendingTerminalContextChip key={context.id} context={context} />
41− ))}
42− </div>
43− );
44−}
apps/web/src/components/chat/ContextWindowMeter.logic.ts+2−2
@@ -9,8 +9,8 @@ import { · 8 unmodified lines
99 } from "../../providerInstances";
1010 import { getTriggerDisplayModelName, type ModelEsque } from "./providerIconUtils";
1111
12−export const CLAUDE_RESUME_COMPACTION_MINUTES = 70;
13−export const CLAUDE_RESUME_COMPACTION_TOKENS = 100_000;
12+const CLAUDE_RESUME_COMPACTION_MINUTES = 70;
13+const CLAUDE_RESUME_COMPACTION_TOKENS = 100_000;
1414
1515 export function providerSupportsManualCompaction(
1616 provider: ProviderInstanceEntry | null | undefined,
apps/web/src/components/chat/MessagesTimeline.logic.ts+8−9
@@ -14,7 +14,6 @@ import { · 13 unmodified lines
1414 } from "@t3tools/client-runtime/work-log/presentation";
1515 export {
1616 normalizeCompactToolLabel,
17− summarizeToolGroup,
1817 toolGroupAction,
1918 } from "@t3tools/client-runtime/work-log/presentation";
2019 import {
@@ -31,11 +30,11 @@ import { type ChatMessage, type ProposedPlan, type TurnDiffSummary } from "../.. · 10 unmodified lines
3130 import { type MessageId, type OrchestrationLatestTurn, type TurnId } from "@t3tools/contracts";
3231 import { formatWorkspaceRelativePath } from "../../filePathDisplay";
3332
34−export const TIMELINE_MINIMAP_ITEM_SPACING = 8;
33+const TIMELINE_MINIMAP_ITEM_SPACING = 8;
3534 export const TIMELINE_MINIMAP_MIN_ITEMS = 2;
36−export const TIMELINE_MINIMAP_MAX_HEIGHT_CSS = "calc(100vh - 18rem)";
37−export const TIMELINE_CONTENT_MAX_WIDTH = 768;
38−export const TIMELINE_MINIMAP_PERSISTENT_GUTTER = 48;
35+const TIMELINE_MINIMAP_MAX_HEIGHT_CSS = "calc(100vh - 18rem)";
36+const TIMELINE_CONTENT_MAX_WIDTH = 768;
37+const TIMELINE_MINIMAP_PERSISTENT_GUTTER = 48;
3938
4039 function singleToolCallLabel(entry: WorkLogEntry): string {
4140 const toolPresentation = resolveWorkEntryToolPresentation(entry, "completed");
@@ -145,7 +144,7 @@ export interface TimelineEndState { · 103 unmodified lines
145144 * A small pixel band (instead of the 1px isAtEnd epsilon alone) keeps re-arming
146145 * reliable while streaming content is still growing under the viewport.
147146 */
148−export const TIMELINE_FOLLOW_REARM_THRESHOLD_PX = 40;
147+const TIMELINE_FOLLOW_REARM_THRESHOLD_PX = 40;
149148
150149 export function resolveTimelineIsAtEnd(state: TimelineEndState | undefined): boolean | undefined {
151150 if (!state) {
@@ -207,9 +206,9 @@ export function resolveTimelineMinimapHasPersistentGutter(viewportWidth: number) · 55 unmodified lines
207206 return sideGutter >= TIMELINE_MINIMAP_PERSISTENT_GUTTER;
208207 }
209208
210−export const TIMELINE_MINIMAP_HIT_STRIP_LEFT = 12;
211−export const TIMELINE_MINIMAP_HIT_STRIP_MAX_WIDTH = 40;
212−export const TIMELINE_MINIMAP_EXPANDED_HIT_STRIP_WIDTH = "22rem";
209+const TIMELINE_MINIMAP_HIT_STRIP_LEFT = 12;
210+const TIMELINE_MINIMAP_HIT_STRIP_MAX_WIDTH = 40;
211+const TIMELINE_MINIMAP_EXPANDED_HIT_STRIP_WIDTH = "22rem";
213212
214213 /**
215214 * The minimap overlays the viewport's left edge while the content column is
apps/web/src/components/chat/externalLinkContextMenu.ts+1−1
@@ -35,7 +35,7 @@ const EXTERNAL_LINK_CONTEXT_MENU_ITEMS = [ · 34 unmodified lines
3535 * whole menu with the one item that cannot be honoured is what left a right-click on a link
3636 * showing the platform's cut-and-paste menu instead of a way to copy the link.
3737 */
38−export function externalLinkContextMenuItems(options: {
38+function externalLinkContextMenuItems(options: {
3939 readonly canOpenInPreview: boolean;
4040 readonly threadLinkAction?: "link-to-thread" | "unlink-from-thread" | undefined;
4141 }): readonly ContextMenuItem<ExternalLinkContextMenuAction>[] {
apps/web/src/components/cloud/CloudEnvironmentConnectList.tsx+1−1
@@ -32,7 +32,7 @@ export interface SavedCloudEnvironmentConnection { · 31 unmodified lines
3232 readonly connection: EnvironmentConnectionPresentation;
3333 }
3434
35−export function RemoteEnvironmentRowsSkeleton() {
35+function RemoteEnvironmentRowsSkeleton() {
3636 return (
3737 <div className={ITEM_ROW_CLASSNAME}>
3838 <div className={ITEM_ROW_INNER_CLASSNAME}>
apps/web/src/components/composerFooterLayout.ts+1−1
@@ -1,6 +1,6 @@
11 export const COMPOSER_FOOTER_COMPACT_BREAKPOINT_PX = 620;
22 export const COMPOSER_FOOTER_WIDE_ACTIONS_COMPACT_BREAKPOINT_PX = 780;
3−export const RESTING_COMPOSER_IMAGE_THUMBNAIL_LIMIT = 3;
3+const RESTING_COMPOSER_IMAGE_THUMBNAIL_LIMIT = 3;
44
55 export function getRestingComposerImagePreviewCounts(imageCount: number): {
66 visibleCount: number;
apps/web/src/components/files/projectFilesQueryState.ts+1−1
@@ -33,7 +33,7 @@ interface ProjectQueryState<A> { · 32 unmodified lines
3333 readonly refresh: () => void;
3434 }
3535
36−export function getProjectEntriesQueryAtom(environmentId: EnvironmentId, cwd: string) {
36+function getProjectEntriesQueryAtom(environmentId: EnvironmentId, cwd: string) {
3737 return projectEnvironment.listEntries({ environmentId, input: { cwd } });
3838 }
3939
apps/web/src/components/media/MediaActions.tsx+1−1
@@ -33,7 +33,7 @@ function mediaFileName(source: MediaActionSource): string { · 32 unmodified lines
3333 }
3434
3535 /** Explicit byte operations get fresh capabilities without replacing a player's active source. */
36−export function useMediaActions(source: MediaActionSource) {
36+function useMediaActions(source: MediaActionSource) {
3737 const createAssetUrl = useAtomQueryRunner(assetEnvironment.createUrl, {
3838 reportFailure: false,
3939 refresh: true,
apps/web/src/components/preview/previewAutomationErrors.ts+1−1
@@ -216,7 +216,7 @@ export const PreviewAutomationHostError = Schema.Union([ · 215 unmodified lines
216216 ]);
217217 export type PreviewAutomationHostError = typeof PreviewAutomationHostError.Type;
218218
219−export const isPreviewAutomationHostError = Schema.is(PreviewAutomationHostError);
219+const isPreviewAutomationHostError = Schema.is(PreviewAutomationHostError);
220220
221221 export function serializePreviewAutomationHostError(
222222 error: PreviewAutomationHostError,
apps/web/src/components/preview/previewMiniPlayerLayout.ts+1−1
@@ -4,7 +4,7 @@ export const PREVIEW_MINI_PLAYER_EDGE_GAP = 12; · 3 unmodified lines
44 // The mini-player shell straddles this webview at 47 and 49; dialogs begin at 50.
55 export const PREVIEW_MINI_PLAYER_WEBVIEW_Z_INDEX = 48;
66 export const PREVIEW_MINI_PLAYER_DEFAULT_SIZE = { width: 320, height: 200 } as const;
7−export const PREVIEW_MINI_PLAYER_MIN_SIZE = { width: 240, height: 150 } as const;
7+const PREVIEW_MINI_PLAYER_MIN_SIZE = { width: 240, height: 150 } as const;
88
99 export function clampPreviewMiniPlayerSize(
1010 size: PreviewMiniPlayerSize,
apps/web/src/components/projectScriptEditor.tsx+1−1
@@ -49,7 +49,7 @@ import { Popover, PopoverPopup, PopoverTrigger } from "./ui/popover"; · 48 unmodified lines
4949 import { Switch } from "./ui/switch";
5050 import { Textarea } from "./ui/textarea";
5151
52−export const SCRIPT_ICONS: Array<{ id: ProjectScriptIcon; label: string }> = [
52+const SCRIPT_ICONS: Array<{ id: ProjectScriptIcon; label: string }> = [
5353 { id: "play", label: "Play" },
5454 { id: "test", label: "Test" },
5555 { id: "lint", label: "Lint" },
apps/web/src/components/pullRequest/PullRequestCodeTab.tsx+1−1
@@ -187,7 +187,7 @@ function getReviewPositionAnchor(position: PullRequestReviewPosition): { · 186 unmodified lines
187187 * host sit under the line they were written on, and a new comment joins the review being
188188 * drafted rather than being posted as it is typed.
189189 */
190−export function PullRequestCodeTab({
190+function PullRequestCodeTab({
191191 environmentId,
192192 reference,
193193 detail,
apps/web/src/components/pullRequest/pullRequestLinkContextMenu.ts+1−1
@@ -8,7 +8,7 @@ import { toastManager } from "../ui/toast"; · 7 unmodified lines
88 export type PullRequestLinkContextMenuAction = "copy-link" | "open-external";
99
1010 /** Named for the host rather than "externally": the point is where you will land. */
11−export const OPEN_ON_HOST_LABELS: Partial<Record<string, string>> = {
11+const OPEN_ON_HOST_LABELS: Partial<Record<string, string>> = {
1212 github: "Open on GitHub",
1313 gitlab: "Open on GitLab",
1414 bitbucket: "Open on Bitbucket",
apps/web/src/components/pullRequest/pullRequestList.logic.ts+1−1
@@ -67,7 +67,7 @@ export type PullRequestViewers = PullRequestListResult["viewers"]; · 66 unmodified lines
6767 /** A row plus the environment that read it, where the caller has one to give. */
6868 type ScopedEntry = PullRequestListEntry & { readonly environmentId?: string };
6969
70−export const pullRequestViewerKey = (entry: ScopedEntry): string =>
70+const pullRequestViewerKey = (entry: ScopedEntry): string =>
7171 `${entry.environmentId ?? ""} ${entry.host}`;
7272
7373 const GROUP_LABELS: Record<PullRequestGroupKey, string> = {
apps/web/src/components/pullRequest/pullRequestListPreferences.ts+1−1
@@ -37,7 +37,7 @@ export type PullRequestListPreferencePatch = { · 36 unmodified lines
3737 [Key in keyof PullRequestListPreferences]?: PullRequestListPreferences[Key] | undefined;
3838 };
3939
40−export const DEFAULT_PULL_REQUEST_LIST_PREFERENCES = {
40+const DEFAULT_PULL_REQUEST_LIST_PREFERENCES = {
4141 involvement: "all",
4242 state: "open",
4343 } as const satisfies PullRequestListPreferences;
apps/web/src/components/settings/KeybindingsSettings.logic.ts+1−1
@@ -291,7 +291,7 @@ function titleCaseCommandSegment(segment: string): string { · 290 unmodified lines
291291 return words.join(" ");
292292 }
293293
294−export function normalizeShortcutKeyToken(key: string): string | null {
294+function normalizeShortcutKeyToken(key: string): string | null {
295295 const normalized = key.toLowerCase();
296296 if (
297297 normalized === "meta" ||
apps/web/src/components/settings/ProjectSettingsPanel.tsx+3−3
@@ -127,14 +127,14 @@ const ProjectIconPickerDialog = lazy(() => · 126 unmodified lines
127127 })),
128128 );
129129
130−export const PROJECT_GROUPING_MODE_LABELS: Record<SidebarProjectGroupingMode, string> = {
130+const PROJECT_GROUPING_MODE_LABELS: Record<SidebarProjectGroupingMode, string> = {
131131 repository: "Group by repository",
132132 repository_path: "Group by repository path",
133133 separate: "Keep separate",
134134 };
135135
136136 /** Logical project groups for the settings page, sorted by display name. */
137−export function useSettingsProjectGroups(): SidebarProjectSnapshot[] {
137+function useSettingsProjectGroups(): SidebarProjectSnapshot[] {
138138 const projects = useProjects();
139139 const projectGroupingSettings = useClientSettings(selectProjectGroupingSettings);
140140 const primaryEnvironmentId = usePrimaryEnvironmentId();
@@ -253,7 +253,7 @@ function ProjectSettingsBreadcrumb({ projectKey }: { projectKey: string }) { · 112 unmodified lines
253253 );
254254 }
255255
256−export function ProjectSettingsPanel({ projectKey }: { projectKey: string }) {
256+function ProjectSettingsPanel({ projectKey }: { projectKey: string }) {
257257 const groups = useSettingsProjectGroups();
258258 const navigate = useNavigate();
259259
apps/web/src/components/settings/SettingsSidebarNav.tsx+1−1
@@ -80,7 +80,7 @@ const SETTINGS_SECTION_ICONS: Readonly< · 79 unmodified lines
8080 "/settings/archived": ArchiveIcon,
8181 };
8282
83−export const SETTINGS_NAV_ITEMS: ReadonlyArray<{
83+const SETTINGS_NAV_ITEMS: ReadonlyArray<{
8484 label: string;
8585 to: SettingsPath;
8686 icon: ComponentType<{ className?: string }>;
apps/web/src/components/settings/ThemeWireframe.tsx+1−1
@@ -4,7 +4,7 @@ import type { ThemeCardPreviewColors } from "./ThemePreviewCircles"; · 3 unmodified lines
44 // A simple miniature of the app: sidebar, a short conversation, the
55 // composer, and the orchestrator panel floating over the interface as an
66 // island with horizontal agent rows.
7−export function ThemeWireframePane({
7+function ThemeWireframePane({
88 colors,
99 clip,
1010 }: {
apps/web/src/components/settings/customModelEditor.logic.ts+2−2
@@ -104,7 +104,7 @@ export const DESCRIPTOR_PRESETS_BY_KIND: Partial< · 103 unmodified lines
104104 };
105105
106106 let nextKey = 0;
107−export function newEditorKey(): string {
107+function newEditorKey(): string {
108108 nextKey += 1;
109109 return `k${nextKey}`;
110110 }
@@ -140,7 +140,7 @@ export function emptyEditorChoice(): EditorChoice { · 29 unmodified lines
140140 * by built-in runtime profiles a custom entry does not have, so they are
141141 * dropped rather than stored as a plain option value.
142142 */
143−export function descriptorToEditor(descriptor: ProviderOptionDescriptor): EditorDescriptor {
143+function descriptorToEditor(descriptor: ProviderOptionDescriptor): EditorDescriptor {
144144 const promptInjected = new Set(
145145 descriptor.type === "select" ? (descriptor.promptInjectedValues ?? []) : [],
146146 );
apps/web/src/components/settings/providerDriverMeta.ts+2−2
@@ -43,7 +43,7 @@ export interface ProviderClientDefinition { · 42 unmodified lines
4343 readonly badgeLabel?: string;
4444 }
4545
46−export const PROVIDER_CLIENT_DEFINITIONS: readonly ProviderClientDefinition[] = [
46+const PROVIDER_CLIENT_DEFINITIONS: readonly ProviderClientDefinition[] = [
4747 {
4848 value: ProviderDriverKind.make("codex"),
4949 label: "Codex",
@@ -84,7 +84,7 @@ export const PROVIDER_CLIENT_DEFINITIONS: readonly ProviderClientDefinition[] = · 34 unmodified lines
8484 },
8585 ];
8686
87−export const PROVIDER_CLIENT_DEFINITION_BY_VALUE: Partial<
87+const PROVIDER_CLIENT_DEFINITION_BY_VALUE: Partial<
8888 Record<ProviderDriverKind, ProviderClientDefinition>
8989 > = Object.fromEntries(
9090 PROVIDER_CLIENT_DEFINITIONS.map((definition) => [definition.value, definition]),
apps/web/src/components/settings/themeInspector.ts+1−1
@@ -14,7 +14,7 @@ const THEME_PAINT_KIND_ORDER: ReadonlyArray<ThemePaintKind> = [ · 13 unmodified lines
1414 "foreground",
1515 ];
1616
17−export const THEME_INSPECTOR_MATCH_ATTRIBUTE = "data-theme-inspector-match";
17+const THEME_INSPECTOR_MATCH_ATTRIBUTE = "data-theme-inspector-match";
1818
1919 const THEME_TOKEN_PROBE_ATTRIBUTE = "data-theme-token-probe";
2020 const THEME_TOKEN_PROBE_COLOR = "#01fea7";