Skip to content

Fleet Management

This guide demonstrates fleet-level operations: listing agents, filtering by status, broadcasting messages, and getting summary statistics.

  • @jbcom/agentic installed globally
  • CURSOR_API_KEY environment variable set
Terminal window
agentic fleet list
Terminal window
agentic fleet list --running
Terminal window
agentic fleet summary

Example output:

Fleet Summary
─────────────────────────────────────
Total Agents: 15
πŸƒ Running: 3
βœ… Completed: 10
❌ Failed: 2
Terminal window
agentic fleet models
Terminal window
agentic fleet followup bc-xxx-xxx "Please provide a status update"
import { Fleet } from '@jbcom/agentic';
async function getFleetStatus() {
const fleet = new Fleet();
const summaryResult = await fleet.summary();
if (!summaryResult.success || !summaryResult.data) {
throw new Error(summaryResult.error);
}
const summary = summaryResult.data;
console.log(`Total Agents: ${summary.total}`);
console.log(`πŸƒ Running: ${summary.running}`);
console.log(`βœ… Completed: ${summary.completed}`);
console.log(`❌ Failed: ${summary.failed}`);
return summary;
}
import type { Agent } from '@jbcom/agentic';
import { Fleet } from '@jbcom/agentic';
function displayAgents(agents: Agent[]): void {
if (agents.length === 0) {
console.log('No agents found.');
return;
}
console.log('β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”');
console.log('β”‚ Agent ID β”‚ Status β”‚ Repository β”‚');
console.log('β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€');
for (const agent of agents) {
const id = agent.id.slice(0, 16).padEnd(18);
const status = agent.status.padEnd(10);
const repo = (agent.source.repository.split('/').pop() ?? 'unknown')
.slice(0, 23)
.padEnd(23);
console.log(`β”‚ ${id} β”‚ ${status} β”‚ ${repo} β”‚`);
}
console.log('β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜');
}
async function listAllAgents() {
const fleet = new Fleet();
const listResult = await fleet.list();
if (listResult.success && listResult.data) {
displayAgents(listResult.data);
}
}

Send a message to all running agents simultaneously:

import { Fleet } from '@jbcom/agentic';
async function broadcastStatusCheck() {
const fleet = new Fleet();
// Get running agents
const runningResult = await fleet.running();
if (!runningResult.success || !runningResult.data) {
console.log('No running agents.');
return;
}
const runningAgents = runningResult.data;
console.log(`Broadcasting to ${runningAgents.length} agents...`);
// Send message to all
const agentIds = runningAgents.map((a) => a.id);
const broadcastResults = await fleet.broadcast(
agentIds,
'STATUS CHECK: Please provide a brief progress update.'
);
// Display results
for (const [id, result] of broadcastResults) {
const emoji = result.success ? 'βœ…' : '❌';
const message = result.success ? 'Message sent' : result.error;
console.log(`${emoji} ${id.slice(0, 12)}: ${message}`);
}
}
import { Fleet } from '@jbcom/agentic';
async function listRepositories() {
const fleet = new Fleet();
const reposResult = await fleet.repositories();
if (!reposResult.success || !reposResult.data) {
console.log('Could not fetch repositories.');
return;
}
for (const repo of reposResult.data) {
const visibility = repo.isPrivate ? 'πŸ”’' : '🌐';
console.log(`${visibility} ${repo.fullName} (${repo.defaultBranch})`);
}
}

From the control repository examples:

import type { Agent, AgentStatus } from '@jbcom/agentic';
import { Fleet } from '@jbcom/agentic';
function displayAgents(agents: Agent[]): void {
if (agents.length === 0) {
console.log(' No agents found.');
return;
}
console.log(' β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”');
console.log(' β”‚ Agent ID β”‚ Status β”‚ Repository β”‚');
console.log(' β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€');
for (const agent of agents) {
const id = agent.id.slice(0, 16).padEnd(18);
const status = agent.status.padEnd(10);
const repo = (agent.source.repository.split('/').pop() ?? 'unknown')
.slice(0, 23)
.padEnd(23);
console.log(` β”‚ ${id} β”‚ ${status} β”‚ ${repo} β”‚`);
}
console.log(' β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜');
}
async function main(): Promise<void> {
console.log('🚒 Fleet Management Example\n');
const fleet = new Fleet();
if (!fleet.isApiAvailable()) {
console.error('❌ Cursor API not available.');
process.exit(1);
}
// Get fleet summary
console.log('πŸ“Š Fleet Summary');
console.log('─'.repeat(50));
const summaryResult = await fleet.summary();
if (!summaryResult.success || !summaryResult.data) {
console.error(`❌ Failed to get summary: ${summaryResult.error}`);
process.exit(1);
}
const summary = summaryResult.data;
console.log(` Total Agents: ${summary.total}`);
console.log(` πŸƒ Running: ${summary.running}`);
console.log(` βœ… Completed: ${summary.completed}`);
console.log(` ❌ Failed: ${summary.failed}`);
console.log('');
// List all agents
console.log('πŸ“‹ All Agents');
console.log('─'.repeat(50));
displayAgents(summary.agents);
console.log('');
// Filter running agents
console.log('πŸƒ Running Agents');
console.log('─'.repeat(50));
const runningResult = await fleet.running();
if (runningResult.success && runningResult.data) {
displayAgents(runningResult.data);
// Broadcast to running agents
if (runningResult.data.length > 0) {
console.log('\nπŸ“’ Broadcasting status check...');
const agentIds = runningResult.data.map((a) => a.id);
const broadcastResults = await fleet.broadcast(
agentIds,
'STATUS CHECK: Please provide a brief progress update.'
);
for (const [id, result] of broadcastResults) {
const emoji = result.success ? 'βœ…' : '❌';
console.log(` ${emoji} ${id.slice(0, 12)}: ${result.success ? 'Sent' : result.error}`);
}
}
}
// List repositories
console.log('\nπŸ“ Available Repositories');
console.log('─'.repeat(50));
const reposResult = await fleet.repositories();
if (reposResult.success && reposResult.data) {
for (const repo of reposResult.data.slice(0, 10)) {
const visibility = repo.isPrivate ? 'πŸ”’' : '🌐';
console.log(` ${visibility} ${repo.fullName} (${repo.defaultBranch})`);
}
if (reposResult.data.length > 10) {
console.log(` ... and ${reposResult.data.length - 10} more`);
}
}
// List models
console.log('\nπŸ€– Available Models');
console.log('─'.repeat(50));
const modelsResult = await fleet.listModels();
if (modelsResult.success && modelsResult.data) {
for (const model of modelsResult.data) {
console.log(` β€’ ${model}`);
}
}
console.log('\n✨ Done!');
}
main().catch((error) => {
console.error('Fatal error:', error);
process.exit(1);
});
StatusDescription
PENDINGAgent is queued but not yet started
RUNNINGAgent is actively working
COMPLETEDAgent finished successfully
FINISHEDAlias for COMPLETED
FAILEDAgent encountered an error
CANCELLEDAgent was manually cancelled
UNKNOWNStatus could not be determined
MethodDescription
fleet.list()List all agents
fleet.running()List only running agents
fleet.summary()Get fleet statistics
fleet.spawn(options)Spawn a new agent
fleet.broadcast(ids, message)Send message to multiple agents
fleet.conversation(id)Get agent conversation
fleet.archive(id)Archive agent conversation
fleet.repositories()List available repositories
fleet.listModels()List available AI models