@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.
- 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 +292 -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/index.d.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
export { EdgeAgent } from './EdgeAgent';
|
|
2
2
|
export type { EdgeAgentConfig } from './config';
|
|
3
3
|
export { loadConfig, resolveConfig } from './config';
|
|
4
|
+
export { CommandRouter } from './CommandRouter';
|
|
5
|
+
export type { CommandContext, DeviceCommand, CommandResult } from './CommandRouter';
|
|
6
|
+
export { runInit } from './init';
|
|
7
|
+
export { runDiagnose } from './diagnose';
|
|
8
|
+
export type { DiagnosticReport } from './diagnose';
|
|
4
9
|
export type { AudienceMetricsPayload, DetectedFace, EdgeQualityReport, VASResult, DeviceCapabilityMatrix, PlatformAdapter, CameraProvider, AudioProvider, EdgeSDKConfig, } from '@trillboards/edge-core';
|
|
5
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,YAAY,EACV,sBAAsB,EACtB,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,aAAa,EACb,aAAa,GACd,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,10 +3,16 @@
|
|
|
3
3
|
// Install: npm install @trillboards/edge-sdk
|
|
4
4
|
// Run: npx trillboards-edge start --config trillboards.config.json
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.resolveConfig = exports.loadConfig = exports.EdgeAgent = void 0;
|
|
6
|
+
exports.runDiagnose = exports.runInit = exports.CommandRouter = exports.resolveConfig = exports.loadConfig = exports.EdgeAgent = void 0;
|
|
7
7
|
var EdgeAgent_1 = require("./EdgeAgent");
|
|
8
8
|
Object.defineProperty(exports, "EdgeAgent", { enumerable: true, get: function () { return EdgeAgent_1.EdgeAgent; } });
|
|
9
9
|
var config_1 = require("./config");
|
|
10
10
|
Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_1.loadConfig; } });
|
|
11
11
|
Object.defineProperty(exports, "resolveConfig", { enumerable: true, get: function () { return config_1.resolveConfig; } });
|
|
12
|
+
var CommandRouter_1 = require("./CommandRouter");
|
|
13
|
+
Object.defineProperty(exports, "CommandRouter", { enumerable: true, get: function () { return CommandRouter_1.CommandRouter; } });
|
|
14
|
+
var init_1 = require("./init");
|
|
15
|
+
Object.defineProperty(exports, "runInit", { enumerable: true, get: function () { return init_1.runInit; } });
|
|
16
|
+
var diagnose_1 = require("./diagnose");
|
|
17
|
+
Object.defineProperty(exports, "runDiagnose", { enumerable: true, get: function () { return diagnose_1.runDiagnose; } });
|
|
12
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,6CAA6C;AAC7C,mEAAmE;;;AAEnE,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAElB,mCAAqD;AAA5C,oGAAA,UAAU,OAAA;AAAE,uGAAA,aAAa,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,6CAA6C;AAC7C,mEAAmE;;;AAEnE,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAElB,mCAAqD;AAA5C,oGAAA,UAAU,OAAA;AAAE,uGAAA,aAAa,OAAA;AAClC,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AAEtB,+BAAiC;AAAxB,+FAAA,OAAO,OAAA;AAChB,uCAAyC;AAAhC,uGAAA,WAAW,OAAA"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for runInit, primarily for testing. Production callers pass nothing.
|
|
3
|
+
*/
|
|
4
|
+
export interface InitOptions {
|
|
5
|
+
/** Override the output config file path. Defaults to cwd/trillboards.config.json. */
|
|
6
|
+
outputPath?: string;
|
|
7
|
+
/** Override the input stream (defaults to process.stdin). */
|
|
8
|
+
input?: NodeJS.ReadableStream;
|
|
9
|
+
/** Override the output stream (defaults to process.stdout). */
|
|
10
|
+
output?: NodeJS.WritableStream;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Run the interactive init wizard. Prompts the user for configuration values,
|
|
14
|
+
* writes trillboards.config.json, and downloads ONNX models.
|
|
15
|
+
*
|
|
16
|
+
* @param options - Optional overrides for output path and I/O streams (for testing).
|
|
17
|
+
*/
|
|
18
|
+
export declare function runInit(options?: InitOptions): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAChC;AAqOD;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2JlE"}
|
package/dist/init.js
ADDED
|
@@ -0,0 +1,364 @@
|
|
|
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.runInit = runInit;
|
|
37
|
+
const readline = __importStar(require("readline"));
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const https = __importStar(require("https"));
|
|
41
|
+
const http = __importStar(require("http"));
|
|
42
|
+
const MODEL_URLS = {
|
|
43
|
+
'blazeface.onnx': 'https://models.trillboards.com/blazeface_128x128.onnx',
|
|
44
|
+
'yamnet.onnx': 'https://models.trillboards.com/yamnet_classification.onnx',
|
|
45
|
+
};
|
|
46
|
+
const VALID_EXECUTION_PROVIDERS = ['cpu', 'openvino', 'directml', 'cuda'];
|
|
47
|
+
/**
|
|
48
|
+
* Create a prompt context that buffers incoming lines from readline.
|
|
49
|
+
*/
|
|
50
|
+
function createPromptContext(input, output) {
|
|
51
|
+
const rl = readline.createInterface({ input, output, terminal: false });
|
|
52
|
+
const ctx = {
|
|
53
|
+
rl,
|
|
54
|
+
output,
|
|
55
|
+
lineQueue: [],
|
|
56
|
+
pendingResolve: null,
|
|
57
|
+
closed: false,
|
|
58
|
+
};
|
|
59
|
+
rl.on('line', (line) => {
|
|
60
|
+
if (ctx.pendingResolve) {
|
|
61
|
+
const resolve = ctx.pendingResolve;
|
|
62
|
+
ctx.pendingResolve = null;
|
|
63
|
+
resolve(line);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
ctx.lineQueue.push(line);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
rl.on('close', () => {
|
|
70
|
+
ctx.closed = true;
|
|
71
|
+
// If a prompt is pending when the stream closes, resolve with empty string
|
|
72
|
+
// so that the default value kicks in rather than hanging forever.
|
|
73
|
+
if (ctx.pendingResolve) {
|
|
74
|
+
const resolve = ctx.pendingResolve;
|
|
75
|
+
ctx.pendingResolve = null;
|
|
76
|
+
resolve('');
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
return ctx;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Prompt the user for input, returning the trimmed answer or the
|
|
83
|
+
* default value when the user presses Enter without typing anything.
|
|
84
|
+
*/
|
|
85
|
+
function prompt(ctx, question, defaultValue) {
|
|
86
|
+
const suffix = defaultValue != null ? ` [${defaultValue}]` : '';
|
|
87
|
+
const fullQuestion = ` ${question}${suffix}: `;
|
|
88
|
+
// Write the question prompt to output
|
|
89
|
+
ctx.output.write(fullQuestion);
|
|
90
|
+
return new Promise((resolve) => {
|
|
91
|
+
if (ctx.lineQueue.length > 0) {
|
|
92
|
+
const answer = ctx.lineQueue.shift();
|
|
93
|
+
const trimmed = answer.trim();
|
|
94
|
+
resolve(trimmed || defaultValue || '');
|
|
95
|
+
}
|
|
96
|
+
else if (ctx.closed) {
|
|
97
|
+
// Stream already closed — use default
|
|
98
|
+
resolve(defaultValue || '');
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
ctx.pendingResolve = (line) => {
|
|
102
|
+
const trimmed = line.trim();
|
|
103
|
+
resolve(trimmed || defaultValue || '');
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Detect the platform from process.platform.
|
|
110
|
+
* Returns 'linux' or 'windows'.
|
|
111
|
+
*/
|
|
112
|
+
function detectPlatform() {
|
|
113
|
+
return process.platform === 'win32' ? 'windows' : 'linux';
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Detect available V4L2 camera devices on Linux by scanning /dev/video*.
|
|
117
|
+
* Returns the list of device paths found, or an empty array on non-Linux
|
|
118
|
+
* platforms or when no cameras are present.
|
|
119
|
+
*/
|
|
120
|
+
function detectCameraDevices() {
|
|
121
|
+
if (process.platform === 'win32') {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
const devices = [];
|
|
125
|
+
try {
|
|
126
|
+
const devEntries = fs.readdirSync('/dev');
|
|
127
|
+
for (const entry of devEntries) {
|
|
128
|
+
if (/^video\d+$/.test(entry)) {
|
|
129
|
+
devices.push(`/dev/${entry}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
devices.sort();
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// /dev may not be readable in sandboxed environments — that is fine
|
|
136
|
+
}
|
|
137
|
+
return devices;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Download a single file over HTTPS with redirect following.
|
|
141
|
+
* Reuses the same pattern established in cli.ts.
|
|
142
|
+
*/
|
|
143
|
+
function downloadFile(url, dest, maxRedirects = 5) {
|
|
144
|
+
return new Promise((resolve, reject) => {
|
|
145
|
+
if (maxRedirects < 0) {
|
|
146
|
+
reject(new Error('Too many redirects'));
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const proto = url.startsWith('https') ? https : http;
|
|
150
|
+
const file = fs.createWriteStream(dest);
|
|
151
|
+
const request = proto.get(url, (response) => {
|
|
152
|
+
if (response.statusCode === 301 ||
|
|
153
|
+
response.statusCode === 302 ||
|
|
154
|
+
response.statusCode === 307 ||
|
|
155
|
+
response.statusCode === 308) {
|
|
156
|
+
file.close();
|
|
157
|
+
if (fs.existsSync(dest))
|
|
158
|
+
fs.unlinkSync(dest);
|
|
159
|
+
if (response.headers.location) {
|
|
160
|
+
downloadFile(response.headers.location, dest, maxRedirects - 1).then(resolve, reject);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
reject(new Error('Redirect with no location header'));
|
|
164
|
+
}
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
if (response.statusCode !== 200) {
|
|
168
|
+
file.close();
|
|
169
|
+
if (fs.existsSync(dest))
|
|
170
|
+
fs.unlinkSync(dest);
|
|
171
|
+
reject(new Error(`HTTP ${response.statusCode}`));
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
response.pipe(file);
|
|
175
|
+
file.on('finish', () => {
|
|
176
|
+
file.close();
|
|
177
|
+
resolve();
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
request.on('error', (err) => {
|
|
181
|
+
file.close();
|
|
182
|
+
if (fs.existsSync(dest))
|
|
183
|
+
fs.unlinkSync(dest);
|
|
184
|
+
reject(err);
|
|
185
|
+
});
|
|
186
|
+
request.setTimeout(60000, () => {
|
|
187
|
+
request.destroy();
|
|
188
|
+
reject(new Error('Download timed out after 60s'));
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Download all ONNX models into the given directory, skipping any that
|
|
194
|
+
* already exist on disk.
|
|
195
|
+
*/
|
|
196
|
+
async function downloadModelsToDir(modelsDir) {
|
|
197
|
+
const resolved = path.resolve(modelsDir);
|
|
198
|
+
if (!fs.existsSync(resolved)) {
|
|
199
|
+
fs.mkdirSync(resolved, { recursive: true });
|
|
200
|
+
}
|
|
201
|
+
console.log(`\n Downloading ONNX models to ${resolved}...`);
|
|
202
|
+
for (const [filename, url] of Object.entries(MODEL_URLS)) {
|
|
203
|
+
const dest = path.join(resolved, filename);
|
|
204
|
+
if (fs.existsSync(dest)) {
|
|
205
|
+
const stats = fs.statSync(dest);
|
|
206
|
+
const sizeMb = (stats.size / (1024 * 1024)).toFixed(1);
|
|
207
|
+
console.log(` [SKIP] ${filename} (already exists, ${sizeMb} MB)`);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
process.stdout.write(` [GET] ${filename}...`);
|
|
211
|
+
try {
|
|
212
|
+
await downloadFile(url, dest);
|
|
213
|
+
const stats = fs.statSync(dest);
|
|
214
|
+
const sizeMb = (stats.size / (1024 * 1024)).toFixed(1);
|
|
215
|
+
console.log(` (${sizeMb} MB)`);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
console.log(` FAILED`);
|
|
219
|
+
console.error(` [FAIL] ${filename}: ${err instanceof Error ? err.message : err}`);
|
|
220
|
+
// Remove partial download
|
|
221
|
+
if (fs.existsSync(dest))
|
|
222
|
+
fs.unlinkSync(dest);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Parse a yes/no answer string. Returns true for empty string (default yes),
|
|
228
|
+
* 'y', 'yes'; false for 'n', 'no'. Case-insensitive.
|
|
229
|
+
*/
|
|
230
|
+
function parseYesNo(answer, defaultYes) {
|
|
231
|
+
const lower = answer.toLowerCase().trim();
|
|
232
|
+
if (lower === '')
|
|
233
|
+
return defaultYes;
|
|
234
|
+
return lower === 'y' || lower === 'yes';
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Run the interactive init wizard. Prompts the user for configuration values,
|
|
238
|
+
* writes trillboards.config.json, and downloads ONNX models.
|
|
239
|
+
*
|
|
240
|
+
* @param options - Optional overrides for output path and I/O streams (for testing).
|
|
241
|
+
*/
|
|
242
|
+
async function runInit(options) {
|
|
243
|
+
const configPath = options?.outputPath || path.resolve('trillboards.config.json');
|
|
244
|
+
const input = options?.input || process.stdin;
|
|
245
|
+
const output = options?.output || process.stdout;
|
|
246
|
+
const ctx = createPromptContext(input, output);
|
|
247
|
+
try {
|
|
248
|
+
// Warn if config already exists
|
|
249
|
+
if (fs.existsSync(configPath)) {
|
|
250
|
+
const overwrite = await prompt(ctx, `${configPath} already exists. Overwrite? [y/N]`, 'n');
|
|
251
|
+
if (!parseYesNo(overwrite, false)) {
|
|
252
|
+
console.log('\n Aborted. Existing config preserved.');
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
console.log('');
|
|
257
|
+
console.log(' Trillboards Edge SDK -- Setup Wizard');
|
|
258
|
+
console.log('');
|
|
259
|
+
// ── Device Token ──────────────────────────────────────────────────
|
|
260
|
+
let deviceToken = '';
|
|
261
|
+
while (!deviceToken) {
|
|
262
|
+
deviceToken = await prompt(ctx, 'Device Token (from dashboard)');
|
|
263
|
+
if (!deviceToken) {
|
|
264
|
+
if (ctx.closed) {
|
|
265
|
+
throw new Error('Setup cancelled: stdin closed before device token was provided');
|
|
266
|
+
}
|
|
267
|
+
console.log(' Device token is required. Get one from https://app.trillboards.com');
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// ── Platform ──────────────────────────────────────────────────────
|
|
271
|
+
const detectedPlatform = detectPlatform();
|
|
272
|
+
const platformInput = await prompt(ctx, `Platform`, `auto-detected: ${detectedPlatform}`);
|
|
273
|
+
const platform = platformInput === 'windows' ? 'windows' :
|
|
274
|
+
platformInput === 'linux' ? 'linux' :
|
|
275
|
+
detectedPlatform;
|
|
276
|
+
// ── Camera ────────────────────────────────────────────────────────
|
|
277
|
+
const cameraDevices = detectCameraDevices();
|
|
278
|
+
let cameraHint = '';
|
|
279
|
+
if (platform === 'linux' && cameraDevices.length > 0) {
|
|
280
|
+
cameraHint = ` (found: ${cameraDevices.join(', ')})`;
|
|
281
|
+
}
|
|
282
|
+
else if (platform === 'linux' && cameraDevices.length === 0) {
|
|
283
|
+
cameraHint = ' (no /dev/video* devices found)';
|
|
284
|
+
}
|
|
285
|
+
const enableCameraInput = await prompt(ctx, `Enable Camera?${cameraHint}`, 'Y');
|
|
286
|
+
const enableCamera = parseYesNo(enableCameraInput, true);
|
|
287
|
+
let cameraDeviceId;
|
|
288
|
+
if (enableCamera && platform === 'linux') {
|
|
289
|
+
const defaultCamera = cameraDevices.length > 0 ? cameraDevices[0] : '/dev/video0';
|
|
290
|
+
cameraDeviceId = await prompt(ctx, 'Camera Device', defaultCamera);
|
|
291
|
+
}
|
|
292
|
+
// ── Audio ─────────────────────────────────────────────────────────
|
|
293
|
+
const enableAudioInput = await prompt(ctx, 'Enable Audio?', 'Y');
|
|
294
|
+
const enableAudio = parseYesNo(enableAudioInput, true);
|
|
295
|
+
// ── Kiosk ─────────────────────────────────────────────────────────
|
|
296
|
+
const enableKioskInput = await prompt(ctx, 'Enable Kiosk Browser?', 'Y');
|
|
297
|
+
const enableKiosk = parseYesNo(enableKioskInput, true);
|
|
298
|
+
let kioskUrl = 'https://screen.trillboards.com';
|
|
299
|
+
if (enableKiosk) {
|
|
300
|
+
kioskUrl = await prompt(ctx, 'Kiosk URL', 'https://screen.trillboards.com');
|
|
301
|
+
}
|
|
302
|
+
// ── Models ────────────────────────────────────────────────────────
|
|
303
|
+
const modelsDir = await prompt(ctx, 'Models Directory', './models');
|
|
304
|
+
let executionProvider = '';
|
|
305
|
+
while (!VALID_EXECUTION_PROVIDERS.includes(executionProvider)) {
|
|
306
|
+
executionProvider = await prompt(ctx, 'Execution Provider [cpu/openvino/directml/cuda]', 'cpu');
|
|
307
|
+
if (!VALID_EXECUTION_PROVIDERS.includes(executionProvider)) {
|
|
308
|
+
console.log(` Invalid provider "${executionProvider}". Choose: ${VALID_EXECUTION_PROVIDERS.join(', ')}`);
|
|
309
|
+
executionProvider = '';
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// ── Build config ──────────────────────────────────────────────────
|
|
313
|
+
const config = {
|
|
314
|
+
apiBaseUrl: 'https://api.trillboards.com',
|
|
315
|
+
deviceToken,
|
|
316
|
+
platform,
|
|
317
|
+
camera: {
|
|
318
|
+
enabled: enableCamera,
|
|
319
|
+
...(cameraDeviceId ? { deviceId: cameraDeviceId } : {}),
|
|
320
|
+
},
|
|
321
|
+
audio: {
|
|
322
|
+
enabled: enableAudio,
|
|
323
|
+
},
|
|
324
|
+
models: {
|
|
325
|
+
dir: modelsDir,
|
|
326
|
+
executionProvider: executionProvider,
|
|
327
|
+
},
|
|
328
|
+
kiosk: {
|
|
329
|
+
enabled: enableKiosk,
|
|
330
|
+
...(enableKiosk ? { url: kioskUrl } : {}),
|
|
331
|
+
},
|
|
332
|
+
cloud: {
|
|
333
|
+
enabled: false,
|
|
334
|
+
},
|
|
335
|
+
federated: {
|
|
336
|
+
enabled: false,
|
|
337
|
+
},
|
|
338
|
+
};
|
|
339
|
+
// ── Write config file ─────────────────────────────────────────────
|
|
340
|
+
console.log('');
|
|
341
|
+
console.log(` Writing ${configPath}...`);
|
|
342
|
+
const configDir = path.dirname(configPath);
|
|
343
|
+
if (!fs.existsSync(configDir)) {
|
|
344
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
345
|
+
}
|
|
346
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
347
|
+
console.log(` Config saved.`);
|
|
348
|
+
// ── Download models ───────────────────────────────────────────────
|
|
349
|
+
await downloadModelsToDir(modelsDir);
|
|
350
|
+
// ── Done ──────────────────────────────────────────────────────────
|
|
351
|
+
console.log('');
|
|
352
|
+
console.log(' Setup complete!');
|
|
353
|
+
console.log('');
|
|
354
|
+
console.log(' Next steps:');
|
|
355
|
+
console.log(' trillboards-edge start');
|
|
356
|
+
console.log(' trillboards-edge status');
|
|
357
|
+
console.log(' trillboards-edge diagnose');
|
|
358
|
+
console.log('');
|
|
359
|
+
}
|
|
360
|
+
finally {
|
|
361
|
+
ctx.rl.close();
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP Server for Trillboards Edge SDK
|
|
4
|
+
*
|
|
5
|
+
* A Model Context Protocol (MCP) server that allows AI agents to discover,
|
|
6
|
+
* configure, and diagnose edge devices. Communicates with the Edge Agent's
|
|
7
|
+
* StatusServer via HTTP (localhost:9090) using JSON-RPC 2.0 over stdio.
|
|
8
|
+
*
|
|
9
|
+
* Uses ONLY Node.js built-in modules — zero external dependencies.
|
|
10
|
+
*
|
|
11
|
+
* Claude Desktop config:
|
|
12
|
+
* {
|
|
13
|
+
* "mcpServers": {
|
|
14
|
+
* "trillboards-edge": {
|
|
15
|
+
* "command": "npx",
|
|
16
|
+
* "args": ["-y", "@trillboards/edge-sdk", "mcp"],
|
|
17
|
+
* "env": { "EDGE_STATUS_PORT": "9090" }
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* }
|
|
21
|
+
*
|
|
22
|
+
* Bin entry for package.json (to be added separately):
|
|
23
|
+
* "trillboards-edge-mcp": "./dist/mcp-server.js"
|
|
24
|
+
*/
|
|
25
|
+
declare function main(): Promise<void>;
|
|
26
|
+
export { main as startServer };
|
|
27
|
+
//# sourceMappingURL=mcp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AA43CH,iBAAe,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAmGnC;AAGD,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,CAAC"}
|