@glwhappen/web-code 1.32.9 → 1.32.10

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