@tantawowa/hosanna-tools 2.20.0 → 2.22.0

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 (62) hide show
  1. package/README.md +67 -0
  2. package/dist/build-info.json +3 -3
  3. package/dist/cli.js +176 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/device/device-cli.d.ts +22 -0
  6. package/dist/device/device-cli.js +158 -0
  7. package/dist/device/device-cli.js.map +1 -0
  8. package/dist/device/device-driver.d.ts +1 -0
  9. package/dist/device/device-driver.js +3 -0
  10. package/dist/device/device-driver.js.map +1 -0
  11. package/dist/device/devices-file.d.ts +12 -0
  12. package/dist/device/devices-file.js +112 -0
  13. package/dist/device/devices-file.js.map +1 -0
  14. package/dist/device/discovery/roku-ssdp.d.ts +16 -0
  15. package/dist/device/discovery/roku-ssdp.js +116 -0
  16. package/dist/device/discovery/roku-ssdp.js.map +1 -0
  17. package/dist/device/driver-registry.d.ts +12 -0
  18. package/dist/device/driver-registry.js +114 -0
  19. package/dist/device/driver-registry.js.map +1 -0
  20. package/dist/device/drivers/roku-driver.d.ts +30 -0
  21. package/dist/device/drivers/roku-driver.js +245 -0
  22. package/dist/device/drivers/roku-driver.js.map +1 -0
  23. package/dist/device/log-stream.d.ts +14 -0
  24. package/dist/device/log-stream.js +111 -0
  25. package/dist/device/log-stream.js.map +1 -0
  26. package/dist/device/types.d.ts +55 -0
  27. package/dist/device/types.js +3 -0
  28. package/dist/device/types.js.map +1 -0
  29. package/dist/generation/generation-utils.js +4 -0
  30. package/dist/generation/generation-utils.js.map +1 -1
  31. package/dist/generation/node-library-generator.d.ts +1 -0
  32. package/dist/generation/node-library-generator.js +479 -0
  33. package/dist/generation/node-library-generator.js.map +1 -0
  34. package/dist/lib/env-info.d.ts +3 -1
  35. package/dist/lib/env-info.js +115 -1
  36. package/dist/lib/env-info.js.map +1 -1
  37. package/dist/support-tools/complib.d.ts +26 -0
  38. package/dist/support-tools/complib.js +102 -0
  39. package/dist/support-tools/complib.js.map +1 -0
  40. package/dist/support-tools/mcp-server/game-tools.d.ts +47 -0
  41. package/dist/support-tools/mcp-server/game-tools.js +428 -0
  42. package/dist/support-tools/mcp-server/game-tools.js.map +1 -0
  43. package/dist/support-tools/mcp-server/tools.js +2 -0
  44. package/dist/support-tools/mcp-server/tools.js.map +1 -1
  45. package/dist/support-tools/mcp-server/types.d.ts +54 -0
  46. package/dist/support-tools/mcp-server/types.js +2 -0
  47. package/dist/support-tools/mcp-server/types.js.map +1 -1
  48. package/dist/support-tools/run-roku.d.ts +4 -16
  49. package/dist/support-tools/run-roku.js +18 -275
  50. package/dist/support-tools/run-roku.js.map +1 -1
  51. package/dist/support-tools/tiled-prep.d.ts +15 -0
  52. package/dist/support-tools/tiled-prep.js +277 -0
  53. package/dist/support-tools/tiled-prep.js.map +1 -0
  54. package/dist/updater/sdk-manager.js +8 -51
  55. package/dist/updater/sdk-manager.js.map +1 -1
  56. package/dist/updater/symlink-manager.d.ts +33 -0
  57. package/dist/updater/symlink-manager.js +215 -0
  58. package/dist/updater/symlink-manager.js.map +1 -0
  59. package/dist/updater/symlink-registry.d.ts +28 -0
  60. package/dist/updater/symlink-registry.js +244 -0
  61. package/dist/updater/symlink-registry.js.map +1 -0
  62. package/package.json +1 -1
@@ -0,0 +1,22 @@
1
+ import type { Device, DeviceRunOptions, DeviceType } from './types.js';
2
+ import type { DriverRegistry } from './driver-registry.js';
3
+ export declare const DEVICE_TYPES: readonly DeviceType[];
4
+ export interface DeviceListCommandOptions {
5
+ cwd: string;
6
+ type?: DeviceType;
7
+ json?: boolean;
8
+ env?: NodeJS.ProcessEnv | Record<string, string | undefined>;
9
+ registry?: DriverRegistry;
10
+ }
11
+ export interface DeviceRunCommandOptions extends Omit<DeviceRunOptions, 'cwd'> {
12
+ cwd: string;
13
+ registry?: DriverRegistry;
14
+ }
15
+ type DeviceListMap = Map<string, Device[]>;
16
+ export declare function createDefaultDriverRegistry(): DriverRegistry;
17
+ export declare function runDeviceListCommand(options: DeviceListCommandOptions): Promise<void>;
18
+ export declare function collectDevices(options: DeviceListCommandOptions): Promise<Map<DeviceType, Device[]>>;
19
+ export declare function runDeviceRunCommand(options: DeviceRunCommandOptions): Promise<void>;
20
+ export declare function formatDeviceListText(grouped: DeviceListMap): string;
21
+ export declare function formatDeviceListJson(grouped: DeviceListMap): Record<string, Array<Omit<Device, 'password' | 'raw'>>>;
22
+ export {};
@@ -0,0 +1,158 @@
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.DEVICE_TYPES = void 0;
37
+ exports.createDefaultDriverRegistry = createDefaultDriverRegistry;
38
+ exports.runDeviceListCommand = runDeviceListCommand;
39
+ exports.collectDevices = collectDevices;
40
+ exports.runDeviceRunCommand = runDeviceRunCommand;
41
+ exports.formatDeviceListText = formatDeviceListText;
42
+ exports.formatDeviceListJson = formatDeviceListJson;
43
+ const driver_registry_js_1 = require("./driver-registry.js");
44
+ const devices_file_js_1 = require("./devices-file.js");
45
+ const roku_driver_js_1 = require("./drivers/roku-driver.js");
46
+ exports.DEVICE_TYPES = ['roku', 'ios', 'apple-tv', 'android', 'android-tv'];
47
+ function createDefaultDriverRegistry() {
48
+ return (0, driver_registry_js_1.createDriverRegistry)([
49
+ new roku_driver_js_1.RokuDriver(),
50
+ ]);
51
+ }
52
+ async function runDeviceListCommand(options) {
53
+ const grouped = await collectDevices(options);
54
+ if (options.json) {
55
+ console.info(JSON.stringify(formatDeviceListJson(grouped), null, 2));
56
+ }
57
+ else {
58
+ console.info(formatDeviceListText(grouped));
59
+ }
60
+ }
61
+ async function collectDevices(options) {
62
+ var _a;
63
+ const registry = (_a = options.registry) !== null && _a !== void 0 ? _a : createDefaultDriverRegistry();
64
+ const types = options.type ? [options.type] : exports.DEVICE_TYPES;
65
+ const fileDevices = (0, devices_file_js_1.loadDevicesFile)({ cwd: options.cwd }).devices;
66
+ const grouped = new Map();
67
+ for (const type of types) {
68
+ try {
69
+ grouped.set(type, await registry.discover(type, { cwd: options.cwd, env: options.env }));
70
+ }
71
+ catch (_b) {
72
+ grouped.set(type, fileDevices
73
+ .filter(device => device.type === type)
74
+ .map(device => (Object.assign(Object.assign({}, device), { online: false }))));
75
+ }
76
+ }
77
+ return grouped;
78
+ }
79
+ async function runDeviceRunCommand(options) {
80
+ var _a, _b, _c, _d;
81
+ const registry = (_a = options.registry) !== null && _a !== void 0 ? _a : createDefaultDriverRegistry();
82
+ const driver = registry.getDriver(options.type);
83
+ const device = await registry.resolveDevice({
84
+ type: options.type,
85
+ cwd: options.cwd,
86
+ device: options.device,
87
+ env: options.env,
88
+ });
89
+ if (!options.noBuild && driver.build) {
90
+ await driver.build(device, Object.assign(Object.assign({}, options), { cwd: options.cwd }));
91
+ }
92
+ if (options.type === 'roku') {
93
+ const mod = await Promise.resolve().then(() => __importStar(require('../support-tools/run-roku.js')));
94
+ await mod.runRoku({
95
+ cwd: options.cwd,
96
+ ip: (_b = device.ip) !== null && _b !== void 0 ? _b : device.id,
97
+ installerPassword: options.installerPassword || ((_c = options.env) === null || _c === void 0 ? void 0 : _c.ROKU_DEVPASSWORD) || process.env.ROKU_DEVPASSWORD || device.password,
98
+ appPackage: options.appPackage,
99
+ sourceRoot: (_d = options.sourceRoot) !== null && _d !== void 0 ? _d : (options.appPackage ? undefined : 'platforms/roku/src'),
100
+ sourceMapRoot: options.sourceMapRoot,
101
+ files: options.files,
102
+ logs: options.logs,
103
+ logOutput: !options.noLogs,
104
+ applySourceMapToPaths: options.applySourceMapToPaths,
105
+ dotenv: true,
106
+ });
107
+ return;
108
+ }
109
+ await driver.deploy(device, Object.assign(Object.assign({}, options), { cwd: options.cwd }));
110
+ await driver.launch(device, Object.assign(Object.assign({}, options), { cwd: options.cwd }));
111
+ if (!options.noLogs) {
112
+ const handle = driver.streamLogs(device, Object.assign(Object.assign({}, options), { cwd: options.cwd }));
113
+ await new Promise((resolve) => {
114
+ const onSignal = () => {
115
+ handle.stop();
116
+ resolve();
117
+ };
118
+ process.once('SIGINT', onSignal);
119
+ process.once('SIGTERM', onSignal);
120
+ });
121
+ }
122
+ }
123
+ function formatDeviceListText(grouped) {
124
+ var _a;
125
+ const lines = [];
126
+ for (const [type, devices] of grouped.entries()) {
127
+ lines.push(`${type}`);
128
+ if (devices.length === 0) {
129
+ lines.push(' (none)');
130
+ continue;
131
+ }
132
+ for (const device of devices) {
133
+ const preferred = device.isPreferred ? '★' : ' ';
134
+ const defaultMarker = device.isDefault ? '✓' : ' ';
135
+ const status = device.online === false ? 'offline' : 'online';
136
+ const source = device.source === 'devices-file' ? 'file' : device.source;
137
+ lines.push(` ${preferred}${defaultMarker} ${(_a = device.ip) !== null && _a !== void 0 ? _a : device.id} ${device.name} ${status} ${source}`);
138
+ }
139
+ }
140
+ return lines.join('\n');
141
+ }
142
+ function formatDeviceListJson(grouped) {
143
+ const result = {};
144
+ for (const [type, devices] of grouped.entries()) {
145
+ result[type] = devices.map(device => ({
146
+ type: device.type,
147
+ id: device.id,
148
+ ip: device.ip,
149
+ name: device.name,
150
+ source: device.source,
151
+ online: device.online,
152
+ isDefault: device.isDefault,
153
+ isPreferred: device.isPreferred,
154
+ }));
155
+ }
156
+ return result;
157
+ }
158
+ //# sourceMappingURL=device-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-cli.js","sourceRoot":"","sources":["../../src/device/device-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export type { DeviceDriver, DeviceDiscoveryOptions, DeviceRunOptions, LogStreamHandle, } from './types.js';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=device-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-driver.js","sourceRoot":"","sources":["../../src/device/device-driver.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { Device } from './types.js';
2
+ export interface LoadDevicesFileOptions {
3
+ cwd: string;
4
+ homeDir?: string;
5
+ }
6
+ export interface LoadDevicesFileResult {
7
+ devices: Device[];
8
+ warnings: string[];
9
+ }
10
+ export declare function loadDevicesFile(options: LoadDevicesFileOptions): LoadDevicesFileResult;
11
+ export declare function mergeDevices(discoveredDevices: Device[], fileDevices: Device[]): Device[];
12
+ export declare function deviceKey(device: Pick<Device, 'type' | 'id' | 'ip'>): string;
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadDevicesFile = loadDevicesFile;
7
+ exports.mergeDevices = mergeDevices;
8
+ exports.deviceKey = deviceKey;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const os_1 = __importDefault(require("os"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const DEVICE_TYPES = new Set(['roku', 'ios', 'apple-tv', 'android', 'android-tv']);
13
+ function loadDevicesFile(options) {
14
+ var _a;
15
+ const cwd = options.cwd;
16
+ const homeDir = (_a = options.homeDir) !== null && _a !== void 0 ? _a : os_1.default.homedir();
17
+ const warnings = [];
18
+ const devicesByKey = new Map();
19
+ for (const filePath of [path_1.default.join(homeDir, '.hs-devices.json'), path_1.default.join(cwd, '.hs-devices.json')]) {
20
+ if (!fs_1.default.existsSync(filePath))
21
+ continue;
22
+ const parsed = JSON.parse(fs_1.default.readFileSync(filePath, 'utf8'));
23
+ if (!Array.isArray(parsed.devices)) {
24
+ warnings.push(`${filePath} does not contain a devices array.`);
25
+ continue;
26
+ }
27
+ for (const entry of parsed.devices) {
28
+ const device = normalizeFileEntry(entry, filePath, warnings);
29
+ if (!device)
30
+ continue;
31
+ devicesByKey.set(deviceKey(device), device);
32
+ }
33
+ }
34
+ const devices = Array.from(devicesByKey.values());
35
+ const firstDefaultByType = new Set();
36
+ for (const device of devices) {
37
+ if (!device.isDefault)
38
+ continue;
39
+ if (firstDefaultByType.has(device.type)) {
40
+ device.isDefault = false;
41
+ warnings.push(`Multiple default devices configured for type ${device.type}; using the first.`);
42
+ }
43
+ else {
44
+ firstDefaultByType.add(device.type);
45
+ }
46
+ }
47
+ return { devices, warnings };
48
+ }
49
+ function mergeDevices(discoveredDevices, fileDevices) {
50
+ var _a, _b, _c, _d, _e;
51
+ const discoveredByKey = new Map();
52
+ const matchedKeys = new Set();
53
+ for (const discovered of discoveredDevices) {
54
+ const normalized = Object.assign(Object.assign({}, discovered), { id: discovered.id || discovered.ip || discovered.name, online: (_a = discovered.online) !== null && _a !== void 0 ? _a : true, isPreferred: (_b = discovered.isPreferred) !== null && _b !== void 0 ? _b : false });
55
+ discoveredByKey.set(deviceKey(normalized), normalized);
56
+ }
57
+ const merged = [];
58
+ for (const fileDevice of fileDevices) {
59
+ const key = deviceKey(fileDevice);
60
+ const discovered = discoveredByKey.get(key);
61
+ if (discovered) {
62
+ matchedKeys.add(key);
63
+ merged.push(Object.assign(Object.assign({}, discovered), { name: fileDevice.name || discovered.name, ip: (_c = fileDevice.ip) !== null && _c !== void 0 ? _c : discovered.ip, password: fileDevice.password, isDefault: Boolean(fileDevice.isDefault), isPreferred: true, online: true, source: 'discovered', raw: discovered.raw }));
64
+ }
65
+ else {
66
+ merged.push(Object.assign(Object.assign({}, fileDevice), { online: false, isPreferred: true }));
67
+ }
68
+ }
69
+ for (const discovered of discoveredByKey.values()) {
70
+ if (matchedKeys.has(deviceKey(discovered)))
71
+ continue;
72
+ merged.push(Object.assign(Object.assign({}, discovered), { online: (_d = discovered.online) !== null && _d !== void 0 ? _d : true, isPreferred: (_e = discovered.isPreferred) !== null && _e !== void 0 ? _e : false }));
73
+ }
74
+ return merged.sort((a, b) => {
75
+ if (Boolean(a.isPreferred) !== Boolean(b.isPreferred))
76
+ return a.isPreferred ? -1 : 1;
77
+ if (Boolean(a.isDefault) !== Boolean(b.isDefault))
78
+ return a.isDefault ? -1 : 1;
79
+ return a.name.localeCompare(b.name);
80
+ });
81
+ }
82
+ function deviceKey(device) {
83
+ var _a, _b;
84
+ const id = device.type === 'roku' ? ((_a = device.ip) !== null && _a !== void 0 ? _a : device.id) : ((_b = device.id) !== null && _b !== void 0 ? _b : device.ip);
85
+ return `${device.type}:${String(id).toLowerCase()}`;
86
+ }
87
+ function normalizeFileEntry(entry, filePath, warnings) {
88
+ const type = typeof entry.type === 'string' ? entry.type : undefined;
89
+ if (!type || !DEVICE_TYPES.has(type)) {
90
+ warnings.push(`Ignoring device in ${filePath} with invalid type: ${String(entry.type)}`);
91
+ return null;
92
+ }
93
+ const ip = typeof entry.ip === 'string' && entry.ip.trim() ? entry.ip.trim() : undefined;
94
+ const id = typeof entry.id === 'string' && entry.id.trim() ? entry.id.trim() : ip;
95
+ if (!id) {
96
+ warnings.push(`Ignoring ${type} device in ${filePath} without id or ip.`);
97
+ return null;
98
+ }
99
+ const name = typeof entry.name === 'string' && entry.name.trim() ? entry.name.trim() : id;
100
+ const password = typeof entry.password === 'string' ? entry.password : undefined;
101
+ return {
102
+ type,
103
+ id,
104
+ ip,
105
+ name,
106
+ password,
107
+ source: 'devices-file',
108
+ isPreferred: true,
109
+ isDefault: entry.default === true,
110
+ };
111
+ }
112
+ //# sourceMappingURL=devices-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices-file.js","sourceRoot":"","sources":["../../src/device/devices-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface RokuSsdpResponse {
2
+ ip: string;
3
+ location: string;
4
+ usn?: string;
5
+ }
6
+ export interface RokuDeviceInfo {
7
+ name: string;
8
+ modelName?: string;
9
+ serialNumber?: string;
10
+ }
11
+ export declare function parseSsdpResponse(message: Buffer | string): RokuSsdpResponse | null;
12
+ export declare function parseRokuDeviceInfo(xml: string): RokuDeviceInfo;
13
+ export declare function discoverRokus(options?: {
14
+ timeoutMs?: number;
15
+ }): Promise<RokuSsdpResponse[]>;
16
+ export declare function fetchRokuDeviceInfo(ip: string): Promise<RokuDeviceInfo | null>;
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.parseSsdpResponse = parseSsdpResponse;
7
+ exports.parseRokuDeviceInfo = parseRokuDeviceInfo;
8
+ exports.discoverRokus = discoverRokus;
9
+ exports.fetchRokuDeviceInfo = fetchRokuDeviceInfo;
10
+ const dgram_1 = __importDefault(require("dgram"));
11
+ const http_1 = __importDefault(require("http"));
12
+ function parseSsdpResponse(message) {
13
+ var _a;
14
+ const text = Buffer.isBuffer(message) ? message.toString('utf8') : message;
15
+ const headers = new Map();
16
+ for (const line of text.split(/\r?\n/)) {
17
+ const index = line.indexOf(':');
18
+ if (index < 0)
19
+ continue;
20
+ headers.set(line.slice(0, index).trim().toLowerCase(), line.slice(index + 1).trim());
21
+ }
22
+ const st = (_a = headers.get('st')) === null || _a === void 0 ? void 0 : _a.toLowerCase();
23
+ const location = headers.get('location');
24
+ if (st !== 'roku:ecp' || !location)
25
+ return null;
26
+ try {
27
+ const url = new URL(location);
28
+ return {
29
+ ip: url.hostname,
30
+ location,
31
+ usn: headers.get('usn'),
32
+ };
33
+ }
34
+ catch (_b) {
35
+ return null;
36
+ }
37
+ }
38
+ function parseRokuDeviceInfo(xml) {
39
+ const friendlyName = readXmlTag(xml, 'friendly-device-name');
40
+ const userName = readXmlTag(xml, 'user-device-name');
41
+ const modelName = readXmlTag(xml, 'model-name');
42
+ const serialNumber = readXmlTag(xml, 'serial-number');
43
+ return {
44
+ name: friendlyName || userName || modelName || serialNumber || 'Roku',
45
+ modelName,
46
+ serialNumber,
47
+ };
48
+ }
49
+ async function discoverRokus(options = {}) {
50
+ var _a;
51
+ const timeoutMs = (_a = options.timeoutMs) !== null && _a !== void 0 ? _a : 3000;
52
+ const socket = dgram_1.default.createSocket('udp4');
53
+ const responses = new Map();
54
+ const search = [
55
+ 'M-SEARCH * HTTP/1.1',
56
+ 'HOST: 239.255.255.250:1900',
57
+ 'MAN: "ssdp:discover"',
58
+ 'MX: 3',
59
+ 'ST: roku:ecp',
60
+ '',
61
+ '',
62
+ ].join('\r\n');
63
+ return new Promise((resolve) => {
64
+ const finish = () => {
65
+ try {
66
+ socket.close();
67
+ }
68
+ catch (_a) {
69
+ // ignore close errors
70
+ }
71
+ resolve(Array.from(responses.values()));
72
+ };
73
+ socket.on('message', message => {
74
+ const parsed = parseSsdpResponse(message);
75
+ if (parsed)
76
+ responses.set(parsed.ip, parsed);
77
+ });
78
+ socket.on('error', finish);
79
+ socket.bind(() => {
80
+ socket.setBroadcast(true);
81
+ socket.send(search, 1900, '239.255.255.250');
82
+ setTimeout(finish, timeoutMs);
83
+ });
84
+ });
85
+ }
86
+ async function fetchRokuDeviceInfo(ip) {
87
+ return new Promise((resolve) => {
88
+ const request = http_1.default.get(`http://${ip}:8060/query/device-info`, response => {
89
+ let body = '';
90
+ response.setEncoding('utf8');
91
+ response.on('data', chunk => {
92
+ body += chunk;
93
+ });
94
+ response.on('end', () => {
95
+ if (response.statusCode && response.statusCode >= 200 && response.statusCode < 300) {
96
+ resolve(parseRokuDeviceInfo(body));
97
+ }
98
+ else {
99
+ resolve(null);
100
+ }
101
+ });
102
+ });
103
+ request.setTimeout(1500, () => {
104
+ request.destroy();
105
+ resolve(null);
106
+ });
107
+ request.on('error', () => resolve(null));
108
+ });
109
+ }
110
+ function readXmlTag(xml, tagName) {
111
+ var _a;
112
+ const pattern = new RegExp(`<${tagName}>([^<]*)</${tagName}>`, 'i');
113
+ const match = pattern.exec(xml);
114
+ return ((_a = match === null || match === void 0 ? void 0 : match[1]) === null || _a === void 0 ? void 0 : _a.trim()) || undefined;
115
+ }
116
+ //# sourceMappingURL=roku-ssdp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roku-ssdp.js","sourceRoot":"","sources":["../../../src/device/discovery/roku-ssdp.ts"],"names":[],"mappings":";;;;;AAeA,8CAuBC;AAED,kDAUC;AAED,sCAmCC;AAED,kDAsBC;AA/GD,kDAA0B;AAC1B,gDAAwB;AAcxB,SAAgB,iBAAiB,CAAC,OAAwB;;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC;YAAE,SAAS;QACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,EAAE,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,0CAAE,WAAW,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,EAAE,KAAK,UAAU,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,QAAQ;YAChB,QAAQ;YACR,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;SACxB,CAAC;IACJ,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB,CAAC,GAAW;IAC7C,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACtD,OAAO;QACL,IAAI,EAAE,YAAY,IAAI,QAAQ,IAAI,SAAS,IAAI,YAAY,IAAI,MAAM;QACrE,SAAS;QACT,YAAY;KACb,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,UAAkC,EAAE;;IACtE,MAAM,SAAS,GAAG,MAAA,OAAO,CAAC,SAAS,mCAAI,IAAI,CAAC;IAC5C,MAAM,MAAM,GAAG,eAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;IACtD,MAAM,MAAM,GAAG;QACb,qBAAqB;QACrB,4BAA4B;QAC5B,sBAAsB;QACtB,OAAO;QACP,cAAc;QACd,EAAE;QACF,EAAE;KACH,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,IAAI,CAAC;gBACH,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC;YAAC,WAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE;YAC7B,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,MAAM;gBAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;YAC7C,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,mBAAmB,CAAC,EAAU;IAClD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,cAAI,CAAC,GAAG,CAAC,UAAU,EAAE,yBAAyB,EAAE,QAAQ,CAAC,EAAE;YACzE,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC7B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;gBAC1B,IAAI,IAAI,KAAK,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACtB,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,IAAI,GAAG,IAAI,QAAQ,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;oBACnF,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE;YAC5B,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,OAAe;;IAC9C,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,OAAO,aAAa,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,CAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,CAAC,CAAC,0CAAE,IAAI,EAAE,KAAI,SAAS,CAAC;AACzC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Device, DeviceDriver, DeviceType, ResolveDeviceOptions } from './types.js';
2
+ export interface DriverRegistry {
3
+ getDriver(type: DeviceType): DeviceDriver;
4
+ discover(type: DeviceType, options: {
5
+ cwd: string;
6
+ env?: NodeJS.ProcessEnv | Record<string, string | undefined>;
7
+ }): Promise<Device[]>;
8
+ resolveDevice(options: ResolveDeviceOptions): Promise<Device>;
9
+ }
10
+ export declare function createDriverRegistry(drivers: DeviceDriver[]): DriverRegistry;
11
+ export declare function findDevice(devices: Device[], selector: string): Device | undefined;
12
+ export declare function formatDeviceList(devices: Device[]): string;
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createDriverRegistry = createDriverRegistry;
7
+ exports.findDevice = findDevice;
8
+ exports.formatDeviceList = formatDeviceList;
9
+ const readline_1 = __importDefault(require("readline"));
10
+ const ENV_DEVICE_KEYS = {
11
+ roku: ['ROKU_IP'],
12
+ android: ['ANDROID_SERIAL', 'HS_TARGET'],
13
+ 'android-tv': ['ANDROID_SERIAL', 'HS_TARGET'],
14
+ ios: ['HS_TARGET'],
15
+ 'apple-tv': ['HS_TARGET'],
16
+ };
17
+ function createDriverRegistry(drivers) {
18
+ const byType = new Map();
19
+ for (const driver of drivers) {
20
+ for (const type of driver.types) {
21
+ byType.set(type, driver);
22
+ }
23
+ }
24
+ function getDriver(type) {
25
+ const driver = byType.get(type);
26
+ if (!driver)
27
+ throw new Error(`No device driver registered for type ${type}.`);
28
+ return driver;
29
+ }
30
+ async function discover(type, options) {
31
+ return getDriver(type).discover({ cwd: options.cwd, env: options.env });
32
+ }
33
+ async function resolveDevice(options) {
34
+ var _a, _b, _c;
35
+ const env = (_a = options.env) !== null && _a !== void 0 ? _a : process.env;
36
+ const devices = await discover(options.type, { cwd: options.cwd, env });
37
+ const explicit = (_b = options.device) === null || _b === void 0 ? void 0 : _b.trim();
38
+ if (explicit) {
39
+ const match = findDevice(devices, explicit);
40
+ if (match)
41
+ return match;
42
+ throw new Error(`No ${options.type} device matched "${explicit}".\n${formatDeviceList(devices)}`);
43
+ }
44
+ for (const key of ENV_DEVICE_KEYS[options.type]) {
45
+ const value = (_c = env[key]) === null || _c === void 0 ? void 0 : _c.trim();
46
+ if (!value)
47
+ continue;
48
+ const match = findDevice(devices, value);
49
+ if (match)
50
+ return Object.assign(Object.assign({}, match), { source: match.source === 'discovered' ? match.source : 'env' });
51
+ return {
52
+ type: options.type,
53
+ id: value,
54
+ ip: options.type === 'roku' ? value : undefined,
55
+ name: value,
56
+ source: 'env',
57
+ online: true,
58
+ };
59
+ }
60
+ const defaultDevice = devices.find(device => device.isDefault && device.online !== false);
61
+ if (defaultDevice)
62
+ return defaultDevice;
63
+ const onlineDevices = devices.filter(device => device.online !== false);
64
+ if (onlineDevices.length === 1)
65
+ return onlineDevices[0];
66
+ if (onlineDevices.length > 1 && options.isTTY !== false && process.stdin.isTTY) {
67
+ return promptForDevice(options.type, onlineDevices);
68
+ }
69
+ if (onlineDevices.length > 1) {
70
+ throw new Error(`Multiple ${options.type} devices found. Re-run with --device <id|ip|name>.\n${formatDeviceList(devices)}`);
71
+ }
72
+ throw new Error(`No online ${options.type} devices found.\n${formatDeviceList(devices)}`);
73
+ }
74
+ return { getDriver, discover, resolveDevice };
75
+ }
76
+ function findDevice(devices, selector) {
77
+ const needle = selector.toLowerCase();
78
+ return devices.find(device => {
79
+ var _a;
80
+ return device.id.toLowerCase() === needle ||
81
+ ((_a = device.ip) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === needle ||
82
+ device.name.toLowerCase().includes(needle);
83
+ });
84
+ }
85
+ function formatDeviceList(devices) {
86
+ if (devices.length === 0)
87
+ return ' (none)';
88
+ return devices.map(device => {
89
+ const markers = `${device.isPreferred ? '★' : ' '} ${device.isDefault ? '✓' : ' '}`;
90
+ const status = device.online === false ? 'offline' : 'online';
91
+ const address = device.ip && device.ip !== device.id ? `${device.id} ${device.ip}` : device.id;
92
+ return ` ${markers} ${device.type} ${address} ${device.name} (${status})`;
93
+ }).join('\n');
94
+ }
95
+ async function promptForDevice(type, devices) {
96
+ console.info(`Select a ${type} device:`);
97
+ devices.forEach((device, index) => {
98
+ var _a;
99
+ console.info(` ${index + 1}. ${device.name} (${(_a = device.ip) !== null && _a !== void 0 ? _a : device.id})`);
100
+ });
101
+ const answer = await new Promise((resolve) => {
102
+ const rl = readline_1.default.createInterface({ input: process.stdin, output: process.stdout });
103
+ rl.question('Device number: ', value => {
104
+ rl.close();
105
+ resolve(value);
106
+ });
107
+ });
108
+ const index = Number(answer) - 1;
109
+ if (!Number.isInteger(index) || index < 0 || index >= devices.length) {
110
+ throw new Error(`Invalid ${type} device selection: ${answer}`);
111
+ }
112
+ return devices[index];
113
+ }
114
+ //# sourceMappingURL=driver-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-registry.js","sourceRoot":"","sources":["../../src/device/driver-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Device, DeviceDiscoveryOptions, DeviceDriver, DeviceRunOptions, LogStreamHandle } from '../types.js';
2
+ export interface RokuDeployOptions {
3
+ ip?: string;
4
+ installerPassword?: string;
5
+ appPackage?: string;
6
+ sourceRoot?: string;
7
+ sourceMapRoot?: string;
8
+ files?: string[];
9
+ logs?: boolean;
10
+ logOutput?: boolean;
11
+ applySourceMapToPaths?: boolean;
12
+ dotenv?: boolean;
13
+ }
14
+ export type ResolvedDeployParams = {
15
+ ip: string;
16
+ installerPassword: string;
17
+ cwd: string;
18
+ opts: RokuDeployOptions;
19
+ };
20
+ export declare function mask(val?: string): string;
21
+ export declare function formatDeployError(err: unknown): string;
22
+ export declare function performDeploy(params: ResolvedDeployParams): Promise<void>;
23
+ export declare class RokuDriver implements DeviceDriver {
24
+ readonly types: readonly ["roku"];
25
+ discover(opts: DeviceDiscoveryOptions): Promise<Device[]>;
26
+ build(_device: Device, opts: DeviceRunOptions): Promise<void>;
27
+ deploy(device: Device, opts: DeviceRunOptions): Promise<void>;
28
+ launch(_device: Device, _opts: DeviceRunOptions): Promise<void>;
29
+ streamLogs(device: Device): LogStreamHandle;
30
+ }