agent-orchestrator/packages/cli/src/commands/open.ts

76 lines
2.6 KiB
TypeScript

import chalk from "chalk";
import type { Command } from "commander";
import { loadConfig } from "@composio/ao-core";
import { exec, getTmuxSessions } from "../lib/shell.js";
import { matchesPrefix } from "../lib/session-utils.js";
async function openInTerminal(sessionName: string, newWindow?: boolean): Promise<boolean> {
try {
const args = newWindow ? ["--new-window", sessionName] : [sessionName];
await exec("open-iterm-tab", args);
return true;
} catch {
// Fall back to tmux attach hint
return false;
}
}
export function registerOpen(program: Command): void {
program
.command("open")
.description("Open session(s) in terminal tabs")
.argument("[target]", 'Session name, project ID, or "all" to open everything')
.option("-w, --new-window", "Open in a new terminal window")
.action(async (target: string | undefined, opts: { newWindow?: boolean }) => {
const config = loadConfig();
const allTmux = await getTmuxSessions();
let sessionsToOpen: string[] = [];
if (!target || target === "all") {
// Open all sessions across all projects
for (const [projectId, project] of Object.entries(config.projects)) {
const prefix = project.sessionPrefix || projectId;
const matching = allTmux.filter((s) => matchesPrefix(s, prefix));
sessionsToOpen.push(...matching);
}
} else if (config.projects[target]) {
// Open all sessions for a specific project
const project = config.projects[target];
const prefix = project.sessionPrefix || target;
sessionsToOpen = allTmux.filter((s) => matchesPrefix(s, prefix));
} else if (allTmux.includes(target)) {
// Open a specific session
sessionsToOpen = [target];
} else {
console.error(
chalk.red(`Unknown target: ${target}\nSpecify a session name, project ID, or "all".`),
);
process.exit(1);
}
if (sessionsToOpen.length === 0) {
console.log(chalk.dim("No sessions to open."));
return;
}
console.log(
chalk.bold(
`Opening ${sessionsToOpen.length} session${sessionsToOpen.length > 1 ? "s" : ""}...\n`,
),
);
for (const session of sessionsToOpen.sort()) {
const opened = await openInTerminal(session, opts.newWindow);
if (opened) {
console.log(chalk.green(` Opened: ${session}`));
} else {
console.log(
` ${chalk.yellow(session)} — attach with: ${chalk.dim(`tmux attach -t ${session}`)}`,
);
}
}
console.log();
});
}