Frontend - Large World: collapse org/company/team tiers into one expandable React Flow hierarchy (WorldFlow) with per-click expand, persisted node positions, a compact tree sidebar, wrench multi-select delete across levels, and a sized right slide-out (phone/tablet/full) showing an agent summary + drill button. - Agent page: GitHub-style animated contribution grid (VitalsCard), collapsible System Prompt + Personality cards, restructured anatomy cards, bigger avatar with name/title header row, Markdown/JSON-aware rendering, brain registry + history, avatar generate/upload. - User-icon menu (Infrastructure/Brains/Tools/Profile/Credits) + ToolPanel; Master Planner deploy wizard (Specialists/Swarm/Scheduled/Triggered); Team Runs view; reap-progress modal; dashboard is the single live interface. Backend - cm-brain crate (.brain as the agent definition) + brain apply/history. - Hard-purge reap (FK-ordered) + sandbox release + SSE batch-delete. - Swarm self-verifying loop, mode-aware planner, web.search tool, webhooks (migration 0013), org/company/team delete endpoints, scheduler sweeps. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
54 lines
2.0 KiB
TypeScript
54 lines
2.0 KiB
TypeScript
"use client";
|
|
|
|
// The deploy ladder entry: choose a scale (single / team / company / org) then
|
|
// branch into the matching wizard. Single = max fidelity; Team = a baseline
|
|
// topology staffed with templated agents. Company/Org are next rungs.
|
|
|
|
import { useState } from "react";
|
|
|
|
import { ComposeWizard } from "./ComposeWizard";
|
|
import { CreateClawForm } from "./CreateClawForm";
|
|
import { TeamWizard } from "./TeamWizard";
|
|
|
|
type Scope = "choose" | "single" | "team" | "company" | "org";
|
|
|
|
const TIERS: { key: Scope; title: string; blurb: string; soon?: boolean }[] = [
|
|
{ key: "single", title: "Single agent", blurb: "One agent, crafted by you — maximum control & fidelity." },
|
|
{ key: "team", title: "Team", blurb: "A baseline topology staffed with templated agents." },
|
|
{ key: "company", title: "Company", blurb: "A topology of teams." },
|
|
{ key: "org", title: "Organization", blurb: "A topology of companies." },
|
|
];
|
|
|
|
export function DeployWizard() {
|
|
const [scope, setScope] = useState<Scope>("choose");
|
|
|
|
if (scope === "single") return <CreateClawForm />;
|
|
if (scope === "team") return <TeamWizard />;
|
|
if (scope === "company") return <ComposeWizard tier="company" />;
|
|
if (scope === "org") return <ComposeWizard tier="org" />;
|
|
|
|
return (
|
|
<div className="grid w-full max-w-2xl grid-cols-1 gap-3 sm:grid-cols-2">
|
|
{TIERS.map((t) => (
|
|
<button
|
|
key={t.title}
|
|
type="button"
|
|
disabled={t.soon}
|
|
onClick={() => !t.soon && setScope(t.key)}
|
|
className={`rounded-xl border p-4 text-left transition-colors ${
|
|
t.soon
|
|
? "border-border/60 opacity-50"
|
|
: "border-border hover:border-coral hover:bg-surface-warm"
|
|
}`}
|
|
>
|
|
<p className="text-sm font-semibold text-foreground">
|
|
{t.title}
|
|
{t.soon ? <span className="ml-2 text-xxs text-muted-foreground">soon</span> : null}
|
|
</p>
|
|
<p className="mt-1 text-xs text-muted-foreground">{t.blurb}</p>
|
|
</button>
|
|
))}
|
|
</div>
|
|
);
|
|
}
|