diff --git a/.github/workflows/vercel-auto-deploy.yml b/.github/workflows/vercel-auto-deploy.yml
new file mode 100644
index 00000000..7d0e6cee
--- /dev/null
+++ b/.github/workflows/vercel-auto-deploy.yml
@@ -0,0 +1,22 @@
+name: Vercel Auto Deploy
+
+on:
+ push:
+ branches:
+ - dev # 自动预览部署的分支
+ # 如需对 master/main 做生产部署,可在后续扩展
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Deploy to Vercel (preview)
+ uses: amondnet/vercel-action@v20
+ with:
+ vercel-token: ${{ secrets.VERCEL_TOKEN }} # Vercel 访问令牌
+ vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} # Vercel 组织 ID
+ vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}# Vercel 项目 ID
+ vercel-args: '--previews' # dev 分支走预览部署
diff --git a/web/src/components/research/SearchBox.tsx b/web/src/components/research/SearchBox.tsx
index cefb24c9..0b973072 100644
--- a/web/src/components/research/SearchBox.tsx
+++ b/web/src/components/research/SearchBox.tsx
@@ -4,6 +4,7 @@ import { KeyboardEvent, useRef, useState } from "react"
import { Brain, CalendarRange, Check, Loader2, Search } from "lucide-react"
import { cn } from "@/lib/utils"
+import { showTrackMemoryButton } from "@/config/features"
import { Button } from "@/components/ui/button"
import { Textarea } from "@/components/ui/textarea"
import { Popover, PopoverContent, PopoverAnchor } from "@/components/ui/popover"
@@ -247,16 +248,18 @@ export function SearchBox({
{/* Right side - Memory, Track selector and Search button */}
-
+ {onOpenMemory && showTrackMemoryButton() && (
+
+ )}
onSelectTrack(track.id)}
+ onClick={() => {
+ if (track.id !== activeTrackId) onSelectTrack(track.id)
+ }}
disabled={disabled}
>
{(() => {
diff --git a/web/src/components/research/TrackSelector.tsx b/web/src/components/research/TrackSelector.tsx
index 7ac90d75..8dc20efc 100644
--- a/web/src/components/research/TrackSelector.tsx
+++ b/web/src/components/research/TrackSelector.tsx
@@ -60,7 +60,11 @@ export function TrackSelector({
tracks.map((track) => (
onSelectTrack(track.id)}
+ onClick={() => {
+ if (!activeTrack || track.id !== activeTrack.id) {
+ onSelectTrack(track.id)
+ }
+ }}
className="flex items-center justify-between"
>
{track.name}
diff --git a/web/src/config/features.ts b/web/src/config/features.ts
index 739cfdb9..baa2a229 100644
--- a/web/src/config/features.ts
+++ b/web/src/config/features.ts
@@ -18,3 +18,20 @@ export function showDiscoveryLink(): boolean {
return parseBool(process.env.NEXT_PUBLIC_SHOW_DISCOVERY)
}
+
+
+// Whether to show the Track Memory button (brain icon) in Research search box.
+// Default: false. Can be overridden by:
+// - runtime localStorage key: paperbot.showTrackMemory ("1"/"true")
+// - build-time env: NEXT_PUBLIC_SHOW_TRACK_MEMORY ("1"/"true")
+export function showTrackMemoryButton(): boolean {
+ if (typeof window !== "undefined") {
+ const v = window.localStorage.getItem("paperbot.showTrackMemory")
+ if (v != null) return parseBool(v)
+ }
+ // Fallback: allow sharing the same env flag as discovery if desired
+ return (
+ parseBool(process.env.NEXT_PUBLIC_SHOW_TRACK_MEMORY) ||
+ parseBool(process.env.NEXT_PUBLIC_SHOW_DISCOVERY)
+ )
+}