refactor: 拆分 ai_cli.py 为模块化 xcli_core 包

将 4130 行的单文件拆分为 13 个职责清晰的模块:
- constants.py: 常量 + 可选依赖导入
- sandbox.py: 安全代码沙箱 (AST检查器 + 子进程隔离)
- config.py: 配置管理 + 日志
- plugin_manager.py: LiuginManager 插件管理器
- cli_base.py: BaseAICLI 基类 (初始化/引擎/插件/命令)
- cli_clawli.py: ClawliMixin 远程模式
- cli_tools.py: ToolMixin 工具调用
- cli_code_exec.py: CodeExecMixin 代码沙箱执行
- cli_display.py: DisplayMixin 显示/输出/图片/帮助
- cli_history.py: HistoryMixin 聊天记录
- cli_core.py: AICLI 主类 + 对话循环 + main()
- tui.py: Textual TUI 界面
- __init__.py: 包导出汇总

ai_cli.py 保留为入口文件 (11行), 根目录整洁。
原逻辑完全不变, 仅做结构拆分。
This commit is contained in:
xiaoli-cli committed 2026-04-25 22:27:59 +08:00
1 parent 7efb6dfe8b
commit 04e2d26809
14 files changed
+3798 -4125

No files matched your search

+94
View File
@@ -0,0 +1,94 @@
# 常量定义
WEB_SERVER_DEFAULT_PORT = 8080
MAX_FILE_SIZE = 52428800 # 50MB
MAX_VIDEO_DURATION = 10000 # 10秒
VIDEO_FRAME_DELAY = 0.04 # 40毫秒
LOVE_FILE_PATH = "love.txt"
DEFAULT_MAX_HISTORY = 999999 # 无限制对话历史
import os
import sys
import importlib.util
import json
import re
import requests
import shutil
import time
import threading
from concurrent.futures import ThreadPoolExecutor, as_completed
from openai import OpenAI
from colorama import init, Fore, Style
# tkinter 仅在视频播放功能中使用,服务器环境可能不可用
try:
import tkinter as tk
from tkinter import ttk
TKINTER_AVAILABLE = True
except ImportError:
TKINTER_AVAILABLE = False
# cv2 仅在视频播放功能中使用
try:
import cv2
CV2_AVAILABLE = True
except ImportError:
CV2_AVAILABLE = False
import numpy as np
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs
import socket
import webbrowser
from datetime import datetime
import logging
# 图像显示相关(可选)
try:
from PIL import Image
PIL_AVAILABLE = True
except ImportError:
PIL_AVAILABLE = False
try:
from ascii_magic import AsciiArt
ASCII_MAGIC_AVAILABLE = True
except ImportError:
ASCII_MAGIC_AVAILABLE = False
# WebSocket 服务端
try:
import websocket_server
WEBSOCKET_AVAILABLE = True
except ImportError:
WEBSOCKET_AVAILABLE = False
# Clawli 独立进程服务器
try:
import clawli_server
CLAWLI_SERVER_AVAILABLE = True
except ImportError:
CLAWLI_SERVER_AVAILABLE = False
# 统一工具管理器 - 支持 Liugin 和 Skill 双协议
try:
from unified_tool_manager import UnifiedToolManager
UNIFIED_TOOL_MANAGER_AVAILABLE = True
except ImportError:
UNIFIED_TOOL_MANAGER_AVAILABLE = False
# Textual TUI 支持
import asyncio
from typing import Optional
from io import StringIO
try:
from textual.app import App, ComposeResult
from textual.containers import Container, Horizontal, Vertical, VerticalScroll
from textual.widgets import Header, Footer, Input, RichLog, Static, Button, Tree
from textual.widgets.tree import TreeNode
from textual.binding import Binding
from textual.events import Mount
TEXTUAL_AVAILABLE = True
except ImportError:
TEXTUAL_AVAILABLE = False
print(f"{Fore.YELLOW}Textual 未安装,TUI 模式不可用。请运行: pip install textual{Style.RESET_ALL}")