@golba98/codexa 1.0.1 → 1.0.3

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 (234) hide show
  1. package/README.md +391 -94
  2. package/package.json +14 -8
  3. package/src/app.tsx +196 -63
  4. package/src/commands/handler.ts +9 -4
  5. package/src/config/buildInfo.ts +3 -0
  6. package/src/config/launchArgs.ts +10 -0
  7. package/src/config/layeredConfig.ts +0 -0
  8. package/src/config/persistence.ts +51 -0
  9. package/src/config/runtimeConfig.ts +4 -0
  10. package/src/config/settings.ts +6 -13
  11. package/src/config/toml-serialize.ts +0 -0
  12. package/src/config/trustStore.ts +0 -0
  13. package/src/config/updateCheckCache.ts +63 -0
  14. package/src/core/attachments.ts +0 -0
  15. package/src/core/auth/codexAuth.ts +0 -0
  16. package/src/core/channel.ts +23 -0
  17. package/src/core/cleanupFastFail.ts +0 -0
  18. package/src/core/clipboard.ts +0 -0
  19. package/src/core/codex.ts +0 -0
  20. package/src/core/codexExecArgs.ts +0 -0
  21. package/src/core/codexLaunch.ts +0 -0
  22. package/src/core/codexPrompt.ts +0 -0
  23. package/src/core/executables/claudeExecutable.ts +0 -0
  24. package/src/core/executables/codexExecutable.ts +1 -0
  25. package/src/core/executables/executableResolver.ts +61 -43
  26. package/src/core/executables/geminiExecutable.ts +0 -0
  27. package/src/core/githubDiagnostics.ts +0 -0
  28. package/src/core/hollowResponseFormat.ts +0 -0
  29. package/src/core/inputDebug.ts +0 -0
  30. package/src/core/launchContext.ts +33 -33
  31. package/src/core/models/codexCapabilities.ts +0 -0
  32. package/src/core/models/codexModelCapabilities.ts +0 -0
  33. package/src/core/models/modelSpecs.ts +0 -0
  34. package/src/core/perf/profiler.ts +0 -0
  35. package/src/core/perf/renderDebug.ts +0 -0
  36. package/src/core/planStorage.ts +0 -0
  37. package/src/core/process/CommandRunner.ts +0 -0
  38. package/src/core/process/processValidation.ts +9 -5
  39. package/src/core/projectInstructions.ts +0 -0
  40. package/src/core/providerLauncher/launcher.ts +59 -42
  41. package/src/core/providerLauncher/registry.ts +0 -0
  42. package/src/core/providerLauncher/types.ts +0 -0
  43. package/src/core/providerLauncher/workspaceConfig.ts +0 -0
  44. package/src/core/providerRuntime/anthropic.ts +0 -0
  45. package/src/core/providerRuntime/capabilityProfile.ts +0 -0
  46. package/src/core/providerRuntime/claudeCodeDiscovery.ts +0 -0
  47. package/src/core/providerRuntime/contextMetadata.ts +0 -0
  48. package/src/core/providerRuntime/gemini.ts +0 -0
  49. package/src/core/providerRuntime/lmstudio.ts +0 -0
  50. package/src/core/providerRuntime/local.ts +0 -0
  51. package/src/core/providerRuntime/models.ts +0 -0
  52. package/src/core/providerRuntime/reasoning.ts +0 -0
  53. package/src/core/providerRuntime/registry.ts +0 -0
  54. package/src/core/providerRuntime/types.ts +0 -0
  55. package/src/core/providers/codexJsonStream.ts +0 -0
  56. package/src/core/providers/codexSubprocess.ts +0 -0
  57. package/src/core/providers/codexTranscript.ts +0 -0
  58. package/src/core/providers/openaiNative.ts +0 -0
  59. package/src/core/providers/registry.ts +0 -0
  60. package/src/core/providers/types.ts +0 -0
  61. package/src/core/terminal/startupClear.ts +20 -0
  62. package/src/core/terminal/terminalCapabilities.ts +0 -0
  63. package/src/core/terminal/terminalControl.ts +0 -0
  64. package/src/core/terminal/terminalSanitize.ts +0 -0
  65. package/src/core/terminal/terminalSelection.ts +0 -0
  66. package/src/core/terminal/terminalTitle.ts +0 -0
  67. package/src/core/updateCheck.ts +188 -0
  68. package/src/core/workspaceActivity.ts +0 -0
  69. package/src/core/workspaceGuard.ts +0 -0
  70. package/src/core/workspaceRoot.ts +0 -0
  71. package/src/exec.ts +0 -0
  72. package/src/headless/execArgs.ts +1 -0
  73. package/src/headless/execRunner.ts +0 -0
  74. package/src/index.tsx +13 -9
  75. package/src/session/appSession.ts +0 -0
  76. package/src/session/chatLifecycle.ts +0 -0
  77. package/src/session/liveRenderScheduler.ts +0 -0
  78. package/src/session/planFlow.ts +0 -0
  79. package/src/session/planTranscript.ts +0 -0
  80. package/src/session/promptRunSchedule.ts +0 -0
  81. package/src/session/types.ts +2 -1
  82. package/src/test/runtimeTestUtils.ts +0 -0
  83. package/src/types/react-dom.d.ts +0 -0
  84. package/src/ui/ActionRequiredBlock.tsx +5 -5
  85. package/src/ui/ActivityBars.tsx +3 -3
  86. package/src/ui/ActivityIndicator.tsx +6 -6
  87. package/src/ui/AgentBlock.tsx +6 -6
  88. package/src/ui/AnimatedStatusText.tsx +1 -1
  89. package/src/ui/AppShell.tsx +13 -5
  90. package/src/ui/AttachmentImportPanel.tsx +8 -8
  91. package/src/ui/AuthPanel.tsx +20 -20
  92. package/src/ui/BackendPicker.tsx +0 -0
  93. package/src/ui/BottomComposer.tsx +117 -78
  94. package/src/ui/DashCard.tsx +3 -3
  95. package/src/ui/Markdown.tsx +17 -17
  96. package/src/ui/ModePicker.tsx +0 -0
  97. package/src/ui/ModelPicker.tsx +0 -0
  98. package/src/ui/ModelPickerScreen.tsx +10 -10
  99. package/src/ui/ModelReasoningPicker.tsx +14 -14
  100. package/src/ui/Panel.tsx +3 -3
  101. package/src/ui/PermissionsPanel.tsx +0 -0
  102. package/src/ui/PlanActionPicker.tsx +6 -6
  103. package/src/ui/PlanReviewPanel.tsx +8 -8
  104. package/src/ui/ProviderPicker.tsx +18 -18
  105. package/src/ui/ReasoningPicker.tsx +0 -0
  106. package/src/ui/RunFooter.tsx +3 -3
  107. package/src/ui/SelectionPanel.tsx +4 -4
  108. package/src/ui/SettingsPanel.tsx +8 -8
  109. package/src/ui/Spinner.tsx +1 -1
  110. package/src/ui/StaticIntroItem.tsx +0 -0
  111. package/src/ui/StaticTranscriptItem.tsx +0 -0
  112. package/src/ui/TextEntryPanel.tsx +10 -10
  113. package/src/ui/ThemePicker.tsx +0 -0
  114. package/src/ui/ThinkingBlock.tsx +8 -8
  115. package/src/ui/Timeline.tsx +21 -17
  116. package/src/ui/TopHeader.tsx +421 -257
  117. package/src/ui/TurnGroup.tsx +31 -31
  118. package/src/ui/UpdateAvailableCard.tsx +41 -0
  119. package/src/ui/UpdatePromptPanel.tsx +203 -0
  120. package/src/ui/busyStatusAnimation.ts +0 -0
  121. package/src/ui/commandNormalize.ts +0 -0
  122. package/src/ui/diffRenderer.ts +0 -0
  123. package/src/ui/focus.ts +3 -0
  124. package/src/ui/inputBuffer.ts +0 -0
  125. package/src/ui/layout.ts +1 -1
  126. package/src/ui/logoVariants.ts +107 -0
  127. package/src/ui/modeDisplay.ts +12 -12
  128. package/src/ui/outputPipeline.ts +0 -0
  129. package/src/ui/progressEntries.ts +0 -0
  130. package/src/ui/runActivityView.ts +0 -0
  131. package/src/ui/runtimeDisplay.ts +100 -0
  132. package/src/ui/slashCommands.ts +0 -0
  133. package/src/ui/terminalAnswerFormat.ts +0 -0
  134. package/src/ui/textLayout.ts +0 -0
  135. package/src/ui/theme.tsx +274 -395
  136. package/src/ui/themeFlow.ts +0 -0
  137. package/src/ui/timelineMeasure.ts +29 -19
  138. package/src/ui/useThrottledValue.ts +0 -0
  139. package/scripts/audit-codexa-capabilities.mjs +0 -466
  140. package/scripts/smoke-terminal-bench.mjs +0 -35
  141. package/src/appRenderStability.test.ts +0 -131
  142. package/src/commands/handler.test.ts +0 -643
  143. package/src/config/launchArgs.test.ts +0 -158
  144. package/src/config/layeredConfig.test.ts +0 -143
  145. package/src/config/persistence.test.ts +0 -110
  146. package/src/config/runtimeConfig.test.ts +0 -218
  147. package/src/config/settings.test.ts +0 -155
  148. package/src/config/trustStore.test.ts +0 -29
  149. package/src/core/attachments.test.ts +0 -155
  150. package/src/core/auth/codexAuth.test.ts +0 -68
  151. package/src/core/cleanupFastFail.test.ts +0 -76
  152. package/src/core/codexExecArgs.test.ts +0 -195
  153. package/src/core/codexLaunch.test.ts +0 -205
  154. package/src/core/codexPrompt.test.ts +0 -252
  155. package/src/core/executables/codexExecutable.test.ts +0 -212
  156. package/src/core/executables/executableResolver.test.ts +0 -129
  157. package/src/core/executables/geminiExecutable.test.ts +0 -116
  158. package/src/core/executables/pathSanityScan.test.ts +0 -47
  159. package/src/core/githubDiagnostics.test.ts +0 -92
  160. package/src/core/hollowResponseFormat.test.ts +0 -58
  161. package/src/core/launchContext.test.ts +0 -157
  162. package/src/core/models/codexCapabilities.test.ts +0 -45
  163. package/src/core/models/codexModelCapabilities.test.ts +0 -246
  164. package/src/core/models/modelSpecs.test.ts +0 -283
  165. package/src/core/perf/renderDebug.test.ts +0 -230
  166. package/src/core/planStorage.test.ts +0 -143
  167. package/src/core/process/CommandRunner.test.ts +0 -105
  168. package/src/core/projectInstructions.test.ts +0 -50
  169. package/src/core/providerLauncher/launcher.test.ts +0 -238
  170. package/src/core/providerLauncher/registry.test.ts +0 -324
  171. package/src/core/providerLauncher/workspaceConfig.test.ts +0 -638
  172. package/src/core/providerRuntime/anthropic.test.ts +0 -1120
  173. package/src/core/providerRuntime/capabilityProfile.test.ts +0 -311
  174. package/src/core/providerRuntime/contextMetadata.test.ts +0 -468
  175. package/src/core/providerRuntime/gemini.test.ts +0 -437
  176. package/src/core/providerRuntime/lmstudio.test.ts +0 -168
  177. package/src/core/providerRuntime/local.test.ts +0 -787
  178. package/src/core/providerRuntime/registry.test.ts +0 -233
  179. package/src/core/providers/codexJsonStream.test.ts +0 -148
  180. package/src/core/providers/codexSubprocess.test.ts +0 -68
  181. package/src/core/providers/codexTranscript.test.ts +0 -284
  182. package/src/core/terminal/terminalCapabilities.test.ts +0 -93
  183. package/src/core/terminal/terminalControl.test.ts +0 -75
  184. package/src/core/terminal/terminalSanitize.test.ts +0 -22
  185. package/src/core/terminal/terminalSelection.test.ts +0 -42
  186. package/src/core/terminal/terminalTitle.test.ts +0 -328
  187. package/src/core/workspaceActivity.test.ts +0 -163
  188. package/src/core/workspaceGuard.test.ts +0 -151
  189. package/src/core/workspaceRoot.test.ts +0 -23
  190. package/src/exec.test.ts +0 -13
  191. package/src/headless/execArgs.test.ts +0 -147
  192. package/src/headless/execRunner.test.ts +0 -434
  193. package/src/index.test.tsx +0 -618
  194. package/src/session/appSession.test.ts +0 -897
  195. package/src/session/chatLifecycle.test.ts +0 -64
  196. package/src/session/liveRenderScheduler.test.ts +0 -201
  197. package/src/session/planFlow.test.ts +0 -103
  198. package/src/session/planTranscript.test.ts +0 -65
  199. package/src/session/promptRunSchedule.test.ts +0 -36
  200. package/src/ui/ActivityIndicator.test.tsx +0 -58
  201. package/src/ui/AgentBlock.test.ts +0 -6
  202. package/src/ui/AnimatedStatusText.test.ts +0 -16
  203. package/src/ui/AppShell.test.tsx +0 -1739
  204. package/src/ui/AttachmentImportPanel.test.tsx +0 -204
  205. package/src/ui/BottomComposer.test.ts +0 -674
  206. package/src/ui/CodexLogo.tsx +0 -55
  207. package/src/ui/Markdown.test.ts +0 -157
  208. package/src/ui/ModelPickerProviderScope.test.tsx +0 -411
  209. package/src/ui/ModelPickerScreen.test.tsx +0 -99
  210. package/src/ui/ModelPickerState.test.tsx +0 -151
  211. package/src/ui/ModelReasoningPicker.test.tsx +0 -447
  212. package/src/ui/PlanReviewPanel.test.tsx +0 -267
  213. package/src/ui/PromptCardBorder.test.tsx +0 -161
  214. package/src/ui/ProviderPicker.test.tsx +0 -289
  215. package/src/ui/ProviderShortcut.test.tsx +0 -143
  216. package/src/ui/SettingsPanel.test.tsx +0 -233
  217. package/src/ui/Timeline.test.ts +0 -2067
  218. package/src/ui/TimelineNavigation.test.tsx +0 -201
  219. package/src/ui/TopHeader.test.tsx +0 -239
  220. package/src/ui/TurnGroup.test.tsx +0 -365
  221. package/src/ui/busyStatusAnimation.test.ts +0 -30
  222. package/src/ui/commandNormalize.test.ts +0 -142
  223. package/src/ui/diffRenderer.test.ts +0 -102
  224. package/src/ui/focusFlow.test.tsx +0 -1098
  225. package/src/ui/inputBuffer.test.ts +0 -151
  226. package/src/ui/layout.test.ts +0 -145
  227. package/src/ui/modeDisplay.test.ts +0 -42
  228. package/src/ui/runActivityView.test.ts +0 -89
  229. package/src/ui/runLifecycleView.test.tsx +0 -237
  230. package/src/ui/statusRenderIsolation.test.tsx +0 -654
  231. package/src/ui/terminalAnswerFormat.test.ts +0 -19
  232. package/src/ui/textLayout.test.ts +0 -18
  233. package/src/ui/themeFlow.test.ts +0 -53
  234. package/src/ui/timelineMeasureCache.test.ts +0 -986
@@ -1,311 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import test from "node:test";
3
- import {
4
- clearModelCapabilityProfileCache,
5
- resolveModelCapabilityProfileCached,
6
- } from "./capabilityProfile.js";
7
-
8
- test("raw API supports_system_prompt: false sets supportsSystemPrompt false with api/verified", () => {
9
- clearModelCapabilityProfileCache();
10
- const profile = resolveModelCapabilityProfileCached({
11
- providerId: "local",
12
- modelId: "test-model",
13
- rawMetadata: {
14
- id: "test-model",
15
- supports_system_prompt: false,
16
- },
17
- });
18
-
19
- assert.equal(profile.supportsSystemPrompt, false);
20
- assert.equal(profile.source, "api");
21
- assert.equal(profile.confidence, "verified");
22
- });
23
-
24
- test("raw API supportsStreaming: true (camelCase) is detected", () => {
25
- clearModelCapabilityProfileCache();
26
- const profile = resolveModelCapabilityProfileCached({
27
- providerId: "local",
28
- modelId: "test-model",
29
- rawMetadata: {
30
- id: "test-model",
31
- supportsStreaming: true,
32
- },
33
- });
34
-
35
- assert.equal(profile.supportsStreaming, true);
36
- assert.equal(profile.source, "api");
37
- });
38
-
39
- test("nested model_info.supports_tool_calls is detected", () => {
40
- clearModelCapabilityProfileCache();
41
- const profile = resolveModelCapabilityProfileCached({
42
- providerId: "local",
43
- modelId: "test-model",
44
- rawMetadata: {
45
- id: "test-model",
46
- model_info: {
47
- supports_tool_calls: true,
48
- max_output_tokens: 2048,
49
- },
50
- },
51
- });
52
-
53
- assert.equal(profile.supportsToolCalls, true);
54
- assert.equal(profile.maxOutputTokens, 2048);
55
- assert.equal(profile.source, "api");
56
- });
57
-
58
- test("raw API with no capability fields returns all-null profile with unknown source", () => {
59
- clearModelCapabilityProfileCache();
60
- const profile = resolveModelCapabilityProfileCached({
61
- providerId: "local",
62
- modelId: "no-caps-model",
63
- rawMetadata: {
64
- id: "no-caps-model",
65
- object: "model",
66
- },
67
- });
68
-
69
- assert.equal(profile.supportsSystemPrompt, null);
70
- assert.equal(profile.supportsStreaming, null);
71
- assert.equal(profile.supportsToolCalls, null);
72
- assert.equal(profile.maxOutputTokens, null);
73
- assert.equal(profile.source, "unknown");
74
- assert.equal(profile.confidence, "unknown");
75
- });
76
-
77
- test("config override supportsSystemPrompt: false applies when no raw metadata", () => {
78
- clearModelCapabilityProfileCache();
79
- const profile = resolveModelCapabilityProfileCached({
80
- providerId: "local",
81
- modelId: "config-model",
82
- providerConfig: {
83
- models: {
84
- "config-model": {
85
- supportsSystemPrompt: false,
86
- supportsStreaming: true,
87
- },
88
- },
89
- },
90
- });
91
-
92
- assert.equal(profile.supportsSystemPrompt, false);
93
- assert.equal(profile.supportsStreaming, true);
94
- assert.equal(profile.source, "config");
95
- assert.equal(profile.confidence, "configured");
96
- });
97
-
98
- test("config override rejects non-boolean string values", () => {
99
- clearModelCapabilityProfileCache();
100
- const profile = resolveModelCapabilityProfileCached({
101
- providerId: "local",
102
- modelId: "bad-model",
103
- providerConfig: {
104
- models: {
105
- "bad-model": {
106
- // TypeScript would reject these, but test that runtime parsing rejects them too
107
- supportsStreaming: "true" as unknown as boolean,
108
- },
109
- },
110
- },
111
- });
112
-
113
- // A string "true" is not a boolean — should fall through to unknown
114
- assert.equal(profile.supportsStreaming, null);
115
- assert.equal(profile.source, "unknown");
116
- });
117
-
118
- test("config override maxOutputTokens: 4096 applies; negative is rejected", () => {
119
- clearModelCapabilityProfileCache();
120
- const validProfile = resolveModelCapabilityProfileCached({
121
- providerId: "local",
122
- modelId: "model-a",
123
- providerConfig: {
124
- models: {
125
- "model-a": { maxOutputTokens: 4096 },
126
- },
127
- },
128
- });
129
-
130
- assert.equal(validProfile.maxOutputTokens, 4096);
131
- assert.equal(validProfile.source, "config");
132
-
133
- clearModelCapabilityProfileCache();
134
- const invalidProfile = resolveModelCapabilityProfileCached({
135
- providerId: "local",
136
- modelId: "model-b",
137
- providerConfig: {
138
- models: {
139
- "model-b": { maxOutputTokens: -1 },
140
- },
141
- },
142
- });
143
-
144
- assert.equal(invalidProfile.maxOutputTokens, null);
145
- assert.equal(invalidProfile.source, "unknown");
146
- });
147
-
148
- test("known registry is initially empty — all models return unknown without raw/config", () => {
149
- clearModelCapabilityProfileCache();
150
- const profile = resolveModelCapabilityProfileCached({
151
- providerId: "google",
152
- modelId: "gemini-2.5-pro",
153
- });
154
-
155
- assert.equal(profile.source, "unknown");
156
- assert.equal(profile.supportsStreaming, null);
157
- assert.equal(profile.supportsToolCalls, null);
158
- });
159
-
160
- test("raw API for non-local providers returns unknown (only local queries /v1/models)", () => {
161
- clearModelCapabilityProfileCache();
162
- const profile = resolveModelCapabilityProfileCached({
163
- providerId: "anthropic",
164
- modelId: "claude-sonnet-4-6",
165
- rawMetadata: {
166
- id: "claude-sonnet-4-6",
167
- supports_streaming: true,
168
- },
169
- });
170
-
171
- // Non-local providers don't scan raw metadata
172
- assert.equal(profile.source, "unknown");
173
- assert.equal(profile.supportsStreaming, null);
174
- });
175
-
176
- test("capability cache is upgraded from unknown when raw API metadata arrives", () => {
177
- clearModelCapabilityProfileCache();
178
-
179
- const first = resolveModelCapabilityProfileCached({
180
- providerId: "local",
181
- modelId: "upgrade-model",
182
- });
183
-
184
- const second = resolveModelCapabilityProfileCached({
185
- providerId: "local",
186
- modelId: "upgrade-model",
187
- rawMetadata: {
188
- id: "upgrade-model",
189
- supports_tool_calls: false,
190
- },
191
- });
192
-
193
- const third = resolveModelCapabilityProfileCached({
194
- providerId: "local",
195
- modelId: "upgrade-model",
196
- });
197
-
198
- assert.equal(first.source, "unknown");
199
- assert.equal(first.supportsToolCalls, null);
200
- assert.equal(second.source, "api");
201
- assert.equal(second.supportsToolCalls, false);
202
- // Third call hits the upgraded cache
203
- assert.equal(third.source, "api");
204
- assert.equal(third.supportsToolCalls, false);
205
- });
206
-
207
- test("clearModelCapabilityProfileCache resets all cached profiles", () => {
208
- const profile1 = resolveModelCapabilityProfileCached({
209
- providerId: "local",
210
- modelId: "clear-test-model",
211
- rawMetadata: { id: "clear-test-model", supports_streaming: true },
212
- });
213
- assert.equal(profile1.supportsStreaming, true);
214
-
215
- clearModelCapabilityProfileCache();
216
-
217
- const profile2 = resolveModelCapabilityProfileCached({
218
- providerId: "local",
219
- modelId: "clear-test-model",
220
- });
221
- assert.equal(profile2.supportsStreaming, null);
222
- assert.equal(profile2.source, "unknown");
223
- });
224
-
225
- test("capabilities: ['tool_use'] sets supportsToolCalls true with api source", () => {
226
- clearModelCapabilityProfileCache();
227
- const profile = resolveModelCapabilityProfileCached({
228
- providerId: "local",
229
- modelId: "gemma-tools",
230
- rawMetadata: {
231
- id: "gemma-tools",
232
- capabilities: ["tool_use"],
233
- },
234
- });
235
-
236
- assert.equal(profile.supportsToolCalls, true);
237
- assert.equal(profile.source, "api");
238
- assert.equal(profile.confidence, "verified");
239
- });
240
-
241
- test("capabilities: ['vision'] without tool_use leaves supportsToolCalls null (absence != false)", () => {
242
- clearModelCapabilityProfileCache();
243
- const profile = resolveModelCapabilityProfileCached({
244
- providerId: "local",
245
- modelId: "vision-only",
246
- rawMetadata: {
247
- id: "vision-only",
248
- capabilities: ["vision"],
249
- },
250
- });
251
-
252
- assert.equal(profile.supportsToolCalls, null);
253
- assert.equal(profile.source, "unknown");
254
- });
255
-
256
- test("capabilities: [] (empty array) leaves all capabilities null", () => {
257
- clearModelCapabilityProfileCache();
258
- const profile = resolveModelCapabilityProfileCached({
259
- providerId: "local",
260
- modelId: "no-caps",
261
- rawMetadata: {
262
- id: "no-caps",
263
- capabilities: [],
264
- },
265
- });
266
-
267
- assert.equal(profile.supportsToolCalls, null);
268
- assert.equal(profile.source, "unknown");
269
- });
270
-
271
- test("type: 'vlm' alone does not set supportsVision (no automatic mapping)", () => {
272
- clearModelCapabilityProfileCache();
273
- const profile = resolveModelCapabilityProfileCached({
274
- providerId: "local",
275
- modelId: "vlm-model",
276
- rawMetadata: {
277
- id: "vlm-model",
278
- type: "vlm",
279
- capabilities: ["tool_use"],
280
- },
281
- });
282
-
283
- assert.equal(profile.supportsVision, null);
284
- assert.equal(profile.supportsToolCalls, true);
285
- });
286
-
287
- test("full LM Studio fixture: supportsToolCalls true, supportsVision null", () => {
288
- clearModelCapabilityProfileCache();
289
- const fixture = {
290
- id: "google/gemma-4-26b-a4b",
291
- object: "model",
292
- type: "vlm",
293
- publisher: "google",
294
- arch: "gemma4",
295
- compatibility_type: "gguf",
296
- quantization: "Q4_K_M",
297
- state: "loaded",
298
- max_context_length: 262144,
299
- loaded_context_length: 64000,
300
- capabilities: ["tool_use"],
301
- };
302
- const profile = resolveModelCapabilityProfileCached({
303
- providerId: "local",
304
- modelId: "google/gemma-4-26b-a4b",
305
- rawMetadata: fixture,
306
- });
307
-
308
- assert.equal(profile.supportsToolCalls, true);
309
- assert.equal(profile.supportsVision, null);
310
- assert.equal(profile.source, "api");
311
- });