Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
f934de7
feat(desktop): 跨平台编译 + 远程服务器管理支持
bfzha Jul 4, 2026
a65efd3
fix(desktop): 修复跨平台编译和 helper 二进制独立构建
bfzha Jul 4, 2026
6a5d68b
feat(helper): 实现 remote_install_helper 和 sandbox 命令
bfzha Jul 4, 2026
0be1fe1
chore(desktop): 清理 unused warnings 至 0,添加 #[allow(dead_code)] 注释
bfzha Jul 4, 2026
16231db
fix(helper): tauri-plugin-opener 改为 optional
bfzha Jul 4, 2026
6302b4d
fix(helper): 修复 Linux 编译缺少 use std::fs 和 use Command/Stdio
bfzha Jul 4, 2026
1ceb41d
fix(helper): proxy status/stop 改为无状态端口探活
bfzha Jul 4, 2026
c762fb1
fix(frontend): 「管理」按钮打开弹窗前先加载远程 profiles
bfzha Jul 4, 2026
00a332e
fix(frontend): DOM null 引用防护和 Profile 加载时序修复
bfzha Jul 4, 2026
1d3e3c1
fix: 修复代码审核 Critical/Important 问题
bfzha Jul 4, 2026
d028b09
feat(helper): proc_manager + logger 实现(Plan V2 §3.5-3.7)
bfzha Jul 4, 2026
95a4f4f
feat: 前端 Toast/状态机 + CI/CD + docs(Plan V2 补完)
bfzha Jul 4, 2026
27db765
fix(security): CLI config 读写复用 config.rs 安全路径(审查 C1-C3 修复)
bfzha Jul 4, 2026
bd89e33
Merge origin/main: 合入上游 profile/templates 多 provider 系统
bfzha Jul 4, 2026
3d0e525
fix(remote): 补全 Helper sandbox start 和 remote_one_click 缺失步骤
bfzha Jul 4, 2026
ec2c836
fix: convert lib_tauri.rs to UTF-8
bfzha Jul 4, 2026
0b70c0f
feat(remote): 完善远程管理功能
bfzha Jul 5, 2026
5e4b304
fix: 使用合并前 UTF-8 版本修复 lib_tauri.rs 编码问题
bfzha Jul 5, 2026
b446450
fix: 修复 lib_tauri.rs API 兼容和 Helper 模块缺失
bfzha Jul 5, 2026
95d6ee9
fix(remote): 闭环远程一键启动流程
bfzha Jul 5, 2026
ca1d8e0
fix(remote): 兼容用户级路径并避让占用端口
bfzha Jul 5, 2026
505ee98
fix(remote): 固定远程端口并返回沙箱访问链接
bfzha Jul 5, 2026
ad3a8de
fix(remote): 收紧沙箱监听并内置代理脚本
bfzha Jul 5, 2026
9a5b570
fix(remote): 配置阶段自动准备远程 helper
bfzha Jul 5, 2026
d9e060a
ci(release): 为 macOS 桌面包内置 Linux helper
bfzha Jul 5, 2026
b83c522
ci(release): 修复桌面和 helper 构建参数
bfzha Jul 5, 2026
1176e61
完善远程 SSH 登录认证
bfzha Jul 5, 2026
0a43bc7
合并远程 SSH 登录认证增强
bfzha Jul 5, 2026
43bcdb8
修复 GitHub Actions 构建失败
bfzha Jul 5, 2026
fd7562b
fix: 代码审查修复 — 安全加固、健壮性与代码质量提升
bfzha Jul 5, 2026
3e51219
fix: 修复 macOS CI 并完善发布产物矩阵
bfzha Jul 5, 2026
5028352
fix: helper 沙箱进程管理增强 + 代码格式化统一
bfzha Jul 5, 2026
12516b7
style: ssh.rs map_ssh_error 条件格式还原为多行
bfzha Jul 5, 2026
bc05893
fix: 修复 macOS 停沙箱编译作用域
bfzha Jul 5, 2026
f496bd5
发布准备:完善 v0.3.3 跨平台公开发布说明
bfzha Jul 5, 2026
d774503
fix(remote): 修复远程密码登录表单与安全存储
bfzha Jul 5, 2026
2368d65
fix(remote): 修复远程 SSH 密码登录与发布说明
bfzha Jul 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 4

[*.{js,ts,json,html,css,yml,yaml}]
indent_size = 2

[*.md]
trim_trailing_whitespace = false

[Makefile]
indent_style = tab
43 changes: 43 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# 所有文本文件统一 LF,检出时不转换(Windows 开发机也保持 LF)
* text=auto eol=lf

# 二进制文件不碰
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.ico binary
*.icns binary
*.webp binary
*.ttf binary
*.woff binary
*.woff2 binary
*.eot binary
*.otf binary
*.pdf binary
*.zip binary
*.gz binary
*.tar binary
*.7z binary

# Shell 脚本必须 LF(否则 Linux 上直接废掉)
*.sh text eol=lf

# Rust / Tauri
*.rs text eol=lf diff=rust
Cargo.lock text eol=lf

# Web 前端
*.js text eol=lf
*.ts text eol=lf
*.html text eol=lf
*.css text eol=lf

# 配置与数据
*.json text eol=lf
*.toml text eol=lf
*.yml text eol=lf
*.yaml text eol=lf

# 文档
*.md text eol=lf
176 changes: 176 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
name: Build and Release

on:
push:
tags: ['v*']
branches: ['main']
pull_request:
branches: ['main']

jobs:
# ---- Windows 桌面 app ----
build-windows:
needs: build-helper
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
include:
- target: x86_64-pc-windows-msvc
artifact: CSSwitch-Windows-x64
- target: aarch64-pc-windows-msvc
artifact: CSSwitch-Windows-arm64
steps:
- uses: actions/checkout@v4
- name: Download Linux Helper Assets
uses: actions/download-artifact@v4
with:
pattern: csswitch-helper-linux-*
path: desktop/src-tauri/helper-assets
merge-multiple: true
- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Build Desktop App
run: |
cd desktop
npm install
npx tauri build --target ${{ matrix.target }} --bundles nsis
- name: Upload NSIS Installer
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.artifact }}
path: desktop/src-tauri/target/${{ matrix.target }}/release/bundle/nsis/*.exe

# ---- macOS 桌面 app ----
build-macos:
needs: build-helper
runs-on: macos-15
steps:
- uses: actions/checkout@v4
- name: Download Linux Helper Assets
uses: actions/download-artifact@v4
with:
pattern: csswitch-helper-linux-*
path: desktop/src-tauri/helper-assets
merge-multiple: true
- uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-apple-darwin
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Build Desktop App
run: |
cd desktop
npm install
npx tauri build --target aarch64-apple-darwin --bundles dmg
- name: Upload DMG Installer
uses: actions/upload-artifact@v4
with:
name: CSSwitch-macOS-arm64
path: desktop/src-tauri/target/aarch64-apple-darwin/release/bundle/dmg/*.dmg

# ---- Linux Helper ----
build-helper:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- target: x86_64-unknown-linux-musl
asset_arch: x86_64
- target: aarch64-unknown-linux-musl
asset_arch: aarch64
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- uses: taiki-e/install-action@v2
with:
tool: cross
- name: Build Helper
env:
CSSWITCH_BUNDLED_PROXY_DIR: ${{ github.workspace }}/proxy
run: |
cd desktop/src-tauri
cross build --bin csswitch-helper --no-default-features --release --target ${{ matrix.target }}
mkdir -p helper-out
cp target/${{ matrix.target }}/release/csswitch-helper helper-out/csswitch-helper-linux-${{ matrix.asset_arch }}
- name: Upload Helper
uses: actions/upload-artifact@v4
with:
name: csswitch-helper-linux-${{ matrix.asset_arch }}
path: desktop/src-tauri/helper-out/csswitch-helper-linux-${{ matrix.asset_arch }}

# ---- Tests ----
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Install Linux desktop dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
build-essential \
curl \
wget \
file \
libxdo-dev \
libssl-dev \
libayatana-appindicator3-dev \
librsvg2-dev
- name: Run Tests
run: cd desktop/src-tauri && cargo test --lib
- name: Run Helper Tests
run: cd desktop/src-tauri && cargo test --bin csswitch-helper --no-default-features

# ---- GitHub Release (tag push only) ----
release:
if: startsWith(github.ref, 'refs/tags/v')
needs: [build-windows, build-macos, build-helper, test]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
- name: Resolve Release Notes
id: release_notes
shell: bash
run: |
tag="${GITHUB_REF_NAME}"
version="${tag#v}"
if [[ -f "docs/release-notes/${tag}.md" ]]; then
echo "path=docs/release-notes/${tag}.md" >> "$GITHUB_OUTPUT"
elif [[ -f "docs/release-notes/${version}.md" ]]; then
echo "path=docs/release-notes/${version}.md" >> "$GITHUB_OUTPUT"
else
echo "path=" >> "$GITHUB_OUTPUT"
fi
- name: Create Release with curated notes
if: steps.release_notes.outputs.path != ''
uses: softprops/action-gh-release@v1
with:
files: |
CSSwitch-Windows-*/*.exe
CSSwitch-macOS-arm64/*.dmg
csswitch-helper-*/*
draft: false
body_path: ${{ steps.release_notes.outputs.path }}
- name: Create Release with generated notes
if: steps.release_notes.outputs.path == ''
uses: softprops/action-gh-release@v1
with:
files: |
CSSwitch-Windows-*/*.exe
CSSwitch-macOS-arm64/*.dmg
csswitch-helper-*/*
draft: false
generate_release_notes: true
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,17 @@ build/
# macOS 与工作区杂物
.DS_Store
.superpowers/
.vscode/

# 本地开发工作流文档(brainstorm→spec→plan),不上传公开仓库
docs/superpowers/

# 每日巡检运行产物:全是本机运行态(报告/版本基线/日志/锁),只保留空目录占位
findings/auto-maint/*
!findings/auto-maint/.gitkeep

#ai
.claude
.agent

docs/my_docs/
69 changes: 69 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# CSSwitch

让 Codex Science 的模型推理走第三方 API(DeepSeek / 阿里通义千问 / 任意 OpenAI 兼容端点),保留 Science 那套 AI agent 科研体验,模型换成你自己的。类比 CC Switch 之于 Codex。

> 本文件只留**铁律 + 架构 + 速查指针**。详细内容分散在:
> 逆向与已验证事实 → [`docs/verified-facts.md`](docs/verified-facts.md);
> 已知问题/待修队列 → [`docs/known-issues.md`](docs/known-issues.md);
> 命令与构建 → [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md) / [`desktop/README.md`](desktop/README.md);
> 关键环境/进度事实 → 项目记忆 `memory/`(每次会话自动载入 `MEMORY.md`)。

## 一、铁律(最高优先级,任何会话都不得违反)

1. **绝不影响用户真实的订阅与登录状态。** 真实 Codex Science 的数据目录是 `~/.Codex-science`,登录凭证在 `~/.Codex-science/.oauth-tokens`、`active-org.json`、`encryption.key`、`orgs/`、`.key-backups/`。这些文件**只读都要谨慎,绝不复制、绝不修改、绝不删除**。
2. **绝不把真实 OAuth token 复制进任何沙箱。** 复制后两个实例共享同一 token,刷新时 Anthropic 可能轮换刷新令牌,导致用户真实实例被登出。要给沙箱登录,只能在沙箱里**全新独立登录**(另一套会话 token,对真实登录零影响),且由用户手动完成,Codex 不代做登录。
3. **绝不用改过的环境变量去启动用户的真实实例。** 真实实例跑在端口 8765。所有实验用的沙箱必须用**独立 data-dir + 独立端口 + 独立 HOME**,与 8765 完全隔开。
4. **测试默认不碰 Science。** 能用「代理↔上游」单独验证的,就不启动 Science(见 `test/`)。只有到最终整链联调、且用户明确同意时,才启动沙箱 Science,并且仍然遵守第 2、3 条。
5. 动任何有状态的东西前,先确认它不在铁律清单里;拿不准就停下来问用户。

## 二、架构

```
Codex Science(沙箱 · 虚拟登录;登录仅当启动门票,推理不走 Anthropic)
│ ANTHROPIC_BASE_URL=http://127.0.0.1:<port>/<secret>
翻译代理 proxy/csswitch_proxy.py(默认 deepseek 原生透传 / qwen 翻译,可切)
│ 剥离入站 OAuth Bearer,注入第三方 key,按需 Anthropic ↔ OpenAI 互转,path-secret 鉴权
DeepSeek 原生 Anthropic 端点 / 阿里 DashScope(千问)/ 其它 OpenAI 兼容端点
```

关键点:Codex 登录只是**启动 Science 的门票**,推理被 `ANTHROPIC_BASE_URL` 导去本地代理后,Anthropic 服务端不经手推理。门票用**本地伪造的虚拟 OAuth** 越过(零真实凭证、无需任何 Anthropic 账号)。

## 三、速查(详情见 docs/ 与 memory/)

- **必知三条**:① `ANTHROPIC_BASE_URL` 无条件生效;② 手动填 API key 被 operon 写死拒绝,**必须有 OAuth 门票**;③ 门票用本地伪造虚拟 OAuth 越过。完整证据与格式 → `docs/verified-facts.md`。
- **发布态 / 待办**:已公开于 github.com/SuperJJ007/CSSwitch;桌面 app 在 `desktop/`(Tauri **正常窗口**进程管家,已去托盘)。**当前 Latest 版本以 GitHub Releases / [`CHANGELOG.md`](CHANGELOG.md) 为准**;**待办队列与排期** → [`docs/known-issues.md`](docs/known-issues.md)。(此处不写具体版本号与「当前最优先」等易变状态,那些归 known-issues 与项目记忆 `memory/`。)
- **对外文案(脱敏)**:用户**可见**文案不露骨,别直说「越过 / 绕过登录」;主按钮用「一键开始」类中性说法。技术**内部**文档描述机制时可仍用「越过门票」。详见 `docs/known-issues.md` 第 1 条。
- **上游/模型**:默认 DeepSeek(原生 Anthropic 透传),可 `--provider qwen`(翻译)。模型映射与选择器广告 id 见 `csswitch_proxy.py` 的 `PROVIDERS`。
- **每日维护巡检**:launchd 每天 09:00/21:00(Asia/Shanghai)跑受限 `Codex -p`,**只读仓库 + 抓公开网页 + 只往 `findings/auto-maint/` 写规划报告**(白名单工具、硬禁 commit/push/rm、禁读写 `~/.Codex-science`、不启动 Science)。装卸看:`scripts/install-maintenance.sh {install|uninstall|status|run}`。

## 四、目录与常用命令

```
proxy/csswitch_proxy.py 【主】provider 可切代理(deepseek 默认 / qwen)
proxy/qwen_proxy.py 早期单 provider(千问)版,已被上者取代
scripts/make-virtual-oauth.mjs 虚拟 OAuth 伪造器(Node,字节级一致;只写沙箱,护栏拒真实目录)
scripts/launch-virtual-sandbox.sh 起沙箱 Science + 写虚拟登录 + 指向代理(推荐入口)
scripts/stop-science-sandbox.sh 停沙箱(按 data-dir,绝不影响真实 8765)
scripts/doctor.sh 只读环境诊断(依赖/key 有无/端口/权限/铁律自检)
scripts/verify-proxy.sh 校验运行中的代理(/health + /v1/models,零上游花费)
scripts/self-test.sh 离线回归套件(test/run_all.sh 包装)
scripts/*maintenance* 每日巡检 wrapper/提示词/launchd/安装器
desktop/ Tauri 桌面 app(正常窗口,构建见 desktop/README.md)
test/ 隔离回归测试(只打代理,不碰 Science)
findings/ 证据、二进制分析、诊断记录;auto-maint/ 是巡检输出(git 忽略)
.sandbox/ 沙箱 Science 独立 HOME/data-dir(git 忽略)
```

常用命令(更多见 `docs/DEVELOPMENT.md`):
- 起代理(默认 DeepSeek):`DEEPSEEK_API_KEY=... python3 proxy/csswitch_proxy.py --provider deepseek --port 18991`(切千问用 `--provider qwen` + `DASHSCOPE_API_KEY`;也支持 `--env-file`)
- 离线回归:见 `test/`(自动起代理、打完停掉)。
- 整链(虚拟登录,推荐):先起代理,再 `scripts/launch-virtual-sandbox.sh --port 8990 --proxy-url http://127.0.0.1:18991/<secret>`;停:`scripts/stop-science-sandbox.sh`。

## 五、环境备忘

- 真实 Science 数据目录 `~/.Codex-science`、端口 8765,绝对不碰。
- 上游 key 在用户 shell 环境:`DEEPSEEK_API_KEY` / `DASHSCOPE_API_KEY`(值不显示、不入库)。DashScope 兼容端点 `https://dashscope.aliyuncs.com/compatible-mode/v1`。
- **代理端口坑(gh/git/operon 都踩,反复中招)**:小写 `https_proxy`/`http_proxy`/`ALL_PROXY`→`127.0.0.1:7890`(**活**);大写 `HTTPS_PROXY`/`HTTP_PROXY`→`127.0.0.1:8001`(**死,连接被拒**)。gh(Go)读大写 → 连不上 GitHub,**还会把 token 误报 `invalid`(假阴性,别当成要重新登录)**。**跑任何 gh/git 前先**:`export HTTPS_PROXY=http://127.0.0.1:7890 HTTP_PROXY=http://127.0.0.1:7890 ALL_PROXY=http://127.0.0.1:7890`。operon 认小写、本就走 7890。详见记忆 `github-repo`。
- Python 用 conda 环境(见用户全局记忆),避免系统 3.9。
30 changes: 30 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,36 @@

> **约定**:已修问题从 [`docs/known-issues.md`](docs/known-issues.md)「毕业」到这里(发布即定稿);未修/进行中留在 known-issues;硬 bug 的根因证据链存在 [`findings/`](findings/)。

## [0.3.3] — 2026-07-06

> 主题:**跨平台桌面构建 + 远程 Linux Helper**。这一版把 CSSwitch 从 Apple Silicon 单平台包推进到 Windows x64 / Windows arm64 / macOS arm64 三类桌面安装包,并把远程 Linux helper 做成 x86_64 / aarch64 两个静态产物,方便在 Windows 桌面里一键准备远程服务器上的 Science 沙箱。版本同时补齐 GitHub Actions 发版矩阵和 macOS 编译回归,后续可以通过 `v*` tag 自动构建并发布。

### 新增 Added
- **Windows 桌面包**:CI 现在产出 `CSSwitch-Windows-x64` 和 `CSSwitch-Windows-arm64` 两个 NSIS 安装器;x64 面向常见 Intel/AMD Windows,arm64 面向 Windows on Arm。
- **macOS Apple Silicon DMG**:保留现有 macOS arm64 DMG 方案,不额外引入 Intel / Universal 构建,避免扩大未签名分发范围。
- **远程 Linux helper 双架构**:CI 产出 `csswitch-helper-linux-x86_64` 与 `csswitch-helper-linux-aarch64`,桌面包会内置 helper 资产,用于自动上传到远程 Linux 主机并管理远程沙箱 / 代理。
- **远程一键启动闭环**:补齐 SSH 登录认证、helper 上传 / 自愈、固定远程端口、返回远程沙箱访问链接、远程进程状态检测等路径,让 Windows 本机也能管理 Linux 远程运行环境。
- **可追溯发布矩阵**:GitHub Actions 拆成 helper、Windows、macOS、测试、Release 五段;main 分支先验证产物,`v*` tag 再自动创建 Release 并挂载安装包 / 二进制资产。

### 变更 Changed
- **桌面包自包含策略**:Tauri 资源继续打入 `proxy/`、`scripts/` 和 `helper-assets/`,所以安装后的 Windows / macOS app 不需要旁边再放仓库源码。这里包含的 Python 文件是 CSSwitch 本地代理运行所需脚本,不是第三方项目二进制。
- **平台产物定位明确**:Windows 发布 x64 + arm64 两个安装器;macOS 按现有方案只发 Apple Silicon arm64 DMG;Linux 不发布桌面 app,只发布给远程模式使用的 helper。
- **远程 helper 内置代理脚本**:helper 自身也编译进代理脚本兜底,远程主机缺文件或安装目录被清理时可以重新落地,减少“装过一次后漂移”的问题。

### 修复 Fixed
- **macOS CI 编译失败**:修复 Tauri 回调和停沙箱路径里的 `AppHandle` 作用域问题,并加 UI contract 回归测试覆盖 `_app` / `app` 这类跨平台编译差异。
- **helper / 桌面构建参数不一致**:统一 helper 的无桌面特性构建、Tauri 桌面 target 和资源下载路径,避免某个平台构建成功但包内缺远程资产。
- **远程沙箱进程管理健壮性**:加强端口避让、用户级路径兼容、状态识别和停止逻辑,减少远程一键启动后残留进程或误判。
- **远程 SSH 密码登录不可用 / 不易用**:远程服务器表单新增密码输入与“记住密码”开关;首次连接使用临时密码完成 SSH 登录,连接成功后才按用户选择写入凭据存储。密码不会写进 `remote-hosts.json` 或日志;当系统凭据存储不可用时,回退到 `~/.csswitch` 下的本地加密文件,并带权限与软链护栏。

### 说明 Notes
- 如果要让安装包内部版本号和 Release tag 完全一致,请使用 `v0.3.3` tag 触发 Actions 重新构建;不建议把 `0.3.2` 版本号的旧 artifacts 挂到 `v0.3.3`。
- 与 CC Switch 的关系:CSSwitch 的命名和产品形态受 [CC Switch](https://github.com/farion1231/cc-switch) 启发,也借鉴了“provider/profile 切换工具”的思路;CC Switch 使用 MIT 许可。CSSwitch 是面向 Claude Science 的独立项目,不隶属、不同步发布、也不受 CC Switch 或 Anthropic 背书;当前代理、桌面、远程 helper 和沙箱登录实现均为本仓库实现,没有打包 CC Switch 二进制。
- 发布产物说明:Windows 下载 `.exe` 安装器;macOS Apple Silicon 下载 `.dmg`;`csswitch-helper-linux-*` 是远程服务器用的 helper,不是普通用户桌面安装包。
- 分发限制:当前 Windows 未做代码签名,可能触发 SmartScreen;macOS 为 ad-hoc 签名、未 Apple notarization,首次打开需右键“打开”或在隐私与安全性里放行。
- 本次撤回后重发包含远程 SSH 密码登录修复:密码连接链路已补回归测试,并保持“profile 不落明文密码”的边界。
- 安全边界仍不变:只操作 CSSwitch 的隔离沙箱和 `~/.csswitch` 配置,真实 Science 数据目录与 8765 端口仍按铁律保护。

## [0.3.2] — 2026-07-04

> 主题:**Science 顶部显示真实模型名 + 新增 Kimi / MiniMax**。修复 relay 家在 Science 模型选择器里笼统显示「claude / opus」的问题(#11),让每个服务商都能选择或自填模型、并在 Science 里显示真实模型名;新增 Kimi(Moonshot)与 MiniMax;各家内置模型更新到官方主流版本。
Expand Down
Loading