The tailnet plugin — machines, users, pre-auth keys, access policy and device invites. Moved out of officerdev/platform, where it had lived in plugins/ since the plugin system was built. Until now this code existed in exactly one place: the platform repository. That made "gitignore the plugins directory" impossible to do safely, because untracking it would have left 49 files on a single disk with no remote. This repository is what makes that move safe. Same extraction as plugins/music before it: source only, no history. The platform's history still holds every commit that shaped this, and the SHAs cited across the codebase keep resolving — replaying it here would have created a second, divergent account of the same work. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
24 lines
910 B
TypeScript
24 lines
910 B
TypeScript
import { Network } from 'lucide-react';
|
|
import { useHeadscaleServers } from './useHeadscaleServers';
|
|
import { HEADSCALE_SECTIONS } from './shared';
|
|
import { useHeadscaleSection } from './useHeadscaleSection';
|
|
|
|
// Panel header for the right (headscale-view) panel. Shows the section and, crucially, which server it is
|
|
// acting on — with several registered, "delete this node" is only safe if the target is unambiguous.
|
|
|
|
export const HeadscaleViewHeader = () => {
|
|
const section = useHeadscaleSection();
|
|
const { active } = useHeadscaleServers();
|
|
const label = HEADSCALE_SECTIONS.find((s) => s.id === section)?.label ?? 'Headscale';
|
|
|
|
return (
|
|
<>
|
|
<Network className="h-3.5 w-3.5 shrink-0" />
|
|
<span className="flex-1 truncate text-xs font-medium">
|
|
{label}
|
|
{active && <span className="ml-1.5 font-normal text-black/50">· {active.name}</span>}
|
|
</span>
|
|
</>
|
|
);
|
|
};
|