@trillboards/edge-sdk 0.2.2 → 0.2.4

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 (50) hide show
  1. package/README.md +147 -2
  2. package/deploy/docker/Dockerfile.cpu +132 -0
  3. package/deploy/docker/Dockerfile.cuda +134 -0
  4. package/deploy/docker/Dockerfile.openvino +131 -0
  5. package/deploy/docker/README.md +358 -0
  6. package/deploy/helm/README.md +508 -0
  7. package/deploy/helm/trillboards-edge/Chart.yaml +19 -0
  8. package/deploy/helm/trillboards-edge/templates/_helpers.tpl +40 -0
  9. package/deploy/helm/trillboards-edge/templates/daemonset.yaml +120 -0
  10. package/deploy/helm/trillboards-edge/templates/service.yaml +15 -0
  11. package/deploy/helm/trillboards-edge/values.yaml +95 -0
  12. package/deploy/k8s/daemonset.yaml +144 -0
  13. package/dist/CommandRouter.d.ts +113 -0
  14. package/dist/CommandRouter.d.ts.map +1 -0
  15. package/dist/CommandRouter.js +392 -0
  16. package/dist/CommandRouter.js.map +1 -0
  17. package/dist/EdgeAgent.d.ts +6 -1
  18. package/dist/EdgeAgent.d.ts.map +1 -1
  19. package/dist/EdgeAgent.js +292 -10
  20. package/dist/EdgeAgent.js.map +1 -1
  21. package/dist/cli.js +60 -8
  22. package/dist/cli.js.map +1 -1
  23. package/dist/config.d.ts +1 -0
  24. package/dist/config.d.ts.map +1 -1
  25. package/dist/config.js.map +1 -1
  26. package/dist/demo.d.ts +111 -0
  27. package/dist/demo.d.ts.map +1 -0
  28. package/dist/demo.js +483 -0
  29. package/dist/demo.js.map +1 -0
  30. package/dist/diagnose.d.ts +59 -0
  31. package/dist/diagnose.d.ts.map +1 -0
  32. package/dist/diagnose.js +651 -0
  33. package/dist/diagnose.js.map +1 -0
  34. package/dist/index.d.ts +5 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +7 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/init.d.ts +19 -0
  39. package/dist/init.d.ts.map +1 -0
  40. package/dist/init.js +364 -0
  41. package/dist/init.js.map +1 -0
  42. package/dist/mcp-server.d.ts +27 -0
  43. package/dist/mcp-server.d.ts.map +1 -0
  44. package/dist/mcp-server.js +1264 -0
  45. package/dist/mcp-server.js.map +1 -0
  46. package/dist/status.d.ts +11 -0
  47. package/dist/status.d.ts.map +1 -0
  48. package/dist/status.js +343 -0
  49. package/dist/status.js.map +1 -0
  50. package/package.json +4 -3
@@ -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.4';
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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"}