XteVision Coder 是什么,为谁而设?
XteVision Coder 是一款 AI 辅助的代码编辑器和网页端 IDE,面向希望借助集成 AI 支持来创建、编辑和管理项目的开发者。它提供专业的三面板工作站布局,包含文件浏览器、代码编辑器、AI 聊天、实时预览和终端访问——全部在本地运行,并支持多种 AI 模型。
高层设计与通信流程
┌──────────────────────────────────────────────────────────┐
│ 浏览器 (客户端) │
│ ┌────────────────────────────────────────────────────┐ │
│ │ 前端 (原生 JavaScript) │ │
│ │ ┌────────┐ ┌────────┐ ┌──────┐ ┌────────┐ │ │
│ │ │ 文件 │ │ Monaco │ │ AI │ │ 实时 │ │ │
│ │ │浏览器 │ │ 编辑器 │ │ 聊天 │ │预览 │ │ │
│ │ └────────┘ └────────┘ └──────┘ └────────┘ │ │
│ └────────────────────────────────────────────────────┘ │
└──────────────────────┬───────────────────────────────────┘
│ HTTP/REST API (localhost:5004)
┌──────────────────────┴───────────────────────────────────┐
│ Python 后端服务器 │
│ ┌──────────┐ ┌────────┐ ┌────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 文件 I/O │ │ Shell │ │AI 代理│ │工作区 │ │认证/聊天 │ │
│ └──────────┘ └────────┘ └────────┘ └──────────┘ └──────────┘ │
└──────────────────────┬───────────────────────────────────┘
┌───────────┬───────────┬───────────┐
│ │ │ │
┌─────▼──────┐ ┌──▼────────┐ ┌▼──────────┐
│ 文件 │ │PostgreSQL │ │ AI 模型 │
│ 系统 │ │用户 + │ │ 服务器 │
│ │ │会话 │ │ │
└────────────┘ └───────────┘ └───────────┘XteVision Coder 面向 本地优先开发 设计:
前端、后端与 AI 集成技术
| 技术 | 版本 | 用途 |
|---|---|---|
| JavaScript (ES6+) | ES2020+ | 应用逻辑 |
| HTML5 | - | 语义化结构 |
| CSS3 | - | 样式与布局 |
| Monaco Editor | 0.52.2 | 代码编辑 |
| Marked.js | - | Markdown 解析 |
| Prism.js | - | 语法高亮 |
| html2pdf.js | - | PDF 生成 |
| FontAwesome | 免费 | 图标库 |
| 技术 | 版本 | 用途 |
|---|---|---|
| Python | 3.8+ | HTTP 服务器 |
| http.server | 标准库 | 基础 HTTP 服务器 |
| socketserver | 标准库 | TCP 线程 |
| subprocess | 标准库 | shell 执行 |
| PostgreSQL | 12+ | 用户账号、认证会话与聊天会话 |
| psycopg2 | 2.9+ | PostgreSQL 连接 |
| argon2-cffi | 23+ | 密码哈希 |
| PyJWT | 2.8+ | 签名版 Prodigy 交接令牌 |
| 浏览器 | 支持 | 备注 |
|---|---|---|
| Chrome/Edge | ✅ 完整 | File System Access API |
| Firefox | ⚠️ 部分 | 基于服务器 I/O |
| Safari | ⚠️ 部分 | 受限的文件访问 |
几分钟内让 XteVision Coder 运行起来
cd /path/to/mlx_coder
bash download-monaco.sh
mlx_lm.server --model <your-model-path> --port 5010
pip3 install -r requirements.txt
# 默认配置
python3 server.py
# 自定义端口
PORT=8080 python3 server.py
# 使用基于 PostgreSQL 的认证
XTEVISION_DB_HOST=192.168.1.4 \
XTEVISION_DB_PORT=5432 \
XTEVISION_DB_NAME=codebase \
XTEVISION_DB_USER=postgres \
XTEVISION_DB_PASSWORD=your-db-password \
python3 server.py
http://localhost:5004
XteVision Coder 现在基于 cookie 认证,并由 PostgreSQL 支撑。每个用户只能看到自己的已保存聊天会话和工作区恢复数据。
codebase。在启动时,当配置好的数据库可达时,Coder 会自动创建并迁移 coder 模式。XTEVISION_AUTH_COOKIE_NAME:会话 cookie 名称,默认为 xtevision_sessionXTEVISION_AUTH_SESSION_DAYS:cookie 有效期(天数),默认为 14XTEVISION_AUTH_ALLOW_REGISTRATION:启用/禁用本地注册XTEVISION_PRODIGY_SHARED_SECRET:可选的共享密钥,用于将来可信的 Prodigy 启动交接将 OpenRouter 作为 AI 后端使用:
https://openrouter.ai/api/v1/chat/completionsqwen/qwen3.6-plus-preview当选中 OpenRouter 时,XteVision Coder 会附加以下请求头:
Authorization: Bearer <OPENROUTER_API_KEY>HTTP-Referer: <配置的网站 URL>X-OpenRouter-Title: <配置的网站标题>目录布局与模块组织
mlx_coder/ ├── index.html # 主 HTML 入口 ├── style.css # 应用样式 ├── script.js # Bootstrap 与模块加载器 ├── server.py # Python HTTP 后端 ├── .mlx.json # 项目状态 ├── js/ │ ├── modules/ # 前端 ES6 模块 │ │ ├── state.js # 全局状态管理 │ │ ├── config.js # AI 配置与各供应商特定设置 │ │ ├── utils.js # 工具函数 │ │ ├── filesystem.js # 文件 I/O 与工作区 │ │ ├── editor.js # Monaco Editor 初始化 │ │ ├── chat.js # AI 聊天与流式传输 │ │ ├── agent.js # 智能体循环与函数调用 │ │ ├── auth.js # 登录/注册/登出引导 │ │ ├── sessionPersistence.js # 聊天会话自动保存与恢复 │ │ ├── tools.js # 工具定义 │ │ ├── diff.js # 基于 diff 的编辑 │ │ ├── preview.js # 实时预览与 PDF 导出 │ │ └── ui.js # UI 渲染与交互 │ ├── marked.min.js # Markdown 解析器 │ ├── prism.min.js # 语法高亮器 │ └── html2pdf.bundle.min.js # PDF 生成 ├── fontawesome-free-web/ # FontAwesome 图标 ├── requirements.txt # Python 认证/数据库依赖 ├── projects/ # 用户项目文件 └── logs/app.log # 应用日志
export const state = {
editor: null, // Monaco Editor 实例
files: {}, // 文件内容缓存
openTabs: [], // 已开编辑器标签页
activeTabPath: null, // 活动标签页路径
tabDirty: {}, // 各标签页的未保存状态
messageHistory: [], // 当前聊天消息历史
chatSessionId: null, // 当前已保存聊天会话 ID
chatSessions: [], // 可用的已保存聊天会话
workspaceFolders: new Map() // 已打开的工作区文件夹
};
文件浏览器、代码编辑器、AI 聊天、预览和终端
多根工作区、拖放式操作、上下文菜单、路径遍历保护,以及三种工作区模式(原生、服务器、回退)。
Monaco Editor,支持 20+ 语言、多标签页编辑、IntelliSense、迷你地图、查找/替换、多光标和代码折叠。
流式与智能体模式、SSE 响应、7 个工具、@-提及、代码块操作(复制、智能合并、插入、创建、替换)以及可视化 diff 预览。
按用户持久化的 AI 会话,支持重命名、搜索、收藏、自动保存,以及聊天历史和/或工作区/编辑器状态的恢复。
在沙箱化 iframe 中渲染 HTML、Markdown 转 HTML、YAML 格式化,以及通过 html2pdf 导出 PDF。
LOG 和 SHELL 标签页、100 条命令历史、40+ 命令白名单、被拦截模式的纵深防御。
独立浏览器登录、安全的会话 cookie、Argon2 哈希密码,以及将来的签名版 Prodigy 启动支持。
| 属性 | 值 |
|---|---|
| 最大迭代次数 | 每任务 15 步 |
| 超时 | 最长 1 小时 |
| 重试逻辑 | 3 次重试,指数退避 |
| 可用工具 | read_file, write_file, edit_file, list_files, search_files, run_shell, create_directory |
核心模块与事件系统
集中式状态,通过 Proxy 进行惰性 DOM 缓存,并带拼写错误检测。
AI 服务器预设、供应商特定请求头、OpenRouter 头注入、localStorage 持久化以及连接健康检查。
公共辅助函数:escapeHtml、logToTerminal、safeFetchJson、cleanContent。
文件 I/O(原生 + 服务器)、工作区管理、拖放、IndexedDB、AI 辅助。
Monaco 初始化、多标签页管理、保存操作、未保存状态跟踪。
消息处理、供应商特定请求头、SSE 流式传输、智能体协调、代码块操作、@-提及以及会话感知的消息历史更新。
多步执行、供应商特定请求头、函数调用、工具解析、重试逻辑、Copilot 协议。
登录/注册/登出流程、启动门控,以及为受保护的 IDE 外壳更新认证 HUD。
自动保存聊天会话、恢复最新会话,并重新填充工作区根、标签页、未保存缓冲区与收藏。
工具模式、执行逻辑、针对 7 个工具的参数验证。
// 用于设置变更的自定义事件
window.dispatchEvent(new CustomEvent('xtevision-settings-changed'));
// 监听事件
window.addEventListener('xtevision-settings-changed', () => {
// 对设置变更做出反应
});
// 异步初始化的全局错误边界
try {
await checkServerAvailability();
await connectToServerWorkspace();
} catch (error) {
logToTerminal(`初始化错误: ${error.message}`, 'error');
}
Python 服务器配置与请求处理
PORT = int(os.environ.get('PORT', 5004))
PROJECTS_DIR = os.path.join(os.getcwd(), 'projects')
AI_PROXY_TIMEOUT_SEC = 3660
AUTH_COOKIE_NAME = os.environ.get('XTEVISION_AUTH_COOKIE_NAME', 'xtevision_session')
AUTH_DB_HOST = os.environ.get('XTEVISION_DB_HOST', '192.168.1.4')
AUTH_DB_NAME = os.environ.get('XTEVISION_DB_NAME', 'codebase')
PRODIGY_JWT_SECRET = os.environ.get('XTEVISION_PRODIGY_SHARED_SECRET', '')
_current_dir_lock = threading.Lock()
_current_dir = os.getcwd()
def get_current_dir():
with _current_dir_lock:
return _current_dir
后端会初始化一个包含以下内容的 coder PostgreSQL 模式:
users:用于本地和将来 Prodigy 关联的身份auth_sessions:用于安全的会话 cookie 登录状态auth_launch_tokens:一次性签名启动交接chat_sessions:用于保存的聊天、标题、收藏和 UI 恢复负载class CustomHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self): # 处理 GET
def do_POST(self): # 处理 POST
def do_OPTIONS(self): # CORS 预检
def end_headers(self): # 添加 CORS 头
后端提供两个 AI 相关的代理端点:
/api/proxy:用于模型发现等轻量 JSON 抓取/api/ai-proxy:用于向 OpenAI 兼容的聊天端点转发完整请求对于 OpenRouter,两个端点都会转发供应商请求头,并在代理白名单中允许 openrouter.ai,从而让经过后端回退路径的认证模型发现和聊天补全正常工作。
支持的服务器、协议与函数调用
| 服务器 | 默认 URL | 端口 | 备注 |
|---|---|---|---|
| MLX | http://localhost | 5010 | Apple Silicon 优化 |
| Ollama | http://localhost | 11434 | 流行的本地模型 |
| LMStudio | http://localhost | 1234 | 基于 GUI 的模型服务器 |
| GitHub Copilot | http://localhost | 5015 | 通过代理 |
| OpenRouter | https://openrouter.ai | 443 | 云 API 网关 |
| 自定义 | 用户定义 | 任意 | OpenAI 兼容 API |
端点: /v1/chat/completions
{
"model": "your-model-name",
"messages": [
{"role": "system", "content": "你是一个编程助手..."},
{"role": "user", "content": "写一个函数来..."}
],
"stream": true,
"tools": [{"type":"function","function":{"name":"read_file","parameters":{"file_path":"string"}}}]
}
服务器推送事件(SSE):
data: {"choices": [{"delta": {"content": "你好"}}]}
data: {"choices": [{"delta": {"content": "世界"}}]}
data: [DONE]
工具解析(3 种格式):
call:read_file{"file_path": "test.js"}{"name": "read_file", "arguments": {...}}
当使用 GitHub Copilot 作为后端时,智能体使用纯 JSON 响应格式进行结构化工具调用,并遵循规划器-执行模式。
五层安全实现
40+ 条批准命令:ls、cat、echo、pwd、mkdir、touch、cp、mv、git、npm、python、node、curl 等。
被拦截的模式(纵深防御):
rm -rf / 及其变体sudo 命令chmod 777curl ... | sh使用 os.path.commonpath() + os.path.realpath() 防止基于符号链接的路径遍历攻击。所有文件操作都会被验证为保留在工作区根目录内。
AI 代理仅限受允许的域名:
localhost、127.0.0.1、0.0.0.0192.168.10.3(用户本地网络的 AI 服务器)openrouter.ai(云端供应商端点)防止利用代理访问内部网络服务。
用仅 localhost 来源替换了通配符 CORS:
http://localhost:5004http://127.0.0.1:5004http://localhost:8080防止恶意网站向本地服务器发起请求。
XteVision Coder 现在通过独立浏览器认证来保护工作区:
完整的 REST API 端点
请求:
{
"path": "projects/myapp/src/index.js",
"content": "console.log('你好');"
}
响应:
{"success": true, "message": "文件写入成功"}
请求:
{"path": "projects/myapp/package.json"}
响应:
{"content": "{...}", "success": true}
请求:
{"path": "projects/myapp/src/components"}
响应:
{"success": true, "message": "文件夹已创建"}
响应:
{"folders": ["src", "public"], "files": ["index.html", "package.json"]}
请求:
{"path": "projects/myapp/old-file.js"}
响应:
{"success": true}
请求:
{"old_path": "projects/myapp/old-name.js", "new_path": "projects/myapp/new-name.js"}
响应:
{"success": true}
请求:
{"command": "ls -la"}
响应:
{"output": "总共 48\ndrwxr-xr-x ...", "success": true}
将请求转发到配置的 AI 服务器,用于模型发现和轻量级操作。
向配置的 AI 后端转发完整的聊天补全请求,并为 OpenRouter 集成携带供应商特定的请求头。
返回认证用户和后端可用状态,用于登录引导。
创建新的独立 Coder 用户,包含用户名、可选邮箱和密码。
认证本地用户并返回会话 cookie。
撤销当前认证会话并清除 cookie。
列出当前用户的已保存聊天会话,按收藏状态和最近活动排序。
返回用于登录恢复的最新活跃聊天会话。
创建新的聊天会话,包含标题、消息、收藏状态和序列化的 UI 状态。
更新现有会话,包含新消息、重命名标题、收藏标志、工作区根、已开标签页和未保存缓冲区内容。
删除认证用户的选中聊天会话。
请求:
{
"path": "projects/myapp/src/index.js",
"edits": [{
"search": "console.log('old')",
"replace": "console.log('new')"
}]
}
响应:
{"success": true, "message": "文件已更新"}
环境变量与设置
| 变量 | 默认值 | 描述 |
|---|---|---|
PORT | 5004 | 后端服务器端口 |
XTEVISION_AUTH_COOKIE_NAME | xtevision_session | 会话 cookie 名称 |
XTEVISION_AUTH_SESSION_DAYS | 14 | cookie/会话有效期(天数) |
XTEVISION_AUTH_SECURE_COOKIE | false | 在 HTTPS 之后将 cookie 标记为安全 |
XTEVISION_AUTH_ALLOW_REGISTRATION | true | 启用或禁用本地注册 |
XTEVISION_DB_HOST | 192.168.1.4 | PostgreSQL 主机 |
XTEVISION_DB_PORT | 5432 | PostgreSQL 端口 |
XTEVISION_DB_NAME | codebase | PostgreSQL 数据库名 |
XTEVISION_DB_USER | postgres | PostgreSQL 用户名 |
XTEVISION_DB_PASSWORD | 空 | PostgreSQL 密码 |
XTEVISION_PRODIGY_SHARED_SECRET | 空 | 可选的签名版 Prodigy 交接密钥 |
| 设置 | 类型 | 描述 |
|---|---|---|
xtevision_ai_server | string | 选定的 AI 服务器预设 |
xtevision_ai_url | string | AI 服务器 API URL |
xtevision_ai_model | string | 模型名称/ID |
openrouter_api_key | string | OpenRouter API Key |
openrouter_site_url | string | OpenRouter HTTP-Referer 请求头的值 |
openrouter_site_title | string | OpenRouter X-OpenRouter-Title 请求头的值 |
xtevision_last_file | string | 最近打开的文件路径 |
以下数据不再仅存储在 localStorage 中:
| 预设 | URL | 端口 |
|---|---|---|
| MLX | http://localhost | 5010 |
| Ollama | http://localhost | 11434 |
| LMStudio | http://localhost | 1234 |
| OpenRouter | https://openrouter.ai | 443 |
| Copilot | http://localhost | 5015 |
模块创建与调试
// 1. 创建 js/modules/mymodule.js
import { state, elements } from './state.js';
import { logToTerminal } from './utils.js';
export function initMyModule() {
logToTerminal('MyModule 已初始化', 'info');
}
// 2. 在 script.js 中导入
import { initMyModule } from './js/modules/mymodule.js';
// 3. 在初始化期间调用
initMyModule();
localStorage.setItem('debug', 'true')// 从 Console 测试 AI 连接
const response = await fetch('http://localhost:5004/api/proxy', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'test-model',
messages: [{role: 'user', content: '你好'}]
})
});
console.log(await response.json());
所有 JS 模块都使用 ?v=APP_VERSION 查询参数来进行缓存破坏。在做出更改后,请更新 config.js 中的 APP_VERSION。
常见问题与解决方案
bash download-monaco.sh 或检查网络是否能访问 CDNcodebase 数据库存在,且 XTEVISION_DB_* 变量与服务器配置一致server.py 中的 ALLOWED_SHELL_COMMANDShttp://localhost:5004 访问(无 HTTPS)。使用 shouldForceBackendProxy() 检测AI_PROXY_TIMEOUT_SEC 中增加超时时间