@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.
Files changed (186) hide show
  1. package/README.md +53 -11
  2. package/dist/app/hooks/useAppInitialization.d.ts +3 -3
  3. package/dist/app/hooks/useAppInitialization.d.ts.map +1 -1
  4. package/dist/app/hooks/useAppInitialization.js +2 -1
  5. package/dist/app/hooks/useAppInitialization.js.map +1 -1
  6. package/dist/app/hooks/useAppState.d.ts +5 -3
  7. package/dist/app/hooks/useAppState.d.ts.map +1 -1
  8. package/dist/app/hooks/useAppState.js +7 -2
  9. package/dist/app/hooks/useAppState.js.map +1 -1
  10. package/dist/app/hooks/useChatHandler.d.ts.map +1 -1
  11. package/dist/app/hooks/useChatHandler.js +131 -5
  12. package/dist/app/hooks/useChatHandler.js.map +1 -1
  13. package/dist/app/hooks/useDirectoryTrust.d.ts.map +1 -1
  14. package/dist/app/hooks/useDirectoryTrust.js.map +1 -1
  15. package/dist/app/hooks/useModeHandlers.d.ts +8 -5
  16. package/dist/app/hooks/useModeHandlers.d.ts.map +1 -1
  17. package/dist/app/hooks/useModeHandlers.js +12 -2
  18. package/dist/app/hooks/useModeHandlers.js.map +1 -1
  19. package/dist/app/hooks/useToolHandler.d.ts +2 -2
  20. package/dist/app/hooks/useToolHandler.d.ts.map +1 -1
  21. package/dist/app/hooks/useToolHandler.js +66 -0
  22. package/dist/app/hooks/useToolHandler.js.map +1 -1
  23. package/dist/app/utils/appUtils.d.ts.map +1 -1
  24. package/dist/app/utils/appUtils.js +5 -1
  25. package/dist/app/utils/appUtils.js.map +1 -1
  26. package/dist/app/utils/conversationState.d.ts.map +1 -1
  27. package/dist/app/utils/conversationState.js +35 -13
  28. package/dist/app/utils/conversationState.js.map +1 -1
  29. package/dist/app.d.ts.map +1 -1
  30. package/dist/app.js +4 -1
  31. package/dist/app.js.map +1 -1
  32. package/dist/client-factory.d.ts +3 -3
  33. package/dist/client-factory.d.ts.map +1 -1
  34. package/dist/client-factory.js +13 -6
  35. package/dist/client-factory.js.map +1 -1
  36. package/dist/command-parser.d.ts.map +1 -1
  37. package/dist/command-parser.js +2 -2
  38. package/dist/command-parser.js.map +1 -1
  39. package/dist/commands/index.d.ts +1 -0
  40. package/dist/commands/index.d.ts.map +1 -1
  41. package/dist/commands/index.js +1 -0
  42. package/dist/commands/index.js.map +1 -1
  43. package/dist/commands/recommendations.d.ts +8 -0
  44. package/dist/commands/recommendations.d.ts.map +1 -0
  45. package/dist/commands/recommendations.js +303 -0
  46. package/dist/commands/recommendations.js.map +1 -0
  47. package/dist/components/assistant-message.d.ts.map +1 -1
  48. package/dist/components/assistant-message.js +58 -33
  49. package/dist/components/assistant-message.js.map +1 -1
  50. package/dist/components/chat-queue.js.map +1 -1
  51. package/dist/components/provider-selector.d.ts +2 -3
  52. package/dist/components/provider-selector.d.ts.map +1 -1
  53. package/dist/components/provider-selector.js.map +1 -1
  54. package/dist/components/security-disclaimer.d.ts +1 -1
  55. package/dist/components/security-disclaimer.d.ts.map +1 -1
  56. package/dist/components/security-disclaimer.js +1 -1
  57. package/dist/components/security-disclaimer.js.map +1 -1
  58. package/dist/components/tool-confirmation.d.ts.map +1 -1
  59. package/dist/components/tool-confirmation.js +49 -8
  60. package/dist/components/tool-confirmation.js.map +1 -1
  61. package/dist/config/index.d.ts.map +1 -1
  62. package/dist/config/index.js.map +1 -1
  63. package/dist/config/preferences.d.ts +2 -3
  64. package/dist/config/preferences.d.ts.map +1 -1
  65. package/dist/config/preferences.js +8 -8
  66. package/dist/config/preferences.js.map +1 -1
  67. package/dist/config/themes.d.ts.map +1 -1
  68. package/dist/config/themes.js +1 -1
  69. package/dist/config/themes.js.map +1 -1
  70. package/dist/custom-commands/index.d.ts +3 -3
  71. package/dist/custom-commands/index.js +3 -3
  72. package/dist/custom-commands/loader.d.ts.map +1 -1
  73. package/dist/custom-commands/loader.js +6 -6
  74. package/dist/custom-commands/loader.js.map +1 -1
  75. package/dist/hooks/useTerminalWidth.js +1 -1
  76. package/dist/hooks/useTerminalWidth.js.map +1 -1
  77. package/dist/init/agents-template-generator.d.ts.map +1 -1
  78. package/dist/init/agents-template-generator.js +43 -41
  79. package/dist/init/agents-template-generator.js.map +1 -1
  80. package/dist/init/existing-rules-extractor.d.ts.map +1 -1
  81. package/dist/init/existing-rules-extractor.js +46 -12
  82. package/dist/init/existing-rules-extractor.js.map +1 -1
  83. package/dist/init/file-scanner.d.ts.map +1 -1
  84. package/dist/init/file-scanner.js +44 -16
  85. package/dist/init/file-scanner.js.map +1 -1
  86. package/dist/init/framework-detector.d.ts.map +1 -1
  87. package/dist/init/framework-detector.js +42 -13
  88. package/dist/init/framework-detector.js.map +1 -1
  89. package/dist/init/language-detector.d.ts.map +1 -1
  90. package/dist/init/language-detector.js +20 -7
  91. package/dist/init/language-detector.js.map +1 -1
  92. package/dist/init/project-analyzer.d.ts.map +1 -1
  93. package/dist/init/project-analyzer.js +55 -19
  94. package/dist/init/project-analyzer.js.map +1 -1
  95. package/dist/langgraph-client.d.ts +1 -0
  96. package/dist/langgraph-client.d.ts.map +1 -1
  97. package/dist/langgraph-client.js +31 -1
  98. package/dist/langgraph-client.js.map +1 -1
  99. package/dist/mcp/mcp-client.js.map +1 -1
  100. package/dist/mcp/mcp-tool-adapter.d.ts +1 -1
  101. package/dist/mcp/mcp-tool-adapter.d.ts.map +1 -1
  102. package/dist/mcp/mcp-tool-adapter.js.map +1 -1
  103. package/dist/message-handler.d.ts.map +1 -1
  104. package/dist/message-handler.js +2 -2
  105. package/dist/message-handler.js.map +1 -1
  106. package/dist/prompt-history.d.ts.map +1 -1
  107. package/dist/prompt-history.js +11 -9
  108. package/dist/prompt-history.js.map +1 -1
  109. package/dist/recommendations/model-database.d.ts +9 -0
  110. package/dist/recommendations/model-database.d.ts.map +1 -0
  111. package/dist/recommendations/model-database.js +455 -0
  112. package/dist/recommendations/model-database.js.map +1 -0
  113. package/dist/recommendations/model-engine.d.ts +16 -0
  114. package/dist/recommendations/model-engine.d.ts.map +1 -0
  115. package/dist/recommendations/model-engine.js +185 -0
  116. package/dist/recommendations/model-engine.js.map +1 -0
  117. package/dist/recommendations/recommendation-engine.d.ts +38 -0
  118. package/dist/recommendations/recommendation-engine.d.ts.map +1 -0
  119. package/dist/recommendations/recommendation-engine.js +138 -0
  120. package/dist/recommendations/recommendation-engine.js.map +1 -0
  121. package/dist/system/detector.d.ts +18 -0
  122. package/dist/system/detector.d.ts.map +1 -0
  123. package/dist/system/detector.js +140 -0
  124. package/dist/system/detector.js.map +1 -0
  125. package/dist/tool-calling/json-parser.d.ts.map +1 -1
  126. package/dist/tool-calling/json-parser.js +2 -1
  127. package/dist/tool-calling/json-parser.js.map +1 -1
  128. package/dist/tools/create-file.d.ts.map +1 -1
  129. package/dist/tools/create-file.js +62 -4
  130. package/dist/tools/create-file.js.map +1 -1
  131. package/dist/tools/delete-lines.d.ts.map +1 -1
  132. package/dist/tools/delete-lines.js +71 -5
  133. package/dist/tools/delete-lines.js.map +1 -1
  134. package/dist/tools/execute-bash.d.ts.map +1 -1
  135. package/dist/tools/execute-bash.js +29 -0
  136. package/dist/tools/execute-bash.js.map +1 -1
  137. package/dist/tools/fetch-url.d.ts +3 -0
  138. package/dist/tools/fetch-url.d.ts.map +1 -0
  139. package/dist/tools/fetch-url.js +122 -0
  140. package/dist/tools/fetch-url.js.map +1 -0
  141. package/dist/tools/index.d.ts +6 -0
  142. package/dist/tools/index.d.ts.map +1 -1
  143. package/dist/tools/index.js +8 -0
  144. package/dist/tools/index.js.map +1 -1
  145. package/dist/tools/insert-lines.d.ts.map +1 -1
  146. package/dist/tools/insert-lines.js +48 -1
  147. package/dist/tools/insert-lines.js.map +1 -1
  148. package/dist/tools/read-file.d.ts.map +1 -1
  149. package/dist/tools/read-file.js +31 -3
  150. package/dist/tools/read-file.js.map +1 -1
  151. package/dist/tools/read-many-files.d.ts.map +1 -1
  152. package/dist/tools/read-many-files.js +56 -8
  153. package/dist/tools/read-many-files.js.map +1 -1
  154. package/dist/tools/replace-lines.d.ts.map +1 -1
  155. package/dist/tools/replace-lines.js +70 -4
  156. package/dist/tools/replace-lines.js.map +1 -1
  157. package/dist/tools/tool-manager.d.ts +10 -0
  158. package/dist/tools/tool-manager.d.ts.map +1 -1
  159. package/dist/tools/tool-manager.js +10 -2
  160. package/dist/tools/tool-manager.js.map +1 -1
  161. package/dist/tools/web-search.d.ts +3 -0
  162. package/dist/tools/web-search.d.ts.map +1 -0
  163. package/dist/tools/web-search.js +133 -0
  164. package/dist/tools/web-search.js.map +1 -0
  165. package/dist/types/app.d.ts +1 -0
  166. package/dist/types/app.d.ts.map +1 -1
  167. package/dist/types/commands.d.ts.map +1 -1
  168. package/dist/types/components.d.ts +3 -3
  169. package/dist/types/components.d.ts.map +1 -1
  170. package/dist/types/config.d.ts +17 -6
  171. package/dist/types/config.d.ts.map +1 -1
  172. package/dist/types/core.d.ts +10 -5
  173. package/dist/types/core.d.ts.map +1 -1
  174. package/dist/types/index.d.ts +11 -10
  175. package/dist/types/index.d.ts.map +1 -1
  176. package/dist/types/index.js +11 -10
  177. package/dist/types/index.js.map +1 -1
  178. package/dist/types/mcp.d.ts.map +1 -1
  179. package/dist/types/system.d.ts +57 -0
  180. package/dist/types/system.d.ts.map +1 -0
  181. package/dist/types/system.js +2 -0
  182. package/dist/types/system.js.map +1 -0
  183. package/dist/utils/message-queue.d.ts.map +1 -1
  184. package/dist/utils/message-queue.js +1 -1
  185. package/dist/utils/message-queue.js.map +1 -1
  186. 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,CAwDR"}
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 = XMLToolCallParser.removeToolCallsFromContent(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":"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"}
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":"AAKA,OAAO,KAAK,EAAc,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAiFnE,eAAO,MAAM,cAAc,EAAE,cAyB5B,CAAC"}
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, " "] }), _jsx(Text, { wrap: "wrap", children: highlighted })] }, i));
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, " "] }), _jsx(Text, { wrap: "wrap", children: line })] }, i));
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":"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"}
1
+ {"version":3,"file":"create-file.js","sourceRoot":"","sources":["../../source/tools/create-file.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAE,OAAO,EAAC,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAC,SAAS,EAAE,MAAM,EAAC,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAC,SAAS,EAAC,MAAM,SAAS,CAAC;AAClC,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,IAAI,EAAE,GAAG,EAAC,MAAM,KAAK,CAAC;AAE9B,OAAO,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAC,wBAAwB,EAAC,MAAM,yCAAyC,CAAC;AACjF,OAAO,WAAW,MAAM,+BAA+B,CAAC;AAExD,MAAM,OAAO,GAAgB,KAAK,EAAE,IAGnC,EAAmB,EAAE;IACrB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,2BAA2B,CAAC;AACpC,CAAC,CAAC;AAEF,4DAA4D;AAC5D,MAAM,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,EAAC,IAAI,EAAc,EAAE,EAAE;IAC9D,MAAM,EAAC,MAAM,EAAC,GAAG,KAAK,CAAC,UAAU,CAAC,YAAY,CAAE,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAChD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC;IAEpC,iEAAiE;IACjE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAEjD,MAAM,cAAc,GAAG,CACtB,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aAC1B,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,mCAAsB,EAE9C,MAAC,GAAG,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,uBAAe,EAC5C,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,YAAG,IAAI,GAAQ,IACnC,EACN,MAAC,GAAG,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,uBAAe,EAC5C,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,aACvB,SAAS,cAAU,SAAS,oBAAgB,eAAe,gBACtD,IACF,EAEL,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACxB,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACvC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,8BAAsB,EAC9C,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,CAAS,EAAE,EAAE;wBACvD,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;wBAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;wBACjD,MAAM,QAAQ,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;wBAE/C,IAAI,CAAC;4BACJ,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,EAAE,EAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAC,CAAC,CAAC;4BAClE,OAAO,CACN,MAAC,GAAG,eACH,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,aAAG,UAAU,SAAS,EACnD,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,YAAE,WAAW,GAAQ,KAF7B,CAAC,CAGL,CACN,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACR,OAAO,CACN,MAAC,GAAG,eACH,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,aAAG,UAAU,SAAS,EACnD,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,YAAE,IAAI,GAAQ,KAFtB,CAAC,CAGL,CACN,CAAC;wBACH,CAAC;oBACF,CAAC,CAAC,IACG,CACN,CAAC,CAAC,CAAC,CACH,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YAChB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,mCAA2B,GACnD,CACN,IACI,CACN,CAAC;IAEF,OAAO,KAAC,WAAW,IAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,GAAI,CAAC;AAChE,CAAC,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,KAAK,EAAE,IAAS,EAA+B,EAAE;IAClE,OAAO,KAAC,mBAAmB,IAAC,IAAI,EAAE,IAAI,GAAI,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,KAAK,EAAE,IAGxB,EAA0D,EAAE;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEnC,+BAA+B;IAC/B,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO;YACN,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,WAAW,IAAI,CAAC,IAAI,oDAAoD;SAC/E,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACrB,sCAAsC;QACtC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO;gBACN,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,yBAAyB,IAAI,CAAC,IAAI,MAAM,KAAK,CAAC,OAAO,EAAE;aAC9D,CAAC;QACH,CAAC;IACF,CAAC;IAED,mCAAmC;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACrB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO;gBACN,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,uCAAuC,SAAS,GAAG;aAC1D,CAAC;QACH,CAAC;QACD,OAAO;YACN,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,qCAAqC,SAAS,MAAM,KAAK,CAAC,OAAO,EAAE;SAC1E,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,MAAM,eAAe,GAAG;QACvB,WAAW;QACX,WAAW;QACX,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,iBAAiB;QACjB,uBAAuB;KACvB,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACN,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,+CAA+C,IAAI,CAAC,IAAI,GAAG;aAClE,CAAC;QACH,CAAC;IACF,CAAC;IAED,OAAO,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC7C,OAAO;IACP,SAAS;IACT,SAAS;IACT,MAAM,EAAE;QACP,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACT,IAAI,EAAE,aAAa;YACnB,WAAW,EACV,0EAA0E;YAC3E,UAAU,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACX,IAAI,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,gCAAgC;qBAC7C;oBACD,OAAO,EAAE;wBACR,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,mCAAmC;qBAChD;iBACD;gBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;aAC7B;SACD;KACD;CACD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"delete-lines.d.ts","sourceRoot":"","sources":["../../source/tools/delete-lines.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAc,cAAc,EAAC,MAAM,mBAAmB,CAAC;AA4UnE,eAAO,MAAM,eAAe,EAAE,cA4B7B,CAAC"}
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 ? `line ${line_number}` : `lines ${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, " line", linesToRemove > 1 ? 's' : '', "]"] }, "deletion-marker"));
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 ? `line ${lineNumber}` : `lines ${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 ? `line ${lineNumber}` : `lines ${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: {