# Minke

> 为 DeepSeek Harness 注入 LM Studio/Ollama 本地模型、Codex 子代理、文件/终端/网页工作区及快捷键与桌面主题同步能力。

## Metadata

- Author: [@lencx](https://github.com/lencx)
- Repo: <https://github.com/lencx/Minke.git>
- GitHub: [lencx/Minke](https://github.com/lencx/Minke)
- Stars: 250
- Language: TypeScript
- License: [Apache-2.0](https://spdx.org/licenses/Apache-2.0.html)
- Topics: `agent`, `deekseek`, `desktop`, `dsh`, `dsh-plugin`, `harness`
- Forks: 28
- Open Issues: 3
- Last push: 2026-08-20T14:53:48.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:lencx/Minke/packages/harness-overlay
```

## Wiki

## 一句话定位
Minke 的产品定制层，注入到 DeepSeek Harness 宿主运行时中，给 Harness 增加本地模型（LM Studio、Ollama）桥接、可执行一次性子任务的 Codex 子代理，以及文件/终端/网页侧栏工作区、可配置快捷键、桌面主题与语言同步等桌面化能力。

## 核心能力
- 通过可插拔 lifecycle，发现并管理 LM Studio 与 Ollama 两个本地模型服务；用户启动的实例不会被插件侧重新配置
- 托管 OpenAI 兼容的回环服务端点（`openAICompatible`），让用户手动接入任意自部署的兼容服务
- 注册 Codex CLI 子代理（`provider: codex`），把自包含任务委派给 `codex app-server --stdio`
- 提供 Files、Terminal、Web 三类可分屏的工作区标签页（右侧/底部容器，标签页可拖拽与配置）
- 提供桌面快捷键系统（默认 8 个动作，可重绑定并持久化到 desktop 端）
- 与宿主 Harness 同步 locale（zh/en）与 theme 切换，让桌面原生窗口跟随主题
- 安装后拦截开发用 onboarding 提示，将"开发者内测"提示从用户视角中旁路

## 技术实现
- **语言**: TypeScript + React 19（client 端用 JSX、host 端无渲染逻辑）
- **关键依赖**: `@deepseek-ai/cordis`（插件框架）、`@deepseek-ai/schemastery`（配置 schema 与 default）、`@deepseek-ai/dsh-llm-pi-ai`（LLM 适配层，挂在本地服务 ready 之后）、`@deepseek-ai/dsh-subprocess`（CLI 解析与子进程 spawn）、`xterm` + `codemirror` + `shiki`（terminal/file/web 三类标签页渲染）
- **架构模式**: 通过 `cordis.patch.yml` 与宿主打 4 个组合 slot：`minke-overlay`（产品层）、`model-runtime`（本地服务生命周期）、`subagent-codex`（Codex 委派）、`tool-subagent-codex`（Harness tool 包装）；host 端 `src/index.ts` 仅占位，浏览器侧实现在 `src/client/*`，通过 Cordis effect 在 disposal 时清理本地服务进程
- **入口文件**: `packages/harness-overlay/src/model-runtime/index.ts`（host 侧 main）、`packages/harness-overlay/src/client/index.tsx`（client 侧 bootstrap）

## 适用场景
日常用 DeepSeek Harness 做编码/写作、会希望 LM Studio 或 Ollama 已经在跑、想直接在同一个窗口里开几个文件标签、改改终端与翻翻网页页面的人。也适合想把 Codex CLI 的一次性任务接到 Harness 主对话里、而不想离开当前会话再去切终端的人。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| Node | >=24 | 由宿主 Minke 桌面 runtime 决定；构建脚本和 Electron Forge 也要求此基线 |
| 平台 | macOS / Windows / Linux | 跨平台桌面，macOS 多 titlebar/半透明 surface 适配；Win/Linux 走平台默认样式 |
| 原生模块 | 无 | overlay 包不直接声明原生依赖；运行时由宿主 Electron 提供 |
| DSH 版本 | 未声明 | overlay 不在 package.json 写 peerDependencies，由宿主 Minke 桌面端控制可用 DSH |

## 安装方式
```bash
dsh plugin --profile web add github:lencx/Minke/packages/harness-overlay
```

## 配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| `lmStudio.enabled` | 布尔 | 是否启用 LM Studio 行（仅影响 UI 可见性，不影响服务可用性） | `false` |
| `lmStudio.lifecycle` | 枚举 | `external`=只发现已运行 / `ensure-running`=缺失时拉起 / `managed`=本插件启动的实例在卸载时回收 | `external` |
| `lmStudio.command` | 字符串 | 显式 `lms` 可执行路径（覆盖自动查找） | `""` |
| `lmStudio.baseURL` | 字符串 | 显式回环 Base URL；端口为 0 会被拒绝 | `""`（自动用 `http://127.0.0.1:1234/v1`） |
| `lmStudio.apiKeyEnv` | 字符串（credential-ref） | 用于 LM Studio 的鉴权环境变量名 | `LM_API_TOKEN` |
| `lmStudio.defaultContextWindow` | 整数 | 派发给 LM Studio 模型的默认上下文窗口 | `32768` |
| `lmStudio.defaultMaxTokens` | 整数 | 派发给 LM Studio 模型的默认 max_tokens | `8192` |
| `ollama.enabled` | 布尔 | 是否启用 Ollama 行 | `false` |
| `ollama.lifecycle` | 枚举 | `external` / `ensure-running`（不支持 `managed`） | `external` |
| `ollama.command` | 字符串 | 显式 `ollama` 可执行路径 | `""` |
| `ollama.baseURL` | 字符串 | 显式回环 Base URL；端口为 0 会被拒绝 | `""`（自动用 `http://127.0.0.1:11434/v1`） |
| `ollama.defaultContextWindow` | 整数 | Ollama 模型默认上下文窗口 | `32768` |
| `ollama.defaultMaxTokens` | 整数 | Ollama 模型默认 max_tokens | `8192` |
| `openAICompatible[]` | 数组 | 手动接入的兼容 OpenAI 回环服务端点，包含 `id / displayName / baseURL / apiKeyEnv` | `[]` |
| 快捷键 | action → binding | 通过 IPC 持久化；最大 128 条，规则 `Mod(+Ctrl/Meta/Alt)?(+Shift)?+Key`（详见 `shortcut-contract.ts`） | `palette.open=Mod+K`、`settings.open=Mod+,`、`session.new=Mod+N`、`session.back=Mod+[`、`session.forward=Mod+]`、`sidebar.toggle=Mod+S`、`tabs.toggle=Mod+P`、`tabs.bottom.toggle=Mod+B` |
| 环境变量 `MINKE_LM_STUDIO_ENABLED` | `0/1` | 与 `MINKE_LM_STUDIO_COMMAND` 同时设置时把 lifecycle 改为 `ensure-running` | 未设置 |
| 环境变量 `MINKE_OLLAMA_ENABLED` | `0/1` | 与 `MINKE_OLLAMA_COMMAND` 同时设置时把 lifecycle 改为 `ensure-running` | 未设置 |
| 环境变量 `LM_STUDIO_BASE_URL` | URL | 覆盖 LM Studio Base URL | 未设置 |
| 环境变量 `OLLAMA_BASE_URL` | URL | 覆盖 Ollama Base URL | 未设置 |

## 常见问题

**Q: 这是只跟桌面版本绑定，还是也能作为 DSH 插件单独装？**

A: 都可以。Minke 桌面应用内部已经 compose 这层 overlay；用户通过 `dsh plugin ... add` 安装的是同一份代码，会被注入到 Harness 运行时。Source-of-truth 行为是同一份 contract（`cordis.patch.yml`）。

**Q: 配了本地模型但列表里看不到我的模型怎么办？**

A: 模型发现走 OpenAI 兼容的 `/v1/models` 端点，LM Studio 还额外合并 v1 loaded-instance 元数据。如果是 LM Studio，先确认 `lms server status --json` 能拿到端口；如果服务是外部启动且当前上下文窗口与配置不一致，overlay 不会替用户重加载，会提示回到 LM Studio 客户端手动 reload 一次。

**Q: Ollama 启动后会发生什么？**

A: 当 overlay 拉起的 `ollama serve` 进程跟随宿主 Minke 进程生命周期，本插件 disposal 时它会被终止（与 LM Studio 的 one-shot CLI 行为不同，LM Studio 的 CLI 不会停止共享服务）。

**Q: Codex 子代理跟"Codex IDE 登录"是一回事吗？**

A: 不是。overlay 只是把任务以 stdio 方式交给已经在 PATH 上的 `codex app-server`；账号登录、模型选择、sandbox 与 workspace 设置都由 Codex CLI 自己负责，overlay 不持有这些状态。

**Q: 桌面版会改我电脑上的哪些数据？**

A: 桌面偏好统一放在 `~/.minke` 目录下；浏览器会话数据保留在本地；DSH 自身的会话与模型设置仍由 Harness 默认路径管理。此 overlay 不写入 `settings.yaml`。

**Q: 装上后切换中英文要在哪里改？**

A: 跟宿主 Harness 的 `locale/change` 同步，无需在此 overlay 内单独切换；桌面原生窗口标题栏、菜单等会跟随同一份 locale snapshot。

**Q: 如何验证我这台 LM Studio 服务配对成功？**

A: 在 Models 页找到 LM Studio 行，确认该行没有"未找到 CLI"的提示（意味着自动找到 `lms`），且模型列表非空；如果是外部启动且当前 loaded instance 上下文与配置值不一致，会得到 `LM_STUDIO_CONTEXT_TOO_SMALL` / `LM_STUDIO_CONTEXT_PREPARATION_FAILED` 类的错误码。

## 上手难度
进阶 — 需要懂本地模型服务的端口/上下文窗口、可执行文件查找，以及 DSH 的多 fiber / plugin 注入模型，普通用户只用 GUI 路径也能用好，但要排障就绕不开这些。

## 已知问题与限制
- LM Studio 的 `lms` 是 one-shot CLI，即便将 lifecycle 设为 `managed`，它启动后会留下一个独立共享服务进程，overlay 仅在"确认是该实例启动"的子集里清理（详见 README 35-43 行）
- 当 LM Studio 实例是外部启动时，overlay 不会替用户重新加载，会报错并要求用户在 LM Studio 客户端内 reload（核心码 `LM_STUDIO_CONTEXT_PREPARATION_FAILED` 等）
- 回环 Base URL 显式传入时，端口 0 会被拒绝（必须是可达的连接端口）
- DSH 版本未在 `package.json` 声明 peer 关系，由宿主 Minke 桌面 runtime 决定可用范围；overlay 单独装的情况下行为依赖宿主的版本契约
- Minke 仍处于活跃迭代阶段，features、打包方式、本地数据 schema 都可能变更（参仓库根 `README.md` 第 24-25 行提示）
- macOS 上当前预发布构建未做 Apple 公证，需要 `xattr -dr com.apple.quarantine` 解除（这是宿主 Minke 桌面侧的打包问题，不在 overlay 范围）

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [Minke](https://deepseek-plugin.org/plugins/lencx/Minke/packages/harness-overlay)
Wiki generated by AI (model: `MiniMax-M3`)
