@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
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import { modelDatabase } from '../recommendations/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
|
-
getCompatibleModels(systemCapabilities) {
|
|
11
|
-
const allModels = modelDatabase.getAllModels();
|
|
12
|
-
const recommendations = [];
|
|
13
|
-
for (const model of allModels) {
|
|
14
|
-
const compatibility = this.assessModelCompatibility(model, systemCapabilities);
|
|
15
|
-
const warnings = this.generateWarnings(model, systemCapabilities);
|
|
16
|
-
const recommendation = this.generateRecommendationText(model, compatibility);
|
|
17
|
-
recommendations.push({
|
|
18
|
-
model,
|
|
19
|
-
compatibility,
|
|
20
|
-
warnings,
|
|
21
|
-
recommendation,
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
// Sort by compatibility and capability score
|
|
25
|
-
return recommendations.sort((a, b) => {
|
|
26
|
-
const compatibilityScore = this.getCompatibilityScore(a.compatibility) -
|
|
27
|
-
this.getCompatibilityScore(b.compatibility);
|
|
28
|
-
if (compatibilityScore !== 0)
|
|
29
|
-
return compatibilityScore;
|
|
30
|
-
// If compatibility is the same, sort by overall capability
|
|
31
|
-
const aScore = this.calculateOverallCapabilityScore(a.model);
|
|
32
|
-
const bScore = this.calculateOverallCapabilityScore(b.model);
|
|
33
|
-
return bScore - aScore;
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
getTopRecommendations(systemCapabilities, count = 5) {
|
|
37
|
-
const compatible = this.getCompatibleModels(systemCapabilities);
|
|
38
|
-
return compatible
|
|
39
|
-
.filter(rec => rec.compatibility !== 'incompatible')
|
|
40
|
-
.slice(0, count);
|
|
41
|
-
}
|
|
42
|
-
getBestLocalModel(systemCapabilities) {
|
|
43
|
-
const localModels = this.getCompatibleModels(systemCapabilities).filter(rec => rec.model.local && rec.compatibility !== 'incompatible');
|
|
44
|
-
return localModels.length > 0 ? localModels[0] : null;
|
|
45
|
-
}
|
|
46
|
-
getBestApiModel(systemCapabilities) {
|
|
47
|
-
const apiModels = this.getCompatibleModels(systemCapabilities).filter(rec => rec.model.api && rec.compatibility !== 'incompatible');
|
|
48
|
-
return apiModels.length > 0 ? apiModels[0] : null;
|
|
49
|
-
}
|
|
50
|
-
assessModelCompatibility(model, system) {
|
|
51
|
-
// Check if model can be accessed via API
|
|
52
|
-
const canUseApi = model.api && system.network.connected;
|
|
53
|
-
// Check if model can be run locally
|
|
54
|
-
let canUseLocal = false;
|
|
55
|
-
if (model.local) {
|
|
56
|
-
const requiredMemory = model.minMemoryGB || 8; // Default 8GB if not specified
|
|
57
|
-
canUseLocal = system.memory.total >= requiredMemory;
|
|
58
|
-
}
|
|
59
|
-
// Model is incompatible if neither method works
|
|
60
|
-
if (!canUseApi && !canUseLocal) {
|
|
61
|
-
return 'incompatible';
|
|
62
|
-
}
|
|
63
|
-
// Perfect if we can use API (no resource constraints)
|
|
64
|
-
if (canUseApi) {
|
|
65
|
-
return 'perfect';
|
|
66
|
-
}
|
|
67
|
-
// For local-only models, check GPU availability
|
|
68
|
-
const gpuAvailable = system.gpu.available && system.gpu.type !== 'none';
|
|
69
|
-
return gpuAvailable ? 'perfect' : 'good';
|
|
70
|
-
}
|
|
71
|
-
generateWarnings(model, system) {
|
|
72
|
-
const warnings = [];
|
|
73
|
-
if (model.local) {
|
|
74
|
-
const requiredMemory = model.minMemoryGB || 8;
|
|
75
|
-
// Check if user can't run locally
|
|
76
|
-
if (system.memory.total < requiredMemory) {
|
|
77
|
-
if (model.api) {
|
|
78
|
-
warnings.push(`Cannot run locally - requires ${requiredMemory}GB RAM (you have ${system.memory.total}GB). Run only via API.`);
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
warnings.push(`Cannot run locally - requires ${requiredMemory}GB RAM (you have ${system.memory.total}GB)`);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
// GPU warnings (only if they CAN run it locally)
|
|
86
|
-
const gpuAvailable = system.gpu.available && system.gpu.type !== 'none';
|
|
87
|
-
if (!gpuAvailable) {
|
|
88
|
-
warnings.push('GPU recommended for better performance - will be slow on CPU');
|
|
89
|
-
}
|
|
90
|
-
// Memory warnings
|
|
91
|
-
if (system.memory.total === requiredMemory) {
|
|
92
|
-
warnings.push(`Running at minimum RAM (${requiredMemory}GB) - may be slow`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
if (model.api) {
|
|
97
|
-
// Network warnings
|
|
98
|
-
if (!system.network.connected) {
|
|
99
|
-
warnings.push('API access requires internet connection');
|
|
100
|
-
}
|
|
101
|
-
else if (system.network.speed === 'slow') {
|
|
102
|
-
warnings.push('May have delays due to slow internet connection');
|
|
103
|
-
}
|
|
104
|
-
// Cost warnings
|
|
105
|
-
if (model.costType === 'paid') {
|
|
106
|
-
warnings.push('Usage costs apply - monitor your spending');
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
// Capability warnings based on ratings (0-10 scale, 0 = not supported)
|
|
110
|
-
if (model.quality.agentic === 0) {
|
|
111
|
-
warnings.push('Does not support agentic coding workflows');
|
|
112
|
-
}
|
|
113
|
-
else if (model.quality.agentic <= 4) {
|
|
114
|
-
warnings.push('Limited capabilities for complex agentic coding tasks');
|
|
115
|
-
}
|
|
116
|
-
if (model.quality.local === 0) {
|
|
117
|
-
warnings.push('Cannot be run locally - proprietary/closed-source model');
|
|
118
|
-
}
|
|
119
|
-
else if (model.quality.local <= 3) {
|
|
120
|
-
warnings.push('Difficult to run locally - requires significant resources');
|
|
121
|
-
}
|
|
122
|
-
return warnings;
|
|
123
|
-
}
|
|
124
|
-
generateRecommendationText(model, compatibility) {
|
|
125
|
-
if (compatibility === 'incompatible') {
|
|
126
|
-
if (model.local) {
|
|
127
|
-
const requiredMemory = model.minMemoryGB || 8;
|
|
128
|
-
return `Cannot run locally - needs ${requiredMemory}GB RAM. ${model.api ? 'Try API access instead.' : ''}`;
|
|
129
|
-
}
|
|
130
|
-
return 'Requires internet connection for API access';
|
|
131
|
-
}
|
|
132
|
-
const strengths = [];
|
|
133
|
-
// Analyze capabilities (0-10 scale)
|
|
134
|
-
if (model.quality.agentic >= 8) {
|
|
135
|
-
strengths.push('Excellent agentic coding abilities');
|
|
136
|
-
}
|
|
137
|
-
else if (model.quality.agentic >= 6) {
|
|
138
|
-
strengths.push('Good agentic coding capabilities');
|
|
139
|
-
}
|
|
140
|
-
if (model.quality.local >= 8) {
|
|
141
|
-
strengths.push('Easy to run locally');
|
|
142
|
-
}
|
|
143
|
-
else if (model.quality.local >= 6) {
|
|
144
|
-
strengths.push('Reasonable to run locally');
|
|
145
|
-
}
|
|
146
|
-
if (model.quality.cost >= 8) {
|
|
147
|
-
strengths.push('Excellent value - free or very cheap');
|
|
148
|
-
}
|
|
149
|
-
else if (model.quality.cost >= 6) {
|
|
150
|
-
strengths.push('Good cost-effectiveness');
|
|
151
|
-
}
|
|
152
|
-
if (model.local && model.api) {
|
|
153
|
-
strengths.push('Available locally and via API');
|
|
154
|
-
}
|
|
155
|
-
else if (model.local) {
|
|
156
|
-
strengths.push('Private/local only');
|
|
157
|
-
}
|
|
158
|
-
// Build recommendation text as bullet points
|
|
159
|
-
if (strengths.length > 0) {
|
|
160
|
-
return strengths.map(s => `• ${s}`).join('\n');
|
|
161
|
-
}
|
|
162
|
-
return '• Standard model for general use';
|
|
163
|
-
}
|
|
164
|
-
getCompatibilityScore(compatibility) {
|
|
165
|
-
switch (compatibility) {
|
|
166
|
-
case 'perfect':
|
|
167
|
-
return 4;
|
|
168
|
-
case 'good':
|
|
169
|
-
return 3;
|
|
170
|
-
case 'marginal':
|
|
171
|
-
return 2;
|
|
172
|
-
case 'incompatible':
|
|
173
|
-
return 1;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
calculateOverallCapabilityScore(model) {
|
|
177
|
-
// Weight heavily in favor of agentic capabilities (coding ability is most important)
|
|
178
|
-
// Then local feasibility, and finally cost
|
|
179
|
-
return (model.quality.agentic * 3.0 +
|
|
180
|
-
model.quality.local * 0.8 +
|
|
181
|
-
model.quality.cost * 0.5);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
export const modelMatchingEngine = ModelMatchingEngine.getInstance();
|
|
185
|
-
//# sourceMappingURL=model-engine.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"model-engine.js","sourceRoot":"","sources":["../../source/recommendations/model-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { SystemCapabilities, ModelRecommendation } from '../types/index.js';
|
|
2
|
-
export interface ModelRecommendationEnhanced extends ModelRecommendation {
|
|
3
|
-
recommendedProvider: string;
|
|
4
|
-
}
|
|
5
|
-
interface RecommendationResult {
|
|
6
|
-
quickStart: ModelRecommendationEnhanced | null;
|
|
7
|
-
allModels: ModelRecommendationEnhanced[];
|
|
8
|
-
}
|
|
9
|
-
export declare class RecommendationEngine {
|
|
10
|
-
private static instance;
|
|
11
|
-
static getInstance(): RecommendationEngine;
|
|
12
|
-
/**
|
|
13
|
-
* Get all recommendations based on system capabilities
|
|
14
|
-
*/
|
|
15
|
-
getRecommendations(systemCapabilities: SystemCapabilities): RecommendationResult;
|
|
16
|
-
/**
|
|
17
|
-
* Enhance a model with setup instructions
|
|
18
|
-
*/
|
|
19
|
-
private enhanceModel;
|
|
20
|
-
/**
|
|
21
|
-
* Sort models by priority for recommendations:
|
|
22
|
-
* 1. High-quality local models (free + powerful)
|
|
23
|
-
* 2. High-quality API models (powerful but paid)
|
|
24
|
-
* 3. Lower-quality local models
|
|
25
|
-
* 4. Lower-quality API models
|
|
26
|
-
*/
|
|
27
|
-
private sortModelsByPriority;
|
|
28
|
-
/**
|
|
29
|
-
* Get a simple quick start recommendation
|
|
30
|
-
*/
|
|
31
|
-
getQuickStartRecommendation(systemCapabilities: SystemCapabilities): {
|
|
32
|
-
model: string;
|
|
33
|
-
provider: string;
|
|
34
|
-
reasoning: string;
|
|
35
|
-
} | null;
|
|
36
|
-
}
|
|
37
|
-
export declare const recommendationEngine: RecommendationEngine;
|
|
38
|
-
export {};
|
|
39
|
-
//# sourceMappingURL=recommendation-engine.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recommendation-engine.d.ts","sourceRoot":"","sources":["../../source/recommendations/recommendation-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAE,mBAAmB,EAAC,MAAM,eAAe,CAAC;AAGtE,MAAM,WAAW,2BAA4B,SAAQ,mBAAmB;IACvE,mBAAmB,EAAE,MAAM,CAAC;CAC5B;AAED,UAAU,oBAAoB;IAC7B,UAAU,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAC/C,SAAS,EAAE,2BAA2B,EAAE,CAAC;CACzC;AAED,qBAAa,oBAAoB;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuB;IAE9C,MAAM,CAAC,WAAW,IAAI,oBAAoB;IAO1C;;OAEG;IACH,kBAAkB,CACjB,kBAAkB,EAAE,kBAAkB,GACpC,oBAAoB;IA+BvB;;OAEG;IACH,OAAO,CAAC,YAAY;IA8BpB;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAoE5B;;OAEG;IACH,2BAA2B,CAAC,kBAAkB,EAAE,kBAAkB,GAAG;QACpE,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI;CAeR;AAED,eAAO,MAAM,oBAAoB,sBAAqC,CAAC"}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import { modelMatchingEngine } from '../recommendations/model-engine.js';
|
|
2
|
-
export class RecommendationEngine {
|
|
3
|
-
static instance;
|
|
4
|
-
static getInstance() {
|
|
5
|
-
if (!RecommendationEngine.instance) {
|
|
6
|
-
RecommendationEngine.instance = new RecommendationEngine();
|
|
7
|
-
}
|
|
8
|
-
return RecommendationEngine.instance;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Get all recommendations based on system capabilities
|
|
12
|
-
*/
|
|
13
|
-
getRecommendations(systemCapabilities) {
|
|
14
|
-
// Get all compatible models
|
|
15
|
-
const compatibleModels = modelMatchingEngine.getCompatibleModels(systemCapabilities);
|
|
16
|
-
// Enhance each model with setup instructions
|
|
17
|
-
const enhancedModels = compatibleModels.map(model => this.enhanceModel(model, systemCapabilities));
|
|
18
|
-
// Filter out incompatible models
|
|
19
|
-
const usableModels = enhancedModels.filter(m => m.compatibility !== 'incompatible');
|
|
20
|
-
// Sort models by priority:
|
|
21
|
-
// 1. Free (local) + high quality
|
|
22
|
-
// 2. Low cost + high quality
|
|
23
|
-
// 3. By agentic capabilities
|
|
24
|
-
// 4. By compatibility
|
|
25
|
-
const sortedModels = this.sortModelsByPriority(usableModels);
|
|
26
|
-
// Pick the best quick start option (prioritize local models if available)
|
|
27
|
-
const quickStart = sortedModels[0] || null;
|
|
28
|
-
return {
|
|
29
|
-
quickStart,
|
|
30
|
-
allModels: sortedModels,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Enhance a model with setup instructions
|
|
35
|
-
*/
|
|
36
|
-
enhanceModel(modelRec, systemCapabilities) {
|
|
37
|
-
const model = modelRec.model;
|
|
38
|
-
// Determine best access method based on system capabilities
|
|
39
|
-
const canUseLocal = model.local &&
|
|
40
|
-
systemCapabilities.memory.total >= (model.minMemoryGB || 8);
|
|
41
|
-
const canUseApi = model.api && systemCapabilities.network.connected;
|
|
42
|
-
let recommendedProvider = '';
|
|
43
|
-
if (canUseLocal && !canUseApi) {
|
|
44
|
-
recommendedProvider = 'local';
|
|
45
|
-
}
|
|
46
|
-
else if (!canUseLocal && canUseApi) {
|
|
47
|
-
recommendedProvider = 'api';
|
|
48
|
-
}
|
|
49
|
-
else if (canUseLocal && canUseApi) {
|
|
50
|
-
recommendedProvider = 'local (API also available)';
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
recommendedProvider = 'unavailable';
|
|
54
|
-
}
|
|
55
|
-
return {
|
|
56
|
-
...modelRec,
|
|
57
|
-
recommendedProvider,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Sort models by priority for recommendations:
|
|
62
|
-
* 1. High-quality local models (free + powerful)
|
|
63
|
-
* 2. High-quality API models (powerful but paid)
|
|
64
|
-
* 3. Lower-quality local models
|
|
65
|
-
* 4. Lower-quality API models
|
|
66
|
-
*/
|
|
67
|
-
sortModelsByPriority(models) {
|
|
68
|
-
return models.sort((a, b) => {
|
|
69
|
-
// Calculate quality scores - prioritize agentic capabilities heavily
|
|
70
|
-
const aQuality = a.model.quality.agentic * 3.0 +
|
|
71
|
-
a.model.quality.local * 0.8 +
|
|
72
|
-
a.model.quality.cost * 0.5;
|
|
73
|
-
const bQuality = b.model.quality.agentic * 3.0 +
|
|
74
|
-
b.model.quality.local * 0.8 +
|
|
75
|
-
b.model.quality.cost * 0.5;
|
|
76
|
-
// Determine what the user can ACTUALLY use based on recommendedProvider
|
|
77
|
-
const aCanUseLocal = a.recommendedProvider.includes('local');
|
|
78
|
-
const bCanUseLocal = b.recommendedProvider.includes('local');
|
|
79
|
-
const aApiOnly = a.recommendedProvider === 'api';
|
|
80
|
-
const bApiOnly = b.recommendedProvider === 'api';
|
|
81
|
-
// Define quality thresholds (out of 43 possible with new weighting: agentic*3 + local*0.8 + cost*0.5)
|
|
82
|
-
const highQuality = 24; // 24+ = high quality (agentic 8+)
|
|
83
|
-
const decentQuality = 15; // 15+ = decent (agentic 5+), below = poor
|
|
84
|
-
const aHighQuality = aQuality >= highQuality;
|
|
85
|
-
const bHighQuality = bQuality >= highQuality;
|
|
86
|
-
const aDecentQuality = aQuality >= decentQuality;
|
|
87
|
-
const bDecentQuality = bQuality >= decentQuality;
|
|
88
|
-
// 1. High-quality API beats poor-quality local (don't recommend trash just because it's free)
|
|
89
|
-
if (aApiOnly && bCanUseLocal && aHighQuality && !bDecentQuality)
|
|
90
|
-
return -1;
|
|
91
|
-
if (bApiOnly && aCanUseLocal && bHighQuality && !aDecentQuality)
|
|
92
|
-
return 1;
|
|
93
|
-
// 2. Decent+ local models beat API-only (free is better if quality is acceptable)
|
|
94
|
-
if (aCanUseLocal && bApiOnly && aDecentQuality)
|
|
95
|
-
return -1;
|
|
96
|
-
if (bCanUseLocal && aApiOnly && bDecentQuality)
|
|
97
|
-
return 1;
|
|
98
|
-
// 3. Among models user can run locally, prefer high quality
|
|
99
|
-
if (aCanUseLocal && bCanUseLocal) {
|
|
100
|
-
if (aHighQuality && !bHighQuality)
|
|
101
|
-
return -1;
|
|
102
|
-
if (bHighQuality && !aHighQuality)
|
|
103
|
-
return 1;
|
|
104
|
-
// Same quality tier - prefer higher score
|
|
105
|
-
return bQuality - aQuality;
|
|
106
|
-
}
|
|
107
|
-
// 4. Among API-only models, prefer free over paid
|
|
108
|
-
if (aApiOnly && bApiOnly) {
|
|
109
|
-
const aCost = a.model.costType === 'free' ? 0 : 1;
|
|
110
|
-
const bCost = b.model.costType === 'free' ? 0 : 1;
|
|
111
|
-
if (aCost !== bCost)
|
|
112
|
-
return aCost - bCost;
|
|
113
|
-
// Same cost - prefer higher quality
|
|
114
|
-
return bQuality - aQuality;
|
|
115
|
-
}
|
|
116
|
-
// 5. Compare by compatibility as final tiebreaker
|
|
117
|
-
const compatibilityOrder = {
|
|
118
|
-
perfect: 4,
|
|
119
|
-
good: 3,
|
|
120
|
-
marginal: 2,
|
|
121
|
-
incompatible: 1,
|
|
122
|
-
};
|
|
123
|
-
return (compatibilityOrder[b.compatibility] -
|
|
124
|
-
compatibilityOrder[a.compatibility]);
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Get a simple quick start recommendation
|
|
129
|
-
*/
|
|
130
|
-
getQuickStartRecommendation(systemCapabilities) {
|
|
131
|
-
const result = this.getRecommendations(systemCapabilities);
|
|
132
|
-
if (!result.quickStart) {
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
const model = result.quickStart;
|
|
136
|
-
return {
|
|
137
|
-
model: model.model.name,
|
|
138
|
-
provider: model.recommendedProvider,
|
|
139
|
-
reasoning: model.recommendation,
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
export const recommendationEngine = RecommendationEngine.getInstance();
|
|
144
|
-
//# sourceMappingURL=recommendation-engine.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recommendation-engine.js","sourceRoot":"","sources":["../../source/recommendations/recommendation-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { SystemCapabilities } from '../types/index.js';
|
|
2
|
-
export declare class SystemDetector {
|
|
3
|
-
private static instance;
|
|
4
|
-
private cachedCapabilities;
|
|
5
|
-
private lastDetection;
|
|
6
|
-
private readonly CACHE_DURATION;
|
|
7
|
-
static getInstance(): SystemDetector;
|
|
8
|
-
getSystemCapabilities(): Promise<SystemCapabilities>;
|
|
9
|
-
private detectSystemCapabilities;
|
|
10
|
-
private detectCpu;
|
|
11
|
-
private detectMemory;
|
|
12
|
-
private detectPlatform;
|
|
13
|
-
private detectGpu;
|
|
14
|
-
private detectNetwork;
|
|
15
|
-
clearCache(): void;
|
|
16
|
-
}
|
|
17
|
-
export declare const systemDetector: SystemDetector;
|
|
18
|
-
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../source/system/detector.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC;AAIjD,qBAAa,cAAc;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IAEzC,MAAM,CAAC,WAAW,IAAI,cAAc;IAO9B,qBAAqB,IAAI,OAAO,CAAC,kBAAkB,CAAC;YAe5C,wBAAwB;YAkBxB,SAAS;YAQT,YAAY;YAQZ,cAAc;YAKd,SAAS;YAgDT,aAAa;IAmC3B,UAAU,IAAI,IAAI;CAIlB;AAED,eAAO,MAAM,cAAc,gBAA+B,CAAC"}
|
package/dist/system/detector.js
DELETED
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { exec } from 'node:child_process';
|
|
2
|
-
import { promisify } from 'node:util';
|
|
3
|
-
import * as si from 'systeminformation';
|
|
4
|
-
const execAsync = promisify(exec);
|
|
5
|
-
export class SystemDetector {
|
|
6
|
-
static instance;
|
|
7
|
-
cachedCapabilities = null;
|
|
8
|
-
lastDetection = 0;
|
|
9
|
-
CACHE_DURATION = 30_000; // 30 seconds
|
|
10
|
-
static getInstance() {
|
|
11
|
-
if (!SystemDetector.instance) {
|
|
12
|
-
SystemDetector.instance = new SystemDetector();
|
|
13
|
-
}
|
|
14
|
-
return SystemDetector.instance;
|
|
15
|
-
}
|
|
16
|
-
async getSystemCapabilities() {
|
|
17
|
-
const now = Date.now();
|
|
18
|
-
if (this.cachedCapabilities &&
|
|
19
|
-
now - this.lastDetection < this.CACHE_DURATION) {
|
|
20
|
-
return this.cachedCapabilities;
|
|
21
|
-
}
|
|
22
|
-
const capabilities = await this.detectSystemCapabilities();
|
|
23
|
-
this.cachedCapabilities = capabilities;
|
|
24
|
-
this.lastDetection = now;
|
|
25
|
-
return capabilities;
|
|
26
|
-
}
|
|
27
|
-
async detectSystemCapabilities() {
|
|
28
|
-
const [cpu, memory, gpu, platform, network] = await Promise.all([
|
|
29
|
-
this.detectCpu(),
|
|
30
|
-
this.detectMemory(),
|
|
31
|
-
this.detectGpu(),
|
|
32
|
-
this.detectPlatform(),
|
|
33
|
-
this.detectNetwork(),
|
|
34
|
-
]);
|
|
35
|
-
return {
|
|
36
|
-
cpu,
|
|
37
|
-
memory,
|
|
38
|
-
gpu,
|
|
39
|
-
platform,
|
|
40
|
-
network,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
async detectCpu() {
|
|
44
|
-
const cpuInfo = await si.cpu();
|
|
45
|
-
return {
|
|
46
|
-
cores: cpuInfo.cores,
|
|
47
|
-
architecture: cpuInfo.family,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
async detectMemory() {
|
|
51
|
-
const memInfo = await si.mem();
|
|
52
|
-
return {
|
|
53
|
-
total: Math.round(memInfo.total / 1024 ** 3), // Convert to GB
|
|
54
|
-
available: Math.round(memInfo.available / 1024 ** 3), // Convert to GB
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
async detectPlatform() {
|
|
58
|
-
const osInfo = await si.osInfo();
|
|
59
|
-
return osInfo.platform;
|
|
60
|
-
}
|
|
61
|
-
async detectGpu() {
|
|
62
|
-
try {
|
|
63
|
-
const graphics = await si.graphics();
|
|
64
|
-
if (graphics.controllers && graphics.controllers.length > 0) {
|
|
65
|
-
const controller = graphics.controllers[0];
|
|
66
|
-
const vendor = controller.vendor?.toLowerCase() || '';
|
|
67
|
-
const model = controller.model?.toLowerCase() || '';
|
|
68
|
-
let type = 'none';
|
|
69
|
-
if (vendor.includes('nvidia') || model.includes('nvidia')) {
|
|
70
|
-
type = 'nvidia';
|
|
71
|
-
}
|
|
72
|
-
else if (vendor.includes('amd') ||
|
|
73
|
-
model.includes('amd') ||
|
|
74
|
-
model.includes('radeon')) {
|
|
75
|
-
type = 'amd';
|
|
76
|
-
}
|
|
77
|
-
else if (vendor.includes('apple') || model.includes('apple')) {
|
|
78
|
-
type = 'apple';
|
|
79
|
-
}
|
|
80
|
-
else if (vendor.includes('intel') || model.includes('intel')) {
|
|
81
|
-
type = 'intel';
|
|
82
|
-
}
|
|
83
|
-
const memoryMB = typeof controller.vram === 'number'
|
|
84
|
-
? controller.vram
|
|
85
|
-
: typeof controller.vramDynamic === 'number'
|
|
86
|
-
? controller.vramDynamic
|
|
87
|
-
: 0;
|
|
88
|
-
const memoryGB = memoryMB > 0 ? Math.round(memoryMB / 1024) : undefined;
|
|
89
|
-
return {
|
|
90
|
-
available: true,
|
|
91
|
-
type,
|
|
92
|
-
memory: memoryGB,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
// Fallback to basic detection if systeminformation fails
|
|
98
|
-
}
|
|
99
|
-
return {
|
|
100
|
-
available: false,
|
|
101
|
-
type: 'none',
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
async detectNetwork() {
|
|
105
|
-
try {
|
|
106
|
-
// Simple connectivity test
|
|
107
|
-
const testUrls = ['google.com', 'cloudflare.com'];
|
|
108
|
-
const results = await Promise.allSettled(testUrls.map(async (url) => {
|
|
109
|
-
const start = Date.now();
|
|
110
|
-
await execAsync(`ping -c 1 -W 2000 ${url}`, { timeout: 3000 });
|
|
111
|
-
return Date.now() - start;
|
|
112
|
-
}));
|
|
113
|
-
const successful = results.filter(r => r.status === 'fulfilled');
|
|
114
|
-
if (successful.length === 0) {
|
|
115
|
-
return { connected: false };
|
|
116
|
-
}
|
|
117
|
-
const avgLatency = successful.reduce((sum, r) => sum + r.value, 0) / successful.length;
|
|
118
|
-
let speed;
|
|
119
|
-
if (avgLatency < 50)
|
|
120
|
-
speed = 'fast';
|
|
121
|
-
else if (avgLatency < 200)
|
|
122
|
-
speed = 'medium';
|
|
123
|
-
else
|
|
124
|
-
speed = 'slow';
|
|
125
|
-
return {
|
|
126
|
-
connected: true,
|
|
127
|
-
speed,
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
catch {
|
|
131
|
-
return { connected: false };
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
clearCache() {
|
|
135
|
-
this.cachedCapabilities = null;
|
|
136
|
-
this.lastDetection = 0;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
export const systemDetector = SystemDetector.getInstance();
|
|
140
|
-
//# sourceMappingURL=detector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../source/system/detector.ts"],"names":[],"mappings":"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"}
|