@nanocollective/nanocoder 1.17.3 → 1.18.0

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 (224) hide show
  1. package/README.md +2 -5
  2. package/assets/nanocoder-vscode.vsix +0 -0
  3. package/dist/ai-sdk-client-empty-message.spec.d.ts +2 -0
  4. package/dist/ai-sdk-client-empty-message.spec.d.ts.map +1 -0
  5. package/dist/ai-sdk-client-empty-message.spec.js +124 -0
  6. package/dist/ai-sdk-client-empty-message.spec.js.map +1 -0
  7. package/dist/ai-sdk-client.d.ts +18 -2
  8. package/dist/ai-sdk-client.d.ts.map +1 -1
  9. package/dist/ai-sdk-client.js +159 -122
  10. package/dist/ai-sdk-client.js.map +1 -1
  11. package/dist/app/utils/appUtils.js +3 -3
  12. package/dist/app/utils/appUtils.js.map +1 -1
  13. package/dist/app.d.ts.map +1 -1
  14. package/dist/app.js +22 -11
  15. package/dist/app.js.map +1 -1
  16. package/dist/commands/debugging.d.ts +3 -0
  17. package/dist/commands/debugging.d.ts.map +1 -0
  18. package/dist/commands/debugging.js +23 -0
  19. package/dist/commands/debugging.js.map +1 -0
  20. package/dist/commands/index.d.ts +2 -2
  21. package/dist/commands/index.d.ts.map +1 -1
  22. package/dist/commands/index.js +2 -2
  23. package/dist/commands/index.js.map +1 -1
  24. package/dist/commands/model-database.d.ts +8 -0
  25. package/dist/commands/model-database.d.ts.map +1 -0
  26. package/dist/commands/model-database.js +193 -0
  27. package/dist/commands/model-database.js.map +1 -0
  28. package/dist/commands/usage.d.ts.map +1 -1
  29. package/dist/commands/usage.js +1 -1
  30. package/dist/commands/usage.js.map +1 -1
  31. package/dist/components/assistant-message.d.ts.map +1 -1
  32. package/dist/components/assistant-message.js +3 -2
  33. package/dist/components/assistant-message.js.map +1 -1
  34. package/dist/components/status.d.ts +3 -0
  35. package/dist/components/status.d.ts.map +1 -1
  36. package/dist/components/status.js +24 -3
  37. package/dist/components/status.js.map +1 -1
  38. package/dist/components/user-input.d.ts.map +1 -1
  39. package/dist/components/user-input.js +2 -1
  40. package/dist/components/user-input.js.map +1 -1
  41. package/dist/config/preferences.d.ts +2 -2
  42. package/dist/config/preferences.js +5 -5
  43. package/dist/config/preferences.js.map +1 -1
  44. package/dist/context/mode-context.d.ts +12 -0
  45. package/dist/context/mode-context.d.ts.map +1 -0
  46. package/dist/context/mode-context.js +21 -0
  47. package/dist/context/mode-context.js.map +1 -0
  48. package/dist/context/mode-context.spec.d.ts +2 -0
  49. package/dist/context/mode-context.spec.d.ts.map +1 -0
  50. package/dist/context/mode-context.spec.js +61 -0
  51. package/dist/context/mode-context.spec.js.map +1 -0
  52. package/dist/hooks/useAppInitialization.d.ts +4 -2
  53. package/dist/hooks/useAppInitialization.d.ts.map +1 -1
  54. package/dist/hooks/useAppInitialization.js +101 -26
  55. package/dist/hooks/useAppInitialization.js.map +1 -1
  56. package/dist/hooks/useAppState.d.ts +7 -5
  57. package/dist/hooks/useAppState.d.ts.map +1 -1
  58. package/dist/hooks/useAppState.js +11 -7
  59. package/dist/hooks/useAppState.js.map +1 -1
  60. package/dist/hooks/useChatHandler.d.ts +2 -2
  61. package/dist/hooks/useChatHandler.d.ts.map +1 -1
  62. package/dist/hooks/useChatHandler.js +186 -111
  63. package/dist/hooks/useChatHandler.js.map +1 -1
  64. package/dist/hooks/useModeHandlers.d.ts +4 -4
  65. package/dist/hooks/useModeHandlers.d.ts.map +1 -1
  66. package/dist/hooks/useModeHandlers.js +9 -9
  67. package/dist/hooks/useModeHandlers.js.map +1 -1
  68. package/dist/mcp/mcp-client.d.ts.map +1 -1
  69. package/dist/mcp/mcp-client.js +16 -6
  70. package/dist/mcp/mcp-client.js.map +1 -1
  71. package/dist/message-handler.js +1 -1
  72. package/dist/message-handler.js.map +1 -1
  73. package/dist/model-database/database-engine.d.ts +25 -0
  74. package/dist/model-database/database-engine.d.ts.map +1 -0
  75. package/dist/model-database/database-engine.js +37 -0
  76. package/dist/model-database/database-engine.js.map +1 -0
  77. package/dist/model-database/database-engine.spec.d.ts +2 -0
  78. package/dist/model-database/database-engine.spec.d.ts.map +1 -0
  79. package/dist/model-database/database-engine.spec.js +413 -0
  80. package/dist/model-database/database-engine.spec.js.map +1 -0
  81. package/dist/model-database/model-database.d.ts +30 -0
  82. package/dist/model-database/model-database.d.ts.map +1 -0
  83. package/dist/model-database/model-database.js +82 -0
  84. package/dist/model-database/model-database.js.map +1 -0
  85. package/dist/model-database/model-database.spec.d.ts +2 -0
  86. package/dist/model-database/model-database.spec.d.ts.map +1 -0
  87. package/dist/model-database/model-database.spec.js +322 -0
  88. package/dist/model-database/model-database.spec.js.map +1 -0
  89. package/dist/model-database/model-engine.d.ts +25 -0
  90. package/dist/model-database/model-engine.d.ts.map +1 -0
  91. package/dist/model-database/model-engine.js +49 -0
  92. package/dist/model-database/model-engine.js.map +1 -0
  93. package/dist/model-database/model-engine.spec.d.ts +2 -0
  94. package/dist/model-database/model-engine.spec.d.ts.map +1 -0
  95. package/dist/model-database/model-engine.spec.js +381 -0
  96. package/dist/model-database/model-engine.spec.js.map +1 -0
  97. package/dist/model-database/model-fetcher.d.ts +14 -0
  98. package/dist/model-database/model-fetcher.d.ts.map +1 -0
  99. package/dist/model-database/model-fetcher.js +248 -0
  100. package/dist/model-database/model-fetcher.js.map +1 -0
  101. package/dist/model-database/model-fetcher.spec.d.ts +2 -0
  102. package/dist/model-database/model-fetcher.spec.d.ts.map +1 -0
  103. package/dist/model-database/model-fetcher.spec.js +498 -0
  104. package/dist/model-database/model-fetcher.spec.js.map +1 -0
  105. package/dist/models/models-dev-client.d.ts.map +1 -1
  106. package/dist/models/models-dev-client.js +8 -0
  107. package/dist/models/models-dev-client.js.map +1 -1
  108. package/dist/tool-calling/json-parser.d.ts.map +1 -1
  109. package/dist/tool-calling/json-parser.js +10 -4
  110. package/dist/tool-calling/json-parser.js.map +1 -1
  111. package/dist/tool-calling/tool-parser.d.ts.map +1 -1
  112. package/dist/tool-calling/tool-parser.js +37 -9
  113. package/dist/tool-calling/tool-parser.js.map +1 -1
  114. package/dist/tool-calling/tool-parser.spec.js +79 -1
  115. package/dist/tool-calling/tool-parser.spec.js.map +1 -1
  116. package/dist/tool-calling/xml-parser.d.ts.map +1 -1
  117. package/dist/tool-calling/xml-parser.js +21 -23
  118. package/dist/tool-calling/xml-parser.js.map +1 -1
  119. package/dist/tool-calling/xml-parser.spec.js +23 -3
  120. package/dist/tool-calling/xml-parser.spec.js.map +1 -1
  121. package/dist/tools/create-file.d.ts +24 -2
  122. package/dist/tools/create-file.d.ts.map +1 -1
  123. package/dist/tools/create-file.js +14 -10
  124. package/dist/tools/create-file.js.map +1 -1
  125. package/dist/tools/delete-lines.d.ts +18 -2
  126. package/dist/tools/delete-lines.d.ts.map +1 -1
  127. package/dist/tools/delete-lines.js +14 -9
  128. package/dist/tools/delete-lines.js.map +1 -1
  129. package/dist/tools/execute-bash.d.ts +2 -2
  130. package/dist/tools/execute-bash.d.ts.map +1 -1
  131. package/dist/tools/execute-bash.js +10 -9
  132. package/dist/tools/execute-bash.js.map +1 -1
  133. package/dist/tools/execute-function.spec.d.ts +2 -0
  134. package/dist/tools/execute-function.spec.d.ts.map +1 -0
  135. package/dist/tools/execute-function.spec.js +141 -0
  136. package/dist/tools/execute-function.spec.js.map +1 -0
  137. package/dist/tools/fetch-url.d.ts +16 -2
  138. package/dist/tools/fetch-url.d.ts.map +1 -1
  139. package/dist/tools/fetch-url.js +10 -10
  140. package/dist/tools/fetch-url.js.map +1 -1
  141. package/dist/tools/find-files.d.ts +18 -2
  142. package/dist/tools/find-files.d.ts.map +1 -1
  143. package/dist/tools/find-files.js +7 -5
  144. package/dist/tools/find-files.js.map +1 -1
  145. package/dist/tools/index.d.ts +2 -3
  146. package/dist/tools/index.d.ts.map +1 -1
  147. package/dist/tools/index.js +30 -20
  148. package/dist/tools/index.js.map +1 -1
  149. package/dist/tools/insert-lines.d.ts +18 -2
  150. package/dist/tools/insert-lines.d.ts.map +1 -1
  151. package/dist/tools/insert-lines.js +14 -9
  152. package/dist/tools/insert-lines.js.map +1 -1
  153. package/dist/tools/lsp-get-diagnostics.d.ts +10 -2
  154. package/dist/tools/lsp-get-diagnostics.d.ts.map +1 -1
  155. package/dist/tools/lsp-get-diagnostics.js +8 -6
  156. package/dist/tools/lsp-get-diagnostics.js.map +1 -1
  157. package/dist/tools/needs-approval.spec.d.ts +2 -0
  158. package/dist/tools/needs-approval.spec.d.ts.map +1 -0
  159. package/dist/tools/needs-approval.spec.js +308 -0
  160. package/dist/tools/needs-approval.spec.js.map +1 -0
  161. package/dist/tools/read-file.d.ts +2 -2
  162. package/dist/tools/read-file.d.ts.map +1 -1
  163. package/dist/tools/read-file.js +10 -12
  164. package/dist/tools/read-file.js.map +1 -1
  165. package/dist/tools/replace-lines.d.ts +19 -2
  166. package/dist/tools/replace-lines.d.ts.map +1 -1
  167. package/dist/tools/replace-lines.js +14 -9
  168. package/dist/tools/replace-lines.js.map +1 -1
  169. package/dist/tools/search-file-contents.d.ts +20 -2
  170. package/dist/tools/search-file-contents.d.ts.map +1 -1
  171. package/dist/tools/search-file-contents.js +11 -8
  172. package/dist/tools/search-file-contents.js.map +1 -1
  173. package/dist/tools/web-search.d.ts +2 -2
  174. package/dist/tools/web-search.d.ts.map +1 -1
  175. package/dist/tools/web-search.js +10 -10
  176. package/dist/tools/web-search.js.map +1 -1
  177. package/dist/types/app.d.ts +1 -1
  178. package/dist/types/app.d.ts.map +1 -1
  179. package/dist/types/config.d.ts +1 -1
  180. package/dist/types/core-connection-status.spec.d.ts +2 -0
  181. package/dist/types/core-connection-status.spec.d.ts.map +1 -0
  182. package/dist/types/core-connection-status.spec.js +52 -0
  183. package/dist/types/core-connection-status.spec.js.map +1 -0
  184. package/dist/types/core.d.ts +33 -28
  185. package/dist/types/core.d.ts.map +1 -1
  186. package/dist/types/core.js.map +1 -1
  187. package/dist/types/system.d.ts +5 -30
  188. package/dist/types/system.d.ts.map +1 -1
  189. package/dist/utils/prompt-processor.d.ts +2 -3
  190. package/dist/utils/prompt-processor.d.ts.map +1 -1
  191. package/dist/utils/prompt-processor.js +2 -50
  192. package/dist/utils/prompt-processor.js.map +1 -1
  193. package/dist/wizard/templates/provider-templates.js +2 -2
  194. package/dist/wizard/templates/provider-templates.js.map +1 -1
  195. package/package.json +6 -5
  196. package/source/app/prompts/main-prompt.md +29 -96
  197. package/dist/commands/recommendations.d.ts +0 -8
  198. package/dist/commands/recommendations.d.ts.map +0 -1
  199. package/dist/commands/recommendations.js +0 -311
  200. package/dist/commands/recommendations.js.map +0 -1
  201. package/dist/commands/streaming.d.ts +0 -3
  202. package/dist/commands/streaming.d.ts.map +0 -1
  203. package/dist/commands/streaming.js +0 -23
  204. package/dist/commands/streaming.js.map +0 -1
  205. package/dist/components/thinking-indicator.d.ts +0 -3
  206. package/dist/components/thinking-indicator.d.ts.map +0 -1
  207. package/dist/components/thinking-indicator.js +0 -69
  208. package/dist/components/thinking-indicator.js.map +0 -1
  209. package/dist/recommendations/model-database.d.ts +0 -8
  210. package/dist/recommendations/model-database.d.ts.map +0 -1
  211. package/dist/recommendations/model-database.js +0 -514
  212. package/dist/recommendations/model-database.js.map +0 -1
  213. package/dist/recommendations/model-engine.d.ts +0 -16
  214. package/dist/recommendations/model-engine.d.ts.map +0 -1
  215. package/dist/recommendations/model-engine.js +0 -185
  216. package/dist/recommendations/model-engine.js.map +0 -1
  217. package/dist/recommendations/recommendation-engine.d.ts +0 -39
  218. package/dist/recommendations/recommendation-engine.d.ts.map +0 -1
  219. package/dist/recommendations/recommendation-engine.js +0 -144
  220. package/dist/recommendations/recommendation-engine.js.map +0 -1
  221. package/dist/system/detector.d.ts +0 -18
  222. package/dist/system/detector.d.ts.map +0 -1
  223. package/dist/system/detector.js +0 -140
  224. package/dist/system/detector.js.map +0 -1
@@ -0,0 +1,381 @@
1
+ import test from 'ava';
2
+ import { ModelMatchingEngine } from './model-engine.js';
3
+ import { modelDatabase } from './model-database.js';
4
+ console.log(`\nmodel-engine.spec.ts`);
5
+ // Create mock models for testing
6
+ function createMockModels() {
7
+ return [
8
+ {
9
+ id: 'openai/gpt-4',
10
+ name: 'GPT-4',
11
+ author: 'Openai',
12
+ size: '128K',
13
+ local: false,
14
+ api: true,
15
+ contextLength: 128000,
16
+ created: 1700000000,
17
+ quality: { cost: 5 },
18
+ costType: 'paid',
19
+ costDetails: '$30.00/M in, $60.00/M out',
20
+ hasToolSupport: true,
21
+ },
22
+ {
23
+ id: 'anthropic/claude-3-opus',
24
+ name: 'Claude 3 Opus',
25
+ author: 'Anthropic',
26
+ size: '200K',
27
+ local: false,
28
+ api: true,
29
+ contextLength: 200000,
30
+ created: 1710000000,
31
+ quality: { cost: 3 },
32
+ costType: 'paid',
33
+ costDetails: '$15.00/M in, $75.00/M out',
34
+ hasToolSupport: true,
35
+ },
36
+ {
37
+ id: 'meta-llama/llama-3.1-70b',
38
+ name: 'Llama 3.1 70B',
39
+ author: 'Meta-llama',
40
+ size: '128K',
41
+ local: true,
42
+ api: true,
43
+ contextLength: 128000,
44
+ created: 1715000000,
45
+ quality: { cost: 9 },
46
+ costType: 'free',
47
+ costDetails: 'Free (open weights)',
48
+ hasToolSupport: true,
49
+ },
50
+ {
51
+ id: 'mistralai/mistral-large',
52
+ name: 'Mistral Large',
53
+ author: 'Mistralai',
54
+ size: '128K',
55
+ local: true,
56
+ api: true,
57
+ contextLength: 128000,
58
+ created: 1712000000,
59
+ quality: { cost: 8 },
60
+ costType: 'free',
61
+ costDetails: 'Free (open weights)',
62
+ hasToolSupport: true,
63
+ },
64
+ {
65
+ id: 'qwen/qwen-72b',
66
+ name: 'Qwen 72B',
67
+ author: 'Qwen',
68
+ size: '32K',
69
+ local: true,
70
+ api: true,
71
+ contextLength: 32000,
72
+ created: 1708000000,
73
+ quality: { cost: 10 },
74
+ costType: 'free',
75
+ costDetails: 'Free (open weights)',
76
+ hasToolSupport: false,
77
+ },
78
+ ];
79
+ }
80
+ // Helper to create a fresh instance for each test
81
+ function createFreshInstance() {
82
+ const instance = new ModelMatchingEngine();
83
+ return instance;
84
+ }
85
+ test.serial('getInstance returns singleton instance', t => {
86
+ const instance1 = ModelMatchingEngine.getInstance();
87
+ const instance2 = ModelMatchingEngine.getInstance();
88
+ t.is(instance1, instance2);
89
+ });
90
+ test.serial('getModels returns categorized results', t => {
91
+ const engine = createFreshInstance();
92
+ const mockModels = createMockModels();
93
+ // Mock the database
94
+ const originalGetAllModels = modelDatabase.getAllModels;
95
+ modelDatabase.getAllModels = () => mockModels;
96
+ try {
97
+ const results = engine.getModels();
98
+ t.true(Array.isArray(results.allModels));
99
+ t.true(Array.isArray(results.openModels));
100
+ t.true(Array.isArray(results.proprietaryModels));
101
+ t.true(Array.isArray(results.latestModels));
102
+ }
103
+ finally {
104
+ modelDatabase.getAllModels = originalGetAllModels;
105
+ }
106
+ });
107
+ test.serial('getModels separates open and proprietary models', t => {
108
+ const engine = createFreshInstance();
109
+ const mockModels = createMockModels();
110
+ const originalGetAllModels = modelDatabase.getAllModels;
111
+ modelDatabase.getAllModels = () => mockModels;
112
+ try {
113
+ const results = engine.getModels();
114
+ // Open models (local: true)
115
+ t.is(results.openModels.length, 3);
116
+ t.true(results.openModels.every(m => m.local === true));
117
+ // Proprietary models (local: false)
118
+ t.is(results.proprietaryModels.length, 2);
119
+ t.true(results.proprietaryModels.every(m => m.local === false));
120
+ }
121
+ finally {
122
+ modelDatabase.getAllModels = originalGetAllModels;
123
+ }
124
+ });
125
+ test.serial('getModels sorts open models by created date (newest first)', t => {
126
+ const engine = createFreshInstance();
127
+ const mockModels = createMockModels();
128
+ const originalGetAllModels = modelDatabase.getAllModels;
129
+ modelDatabase.getAllModels = () => mockModels;
130
+ try {
131
+ const results = engine.getModels();
132
+ // Verify sorted by created descending
133
+ for (let i = 1; i < results.openModels.length; i++) {
134
+ t.true(results.openModels[i - 1].created >= results.openModels[i].created, `Open models should be sorted by created date descending`);
135
+ }
136
+ // First should be Llama 3.1 (created: 1715000000)
137
+ t.is(results.openModels[0]?.id, 'meta-llama/llama-3.1-70b');
138
+ }
139
+ finally {
140
+ modelDatabase.getAllModels = originalGetAllModels;
141
+ }
142
+ });
143
+ test.serial('getModels sorts proprietary models by created date (newest first)', t => {
144
+ const engine = createFreshInstance();
145
+ const mockModels = createMockModels();
146
+ const originalGetAllModels = modelDatabase.getAllModels;
147
+ modelDatabase.getAllModels = () => mockModels;
148
+ try {
149
+ const results = engine.getModels();
150
+ // Verify sorted by created descending
151
+ for (let i = 1; i < results.proprietaryModels.length; i++) {
152
+ t.true(results.proprietaryModels[i - 1].created >=
153
+ results.proprietaryModels[i].created, `Proprietary models should be sorted by created date descending`);
154
+ }
155
+ // First should be Claude 3 Opus (created: 1710000000)
156
+ t.is(results.proprietaryModels[0]?.id, 'anthropic/claude-3-opus');
157
+ }
158
+ finally {
159
+ modelDatabase.getAllModels = originalGetAllModels;
160
+ }
161
+ });
162
+ test.serial('getModels returns latest models limited to 50', t => {
163
+ const engine = createFreshInstance();
164
+ // Create more than 50 models
165
+ const manyModels = [];
166
+ for (let i = 0; i < 60; i++) {
167
+ manyModels.push({
168
+ id: `test/model-${i}`,
169
+ name: `Model ${i}`,
170
+ author: 'Test',
171
+ size: '128K',
172
+ local: i % 2 === 0,
173
+ api: true,
174
+ contextLength: 128000,
175
+ created: 1700000000 + i * 1000,
176
+ quality: { cost: 5 },
177
+ costType: 'paid',
178
+ costDetails: '$1.00/M in, $2.00/M out',
179
+ hasToolSupport: true,
180
+ });
181
+ }
182
+ const originalGetAllModels = modelDatabase.getAllModels;
183
+ modelDatabase.getAllModels = () => manyModels;
184
+ try {
185
+ const results = engine.getModels();
186
+ t.is(results.latestModels.length, 50);
187
+ t.is(results.allModels.length, 60);
188
+ }
189
+ finally {
190
+ modelDatabase.getAllModels = originalGetAllModels;
191
+ }
192
+ });
193
+ test.serial('getModels sorts latest models by created date', t => {
194
+ const engine = createFreshInstance();
195
+ const mockModels = createMockModels();
196
+ const originalGetAllModels = modelDatabase.getAllModels;
197
+ modelDatabase.getAllModels = () => mockModels;
198
+ try {
199
+ const results = engine.getModels();
200
+ // Verify sorted by created descending
201
+ for (let i = 1; i < results.latestModels.length; i++) {
202
+ t.true(results.latestModels[i - 1].created >= results.latestModels[i].created, `Latest models should be sorted by created date descending`);
203
+ }
204
+ }
205
+ finally {
206
+ modelDatabase.getAllModels = originalGetAllModels;
207
+ }
208
+ });
209
+ test.serial('getModels returns all models in allModels array', t => {
210
+ const engine = createFreshInstance();
211
+ const mockModels = createMockModels();
212
+ const originalGetAllModels = modelDatabase.getAllModels;
213
+ modelDatabase.getAllModels = () => mockModels;
214
+ try {
215
+ const results = engine.getModels();
216
+ t.is(results.allModels.length, mockModels.length);
217
+ t.deepEqual(results.allModels, mockModels);
218
+ }
219
+ finally {
220
+ modelDatabase.getAllModels = originalGetAllModels;
221
+ }
222
+ });
223
+ test.serial('getModelsAsync returns categorized results', async (t) => {
224
+ const engine = createFreshInstance();
225
+ const mockModels = createMockModels();
226
+ const originalGetAllModelsAsync = modelDatabase.getAllModelsAsync;
227
+ modelDatabase.getAllModelsAsync = async () => mockModels;
228
+ try {
229
+ const results = await engine.getModelsAsync();
230
+ t.true(Array.isArray(results.allModels));
231
+ t.true(Array.isArray(results.openModels));
232
+ t.true(Array.isArray(results.proprietaryModels));
233
+ t.true(Array.isArray(results.latestModels));
234
+ }
235
+ finally {
236
+ modelDatabase.getAllModelsAsync = originalGetAllModelsAsync;
237
+ }
238
+ });
239
+ test.serial('getModelsAsync separates open and proprietary models', async (t) => {
240
+ const engine = createFreshInstance();
241
+ const mockModels = createMockModels();
242
+ const originalGetAllModelsAsync = modelDatabase.getAllModelsAsync;
243
+ modelDatabase.getAllModelsAsync = async () => mockModels;
244
+ try {
245
+ const results = await engine.getModelsAsync();
246
+ // Open models (local: true)
247
+ t.is(results.openModels.length, 3);
248
+ t.true(results.openModels.every(m => m.local === true));
249
+ // Proprietary models (local: false)
250
+ t.is(results.proprietaryModels.length, 2);
251
+ t.true(results.proprietaryModels.every(m => m.local === false));
252
+ }
253
+ finally {
254
+ modelDatabase.getAllModelsAsync = originalGetAllModelsAsync;
255
+ }
256
+ });
257
+ test.serial('getModels handles empty model list', t => {
258
+ const engine = createFreshInstance();
259
+ const originalGetAllModels = modelDatabase.getAllModels;
260
+ modelDatabase.getAllModels = () => [];
261
+ try {
262
+ const results = engine.getModels();
263
+ t.deepEqual(results.allModels, []);
264
+ t.deepEqual(results.openModels, []);
265
+ t.deepEqual(results.proprietaryModels, []);
266
+ t.deepEqual(results.latestModels, []);
267
+ }
268
+ finally {
269
+ modelDatabase.getAllModels = originalGetAllModels;
270
+ }
271
+ });
272
+ test.serial('getModels handles only open models', t => {
273
+ const engine = createFreshInstance();
274
+ const openOnlyModels = [
275
+ {
276
+ id: 'meta-llama/llama-3.1-70b',
277
+ name: 'Llama 3.1 70B',
278
+ author: 'Meta-llama',
279
+ size: '128K',
280
+ local: true,
281
+ api: true,
282
+ contextLength: 128000,
283
+ created: 1715000000,
284
+ quality: { cost: 9 },
285
+ costType: 'free',
286
+ costDetails: 'Free (open weights)',
287
+ hasToolSupport: true,
288
+ },
289
+ ];
290
+ const originalGetAllModels = modelDatabase.getAllModels;
291
+ modelDatabase.getAllModels = () => openOnlyModels;
292
+ try {
293
+ const results = engine.getModels();
294
+ t.is(results.openModels.length, 1);
295
+ t.is(results.proprietaryModels.length, 0);
296
+ t.is(results.latestModels.length, 1);
297
+ }
298
+ finally {
299
+ modelDatabase.getAllModels = originalGetAllModels;
300
+ }
301
+ });
302
+ test.serial('getModels handles only proprietary models', t => {
303
+ const engine = createFreshInstance();
304
+ const proprietaryOnlyModels = [
305
+ {
306
+ id: 'openai/gpt-4',
307
+ name: 'GPT-4',
308
+ author: 'Openai',
309
+ size: '128K',
310
+ local: false,
311
+ api: true,
312
+ contextLength: 128000,
313
+ created: 1700000000,
314
+ quality: { cost: 5 },
315
+ costType: 'paid',
316
+ costDetails: '$30.00/M in, $60.00/M out',
317
+ hasToolSupport: true,
318
+ },
319
+ ];
320
+ const originalGetAllModels = modelDatabase.getAllModels;
321
+ modelDatabase.getAllModels = () => proprietaryOnlyModels;
322
+ try {
323
+ const results = engine.getModels();
324
+ t.is(results.openModels.length, 0);
325
+ t.is(results.proprietaryModels.length, 1);
326
+ t.is(results.latestModels.length, 1);
327
+ }
328
+ finally {
329
+ modelDatabase.getAllModels = originalGetAllModels;
330
+ }
331
+ });
332
+ test.serial('getModelsAsync handles errors from database', async (t) => {
333
+ const engine = createFreshInstance();
334
+ const originalGetAllModelsAsync = modelDatabase.getAllModelsAsync;
335
+ modelDatabase.getAllModelsAsync = async () => {
336
+ throw new Error('Database error');
337
+ };
338
+ try {
339
+ await t.throwsAsync(() => engine.getModelsAsync(), {
340
+ message: 'Database error',
341
+ });
342
+ }
343
+ finally {
344
+ modelDatabase.getAllModelsAsync = originalGetAllModelsAsync;
345
+ }
346
+ });
347
+ test.serial('latestModels contains models from both categories', t => {
348
+ const engine = createFreshInstance();
349
+ const mockModels = createMockModels();
350
+ const originalGetAllModels = modelDatabase.getAllModels;
351
+ modelDatabase.getAllModels = () => mockModels;
352
+ try {
353
+ const results = engine.getModels();
354
+ // Latest models should contain both open and proprietary
355
+ const hasOpen = results.latestModels.some(m => m.local === true);
356
+ const hasProprietary = results.latestModels.some(m => m.local === false);
357
+ t.true(hasOpen, 'Latest models should contain open models');
358
+ t.true(hasProprietary, 'Latest models should contain proprietary models');
359
+ }
360
+ finally {
361
+ modelDatabase.getAllModels = originalGetAllModels;
362
+ }
363
+ });
364
+ test.serial('processModels does not mutate original array', t => {
365
+ const engine = createFreshInstance();
366
+ const mockModels = createMockModels();
367
+ const originalLength = mockModels.length;
368
+ const originalFirstId = mockModels[0]?.id;
369
+ const originalGetAllModels = modelDatabase.getAllModels;
370
+ modelDatabase.getAllModels = () => mockModels;
371
+ try {
372
+ engine.getModels();
373
+ // Original array should be unchanged
374
+ t.is(mockModels.length, originalLength);
375
+ t.is(mockModels[0]?.id, originalFirstId);
376
+ }
377
+ finally {
378
+ modelDatabase.getAllModels = originalGetAllModels;
379
+ }
380
+ });
381
+ //# sourceMappingURL=model-engine.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-engine.spec.js","sourceRoot":"","sources":["../../source/model-database/model-engine.spec.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAC,mBAAmB,EAAC,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAG/C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAEtC,iCAAiC;AACjC,SAAS,gBAAgB;IACxB,OAAO;QACN;YACC,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,KAAK;YACZ,GAAG,EAAE,IAAI;YACT,aAAa,EAAE,MAAM;YACrB,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC;YAClB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,2BAA2B;YACxC,cAAc,EAAE,IAAI;SACpB;QACD;YACC,EAAE,EAAE,yBAAyB;YAC7B,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,KAAK;YACZ,GAAG,EAAE,IAAI;YACT,aAAa,EAAE,MAAM;YACrB,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC;YAClB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,2BAA2B;YACxC,cAAc,EAAE,IAAI;SACpB;QACD;YACC,EAAE,EAAE,0BAA0B;YAC9B,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,YAAY;YACpB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,IAAI;YACT,aAAa,EAAE,MAAM;YACrB,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC;YAClB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,qBAAqB;YAClC,cAAc,EAAE,IAAI;SACpB;QACD;YACC,EAAE,EAAE,yBAAyB;YAC7B,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,IAAI;YACT,aAAa,EAAE,MAAM;YACrB,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC;YAClB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,qBAAqB;YAClC,cAAc,EAAE,IAAI;SACpB;QACD;YACC,EAAE,EAAE,eAAe;YACnB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,IAAI;YACT,aAAa,EAAE,KAAK;YACpB,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,EAAC,IAAI,EAAE,EAAE,EAAC;YACnB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,qBAAqB;YAClC,cAAc,EAAE,KAAK;SACrB;KACD,CAAC;AACH,CAAC;AAED,kDAAkD;AAClD,SAAS,mBAAmB;IAC3B,MAAM,QAAQ,GAAG,IAAK,mBAA2B,EAAE,CAAC;IACpD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,IAAI,CAAC,MAAM,CAAC,wCAAwC,EAAE,CAAC,CAAC,EAAE;IACzD,MAAM,SAAS,GAAG,mBAAmB,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,SAAS,GAAG,mBAAmB,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,uCAAuC,EAAE,CAAC,CAAC,EAAE;IACxD,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,oBAAoB;IACpB,MAAM,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC;IACxD,aAAa,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC;IAE9C,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEnC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC7C,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,YAAY,GAAG,oBAAoB,CAAC;IACnD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,iDAAiD,EAAE,CAAC,CAAC,EAAE;IAClE,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,MAAM,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC;IACxD,aAAa,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC;IAE9C,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEnC,4BAA4B;QAC5B,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC;QAExD,oCAAoC;QACpC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;IACjE,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,YAAY,GAAG,oBAAoB,CAAC;IACnD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,4DAA4D,EAAE,CAAC,CAAC,EAAE;IAC7E,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,MAAM,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC;IACxD,aAAa,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC;IAE9C,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEnC,sCAAsC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,CAAC,CAAC,IAAI,CACL,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAClE,yDAAyD,CACzD,CAAC;QACH,CAAC;QAED,kDAAkD;QAClD,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,0BAA0B,CAAC,CAAC;IAC7D,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,YAAY,GAAG,oBAAoB,CAAC;IACnD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CACV,mEAAmE,EACnE,CAAC,CAAC,EAAE;IACH,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,MAAM,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC;IACxD,aAAa,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC;IAE9C,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEnC,sCAAsC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3D,CAAC,CAAC,IAAI,CACL,OAAO,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO;gBACvC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,EACrC,gEAAgE,CAChE,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,yBAAyB,CAAC,CAAC;IACnE,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,YAAY,GAAG,oBAAoB,CAAC;IACnD,CAAC;AACF,CAAC,CACD,CAAC;AAEF,IAAI,CAAC,MAAM,CAAC,+CAA+C,EAAE,CAAC,CAAC,EAAE;IAChE,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IAErC,6BAA6B;IAC7B,MAAM,UAAU,GAAiB,EAAE,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,UAAU,CAAC,IAAI,CAAC;YACf,EAAE,EAAE,cAAc,CAAC,EAAE;YACrB,IAAI,EAAE,SAAS,CAAC,EAAE;YAClB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;YAClB,GAAG,EAAE,IAAI;YACT,aAAa,EAAE,MAAM;YACrB,OAAO,EAAE,UAAU,GAAG,CAAC,GAAG,IAAI;YAC9B,OAAO,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC;YAClB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,yBAAyB;YACtC,cAAc,EAAE,IAAI;SACpB,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC;IACxD,aAAa,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC;IAE9C,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEnC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,YAAY,GAAG,oBAAoB,CAAC;IACnD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,+CAA+C,EAAE,CAAC,CAAC,EAAE;IAChE,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,MAAM,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC;IACxD,aAAa,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC;IAE9C,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEnC,sCAAsC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,CAAC,CAAC,IAAI,CACL,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EACtE,2DAA2D,CAC3D,CAAC;QACH,CAAC;IACF,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,YAAY,GAAG,oBAAoB,CAAC;IACnD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,iDAAiD,EAAE,CAAC,CAAC,EAAE;IAClE,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,MAAM,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC;IACxD,aAAa,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC;IAE9C,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEnC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,YAAY,GAAG,oBAAoB,CAAC;IACnD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,4CAA4C,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACnE,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,MAAM,yBAAyB,GAAG,aAAa,CAAC,iBAAiB,CAAC;IAClE,aAAa,CAAC,iBAAiB,GAAG,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC;IAEzD,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;QAE9C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC7C,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,iBAAiB,GAAG,yBAAyB,CAAC;IAC7D,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,sDAAsD,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC7E,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,MAAM,yBAAyB,GAAG,aAAa,CAAC,iBAAiB,CAAC;IAClE,aAAa,CAAC,iBAAiB,GAAG,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC;IAEzD,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;QAE9C,4BAA4B;QAC5B,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC;QAExD,oCAAoC;QACpC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;IACjE,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,iBAAiB,GAAG,yBAAyB,CAAC;IAC7D,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,oCAAoC,EAAE,CAAC,CAAC,EAAE;IACrD,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IAErC,MAAM,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC;IACxD,aAAa,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;IAEtC,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEnC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,YAAY,GAAG,oBAAoB,CAAC;IACnD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,oCAAoC,EAAE,CAAC,CAAC,EAAE;IACrD,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,cAAc,GAAiB;QACpC;YACC,EAAE,EAAE,0BAA0B;YAC9B,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,YAAY;YACpB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,IAAI;YACT,aAAa,EAAE,MAAM;YACrB,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC;YAClB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,qBAAqB;YAClC,cAAc,EAAE,IAAI;SACpB;KACD,CAAC;IAEF,MAAM,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC;IACxD,aAAa,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC;IAElD,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEnC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,YAAY,GAAG,oBAAoB,CAAC;IACnD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,2CAA2C,EAAE,CAAC,CAAC,EAAE;IAC5D,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,qBAAqB,GAAiB;QAC3C;YACC,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,KAAK;YACZ,GAAG,EAAE,IAAI;YACT,aAAa,EAAE,MAAM;YACrB,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC;YAClB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,2BAA2B;YACxC,cAAc,EAAE,IAAI;SACpB;KACD,CAAC;IAEF,MAAM,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC;IACxD,aAAa,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,qBAAqB,CAAC;IAEzD,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEnC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,YAAY,GAAG,oBAAoB,CAAC;IACnD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,6CAA6C,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACpE,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IAErC,MAAM,yBAAyB,GAAG,aAAa,CAAC,iBAAiB,CAAC;IAClE,aAAa,CAAC,iBAAiB,GAAG,KAAK,IAAI,EAAE;QAC5C,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnC,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,MAAM,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE;YAClD,OAAO,EAAE,gBAAgB;SACzB,CAAC,CAAC;IACJ,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,iBAAiB,GAAG,yBAAyB,CAAC;IAC7D,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,mDAAmD,EAAE,CAAC,CAAC,EAAE;IACpE,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,MAAM,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC;IACxD,aAAa,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC;IAE9C,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAEnC,yDAAyD;QACzD,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;QACjE,MAAM,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QAEzE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,0CAA0C,CAAC,CAAC;QAC5D,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,iDAAiD,CAAC,CAAC;IAC3E,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,YAAY,GAAG,oBAAoB,CAAC;IACnD,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,8CAA8C,EAAE,CAAC,CAAC,EAAE;IAC/D,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC;IACzC,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAE1C,MAAM,oBAAoB,GAAG,aAAa,CAAC,YAAY,CAAC;IACxD,aAAa,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC;IAE9C,IAAI,CAAC;QACJ,MAAM,CAAC,SAAS,EAAE,CAAC;QAEnB,qCAAqC;QACrC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACxC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;IAC1C,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,YAAY,GAAG,oBAAoB,CAAC;IACnD,CAAC;AACF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { ModelEntry } from '../types/index.js';
2
+ /**
3
+ * Fetch and process models from OpenRouter
4
+ */
5
+ export declare function fetchModels(): Promise<ModelEntry[]>;
6
+ /**
7
+ * Clear the model cache (useful for forcing a refresh)
8
+ */
9
+ export declare function clearModelCache(): void;
10
+ /**
11
+ * Check if models are currently cached
12
+ */
13
+ export declare function isModelsCached(): boolean;
14
+ //# sourceMappingURL=model-fetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-fetcher.d.ts","sourceRoot":"","sources":["../../source/model-database/model-fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AA4PzC;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAqDzD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC"}
@@ -0,0 +1,248 @@
1
+ const CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour cache
2
+ const OPENROUTER_API = 'https://openrouter.ai/api/v1/models';
3
+ let modelCache = null;
4
+ /**
5
+ * Known open-weight model prefixes/patterns
6
+ */
7
+ const OPEN_WEIGHT_PATTERNS = [
8
+ 'meta-llama/',
9
+ 'mistralai/',
10
+ 'qwen/',
11
+ 'deepseek/',
12
+ 'google/gemma',
13
+ 'microsoft/phi',
14
+ 'nvidia/',
15
+ 'cohere/command-r',
16
+ 'databricks/',
17
+ 'allenai/',
18
+ 'huggingfaceh4/',
19
+ 'openchat/',
20
+ 'teknium/',
21
+ 'nousresearch/',
22
+ 'cognitivecomputations/',
23
+ 'thebloke/',
24
+ 'codellama/',
25
+ '/llama',
26
+ '/mistral',
27
+ '/qwen',
28
+ '/deepseek',
29
+ '/gemma',
30
+ '/phi-',
31
+ '/wizardlm',
32
+ '/vicuna',
33
+ '/falcon',
34
+ '/starcoder',
35
+ '/codestral',
36
+ '/devstral',
37
+ ];
38
+ /**
39
+ * Check if a model is open-weight based on ID
40
+ */
41
+ function isOpenWeight(modelId) {
42
+ const lowerId = modelId.toLowerCase();
43
+ return OPEN_WEIGHT_PATTERNS.some(pattern => lowerId.includes(pattern));
44
+ }
45
+ /**
46
+ * Extract author from model ID
47
+ */
48
+ function extractAuthor(modelId) {
49
+ const parts = modelId.split('/');
50
+ if (parts.length >= 2) {
51
+ const author = parts[0];
52
+ // Capitalize first letter
53
+ return author.charAt(0).toUpperCase() + author.slice(1);
54
+ }
55
+ return 'Unknown';
56
+ }
57
+ /**
58
+ * Check if model supports text input and output
59
+ */
60
+ function supportsTextInTextOut(model) {
61
+ const inputMods = model.architecture?.input_modalities || [];
62
+ const outputMods = model.architecture?.output_modalities || [];
63
+ const hasTextInput = inputMods.length === 0 || inputMods.includes('text');
64
+ const hasTextOutput = outputMods.length === 0 || outputMods.includes('text');
65
+ return hasTextInput && hasTextOutput;
66
+ }
67
+ /**
68
+ * Check if model is relevant for coding (has tool support or is a known coding model)
69
+ */
70
+ function isRelevantForCoding(model) {
71
+ const modelId = model.id.toLowerCase();
72
+ const modelName = model.name.toLowerCase();
73
+ const description = (model.description || '').toLowerCase();
74
+ // Must support text in/out
75
+ if (!supportsTextInTextOut(model))
76
+ return false;
77
+ // Skip embedding models
78
+ if (modelId.includes('embed') || modelName.includes('embed'))
79
+ return false;
80
+ // Skip image/audio only models
81
+ if (modelId.includes('dall-e') ||
82
+ modelId.includes('stable-diffusion') ||
83
+ modelId.includes('whisper') ||
84
+ modelId.includes('tts') ||
85
+ modelId.includes('imagen')) {
86
+ return false;
87
+ }
88
+ // Has tool calling support
89
+ if (model.supported_parameters?.includes('tools'))
90
+ return true;
91
+ // Known coding-capable models
92
+ const codingPatterns = [
93
+ 'gpt',
94
+ 'claude',
95
+ 'gemini',
96
+ 'deepseek',
97
+ 'qwen',
98
+ 'coder',
99
+ 'codestral',
100
+ 'devstral',
101
+ 'llama',
102
+ 'mistral',
103
+ 'phi',
104
+ 'command',
105
+ 'grok',
106
+ 'codex',
107
+ ];
108
+ if (codingPatterns.some(p => modelId.includes(p) || modelName.includes(p))) {
109
+ return true;
110
+ }
111
+ // Description mentions coding
112
+ if (description.includes('code') ||
113
+ description.includes('programming') ||
114
+ description.includes('developer')) {
115
+ return true;
116
+ }
117
+ return false;
118
+ }
119
+ /**
120
+ * Calculate cost score (0-10 scale, 10 = free/cheapest)
121
+ */
122
+ function calculateCostScore(promptPrice, completionPrice) {
123
+ const input = parseFloat(promptPrice) || 0;
124
+ const output = parseFloat(completionPrice) || 0;
125
+ // Price per million tokens (prices are per token)
126
+ const inputPerMillion = input * 1_000_000;
127
+ const outputPerMillion = output * 1_000_000;
128
+ // Weighted average (output typically more important)
129
+ const avgCost = inputPerMillion * 0.3 + outputPerMillion * 0.7;
130
+ if (avgCost === 0)
131
+ return 10;
132
+ if (avgCost < 0.1)
133
+ return 9;
134
+ if (avgCost < 0.5)
135
+ return 8;
136
+ if (avgCost < 1)
137
+ return 7;
138
+ if (avgCost < 2)
139
+ return 6;
140
+ if (avgCost < 5)
141
+ return 5;
142
+ if (avgCost < 10)
143
+ return 4;
144
+ if (avgCost < 20)
145
+ return 3;
146
+ if (avgCost < 50)
147
+ return 2;
148
+ return 1;
149
+ }
150
+ /**
151
+ * Format cost details string
152
+ */
153
+ function formatCostDetails(promptPrice, completionPrice, isLocal) {
154
+ const input = parseFloat(promptPrice) || 0;
155
+ const output = parseFloat(completionPrice) || 0;
156
+ if (input === 0 && output === 0) {
157
+ return isLocal ? 'Free (open weights)' : 'Free';
158
+ }
159
+ // Convert to per million tokens
160
+ const inputPerMillion = input * 1_000_000;
161
+ const outputPerMillion = output * 1_000_000;
162
+ return `$${inputPerMillion.toFixed(2)}/M in, $${outputPerMillion.toFixed(2)}/M out`;
163
+ }
164
+ /**
165
+ * Format context length for display
166
+ */
167
+ function formatContextLength(contextLength) {
168
+ if (contextLength >= 1_000_000) {
169
+ return `${(contextLength / 1_000_000).toFixed(1)}M`;
170
+ }
171
+ if (contextLength >= 1000) {
172
+ return `${Math.round(contextLength / 1000)}K`;
173
+ }
174
+ return `${contextLength}`;
175
+ }
176
+ /**
177
+ * Fetch models from OpenRouter API
178
+ */
179
+ async function fetchOpenRouterModels() {
180
+ try {
181
+ const response = await fetch(OPENROUTER_API);
182
+ if (!response.ok) {
183
+ throw new Error(`OpenRouter API returned ${response.status}`);
184
+ }
185
+ const data = (await response.json());
186
+ return data.data || [];
187
+ }
188
+ catch (error) {
189
+ console.error('Failed to fetch OpenRouter models:', error);
190
+ return [];
191
+ }
192
+ }
193
+ /**
194
+ * Fetch and process models from OpenRouter
195
+ */
196
+ export async function fetchModels() {
197
+ // Check cache first
198
+ if (modelCache && Date.now() - modelCache.timestamp < CACHE_TTL_MS) {
199
+ return modelCache.models;
200
+ }
201
+ const openRouterModels = await fetchOpenRouterModels();
202
+ const models = [];
203
+ for (const model of openRouterModels) {
204
+ // Skip if not relevant for coding
205
+ if (!isRelevantForCoding(model))
206
+ continue;
207
+ const isLocal = isOpenWeight(model.id);
208
+ const costScore = calculateCostScore(model.pricing.prompt, model.pricing.completion);
209
+ const entry = {
210
+ id: model.id,
211
+ name: model.name,
212
+ author: extractAuthor(model.id),
213
+ size: formatContextLength(model.context_length),
214
+ local: isLocal,
215
+ api: true,
216
+ contextLength: model.context_length,
217
+ created: model.created,
218
+ quality: {
219
+ cost: costScore,
220
+ },
221
+ costType: costScore >= 9 ? 'free' : 'paid',
222
+ costDetails: formatCostDetails(model.pricing.prompt, model.pricing.completion, isLocal),
223
+ hasToolSupport: model.supported_parameters?.includes('tools') || false,
224
+ };
225
+ models.push(entry);
226
+ }
227
+ // Sort by created date (newest first)
228
+ models.sort((a, b) => (b.created || 0) - (a.created || 0));
229
+ // Update cache
230
+ modelCache = {
231
+ models,
232
+ timestamp: Date.now(),
233
+ };
234
+ return models;
235
+ }
236
+ /**
237
+ * Clear the model cache (useful for forcing a refresh)
238
+ */
239
+ export function clearModelCache() {
240
+ modelCache = null;
241
+ }
242
+ /**
243
+ * Check if models are currently cached
244
+ */
245
+ export function isModelsCached() {
246
+ return (modelCache !== null && Date.now() - modelCache.timestamp < CACHE_TTL_MS);
247
+ }
248
+ //# sourceMappingURL=model-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-fetcher.js","sourceRoot":"","sources":["../../source/model-database/model-fetcher.ts"],"names":[],"mappings":"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"}