@cloudcli-ai/cloudcli 1.37.0 → 1.37.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/assets/index-D3jfzuKN.css +32 -0
  2. package/dist/assets/{index-eGqPeIEu.js → index-DTMWjJj8.js} +324 -305
  3. package/dist/index.html +2 -2
  4. package/dist-server/server/modules/commands/commands.routes.js +3 -3
  5. package/dist-server/server/modules/commands/commands.routes.js.map +1 -1
  6. package/dist-server/server/modules/commands/tests/commands.test.js +2 -7
  7. package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -1
  8. package/dist-server/server/modules/database/index.js +2 -0
  9. package/dist-server/server/modules/database/index.js.map +1 -1
  10. package/dist-server/server/modules/database/migrations.js +18 -1
  11. package/dist-server/server/modules/database/migrations.js.map +1 -1
  12. package/dist-server/server/modules/database/repositories/provider-models.js +112 -0
  13. package/dist-server/server/modules/database/repositories/provider-models.js.map +1 -0
  14. package/dist-server/server/modules/database/repositories/sessions.db.js +63 -7
  15. package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -1
  16. package/dist-server/server/modules/database/schema.js +28 -3
  17. package/dist-server/server/modules/database/schema.js.map +1 -1
  18. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +102 -0
  19. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js.map +1 -0
  20. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +2 -1
  21. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -1
  22. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +22 -0
  23. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -1
  24. package/dist-server/server/modules/file-tree/file-tree.module.js +5 -1
  25. package/dist-server/server/modules/file-tree/file-tree.module.js.map +1 -1
  26. package/dist-server/server/modules/file-tree/file-tree.service.js +50 -18
  27. package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -1
  28. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +83 -7
  29. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -1
  30. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +46 -14
  31. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -1
  32. package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js +8 -15
  33. package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js.map +1 -1
  34. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +58 -71
  35. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
  36. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +1 -54
  37. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -1
  38. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +7 -7
  39. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -1
  40. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +32 -669
  41. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -1
  42. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +105 -328
  43. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -1
  44. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +0 -12
  45. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -1
  46. package/dist-server/server/modules/providers/provider.routes.js +139 -31
  47. package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
  48. package/dist-server/server/modules/providers/services/provider-models.service.js +167 -199
  49. package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -1
  50. package/dist-server/server/modules/providers/services/provider-runtime.service.js +2 -2
  51. package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -1
  52. package/dist-server/server/modules/providers/services/session-conversations-search.service.js +12 -4
  53. package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -1
  54. package/dist-server/server/modules/providers/services/sessions.service.js +62 -3
  55. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -1
  56. package/dist-server/server/modules/providers/tests/codex-sessions.test.js +53 -17
  57. package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -1
  58. package/dist-server/server/modules/providers/tests/opencode-models.test.js +15 -126
  59. package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -1
  60. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +5 -5
  61. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -1
  62. package/dist-server/server/modules/providers/tests/provider-models.service.test.js +175 -292
  63. package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -1
  64. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js +2 -6
  65. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js.map +1 -1
  66. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +1 -0
  67. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -1
  68. package/dist-server/server/modules/providers/tests/provider.routes.test.js +126 -0
  69. package/dist-server/server/modules/providers/tests/provider.routes.test.js.map +1 -0
  70. package/dist-server/server/modules/providers/tests/sessions.service.test.js +87 -0
  71. package/dist-server/server/modules/providers/tests/sessions.service.test.js.map +1 -0
  72. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +5 -1
  73. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -1
  74. package/package.json +3 -3
  75. package/server/modules/commands/commands.routes.ts +3 -3
  76. package/server/modules/commands/tests/commands.test.ts +2 -7
  77. package/server/modules/database/index.ts +2 -0
  78. package/server/modules/database/migrations.ts +20 -0
  79. package/server/modules/database/repositories/provider-models.ts +168 -0
  80. package/server/modules/database/repositories/sessions.db.ts +85 -8
  81. package/server/modules/database/schema.ts +29 -3
  82. package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -0
  83. package/server/modules/database/tests/sessions-provider-mapping.test.ts +2 -1
  84. package/server/modules/database/tests/sessions.db.integration.test.ts +32 -0
  85. package/server/modules/file-tree/file-tree.module.ts +5 -1
  86. package/server/modules/file-tree/file-tree.service.ts +68 -20
  87. package/server/modules/file-tree/tests/file-tree.service.test.ts +104 -7
  88. package/server/modules/providers/list/claude/claude-models.provider.ts +46 -14
  89. package/server/modules/providers/list/claude/claude-runtime.provider.js +8 -16
  90. package/server/modules/providers/list/codex/codex-models.provider.ts +58 -99
  91. package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +1 -60
  92. package/server/modules/providers/list/codex/codex-sessions.provider.ts +7 -7
  93. package/server/modules/providers/list/cursor/cursor-models.provider.ts +32 -710
  94. package/server/modules/providers/list/opencode/opencode-models.provider.ts +105 -413
  95. package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +0 -13
  96. package/server/modules/providers/provider.routes.ts +185 -33
  97. package/server/modules/providers/services/provider-models.service.ts +223 -288
  98. package/server/modules/providers/services/provider-runtime.service.ts +2 -3
  99. package/server/modules/providers/services/session-conversations-search.service.ts +12 -4
  100. package/server/modules/providers/services/sessions.service.ts +87 -3
  101. package/server/modules/providers/tests/codex-sessions.test.ts +57 -18
  102. package/server/modules/providers/tests/opencode-models.test.ts +34 -135
  103. package/server/modules/providers/tests/opencode-sessions.test.ts +5 -5
  104. package/server/modules/providers/tests/provider-models.service.test.ts +353 -450
  105. package/server/modules/providers/tests/provider-runtime.service.test.ts +2 -6
  106. package/server/modules/providers/tests/provider-token-usage.service.test.ts +1 -0
  107. package/server/modules/providers/tests/provider.routes.test.ts +183 -0
  108. package/server/modules/providers/tests/sessions.service.test.ts +127 -0
  109. package/server/modules/websocket/services/chat-websocket.service.ts +5 -1
  110. package/server/shared/interfaces.ts +4 -6
  111. package/server/shared/types.ts +29 -17
  112. package/dist/assets/index-DSlds633.css +0 -32
@@ -2,12 +2,9 @@ import { access, readdir } from 'node:fs/promises';
2
2
  import os from 'node:os';
3
3
  import path from 'node:path';
4
4
 
5
- import crossSpawn from 'cross-spawn';
6
-
7
5
  import type { IProviderModels } from '@/shared/interfaces.js';
8
6
  import type {
9
7
  ProviderCurrentActiveModel,
10
- ProviderModelOption,
11
8
  ProviderModelsDefinition,
12
9
  } from '@/shared/types.js';
13
10
  import {
@@ -15,705 +12,36 @@ import {
15
12
  sanitizeLeafDirectoryName,
16
13
  } from '@/shared/utils.js';
17
14
 
18
- export const CURSOR_FALLBACK_MODELS: ProviderModelsDefinition = {
15
+ /** Curated Cursor catalog shipped as immutable CloudCLI defaults. */
16
+ export const CURSOR_PREDEFINED_MODELS: ProviderModelsDefinition = {
19
17
  OPTIONS: [
20
- {
21
- value: "auto",
22
- label: "auto",
23
- description: "Auto",
24
- },
25
- {
26
- value: "composer-2-fast",
27
- label: "composer-2-fast",
28
- description: "Composer 2 Fast",
29
- },
30
- {
31
- value: "composer-2",
32
- label: "composer-2",
33
- description: "Composer 2",
34
- },
35
- {
36
- value: "gpt-5.3-codex-low",
37
- label: "gpt-5.3-codex-low",
38
- description: "Codex 5.3 Low",
39
- },
40
- {
41
- value: "gpt-5.3-codex-low-fast",
42
- label: "gpt-5.3-codex-low-fast",
43
- description: "Codex 5.3 Low Fast",
44
- },
45
- {
46
- value: "gpt-5.3-codex",
47
- label: "gpt-5.3-codex",
48
- description: "Codex 5.3",
49
- },
50
- {
51
- value: "gpt-5.3-codex-fast",
52
- label: "gpt-5.3-codex-fast",
53
- description: "Codex 5.3 Fast",
54
- },
55
- {
56
- value: "gpt-5.3-codex-high",
57
- label: "gpt-5.3-codex-high",
58
- description: "Codex 5.3 High",
59
- },
60
- {
61
- value: "gpt-5.3-codex-high-fast",
62
- label: "gpt-5.3-codex-high-fast",
63
- description: "Codex 5.3 High Fast",
64
- },
65
- {
66
- value: "gpt-5.3-codex-xhigh",
67
- label: "gpt-5.3-codex-xhigh",
68
- description: "Codex 5.3 Extra High",
69
- },
70
- {
71
- value: "gpt-5.3-codex-xhigh-fast",
72
- label: "gpt-5.3-codex-xhigh-fast",
73
- description: "Codex 5.3 Extra High Fast",
74
- },
75
- {
76
- value: "gpt-5.2",
77
- label: "gpt-5.2",
78
- description: "GPT-5.2",
79
- },
80
- {
81
- value: "gpt-5.2-codex-low",
82
- label: "gpt-5.2-codex-low",
83
- description: "Codex 5.2 Low",
84
- },
85
- {
86
- value: "gpt-5.2-codex-low-fast",
87
- label: "gpt-5.2-codex-low-fast",
88
- description: "Codex 5.2 Low Fast",
89
- },
90
- {
91
- value: "gpt-5.2-codex",
92
- label: "gpt-5.2-codex",
93
- description: "Codex 5.2",
94
- },
95
- {
96
- value: "gpt-5.2-codex-fast",
97
- label: "gpt-5.2-codex-fast",
98
- description: "Codex 5.2 Fast",
99
- },
100
- {
101
- value: "gpt-5.2-codex-high",
102
- label: "gpt-5.2-codex-high",
103
- description: "Codex 5.2 High",
104
- },
105
- {
106
- value: "gpt-5.2-codex-high-fast",
107
- label: "gpt-5.2-codex-high-fast",
108
- description: "Codex 5.2 High Fast",
109
- },
110
- {
111
- value: "gpt-5.2-codex-xhigh",
112
- label: "gpt-5.2-codex-xhigh",
113
- description: "Codex 5.2 Extra High",
114
- },
115
- {
116
- value: "gpt-5.2-codex-xhigh-fast",
117
- label: "gpt-5.2-codex-xhigh-fast",
118
- description: "Codex 5.2 Extra High Fast",
119
- },
120
- {
121
- value: "gpt-5.1-codex-max-low",
122
- label: "gpt-5.1-codex-max-low",
123
- description: "Codex 5.1 Max Low",
124
- },
125
- {
126
- value: "gpt-5.1-codex-max-low-fast",
127
- label: "gpt-5.1-codex-max-low-fast",
128
- description: "Codex 5.1 Max Low Fast",
129
- },
130
- {
131
- value: "gpt-5.1-codex-max-medium",
132
- label: "gpt-5.1-codex-max-medium",
133
- description: "Codex 5.1 Max",
134
- },
135
- {
136
- value: "gpt-5.1-codex-max-medium-fast",
137
- label: "gpt-5.1-codex-max-medium-fast",
138
- description: "Codex 5.1 Max Medium Fast",
139
- },
140
- {
141
- value: "gpt-5.1-codex-max-high",
142
- label: "gpt-5.1-codex-max-high",
143
- description: "Codex 5.1 Max High",
144
- },
145
- {
146
- value: "gpt-5.1-codex-max-high-fast",
147
- label: "gpt-5.1-codex-max-high-fast",
148
- description: "Codex 5.1 Max High Fast",
149
- },
150
- {
151
- value: "gpt-5.1-codex-max-xhigh",
152
- label: "gpt-5.1-codex-max-xhigh",
153
- description: "Codex 5.1 Max Extra High",
154
- },
155
- {
156
- value: "gpt-5.1-codex-max-xhigh-fast",
157
- label: "gpt-5.1-codex-max-xhigh-fast",
158
- description: "Codex 5.1 Max Extra High Fast",
159
- },
160
- {
161
- value: "composer-2.5",
162
- label: "composer-2.5",
163
- description: "Composer 2.5",
164
- },
165
- {
166
- value: "gpt-5.5-high",
167
- label: "gpt-5.5-high",
168
- description: "GPT-5.5 1M High",
169
- },
170
- {
171
- value: "gpt-5.5-high-fast",
172
- label: "gpt-5.5-high-fast",
173
- description: "GPT-5.5 High Fast",
174
- },
175
- {
176
- value: "claude-opus-4-7-thinking-high",
177
- label: "claude-opus-4-7-thinking-high",
178
- description: "Opus 4.7 1M High Thinking",
179
- },
180
- {
181
- value: "gpt-5.4-high",
182
- label: "gpt-5.4-high",
183
- description: "GPT-5.4 1M High",
184
- },
185
- {
186
- value: "gpt-5.4-high-fast",
187
- label: "gpt-5.4-high-fast",
188
- description: "GPT-5.4 High Fast",
189
- },
190
- {
191
- value: "claude-4.6-opus-high-thinking",
192
- label: "claude-4.6-opus-high-thinking",
193
- description: "Opus 4.6 1M Thinking",
194
- },
195
- {
196
- value: "claude-4.6-opus-high-thinking-fast",
197
- label: "claude-4.6-opus-high-thinking-fast",
198
- description: "Opus 4.6 1M Thinking Fast",
199
- },
200
- {
201
- value: "composer-2.5-fast",
202
- label: "composer-2.5-fast",
203
- description: "Composer 2.5 Fast",
204
- },
205
- {
206
- value: "gpt-5.5-none",
207
- label: "gpt-5.5-none",
208
- description: "GPT-5.5 1M None",
209
- },
210
- {
211
- value: "gpt-5.5-none-fast",
212
- label: "gpt-5.5-none-fast",
213
- description: "GPT-5.5 None Fast",
214
- },
215
- {
216
- value: "gpt-5.5-low",
217
- label: "gpt-5.5-low",
218
- description: "GPT-5.5 1M Low",
219
- },
220
- {
221
- value: "gpt-5.5-low-fast",
222
- label: "gpt-5.5-low-fast",
223
- description: "GPT-5.5 Low Fast",
224
- },
225
- {
226
- value: "gpt-5.5-medium",
227
- label: "gpt-5.5-medium",
228
- description: "GPT-5.5 1M",
229
- },
230
- {
231
- value: "gpt-5.5-medium-fast",
232
- label: "gpt-5.5-medium-fast",
233
- description: "GPT-5.5 Fast",
234
- },
235
- {
236
- value: "gpt-5.5-extra-high",
237
- label: "gpt-5.5-extra-high",
238
- description: "GPT-5.5 1M Extra High",
239
- },
240
- {
241
- value: "gpt-5.5-extra-high-fast",
242
- label: "gpt-5.5-extra-high-fast",
243
- description: "GPT-5.5 Extra High Fast",
244
- },
245
- {
246
- value: "claude-4.6-sonnet-medium",
247
- label: "claude-4.6-sonnet-medium",
248
- description: "Sonnet 4.6 1M",
249
- },
250
- {
251
- value: "claude-4.6-sonnet-medium-thinking",
252
- label: "claude-4.6-sonnet-medium-thinking",
253
- description: "Sonnet 4.6 1M Thinking",
254
- },
255
- {
256
- value: "claude-opus-4-7-low",
257
- label: "claude-opus-4-7-low",
258
- description: "Opus 4.7 1M Low",
259
- },
260
- {
261
- value: "claude-opus-4-7-low-fast",
262
- label: "claude-opus-4-7-low-fast",
263
- description: "Opus 4.7 1M Low Fast",
264
- },
265
- {
266
- value: "claude-opus-4-7-medium",
267
- label: "claude-opus-4-7-medium",
268
- description: "Opus 4.7 1M Medium",
269
- },
270
- {
271
- value: "claude-opus-4-7-medium-fast",
272
- label: "claude-opus-4-7-medium-fast",
273
- description: "Opus 4.7 1M Medium Fast",
274
- },
275
- {
276
- value: "claude-opus-4-7-high",
277
- label: "claude-opus-4-7-high",
278
- description: "Opus 4.7 1M High",
279
- },
280
- {
281
- value: "claude-opus-4-7-high-fast",
282
- label: "claude-opus-4-7-high-fast",
283
- description: "Opus 4.7 1M High Fast",
284
- },
285
- {
286
- value: "claude-opus-4-7-xhigh",
287
- label: "claude-opus-4-7-xhigh",
288
- description: "Opus 4.7 1M",
289
- },
290
- {
291
- value: "claude-opus-4-7-xhigh-fast",
292
- label: "claude-opus-4-7-xhigh-fast",
293
- description: "Opus 4.7 1M Fast",
294
- },
295
- {
296
- value: "claude-opus-4-7-max",
297
- label: "claude-opus-4-7-max",
298
- description: "Opus 4.7 1M Max",
299
- },
300
- {
301
- value: "claude-opus-4-7-max-fast",
302
- label: "claude-opus-4-7-max-fast",
303
- description: "Opus 4.7 1M Max Fast",
304
- },
305
- {
306
- value: "claude-opus-4-7-thinking-low",
307
- label: "claude-opus-4-7-thinking-low",
308
- description: "Opus 4.7 1M Low Thinking",
309
- },
310
- {
311
- value: "claude-opus-4-7-thinking-low-fast",
312
- label: "claude-opus-4-7-thinking-low-fast",
313
- description: "Opus 4.7 1M Low Thinking Fast",
314
- },
315
- {
316
- value: "claude-opus-4-7-thinking-medium",
317
- label: "claude-opus-4-7-thinking-medium",
318
- description: "Opus 4.7 1M Medium Thinking",
319
- },
320
- {
321
- value: "claude-opus-4-7-thinking-medium-fast",
322
- label: "claude-opus-4-7-thinking-medium-fast",
323
- description: "Opus 4.7 1M Medium Thinking Fast",
324
- },
325
- {
326
- value: "claude-opus-4-7-thinking-high-fast",
327
- label: "claude-opus-4-7-thinking-high-fast",
328
- description: "Opus 4.7 1M High Thinking Fast",
329
- },
330
- {
331
- value: "claude-opus-4-7-thinking-xhigh",
332
- label: "claude-opus-4-7-thinking-xhigh",
333
- description: "Opus 4.7 1M Thinking",
334
- },
335
- {
336
- value: "claude-opus-4-7-thinking-xhigh-fast",
337
- label: "claude-opus-4-7-thinking-xhigh-fast",
338
- description: "Opus 4.7 1M Thinking Fast",
339
- },
340
- {
341
- value: "claude-opus-4-7-thinking-max",
342
- label: "claude-opus-4-7-thinking-max",
343
- description: "Opus 4.7 1M Max Thinking",
344
- },
345
- {
346
- value: "claude-opus-4-7-thinking-max-fast",
347
- label: "claude-opus-4-7-thinking-max-fast",
348
- description: "Opus 4.7 1M Max Thinking Fast",
349
- },
350
- {
351
- value: "grok-build-0.1",
352
- label: "grok-build-0.1",
353
- description: "Grok Build 0.1 1M",
354
- },
355
- {
356
- value: "gpt-5.4-low",
357
- label: "gpt-5.4-low",
358
- description: "GPT-5.4 1M Low",
359
- },
360
- {
361
- value: "gpt-5.4-medium",
362
- label: "gpt-5.4-medium",
363
- description: "GPT-5.4 1M",
364
- },
365
- {
366
- value: "gpt-5.4-medium-fast",
367
- label: "gpt-5.4-medium-fast",
368
- description: "GPT-5.4 Fast",
369
- },
370
- {
371
- value: "gpt-5.4-xhigh",
372
- label: "gpt-5.4-xhigh",
373
- description: "GPT-5.4 1M Extra High",
374
- },
375
- {
376
- value: "gpt-5.4-xhigh-fast",
377
- label: "gpt-5.4-xhigh-fast",
378
- description: "GPT-5.4 Extra High Fast",
379
- },
380
- {
381
- value: "claude-4.6-opus-high",
382
- label: "claude-4.6-opus-high",
383
- description: "Opus 4.6 1M",
384
- },
385
- {
386
- value: "claude-4.6-opus-max",
387
- label: "claude-4.6-opus-max",
388
- description: "Opus 4.6 1M Max",
389
- },
390
- {
391
- value: "claude-4.6-opus-max-thinking",
392
- label: "claude-4.6-opus-max-thinking",
393
- description: "Opus 4.6 1M Max Thinking",
394
- },
395
- {
396
- value: "claude-4.6-opus-max-thinking-fast",
397
- label: "claude-4.6-opus-max-thinking-fast",
398
- description: "Opus 4.6 1M Max Thinking Fast",
399
- },
400
- {
401
- value: "claude-4.5-opus-high",
402
- label: "claude-4.5-opus-high",
403
- description: "Opus 4.5",
404
- },
405
- {
406
- value: "claude-4.5-opus-high-thinking",
407
- label: "claude-4.5-opus-high-thinking",
408
- description: "Opus 4.5 Thinking",
409
- },
410
- {
411
- value: "gpt-5.2-low",
412
- label: "gpt-5.2-low",
413
- description: "GPT-5.2 Low",
414
- },
415
- {
416
- value: "gpt-5.2-low-fast",
417
- label: "gpt-5.2-low-fast",
418
- description: "GPT-5.2 Low Fast",
419
- },
420
- {
421
- value: "gpt-5.2-fast",
422
- label: "gpt-5.2-fast",
423
- description: "GPT-5.2 Fast",
424
- },
425
- {
426
- value: "gpt-5.2-high",
427
- label: "gpt-5.2-high",
428
- description: "GPT-5.2 High",
429
- },
430
- {
431
- value: "gpt-5.2-high-fast",
432
- label: "gpt-5.2-high-fast",
433
- description: "GPT-5.2 High Fast",
434
- },
435
- {
436
- value: "gpt-5.2-xhigh",
437
- label: "gpt-5.2-xhigh",
438
- description: "GPT-5.2 Extra High",
439
- },
440
- {
441
- value: "gpt-5.2-xhigh-fast",
442
- label: "gpt-5.2-xhigh-fast",
443
- description: "GPT-5.2 Extra High Fast",
444
- },
445
- {
446
- value: "gpt-5.4-mini-none",
447
- label: "gpt-5.4-mini-none",
448
- description: "GPT-5.4 Mini None",
449
- },
450
- {
451
- value: "gpt-5.4-mini-low",
452
- label: "gpt-5.4-mini-low",
453
- description: "GPT-5.4 Mini Low",
454
- },
455
- {
456
- value: "gpt-5.4-mini-medium",
457
- label: "gpt-5.4-mini-medium",
458
- description: "GPT-5.4 Mini",
459
- },
460
- {
461
- value: "gpt-5.4-mini-high",
462
- label: "gpt-5.4-mini-high",
463
- description: "GPT-5.4 Mini High",
464
- },
465
- {
466
- value: "gpt-5.4-mini-xhigh",
467
- label: "gpt-5.4-mini-xhigh",
468
- description: "GPT-5.4 Mini Extra High",
469
- },
470
- {
471
- value: "gpt-5.4-nano-none",
472
- label: "gpt-5.4-nano-none",
473
- description: "GPT-5.4 Nano None",
474
- },
475
- {
476
- value: "gpt-5.4-nano-low",
477
- label: "gpt-5.4-nano-low",
478
- description: "GPT-5.4 Nano Low",
479
- },
480
- {
481
- value: "gpt-5.4-nano-medium",
482
- label: "gpt-5.4-nano-medium",
483
- description: "GPT-5.4 Nano",
484
- },
485
- {
486
- value: "gpt-5.4-nano-high",
487
- label: "gpt-5.4-nano-high",
488
- description: "GPT-5.4 Nano High",
489
- },
490
- {
491
- value: "gpt-5.4-nano-xhigh",
492
- label: "gpt-5.4-nano-xhigh",
493
- description: "GPT-5.4 Nano Extra High",
494
- },
495
- {
496
- value: "grok-4.3",
497
- label: "grok-4.3",
498
- description: "Grok 4.3 1M",
499
- },
500
- {
501
- value: "claude-4.5-sonnet",
502
- label: "claude-4.5-sonnet",
503
- description: "Sonnet 4.5",
504
- },
505
- {
506
- value: "claude-4.5-sonnet-thinking",
507
- label: "claude-4.5-sonnet-thinking",
508
- description: "Sonnet 4.5 Thinking",
509
- },
510
- {
511
- value: "gpt-5.1-low",
512
- label: "gpt-5.1-low",
513
- description: "GPT-5.1 Low",
514
- },
515
- {
516
- value: "gpt-5.1",
517
- label: "gpt-5.1",
518
- description: "GPT-5.1",
519
- },
520
- {
521
- value: "gpt-5.1-high",
522
- label: "gpt-5.1-high",
523
- description: "GPT-5.1 High",
524
- },
525
- {
526
- value: "gpt-5.1-codex-mini-low",
527
- label: "gpt-5.1-codex-mini-low",
528
- description: "Codex 5.1 Mini Low",
529
- },
530
- {
531
- value: "gpt-5.1-codex-mini",
532
- label: "gpt-5.1-codex-mini",
533
- description: "Codex 5.1 Mini",
534
- },
535
- {
536
- value: "gpt-5.1-codex-mini-high",
537
- label: "gpt-5.1-codex-mini-high",
538
- description: "Codex 5.1 Mini High",
539
- },
540
- {
541
- value: "claude-4-sonnet",
542
- label: "claude-4-sonnet",
543
- description: "Sonnet 4",
544
- },
545
- {
546
- value: "claude-4-sonnet-thinking",
547
- label: "claude-4-sonnet-thinking",
548
- description: "Sonnet 4 Thinking",
549
- },
550
- {
551
- value: "gpt-5-mini",
552
- label: "gpt-5-mini",
553
- description: "GPT-5 Mini",
554
- },
555
- {
556
- value: "kimi-k2.5",
557
- label: "kimi-k2.5",
558
- description: "Kimi K2.5",
559
- },
18
+ { value: 'auto', label: 'Auto', description: 'Let Cursor choose the model.' },
19
+ {
20
+ value: 'composer-2.5-fast',
21
+ label: 'Composer 2.5 Fast',
22
+ description: 'Cursor Composer 2.5 with faster inference.',
23
+ },
24
+ {
25
+ value: 'composer-2.5',
26
+ label: 'Composer 2.5',
27
+ description: 'Cursor model for efficient, long-running coding tasks.',
28
+ },
29
+ { value: 'gpt-5.6-sol', label: 'GPT-5.6 Sol' },
30
+ { value: 'gpt-5.6-terra', label: 'GPT-5.6 Terra' },
31
+ { value: 'gpt-5.6-luna', label: 'GPT-5.6 Luna' },
32
+ { value: 'gpt-5.5', label: 'GPT-5.5' },
33
+ { value: 'claude-fable-5', label: 'Claude Fable 5' },
34
+ { value: 'claude-opus-5', label: 'Claude Opus 5' },
35
+ { value: 'claude-opus-4-8', label: 'Claude Opus 4.8' },
36
+ { value: 'claude-sonnet-5', label: 'Claude Sonnet 5' },
37
+ { value: 'grok-4.5', label: 'Grok 4.5' },
38
+ { value: 'gemini-3.1-pro', label: 'Gemini 3.1 Pro' },
39
+ { value: 'kimi-k2.5', label: 'Kimi K2.5' },
560
40
  ],
561
- DEFAULT: "composer-2.5-fast",
41
+ DEFAULT: 'auto',
562
42
  };
563
43
 
564
- type CursorModelRow = {
565
- name: string;
566
- description: string;
567
- current: boolean;
568
- default: boolean;
569
- };
570
-
571
- const CURSOR_MODELS_TIMEOUT_MS = 10_000;
572
44
  const CURSOR_CHATS_ROOT = path.join(os.homedir(), '.cursor', 'chats');
573
- // cross-spawn resolves .cmd shims/PATHEXT on Windows and delegates to
574
- // child_process.spawn everywhere else.
575
- const spawnFunction = crossSpawn;
576
- const ANSI_PATTERN = new RegExp(
577
- // eslint-disable-next-line no-control-regex
578
- '[\\u001B\\u009B][[\\]()#;?]*(?:'
579
- + '(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]'
580
- + '|(?:[\\dA-PR-TZcf-ntqry=><~]))',
581
- 'g',
582
- );
583
-
584
- const stripAnsi = (value: string): string => value.replace(ANSI_PATTERN, '');
585
-
586
- const parseModelLine = (line: string): CursorModelRow | null => {
587
- const trimmed = line.trim();
588
-
589
- if (
590
- !trimmed
591
- || trimmed === 'Available models'
592
- || trimmed.startsWith('Loading models')
593
- || trimmed.startsWith('Tip:')
594
- ) {
595
- return null;
596
- }
597
-
598
- const match = trimmed.match(/^(.+?)\s+-\s+(.+)$/);
599
- if (!match) {
600
- return null;
601
- }
602
-
603
- const name = match[1].trim();
604
- let description = match[2].trim();
605
- const current = /\(current\)/i.test(description);
606
- const defaultModel = /\(default\)/i.test(description);
607
-
608
- description = description.replace(/\s*\((current|default)\)/gi, '').replace(/\s{2,}/g, ' ').trim();
609
-
610
- return {
611
- name,
612
- description,
613
- current,
614
- default: defaultModel,
615
- };
616
- };
617
-
618
- const parseModelsOutput = (text: string): CursorModelRow[] => {
619
- const models: CursorModelRow[] = [];
620
-
621
- for (const line of stripAnsi(text).split(/\r?\n/)) {
622
- const parsed = parseModelLine(line);
623
- if (parsed) {
624
- models.push(parsed);
625
- }
626
- }
627
-
628
- return models;
629
- };
630
-
631
- const runCursorListModels = (): Promise<string> => new Promise((resolve, reject) => {
632
- const cursorProcess = spawnFunction('cursor-agent', ['--list-models'], {
633
- env: { ...process.env },
634
- });
635
-
636
- let stdout = '';
637
- let stderr = '';
638
- let settled = false;
639
-
640
- const timer = setTimeout(() => {
641
- cursorProcess.kill('SIGTERM');
642
- if (!settled) {
643
- settled = true;
644
- reject(new Error('cursor-agent --list-models timed out'));
645
- }
646
- }, CURSOR_MODELS_TIMEOUT_MS);
647
-
648
- const finish = (error: Error | null, output: string) => {
649
- if (settled) {
650
- return;
651
- }
652
-
653
- settled = true;
654
- clearTimeout(timer);
655
-
656
- if (error) {
657
- reject(error);
658
- return;
659
- }
660
-
661
- resolve(output);
662
- };
663
-
664
- cursorProcess.stdout?.on('data', (chunk: Buffer) => {
665
- stdout += chunk.toString();
666
- });
667
-
668
- cursorProcess.stderr?.on('data', (chunk: Buffer) => {
669
- stderr += chunk.toString();
670
- });
671
-
672
- cursorProcess.on('error', (error) => {
673
- finish(error instanceof Error ? error : new Error(String(error)), '');
674
- });
675
-
676
- cursorProcess.on('close', (code) => {
677
- if (code !== 0) {
678
- finish(new Error(stderr.trim() || `cursor-agent --list-models exited with code ${code}`), '');
679
- return;
680
- }
681
-
682
- finish(null, stdout);
683
- });
684
- });
685
-
686
- const buildCursorModelsDefinition = (models: CursorModelRow[]): ProviderModelsDefinition => {
687
- const options: ProviderModelOption[] = [];
688
- const seenValues = new Set<string>();
689
-
690
- for (const model of models) {
691
- if (seenValues.has(model.name)) {
692
- continue;
693
- }
694
-
695
- seenValues.add(model.name);
696
- options.push({
697
- value: model.name,
698
- label: model.name,
699
- description: model.description || undefined,
700
- });
701
- }
702
-
703
- if (options.length === 0) {
704
- return CURSOR_FALLBACK_MODELS;
705
- }
706
-
707
- const defaultValue = models.find((model) => model.default)?.name
708
- ?? models.find((model) => model.current)?.name
709
- ?? options[0]?.value
710
- ?? CURSOR_FALLBACK_MODELS.DEFAULT;
711
-
712
- return {
713
- OPTIONS: options,
714
- DEFAULT: defaultValue,
715
- };
716
- };
717
45
 
718
46
  const resolveCursorSessionStorePath = async (sessionId: string): Promise<string | null> => {
719
47
  const safeSessionId = sanitizeLeafDirectoryName(sessionId, 'cursor session id');
@@ -740,26 +68,21 @@ const resolveCursorSessionStorePath = async (sessionId: string): Promise<string
740
68
  return null;
741
69
  };
742
70
 
71
+ /** Provider registry model adapter for Cursor predefined models and session metadata. */
743
72
  export class CursorProviderModels implements IProviderModels {
744
73
  async getSupportedModels(): Promise<ProviderModelsDefinition> {
745
- try {
746
- const stdout = await runCursorListModels();
747
- const models = parseModelsOutput(stdout);
748
- return buildCursorModelsDefinition(models);
749
- } catch {
750
- return CURSOR_FALLBACK_MODELS;
751
- }
74
+ return CURSOR_PREDEFINED_MODELS;
752
75
  }
753
76
 
754
77
  async getCurrentActiveModel(sessionId?: string): Promise<ProviderCurrentActiveModel> {
755
78
  if (!sessionId?.trim()) {
756
- return buildDefaultProviderCurrentActiveModel(await this.getSupportedModels());
79
+ return buildDefaultProviderCurrentActiveModel(CURSOR_PREDEFINED_MODELS);
757
80
  }
758
81
 
759
82
  try {
760
83
  const storeDbPath = await resolveCursorSessionStorePath(sessionId);
761
84
  if (!storeDbPath) {
762
- return buildDefaultProviderCurrentActiveModel(await this.getSupportedModels());
85
+ return buildDefaultProviderCurrentActiveModel(CURSOR_PREDEFINED_MODELS);
763
86
  }
764
87
 
765
88
  const { default: Database } = await import('better-sqlite3');
@@ -775,7 +98,7 @@ export class CursorProviderModels implements IProviderModels {
775
98
  ? Buffer.from(row.value.trim(), 'hex').toString('utf8')
776
99
  : '';
777
100
  if (!metadataText) {
778
- return buildDefaultProviderCurrentActiveModel(await this.getSupportedModels());
101
+ return buildDefaultProviderCurrentActiveModel(CURSOR_PREDEFINED_MODELS);
779
102
  }
780
103
 
781
104
  const metadata = JSON.parse(metadataText) as { lastUsedModel?: string };
@@ -788,10 +111,9 @@ export class CursorProviderModels implements IProviderModels {
788
111
  db.close();
789
112
  }
790
113
  } catch {
791
- // Fall through to the provider default when Cursor metadata cannot be read.
114
+ // Fall through to the curated default when Cursor metadata cannot be read.
792
115
  }
793
116
 
794
- return buildDefaultProviderCurrentActiveModel(await this.getSupportedModels());
117
+ return buildDefaultProviderCurrentActiveModel(CURSOR_PREDEFINED_MODELS);
795
118
  }
796
119
  }
797
-