@hileeon/mcc 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +229 -127
  2. package/dist/accounts/store.d.ts +12 -0
  3. package/dist/accounts/store.d.ts.map +1 -1
  4. package/dist/accounts/store.js.map +1 -1
  5. package/dist/commands/launch.d.ts +9 -0
  6. package/dist/commands/launch.d.ts.map +1 -0
  7. package/dist/commands/launch.js +162 -0
  8. package/dist/commands/launch.js.map +1 -0
  9. package/dist/commands/mcp.d.ts +9 -0
  10. package/dist/commands/mcp.d.ts.map +1 -0
  11. package/dist/commands/mcp.js +112 -0
  12. package/dist/commands/mcp.js.map +1 -0
  13. package/dist/commands/profile-test.d.ts +17 -0
  14. package/dist/commands/profile-test.d.ts.map +1 -0
  15. package/dist/commands/profile-test.js +188 -0
  16. package/dist/commands/profile-test.js.map +1 -0
  17. package/dist/commands/profile.d.ts +8 -0
  18. package/dist/commands/profile.d.ts.map +1 -0
  19. package/dist/commands/profile.js +125 -0
  20. package/dist/commands/profile.js.map +1 -0
  21. package/dist/core/model-router.d.ts.map +1 -1
  22. package/dist/core/model-router.js +36 -3
  23. package/dist/core/model-router.js.map +1 -1
  24. package/dist/{dashboard-server.d.ts → dashboard/server.d.ts} +1 -1
  25. package/dist/dashboard/server.d.ts.map +1 -0
  26. package/dist/{dashboard-server.js → dashboard/server.js} +254 -48
  27. package/dist/dashboard/server.js.map +1 -0
  28. package/dist/mcc.d.ts +4 -2
  29. package/dist/mcc.d.ts.map +1 -1
  30. package/dist/mcc.js +127 -408
  31. package/dist/mcc.js.map +1 -1
  32. package/dist/mcp/installer.d.ts.map +1 -1
  33. package/dist/mcp/installer.js +5 -2
  34. package/dist/mcp/installer.js.map +1 -1
  35. package/dist/mcp/mcp-config.d.ts +33 -3
  36. package/dist/mcp/mcp-config.d.ts.map +1 -1
  37. package/dist/mcp/mcp-config.js +81 -29
  38. package/dist/mcp/mcp-config.js.map +1 -1
  39. package/dist/proxy/proxy-daemon.d.ts +1 -1
  40. package/dist/proxy/proxy-daemon.d.ts.map +1 -1
  41. package/dist/proxy/proxy-daemon.js +27 -7
  42. package/dist/proxy/proxy-daemon.js.map +1 -1
  43. package/dist/proxy/proxy-entry.js +11 -4
  44. package/dist/proxy/proxy-entry.js.map +1 -1
  45. package/dist/proxy/proxy-paths.d.ts +1 -0
  46. package/dist/proxy/proxy-paths.d.ts.map +1 -1
  47. package/dist/proxy/proxy-paths.js.map +1 -1
  48. package/dist/proxy/proxy-server.d.ts +1 -0
  49. package/dist/proxy/proxy-server.d.ts.map +1 -1
  50. package/dist/proxy/proxy-server.js +114 -6
  51. package/dist/proxy/proxy-server.js.map +1 -1
  52. package/dist/shared/config.d.ts +15 -0
  53. package/dist/shared/config.d.ts.map +1 -0
  54. package/dist/shared/config.js +79 -0
  55. package/dist/shared/config.js.map +1 -0
  56. package/dist/shared/logger.d.ts +23 -18
  57. package/dist/shared/logger.d.ts.map +1 -1
  58. package/dist/shared/logger.js +17 -178
  59. package/dist/shared/logger.js.map +1 -1
  60. package/dist/shared/provider-preset-catalog.d.ts +8 -2
  61. package/dist/shared/provider-preset-catalog.d.ts.map +1 -1
  62. package/dist/shared/provider-preset-catalog.js +61 -31
  63. package/dist/shared/provider-preset-catalog.js.map +1 -1
  64. package/dist/shared/test-image.d.ts +15 -0
  65. package/dist/shared/test-image.d.ts.map +1 -0
  66. package/dist/shared/test-image.js +89 -0
  67. package/dist/shared/test-image.js.map +1 -0
  68. package/dist/ui/assets/index-7kowlJw9.js +40 -0
  69. package/dist/ui/assets/index-DnC-lskL.css +1 -0
  70. package/dist/ui/index.html +21 -13
  71. package/dist/update.d.ts +31 -0
  72. package/dist/update.d.ts.map +1 -0
  73. package/dist/update.js +196 -0
  74. package/dist/update.js.map +1 -0
  75. package/lib/mcp/mcc-image-analysis-server.cjs +454 -454
  76. package/lib/mcp/mcc-websearch-server.cjs +339 -339
  77. package/lib/mcp-hooks/image-analysis-runtime.cjs +563 -510
  78. package/lib/mcp-hooks/image-analyzer-transformer.cjs +526 -526
  79. package/lib/mcp-hooks/websearch-transformer.cjs +1597 -1421
  80. package/lib/proxy/config/config-loader-facade.js +24 -24
  81. package/lib/proxy/glmt/delta-accumulator.js +362 -362
  82. package/lib/proxy/glmt/glmt-transformer.js +203 -203
  83. package/lib/proxy/glmt/index.js +40 -40
  84. package/lib/proxy/glmt/locale-enforcer.js +68 -68
  85. package/lib/proxy/glmt/pipeline/content-transformer.js +161 -161
  86. package/lib/proxy/glmt/pipeline/index.js +19 -19
  87. package/lib/proxy/glmt/pipeline/request-transformer.js +115 -115
  88. package/lib/proxy/glmt/pipeline/response-builder.js +204 -204
  89. package/lib/proxy/glmt/pipeline/stream-parser.js +233 -233
  90. package/lib/proxy/glmt/pipeline/tool-call-handler.js +77 -77
  91. package/lib/proxy/glmt/pipeline/types.js +5 -5
  92. package/lib/proxy/glmt/reasoning-enforcer.js +150 -150
  93. package/lib/proxy/glmt/sse-parser.js +101 -101
  94. package/lib/proxy/services/logging.js +13 -13
  95. package/lib/proxy/transformers/request-transformer.js +471 -471
  96. package/lib/proxy/transformers/sse-stream-transformer.js +198 -198
  97. package/lib/shared/logger.cjs +160 -138
  98. package/package.json +58 -41
  99. package/dist/dashboard-server.d.ts.map +0 -1
  100. package/dist/dashboard-server.js.map +0 -1
  101. package/dist/ui/assets/index-B16lhKZ6.js +0 -40
  102. package/dist/ui/assets/index-jEfiB6-h.css +0 -1
package/README.md CHANGED
@@ -1,127 +1,229 @@
1
- # MCC — My Cloud Code
2
-
3
- 多账号切换工具,在多个 Claude Code 账号(不同 API Provider)之间快速切换。支持直接 API 和 OpenAI 兼容模式(自动翻译 proxy)。
4
-
5
- ## 快速上手
6
-
7
- ```bash
8
- npm install
9
- npm run build # tsc 编译
10
- npm run dev -- help # 不编译直接跑
11
- npm run dashboard # 启动 Web 管理界面(http://localhost:3000)
12
- ```
13
-
14
- ## 核心命令
15
-
16
- ```bash
17
- mcc <profile> [args...] # 用指定 profile 启动 Claude Code
18
- mcc profile add <name> # 添加 profile
19
- mcc profile list # 查看所有 profile
20
- mcc profile remove <name> # 删除 profile
21
- mcc profile default [name] # 设默认 profile
22
- mcc mcp list # 查看可用 MCP 工具
23
- mcc mcp add --name <id> --command <cmd> # 添加外部 MCP 工具
24
- mcc mcp remove <name> # 删除外部 MCP 工具
25
- mcc mcp enable <name> <profile> # 启用外部 MCP(指定 profile)
26
- mcc mcp disable <name> <profile> # 禁用外部 MCP
27
- mcc dashboard # 打开 Web Dashboard
28
- ```
29
-
30
- ## 核心功能
31
-
32
- - **多 profile 管理**:API key 存 `~/.mcc/profiles/<name>/.key`,元数据存 `~/.mcc/profiles.json`
33
- - **实例隔离**:每个 profile 独立 `CLAUDE_CONFIG_DIR`,位于 `~/.mcc/instances/<name>/`
34
- - **OpenAI 兼容模式**:`--protocol openai` 时自动启动本地翻译 proxy(端口 43456-43555),转发 OpenAI 格式请求到 upstream Anthropic 兼容端点
35
- - **Tiered model**:profile 支持 `opusModel`/`sonnetModel`/`haikuModel` 三级模型切换
36
- - **内置 MCP**:`mcc-websearch`(多源搜索)和 `mcc-image-analysis`(图片/PDF 分析)
37
- - **外部 MCP**:通过 `mcc mcp add` 注册第三方 MCP server,支持 `${MCC_PROVIDER_KEY:<providerId>}` 引用 provider API key
38
- - **Dashboard**:`npm run dashboard` 启动 Express 管理界面(http://localhost:3000)
39
-
40
- ## 添加一个 profile
41
-
42
- ```bash
43
- # Anthropic 直接 API 模式
44
- mcc profile add prod --base-url https://api.deepseek.com/anthropic --api-key sk-xxxx --model deepseek-chat
45
-
46
- # OpenAI 兼容模式(需要翻译 proxy)
47
- mcc profile add minimax --base-url https://api.minimax.com --api-key sk-xxxx --model MiniMax-Text-01 --protocol openai
48
-
49
- # tiered model
50
- mcc profile add big --base-url https://api.anthropic.com --api-key sk-xxxx --model claude-sonnet-4-6 --opus-model claude-opus-4-7 --sonnet-model claude-sonnet-4-6 --haiku-model claude-haiku-4-5
51
- ```
52
-
53
- ## 添加外部 MCP
54
-
55
- ```bash
56
- mcc mcp add minimax-plan \
57
- --display-name "MiniMax Token Plan" \
58
- --command uvx \
59
- --args "minimax-coding-plan-mcp,-y" \
60
- --provider-ref minimax
61
-
62
- # 在指定 profile 启用
63
- mcc mcp enable minimax-plan minimax
64
- ```
65
-
66
- ## 目录结构
67
-
68
- ```
69
- src/
70
- ├── mcc.ts # CLI 入口
71
- ├── accounts/
72
- │ ├── store.ts # Profile 元数据
73
- ├── instance-manager.ts # CLAUDE_CONFIG_DIR 隔离
74
- │ └── shared-manager.ts # instance 共享目录
75
- ├── core/model-router.ts # Profile env 构建
76
- ├── mcp/
77
- ├── registry.ts # 内置 MCP 注册表
78
- ├── installer.ts # MCP 安装到 instance
79
- │ ├── external-registry.ts # 外部 MCP 注册表
80
- └── mcp-config.ts # provider 配置
81
- ├── proxy/ # OpenAI→Anthropic 翻译 proxy
82
- ├── dashboard-server.ts # Express Dashboard
83
- └── shared/logger.ts # 日志系统
84
-
85
- lib/
86
- ├── mcp/ # 内置 MCP server JS
87
- ├── mcp-hooks/ # MCP runtime hooks
88
- ├── logger.cjs
89
- ├── image-analysis-runtime.cjs
90
- ├── image-analyzer-transformer.cjs
91
- └── websearch-transformer.cjs
92
- └── shared/logger.cjs
93
- ```
94
-
95
- ## 存储结构
96
-
97
- ```
98
- ~/.mcc/
99
- ├── profiles.json
100
- ├── profiles/<name>/.key
101
- ├── instances/<name>/
102
- ├── .claude.json # Claude Code 读取的 MCP 配置
103
- └── .mcp/mcpServers.json
104
- ├── mcp/
105
- ├── mcp-hooks/
106
- ├── external-mcp-servers.json # 外部 MCP 定义
107
- ├── mcp-config.json # WebSearch/ImageAnalysis 配置
108
- └── proxy/ # proxy PID/session
109
- ```
110
-
111
- ## MCP 工具配置
112
-
113
- 通过 `~/.mcc/mcp-config.json` 配置,或通过 Dashboard UI。
114
-
115
- WebSearch provider:duckduckgo(默认,免 API key)、exa、tavily、brave
116
-
117
- ImageAnalysis provider:ali(qwen-vl)、kimi(moonshot-vl)、minimax、deepseek
118
-
119
- ## 开发
120
-
121
- ```bash
122
- npm install
123
- npm run build # tsc
124
- npm run dev -- help # 直接跑 dist/
125
- npm run build:ui # 构建 React Dashboard
126
- npm run dashboard # 编译 + 启动 Dashboard
127
- ```
1
+ # MCC — My Cloud Code
2
+
3
+ 多账号切换工具,在多个 Claude Code 账号(不同 API Provider)之间快速切换。支持直接 API 和 OpenAI 兼容模式(自动翻译 proxy)。
4
+
5
+ ## 快速上手
6
+
7
+ ```bash
8
+ pnpm install # 没装 pnpm?先 `npm i -g pnpm`
9
+ pnpm build # 首次必跑:tsc 编译后端
10
+ pnpm mcc -h # 验证 CLI(pnpm 直接透传 flag,无需 --)
11
+ pnpm dev # 启动前后端 dev server,浏览器开 http://localhost:5173
12
+ ```
13
+
14
+ ## 核心命令
15
+
16
+ ```bash
17
+ mcc <profile> [args...] # 用指定 profile 启动 Claude Code
18
+ mcc profile add <name> # 添加 profile
19
+ mcc profile list # 查看所有 profile
20
+ mcc profile remove <name> # 删除 profile
21
+ mcc profile default [name] # 设默认 profile
22
+ mcc profile test [name...] # 体检 profile(验 key + 余额)
23
+ mcc profile test x --vision # 额外探测主模型能否识图
24
+ mcc mcp list # 查看可用 MCP 工具
25
+ mcc mcp add --name <id> --command <cmd> # 添加外部 MCP 工具
26
+ mcc mcp remove <name> # 删除外部 MCP 工具
27
+ mcc mcp enable <name> <profile> # 启用外部 MCP(指定 profile)
28
+ mcc mcp disable <name> <profile> # 禁用外部 MCP
29
+ mcc config # 打开 Web 配置控制台
30
+ ```
31
+
32
+ ## 核心功能
33
+
34
+ - **多 profile 管理**:API key `~/.mcc/profiles/<name>/.key`,元数据存 `~/.mcc/profiles.json`
35
+ - **实例隔离**:每个 profile 独立 `CLAUDE_CONFIG_DIR`,位于 `~/.mcc/instances/<name>/`
36
+ - **OpenAI 兼容模式**:`--protocol openai` 时自动启动本地翻译 proxy(端口 43456-43555),转发 OpenAI 格式请求到 upstream Anthropic 兼容端点
37
+ - **思考模式**:profile 支持 `reasoningEffort`,默认开启思考;强度以 Claude Code 自身的 `/effort`/Tab 为准并自动映射到各 provider,`reasoningEffort` 仅作兜底默认
38
+ - **Tiered model**:profile 支持 `opusModel`/`sonnetModel`/`haikuModel` 三级模型切换
39
+ - **内置 MCP**:`mcc-websearch`(多源搜索)和 `mcc-image-analysis`(图片/PDF 分析)
40
+ - **外部 MCP**:通过 `mcc mcp add` 注册第三方 MCP server,支持 `${MCC_PROVIDER_KEY:<providerId>}` 引用 provider API key
41
+ - **Dashboard**:`mcc config` 打开 Web 配置控制台(http://localhost:3000)
42
+
43
+ ## 添加一个 profile
44
+
45
+ ```bash
46
+ # Anthropic 直接 API 模式
47
+ mcc profile add prod --base-url https://api.deepseek.com/anthropic --api-key sk-xxxx --model deepseek-chat
48
+
49
+ # OpenAI 兼容模式(需要翻译 proxy)
50
+ mcc profile add minimax --base-url https://api.minimax.com --api-key sk-xxxx --model MiniMax-Text-01 --protocol openai
51
+
52
+ # 带 tiered model
53
+ mcc profile add big --base-url https://api.anthropic.com --api-key sk-xxxx --model claude-sonnet-4-6 --opus-model claude-opus-4-7 --sonnet-model claude-sonnet-4-6 --haiku-model claude-haiku-4-5
54
+ ```
55
+
56
+ ## 添加外部 MCP
57
+
58
+ ```bash
59
+ mcc mcp add minimax-plan \
60
+ --display-name "MiniMax Token Plan" \
61
+ --command uvx \
62
+ --args "minimax-coding-plan-mcp,-y" \
63
+ --provider-ref minimax
64
+
65
+ # 在指定 profile 启用
66
+ mcc mcp enable minimax-plan minimax
67
+ ```
68
+
69
+ ## 目录结构
70
+
71
+ ```
72
+ src/
73
+ ├── mcc.ts # CLI 入口(参数解析 + dispatcher,~150 行)
74
+ ├── commands/ # 每个 mcc 子命令一个文件
75
+ ├── launch.ts # mcc <profile>
76
+ ├── profile.ts # mcc profile add|list|remove|default
77
+ └── mcp.ts # mcc mcp list|add|remove|enable|disable
78
+ ├── accounts/
79
+ │ ├── store.ts # Profile 元数据
80
+ ├── instance-manager.ts # CLAUDE_CONFIG_DIR 隔离
81
+ │ └── shared-manager.ts # instance 共享目录
82
+ ├── core/model-router.ts # Profile env 构建
83
+ ├── mcp/
84
+ │ ├── registry.ts # 内置 MCP 注册表
85
+ │ ├── installer.ts # MCP 安装到 instance
86
+ ├── external-registry.ts # 外部 MCP 注册表
87
+ │ └── mcp-config.ts # provider 配置
88
+ ├── proxy/ # OpenAI→Anthropic 翻译 proxy
89
+ ├── dashboard/server.ts # Express dashboard server(mcc config 启)
90
+ ├── shared/
91
+ ├── logger.ts # thin shell → lib/shared/logger.cjs
92
+ └── provider-preset-catalog.ts
93
+ └── update.ts # mcc update / mcc update-check
94
+
95
+ ui/src/ # Dashboard 前端(React + Vite)
96
+ ├── App.tsx # 编排骨架(~330 行)
97
+ ├── types/domain.ts # 领域类型(Protocol、ProfileFormPayload 等)
98
+ ├── lib/
99
+ ├── api.ts # 后端 API client + 边界类型
100
+ ├── providers.ts # 17 个 provider 单一真相源(id+name+品牌色)
101
+ │ └── strings.ts # 所有 UI 中文文案集中
102
+ ├── hooks/ # 按域分离的状态 hook
103
+ ├── useProfiles.ts
104
+ ├── useMcpConfig.ts
105
+ │ └── useStatus.ts
106
+ ├── design/
107
+ ├── tokens/ # primitive → semantic → components 三层
108
+ └── icons/ # Ui / ProviderIcon / ArcadeLogo
109
+ └── components/ # 业务面板组件
110
+
111
+ lib/
112
+ ├── mcp/ # 内置 MCP server CJS(被复制到 ~/.mcc/mcp/)
113
+ │ ├── mcc-websearch-server.cjs
114
+ │ └── mcc-image-analysis-server.cjs
115
+ ├── mcp-hooks/ # MCP runtime hooks(复制到 ~/.mcc/mcp-hooks/)
116
+ │ ├── image-analysis-runtime.cjs
117
+ │ ├── image-analyzer-transformer.cjs
118
+ │ └── websearch-transformer.cjs
119
+ └── shared/logger.cjs # logger 单一真相源(src/shared/logger.ts 是它的 TS shell)
120
+ ```
121
+
122
+ ## 存储结构
123
+
124
+ ```
125
+ ~/.mcc/
126
+ ├── profiles.json
127
+ ├── profiles/<name>/.key
128
+ ├── instances/<name>/
129
+ │ ├── .claude.json # Claude Code 读取的 MCP 配置
130
+ │ └── .mcp/mcpServers.json
131
+ ├── mcp/
132
+ ├── mcp-hooks/
133
+ ├── external-mcp-servers.json # 外部 MCP 定义
134
+ ├── mcp-config.json # WebSearch/ImageAnalysis 配置
135
+ └── proxy/ # proxy PID/session
136
+ ```
137
+
138
+ ## MCP 工具配置
139
+
140
+ 通过 `~/.mcc/mcp-config.json` 配置,或通过 Dashboard UI。
141
+
142
+ WebSearch provider:duckduckgo(默认免 key)、博查 Bocha、阿里通义 web_search、MiniMax Search、exa、tavily、brave
143
+
144
+ ImageAnalysis provider:ali(qwen3-vl)、xiaomi(mimo-v2-omni)、minimax、deepseek(V4 起原生 vision)、kimi
145
+
146
+ ## 本地开发
147
+
148
+ 所有 dev 命令都通过 `pnpm <script>` 调,**跟全局 `mcc <cmd>` 心智模型一致,但跑的是本地代码**。
149
+
150
+ ### 一键全栈 dev(日常推荐)
151
+
152
+ ```bash
153
+ pnpm dev
154
+ ```
155
+
156
+ `concurrently` 同时启两个 server,输出按颜色前缀混合显示:
157
+ - `[be]` 后端 API on `:3000`(`tsx watch` — 改 `src/` 自动重启)
158
+ - `[fe]` 前端 vite on `:5173`(HMR — 改 `ui/src/` 浏览器立即热更新)
159
+
160
+ **浏览器开 http://localhost:5173**(vite 自动把 `/api/*` proxy 到 :3000)。Ctrl-C 一次两个进程一起退。
161
+
162
+ ### 用本地版 mcc 测命令
163
+
164
+ ```bash
165
+ pnpm mcc deepseek # 启 deepseek profile(跟全局 mcc deepseek 等价)
166
+ pnpm mcc profile list # 列 profile
167
+ pnpm mcc config # 打开配置面板(dynamic import,无需先 build)
168
+ pnpm mcc mcp list # 任意子命令都能透传
169
+ ```
170
+
171
+ **带横线的 flag 直接传,无需 `--` 分隔**(这是 pnpm 比 npm 省心的地方):
172
+
173
+ ```bash
174
+ pnpm mcc -v # ✓ 看版本
175
+ pnpm mcc -h # ✓ 看帮助
176
+ pnpm mcc deepseek --print "hello" # ✓ 透传 --print 给 Claude Code
177
+ ```
178
+
179
+ ### 单独启前/后端
180
+
181
+ ```bash
182
+ pnpm dash # 只起后端(tsx watch src/dashboard/server.ts),监听 :3000
183
+ pnpm ui # 只起前端(cd ui && vite),监听 :5173
184
+ ```
185
+
186
+ 适合:只改一端时省一个进程;或者你已经在 tmux/iTerm 里 split pane 习惯了,不想要 concurrently 的混合输出。
187
+
188
+ ### 模拟 prod(最终用户体验)
189
+
190
+ ```bash
191
+ pnpm dashboard
192
+ ```
193
+
194
+ 完整 `build` 后端 + `build:ui` 前端,再启 `dist/dashboard/server.js`。**一个 server**(:3000)同时提供 API 和 serve 前端静态文件 —— 跟 `mcc config` 全局版本走同一条路径。改了代码要重跑这条命令才生效。
195
+
196
+ ### Typecheck
197
+
198
+ ```bash
199
+ pnpm typecheck # 后端 tsc --noEmit
200
+ pnpm -C ui exec tsc --noEmit # 前端(`pnpm build:ui` 里也会跑)
201
+ ```
202
+
203
+ ### 让全局 `mcc` 指向本地代码
204
+
205
+ 全局装的 `mcc` 来自 npm registry,不会跑你本地的修改。要让 `mcc config` 也指向本地代码:
206
+
207
+ ```bash
208
+ pnpm link --global # 把本地版 link 到全局
209
+ mcc config # 现在跑的是本地代码
210
+ mcc -v
211
+
212
+ # 用完恢复 npm registry 版本:
213
+ pnpm uninstall -g @hileeon/mcc && npm i -g @hileeon/mcc
214
+ ```
215
+
216
+ ### 所有 scripts 一览
217
+
218
+ | Script | 干啥 | 何时用 |
219
+ |---|---|---|
220
+ | `pnpm mcc <args>` | `tsx src/mcc.ts <args>` — 透传 | 测任何 CLI 命令 |
221
+ | `pnpm dev` | `concurrently` 起 dash + ui | 日常 dev |
222
+ | `pnpm dash` | `tsx watch src/dashboard/server.ts` | 只起后端 |
223
+ | `pnpm ui` | `pnpm -C ui dev` | 只起前端 |
224
+ | `pnpm dashboard` | 完整 build + 启 `dist/` | 模拟 prod |
225
+ | `pnpm build` | tsc 编译后端 → `dist/` | 发布前 / link 前必跑 |
226
+ | `pnpm build:ui` | vite build 前端 → `dist/ui/` | 同上 |
227
+ | `pnpm build:all` | build + build:ui | 同上 |
228
+ | `pnpm build:watch` | tsc --watch | 不用 tsx 时的旧 watch 方式 |
229
+ | `pnpm typecheck` | tsc --noEmit | CI / 提交前 |
@@ -8,8 +8,19 @@
8
8
  * └── <profile-name>/
9
9
  * └── .key # API key (plain text)
10
10
  */
11
+ /**
12
+ * Thinking / reasoning intensity. Normalized across providers; how it maps:
13
+ * - openai-protocol → injected by the proxy as provider-specific params
14
+ * (Qwen: enable_thinking + thinking_budget; GLM: thinking{enabled} + reasoning_effort;
15
+ * generic: reasoning_effort, max clamped to high).
16
+ * - anthropic-protocol → exported as CLAUDE_CODE_EFFORT_LEVEL (honored by DeepSeek;
17
+ * a harmless no-op for providers like Kimi/MiMo whose thinking is binary always-on).
18
+ * Undefined is treated as 'high' (thinking on). 'off' disables.
19
+ */
20
+ export type ReasoningEffort = 'off' | 'low' | 'medium' | 'high' | 'max';
11
21
  export interface Profile {
12
22
  name: string;
23
+ displayName?: string;
13
24
  baseUrl: string;
14
25
  model: string;
15
26
  opusModel?: string;
@@ -17,6 +28,7 @@ export interface Profile {
17
28
  haikuModel?: string;
18
29
  protocol?: 'anthropic' | 'openai';
19
30
  proxyChatCompletionsPath?: string;
31
+ reasoningEffort?: ReasoningEffort;
20
32
  createdAt: string;
21
33
  lastUsedAt?: string;
22
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/accounts/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiBH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA0BD,wBAAgB,YAAY,IAAI,OAAO,EAAE,CAExC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE5D;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAEtD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIjE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUhD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKpD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/accounts/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiBH;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAExE,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA0BD,wBAAgB,YAAY,IAAI,OAAO,EAAE,CAExC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE5D;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAEtD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIjE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUhD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKpD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD"}
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/accounts/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/accounts/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `mcc <profile> [args...]` — launch Claude Code with the given profile.
3
+ *
4
+ * Owns the full launch lifecycle: validate profile → ensure instance →
5
+ * sync MCP servers → init session logging → (optionally) start the
6
+ * OpenAI translation proxy → spawn `claude` with the assembled env.
7
+ */
8
+ export declare function cmdLaunch(args: string[]): Promise<void>;
9
+ //# sourceMappingURL=launch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/commands/launch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoBH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgH7D"}
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ /**
3
+ * `mcc <profile> [args...]` — launch Claude Code with the given profile.
4
+ *
5
+ * Owns the full launch lifecycle: validate profile → ensure instance →
6
+ * sync MCP servers → init session logging → (optionally) start the
7
+ * OpenAI translation proxy → spawn `claude` with the assembled env.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ var __importDefault = (this && this.__importDefault) || function (mod) {
43
+ return (mod && mod.__esModule) ? mod : { "default": mod };
44
+ };
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.cmdLaunch = cmdLaunch;
47
+ const child_process_1 = require("child_process");
48
+ const path = __importStar(require("path"));
49
+ const picocolors_1 = __importDefault(require("picocolors"));
50
+ const store_1 = require("../accounts/store");
51
+ const instance_manager_1 = require("../accounts/instance-manager");
52
+ const model_router_1 = require("../core/model-router");
53
+ const installer_1 = require("../mcp/installer");
54
+ const registry_1 = require("../mcp/registry");
55
+ const mcp_config_1 = require("../mcp/mcp-config");
56
+ const proxy_daemon_1 = require("../proxy/proxy-daemon");
57
+ const logger_1 = require("../shared/logger");
58
+ const instanceMgr = new instance_manager_1.MCCInstanceManager();
59
+ async function cmdLaunch(args) {
60
+ const profileName = args[0];
61
+ if (!profileName) {
62
+ console.error('[!] Usage: mcc <profile> [args...]');
63
+ process.exit(1);
64
+ }
65
+ const profile = (0, store_1.getProfile)(profileName);
66
+ if (!profile) {
67
+ console.error(`[!] Profile not found: ${profileName}`);
68
+ console.error('[i] Available profiles:');
69
+ for (const p of (0, store_1.listProfiles)()) {
70
+ console.error(` - ${p.name} (baseUrl: ${p.baseUrl})`);
71
+ }
72
+ process.exit(1);
73
+ }
74
+ const proto = profile.protocol || 'anthropic';
75
+ console.log(` ${picocolors_1.default.cyan(picocolors_1.default.bold('●'))} ${picocolors_1.default.bold(profileName)} ${picocolors_1.default.dim('·')} ${picocolors_1.default.cyan(profile.model)} ${picocolors_1.default.dim('·')} ${picocolors_1.default.dim(proto)}`);
76
+ const apiKey = (0, store_1.getProfileApiKey)(profileName);
77
+ if (!apiKey) {
78
+ console.error(`[!] No API key found for profile: ${profileName}`);
79
+ process.exit(1);
80
+ }
81
+ // Read MCP config early so we can display provider info
82
+ const mcpConfig = (0, mcp_config_1.readMcpConfig)();
83
+ const wsProviders = (0, mcp_config_1.getEnabledWebSearchProviders)(mcpConfig);
84
+ const iaProvider = (0, mcp_config_1.getActiveImageAnalysisProvider)(mcpConfig);
85
+ const instancePath = await instanceMgr.ensureInstance(profileName);
86
+ (0, installer_1.syncInstanceMcpServers)(instancePath, registry_1.BUILTIN_MCP_SERVERS.map((s) => s.name), profileName);
87
+ // Initialize logging session
88
+ const sessionId = (0, logger_1.makeSessionId)();
89
+ const mccHome = process.env.MCC_HOME ?? path.join(process.env.HOME ?? process.env.USERPROFILE ?? '~', '.mcc');
90
+ const logDir = path.join(mccHome, 'logs', profileName, 'sessions', sessionId);
91
+ (0, logger_1.init)(sessionId, logDir);
92
+ logger_1.log.debug('MCC', `Session starting: ${profileName} | log: ${logDir}`);
93
+ console.log(` ${picocolors_1.default.dim('session')} ${picocolors_1.default.dim(sessionId)}`);
94
+ // MCP provider summary
95
+ if (wsProviders.length > 0) {
96
+ console.log(` ${picocolors_1.default.dim('websearch')} ${picocolors_1.default.dim(wsProviders.join(', '))}`);
97
+ }
98
+ else if (mcpConfig.websearch.enabled) {
99
+ console.log(` ${picocolors_1.default.dim('websearch')} ${picocolors_1.default.dim('none enabled')}`);
100
+ }
101
+ if (mcpConfig.imageAnalysis.enabled) {
102
+ if (iaProvider) {
103
+ console.log(` ${picocolors_1.default.dim('image')} ${picocolors_1.default.dim(iaProvider.id)} ${picocolors_1.default.dim('·')} ${picocolors_1.default.cyan(iaProvider.model)}`);
104
+ }
105
+ else {
106
+ console.log(` ${picocolors_1.default.dim('image')} ${picocolors_1.default.dim('no active provider')}`);
107
+ }
108
+ }
109
+ const env = (0, model_router_1.buildProfileEnv)(profile, apiKey, instancePath);
110
+ env.MCC_CURRENT_PROFILE = profileName;
111
+ env.MCC_LOG_SESSION_ID = sessionId;
112
+ env.MCC_LOG_DIR = logDir;
113
+ // Preserve full color depth — without this Claude Code's TUI looks dim when
114
+ // spawned as a child process (TTY color detection can downgrade).
115
+ env.FORCE_COLOR = '3';
116
+ env.COLORTERM = 'truecolor';
117
+ // Debug: instance path + key env vars (no secrets)
118
+ if ((0, logger_1.isDebugEnabled)()) {
119
+ console.log(` ${picocolors_1.default.dim('instance')} ${picocolors_1.default.dim(instancePath)}`);
120
+ const debugEnvs = [
121
+ ['ANTHROPIC_BASE_URL', env.ANTHROPIC_BASE_URL],
122
+ ['ANTHROPIC_MODEL', env.ANTHROPIC_MODEL],
123
+ ['CLAUDE_CONFIG_DIR', env.CLAUDE_CONFIG_DIR],
124
+ ['MCC_WEBSEARCH_ENABLED', env.MCC_WEBSEARCH_ENABLED || '0'],
125
+ ['MCC_IMAGE_ANALYSIS_ENABLED', env.MCC_IMAGE_ANALYSIS_ENABLED || '0'],
126
+ ];
127
+ if (env.ANTHROPIC_DEFAULT_OPUS_MODEL !== env.ANTHROPIC_MODEL)
128
+ debugEnvs.push(['ANTHROPIC_DEFAULT_OPUS_MODEL', env.ANTHROPIC_DEFAULT_OPUS_MODEL]);
129
+ if (env.ANTHROPIC_DEFAULT_SONNET_MODEL !== env.ANTHROPIC_MODEL)
130
+ debugEnvs.push(['ANTHROPIC_DEFAULT_SONNET_MODEL', env.ANTHROPIC_DEFAULT_SONNET_MODEL]);
131
+ if (env.ANTHROPIC_DEFAULT_HAIKU_MODEL !== env.ANTHROPIC_MODEL)
132
+ debugEnvs.push(['ANTHROPIC_DEFAULT_HAIKU_MODEL', env.ANTHROPIC_DEFAULT_HAIKU_MODEL]);
133
+ console.log(` ${picocolors_1.default.dim('---')}`);
134
+ for (const [k, v] of debugEnvs) {
135
+ console.log(` ${picocolors_1.default.dim('env')} ${picocolors_1.default.dim(k)}=${picocolors_1.default.dim(v)}`);
136
+ }
137
+ }
138
+ // Start translation proxy for OpenAI-compatible profiles
139
+ if (profile.protocol === 'openai') {
140
+ try {
141
+ const proxyInfo = await (0, proxy_daemon_1.startProxy)(profileName, profile.baseUrl, apiKey, profile.model, profile.proxyChatCompletionsPath, profile.reasoningEffort);
142
+ env.ANTHROPIC_BASE_URL = `http://127.0.0.1:${proxyInfo.port}`;
143
+ env.ANTHROPIC_AUTH_TOKEN = proxyInfo.authToken;
144
+ // MCP image analysis also needs to go through the proxy
145
+ env.MCC_IMAGE_ANALYSIS_RUNTIME_BASE_URL = `http://127.0.0.1:${proxyInfo.port}`;
146
+ env.MCC_IMAGE_ANALYSIS_RUNTIME_API_KEY = proxyInfo.authToken;
147
+ console.log(` ${picocolors_1.default.dim('proxy')} ${picocolors_1.default.cyan(`:${proxyInfo.port}`)}`);
148
+ }
149
+ catch (e) {
150
+ console.error(`[!] Failed to start translation proxy: ${e.message}`);
151
+ process.exit(1);
152
+ }
153
+ }
154
+ console.log(`\n ${picocolors_1.default.green('✓')} ${picocolors_1.default.bold('launching Claude Code')}`);
155
+ const remainingArgs = args.slice(1);
156
+ const child = (0, child_process_1.spawn)('claude', remainingArgs, {
157
+ env: { ...process.env, ...env },
158
+ stdio: 'inherit',
159
+ });
160
+ child.on('exit', (code) => process.exit(code ?? 0));
161
+ }
162
+ //# sourceMappingURL=launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/commands/launch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `mcc mcp <list|add|remove|enable|disable>` — external MCP server management.
3
+ */
4
+ export declare function cmdMcpList(): Promise<void>;
5
+ export declare function cmdMcpAdd(args: string[]): Promise<void>;
6
+ export declare function cmdMcpRemove(args: string[]): Promise<void>;
7
+ export declare function cmdMcpEnable(args: string[]): Promise<void>;
8
+ export declare function cmdMcpDisable(args: string[]): Promise<void>;
9
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwBH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAahD;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC7D;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAahE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAehE;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAejE"}