feat(pi): finish subagent runtime surfaces
This commit is contained in:
28
modules/agents/pi/extensions/subagents/ui.ts
Normal file
28
modules/agents/pi/extensions/subagents/ui.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import type { SubagentStatus } from "./types.ts";
|
||||
|
||||
export function renderSummary(statuses: SubagentStatus[]): string[] {
|
||||
const running = statuses.filter((status) => ["starting", "running", "settling"].includes(status.state)).length;
|
||||
const queued = statuses.filter((status) => status.state === "queued").length;
|
||||
const terminal = statuses.filter((status) => ["completed", "failed", "cancelled", "timed_out", "orphaned"].includes(status.state)).length;
|
||||
if (running === 0 && queued === 0 && terminal === 0) return [];
|
||||
return [`subagents: ${running} running · ${queued} queued · ${terminal} recent`];
|
||||
}
|
||||
|
||||
export function renderInspector(statuses: SubagentStatus[]): string[] {
|
||||
const lines = renderSummary(statuses);
|
||||
for (const status of statuses) {
|
||||
lines.push(
|
||||
`${status.id} ${status.label} ${status.context} ${status.state} ${Math.round(status.elapsedMs / 1000)}s ${status.model ?? "inherit"} ${status.tools} ${status.lastEvent ?? "none"} result:${status.resultAvailable ? "yes" : "no"}`,
|
||||
);
|
||||
}
|
||||
return lines;
|
||||
}
|
||||
|
||||
export function widget(statuses: SubagentStatus[], expanded: boolean) {
|
||||
return () => ({
|
||||
invalidate() {},
|
||||
render(width: number) {
|
||||
return (expanded ? renderInspector(statuses) : renderSummary(statuses)).map((line) => (line.length > width ? line.slice(0, Math.max(0, width - 1)) : line));
|
||||
},
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user