Watch
0
0
Fork
You've already forked hyperhive
0
hyperhive/frontend/packages/swarm-ui/src/agent/detail/allowed-domains.ts
iris 2eaa02e892 swarm-ui: the agents page is one column of cards that open in place
The roster loses its second column and its table view. Selecting a card opens
its details under it as four folded sections: overview, settings, accounts and
the terminal. The status, message and wanted rows, which the card header
already shows, are gone from the details. The terminal page's details dialog
keeps the flat list.
2026-11-01 01:21:43 +01:00

59 lines
1.9 KiB
TypeScript

// The allowed-domains editor of an opened agent card: which entries it
// shows and the bodies it sends. Kept out of the component so `npm test` can
// run it.
/** One entry as `GET /api/egress/allowed-domains` carries it. */
export interface AllowedDomain {
domain: string;
/** Absent for an entry that holds for every agent in the swarm. */
agent?: string;
/**
* Kept by the controller from the agent's backend environment: shown as
* automatic, and the route refuses to remove it.
*/
derived?: boolean;
}
export const ALLOWED_DOMAINS_URL = "/api/egress/allowed-domains";
/**
* The entries that apply to `agent`: the swarm-wide ones first, then the ones
* for this agent alone. Entries for other agents are not shown on this panel.
*/
export function entriesFor(
entries: AllowedDomain[],
agent: string,
): AllowedDomain[] {
const swarmWide = entries.filter((e) => e.agent === undefined);
const own = entries.filter((e) => e.agent === agent);
return [...swarmWide, ...own];
}
/** What the panel says about a list of entries. */
export function allowedSummary(shown: AllowedDomain[]): string {
if (shown.length === 0) return "none added";
const swarmWide = shown.filter((e) => e.agent === undefined).length;
const automatic = shown.filter((e) => e.derived === true).length;
const own = shown.length - swarmWide - automatic;
return [
swarmWide > 0 ? `${swarmWide} swarm-wide` : null,
own > 0 ? `${own} for this agent` : null,
automatic > 0 ? `${automatic} automatic` : null,
]
.filter((part) => part !== null)
.join(", ");
}
/**
* The body that adds or removes `domain`, as typed: the route lower-cases it
* and refuses what is not a name. `forSwarm` makes it hold for every agent;
* otherwise it is for `agent` alone.
*/
export function entryBody(
domain: string,
forSwarm: boolean,
agent: string,
): AllowedDomain {
const name = domain.trim();
return forSwarm ? { domain: name } : { domain: name, agent };
}