Skip to content

Commit 608fbdf

Browse files
improv: ui, pagination
1 parent fd28478 commit 608fbdf

File tree

4 files changed

+86
-39
lines changed

4 files changed

+86
-39
lines changed

core/control-plane/client.ts

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -501,9 +501,13 @@ export class ControlPlaneClient {
501501
/**
502502
* List all background agents for the current user or organization
503503
* @param organizationId - Optional organization ID to filter agents by organization scope
504+
* @param limit - Optional limit for number of agents to return (default: 5)
504505
*/
505-
public async listBackgroundAgents(organizationId?: string): Promise<
506-
Array<{
506+
public async listBackgroundAgents(
507+
organizationId?: string,
508+
limit?: number,
509+
): Promise<{
510+
agents: Array<{
507511
id: string;
508512
name: string | null;
509513
status: string;
@@ -512,43 +516,56 @@ export class ControlPlaneClient {
512516
metadata?: {
513517
github_repo?: string;
514518
};
515-
}>
516-
> {
519+
}>;
520+
totalCount: number;
521+
}> {
517522
if (!(await this.isSignedIn())) {
518-
return [];
523+
return { agents: [], totalCount: 0 };
519524
}
520525

521526
try {
522-
// Build URL with optional organizationId query parameter
523-
let url = "agents";
527+
// Build URL with query parameters
528+
const params = new URLSearchParams();
524529
if (organizationId) {
525-
url += `?organizationId=${encodeURIComponent(organizationId)}`;
530+
params.set("organizationId", organizationId);
526531
}
532+
if (limit !== undefined) {
533+
params.set("limit", limit.toString());
534+
}
535+
536+
const url = `agents${params.toString() ? `?${params.toString()}` : ""}`;
527537

528538
const resp = await this.requestAndHandleError(url, {
529539
method: "GET",
530540
});
531541

532-
const agents = (await resp.json()) as any[];
542+
const result = (await resp.json()) as {
543+
agents: any[];
544+
totalCount: number;
545+
};
533546

534-
return agents.map((agent: any) => ({
535-
id: agent.id,
536-
name: agent.name || agent.metadata?.name || null,
537-
status: agent.status,
538-
repoUrl: agent.metadata?.repo_url || agent.repo_url || "",
539-
createdAt:
540-
agent.created_at || agent.create_time_ms
541-
? new Date(agent.created_at || agent.create_time_ms).toISOString()
542-
: new Date().toISOString(),
543-
metadata: {
544-
github_repo: agent.metadata?.github_repo || agent.metadata?.repo_url,
545-
},
546-
}));
547+
return {
548+
agents: result.agents.map((agent: any) => ({
549+
id: agent.id,
550+
name: agent.name || agent.metadata?.name || null,
551+
status: agent.status,
552+
repoUrl: agent.metadata?.repo_url || agent.repo_url || "",
553+
createdAt:
554+
agent.created_at || agent.create_time_ms
555+
? new Date(agent.created_at || agent.create_time_ms).toISOString()
556+
: new Date().toISOString(),
557+
metadata: {
558+
github_repo:
559+
agent.metadata?.github_repo || agent.metadata?.repo_url,
560+
},
561+
})),
562+
totalCount: result.totalCount,
563+
};
547564
} catch (e) {
548565
Logger.error(e, {
549566
context: "control_plane_list_background_agents",
550567
});
551-
return [];
568+
return { agents: [], totalCount: 0 };
552569
}
553570
}
554571
}

core/protocol/ideWebview.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,20 @@ export type ToIdeFromWebviewProtocol = ToIdeFromWebviewOrCoreProtocol & {
6262
void,
6363
];
6464
listBackgroundAgents: [
65-
{ organizationId?: string },
66-
Array<{
67-
id: string;
68-
name: string | null;
69-
status: string;
70-
repoUrl: string;
71-
createdAt: string;
72-
metadata?: {
73-
github_repo?: string;
74-
};
75-
}>,
65+
{ organizationId?: string; limit?: number },
66+
{
67+
agents: Array<{
68+
id: string;
69+
name: string | null;
70+
status: string;
71+
repoUrl: string;
72+
createdAt: string;
73+
metadata?: {
74+
github_repo?: string;
75+
};
76+
}>;
77+
totalCount: number;
78+
},
7679
];
7780
};
7881

extensions/vscode/src/extension/VsCodeMessenger.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -391,17 +391,18 @@ export class VsCodeMessenger {
391391

392392
this.onWebview("listBackgroundAgents", async (msg) => {
393393
const configHandler = await configHandlerPromise;
394-
const { organizationId } = msg.data;
394+
const { organizationId, limit } = msg.data;
395395

396396
try {
397-
const agents =
397+
const result =
398398
await configHandler.controlPlaneClient.listBackgroundAgents(
399399
organizationId,
400+
limit,
400401
);
401-
return agents;
402+
return result;
402403
} catch (e) {
403404
console.error("Error listing background agents:", e);
404-
return [];
405+
return { agents: [], totalCount: 0 };
405406
}
406407
});
407408

gui/src/components/BackgroundMode/AgentsList.tsx

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,14 @@ export function AgentsList({ isCreatingAgent = false }: AgentsListProps) {
2525
const ideMessenger = useContext(IdeMessengerContext);
2626
const currentOrg = useAppSelector(selectCurrentOrg);
2727
const [agents, setAgents] = useState<Agent[] | null>(null);
28+
const [totalCount, setTotalCount] = useState<number>(0);
2829
const [error, setError] = useState<string | null>(null);
2930

3031
useEffect(() => {
3132
async function fetchAgents() {
3233
if (!session) {
3334
setAgents([]);
35+
setTotalCount(0);
3436
return;
3537
}
3638

@@ -39,21 +41,30 @@ export function AgentsList({ isCreatingAgent = false }: AgentsListProps) {
3941
currentOrg?.id !== "personal" ? currentOrg?.id : undefined;
4042
const result = await ideMessenger.request("listBackgroundAgents", {
4143
organizationId,
44+
limit: 5,
4245
});
4346

4447
if ("status" in result && result.status === "success") {
45-
setAgents(Array.isArray(result.content) ? result.content : []);
48+
const content = result.content as {
49+
agents: Agent[];
50+
totalCount: number;
51+
};
52+
setAgents(content.agents || []);
53+
setTotalCount(content.totalCount || 0);
4654
setError(null);
4755
} else if ("error" in result) {
4856
setError(result.error);
4957
setAgents([]);
58+
setTotalCount(0);
5059
} else {
5160
setAgents([]);
61+
setTotalCount(0);
5262
}
5363
} catch (err: any) {
5464
console.error("Failed to fetch agents:", err);
5565
setError(err.message || "Failed to load agents");
5666
setAgents([]);
67+
setTotalCount(0);
5768
}
5869
}
5970

@@ -127,6 +138,21 @@ export function AgentsList({ isCreatingAgent = false }: AgentsListProps) {
127138
</div>
128139
</div>
129140
))}
141+
{totalCount > agents.length && (
142+
<div className="mt-2">
143+
<button
144+
onClick={() => {
145+
ideMessenger.post("controlPlane/openUrl", {
146+
path: "agents",
147+
orgSlug: currentOrg?.slug,
148+
});
149+
}}
150+
className="text-link w-full cursor-pointer border-none bg-transparent p-0 text-center text-sm font-medium no-underline hover:underline"
151+
>
152+
See all {totalCount} tasks →
153+
</button>
154+
</div>
155+
)}
130156
</div>
131157
</div>
132158
);

0 commit comments

Comments
 (0)