@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,30 @@
1
+ import { ModelEntry } from '../types/index.js';
2
+ export declare class ModelDatabase {
3
+ private static instance;
4
+ private cachedModels;
5
+ private fetchPromise;
6
+ static getInstance(): ModelDatabase;
7
+ /**
8
+ * Get all models - returns cached data if available, empty array otherwise.
9
+ * Use getAllModelsAsync() for fetching fresh data.
10
+ */
11
+ getAllModels(): ModelEntry[];
12
+ /**
13
+ * Get all models asynchronously - fetches from APIs.
14
+ */
15
+ getAllModelsAsync(): Promise<ModelEntry[]>;
16
+ /**
17
+ * Force refresh models from APIs
18
+ */
19
+ refreshModels(): Promise<ModelEntry[]>;
20
+ /**
21
+ * Internal async refresh that doesn't block
22
+ */
23
+ private refreshModelsAsync;
24
+ /**
25
+ * Clear cache to force fresh fetch on next call
26
+ */
27
+ clearCache(): void;
28
+ }
29
+ export declare const modelDatabase: ModelDatabase;
30
+ //# sourceMappingURL=model-database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-database.d.ts","sourceRoot":"","sources":["../../source/model-database/model-database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAGzC,qBAAa,aAAa;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAAsC;IAE1D,MAAM,CAAC,WAAW,IAAI,aAAa;IAOnC;;;OAGG;IACH,YAAY,IAAI,UAAU,EAAE;IAc5B;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAehD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAU5C;;OAEG;YACW,kBAAkB;IAahC;;OAEG;IACH,UAAU,IAAI,IAAI;CAKlB;AAED,eAAO,MAAM,aAAa,eAA8B,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { fetchModels, isModelsCached, clearModelCache } from './model-fetcher.js';
2
+ export class ModelDatabase {
3
+ static instance;
4
+ cachedModels = null;
5
+ fetchPromise = null;
6
+ static getInstance() {
7
+ if (!ModelDatabase.instance) {
8
+ ModelDatabase.instance = new ModelDatabase();
9
+ }
10
+ return ModelDatabase.instance;
11
+ }
12
+ /**
13
+ * Get all models - returns cached data if available, empty array otherwise.
14
+ * Use getAllModelsAsync() for fetching fresh data.
15
+ */
16
+ getAllModels() {
17
+ if (this.cachedModels) {
18
+ return this.cachedModels;
19
+ }
20
+ // Trigger background fetch if not already in progress
21
+ if (!this.fetchPromise) {
22
+ void this.refreshModelsAsync();
23
+ }
24
+ // Return empty array - caller should use async method for fresh data
25
+ return [];
26
+ }
27
+ /**
28
+ * Get all models asynchronously - fetches from APIs.
29
+ */
30
+ async getAllModelsAsync() {
31
+ // If we have cached models and they're still fresh, return them
32
+ if (this.cachedModels && isModelsCached()) {
33
+ return this.cachedModels;
34
+ }
35
+ // If fetch is in progress, wait for it
36
+ if (this.fetchPromise) {
37
+ return this.fetchPromise;
38
+ }
39
+ // Start fetch and wait
40
+ return this.refreshModels();
41
+ }
42
+ /**
43
+ * Force refresh models from APIs
44
+ */
45
+ async refreshModels() {
46
+ this.fetchPromise = fetchModels();
47
+ try {
48
+ this.cachedModels = await this.fetchPromise;
49
+ return this.cachedModels;
50
+ }
51
+ finally {
52
+ this.fetchPromise = null;
53
+ }
54
+ }
55
+ /**
56
+ * Internal async refresh that doesn't block
57
+ */
58
+ async refreshModelsAsync() {
59
+ if (this.fetchPromise)
60
+ return;
61
+ this.fetchPromise = fetchModels();
62
+ try {
63
+ this.cachedModels = await this.fetchPromise;
64
+ }
65
+ catch {
66
+ // Silently fail - models will be empty
67
+ }
68
+ finally {
69
+ this.fetchPromise = null;
70
+ }
71
+ }
72
+ /**
73
+ * Clear cache to force fresh fetch on next call
74
+ */
75
+ clearCache() {
76
+ this.cachedModels = null;
77
+ this.fetchPromise = null;
78
+ clearModelCache();
79
+ }
80
+ }
81
+ export const modelDatabase = ModelDatabase.getInstance();
82
+ //# sourceMappingURL=model-database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-database.js","sourceRoot":"","sources":["../../source/model-database/model-database.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAE,cAAc,EAAE,eAAe,EAAC,MAAM,iBAAiB,CAAC;AAE7E,MAAM,OAAO,aAAa;IACjB,MAAM,CAAC,QAAQ,CAAgB;IAC/B,YAAY,GAAwB,IAAI,CAAC;IACzC,YAAY,GAAiC,IAAI,CAAC;IAE1D,MAAM,CAAC,WAAW;QACjB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC7B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC9C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,YAAY;QACX,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,YAAY,CAAC;QAC1B,CAAC;QAED,sDAAsD;QACtD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAChC,CAAC;QAED,qEAAqE;QACrE,OAAO,EAAE,CAAC;IACX,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACtB,gEAAgE;QAChE,IAAI,IAAI,CAAC,YAAY,IAAI,cAAc,EAAE,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC,YAAY,CAAC;QAC1B,CAAC;QAED,uCAAuC;QACvC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,YAAY,CAAC;QAC1B,CAAC;QAED,uBAAuB;QACvB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QAClB,IAAI,CAAC,YAAY,GAAG,WAAW,EAAE,CAAC;QAClC,IAAI,CAAC;YACJ,IAAI,CAAC,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC;YAC5C,OAAO,IAAI,CAAC,YAAY,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC1B,CAAC;IACF,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB;QAC/B,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAE9B,IAAI,CAAC,YAAY,GAAG,WAAW,EAAE,CAAC;QAClC,IAAI,CAAC;YACJ,IAAI,CAAC,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACR,uCAAuC;QACxC,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC1B,CAAC;IACF,CAAC;IAED;;OAEG;IACH,UAAU;QACT,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,eAAe,EAAE,CAAC;IACnB,CAAC;CACD;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model-database.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-database.spec.d.ts","sourceRoot":"","sources":["../../source/model-database/model-database.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,322 @@
1
+ import test from 'ava';
2
+ import { ModelDatabase, modelDatabase } from './model-database.js';
3
+ import { clearModelCache } from './model-fetcher.js';
4
+ console.log(`\nmodel-database.spec.ts`);
5
+ // Note: These tests work with the actual ModelDatabase class behavior.
6
+ // Since we can't mock ES module exports directly, we test the public API
7
+ // and use the global fetch mock where needed.
8
+ // Helper to create a fresh instance for each test
9
+ function createFreshInstance() {
10
+ // Create a new instance by bypassing singleton
11
+ const instance = new ModelDatabase();
12
+ return instance;
13
+ }
14
+ // Mock models response
15
+ function createMockOpenRouterResponse() {
16
+ return {
17
+ data: [
18
+ {
19
+ id: 'openai/gpt-4',
20
+ name: 'GPT-4',
21
+ description: 'Advanced AI model',
22
+ created: 1700000000,
23
+ context_length: 128000,
24
+ architecture: {
25
+ modality: 'text',
26
+ input_modalities: ['text'],
27
+ output_modalities: ['text'],
28
+ tokenizer: 'unknown',
29
+ },
30
+ pricing: { prompt: '0.00003', completion: '0.00006' },
31
+ supported_parameters: ['tools'],
32
+ },
33
+ {
34
+ id: 'meta-llama/llama-3.1-70b',
35
+ name: 'Llama 3.1 70B',
36
+ description: 'Open source model',
37
+ created: 1710000000,
38
+ context_length: 128000,
39
+ architecture: {
40
+ modality: 'text',
41
+ input_modalities: ['text'],
42
+ output_modalities: ['text'],
43
+ tokenizer: 'unknown',
44
+ },
45
+ pricing: { prompt: '0', completion: '0' },
46
+ supported_parameters: ['tools'],
47
+ },
48
+ ],
49
+ };
50
+ }
51
+ test.serial('getInstance returns singleton instance', t => {
52
+ const instance1 = ModelDatabase.getInstance();
53
+ const instance2 = ModelDatabase.getInstance();
54
+ t.is(instance1, instance2);
55
+ });
56
+ test.serial('getAllModels returns empty array when no cache', t => {
57
+ const db = createFreshInstance();
58
+ // Immediately call getAllModels without any fetch
59
+ const models = db.getAllModels();
60
+ t.deepEqual(models, []);
61
+ });
62
+ test.serial('clearCache resets cache state', async (t) => {
63
+ const db = createFreshInstance();
64
+ // First populate the cache
65
+ const originalFetch = globalThis.fetch;
66
+ globalThis.fetch = async () => {
67
+ return {
68
+ ok: true,
69
+ json: async () => createMockOpenRouterResponse(),
70
+ };
71
+ };
72
+ try {
73
+ await db.refreshModels();
74
+ t.true(db.getAllModels().length > 0);
75
+ db.clearCache();
76
+ // After clear, sync getAllModels should return empty
77
+ // (but it will trigger a background fetch)
78
+ const modelsAfterClear = db.getAllModels();
79
+ t.is(modelsAfterClear.length, 0);
80
+ }
81
+ finally {
82
+ globalThis.fetch = originalFetch;
83
+ clearModelCache();
84
+ }
85
+ });
86
+ test.serial('getAllModelsAsync fetches and returns models', async (t) => {
87
+ const db = createFreshInstance();
88
+ clearModelCache();
89
+ const originalFetch = globalThis.fetch;
90
+ globalThis.fetch = async () => {
91
+ return {
92
+ ok: true,
93
+ json: async () => createMockOpenRouterResponse(),
94
+ };
95
+ };
96
+ try {
97
+ const models = await db.getAllModelsAsync();
98
+ t.true(Array.isArray(models));
99
+ t.true(models.length > 0);
100
+ }
101
+ finally {
102
+ globalThis.fetch = originalFetch;
103
+ clearModelCache();
104
+ }
105
+ });
106
+ test.serial('refreshModels forces new fetch when cache is cleared', async (t) => {
107
+ const db = createFreshInstance();
108
+ clearModelCache();
109
+ let fetchCount = 0;
110
+ const originalFetch = globalThis.fetch;
111
+ globalThis.fetch = async () => {
112
+ fetchCount++;
113
+ return {
114
+ ok: true,
115
+ json: async () => createMockOpenRouterResponse(),
116
+ };
117
+ };
118
+ try {
119
+ await db.refreshModels();
120
+ t.is(fetchCount, 1);
121
+ // Clear global cache to allow re-fetch
122
+ clearModelCache();
123
+ // Now refresh should fetch again
124
+ await db.refreshModels();
125
+ t.is(fetchCount, 2);
126
+ }
127
+ finally {
128
+ globalThis.fetch = originalFetch;
129
+ clearModelCache();
130
+ }
131
+ });
132
+ test.serial('getAllModels returns cached data after async fetch', async (t) => {
133
+ const db = createFreshInstance();
134
+ clearModelCache();
135
+ const originalFetch = globalThis.fetch;
136
+ globalThis.fetch = async () => {
137
+ return {
138
+ ok: true,
139
+ json: async () => createMockOpenRouterResponse(),
140
+ };
141
+ };
142
+ try {
143
+ // Fetch data
144
+ await db.getAllModelsAsync();
145
+ // Now sync call should return cached data
146
+ const models = db.getAllModels();
147
+ t.true(models.length > 0);
148
+ }
149
+ finally {
150
+ globalThis.fetch = originalFetch;
151
+ clearModelCache();
152
+ }
153
+ });
154
+ test.serial('concurrent getAllModelsAsync calls share the same promise', async (t) => {
155
+ const db = createFreshInstance();
156
+ clearModelCache();
157
+ let fetchCount = 0;
158
+ const originalFetch = globalThis.fetch;
159
+ globalThis.fetch = async () => {
160
+ fetchCount++;
161
+ // Add small delay to ensure concurrency
162
+ await new Promise(resolve => setTimeout(resolve, 10));
163
+ return {
164
+ ok: true,
165
+ json: async () => createMockOpenRouterResponse(),
166
+ };
167
+ };
168
+ try {
169
+ // Start multiple concurrent requests
170
+ const [result1, result2, result3] = await Promise.all([
171
+ db.getAllModelsAsync(),
172
+ db.getAllModelsAsync(),
173
+ db.getAllModelsAsync(),
174
+ ]);
175
+ // All should succeed
176
+ t.true(result1.length > 0);
177
+ t.true(result2.length > 0);
178
+ t.true(result3.length > 0);
179
+ // Only one fetch should have occurred
180
+ t.is(fetchCount, 1);
181
+ }
182
+ finally {
183
+ globalThis.fetch = originalFetch;
184
+ clearModelCache();
185
+ }
186
+ });
187
+ test.serial('getAllModelsAsync uses cache when fresh', async (t) => {
188
+ const db = createFreshInstance();
189
+ clearModelCache();
190
+ let fetchCount = 0;
191
+ const originalFetch = globalThis.fetch;
192
+ globalThis.fetch = async () => {
193
+ fetchCount++;
194
+ return {
195
+ ok: true,
196
+ json: async () => createMockOpenRouterResponse(),
197
+ };
198
+ };
199
+ try {
200
+ // First call fetches
201
+ await db.getAllModelsAsync();
202
+ t.is(fetchCount, 1);
203
+ // Second call should use cache (within 1 hour TTL)
204
+ await db.getAllModelsAsync();
205
+ t.is(fetchCount, 1); // No new fetch
206
+ }
207
+ finally {
208
+ globalThis.fetch = originalFetch;
209
+ clearModelCache();
210
+ }
211
+ });
212
+ test.serial('refreshModels handles errors', async (t) => {
213
+ const db = createFreshInstance();
214
+ clearModelCache();
215
+ const originalFetch = globalThis.fetch;
216
+ globalThis.fetch = async () => {
217
+ throw new Error('Network error');
218
+ };
219
+ try {
220
+ // Errors should propagate from refreshModels
221
+ // The fetcher catches and returns empty array, so refreshModels resolves with []
222
+ const result = await db.refreshModels();
223
+ t.deepEqual(result, []);
224
+ }
225
+ finally {
226
+ globalThis.fetch = originalFetch;
227
+ clearModelCache();
228
+ }
229
+ });
230
+ test.serial('getAllModels triggers background fetch when empty', async (t) => {
231
+ const db = createFreshInstance();
232
+ clearModelCache();
233
+ let fetchCount = 0;
234
+ const originalFetch = globalThis.fetch;
235
+ globalThis.fetch = async () => {
236
+ fetchCount++;
237
+ return {
238
+ ok: true,
239
+ json: async () => createMockOpenRouterResponse(),
240
+ };
241
+ };
242
+ try {
243
+ // Sync call on empty cache returns [] but triggers fetch
244
+ const immediate = db.getAllModels();
245
+ t.deepEqual(immediate, []);
246
+ // Wait for background fetch
247
+ await new Promise(resolve => setTimeout(resolve, 100));
248
+ // Now should have data
249
+ const afterFetch = db.getAllModels();
250
+ t.true(afterFetch.length > 0);
251
+ t.is(fetchCount, 1);
252
+ }
253
+ finally {
254
+ globalThis.fetch = originalFetch;
255
+ clearModelCache();
256
+ }
257
+ });
258
+ test.serial('getAllModels does not trigger multiple fetches', async (t) => {
259
+ const db = createFreshInstance();
260
+ clearModelCache();
261
+ let fetchCount = 0;
262
+ const originalFetch = globalThis.fetch;
263
+ globalThis.fetch = async () => {
264
+ fetchCount++;
265
+ await new Promise(resolve => setTimeout(resolve, 50));
266
+ return {
267
+ ok: true,
268
+ json: async () => createMockOpenRouterResponse(),
269
+ };
270
+ };
271
+ try {
272
+ // Multiple sync calls while fetch is in progress
273
+ db.getAllModels();
274
+ db.getAllModels();
275
+ db.getAllModels();
276
+ // Wait for fetch to complete
277
+ await new Promise(resolve => setTimeout(resolve, 100));
278
+ // Only one fetch should have been triggered
279
+ t.is(fetchCount, 1);
280
+ }
281
+ finally {
282
+ globalThis.fetch = originalFetch;
283
+ clearModelCache();
284
+ }
285
+ });
286
+ test.serial('modelDatabase singleton works correctly', t => {
287
+ // Test the exported singleton instance
288
+ t.truthy(modelDatabase);
289
+ t.true(typeof modelDatabase.getAllModels === 'function');
290
+ t.true(typeof modelDatabase.getAllModelsAsync === 'function');
291
+ t.true(typeof modelDatabase.refreshModels === 'function');
292
+ t.true(typeof modelDatabase.clearCache === 'function');
293
+ });
294
+ test.serial('models have correct structure after fetch', async (t) => {
295
+ const db = createFreshInstance();
296
+ clearModelCache();
297
+ const originalFetch = globalThis.fetch;
298
+ globalThis.fetch = async () => {
299
+ return {
300
+ ok: true,
301
+ json: async () => createMockOpenRouterResponse(),
302
+ };
303
+ };
304
+ try {
305
+ const models = await db.getAllModelsAsync();
306
+ t.true(models.length > 0);
307
+ const model = models[0];
308
+ t.truthy(model);
309
+ t.true(typeof model.id === 'string');
310
+ t.true(typeof model.name === 'string');
311
+ t.true(typeof model.author === 'string');
312
+ t.true(typeof model.local === 'boolean');
313
+ t.true(typeof model.api === 'boolean');
314
+ t.true(typeof model.contextLength === 'number');
315
+ t.true(typeof model.hasToolSupport === 'boolean');
316
+ }
317
+ finally {
318
+ globalThis.fetch = originalFetch;
319
+ clearModelCache();
320
+ }
321
+ });
322
+ //# sourceMappingURL=model-database.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-database.spec.js","sourceRoot":"","sources":["../../source/model-database/model-database.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { ModelEntry } from '../types/index.js';
2
+ export interface ModelResults {
3
+ allModels: ModelEntry[];
4
+ openModels: ModelEntry[];
5
+ proprietaryModels: ModelEntry[];
6
+ latestModels: ModelEntry[];
7
+ }
8
+ export declare class ModelMatchingEngine {
9
+ private static instance;
10
+ static getInstance(): ModelMatchingEngine;
11
+ /**
12
+ * Get all models - sync version (from cache)
13
+ */
14
+ getModels(): ModelResults;
15
+ /**
16
+ * Get all models - async version for fresh data
17
+ */
18
+ getModelsAsync(): Promise<ModelResults>;
19
+ /**
20
+ * Process models into categorized lists
21
+ */
22
+ private processModels;
23
+ }
24
+ export declare const modelMatchingEngine: ModelMatchingEngine;
25
+ //# sourceMappingURL=model-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-engine.d.ts","sourceRoot":"","sources":["../../source/model-database/model-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAGzC,MAAM,WAAW,YAAY;IAC5B,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,iBAAiB,EAAE,UAAU,EAAE,CAAC;IAChC,YAAY,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;IAE7C,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC;;OAEG;IACH,SAAS,IAAI,YAAY;IAKzB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,YAAY,CAAC;IAK7C;;OAEG;IACH,OAAO,CAAC,aAAa;CAuBrB;AAED,eAAO,MAAM,mBAAmB,qBAAoC,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { modelDatabase } from '../model-database/model-database.js';
2
+ export class ModelMatchingEngine {
3
+ static instance;
4
+ static getInstance() {
5
+ if (!ModelMatchingEngine.instance) {
6
+ ModelMatchingEngine.instance = new ModelMatchingEngine();
7
+ }
8
+ return ModelMatchingEngine.instance;
9
+ }
10
+ /**
11
+ * Get all models - sync version (from cache)
12
+ */
13
+ getModels() {
14
+ const allModels = modelDatabase.getAllModels();
15
+ return this.processModels(allModels);
16
+ }
17
+ /**
18
+ * Get all models - async version for fresh data
19
+ */
20
+ async getModelsAsync() {
21
+ const allModels = await modelDatabase.getAllModelsAsync();
22
+ return this.processModels(allModels);
23
+ }
24
+ /**
25
+ * Process models into categorized lists
26
+ */
27
+ processModels(allModels) {
28
+ // Open models (open weights) - sorted by newest
29
+ const openModels = allModels
30
+ .filter(m => m.local)
31
+ .sort((a, b) => b.created - a.created);
32
+ // Proprietary models - sorted by newest
33
+ const proprietaryModels = allModels
34
+ .filter(m => !m.local)
35
+ .sort((a, b) => b.created - a.created);
36
+ // Latest models (all, sorted by newest) - top 50
37
+ const latestModels = [...allModels]
38
+ .sort((a, b) => b.created - a.created)
39
+ .slice(0, 50);
40
+ return {
41
+ allModels,
42
+ openModels,
43
+ proprietaryModels,
44
+ latestModels,
45
+ };
46
+ }
47
+ }
48
+ export const modelMatchingEngine = ModelMatchingEngine.getInstance();
49
+ //# sourceMappingURL=model-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-engine.js","sourceRoot":"","sources":["../../source/model-database/model-engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAC,MAAM,iCAAiC,CAAC;AAS9D,MAAM,OAAO,mBAAmB;IACvB,MAAM,CAAC,QAAQ,CAAsB;IAE7C,MAAM,CAAC,WAAW;QACjB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC;YACnC,mBAAmB,CAAC,QAAQ,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC1D,CAAC;QACD,OAAO,mBAAmB,CAAC,QAAQ,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,SAAS;QACR,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QACnB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,iBAAiB,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,SAAuB;QAC5C,gDAAgD;QAChD,MAAM,UAAU,GAAG,SAAS;aAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;aACpB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAExC,wCAAwC;QACxC,MAAM,iBAAiB,GAAG,SAAS;aACjC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;aACrB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAExC,iDAAiD;QACjD,MAAM,YAAY,GAAG,CAAC,GAAG,SAAS,CAAC;aACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;aACrC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEf,OAAO;YACN,SAAS;YACT,UAAU;YACV,iBAAiB;YACjB,YAAY;SACZ,CAAC;IACH,CAAC;CACD;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,WAAW,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model-engine.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-engine.spec.d.ts","sourceRoot":"","sources":["../../source/model-database/model-engine.spec.ts"],"names":[],"mappings":""}