mirror of
https://github.com/agentscope-ai/ReMe.git
synced 2026-09-11 22:51:10 +00:00
* feat: add Neo4j file graph support and markdown parser with wikilink extraction - Add Neo4jFileGraph implementation for property-graph storage with virtual/real node handling and link management - Introduce LinkedFileParser for markdown files with frontmatter, wikilink graph extraction, and full-skeleton chunking - Update pyproject.toml to include pyyaml, mistletoe, and neo4j dependencies - Modify .gitignore to exclude /vault and structure.md - Change reme CLI entry point from reme_ai.main to remecli.reme - Register new neo4j and md components in respective registries * refactor(file-graph): add chunk_ids support to Neo4jFileGraph Add chunk_ids field to File node properties in Neo4jFileGraph to enable better content chunk tracking and management. BREAKING CHANGE: File node schema now includes chunk_ids property which may affect existing integrations. feat(parser): implement wikilink resolution logic Move path resolution logic from utils/path_resolver to linked_file_parser module and enhance wikilink resolution with folder-note rule support and improved error handling. fix(tests): update test assertions and variable names Update test cases to reflect changes in data structures and variable naming conventions across various components. chore(config): update package entry point reference Change reme CLI entry point from remecli.reme:main to reme_ai.reme:main in pyproject.toml. refactor(utils): remove deprecated path_resolver module Remove the old path_resolver utility module as its functionality has been moved to linked_file_parser. docs(file-graph): update Neo4jFileGraph documentation Update class docstrings and comments to reflect new chunk_ids property and other structural changes. style(formatting): adjust code formatting and line breaks Minor formatting improvements including line length optimization and consistent spacing adjustments throughout the codebase. * fix(pyproject.toml): correct entry point for reme command Change the entry point from "reme_ai.reme:main" to "reme_ai.main:main" to fix the module reference for the reme command in project scripts.
103 lines
4.1 KiB
Python
103 lines
4.1 KiB
Python
"""Startup banner with ASCII logo and service metadata."""
|
|
|
|
import colorsys
|
|
import importlib.metadata
|
|
import random
|
|
from typing import TYPE_CHECKING
|
|
|
|
from rich.console import Console, Group
|
|
from rich.panel import Panel
|
|
from rich.table import Table
|
|
from rich.text import Text
|
|
|
|
if TYPE_CHECKING:
|
|
from ..schema import ApplicationConfig
|
|
|
|
|
|
def get_version(package_name: str) -> str:
|
|
"""Return installed package version, or empty string if not installed."""
|
|
try:
|
|
return importlib.metadata.version(package_name)
|
|
except importlib.metadata.PackageNotFoundError:
|
|
return ""
|
|
|
|
|
|
def _hsv_rgb(h: float, s: float = 0.85, v: float = 0.98) -> tuple[int, int, int]:
|
|
"""HSV → 0-255 RGB tuple. High saturation+value keeps colors vibrant."""
|
|
r, g, b = colorsys.hsv_to_rgb(h % 1.0, s, v)
|
|
return int(r * 255), int(g * 255), int(b * 255)
|
|
|
|
|
|
def print_logo(app_config: "ApplicationConfig"):
|
|
"""Print rainbow ASCII logo and runtime config (backend, URL, versions).
|
|
|
|
Color: each startup picks a random hue rotation; both horizontal
|
|
(across each line) and vertical (line-to-line) sweep ~half the
|
|
hue wheel, so the banner shows a fresh multi-color rainbow gradient
|
|
every run.
|
|
"""
|
|
ascii_art = [
|
|
r" ██████╗ ███████╗ ███╗ ███╗ ███████╗ ",
|
|
r" ██╔══██╗ ██╔════╝ ████╗ ████║ ██╔════╝ ",
|
|
r" ██████╔╝ █████╗ ██╔████╔██║ █████╗ ",
|
|
r" ██╔══██╗ ██╔══╝ ██║╚██╔╝██║ ██╔══╝ ",
|
|
r" ██║ ██║ ███████╗ ██║ ╚═╝ ██║ ███████╗ ",
|
|
r" ╚═╝ ╚═╝ ╚══════╝ ╚═╝ ╚═╝ ╚══════╝ ",
|
|
]
|
|
|
|
hue_base = random.random() # random starting hue per startup
|
|
horizontal_span = 0.5 # half the wheel left-to-right
|
|
vertical_shift = 0.08 # small per-line nudge for 2D rainbow
|
|
|
|
logo_text = Text()
|
|
for line_idx, line in enumerate(ascii_art):
|
|
line_len = max(1, len(line) - 1)
|
|
line_hue_start = hue_base + line_idx * vertical_shift
|
|
for i, char in enumerate(line):
|
|
ratio = i / line_len
|
|
r, g, b = _hsv_rgb(line_hue_start + horizontal_span * ratio)
|
|
logo_text.append(char, style=f"bold rgb({r},{g},{b})")
|
|
logo_text.append("\n")
|
|
|
|
info_table = Table.grid(padding=(0, 1))
|
|
info_table.add_column(style="bold", justify="center")
|
|
info_table.add_column(style="bold cyan", justify="left")
|
|
info_table.add_column(style="white", justify="left")
|
|
|
|
# service is a ComponentConfig with extra="allow"; backend-specific fields live in model_extra.
|
|
service = app_config.service
|
|
backend = service.backend
|
|
extra = service.model_extra or {}
|
|
|
|
info_table.add_row("📦", "Backend:", backend)
|
|
|
|
match backend:
|
|
case "http":
|
|
host = extra.get("host", "localhost")
|
|
port = extra.get("port", 8000)
|
|
info_table.add_row("🔗", "URL:", f"http://{host}:{port}")
|
|
info_table.add_row("📚", "FastAPI:", Text(get_version("fastapi"), style="dim"))
|
|
case "mcp":
|
|
transport = extra.get("transport", "stdio")
|
|
info_table.add_row("🚌", "Transport:", transport)
|
|
if transport != "stdio":
|
|
host = extra.get("host", "localhost")
|
|
port = extra.get("port", 8000)
|
|
url = f"http://{host}:{port}"
|
|
if transport == "sse":
|
|
url += "/sse"
|
|
info_table.add_row("🔗", "URL:", url)
|
|
info_table.add_row("📚", "FastMCP:", Text(get_version("fastmcp"), style="dim"))
|
|
|
|
info_table.add_row("🚀", "ReMe:", Text(get_version("reme-ai"), style="dim"))
|
|
|
|
panel = Panel(
|
|
Group(logo_text, info_table),
|
|
title=app_config.app_name,
|
|
title_align="left",
|
|
border_style="dim",
|
|
padding=(1, 4),
|
|
expand=False,
|
|
)
|
|
|
|
Console().print(Group("\n", panel, "\n"))
|