@trillboards/edge-sdk 0.2.1 → 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.
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 +277 -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 +5 -4
package/dist/demo.d.ts ADDED
@@ -0,0 +1,111 @@
1
+ /**
2
+ * demo.ts — Trillboards Edge AI SDK Demo Mode
3
+ *
4
+ * Runs WITHOUT device token, camera, models, or backend connection.
5
+ * Generates synthetic AudienceMetricsPayload every 10s with realistic
6
+ * distributions and displays a live terminal dashboard using ANSI escape
7
+ * codes (zero external dependencies).
8
+ *
9
+ * Usage:
10
+ * import { runDemo } from './demo';
11
+ * await runDemo();
12
+ */
13
+ /** Evidence grades in cycling order. */
14
+ declare const EVIDENCE_GRADES: readonly ["FACE_BACKED", "PERSON_BACKED", "SPEECH_ONLY", "PROXY_ONLY", "EMPTY"];
15
+ type EvidenceGrade = typeof EVIDENCE_GRADES[number];
16
+ /** Observation families mapped from evidence grade. */
17
+ type ObservationFamily = 'SCREEN_AUDIENCE' | 'AMBIENT_COMMERCE_INTENT' | 'DIAGNOSTIC_PROBE' | 'EMPTY_SCENE';
18
+ type Decisionability = 'DECISIONABLE' | 'NON_DECISIONABLE';
19
+ /** Matches the backend contract exactly (AudienceMetricsPayload). */
20
+ interface DemoMetricsPayload {
21
+ fingerprint: string;
22
+ screenId: string | null;
23
+ windowStart: number;
24
+ windowEnd: number;
25
+ avgFaceCount: number;
26
+ maxFaceCount: number;
27
+ avgAttention: number;
28
+ avgDwellTimeMs: number;
29
+ avgNoiseLevel: number;
30
+ sensingMode: string;
31
+ speech: boolean;
32
+ emotionalEngagement: number;
33
+ sensingIntervalMs: number;
34
+ faceSnapshotCount: number;
35
+ audioSnapshotCount: number;
36
+ measurementQuality: string;
37
+ observationFamily: ObservationFamily;
38
+ evidenceGrade: EvidenceGrade;
39
+ decisionability: Decisionability;
40
+ decisionBlockReasons: string[];
41
+ vasRaw: number;
42
+ vasWeighted: number;
43
+ vasQualityMultiplier: number;
44
+ }
45
+ /** A single signal entry stored for the scrollback log. */
46
+ interface SignalEntry {
47
+ timestamp: Date;
48
+ avgFaceCount: number;
49
+ avgAttention: number;
50
+ vasWeighted: number;
51
+ evidenceGrade: EvidenceGrade;
52
+ }
53
+ declare const TICK_INTERVAL_MS = 10000;
54
+ declare const MAX_BUFFER_SIZE = 8640;
55
+ declare const DEMO_FINGERPRINT: string;
56
+ declare function clamp(value: number, min: number, max: number): number;
57
+ declare function formatDuration(ms: number): string;
58
+ declare function formatTime(date: Date): string;
59
+ interface DemoVASResult {
60
+ vasRaw: number;
61
+ vasWeighted: number;
62
+ qualityMultiplier: number;
63
+ }
64
+ /**
65
+ * Compute VAS (Viewability Attention Score) using the production formula.
66
+ * Inlined so demo mode has zero external dependencies.
67
+ *
68
+ * vasRaw = attentionSeconds * avgFaceCount (capped at 10s dwell)
69
+ * qualityMultiplier = weighted sum of attention + focus components
70
+ * vasWeighted = vasRaw * qualityMultiplier
71
+ */
72
+ declare function computeDemoVAS(avgAttention: number, avgDwellTimeMs: number, avgFaceCount: number): DemoVASResult;
73
+ interface EvidenceClassification {
74
+ evidenceGrade: EvidenceGrade;
75
+ observationFamily: ObservationFamily;
76
+ decisionability: Decisionability;
77
+ decisionBlockReasons: string[];
78
+ measurementQuality: string;
79
+ }
80
+ declare function classifyEvidence(avgFaceCount: number, speech: boolean, avgNoiseLevel: number): EvidenceClassification;
81
+ /**
82
+ * Generates a synthetic metrics payload that cycles through all evidence grades
83
+ * with realistic distributions. The cycle index ensures all grades are covered
84
+ * over time while randomizing individual measurements.
85
+ */
86
+ declare function generateSyntheticPayload(cycleIndex: number): DemoMetricsPayload;
87
+ declare function gradeColor(grade: EvidenceGrade): string;
88
+ declare function gradeShortName(grade: EvidenceGrade): string;
89
+ interface DashboardState {
90
+ currentPayload: DemoMetricsPayload | null;
91
+ signals: SignalEntry[];
92
+ bufferSize: number;
93
+ startTime: number;
94
+ tickCount: number;
95
+ gradeDistribution: Record<EvidenceGrade, number>;
96
+ }
97
+ declare function renderDashboard(state: DashboardState): string;
98
+ declare function renderExitSummary(state: DashboardState): string;
99
+ /**
100
+ * Run the Edge SDK demo mode. Generates synthetic audience metrics every 10s
101
+ * and renders a live terminal dashboard. No device token, camera, models, or
102
+ * backend connection required.
103
+ *
104
+ * Returns a Promise that resolves when the user presses Ctrl+C.
105
+ */
106
+ export declare function runDemo(): Promise<void>;
107
+ /** Advance the demo state by one tick. */
108
+ declare function tick(state: DashboardState): void;
109
+ export { clamp, computeDemoVAS, classifyEvidence, generateSyntheticPayload, renderDashboard, renderExitSummary, tick, formatDuration, formatTime, gradeShortName, gradeColor, EVIDENCE_GRADES, TICK_INTERVAL_MS, MAX_BUFFER_SIZE, DEMO_FINGERPRINT, };
110
+ export type { DemoMetricsPayload, DemoVASResult, SignalEntry, EvidenceGrade, DashboardState, };
111
+ //# sourceMappingURL=demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":"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"}
package/dist/demo.js ADDED
@@ -0,0 +1,483 @@
1
+ "use strict";
2
+ /**
3
+ * demo.ts — Trillboards Edge AI SDK Demo Mode
4
+ *
5
+ * Runs WITHOUT device token, camera, models, or backend connection.
6
+ * Generates synthetic AudienceMetricsPayload every 10s with realistic
7
+ * distributions and displays a live terminal dashboard using ANSI escape
8
+ * codes (zero external dependencies).
9
+ *
10
+ * Usage:
11
+ * import { runDemo } from './demo';
12
+ * await runDemo();
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.DEMO_FINGERPRINT = exports.MAX_BUFFER_SIZE = exports.TICK_INTERVAL_MS = exports.EVIDENCE_GRADES = void 0;
49
+ exports.runDemo = runDemo;
50
+ exports.clamp = clamp;
51
+ exports.computeDemoVAS = computeDemoVAS;
52
+ exports.classifyEvidence = classifyEvidence;
53
+ exports.generateSyntheticPayload = generateSyntheticPayload;
54
+ exports.renderDashboard = renderDashboard;
55
+ exports.renderExitSummary = renderExitSummary;
56
+ exports.tick = tick;
57
+ exports.formatDuration = formatDuration;
58
+ exports.formatTime = formatTime;
59
+ exports.gradeShortName = gradeShortName;
60
+ exports.gradeColor = gradeColor;
61
+ const crypto = __importStar(require("crypto"));
62
+ // ─── Types (self-contained — demo must work without @trillboards/edge-core) ──
63
+ /** Evidence grades in cycling order. */
64
+ const EVIDENCE_GRADES = [
65
+ 'FACE_BACKED',
66
+ 'PERSON_BACKED',
67
+ 'SPEECH_ONLY',
68
+ 'PROXY_ONLY',
69
+ 'EMPTY',
70
+ ];
71
+ exports.EVIDENCE_GRADES = EVIDENCE_GRADES;
72
+ // ─── Constants ─────────────────────────────────────────────────────────────────
73
+ const TICK_INTERVAL_MS = 10000;
74
+ exports.TICK_INTERVAL_MS = TICK_INTERVAL_MS;
75
+ const MAX_BUFFER_SIZE = 8640; // 24h at 10s intervals
76
+ exports.MAX_BUFFER_SIZE = MAX_BUFFER_SIZE;
77
+ const MAX_RECENT_SIGNALS = 8;
78
+ const DEMO_FINGERPRINT = `demo-${crypto.randomBytes(4).toString('hex')}`;
79
+ exports.DEMO_FINGERPRINT = DEMO_FINGERPRINT;
80
+ const BAR_WIDTH = 16;
81
+ const VERSION = '0.2.3';
82
+ // ─── ANSI Escape Helpers ───────────────────────────────────────────────────────
83
+ const ESC = '\x1b';
84
+ const RESET = `${ESC}[0m`;
85
+ const BOLD = `${ESC}[1m`;
86
+ const DIM = `${ESC}[2m`;
87
+ const CYAN = `${ESC}[36m`;
88
+ const GREEN = `${ESC}[32m`;
89
+ const YELLOW = `${ESC}[33m`;
90
+ const RED = `${ESC}[31m`;
91
+ const MAGENTA = `${ESC}[35m`;
92
+ const WHITE = `${ESC}[37m`;
93
+ const GRAY = `${ESC}[90m`;
94
+ const BG_BLUE = `${ESC}[44m`;
95
+ const CLEAR_SCREEN = `${ESC}[H${ESC}[2J`;
96
+ const HIDE_CURSOR = `${ESC}[?25l`;
97
+ const SHOW_CURSOR = `${ESC}[?25h`;
98
+ // ─── Utility Functions ─────────────────────────────────────────────────────────
99
+ function clamp(value, min, max) {
100
+ return Math.max(min, Math.min(max, value));
101
+ }
102
+ function randFloat(min, max) {
103
+ return min + Math.random() * (max - min);
104
+ }
105
+ function randInt(min, max) {
106
+ return Math.floor(randFloat(min, max + 1));
107
+ }
108
+ function pad(str, width) {
109
+ return str.length >= width ? str.slice(0, width) : str + ' '.repeat(width - str.length);
110
+ }
111
+ function padStart(str, width) {
112
+ return str.length >= width ? str.slice(0, width) : ' '.repeat(width - str.length) + str;
113
+ }
114
+ function formatDuration(ms) {
115
+ const totalSeconds = Math.floor(ms / 1000);
116
+ const hours = Math.floor(totalSeconds / 3600);
117
+ const minutes = Math.floor((totalSeconds % 3600) / 60);
118
+ const seconds = totalSeconds % 60;
119
+ if (hours > 0) {
120
+ return `${hours}h ${minutes}m ${seconds}s`;
121
+ }
122
+ return `${minutes}m ${seconds}s`;
123
+ }
124
+ function formatTime(date) {
125
+ return date.toTimeString().slice(0, 8);
126
+ }
127
+ /**
128
+ * Compute VAS (Viewability Attention Score) using the production formula.
129
+ * Inlined so demo mode has zero external dependencies.
130
+ *
131
+ * vasRaw = attentionSeconds * avgFaceCount (capped at 10s dwell)
132
+ * qualityMultiplier = weighted sum of attention + focus components
133
+ * vasWeighted = vasRaw * qualityMultiplier
134
+ */
135
+ function computeDemoVAS(avgAttention, avgDwellTimeMs, avgFaceCount) {
136
+ if (avgAttention < 0.5 || avgFaceCount === 0) {
137
+ return { vasRaw: 0, vasWeighted: 0, qualityMultiplier: 0 };
138
+ }
139
+ const attentionSeconds = Math.min(avgDwellTimeMs, 10000) / 1000;
140
+ const vasRaw = attentionSeconds * avgFaceCount;
141
+ const weights = { attention: 0.4, emotion: 0.3, body: 0.2, focus: 0.1 };
142
+ const qualityMultiplier = weights.attention * Math.min(avgAttention, 1) +
143
+ weights.focus * 1.0; // simplified: full focus score in demo
144
+ const vasWeighted = vasRaw * qualityMultiplier;
145
+ return {
146
+ vasRaw: clamp(vasRaw, 0, 100),
147
+ vasWeighted: clamp(vasWeighted, 0, 100),
148
+ qualityMultiplier: clamp(qualityMultiplier, 0, 1),
149
+ };
150
+ }
151
+ function classifyEvidence(avgFaceCount, speech, avgNoiseLevel) {
152
+ let evidenceGrade;
153
+ let observationFamily;
154
+ let decisionability;
155
+ const decisionBlockReasons = [];
156
+ let measurementQuality;
157
+ if (avgFaceCount >= 2) {
158
+ evidenceGrade = 'FACE_BACKED';
159
+ observationFamily = 'SCREEN_AUDIENCE';
160
+ decisionability = 'DECISIONABLE';
161
+ measurementQuality = 'face_backed';
162
+ }
163
+ else if (avgFaceCount >= 1) {
164
+ evidenceGrade = 'PERSON_BACKED';
165
+ observationFamily = 'AMBIENT_COMMERCE_INTENT';
166
+ decisionability = 'NON_DECISIONABLE';
167
+ decisionBlockReasons.push('no_face_confirmation');
168
+ measurementQuality = 'ambient_proxy_only';
169
+ }
170
+ else if (speech) {
171
+ evidenceGrade = 'SPEECH_ONLY';
172
+ observationFamily = 'AMBIENT_COMMERCE_INTENT';
173
+ decisionability = 'NON_DECISIONABLE';
174
+ decisionBlockReasons.push('no_visual_confirmation');
175
+ measurementQuality = 'ambient_proxy_only';
176
+ }
177
+ else if (avgNoiseLevel > 0.1) {
178
+ evidenceGrade = 'PROXY_ONLY';
179
+ observationFamily = 'AMBIENT_COMMERCE_INTENT';
180
+ decisionability = 'NON_DECISIONABLE';
181
+ decisionBlockReasons.push('proxy_signal_only');
182
+ measurementQuality = 'proxy_only';
183
+ }
184
+ else {
185
+ evidenceGrade = 'EMPTY';
186
+ observationFamily = 'EMPTY_SCENE';
187
+ decisionability = 'NON_DECISIONABLE';
188
+ decisionBlockReasons.push('empty_scene');
189
+ measurementQuality = 'empty_scene';
190
+ }
191
+ return {
192
+ evidenceGrade,
193
+ observationFamily,
194
+ decisionability,
195
+ decisionBlockReasons,
196
+ measurementQuality,
197
+ };
198
+ }
199
+ // ─── Synthetic Data Generator ──────────────────────────────────────────────────
200
+ /**
201
+ * Generates a synthetic metrics payload that cycles through all evidence grades
202
+ * with realistic distributions. The cycle index ensures all grades are covered
203
+ * over time while randomizing individual measurements.
204
+ */
205
+ function generateSyntheticPayload(cycleIndex) {
206
+ const now = Date.now();
207
+ const windowEnd = now;
208
+ const windowStart = now - TICK_INTERVAL_MS;
209
+ // Cycle through scenarios that cover all evidence grades.
210
+ // Use a weighted distribution: face-heavy scenarios are more common.
211
+ const scenario = cycleIndex % 10;
212
+ let avgFaceCount;
213
+ let speech;
214
+ let avgNoiseLevel;
215
+ if (scenario <= 3) {
216
+ // 40% — FACE_BACKED: 2-8 faces
217
+ avgFaceCount = randInt(2, 8);
218
+ speech = Math.random() > 0.5;
219
+ avgNoiseLevel = randFloat(0.05, 0.4);
220
+ }
221
+ else if (scenario <= 5) {
222
+ // 20% — PERSON_BACKED: exactly 1 face
223
+ avgFaceCount = 1;
224
+ speech = Math.random() > 0.3;
225
+ avgNoiseLevel = randFloat(0.1, 0.3);
226
+ }
227
+ else if (scenario <= 7) {
228
+ // 20% — SPEECH_ONLY: no faces, speech detected
229
+ avgFaceCount = 0;
230
+ speech = true;
231
+ avgNoiseLevel = randFloat(0.15, 0.5);
232
+ }
233
+ else if (scenario === 8) {
234
+ // 10% — PROXY_ONLY: no faces, no speech, ambient noise
235
+ avgFaceCount = 0;
236
+ speech = false;
237
+ avgNoiseLevel = randFloat(0.15, 0.6);
238
+ }
239
+ else {
240
+ // 10% — EMPTY: nothing
241
+ avgFaceCount = 0;
242
+ speech = false;
243
+ avgNoiseLevel = randFloat(0.0, 0.09);
244
+ }
245
+ const maxFaceCount = avgFaceCount + randInt(0, 3);
246
+ const avgAttention = avgFaceCount > 0 ? randFloat(0.3, 0.95) : 0;
247
+ const avgDwellTimeMs = avgFaceCount > 0 ? randFloat(2000, 10000) : 0;
248
+ const emotionalEngagement = avgFaceCount > 0 ? randFloat(0.1, 0.9) : 0;
249
+ const faceSnapshotCount = avgFaceCount > 0 ? randInt(3, 10) : 0;
250
+ const audioSnapshotCount = speech ? randInt(2, 8) : randInt(0, 2);
251
+ const classification = classifyEvidence(avgFaceCount, speech, avgNoiseLevel);
252
+ const vas = computeDemoVAS(avgAttention, avgDwellTimeMs, avgFaceCount);
253
+ return {
254
+ fingerprint: DEMO_FINGERPRINT,
255
+ screenId: null,
256
+ windowStart,
257
+ windowEnd,
258
+ avgFaceCount,
259
+ maxFaceCount,
260
+ avgAttention: parseFloat(avgAttention.toFixed(2)),
261
+ avgDwellTimeMs: parseFloat(avgDwellTimeMs.toFixed(0)),
262
+ avgNoiseLevel: parseFloat(avgNoiseLevel.toFixed(2)),
263
+ sensingMode: 'demo',
264
+ speech,
265
+ emotionalEngagement: parseFloat(emotionalEngagement.toFixed(2)),
266
+ sensingIntervalMs: TICK_INTERVAL_MS,
267
+ faceSnapshotCount,
268
+ audioSnapshotCount,
269
+ measurementQuality: classification.measurementQuality,
270
+ observationFamily: classification.observationFamily,
271
+ evidenceGrade: classification.evidenceGrade,
272
+ decisionability: classification.decisionability,
273
+ decisionBlockReasons: classification.decisionBlockReasons,
274
+ vasRaw: parseFloat(vas.vasRaw.toFixed(2)),
275
+ vasWeighted: parseFloat(vas.vasWeighted.toFixed(2)),
276
+ vasQualityMultiplier: parseFloat(vas.qualityMultiplier.toFixed(2)),
277
+ };
278
+ }
279
+ // ─── Terminal Dashboard Renderer ───────────────────────────────────────────────
280
+ function renderProgressBar(fraction, width) {
281
+ const filled = Math.round(clamp(fraction, 0, 1) * width);
282
+ const empty = width - filled;
283
+ return GREEN + '\u2588'.repeat(filled) + GRAY + '\u2591'.repeat(empty) + RESET;
284
+ }
285
+ function gradeColor(grade) {
286
+ switch (grade) {
287
+ case 'FACE_BACKED': return GREEN;
288
+ case 'PERSON_BACKED': return CYAN;
289
+ case 'SPEECH_ONLY': return YELLOW;
290
+ case 'PROXY_ONLY': return MAGENTA;
291
+ case 'EMPTY': return RED;
292
+ }
293
+ }
294
+ function gradeShortName(grade) {
295
+ switch (grade) {
296
+ case 'FACE_BACKED': return 'FACE';
297
+ case 'PERSON_BACKED': return 'PERSON';
298
+ case 'SPEECH_ONLY': return 'SPEECH';
299
+ case 'PROXY_ONLY': return 'PROXY';
300
+ case 'EMPTY': return 'EMPTY';
301
+ }
302
+ }
303
+ function renderDashboard(state) {
304
+ const { currentPayload, signals, bufferSize, startTime, tickCount, gradeDistribution, } = state;
305
+ const uptime = formatDuration(Date.now() - startTime);
306
+ const simulatedFps = currentPayload
307
+ ? (currentPayload.faceSnapshotCount / (TICK_INTERVAL_MS / 1000)).toFixed(1)
308
+ : '0.0';
309
+ const faces = currentPayload?.avgFaceCount ?? 0;
310
+ const attention = currentPayload?.avgAttention ?? 0;
311
+ const vas = currentPayload?.vasWeighted ?? 0;
312
+ const grade = currentPayload?.evidenceGrade ?? 'EMPTY';
313
+ const BOX_WIDTH = 65;
314
+ const HR = '\u2500'.repeat(BOX_WIDTH - 2);
315
+ const lines = [];
316
+ // Top border with title
317
+ lines.push(`${BOLD}${CYAN}\u250C\u2500 Trillboards Edge AI SDK \u2014 Demo Mode ${'\u2500'.repeat(BOX_WIDTH - 42)}\u2510${RESET}`);
318
+ // Status line
319
+ const gradeStr = `${gradeColor(grade)}${grade}${RESET}`;
320
+ lines.push(`${CYAN}\u2502${RESET} ${BOLD}Faces:${RESET} ${pad(String(faces), 3)} `
321
+ + `${BOLD}Attention:${RESET} ${pad(attention.toFixed(2), 5)} `
322
+ + `${BOLD}VAS:${RESET} ${pad(vas.toFixed(2), 5)} `
323
+ + `${BOLD}Grade:${RESET} ${gradeStr}`
324
+ + ' '.repeat(Math.max(0, BOX_WIDTH - 55 - grade.length))
325
+ + `${CYAN}\u2502${RESET}`);
326
+ // Buffer / uptime line
327
+ lines.push(`${CYAN}\u2502${RESET} ${BOLD}Buffer:${RESET} ${pad(`${bufferSize}/${MAX_BUFFER_SIZE}`, 12)} `
328
+ + `${BOLD}Uptime:${RESET} ${pad(uptime, 14)} `
329
+ + `${BOLD}FPS:${RESET} ${pad(simulatedFps, 5)}`
330
+ + ' '.repeat(Math.max(0, BOX_WIDTH - 56 - uptime.length + 14))
331
+ + `${CYAN}\u2502${RESET}`);
332
+ // Blank line
333
+ lines.push(`${CYAN}\u2502${RESET}${' '.repeat(BOX_WIDTH - 2)}${CYAN}\u2502${RESET}`);
334
+ // Evidence distribution header
335
+ lines.push(`${CYAN}\u2502${RESET} ${BOLD}${WHITE}Evidence Distribution:${RESET}`
336
+ + ' '.repeat(BOX_WIDTH - 24) + `${CYAN}\u2502${RESET}`);
337
+ // Compute total for percentages
338
+ const totalGrades = Object.values(gradeDistribution).reduce((a, b) => a + b, 0) || 1;
339
+ for (const g of EVIDENCE_GRADES) {
340
+ const count = gradeDistribution[g] || 0;
341
+ const pct = (count / totalGrades) * 100;
342
+ const bar = renderProgressBar(pct / 100, BAR_WIDTH);
343
+ const label = pad(`${g}:`, 16);
344
+ const pctStr = padStart(`${Math.round(pct)}%`, 4);
345
+ const lineContent = ` ${gradeColor(g)}${label}${RESET} ${bar} ${pctStr}`;
346
+ // Calculate actual visual length (without ANSI codes) for padding
347
+ const visualLen = 2 + 16 + 1 + BAR_WIDTH + 2 + 4;
348
+ const padding = Math.max(0, BOX_WIDTH - 2 - visualLen);
349
+ lines.push(`${CYAN}\u2502${RESET} ${lineContent}${' '.repeat(padding)} ${CYAN}\u2502${RESET}`);
350
+ }
351
+ // Blank line
352
+ lines.push(`${CYAN}\u2502${RESET}${' '.repeat(BOX_WIDTH - 2)}${CYAN}\u2502${RESET}`);
353
+ // Recent signals header
354
+ lines.push(`${CYAN}\u2502${RESET} ${BOLD}${WHITE}Recent Signals:${RESET}`
355
+ + ' '.repeat(BOX_WIDTH - 18) + `${CYAN}\u2502${RESET}`);
356
+ // Show last N signals (newest first)
357
+ const recentSlice = signals.slice(-MAX_RECENT_SIGNALS).reverse();
358
+ for (const sig of recentSlice) {
359
+ const ts = formatTime(sig.timestamp);
360
+ const gradeTag = gradeShortName(sig.evidenceGrade);
361
+ const sigLine = ` ${DIM}[${ts}]${RESET} faces=${pad(String(sig.avgFaceCount), 2)}`
362
+ + ` attn=${pad(sig.avgAttention.toFixed(2), 5)}`
363
+ + ` vas=${pad(sig.vasWeighted.toFixed(2), 5)}`
364
+ + ` grade=${gradeColor(sig.evidenceGrade)}${gradeTag}${RESET}`;
365
+ const sigVisualLen = 2 + 10 + 7 + 2 + 6 + 5 + 5 + 5 + 7 + gradeTag.length;
366
+ const sigPadding = Math.max(0, BOX_WIDTH - 2 - sigVisualLen);
367
+ lines.push(`${CYAN}\u2502${RESET} ${sigLine}${' '.repeat(sigPadding)} ${CYAN}\u2502${RESET}`);
368
+ }
369
+ // Fill remaining rows if fewer signals than max
370
+ const emptyRows = MAX_RECENT_SIGNALS - recentSlice.length;
371
+ for (let i = 0; i < emptyRows; i++) {
372
+ lines.push(`${CYAN}\u2502${RESET}${' '.repeat(BOX_WIDTH - 2)}${CYAN}\u2502${RESET}`);
373
+ }
374
+ // Blank line
375
+ lines.push(`${CYAN}\u2502${RESET}${' '.repeat(BOX_WIDTH - 2)}${CYAN}\u2502${RESET}`);
376
+ // Ctrl+C hint
377
+ lines.push(`${CYAN}\u2502${RESET} ${DIM}Press Ctrl+C to stop${RESET}`
378
+ + ' '.repeat(BOX_WIDTH - 23) + `${CYAN}\u2502${RESET}`);
379
+ // Bottom border
380
+ lines.push(`${CYAN}\u2514${HR}\u2518${RESET}`);
381
+ return lines.join('\n');
382
+ }
383
+ // ─── Exit Summary ──────────────────────────────────────────────────────────────
384
+ function renderExitSummary(state) {
385
+ const { signals, startTime, tickCount, gradeDistribution } = state;
386
+ const runtime = formatDuration(Date.now() - startTime);
387
+ const totalSignals = tickCount;
388
+ const totalGrades = Object.values(gradeDistribution).reduce((a, b) => a + b, 0) || 1;
389
+ const avgVAS = signals.length > 0
390
+ ? signals.reduce((sum, s) => sum + s.vasWeighted, 0) / signals.length
391
+ : 0;
392
+ const lines = [];
393
+ lines.push('');
394
+ lines.push(`${BOLD}${CYAN}Trillboards Edge AI SDK \u2014 Demo Summary${RESET}`);
395
+ lines.push(`${DIM}${'─'.repeat(45)}${RESET}`);
396
+ lines.push(` ${BOLD}Runtime:${RESET} ${runtime}`);
397
+ lines.push(` ${BOLD}Total Signals:${RESET} ${totalSignals}`);
398
+ lines.push(` ${BOLD}Avg VAS:${RESET} ${avgVAS.toFixed(2)}`);
399
+ lines.push('');
400
+ lines.push(` ${BOLD}Evidence Grade Distribution:${RESET}`);
401
+ for (const g of EVIDENCE_GRADES) {
402
+ const count = gradeDistribution[g] || 0;
403
+ const pct = ((count / totalGrades) * 100).toFixed(1);
404
+ lines.push(` ${gradeColor(g)}${pad(g, 16)}${RESET} ${padStart(String(count), 4)} signals (${padStart(pct, 5)}%)`);
405
+ }
406
+ lines.push('');
407
+ lines.push(` ${DIM}Fingerprint: ${DEMO_FINGERPRINT}${RESET}`);
408
+ lines.push('');
409
+ return lines.join('\n');
410
+ }
411
+ // ─── Main Demo Loop ────────────────────────────────────────────────────────────
412
+ /**
413
+ * Run the Edge SDK demo mode. Generates synthetic audience metrics every 10s
414
+ * and renders a live terminal dashboard. No device token, camera, models, or
415
+ * backend connection required.
416
+ *
417
+ * Returns a Promise that resolves when the user presses Ctrl+C.
418
+ */
419
+ async function runDemo() {
420
+ const state = {
421
+ currentPayload: null,
422
+ signals: [],
423
+ bufferSize: 0,
424
+ startTime: Date.now(),
425
+ tickCount: 0,
426
+ gradeDistribution: {
427
+ FACE_BACKED: 0,
428
+ PERSON_BACKED: 0,
429
+ SPEECH_ONLY: 0,
430
+ PROXY_ONLY: 0,
431
+ EMPTY: 0,
432
+ },
433
+ };
434
+ // Hide cursor for clean rendering
435
+ process.stdout.write(HIDE_CURSOR);
436
+ // Print initial banner
437
+ process.stdout.write(CLEAR_SCREEN);
438
+ process.stdout.write(`\n ${BOLD}${CYAN}Trillboards Edge AI SDK v${VERSION} \u2014 Demo Mode${RESET}\n`
439
+ + ` ${DIM}Generating synthetic audience signals every 10s...${RESET}\n\n`);
440
+ // Generate the first signal immediately so the dashboard is not empty
441
+ tick(state);
442
+ process.stdout.write(CLEAR_SCREEN);
443
+ process.stdout.write(renderDashboard(state) + '\n');
444
+ // Set up interval
445
+ const intervalHandle = setInterval(() => {
446
+ tick(state);
447
+ process.stdout.write(CLEAR_SCREEN);
448
+ process.stdout.write(renderDashboard(state) + '\n');
449
+ }, TICK_INTERVAL_MS);
450
+ // Handle graceful shutdown
451
+ return new Promise((resolve) => {
452
+ const cleanup = () => {
453
+ clearInterval(intervalHandle);
454
+ process.stdout.write(SHOW_CURSOR);
455
+ process.stdout.write(CLEAR_SCREEN);
456
+ process.stdout.write(renderExitSummary(state));
457
+ resolve();
458
+ };
459
+ process.on('SIGINT', cleanup);
460
+ process.on('SIGTERM', cleanup);
461
+ });
462
+ }
463
+ /** Advance the demo state by one tick. */
464
+ function tick(state) {
465
+ const payload = generateSyntheticPayload(state.tickCount);
466
+ state.currentPayload = payload;
467
+ state.tickCount++;
468
+ state.bufferSize = Math.min(state.bufferSize + 1, MAX_BUFFER_SIZE);
469
+ // Track grade distribution
470
+ state.gradeDistribution[payload.evidenceGrade]++;
471
+ // Append to signal log (cap at MAX_BUFFER_SIZE for memory safety)
472
+ state.signals.push({
473
+ timestamp: new Date(),
474
+ avgFaceCount: payload.avgFaceCount,
475
+ avgAttention: payload.avgAttention,
476
+ vasWeighted: payload.vasWeighted,
477
+ evidenceGrade: payload.evidenceGrade,
478
+ });
479
+ if (state.signals.length > MAX_BUFFER_SIZE) {
480
+ state.signals.shift();
481
+ }
482
+ }
483
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":"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"}