@trillboards/edge-sdk 0.2.2 → 0.2.3
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 +147 -2
- package/deploy/docker/Dockerfile.cpu +132 -0
- package/deploy/docker/Dockerfile.cuda +134 -0
- package/deploy/docker/Dockerfile.openvino +131 -0
- package/deploy/docker/README.md +358 -0
- package/deploy/helm/README.md +508 -0
- package/deploy/helm/trillboards-edge/Chart.yaml +19 -0
- package/deploy/helm/trillboards-edge/templates/_helpers.tpl +40 -0
- package/deploy/helm/trillboards-edge/templates/daemonset.yaml +120 -0
- package/deploy/helm/trillboards-edge/templates/service.yaml +15 -0
- package/deploy/helm/trillboards-edge/values.yaml +95 -0
- package/deploy/k8s/daemonset.yaml +144 -0
- package/dist/CommandRouter.d.ts +113 -0
- package/dist/CommandRouter.d.ts.map +1 -0
- package/dist/CommandRouter.js +392 -0
- package/dist/CommandRouter.js.map +1 -0
- package/dist/EdgeAgent.d.ts +6 -1
- package/dist/EdgeAgent.d.ts.map +1 -1
- package/dist/EdgeAgent.js +277 -10
- package/dist/EdgeAgent.js.map +1 -1
- package/dist/cli.js +60 -8
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/demo.d.ts +111 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +483 -0
- package/dist/demo.js.map +1 -0
- package/dist/diagnose.d.ts +59 -0
- package/dist/diagnose.d.ts.map +1 -0
- package/dist/diagnose.js +651 -0
- package/dist/diagnose.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +19 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +364 -0
- package/dist/init.js.map +1 -0
- package/dist/mcp-server.d.ts +27 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +1264 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/status.d.ts +11 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +343 -0
- package/dist/status.js.map +1 -0
- package/package.json +4 -3
package/dist/diagnose.js
ADDED
|
@@ -0,0 +1,651 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports._SDK_VERSION = void 0;
|
|
37
|
+
exports.runDiagnose = runDiagnose;
|
|
38
|
+
exports._checkNodeVersion = checkNodeVersion;
|
|
39
|
+
exports._checkPlatform = checkPlatform;
|
|
40
|
+
exports._checkMemory = checkMemory;
|
|
41
|
+
exports._checkCPU = checkCPU;
|
|
42
|
+
exports._checkDiskSpace = checkDiskSpace;
|
|
43
|
+
exports._checkCamera = checkCamera;
|
|
44
|
+
exports._checkONNXModels = checkONNXModels;
|
|
45
|
+
exports._checkAPIReachability = checkAPIReachability;
|
|
46
|
+
exports._checkGPU = checkGPU;
|
|
47
|
+
exports._checkSocketConnectivity = checkSocketConnectivity;
|
|
48
|
+
exports._collectDiagnostics = collectDiagnostics;
|
|
49
|
+
exports._reorderChecks = reorderChecks;
|
|
50
|
+
exports._formatHumanReport = formatHumanReport;
|
|
51
|
+
exports._getDiskFreeBytes = getDiskFreeBytes;
|
|
52
|
+
const os = __importStar(require("os"));
|
|
53
|
+
const fs = __importStar(require("fs"));
|
|
54
|
+
const path = __importStar(require("path"));
|
|
55
|
+
const net = __importStar(require("net"));
|
|
56
|
+
const https = __importStar(require("https"));
|
|
57
|
+
const child_process_1 = require("child_process");
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// SDK version — mirrors package.json; kept in sync by CI
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
const SDK_VERSION = '0.2.3';
|
|
62
|
+
exports._SDK_VERSION = SDK_VERSION;
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// ANSI helpers (no external deps)
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
const GREEN = '\x1b[32m';
|
|
67
|
+
const RED = '\x1b[31m';
|
|
68
|
+
const YELLOW = '\x1b[33m';
|
|
69
|
+
const BOLD = '\x1b[1m';
|
|
70
|
+
const DIM = '\x1b[2m';
|
|
71
|
+
const RESET = '\x1b[0m';
|
|
72
|
+
function statusIcon(status) {
|
|
73
|
+
switch (status) {
|
|
74
|
+
case 'pass':
|
|
75
|
+
return `${GREEN}\u2713${RESET}`;
|
|
76
|
+
case 'fail':
|
|
77
|
+
return `${RED}\u2717${RESET}`;
|
|
78
|
+
case 'warn':
|
|
79
|
+
return `${YELLOW}\u26A0${RESET}`;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function padRight(str, len) {
|
|
83
|
+
return str + ' '.repeat(Math.max(0, len - str.length));
|
|
84
|
+
}
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// Individual check implementations
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
function checkNodeVersion() {
|
|
89
|
+
const version = process.version; // e.g. "v20.11.0"
|
|
90
|
+
const match = version.match(/^v(\d+)\.(\d+)\.(\d+)/);
|
|
91
|
+
if (!match) {
|
|
92
|
+
return {
|
|
93
|
+
name: 'Node.js',
|
|
94
|
+
status: 'fail',
|
|
95
|
+
detail: `Unable to parse Node.js version: ${version}`,
|
|
96
|
+
suggestion: 'Install Node.js >= 18.0.0 from https://nodejs.org',
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const major = parseInt(match[1], 10);
|
|
100
|
+
if (major >= 18) {
|
|
101
|
+
return {
|
|
102
|
+
name: 'Node.js',
|
|
103
|
+
status: 'pass',
|
|
104
|
+
detail: `${version} (>= 18.0.0 required)`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
name: 'Node.js',
|
|
109
|
+
status: 'fail',
|
|
110
|
+
detail: `${version} — minimum 18.0.0 required`,
|
|
111
|
+
suggestion: 'Upgrade Node.js: https://nodejs.org/en/download',
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function checkPlatform() {
|
|
115
|
+
const plat = process.platform; // 'linux' | 'win32' | 'darwin' etc.
|
|
116
|
+
const arch = process.arch; // 'x64' | 'arm64' etc.
|
|
117
|
+
return {
|
|
118
|
+
name: 'Platform',
|
|
119
|
+
status: 'pass',
|
|
120
|
+
detail: `${plat} ${arch}`,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function checkMemory() {
|
|
124
|
+
const totalBytes = os.totalmem();
|
|
125
|
+
const freeBytes = os.freemem();
|
|
126
|
+
const usedPercent = ((1 - freeBytes / totalBytes) * 100).toFixed(0);
|
|
127
|
+
const totalGB = (totalBytes / (1024 ** 3)).toFixed(1);
|
|
128
|
+
const freeGB = (freeBytes / (1024 ** 3)).toFixed(1);
|
|
129
|
+
const freeMB = freeBytes / (1024 ** 2);
|
|
130
|
+
const detail = `${totalGB} GB total, ${freeGB} GB free (${usedPercent}% used)`;
|
|
131
|
+
if (freeMB < 512) {
|
|
132
|
+
return {
|
|
133
|
+
name: 'Memory',
|
|
134
|
+
status: 'fail',
|
|
135
|
+
detail,
|
|
136
|
+
suggestion: 'Less than 512 MB free — close other applications or add more RAM',
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
if (freeMB < 1024) {
|
|
140
|
+
return {
|
|
141
|
+
name: 'Memory',
|
|
142
|
+
status: 'warn',
|
|
143
|
+
detail,
|
|
144
|
+
suggestion: 'Less than 1 GB free — performance may be degraded',
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return { name: 'Memory', status: 'pass', detail };
|
|
148
|
+
}
|
|
149
|
+
function checkCPU() {
|
|
150
|
+
const cpus = os.cpus();
|
|
151
|
+
if (!cpus || cpus.length === 0) {
|
|
152
|
+
return {
|
|
153
|
+
name: 'CPU',
|
|
154
|
+
status: 'warn',
|
|
155
|
+
detail: 'Unable to read CPU information',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const model = cpus[0].model.trim();
|
|
159
|
+
const cores = cpus.length;
|
|
160
|
+
const arch = process.arch;
|
|
161
|
+
return {
|
|
162
|
+
name: 'CPU',
|
|
163
|
+
status: 'pass',
|
|
164
|
+
detail: `${model}, ${cores} cores (${arch})`,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function checkDiskSpace() {
|
|
168
|
+
const tmpDir = os.tmpdir();
|
|
169
|
+
const modelsDir = path.resolve('./models');
|
|
170
|
+
try {
|
|
171
|
+
const freeBytes = getDiskFreeBytes(tmpDir);
|
|
172
|
+
if (freeBytes === null) {
|
|
173
|
+
return {
|
|
174
|
+
name: 'Disk Space',
|
|
175
|
+
status: 'warn',
|
|
176
|
+
detail: 'Unable to determine free disk space',
|
|
177
|
+
suggestion: 'Ensure at least 1 GB free for model storage and temp files',
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
const freeGB = (freeBytes / (1024 ** 3)).toFixed(1);
|
|
181
|
+
const freeMB = freeBytes / (1024 ** 2);
|
|
182
|
+
const dirs = [tmpDir];
|
|
183
|
+
if (fs.existsSync(modelsDir)) {
|
|
184
|
+
dirs.push(modelsDir);
|
|
185
|
+
}
|
|
186
|
+
const detail = `${freeGB} GB free (checked: ${dirs.join(', ')})`;
|
|
187
|
+
if (freeMB < 1024) {
|
|
188
|
+
return {
|
|
189
|
+
name: 'Disk Space',
|
|
190
|
+
status: 'warn',
|
|
191
|
+
detail,
|
|
192
|
+
suggestion: 'Less than 1 GB free — may not have room for ONNX models',
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
return { name: 'Disk Space', status: 'pass', detail };
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
return {
|
|
199
|
+
name: 'Disk Space',
|
|
200
|
+
status: 'warn',
|
|
201
|
+
detail: `Error checking disk: ${err instanceof Error ? err.message : String(err)}`,
|
|
202
|
+
suggestion: 'Ensure at least 1 GB free for model storage and temp files',
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Cross-platform free-disk-space helper.
|
|
208
|
+
* Returns free bytes or null if unable to determine.
|
|
209
|
+
*/
|
|
210
|
+
function getDiskFreeBytes(dir) {
|
|
211
|
+
if (process.platform === 'win32') {
|
|
212
|
+
return getDiskFreeBytesWindows(dir);
|
|
213
|
+
}
|
|
214
|
+
return getDiskFreeBytesUnix(dir);
|
|
215
|
+
}
|
|
216
|
+
function getDiskFreeBytesUnix(dir) {
|
|
217
|
+
try {
|
|
218
|
+
// `df -Pk` outputs 1024-byte blocks in a POSIX-portable format
|
|
219
|
+
const output = (0, child_process_1.execSync)(`df -Pk "${dir}"`, { encoding: 'utf-8', timeout: 5000 });
|
|
220
|
+
const lines = output.trim().split('\n');
|
|
221
|
+
if (lines.length < 2)
|
|
222
|
+
return null;
|
|
223
|
+
// Columns: Filesystem 1024-blocks Used Available Capacity Mounted_on
|
|
224
|
+
const parts = lines[1].split(/\s+/);
|
|
225
|
+
if (parts.length < 4)
|
|
226
|
+
return null;
|
|
227
|
+
const availableKB = parseInt(parts[3], 10);
|
|
228
|
+
if (isNaN(availableKB))
|
|
229
|
+
return null;
|
|
230
|
+
return availableKB * 1024;
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function getDiskFreeBytesWindows(dir) {
|
|
237
|
+
try {
|
|
238
|
+
// wmic is deprecated on newer Windows but broadly available on 10+
|
|
239
|
+
const driveLetter = path.resolve(dir).charAt(0).toUpperCase();
|
|
240
|
+
const output = (0, child_process_1.execSync)(`wmic logicaldisk where "DeviceID='${driveLetter}:'" get FreeSpace /format:value`, { encoding: 'utf-8', timeout: 5000 });
|
|
241
|
+
const match = output.match(/FreeSpace=(\d+)/);
|
|
242
|
+
if (!match)
|
|
243
|
+
return null;
|
|
244
|
+
return parseInt(match[1], 10);
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
// Fallback: try PowerShell
|
|
248
|
+
try {
|
|
249
|
+
const driveLetter = path.resolve(dir).charAt(0).toUpperCase();
|
|
250
|
+
const output = (0, child_process_1.execSync)(`powershell -NoProfile -Command "(Get-PSDrive ${driveLetter}).Free"`, { encoding: 'utf-8', timeout: 5000 });
|
|
251
|
+
const bytes = parseInt(output.trim(), 10);
|
|
252
|
+
if (isNaN(bytes))
|
|
253
|
+
return null;
|
|
254
|
+
return bytes;
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
function checkCamera() {
|
|
262
|
+
if (process.platform !== 'linux') {
|
|
263
|
+
return {
|
|
264
|
+
name: 'Camera',
|
|
265
|
+
status: 'pass',
|
|
266
|
+
detail: `Camera detection skipped on ${process.platform} (Linux-only check)`,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
try {
|
|
270
|
+
const devFiles = fs.readdirSync('/dev').filter((f) => f.startsWith('video'));
|
|
271
|
+
if (devFiles.length === 0) {
|
|
272
|
+
return {
|
|
273
|
+
name: 'Camera',
|
|
274
|
+
status: 'warn',
|
|
275
|
+
detail: 'No /dev/video* devices found',
|
|
276
|
+
suggestion: 'Connect a USB camera or check that v4l2 drivers are loaded',
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
const devices = devFiles.map((f) => `/dev/${f}`).join(', ');
|
|
280
|
+
return {
|
|
281
|
+
name: 'Camera',
|
|
282
|
+
status: 'pass',
|
|
283
|
+
detail: `${devices} found`,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
return {
|
|
288
|
+
name: 'Camera',
|
|
289
|
+
status: 'warn',
|
|
290
|
+
detail: `Unable to scan /dev: ${err instanceof Error ? err.message : String(err)}`,
|
|
291
|
+
suggestion: 'Check filesystem permissions on /dev',
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
function checkONNXModels() {
|
|
296
|
+
const modelsDir = path.resolve('./models');
|
|
297
|
+
const blazefacePath = path.join(modelsDir, 'blazeface.onnx');
|
|
298
|
+
const yamnetPath = path.join(modelsDir, 'yamnet.onnx');
|
|
299
|
+
const missing = [];
|
|
300
|
+
const found = [];
|
|
301
|
+
for (const [name, filePath] of [
|
|
302
|
+
['blazeface.onnx', blazefacePath],
|
|
303
|
+
['yamnet.onnx', yamnetPath],
|
|
304
|
+
]) {
|
|
305
|
+
if (!fs.existsSync(filePath)) {
|
|
306
|
+
missing.push(name);
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
try {
|
|
310
|
+
const stats = fs.statSync(filePath);
|
|
311
|
+
if (stats.size === 0) {
|
|
312
|
+
missing.push(`${name} (empty file)`);
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
const sizeMB = (stats.size / (1024 ** 2)).toFixed(1);
|
|
316
|
+
found.push(`${name} (${sizeMB} MB)`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
missing.push(`${name} (unreadable)`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (missing.length > 0) {
|
|
324
|
+
return {
|
|
325
|
+
name: 'ONNX Models',
|
|
326
|
+
status: 'fail',
|
|
327
|
+
detail: `${missing.join(', ')} missing${found.length > 0 ? `; ${found.join(', ')} OK` : ''}`,
|
|
328
|
+
suggestion: 'Run: trillboards-edge download-models',
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
return {
|
|
332
|
+
name: 'ONNX Models',
|
|
333
|
+
status: 'pass',
|
|
334
|
+
detail: found.join(', '),
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
function checkAPIReachability() {
|
|
338
|
+
const url = 'https://api.trillboards.com/health/live';
|
|
339
|
+
const startMs = Date.now();
|
|
340
|
+
return new Promise((resolve) => {
|
|
341
|
+
const timeout = setTimeout(() => {
|
|
342
|
+
resolve({
|
|
343
|
+
name: 'API Reachable',
|
|
344
|
+
status: 'fail',
|
|
345
|
+
detail: `${url} — timed out after 5s`,
|
|
346
|
+
suggestion: 'Check your internet connection or firewall rules',
|
|
347
|
+
});
|
|
348
|
+
}, 5000);
|
|
349
|
+
const req = https.get(url, (res) => {
|
|
350
|
+
clearTimeout(timeout);
|
|
351
|
+
const elapsedMs = Date.now() - startMs;
|
|
352
|
+
// Consume the response body to avoid memory leaks
|
|
353
|
+
res.resume();
|
|
354
|
+
if (res.statusCode === 200) {
|
|
355
|
+
resolve({
|
|
356
|
+
name: 'API Reachable',
|
|
357
|
+
status: 'pass',
|
|
358
|
+
detail: `${url} (${res.statusCode} OK, ${elapsedMs}ms)`,
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
resolve({
|
|
363
|
+
name: 'API Reachable',
|
|
364
|
+
status: 'fail',
|
|
365
|
+
detail: `${url} — HTTP ${res.statusCode} (${elapsedMs}ms)`,
|
|
366
|
+
suggestion: 'API may be down — check https://status.trillboards.com',
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
req.on('error', (err) => {
|
|
371
|
+
clearTimeout(timeout);
|
|
372
|
+
const elapsedMs = Date.now() - startMs;
|
|
373
|
+
resolve({
|
|
374
|
+
name: 'API Reachable',
|
|
375
|
+
status: 'fail',
|
|
376
|
+
detail: `${url} — ${err.message} (${elapsedMs}ms)`,
|
|
377
|
+
suggestion: 'Check your internet connection or DNS resolution',
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
req.setTimeout(5000, () => {
|
|
381
|
+
req.destroy();
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
function checkGPU() {
|
|
386
|
+
const providers = [];
|
|
387
|
+
// CUDA — try nvidia-smi
|
|
388
|
+
try {
|
|
389
|
+
const output = (0, child_process_1.execSync)('nvidia-smi --query-gpu=name --format=csv,noheader', {
|
|
390
|
+
encoding: 'utf-8',
|
|
391
|
+
timeout: 5000,
|
|
392
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
393
|
+
});
|
|
394
|
+
const gpus = output
|
|
395
|
+
.trim()
|
|
396
|
+
.split('\n')
|
|
397
|
+
.map((l) => l.trim())
|
|
398
|
+
.filter(Boolean);
|
|
399
|
+
if (gpus.length > 0) {
|
|
400
|
+
providers.push(`CUDA (${gpus.join(', ')})`);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
// nvidia-smi not available — no CUDA
|
|
405
|
+
}
|
|
406
|
+
// OpenVINO — check for installation directory
|
|
407
|
+
const openvinoSearchPaths = [
|
|
408
|
+
'/opt/intel/openvino',
|
|
409
|
+
'/opt/intel/openvino_2024',
|
|
410
|
+
'/opt/intel/openvino_2023',
|
|
411
|
+
];
|
|
412
|
+
for (const ovDir of openvinoSearchPaths) {
|
|
413
|
+
if (fs.existsSync(ovDir)) {
|
|
414
|
+
providers.push(`OpenVINO (${ovDir})`);
|
|
415
|
+
break;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// DirectML — Windows only
|
|
419
|
+
if (process.platform === 'win32') {
|
|
420
|
+
try {
|
|
421
|
+
// Check for DirectX 12 support via dxdiag or registry
|
|
422
|
+
(0, child_process_1.execSync)('where dxdiag', {
|
|
423
|
+
encoding: 'utf-8',
|
|
424
|
+
timeout: 3000,
|
|
425
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
426
|
+
});
|
|
427
|
+
providers.push('DirectML (Windows)');
|
|
428
|
+
}
|
|
429
|
+
catch {
|
|
430
|
+
// dxdiag not found — no DirectML
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
if (providers.length === 0) {
|
|
434
|
+
return {
|
|
435
|
+
name: 'GPU',
|
|
436
|
+
status: 'warn',
|
|
437
|
+
detail: 'No GPU detected (CPU execution only)',
|
|
438
|
+
suggestion: 'For better performance, install CUDA, OpenVINO, or use a DirectML-capable GPU',
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
return {
|
|
442
|
+
name: 'GPU',
|
|
443
|
+
status: 'pass',
|
|
444
|
+
detail: providers.join('; '),
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
function checkSocketConnectivity() {
|
|
448
|
+
const host = 'api.trillboards.com';
|
|
449
|
+
const port = 443;
|
|
450
|
+
const startMs = Date.now();
|
|
451
|
+
return new Promise((resolve) => {
|
|
452
|
+
const timeout = setTimeout(() => {
|
|
453
|
+
socket.destroy();
|
|
454
|
+
resolve({
|
|
455
|
+
name: 'Network',
|
|
456
|
+
status: 'fail',
|
|
457
|
+
detail: `TCP connection to ${host}:${port} timed out after 5s`,
|
|
458
|
+
suggestion: 'Check firewall rules — port 443 must be open for outbound connections',
|
|
459
|
+
});
|
|
460
|
+
}, 5000);
|
|
461
|
+
const socket = net.createConnection({ host, port }, () => {
|
|
462
|
+
clearTimeout(timeout);
|
|
463
|
+
const elapsedMs = Date.now() - startMs;
|
|
464
|
+
socket.destroy();
|
|
465
|
+
resolve({
|
|
466
|
+
name: 'Network',
|
|
467
|
+
status: 'pass',
|
|
468
|
+
detail: `TCP connection to ${host}:${port} OK (${elapsedMs}ms)`,
|
|
469
|
+
});
|
|
470
|
+
});
|
|
471
|
+
socket.on('error', (err) => {
|
|
472
|
+
clearTimeout(timeout);
|
|
473
|
+
const elapsedMs = Date.now() - startMs;
|
|
474
|
+
socket.destroy();
|
|
475
|
+
resolve({
|
|
476
|
+
name: 'Network',
|
|
477
|
+
status: 'fail',
|
|
478
|
+
detail: `TCP connection to ${host}:${port} failed — ${err.message} (${elapsedMs}ms)`,
|
|
479
|
+
suggestion: 'Check your network connection and firewall rules',
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
// ---------------------------------------------------------------------------
|
|
485
|
+
// Orchestrator
|
|
486
|
+
// ---------------------------------------------------------------------------
|
|
487
|
+
/**
|
|
488
|
+
* Run all diagnostic checks and build the structured report.
|
|
489
|
+
*/
|
|
490
|
+
async function collectDiagnostics() {
|
|
491
|
+
const checks = [];
|
|
492
|
+
// Synchronous checks — each wrapped to prevent a throw from crashing the run
|
|
493
|
+
const syncChecks = [
|
|
494
|
+
checkNodeVersion,
|
|
495
|
+
checkPlatform,
|
|
496
|
+
checkMemory,
|
|
497
|
+
checkCPU,
|
|
498
|
+
checkDiskSpace,
|
|
499
|
+
checkCamera,
|
|
500
|
+
checkONNXModels,
|
|
501
|
+
];
|
|
502
|
+
for (const fn of syncChecks) {
|
|
503
|
+
try {
|
|
504
|
+
checks.push(fn());
|
|
505
|
+
}
|
|
506
|
+
catch (err) {
|
|
507
|
+
checks.push({
|
|
508
|
+
name: fn.name.replace(/^check/, ''),
|
|
509
|
+
status: 'fail',
|
|
510
|
+
detail: `Unexpected error: ${err instanceof Error ? err.message : String(err)}`,
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
// Async checks — run in parallel
|
|
515
|
+
const asyncResults = await Promise.allSettled([
|
|
516
|
+
checkAPIReachability(),
|
|
517
|
+
checkSocketConnectivity(),
|
|
518
|
+
]);
|
|
519
|
+
// GPU check is sync but can be slow — add it between the two async blocks
|
|
520
|
+
try {
|
|
521
|
+
checks.push(checkGPU());
|
|
522
|
+
}
|
|
523
|
+
catch (err) {
|
|
524
|
+
checks.push({
|
|
525
|
+
name: 'GPU',
|
|
526
|
+
status: 'fail',
|
|
527
|
+
detail: `Unexpected error: ${err instanceof Error ? err.message : String(err)}`,
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
for (const result of asyncResults) {
|
|
531
|
+
if (result.status === 'fulfilled') {
|
|
532
|
+
checks.push(result.value);
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
checks.push({
|
|
536
|
+
name: 'Unknown',
|
|
537
|
+
status: 'fail',
|
|
538
|
+
detail: `Unexpected error: ${result.reason instanceof Error ? result.reason.message : String(result.reason)}`,
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
// Reorder: put API and Network at the end, GPU before them
|
|
543
|
+
const ordered = reorderChecks(checks);
|
|
544
|
+
const summary = {
|
|
545
|
+
passed: ordered.filter((c) => c.status === 'pass').length,
|
|
546
|
+
failed: ordered.filter((c) => c.status === 'fail').length,
|
|
547
|
+
warnings: ordered.filter((c) => c.status === 'warn').length,
|
|
548
|
+
};
|
|
549
|
+
return {
|
|
550
|
+
timestamp: new Date().toISOString(),
|
|
551
|
+
sdkVersion: SDK_VERSION,
|
|
552
|
+
nodeVersion: process.version,
|
|
553
|
+
platform: process.platform,
|
|
554
|
+
arch: process.arch,
|
|
555
|
+
checks: ordered,
|
|
556
|
+
summary,
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Reorder checks into the canonical display order:
|
|
561
|
+
* Node.js, Platform, Memory, CPU, Disk Space, Camera, ONNX Models,
|
|
562
|
+
* API Reachable, GPU, Network
|
|
563
|
+
*/
|
|
564
|
+
function reorderChecks(checks) {
|
|
565
|
+
const order = [
|
|
566
|
+
'Node.js',
|
|
567
|
+
'Platform',
|
|
568
|
+
'Memory',
|
|
569
|
+
'CPU',
|
|
570
|
+
'Disk Space',
|
|
571
|
+
'Camera',
|
|
572
|
+
'ONNX Models',
|
|
573
|
+
'API Reachable',
|
|
574
|
+
'GPU',
|
|
575
|
+
'Network',
|
|
576
|
+
];
|
|
577
|
+
const indexed = new Map();
|
|
578
|
+
for (const check of checks) {
|
|
579
|
+
indexed.set(check.name, check);
|
|
580
|
+
}
|
|
581
|
+
const ordered = [];
|
|
582
|
+
for (const name of order) {
|
|
583
|
+
const check = indexed.get(name);
|
|
584
|
+
if (check) {
|
|
585
|
+
ordered.push(check);
|
|
586
|
+
indexed.delete(name);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
// Append any checks not in the canonical order (future-proofing)
|
|
590
|
+
for (const check of indexed.values()) {
|
|
591
|
+
ordered.push(check);
|
|
592
|
+
}
|
|
593
|
+
return ordered;
|
|
594
|
+
}
|
|
595
|
+
// ---------------------------------------------------------------------------
|
|
596
|
+
// Formatters
|
|
597
|
+
// ---------------------------------------------------------------------------
|
|
598
|
+
function formatHumanReport(report) {
|
|
599
|
+
const lines = [];
|
|
600
|
+
lines.push('');
|
|
601
|
+
lines.push(`${BOLD}Trillboards Edge SDK \u2014 System Diagnostics${RESET}`);
|
|
602
|
+
lines.push('');
|
|
603
|
+
const nameWidth = 18;
|
|
604
|
+
for (const check of report.checks) {
|
|
605
|
+
const icon = statusIcon(check.status);
|
|
606
|
+
const name = padRight(check.name, nameWidth);
|
|
607
|
+
lines.push(` ${icon} ${name}${check.detail}`);
|
|
608
|
+
if (check.suggestion) {
|
|
609
|
+
lines.push(`${' '.repeat(nameWidth + 6)}${DIM}${check.suggestion}${RESET}`);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
lines.push('');
|
|
613
|
+
// Summary line
|
|
614
|
+
const parts = [];
|
|
615
|
+
if (report.summary.passed > 0) {
|
|
616
|
+
parts.push(`${GREEN}${report.summary.passed} passed${RESET}`);
|
|
617
|
+
}
|
|
618
|
+
if (report.summary.failed > 0) {
|
|
619
|
+
parts.push(`${RED}${report.summary.failed} failed${RESET}`);
|
|
620
|
+
}
|
|
621
|
+
if (report.summary.warnings > 0) {
|
|
622
|
+
parts.push(`${YELLOW}${report.summary.warnings} warning${report.summary.warnings === 1 ? '' : 's'}${RESET}`);
|
|
623
|
+
}
|
|
624
|
+
lines.push(` Summary: ${parts.join(', ')}`);
|
|
625
|
+
lines.push('');
|
|
626
|
+
// JSON block for support tickets
|
|
627
|
+
lines.push(`${DIM} JSON report (copy-paste into support ticket):${RESET}`);
|
|
628
|
+
lines.push('');
|
|
629
|
+
lines.push(JSON.stringify(report, null, 2));
|
|
630
|
+
lines.push('');
|
|
631
|
+
return lines.join('\n');
|
|
632
|
+
}
|
|
633
|
+
// ---------------------------------------------------------------------------
|
|
634
|
+
// Public entry point
|
|
635
|
+
// ---------------------------------------------------------------------------
|
|
636
|
+
/**
|
|
637
|
+
* Run the `trillboards-edge diagnose` command.
|
|
638
|
+
*
|
|
639
|
+
* @param args - CLI arguments after `diagnose`. Supports `--json` for
|
|
640
|
+
* machine-readable output.
|
|
641
|
+
*/
|
|
642
|
+
async function runDiagnose(args) {
|
|
643
|
+
const jsonOnly = args.includes('--json');
|
|
644
|
+
const report = await collectDiagnostics();
|
|
645
|
+
if (jsonOnly) {
|
|
646
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
647
|
+
return;
|
|
648
|
+
}
|
|
649
|
+
process.stdout.write(formatHumanReport(report));
|
|
650
|
+
}
|
|
651
|
+
//# sourceMappingURL=diagnose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../src/diagnose.ts"],"names":[],"mappings":"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"}
|