@marsapi/cli 0.0.160 → 0.0.161

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.
@@ -5,6 +5,22 @@
5
5
  "permission_mode": "full_auto"
6
6
  },
7
7
  "features": {},
8
+ "key_groups": {
9
+ "base": [
10
+ "auto"
11
+ ],
12
+ "options": [
13
+ {
14
+ "default": true,
15
+ "groups": [
16
+ "Claude 官方特供版"
17
+ ],
18
+ "hint": "支持 Fable,完美缓存,只能在 Claude Code、IDE 官方插件和桌面端中使用",
19
+ "id": "claude-special",
20
+ "label": "使用 Claude 官方特供版"
21
+ }
22
+ ]
23
+ },
8
24
  "min_client_version": "",
9
25
  "models": {
10
26
  "claude": [
@@ -19,7 +35,7 @@
19
35
  },
20
36
  {
21
37
  "description": "100 万上下文 | 12.8 万输出 | 自适应思考常开 | 长时 Agent 与多步研究",
22
- "group": "grp_rld6af0zorqd",
38
+ "group": "grp_6eg2dq9ywgrg",
23
39
  "group_name": "",
24
40
  "hidden": false,
25
41
  "id": "claude-fable-5-1",
@@ -28,7 +44,7 @@
28
44
  },
29
45
  {
30
46
  "description": "轻量档 | 低延迟 | 高频短任务",
31
- "group": "grp_irydsgijuckh",
47
+ "group": "grp_pzxnceygmqlp",
32
48
  "group_name": "",
33
49
  "hidden": false,
34
50
  "id": "claude-haiku-4-5-20251001",
@@ -46,7 +62,7 @@
46
62
  },
47
63
  {
48
64
  "description": "100 万上下文 | 推理 | 编程 | 长上下文不加价",
49
- "group": "grp_6co8aqwefsoh",
65
+ "group": "grp_irydsgijuckh",
50
66
  "group_name": "",
51
67
  "hidden": false,
52
68
  "id": "claude-opus-4-6",
@@ -55,7 +71,7 @@
55
71
  },
56
72
  {
57
73
  "description": "100 万上下文 | 推理 | 编程 | 长上下文不加价",
58
- "group": "grp_irydsgijuckh",
74
+ "group": "grp_pzxnceygmqlp",
59
75
  "group_name": "",
60
76
  "hidden": false,
61
77
  "id": "claude-opus-4-7",
@@ -64,7 +80,7 @@
64
80
  },
65
81
  {
66
82
  "description": "100 万上下文 | 推理 | 编程 | 长上下文不加价",
67
- "group": "grp_irydsgijuckh",
83
+ "group": "grp_pzxnceygmqlp",
68
84
  "group_name": "",
69
85
  "hidden": false,
70
86
  "id": "claude-opus-4-8",
@@ -73,7 +89,7 @@
73
89
  },
74
90
  {
75
91
  "description": "100 万上下文 | 12.8 万输出 | 自适应思考五档 | Agent 编程",
76
- "group": "grp_6eg2dq9ywgrg",
92
+ "group": "grp_pzxnceygmqlp",
77
93
  "group_name": "",
78
94
  "hidden": false,
79
95
  "id": "claude-opus-5",
@@ -82,7 +98,7 @@
82
98
  },
83
99
  {
84
100
  "description": "100 万上下文 | 长时 Agent 编程 | 知识工作",
85
- "group": "grp_6lyxfgbs440g",
101
+ "group": "grp_6eg2dq9ywgrg",
86
102
  "group_name": "",
87
103
  "hidden": false,
88
104
  "id": "claude-opus-5-5",
@@ -100,7 +116,7 @@
100
116
  },
101
117
  {
102
118
  "description": "100 万上下文 | Agent 编程 | 工具调用 | 知识工作",
103
- "group": "grp_6lyxfgbs440g",
119
+ "group": "grp_6eg2dq9ywgrg",
104
120
  "group_name": "",
105
121
  "hidden": false,
106
122
  "id": "claude-sonnet-5",
@@ -109,7 +125,7 @@
109
125
  },
110
126
  {
111
127
  "description": "100 万上下文 | 12.8 万输出 | Agent 编程 | 知识工作",
112
- "group": "grp_6eg2dq9ywgrg",
128
+ "group": "grp_6lyxfgbs440g",
113
129
  "group_name": "",
114
130
  "hidden": false,
115
131
  "id": "claude-sonnet-5-5",
@@ -120,7 +136,7 @@
120
136
  "codex": [
121
137
  {
122
138
  "description": "105 万上下文 | 12.8 万输出 | 大批量低成本档",
123
- "group": "grp_bsbtt432saoq",
139
+ "group": "grp_mb5v069lpnze",
124
140
  "group_name": "",
125
141
  "hidden": false,
126
142
  "id": "gpt-5.6-luna",
@@ -129,7 +145,7 @@
129
145
  },
130
146
  {
131
147
  "description": "105 万上下文 | 12.8 万输出 | 前沿档",
132
- "group": "grp_irydsgijuckh",
148
+ "group": "grp_bsbtt432saoq",
133
149
  "group_name": "",
134
150
  "hidden": false,
135
151
  "id": "gpt-5.6-sol",
@@ -146,8 +162,8 @@
146
162
  "recommended": false
147
163
  },
148
164
  {
149
- "description": "105 万上下文 | 12.8 万输出 | 思考强度至 max | 计算机操作 / 编码 / 科学基准接近饱和",
150
- "group": "grp_6co8aqwefsoh",
165
+ "description": "105 万上下文 | 12.8 万输出 | 思考强度至 max",
166
+ "group": "grp_irydsgijuckh",
151
167
  "group_name": "",
152
168
  "hidden": false,
153
169
  "id": "gpt-6-astra",
@@ -165,7 +181,7 @@
165
181
  },
166
182
  {
167
183
  "description": "105 万上下文 | 12.8 万输出 | 复杂编程与 Agent 工作流",
168
- "group": "grp_mb5v069lpnze",
184
+ "group": "grp_6co8aqwefsoh",
169
185
  "group_name": "",
170
186
  "hidden": false,
171
187
  "id": "gpt-6-sol",
@@ -183,7 +199,7 @@
183
199
  },
184
200
  {
185
201
  "description": "105 万上下文 | 12.8 万输出 | 计算机操作与日常 Agent 任务 | 均衡档",
186
- "group": "grp_mb5v069lpnze",
202
+ "group": "grp_irydsgijuckh",
187
203
  "group_name": "",
188
204
  "hidden": false,
189
205
  "id": "gpt-6.1-terra",
@@ -203,7 +219,7 @@
203
219
  },
204
220
  {
205
221
  "description": "约 100 万上下文 | 深度推理 | 长文档一致性",
206
- "group": "grp_3pi5kyqkp51b",
222
+ "group": "grp_z5khwusxuh2j",
207
223
  "group_name": "",
208
224
  "hidden": false,
209
225
  "id": "gemini-3-pro",
@@ -221,7 +237,7 @@
221
237
  },
222
238
  {
223
239
  "description": "约 100 万上下文 | 深度推理 | 密集长文档",
224
- "group": "grp_3pi5kyqkp51b",
240
+ "group": "grp_z5khwusxuh2j",
225
241
  "group_name": "",
226
242
  "hidden": false,
227
243
  "id": "gemini-3.1-pro",
@@ -247,8 +263,8 @@
247
263
  "recommended": false
248
264
  },
249
265
  {
250
- "description": "约 208 token/秒 | 高吞吐 | 多语言 | 编码",
251
- "group": "grp_3pi5kyqkp51b",
266
+ "description": "高吞吐 | 多语言 | 编码",
267
+ "group": "grp_irydsgijuckh",
252
268
  "group_name": "",
253
269
  "hidden": false,
254
270
  "id": "gemini-3.6-flash",
@@ -257,7 +273,7 @@
257
273
  },
258
274
  {
259
275
  "description": "Agent 主力 | 软件工程 | 网页开发",
260
- "group": "grp_3pi5kyqkp51b",
276
+ "group": "grp_z5khwusxuh2j",
261
277
  "group_name": "",
262
278
  "hidden": false,
263
279
  "id": "gemini-3.7-flash",
@@ -283,7 +299,7 @@
283
299
  "recommended": false
284
300
  },
285
301
  {
286
- "description": "Nano Banana 2.1 | 图像生成与编辑 | 1K / 2K / 4K | 最多 6 张参考图",
302
+ "description": "Nano Banana 2.1 | 图像生成与编辑 | 1K / 2K / 4K | 最多 14 张参考图",
287
303
  "group": "grp_lidtulcm988s",
288
304
  "group_name": "",
289
305
  "hidden": false,
@@ -294,7 +310,7 @@
294
310
  ],
295
311
  "grok": [
296
312
  {
297
- "description": "50 万上下文 | 1.5 万亿参数 MoE | 编码与 Agent",
313
+ "description": "50 万上下文 | 编码与 Agent",
298
314
  "group": "grp_irydsgijuckh",
299
315
  "group_name": "",
300
316
  "hidden": false,
@@ -304,7 +320,7 @@
304
320
  },
305
321
  {
306
322
  "description": "50 万上下文 | 思考强度四档 | 编码与 Agent",
307
- "group": "grp_l34dwliv4yas",
323
+ "group": "grp_irydsgijuckh",
308
324
  "group_name": "",
309
325
  "hidden": false,
310
326
  "id": "grok-4.6",
@@ -313,7 +329,7 @@
313
329
  },
314
330
  {
315
331
  "description": "50 万上下文 | 长时 Agent | 编码与视觉项目",
316
- "group": "grp_l34dwliv4yas",
332
+ "group": "grp_irydsgijuckh",
317
333
  "group_name": "",
318
334
  "hidden": false,
319
335
  "id": "grok-4.7",
@@ -357,7 +373,7 @@
357
373
  "tool": "gemini"
358
374
  }
359
375
  ],
360
- "revision": "builtin-1",
376
+ "revision": "2026-11-03T17:42:14Z-1",
361
377
  "schema": 1,
362
378
  "tools": {
363
379
  "claude": {
@@ -5,6 +5,22 @@
5
5
  "permission_mode": "full_auto"
6
6
  },
7
7
  "features": {},
8
+ "key_groups": {
9
+ "base": [
10
+ "auto"
11
+ ],
12
+ "options": [
13
+ {
14
+ "default": true,
15
+ "groups": [
16
+ "Claude 官方特供版"
17
+ ],
18
+ "hint": "支持 Fable,完美缓存,只能在 Claude Code、IDE 官方插件和桌面端中使用",
19
+ "id": "claude-special",
20
+ "label": "使用 Claude 官方特供版"
21
+ }
22
+ ]
23
+ },
8
24
  "min_client_version": "",
9
25
  "models": {
10
26
  "claude": [
@@ -19,7 +35,7 @@
19
35
  },
20
36
  {
21
37
  "description": "100 万上下文 | 12.8 万输出 | 自适应思考常开 | 长时 Agent 与多步研究",
22
- "group": "grp_rld6af0zorqd",
38
+ "group": "grp_6eg2dq9ywgrg",
23
39
  "group_name": "",
24
40
  "hidden": false,
25
41
  "id": "claude-fable-5-1",
@@ -28,7 +44,7 @@
28
44
  },
29
45
  {
30
46
  "description": "轻量档 | 低延迟 | 高频短任务",
31
- "group": "grp_irydsgijuckh",
47
+ "group": "grp_pzxnceygmqlp",
32
48
  "group_name": "",
33
49
  "hidden": false,
34
50
  "id": "claude-haiku-4-5-20251001",
@@ -46,7 +62,7 @@
46
62
  },
47
63
  {
48
64
  "description": "100 万上下文 | 推理 | 编程 | 长上下文不加价",
49
- "group": "grp_6co8aqwefsoh",
65
+ "group": "grp_irydsgijuckh",
50
66
  "group_name": "",
51
67
  "hidden": false,
52
68
  "id": "claude-opus-4-6",
@@ -55,7 +71,7 @@
55
71
  },
56
72
  {
57
73
  "description": "100 万上下文 | 推理 | 编程 | 长上下文不加价",
58
- "group": "grp_irydsgijuckh",
74
+ "group": "grp_pzxnceygmqlp",
59
75
  "group_name": "",
60
76
  "hidden": false,
61
77
  "id": "claude-opus-4-7",
@@ -64,7 +80,7 @@
64
80
  },
65
81
  {
66
82
  "description": "100 万上下文 | 推理 | 编程 | 长上下文不加价",
67
- "group": "grp_irydsgijuckh",
83
+ "group": "grp_pzxnceygmqlp",
68
84
  "group_name": "",
69
85
  "hidden": false,
70
86
  "id": "claude-opus-4-8",
@@ -73,7 +89,7 @@
73
89
  },
74
90
  {
75
91
  "description": "100 万上下文 | 12.8 万输出 | 自适应思考五档 | Agent 编程",
76
- "group": "grp_6eg2dq9ywgrg",
92
+ "group": "grp_pzxnceygmqlp",
77
93
  "group_name": "",
78
94
  "hidden": false,
79
95
  "id": "claude-opus-5",
@@ -82,7 +98,7 @@
82
98
  },
83
99
  {
84
100
  "description": "100 万上下文 | 长时 Agent 编程 | 知识工作",
85
- "group": "grp_6lyxfgbs440g",
101
+ "group": "grp_6eg2dq9ywgrg",
86
102
  "group_name": "",
87
103
  "hidden": false,
88
104
  "id": "claude-opus-5-5",
@@ -100,7 +116,7 @@
100
116
  },
101
117
  {
102
118
  "description": "100 万上下文 | Agent 编程 | 工具调用 | 知识工作",
103
- "group": "grp_6lyxfgbs440g",
119
+ "group": "grp_6eg2dq9ywgrg",
104
120
  "group_name": "",
105
121
  "hidden": false,
106
122
  "id": "claude-sonnet-5",
@@ -109,7 +125,7 @@
109
125
  },
110
126
  {
111
127
  "description": "100 万上下文 | 12.8 万输出 | Agent 编程 | 知识工作",
112
- "group": "grp_6eg2dq9ywgrg",
128
+ "group": "grp_6lyxfgbs440g",
113
129
  "group_name": "",
114
130
  "hidden": false,
115
131
  "id": "claude-sonnet-5-5",
@@ -120,7 +136,7 @@
120
136
  "codex": [
121
137
  {
122
138
  "description": "105 万上下文 | 12.8 万输出 | 大批量低成本档",
123
- "group": "grp_bsbtt432saoq",
139
+ "group": "grp_mb5v069lpnze",
124
140
  "group_name": "",
125
141
  "hidden": false,
126
142
  "id": "gpt-5.6-luna",
@@ -129,7 +145,7 @@
129
145
  },
130
146
  {
131
147
  "description": "105 万上下文 | 12.8 万输出 | 前沿档",
132
- "group": "grp_irydsgijuckh",
148
+ "group": "grp_bsbtt432saoq",
133
149
  "group_name": "",
134
150
  "hidden": false,
135
151
  "id": "gpt-5.6-sol",
@@ -146,8 +162,8 @@
146
162
  "recommended": false
147
163
  },
148
164
  {
149
- "description": "105 万上下文 | 12.8 万输出 | 思考强度至 max | 计算机操作 / 编码 / 科学基准接近饱和",
150
- "group": "grp_6co8aqwefsoh",
165
+ "description": "105 万上下文 | 12.8 万输出 | 思考强度至 max",
166
+ "group": "grp_irydsgijuckh",
151
167
  "group_name": "",
152
168
  "hidden": false,
153
169
  "id": "gpt-6-astra",
@@ -165,7 +181,7 @@
165
181
  },
166
182
  {
167
183
  "description": "105 万上下文 | 12.8 万输出 | 复杂编程与 Agent 工作流",
168
- "group": "grp_mb5v069lpnze",
184
+ "group": "grp_6co8aqwefsoh",
169
185
  "group_name": "",
170
186
  "hidden": false,
171
187
  "id": "gpt-6-sol",
@@ -183,7 +199,7 @@
183
199
  },
184
200
  {
185
201
  "description": "105 万上下文 | 12.8 万输出 | 计算机操作与日常 Agent 任务 | 均衡档",
186
- "group": "grp_mb5v069lpnze",
202
+ "group": "grp_irydsgijuckh",
187
203
  "group_name": "",
188
204
  "hidden": false,
189
205
  "id": "gpt-6.1-terra",
@@ -203,7 +219,7 @@
203
219
  },
204
220
  {
205
221
  "description": "约 100 万上下文 | 深度推理 | 长文档一致性",
206
- "group": "grp_3pi5kyqkp51b",
222
+ "group": "grp_z5khwusxuh2j",
207
223
  "group_name": "",
208
224
  "hidden": false,
209
225
  "id": "gemini-3-pro",
@@ -221,7 +237,7 @@
221
237
  },
222
238
  {
223
239
  "description": "约 100 万上下文 | 深度推理 | 密集长文档",
224
- "group": "grp_3pi5kyqkp51b",
240
+ "group": "grp_z5khwusxuh2j",
225
241
  "group_name": "",
226
242
  "hidden": false,
227
243
  "id": "gemini-3.1-pro",
@@ -247,8 +263,8 @@
247
263
  "recommended": false
248
264
  },
249
265
  {
250
- "description": "约 208 token/秒 | 高吞吐 | 多语言 | 编码",
251
- "group": "grp_3pi5kyqkp51b",
266
+ "description": "高吞吐 | 多语言 | 编码",
267
+ "group": "grp_irydsgijuckh",
252
268
  "group_name": "",
253
269
  "hidden": false,
254
270
  "id": "gemini-3.6-flash",
@@ -257,7 +273,7 @@
257
273
  },
258
274
  {
259
275
  "description": "Agent 主力 | 软件工程 | 网页开发",
260
- "group": "grp_3pi5kyqkp51b",
276
+ "group": "grp_z5khwusxuh2j",
261
277
  "group_name": "",
262
278
  "hidden": false,
263
279
  "id": "gemini-3.7-flash",
@@ -283,7 +299,7 @@
283
299
  "recommended": false
284
300
  },
285
301
  {
286
- "description": "Nano Banana 2.1 | 图像生成与编辑 | 1K / 2K / 4K | 最多 6 张参考图",
302
+ "description": "Nano Banana 2.1 | 图像生成与编辑 | 1K / 2K / 4K | 最多 14 张参考图",
287
303
  "group": "grp_lidtulcm988s",
288
304
  "group_name": "",
289
305
  "hidden": false,
@@ -294,7 +310,7 @@
294
310
  ],
295
311
  "grok": [
296
312
  {
297
- "description": "50 万上下文 | 1.5 万亿参数 MoE | 编码与 Agent",
313
+ "description": "50 万上下文 | 编码与 Agent",
298
314
  "group": "grp_irydsgijuckh",
299
315
  "group_name": "",
300
316
  "hidden": false,
@@ -304,7 +320,7 @@
304
320
  },
305
321
  {
306
322
  "description": "50 万上下文 | 思考强度四档 | 编码与 Agent",
307
- "group": "grp_l34dwliv4yas",
323
+ "group": "grp_irydsgijuckh",
308
324
  "group_name": "",
309
325
  "hidden": false,
310
326
  "id": "grok-4.6",
@@ -313,7 +329,7 @@
313
329
  },
314
330
  {
315
331
  "description": "50 万上下文 | 长时 Agent | 编码与视觉项目",
316
- "group": "grp_l34dwliv4yas",
332
+ "group": "grp_irydsgijuckh",
317
333
  "group_name": "",
318
334
  "hidden": false,
319
335
  "id": "grok-4.7",
@@ -357,7 +373,7 @@
357
373
  "tool": "gemini"
358
374
  }
359
375
  ],
360
- "revision": "builtin-1",
376
+ "revision": "2026-11-03T17:42:14Z-1",
361
377
  "schema": 1,
362
378
  "tools": {
363
379
  "claude": {
@@ -1 +1 @@
1
- import{dirname as e,join as t}from"path";import{fileURLToPath as o}from"url";import{existsSync as l,readFileSync as n}from"fs";import{currentClientConfig as r,usableClientSection as s}from"./client-config.js";import{brand as a}from"./brand.js";const i=e(o(import.meta.url)),d=(e=[],t=[])=>[...new Set([...e,...t])];export function overlayClientSection(e,t){if(!t)return e;const o={...e.retiredDefaultModels??{}};for(const[e,l]of Object.entries(t.retiredDefaultModels??{}))o[e]=d(o[e],l);return{...e,defaultModels:{...e.defaultModels,...t.defaultModels??{}},retiredDefaultModels:o,toolDefaults:{...e.toolDefaults??{},...t.toolDefaults??{}},claudeCode:t.tierChains?{...e.claudeCode??{},tierChains:{...e.claudeCode?.tierChains??{},...t.tierChains}}:e.claudeCode,claudeDesktop:t.oneMillionFallback?{...e.claudeDesktop??{},oneMillionFallback:[...t.oneMillionFallback]}:e.claudeDesktop,gatewayModels:t.retiredModels?{...e.gatewayModels??{},retired:d(e.gatewayModels?.retired,t.retiredModels)}:e.gatewayModels,toolMinVersions:{...e.toolMinVersions??{},...t.toolMinVersions??{}},agy:t.agyModels?{...e.agy??{},gatewayModels:[...t.agyModels]}:e.agy}}let u=null;function c(){return u||(u=overlayClientSection(function(){const e=[t(i,"..","..","models.json"),t(i,"..","models.json"),t(i,"models.json")];for(const t of e)if(l(t))return JSON.parse(n(t,"utf-8"));throw new Error(`models.json not found, searched: ${e.join(", ")}`)}(),s(r()?.config))),u}export function getDefaultModels(){return{...c().defaultModels}}export function isRetiredDefaultModel(e,t){return c().retiredDefaultModels?.[e]?.includes(t)??!1}export function getRetiredDefaultModelIds(){return[...new Set(Object.values(c().retiredDefaultModels??{}).flat())]}export function getDefaultToolModel(){return c().defaultToolModel?.trim()||"gpt-5.5"}export function getToolDefaultModel(e){const t=c().toolDefaults;return t&&Object.prototype.hasOwnProperty.call(t,e)?(t[e]??"").trim():getDefaultToolModel()}export function getPresets(){return[...c().presets]}export function resolvePreset(e){return e.models?{...e.models}:e.model?{haiku:e.model,sonnet:e.model,opus:e.model,reasoning:e.model}:getDefaultModels()}export function getClaudeCodeTierChains(){const e=c().claudeCode?.tierChains??{};return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,[...t]]))}export function getClaudeDesktopRules(){const e=c().claudeDesktop??{};return{oneMillionFallback:[...e.oneMillionFallback??[]],oneMillionExclusions:(e.oneMillionExclusions??[]).map(e=>({...e,models:[...e.models]}))}}export function getGatewayModelRules(){const e=c().gatewayModels??{};return{autoCompactRatio:e.autoCompactRatio??.8,models:(e.models??[]).map(e=>({...e})),retired:[...e.retired??[]]}}export function getBuiltinGatewayAddresses(){return a().gatewayAddresses.map(e=>({...e}))}export function getCodexRules(){return{standardContextWindow:c().codex?.standardContextWindow??272e3}}export function getAgyRules(){return{gatewayModels:[...c().agy?.gatewayModels??[]]}}export function compareVersions(e,t){const o=e.split(".").map(e=>parseInt(e,10)||0),l=t.split(".").map(e=>parseInt(e,10)||0);for(let e=0;e<Math.max(o.length,l.length);e++){const t=(o[e]??0)-(l[e]??0);if(0!==t)return t}return 0}export function getToolMinVersion(e){return c().toolMinVersions?.[e]?.trim()||null}export function reloadRegistry(){u=null}
1
+ import{dirname as e,join as o}from"path";import{fileURLToPath as t}from"url";import{existsSync as l,readFileSync as n}from"fs";import{currentClientConfig as r,usableClientSection as s}from"./client-config.js";import{brand as a}from"./brand.js";const i=e(t(import.meta.url)),d=(e=[],o=[])=>[...new Set([...e,...o])];export function overlayClientSection(e,o){if(!o)return e;const t={...e.retiredDefaultModels??{}};for(const[e,l]of Object.entries(o.retiredDefaultModels??{}))t[e]=d(t[e],l);return{...e,defaultModels:{...e.defaultModels,...o.defaultModels??{}},retiredDefaultModels:t,toolDefaults:{...e.toolDefaults??{},...o.toolDefaults??{}},claudeCode:o.tierChains?{...e.claudeCode??{},tierChains:{...e.claudeCode?.tierChains??{},...o.tierChains}}:e.claudeCode,claudeDesktop:o.oneMillionFallback?{...e.claudeDesktop??{},oneMillionFallback:[...o.oneMillionFallback]}:e.claudeDesktop,gatewayModels:o.retiredModels?{...e.gatewayModels??{},retired:d(e.gatewayModels?.retired,o.retiredModels)}:e.gatewayModels,toolMinVersions:{...e.toolMinVersions??{},...o.toolMinVersions??{}},agy:o.agyModels?{...e.agy??{},gatewayModels:[...o.agyModels]}:e.agy}}let u=null;function c(){return u||(u=overlayClientSection(function(){const e=[o(i,"..","..","models.json"),o(i,"..","models.json"),o(i,"models.json")];for(const o of e)if(l(o))return JSON.parse(n(o,"utf-8"));throw new Error(`models.json not found, searched: ${e.join(", ")}`)}(),s(r()?.config))),u}export function getDefaultModels(){return{...c().defaultModels}}export function isRetiredDefaultModel(e,o){return c().retiredDefaultModels?.[e]?.includes(o)??!1}export function getRetiredDefaultModelIds(){return[...new Set(Object.values(c().retiredDefaultModels??{}).flat())]}export function getDefaultToolModel(){return c().defaultToolModel?.trim()||"gpt-5.5"}export function getToolDefaultModel(e){const o=c().toolDefaults;return o&&Object.prototype.hasOwnProperty.call(o,e)?(o[e]??"").trim():getDefaultToolModel()}export function getToolMenuModels(e){return[...c().toolMenuModels?.[e]??[]]}export function getPresets(){return[...c().presets]}export function resolvePreset(e){return e.models?{...e.models}:e.model?{haiku:e.model,sonnet:e.model,opus:e.model,reasoning:e.model}:getDefaultModels()}export function getClaudeCodeTierChains(){const e=c().claudeCode?.tierChains??{};return Object.fromEntries(Object.entries(e).map(([e,o])=>[e,[...o]]))}export function getClaudeDesktopRules(){const e=c().claudeDesktop??{};return{oneMillionFallback:[...e.oneMillionFallback??[]],oneMillionExclusions:(e.oneMillionExclusions??[]).map(e=>({...e,models:[...e.models]}))}}export function getGatewayModelRules(){const e=c().gatewayModels??{};return{autoCompactRatio:e.autoCompactRatio??.8,models:(e.models??[]).map(e=>({...e})),retired:[...e.retired??[]]}}export function getBuiltinGatewayAddresses(){return a().gatewayAddresses.map(e=>({...e}))}export function getCodexRules(){return{standardContextWindow:c().codex?.standardContextWindow??272e3}}export function getAgyRules(){return{gatewayModels:[...c().agy?.gatewayModels??[]]}}export function compareVersions(e,o){const t=e.split(".").map(e=>parseInt(e,10)||0),l=o.split(".").map(e=>parseInt(e,10)||0);for(let e=0;e<Math.max(t.length,l.length);e++){const o=(t[e]??0)-(l[e]??0);if(0!==o)return o}return 0}export function getToolMinVersion(e){return c().toolMinVersions?.[e]?.trim()||null}export function reloadRegistry(){u=null}
@@ -1 +1 @@
1
- import{existsSync as e,readFileSync as t}from"fs";import{BRAND_NAME as r}from"../brand.js";import{gatewayModelSpecs as n,modelFamily as o,prettyModelName as i,vendorNames as s}from"../gateway-models.js";import{backupBeforeWrite as a,atomicWriteFile as p}from"./backup.js";import{withV1 as d}from"./types.js";export const CUSTOM_MODEL_PREFIX="custom-local:";const u="openai",l="openai-response",c=e=>!!e&&"object"==typeof e&&!Array.isArray(e);export const isOurEntry=e=>c(e)&&e.vendor===r;export function readModelsFile(r){if(!e(r))return{entries:[],wrap:e=>({models:e})};const n=t(r,"utf-8");if(!n.trim())return{entries:[],wrap:e=>({models:e})};let o;try{o=JSON.parse(n)}catch(e){throw new Error(`Existing ${r} cannot be parsed; back it up and fix it first: ${e instanceof Error?e.message:String(e)}`)}if(Array.isArray(o))return{entries:o,wrap:e=>e};if(c(o))return{entries:Array.isArray(o.models)?o.models:[],wrap:e=>({...o,models:e})};throw new Error(`Existing ${r} must hold a JSON object or array`)}export function writeModelsFile(r,n,o){const i=`${JSON.stringify(n.wrap(o),null,2)}\n`;e(r)&&t(r,"utf-8")===i||(a(r),p(r,i,384))}export const bareModelId=e=>e.replace(/\[[^\]]*\]$/,"");export function usesResponses(e){const t=e.endpointTypes??[];return"gpt"===o(e.id)?0===t.length||t.includes(l):t.length>0&&!t.includes(u)&&t.includes(l)}function f(e){const t=e.endpointTypes;return!t||0===t.length||t.includes(u)||t.includes(l)}export function modelEntry(e,t,n,s=!1){const a=e.capabilities??{},p=usesResponses(e),u=o(e.id),l={id:e.id,name:s?e.id:e.name??i(e.id),vendor:r,url:p?d(t):`${d(t)}/chat/completions`,apiKey:n};p&&(l.api="openai-responses");const c=a.contextWindow??e.contextWindow;c&&(l.maxInputTokens=c);const f=a.maxOutput??e.maxOutputTokens;return f&&(l.maxOutputTokens=f),l.supportsToolCall=a.toolCall??!0,l.supportsImages=a.vision??"other"!==u,void 0!==a.reasoning&&(l.supportsReasoning=a.reasoning),a.reasoning&&a.reasoningEfforts&&(l.reasoning={...a.defaultReasoningEffort?{defaultEffort:a.defaultReasoningEffort}:{},supportedEfforts:a.reasoningEfforts}),l}export function menuSpecs(e,t){let r=n("codebuddy",e?.clientModels,e?.clientPersonal).filter(f);if(e){const n=new Set(e.models);r=r.filter(e=>n.has(e.id)),!r.some(e=>e.id===t)&&n.has(t)&&(r=[{id:t},...r])}else r.some(e=>e.id===t)||(r=[{id:t},...r]);const o=(e?.clientPersonal??[]).length>0,i=new Set,a=r.filter(e=>{if(o)return!0;const r=s([e.id])[0],n=!i.has(r);return i.add(r),e.id===t||!0===e.recommended||n}),p=a.findIndex(e=>e.id===t);return p>0?[a[p],...a.slice(0,p),...a.slice(p+1)]:a}export function mergeEntries(e,t,r,n,o=!1){const i=new Set(t.map(e=>e.id)),s=[],a=e.filter(e=>{if(isOurEntry(e))return!1;const t=c(e)&&"string"==typeof e.id?e.id:void 0;return!t||!i.has(t)||(s.push(t),!1)});return{entries:[...t.map(e=>modelEntry(e,r,n,o)),...a],replaced:s}}export function foreignIdsReplaced(e,t){const r=new Set(t.map(e=>e.id));return e.filter(e=>!isOurEntry(e)).filter(e=>c(e)&&"string"==typeof e.id&&r.has(e.id)).map(e=>String(e.id))}export function ourEntries(e){return e.filter(isOurEntry)}export function ourApiKey(e){const t=ourEntries(e)[0]?.apiKey;return"string"==typeof t&&t.trim()?t:null}
1
+ import{existsSync as e,readFileSync as t}from"fs";import{BRAND_NAME as r}from"../brand.js";import{gatewayModelSpecs as n,modelFamily as o,prettyModelName as i,vendorNames as s}from"../gateway-models.js";import{backupBeforeWrite as a,atomicWriteFile as d}from"./backup.js";import{withV1 as p}from"./types.js";export const CUSTOM_MODEL_PREFIX="custom-local:";const u="openai",l="openai-response",c=e=>!!e&&"object"==typeof e&&!Array.isArray(e);export const isOurEntry=e=>c(e)&&e.vendor===r;export function readModelsFile(r){if(!e(r))return{entries:[],wrap:e=>({models:e})};const n=t(r,"utf-8");if(!n.trim())return{entries:[],wrap:e=>({models:e})};let o;try{o=JSON.parse(n)}catch(e){throw new Error(`Existing ${r} cannot be parsed; back it up and fix it first: ${e instanceof Error?e.message:String(e)}`)}if(Array.isArray(o))return{entries:o,wrap:e=>e};if(c(o))return{entries:Array.isArray(o.models)?o.models:[],wrap:e=>({...o,models:e})};throw new Error(`Existing ${r} must hold a JSON object or array`)}export function writeModelsFile(r,n,o){const i=`${JSON.stringify(n.wrap(o),null,2)}\n`;e(r)&&t(r,"utf-8")===i||(a(r),d(r,i,384))}export const bareModelId=e=>e.replace(/\[[^\]]*\]$/,"");export function usesResponses(e){const t=e.endpointTypes??[];return"gpt"===o(e.id)?0===t.length||t.includes(l):t.length>0&&!t.includes(u)&&t.includes(l)}function f(e){const t=e.endpointTypes;return!t||0===t.length||t.includes(u)||t.includes(l)}export function modelEntry(e,t,n,s=!1){const a=e.capabilities??{},d=usesResponses(e),u=o(e.id),l={id:e.id,name:s?e.id:e.name??i(e.id),vendor:r,url:d?p(t):`${p(t)}/chat/completions`,apiKey:n};d&&(l.api="openai-responses");const c=a.contextWindow??e.contextWindow;c&&(l.maxInputTokens=c);const f=a.maxOutput??e.maxOutputTokens;return f&&(l.maxOutputTokens=f),l.supportsToolCall=a.toolCall??!0,l.supportsImages=a.vision??"other"!==u,void 0!==a.reasoning&&(l.supportsReasoning=a.reasoning),a.reasoning&&a.reasoningEfforts&&(l.reasoning={...a.defaultReasoningEffort?{defaultEffort:a.defaultReasoningEffort}:{},supportedEfforts:a.reasoningEfforts}),l}export function menuSpecs(e,t,r=[]){let o=n("codebuddy",e?.clientModels,e?.clientPersonal).filter(f);if(e){const r=new Set(e.models);o=o.filter(e=>r.has(e.id)),!o.some(e=>e.id===t)&&r.has(t)&&(o=[{id:t},...o])}else o.some(e=>e.id===t)||(o=[{id:t},...o]);const i=(e?.clientPersonal??[]).length>0,a=new Set,d=o.filter(e=>{if(i)return!0;const n=s([e.id])[0],o=!a.has(n);return a.add(n),e.id===t||!0===e.recommended||r.includes(e.id)||o}),p=d.findIndex(e=>e.id===t);return p>0?[d[p],...d.slice(0,p),...d.slice(p+1)]:d}export function mergeEntries(e,t,r,n,o=!1){const i=new Set(t.map(e=>e.id)),s=[],a=e.filter(e=>{if(isOurEntry(e))return!1;const t=c(e)&&"string"==typeof e.id?e.id:void 0;return!t||!i.has(t)||(s.push(t),!1)});return{entries:[...t.map(e=>modelEntry(e,r,n,o)),...a],replaced:s}}export function foreignIdsReplaced(e,t){const r=new Set(t.map(e=>e.id));return e.filter(e=>!isOurEntry(e)).filter(e=>c(e)&&"string"==typeof e.id&&r.has(e.id)).map(e=>String(e.id))}export function ourEntries(e){return e.filter(isOurEntry)}export function ourApiKey(e){const t=ourEntries(e)[0]?.apiKey;return"string"==typeof t&&t.trim()?t:null}
@@ -1 +1 @@
1
- import{existsSync as t}from"fs";import{join as r}from"path";import{logger as o}from"../../utils/logger.js";import{i18n as e}from"../i18n.js";import{getToolDefaultModel as n}from"../model-registry.js";import{prettyModelName as d,vendorNames as s}from"../gateway-models.js";import{bareModelId as i,foreignIdsReplaced as a,isOurEntry as l,menuSpecs as p,mergeEntries as u,ourApiKey as c,ourEntries as m,readModelsFile as y,writeModelsFile as g}from"./codebuddy-models.js";import{pickModel as f,toolHome as b}from"./types.js";const k=()=>process.env.WORKBUDDY_CONFIG_DIR?.trim()||process.env.CODEBUDDY_CONFIG_DIR?.trim()||r(b(),".workbuddy"),w=()=>r(k(),"models.json"),h="https://www.codebuddy.cn/work/";let C=null;function _(t,r){const o=y(w()),{entries:e,replaced:n}=u(o.entries,r,t.baseUrl,t.apiKey,!0);return g(w(),o,e),n}const j=t=>i(f(t.models,n("workbuddy")));export const workbuddyAdapter={name:"workbuddy",displayName:"WorkBuddy",command:"workbuddy",installCommand:"darwin"===process.platform?`open ${h}`:h,get configPath(){return w()},wantsModelCatalog:!0,isInstalled:function(){return!!t(k())||"darwin"===process.platform&&["/Applications/WorkBuddy.app",r(b(),"Applications","WorkBuddy.app")].some(r=>t(r))},loadPrivateConfig(t){const r=p(t.catalog,j(t)),o=_(t,r);C={names:r.map(t=>t.name??d(t.id)),vendors:s(r.map(t=>t.id)),replaced:o}},unloadPrivateConfig(){try{const t=y(w());if(0===m(t.entries).length)return;g(w(),t,t.entries.filter(t=>!l(t)))}catch(t){o.logError("workbuddyAdapter.unloadPrivateConfig",t)}},detectCurrentConfig(){try{return{apiKey:c(y(w()).entries)}}catch{return{apiKey:null}}},listedModels(){try{const t=m(y(w()).entries);return t.length>0?t.map(t=>String(t.id)):null}catch{return null}},refreshModelMenu(t){_(t,p(t.catalog,j(t)))},planNotes(){try{const t=y(w()),r=a(t.entries,p(void 0,n("workbuddy")));return r.length>0?[e.t("tools.codebuddy.replaces_models",{path:w(),list:r.join(e.t("tools.codebuddy.list_separator"))})]:[]}catch{return[]}},applyNotes(){if(!C)return[];const t=[{kind:"summary",text:e.t("tools.workbuddy.menu_written",{count:String(C.names.length),list:C.vendors.join(e.t("tools.codebuddy.list_separator"))})},{kind:"action",text:e.t("tools.workbuddy.pick_in_app")}];return C.replaced.length>0&&t.push({kind:"detail",text:e.t("tools.codebuddy.replaced_models",{tool:"workbuddy",list:C.replaced.join(e.t("tools.codebuddy.list_separator"))})}),t},backupPaths:()=>[w()],getConfig(){try{return y(w()).entries}catch(t){return o.logError("workbuddyAdapter.getConfig",t),null}}};
1
+ import{existsSync as t}from"fs";import{join as r}from"path";import{logger as o}from"../../utils/logger.js";import{i18n as e}from"../i18n.js";import{getToolDefaultModel as n,getToolMenuModels as d}from"../model-registry.js";import{prettyModelName as s,vendorNames as i}from"../gateway-models.js";import{bareModelId as a,foreignIdsReplaced as l,isOurEntry as p,menuSpecs as u,mergeEntries as c,ourApiKey as m,ourEntries as y,readModelsFile as g,writeModelsFile as f}from"./codebuddy-models.js";import{pickModel as b,toolHome as k}from"./types.js";const w=()=>process.env.WORKBUDDY_CONFIG_DIR?.trim()||process.env.CODEBUDDY_CONFIG_DIR?.trim()||r(k(),".workbuddy"),h=()=>r(w(),"models.json"),C="https://www.codebuddy.cn/work/";let _=null;function j(t,r){const o=g(h()),{entries:e,replaced:n}=c(o.entries,r,t.baseUrl,t.apiKey,!0);return f(h(),o,e),n}const v=t=>a(b(t.models,n("workbuddy"))),D=(t,r)=>u(t,r,d("workbuddy"));export const workbuddyAdapter={name:"workbuddy",displayName:"WorkBuddy",command:"workbuddy",installCommand:"darwin"===process.platform?`open ${C}`:C,get configPath(){return h()},wantsModelCatalog:!0,isInstalled:function(){return!!t(w())||"darwin"===process.platform&&["/Applications/WorkBuddy.app",r(k(),"Applications","WorkBuddy.app")].some(r=>t(r))},loadPrivateConfig(t){const r=D(t.catalog,v(t)),o=j(t,r);_={names:r.map(t=>t.name??s(t.id)),vendors:i(r.map(t=>t.id)),replaced:o}},unloadPrivateConfig(){try{const t=g(h());if(0===y(t.entries).length)return;f(h(),t,t.entries.filter(t=>!p(t)))}catch(t){o.logError("workbuddyAdapter.unloadPrivateConfig",t)}},detectCurrentConfig(){try{return{apiKey:m(g(h()).entries)}}catch{return{apiKey:null}}},listedModels(){try{const t=y(g(h()).entries);return t.length>0?t.map(t=>String(t.id)):null}catch{return null}},refreshModelMenu(t){j(t,D(t.catalog,v(t)))},planNotes(){try{const t=g(h()),r=l(t.entries,D(void 0,n("workbuddy")));return r.length>0?[e.t("tools.codebuddy.replaces_models",{path:h(),list:r.join(e.t("tools.codebuddy.list_separator"))})]:[]}catch{return[]}},applyNotes(){if(!_)return[];const t=[{kind:"summary",text:e.t("tools.workbuddy.menu_written",{count:String(_.names.length),list:_.vendors.join(e.t("tools.codebuddy.list_separator"))})},{kind:"action",text:e.t("tools.workbuddy.pick_in_app")}];return _.replaced.length>0&&t.push({kind:"detail",text:e.t("tools.codebuddy.replaced_models",{tool:"workbuddy",list:_.replaced.join(e.t("tools.codebuddy.list_separator"))})}),t},backupPaths:()=>[h()],getConfig(){try{return g(h()).entries}catch(t){return o.logError("workbuddyAdapter.getConfig",t),null}}};
package/dist/models.json CHANGED
@@ -22,6 +22,9 @@
22
22
  "codebuddy": "gpt-6-astra",
23
23
  "workbuddy": "gpt-6-astra"
24
24
  },
25
+ "toolMenuModels": {
26
+ "workbuddy": ["gpt-6.1-sol", "gpt-6.1-terra", "claude-sonnet-5-5"]
27
+ },
25
28
  "presets": [
26
29
  {
27
30
  "name": "GPT-5.5",
package/models.json CHANGED
@@ -22,6 +22,9 @@
22
22
  "codebuddy": "gpt-6-astra",
23
23
  "workbuddy": "gpt-6-astra"
24
24
  },
25
+ "toolMenuModels": {
26
+ "workbuddy": ["gpt-6.1-sol", "gpt-6.1-terra", "claude-sonnet-5-5"]
27
+ },
25
28
  "presets": [
26
29
  {
27
30
  "name": "GPT-5.5",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marsapi/cli",
3
- "version": "0.0.160",
3
+ "version": "0.0.161",
4
4
  "description": "Configure Claude Code, Codex, Grok Build and other coding tools for Mars AI with one command",
5
5
  "main": "dist/index.js",
6
6
  "bin": {