""" Banner display for Hindsight API startup. Shows the logo and tagline with gradient colors. """ # Gradient colors: #0074d9 -> #009296 GRADIENT_START = (0, 116, 217) # #0074d9 GRADIENT_END = (0, 146, 150) # #009296 # Pre-generated logo (generated by test-logo.py) LOGO = """\ \033[38;2;9;127;184m\u2584\033[0m\033[48;2;8;130;178m\033[38;2;5;133;186m\u2584\033[0m \033[48;2;10;143;160m\033[38;2;10;143;165m\u2584\033[0m\033[38;2;7;140;156m\u2584\033[0m \033[38;2;8;125;192m\u2584\033[0m \033[38;2;3;132;191m\u2580\033[0m\033[38;2;2;133;192m\u2584\033[0m \033[38;2;3;132;180m\u2584\033[0m\033[38;2;1;137;184m\u2584\033[0m\033[38;2;3;133;174m\u2584\033[0m \033[38;2;3;142;176m\u2584\033[0m\033[38;2;4;142;169m\u2580\033[0m \033[38;2;10;144;164m\u2584\033[0m \033[38;2;6;121;195m\u2580\033[0m\033[38;2;5;128;203m\u2580\033[0m\033[48;2;5;124;195m\033[38;2;3;125;200m\u2584\033[0m\033[38;2;2;126;196m\u2584\033[0m\033[48;2;3;128;188m\033[38;2;1;131;196m\u2584\033[0m\033[48;2;0;152;219m\033[38;2;2;131;191m\u2584\033[0m\033[38;2;1;141;196m\u2580\033[0m\033[38;2;1;135;183m\u2580\033[0m\033[38;2;1;148;198m\u2580\033[0m\033[48;2;1;156;202m\033[38;2;2;135;180m\u2584\033[0m\033[48;2;4;134;169m\033[38;2;1;137;177m\u2584\033[0m\033[38;2;3;138;173m\u2584\033[0m\033[48;2;6;137;165m\033[38;2;2;140;170m\u2584\033[0m\033[38;2;7;144;169m\u2580\033[0m\033[38;2;7;139;158m\u2580\033[0m \033[48;2;2;128;202m\033[38;2;2;124;201m\u2584\033[0m\033[48;2;1;130;201m\033[38;2;0;135;212m\u2584\033[0m\033[38;2;2;128;196m\u2584\033[0m \033[48;2;2;142;204m\033[38;2;7;138;199m\u2584\033[0m \033[38;2;1;135;186m\u2584\033[0m\033[48;2;1;142;186m\033[38;2;2;144;194m\u2584\033[0m\033[48;2;3;138;176m\033[38;2;2;134;176m\u2584\033[0m \033[48;2;8;118;200m\033[38;2;8;121;209m\u2584\033[0m\033[38;2;3;121;203m\u2580\033[0m \033[38;2;3;122;192m\u2580\033[0m\033[38;2;1;138;216m\u2580\033[0m\033[48;2;0;138;210m\033[38;2;3;128;198m\u2584\033[0m\033[48;2;0;126;188m\033[38;2;2;131;198m\u2584\033[0m\033[48;2;0;142;205m\033[38;2;3;132;193m\u2584\033[0m\033[38;2;1;140;196m\u2580\033[0m \033[38;2;4;134;175m\u2580\033[0m\033[48;2;13;135;167m\033[38;2;8;136;174m\u2584\033[0m """ def _interpolate_color(start: tuple, end: tuple, t: float) -> tuple: """Interpolate between two RGB colors.""" return ( int(start[0] + (end[0] - start[0]) * t), int(start[1] + (end[1] - start[1]) * t), int(start[2] + (end[2] - start[2]) * t), ) def gradient_text(text: str, start: tuple = GRADIENT_START, end: tuple = GRADIENT_END) -> str: """Render text with a gradient color effect.""" result = [] length = len(text) for i, char in enumerate(text): if char == ' ': result.append(' ') else: t = i / max(length - 1, 1) r, g, b = _interpolate_color(start, end, t) result.append(f"\033[38;2;{r};{g};{b}m{char}") result.append("\033[0m") return "".join(result) def print_banner(): """Print the Hindsight startup banner.""" print(LOGO) tagline = gradient_text("Hindsight: Agent Memory That Works Like Human Memory") print(f"\n {tagline}\n") def color(text: str, t: float = 0.0) -> str: """Color text using gradient position (0.0 = start, 1.0 = end).""" r, g, b = _interpolate_color(GRADIENT_START, GRADIENT_END, t) return f"\033[38;2;{r};{g};{b}m{text}\033[0m" def color_start(text: str) -> str: """Color text with gradient start color (#0074d9).""" return color(text, 0.0) def color_end(text: str) -> str: """Color text with gradient end color (#009296).""" return color(text, 1.0) def color_mid(text: str) -> str: """Color text with gradient middle color.""" return color(text, 0.5) def dim(text: str) -> str: """Dim/gray text.""" return f"\033[38;2;128;128;128m{text}\033[0m" def print_startup_info(host: str, port: int, database_url: str, llm_provider: str, llm_model: str, embeddings_provider: str, reranker_provider: str, mcp_enabled: bool = False): """Print styled startup information.""" print(color_start("Starting Hindsight API...")) print(f" {dim('URL:')} {color(f'http://{host}:{port}', 0.2)}") print(f" {dim('Database:')} {color(database_url, 0.4)}") print(f" {dim('LLM:')} {color(f'{llm_provider} / {llm_model}', 0.6)}") print(f" {dim('Embeddings:')} {color(embeddings_provider, 0.8)}") print(f" {dim('Reranker:')} {color(reranker_provider, 1.0)}") if mcp_enabled: print(f" {dim('MCP:')} {color_end('enabled at /mcp')}") print()