🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

Codex 任务面板 chuspeeism/dashi-taskboard

DeepSeek Harness
chuspeeism5 天前有提交已提供中文文档扫描:含敏感能力

现代化可灵活嵌入的任务面板,支持 Codex、DeepSeek Harness

71.7/100
综合分
3,409
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/29 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add chuspeeism/dashi-taskboard
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · desktop
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包codex-taskboard(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22.5 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/28 11:38:19

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 108 处,展示前 71 条)
  • 发起网络请求
    cli/taskctl.mjs:360
    return api.request("GET", "/api/projects");
  • 发起网络请求
    cli/taskctl.mjs:363
    return api.request("POST", "/api/projects", {
  • 发起网络请求
    cli/taskctl.mjs:375
    return api.request(
  • 发起网络请求
    cli/taskctl.mjs:397
    return api.request("GET", "/api/local/cloud-session");
  • 发起网络请求
    cli/taskctl.mjs:400
    return api.request("DELETE", "/api/local/cloud-session");
  • 发起网络请求
    cli/taskctl.mjs:406
    return api.request("GET", taskPath(parsed.operands[0]));
  • 读取本地文件
    server/cloud-config.mjs:123
    return parseConfig(JSON.parse(await readFile(configPath, "utf8")));
  • 写入本地文件
    server/cloud-config.mjs:131
    await mkdir(path.dirname(configPath), { recursive: true });
  • 写入本地文件
    server/cloud-config.mjs:133
    await writeFile(temporaryPath, `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
  • 写入本地文件
    server/cloud-config.mjs:134
    await rename(temporaryPath, configPath);
  • 发起网络请求
    cloud/src/index.mjs:56
    async fetch(request) {
  • 发起网络请求
    cloud/src/index.mjs:2421
    const response = await realtimeHub(env).fetch("https://realtime.internal/broadcast", {
  • 发起网络请求
    cloud/src/index.mjs:2483
    return realtimeHub(env).fetch("https://realtime.internal/client-storage");
  • 发起网络请求
    cloud/src/index.mjs:2487
    const response = await realtimeHub(env).fetch(
  • 发起网络请求
    cloud/src/index.mjs:2559
    return realtimeHub(env).fetch(new Request("https://realtime.internal/connect", request));
  • 发起网络请求
    cloud/src/index.mjs:2863
    async fetch(request, env, ctx) {
  • 读取本地文件
    integrations/deepseek-harness/index.js:13
    const descriptor = JSON.parse(await readFile(RUNTIME_FILE, "utf8"));
  • 读取本地文件
    server/ai-chat-catalog.mjs:61
    const source = await readFile(filePath, "utf8");
  • 读取本地文件
    server/ai-chat-catalog.mjs:90
    entries = await readdir(currentDirectory, { withFileTypes: true });
  • 读取本地文件
    server/ai-chat-catalog.mjs:115
    await stat(path.join(current, ".git"));
  • 读取本地文件
    server/ai-chat-catalog.mjs:152
    config = parseToml(await readFile(configFile, "utf8"));
  • 读取本地文件
    server/ai-chat-catalog.mjs:219
    const resolved = await realpath(value.trim());
  • 读取本地文件
    server/ai-chat-catalog.mjs:220
    return (await stat(resolved)).isDirectory() ? resolved : null;
  • 执行外部命令来自配置/变量
    server/ai-chat-catalog.mjs:386
    const child = spawn(command.executable, command.args, {
  • 发起网络请求
    server/ai-chat-catalog.mjs:1021
    appServer.request("model/list", { cursor: null, limit: 100, includeHidden: false }),
  • 执行外部命令来自配置/变量
    server/ai-chat-process.mjs:331
    const child = spawn(process.execPath, [TURN_OWNER_PATH, executable, JSON.stringify(args)], {
  • 删除本地文件递归
    server/ai-chat.mjs:623
    await rm(temporaryDirectory, { recursive: true, force: true });
  • 删除本地文件递归
    server/ai-chat.mjs:1036
    await rm(temporaryDirectory, { recursive: true, force: true });
  • 删除本地文件递归
    server/ai-chat.mjs:1128
    await rm(active.temporaryDirectory, { recursive: true, force: true });
  • 写入本地文件
    server/ai-chat.mjs:1149
    await writeFile(attachmentPath, attachment.data, { flag: "wx", mode: 0o600 });
  • 删除本地文件递归
    server/ai-chat.mjs:1155
    await rm(temporaryDirectory, { recursive: true, force: true });
  • 删除本地文件递归
    server/ai-chat.mjs:1225
    await rm(active.temporaryDirectory, { recursive: true, force: true });
  • 执行外部命令来自配置/变量
    server/ai-turn-owner.mjs:11
    const child = spawn(command.executable, command.args, {
  • 读取本地文件
    server/app.mjs:987
    if (!(await stat(thread.origin.workspacePath)).isDirectory()) throw new Error("not a directory");
  • 读取本地文件
    server/app.mjs:1169
    fileStats = await stat(filename);
  • 读取本地文件
    server/app.mjs:1176
    fileStats = await stat(filename);
  • 读取本地文件
    server/app.mjs:1183
    const body = await readFile(filename);
  • 读取本地文件
    server/app.mjs:1209
    const state = JSON.parse(await readFile(codexStatePath, "utf8"));
  • 读取本地文件
    server/app.mjs:1238
    const state = JSON.parse(await readFile(codexStatePath, "utf8"));
  • 写入本地文件
    server/app.mjs:1408
    await mkdir(path.dirname(resolved.clientStoragePath), { recursive: true });
  • 写入本地文件
    server/app.mjs:1410
    await writeFile(temporaryPath, `${JSON.stringify(entries)}\n`, { mode: 0o600 });
  • 写入本地文件
    server/app.mjs:1411
    await chmod(temporaryPath, 0o600);
  • 写入本地文件
    server/app.mjs:1412
    await rename(temporaryPath, resolved.clientStoragePath);
  • 写入本地文件
    server/app.mjs:1413
    await chmod(resolved.clientStoragePath, 0o600);
  • 写入本地文件
    server/app.mjs:2373
    await mkdir(resolved.attachmentsDirectory, { recursive: true });
  • 删除本地文件
    server/app.mjs:2384
    await unlink(storagePath);
  • 删除本地文件
    server/app.mjs:2667
    await unlink(path.join(resolved.attachmentsDirectory, attachment.id));
  • 删除本地文件
    server/app.mjs:2714
    await unlink(storagePath);
  • 删除本地文件
    server/app.mjs:2759
    await unlink(storagePath);
  • 删除本地文件
    server/app.mjs:2825
    await unlink(path.join(resolved.attachmentsDirectory, attachment.id));
  • 删除本地文件
    server/app.mjs:2949
    await unlink(path.join(resolved.attachmentsDirectory, attachmentId));
  • 发起网络请求
    server/codex-app-server.mjs:39
    const result = await this.request("skills/list", {
  • 发起网络请求
    server/codex-app-server.mjs:47
    return this.request("thread/start", params);
  • 发起网络请求
    server/codex-app-server.mjs:51
    return this.request("thread/resume", params);
  • 发起网络请求
    server/codex-app-server.mjs:55
    return this.request("turn/start", params);
  • 发起网络请求
    server/codex-app-server.mjs:59
    return this.request("turn/interrupt", params);
  • 发起网络请求
    server/codex-app-server.mjs:63
    return this.request("thread/compact/start", { threadId });
  • 执行外部命令来自配置/变量
    server/codex-app-server.mjs:98
    const child = spawn(command.executable, command.args, {
  • 写入本地文件
    server/database.mjs:260
    mkdirSync(path.dirname(filename), { recursive: true });
  • 读取本地文件
    server/jira-config.mjs:135
    return parseConfig(JSON.parse(await readFile(configPath, "utf8")));
  • 写入本地文件
    server/jira-config.mjs:143
    await mkdir(path.dirname(configPath), { recursive: true });
  • 写入本地文件
    server/jira-config.mjs:145
    await writeFile(temporaryPath, `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
  • 写入本地文件
    server/jira-config.mjs:146
    await chmod(temporaryPath, 0o600);
  • 写入本地文件
    server/jira-config.mjs:147
    await rename(temporaryPath, configPath);
  • 写入本地文件
    server/jira-config.mjs:148
    await chmod(configPath, 0o600);
  • 删除本地文件
    server/jira-config.mjs:168
    await unlink(configPath);
  • 读取本地文件
    shared/codex-executable.mjs:7
    accessSync(candidate, constants.X_OK);
  • 执行外部命令固定命令
    shared/process-tree.mjs:5
    const result = spawnSync(
  • 发起网络请求
    web/src/api.ts:109
    response = await fetch(resolveTaskboardUrl(path), { ...init, headers });
  • 发起网络请求
    web/src/storage.ts:15
    const response = await fetch(new URL("api/client-storage", document.baseURI));
  • 发起网络请求
    web/src/storage.ts:46
    const response = await fetch(new URL("api/client-storage", document.baseURI), {
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

1 张 · 点击查看大图

功能亮点

  • 可嵌入任务面板
  • 支持Codex

README

由 DeepSeek 最新模型翻译生成
Codex Taskboard 一个本地优先的议题面板,可在浏览器中运行,也可通过独立 CDP 启动器或其注入脚本嵌入 Codex。同一套 HTTP API 为 React UI 和随附 Codex Skill 使用的 taskctl CLI 提供支持。 Codex Taskboard 产品截图 系统要求 - Node.js 22.5 或更高版本 - 构建 macOS App 和 DMG:Xcode Command Line Tools、Rust 1.88 或更高版本,以及 aarch64-apple-darwin 和 x86_64-apple-darwin target。npm install 会安装本项目使用的 Tauri CLI。 - 构建 Windows NSIS:Microsoft Store 版 Codex App、Rust 1.88 或更高版本,以及带 C++ 工作负载和 Windows SDK 的 Visual Studio Build Tools。 本地运行 npm install npm run build npm start 打开 <http://127.0.0.1:47823>。SQLite 数据库存储在 .data/taskboard.sqlite。
展开完整文档(README 剩余 1 节)
Codex Taskboard

一个本地优先的议题面板,可在浏览器中运行,也可通过独立 CDP 启动器或其注入脚本嵌入 Codex。同一套 HTTP API 为 React UI 和随附 Codex Skill 使用的 taskctl CLI 提供支持。

Codex Taskboard 产品截图

系统要求

- Node.js 22.5 或更高版本
- 构建 macOS App 和 DMG:Xcode Command Line Tools、Rust 1.88 或更高版本,以及 aarch64-apple-darwin 和 x86_64-apple-darwin target。npm install 会安装本项目使用的 Tauri CLI。
- 构建 Windows NSIS:Microsoft Store 版 Codex App、Rust 1.88 或更高版本,以及带 C++ 工作负载和 Windows SDK 的 Visual Studio Build Tools。

本地运行

npm install
npm run build
npm start

打开 <http://127.0.0.1:47823>。SQLite 数据库存储在 .data/taskboard.sqlite。

如需在前端实时重载模式下开发:

npm run dev

Vite UI 运行在 <http://127.0.0.1:5173>,并将 API 请求代理到本地服务。

使用 CLI

在项目中运行:

npm run taskctl -- project create \
--id my-project \
--name "My project" \
--workspace-path /absolute/path/to/repository

npm run taskctl -- issue create \
--project my-project \
--title "Implement the next slice" \
--status todo \
--priority high \
--labels product,mvp

请运行 npm link,以便在 shell 路径中使用 taskctl。设置 CODEX_TASKBOARD_URL,可让 CLI 指向另一个本地或局域网服务。云端部署通过回环 companion(本机 loopback 配套服务,不是「伴侣」)使用 taskctl cloud login 配置。

安装 Codex Skill

将 skills/manage-taskboard 复制或符号链接到 Codex Skill 目录,然后启动一个新的 Codex 任务:

ln -s /absolute/path/to/codex-taskboard/skills/manage-taskboard \
~/.agents/skills/manage-taskboard

桌面 App 会让该目录与内置 Skill 保持同步。该 Skill 会指导 Codex 检查议题,将其移到 in_progress,使用乐观版本控制,验证工作,然后将其移到 in_review;只有在用户明确确认接受或要求将议题标记为完成后,才会将议题移到 done。

嵌入 Codex

手动:使用专用 CDP 端口

让现有 Codex 窗口保持打开。在 Taskboard 仓库中,使用专用 CDP 端口启动第二个 Codex 实例:

open -n -a /Applications/ChatGPT.app --args \
--remote-debugging-port=9231 \
--remote-allow-origins=http://127.0.0.1:9231

新 Codex 窗口出现后,在另一个终端中运行注入器:

CODEX_TASKBOARD_HOST=127.0.0.1 \
npm run codex:inject -- --port 9231 --open

使用嵌入式面板时,让注入器终端保持运行。原 Codex 窗口不会变化,新窗口会显示 Taskboard 侧边栏入口。如果端口 9231 已被占用,请在两个命令中使用另一个端口。

推荐:用一个命令启动独立 Taskboard 窗口

让现有 Codex 窗口保持打开,然后运行:

CODEX_TASKBOARD_HOST=127.0.0.1 npm run codex

该命令会在需要时启动本地 Taskboard 服务。它会复用已打开且有可用 CDP 渲染器的 Codex;普通 Codex 没有 CDP 时,它会在该实例的原生浏览面板中打开 Taskboard;没有打开 Codex 时,它会使用独立配置文件和仅限回环访问的端口 9231 启动官方 macOS Codex App。有可用 CDP 时,它会在 Plugins 后注入一个原生外观的 Taskboard 入口,并持续监视服务和替换后的渲染器。使用嵌入式面板时,请让该命令保持运行。启动器不会修改 ChatGPT.app 或其 app.asar。

源码启动器会把带身份信息的服务地址写入 .data/launcher-runtime.json。通过 npm link 安装的 taskctl 默认读取此文件。因此,普通 shell 和从面板打开的 Codex 任务无需设置额外环境变量,即可使用同一个 Taskboard 服务。

macOS App:无需终端即可打开和注入

如需进行 Tauri 开发,请运行:

npm run app:dev

如需构建本地 App 和 DMG,请先安装两个 Rust target,然后运行构建:

rustup target add aarch64-apple-darwin x86_64-apple-darwin
npm run app:build

从 Finder 打开 src-tauri/target/universal-apple-darwin/release/bundle/macos/Codex Taskboard.app。DMG 位于 src-tauri/target/universal-apple-darwin/release/bundle/dmg/。如果只需安装稳定版,请从 GitHub Releases 下载当前 DMG。

该 App 包含自己的 Node 运行时、Taskboard 服务、构建后的 Web UI、Skill、CLI 包装器和注入脚本。它会启动服务,复用已打开且有可用 CDP 渲染器的 Codex;普通 Codex 没有 CDP 时,它会在该实例的原生浏览面板中打开 Taskboard;没有打开 Codex 时,它会启动官方 Codex App。有可用 CDP 时,它会等待渲染器并注入侧边栏入口,然后在不显示终端窗口的情况下打开面板。该 App 可以复制到本检出目录之外;目标 Mac 只需安装官方 Codex App,不需要此仓库、系统 Node 安装或单独的 Codex CLI 安装。Taskboard 数据存储在 ~/Library/Application Support/Codex Taskboard,启动器输出写入 ~/Library/Logs/Codex Taskboard/codex-taskboard-launcher.log。

本地构建使用 ad-hoc 代码签名进行直接验证。公开的 macOS 下载仍需要 Developer ID 签名和 Apple 公证。

Linux App:Ubuntu 24.04 x64 软件包

Linux 桌面版第一版仅支持 Ubuntu 24.04 LTS x64。请先安装官方 ChatGPT 桌面版 .deb,并确认运行 chatgpt 可以打开它。然后从 GitHub Releases 下载 Codex Taskboard .deb 或 .AppImage。请将以下命令中的 <file> 替换为下载的文件名。

安装 .deb 软件包:

sudo apt install ./<file>.deb

或者运行 AppImage:

chmod +x ./<file>.AppImage
./<file>.AppImage

如需在 Ubuntu 24.04 x64 上构建这两种软件包,请运行:

npm ci
npm run app:build:linux:x64

第一版不支持 ARM64、Fedora、RPM 软件包或其他 Linux 发行版。

Windows App:托盘启动器与内置 Taskboard

先从 Microsoft Store 安装官方 Codex App。在 Windows x64 上运行以下命令构建当前用户级 NSIS 安装包:

npm ci
npm run app:build:windows

安装包位于 src-tauri/target/x86_64-pc-windows-msvc/release/bundle/nsis/。它包含托盘启动器、内置 Node、本地服务、构建后的 Web UI、Skill、taskctl.cmd 和注入脚本。Taskboard 数据存储在 %APPDATA%\Codex Taskboard,日志存储在 %LOCALAPPDATA%\Codex Taskboard\Logs,Skill 会复制到 %USERPROFILE%\.agents\skills\manage-taskboard。

Windows CI 产物目前有意保持未签名,也不支持自动更新。分发前请阅读代码签名策略。保留数据的行为见 Windows 卸载说明。

Codex 26.715.52143 的渲染器 CSP 会阻止任意 HTTP iframe。因此,启动器会启用 CDP CSP 绕过,重新加载该渲染器一次,安装文档启动脚本,并等待 Taskboard OOPIF 实际加载。同一台机器上的其他进程访问 CDP 时不需要身份验证,因此启动器运行时只能运行受信任的本地代码。

要注入一个已经通过其他方式使用 CDP 启动的 Codex 实例,请运行:

npm run codex:inject -- --port 9229 --open

该命令也会保持驻留,因此服务退出后,注入的标签页可以重新启动 Taskboard。使用 Ctrl-C 停止该命令。

Windows 上如果自行启动的 Codex 没有任务面板,通常是该实例没有 CDP 调试端口。仓库在 tools/windows/ 下提供只读面板诊断脚本,以及托管窗口激活与诊断的说明。

该脚本会在 Codex 侧边栏添加 Taskboard 入口,并在 Codex 的整个主工作区渲染 iframe,包括上下文标题栏区域,因此 Taskboard 自己的页眉不会留下空白条。这个完整的矩形页眉位于 Electron 可拖动层之上,并标记为 no-drag;由于 Taskboard 活动时会隐藏原生上下文操作,它自己的操作可以使用正常的边缘内边距,不会产生人为的右侧空隙。原生侧边栏保持挂载,此前页面的选中状态和上下文页眉会暂时隐藏;选择另一个 Codex 页面会恢复它们。

“在对话中打开”会在可用时选择对应的原生 Codex 项目,并打开一个未发送的原生 composer,其中包含 e-taskboard 指令和议题的真实标识符。已安装的 Skill 会根据该指令隐式选中,因此 composer 不会添加 $manage-taskboard 提及。只有在会话实际处理该议题后,才会记录该会话的归属关系:taskctl 读取 Codex 的 CODEX_THREAD_ID,并在议题或评论变更上记录该 ID。记录的 ID 可通过 Codex 的原生路由桥接点击。每个议题可以绑定一个 Git 分支或一个 worktree;选项从所选 Codex 项目的仓库扫描,而不是手动输入。该集成使用 Codex 现有的项目、composer 和路由标记;它不会修改 React、替换 fetch、加载私有 chunk 或编辑 Codex 数据文件。

要使用不同的 UI 来源,请在用户脚本运行前设置 window.__CODEX_TASKBOARD_URL__。

配置

| 变量 | 默认值 | 用途 |
| CODEX_TASKBOARD_HOST | 0.0.0.0 | HTTP 绑定地址;使用 127.0.0.1 可禁用局域网访问 |
| CODEX_TASKBOARD_PORT | 47823 | 本地 HTTP 端口 |
| CODEX_TASKBOARD_DATA_DIR | .data | SQLite 数据目录 |
| CODEX_TASKBOARD_URL | http://127.0.0.1:47823 | CLI API 源地址 |

npm start 会输出本地 URL 和可用的局域网 URL。同一受信任网络中的协作者可以打开其中一个局域网 URL,并使用同一个 Taskboard 服务。任务、评论和附件变化通过服务器发送事件广播到所有打开的客户端;客户端重连后会执行完整刷新,因此不会遗漏断开连接期间发生的变化。使用 taskctl 的协作者可以通过 CODEX_TASKBOARD_URL=http://<host-ip>:47823 指向共享服务。

局域网模式没有账户身份验证:受信任本地网络中任何能访问该 URL 的人都可以读取和写入 Taskboard。公网和云端部署需要经过身份验证的部署边界。

通过 Cloudflare 共享

对于两名受信任的协作者,Taskboard 可以在 Cloudflare 上运行,使用 Worker Static Assets 和 API 路由,以 D1 作为权威业务数据库,并使用私有 R2 bucket 存储附件。该部署使用带共享密码的 HTTPS Basic 身份验证,并在全局修订号变化后刷新已打开的面板。

每台设备保留自己的项目检出映射,并继续使用本地 companion(本机配套服务 / 环回代理)提供 Codex、Git/worktree、Skill 和 MCP 能力。请勿将 companion 译为「伴侣」,也不要把普通 Taskboard HTTP 接口称为「伴侣 API」。云端模式绝不会回退到本地 SQLite 数据库,也不会同时写入本地数据库。

请参阅云端协作,了解所有者部署、现有 GitHub 安装设置、密码轮换、本地路径映射和一次性本地数据迁移流程。

验证

npm run check

该命令会运行 TypeScript 检查、生产前端构建、组件测试,以及服务器/CLI/注入测试套件。

议题 Markdown

议题描述和评论支持 GFM,包括表格和任务列表。mermaid 围栏代码块会在查看器加载后渲染成只读图;渲染失败时仍可阅读原始图表源码。Markdown HTML 注释(例如 )不会出现在渲染后的正文中,且不会启用原始 HTML。
预览分享卡片长什么样 ↓chuspeeism/dashi-taskboard
分享 · DeepSeek Harness Hub
chuspeeism/dashi-taskboard

现代化可灵活嵌入的任务面板,支持 Codex、DeepSeek Harness

回到顶部