@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.
- package/README.md +2 -5
- package/assets/nanocoder-vscode.vsix +0 -0
- package/dist/ai-sdk-client-empty-message.spec.d.ts +2 -0
- package/dist/ai-sdk-client-empty-message.spec.d.ts.map +1 -0
- package/dist/ai-sdk-client-empty-message.spec.js +124 -0
- package/dist/ai-sdk-client-empty-message.spec.js.map +1 -0
- package/dist/ai-sdk-client.d.ts +18 -2
- package/dist/ai-sdk-client.d.ts.map +1 -1
- package/dist/ai-sdk-client.js +159 -122
- package/dist/ai-sdk-client.js.map +1 -1
- package/dist/app/utils/appUtils.js +3 -3
- package/dist/app/utils/appUtils.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +22 -11
- package/dist/app.js.map +1 -1
- package/dist/commands/debugging.d.ts +3 -0
- package/dist/commands/debugging.d.ts.map +1 -0
- package/dist/commands/debugging.js +23 -0
- package/dist/commands/debugging.js.map +1 -0
- package/dist/commands/index.d.ts +2 -2
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +2 -2
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/model-database.d.ts +8 -0
- package/dist/commands/model-database.d.ts.map +1 -0
- package/dist/commands/model-database.js +193 -0
- package/dist/commands/model-database.js.map +1 -0
- package/dist/commands/usage.d.ts.map +1 -1
- package/dist/commands/usage.js +1 -1
- package/dist/commands/usage.js.map +1 -1
- package/dist/components/assistant-message.d.ts.map +1 -1
- package/dist/components/assistant-message.js +3 -2
- package/dist/components/assistant-message.js.map +1 -1
- package/dist/components/status.d.ts +3 -0
- package/dist/components/status.d.ts.map +1 -1
- package/dist/components/status.js +24 -3
- package/dist/components/status.js.map +1 -1
- package/dist/components/user-input.d.ts.map +1 -1
- package/dist/components/user-input.js +2 -1
- package/dist/components/user-input.js.map +1 -1
- package/dist/config/preferences.d.ts +2 -2
- package/dist/config/preferences.js +5 -5
- package/dist/config/preferences.js.map +1 -1
- package/dist/context/mode-context.d.ts +12 -0
- package/dist/context/mode-context.d.ts.map +1 -0
- package/dist/context/mode-context.js +21 -0
- package/dist/context/mode-context.js.map +1 -0
- package/dist/context/mode-context.spec.d.ts +2 -0
- package/dist/context/mode-context.spec.d.ts.map +1 -0
- package/dist/context/mode-context.spec.js +61 -0
- package/dist/context/mode-context.spec.js.map +1 -0
- package/dist/hooks/useAppInitialization.d.ts +4 -2
- package/dist/hooks/useAppInitialization.d.ts.map +1 -1
- package/dist/hooks/useAppInitialization.js +101 -26
- package/dist/hooks/useAppInitialization.js.map +1 -1
- package/dist/hooks/useAppState.d.ts +7 -5
- package/dist/hooks/useAppState.d.ts.map +1 -1
- package/dist/hooks/useAppState.js +11 -7
- package/dist/hooks/useAppState.js.map +1 -1
- package/dist/hooks/useChatHandler.d.ts +2 -2
- package/dist/hooks/useChatHandler.d.ts.map +1 -1
- package/dist/hooks/useChatHandler.js +186 -111
- package/dist/hooks/useChatHandler.js.map +1 -1
- package/dist/hooks/useModeHandlers.d.ts +4 -4
- package/dist/hooks/useModeHandlers.d.ts.map +1 -1
- package/dist/hooks/useModeHandlers.js +9 -9
- package/dist/hooks/useModeHandlers.js.map +1 -1
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +16 -6
- package/dist/mcp/mcp-client.js.map +1 -1
- package/dist/message-handler.js +1 -1
- package/dist/message-handler.js.map +1 -1
- package/dist/model-database/database-engine.d.ts +25 -0
- package/dist/model-database/database-engine.d.ts.map +1 -0
- package/dist/model-database/database-engine.js +37 -0
- package/dist/model-database/database-engine.js.map +1 -0
- package/dist/model-database/database-engine.spec.d.ts +2 -0
- package/dist/model-database/database-engine.spec.d.ts.map +1 -0
- package/dist/model-database/database-engine.spec.js +413 -0
- package/dist/model-database/database-engine.spec.js.map +1 -0
- package/dist/model-database/model-database.d.ts +30 -0
- package/dist/model-database/model-database.d.ts.map +1 -0
- package/dist/model-database/model-database.js +82 -0
- package/dist/model-database/model-database.js.map +1 -0
- package/dist/model-database/model-database.spec.d.ts +2 -0
- package/dist/model-database/model-database.spec.d.ts.map +1 -0
- package/dist/model-database/model-database.spec.js +322 -0
- package/dist/model-database/model-database.spec.js.map +1 -0
- package/dist/model-database/model-engine.d.ts +25 -0
- package/dist/model-database/model-engine.d.ts.map +1 -0
- package/dist/model-database/model-engine.js +49 -0
- package/dist/model-database/model-engine.js.map +1 -0
- package/dist/model-database/model-engine.spec.d.ts +2 -0
- package/dist/model-database/model-engine.spec.d.ts.map +1 -0
- package/dist/model-database/model-engine.spec.js +381 -0
- package/dist/model-database/model-engine.spec.js.map +1 -0
- package/dist/model-database/model-fetcher.d.ts +14 -0
- package/dist/model-database/model-fetcher.d.ts.map +1 -0
- package/dist/model-database/model-fetcher.js +248 -0
- package/dist/model-database/model-fetcher.js.map +1 -0
- package/dist/model-database/model-fetcher.spec.d.ts +2 -0
- package/dist/model-database/model-fetcher.spec.d.ts.map +1 -0
- package/dist/model-database/model-fetcher.spec.js +498 -0
- package/dist/model-database/model-fetcher.spec.js.map +1 -0
- package/dist/models/models-dev-client.d.ts.map +1 -1
- package/dist/models/models-dev-client.js +8 -0
- package/dist/models/models-dev-client.js.map +1 -1
- package/dist/tool-calling/json-parser.d.ts.map +1 -1
- package/dist/tool-calling/json-parser.js +10 -4
- package/dist/tool-calling/json-parser.js.map +1 -1
- package/dist/tool-calling/tool-parser.d.ts.map +1 -1
- package/dist/tool-calling/tool-parser.js +37 -9
- package/dist/tool-calling/tool-parser.js.map +1 -1
- package/dist/tool-calling/tool-parser.spec.js +79 -1
- package/dist/tool-calling/tool-parser.spec.js.map +1 -1
- package/dist/tool-calling/xml-parser.d.ts.map +1 -1
- package/dist/tool-calling/xml-parser.js +21 -23
- package/dist/tool-calling/xml-parser.js.map +1 -1
- package/dist/tool-calling/xml-parser.spec.js +23 -3
- package/dist/tool-calling/xml-parser.spec.js.map +1 -1
- package/dist/tools/create-file.d.ts +24 -2
- package/dist/tools/create-file.d.ts.map +1 -1
- package/dist/tools/create-file.js +14 -10
- package/dist/tools/create-file.js.map +1 -1
- package/dist/tools/delete-lines.d.ts +18 -2
- package/dist/tools/delete-lines.d.ts.map +1 -1
- package/dist/tools/delete-lines.js +14 -9
- package/dist/tools/delete-lines.js.map +1 -1
- package/dist/tools/execute-bash.d.ts +2 -2
- package/dist/tools/execute-bash.d.ts.map +1 -1
- package/dist/tools/execute-bash.js +10 -9
- package/dist/tools/execute-bash.js.map +1 -1
- package/dist/tools/execute-function.spec.d.ts +2 -0
- package/dist/tools/execute-function.spec.d.ts.map +1 -0
- package/dist/tools/execute-function.spec.js +141 -0
- package/dist/tools/execute-function.spec.js.map +1 -0
- package/dist/tools/fetch-url.d.ts +16 -2
- package/dist/tools/fetch-url.d.ts.map +1 -1
- package/dist/tools/fetch-url.js +10 -10
- package/dist/tools/fetch-url.js.map +1 -1
- package/dist/tools/find-files.d.ts +18 -2
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +7 -5
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/index.d.ts +2 -3
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +30 -20
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/insert-lines.d.ts +18 -2
- package/dist/tools/insert-lines.d.ts.map +1 -1
- package/dist/tools/insert-lines.js +14 -9
- package/dist/tools/insert-lines.js.map +1 -1
- package/dist/tools/lsp-get-diagnostics.d.ts +10 -2
- package/dist/tools/lsp-get-diagnostics.d.ts.map +1 -1
- package/dist/tools/lsp-get-diagnostics.js +8 -6
- package/dist/tools/lsp-get-diagnostics.js.map +1 -1
- package/dist/tools/needs-approval.spec.d.ts +2 -0
- package/dist/tools/needs-approval.spec.d.ts.map +1 -0
- package/dist/tools/needs-approval.spec.js +308 -0
- package/dist/tools/needs-approval.spec.js.map +1 -0
- package/dist/tools/read-file.d.ts +2 -2
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +10 -12
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/replace-lines.d.ts +19 -2
- package/dist/tools/replace-lines.d.ts.map +1 -1
- package/dist/tools/replace-lines.js +14 -9
- package/dist/tools/replace-lines.js.map +1 -1
- package/dist/tools/search-file-contents.d.ts +20 -2
- package/dist/tools/search-file-contents.d.ts.map +1 -1
- package/dist/tools/search-file-contents.js +11 -8
- package/dist/tools/search-file-contents.js.map +1 -1
- package/dist/tools/web-search.d.ts +2 -2
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +10 -10
- package/dist/tools/web-search.js.map +1 -1
- package/dist/types/app.d.ts +1 -1
- package/dist/types/app.d.ts.map +1 -1
- package/dist/types/config.d.ts +1 -1
- package/dist/types/core-connection-status.spec.d.ts +2 -0
- package/dist/types/core-connection-status.spec.d.ts.map +1 -0
- package/dist/types/core-connection-status.spec.js +52 -0
- package/dist/types/core-connection-status.spec.js.map +1 -0
- package/dist/types/core.d.ts +33 -28
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/core.js.map +1 -1
- package/dist/types/system.d.ts +5 -30
- package/dist/types/system.d.ts.map +1 -1
- package/dist/utils/prompt-processor.d.ts +2 -3
- package/dist/utils/prompt-processor.d.ts.map +1 -1
- package/dist/utils/prompt-processor.js +2 -50
- package/dist/utils/prompt-processor.js.map +1 -1
- package/dist/wizard/templates/provider-templates.js +2 -2
- package/dist/wizard/templates/provider-templates.js.map +1 -1
- package/package.json +6 -5
- package/source/app/prompts/main-prompt.md +29 -96
- package/dist/commands/recommendations.d.ts +0 -8
- package/dist/commands/recommendations.d.ts.map +0 -1
- package/dist/commands/recommendations.js +0 -311
- package/dist/commands/recommendations.js.map +0 -1
- package/dist/commands/streaming.d.ts +0 -3
- package/dist/commands/streaming.d.ts.map +0 -1
- package/dist/commands/streaming.js +0 -23
- package/dist/commands/streaming.js.map +0 -1
- package/dist/components/thinking-indicator.d.ts +0 -3
- package/dist/components/thinking-indicator.d.ts.map +0 -1
- package/dist/components/thinking-indicator.js +0 -69
- package/dist/components/thinking-indicator.js.map +0 -1
- package/dist/recommendations/model-database.d.ts +0 -8
- package/dist/recommendations/model-database.d.ts.map +0 -1
- package/dist/recommendations/model-database.js +0 -514
- package/dist/recommendations/model-database.js.map +0 -1
- package/dist/recommendations/model-engine.d.ts +0 -16
- package/dist/recommendations/model-engine.d.ts.map +0 -1
- package/dist/recommendations/model-engine.js +0 -185
- package/dist/recommendations/model-engine.js.map +0 -1
- package/dist/recommendations/recommendation-engine.d.ts +0 -39
- package/dist/recommendations/recommendation-engine.d.ts.map +0 -1
- package/dist/recommendations/recommendation-engine.js +0 -144
- package/dist/recommendations/recommendation-engine.js.map +0 -1
- package/dist/system/detector.d.ts +0 -18
- package/dist/system/detector.d.ts.map +0 -1
- package/dist/system/detector.js +0 -140
- 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 @@
|
|
|
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":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAC,eAAe,EAAC,MAAM,iBAAiB,CAAC;AAEhD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAExC,uEAAuE;AACvE,yEAAyE;AACzE,8CAA8C;AAE9C,kDAAkD;AAClD,SAAS,mBAAmB;IAC3B,+CAA+C;IAC/C,MAAM,QAAQ,GAAG,IAAK,aAAqB,EAAE,CAAC;IAC9C,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,uBAAuB;AACvB,SAAS,4BAA4B;IACpC,OAAO;QACN,IAAI,EAAE;YACL;gBACC,EAAE,EAAE,cAAc;gBAClB,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,mBAAmB;gBAChC,OAAO,EAAE,UAAU;gBACnB,cAAc,EAAE,MAAM;gBACtB,YAAY,EAAE;oBACb,QAAQ,EAAE,MAAM;oBAChB,gBAAgB,EAAE,CAAC,MAAM,CAAC;oBAC1B,iBAAiB,EAAE,CAAC,MAAM,CAAC;oBAC3B,SAAS,EAAE,SAAS;iBACpB;gBACD,OAAO,EAAE,EAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAC;gBACnD,oBAAoB,EAAE,CAAC,OAAO,CAAC;aAC/B;YACD;gBACC,EAAE,EAAE,0BAA0B;gBAC9B,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,mBAAmB;gBAChC,OAAO,EAAE,UAAU;gBACnB,cAAc,EAAE,MAAM;gBACtB,YAAY,EAAE;oBACb,QAAQ,EAAE,MAAM;oBAChB,gBAAgB,EAAE,CAAC,MAAM,CAAC;oBAC1B,iBAAiB,EAAE,CAAC,MAAM,CAAC;oBAC3B,SAAS,EAAE,SAAS;iBACpB;gBACD,OAAO,EAAE,EAAC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAC;gBACvC,oBAAoB,EAAE,CAAC,OAAO,CAAC;aAC/B;SACD;KACD,CAAC;AACH,CAAC;AAED,IAAI,CAAC,MAAM,CAAC,wCAAwC,EAAE,CAAC,CAAC,EAAE;IACzD,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;IAC9C,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,gDAAgD,EAAE,CAAC,CAAC,EAAE;IACjE,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACjC,kDAAkD;IAClD,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;IACjC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,+BAA+B,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACtD,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAEjC,2BAA2B;IAC3B,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IACvC,UAAU,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;QAC7B,OAAO;YACN,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,4BAA4B,EAAE;SACpC,CAAC;IACf,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,MAAM,EAAE,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAErC,EAAE,CAAC,UAAU,EAAE,CAAC;QAChB,qDAAqD;QACrD,2CAA2C;QAC3C,MAAM,gBAAgB,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QAC3C,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;YAAS,CAAC;QACV,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QACjC,eAAe,EAAE,CAAC;IACnB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,8CAA8C,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACrE,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACjC,eAAe,EAAE,CAAC;IAElB,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IACvC,UAAU,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;QAC7B,OAAO;YACN,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,4BAA4B,EAAE;SACpC,CAAC;IACf,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAC5C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3B,CAAC;YAAS,CAAC;QACV,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QACjC,eAAe,EAAE,CAAC;IACnB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,sDAAsD,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC7E,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACjC,eAAe,EAAE,CAAC;IAElB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IACvC,UAAU,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;QAC7B,UAAU,EAAE,CAAC;QACb,OAAO;YACN,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,4BAA4B,EAAE;SACpC,CAAC;IACf,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,MAAM,EAAE,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAEpB,uCAAuC;QACvC,eAAe,EAAE,CAAC;QAElB,iCAAiC;QACjC,MAAM,EAAE,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACrB,CAAC;YAAS,CAAC;QACV,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QACjC,eAAe,EAAE,CAAC;IACnB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,oDAAoD,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC3E,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACjC,eAAe,EAAE,CAAC;IAElB,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IACvC,UAAU,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;QAC7B,OAAO;YACN,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,4BAA4B,EAAE;SACpC,CAAC;IACf,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,aAAa;QACb,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAE7B,0CAA0C;QAC1C,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3B,CAAC;YAAS,CAAC;QACV,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QACjC,eAAe,EAAE,CAAC;IACnB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CACV,2DAA2D,EAC3D,KAAK,EAAC,CAAC,EAAC,EAAE;IACT,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACjC,eAAe,EAAE,CAAC;IAElB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IACvC,UAAU,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;QAC7B,UAAU,EAAE,CAAC;QACb,wCAAwC;QACxC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO;YACN,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,4BAA4B,EAAE;SACpC,CAAC;IACf,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,qCAAqC;QACrC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACrD,EAAE,CAAC,iBAAiB,EAAE;YACtB,EAAE,CAAC,iBAAiB,EAAE;YACtB,EAAE,CAAC,iBAAiB,EAAE;SACtB,CAAC,CAAC;QAEH,qBAAqB;QACrB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE3B,sCAAsC;QACtC,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACrB,CAAC;YAAS,CAAC;QACV,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QACjC,eAAe,EAAE,CAAC;IACnB,CAAC;AACF,CAAC,CACD,CAAC;AAEF,IAAI,CAAC,MAAM,CAAC,yCAAyC,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAChE,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACjC,eAAe,EAAE,CAAC;IAElB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IACvC,UAAU,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;QAC7B,UAAU,EAAE,CAAC;QACb,OAAO;YACN,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,4BAA4B,EAAE;SACpC,CAAC;IACf,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,qBAAqB;QACrB,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAC7B,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAEpB,mDAAmD;QACnD,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAC7B,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe;IACrC,CAAC;YAAS,CAAC;QACV,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QACjC,eAAe,EAAE,CAAC;IACnB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,8BAA8B,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACrD,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACjC,eAAe,EAAE,CAAC;IAElB,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IACvC,UAAU,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;QAC7B,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,6CAA6C;QAC7C,iFAAiF;QACjF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,aAAa,EAAE,CAAC;QACxC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC;YAAS,CAAC;QACV,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QACjC,eAAe,EAAE,CAAC;IACnB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,mDAAmD,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC1E,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACjC,eAAe,EAAE,CAAC;IAElB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IACvC,UAAU,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;QAC7B,UAAU,EAAE,CAAC;QACb,OAAO;YACN,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,4BAA4B,EAAE;SACpC,CAAC;IACf,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,yDAAyD;QACzD,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QACpC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAE3B,4BAA4B;QAC5B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAEvD,uBAAuB;QACvB,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QACrC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACrB,CAAC;YAAS,CAAC;QACV,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QACjC,eAAe,EAAE,CAAC;IACnB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,gDAAgD,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACvE,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACjC,eAAe,EAAE,CAAC;IAElB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IACvC,UAAU,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;QAC7B,UAAU,EAAE,CAAC;QACb,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO;YACN,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,4BAA4B,EAAE;SACpC,CAAC;IACf,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,iDAAiD;QACjD,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,EAAE,CAAC,YAAY,EAAE,CAAC;QAElB,6BAA6B;QAC7B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAEvD,4CAA4C;QAC5C,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACrB,CAAC;YAAS,CAAC;QACV,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QACjC,eAAe,EAAE,CAAC;IACnB,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,yCAAyC,EAAE,CAAC,CAAC,EAAE;IAC1D,uCAAuC;IACvC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACxB,CAAC,CAAC,IAAI,CAAC,OAAO,aAAa,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC;IACzD,CAAC,CAAC,IAAI,CAAC,OAAO,aAAa,CAAC,iBAAiB,KAAK,UAAU,CAAC,CAAC;IAC9D,CAAC,CAAC,IAAI,CAAC,OAAO,aAAa,CAAC,aAAa,KAAK,UAAU,CAAC,CAAC;IAC1D,CAAC,CAAC,IAAI,CAAC,OAAO,aAAa,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,2CAA2C,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAClE,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACjC,eAAe,EAAE,CAAC;IAElB,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IACvC,UAAU,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;QAC7B,OAAO;YACN,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,4BAA4B,EAAE;SACpC,CAAC;IACf,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAC5C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE1B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QACrC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACvC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;QACzC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;QACvC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC;QAChD,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC;IACnD,CAAC;YAAS,CAAC;QACV,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QACjC,eAAe,EAAE,CAAC;IACnB,CAAC;AACF,CAAC,CAAC,CAAC"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"model-engine.spec.d.ts","sourceRoot":"","sources":["../../source/model-database/model-engine.spec.ts"],"names":[],"mappings":""}
|