Feat : Tailscale

This commit is contained in:
decolua
2026-04-11 11:36:33 +07:00
parent 838d9a7a04
commit ed17a8ffac
18 changed files with 1433 additions and 388 deletions
@@ -4,7 +4,8 @@ import { useState, useEffect, useCallback } from "react";
import { Card, CardSkeleton } from "@/shared/components";
import { CLI_TOOLS } from "@/shared/constants/cliTools";
import { getModelsByProviderId, PROVIDER_ID_TO_ALIAS } from "@/shared/constants/models";
import { ClaudeToolCard, CodexToolCard, DroidToolCard, OpenClawToolCard, DefaultToolCard, OpenCodeToolCard } from "./components";
import { ClaudeToolCard, CodexToolCard, DroidToolCard, OpenClawToolCard, DefaultToolCard, OpenCodeToolCard, MitmLinkCard } from "./components";
import { MITM_TOOLS } from "@/shared/constants/cliTools";
const CLOUD_URL = process.env.NEXT_PUBLIC_CLOUD_URL;
@@ -184,23 +185,18 @@ export default function CLIToolsPageClient({ machineId }) {
};
const regularTools = Object.entries(CLI_TOOLS);
const mitmTools = Object.entries(MITM_TOOLS);
return (
<div className="flex flex-col gap-6">
{/* {!hasActiveProviders && (
<Card className="border-yellow-500/50 bg-yellow-500/5">
<div className="flex items-center gap-3">
<span className="material-symbols-outlined text-yellow-500">warning</span>
<div>
<p className="font-medium text-yellow-600 dark:text-yellow-400">No active providers</p>
<p className="text-sm text-text-muted">Please add and connect providers first to configure CLI tools.</p>
</div>
</div>
</Card>
)} */}
<div className="flex flex-col gap-4">
{regularTools.map(([toolId, tool]) => renderToolCard(toolId, tool))}
</div>
<div className="flex flex-col gap-4">
{mitmTools.map(([toolId, tool]) => (
<MitmLinkCard key={toolId} tool={tool} />
))}
</div>
</div>
);
}
@@ -0,0 +1,40 @@
"use client";
import Link from "next/link";
import { Card } from "@/shared/components";
import Image from "next/image";
/**
* Clickable card for MITM tools — navigates to /dashboard/mitm on click.
*/
export default function MitmLinkCard({ tool }) {
return (
<Link href="/dashboard/mitm" className="block">
<Card padding="sm" className="overflow-hidden hover:border-primary/50 transition-colors cursor-pointer">
<div className="flex items-center justify-between">
<div className="flex items-center gap-3">
<div className="size-8 flex items-center justify-center shrink-0">
<Image
src={tool.image}
alt={tool.name}
width={32}
height={32}
className="size-8 object-contain rounded-lg"
sizes="32px"
onError={(e) => { e.target.style.display = "none"; }}
/>
</div>
<div className="min-w-0">
<div className="flex items-center gap-2">
<h3 className="font-medium text-sm">{tool.name}</h3>
<span className="px-1.5 py-0.5 text-[10px] font-medium bg-purple-500/10 text-purple-600 dark:text-purple-400 rounded-full">MITM</span>
</div>
<p className="text-xs text-text-muted truncate">{tool.description}</p>
</div>
</div>
<span className="material-symbols-outlined text-text-muted text-[20px]">chevron_right</span>
</div>
</Card>
</Link>
);
}
@@ -8,4 +8,5 @@ export { default as OpenCodeToolCard } from "./OpenCodeToolCard";
export { default as CopilotToolCard } from "./CopilotToolCard";
export { default as MitmServerCard } from "./MitmServerCard";
export { default as MitmToolCard } from "./MitmToolCard";
export { default as MitmLinkCard } from "./MitmLinkCard";