Files
wild-pc/app/src/components/detail/DetailHeader.tsx
Paul Payne 317232ca6a Manager-first deployment model: split runner, merge service/job, frontend→static
Replace the conflated `runner` axis with two orthogonal ones: `manager`
(systemd|caddy|path|none) — who supervises/realizes a deployment — and, for
systemd only, a nested `launcher` (python|command|container|compose|node) — how
the process starts. ServiceSpec and JobSpec collapse into one manager-
discriminated DeploymentSpec union (Systemd/Caddy/Path/Remote); the services/
and jobs/ config dirs collapse into one deployments/ dir. The human "kind"
(service|job|tool|static|reference) is fully derived (kind_for), never stored —
the frontend kind is renamed static. behavior is gone.

- core: DeploymentSpec union + LaunchSpec + kind_for; legacy-aware loader
  normalizes old runner shapes; CastleConfig.deployments with derived
  services/jobs/tools views; registry.Deployment carries manager/launcher/kind.
- cli: service/job/tool as filtered views + a deployment group; --behavior→--kind,
  create --runner→--launcher; lifecycle dispatches over config.deployments.
- castle-api: /deployments primary with /services,/jobs as views; summaries
  derive kind; PUT/DELETE /config/deployments/{name} (services/jobs aliased).
- app: KindBadge, frontend→static everywhere, pick-a-kind creation wizard,
  per-kind config editors.
- docs: single deployments/ layout, manager/launcher, static kind throughout.

Live migration verified byte-identical: regenerated Caddyfile and every unit
ExecStart line unchanged, so nothing restarted. Suites: core 124, cli 25,
castle-api 55; dashboard build + type-check clean.
2026-07-01 10:23:03 -07:00

38 lines
1.1 KiB
TypeScript

import { Link } from "react-router-dom"
import { ArrowLeft } from "lucide-react"
import { KindBadge } from "@/components/KindBadge"
import { StackBadge } from "@/components/StackBadge"
interface DetailHeaderProps {
backTo: string
backLabel: string
name: string
kind?: string | null
stack?: string | null
source?: string | null
children?: React.ReactNode
}
export function DetailHeader({ backTo, backLabel, name, kind, stack, source, children }: DetailHeaderProps) {
return (
<>
<Link to={backTo} className="text-[var(--primary)] hover:underline flex items-center gap-1 mb-6">
<ArrowLeft size={16} /> {backLabel}
</Link>
<div className="flex items-start justify-between gap-3 flex-wrap mb-4">
<h1 className="text-2xl font-bold break-all min-w-0">{name}</h1>
{children}
</div>
<div className="flex items-center gap-3 flex-wrap mb-6">
<KindBadge kind={kind ?? null} />
<StackBadge stack={stack ?? null} />
{source && (
<span className="text-sm text-[var(--muted)] font-mono break-all min-w-0">{source}</span>
)}
</div>
</>
)
}