UNPKG

@mariozechner/pi-coding-agent

Version:

Coding agent CLI with read, bash, edit, write tools and session management

97 lines 3.78 kB
import { getOAuthProviders } from "@mariozechner/pi-ai/oauth"; import { Container, getKeybindings, Spacer, TruncatedText } from "@mariozechner/pi-tui"; import { theme } from "../theme/theme.js"; import { DynamicBorder } from "./dynamic-border.js"; /** * Component that renders an OAuth provider selector */ export class OAuthSelectorComponent extends Container { listContainer; allProviders = []; selectedIndex = 0; mode; authStorage; onSelectCallback; onCancelCallback; constructor(mode, authStorage, onSelect, onCancel) { super(); this.mode = mode; this.authStorage = authStorage; this.onSelectCallback = onSelect; this.onCancelCallback = onCancel; // Load all OAuth providers this.loadProviders(); // Add top border this.addChild(new DynamicBorder()); this.addChild(new Spacer(1)); // Add title const title = mode === "login" ? "Select provider to login:" : "Select provider to logout:"; this.addChild(new TruncatedText(theme.bold(title))); this.addChild(new Spacer(1)); // Create list container this.listContainer = new Container(); this.addChild(this.listContainer); this.addChild(new Spacer(1)); // Add bottom border this.addChild(new DynamicBorder()); // Initial render this.updateList(); } loadProviders() { this.allProviders = getOAuthProviders(); } updateList() { this.listContainer.clear(); for (let i = 0; i < this.allProviders.length; i++) { const provider = this.allProviders[i]; if (!provider) continue; const isSelected = i === this.selectedIndex; // Check if user is logged in for this provider const credentials = this.authStorage.get(provider.id); const isLoggedIn = credentials?.type === "oauth"; const statusIndicator = isLoggedIn ? theme.fg("success", " ✓ logged in") : ""; let line = ""; if (isSelected) { const prefix = theme.fg("accent", "→ "); const text = theme.fg("accent", provider.name); line = prefix + text + statusIndicator; } else { const text = ` ${provider.name}`; line = text + statusIndicator; } this.listContainer.addChild(new TruncatedText(line, 0, 0)); } // Show "no providers" if empty if (this.allProviders.length === 0) { const message = this.mode === "login" ? "No OAuth providers available" : "No OAuth providers logged in. Use /login first."; this.listContainer.addChild(new TruncatedText(theme.fg("muted", ` ${message}`), 0, 0)); } } handleInput(keyData) { const kb = getKeybindings(); // Up arrow if (kb.matches(keyData, "tui.select.up")) { this.selectedIndex = Math.max(0, this.selectedIndex - 1); this.updateList(); } // Down arrow else if (kb.matches(keyData, "tui.select.down")) { this.selectedIndex = Math.min(this.allProviders.length - 1, this.selectedIndex + 1); this.updateList(); } // Enter else if (kb.matches(keyData, "tui.select.confirm")) { const selectedProvider = this.allProviders[this.selectedIndex]; if (selectedProvider) { this.onSelectCallback(selectedProvider.id); } } // Escape or Ctrl+C else if (kb.matches(keyData, "tui.select.cancel")) { this.onCancelCallback(); } } } //# sourceMappingURL=oauth-selector.js.map