bfc98fe41a
延續同一次盤查(判準:素不相識的人點進來會不會被帶到到不了的地方)。 這批比 README 更顯眼——是 arcrun.dev 官網上那顆「GitHub」鈕,以及 npm 套件頁的 Repository 欄。逐一 curl 實測全部 404: - landing(官網三個檔五處):github.com/richblack/arcrun → 404(帳號已 suspend) → github.com/youlinhsieh/Arcrun(200) 其中 integrations 頁還指 richblack/arcrun/blob/main/CONTRIBUTING.md =雙重死 (帳號沒了,而且這個 repo 從來就只有 CONTRIBUTING-components.md) → youlinhsieh/Arcrun/blob/main/CONTRIBUTING-components.md(實測 200) - cli/package.json 的 repository.url:github.com/uncle6me-web/Arcrun.git → 404 (同樣是 suspend 掉的舊帳號)→ youlinhsieh/Arcrun。這欄會直接顯示在 npmjs.com/package/arcrun 的 Repository 連結上,裝了 CLI 的人就是從那裡點過來。 只換字串,沒有邏輯變動;package.json 已驗證仍是合法 JSON。 ⚠️ 同一批掃出但**本次未動**(behavior-affecting,另案處理): scripts/install.sh:29 與 scripts/update.sh:26 的 template 來源仍指 raw.githubusercontent.com/uncle6me-web/… =實測 404 ⇒ 自動更新靜默失效。 這正是 agent-memory 記過「uncle6me-web 曾害 template update.sh 自動更新靜默 死亡」的同一顆雷,修在 template repo 卻沒修到 Arcrun 這份 copy。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
83 lines
2.7 KiB
TypeScript
83 lines
2.7 KiB
TypeScript
'use client';
|
|
|
|
import { useEffect, useState } from 'react';
|
|
import Link from 'next/link';
|
|
import AppLauncher from './AppLauncher';
|
|
|
|
const API_BASE = process.env.NEXT_PUBLIC_API_BASE ?? 'https://cypher.arcrun.dev';
|
|
|
|
type NavUser = {
|
|
display_name: string;
|
|
email: string;
|
|
avatar_url?: string;
|
|
};
|
|
|
|
export default function SiteNav({ currentPath }: { currentPath?: string }) {
|
|
const [user, setUser] = useState<NavUser | null | undefined>(undefined);
|
|
|
|
useEffect(() => {
|
|
fetch(`${API_BASE}/me`, { credentials: 'include' })
|
|
.then(r => r.ok ? r.json() as Promise<NavUser> : null)
|
|
.then(u => setUser(u))
|
|
.catch(() => setUser(null));
|
|
}, []);
|
|
|
|
const logout = async () => {
|
|
await fetch(`${API_BASE}/auth/logout`, { method: 'POST', credentials: 'include' });
|
|
window.location.href = '/';
|
|
};
|
|
|
|
const linkCls = (path: string) =>
|
|
`transition-colors text-sm ${currentPath === path ? 'text-white' : 'text-[#666] hover:text-white'}`;
|
|
|
|
return (
|
|
<nav className="flex items-center justify-between px-6 py-4 border-b border-[#1a1a1a]">
|
|
<Link href="/" className="text-white font-bold text-lg tracking-tight hover:opacity-80 transition-opacity">
|
|
arcrun
|
|
</Link>
|
|
|
|
<div className="flex items-center gap-4 text-sm">
|
|
<Link href="/integrations" className={linkCls('/integrations')}>Integrations</Link>
|
|
<Link href="/api-docs" className={linkCls('/api-docs')}>API</Link>
|
|
<a
|
|
href="https://github.com/youlinhsieh/Arcrun"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
className="text-[#666] hover:text-white transition-colors"
|
|
>
|
|
GitHub
|
|
</a>
|
|
|
|
{user === undefined ? (
|
|
// Loading — placeholder to prevent layout shift
|
|
<div className="w-20 h-7" />
|
|
) : user ? (
|
|
<>
|
|
<AppLauncher userEmail={user.email} />
|
|
<Link href="/dashboard" className="flex items-center gap-2 hover:opacity-80 transition-opacity">
|
|
{user.avatar_url && (
|
|
// eslint-disable-next-line @next/next/no-img-element
|
|
<img src={user.avatar_url} alt="" width={26} height={26} className="rounded-full" />
|
|
)}
|
|
<span className="text-[#aaa]">{user.display_name}</span>
|
|
</Link>
|
|
<button
|
|
onClick={logout}
|
|
className="text-[#555] hover:text-[#888] transition-colors cursor-pointer"
|
|
>
|
|
登出
|
|
</button>
|
|
</>
|
|
) : (
|
|
<Link
|
|
href="/login"
|
|
className="bg-indigo-600 hover:bg-indigo-500 text-white px-4 py-1.5 rounded-md font-medium transition-colors"
|
|
>
|
|
Get API Key
|
|
</Link>
|
|
)}
|
|
</div>
|
|
</nav>
|
|
);
|
|
}
|