@unitsvc/cc-helper 1.5.8 → 1.5.11

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.
package/README-zh.md CHANGED
@@ -1,10 +1,17 @@
1
- # cc-helper
1
+ <div align="center">
2
2
 
3
- [![npm version](https://img.shields.io/npm/v/@unitsvc/cc-helper.svg)](https://www.npmjs.com/package/@unitsvc/cc-helper) [![License](https://img.shields.io/badge/License-AGPL%203.0-blue.svg)](https://github.com/next-bin/cc-helper/blob/master/LICENSE) [![Node](https://img.shields.io/badge/Node-%3E%3D14.0.0-green.svg)](https://nodejs.org) [![CLAUDE](https://img.shields.io/badge/Claude%20Code-v2.1.71%2B-green.svg)](https://docs.anthropic.com/en/docs/claude-code)
3
+ # CC-Helper
4
4
 
5
- [**English**](./README.md) | [**简体中文**](./README-zh.md)
5
+ ### Claude Code 的全能助手与AI供应商管理工具
6
6
 
7
- > Claude Code 终极增强工具:一键解锁隐藏功能、管理多 AI 提供商、安全存储密钥、多环境配置同步 —— 全部集成在一个 CLI 工具中。
7
+ [![npm version](https://img.shields.io/npm/v/@unitsvc/cc-helper.svg?color=blue&label=version)](https://www.npmjs.com/package/@unitsvc/cc-helper)
8
+ [![npm downloads](https://img.shields.io/npm/dt/@unitsvc/cc-helper.svg?color=green&label=downloads)](https://www.npmjs.com/package/@unitsvc/cc-helper)
9
+ [![Platform](https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-orange.svg)](https://github.com/next-bin/cc-helper)
10
+ [![License](https://img.shields.io/badge/License-AGPL%203.0-blue.svg)](https://github.com/next-bin/cc-helper/blob/master/LICENSE)
11
+
12
+ [English](README.md) | 简体中文
13
+
14
+ </div>
8
15
 
9
16
  > **⚠️ 声明:智谱(glm/zai)公司及其关联产品禁止使用本软件。**
10
17
 
@@ -23,14 +30,16 @@ npm install -g @anthropic-ai/claude-code@v2.1.126
23
30
 
24
31
  ## 安装
25
32
 
26
- 两种使用方式(二选一):
27
-
28
33
  ```bash
29
- # 全局安装(可选)
30
34
  npm install -g @unitsvc/cc-helper@latest
35
+ ```
31
36
 
32
- # 或直接运行,无需安装
33
- npx @unitsvc/cc-helper@latest enable
37
+ ## 更新
38
+
39
+ ```bash
40
+ npm install -g @unitsvc/cc-helper@latest
41
+ # 或
42
+ cc-helper update
34
43
  ```
35
44
 
36
45
  ### 代理支持
@@ -39,10 +48,10 @@ npx @unitsvc/cc-helper@latest enable
39
48
 
40
49
  ```bash
41
50
  # 使用默认代理
42
- npx @unitsvc/cc-helper --proxy enable
51
+ cc-helper --proxy enable
43
52
 
44
53
  # 使用自定义代理
45
- npx @unitsvc/cc-helper --proxy https://your-proxy.com enable
54
+ cc-helper --proxy https://your-proxy.com enable
46
55
  ```
47
56
 
48
57
  ---
@@ -51,26 +60,29 @@ npx @unitsvc/cc-helper --proxy https://your-proxy.com enable
51
60
 
52
61
  ```bash
53
62
  # 启用默认功能(/loop, /btw, /keybindings)
54
- npx @unitsvc/cc-helper enable
63
+ cc-helper enable
55
64
 
56
65
  # 启用特定功能
57
- npx @unitsvc/cc-helper enable loop # 定时重复提示
58
- npx @unitsvc/cc-helper enable btw # 旁支问题
59
- npx @unitsvc/cc-helper enable keybindings # 自定义键盘快捷键
60
- npx @unitsvc/cc-helper enable toolsearch # 动态工具搜索
61
- npx @unitsvc/cc-helper enable context1m # 1M 上下文(v2.1.76+)
62
- npx @unitsvc/cc-helper enable automode # 所有模型的自动模式(v2.1.75+)
63
- npx @unitsvc/cc-helper enable monitor # 流式事件监控(v2.1.100+)
66
+ cc-helper enable loop # 定时重复提示
67
+ cc-helper enable btw # 旁支问题
68
+ cc-helper enable keybindings # 自定义键盘快捷键
69
+ cc-helper enable toolsearch # 动态工具搜索
70
+ cc-helper enable context1m # 1M 上下文(v2.1.76+)
71
+ cc-helper enable automode # 所有模型的自动模式(v2.1.75+)
72
+ cc-helper enable monitor # 流式事件监控(v2.1.100+)
64
73
 
65
74
  # 查看状态
66
- npx @unitsvc/cc-helper status
75
+ cc-helper status
67
76
 
68
77
  # 禁用所有功能
69
- npx @unitsvc/cc-helper disable
78
+ cc-helper disable
70
79
  ```
71
80
 
72
81
  > **注意**: 运行 `cc-helper enable` 时会自动在 `~/.claude/settings.json` 中配置推荐的环境变量:
73
82
  >
83
+ > <details>
84
+ > <summary>查看环境变量</summary>
85
+ >
74
86
  > ```json
75
87
  > {
76
88
  > "env": {
@@ -89,6 +101,8 @@ npx @unitsvc/cc-helper disable
89
101
  > }
90
102
  > }
91
103
  > ```
104
+ >
105
+ > </details>
92
106
 
93
107
  ---
94
108
 
@@ -106,7 +120,7 @@ cc-helper plan add -p bailian -k YOUR_API_KEY
106
120
  cc-helper plan add -p minimaxi -k YOUR_API_KEY --mcp
107
121
 
108
122
  # 切换 Provider
109
- cc-helper plan switch -p zai
123
+ cc-helper plan switch -p bailian
110
124
 
111
125
  # 切换模型配置(当前 Provider)
112
126
  cc-helper plan switch --profile 1m
@@ -121,16 +135,42 @@ cc-helper plan list
121
135
  cc-helper plan export --all-env -o config.json
122
136
  ```
123
137
 
138
+ **1M 上下文标签:**
139
+
140
+ 使用 `--1m` 参数为模型字段添加 `[1m]` 上下文标签,表示支持 1M token 上下文窗口的模型。
141
+
142
+ > **注意**: `[1m]` 标签需要 Claude Code v2.1.118 或更高版本。
143
+
144
+ | 参数 | 行为 |
145
+ |------|------|
146
+ | 无 `--1m` | 不添加 `[1m]` 标签 |
147
+ | `--1m d` | 使用配置中的 `Context1M` 字段 |
148
+ | `--1m o` | 覆盖配置,仅标记 opus |
149
+ | `--1m s,o` | 覆盖配置,标记 sonnet 和 opus |
150
+
151
+ 简写:`m=model, h=haiku, s=sonnet, o=opus, r=reasoning`,`d=default(使用配置)`
152
+
153
+ ```bash
154
+ # 示例:切换到 1m 配置并使用默认 1M 字段
155
+ cc-helper plan switch --profile 1m --1m d
156
+
157
+ # 示例:切换到 3.6 配置,仅标记 opus
158
+ cc-helper plan switch --profile 3.6 --1m o
159
+
160
+ # 示例:切换 Provider 并标记 sonnet 和 opus
161
+ cc-helper plan switch -p bailian --profile 1m --1m s,o
162
+ ```
163
+
124
164
  **支持的 Provider:**
125
165
 
126
166
  | Provider | 说明 |
127
167
  | ---------- | --------------------- |
128
168
  | `bailian` | (CN) Aliyun |
129
169
  | `minimaxi` | (CN) MiniMax |
130
- | ~~`glm`~~ | ~~(CN) Zhipu~~ |
131
- | ~~`zai`~~ | ~~(EN) Zhipu~~ |
132
170
  | `ark` | (CN) Ark (Volcengine) |
133
171
  | `xiaomi` | (CN) Xiaomi MiMo |
172
+ | ~~`glm`~~ | ~~(CN) Zhipu~~ |
173
+ | ~~`zai`~~ | ~~(EN) Zhipu~~ |
134
174
 
135
175
  **模型配置(Model Profiles):**
136
176
 
@@ -146,52 +186,77 @@ cc-helper plan export --all-env -o config.json
146
186
 
147
187
  **bailian 配置:**
148
188
 
149
- | Profile | Model | Haiku | Sonnet | Opus | Reasoning |
150
- | ------- | ------------ | ------------ | ------------ | ------------ | ------------ |
151
- | default | glm-5 | glm-4.7 | glm-5 | glm-5 | glm-5 |
152
- | 5 | glm-5 | glm-5 | glm-5 | qwen3.6-plus | glm-5 |
153
- | 1m | glm-5 | glm-4.7 | qwen3.5-plus | qwen3.5-plus | glm-5 |
154
- | 3.6 | qwen3.6-plus | qwen3.6-plus | qwen3.6-plus | qwen3.6-plus | qwen3.6-plus |
155
- | kimi | kimi-k2.5 | kimi-k2.5 | kimi-k2.5 | kimi-k2.5 | kimi-k2.5 |
156
- | minimax | MiniMax-M2.5 | MiniMax-M2.5 | MiniMax-M2.5 | MiniMax-M2.5 | MiniMax-M2.5 |
189
+ <details>
190
+ <summary>查看 bailian 模型配置</summary>
157
191
 
158
- **~~glm / zai 配置~~(禁止使用)**
192
+ | Profile | Model | Haiku | Sonnet | Opus | Reasoning | Context1M |
193
+ | ------- | ------------ | ------------ | ------------ | ------------ | ------------ | ----------- |
194
+ | default | glm-5 | glm-4.7 | glm-5 | glm-5 | glm-5 | - |
195
+ | 5 | glm-5 | glm-5 | glm-5 | qwen3.6-plus | glm-5 | - |
196
+ | 1m | glm-5 | glm-4.7 | qwen3.5-plus | qwen3.5-plus | glm-5 | sonnet,opus |
197
+ | 3.6 | qwen3.6-plus | qwen3.6-plus | qwen3.6-plus | qwen3.6-plus | qwen3.6-plus | sonnet,opus |
198
+ | kimi | kimi-k2.5 | kimi-k2.5 | kimi-k2.5 | kimi-k2.5 | kimi-k2.5 | - |
199
+ | minimax | MiniMax-M2.5 | MiniMax-M2.5 | MiniMax-M2.5 | MiniMax-M2.5 | MiniMax-M2.5 | - |
159
200
 
160
- | Profile | Model | Haiku | Sonnet | Opus | Reasoning |
161
- | ------- | ------------ | ----------- | ------- | ------- | --------- |
162
- | default | glm-5.1 | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
163
- | 5 | glm-5 | glm-5-turbo | glm-5 | glm-5 | glm-5 |
164
- | 5.1 | glm-5.1 | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
165
- | 5v | glm-5v-turbo | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
201
+ </details>
166
202
 
167
203
  **minimaxi 配置:**
168
204
 
205
+ <details>
206
+ <summary>查看 minimaxi 模型配置</summary>
207
+
169
208
  | Profile | Model | Haiku | Sonnet | Opus | Reasoning |
170
209
  | ------- | ------------ | ------------ | ------------ | ------------ | ------------ |
171
210
  | default | MiniMax-M2.7 | MiniMax-M2.7 | MiniMax-M2.7 | MiniMax-M2.7 | MiniMax-M2.7 |
172
211
 
212
+ </details>
213
+
173
214
  **ark 配置:**
174
215
 
216
+ <details>
217
+ <summary>查看 ark 模型配置</summary>
218
+
175
219
  | Profile | Model | Haiku | Sonnet | Opus | Reasoning |
176
220
  | -------- | ---------------- | -------------------- | ---------------- | ------------------- | ---------------- |
177
221
  | default | kimi-k2.6 | kimi-k2.5 | kimi-k2.6 | kimi-k2.6 | kimi-k2.6 |
178
222
  | kimi | kimi-k2.6 | kimi-k2.5 | kimi-k2.6 | kimi-k2.6 | kimi-k2.6 |
179
223
  | doubao | doubao-seed-code | doubao-seed-2.0-code | doubao-seed-code | doubao-seed-2.0-pro | doubao-seed-code |
180
224
  | minimax | minimax-m2.7 | minimax-m2.7 | minimax-m2.7 | minimax-m2.7 | minimax-m2.7 |
181
- | glm | glm-5.1 | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
182
225
  | deepseek | deepseek-v3.2 | deepseek-v3.2 | deepseek-v3.2 | deepseek-v3.2 | deepseek-v3.2 |
183
226
  | auto | glm-5.1 | ark-code-latest | minimax-m2.7 | glm-5.1 | kimi-k2.6 |
227
+ | glm | glm-5.1 | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
228
+
229
+ </details>
184
230
 
185
231
  **xiaomi 配置:**
186
232
 
187
- | Profile | Model | Haiku | Sonnet | Opus | Reasoning |
188
- | ---------- | ---------------- | ------------------ | ---------------- | ---------------- | ---------------- |
189
- | default | mimo-v2.5-pro | mimo-v2.5-flash | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro |
190
- | pro | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro |
191
- | v2.5 | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 |
192
- | v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash |
193
- | v2 | mimo-v2-pro | mimo-v2-omni | mimo-v2-pro | mimo-v2-pro | mimo-v2-pro |
194
- | omni | mimo-v2.5 | mimo-v2-omni | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 |
233
+ <details>
234
+ <summary>查看 xiaomi 模型配置</summary>
235
+
236
+ | Profile | Model | Haiku | Sonnet | Opus | Reasoning | Context1M |
237
+ | ---------- | ---------------- | ------------------ | ---------------- | ---------------- | ---------------- | ----------- |
238
+ | default | mimo-v2.5-pro | mimo-v2.5-flash | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro | sonnet,opus |
239
+ | pro | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro | sonnet,opus |
240
+ | v2.5 | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 | - |
241
+ | v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash | - |
242
+ | v2 | mimo-v2-pro | mimo-v2-omni | mimo-v2-pro | mimo-v2-pro | mimo-v2-pro | sonnet,opus |
243
+ | omni | mimo-v2.5 | mimo-v2-omni | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 | - |
244
+
245
+ </details>
246
+
247
+ **~~glm / zai 配置~~(禁止使用)**
248
+
249
+ <details>
250
+ <summary>查看 glm/zai 模型配置(已废弃)</summary>
251
+
252
+ | Profile | Model | Haiku | Sonnet | Opus | Reasoning |
253
+ | ------- | ------------ | ----------- | ------- | ------- | --------- |
254
+ | default | glm-5.1 | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
255
+ | 5 | glm-5 | glm-5-turbo | glm-5 | glm-5 | glm-5 |
256
+ | 5.1 | glm-5.1 | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
257
+ | 5v | glm-5v-turbo | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
258
+
259
+ </details>
195
260
 
196
261
  ```bash
197
262
  # 示例:在 bailian 上使用 1M 上下文
@@ -356,6 +421,9 @@ cancel the deploy check job # 按描述或 ID 取消
356
421
 
357
422
  **扩展思维与上下文长度:**
358
423
 
424
+ <details>
425
+ <summary>查看上下文长度表格</summary>
426
+
359
427
  | 模型 | 最大思维链长度 | 上下文长度 |
360
428
  | -------------------- | -------------: | ---------: |
361
429
  | qwen3.6-plus | 81,920 | 1,000,000 |
@@ -368,6 +436,8 @@ cancel the deploy check job # 按描述或 ID 取消
368
436
  | glm-5 | 32,768 | 202,752 |
369
437
  | glm-4.7 | 32,768 | 202,752 |
370
438
 
439
+ </details>
440
+
371
441
  ### 工具搜索
372
442
 
373
443
  在运行时动态搜索和加载工具,而非一次性发送所有工具定义。节省 token 并提高性能。
@@ -428,7 +498,7 @@ ENABLE_TOOL_SEARCH=true claude # 始终启用
428
498
  - Claude Code v2.1.75 或更高版本
429
499
 
430
500
  ```bash
431
- npx @unitsvc/cc-helper enable automode
501
+ cc-helper enable automode
432
502
  ```
433
503
 
434
504
  **环境变量:**
@@ -453,7 +523,7 @@ npx @unitsvc/cc-helper enable automode
453
523
  - Claude Code v2.1.98 或更高版本
454
524
 
455
525
  ```bash
456
- npx @unitsvc/cc-helper enable monitor
526
+ cc-helper enable monitor
457
527
  ```
458
528
 
459
529
  **示例:**
package/README.md CHANGED
@@ -1,10 +1,17 @@
1
- # cc-helper
1
+ <div align="center">
2
2
 
3
- [![npm version](https://img.shields.io/npm/v/@unitsvc/cc-helper.svg)](https://www.npmjs.com/package/@unitsvc/cc-helper) [![License](https://img.shields.io/badge/License-AGPL%203.0-blue.svg)](https://github.com/next-bin/cc-helper/blob/master/LICENSE) [![Node](https://img.shields.io/badge/Node-%3E%3D14.0.0-green.svg)](https://nodejs.org) [![CLAUDE](https://img.shields.io/badge/Claude%20Code-v2.1.71%2B-green.svg)](https://docs.anthropic.com/en/docs/claude-code)
3
+ # CC-Helper
4
4
 
5
- [**English**](./README.md) | [**简体中文**](./README-zh.md)
5
+ ### The All-in-One Assistant & Provider Manager for Claude Code
6
6
 
7
- > The ultimate Claude Code companion: unlock hidden superpowers, manage AI providers, and sync configurations across environments — all in one CLI tool.
7
+ [![npm version](https://img.shields.io/npm/v/@unitsvc/cc-helper.svg?color=blue&label=version)](https://www.npmjs.com/package/@unitsvc/cc-helper)
8
+ [![npm downloads](https://img.shields.io/npm/dt/@unitsvc/cc-helper.svg?color=green&label=downloads)](https://www.npmjs.com/package/@unitsvc/cc-helper)
9
+ [![Platform](https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-orange.svg)](https://github.com/next-bin/cc-helper)
10
+ [![License](https://img.shields.io/badge/License-AGPL%203.0-blue.svg)](https://github.com/next-bin/cc-helper/blob/master/LICENSE)
11
+
12
+ English | [简体中文](README-zh.md)
13
+
14
+ </div>
8
15
 
9
16
  > **⚠️ Disclaimer:** Zhipu (glm/zai) company and its associated products are **NOT** permitted to use this software.
10
17
 
@@ -23,14 +30,16 @@ npm install -g @anthropic-ai/claude-code@v2.1.126
23
30
 
24
31
  ## Installation
25
32
 
26
- Two ways to use (choose one):
27
-
28
33
  ```bash
29
- # Install globally (optional)
30
34
  npm install -g @unitsvc/cc-helper@latest
35
+ ```
31
36
 
32
- # Or run directly without installation
33
- npx @unitsvc/cc-helper@latest enable
37
+ ## Update
38
+
39
+ ```bash
40
+ npm install -g @unitsvc/cc-helper@latest
41
+ # or
42
+ cc-helper update
34
43
  ```
35
44
 
36
45
  ### Proxy Support
@@ -39,10 +48,10 @@ If download fails, use `--proxy` flag:
39
48
 
40
49
  ```bash
41
50
  # Use default proxy
42
- npx @unitsvc/cc-helper --proxy enable
51
+ cc-helper --proxy enable
43
52
 
44
53
  # Use custom proxy
45
- npx @unitsvc/cc-helper --proxy https://your-proxy.com enable
54
+ cc-helper --proxy https://your-proxy.com enable
46
55
  ```
47
56
 
48
57
  ---
@@ -51,26 +60,29 @@ npx @unitsvc/cc-helper --proxy https://your-proxy.com enable
51
60
 
52
61
  ```bash
53
62
  # Enable default features (/loop, /btw, /keybindings)
54
- npx @unitsvc/cc-helper enable
63
+ cc-helper enable
55
64
 
56
65
  # Enable specific features
57
- npx @unitsvc/cc-helper enable loop # scheduled recurring prompts
58
- npx @unitsvc/cc-helper enable btw # side questions
59
- npx @unitsvc/cc-helper enable keybindings # custom keyboard shortcuts
60
- npx @unitsvc/cc-helper enable toolsearch # dynamic tool search
61
- npx @unitsvc/cc-helper enable context1m # 1M token context (v2.1.76+)
62
- npx @unitsvc/cc-helper enable automode # auto-mode for all models (v2.1.75+)
63
- npx @unitsvc/cc-helper enable monitor # streaming event monitoring (v2.1.100+)
66
+ cc-helper enable loop # scheduled recurring prompts
67
+ cc-helper enable btw # side questions
68
+ cc-helper enable keybindings # custom keyboard shortcuts
69
+ cc-helper enable toolsearch # dynamic tool search
70
+ cc-helper enable context1m # 1M token context (v2.1.76+)
71
+ cc-helper enable automode # auto-mode for all models (v2.1.75+)
72
+ cc-helper enable monitor # streaming event monitoring (v2.1.100+)
64
73
 
65
74
  # Check status
66
- npx @unitsvc/cc-helper status
75
+ cc-helper status
67
76
 
68
77
  # Disable all features
69
- npx @unitsvc/cc-helper disable
78
+ cc-helper disable
70
79
  ```
71
80
 
72
81
  > **Note**: Running `cc-helper enable` also automatically configures recommended environment variables in `~/.claude/settings.json`:
73
82
  >
83
+ > <details>
84
+ > <summary>View environment variables</summary>
85
+ >
74
86
  > ```json
75
87
  > {
76
88
  > "env": {
@@ -89,6 +101,8 @@ npx @unitsvc/cc-helper disable
89
101
  > }
90
102
  > }
91
103
  > ```
104
+ >
105
+ > </details>
92
106
 
93
107
  ---
94
108
 
@@ -106,7 +120,7 @@ cc-helper plan add -p bailian -k YOUR_API_KEY
106
120
  cc-helper plan add -p minimaxi -k YOUR_API_KEY --mcp
107
121
 
108
122
  # Switch provider
109
- cc-helper plan switch -p zai
123
+ cc-helper plan switch -p bailian
110
124
 
111
125
  # Switch model profile (on current provider)
112
126
  cc-helper plan switch --profile 1m
@@ -121,16 +135,42 @@ cc-helper plan list
121
135
  cc-helper plan export --all-env -o config.json
122
136
  ```
123
137
 
138
+ **1M Context Tag:**
139
+
140
+ Use `--1m` flag to add `[1m]` context tag to model fields, indicating models with 1M token context window support.
141
+
142
+ > **Note**: `[1m]` tag requires Claude Code v2.1.118 or later.
143
+
144
+ | Flag | Behavior |
145
+ |------|----------|
146
+ | No `--1m` | No `[1m]` tags added |
147
+ | `--1m d` | Use `Context1M` from profile config |
148
+ | `--1m o` | Override config, tag only opus |
149
+ | `--1m s,o` | Override config, tag sonnet and opus |
150
+
151
+ Shorthand: `m=model, h=haiku, s=sonnet, o=opus, r=reasoning`, `d=default (use config)`
152
+
153
+ ```bash
154
+ # Example: Switch to 1m profile with default 1M fields
155
+ cc-helper plan switch --profile 1m --1m d
156
+
157
+ # Example: Switch to 3.6 profile, tag only opus
158
+ cc-helper plan switch --profile 3.6 --1m o
159
+
160
+ # Example: Switch provider and tag sonnet, opus
161
+ cc-helper plan switch -p bailian --profile 1m --1m s,o
162
+ ```
163
+
124
164
  **Supported Providers:**
125
165
 
126
166
  | Provider | Description |
127
167
  | ---------- | --------------------- |
128
168
  | `bailian` | (CN) Aliyun |
129
169
  | `minimaxi` | (CN) MiniMax |
130
- | ~~`glm`~~ | ~~(CN) Zhipu~~ |
131
- | ~~`zai`~~ | ~~(EN) Zhipu~~ |
132
170
  | `ark` | (CN) Ark (Volcengine) |
133
171
  | `xiaomi` | (CN) Xiaomi MiMo |
172
+ | ~~`glm`~~ | ~~(CN) Zhipu~~ |
173
+ | ~~`zai`~~ | ~~(EN) Zhipu~~ |
134
174
 
135
175
  **Model Profiles:**
136
176
 
@@ -146,52 +186,77 @@ Each provider supports multiple model profiles. A profile defines mappings for a
146
186
 
147
187
  **bailian Profiles:**
148
188
 
149
- | Profile | Model | Haiku | Sonnet | Opus | Reasoning |
150
- | ------- | ------------ | ------------ | ------------ | ------------ | ------------ |
151
- | default | glm-5 | glm-4.7 | glm-5 | glm-5 | glm-5 |
152
- | 5 | glm-5 | glm-5 | glm-5 | qwen3.6-plus | glm-5 |
153
- | 1m | glm-5 | glm-4.7 | qwen3.5-plus | qwen3.5-plus | glm-5 |
154
- | 3.6 | qwen3.6-plus | qwen3.6-plus | qwen3.6-plus | qwen3.6-plus | qwen3.6-plus |
155
- | kimi | kimi-k2.5 | kimi-k2.5 | kimi-k2.5 | kimi-k2.5 | kimi-k2.5 |
156
- | minimax | MiniMax-M2.5 | MiniMax-M2.5 | MiniMax-M2.5 | MiniMax-M2.5 | MiniMax-M2.5 |
189
+ <details>
190
+ <summary>View bailian model profiles</summary>
157
191
 
158
- **~~glm / zai Profiles:~~ (NOT ALLOWED)**
192
+ | Profile | Model | Haiku | Sonnet | Opus | Reasoning | Context1M |
193
+ | ------- | ------------ | ------------ | ------------ | ------------ | ------------ | ----------- |
194
+ | default | glm-5 | glm-4.7 | glm-5 | glm-5 | glm-5 | - |
195
+ | 5 | glm-5 | glm-5 | glm-5 | qwen3.6-plus | glm-5 | - |
196
+ | 1m | glm-5 | glm-4.7 | qwen3.5-plus | qwen3.5-plus | glm-5 | sonnet,opus |
197
+ | 3.6 | qwen3.6-plus | qwen3.6-plus | qwen3.6-plus | qwen3.6-plus | qwen3.6-plus | sonnet,opus |
198
+ | kimi | kimi-k2.5 | kimi-k2.5 | kimi-k2.5 | kimi-k2.5 | kimi-k2.5 | - |
199
+ | minimax | MiniMax-M2.5 | MiniMax-M2.5 | MiniMax-M2.5 | MiniMax-M2.5 | MiniMax-M2.5 | - |
159
200
 
160
- | Profile | Model | Haiku | Sonnet | Opus | Reasoning |
161
- | ------- | ------------ | ----------- | ------- | ------- | --------- |
162
- | default | glm-5.1 | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
163
- | 5 | glm-5 | glm-5-turbo | glm-5 | glm-5 | glm-5 |
164
- | 5.1 | glm-5.1 | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
165
- | 5v | glm-5v-turbo | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
201
+ </details>
166
202
 
167
203
  **minimaxi Profiles:**
168
204
 
205
+ <details>
206
+ <summary>View minimaxi model profiles</summary>
207
+
169
208
  | Profile | Model | Haiku | Sonnet | Opus | Reasoning |
170
209
  | ------- | ------------ | ------------ | ------------ | ------------ | ------------ |
171
210
  | default | MiniMax-M2.7 | MiniMax-M2.7 | MiniMax-M2.7 | MiniMax-M2.7 | MiniMax-M2.7 |
172
211
 
212
+ </details>
213
+
173
214
  **ark Profiles:**
174
215
 
216
+ <details>
217
+ <summary>View ark model profiles</summary>
218
+
175
219
  | Profile | Model | Haiku | Sonnet | Opus | Reasoning |
176
220
  | -------- | ---------------- | -------------------- | ---------------- | ------------------- | ---------------- |
177
221
  | default | kimi-k2.6 | kimi-k2.5 | kimi-k2.6 | kimi-k2.6 | kimi-k2.6 |
178
222
  | kimi | kimi-k2.6 | kimi-k2.5 | kimi-k2.6 | kimi-k2.6 | kimi-k2.6 |
179
223
  | doubao | doubao-seed-code | doubao-seed-2.0-code | doubao-seed-code | doubao-seed-2.0-pro | doubao-seed-code |
180
224
  | minimax | minimax-m2.7 | minimax-m2.7 | minimax-m2.7 | minimax-m2.7 | minimax-m2.7 |
181
- | glm | glm-5.1 | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
182
225
  | deepseek | deepseek-v3.2 | deepseek-v3.2 | deepseek-v3.2 | deepseek-v3.2 | deepseek-v3.2 |
183
226
  | auto | glm-5.1 | ark-code-latest | minimax-m2.7 | glm-5.1 | kimi-k2.6 |
227
+ | glm | glm-5.1 | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
228
+
229
+ </details>
184
230
 
185
231
  **xiaomi Profiles:**
186
232
 
187
- | Profile | Model | Haiku | Sonnet | Opus | Reasoning |
188
- | ---------- | ---------------- | ------------------ | ---------------- | ---------------- | ---------------- |
189
- | default | mimo-v2.5-pro | mimo-v2.5-flash | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro |
190
- | pro | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro |
191
- | v2.5 | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 |
192
- | v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash |
193
- | v2 | mimo-v2-pro | mimo-v2-omni | mimo-v2-pro | mimo-v2-pro | mimo-v2-pro |
194
- | omni | mimo-v2.5 | mimo-v2-omni | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 |
233
+ <details>
234
+ <summary>View xiaomi model profiles</summary>
235
+
236
+ | Profile | Model | Haiku | Sonnet | Opus | Reasoning | Context1M |
237
+ | ---------- | ---------------- | ------------------ | ---------------- | ---------------- | ---------------- | ----------- |
238
+ | default | mimo-v2.5-pro | mimo-v2.5-flash | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro | sonnet,opus |
239
+ | pro | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro | mimo-v2.5-pro | sonnet,opus |
240
+ | v2.5 | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 | - |
241
+ | v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash | mimo-v2.5-flash | - |
242
+ | v2 | mimo-v2-pro | mimo-v2-omni | mimo-v2-pro | mimo-v2-pro | mimo-v2-pro | sonnet,opus |
243
+ | omni | mimo-v2.5 | mimo-v2-omni | mimo-v2.5 | mimo-v2.5 | mimo-v2.5 | - |
244
+
245
+ </details>
246
+
247
+ **~~glm / zai Profiles:~~ (NOT ALLOWED)**
248
+
249
+ <details>
250
+ <summary>View glm/zai model profiles (deprecated)</summary>
251
+
252
+ | Profile | Model | Haiku | Sonnet | Opus | Reasoning |
253
+ | ------- | ------------ | ----------- | ------- | ------- | --------- |
254
+ | default | glm-5.1 | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
255
+ | 5 | glm-5 | glm-5-turbo | glm-5 | glm-5 | glm-5 |
256
+ | 5.1 | glm-5.1 | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
257
+ | 5v | glm-5v-turbo | glm-4.7 | glm-5.1 | glm-5.1 | glm-5.1 |
258
+
259
+ </details>
195
260
 
196
261
  ```bash
197
262
  # Example: Use 1M context on bailian
@@ -356,6 +421,9 @@ Enable 1M token context window for Claude Opus models.
356
421
 
357
422
  **Extended Thinking & Context Length:**
358
423
 
424
+ <details>
425
+ <summary>View context length table</summary>
426
+
359
427
  | Model | Max Thinking Tokens | Context Length |
360
428
  | -------------------- | ------------------: | -------------: |
361
429
  | qwen3.6-plus | 81,920 | 1,000,000 |
@@ -368,6 +436,8 @@ Enable 1M token context window for Claude Opus models.
368
436
  | glm-5 | 32,768 | 202,752 |
369
437
  | glm-4.7 | 32,768 | 202,752 |
370
438
 
439
+ </details>
440
+
371
441
  ### Tool Search
372
442
 
373
443
  Dynamically search and load tools at runtime instead of sending all tool definitions upfront. Saves tokens and improves performance.
@@ -428,7 +498,7 @@ Enable auto-mode for all models and API types, bypassing model restrictions.
428
498
  - Claude Code v2.1.75 or higher
429
499
 
430
500
  ```bash
431
- npx @unitsvc/cc-helper enable automode
501
+ cc-helper enable automode
432
502
  ```
433
503
 
434
504
  **Environment Variables:**
@@ -453,7 +523,7 @@ Enable the Monitor tool for streaming event monitoring.
453
523
  - Claude Code v2.1.98 or higher
454
524
 
455
525
  ```bash
456
- npx @unitsvc/cc-helper enable monitor
526
+ cc-helper enable monitor
457
527
  ```
458
528
 
459
529
  **Examples:**
package/dist/cli.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var cr=Object.create;var S=Object.defineProperty;var lr=Object.getOwnPropertyDescriptor;var pr=Object.getOwnPropertyNames;var fr=Object.getPrototypeOf,mr=Object.prototype.hasOwnProperty;var dr=(r,n)=>{for(var e in n)S(r,e,{get:n[e],enumerable:!0})},Z=(r,n,e,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of pr(n))!mr.call(r,t)&&t!==e&&S(r,t,{get:()=>n[t],enumerable:!(o=lr(n,t))||o.enumerable});return r};var m=(r,n,e)=>(e=r!=null?cr(fr(r)):{},Z(n||!r||!r.__esModule?S(e,"default",{value:r,enumerable:!0}):e,r)),ur=r=>Z(S({},"__esModule",{value:!0}),r);var vr={};dr(vr,{ensureBinary:()=>F,getBinaryPath:()=>w,main:()=>nr,uninstall:()=>C});module.exports=ur(vr);var tr=require("child_process");var l=m(require("fs")),W=m(require("os")),v=m(require("path")),Q=require("child_process");var k=m(require("os")),M=m(require("path")),gr={darwin:"darwin",linux:"linux",win32:"windows"},hr={x64:"amd64",arm64:"arm64"};function $(){let r=k.default.platform(),n=k.default.arch(),e=gr[r],o=hr[n];if(!e)throw new Error(`Unsupported platform: ${r}`);if(!o)throw new Error(`Unsupported arch: ${n}`);return{platform:e,arch:o}}var R=r=>r==="windows"?"cc-helper.exe":"cc-helper";function P(r,n,e){let o=r.replace(/^v/,"");return n==="windows"?`cc-helper_${o}_${n}_${e}.zip`:`cc-helper_${o}_${n}_${e}.tar.gz`}var w=()=>{let{platform:r}=$();return M.default.join(__dirname,"bin",R(r))};var y=m(require("fs")),H=m(require("path")),q=m(require("http")),G=m(require("https"));function I(r){try{y.default.existsSync(r)&&y.default.unlinkSync(r)}catch{}}async function A(r,n,e=3){for(let o=0;o<e;o++)try{await new Promise((t,i)=>{let p=(r.startsWith("https")?G.default:q.default).get(r,{headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}},c=>{if(c.statusCode===301||c.statusCode===302){let d=c.headers.location;if(d){A(d,n,e).then(t).catch(i);return}}if(c.statusCode!==200){i(new Error(`HTTP ${c.statusCode}`));return}let s=H.default.dirname(n);y.default.existsSync(s)||y.default.mkdirSync(s,{recursive:!0});let g=y.default.createWriteStream(n);c.pipe(g),g.on("finish",()=>{g.close(d=>{d?i(d):t()})}),g.on("error",d=>{I(n),i(d)}),c.on("error",d=>{I(n),i(d)})});p.setTimeout(3e4,()=>{p.destroy(),i(new Error("Timeout"))}),p.on("error",c=>{I(n),i(c)})});return}catch(t){if(I(n),o===e-1)throw t;console.log(`warn cc-helper retry ${o+1}/${e}`),await new Promise(i=>setTimeout(i,1e3*(o+1)))}}var f=m(require("fs")),u=m(require("path")),_=m(require("zlib"));async function wr(r,n){let e=0;for(;e+512<=r.length;){let o=r.subarray(e,e+512);if(o.every(c=>c===0))break;let t=o.subarray(0,100).toString().replace(/\0.*$/,""),i=o.subarray(345,500).toString().replace(/\0.*$/,"");i&&(t=`${i}/${t}`),t.startsWith("package/")&&(t=t.slice(8)),t=t.replace(/\//g,u.default.sep);let a=parseInt(o.subarray(124,136).toString().trim(),8)||0,p=o[156];if(e+=512,a>0&&t&&(p===0||p===48)){let c=u.default.join(n,t);await f.default.promises.mkdir(u.default.dirname(c),{recursive:!0}),await f.default.promises.writeFile(c,r.subarray(e,e+a)),e+=Math.ceil(a/512)*512}}}async function yr(r,n){await f.default.promises.mkdir(n,{recursive:!0});let e=await f.default.promises.readFile(r),o;try{o=_.default.unzipSync(e)}catch(t){throw new Error(`Failed to decompress tar.gz: ${t.message}`)}await wr(o,n)}async function xr(r,n){await f.default.promises.mkdir(n,{recursive:!0});let e=await f.default.promises.readFile(r);if(e.length<22)throw new Error(`Invalid ZIP: file too small (${e.length} bytes)`);let o=Buffer.from([80,75,5,6]),t=e.length-22;for(;t>=0&&!e.subarray(t,t+4).equals(o);)t--;if(t<0)throw new Error(`Invalid ZIP: missing end of central directory (file may be corrupted or incomplete, size: ${e.length} bytes)`);if(t+22>e.length)throw new Error("Invalid ZIP: truncated EOCD record");let i=e.readUInt32LE(t+16),a=e.readUInt32LE(t+12),p=i+a;if(i>=e.length||p>e.length)throw new Error(`Invalid ZIP: central directory out of bounds (cdOffset: ${i}, cdEnd: ${p}, fileSize: ${e.length})`);let c=Buffer.from([80,75,1,2]),s=i;for(;s<p;){if(s+46>e.length)throw new Error(`Invalid ZIP: truncated central directory at position ${s}`);if(!e.subarray(s,s+4).equals(c))throw new Error(`Invalid ZIP: invalid central directory signature at position ${s}`);let g=e.readUInt16LE(s+28),d=e.readUInt16LE(s+30),N=e.readUInt16LE(s+32),x=e.readUInt32LE(s+42),or=e.readUInt32LE(s+20),Er=e.readUInt32LE(s+24),Sr=e.readUInt16LE(s+10);if(s+46+g+d+N>e.length)throw new Error(`Invalid ZIP: truncated central directory entry at position ${s}`);let h=e.subarray(s+46,s+46+g).toString();if(s+=46+g+d+N,h.endsWith("/")){await f.default.promises.mkdir(u.default.join(n,h.replace(/\//g,u.default.sep)),{recursive:!0});continue}if(h=h.replace(/\//g,u.default.sep),x+30>e.length)throw new Error(`Invalid ZIP: local header out of bounds for ${h}`);let b=e.readUInt16LE(x+8),ir=e.readUInt16LE(x+26),sr=e.readUInt16LE(x+28),U=x+30+ir+sr,D=or;if(U+D>e.length)throw new Error(`Invalid ZIP: truncated file data for ${h}`);let O=e.subarray(U,U+D),L=u.default.join(n,h);await f.default.promises.mkdir(u.default.dirname(L),{recursive:!0});try{if(b===8)await f.default.promises.writeFile(L,_.default.inflateRawSync(O));else if(b===0)await f.default.promises.writeFile(L,O);else throw new Error(`Unsupported compression method ${b} for ${h}`)}catch(ar){throw new Error(`Failed to decompress ${h}: ${ar.message}`)}}}async function K(r,n,e){e==="windows"?await xr(r,n):await yr(r,n)}function V(r,n){let e=u.default.join(r,n);if(f.default.existsSync(e))return e;for(let o of f.default.readdirSync(r)){let t=u.default.join(r,o,n);if(f.default.statSync(u.default.join(r,o)).isDirectory()&&f.default.existsSync(t))return t}throw new Error(`Binary ${n} not found`)}var j=m(require("https"));var z="next-bin",B="cc-helper";function J(r){return new Promise((n,e)=>{let o=`https://api.github.com${r}`,t=j.default.get(o,{headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}},i=>{let a="";i.on("data",p=>a+=p),i.on("end",()=>{i.statusCode!==200?e(new Error(`GitHub API error: ${i.statusCode}`)):n(JSON.parse(a))})});t.setTimeout(15e3,()=>{t.destroy(),e(new Error("GitHub API timeout"))}),t.on("error",e)})}async function T(){return(await J(`/repos/${z}/${B}/releases/latest`)).tag_name.replace(/^v/,"")}async function X(r,n){var t;let e=await J(`/repos/${z}/${B}/releases?per_page=10`),o=r==="windows"?`_${r}_${n}.zip`:`_${r}_${n}.tar.gz`;for(let i of e)if((t=i.assets)!=null&&t.some(a=>a.name.includes(o)))return i.tag_name.replace(/^v/,"");throw new Error(`No binary found for ${r}-${n}`)}function Y(r,n,e,o){let t=r.startsWith("v")?r:`v${r}`,i=`https://github.com/${z}/${B}/releases/download/${t}/${P(r,n,e)}`;return o?`${o}/${i}`:i}async function E(r,n,e,o,t){let i=P(r,n,e),a=v.default.join(W.default.tmpdir(),i),p=Y(r,n,e,t);console.log(`info cc-helper@${r} Installing for ${n}-${e}`),t&&console.log("info cc-helper Using proxy:",t);try{await A(p,a)}catch(s){throw t||console.log("warn cc-helper Download failed, try: npx @unitsvc/cc-helper --proxy enable"),s}let c=v.default.join(W.default.tmpdir(),`cc-helper_${Date.now()}`);l.default.mkdirSync(c,{recursive:!0});try{await K(a,c,n);let s=V(c,R(n)),g=v.default.dirname(o);l.default.existsSync(g)||l.default.mkdirSync(g,{recursive:!0}),l.default.existsSync(o)&&l.default.unlinkSync(o),l.default.copyFileSync(s,o),process.platform!=="win32"&&l.default.chmodSync(o,493),console.log("info cc-helper Installed to",o)}finally{let s=l.default.rmSync||l.default.rmdirSync;try{s(c,{recursive:!0,force:!0})}catch{}l.default.existsSync(a)&&l.default.unlinkSync(a)}}async function F(r=null,n){let{platform:e,arch:o}=$(),t=w();if(l.default.existsSync(t))return t;if(r)try{return await E(r,e,o,t,n),t}catch(a){if(!a.message.includes("404"))throw a;console.log(`warn cc-helper@${r} not available, using latest`)}let i=await T();try{await E(i,e,o,t,n)}catch(a){if(!a.message.includes("404"))throw a;i=await X(e,o),await E(i,e,o,t,n)}return t}function C(){let r=w(),n=v.default.dirname(r);l.default.existsSync(r)?(l.default.unlinkSync(r),console.log("info cc-helper Removed binary:",r)):console.log("info cc-helper No binary found"),l.default.existsSync(n)&&l.default.readdirSync(n).length===0&&l.default.rmdirSync(n),console.log("info cc-helper To complete uninstallation, run:"),console.log(" npm uninstall -g @unitsvc/cc-helper")}async function $r(r){if(!l.default.existsSync(r))return null;try{return(0,Q.execSync)(`"${r}" --version`,{timeout:5e3}).toString().trim().replace(/^v/i,"")}catch{return null}}async function rr(r){let n=w(),e=await T(),o=await $r(n);return{current:o,latest:e,needsUpdate:!o||o!==e}}function er(r){let n=[],e,o="https://edgeone.gh-proxy.org";for(let t=0;t<r.length;t++)r[t]==="--proxy"?t+1<r.length&&(r[t+1].startsWith("http://")||r[t+1].startsWith("https://"))?(e=r[t+1],t++):e=o:r[t].startsWith("--proxy=")?e=r[t].slice(8)||o:n.push(r[t]);return{proxy:e,remainingArgs:n}}async function nr(){let r=process.argv.slice(2);if(r[0]==="uninstall"){C();return}if(r[0]==="update"){let{proxy:o}=er(r.slice(1)),{current:t,latest:i,needsUpdate:a}=await rr();if(!a){console.log(`info cc-helper Already at latest version: ${t}`);return}console.log(`info cc-helper Updating from ${t||"unknown"} to ${i}`);let{platform:p,arch:c}=$(),s=w();await E(i,p,c,s,o);return}let{proxy:n,remainingArgs:e}=er(r);try{let o=await F(null,n),t=(0,tr.spawn)(o,e,{stdio:"inherit"});t.on("close",i=>process.exit(i??1)),t.on("error",i=>{console.error("ERR! cc-helper",i.message),process.exit(1)})}catch(o){console.error("ERR! cc-helper",o.message),process.exit(1)}}require.main===module&&nr();0&&(module.exports={ensureBinary,getBinaryPath,main,uninstall});
2
+ "use strict";var dt=Object.create;var R=Object.defineProperty;var $t=Object.getOwnPropertyDescriptor;var ht=Object.getOwnPropertyNames;var yt=Object.getPrototypeOf,wt=Object.prototype.hasOwnProperty;var xt=(t,o)=>{for(var e in o)R(t,e,{get:o[e],enumerable:!0})},j=(t,o,e,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of ht(o))!wt.call(t,n)&&n!==e&&R(t,n,{get:()=>o[n],enumerable:!(r=$t(o,n))||r.enumerable});return t};var $=(t,o,e)=>(e=t!=null?dt(yt(t)):{},j(o||!t||!t.__esModule?R(e,"default",{value:t,enumerable:!0}):e,t)),vt=t=>j(R({},"__esModule",{value:!0}),t);var Rt={};xt(Rt,{ensureBinary:()=>Z,getBinaryPath:()=>w,getCurrentVersion:()=>H,main:()=>mt,uninstall:()=>G});module.exports=vt(Rt);var at=require("child_process"),lt=$(require("fs"));var g=$(require("fs")),O=$(require("os")),S=$(require("path")),it=require("child_process");var z=$(require("os")),K=$(require("path")),Et={darwin:"darwin",linux:"linux",win32:"windows"},St={x64:"amd64",arm64:"arm64"};function E(){let t=z.default.platform(),o=z.default.arch(),e=Et[t],r=St[o];if(!e)throw new Error(`Unsupported platform: ${t}`);if(!r)throw new Error(`Unsupported arch: ${o}`);return{platform:e,arch:r}}var B=t=>t==="windows"?"cc-helper.exe":"cc-helper";function T(t,o,e){let r=t.replace(/^v/,"");return o==="windows"?`cc-helper_${r}_${o}_${e}.zip`:`cc-helper_${r}_${o}_${e}.tar.gz`}var w=()=>{let{platform:t}=E();return K.default.join(__dirname,"bin",B(t))};var x=$(require("fs")),Y=$(require("path")),J=$(require("http")),X=$(require("https")),bt="\x1B[90m",Pt="\x1B[0m";function A(t){try{x.default.existsSync(t)&&x.default.unlinkSync(t)}catch{}}async function N(t,o,e=3){for(let r=0;r<e;r++)try{await new Promise((n,i)=>{let m=(t.startsWith("https")?X.default:J.default).get(t,{headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}},c=>{if(c.statusCode===301||c.statusCode===302){let f=c.headers.location;if(f){N(f,o,e).then(n).catch(i);return}}if(c.statusCode!==200){i(new Error(`HTTP ${c.statusCode}`));return}let s=Y.default.dirname(o);x.default.existsSync(s)||x.default.mkdirSync(s,{recursive:!0});let u=x.default.createWriteStream(o);c.pipe(u),u.on("finish",()=>{u.close(f=>{f?i(f):x.default.existsSync(o)&&x.default.statSync(o).size>0?n():i(new Error("Downloaded file is empty or missing"))})}),u.on("error",f=>{A(o),i(f)}),c.on("error",f=>{A(o),i(f)})});m.setTimeout(3e4,()=>{m.destroy(),i(new Error("Timeout"))}),m.on("error",c=>{A(o),i(c)})});return}catch(n){if(A(o),r===e-1)throw n;console.log(`${bt}Retrying (${r+1}/${e})...${Pt}`),await new Promise(i=>setTimeout(i,1e3*(r+1)))}}var d=$(require("fs")),h=$(require("path")),F=$(require("zlib"));async function It(t,o){let e=0;for(;e+512<=t.length;){let r=t.subarray(e,e+512);if(r.every(c=>c===0))break;let n=r.subarray(0,100).toString().replace(/\0.*$/,""),i=r.subarray(345,500).toString().replace(/\0.*$/,"");i&&(n=`${i}/${n}`),n.startsWith("package/")&&(n=n.slice(8)),n=n.replace(/\//g,h.default.sep);let l=parseInt(r.subarray(124,136).toString().trim(),8)||0,m=r[156];if(e+=512,l>0&&n&&(m===0||m===48)){let c=h.default.join(o,n);await d.default.promises.mkdir(h.default.dirname(c),{recursive:!0}),await d.default.promises.writeFile(c,t.subarray(e,e+l)),e+=Math.ceil(l/512)*512}}}async function kt(t,o){await d.default.promises.mkdir(o,{recursive:!0});let e=await d.default.promises.readFile(t),r;try{r=F.default.unzipSync(e)}catch(n){throw new Error(`Failed to decompress tar.gz: ${n.message}`)}await It(r,o)}async function Ut(t,o){await d.default.promises.mkdir(o,{recursive:!0});let e=await d.default.promises.readFile(t);if(e.length<22)throw new Error(`Invalid ZIP: file too small (${e.length} bytes)`);let r=Buffer.from([80,75,5,6]),n=e.length-22;for(;n>=0&&!e.subarray(n,n+4).equals(r);)n--;if(n<0)throw new Error(`Invalid ZIP: missing end of central directory (file may be corrupted or incomplete, size: ${e.length} bytes)`);if(n+22>e.length)throw new Error("Invalid ZIP: truncated EOCD record");let i=e.readUInt32LE(n+16),l=e.readUInt32LE(n+12),m=i+l;if(i>=e.length||m>e.length)throw new Error(`Invalid ZIP: central directory out of bounds (cdOffset: ${i}, cdEnd: ${m}, fileSize: ${e.length})`);let c=Buffer.from([80,75,1,2]),s=i;for(;s<m;){if(s+46>e.length)throw new Error(`Invalid ZIP: truncated central directory at position ${s}`);if(!e.subarray(s,s+4).equals(c))throw new Error(`Invalid ZIP: invalid central directory signature at position ${s}`);let u=e.readUInt16LE(s+28),f=e.readUInt16LE(s+30),P=e.readUInt16LE(s+32),v=e.readUInt32LE(s+42),ut=e.readUInt32LE(s+20),Tt=e.readUInt32LE(s+24),At=e.readUInt16LE(s+10);if(s+46+u+f+P>e.length)throw new Error(`Invalid ZIP: truncated central directory entry at position ${s}`);let y=e.subarray(s+46,s+46+u).toString();if(s+=46+u+f+P,y.endsWith("/")){await d.default.promises.mkdir(h.default.join(o,y.replace(/\//g,h.default.sep)),{recursive:!0});continue}if(y=y.replace(/\//g,h.default.sep),v+30>e.length)throw new Error(`Invalid ZIP: local header out of bounds for ${y}`);let C=e.readUInt16LE(v+8),pt=e.readUInt16LE(v+26),gt=e.readUInt16LE(v+28),W=v+30+pt+gt,q=ut;if(W+q>e.length)throw new Error(`Invalid ZIP: truncated file data for ${y}`);let V=e.subarray(W,W+q),_=h.default.join(o,y);await d.default.promises.mkdir(h.default.dirname(_),{recursive:!0});try{if(C===8)await d.default.promises.writeFile(_,F.default.inflateRawSync(V));else if(C===0)await d.default.promises.writeFile(_,V);else throw new Error(`Unsupported compression method ${C} for ${y}`)}catch(ft){throw new Error(`Failed to decompress ${y}: ${ft.message}`)}}}async function Q(t,o,e){e==="windows"?await Ut(t,o):await kt(t,o)}function tt(t,o){let e=h.default.join(t,o);if(d.default.existsSync(e))return e;for(let r of d.default.readdirSync(t)){let n=h.default.join(t,r,o);if(d.default.statSync(h.default.join(t,r)).isDirectory()&&d.default.existsSync(n))return n}throw new Error(`Binary ${o} not found`)}var et=$(require("https"));var D="next-bin",M="cc-helper";function ot(t){return new Promise((o,e)=>{let r=`https://api.github.com${t}`,n=et.default.get(r,{headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}},i=>{let l="";i.on("data",m=>l+=m),i.on("end",()=>{i.statusCode!==200?e(new Error(`GitHub API error: ${i.statusCode}`)):o(JSON.parse(l))})});n.setTimeout(15e3,()=>{n.destroy(),e(new Error("GitHub API timeout"))}),n.on("error",e)})}async function nt(){return(await ot(`/repos/${D}/${M}/releases/latest`)).tag_name.replace(/^v/,"")}async function L(t,o){var n;let e=await ot(`/repos/${D}/${M}/releases?per_page=10`),r=t==="windows"?`_${t}_${o}.zip`:`_${t}_${o}.tar.gz`;for(let i of e)if((n=i.assets)!=null&&n.some(l=>l.name.includes(r)))return i.tag_name.replace(/^v/,"");throw new Error(`No binary found for ${t}-${o}`)}function rt(t,o,e,r){let n=t.startsWith("v")?t:`v${t}`,i=`https://github.com/${D}/${M}/releases/download/${n}/${T(t,o,e)}`;return r?`${r}/${i}`:i}var I="\x1B[90m",k="\x1B[0m";async function U(t,o,e,r,n){let i=T(t,o,e),l=S.default.join(O.default.tmpdir(),i),m=rt(t,o,e,n);n&&console.log(`${I}Using proxy: ${n}${k}`);try{await N(m,l)}catch(s){throw s}let c=S.default.join(O.default.tmpdir(),`cc-helper_${Date.now()}`);g.default.mkdirSync(c,{recursive:!0});try{await Q(l,c,o);let s=tt(c,B(o)),u=S.default.dirname(r);g.default.existsSync(u)||g.default.mkdirSync(u,{recursive:!0}),g.default.existsSync(r)&&g.default.unlinkSync(r),g.default.copyFileSync(s,r),process.platform!=="win32"&&g.default.chmodSync(r,493)}finally{let s=g.default.rmSync||g.default.rmdirSync;try{s(c,{recursive:!0,force:!0})}catch{}g.default.existsSync(l)&&g.default.unlinkSync(l)}}async function Z(t=null,o){let{platform:e,arch:r}=E(),n=w();if(g.default.existsSync(n))return n;if(t)try{return await U(t,e,r,n,o),n}catch(l){if(!l.message.includes("404"))throw l}let i=await nt();try{await U(i,e,r,n,o)}catch(l){if(!l.message.includes("404"))throw l;i=await L(e,r),await U(i,e,r,n,o)}return n}function G(){let t=w(),o=S.default.dirname(t);g.default.existsSync(t)?(g.default.unlinkSync(t),console.log(`${I}Removed binary: ${t}${k}`)):console.log(`${I}No installation found${k}`),g.default.existsSync(o)&&g.default.readdirSync(o).length===0&&g.default.rmdirSync(o),console.log(`${I}To complete uninstallation, run:${k}`),console.log(`${I} npm uninstall -g @unitsvc/cc-helper${k}`)}async function H(t){if(!g.default.existsSync(t))return null;try{let o=S.default.resolve(t),r=(0,it.execSync)(`"${o}" --version`,{timeout:5e3}).toString().trim().match(/(\d+\.\d+\.\d+)/);return r?r[1]:null}catch{return null}}var st="\x1B[32m",b="\x1B[31m",p="\x1B[90m",a="\x1B[0m";function ct(t){let o=[],e,r="https://edgeone.gh-proxy.org";for(let n=0;n<t.length;n++)t[n]==="--proxy"?n+1<t.length&&(t[n+1].startsWith("http://")||t[n+1].startsWith("https://"))?(e=t[n+1],n++):e=r:t[n].startsWith("--proxy=")?e=t[n].slice(8)||r:o.push(t[n]);return{proxy:e,remainingArgs:o}}async function mt(){let t=process.argv.slice(2);if(t[0]==="uninstall"&&(G(),process.exit(0)),t[0]==="update"){let{proxy:l}=ct(t.slice(1)),{platform:m,arch:c}=E(),s=`${m}-${c}`;console.log("Checking for updates to latest version...");let u=null,f;u=await H(w());try{f=await L(m,c)}catch{console.log(`${b}Failed to check for updates (${s})${a}`),console.log(`${b}Unable to fetch latest version from npm registry${a}`),console.log(`${p}Possible causes:${a}`),console.log(`${p} \u2022 Network connectivity issues${a}`),console.log(`${p} \u2022 npm registry is unreachable${a}`),console.log(`${p} \u2022 Corporate proxy/firewall blocking npm${a}`),console.log(`${p}Try:${a}`),console.log(`${p} \u2022 Check your internet connection${a}`),console.log(`${p} \u2022 Manually check: npm view @unitsvc/cc-helper version${a}`),console.log(`${p} \u2022 Check if you need to login: npm whoami${a}`),process.exit(1)}u&&u===f&&(console.log(`${st}cc-helper is up to date (${u}) (${s})${a}`),process.exit(0)),console.log(`New version available: ${f}${u?` (current: ${u})`:""}`),console.log("Installing update...");let P=w();try{if(await U(f,m,c,P,l),!lt.default.existsSync(P))throw new Error("Installation completed but binary not found");console.log(`${st}Successfully updated${u?` from ${u}`:""} to version ${f} (${s})${a}`),process.exit(0)}catch{console.log(`${b}Failed to install update (${s})${a}`),console.log(`${b}Unable to download or install the new version${a}`),console.log(`${p}Possible causes:${a}`),console.log(`${p} \u2022 Network connectivity issues${a}`),console.log(`${p} \u2022 Permission issues${a}`),console.log(`${p}Try:${a}`),console.log(`${p} \u2022 Check your internet connection${a}`),console.log(`${p} \u2022 Manually install: npm install -g @unitsvc/cc-helper@latest${a}`),process.exit(1)}}let{proxy:o,remainingArgs:e}=ct(t),{platform:r,arch:n}=E(),i=`${r}-${n}`;try{let l=await Z(null,o),m=(0,at.spawn)(l,e,{stdio:"inherit"});m.on("close",c=>process.exit(c??1)),m.on("error",c=>{console.log(`${b}${c.message}${a}`),process.exit(1)})}catch{let c=t.some(s=>s==="--proxy"||s.startsWith("--proxy="))?t.join(" "):`--proxy ${t.join(" ")}`;console.log(`${b}Failed to install (${i})${a}`),console.log(`${p}Possible causes:${a}`),console.log(`${p} \u2022 Network connectivity issues${a}`),console.log(`${p} \u2022 Permission issues${a}`),console.log(`${p}Try:${a}`),console.log(`${p} \u2022 Check your internet connection${a}`),console.log(`${p} \u2022 npx @unitsvc/cc-helper@latest ${c}${a}`),process.exit(1)}}require.main===module&&mt();0&&(module.exports={ensureBinary,getBinaryPath,getCurrentVersion,main,uninstall});
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var ar=Object.create;var P=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var lr=Object.getOwnPropertyNames;var fr=Object.getPrototypeOf,mr=Object.prototype.hasOwnProperty;var dr=(e,t)=>{for(var r in t)P(e,r,{get:t[r],enumerable:!0})},H=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of lr(t))!mr.call(e,n)&&n!==r&&P(e,n,{get:()=>t[n],enumerable:!(o=cr(t,n))||o.enumerable});return e};var d=(e,t,r)=>(r=e!=null?ar(fr(e)):{},H(t||!e||!e.__esModule?P(r,"default",{value:e,enumerable:!0}):r,e)),pr=e=>H(P({},"__esModule",{value:!0}),e);var xr={};dr(xr,{checkForUpdate:()=>tr,ensureBinary:()=>F,findReleaseWithBinary:()=>U,getArchiveName:()=>w,getBinaryName:()=>v,getBinaryPath:()=>y,getCurrentVersion:()=>D,getDownloadUrl:()=>L,getLatestVersion:()=>E,getPlatform:()=>S,install:()=>rr,uninstall:()=>er});module.exports=pr(xr);var l=d(require("fs")),C=d(require("os")),I=d(require("path")),Y=require("child_process");var z=d(require("os")),G=d(require("path")),ur={darwin:"darwin",linux:"linux",win32:"windows"},gr={x64:"amd64",arm64:"arm64"};function S(){let e=z.default.platform(),t=z.default.arch(),r=ur[e],o=gr[t];if(!r)throw new Error(`Unsupported platform: ${e}`);if(!o)throw new Error(`Unsupported arch: ${t}`);return{platform:r,arch:o}}var v=e=>e==="windows"?"cc-helper.exe":"cc-helper";function w(e,t,r){let o=e.replace(/^v/,"");return t==="windows"?`cc-helper_${o}_${t}_${r}.zip`:`cc-helper_${o}_${t}_${r}.tar.gz`}var y=()=>{let{platform:e}=S();return G.default.join(__dirname,"bin",v(e))};var x=d(require("fs")),q=d(require("path")),K=d(require("http")),V=d(require("https"));function b(e){try{x.default.existsSync(e)&&x.default.unlinkSync(e)}catch{}}async function R(e,t,r=3){for(let o=0;o<r;o++)try{await new Promise((n,i)=>{let m=(e.startsWith("https")?V.default:K.default).get(e,{headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}},c=>{if(c.statusCode===301||c.statusCode===302){let p=c.headers.location;if(p){R(p,t,r).then(n).catch(i);return}}if(c.statusCode!==200){i(new Error(`HTTP ${c.statusCode}`));return}let s=q.default.dirname(t);x.default.existsSync(s)||x.default.mkdirSync(s,{recursive:!0});let g=x.default.createWriteStream(t);c.pipe(g),g.on("finish",()=>{g.close(p=>{p?i(p):n()})}),g.on("error",p=>{b(t),i(p)}),c.on("error",p=>{b(t),i(p)})});m.setTimeout(3e4,()=>{m.destroy(),i(new Error("Timeout"))}),m.on("error",c=>{b(t),i(c)})});return}catch(n){if(b(t),o===r-1)throw n;console.log(`warn cc-helper retry ${o+1}/${r}`),await new Promise(i=>setTimeout(i,1e3*(o+1)))}}var f=d(require("fs")),u=d(require("path")),T=d(require("zlib"));async function hr(e,t){let r=0;for(;r+512<=e.length;){let o=e.subarray(r,r+512);if(o.every(c=>c===0))break;let n=o.subarray(0,100).toString().replace(/\0.*$/,""),i=o.subarray(345,500).toString().replace(/\0.*$/,"");i&&(n=`${i}/${n}`),n.startsWith("package/")&&(n=n.slice(8)),n=n.replace(/\//g,u.default.sep);let a=parseInt(o.subarray(124,136).toString().trim(),8)||0,m=o[156];if(r+=512,a>0&&n&&(m===0||m===48)){let c=u.default.join(t,n);await f.default.promises.mkdir(u.default.dirname(c),{recursive:!0}),await f.default.promises.writeFile(c,e.subarray(r,r+a)),r+=Math.ceil(a/512)*512}}}async function wr(e,t){await f.default.promises.mkdir(t,{recursive:!0});let r=await f.default.promises.readFile(e),o;try{o=T.default.unzipSync(r)}catch(n){throw new Error(`Failed to decompress tar.gz: ${n.message}`)}await hr(o,t)}async function yr(e,t){await f.default.promises.mkdir(t,{recursive:!0});let r=await f.default.promises.readFile(e);if(r.length<22)throw new Error(`Invalid ZIP: file too small (${r.length} bytes)`);let o=Buffer.from([80,75,5,6]),n=r.length-22;for(;n>=0&&!r.subarray(n,n+4).equals(o);)n--;if(n<0)throw new Error(`Invalid ZIP: missing end of central directory (file may be corrupted or incomplete, size: ${r.length} bytes)`);if(n+22>r.length)throw new Error("Invalid ZIP: truncated EOCD record");let i=r.readUInt32LE(n+16),a=r.readUInt32LE(n+12),m=i+a;if(i>=r.length||m>r.length)throw new Error(`Invalid ZIP: central directory out of bounds (cdOffset: ${i}, cdEnd: ${m}, fileSize: ${r.length})`);let c=Buffer.from([80,75,1,2]),s=i;for(;s<m;){if(s+46>r.length)throw new Error(`Invalid ZIP: truncated central directory at position ${s}`);if(!r.subarray(s,s+4).equals(c))throw new Error(`Invalid ZIP: invalid central directory signature at position ${s}`);let g=r.readUInt16LE(s+28),p=r.readUInt16LE(s+30),Z=r.readUInt16LE(s+32),$=r.readUInt32LE(s+42),nr=r.readUInt32LE(s+20),$r=r.readUInt32LE(s+24),Sr=r.readUInt16LE(s+10);if(s+46+g+p+Z>r.length)throw new Error(`Invalid ZIP: truncated central directory entry at position ${s}`);let h=r.subarray(s+46,s+46+g).toString();if(s+=46+g+p+Z,h.endsWith("/")){await f.default.promises.mkdir(u.default.join(t,h.replace(/\//g,u.default.sep)),{recursive:!0});continue}if(h=h.replace(/\//g,u.default.sep),$+30>r.length)throw new Error(`Invalid ZIP: local header out of bounds for ${h}`);let k=r.readUInt16LE($+8),or=r.readUInt16LE($+26),ir=r.readUInt16LE($+28),B=$+30+or+ir,M=nr;if(B+M>r.length)throw new Error(`Invalid ZIP: truncated file data for ${h}`);let O=r.subarray(B,B+M),_=u.default.join(t,h);await f.default.promises.mkdir(u.default.dirname(_),{recursive:!0});try{if(k===8)await f.default.promises.writeFile(_,T.default.inflateRawSync(O));else if(k===0)await f.default.promises.writeFile(_,O);else throw new Error(`Unsupported compression method ${k} for ${h}`)}catch(sr){throw new Error(`Failed to decompress ${h}: ${sr.message}`)}}}async function j(e,t,r){r==="windows"?await yr(e,t):await wr(e,t)}function J(e,t){let r=u.default.join(e,t);if(f.default.existsSync(r))return r;for(let o of f.default.readdirSync(e)){let n=u.default.join(e,o,t);if(f.default.statSync(u.default.join(e,o)).isDirectory()&&f.default.existsSync(n))return n}throw new Error(`Binary ${t} not found`)}var Q=d(require("https"));var W="next-bin",A="cc-helper";function X(e){return new Promise((t,r)=>{let o=`https://api.github.com${e}`,n=Q.default.get(o,{headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}},i=>{let a="";i.on("data",m=>a+=m),i.on("end",()=>{i.statusCode!==200?r(new Error(`GitHub API error: ${i.statusCode}`)):t(JSON.parse(a))})});n.setTimeout(15e3,()=>{n.destroy(),r(new Error("GitHub API timeout"))}),n.on("error",r)})}async function E(){return(await X(`/repos/${W}/${A}/releases/latest`)).tag_name.replace(/^v/,"")}async function U(e,t){var n;let r=await X(`/repos/${W}/${A}/releases?per_page=10`),o=e==="windows"?`_${e}_${t}.zip`:`_${e}_${t}.tar.gz`;for(let i of r)if((n=i.assets)!=null&&n.some(a=>a.name.includes(o)))return i.tag_name.replace(/^v/,"");throw new Error(`No binary found for ${e}-${t}`)}function L(e,t,r,o){let n=e.startsWith("v")?e:`v${e}`,i=`https://github.com/${W}/${A}/releases/download/${n}/${w(e,t,r)}`;return o?`${o}/${i}`:i}async function N(e,t,r,o,n){let i=w(e,t,r),a=I.default.join(C.default.tmpdir(),i),m=L(e,t,r,n);console.log(`info cc-helper@${e} Installing for ${t}-${r}`),n&&console.log("info cc-helper Using proxy:",n);try{await R(m,a)}catch(s){throw n||console.log("warn cc-helper Download failed, try: npx @unitsvc/cc-helper --proxy enable"),s}let c=I.default.join(C.default.tmpdir(),`cc-helper_${Date.now()}`);l.default.mkdirSync(c,{recursive:!0});try{await j(a,c,t);let s=J(c,v(t)),g=I.default.dirname(o);l.default.existsSync(g)||l.default.mkdirSync(g,{recursive:!0}),l.default.existsSync(o)&&l.default.unlinkSync(o),l.default.copyFileSync(s,o),process.platform!=="win32"&&l.default.chmodSync(o,493),console.log("info cc-helper Installed to",o)}finally{let s=l.default.rmSync||l.default.rmdirSync;try{s(c,{recursive:!0,force:!0})}catch{}l.default.existsSync(a)&&l.default.unlinkSync(a)}}async function F(e=null,t){let{platform:r,arch:o}=S(),n=y();if(l.default.existsSync(n))return n;if(e)try{return await N(e,r,o,n,t),n}catch(a){if(!a.message.includes("404"))throw a;console.log(`warn cc-helper@${e} not available, using latest`)}let i=await E();try{await N(i,r,o,n,t)}catch(a){if(!a.message.includes("404"))throw a;i=await U(r,o),await N(i,r,o,n,t)}return n}async function rr(e=null,t){try{await F(e,t)}catch(r){console.error("ERR! cc-helper",r.message)}}function er(){let e=y(),t=I.default.dirname(e);l.default.existsSync(e)?(l.default.unlinkSync(e),console.log("info cc-helper Removed binary:",e)):console.log("info cc-helper No binary found"),l.default.existsSync(t)&&l.default.readdirSync(t).length===0&&l.default.rmdirSync(t),console.log("info cc-helper To complete uninstallation, run:"),console.log(" npm uninstall -g @unitsvc/cc-helper")}async function D(e){if(!l.default.existsSync(e))return null;try{return(0,Y.execSync)(`"${e}" --version`,{timeout:5e3}).toString().trim().replace(/^v/i,"")}catch{return null}}async function tr(e){let t=y(),r=await E(),o=await D(t);return{current:o,latest:r,needsUpdate:!o||o!==r}}0&&(module.exports={checkForUpdate,ensureBinary,findReleaseWithBinary,getArchiveName,getBinaryName,getBinaryPath,getCurrentVersion,getDownloadUrl,getLatestVersion,getPlatform,install,uninstall});
1
+ "use strict";var lt=Object.create;var U=Object.defineProperty;var mt=Object.getOwnPropertyDescriptor;var dt=Object.getOwnPropertyNames;var ft=Object.getPrototypeOf,ut=Object.prototype.hasOwnProperty;var pt=(r,e)=>{for(var t in e)U(r,t,{get:e[t],enumerable:!0})},V=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of dt(e))!ut.call(r,n)&&n!==t&&U(r,n,{get:()=>e[n],enumerable:!(o=mt(e,n))||o.enumerable});return r};var f=(r,e,t)=>(t=r!=null?lt(ft(r)):{},V(e||!r||!r.__esModule?U(t,"default",{value:r,enumerable:!0}):t,r)),gt=r=>V(U({},"__esModule",{value:!0}),r);var Pt={};pt(Pt,{checkForUpdate:()=>ot,ensureBinary:()=>Z,findReleaseWithBinary:()=>L,getArchiveName:()=>S,getBinaryName:()=>I,getBinaryPath:()=>E,getCurrentVersion:()=>M,getDownloadUrl:()=>R,getLatestVersion:()=>b,getPlatform:()=>x,install:()=>et,uninstall:()=>nt});module.exports=gt(Pt);var l=f(require("fs")),D=f(require("os")),v=f(require("path")),rt=require("child_process");var _=f(require("os")),q=f(require("path")),ht={darwin:"darwin",linux:"linux",win32:"windows"},wt={x64:"amd64",arm64:"arm64"};function x(){let r=_.default.platform(),e=_.default.arch(),t=ht[r],o=wt[e];if(!t)throw new Error(`Unsupported platform: ${r}`);if(!o)throw new Error(`Unsupported arch: ${e}`);return{platform:t,arch:o}}var I=r=>r==="windows"?"cc-helper.exe":"cc-helper";function S(r,e,t){let o=r.replace(/^v/,"");return e==="windows"?`cc-helper_${o}_${e}_${t}.zip`:`cc-helper_${o}_${e}_${t}.tar.gz`}var E=()=>{let{platform:r}=x();return q.default.join(__dirname,"bin",I(r))};var $=f(require("fs")),K=f(require("path")),j=f(require("http")),Y=f(require("https")),yt="\x1B[90m",$t="\x1B[0m";function k(r){try{$.default.existsSync(r)&&$.default.unlinkSync(r)}catch{}}async function A(r,e,t=3){for(let o=0;o<t;o++)try{await new Promise((n,i)=>{let m=(r.startsWith("https")?Y.default:j.default).get(r,{headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}},c=>{if(c.statusCode===301||c.statusCode===302){let u=c.headers.location;if(u){A(u,e,t).then(n).catch(i);return}}if(c.statusCode!==200){i(new Error(`HTTP ${c.statusCode}`));return}let s=K.default.dirname(e);$.default.existsSync(s)||$.default.mkdirSync(s,{recursive:!0});let h=$.default.createWriteStream(e);c.pipe(h),h.on("finish",()=>{h.close(u=>{u?i(u):$.default.existsSync(e)&&$.default.statSync(e).size>0?n():i(new Error("Downloaded file is empty or missing"))})}),h.on("error",u=>{k(e),i(u)}),c.on("error",u=>{k(e),i(u)})});m.setTimeout(3e4,()=>{m.destroy(),i(new Error("Timeout"))}),m.on("error",c=>{k(e),i(c)})});return}catch(n){if(k(e),o===t-1)throw n;console.log(`${yt}Retrying (${o+1}/${t})...${$t}`),await new Promise(i=>setTimeout(i,1e3*(o+1)))}}var d=f(require("fs")),p=f(require("path")),W=f(require("zlib"));async function xt(r,e){let t=0;for(;t+512<=r.length;){let o=r.subarray(t,t+512);if(o.every(c=>c===0))break;let n=o.subarray(0,100).toString().replace(/\0.*$/,""),i=o.subarray(345,500).toString().replace(/\0.*$/,"");i&&(n=`${i}/${n}`),n.startsWith("package/")&&(n=n.slice(8)),n=n.replace(/\//g,p.default.sep);let a=parseInt(o.subarray(124,136).toString().trim(),8)||0,m=o[156];if(t+=512,a>0&&n&&(m===0||m===48)){let c=p.default.join(e,n);await d.default.promises.mkdir(p.default.dirname(c),{recursive:!0}),await d.default.promises.writeFile(c,r.subarray(t,t+a)),t+=Math.ceil(a/512)*512}}}async function St(r,e){await d.default.promises.mkdir(e,{recursive:!0});let t=await d.default.promises.readFile(r),o;try{o=W.default.unzipSync(t)}catch(n){throw new Error(`Failed to decompress tar.gz: ${n.message}`)}await xt(o,e)}async function Et(r,e){await d.default.promises.mkdir(e,{recursive:!0});let t=await d.default.promises.readFile(r);if(t.length<22)throw new Error(`Invalid ZIP: file too small (${t.length} bytes)`);let o=Buffer.from([80,75,5,6]),n=t.length-22;for(;n>=0&&!t.subarray(n,n+4).equals(o);)n--;if(n<0)throw new Error(`Invalid ZIP: missing end of central directory (file may be corrupted or incomplete, size: ${t.length} bytes)`);if(n+22>t.length)throw new Error("Invalid ZIP: truncated EOCD record");let i=t.readUInt32LE(n+16),a=t.readUInt32LE(n+12),m=i+a;if(i>=t.length||m>t.length)throw new Error(`Invalid ZIP: central directory out of bounds (cdOffset: ${i}, cdEnd: ${m}, fileSize: ${t.length})`);let c=Buffer.from([80,75,1,2]),s=i;for(;s<m;){if(s+46>t.length)throw new Error(`Invalid ZIP: truncated central directory at position ${s}`);if(!t.subarray(s,s+4).equals(c))throw new Error(`Invalid ZIP: invalid central directory signature at position ${s}`);let h=t.readUInt16LE(s+28),u=t.readUInt16LE(s+30),O=t.readUInt16LE(s+32),P=t.readUInt32LE(s+42),it=t.readUInt32LE(s+20),It=t.readUInt32LE(s+24),bt=t.readUInt16LE(s+10);if(s+46+h+u+O>t.length)throw new Error(`Invalid ZIP: truncated central directory entry at position ${s}`);let y=t.subarray(s+46,s+46+h).toString();if(s+=46+h+u+O,y.endsWith("/")){await d.default.promises.mkdir(p.default.join(e,y.replace(/\//g,p.default.sep)),{recursive:!0});continue}if(y=y.replace(/\//g,p.default.sep),P+30>t.length)throw new Error(`Invalid ZIP: local header out of bounds for ${y}`);let T=t.readUInt16LE(P+8),st=t.readUInt16LE(P+26),at=t.readUInt16LE(P+28),z=P+30+st+at,G=it;if(z+G>t.length)throw new Error(`Invalid ZIP: truncated file data for ${y}`);let H=t.subarray(z,z+G),B=p.default.join(e,y);await d.default.promises.mkdir(p.default.dirname(B),{recursive:!0});try{if(T===8)await d.default.promises.writeFile(B,W.default.inflateRawSync(H));else if(T===0)await d.default.promises.writeFile(B,H);else throw new Error(`Unsupported compression method ${T} for ${y}`)}catch(ct){throw new Error(`Failed to decompress ${y}: ${ct.message}`)}}}async function J(r,e,t){t==="windows"?await Et(r,e):await St(r,e)}function Q(r,e){let t=p.default.join(r,e);if(d.default.existsSync(t))return t;for(let o of d.default.readdirSync(r)){let n=p.default.join(r,o,e);if(d.default.statSync(p.default.join(r,o)).isDirectory()&&d.default.existsSync(n))return n}throw new Error(`Binary ${e} not found`)}var X=f(require("https"));var N="next-bin",C="cc-helper";function tt(r){return new Promise((e,t)=>{let o=`https://api.github.com${r}`,n=X.default.get(o,{headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}},i=>{let a="";i.on("data",m=>a+=m),i.on("end",()=>{i.statusCode!==200?t(new Error(`GitHub API error: ${i.statusCode}`)):e(JSON.parse(a))})});n.setTimeout(15e3,()=>{n.destroy(),t(new Error("GitHub API timeout"))}),n.on("error",t)})}async function b(){return(await tt(`/repos/${N}/${C}/releases/latest`)).tag_name.replace(/^v/,"")}async function L(r,e){var n;let t=await tt(`/repos/${N}/${C}/releases?per_page=10`),o=r==="windows"?`_${r}_${e}.zip`:`_${r}_${e}.tar.gz`;for(let i of t)if((n=i.assets)!=null&&n.some(a=>a.name.includes(o)))return i.tag_name.replace(/^v/,"");throw new Error(`No binary found for ${r}-${e}`)}function R(r,e,t,o){let n=r.startsWith("v")?r:`v${r}`,i=`https://github.com/${N}/${C}/releases/download/${n}/${S(r,e,t)}`;return o?`${o}/${i}`:i}var vt="\x1B[31m",w="\x1B[90m",g="\x1B[0m";async function F(r,e,t,o,n){let i=S(r,e,t),a=v.default.join(D.default.tmpdir(),i),m=R(r,e,t,n);n&&console.log(`${w}Using proxy: ${n}${g}`);try{await A(m,a)}catch(s){throw s}let c=v.default.join(D.default.tmpdir(),`cc-helper_${Date.now()}`);l.default.mkdirSync(c,{recursive:!0});try{await J(a,c,e);let s=Q(c,I(e)),h=v.default.dirname(o);l.default.existsSync(h)||l.default.mkdirSync(h,{recursive:!0}),l.default.existsSync(o)&&l.default.unlinkSync(o),l.default.copyFileSync(s,o),process.platform!=="win32"&&l.default.chmodSync(o,493)}finally{let s=l.default.rmSync||l.default.rmdirSync;try{s(c,{recursive:!0,force:!0})}catch{}l.default.existsSync(a)&&l.default.unlinkSync(a)}}async function Z(r=null,e){let{platform:t,arch:o}=x(),n=E();if(l.default.existsSync(n))return n;if(r)try{return await F(r,t,o,n,e),n}catch(a){if(!a.message.includes("404"))throw a}let i=await b();try{await F(i,t,o,n,e)}catch(a){if(!a.message.includes("404"))throw a;i=await L(t,o),await F(i,t,o,n,e)}return n}async function et(r=null,e,t=[]){try{await Z(r,e)}catch{let{platform:n,arch:i}=x(),a=`${n}-${i}`,c=t.some(s=>s==="--proxy"||s.startsWith("--proxy="))?t.join(" "):`--proxy ${t.join(" ")}`.trim();console.log(`${vt}Failed to install (${a})${g}`),console.log(`${w}Possible causes:${g}`),console.log(`${w} \u2022 Network connectivity issues${g}`),console.log(`${w} \u2022 Permission issues${g}`),console.log(`${w}Try:${g}`),console.log(`${w} \u2022 Check your internet connection${g}`),console.log(`${w} \u2022 npx @unitsvc/cc-helper@latest ${c}${g}`)}}function nt(){let r=E(),e=v.default.dirname(r);l.default.existsSync(r)?(l.default.unlinkSync(r),console.log(`${w}Removed binary: ${r}${g}`)):console.log(`${w}No installation found${g}`),l.default.existsSync(e)&&l.default.readdirSync(e).length===0&&l.default.rmdirSync(e),console.log(`${w}To complete uninstallation, run:${g}`),console.log(`${w} npm uninstall -g @unitsvc/cc-helper${g}`)}async function M(r){if(!l.default.existsSync(r))return null;try{let e=v.default.resolve(r),o=(0,rt.execSync)(`"${e}" --version`,{timeout:5e3}).toString().trim().match(/(\d+\.\d+\.\d+)/);return o?o[1]:null}catch{return null}}async function ot(r){let e=E(),t=await b(),o=await M(e);return{current:o,latest:t,needsUpdate:!o||o!==t}}0&&(module.exports={checkForUpdate,ensureBinary,findReleaseWithBinary,getArchiveName,getBinaryName,getBinaryPath,getCurrentVersion,getDownloadUrl,getLatestVersion,getPlatform,install,uninstall});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unitsvc/cc-helper",
3
- "version": "1.5.8",
3
+ "version": "1.5.11",
4
4
  "description": "Claude Code multi-provider & channels toolkit (by next-bin)",
5
5
  "main": "dist/index.js",
6
6
  "bin": {