diff --git a/app/analysis/page.tsx b/app/analysis/page.tsx index ac6f9b8..085efc5 100644 --- a/app/analysis/page.tsx +++ b/app/analysis/page.tsx @@ -2,7 +2,7 @@ import { useQueryClient } from '@tanstack/react-query'; import Link from 'next/link'; -import { Suspense, useCallback, useEffect, useMemo, useState } from 'react'; +import { Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { format } from 'date-fns'; import { CartesianGrid, @@ -169,10 +169,12 @@ function AnalysisPageContent() { const [journalLoading, setJournalLoading] = useState(true); const [journalForm, setJournalForm] = useState(EMPTY_JOURNAL_FORM); const [editingJournalId, setEditingJournalId] = useState(null); + const [highlightedJournalId, setHighlightedJournalId] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [financialPeriodFilter, setFinancialPeriodFilter] = useState('quarterlyAndFiscalYearEnd'); const [financialValueScale, setFinancialValueScale] = useState('millions'); + const journalEntryRefs = useRef(new Map()); useEffect(() => { const normalized = normalizeTickerInput(searchParams.get('ticker')); @@ -182,6 +184,8 @@ function AnalysisPageContent() { setTickerInput(normalized); setTicker(normalized); + const journalId = Number(searchParams.get('journalId')); + setHighlightedJournalId(Number.isInteger(journalId) && journalId > 0 ? journalId : null); }, [searchParams]); const loadAnalysis = useCallback(async (symbol: string) => { @@ -231,6 +235,26 @@ function AnalysisPageContent() { } }, [isPending, isAuthenticated, loadAnalysis, loadJournal, ticker]); + useEffect(() => { + if (!highlightedJournalId) { + return; + } + + const node = journalEntryRefs.current.get(highlightedJournalId); + if (!node) { + return; + } + + node.scrollIntoView({ behavior: 'smooth', block: 'center' }); + const timeoutId = window.setTimeout(() => { + setHighlightedJournalId((current) => (current === highlightedJournalId ? null : current)); + }, 2200); + + return () => { + window.clearTimeout(timeoutId); + }; + }, [highlightedJournalId, journalEntries]); + const priceSeries = useMemo(() => { return (analysis?.priceHistory ?? []).map((point) => ({ ...point, @@ -349,26 +373,35 @@ function AnalysisPageContent() { subtitle="Research a single ticker across pricing, 10-K/10-Q financials, qualitative filings, and generated AI reports." activeTicker={analysis?.company.ticker ?? ticker} actions={( - + <> + + + Ask with RAG + + + )} >
{ event.preventDefault(); const normalized = tickerInput.trim().toUpperCase(); @@ -383,9 +416,9 @@ function AnalysisPageContent() { aria-label="Analysis ticker" onChange={(event) => setTickerInput(event.target.value.toUpperCase())} placeholder="Ticker (AAPL)" - className="max-w-xs" + className="w-full sm:max-w-xs" /> - @@ -462,7 +495,7 @@ function AnalysisPageContent() { {analysis?.coverage ? (
-
+

Status

{analysis.coverage.status}

@@ -560,7 +593,7 @@ function AnalysisPageContent() { ) : priceSeries.length === 0 ? (

No price history available.

) : ( -
+
@@ -638,35 +671,67 @@ function AnalysisPageContent() { ) : filteredFinancialSeries.length === 0 ? (

No financial rows match the selected period filter.

) : ( -
- - - - - - - - - - - - - - {filteredFinancialSeries.map((point, index) => ( - - - - - - - - +

+ +
+
+
Revenue
+
{asScaledFinancialCurrency(point.revenue, financialValueScale)}
+
+
+
Assets
+
{asScaledFinancialCurrency(point.assets, financialValueScale)}
+
+
+
Net Margin
+
{point.netMargin === null ? 'n/a' : formatPercent(point.netMargin)}
+
+
+ + ))} + + +
+
FiledPeriodFormRevenueNet IncomeAssetsNet Margin
{formatLongDate(point.filingDate)}{point.periodLabel}{point.filingType}{asScaledFinancialCurrency(point.revenue, financialValueScale)}= 0 ? 'text-[#96f5bf]' : 'text-[#ff9f9f]'}> +
+
+ {filteredFinancialSeries.map((point, index) => ( +
+
+
+

{formatLongDate(point.filingDate)}

+

{point.filingType} · {point.periodLabel}

+
+

= 0 ? 'text-[#96f5bf]' : 'text-[#ff9f9f]'}`}> {asScaledFinancialCurrency(point.netIncome, financialValueScale)} -

{asScaledFinancialCurrency(point.assets, financialValueScale)}{point.netMargin === null ? 'n/a' : formatPercent(point.netMargin)}
+ + + + + + + + + - ))} - -
FiledPeriodFormRevenueNet IncomeAssetsNet Margin
+ + + {filteredFinancialSeries.map((point, index) => ( + + {formatLongDate(point.filingDate)} + {point.periodLabel} + {point.filingType} + {asScaledFinancialCurrency(point.revenue, financialValueScale)} + = 0 ? 'text-[#96f5bf]' : 'text-[#ff9f9f]'}> + {asScaledFinancialCurrency(point.netIncome, financialValueScale)} + + {asScaledFinancialCurrency(point.assets, financialValueScale)} + {point.netMargin === null ? 'n/a' : formatPercent(point.netMargin)} + + ))} + + +
)} @@ -681,41 +746,75 @@ function AnalysisPageContent() { ) : periodEndFilings.length === 0 ? (

No 10-K or 10-Q filings available for this ticker.

) : ( -
- - - - - - - - - - - - - - {periodEndFilings.map((filing) => ( - - - - - - - - +
+
+ {periodEndFilings.map((filing) => ( +
+
+
+

{format(new Date(filing.filing_date), 'MMM dd, yyyy')}

+

{filing.filing_type} · {filing.filing_type === '10-Q' ? 'Quarter End' : 'Fiscal Year End'}

+
+ {filing.filing_url ? ( + + SEC filing + + ) : null} +
+
+
+
Revenue
+
{asScaledFinancialCurrency(filing.metrics?.revenue, financialValueScale)}
+
+
+
Net Income
+
{asScaledFinancialCurrency(filing.metrics?.netIncome, financialValueScale)}
+
+
+
Assets
+
{asScaledFinancialCurrency(filing.metrics?.totalAssets, financialValueScale)}
+
+
+
+ ))} +
+ +
+
FiledPeriodTypeRevenueNet IncomeAssetsDocument
{format(new Date(filing.filing_date), 'MMM dd, yyyy')}{filing.filing_type === '10-Q' ? 'Quarter End' : 'Fiscal Year End'}{filing.filing_type}{asScaledFinancialCurrency(filing.metrics?.revenue, financialValueScale)}{asScaledFinancialCurrency(filing.metrics?.netIncome, financialValueScale)}{asScaledFinancialCurrency(filing.metrics?.totalAssets, financialValueScale)} - {filing.filing_url ? ( - - SEC filing - - ) : ( - 'n/a' - )} -
+ + + + + + + + + - ))} - -
FiledPeriodTypeRevenueNet IncomeAssetsDocument
+ + + {periodEndFilings.map((filing) => ( + + {format(new Date(filing.filing_date), 'MMM dd, yyyy')} + {filing.filing_type === '10-Q' ? 'Quarter End' : 'Fiscal Year End'} + {filing.filing_type} + {asScaledFinancialCurrency(filing.metrics?.revenue, financialValueScale)} + {asScaledFinancialCurrency(filing.metrics?.netIncome, financialValueScale)} + {asScaledFinancialCurrency(filing.metrics?.totalAssets, financialValueScale)} + + {filing.filing_url ? ( + + SEC filing + + ) : ( + 'n/a' + )} + + + ))} + + +
)} @@ -739,7 +838,7 @@ function AnalysisPageContent() {

{report.summary}

-
+

{report.accessionNumber}

- {editingJournalId !== null ? ( - ) : null} @@ -816,7 +915,17 @@ function AnalysisPageContent() { const canEdit = entry.entry_type !== 'status_change'; return ( -
+
{ + journalEntryRefs.current.set(entry.id, node); + }} + className={`rounded-xl border bg-[color:var(--panel-soft)] p-4 transition ${ + highlightedJournalId === entry.id + ? 'border-[color:var(--line-strong)] shadow-[0_0_0_1px_rgba(0,255,180,0.14),0_0_28px_rgba(0,255,180,0.16)]' + : 'border-[color:var(--line-weak)]' + }`} + >

diff --git a/app/filings/page.tsx b/app/filings/page.tsx index fa75ddb..9cfc97d 100644 --- a/app/filings/page.tsx +++ b/app/filings/page.tsx @@ -250,17 +250,26 @@ function FilingsPageContent() { subtitle="Sync SEC submissions, keep 10-K/10-Q financial snapshots, and analyze qualitative signals from other forms." activeTicker={searchTicker || null} actions={( - + <> + + + Ask with RAG + + + )} >

@@ -334,7 +343,7 @@ function FilingsPageContent() { title="Filing Ledger" subtitle={`${filings.length} records loaded${searchTicker ? ` for ${searchTicker}` : ''}. Values shown in ${selectedFinancialScaleLabel}.`} actions={( -
+
{FINANCIAL_VALUE_SCALE_OPTIONS.map((option) => ( @@ -656,12 +656,12 @@ function FinancialsPageContent() { /> -
+
setRowSearch(event.target.value)} placeholder="Search rows by label" - className="max-w-sm" + className="w-full sm:max-w-sm" /> {filteredRows.length} of {activeRows.length} rows diff --git a/app/globals.css b/app/globals.css index 20cde72..a67a103 100644 --- a/app/globals.css +++ b/app/globals.css @@ -29,6 +29,10 @@ body { padding: 0; } +html { + -webkit-text-size-adjust: 100%; +} + [data-sonner-toaster] { --normal-bg: rgba(7, 22, 31, 0.96); --normal-text: #e8fff8; @@ -48,6 +52,7 @@ body { body { min-height: 100vh; + overflow-x: hidden; font-family: var(--font-display), sans-serif; color: var(--terminal-bright); background: @@ -92,6 +97,14 @@ body { letter-spacing: 0.08em; } +a, +button, +input, +select, +textarea { + touch-action: manipulation; +} + .data-table { width: 100%; border-collapse: collapse; @@ -140,3 +153,18 @@ body { background-size: 26px 26px; } } + +@media (max-width: 640px) { + body { + background: + radial-gradient(circle at 24% -4%, rgba(126, 217, 255, 0.2), transparent 36%), + radial-gradient(circle at 82% 2%, rgba(104, 255, 213, 0.16), transparent 30%), + linear-gradient(155deg, var(--bg-0), var(--bg-1) 54%, var(--bg-2)); + } + + .data-table th, + .data-table td { + padding: 0.65rem 0.55rem; + font-size: 0.8125rem; + } +} diff --git a/app/layout.tsx b/app/layout.tsx index 6d1f9a1..251bd5b 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,5 +1,5 @@ import './globals.css'; -import type { Metadata } from 'next'; +import type { Metadata, Viewport } from 'next'; import { QueryProvider } from '@/components/providers/query-provider'; export const metadata: Metadata = { @@ -7,6 +7,13 @@ export const metadata: Metadata = { description: 'Futuristic fiscal intelligence terminal with durable tasks and AI SDK integration.' }; +export const viewport: Viewport = { + width: 'device-width', + initialScale: 1, + viewportFit: 'cover', + themeColor: '#05080d' +}; + export default function RootLayout({ children }: { children: React.ReactNode }) { return ( diff --git a/app/portfolio/page.tsx b/app/portfolio/page.tsx index a26119c..bb7f375 100644 --- a/app/portfolio/page.tsx +++ b/app/portfolio/page.tsx @@ -179,16 +179,16 @@ export default function PortfolioPage() { title="Portfolio" subtitle="Position management, market valuation, and AI generated portfolio commentary." actions={( - <> - - - +
)} > {error ? ( @@ -219,7 +219,7 @@ export default function PortfolioPage() { {loading ? (

Loading chart...

) : allocationData.length > 0 ? ( -
+
@@ -255,7 +255,7 @@ export default function PortfolioPage() { {loading ? (

Loading chart...

) : performanceData.length > 0 ? ( -
+
@@ -302,106 +302,214 @@ export default function PortfolioPage() { ) : holdings.length === 0 ? (

No holdings added yet.

) : ( -
- - - - - - - - - - - - - - - - {holdings.map((holding) => ( - - - - - - - - - - +
+
+ {holdings.map((holding) => ( +
+
+
+

{holding.ticker}

+

{holding.company_name ?? 'Company name unavailable'}

+
+

= 0 ? 'text-[#96f5bf]' : 'text-[#ff9898]'}`}> + {formatCurrency(holding.gain_loss)} +

+
+ +
+
+
Shares
+
{asNumber(holding.shares).toLocaleString()}
+
+
+
Avg Cost
+
{formatCurrency(holding.avg_cost)}
+
+
+
Price
+
{holding.current_price ? formatCurrency(holding.current_price) : 'n/a'}
+
+
+
Value
+
{formatCurrency(holding.market_value)}
+
+
+ +

= 0 ? 'text-[#96f5bf]' : 'text-[#ff9898]'}`}> + Return {formatPercent(holding.gain_loss_pct)} +

+ +
+ prefetchResearchTicker(holding.ticker)} + onFocus={() => prefetchResearchTicker(holding.ticker)} + className="inline-flex items-center rounded-md border border-[color:var(--line-weak)] px-2 py-1 text-xs text-[color:var(--accent)] transition hover:border-[color:var(--line-strong)] hover:text-[color:var(--accent-strong)]" + > + Analysis + + prefetchResearchTicker(holding.ticker)} + onFocus={() => prefetchResearchTicker(holding.ticker)} + className="inline-flex items-center rounded-md border border-[color:var(--line-weak)] px-2 py-1 text-xs text-[color:var(--accent)] transition hover:border-[color:var(--line-strong)] hover:text-[color:var(--accent-strong)]" + > + Financials + + prefetchResearchTicker(holding.ticker)} + onFocus={() => prefetchResearchTicker(holding.ticker)} + className="inline-flex items-center rounded-md border border-[color:var(--line-weak)] px-2 py-1 text-xs text-[color:var(--accent)] transition hover:border-[color:var(--line-strong)] hover:text-[color:var(--accent-strong)]" + > + Filings + +
+ +
+ + +
+
+ ))} +
+ +
+
TickerCompanySharesAvg CostPriceValueGain/LossResearchAction
{holding.ticker}{holding.company_name ?? 'n/a'}{asNumber(holding.shares).toLocaleString()}{formatCurrency(holding.avg_cost)}{holding.current_price ? formatCurrency(holding.current_price) : 'n/a'}{formatCurrency(holding.market_value)}= 0 ? 'text-[#96f5bf]' : 'text-[#ff9898]'}> - {formatCurrency(holding.gain_loss)} ({formatPercent(holding.gain_loss_pct)}) - -
- prefetchResearchTicker(holding.ticker)} - onFocus={() => prefetchResearchTicker(holding.ticker)} - className="text-xs text-[color:var(--accent)] hover:text-[color:var(--accent-strong)]" - > - Analysis - - prefetchResearchTicker(holding.ticker)} - onFocus={() => prefetchResearchTicker(holding.ticker)} - className="text-xs text-[color:var(--accent)] hover:text-[color:var(--accent-strong)]" - > - Financials - - prefetchResearchTicker(holding.ticker)} - onFocus={() => prefetchResearchTicker(holding.ticker)} - className="text-xs text-[color:var(--accent)] hover:text-[color:var(--accent-strong)]" - > - Filings - -
-
-
- - -
-
+ + + + + + + + + + + - ))} - -
TickerCompanySharesAvg CostPriceValueGain/LossResearchAction
+ + + {holdings.map((holding) => ( + + {holding.ticker} + {holding.company_name ?? 'n/a'} + {asNumber(holding.shares).toLocaleString()} + {formatCurrency(holding.avg_cost)} + {holding.current_price ? formatCurrency(holding.current_price) : 'n/a'} + {formatCurrency(holding.market_value)} + = 0 ? 'text-[#96f5bf]' : 'text-[#ff9898]'}> + {formatCurrency(holding.gain_loss)} ({formatPercent(holding.gain_loss_pct)}) + + +
+ prefetchResearchTicker(holding.ticker)} + onFocus={() => prefetchResearchTicker(holding.ticker)} + className="text-xs text-[color:var(--accent)] hover:text-[color:var(--accent-strong)]" + > + Analysis + + prefetchResearchTicker(holding.ticker)} + onFocus={() => prefetchResearchTicker(holding.ticker)} + className="text-xs text-[color:var(--accent)] hover:text-[color:var(--accent-strong)]" + > + Financials + + prefetchResearchTicker(holding.ticker)} + onFocus={() => prefetchResearchTicker(holding.ticker)} + className="text-xs text-[color:var(--accent)] hover:text-[color:var(--accent-strong)]" + > + Filings + +
+ + +
+ + +
+ + + ))} + + +
)} @@ -440,12 +548,12 @@ export default function PortfolioPage() { setForm((prev) => ({ ...prev, currentPrice: event.target.value }))} />
- {editingHoldingId !== null ? ( - ) : null} diff --git a/app/search/page.tsx b/app/search/page.tsx new file mode 100644 index 0000000..0efc8fe --- /dev/null +++ b/app/search/page.tsx @@ -0,0 +1,268 @@ +'use client'; + +import Link from 'next/link'; +import { Suspense, useEffect, useMemo, useState, useTransition } from 'react'; +import { useSearchParams } from 'next/navigation'; +import { useQueryClient } from '@tanstack/react-query'; +import { BrainCircuit, ExternalLink, Search as SearchIcon } from 'lucide-react'; +import { AppShell } from '@/components/shell/app-shell'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Panel } from '@/components/ui/panel'; +import { useAuthGuard } from '@/hooks/use-auth-guard'; +import { getSearchAnswer } from '@/lib/api'; +import { searchQueryOptions } from '@/lib/query/options'; +import type { SearchAnswerResponse, SearchResult, SearchSource } from '@/lib/types'; + +const SOURCE_OPTIONS: Array<{ value: SearchSource; label: string }> = [ + { value: 'documents', label: 'Documents' }, + { value: 'filings', label: 'Filing briefs' }, + { value: 'research', label: 'Research notes' } +]; + +function parseSourceParams(value: string | null) { + if (!value) { + return ['documents', 'filings', 'research'] as SearchSource[]; + } + + const normalized = value + .split(',') + .map((entry) => entry.trim().toLowerCase()) + .filter((entry): entry is SearchSource => entry === 'documents' || entry === 'filings' || entry === 'research'); + + return normalized.length > 0 ? [...new Set(normalized)] : ['documents', 'filings', 'research'] as SearchSource[]; +} + +export default function SearchPage() { + return ( + Loading search desk...
}> + + + ); +} + +function SearchPageContent() { + const { isPending, isAuthenticated } = useAuthGuard(); + const searchParams = useSearchParams(); + const queryClient = useQueryClient(); + + const initialQuery = searchParams.get('q')?.trim() ?? ''; + const initialTicker = searchParams.get('ticker')?.trim().toUpperCase() ?? ''; + const initialSources = useMemo(() => parseSourceParams(searchParams.get('sources')), [searchParams]); + + const [queryInput, setQueryInput] = useState(initialQuery); + const [query, setQuery] = useState(initialQuery); + const [tickerInput, setTickerInput] = useState(initialTicker); + const [ticker, setTicker] = useState(initialTicker); + const [sources, setSources] = useState(initialSources); + const [results, setResults] = useState([]); + const [answer, setAnswer] = useState(null); + const [loading, setLoading] = useState(false); + const [answerLoading, startAnswerTransition] = useTransition(); + const [error, setError] = useState(null); + + useEffect(() => { + setQueryInput(initialQuery); + setQuery(initialQuery); + setTickerInput(initialTicker); + setTicker(initialTicker); + setSources(initialSources); + }, [initialQuery, initialTicker, initialSources]); + + useEffect(() => { + if (!query.trim() || !isAuthenticated) { + setResults([]); + return; + } + + let cancelled = false; + setLoading(true); + setError(null); + + queryClient.fetchQuery(searchQueryOptions({ + query, + ticker: ticker || undefined, + sources, + limit: 10 + })).then((response) => { + if (!cancelled) { + setResults(response.results); + } + }).catch((err) => { + if (!cancelled) { + setError(err instanceof Error ? err.message : 'Unable to search indexed sources'); + setResults([]); + } + }).finally(() => { + if (!cancelled) { + setLoading(false); + } + }); + + return () => { + cancelled = true; + }; + }, [isAuthenticated, query, queryClient, sources, ticker]); + + if (isPending || !isAuthenticated) { + return
Loading search desk...
; + } + + const runAnswer = () => { + if (!query.trim()) { + return; + } + + startAnswerTransition(() => { + setError(null); + getSearchAnswer({ + query, + ticker: ticker || undefined, + sources, + limit: 10 + }).then((response) => { + setAnswer(response); + }).catch((err) => { + setError(err instanceof Error ? err.message : 'Unable to generate cited answer'); + setAnswer(null); + }); + }); + }; + + return ( + +
+ + { + event.preventDefault(); + setQuery(queryInput.trim()); + setTicker(tickerInput.trim().toUpperCase()); + setAnswer(null); + }} + > + setQueryInput(event.target.value)} + placeholder="Ask about margin drivers, segment commentary, risks, or your notes..." + /> +
+ setTickerInput(event.target.value.toUpperCase())} + placeholder="Ticker filter (optional)" + className="sm:max-w-xs" + /> +
+ {SOURCE_OPTIONS.map((option) => { + const selected = sources.includes(option.value); + return ( + + ); + })} +
+
+
+ + +
+ +
+ + + {answer ? ( +
+

{answer.answer}

+ {answer.citations.length > 0 ? ( +
+ {answer.citations.map((citation) => ( + + [{citation.index}] {citation.label} + + + ))} +
+ ) : ( +

No supporting citations were strong enough to answer.

+ )} +
+ ) : ( +

Ask a question to synthesize the top retrieved passages into a cited answer.

+ )} +
+
+ + + {error ?

{error}

: null} + {loading ? ( +

Searching indexed sources...

+ ) : !query ? ( +

Enter a question or topic to search the local RAG index.

+ ) : results.length === 0 ? ( +

No indexed evidence matched this query.

+ ) : ( +
+ {results.map((result) => ( +
+
+
+

+ {result.source} {result.ticker ? `· ${result.ticker}` : ''} {result.filingDate ? `· ${result.filingDate}` : ''} +

+

{result.title ?? result.citationLabel}

+

{result.citationLabel}

+
+ + Open source + + +
+ {result.headingPath ? ( +

{result.headingPath}

+ ) : null} +

{result.snippet}

+
+ ))} +
+ )} +
+
+ ); +} diff --git a/app/watchlist/page.tsx b/app/watchlist/page.tsx index 1f1990e..b65d781 100644 --- a/app/watchlist/page.tsx +++ b/app/watchlist/page.tsx @@ -58,7 +58,7 @@ const EMPTY_FORM: FormState = { tags: '' }; -const SELECT_CLASS_NAME = 'w-full rounded-lg border border-[color:var(--line-weak)] bg-[color:var(--panel-soft)] px-3 py-2 text-sm text-[color:var(--terminal-bright)] outline-none transition focus:border-[color:var(--line-strong)] focus:shadow-[0_0_0_3px_rgba(0,255,180,0.14)]'; +const SELECT_CLASS_NAME = 'min-h-11 w-full rounded-lg border border-[color:var(--line-weak)] bg-[color:var(--panel-soft)] px-3 py-2 text-sm text-[color:var(--terminal-bright)] outline-none transition focus:border-[color:var(--line-strong)] focus:shadow-[0_0_0_3px_rgba(0,255,180,0.14)]'; function parseTagsInput(input: string) { const unique = new Set(); @@ -281,10 +281,11 @@ export default function WatchlistPage() { aria-label="Search coverage" onChange={(event) => setSearch(event.target.value)} placeholder="Search ticker, company, tag, sector..." - className="min-w-[18rem]" + className="w-full sm:min-w-[18rem]" />
)} @@ -542,12 +693,12 @@ export default function WatchlistPage() { />
- {editingItemId !== null ? ( - ) : null} diff --git a/bun.lock b/bun.lock index 4a86664..b4ee4b5 100644 --- a/bun.lock +++ b/bun.lock @@ -23,6 +23,7 @@ "react-dom": "^19.2.4", "recharts": "^3.7.0", "sonner": "^2.0.7", + "sqlite-vec": "^0.1.7-alpha.2", "workflow": "^4.1.0-beta.60", "zhipu-ai-provider": "^0.2.2", }, @@ -1427,6 +1428,18 @@ "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + "sqlite-vec": ["sqlite-vec@0.1.7-alpha.2", "", { "optionalDependencies": { "sqlite-vec-darwin-arm64": "0.1.7-alpha.2", "sqlite-vec-darwin-x64": "0.1.7-alpha.2", "sqlite-vec-linux-arm64": "0.1.7-alpha.2", "sqlite-vec-linux-x64": "0.1.7-alpha.2", "sqlite-vec-windows-x64": "0.1.7-alpha.2" } }, "sha512-rNgRCv+4V4Ed3yc33Qr+nNmjhtrMnnHzXfLVPeGb28Dx5mmDL3Ngw/Wk8vhCGjj76+oC6gnkmMG8y73BZWGBwQ=="], + + "sqlite-vec-darwin-arm64": ["sqlite-vec-darwin-arm64@0.1.7-alpha.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-raIATOqFYkeCHhb/t3r7W7Cf2lVYdf4J3ogJ6GFc8PQEgHCPEsi+bYnm2JT84MzLfTlSTIdxr4/NKv+zF7oLPw=="], + + "sqlite-vec-darwin-x64": ["sqlite-vec-darwin-x64@0.1.7-alpha.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-jeZEELsQjjRsVojsvU5iKxOvkaVuE+JYC8Y4Ma8U45aAERrDYmqZoHvgSG7cg1PXL3bMlumFTAmHynf1y4pOzA=="], + + "sqlite-vec-linux-arm64": ["sqlite-vec-linux-arm64@0.1.7-alpha.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-6Spj4Nfi7tG13jsUG+W7jnT0bCTWbyPImu2M8nWp20fNrd1SZ4g3CSlDAK8GBdavX7wRlbBHCZ+BDa++rbDewA=="], + + "sqlite-vec-linux-x64": ["sqlite-vec-linux-x64@0.1.7-alpha.2", "", { "os": "linux", "cpu": "x64" }, "sha512-IcgrbHaDccTVhXDf8Orwdc2+hgDLAFORl6OBUhcvlmwswwBP1hqBTSEhovClG4NItwTOBNgpwOoQ7Qp3VDPWLg=="], + + "sqlite-vec-windows-x64": ["sqlite-vec-windows-x64@0.1.7-alpha.2", "", { "os": "win32", "cpu": "x64" }, "sha512-TRP6hTjAcwvQ6xpCZvjP00pdlda8J38ArFy1lMYhtQWXiIBmWnhMaMbq4kaeCYwvTTddfidatRS+TJrwIKB/oQ=="], + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="], diff --git a/components/auth/auth-shell.tsx b/components/auth/auth-shell.tsx index 51d1304..30addcb 100644 --- a/components/auth/auth-shell.tsx +++ b/components/auth/auth-shell.tsx @@ -13,10 +13,10 @@ export function AuthShell({ title, subtitle, children, footer }: AuthShellProps)