@gguf/coder 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (414) hide show
  1. package/.editorconfig +16 -0
  2. package/.env.example +63 -0
  3. package/.gitattributes +1 -0
  4. package/.semgrepignore +19 -0
  5. package/coder-dummy-file.ts +52 -0
  6. package/coder.config.example.json +59 -0
  7. package/coder.config.json +13 -0
  8. package/color_picker.html +36 -0
  9. package/package.json +2 -14
  10. package/scripts/extract-changelog.js +73 -0
  11. package/scripts/fetch-models.js +143 -0
  12. package/scripts/test.sh +40 -0
  13. package/scripts/update-homebrew-formula.sh +125 -0
  14. package/scripts/update-nix-version.sh +157 -0
  15. package/source/ai-sdk-client/AISDKClient.spec.ts +117 -0
  16. package/source/ai-sdk-client/AISDKClient.ts +155 -0
  17. package/source/ai-sdk-client/chat/chat-handler.spec.ts +121 -0
  18. package/source/ai-sdk-client/chat/chat-handler.ts +276 -0
  19. package/source/ai-sdk-client/chat/streaming-handler.spec.ts +173 -0
  20. package/source/ai-sdk-client/chat/streaming-handler.ts +110 -0
  21. package/source/ai-sdk-client/chat/tool-processor.spec.ts +92 -0
  22. package/source/ai-sdk-client/chat/tool-processor.ts +70 -0
  23. package/source/ai-sdk-client/converters/message-converter.spec.ts +220 -0
  24. package/source/ai-sdk-client/converters/message-converter.ts +113 -0
  25. package/source/ai-sdk-client/converters/tool-converter.spec.ts +90 -0
  26. package/source/ai-sdk-client/converters/tool-converter.ts +46 -0
  27. package/source/ai-sdk-client/error-handling/error-extractor.spec.ts +55 -0
  28. package/source/ai-sdk-client/error-handling/error-extractor.ts +15 -0
  29. package/source/ai-sdk-client/error-handling/error-parser.spec.ts +169 -0
  30. package/source/ai-sdk-client/error-handling/error-parser.ts +161 -0
  31. package/source/ai-sdk-client/index.ts +7 -0
  32. package/source/ai-sdk-client/providers/provider-factory.spec.ts +71 -0
  33. package/source/ai-sdk-client/providers/provider-factory.ts +41 -0
  34. package/source/ai-sdk-client/types.ts +9 -0
  35. package/source/ai-sdk-client-empty-message.spec.ts +141 -0
  36. package/source/ai-sdk-client-error-handling.spec.ts +186 -0
  37. package/source/ai-sdk-client-maxretries.spec.ts +114 -0
  38. package/source/ai-sdk-client-preparestep.spec.ts +279 -0
  39. package/source/app/App.spec.tsx +32 -0
  40. package/source/app/App.tsx +480 -0
  41. package/source/app/components/AppContainer.spec.tsx +96 -0
  42. package/source/app/components/AppContainer.tsx +56 -0
  43. package/source/app/components/ChatInterface.spec.tsx +163 -0
  44. package/source/app/components/ChatInterface.tsx +144 -0
  45. package/source/app/components/ModalSelectors.spec.tsx +141 -0
  46. package/source/app/components/ModalSelectors.tsx +135 -0
  47. package/source/app/helpers.spec.ts +97 -0
  48. package/source/app/helpers.ts +63 -0
  49. package/source/app/index.ts +4 -0
  50. package/source/app/types.ts +39 -0
  51. package/source/app/utils/appUtils.ts +294 -0
  52. package/source/app/utils/conversationState.ts +310 -0
  53. package/source/app.spec.tsx +244 -0
  54. package/source/cli.spec.ts +73 -0
  55. package/source/cli.tsx +51 -0
  56. package/source/client-factory.spec.ts +48 -0
  57. package/source/client-factory.ts +178 -0
  58. package/source/command-parser.spec.ts +127 -0
  59. package/source/command-parser.ts +36 -0
  60. package/source/commands/checkpoint.spec.tsx +277 -0
  61. package/source/commands/checkpoint.tsx +366 -0
  62. package/source/commands/clear.tsx +22 -0
  63. package/source/commands/custom-commands.tsx +121 -0
  64. package/source/commands/exit.ts +21 -0
  65. package/source/commands/export.spec.tsx +131 -0
  66. package/source/commands/export.tsx +79 -0
  67. package/source/commands/help.tsx +120 -0
  68. package/source/commands/index.ts +17 -0
  69. package/source/commands/init.tsx +339 -0
  70. package/source/commands/lsp-command.spec.tsx +281 -0
  71. package/source/commands/lsp.tsx +120 -0
  72. package/source/commands/mcp-command.spec.tsx +313 -0
  73. package/source/commands/mcp.tsx +162 -0
  74. package/source/commands/model-database.spec.tsx +758 -0
  75. package/source/commands/model-database.tsx +418 -0
  76. package/source/commands/model.ts +12 -0
  77. package/source/commands/provider.ts +12 -0
  78. package/source/commands/setup-config.tsx +16 -0
  79. package/source/commands/simple-commands.spec.tsx +175 -0
  80. package/source/commands/status.ts +12 -0
  81. package/source/commands/theme.ts +12 -0
  82. package/source/commands/update.spec.tsx +261 -0
  83. package/source/commands/update.tsx +201 -0
  84. package/source/commands/usage.spec.tsx +495 -0
  85. package/source/commands/usage.tsx +100 -0
  86. package/source/commands.spec.ts +436 -0
  87. package/source/commands.ts +83 -0
  88. package/source/components/assistant-message.spec.tsx +796 -0
  89. package/source/components/assistant-message.tsx +34 -0
  90. package/source/components/bash-execution-indicator.tsx +21 -0
  91. package/source/components/cancelling-indicator.tsx +16 -0
  92. package/source/components/chat-queue.spec.tsx +83 -0
  93. package/source/components/chat-queue.tsx +36 -0
  94. package/source/components/checkpoint-display.spec.tsx +219 -0
  95. package/source/components/checkpoint-display.tsx +126 -0
  96. package/source/components/checkpoint-selector.spec.tsx +173 -0
  97. package/source/components/checkpoint-selector.tsx +173 -0
  98. package/source/components/development-mode-indicator.spec.tsx +268 -0
  99. package/source/components/development-mode-indicator.tsx +38 -0
  100. package/source/components/message-box.spec.tsx +427 -0
  101. package/source/components/message-box.tsx +87 -0
  102. package/source/components/model-selector.tsx +132 -0
  103. package/source/components/provider-selector.tsx +75 -0
  104. package/source/components/random-spinner.tsx +19 -0
  105. package/source/components/security-disclaimer.tsx +73 -0
  106. package/source/components/status-connection-display.spec.tsx +133 -0
  107. package/source/components/status.tsx +267 -0
  108. package/source/components/theme-selector.tsx +126 -0
  109. package/source/components/tool-confirmation.tsx +190 -0
  110. package/source/components/tool-execution-indicator.tsx +33 -0
  111. package/source/components/tool-message.tsx +85 -0
  112. package/source/components/ui/titled-box.spec.tsx +207 -0
  113. package/source/components/ui/titled-box.tsx +57 -0
  114. package/source/components/usage/progress-bar.spec.tsx +398 -0
  115. package/source/components/usage/progress-bar.tsx +30 -0
  116. package/source/components/usage/usage-display.spec.tsx +780 -0
  117. package/source/components/usage/usage-display.tsx +291 -0
  118. package/source/components/user-input.spec.tsx +327 -0
  119. package/source/components/user-input.tsx +533 -0
  120. package/source/components/user-message.spec.tsx +230 -0
  121. package/source/components/user-message.tsx +84 -0
  122. package/source/components/welcome-message.tsx +76 -0
  123. package/source/config/env-substitution.ts +65 -0
  124. package/source/config/index.spec.ts +171 -0
  125. package/source/config/index.ts +154 -0
  126. package/source/config/paths.spec.ts +241 -0
  127. package/source/config/paths.ts +55 -0
  128. package/source/config/preferences.ts +51 -0
  129. package/source/config/themes.ts +315 -0
  130. package/source/constants.ts +130 -0
  131. package/source/context/mode-context.spec.ts +79 -0
  132. package/source/context/mode-context.ts +24 -0
  133. package/source/custom-commands/executor.spec.ts +142 -0
  134. package/source/custom-commands/executor.ts +64 -0
  135. package/source/custom-commands/loader.spec.ts +314 -0
  136. package/source/custom-commands/loader.ts +153 -0
  137. package/source/custom-commands/parser.ts +196 -0
  138. package/source/hooks/chat-handler/conversation/conversation-loop.spec.ts +39 -0
  139. package/source/hooks/chat-handler/conversation/conversation-loop.tsx +511 -0
  140. package/source/hooks/chat-handler/conversation/tool-executor.spec.ts +50 -0
  141. package/source/hooks/chat-handler/conversation/tool-executor.tsx +109 -0
  142. package/source/hooks/chat-handler/index.ts +12 -0
  143. package/source/hooks/chat-handler/state/streaming-state.spec.ts +26 -0
  144. package/source/hooks/chat-handler/state/streaming-state.ts +19 -0
  145. package/source/hooks/chat-handler/types.ts +38 -0
  146. package/source/hooks/chat-handler/useChatHandler.spec.tsx +321 -0
  147. package/source/hooks/chat-handler/useChatHandler.tsx +194 -0
  148. package/source/hooks/chat-handler/utils/context-checker.spec.ts +60 -0
  149. package/source/hooks/chat-handler/utils/context-checker.tsx +73 -0
  150. package/source/hooks/chat-handler/utils/message-helpers.spec.ts +42 -0
  151. package/source/hooks/chat-handler/utils/message-helpers.tsx +36 -0
  152. package/source/hooks/chat-handler/utils/tool-filters.spec.ts +109 -0
  153. package/source/hooks/chat-handler/utils/tool-filters.ts +64 -0
  154. package/source/hooks/useAppHandlers.tsx +291 -0
  155. package/source/hooks/useAppInitialization.tsx +422 -0
  156. package/source/hooks/useAppState.tsx +311 -0
  157. package/source/hooks/useDirectoryTrust.tsx +98 -0
  158. package/source/hooks/useInputState.ts +414 -0
  159. package/source/hooks/useModeHandlers.tsx +302 -0
  160. package/source/hooks/useNonInteractiveMode.ts +140 -0
  161. package/source/hooks/useTerminalWidth.tsx +81 -0
  162. package/source/hooks/useTheme.ts +18 -0
  163. package/source/hooks/useToolHandler.tsx +349 -0
  164. package/source/hooks/useUIState.ts +61 -0
  165. package/source/init/agents-template-generator.ts +421 -0
  166. package/source/init/existing-rules-extractor.ts +319 -0
  167. package/source/init/file-scanner.spec.ts +227 -0
  168. package/source/init/file-scanner.ts +238 -0
  169. package/source/init/framework-detector.ts +382 -0
  170. package/source/init/language-detector.ts +269 -0
  171. package/source/init/project-analyzer.spec.ts +231 -0
  172. package/source/init/project-analyzer.ts +458 -0
  173. package/source/lsp/index.ts +31 -0
  174. package/source/lsp/lsp-client.spec.ts +508 -0
  175. package/source/lsp/lsp-client.ts +487 -0
  176. package/source/lsp/lsp-manager.spec.ts +477 -0
  177. package/source/lsp/lsp-manager.ts +419 -0
  178. package/source/lsp/protocol.spec.ts +502 -0
  179. package/source/lsp/protocol.ts +360 -0
  180. package/source/lsp/server-discovery.spec.ts +654 -0
  181. package/source/lsp/server-discovery.ts +515 -0
  182. package/source/markdown-parser/html-entities.spec.ts +88 -0
  183. package/source/markdown-parser/html-entities.ts +45 -0
  184. package/source/markdown-parser/index.spec.ts +281 -0
  185. package/source/markdown-parser/index.ts +126 -0
  186. package/source/markdown-parser/table-parser.spec.ts +133 -0
  187. package/source/markdown-parser/table-parser.ts +114 -0
  188. package/source/markdown-parser/utils.spec.ts +70 -0
  189. package/source/markdown-parser/utils.ts +13 -0
  190. package/source/mcp/mcp-client.spec.ts +81 -0
  191. package/source/mcp/mcp-client.ts +625 -0
  192. package/source/mcp/transport-factory.spec.ts +406 -0
  193. package/source/mcp/transport-factory.ts +312 -0
  194. package/source/message-handler.ts +67 -0
  195. package/source/model-database/database-engine.spec.ts +494 -0
  196. package/source/model-database/database-engine.ts +50 -0
  197. package/source/model-database/model-database.spec.ts +363 -0
  198. package/source/model-database/model-database.ts +91 -0
  199. package/source/model-database/model-engine.spec.ts +447 -0
  200. package/source/model-database/model-engine.ts +65 -0
  201. package/source/model-database/model-fetcher.spec.ts +583 -0
  202. package/source/model-database/model-fetcher.ts +330 -0
  203. package/source/models/index.ts +1 -0
  204. package/source/models/models-cache.spec.ts +214 -0
  205. package/source/models/models-cache.ts +78 -0
  206. package/source/models/models-dev-client.spec.ts +379 -0
  207. package/source/models/models-dev-client.ts +329 -0
  208. package/source/models/models-types.ts +68 -0
  209. package/source/prompt-history.ts +155 -0
  210. package/source/security/command-injection.spec.ts +240 -0
  211. package/source/services/checkpoint-manager.spec.ts +523 -0
  212. package/source/services/checkpoint-manager.ts +466 -0
  213. package/source/services/file-snapshot.spec.ts +569 -0
  214. package/source/services/file-snapshot.ts +220 -0
  215. package/source/test-utils/render-with-theme.tsx +48 -0
  216. package/source/tokenization/index.ts +1 -0
  217. package/source/tokenization/tokenizer-factory.spec.ts +170 -0
  218. package/source/tokenization/tokenizer-factory.ts +125 -0
  219. package/source/tokenization/tokenizers/anthropic-tokenizer.spec.ts +200 -0
  220. package/source/tokenization/tokenizers/anthropic-tokenizer.ts +43 -0
  221. package/source/tokenization/tokenizers/fallback-tokenizer.spec.ts +236 -0
  222. package/source/tokenization/tokenizers/fallback-tokenizer.ts +26 -0
  223. package/source/tokenization/tokenizers/llama-tokenizer.spec.ts +224 -0
  224. package/source/tokenization/tokenizers/llama-tokenizer.ts +41 -0
  225. package/source/tokenization/tokenizers/openai-tokenizer.spec.ts +184 -0
  226. package/source/tokenization/tokenizers/openai-tokenizer.ts +57 -0
  227. package/source/tool-calling/index.ts +5 -0
  228. package/source/tool-calling/json-parser.spec.ts +639 -0
  229. package/source/tool-calling/json-parser.ts +247 -0
  230. package/source/tool-calling/tool-parser.spec.ts +395 -0
  231. package/source/tool-calling/tool-parser.ts +120 -0
  232. package/source/tool-calling/xml-parser.spec.ts +662 -0
  233. package/source/tool-calling/xml-parser.ts +289 -0
  234. package/source/tools/execute-bash.spec.tsx +353 -0
  235. package/source/tools/execute-bash.tsx +219 -0
  236. package/source/tools/execute-function.spec.ts +130 -0
  237. package/source/tools/fetch-url.spec.tsx +342 -0
  238. package/source/tools/fetch-url.tsx +172 -0
  239. package/source/tools/find-files.spec.tsx +924 -0
  240. package/source/tools/find-files.tsx +293 -0
  241. package/source/tools/index.ts +102 -0
  242. package/source/tools/lsp-get-diagnostics.tsx +192 -0
  243. package/source/tools/needs-approval.spec.ts +282 -0
  244. package/source/tools/read-file.spec.tsx +801 -0
  245. package/source/tools/read-file.tsx +387 -0
  246. package/source/tools/search-file-contents.spec.tsx +1273 -0
  247. package/source/tools/search-file-contents.tsx +293 -0
  248. package/source/tools/string-replace.spec.tsx +730 -0
  249. package/source/tools/string-replace.tsx +548 -0
  250. package/source/tools/tool-manager.ts +210 -0
  251. package/source/tools/tool-registry.spec.ts +415 -0
  252. package/source/tools/tool-registry.ts +228 -0
  253. package/source/tools/web-search.tsx +223 -0
  254. package/source/tools/write-file.spec.tsx +559 -0
  255. package/source/tools/write-file.tsx +228 -0
  256. package/source/types/app.ts +37 -0
  257. package/source/types/checkpoint.ts +48 -0
  258. package/source/types/commands.ts +46 -0
  259. package/source/types/components.ts +27 -0
  260. package/source/types/config.ts +103 -0
  261. package/source/types/core-connection-status.spec.ts +67 -0
  262. package/source/types/core.ts +181 -0
  263. package/source/types/hooks.ts +50 -0
  264. package/source/types/index.ts +12 -0
  265. package/source/types/markdown-parser.ts +11 -0
  266. package/source/types/mcp.ts +52 -0
  267. package/source/types/system.ts +16 -0
  268. package/source/types/tokenization.ts +41 -0
  269. package/source/types/ui.ts +40 -0
  270. package/source/types/usage.ts +58 -0
  271. package/source/types/utils.ts +16 -0
  272. package/source/usage/calculator.spec.ts +385 -0
  273. package/source/usage/calculator.ts +104 -0
  274. package/source/usage/storage.spec.ts +703 -0
  275. package/source/usage/storage.ts +238 -0
  276. package/source/usage/tracker.spec.ts +456 -0
  277. package/source/usage/tracker.ts +102 -0
  278. package/source/utils/atomic-deletion.spec.ts +194 -0
  279. package/source/utils/atomic-deletion.ts +127 -0
  280. package/source/utils/bounded-map.spec.ts +300 -0
  281. package/source/utils/bounded-map.ts +193 -0
  282. package/source/utils/checkpoint-utils.spec.ts +222 -0
  283. package/source/utils/checkpoint-utils.ts +92 -0
  284. package/source/utils/error-formatter.spec.ts +169 -0
  285. package/source/utils/error-formatter.ts +194 -0
  286. package/source/utils/file-autocomplete.spec.ts +173 -0
  287. package/source/utils/file-autocomplete.ts +196 -0
  288. package/source/utils/file-cache.spec.ts +309 -0
  289. package/source/utils/file-cache.ts +195 -0
  290. package/source/utils/file-content-loader.spec.ts +180 -0
  291. package/source/utils/file-content-loader.ts +179 -0
  292. package/source/utils/file-mention-handler.spec.ts +261 -0
  293. package/source/utils/file-mention-handler.ts +84 -0
  294. package/source/utils/file-mention-parser.spec.ts +182 -0
  295. package/source/utils/file-mention-parser.ts +170 -0
  296. package/source/utils/fuzzy-matching.spec.ts +149 -0
  297. package/source/utils/fuzzy-matching.ts +146 -0
  298. package/source/utils/indentation-normalizer.spec.ts +216 -0
  299. package/source/utils/indentation-normalizer.ts +76 -0
  300. package/source/utils/installation-detector.spec.ts +178 -0
  301. package/source/utils/installation-detector.ts +153 -0
  302. package/source/utils/logging/config.spec.ts +311 -0
  303. package/source/utils/logging/config.ts +210 -0
  304. package/source/utils/logging/console-facade.spec.ts +184 -0
  305. package/source/utils/logging/console-facade.ts +384 -0
  306. package/source/utils/logging/correlation.spec.ts +679 -0
  307. package/source/utils/logging/correlation.ts +474 -0
  308. package/source/utils/logging/formatters.spec.ts +464 -0
  309. package/source/utils/logging/formatters.ts +207 -0
  310. package/source/utils/logging/health-monitor/alerts/alert-manager.spec.ts +93 -0
  311. package/source/utils/logging/health-monitor/alerts/alert-manager.ts +79 -0
  312. package/source/utils/logging/health-monitor/checks/configuration-check.spec.ts +56 -0
  313. package/source/utils/logging/health-monitor/checks/configuration-check.ts +43 -0
  314. package/source/utils/logging/health-monitor/checks/logging-check.spec.ts +56 -0
  315. package/source/utils/logging/health-monitor/checks/logging-check.ts +58 -0
  316. package/source/utils/logging/health-monitor/checks/memory-check.spec.ts +100 -0
  317. package/source/utils/logging/health-monitor/checks/memory-check.ts +78 -0
  318. package/source/utils/logging/health-monitor/checks/performance-check.spec.ts +56 -0
  319. package/source/utils/logging/health-monitor/checks/performance-check.ts +56 -0
  320. package/source/utils/logging/health-monitor/checks/request-check.spec.ts +56 -0
  321. package/source/utils/logging/health-monitor/checks/request-check.ts +76 -0
  322. package/source/utils/logging/health-monitor/core/health-check-runner.spec.ts +70 -0
  323. package/source/utils/logging/health-monitor/core/health-check-runner.ts +138 -0
  324. package/source/utils/logging/health-monitor/core/health-monitor.spec.ts +58 -0
  325. package/source/utils/logging/health-monitor/core/health-monitor.ts +344 -0
  326. package/source/utils/logging/health-monitor/core/scoring.spec.ts +65 -0
  327. package/source/utils/logging/health-monitor/core/scoring.ts +91 -0
  328. package/source/utils/logging/health-monitor/index.ts +15 -0
  329. package/source/utils/logging/health-monitor/instances.ts +48 -0
  330. package/source/utils/logging/health-monitor/middleware/http-middleware.spec.ts +141 -0
  331. package/source/utils/logging/health-monitor/middleware/http-middleware.ts +75 -0
  332. package/source/utils/logging/health-monitor/types.ts +126 -0
  333. package/source/utils/logging/index.spec.ts +284 -0
  334. package/source/utils/logging/index.ts +236 -0
  335. package/source/utils/logging/integration.spec.ts +441 -0
  336. package/source/utils/logging/log-method-factory.spec.ts +573 -0
  337. package/source/utils/logging/log-method-factory.ts +233 -0
  338. package/source/utils/logging/log-query/aggregation/aggregator.spec.ts +277 -0
  339. package/source/utils/logging/log-query/aggregation/aggregator.ts +159 -0
  340. package/source/utils/logging/log-query/aggregation/facet-generator.spec.ts +159 -0
  341. package/source/utils/logging/log-query/aggregation/facet-generator.ts +47 -0
  342. package/source/utils/logging/log-query/index.ts +23 -0
  343. package/source/utils/logging/log-query/query/filter-predicates.spec.ts +247 -0
  344. package/source/utils/logging/log-query/query/filter-predicates.ts +154 -0
  345. package/source/utils/logging/log-query/query/query-builder.spec.ts +182 -0
  346. package/source/utils/logging/log-query/query/query-builder.ts +151 -0
  347. package/source/utils/logging/log-query/query/query-engine.spec.ts +214 -0
  348. package/source/utils/logging/log-query/query/query-engine.ts +45 -0
  349. package/source/utils/logging/log-query/storage/circular-buffer.spec.ts +143 -0
  350. package/source/utils/logging/log-query/storage/circular-buffer.ts +75 -0
  351. package/source/utils/logging/log-query/storage/index-manager.spec.ts +150 -0
  352. package/source/utils/logging/log-query/storage/index-manager.ts +71 -0
  353. package/source/utils/logging/log-query/storage/log-storage.spec.ts +257 -0
  354. package/source/utils/logging/log-query/storage/log-storage.ts +80 -0
  355. package/source/utils/logging/log-query/types.ts +163 -0
  356. package/source/utils/logging/log-query/utils/helpers.spec.ts +263 -0
  357. package/source/utils/logging/log-query/utils/helpers.ts +72 -0
  358. package/source/utils/logging/log-query/utils/sorting.spec.ts +182 -0
  359. package/source/utils/logging/log-query/utils/sorting.ts +61 -0
  360. package/source/utils/logging/logger-provider.spec.ts +262 -0
  361. package/source/utils/logging/logger-provider.ts +362 -0
  362. package/source/utils/logging/performance.spec.ts +209 -0
  363. package/source/utils/logging/performance.ts +757 -0
  364. package/source/utils/logging/pino-logger.spec.ts +425 -0
  365. package/source/utils/logging/pino-logger.ts +514 -0
  366. package/source/utils/logging/redaction.spec.ts +490 -0
  367. package/source/utils/logging/redaction.ts +267 -0
  368. package/source/utils/logging/request-tracker.spec.ts +1198 -0
  369. package/source/utils/logging/request-tracker.ts +803 -0
  370. package/source/utils/logging/transports.spec.ts +505 -0
  371. package/source/utils/logging/transports.ts +305 -0
  372. package/source/utils/logging/types.ts +216 -0
  373. package/source/utils/message-builder.spec.ts +179 -0
  374. package/source/utils/message-builder.ts +101 -0
  375. package/source/utils/message-queue.tsx +486 -0
  376. package/source/utils/paste-detection.spec.ts +69 -0
  377. package/source/utils/paste-detection.ts +124 -0
  378. package/source/utils/paste-roundtrip.spec.ts +442 -0
  379. package/source/utils/paste-utils.spec.ts +128 -0
  380. package/source/utils/paste-utils.ts +52 -0
  381. package/source/utils/programming-language-helper.spec.ts +74 -0
  382. package/source/utils/programming-language-helper.ts +32 -0
  383. package/source/utils/prompt-assembly.spec.ts +221 -0
  384. package/source/utils/prompt-processor.ts +173 -0
  385. package/source/utils/tool-args-parser.spec.ts +136 -0
  386. package/source/utils/tool-args-parser.ts +54 -0
  387. package/source/utils/tool-cancellation.spec.ts +230 -0
  388. package/source/utils/tool-cancellation.ts +28 -0
  389. package/source/utils/tool-result-display.spec.tsx +469 -0
  390. package/source/utils/tool-result-display.tsx +90 -0
  391. package/source/utils/update-checker.spec.ts +383 -0
  392. package/source/utils/update-checker.ts +183 -0
  393. package/source/wizard/config-wizard.spec.tsx +103 -0
  394. package/source/wizard/config-wizard.tsx +382 -0
  395. package/source/wizard/steps/location-step.spec.tsx +186 -0
  396. package/source/wizard/steps/location-step.tsx +147 -0
  397. package/source/wizard/steps/mcp-step.spec.tsx +607 -0
  398. package/source/wizard/steps/mcp-step.tsx +632 -0
  399. package/source/wizard/steps/provider-step.spec.tsx +342 -0
  400. package/source/wizard/steps/provider-step.tsx +957 -0
  401. package/source/wizard/steps/summary-step.spec.tsx +749 -0
  402. package/source/wizard/steps/summary-step.tsx +228 -0
  403. package/source/wizard/templates/mcp-templates.spec.ts +613 -0
  404. package/source/wizard/templates/mcp-templates.ts +570 -0
  405. package/source/wizard/templates/provider-templates.spec.ts +152 -0
  406. package/source/wizard/templates/provider-templates.ts +485 -0
  407. package/source/wizard/utils/fetch-cloud-models.spec.ts +428 -0
  408. package/source/wizard/utils/fetch-cloud-models.ts +223 -0
  409. package/source/wizard/utils/fetch-local-models.spec.ts +297 -0
  410. package/source/wizard/utils/fetch-local-models.ts +192 -0
  411. package/source/wizard/validation-array.spec.ts +264 -0
  412. package/source/wizard/validation.spec.ts +373 -0
  413. package/source/wizard/validation.ts +232 -0
  414. package/source/app/prompts/main-prompt.md +0 -122
@@ -0,0 +1,67 @@
1
+ import type {ToolManager} from '@/tools/tool-manager';
2
+ import type {ToolCall, ToolHandler, ToolResult} from '@/types/index';
3
+ import {formatError} from '@/utils/error-formatter';
4
+ import {parseToolArguments} from '@/utils/tool-args-parser';
5
+
6
+ // This will be set by the ChatSession
7
+ let toolRegistryGetter: (() => Record<string, ToolHandler>) | null = null;
8
+
9
+ // This will be set by the App
10
+ let toolManagerGetter: (() => ToolManager | null) | null = null;
11
+
12
+ export function setToolRegistryGetter(
13
+ getter: () => Record<string, ToolHandler>,
14
+ ) {
15
+ toolRegistryGetter = getter;
16
+ }
17
+
18
+ export function setToolManagerGetter(getter: () => ToolManager | null) {
19
+ toolManagerGetter = getter;
20
+ }
21
+
22
+ export function getToolManager(): ToolManager | null {
23
+ return toolManagerGetter ? toolManagerGetter() : null;
24
+ }
25
+
26
+ export async function processToolUse(toolCall: ToolCall): Promise<ToolResult> {
27
+ // Handle XML validation errors by throwing (will be caught and returned as error ToolResult)
28
+ if (toolCall.function.name === '__xml_validation_error__') {
29
+ const args = toolCall.function.arguments as {error: string};
30
+ throw new Error(args.error);
31
+ }
32
+
33
+ if (!toolRegistryGetter) {
34
+ throw new Error('Tool registry not initialized');
35
+ }
36
+
37
+ const toolRegistry = toolRegistryGetter();
38
+ const handler = toolRegistry[toolCall.function.name];
39
+ if (!handler) {
40
+ throw new Error(`Unknown tool: ${toolCall.function.name}`);
41
+ }
42
+
43
+ try {
44
+ // Parse arguments - use strict mode to throw error on parse failure
45
+ // Strict mode is required here to catch malformed arguments before tool execution
46
+ const parsedArgs = parseToolArguments<Record<string, unknown>>(
47
+ toolCall.function.arguments,
48
+ {strict: true},
49
+ );
50
+ const result = await handler(parsedArgs);
51
+ return {
52
+ tool_call_id: toolCall.id,
53
+ role: 'tool',
54
+ name: toolCall.function.name,
55
+ content: result,
56
+ };
57
+ } catch (error) {
58
+ // Convert exceptions to error messages that the model can see and correct
59
+ const errorMessage = `Error: ${formatError(error)}`;
60
+ return {
61
+ tool_call_id: toolCall.id,
62
+ role: 'tool',
63
+ name: toolCall.function.name,
64
+ content: errorMessage,
65
+ };
66
+ }
67
+ }
@@ -0,0 +1,494 @@
1
+ import {ModelEntry} from '@/types/index';
2
+ import test from 'ava';
3
+ import {DatabaseEngine} from './database-engine';
4
+ import {modelMatchingEngine} from './model-engine';
5
+
6
+ console.log(`\ndatabase-engine.spec.ts`);
7
+
8
+ // Create mock models for testing
9
+ function createMockModels(): ModelEntry[] {
10
+ return [
11
+ {
12
+ id: 'openai/gpt-4',
13
+ name: 'GPT-4',
14
+ author: 'Openai',
15
+ size: '128K',
16
+ local: false,
17
+ api: true,
18
+ contextLength: 128000,
19
+ created: 1700000000,
20
+ quality: {cost: 5},
21
+ costType: 'paid',
22
+ costDetails: '$30.00/M in, $60.00/M out',
23
+ hasToolSupport: true,
24
+ },
25
+ {
26
+ id: 'anthropic/claude-3-opus',
27
+ name: 'Claude 3 Opus',
28
+ author: 'Anthropic',
29
+ size: '200K',
30
+ local: false,
31
+ api: true,
32
+ contextLength: 200000,
33
+ created: 1710000000,
34
+ quality: {cost: 3},
35
+ costType: 'paid',
36
+ costDetails: '$15.00/M in, $75.00/M out',
37
+ hasToolSupport: true,
38
+ },
39
+ {
40
+ id: 'meta-llama/llama-3.1-70b',
41
+ name: 'Llama 3.1 70B',
42
+ author: 'Meta-llama',
43
+ size: '128K',
44
+ local: true,
45
+ api: true,
46
+ contextLength: 128000,
47
+ created: 1715000000,
48
+ quality: {cost: 9},
49
+ costType: 'free',
50
+ costDetails: 'Free (open weights)',
51
+ hasToolSupport: true,
52
+ },
53
+ {
54
+ id: 'mistralai/mistral-large',
55
+ name: 'Mistral Large',
56
+ author: 'Mistralai',
57
+ size: '128K',
58
+ local: true,
59
+ api: true,
60
+ contextLength: 128000,
61
+ created: 1712000000,
62
+ quality: {cost: 8},
63
+ costType: 'free',
64
+ costDetails: 'Free (open weights)',
65
+ hasToolSupport: true,
66
+ },
67
+ ];
68
+ }
69
+
70
+ // Mock ModelResults type
71
+ interface MockModelResults {
72
+ allModels: ModelEntry[];
73
+ openModels: ModelEntry[];
74
+ proprietaryModels: ModelEntry[];
75
+ latestModels: ModelEntry[];
76
+ }
77
+
78
+ function createMockModelResults(models: ModelEntry[]): MockModelResults {
79
+ const openModels = models.filter(m => m.local);
80
+ const proprietaryModels = models.filter(m => !m.local);
81
+ const latestModels = [...models].sort((a, b) => b.created - a.created);
82
+
83
+ return {
84
+ allModels: models,
85
+ openModels,
86
+ proprietaryModels,
87
+ latestModels,
88
+ };
89
+ }
90
+
91
+ // Helper to create a fresh instance for each test
92
+ function createFreshInstance(): DatabaseEngine {
93
+ const instance = new (DatabaseEngine as any)();
94
+ return instance;
95
+ }
96
+
97
+ test.serial('getInstance returns singleton instance', t => {
98
+ const instance1 = DatabaseEngine.getInstance();
99
+ const instance2 = DatabaseEngine.getInstance();
100
+ t.is(instance1, instance2);
101
+ });
102
+
103
+ test.serial('getDatabases returns database result structure', t => {
104
+ const engine = createFreshInstance();
105
+ const mockModels = createMockModels();
106
+ const mockResults = createMockModelResults(mockModels);
107
+
108
+ const originalGetModels = modelMatchingEngine.getModels;
109
+ modelMatchingEngine.getModels = () => mockResults;
110
+
111
+ try {
112
+ const result = engine.getDatabases();
113
+
114
+ t.true(Array.isArray(result.openModels));
115
+ t.true(Array.isArray(result.proprietaryModels));
116
+ t.true(Array.isArray(result.latestModels));
117
+ t.true(Array.isArray(result.allModels));
118
+ } finally {
119
+ modelMatchingEngine.getModels = originalGetModels;
120
+ }
121
+ });
122
+
123
+ test.serial('getDatabases returns open models correctly', t => {
124
+ const engine = createFreshInstance();
125
+ const mockModels = createMockModels();
126
+ const mockResults = createMockModelResults(mockModels);
127
+
128
+ const originalGetModels = modelMatchingEngine.getModels;
129
+ modelMatchingEngine.getModels = () => mockResults;
130
+
131
+ try {
132
+ const result = engine.getDatabases();
133
+
134
+ t.is(result.openModels.length, 2);
135
+ t.true(result.openModels.every(m => m.local === true));
136
+ } finally {
137
+ modelMatchingEngine.getModels = originalGetModels;
138
+ }
139
+ });
140
+
141
+ test.serial('getDatabases returns proprietary models correctly', t => {
142
+ const engine = createFreshInstance();
143
+ const mockModels = createMockModels();
144
+ const mockResults = createMockModelResults(mockModels);
145
+
146
+ const originalGetModels = modelMatchingEngine.getModels;
147
+ modelMatchingEngine.getModels = () => mockResults;
148
+
149
+ try {
150
+ const result = engine.getDatabases();
151
+
152
+ t.is(result.proprietaryModels.length, 2);
153
+ t.true(result.proprietaryModels.every(m => m.local === false));
154
+ } finally {
155
+ modelMatchingEngine.getModels = originalGetModels;
156
+ }
157
+ });
158
+
159
+ test.serial('getDatabases returns latest models', t => {
160
+ const engine = createFreshInstance();
161
+ const mockModels = createMockModels();
162
+ const mockResults = createMockModelResults(mockModels);
163
+
164
+ const originalGetModels = modelMatchingEngine.getModels;
165
+ modelMatchingEngine.getModels = () => mockResults;
166
+
167
+ try {
168
+ const result = engine.getDatabases();
169
+
170
+ t.is(result.latestModels.length, mockModels.length);
171
+ } finally {
172
+ modelMatchingEngine.getModels = originalGetModels;
173
+ }
174
+ });
175
+
176
+ test.serial('getDatabases returns all models', t => {
177
+ const engine = createFreshInstance();
178
+ const mockModels = createMockModels();
179
+ const mockResults = createMockModelResults(mockModels);
180
+
181
+ const originalGetModels = modelMatchingEngine.getModels;
182
+ modelMatchingEngine.getModels = () => mockResults;
183
+
184
+ try {
185
+ const result = engine.getDatabases();
186
+
187
+ t.is(result.allModels.length, mockModels.length);
188
+ } finally {
189
+ modelMatchingEngine.getModels = originalGetModels;
190
+ }
191
+ });
192
+
193
+ test.serial('getDatabasesAsync returns database result structure', async t => {
194
+ const engine = createFreshInstance();
195
+ const mockModels = createMockModels();
196
+ const mockResults = createMockModelResults(mockModels);
197
+
198
+ const originalGetModelsAsync = modelMatchingEngine.getModelsAsync;
199
+ modelMatchingEngine.getModelsAsync = async () => mockResults;
200
+
201
+ try {
202
+ const result = await engine.getDatabasesAsync();
203
+
204
+ t.true(Array.isArray(result.openModels));
205
+ t.true(Array.isArray(result.proprietaryModels));
206
+ t.true(Array.isArray(result.latestModels));
207
+ t.true(Array.isArray(result.allModels));
208
+ } finally {
209
+ modelMatchingEngine.getModelsAsync = originalGetModelsAsync;
210
+ }
211
+ });
212
+
213
+ test.serial('getDatabasesAsync returns open models correctly', async t => {
214
+ const engine = createFreshInstance();
215
+ const mockModels = createMockModels();
216
+ const mockResults = createMockModelResults(mockModels);
217
+
218
+ const originalGetModelsAsync = modelMatchingEngine.getModelsAsync;
219
+ modelMatchingEngine.getModelsAsync = async () => mockResults;
220
+
221
+ try {
222
+ const result = await engine.getDatabasesAsync();
223
+
224
+ t.is(result.openModels.length, 2);
225
+ t.true(result.openModels.every(m => m.local === true));
226
+ } finally {
227
+ modelMatchingEngine.getModelsAsync = originalGetModelsAsync;
228
+ }
229
+ });
230
+
231
+ test.serial(
232
+ 'getDatabasesAsync returns proprietary models correctly',
233
+ async t => {
234
+ const engine = createFreshInstance();
235
+ const mockModels = createMockModels();
236
+ const mockResults = createMockModelResults(mockModels);
237
+
238
+ const originalGetModelsAsync = modelMatchingEngine.getModelsAsync;
239
+ modelMatchingEngine.getModelsAsync = async () => mockResults;
240
+
241
+ try {
242
+ const result = await engine.getDatabasesAsync();
243
+
244
+ t.is(result.proprietaryModels.length, 2);
245
+ t.true(result.proprietaryModels.every(m => m.local === false));
246
+ } finally {
247
+ modelMatchingEngine.getModelsAsync = originalGetModelsAsync;
248
+ }
249
+ },
250
+ );
251
+
252
+ test.serial('getDatabasesAsync returns latest models', async t => {
253
+ const engine = createFreshInstance();
254
+ const mockModels = createMockModels();
255
+ const mockResults = createMockModelResults(mockModels);
256
+
257
+ const originalGetModelsAsync = modelMatchingEngine.getModelsAsync;
258
+ modelMatchingEngine.getModelsAsync = async () => mockResults;
259
+
260
+ try {
261
+ const result = await engine.getDatabasesAsync();
262
+
263
+ t.is(result.latestModels.length, mockModels.length);
264
+ } finally {
265
+ modelMatchingEngine.getModelsAsync = originalGetModelsAsync;
266
+ }
267
+ });
268
+
269
+ test.serial('getDatabasesAsync returns all models', async t => {
270
+ const engine = createFreshInstance();
271
+ const mockModels = createMockModels();
272
+ const mockResults = createMockModelResults(mockModels);
273
+
274
+ const originalGetModelsAsync = modelMatchingEngine.getModelsAsync;
275
+ modelMatchingEngine.getModelsAsync = async () => mockResults;
276
+
277
+ try {
278
+ const result = await engine.getDatabasesAsync();
279
+
280
+ t.is(result.allModels.length, mockModels.length);
281
+ } finally {
282
+ modelMatchingEngine.getModelsAsync = originalGetModelsAsync;
283
+ }
284
+ });
285
+
286
+ test.serial('getDatabases handles empty model list', t => {
287
+ const engine = createFreshInstance();
288
+ const mockResults = createMockModelResults([]);
289
+
290
+ const originalGetModels = modelMatchingEngine.getModels;
291
+ modelMatchingEngine.getModels = () => mockResults;
292
+
293
+ try {
294
+ const result = engine.getDatabases();
295
+
296
+ t.deepEqual(result.openModels, []);
297
+ t.deepEqual(result.proprietaryModels, []);
298
+ t.deepEqual(result.latestModels, []);
299
+ t.deepEqual(result.allModels, []);
300
+ } finally {
301
+ modelMatchingEngine.getModels = originalGetModels;
302
+ }
303
+ });
304
+
305
+ test.serial('getDatabasesAsync handles empty model list', async t => {
306
+ const engine = createFreshInstance();
307
+ const mockResults = createMockModelResults([]);
308
+
309
+ const originalGetModelsAsync = modelMatchingEngine.getModelsAsync;
310
+ modelMatchingEngine.getModelsAsync = async () => mockResults;
311
+
312
+ try {
313
+ const result = await engine.getDatabasesAsync();
314
+
315
+ t.deepEqual(result.openModels, []);
316
+ t.deepEqual(result.proprietaryModels, []);
317
+ t.deepEqual(result.latestModels, []);
318
+ t.deepEqual(result.allModels, []);
319
+ } finally {
320
+ modelMatchingEngine.getModelsAsync = originalGetModelsAsync;
321
+ }
322
+ });
323
+
324
+ test.serial(
325
+ 'getDatabasesAsync handles errors from matching engine',
326
+ async t => {
327
+ const engine = createFreshInstance();
328
+
329
+ const originalGetModelsAsync = modelMatchingEngine.getModelsAsync;
330
+ modelMatchingEngine.getModelsAsync = async () => {
331
+ throw new Error('Engine error');
332
+ };
333
+
334
+ try {
335
+ await t.throwsAsync(() => engine.getDatabasesAsync(), {
336
+ message: 'Engine error',
337
+ });
338
+ } finally {
339
+ modelMatchingEngine.getModelsAsync = originalGetModelsAsync;
340
+ }
341
+ },
342
+ );
343
+
344
+ test.serial('getDatabases passes through all model properties', t => {
345
+ const engine = createFreshInstance();
346
+ const mockModels = createMockModels();
347
+ const mockResults = createMockModelResults(mockModels);
348
+
349
+ const originalGetModels = modelMatchingEngine.getModels;
350
+ modelMatchingEngine.getModels = () => mockResults;
351
+
352
+ try {
353
+ const result = engine.getDatabases();
354
+ const gpt4 = result.allModels.find(m => m.id === 'openai/gpt-4');
355
+
356
+ t.truthy(gpt4);
357
+ t.is(gpt4?.name, 'GPT-4');
358
+ t.is(gpt4?.author, 'Openai');
359
+ t.is(gpt4?.size, '128K');
360
+ t.is(gpt4?.local, false);
361
+ t.is(gpt4?.api, true);
362
+ t.is(gpt4?.contextLength, 128000);
363
+ t.is(gpt4?.quality.cost, 5);
364
+ t.is(gpt4?.costType, 'paid');
365
+ t.is(gpt4?.hasToolSupport, true);
366
+ } finally {
367
+ modelMatchingEngine.getModels = originalGetModels;
368
+ }
369
+ });
370
+
371
+ test.serial(
372
+ 'getDatabasesAsync passes through all model properties',
373
+ async t => {
374
+ const engine = createFreshInstance();
375
+ const mockModels = createMockModels();
376
+ const mockResults = createMockModelResults(mockModels);
377
+
378
+ const originalGetModelsAsync = modelMatchingEngine.getModelsAsync;
379
+ modelMatchingEngine.getModelsAsync = async () => mockResults;
380
+
381
+ try {
382
+ const result = await engine.getDatabasesAsync();
383
+ const llama = result.allModels.find(
384
+ m => m.id === 'meta-llama/llama-3.1-70b',
385
+ );
386
+
387
+ t.truthy(llama);
388
+ t.is(llama?.name, 'Llama 3.1 70B');
389
+ t.is(llama?.author, 'Meta-llama');
390
+ t.is(llama?.size, '128K');
391
+ t.is(llama?.local, true);
392
+ t.is(llama?.api, true);
393
+ t.is(llama?.contextLength, 128000);
394
+ t.is(llama?.quality.cost, 9);
395
+ t.is(llama?.costType, 'free');
396
+ t.is(llama?.hasToolSupport, true);
397
+ } finally {
398
+ modelMatchingEngine.getModelsAsync = originalGetModelsAsync;
399
+ }
400
+ },
401
+ );
402
+
403
+ test.serial(
404
+ 'getDatabases and getDatabasesAsync return equivalent structures',
405
+ async t => {
406
+ const engine = createFreshInstance();
407
+ const mockModels = createMockModels();
408
+ const mockResults = createMockModelResults(mockModels);
409
+
410
+ const originalGetModels = modelMatchingEngine.getModels;
411
+ const originalGetModelsAsync = modelMatchingEngine.getModelsAsync;
412
+ modelMatchingEngine.getModels = () => mockResults;
413
+ modelMatchingEngine.getModelsAsync = async () => mockResults;
414
+
415
+ try {
416
+ const syncResult = engine.getDatabases();
417
+ const asyncResult = await engine.getDatabasesAsync();
418
+
419
+ t.deepEqual(syncResult.openModels, asyncResult.openModels);
420
+ t.deepEqual(syncResult.proprietaryModels, asyncResult.proprietaryModels);
421
+ t.deepEqual(syncResult.latestModels, asyncResult.latestModels);
422
+ t.deepEqual(syncResult.allModels, asyncResult.allModels);
423
+ } finally {
424
+ modelMatchingEngine.getModels = originalGetModels;
425
+ modelMatchingEngine.getModelsAsync = originalGetModelsAsync;
426
+ }
427
+ },
428
+ );
429
+
430
+ test.serial('getDatabases handles only open models', t => {
431
+ const engine = createFreshInstance();
432
+ const openOnlyModels: ModelEntry[] = [
433
+ {
434
+ id: 'meta-llama/llama-3.1-70b',
435
+ name: 'Llama 3.1 70B',
436
+ author: 'Meta-llama',
437
+ size: '128K',
438
+ local: true,
439
+ api: true,
440
+ contextLength: 128000,
441
+ created: 1715000000,
442
+ quality: {cost: 9},
443
+ costType: 'free',
444
+ costDetails: 'Free (open weights)',
445
+ hasToolSupport: true,
446
+ },
447
+ ];
448
+ const mockResults = createMockModelResults(openOnlyModels);
449
+
450
+ const originalGetModels = modelMatchingEngine.getModels;
451
+ modelMatchingEngine.getModels = () => mockResults;
452
+
453
+ try {
454
+ const result = engine.getDatabases();
455
+
456
+ t.is(result.openModels.length, 1);
457
+ t.is(result.proprietaryModels.length, 0);
458
+ } finally {
459
+ modelMatchingEngine.getModels = originalGetModels;
460
+ }
461
+ });
462
+
463
+ test.serial('getDatabases handles only proprietary models', t => {
464
+ const engine = createFreshInstance();
465
+ const proprietaryOnlyModels: ModelEntry[] = [
466
+ {
467
+ id: 'openai/gpt-4',
468
+ name: 'GPT-4',
469
+ author: 'Openai',
470
+ size: '128K',
471
+ local: false,
472
+ api: true,
473
+ contextLength: 128000,
474
+ created: 1700000000,
475
+ quality: {cost: 5},
476
+ costType: 'paid',
477
+ costDetails: '$30.00/M in, $60.00/M out',
478
+ hasToolSupport: true,
479
+ },
480
+ ];
481
+ const mockResults = createMockModelResults(proprietaryOnlyModels);
482
+
483
+ const originalGetModels = modelMatchingEngine.getModels;
484
+ modelMatchingEngine.getModels = () => mockResults;
485
+
486
+ try {
487
+ const result = engine.getDatabases();
488
+
489
+ t.is(result.openModels.length, 0);
490
+ t.is(result.proprietaryModels.length, 1);
491
+ } finally {
492
+ modelMatchingEngine.getModels = originalGetModels;
493
+ }
494
+ });
@@ -0,0 +1,50 @@
1
+ import {ModelResults, modelMatchingEngine} from '@/model-database/model-engine';
2
+ import {ModelEntry} from '@/types/index';
3
+
4
+ export interface DatabaseResult {
5
+ openModels: ModelEntry[];
6
+ proprietaryModels: ModelEntry[];
7
+ latestModels: ModelEntry[];
8
+ allModels: ModelEntry[];
9
+ }
10
+
11
+ export class DatabaseEngine {
12
+ private static instance: DatabaseEngine;
13
+
14
+ static getInstance(): DatabaseEngine {
15
+ if (!DatabaseEngine.instance) {
16
+ DatabaseEngine.instance = new DatabaseEngine();
17
+ }
18
+ return DatabaseEngine.instance;
19
+ }
20
+
21
+ /**
22
+ * Get model lists (sync - uses cached data)
23
+ */
24
+ getDatabases(): DatabaseResult {
25
+ const results = modelMatchingEngine.getModels();
26
+ return this.processResults(results);
27
+ }
28
+
29
+ /**
30
+ * Get model lists asynchronously - fetches fresh data
31
+ */
32
+ async getDatabasesAsync(): Promise<DatabaseResult> {
33
+ const results = await modelMatchingEngine.getModelsAsync();
34
+ return this.processResults(results);
35
+ }
36
+
37
+ /**
38
+ * Process model results into database result
39
+ */
40
+ private processResults(results: ModelResults): DatabaseResult {
41
+ return {
42
+ openModels: results.openModels,
43
+ proprietaryModels: results.proprietaryModels,
44
+ latestModels: results.latestModels,
45
+ allModels: results.allModels,
46
+ };
47
+ }
48
+ }
49
+
50
+ export const databaseEngine = DatabaseEngine.getInstance();