chore(toolchain): upgrade Bun to 1.4.4 and migrate console to TanStack Router

This commit is contained in:
root committed 2026-11-06 00:02:36 +08:00
1 parent b44ebc2ba1
commit 3b9376c75a
134 files changed
+893 -692

No files matched your search

+1 -1
View File
@@ -1,10 +1,10 @@
import { ArrowLeft, PanelRightOpen } from "lucide-react";
import { Link, useNavigate, useParams } from "react-router";
import { agentMockEnabled } from "~/api/agent.ts";
import { agentListHref } from "~/components/agent/agent-nav.ts";
import { AgentRunPanel } from "~/components/agent/agent-run-panel.tsx";
import { agentReturnPath, showAgentRunInDrawer } from "~/components/agent/agent-store.ts";
import { Button } from "~/components/ui/button.tsx";
import { Link, useNavigate, useParams } from "~/lib/router-compat.tsx";
// 会话页的右栏:和抽屉里同一个会话组件(顶部状态与统计、会话流、底部输入区);标题与左栏会话列表在外壳 agent.tsx,
// 切换会话不重挂载。子会话在会话流里派出它的位置。
+1 -1
View File
@@ -1,10 +1,10 @@
import { useNavigate } from "react-router";
import { toast } from "sonner";
import { agentMockEnabled, useCreateAgentRun } from "~/api/agent.ts";
import { agentRunHref, DRAFT_PAGE_GOAL, writeDraft } from "~/components/agent/agent-nav.ts";
import { GoalComposer } from "~/components/agent/agent-run-panel.tsx";
import { quickGoalsFor } from "~/components/agent/quick-goals.ts";
import { errorMessage } from "~/lib/api.ts";
import { useNavigate } from "~/lib/router-compat.tsx";
// 智能体会话页的右栏:新对话(和抽屉里同一个组件;标题与左栏会话列表在外壳 agent.tsx)
export default function AgentIndexPage() {
+1 -1
View File
@@ -1,10 +1,10 @@
import { FlaskConical } from "lucide-react";
import { Outlet, useParams } from "react-router";
import { agentMockEnabled } from "~/api/agent.ts";
import { agentRunHref, pageListMemory } from "~/components/agent/agent-nav.ts";
import { AgentSessionList } from "~/components/agent/agent-session-list.tsx";
import { PageHeader } from "~/components/console/page-header.tsx";
import { Button } from "~/components/ui/button.tsx";
import { Outlet, useParams } from "~/lib/router-compat.tsx";
import { cn } from "~/lib/utils.ts";
/**
+1 -1
View File
@@ -1,4 +1,3 @@
import { useSearchParams } from "react-router";
import { PageHeader } from "~/components/console/page-header.tsx";
import {
type ExploreState,
@@ -10,6 +9,7 @@ import {
import { ExploreView } from "~/components/discover/explore-view.tsx";
import { RecommendView } from "~/components/discover/recommend-view.tsx";
import { Tabs, TabsList, TabsTrigger } from "~/components/ui/tabs.tsx";
import { useSearchParams } from "~/lib/router-compat.tsx";
// 发现(对照 MP 推荐 + 探索,docs/porting/moviepilot-discover.md):
// 「推荐」按分区横排 TMDB / 豆瓣 / Bangumi 的热门与榜单,每区「查看全部」带参数切到「探索」;
+1 -1
View File
@@ -3,7 +3,6 @@ import type { DownloadBoardItem, DownloadBoardRow, DownloadBoardState, DownloadT
import { EventType } from "@umt/contracts";
import { RefreshCw } from "lucide-react";
import { type ReactNode, useEffect, useMemo, useRef, useState } from "react";
import { useSearchParams } from "react-router";
import { useBoardPlanRow, useDownloadBoard, useDownloadTask, usePlan } from "~/api/downloads.ts";
import { isMissingEndpoint } from "~/api/parse.ts";
import { type DataColumn, DataTable } from "~/components/console/data-table.tsx";
@@ -25,6 +24,7 @@ import { DownloadDetail } from "~/components/downloads/download-detail.tsx";
import { DROPPED_STATUS, droppedReason } from "~/components/downloads/plan-format.ts";
import { PlanDetail, WhySection } from "~/components/downloads/plan-row.tsx";
import { Button } from "~/components/ui/button.tsx";
import { useSearchParams } from "~/lib/router-compat.tsx";
import { useSse } from "~/lib/sse.ts";
export const meta = () => [{ title: "下载面板 · UHD 媒体自动化控制台" }];
+1 -1
View File
@@ -35,7 +35,6 @@ import {
X,
} from "lucide-react";
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { useNavigate, useSearchParams } from "react-router";
import { toast } from "sonner";
import { useSession } from "~/api/auth.ts";
import {
@@ -102,6 +101,7 @@ import { SegmentedControl } from "~/components/ui/segmented.tsx";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "~/components/ui/select.tsx";
import { Sheet, SheetContent, SheetHeader, SheetTitle } from "~/components/ui/sheet.tsx";
import { relTime } from "~/components/workbench/release-fields.ts";
import { useNavigate, useSearchParams } from "~/lib/router-compat.tsx";
import { useSse } from "~/lib/sse.ts";
import { cn, formatBytes } from "~/lib/utils.ts";
+1 -1
View File
@@ -14,7 +14,6 @@ import {
} from "lucide-react";
import type { ReactNode } from "react";
import { useRef } from "react";
import { Link } from "react-router";
import { toast } from "sonner";
import { useAttention } from "~/api/attention.ts";
import { useDashboard, useSitesWithAccounts } from "~/api/dashboard.ts";
@@ -34,6 +33,7 @@ import { Button } from "~/components/ui/button.tsx";
import { errorMessage } from "~/lib/api.ts";
import { formatRelative } from "~/lib/labels.ts";
import { qk } from "~/lib/query-keys.ts";
import { Link } from "~/lib/router-compat.tsx";
import { useSse } from "~/lib/sse.ts";
import { cn } from "~/lib/utils.ts";
+2 -2
View File
@@ -1,7 +1,6 @@
import type { SessionInfo } from "@umt/contracts";
import { Clapperboard, LoaderCircle, Menu, PanelLeftClose, PanelLeftOpen } from "lucide-react";
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
import { Link, Outlet, useLocation, useMatches } from "react-router";
import { useSession } from "~/api/auth.ts";
import { AgentDrawer, AgentDrawerTrigger } from "~/components/agent/agent-drawer.tsx";
import { outletKey } from "~/components/agent/agent-store.ts";
@@ -18,6 +17,7 @@ import { ThemeToggle } from "~/components/theme-toggle.tsx";
import { Button } from "~/components/ui/button.tsx";
import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from "~/components/ui/sheet.tsx";
import { redirectToLogin } from "~/lib/api.ts";
import { Link, Outlet, useLocation } from "~/lib/router-compat.tsx";
import { cn } from "~/lib/utils.ts";
const PORTAL_NAME = "媒体自动化";
@@ -173,7 +173,7 @@ function ConsoleShell({ session }: { session: SessionInfo }) {
const [sheetOpen, setSheetOpen] = useState(false);
const activeLabel = pageTitle(location.pathname) ?? PORTAL_NAME;
// 路由 handle.layout === "wide"(文件管理):内容区不限最大宽度、不留外边距,页面自己排版
const wide = useMatches().some((m) => (m.handle as { layout?: string } | undefined)?.layout === "wide");
const wide = location.pathname === "/console/files";
return (
<div className="app-scrollbars relative isolate flex min-h-screen overflow-x-clip bg-background">
+1 -1
View File
@@ -27,7 +27,6 @@ import {
Tv,
} from "lucide-react";
import { useMemo, useState } from "react";
import { Link, useParams } from "react-router";
import { toast } from "sonner";
import { mediaServers } from "~/api/instances.ts";
import {
@@ -94,6 +93,7 @@ import { CELL_LABEL, type CellKind, cellKind } from "~/components/subscriptions/
import { SubscriptionFormDialog } from "~/components/subscriptions/subscription-form.tsx";
import { Button } from "~/components/ui/button.tsx";
import { errorMessage } from "~/lib/api.ts";
import { Link, useParams } from "~/lib/router-compat.tsx";
import { useUiPrefs } from "~/lib/ui-prefs.ts";
import { cn, formatBytes, formatDateTime } from "~/lib/utils.ts";
+1 -1
View File
@@ -1,7 +1,6 @@
import type { LibraryItem, LibraryListQuery, MediaKind, SlotStatus } from "@umt/contracts";
import { Download, Library as LibraryIcon, RotateCw } from "lucide-react";
import { useDeferredValue } from "react";
import { Link, useNavigate, useSearchParams } from "react-router";
import { useLibraryList } from "~/api/library.ts";
import { type DataColumn, DataTable } from "~/components/console/data-table.tsx";
import { FilterBar, FilterSelect } from "~/components/console/filter-bar.tsx";
@@ -14,6 +13,7 @@ import { ENTITY_STATUS, MEDIA_KIND, opts, SLOT_STATUS, SLOT_STATUS_ORDER } from
import { CoverPlaceholder, relTime, Tone } from "~/components/library/parts.tsx";
import { Button } from "~/components/ui/button.tsx";
import { Tabs, TabsList, TabsTrigger } from "~/components/ui/tabs.tsx";
import { Link, useNavigate, useSearchParams } from "~/lib/router-compat.tsx";
export const meta = () => [{ title: "媒体库 · UHD 媒体自动化控制台" }];
+1 -1
View File
@@ -2,7 +2,6 @@ import { useQueryClient } from "@tanstack/react-query";
import type { LogEntry } from "@umt/contracts";
import { Pause, Play, RotateCw, ScrollText, X } from "lucide-react";
import { useEffect, useMemo, useRef, useState } from "react";
import { useSearchParams } from "react-router";
import { agentKeys } from "~/api/agent.ts";
import { type LogParams, type LogStreamStatus, upsertEntries, useLogStream, useLogs } from "~/api/logs.ts";
import { DataTable } from "~/components/console/data-table.tsx";
@@ -33,6 +32,7 @@ import { Button } from "~/components/ui/button.tsx";
import { Tabs, TabsList, TabsTrigger } from "~/components/ui/tabs.tsx";
import { formatRelative } from "~/lib/labels.ts";
import { qk } from "~/lib/query-keys.ts";
import { useSearchParams } from "~/lib/router-compat.tsx";
import { cn, formatDateTime } from "~/lib/utils.ts";
export const meta = () => [{ title: "日志 · UHD 媒体自动化控制台" }];
@@ -1,7 +1,6 @@
import type { MediaServerInventory, TmdbMediaDetail } from "@umt/contracts";
import { ArrowLeft, BookmarkPlus, CalendarPlus, FolderPlus, PackageSearch } from "lucide-react";
import { useState } from "react";
import { Link, useNavigate, useParams } from "react-router";
import { toast } from "sonner";
import { useEntityFromCandidate } from "~/api/files.ts";
import { mediaServers } from "~/api/instances.ts";
@@ -25,6 +24,7 @@ import { InventoryBadges, mediaServerSummary, slotLine } from "~/components/sear
import { SubscriptionFormDialog } from "~/components/subscriptions/subscription-form.tsx";
import { Button } from "~/components/ui/button.tsx";
import { errorMessage } from "~/lib/api.ts";
import { Link, useNavigate, useParams } from "~/lib/router-compat.tsx";
// 作品详情(仅 TMDB,SEARCH-2):TMDB 信息与季列表 + 本地账本 / Emby 对比;在这里「订阅」「搜索资源」「建档不订阅」。
// 已建档的作品同时给媒体库详情入口。MD-1:头部 / 主创 / 季折叠与每集行复用 components/media/media-detail(与媒体库详情同一组件),
+1 -1
View File
@@ -19,7 +19,6 @@ import {
X,
} from "lucide-react";
import { type ReactNode, useEffect, useMemo, useState } from "react";
import { useSearchParams } from "react-router";
import { useFileRecords } from "~/api/files.ts";
import { useEntityDetail } from "~/api/inventory.ts";
import {
@@ -72,6 +71,7 @@ import { useSlotActions } from "~/components/slots/slot-mounts.tsx";
import { Button } from "~/components/ui/button.tsx";
import { Popover, PopoverContent, PopoverTrigger } from "~/components/ui/popover.tsx";
import { reasonLine } from "~/lib/reasons.ts";
import { useSearchParams } from "~/lib/router-compat.tsx";
import type { ActionSlot } from "~/lib/slots.ts";
import { useSse } from "~/lib/sse.ts";
import { cn, formatBytes, formatDateTime } from "~/lib/utils.ts";
+1 -1
View File
@@ -1,4 +1,4 @@
import { redirect } from "react-router";
import { redirect } from "~/lib/router-compat.tsx";
// 偏好标签已并入规则页(docs/design/subscriptions.md §6):单条规则以标签形态显示在“规则组”Tab。
// 旧链接带 origin 筛选时透传,规则页按来源筛选。
+1 -1
View File
@@ -1,5 +1,5 @@
import { redirect } from "react-router";
import { BUSINESS_OBJECT_TYPE, RUN_STATUS_LEVEL } from "~/components/logs/labels.ts";
import { redirect } from "~/lib/router-compat.tsx";
// 控制台 IA 重构后的旧链接 → 新路由(IA-1:docs/design/console-ia.md §3.3;IA-3:§7;IA-2 站点类型:RSS 并入站点)。
// 纯函数,各路由模块的 clientLoader 调用;nav.test 与冒烟都读 LEGACY_REDIRECTS。
+1 -1
View File
@@ -1,7 +1,6 @@
import type { RuleGroup, RuleGroupKind, RuleGroupSource } from "@umt/contracts";
import { FilePlus2, Plus } from "lucide-react";
import { useMemo, useRef, useState } from "react";
import { useSearchParams } from "react-router";
import { useRuleGroups, useRuleRefs } from "~/api/rules.ts";
import { FilterBar, FilterSelect } from "~/components/console/filter-bar.tsx";
import { PageHeader } from "~/components/console/page-header.tsx";
@@ -14,6 +13,7 @@ import { isTagLike, RULE_KIND, RULE_SOURCE } from "~/components/rules/labels.ts"
import { AtomsTab, DefaultsTab, SuppressionsTab } from "~/components/rules/tabs.tsx";
import { Button } from "~/components/ui/button.tsx";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/tabs.tsx";
import { useSearchParams } from "~/lib/router-compat.tsx";
// 规则(docs/design/subscriptions.md §6):收录策略 + 偏好标签合一。
// Tab:规则组(含单条规则的标签形态)/ 自定义条件 / 默认值 / 收录策略 / 抑制记录 / 识别词(docs/design/identify-words.md)。
+1 -1
View File
@@ -1,6 +1,5 @@
import { ArrowLeft, Search } from "lucide-react";
import { type FormEvent, useEffect, useMemo, useState } from "react";
import { Link, useNavigate, useSearchParams } from "react-router";
import { EmptyState } from "~/components/console/empty-state.tsx";
import { PageHeader } from "~/components/console/page-header.tsx";
import { useQueryState } from "~/components/console/use-query-state.ts";
@@ -16,6 +15,7 @@ import { SitePickerDialog } from "~/components/search/site-picker-dialog.tsx";
import { releaseSearchPath } from "~/components/search/work-card.tsx";
import { Button } from "~/components/ui/button.tsx";
import { Input } from "~/components/ui/input.tsx";
import { Link, useNavigate, useSearchParams } from "~/lib/router-compat.tsx";
// 全局搜索(SEARCH-2 两阶段):/console/search?q= 先列作品(本地 + TMDB,带库内状态)与操作,不查站点;
// 点「搜索资源」选站点后进第二阶段 ?q=&work=&in=&t=(work = local:<id> / tmdb:<type>:<id> / q:<关键词>,in = 站点 ID)。
+1 -1
View File
@@ -1,6 +1,5 @@
import { settingsSectionForLegacyTab } from "@umt/contracts";
import { useEffect, useRef } from "react";
import { Link, redirect, useLocation, useNavigate } from "react-router";
import { PageHeader } from "~/components/console/page-header.tsx";
import { parseSettingsHash, SECTION_GROUPS, settingsHash } from "~/components/settings/sections.tsx";
import { anchorId } from "~/components/settings/settings-block.tsx";
@@ -14,6 +13,7 @@ import {
SelectTrigger,
SelectValue,
} from "~/components/ui/select.tsx";
import { Link, redirect, useLocation, useNavigate } from "~/lib/router-compat.tsx";
import { cn } from "~/lib/utils.ts";
export const meta = () => [{ title: "设置 · UHD 媒体自动化控制台" }];
+1 -1
View File
@@ -1,7 +1,6 @@
import { SITE_KINDS, type SiteKind } from "@umt/contracts";
import { Globe, LayoutGrid, List, PackageSearch, Plus, RefreshCw } from "lucide-react";
import { useEffect, useState } from "react";
import { useSearchParams } from "react-router";
import { useSites } from "~/api/sites.ts";
import { EmptyState, ErrorState, LoadingState } from "~/components/console/empty-state.tsx";
import { FilterSelect } from "~/components/console/filter-bar.tsx";
@@ -15,6 +14,7 @@ import { needsAttention, type SortKey, sortSites } from "~/components/sites/site
import { SiteSheet } from "~/components/sites/site-sheet.tsx";
import { Button } from "~/components/ui/button.tsx";
import { SegmentedControl } from "~/components/ui/segmented.tsx";
import { useSearchParams } from "~/lib/router-compat.tsx";
// 获取 → 站点:站点、凭证、健康、账号数据、RSS 的唯一入口(docs/design/site-center.md §4);
// 按类型分组显示:PT 站 / 公开 BT 站(旧的自定义 RSS 源有的话单列);?new=<类型> 直接打开添加。
+1 -1
View File
@@ -1,8 +1,8 @@
import { FeedSource } from "@umt/contracts";
import { redirect } from "react-router";
import { apiParsed } from "~/api/parse.ts";
import { consolePath } from "~/components/console/nav.ts";
import { recordPath } from "~/components/console/record-sheet.tsx";
import { redirect } from "~/lib/router-compat.tsx";
import { legacyRedirect } from "./redirects.ts";
// IA-2:独立 RSS 页取消,RSS 属于站点(站点详情的 RSS Tab)。这里只做旧链接跳转,深链不失效:
+1 -1
View File
@@ -13,7 +13,6 @@ import {
XCircle,
} from "lucide-react";
import { type ReactNode, useState } from "react";
import { Link } from "react-router";
import { useSystemHealth, useSystemHealthHistory } from "~/api/system.ts";
import { DataTable } from "~/components/console/data-table.tsx";
import { DetailSection } from "~/components/console/detail-sheet.tsx";
@@ -30,6 +29,7 @@ import { Button } from "~/components/ui/button.tsx";
import { Tabs, TabsList, TabsTrigger } from "~/components/ui/tabs.tsx";
import { formatDuration, formatRelative } from "~/lib/labels.ts";
import { qk } from "~/lib/query-keys.ts";
import { Link } from "~/lib/router-compat.tsx";
import { cn, formatBytes, formatDateTime } from "~/lib/utils.ts";
export const meta = () => [{ title: "运行状态 · UHD 媒体自动化控制台" }];
@@ -14,7 +14,6 @@ import {
X,
} from "lucide-react";
import { useEffect, useMemo, useState } from "react";
import { Link } from "react-router";
import { useSiteOptions } from "~/api/instances.ts";
import { useRuleGroups } from "~/api/rules.ts";
import { type OverviewFilters, useSubscriptionOverview } from "~/api/subscriptions.ts";
@@ -35,6 +34,7 @@ import { SubscriptionSheet } from "~/components/subscriptions/subscription-sheet
import { Button } from "~/components/ui/button.tsx";
import { Pagination } from "~/components/ui/pagination.tsx";
import { SegmentedControl } from "~/components/ui/segmented.tsx";
import { Link } from "~/lib/router-compat.tsx";
import { cn } from "~/lib/utils.ts";
import { legacyRedirectLoader } from "./redirects.ts";