@smartnet360/svelte-components 0.0.102 → 0.0.104
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/dist/apps/antenna-pattern/index.d.ts +1 -0
- package/dist/apps/antenna-pattern/index.js +1 -0
- package/dist/apps/antenna-pattern/utils/load-static-antennas.d.ts +17 -0
- package/dist/apps/antenna-pattern/utils/load-static-antennas.js +83 -0
- package/dist/apps/site-check/SiteCheck.svelte +13 -81
- package/dist/apps/site-check/SiteCheckControls.svelte +0 -7
- package/dist/apps/site-check/helper.js +0 -33
- package/dist/apps/site-check/transforms.js +15 -65
- package/dist/core/CellTable/CellTable.svelte +456 -0
- package/dist/core/CellTable/CellTable.svelte.d.ts +27 -0
- package/dist/core/CellTable/CellTablePanel.svelte +211 -0
- package/dist/core/CellTable/CellTablePanel.svelte.d.ts +49 -0
- package/dist/core/CellTable/CellTableToolbar.svelte +218 -0
- package/dist/core/CellTable/CellTableToolbar.svelte.d.ts +32 -0
- package/dist/core/CellTable/column-config.d.ts +63 -0
- package/dist/core/CellTable/column-config.js +465 -0
- package/dist/core/CellTable/index.d.ts +10 -0
- package/dist/core/CellTable/index.js +11 -0
- package/dist/core/CellTable/types.d.ts +166 -0
- package/dist/core/CellTable/types.js +6 -0
- package/dist/core/Charts/ChartCard.svelte +118 -31
- package/dist/core/Charts/ChartCard.svelte.d.ts +2 -0
- package/dist/core/Charts/ChartComponent.svelte +8 -31
- package/dist/core/Charts/data-processor.js +1 -19
- package/dist/core/CoverageMap/ai/AITools.d.ts +117 -0
- package/dist/core/CoverageMap/ai/AITools.js +380 -0
- package/dist/core/CoverageMap/core/CoverageCalculator.d.ts +138 -0
- package/dist/core/CoverageMap/core/CoverageCalculator.js +375 -0
- package/dist/core/CoverageMap/core/GridCalculator.d.ts +115 -0
- package/dist/core/CoverageMap/core/GridCalculator.js +484 -0
- package/dist/core/CoverageMap/core/PathLossModels.d.ts +253 -0
- package/dist/core/CoverageMap/core/PathLossModels.js +380 -0
- package/dist/core/CoverageMap/core/SignalProcessor.d.ts +288 -0
- package/dist/core/CoverageMap/core/SignalProcessor.js +424 -0
- package/dist/core/CoverageMap/data/AntennaStore.d.ts +165 -0
- package/dist/core/CoverageMap/data/AntennaStore.js +327 -0
- package/dist/core/CoverageMap/data/SiteStore.d.ts +155 -0
- package/dist/core/CoverageMap/data/SiteStore.js +355 -0
- package/dist/core/CoverageMap/index.d.ts +74 -0
- package/dist/core/CoverageMap/index.js +103 -0
- package/dist/core/CoverageMap/types.d.ts +252 -0
- package/dist/core/CoverageMap/types.js +7 -0
- package/dist/core/CoverageMap/utils/geoUtils.d.ts +223 -0
- package/dist/core/CoverageMap/utils/geoUtils.js +374 -0
- package/dist/core/CoverageMap/utils/rfUtils.d.ts +329 -0
- package/dist/core/CoverageMap/utils/rfUtils.js +434 -0
- package/dist/core/CoverageMap/visualization/ColorSchemes.d.ts +149 -0
- package/dist/core/CoverageMap/visualization/ColorSchemes.js +377 -0
- package/dist/core/TreeView/index.d.ts +4 -4
- package/dist/core/TreeView/index.js +5 -5
- package/dist/core/TreeView/tree-utils.d.ts +12 -0
- package/dist/core/TreeView/tree-utils.js +115 -6
- package/dist/core/TreeView/tree.store.svelte.d.ts +94 -0
- package/dist/core/TreeView/tree.store.svelte.js +274 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.js +2 -0
- package/dist/map-v2/features/cells/controls/CellFilterControl.svelte +16 -27
- package/dist/map-v2/features/repeaters/controls/RepeaterFilterControl.svelte +33 -42
- package/dist/map-v2/features/sites/controls/SiteFilterControl.svelte +12 -19
- package/dist/map-v3/core/components/Map.svelte +4 -0
- package/dist/map-v3/core/stores/map.store.svelte.js +2 -0
- package/dist/map-v3/features/cells/components/CellFilterControl.svelte +24 -30
- package/dist/map-v3/features/coverage/index.d.ts +12 -0
- package/dist/map-v3/features/coverage/index.js +16 -0
- package/dist/map-v3/features/coverage/layers/CoverageLayer.svelte +198 -0
- package/dist/map-v3/features/coverage/layers/CoverageLayer.svelte.d.ts +10 -0
- package/dist/map-v3/features/coverage/logic/coloring.d.ts +28 -0
- package/dist/map-v3/features/coverage/logic/coloring.js +77 -0
- package/dist/map-v3/features/coverage/logic/geometry.d.ts +33 -0
- package/dist/map-v3/features/coverage/logic/geometry.js +112 -0
- package/dist/map-v3/features/coverage/stores/coverage.data.svelte.d.ts +46 -0
- package/dist/map-v3/features/coverage/stores/coverage.data.svelte.js +95 -0
- package/dist/map-v3/features/coverage/stores/coverage.display.svelte.d.ts +33 -0
- package/dist/map-v3/features/coverage/stores/coverage.display.svelte.js +90 -0
- package/dist/map-v3/features/coverage/types.d.ts +52 -0
- package/dist/map-v3/features/coverage/types.js +7 -0
- package/dist/map-v3/features/repeaters/components/RepeaterFilterControl.svelte +14 -20
- package/dist/map-v3/features/sites/components/SiteFilterControl.svelte +23 -33
- package/dist/map-v3/index.d.ts +4 -0
- package/dist/map-v3/index.js +5 -0
- package/package.json +4 -3
- package/dist/apps/site-check/transforms-old.d.ts +0 -56
- package/dist/apps/site-check/transforms-old.js +0 -273
- package/dist/core/TreeView/tree.store.d.ts +0 -10
- package/dist/core/TreeView/tree.store.js +0 -320
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Integration Layer - Tool-Callable Functions
|
|
3
|
+
*
|
|
4
|
+
* This module provides functions designed to be called by AI assistants
|
|
5
|
+
* (e.g., ChatGPT) for coverage analysis and recommendations.
|
|
6
|
+
*
|
|
7
|
+
* Design principles:
|
|
8
|
+
* - Functions are stateless and pure where possible
|
|
9
|
+
* - Inputs and outputs are JSON-serializable
|
|
10
|
+
* - Each function has clear purpose and documentation
|
|
11
|
+
* - Error handling returns structured error objects
|
|
12
|
+
*
|
|
13
|
+
* Phase 2 Implementation Note:
|
|
14
|
+
* These functions will be exposed via a tool registry that ChatGPT
|
|
15
|
+
* can call through function calling / tool use APIs.
|
|
16
|
+
*/
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// AI TOOL FUNCTIONS
|
|
19
|
+
// ============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Analyze coverage quality and generate recommendations
|
|
22
|
+
*
|
|
23
|
+
* This function takes coverage calculation results and generates
|
|
24
|
+
* structured analysis suitable for AI interpretation.
|
|
25
|
+
*
|
|
26
|
+
* In Phase 2, ChatGPT will call this with coverage data and receive
|
|
27
|
+
* structured metrics that it can analyze and explain in natural language.
|
|
28
|
+
*
|
|
29
|
+
* @param result - Coverage calculation result
|
|
30
|
+
* @returns Structured analysis data
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* // AI will call:
|
|
34
|
+
* const analysis = analyzeCoverageQuality(coverageResult);
|
|
35
|
+
*
|
|
36
|
+
* // AI receives:
|
|
37
|
+
* {
|
|
38
|
+
* overallQuality: "good",
|
|
39
|
+
* coveragePercent: 78.5,
|
|
40
|
+
* avgSignal: -82.3,
|
|
41
|
+
* issues: ["excessive_range", "weak_avg_signal"],
|
|
42
|
+
* metrics: { ... }
|
|
43
|
+
* }
|
|
44
|
+
*
|
|
45
|
+
* // AI interprets and responds:
|
|
46
|
+
* "Your coverage is good overall at 78.5%. However, I notice two issues:
|
|
47
|
+
* 1. Excessive range detected - consider adding downtilt to reduce interference
|
|
48
|
+
* 2. Average signal is weak at -82.3 dBm - most users will experience medium throughput"
|
|
49
|
+
*/
|
|
50
|
+
export function analyzeCoverageQuality(result) {
|
|
51
|
+
const stats = result.grid.stats;
|
|
52
|
+
const metrics = result.summary.metrics;
|
|
53
|
+
// Determine overall quality
|
|
54
|
+
let overallQuality;
|
|
55
|
+
if (stats.coveragePercentage >= 90 && metrics.excellentPercent >= 50) {
|
|
56
|
+
overallQuality = 'excellent';
|
|
57
|
+
}
|
|
58
|
+
else if (stats.coveragePercentage >= 70 && metrics.goodPercent + metrics.excellentPercent >= 60) {
|
|
59
|
+
overallQuality = 'good';
|
|
60
|
+
}
|
|
61
|
+
else if (stats.coveragePercentage >= 50) {
|
|
62
|
+
overallQuality = 'fair';
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
overallQuality = 'poor';
|
|
66
|
+
}
|
|
67
|
+
// Extract issues
|
|
68
|
+
const issues = [];
|
|
69
|
+
if (stats.coveragePercentage < 60) {
|
|
70
|
+
issues.push('low_coverage');
|
|
71
|
+
}
|
|
72
|
+
if (metrics.poorPercent + metrics.fairPercent > 70) {
|
|
73
|
+
issues.push('weak_signal_dominance');
|
|
74
|
+
}
|
|
75
|
+
if (metrics.maxRange > 15) {
|
|
76
|
+
issues.push('excessive_range');
|
|
77
|
+
}
|
|
78
|
+
if (metrics.maxRange < 1) {
|
|
79
|
+
issues.push('undershooting');
|
|
80
|
+
}
|
|
81
|
+
if (metrics.avgSignal < -90) {
|
|
82
|
+
issues.push('weak_avg_signal');
|
|
83
|
+
}
|
|
84
|
+
if (metrics.excellentPercent < 10) {
|
|
85
|
+
issues.push('minimal_excellent_coverage');
|
|
86
|
+
}
|
|
87
|
+
// Sector breakdown
|
|
88
|
+
const sectorBreakdown = Object.entries(stats.sectorStats || {}).map(([id, stat]) => ({
|
|
89
|
+
sectorId: id,
|
|
90
|
+
maxRangeKm: stat.maxRangeKm,
|
|
91
|
+
avgSignalDbm: stat.avgSignalDbm,
|
|
92
|
+
coverageAreaKm2: stat.coverageAreaKm2
|
|
93
|
+
}));
|
|
94
|
+
return {
|
|
95
|
+
overallQuality,
|
|
96
|
+
coveragePercent: stats.coveragePercentage,
|
|
97
|
+
avgSignal: metrics.avgSignal,
|
|
98
|
+
maxRange: metrics.maxRange,
|
|
99
|
+
issues,
|
|
100
|
+
metrics,
|
|
101
|
+
sectorBreakdown
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Generate optimization suggestions
|
|
106
|
+
*
|
|
107
|
+
* Based on coverage analysis, generates specific parameter adjustment
|
|
108
|
+
* recommendations that can be presented to the user.
|
|
109
|
+
*
|
|
110
|
+
* In Phase 2, AI will use this to generate specific, actionable recommendations.
|
|
111
|
+
*
|
|
112
|
+
* @param result - Coverage result
|
|
113
|
+
* @returns Array of recommendations
|
|
114
|
+
*/
|
|
115
|
+
export function generateOptimizationSuggestions(result) {
|
|
116
|
+
const analysis = analyzeCoverageQuality(result);
|
|
117
|
+
const recommendations = [];
|
|
118
|
+
const config = result.config;
|
|
119
|
+
// Check each issue and generate recommendations
|
|
120
|
+
for (const issue of analysis.issues) {
|
|
121
|
+
switch (issue) {
|
|
122
|
+
case 'excessive_range':
|
|
123
|
+
// Recommend increasing downtilt
|
|
124
|
+
for (const sector of config.site.sectors) {
|
|
125
|
+
if (sector.enabled) {
|
|
126
|
+
const currentTilt = sector.mechanicalTilt + sector.electricalTilt;
|
|
127
|
+
recommendations.push({
|
|
128
|
+
sectorId: sector.sectorId,
|
|
129
|
+
parameter: 'tilt',
|
|
130
|
+
currentValue: currentTilt,
|
|
131
|
+
suggestedValue: currentTilt + 3,
|
|
132
|
+
reasoning: 'Range exceeds 15km which may cause interference to neighboring sites. ' +
|
|
133
|
+
'Increasing downtilt will focus energy closer to the site.',
|
|
134
|
+
expectedImprovement: 'Reduced interference, better signal quality nearby',
|
|
135
|
+
priority: 'high'
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
break;
|
|
140
|
+
case 'weak_signal_dominance':
|
|
141
|
+
// Recommend increasing power or reducing tilt
|
|
142
|
+
for (const sector of config.site.sectors) {
|
|
143
|
+
if (sector.enabled && sector.txPower < 46) {
|
|
144
|
+
recommendations.push({
|
|
145
|
+
sectorId: sector.sectorId,
|
|
146
|
+
parameter: 'power',
|
|
147
|
+
currentValue: sector.txPower,
|
|
148
|
+
suggestedValue: Math.min(sector.txPower + 3, 46),
|
|
149
|
+
reasoning: 'Over 70% of coverage has weak signal. Increasing power will improve signal strength.',
|
|
150
|
+
expectedImprovement: '+3dB signal strength across coverage area',
|
|
151
|
+
priority: 'high'
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
break;
|
|
156
|
+
case 'undershooting':
|
|
157
|
+
// Recommend reducing tilt or increasing power
|
|
158
|
+
for (const sector of config.site.sectors) {
|
|
159
|
+
if (sector.enabled) {
|
|
160
|
+
const currentTilt = sector.mechanicalTilt + sector.electricalTilt;
|
|
161
|
+
if (currentTilt > 3) {
|
|
162
|
+
recommendations.push({
|
|
163
|
+
sectorId: sector.sectorId,
|
|
164
|
+
parameter: 'tilt',
|
|
165
|
+
currentValue: currentTilt,
|
|
166
|
+
suggestedValue: Math.max(currentTilt - 3, 0),
|
|
167
|
+
reasoning: 'Coverage range is very short (< 1km). Reducing tilt will extend coverage.',
|
|
168
|
+
expectedImprovement: 'Extended coverage range',
|
|
169
|
+
priority: 'high'
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
case 'low_coverage':
|
|
176
|
+
// Recommend antenna height or power increase
|
|
177
|
+
for (const sector of config.site.sectors) {
|
|
178
|
+
if (sector.enabled) {
|
|
179
|
+
recommendations.push({
|
|
180
|
+
sectorId: sector.sectorId,
|
|
181
|
+
parameter: 'height',
|
|
182
|
+
currentValue: sector.position.height,
|
|
183
|
+
suggestedValue: sector.position.height + 10,
|
|
184
|
+
reasoning: 'Overall coverage is low. Increasing antenna height will extend coverage.',
|
|
185
|
+
expectedImprovement: 'Wider coverage area',
|
|
186
|
+
priority: 'medium'
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return recommendations;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Compare two coverage scenarios
|
|
197
|
+
*
|
|
198
|
+
* Useful for before/after analysis when user changes parameters.
|
|
199
|
+
*
|
|
200
|
+
* @param before - Coverage before changes
|
|
201
|
+
* @param after - Coverage after changes
|
|
202
|
+
* @returns Comparison analysis
|
|
203
|
+
*/
|
|
204
|
+
export function compareCoverageScenarios(before, after) {
|
|
205
|
+
const beforeAnalysis = analyzeCoverageQuality(before);
|
|
206
|
+
const afterAnalysis = analyzeCoverageQuality(after);
|
|
207
|
+
const coverageChange = afterAnalysis.coveragePercent - beforeAnalysis.coveragePercent;
|
|
208
|
+
const signalChange = afterAnalysis.avgSignal - beforeAnalysis.avgSignal;
|
|
209
|
+
const rangeChange = afterAnalysis.maxRange - beforeAnalysis.maxRange;
|
|
210
|
+
const improvements = [];
|
|
211
|
+
const degradations = [];
|
|
212
|
+
if (coverageChange > 5)
|
|
213
|
+
improvements.push(`Coverage increased by ${coverageChange.toFixed(1)}%`);
|
|
214
|
+
if (coverageChange < -5)
|
|
215
|
+
degradations.push(`Coverage decreased by ${Math.abs(coverageChange).toFixed(1)}%`);
|
|
216
|
+
if (signalChange > 3)
|
|
217
|
+
improvements.push(`Average signal improved by ${signalChange.toFixed(1)} dB`);
|
|
218
|
+
if (signalChange < -3)
|
|
219
|
+
degradations.push(`Average signal degraded by ${Math.abs(signalChange).toFixed(1)} dB`);
|
|
220
|
+
// Range change is contextual
|
|
221
|
+
if (Math.abs(rangeChange) > 1) {
|
|
222
|
+
if (beforeAnalysis.maxRange > 15 && rangeChange < 0) {
|
|
223
|
+
improvements.push(`Range reduced from ${beforeAnalysis.maxRange.toFixed(1)}km to ${afterAnalysis.maxRange.toFixed(1)}km (reduces interference)`);
|
|
224
|
+
}
|
|
225
|
+
else if (beforeAnalysis.maxRange < 5 && rangeChange > 0) {
|
|
226
|
+
improvements.push(`Range increased from ${beforeAnalysis.maxRange.toFixed(1)}km to ${afterAnalysis.maxRange.toFixed(1)}km (extends coverage)`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Generate summary
|
|
230
|
+
let summary;
|
|
231
|
+
if (improvements.length > degradations.length) {
|
|
232
|
+
summary = 'Overall improvement';
|
|
233
|
+
}
|
|
234
|
+
else if (degradations.length > improvements.length) {
|
|
235
|
+
summary = 'Overall degradation';
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
summary = 'Mixed results - some improvements, some trade-offs';
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
coverageChange,
|
|
242
|
+
signalChange,
|
|
243
|
+
rangeChange,
|
|
244
|
+
improvements,
|
|
245
|
+
degradations,
|
|
246
|
+
summary
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Extract key metrics for AI analysis
|
|
251
|
+
*
|
|
252
|
+
* Flattens coverage result into simple key-value pairs
|
|
253
|
+
* that are easy for AI to interpret.
|
|
254
|
+
*
|
|
255
|
+
* @param result - Coverage result
|
|
256
|
+
* @returns Flat metrics object
|
|
257
|
+
*/
|
|
258
|
+
export function extractAIMetrics(result) {
|
|
259
|
+
const stats = result.grid.stats;
|
|
260
|
+
const config = result.config;
|
|
261
|
+
return {
|
|
262
|
+
// Coverage metrics
|
|
263
|
+
coverage_percent: stats.coveragePercentage,
|
|
264
|
+
coverage_area_km2: stats.coveredAreaKm2,
|
|
265
|
+
total_area_km2: stats.totalAreaKm2,
|
|
266
|
+
// Quality distribution
|
|
267
|
+
excellent_percent: (stats.excellentAreaKm2 / stats.totalAreaKm2) * 100,
|
|
268
|
+
good_percent: (stats.goodAreaKm2 / stats.totalAreaKm2) * 100,
|
|
269
|
+
fair_percent: (stats.fairAreaKm2 / stats.totalAreaKm2) * 100,
|
|
270
|
+
poor_percent: (stats.poorAreaKm2 / stats.totalAreaKm2) * 100,
|
|
271
|
+
// Configuration
|
|
272
|
+
cell_size_m: config.gridSettings.cellSizeMeters,
|
|
273
|
+
max_radius_km: config.gridSettings.maxRadiusKm,
|
|
274
|
+
path_loss_model: config.gridSettings.pathLossModel,
|
|
275
|
+
// Performance
|
|
276
|
+
calculation_time_s: result.calculationTimeMs / 1000,
|
|
277
|
+
grid_cells: result.grid.rows * result.grid.cols,
|
|
278
|
+
// Site info
|
|
279
|
+
site_name: config.site.siteName,
|
|
280
|
+
sector_count: config.site.sectors.filter((s) => s.enabled).length
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
// ============================================================================
|
|
284
|
+
// AI TOOL REGISTRY
|
|
285
|
+
// ============================================================================
|
|
286
|
+
/**
|
|
287
|
+
* Registry of all AI-callable tools
|
|
288
|
+
*
|
|
289
|
+
* In Phase 2, this will be used to expose functions to ChatGPT.
|
|
290
|
+
* Each entry describes the function, its parameters, and its purpose.
|
|
291
|
+
*/
|
|
292
|
+
export const AI_TOOLS = [
|
|
293
|
+
{
|
|
294
|
+
name: 'analyze_coverage_quality',
|
|
295
|
+
description: 'Analyze coverage calculation results and return structured quality assessment with issues and metrics',
|
|
296
|
+
parameters: {
|
|
297
|
+
type: 'object',
|
|
298
|
+
properties: {
|
|
299
|
+
coverageResult: {
|
|
300
|
+
type: 'object',
|
|
301
|
+
description: 'Complete coverage calculation result object'
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
required: ['coverageResult']
|
|
305
|
+
},
|
|
306
|
+
execute: async (params) => analyzeCoverageQuality(params.coverageResult)
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
name: 'generate_optimization_suggestions',
|
|
310
|
+
description: 'Generate specific parameter adjustment recommendations to improve coverage',
|
|
311
|
+
parameters: {
|
|
312
|
+
type: 'object',
|
|
313
|
+
properties: {
|
|
314
|
+
coverageResult: {
|
|
315
|
+
type: 'object',
|
|
316
|
+
description: 'Coverage result to analyze'
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
required: ['coverageResult']
|
|
320
|
+
},
|
|
321
|
+
execute: async (params) => generateOptimizationSuggestions(params.coverageResult)
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
name: 'compare_coverage_scenarios',
|
|
325
|
+
description: 'Compare two coverage scenarios (before/after) and identify improvements or degradations',
|
|
326
|
+
parameters: {
|
|
327
|
+
type: 'object',
|
|
328
|
+
properties: {
|
|
329
|
+
before: {
|
|
330
|
+
type: 'object',
|
|
331
|
+
description: 'Coverage result before changes'
|
|
332
|
+
},
|
|
333
|
+
after: {
|
|
334
|
+
type: 'object',
|
|
335
|
+
description: 'Coverage result after changes'
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
required: ['before', 'after']
|
|
339
|
+
},
|
|
340
|
+
execute: async (params) => compareCoverageScenarios(params.before, params.after)
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
name: 'extract_ai_metrics',
|
|
344
|
+
description: 'Extract flat key-value metrics from coverage result for easy AI interpretation',
|
|
345
|
+
parameters: {
|
|
346
|
+
type: 'object',
|
|
347
|
+
properties: {
|
|
348
|
+
coverageResult: {
|
|
349
|
+
type: 'object',
|
|
350
|
+
description: 'Coverage result to extract metrics from'
|
|
351
|
+
}
|
|
352
|
+
},
|
|
353
|
+
required: ['coverageResult']
|
|
354
|
+
},
|
|
355
|
+
execute: async (params) => extractAIMetrics(params.coverageResult)
|
|
356
|
+
}
|
|
357
|
+
];
|
|
358
|
+
/**
|
|
359
|
+
* Get AI tool by name
|
|
360
|
+
*
|
|
361
|
+
* @param name - Tool name
|
|
362
|
+
* @returns Tool function or undefined
|
|
363
|
+
*/
|
|
364
|
+
export function getAITool(name) {
|
|
365
|
+
return AI_TOOLS.find((tool) => tool.name === name);
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Execute AI tool by name
|
|
369
|
+
*
|
|
370
|
+
* @param name - Tool name
|
|
371
|
+
* @param params - Tool parameters
|
|
372
|
+
* @returns Tool result
|
|
373
|
+
*/
|
|
374
|
+
export async function executeAITool(name, params) {
|
|
375
|
+
const tool = getAITool(name);
|
|
376
|
+
if (!tool) {
|
|
377
|
+
throw new Error(`AI tool not found: ${name}`);
|
|
378
|
+
}
|
|
379
|
+
return tool.execute(params);
|
|
380
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage Calculator - Main Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* This is the main entry point for coverage calculations.
|
|
5
|
+
* It orchestrates all components and provides a clean API for:
|
|
6
|
+
* - Single sector coverage calculation
|
|
7
|
+
* - Multi-sector site coverage
|
|
8
|
+
* - Progress reporting
|
|
9
|
+
* - AI-ready result formatting
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* const calculator = new CoverageCalculator();
|
|
13
|
+
* const result = await calculator.calculate(config, progressCallback);
|
|
14
|
+
* // Result includes grid, statistics, and AI-ready summary
|
|
15
|
+
*/
|
|
16
|
+
import type { CoverageConfig, CoverageResult, ProgressCallback, SiteConfiguration } from '../types';
|
|
17
|
+
/**
|
|
18
|
+
* Main Coverage Calculator
|
|
19
|
+
*
|
|
20
|
+
* Provides high-level API for coverage calculations with:
|
|
21
|
+
* - Configuration validation
|
|
22
|
+
* - Progress reporting
|
|
23
|
+
* - Error handling
|
|
24
|
+
* - Result formatting
|
|
25
|
+
* - AI-ready summaries
|
|
26
|
+
*/
|
|
27
|
+
export declare class CoverageCalculator {
|
|
28
|
+
/**
|
|
29
|
+
* Calculate coverage for a site configuration
|
|
30
|
+
*
|
|
31
|
+
* This is the main calculation method. It:
|
|
32
|
+
* 1. Validates configuration
|
|
33
|
+
* 2. Determines if single or multi-sector
|
|
34
|
+
* 3. Performs calculation
|
|
35
|
+
* 4. Generates statistics and summary
|
|
36
|
+
* 5. Formats result for consumption (including AI)
|
|
37
|
+
*
|
|
38
|
+
* @param config - Complete coverage configuration
|
|
39
|
+
* @param onProgress - Optional progress callback
|
|
40
|
+
* @returns Promise resolving to complete coverage result
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* const calculator = new CoverageCalculator();
|
|
44
|
+
* const result = await calculator.calculate({
|
|
45
|
+
* site: siteConfig,
|
|
46
|
+
* gridSettings: { cellSizeMeters: 50, maxRadiusKm: 10, ... },
|
|
47
|
+
* signalThresholds: { excellent: -70, good: -85, ... },
|
|
48
|
+
* calculateInterference: true
|
|
49
|
+
* }, (progress) => {
|
|
50
|
+
* console.log(`Progress: ${progress.progress}% - ${progress.message}`);
|
|
51
|
+
* });
|
|
52
|
+
*
|
|
53
|
+
* // Access results
|
|
54
|
+
* console.log(`Coverage: ${result.grid.stats.coveragePercentage}%`);
|
|
55
|
+
* console.log(`Summary: ${result.summary.description}`);
|
|
56
|
+
* // Pass to AI for analysis
|
|
57
|
+
* const aiAnalysis = await analyzeWithAI(result);
|
|
58
|
+
*/
|
|
59
|
+
calculate(config: CoverageConfig, onProgress?: ProgressCallback): Promise<CoverageResult>;
|
|
60
|
+
/**
|
|
61
|
+
* Validate configuration before calculation
|
|
62
|
+
*
|
|
63
|
+
* Checks for common configuration errors:
|
|
64
|
+
* - Invalid distances (negative, zero, too large)
|
|
65
|
+
* - Invalid frequencies (outside valid ranges)
|
|
66
|
+
* - Invalid antenna heights
|
|
67
|
+
* - Missing required data
|
|
68
|
+
*
|
|
69
|
+
* Throws descriptive errors if validation fails.
|
|
70
|
+
*
|
|
71
|
+
* @param config - Configuration to validate
|
|
72
|
+
* @throws Error if configuration is invalid
|
|
73
|
+
*/
|
|
74
|
+
private validateConfiguration;
|
|
75
|
+
/**
|
|
76
|
+
* Generate human-readable and AI-ready summary
|
|
77
|
+
*
|
|
78
|
+
* Creates a comprehensive summary of coverage results including:
|
|
79
|
+
* - Description: Human-readable text summary
|
|
80
|
+
* - Issues: List of detected problems/warnings
|
|
81
|
+
* - Metrics: Key numerical metrics for AI analysis
|
|
82
|
+
*
|
|
83
|
+
* This summary is designed to be consumed by:
|
|
84
|
+
* 1. Human users (description text)
|
|
85
|
+
* 2. UI components (structured data)
|
|
86
|
+
* 3. AI analysis tools (metrics + issues)
|
|
87
|
+
*
|
|
88
|
+
* @param config - Original configuration
|
|
89
|
+
* @param grid - Calculation results
|
|
90
|
+
* @param sectorCount - Number of sectors calculated
|
|
91
|
+
* @returns Summary object
|
|
92
|
+
*/
|
|
93
|
+
private generateSummary;
|
|
94
|
+
/**
|
|
95
|
+
* Create human-readable description
|
|
96
|
+
*/
|
|
97
|
+
private createDescription;
|
|
98
|
+
/**
|
|
99
|
+
* Detect common issues and warnings
|
|
100
|
+
*/
|
|
101
|
+
private detectIssues;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Quick coverage calculation (simplified API)
|
|
105
|
+
*
|
|
106
|
+
* For simple use cases where you don't need full configuration control.
|
|
107
|
+
* Uses sensible defaults for most parameters.
|
|
108
|
+
*
|
|
109
|
+
* @param site - Site configuration
|
|
110
|
+
* @param options - Optional overrides
|
|
111
|
+
* @returns Coverage result
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* const result = await quickCalculate(mySite, {
|
|
115
|
+
* cellSizeMeters: 100, // Faster calculation
|
|
116
|
+
* maxRadiusKm: 5 // Smaller area
|
|
117
|
+
* });
|
|
118
|
+
*/
|
|
119
|
+
export declare function quickCalculate(site: SiteConfiguration, options?: {
|
|
120
|
+
cellSizeMeters?: number;
|
|
121
|
+
maxRadiusKm?: number;
|
|
122
|
+
pathLossModel?: 'free-space' | 'hata-urban' | 'hata-suburban' | 'cost231';
|
|
123
|
+
}): Promise<CoverageResult>;
|
|
124
|
+
/**
|
|
125
|
+
* Calculate coverage and export for AI analysis
|
|
126
|
+
*
|
|
127
|
+
* Convenience function that calculates coverage and formats
|
|
128
|
+
* the result specifically for AI consumption.
|
|
129
|
+
*
|
|
130
|
+
* @param config - Coverage configuration
|
|
131
|
+
* @returns AI-ready analysis object
|
|
132
|
+
*/
|
|
133
|
+
export declare function calculateForAI(config: CoverageConfig): Promise<{
|
|
134
|
+
summary: string;
|
|
135
|
+
metrics: Record<string, number>;
|
|
136
|
+
issues: string[];
|
|
137
|
+
sectorData: any[];
|
|
138
|
+
}>;
|