@kvell007/embed-labs-local-bridge 0.1.0-alpha.21 → 0.1.0-alpha.22

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 +16 -11
  2. package/dist/index.d.ts +2 -1
  3. package/dist/index.js +125 -4
  4. package/package.json +8 -4
  5. package/dist/adapters/debug.d.ts +0 -2
  6. package/dist/adapters/debug.js +0 -124
  7. package/dist/adapters/debug.js.map +0 -1
  8. package/dist/adapters/deploy.d.ts +0 -5
  9. package/dist/adapters/deploy.js +0 -132
  10. package/dist/adapters/deploy.js.map +0 -1
  11. package/dist/adapters/flash.d.ts +0 -3
  12. package/dist/adapters/flash.js +0 -169
  13. package/dist/adapters/flash.js.map +0 -1
  14. package/dist/adapters/logo.d.ts +0 -2
  15. package/dist/adapters/logo.js +0 -108
  16. package/dist/adapters/logo.js.map +0 -1
  17. package/dist/adapters/network.d.ts +0 -22
  18. package/dist/adapters/network.js +0 -64
  19. package/dist/adapters/network.js.map +0 -1
  20. package/dist/adapters/rp2350-monitor.d.ts +0 -121
  21. package/dist/adapters/rp2350-monitor.js +0 -404
  22. package/dist/adapters/rp2350-monitor.js.map +0 -1
  23. package/dist/adapters/serial.d.ts +0 -3
  24. package/dist/adapters/serial.js +0 -133
  25. package/dist/adapters/serial.js.map +0 -1
  26. package/dist/adapters/taishanpi-live.d.ts +0 -163
  27. package/dist/adapters/taishanpi-live.js +0 -349
  28. package/dist/adapters/taishanpi-live.js.map +0 -1
  29. package/dist/adapters/uf2.d.ts +0 -1
  30. package/dist/adapters/uf2.js +0 -53
  31. package/dist/adapters/uf2.js.map +0 -1
  32. package/dist/adapters/usb.d.ts +0 -3
  33. package/dist/adapters/usb.js +0 -102
  34. package/dist/adapters/usb.js.map +0 -1
  35. package/dist/hardware.d.ts +0 -19
  36. package/dist/hardware.js +0 -417
  37. package/dist/hardware.js.map +0 -1
  38. package/dist/index.js.map +0 -1
  39. package/dist/jobs.d.ts +0 -4
  40. package/dist/jobs.js +0 -125
  41. package/dist/jobs.js.map +0 -1
  42. package/dist/process.d.ts +0 -13
  43. package/dist/process.js +0 -128
  44. package/dist/process.js.map +0 -1
  45. package/dist/server.d.ts +0 -7
  46. package/dist/server.js +0 -399
  47. package/dist/server.js.map +0 -1
  48. package/dist/tools.d.ts +0 -3
  49. package/dist/tools.js +0 -1254
  50. package/dist/tools.js.map +0 -1
@@ -1,102 +0,0 @@
1
- import { commandExists, runCommand } from "../process.js";
2
- export async function scanUsbDevices(warnings = []) {
3
- if (process.platform === "darwin") {
4
- const result = await runCommand("system_profiler", ["SPUSBDataType", "-json"], 12_000);
5
- if (result.exit_code !== 0) {
6
- warnings.push({ code: "usb_scan_failed", message: result.stderr || "macOS USB scan failed" });
7
- return [];
8
- }
9
- try {
10
- const parsed = JSON.parse(result.stdout);
11
- return flattenMacUsb(parsed);
12
- }
13
- catch {
14
- warnings.push({ code: "usb_scan_parse_failed", message: "macOS USB scan returned invalid JSON" });
15
- return [];
16
- }
17
- }
18
- if (process.platform === "linux" && await commandExists("lsusb")) {
19
- const result = await runCommand("lsusb", [], 5000);
20
- if (result.exit_code !== 0) {
21
- warnings.push({ code: "usb_scan_failed", message: result.stderr || "lsusb failed" });
22
- return [];
23
- }
24
- return result.stdout.split(/\r?\n/).filter(Boolean).map((line) => {
25
- const match = line.match(/ID\s+([0-9a-fA-F]{4}):([0-9a-fA-F]{4})\s+(.+)/);
26
- return {
27
- vendor_id: match?.[1],
28
- product_id: match?.[2],
29
- product_name: match?.[3] ?? line,
30
- raw: { line }
31
- };
32
- });
33
- }
34
- if (process.platform === "win32") {
35
- const result = await runCommand("powershell.exe", [
36
- "-NoProfile",
37
- "-Command",
38
- "Get-PnpDevice -PresentOnly | Where-Object {$_.InstanceId -like 'USB*'} | Select-Object FriendlyName,InstanceId | ConvertTo-Json -Compress"
39
- ], 8000);
40
- if (result.exit_code !== 0) {
41
- warnings.push({ code: "usb_scan_failed", message: result.stderr || "Windows USB scan failed" });
42
- return [];
43
- }
44
- try {
45
- const parsed = JSON.parse(result.stdout || "[]");
46
- const rows = Array.isArray(parsed) ? parsed : parsed ? [parsed] : [];
47
- return rows.map((row) => {
48
- const item = row;
49
- return {
50
- product_name: String(item.FriendlyName ?? ""),
51
- location_id: String(item.InstanceId ?? ""),
52
- raw: item
53
- };
54
- }).filter((item) => item.product_name || item.location_id);
55
- }
56
- catch {
57
- warnings.push({ code: "usb_scan_parse_failed", message: "Windows USB scan returned invalid JSON" });
58
- return [];
59
- }
60
- }
61
- warnings.push({ code: "usb_scan_unsupported", message: `USB scan is not implemented for ${process.platform}` });
62
- return [];
63
- }
64
- export function isRockchipUsb(item) {
65
- const text = `${item.vendor_id ?? ""} ${item.product_id ?? ""} ${item.product_name ?? ""}`.toLowerCase();
66
- return text.includes("2207") || text.includes("rockchip") || text.includes("maskrom") || text.includes("loader");
67
- }
68
- function flattenMacUsb(parsed) {
69
- const roots = Array.isArray(parsed.SPUSBDataType) ? parsed.SPUSBDataType : [];
70
- const result = [];
71
- const visit = (node) => {
72
- const name = String(node._name ?? node.name ?? "");
73
- if (name) {
74
- result.push({
75
- product_name: name,
76
- vendor_id: normalizeHex(node.vendor_id),
77
- product_id: normalizeHex(node.product_id),
78
- serial_number: typeof node.serial_num === "string" ? node.serial_num : undefined,
79
- location_id: typeof node.location_id === "string" ? node.location_id : undefined,
80
- raw: node
81
- });
82
- }
83
- const children = node._items;
84
- if (Array.isArray(children)) {
85
- for (const child of children) {
86
- if (child && typeof child === "object") {
87
- visit(child);
88
- }
89
- }
90
- }
91
- };
92
- roots.forEach(visit);
93
- return result;
94
- }
95
- function normalizeHex(value) {
96
- if (typeof value !== "string") {
97
- return undefined;
98
- }
99
- const match = value.match(/0x([0-9a-fA-F]+)/);
100
- return match?.[1]?.toLowerCase() ?? value.toLowerCase();
101
- }
102
- //# sourceMappingURL=usb.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"usb.js","sourceRoot":"","sources":["../../src/adapters/usb.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- import type { BoardDeployRequest, BoardDeployResult, DeviceProbeRequest, DeviceProbeResult, DeviceScanResult, ErrorEnvelope } from "@embed-labs/protocol";
2
- export { buildFlashPlan, executeRp2350Uf2Flash } from "./adapters/flash.js";
3
- export { scanDebugTools } from "./adapters/debug.js";
4
- export { captureRp2350MonitorLogic, decodeRp2350MonitorLogic, getRp2350MonitorStatus, rp2350MonitorCommandNeedsApproval, runRp2350MonitorCommand } from "./adapters/rp2350-monitor.js";
5
- export { captureSerial, listSerialPorts } from "./adapters/serial.js";
6
- export { runBoundedSsh } from "./adapters/network.js";
7
- export { scanUsbDevices } from "./adapters/usb.js";
8
- export { getTaishanPiQmlRuntimeStatus, readTaishanPiCpuFrequency, readTaishanPiTemperature, scanTaishanPiBluetoothDevices, scanTaishanPiWifiNetworks, startTaishanPiQmlRuntime } from "./adapters/taishanpi-live.js";
9
- export declare function scanHardware(): Promise<DeviceScanResult>;
10
- export declare function probeDevices(request: DeviceProbeRequest): Promise<DeviceProbeResult>;
11
- export declare function deployTaishanPiApplication(request: BoardDeployRequest): Promise<BoardDeployResult | {
12
- ok: false;
13
- error: ErrorEnvelope;
14
- }>;
15
- export declare function validateTaishanPiDeployRequest(input: unknown): {
16
- request: BoardDeployRequest;
17
- } | {
18
- error: string;
19
- };
package/dist/hardware.js DELETED
@@ -1,417 +0,0 @@
1
- import { constants } from "node:fs";
2
- import { access, stat } from "node:fs/promises";
3
- import { basename } from "node:path";
4
- import { deployTaishanPiArtifact } from "./adapters/deploy.js";
5
- import { probeTcp, probeTcpWithEvidence } from "./adapters/network.js";
6
- import { discoverRp2350Monitors } from "./adapters/rp2350-monitor.js";
7
- import { listSerialPorts } from "./adapters/serial.js";
8
- import { findUf2Volumes } from "./adapters/uf2.js";
9
- import { isRockchipUsb, scanUsbDevices } from "./adapters/usb.js";
10
- import { runCommand } from "./process.js";
11
- export { buildFlashPlan, executeRp2350Uf2Flash } from "./adapters/flash.js";
12
- export { scanDebugTools } from "./adapters/debug.js";
13
- export { captureRp2350MonitorLogic, decodeRp2350MonitorLogic, getRp2350MonitorStatus, rp2350MonitorCommandNeedsApproval, runRp2350MonitorCommand } from "./adapters/rp2350-monitor.js";
14
- export { captureSerial, listSerialPorts } from "./adapters/serial.js";
15
- export { runBoundedSsh } from "./adapters/network.js";
16
- export { scanUsbDevices } from "./adapters/usb.js";
17
- export { getTaishanPiQmlRuntimeStatus, readTaishanPiCpuFrequency, readTaishanPiTemperature, scanTaishanPiBluetoothDevices, scanTaishanPiWifiNetworks, startTaishanPiQmlRuntime } from "./adapters/taishanpi-live.js";
18
- const TAISHANPI_DEFAULT_HOST = "198.19.77.2";
19
- const DEFAULT_PROBE_TIMEOUT_MS = 1000;
20
- const MIN_PROBE_TIMEOUT_MS = 100;
21
- const MAX_PROBE_TIMEOUT_MS = 5000;
22
- const MAX_PROBE_PORTS = 16;
23
- const MAX_SERIAL_PATHS = 16;
24
- const DEFAULT_TAISHANPI_REMOTE_DIR = "/userdata/embed-labs/apps";
25
- const SAFE_REMOTE_DEPLOY_PREFIXES = [`${DEFAULT_TAISHANPI_REMOTE_DIR}/`, "/tmp/embed-labs/"];
26
- export async function scanHardware() {
27
- const observedAt = new Date().toISOString();
28
- const warnings = [];
29
- const usb = await scanUsbDevices(warnings);
30
- const serial = await listSerialPorts(warnings);
31
- const devices = [];
32
- const rp2350Monitor = await discoverRp2350Monitors(serial);
33
- devices.push(...rp2350Monitor.devices);
34
- warnings.push(...rp2350Monitor.warnings);
35
- for (const volumePath of await findUf2Volumes()) {
36
- devices.push({
37
- device_id: `rp2350-uf2-${safeId(basename(volumePath))}`,
38
- board_id: "rp2350",
39
- display_name: `RP2350 UF2 boot volume (${basename(volumePath)})`,
40
- status: "bootloader",
41
- locators: [{ transport: "uf2-volume", volume_path: volumePath }],
42
- observed_at: observedAt,
43
- summary_for_user: `Detected RP2350-compatible UF2 boot volume at ${volumePath}.`
44
- });
45
- }
46
- const taishanPiUsb = usb.find((item) => isRockchipUsb(item));
47
- if (taishanPiUsb) {
48
- const mode = /maskrom/i.test(taishanPiUsb.product_name ?? "")
49
- ? "bootloader"
50
- : /loader|rockchip/i.test(taishanPiUsb.product_name ?? "")
51
- ? "bootloader"
52
- : "unknown";
53
- devices.push({
54
- device_id: `taishanpi-rockusb-${safeId(taishanPiUsb.serial_number ?? taishanPiUsb.location_id ?? "device")}`,
55
- board_id: "taishanpi",
56
- display_name: taishanPiUsb.product_name ?? "TaishanPi Rockchip USB device",
57
- status: mode,
58
- locators: [{ transport: "rockusb" }],
59
- usb: taishanPiUsb,
60
- observed_at: observedAt,
61
- summary_for_user: "Detected a Rockchip USB device that may be TaishanPi Loader/Maskrom."
62
- });
63
- }
64
- const taishanRoute = await verifyTaishanPiUsbEcmRoute(TAISHANPI_DEFAULT_HOST);
65
- const taishanRuntime = taishanRoute.ok ? await probeTcp(TAISHANPI_DEFAULT_HOST, 22, 800) : false;
66
- const taishanControl = taishanRoute.ok ? await probeTcp(TAISHANPI_DEFAULT_HOST, 15301, 800) : false;
67
- if (taishanRoute.ok && (taishanRuntime || taishanControl)) {
68
- const evidence = [{
69
- evidence_id: `evidence_${Date.now()}_taishanpi_tcp`,
70
- board_id: "taishanpi",
71
- method: "probe",
72
- summary: `USB ECM probe host=${TAISHANPI_DEFAULT_HOST} route=${taishanRoute.summary} ssh=${taishanRuntime} control=${taishanControl}`,
73
- observed_at: observedAt,
74
- verdict: taishanRuntime || taishanControl ? "pass" : "inconclusive"
75
- }];
76
- devices.push({
77
- device_id: `taishanpi-usbecm-${TAISHANPI_DEFAULT_HOST.replace(/\./g, "")}`,
78
- board_id: "taishanpi",
79
- display_name: "TaishanPi USB ECM runtime",
80
- status: "connected",
81
- locators: [
82
- { transport: "usbecm", host: TAISHANPI_DEFAULT_HOST },
83
- { transport: "ssh", host: TAISHANPI_DEFAULT_HOST, port: 22 }
84
- ],
85
- observed_at: observedAt,
86
- summary_for_user: `Detected TaishanPi runtime link at ${TAISHANPI_DEFAULT_HOST}.`,
87
- evidence
88
- });
89
- }
90
- else if (!taishanRoute.ok) {
91
- warnings.push({
92
- code: "taishanpi_usbecm_route_not_local",
93
- message: `Ignored default TaishanPi host ${TAISHANPI_DEFAULT_HOST} because the route does not look like a local USB ECM link.`,
94
- remediation: "Connect the board USB ECM interface, or run an explicit probe/deploy command with the intended host.",
95
- details: taishanRoute.details
96
- });
97
- }
98
- for (const port of serial) {
99
- devices.push({
100
- device_id: `serial-${safeId(port.path)}`,
101
- display_name: port.display_name ?? `Serial port ${port.path}`,
102
- status: port.available ? "connected" : "not_ready",
103
- locators: [{ transport: "serial", path: port.path }],
104
- serial: port,
105
- observed_at: observedAt,
106
- summary_for_user: `Detected serial port ${port.path}.`
107
- });
108
- }
109
- return { devices, usb, serial, observed_at: observedAt, warnings };
110
- }
111
- async function verifyTaishanPiUsbEcmRoute(host) {
112
- if (process.platform === "darwin") {
113
- return await verifyTaishanPiUsbEcmRouteDarwin(host);
114
- }
115
- if (process.platform === "linux") {
116
- return await verifyTaishanPiUsbEcmRouteLinux(host);
117
- }
118
- return {
119
- ok: false,
120
- summary: `route check unsupported on ${process.platform}`,
121
- details: {
122
- platform: process.platform,
123
- host,
124
- reason: "unsupported_platform"
125
- }
126
- };
127
- }
128
- async function verifyTaishanPiUsbEcmRouteDarwin(host) {
129
- const route = await runCommand("route", ["-n", "get", host], 2000);
130
- const routeText = `${route.stdout}\n${route.stderr}`;
131
- if (route.exit_code !== 0) {
132
- return {
133
- ok: false,
134
- summary: "route lookup failed",
135
- details: { platform: "darwin", host, route_exit_code: route.exit_code, route_output: routeText.trim() }
136
- };
137
- }
138
- const iface = routeValue(route.stdout, "interface");
139
- const gateway = routeValue(route.stdout, "gateway");
140
- if (!iface) {
141
- return {
142
- ok: false,
143
- summary: "route interface missing",
144
- details: { platform: "darwin", host, gateway, route_output: route.stdout.trim() }
145
- };
146
- }
147
- if (isTunnelInterface(iface)) {
148
- return {
149
- ok: false,
150
- summary: `route uses tunnel interface ${iface}`,
151
- details: { platform: "darwin", host, interface: iface, gateway, route_output: route.stdout.trim() }
152
- };
153
- }
154
- const ifaceInfo = await runCommand("ifconfig", [iface], 2000);
155
- const hasUsbEcmAddress = /\binet\s+198\.19\.77\.1\b/.test(ifaceInfo.stdout);
156
- return {
157
- ok: hasUsbEcmAddress,
158
- summary: hasUsbEcmAddress ? `${iface} has 198.19.77.1/30` : `${iface} does not have 198.19.77.1`,
159
- details: {
160
- platform: "darwin",
161
- host,
162
- interface: iface,
163
- gateway,
164
- ifconfig_exit_code: ifaceInfo.exit_code,
165
- route_output: route.stdout.trim(),
166
- ifconfig_excerpt: ifaceInfo.stdout.split(/\r?\n/).slice(0, 8).join("\n")
167
- }
168
- };
169
- }
170
- async function verifyTaishanPiUsbEcmRouteLinux(host) {
171
- const route = await runCommand("ip", ["-4", "route", "get", host], 2000);
172
- const routeText = `${route.stdout}\n${route.stderr}`;
173
- if (route.exit_code !== 0) {
174
- return {
175
- ok: false,
176
- summary: "route lookup failed",
177
- details: { platform: "linux", host, route_exit_code: route.exit_code, route_output: routeText.trim() }
178
- };
179
- }
180
- const iface = route.stdout.match(/\bdev\s+(\S+)/)?.[1];
181
- const source = route.stdout.match(/\bsrc\s+(\S+)/)?.[1];
182
- if (!iface || isTunnelInterface(iface)) {
183
- return {
184
- ok: false,
185
- summary: iface ? `route uses tunnel interface ${iface}` : "route interface missing",
186
- details: { platform: "linux", host, interface: iface, source, route_output: route.stdout.trim() }
187
- };
188
- }
189
- return {
190
- ok: source === "198.19.77.1",
191
- summary: source === "198.19.77.1" ? `${iface} src=${source}` : `${iface} src=${source ?? "unknown"}`,
192
- details: { platform: "linux", host, interface: iface, source, route_output: route.stdout.trim() }
193
- };
194
- }
195
- function routeValue(output, key) {
196
- const match = new RegExp(`^\\s*${key}:\\s*(\\S+)`, "m").exec(output);
197
- return match?.[1];
198
- }
199
- function isTunnelInterface(name) {
200
- return /^(utun|tun|tap|wg|tailscale|zt|ppp|lo)/i.test(name);
201
- }
202
- export async function probeDevices(request) {
203
- const observedAt = new Date().toISOString();
204
- const timeoutMs = clampProbeTimeout(request.timeout_ms);
205
- const warnings = buildProbeWarnings(request);
206
- const host = request.host?.trim();
207
- const ports = normalizeProbePorts(request.ports ?? []);
208
- const serialPaths = normalizeSerialPaths(request.serial_paths ?? []);
209
- const knownSerialPorts = process.platform === "win32" && serialPaths.length > 0
210
- ? await listSerialPorts(warnings)
211
- : undefined;
212
- const [tcp, serialPathResults] = await Promise.all([
213
- host
214
- ? Promise.all(ports.map((port) => probeTcpWithEvidence(host, port, timeoutMs, observedAt)))
215
- : Promise.resolve([]),
216
- Promise.all(serialPaths.map((path) => probeSerialPath(path, observedAt, knownSerialPorts)))
217
- ]);
218
- const reachablePorts = tcp.filter((item) => item.reachable).length;
219
- const existingSerialPaths = serialPathResults.filter((item) => item.exists).length;
220
- return {
221
- observed_at: observedAt,
222
- timeout_ms: timeoutMs,
223
- tcp,
224
- serial_paths: serialPathResults,
225
- summary_for_user: `Probe finished: ${reachablePorts}/${tcp.length} TCP ports reachable, ${existingSerialPaths}/${serialPathResults.length} serial paths exist.`,
226
- warnings: warnings.length > 0 ? warnings : undefined
227
- };
228
- }
229
- export async function deployTaishanPiApplication(request) {
230
- return await deployTaishanPiArtifact(request);
231
- }
232
- export function validateTaishanPiDeployRequest(input) {
233
- if (!input || typeof input !== "object" || Array.isArray(input)) {
234
- return { error: "Request body must be a JSON object." };
235
- }
236
- const request = input;
237
- const unknownFields = Object.keys(request).filter((field) => ![
238
- "board_id",
239
- "host",
240
- "user",
241
- "artifact_path",
242
- "remote_path",
243
- "run",
244
- "timeout_seconds",
245
- "approved"
246
- ].includes(field));
247
- if (unknownFields.length > 0) {
248
- return { error: `Unsupported field(s): ${unknownFields.join(", ")}.` };
249
- }
250
- if (request.board_id !== undefined && request.board_id !== "taishanpi") {
251
- return { error: "board_id must be taishanpi when provided." };
252
- }
253
- if (typeof request.host !== "string" || !isValidDeployHost(request.host.trim())) {
254
- return { error: "host must be a hostname or IP address without schemes, paths, spaces, or credentials." };
255
- }
256
- if (request.user !== undefined && (typeof request.user !== "string" || !/^[a-z_][a-z0-9_-]{0,31}$/i.test(request.user.trim()))) {
257
- return { error: "user must be a safe SSH user name when provided." };
258
- }
259
- if (typeof request.artifact_path !== "string" || !request.artifact_path.trim()) {
260
- return { error: "artifact_path is required." };
261
- }
262
- if (request.remote_path !== undefined && (typeof request.remote_path !== "string" || !isSafeRemoteDeployPath(request.remote_path.trim()))) {
263
- return { error: `remote_path must be under ${SAFE_REMOTE_DEPLOY_PREFIXES.join(" or ")} and contain only safe path characters.` };
264
- }
265
- if (request.run !== undefined && typeof request.run !== "boolean") {
266
- return { error: "run must be a boolean when provided." };
267
- }
268
- if (request.timeout_seconds !== undefined && (typeof request.timeout_seconds !== "number" || !Number.isFinite(request.timeout_seconds) || request.timeout_seconds <= 0)) {
269
- return { error: "timeout_seconds must be a positive number when provided." };
270
- }
271
- if (request.approved !== undefined && typeof request.approved !== "boolean") {
272
- return { error: "approved must be a boolean when provided." };
273
- }
274
- return {
275
- request: {
276
- board_id: "taishanpi",
277
- host: request.host.trim(),
278
- user: typeof request.user === "string" ? request.user.trim() : undefined,
279
- artifact_path: request.artifact_path.trim(),
280
- remote_path: typeof request.remote_path === "string" ? request.remote_path.trim() : undefined,
281
- run: typeof request.run === "boolean" ? request.run : undefined,
282
- timeout_seconds: typeof request.timeout_seconds === "number" ? request.timeout_seconds : undefined,
283
- approved: typeof request.approved === "boolean" ? request.approved : undefined
284
- }
285
- };
286
- }
287
- async function probeSerialPath(path, observedAt, knownSerialPorts) {
288
- const knownPort = knownSerialPorts?.find((port) => port.path.toLowerCase() === path.toLowerCase());
289
- if (knownPort) {
290
- return {
291
- transport: "serial-path",
292
- path,
293
- exists: true,
294
- path_type: "unknown",
295
- readable: knownPort.available,
296
- writable: knownPort.available,
297
- observed_at: observedAt
298
- };
299
- }
300
- try {
301
- const pathStat = await stat(path);
302
- const [readable, writable] = await Promise.all([
303
- canAccess(path, constants.R_OK),
304
- canAccess(path, constants.W_OK)
305
- ]);
306
- return {
307
- transport: "serial-path",
308
- path,
309
- exists: true,
310
- path_type: pathStat.isCharacterDevice()
311
- ? "character_device"
312
- : pathStat.isFile()
313
- ? "file"
314
- : pathStat.isDirectory()
315
- ? "directory"
316
- : "other",
317
- readable,
318
- writable,
319
- observed_at: observedAt
320
- };
321
- }
322
- catch (error) {
323
- const typed = error;
324
- return {
325
- transport: "serial-path",
326
- path,
327
- exists: false,
328
- path_type: "unknown",
329
- observed_at: observedAt,
330
- error_code: typed.code,
331
- error_message: typed.message
332
- };
333
- }
334
- }
335
- async function canAccess(path, mode) {
336
- try {
337
- await access(path, mode);
338
- return true;
339
- }
340
- catch {
341
- return false;
342
- }
343
- }
344
- function clampProbeTimeout(timeoutMs) {
345
- const timeout = Number.isFinite(timeoutMs) ? Number(timeoutMs) : DEFAULT_PROBE_TIMEOUT_MS;
346
- return Math.max(MIN_PROBE_TIMEOUT_MS, Math.min(Math.trunc(timeout), MAX_PROBE_TIMEOUT_MS));
347
- }
348
- function normalizeProbePorts(ports) {
349
- const normalized = ports
350
- .map((port) => Math.trunc(Number(port)))
351
- .filter((port) => Number.isInteger(port) && port > 0 && port <= 65_535);
352
- return [...new Set(normalized)].slice(0, MAX_PROBE_PORTS);
353
- }
354
- function normalizeSerialPaths(paths) {
355
- const normalized = paths
356
- .map((path) => path.trim())
357
- .filter(Boolean);
358
- return [...new Set(normalized)].slice(0, MAX_SERIAL_PATHS);
359
- }
360
- function buildProbeWarnings(request) {
361
- const warnings = [];
362
- if (request.host && (request.ports?.length ?? 0) === 0) {
363
- warnings.push({
364
- code: "probe_host_without_ports",
365
- message: "Host was provided without TCP ports, so no TCP probe was performed."
366
- });
367
- }
368
- if (request.timeout_ms !== undefined && (request.timeout_ms < MIN_PROBE_TIMEOUT_MS || request.timeout_ms > MAX_PROBE_TIMEOUT_MS)) {
369
- warnings.push({
370
- code: "probe_timeout_clamped",
371
- message: `Probe timeout was clamped to ${MIN_PROBE_TIMEOUT_MS}-${MAX_PROBE_TIMEOUT_MS}ms.`
372
- });
373
- }
374
- if (countUniqueProbePorts(request.ports ?? []) > MAX_PROBE_PORTS) {
375
- warnings.push({
376
- code: "probe_ports_truncated",
377
- message: `Only the first ${MAX_PROBE_PORTS} unique valid ports were probed.`
378
- });
379
- }
380
- if (countUniqueSerialPaths(request.serial_paths ?? []) > MAX_SERIAL_PATHS) {
381
- warnings.push({
382
- code: "probe_serial_paths_truncated",
383
- message: `Only the first ${MAX_SERIAL_PATHS} unique serial paths were probed.`
384
- });
385
- }
386
- return warnings;
387
- }
388
- function countUniqueProbePorts(ports) {
389
- return new Set(ports
390
- .map((port) => Math.trunc(Number(port)))
391
- .filter((port) => Number.isInteger(port) && port > 0 && port <= 65_535)).size;
392
- }
393
- function countUniqueSerialPaths(paths) {
394
- return new Set(paths.map((path) => path.trim()).filter(Boolean)).size;
395
- }
396
- function safeId(input) {
397
- return input.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "unknown";
398
- }
399
- function isValidDeployHost(host) {
400
- if (!host || host.length > 253 || /[\s\x00-\x1f\x7f]/.test(host)) {
401
- return false;
402
- }
403
- if (host.includes("://") || host.includes("/") || host.includes("\\") || host.includes("@")) {
404
- return false;
405
- }
406
- return /^[a-zA-Z0-9.-]+$/.test(host);
407
- }
408
- function isSafeRemoteDeployPath(remotePath) {
409
- if (!SAFE_REMOTE_DEPLOY_PREFIXES.some((prefix) => remotePath.startsWith(prefix))) {
410
- return false;
411
- }
412
- if (remotePath.includes("..") || /[\s\x00-\x1f\x7f'"`$;&|<>()[\]{}]/.test(remotePath)) {
413
- return false;
414
- }
415
- return /^\/[A-Za-z0-9._/-]+$/.test(remotePath) && !remotePath.endsWith("/");
416
- }
417
- //# sourceMappingURL=hardware.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hardware.js","sourceRoot":"","sources":["../src/hardware.ts"],"names":[],"mappings":"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"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,IAAI,WAAW,EAAE,EAAE,CAAC;IAClB,WAAW,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/dist/jobs.d.ts DELETED
@@ -1,4 +0,0 @@
1
- import type { BridgeJob, FlashRunRequest } from "@embed-labs/protocol";
2
- export declare function listJobs(): BridgeJob[];
3
- export declare function getJob(localJobId: string): BridgeJob | undefined;
4
- export declare function startFlashJob(request: FlashRunRequest): Promise<BridgeJob>;