@nanocollective/nanocoder 1.11.3 → 1.12.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 +53 -11
- package/dist/app/hooks/useAppInitialization.d.ts +3 -3
- package/dist/app/hooks/useAppInitialization.d.ts.map +1 -1
- package/dist/app/hooks/useAppInitialization.js +2 -1
- package/dist/app/hooks/useAppInitialization.js.map +1 -1
- package/dist/app/hooks/useAppState.d.ts +5 -3
- package/dist/app/hooks/useAppState.d.ts.map +1 -1
- package/dist/app/hooks/useAppState.js +7 -2
- package/dist/app/hooks/useAppState.js.map +1 -1
- package/dist/app/hooks/useChatHandler.d.ts.map +1 -1
- package/dist/app/hooks/useChatHandler.js +131 -5
- package/dist/app/hooks/useChatHandler.js.map +1 -1
- package/dist/app/hooks/useDirectoryTrust.d.ts.map +1 -1
- package/dist/app/hooks/useDirectoryTrust.js.map +1 -1
- package/dist/app/hooks/useModeHandlers.d.ts +8 -5
- package/dist/app/hooks/useModeHandlers.d.ts.map +1 -1
- package/dist/app/hooks/useModeHandlers.js +12 -2
- package/dist/app/hooks/useModeHandlers.js.map +1 -1
- package/dist/app/hooks/useToolHandler.d.ts +2 -2
- package/dist/app/hooks/useToolHandler.d.ts.map +1 -1
- package/dist/app/hooks/useToolHandler.js +66 -0
- package/dist/app/hooks/useToolHandler.js.map +1 -1
- package/dist/app/utils/appUtils.d.ts.map +1 -1
- package/dist/app/utils/appUtils.js +5 -1
- package/dist/app/utils/appUtils.js.map +1 -1
- package/dist/app/utils/conversationState.d.ts.map +1 -1
- package/dist/app/utils/conversationState.js +35 -13
- package/dist/app/utils/conversationState.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +4 -1
- package/dist/app.js.map +1 -1
- package/dist/client-factory.d.ts +3 -3
- package/dist/client-factory.d.ts.map +1 -1
- package/dist/client-factory.js +13 -6
- package/dist/client-factory.js.map +1 -1
- package/dist/command-parser.d.ts.map +1 -1
- package/dist/command-parser.js +2 -2
- package/dist/command-parser.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/recommendations.d.ts +8 -0
- package/dist/commands/recommendations.d.ts.map +1 -0
- package/dist/commands/recommendations.js +303 -0
- package/dist/commands/recommendations.js.map +1 -0
- package/dist/components/assistant-message.d.ts.map +1 -1
- package/dist/components/assistant-message.js +58 -33
- package/dist/components/assistant-message.js.map +1 -1
- package/dist/components/chat-queue.js.map +1 -1
- package/dist/components/provider-selector.d.ts +2 -3
- package/dist/components/provider-selector.d.ts.map +1 -1
- package/dist/components/provider-selector.js.map +1 -1
- package/dist/components/security-disclaimer.d.ts +1 -1
- package/dist/components/security-disclaimer.d.ts.map +1 -1
- package/dist/components/security-disclaimer.js +1 -1
- package/dist/components/security-disclaimer.js.map +1 -1
- package/dist/components/tool-confirmation.d.ts.map +1 -1
- package/dist/components/tool-confirmation.js +49 -8
- package/dist/components/tool-confirmation.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/preferences.d.ts +2 -3
- package/dist/config/preferences.d.ts.map +1 -1
- package/dist/config/preferences.js +8 -8
- package/dist/config/preferences.js.map +1 -1
- package/dist/config/themes.d.ts.map +1 -1
- package/dist/config/themes.js +1 -1
- package/dist/config/themes.js.map +1 -1
- package/dist/custom-commands/index.d.ts +3 -3
- package/dist/custom-commands/index.js +3 -3
- package/dist/custom-commands/loader.d.ts.map +1 -1
- package/dist/custom-commands/loader.js +6 -6
- package/dist/custom-commands/loader.js.map +1 -1
- package/dist/hooks/useTerminalWidth.js +1 -1
- package/dist/hooks/useTerminalWidth.js.map +1 -1
- package/dist/init/agents-template-generator.d.ts.map +1 -1
- package/dist/init/agents-template-generator.js +43 -41
- package/dist/init/agents-template-generator.js.map +1 -1
- package/dist/init/existing-rules-extractor.d.ts.map +1 -1
- package/dist/init/existing-rules-extractor.js +46 -12
- package/dist/init/existing-rules-extractor.js.map +1 -1
- package/dist/init/file-scanner.d.ts.map +1 -1
- package/dist/init/file-scanner.js +44 -16
- package/dist/init/file-scanner.js.map +1 -1
- package/dist/init/framework-detector.d.ts.map +1 -1
- package/dist/init/framework-detector.js +42 -13
- package/dist/init/framework-detector.js.map +1 -1
- package/dist/init/language-detector.d.ts.map +1 -1
- package/dist/init/language-detector.js +20 -7
- package/dist/init/language-detector.js.map +1 -1
- package/dist/init/project-analyzer.d.ts.map +1 -1
- package/dist/init/project-analyzer.js +55 -19
- package/dist/init/project-analyzer.js.map +1 -1
- package/dist/langgraph-client.d.ts +1 -0
- package/dist/langgraph-client.d.ts.map +1 -1
- package/dist/langgraph-client.js +31 -1
- package/dist/langgraph-client.js.map +1 -1
- package/dist/mcp/mcp-client.js.map +1 -1
- package/dist/mcp/mcp-tool-adapter.d.ts +1 -1
- package/dist/mcp/mcp-tool-adapter.d.ts.map +1 -1
- package/dist/mcp/mcp-tool-adapter.js.map +1 -1
- package/dist/message-handler.d.ts.map +1 -1
- package/dist/message-handler.js +2 -2
- package/dist/message-handler.js.map +1 -1
- package/dist/prompt-history.d.ts.map +1 -1
- package/dist/prompt-history.js +11 -9
- package/dist/prompt-history.js.map +1 -1
- package/dist/recommendations/model-database.d.ts +9 -0
- package/dist/recommendations/model-database.d.ts.map +1 -0
- package/dist/recommendations/model-database.js +455 -0
- package/dist/recommendations/model-database.js.map +1 -0
- package/dist/recommendations/model-engine.d.ts +16 -0
- package/dist/recommendations/model-engine.d.ts.map +1 -0
- package/dist/recommendations/model-engine.js +185 -0
- package/dist/recommendations/model-engine.js.map +1 -0
- package/dist/recommendations/recommendation-engine.d.ts +38 -0
- package/dist/recommendations/recommendation-engine.d.ts.map +1 -0
- package/dist/recommendations/recommendation-engine.js +138 -0
- package/dist/recommendations/recommendation-engine.js.map +1 -0
- package/dist/system/detector.d.ts +18 -0
- package/dist/system/detector.d.ts.map +1 -0
- package/dist/system/detector.js +140 -0
- package/dist/system/detector.js.map +1 -0
- package/dist/tool-calling/json-parser.d.ts.map +1 -1
- package/dist/tool-calling/json-parser.js +2 -1
- package/dist/tool-calling/json-parser.js.map +1 -1
- package/dist/tools/create-file.d.ts.map +1 -1
- package/dist/tools/create-file.js +62 -4
- package/dist/tools/create-file.js.map +1 -1
- package/dist/tools/delete-lines.d.ts.map +1 -1
- package/dist/tools/delete-lines.js +71 -5
- package/dist/tools/delete-lines.js.map +1 -1
- package/dist/tools/execute-bash.d.ts.map +1 -1
- package/dist/tools/execute-bash.js +29 -0
- package/dist/tools/execute-bash.js.map +1 -1
- package/dist/tools/fetch-url.d.ts +3 -0
- package/dist/tools/fetch-url.d.ts.map +1 -0
- package/dist/tools/fetch-url.js +122 -0
- package/dist/tools/fetch-url.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/insert-lines.d.ts.map +1 -1
- package/dist/tools/insert-lines.js +48 -1
- package/dist/tools/insert-lines.js.map +1 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +31 -3
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-many-files.d.ts.map +1 -1
- package/dist/tools/read-many-files.js +56 -8
- package/dist/tools/read-many-files.js.map +1 -1
- package/dist/tools/replace-lines.d.ts.map +1 -1
- package/dist/tools/replace-lines.js +70 -4
- package/dist/tools/replace-lines.js.map +1 -1
- package/dist/tools/tool-manager.d.ts +10 -0
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +10 -2
- package/dist/tools/tool-manager.js.map +1 -1
- package/dist/tools/web-search.d.ts +3 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +133 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/types/app.d.ts +1 -0
- package/dist/types/app.d.ts.map +1 -1
- package/dist/types/commands.d.ts.map +1 -1
- package/dist/types/components.d.ts +3 -3
- package/dist/types/components.d.ts.map +1 -1
- package/dist/types/config.d.ts +17 -6
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/core.d.ts +10 -5
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/index.d.ts +11 -10
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +11 -10
- package/dist/types/index.js.map +1 -1
- package/dist/types/mcp.d.ts.map +1 -1
- package/dist/types/system.d.ts +57 -0
- package/dist/types/system.d.ts.map +1 -0
- package/dist/types/system.js +2 -0
- package/dist/types/system.js.map +1 -0
- package/dist/utils/message-queue.d.ts.map +1 -1
- package/dist/utils/message-queue.js +1 -1
- package/dist/utils/message-queue.js.map +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { SystemCapabilities, ModelRecommendation } from '../types/index.js';
|
|
2
|
+
export interface ModelRecommendationEnhanced extends ModelRecommendation {
|
|
3
|
+
recommendedProvider: string;
|
|
4
|
+
}
|
|
5
|
+
export 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
|
+
//# sourceMappingURL=recommendation-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommendation-engine.d.ts","sourceRoot":"","sources":["../../source/recommendations/recommendation-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAc,mBAAmB,EAAC,MAAM,mBAAmB,CAAC;AAItF,MAAM,WAAW,2BAA4B,SAAQ,mBAAmB;IACvE,mBAAmB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACpC,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,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,oBAAoB;IA8BhF;;OAEG;IACH,OAAO,CAAC,YAAY;IA6BpB;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IA0D5B;;OAEG;IACH,2BAA2B,CAC1B,kBAAkB,EAAE,kBAAkB,GACpC;QACF,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI;CAeR;AAED,eAAO,MAAM,oBAAoB,sBAAqC,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { modelMatchingEngine } from './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 = { perfect: 4, good: 3, marginal: 2, incompatible: 1 };
|
|
118
|
+
return compatibilityOrder[b.compatibility] - compatibilityOrder[a.compatibility];
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get a simple quick start recommendation
|
|
123
|
+
*/
|
|
124
|
+
getQuickStartRecommendation(systemCapabilities) {
|
|
125
|
+
const result = this.getRecommendations(systemCapabilities);
|
|
126
|
+
if (!result.quickStart) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const model = result.quickStart;
|
|
130
|
+
return {
|
|
131
|
+
model: model.model.name,
|
|
132
|
+
provider: model.recommendedProvider,
|
|
133
|
+
reasoning: model.recommendation,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
export const recommendationEngine = RecommendationEngine.getInstance();
|
|
138
|
+
//# sourceMappingURL=recommendation-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommendation-engine.js","sourceRoot":"","sources":["../../source/recommendations/recommendation-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../source/system/detector.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AAIrD,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;IAqC3B,UAAU,IAAI,IAAI;CAIlB;AAED,eAAO,MAAM,cAAc,gBAA+B,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../source/system/detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-parser.d.ts","sourceRoot":"","sources":["../../source/tool-calling/json-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAMhD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAgHrE;AAsBD;;GAEG;AACH,wBAAgB,yBAAyB,CACxC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,QAAQ,EAAE,GACnB,MAAM,
|
|
1
|
+
{"version":3,"file":"json-parser.d.ts","sourceRoot":"","sources":["../../source/tool-calling/json-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAMhD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAgHrE;AAsBD;;GAEG;AACH,wBAAgB,yBAAyB,CACxC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,QAAQ,EAAE,GACnB,MAAM,CAyDR"}
|
|
@@ -126,7 +126,8 @@ export function cleanContentFromToolCalls(content, toolCalls) {
|
|
|
126
126
|
let cleanedContent = content;
|
|
127
127
|
// Use the new XML parser to clean XML tool calls
|
|
128
128
|
if (XMLToolCallParser.hasToolCalls(cleanedContent)) {
|
|
129
|
-
cleanedContent =
|
|
129
|
+
cleanedContent =
|
|
130
|
+
XMLToolCallParser.removeToolCallsFromContent(cleanedContent);
|
|
130
131
|
}
|
|
131
132
|
// XML cleaning is handled by XMLToolCallParser.removeToolCallsFromContent above
|
|
132
133
|
// Handle markdown code blocks that contain only tool calls
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-parser.js","sourceRoot":"","sources":["../../source/tool-calling/json-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAC,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAElD,2EAA2E;AAE3E,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACxD,MAAM,cAAc,GAAe,EAAE,CAAC;IACtC,IAAI,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAEpC,kEAAkE;IAClE,IAAI,iBAAiB,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,cAAc,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACzE,cAAc,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;QAEvC,mFAAmF;QACnF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;YACzD,OAAO,WAAW,CAAC;QACpB,CAAC;IACF,CAAC;IAED,8BAA8B;IAC9B,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,CAC1C,sCAAsC,CACtC,CAAC;IACF,IAAI,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,uDAAuD;IACvD,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACpE,0CAA0C;QAC1C,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3E,OAAO,cAAc,CAAC;QACvB,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAE1C,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACnD,MAAM,QAAQ,GAAG;oBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE;oBACxB,QAAQ,EAAE;wBACT,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;wBACvB,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;qBACjC;iBACD,CAAC;gBACF,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC9B,OAAO,cAAc,CAAC;YACvB,CAAC;QACF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,QAAQ,CAAC,iDAAiD,CAAC,CAAC;QAC7D,CAAC;IACF,CAAC;IAED,iFAAiF;IACjF,MAAM,cAAc,GACnB,8EAA8E,CAAC;IAChF,IAAI,SAAS,CAAC;IACd,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5D,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACnD,MAAM,QAAQ,GAAG;oBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,cAAc,CAAC,MAAM,EAAE;oBACjD,QAAQ,EAAE;wBACT,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;wBACvB,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;qBACjC;iBACD,CAAC;gBACF,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;QACF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,QAAQ,CAAC,4CAA4C,CAAC,CAAC;QACxD,CAAC;IACF,CAAC;IAED,kDAAkD;IAElD,sDAAsD;IAEtD,oDAAoD;IACpD,MAAM,gBAAgB,GAAG;QACxB,wDAAwD;QACxD,wDAAwD;QACxD,sDAAsD;KACtD,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACxC,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACjD,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC;gBACJ,IAAI,IAAI,CAAC;gBACT,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;gBACpC,CAAC;qBAAM,CAAC;oBACP,IAAI,GAAG,OAAO,IAAI,EAAE,CAAC;gBACtB,CAAC;gBACD,cAAc,CAAC,IAAI,CAAC;oBACnB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,cAAc,CAAC,MAAM,EAAE;oBACjD,QAAQ,EAAE;wBACT,IAAI,EAAE,IAAI,IAAI,EAAE;wBAChB,SAAS,EAAE,IAA4B;qBACvC;iBACD,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,QAAQ,CAAC,yCAAyC,CAAC,CAAC;YACrD,CAAC;QACF,CAAC;IACF,CAAC;IAED,mCAAmC;IACnC,MAAM,WAAW,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IAEzD,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAqB;IAClD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC9B,kEAAkE;QAClE,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CACnD,IAAI,CAAC,QAAQ,CAAC,SAAS,CACvB,EAAE,CAAC;QAEJ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;QACR,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACxC,OAAe,EACf,SAAqB;IAErB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAE3C,IAAI,cAAc,GAAG,OAAO,CAAC;IAE7B,iDAAiD;IACjD,IAAI,iBAAiB,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;QACpD,cAAc,
|
|
1
|
+
{"version":3,"file":"json-parser.js","sourceRoot":"","sources":["../../source/tool-calling/json-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-file.d.ts","sourceRoot":"","sources":["../../source/tools/create-file.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-file.d.ts","sourceRoot":"","sources":["../../source/tools/create-file.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAc,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAgJnE,eAAO,MAAM,cAAc,EAAE,cA0B5B,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { resolve } from 'node:path';
|
|
3
|
-
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import { resolve, dirname } from 'node:path';
|
|
3
|
+
import { writeFile, access } from 'node:fs/promises';
|
|
4
|
+
import { constants } from 'node:fs';
|
|
4
5
|
import { highlight } from 'cli-highlight';
|
|
5
6
|
import React from 'react';
|
|
6
7
|
import { Text, Box } from 'ink';
|
|
@@ -27,10 +28,10 @@ const CreateFileFormatter = React.memo(({ args }) => {
|
|
|
27
28
|
const language = getLanguageFromExtension(ext);
|
|
28
29
|
try {
|
|
29
30
|
const highlighted = highlight(line, { language, theme: 'default' });
|
|
30
|
-
return (_jsxs(Box, { children: [_jsxs(Text, { color: colors.secondary, children: [lineNumStr, "
|
|
31
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { color: colors.secondary, children: [lineNumStr, " "] }), _jsx(Text, { wrap: "wrap", children: highlighted })] }, i));
|
|
31
32
|
}
|
|
32
33
|
catch {
|
|
33
|
-
return (_jsxs(Box, { children: [_jsxs(Text, { color: colors.secondary, children: [lineNumStr, "
|
|
34
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { color: colors.secondary, children: [lineNumStr, " "] }), _jsx(Text, { wrap: "wrap", children: line })] }, i));
|
|
34
35
|
}
|
|
35
36
|
})] })) : (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: colors.secondary, children: "File will be empty" }) }))] }));
|
|
36
37
|
return _jsx(ToolMessage, { message: messageContent, hideBox: true });
|
|
@@ -38,9 +39,66 @@ const CreateFileFormatter = React.memo(({ args }) => {
|
|
|
38
39
|
const formatter = async (args) => {
|
|
39
40
|
return _jsx(CreateFileFormatter, { args: args });
|
|
40
41
|
};
|
|
42
|
+
const validator = async (args) => {
|
|
43
|
+
const absPath = resolve(args.path);
|
|
44
|
+
// Check if file already exists
|
|
45
|
+
try {
|
|
46
|
+
await access(absPath, constants.F_OK);
|
|
47
|
+
return {
|
|
48
|
+
valid: false,
|
|
49
|
+
error: `⚒ File "${args.path}" already exists. Use a file editing tool instead.`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
// ENOENT is good - file doesn't exist
|
|
54
|
+
if (error.code !== 'ENOENT') {
|
|
55
|
+
return {
|
|
56
|
+
valid: false,
|
|
57
|
+
error: `⚒ Cannot access path "${args.path}": ${error.message}`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Check if parent directory exists
|
|
62
|
+
const parentDir = dirname(absPath);
|
|
63
|
+
try {
|
|
64
|
+
await access(parentDir, constants.F_OK);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (error.code === 'ENOENT') {
|
|
68
|
+
return {
|
|
69
|
+
valid: false,
|
|
70
|
+
error: `⚒ Parent directory does not exist: "${parentDir}"`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
valid: false,
|
|
75
|
+
error: `⚒ Cannot access parent directory "${parentDir}": ${error.message}`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Check for invalid path characters or attempts to write to system directories
|
|
79
|
+
const invalidPatterns = [
|
|
80
|
+
/^\/etc\//i,
|
|
81
|
+
/^\/sys\//i,
|
|
82
|
+
/^\/proc\//i,
|
|
83
|
+
/^\/dev\//i,
|
|
84
|
+
/^\/boot\//i,
|
|
85
|
+
/^C:\\Windows\\/i,
|
|
86
|
+
/^C:\\Program Files\\/i,
|
|
87
|
+
];
|
|
88
|
+
for (const pattern of invalidPatterns) {
|
|
89
|
+
if (pattern.test(absPath)) {
|
|
90
|
+
return {
|
|
91
|
+
valid: false,
|
|
92
|
+
error: `⚒ Cannot create files in system directory: "${args.path}"`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return { valid: true };
|
|
97
|
+
};
|
|
41
98
|
export const createFileTool = {
|
|
42
99
|
handler,
|
|
43
100
|
formatter,
|
|
101
|
+
validator,
|
|
44
102
|
config: {
|
|
45
103
|
type: 'function',
|
|
46
104
|
function: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-file.js","sourceRoot":"","sources":["../../source/tools/create-file.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"create-file.js","sourceRoot":"","sources":["../../source/tools/create-file.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-lines.d.ts","sourceRoot":"","sources":["../../source/tools/delete-lines.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"delete-lines.d.ts","sourceRoot":"","sources":["../../source/tools/delete-lines.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAc,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAqbnE,eAAO,MAAM,eAAe,EAAE,cA8B7B,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { resolve } from 'node:path';
|
|
4
|
-
import { readFile, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { readFile, writeFile, access } from 'node:fs/promises';
|
|
5
|
+
import { constants } from 'node:fs';
|
|
5
6
|
import { highlight } from 'cli-highlight';
|
|
6
7
|
import { Text, Box } from 'ink';
|
|
7
8
|
import { ThemeContext } from '../hooks/useTheme.js';
|
|
@@ -44,7 +45,9 @@ const handler = async (args) => {
|
|
|
44
45
|
}
|
|
45
46
|
// Add a note about the deletion
|
|
46
47
|
fileContext += `\n(Deleted ${linesToRemove} line${linesToRemove > 1 ? 's' : ''} that were previously at line${linesToRemove > 1 ? 's' : ''} ${line_number}${endLine !== line_number ? `-${endLine}` : ''})\n`;
|
|
47
|
-
const rangeDesc = line_number === endLine
|
|
48
|
+
const rangeDesc = line_number === endLine
|
|
49
|
+
? `line ${line_number}`
|
|
50
|
+
: `lines ${line_number}-${endLine}`;
|
|
48
51
|
return `Successfully deleted ${rangeDesc}.${fileContext}`;
|
|
49
52
|
};
|
|
50
53
|
const DeleteLinesFormatter = React.memo(({ args, result }) => {
|
|
@@ -104,7 +107,7 @@ async function formatDeleteLinesPreview(args, result, colors) {
|
|
|
104
107
|
}
|
|
105
108
|
// Show a marker indicating where the deletion occurred
|
|
106
109
|
const deletionLineNum = lineNumber;
|
|
107
|
-
contextElements.push(_jsxs(Text, { backgroundColor: themeColors.diffRemoved, color: themeColors.diffRemovedText, wrap: "wrap", children: [String(deletionLineNum).padStart(4, ' '), " - [Deleted ", linesToRemove, "
|
|
110
|
+
contextElements.push(_jsxs(Text, { backgroundColor: themeColors.diffRemoved, color: themeColors.diffRemovedText, wrap: "wrap", children: [String(deletionLineNum).padStart(4, ' '), " - [Deleted ", linesToRemove, ' ', "line", linesToRemove > 1 ? 's' : '', "]"] }, "deletion-marker"));
|
|
108
111
|
// Show context after the deletion point (adjust line numbers)
|
|
109
112
|
for (let i = lineNumber - 1; i <= Math.min(showEnd, lines.length - 1); i++) {
|
|
110
113
|
const displayLineNum = i + linesToRemove + 1;
|
|
@@ -119,7 +122,9 @@ async function formatDeleteLinesPreview(args, result, colors) {
|
|
|
119
122
|
}
|
|
120
123
|
contextElements.push(_jsxs(Text, { color: themeColors.secondary, children: [lineNumStr, " ", displayLine] }, `after-${i}`));
|
|
121
124
|
}
|
|
122
|
-
const rangeDesc = lineNumber === endLine
|
|
125
|
+
const rangeDesc = lineNumber === endLine
|
|
126
|
+
? `line ${lineNumber}`
|
|
127
|
+
: `lines ${lineNumber}-${endLine}`;
|
|
123
128
|
const messageContent = (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: themeColors.tool, children: [displayTitle, " delete_lines"] }), _jsxs(Box, { children: [_jsx(Text, { color: themeColors.secondary, children: "Path: " }), _jsx(Text, { color: themeColors.primary, children: path })] }), _jsxs(Box, { children: [_jsx(Text, { color: themeColors.secondary, children: "Deleted: " }), _jsx(Text, { color: themeColors.white, children: rangeDesc })] }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: _jsx(Text, { color: themeColors.success, children: "\u2713 Delete completed successfully" }) }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: themeColors.secondary, children: "Result:" }), contextElements] })] }));
|
|
124
129
|
return _jsx(ToolMessage, { message: messageContent, hideBox: true });
|
|
125
130
|
}
|
|
@@ -174,7 +179,9 @@ async function formatDeleteLinesPreview(args, result, colors) {
|
|
|
174
179
|
}
|
|
175
180
|
contextAfter.push(_jsxs(Text, { color: themeColors.secondary, children: [lineNumStr, " ", displayLine] }, `after-${i}`));
|
|
176
181
|
}
|
|
177
|
-
const rangeDesc = lineNumber === endLine
|
|
182
|
+
const rangeDesc = lineNumber === endLine
|
|
183
|
+
? `line ${lineNumber}`
|
|
184
|
+
: `lines ${lineNumber}-${endLine}`;
|
|
178
185
|
const messageContent = (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: themeColors.tool, children: [displayTitle, " delete_lines"] }), _jsxs(Box, { children: [_jsx(Text, { color: themeColors.secondary, children: "Path: " }), _jsx(Text, { color: themeColors.primary, children: path })] }), _jsxs(Box, { children: [_jsx(Text, { color: themeColors.secondary, children: "Range: " }), _jsx(Text, { color: themeColors.white, children: rangeDesc })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { color: themeColors.success, children: ["\u2713 Deleting ", linesToRemove, " line", linesToRemove > 1 ? 's' : ''] }), _jsxs(Box, { flexDirection: "column", children: [contextBefore, deletedLines, contextAfter] })] })] }));
|
|
179
186
|
return _jsx(ToolMessage, { message: messageContent, hideBox: true });
|
|
180
187
|
}
|
|
@@ -186,9 +193,68 @@ async function formatDeleteLinesPreview(args, result, colors) {
|
|
|
186
193
|
const formatter = async (args, result) => {
|
|
187
194
|
return _jsx(DeleteLinesFormatter, { args: args, result: result });
|
|
188
195
|
};
|
|
196
|
+
const validator = async (args) => {
|
|
197
|
+
const { path, line_number, end_line } = args;
|
|
198
|
+
// Check if file exists
|
|
199
|
+
const absPath = resolve(path);
|
|
200
|
+
try {
|
|
201
|
+
await access(absPath, constants.F_OK);
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
if (error.code === 'ENOENT') {
|
|
205
|
+
return {
|
|
206
|
+
valid: false,
|
|
207
|
+
error: `⚒ File "${path}" does not exist`,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
valid: false,
|
|
212
|
+
error: `⚒ Cannot access file "${path}": ${error.message}`,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// Validate line numbers
|
|
216
|
+
if (!line_number || line_number < 1) {
|
|
217
|
+
return {
|
|
218
|
+
valid: false,
|
|
219
|
+
error: `⚒ Invalid line_number: ${line_number}. Must be a positive integer.`,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
const endLine = end_line ?? line_number;
|
|
223
|
+
if (endLine < line_number) {
|
|
224
|
+
return {
|
|
225
|
+
valid: false,
|
|
226
|
+
error: `⚒ end_line (${endLine}) cannot be less than line_number (${line_number}).`,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
// Check line numbers are within file bounds
|
|
230
|
+
try {
|
|
231
|
+
const fileContent = await readFile(absPath, 'utf-8');
|
|
232
|
+
const lines = fileContent.split('\n');
|
|
233
|
+
if (line_number > lines.length) {
|
|
234
|
+
return {
|
|
235
|
+
valid: false,
|
|
236
|
+
error: `⚒ Line number ${line_number} is out of range (file has ${lines.length} lines)`,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
if (endLine > lines.length) {
|
|
240
|
+
return {
|
|
241
|
+
valid: false,
|
|
242
|
+
error: `⚒ End line ${endLine} is out of range (file has ${lines.length} lines)`,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
return {
|
|
248
|
+
valid: false,
|
|
249
|
+
error: `⚒ Error reading file: ${error.message}`,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
return { valid: true };
|
|
253
|
+
};
|
|
189
254
|
export const deleteLinesTool = {
|
|
190
255
|
handler,
|
|
191
256
|
formatter,
|
|
257
|
+
validator,
|
|
192
258
|
config: {
|
|
193
259
|
type: 'function',
|
|
194
260
|
function: {
|