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

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,404 +0,0 @@
1
- import { constants } from "node:fs";
2
- import { access, mkdir, readFile } from "node:fs/promises";
3
- import { homedir } from "node:os";
4
- import { dirname, join, resolve } from "node:path";
5
- import { runCommand, tailLines } from "../process.js";
6
- import { listSerialPorts } from "./serial.js";
7
- const DEFAULT_MONITOR_ROOT = "/Users/kvell/kk-project/DBT-Agent-Project/RP2350-Monitor";
8
- const DEFAULT_TCP_HOST = "192.168.4.1";
9
- const DEFAULT_TCP_PORT = 4242;
10
- const DEFAULT_TIMEOUT_MS = 3000;
11
- const DISCOVERY_TIMEOUT_MS = 900;
12
- const DEFAULT_BAUD = 115200;
13
- export const RP2350_MONITOR_READ_ONLY_COMMANDS = new Set([
14
- "hello",
15
- "status",
16
- "pins",
17
- "channels",
18
- "buffer_status",
19
- "events_read",
20
- "logic_status",
21
- "logic_caps",
22
- "probe_caps",
23
- "probe_status",
24
- "gpio_read"
25
- ]);
26
- export const RP2350_MONITOR_CONTROL_COMMANDS = new Set([
27
- "wifi_scan",
28
- "wifi_ap",
29
- "wifi_connect",
30
- "wifi_clear",
31
- "wifi_set",
32
- "config_uart",
33
- "config_spi",
34
- "config_i2c",
35
- "config_gpio",
36
- "config_can",
37
- "start",
38
- "stop",
39
- "release",
40
- "write",
41
- "spi_xfer",
42
- "i2c_xfer",
43
- "gpio_write",
44
- "logic_config",
45
- "logic_start",
46
- "logic_stop",
47
- "logic_release",
48
- "logic_read",
49
- "probe_config",
50
- "probe_reset",
51
- "probe_dap",
52
- "uart_loopback_test"
53
- ]);
54
- export const RP2350_MONITOR_ALLOWED_COMMANDS = new Set([
55
- ...RP2350_MONITOR_READ_ONLY_COMMANDS,
56
- ...RP2350_MONITOR_CONTROL_COMMANDS
57
- ]);
58
- export function rp2350MonitorCommandNeedsApproval(command) {
59
- return !RP2350_MONITOR_READ_ONLY_COMMANDS.has(command);
60
- }
61
- export async function discoverRp2350Monitors(serialPorts) {
62
- const observedAt = new Date().toISOString();
63
- const warnings = [];
64
- const devices = [];
65
- const root = await resolveMonitorRoot();
66
- if (!root) {
67
- if (process.env.EMBED_RP2350_MONITOR_ROOT || process.env.RP2350_MONITOR_ROOT) {
68
- warnings.push({
69
- code: "rp2350_monitor_cli_not_found",
70
- message: "RP2350-Monitor host CLI was not found at the configured root.",
71
- remediation: "Set EMBED_RP2350_MONITOR_ROOT to the RP2350-Monitor project root or install the packaged RP2350 Monitor tool."
72
- });
73
- }
74
- return { devices, warnings };
75
- }
76
- const tcp = await executeRpmon(root, { transport: "tcp", host: DEFAULT_TCP_HOST, port: DEFAULT_TCP_PORT }, ["hello"], DISCOVERY_TIMEOUT_MS);
77
- if (tcp.ok) {
78
- devices.push(deviceFromHello(tcp, observedAt, {
79
- transport: "tcp",
80
- host: DEFAULT_TCP_HOST,
81
- port: DEFAULT_TCP_PORT
82
- }));
83
- }
84
- const serial = serialPorts ?? await listSerialPorts(warnings);
85
- const candidates = likelyRp2350SerialPorts(serial).slice(0, 4);
86
- for (const port of candidates) {
87
- const serialHello = await executeRpmon(root, { transport: "serial", serial_path: port.path, baud: DEFAULT_BAUD }, ["hello"], DISCOVERY_TIMEOUT_MS);
88
- if (!serialHello.ok) {
89
- continue;
90
- }
91
- devices.push(deviceFromHello(serialHello, observedAt, {
92
- transport: "serial",
93
- path: port.path
94
- }, port));
95
- }
96
- return { devices, warnings };
97
- }
98
- export async function getRp2350MonitorStatus(request) {
99
- const root = await requireMonitorRoot(request.monitor_root);
100
- const transport = await resolveTransport(root, request);
101
- const commands = request.include_caps === false
102
- ? ["hello", "status"]
103
- : ["hello", "status", "logic_caps", "probe_caps", "pins", "channels"];
104
- const results = [];
105
- for (const command of commands) {
106
- results.push(await executeRpmon(root, transport, [command], request.timeout_ms));
107
- if (!results[results.length - 1].ok && command === "hello") {
108
- break;
109
- }
110
- }
111
- const ok = results.every((result) => result.ok);
112
- return {
113
- ok,
114
- transport,
115
- commands: results,
116
- summary_for_user: ok
117
- ? "RP2350 Monitor responded to status/capability queries."
118
- : "RP2350 Monitor status query did not complete successfully.",
119
- observed_at: new Date().toISOString()
120
- };
121
- }
122
- export async function runRp2350MonitorCommand(request) {
123
- if (!RP2350_MONITOR_ALLOWED_COMMANDS.has(request.command)) {
124
- return {
125
- ok: false,
126
- error_code: "unsupported_rp2350_monitor_command",
127
- message: `Unsupported RP2350 Monitor command: ${request.command}.`
128
- };
129
- }
130
- const root = await requireMonitorRoot(request.monitor_root);
131
- const transport = await resolveTransport(root, request);
132
- return await executeRpmon(root, transport, [request.command, ...(request.args ?? [])], request.timeout_ms);
133
- }
134
- export async function captureRp2350MonitorLogic(request) {
135
- const root = await requireMonitorRoot(request.monitor_root);
136
- const transport = await resolveTransport(root, request);
137
- const outputPath = resolve(request.output_path ?? `.embed-labs/rp2350-monitor/captures/logic-${Date.now()}.jsonl`);
138
- await mkdir(dirname(outputPath), { recursive: true });
139
- const args = [
140
- "logic_capture",
141
- "--pin-base", String(request.pin_base),
142
- "--pin-count", String(request.pin_count),
143
- "--sample-rate", String(request.sample_rate ?? 1_000_000),
144
- "--samples", String(request.samples ?? 1024),
145
- "--pull", request.pull ?? "none",
146
- "--output", outputPath,
147
- "--wait-timeout", secondsArg(request.wait_timeout_ms ?? 10_000),
148
- "--read-timeout", secondsArg(request.read_timeout_ms ?? 20_000)
149
- ];
150
- pushOptionalNumber(args, "--pre-samples", request.pre_samples);
151
- pushOptionalNumber(args, "--post-samples", request.post_samples);
152
- pushOptionalNumber(args, "--search-samples", request.search_samples);
153
- pushOptionalNumber(args, "--burst-count", request.burst_count);
154
- pushOptionalNumber(args, "--trigger-pin", request.trigger_pin);
155
- if (request.trigger_mode) {
156
- args.push("--trigger-mode", request.trigger_mode);
157
- }
158
- if (request.trigger_level !== undefined) {
159
- args.push("--trigger-level", request.trigger_level ? "1" : "0");
160
- }
161
- pushOptionalNumber(args, "--trigger-mask", request.trigger_mask);
162
- pushOptionalNumber(args, "--trigger-value", request.trigger_value);
163
- for (const [gpio, name] of Object.entries(request.channel_names ?? {})) {
164
- args.push("--channel-name", `${gpio}=${name}`);
165
- }
166
- for (const [gpio, pull] of Object.entries(request.pin_pulls ?? {})) {
167
- args.push("--pin-pull", `${gpio}=${pull}`);
168
- }
169
- if (request.release !== false) {
170
- args.push("--release");
171
- }
172
- const result = await executeRpmon(root, transport, args, Math.max(request.timeout_ms ?? DEFAULT_TIMEOUT_MS, request.read_timeout_ms ?? 20_000) + 5000);
173
- return {
174
- ...result,
175
- output_path: outputPath,
176
- summary_for_user: result.ok
177
- ? `Logic capture completed and was written to ${outputPath}.`
178
- : `Logic capture failed; partial output may exist at ${outputPath}.`
179
- };
180
- }
181
- export async function decodeRp2350MonitorLogic(request) {
182
- const root = await requireMonitorRoot(request.monitor_root);
183
- const args = [
184
- "logic_decode",
185
- "--input", resolve(request.input_path),
186
- "--decoder", request.decoder ?? "summary"
187
- ];
188
- pushOptionalNumber(args, "--capture-id", request.capture_id);
189
- pushOptionalNumber(args, "--start-sample", request.start_sample);
190
- pushOptionalNumber(args, "--end-sample", request.end_sample);
191
- for (const pin of request.pins ?? []) {
192
- args.push("--pin", String(pin));
193
- }
194
- pushOptionalNumber(args, "--rx-pin", request.rx_pin);
195
- pushOptionalNumber(args, "--baud", request.baud);
196
- pushOptionalNumber(args, "--data-bits", request.data_bits);
197
- if (request.parity) {
198
- args.push("--parity", request.parity);
199
- }
200
- if (request.stop_bits !== undefined) {
201
- args.push("--stop-bits", String(request.stop_bits));
202
- }
203
- if (request.invert) {
204
- args.push("--invert");
205
- }
206
- pushOptionalNumber(args, "--sck-pin", request.sck_pin);
207
- pushOptionalNumber(args, "--mosi-pin", request.mosi_pin);
208
- pushOptionalNumber(args, "--miso-pin", request.miso_pin);
209
- pushOptionalNumber(args, "--cs-pin", request.cs_pin);
210
- pushOptionalNumber(args, "--mode", request.mode);
211
- if (request.cs_active_high) {
212
- args.push("--cs-active-high");
213
- }
214
- pushOptionalNumber(args, "--word-bits", request.word_bits);
215
- if (request.bit_order) {
216
- args.push("--bit-order", request.bit_order);
217
- }
218
- pushOptionalNumber(args, "--sda-pin", request.sda_pin);
219
- pushOptionalNumber(args, "--scl-pin", request.scl_pin);
220
- if (request.output_path) {
221
- const outputPath = resolve(request.output_path);
222
- await mkdir(dirname(outputPath), { recursive: true });
223
- args.push("--output", outputPath);
224
- }
225
- return await executeRpmon(root, undefined, args, DEFAULT_TIMEOUT_MS);
226
- }
227
- async function resolveTransport(root, request) {
228
- if (request.transport === "serial") {
229
- if (!request.serial_path) {
230
- throw new Error("serial_path is required when transport=serial.");
231
- }
232
- return { transport: "serial", serial_path: request.serial_path, baud: request.baud ?? DEFAULT_BAUD };
233
- }
234
- if (request.transport === "tcp") {
235
- return { transport: "tcp", host: request.host ?? DEFAULT_TCP_HOST, port: request.port ?? DEFAULT_TCP_PORT };
236
- }
237
- if (request.serial_path) {
238
- return { transport: "serial", serial_path: request.serial_path, baud: request.baud ?? DEFAULT_BAUD };
239
- }
240
- if (request.host || request.port) {
241
- return { transport: "tcp", host: request.host ?? DEFAULT_TCP_HOST, port: request.port ?? DEFAULT_TCP_PORT };
242
- }
243
- const tcp = { transport: "tcp", host: DEFAULT_TCP_HOST, port: DEFAULT_TCP_PORT };
244
- const tcpHello = await executeRpmon(root, tcp, ["hello"], DISCOVERY_TIMEOUT_MS);
245
- if (tcpHello.ok) {
246
- return { ...tcp, discovery: { selected_by: "default_tcp_hello" } };
247
- }
248
- const warnings = [];
249
- for (const port of likelyRp2350SerialPorts(await listSerialPorts(warnings)).slice(0, 4)) {
250
- const serial = { transport: "serial", serial_path: port.path, baud: DEFAULT_BAUD };
251
- const serialHello = await executeRpmon(root, serial, ["hello"], DISCOVERY_TIMEOUT_MS);
252
- if (serialHello.ok) {
253
- return { ...serial, discovery: { selected_by: "serial_hello", display_name: port.display_name } };
254
- }
255
- }
256
- return { ...tcp, discovery: { selected_by: "default_tcp_fallback", hello_ok: false } };
257
- }
258
- async function executeRpmon(root, transport, commandArgs, timeoutMs = DEFAULT_TIMEOUT_MS) {
259
- const cli = `${root}/tools/rpmon_cli.py`;
260
- const args = [];
261
- if (transport?.transport === "serial") {
262
- args.push("--serial", transport.serial_path ?? "", "--baud", String(transport.baud ?? DEFAULT_BAUD));
263
- }
264
- else if (transport?.transport === "tcp") {
265
- args.push("--tcp", `${transport.host ?? DEFAULT_TCP_HOST}:${transport.port ?? DEFAULT_TCP_PORT}`);
266
- }
267
- args.push("--timeout", secondsArg(timeoutMs), ...commandArgs);
268
- const result = await runCommand("python3", [cli, ...args], Math.max(timeoutMs + 1200, 1500));
269
- const stdoutJson = parseJsonLines(result.stdout);
270
- const stderrJson = parseJsonLines(result.stderr);
271
- return {
272
- ok: result.exit_code === 0 && !result.timed_out,
273
- exit_code: result.exit_code,
274
- timed_out: result.timed_out,
275
- command: [result.command, ...result.args],
276
- stdout_json: stdoutJson,
277
- stderr_json: stderrJson,
278
- stdout_tail: tailLines(result.stdout, 20),
279
- stderr_tail: tailLines(result.stderr, 20),
280
- transport,
281
- summary_for_user: summarizeRun(commandArgs[0] ?? "unknown", result.exit_code, result.timed_out, stdoutJson, stderrJson)
282
- };
283
- }
284
- async function resolveMonitorRoot(explicitRoot) {
285
- const candidates = [
286
- explicitRoot,
287
- process.env.EMBED_RP2350_MONITOR_ROOT,
288
- process.env.RP2350_MONITOR_ROOT,
289
- ...await installedRp2350MonitorRoots(),
290
- DEFAULT_MONITOR_ROOT
291
- ].filter((item) => typeof item === "string" && item.trim().length > 0);
292
- for (const candidate of candidates) {
293
- const root = resolve(candidate);
294
- try {
295
- await access(`${root}/tools/rpmon_cli.py`, constants.R_OK);
296
- return root;
297
- }
298
- catch {
299
- // Try the next configured location.
300
- }
301
- }
302
- return undefined;
303
- }
304
- async function installedRp2350MonitorRoots() {
305
- const roots = [
306
- process.env.EMBEDLABS_LOCAL_RELEASE_ROOT?.trim(),
307
- process.env.EMBEDLABS_RELEASE_ROOT?.trim(),
308
- await currentInstalledReleaseRoot()
309
- ].filter((item) => !!item);
310
- const candidates = [];
311
- for (const root of [...new Set(roots.map((item) => resolve(item)))]) {
312
- candidates.push(join(root, "toolkit-runtime", "rp2350-monitor"), join(root, "toolkit-runtime", "RP2350-Monitor"), join(root, "rp2350-monitor"), join(root, "RP2350-Monitor"));
313
- }
314
- return candidates;
315
- }
316
- async function currentInstalledReleaseRoot() {
317
- const registryPath = process.env.EMBEDLABS_LOCAL_TOOLCHAIN_REGISTRY?.trim()
318
- || join(process.env.EMBEDLABS_HOME?.trim() || join(homedir(), ".embedlabs"), "registry", "local-toolchains.json");
319
- try {
320
- const registry = JSON.parse(await readFile(registryPath, "utf8"));
321
- const releaseRoot = typeof registry.release_root === "string" ? registry.release_root.trim() : "";
322
- return releaseRoot || undefined;
323
- }
324
- catch {
325
- return undefined;
326
- }
327
- }
328
- async function requireMonitorRoot(explicitRoot) {
329
- const root = await resolveMonitorRoot(explicitRoot);
330
- if (!root) {
331
- throw new Error("RP2350-Monitor CLI was not found. Set EMBED_RP2350_MONITOR_ROOT to the project root.");
332
- }
333
- return root;
334
- }
335
- function likelyRp2350SerialPorts(ports) {
336
- return ports.filter((port) => {
337
- const text = `${port.path} ${port.display_name ?? ""} ${port.vendor_id ?? ""} ${port.product_id ?? ""}`.toLowerCase();
338
- if (process.platform === "darwin" && !port.path.includes("/dev/cu.")) {
339
- return false;
340
- }
341
- return /usbmodem|ttyacm|pico|rp2350|rp2040|raspberry|cdc/.test(text);
342
- });
343
- }
344
- function deviceFromHello(hello, observedAt, locator, serial) {
345
- const response = hello.stdout_json.find((item) => item.type === "resp" && item.cmd === "hello") ?? {};
346
- const board = stringField(response.board) || "rp2350-monitor";
347
- const version = stringField(response.version);
348
- return {
349
- device_id: `rp2350-monitor-${safeId(locator.path || `${locator.host ?? "tcp"}-${locator.port ?? DEFAULT_TCP_PORT}`)}`,
350
- board_id: "rp2350",
351
- variant_id: board,
352
- display_name: version ? `RP2350 Monitor ${board} (${version})` : `RP2350 Monitor ${board}`,
353
- status: "connected",
354
- locators: [locator],
355
- serial,
356
- observed_at: observedAt,
357
- summary_for_user: `Detected RP2350 Monitor over ${locator.transport}.`
358
- };
359
- }
360
- function parseJsonLines(text) {
361
- const docs = [];
362
- for (const line of text.split(/\r?\n/)) {
363
- const trimmed = line.trim();
364
- if (!trimmed.startsWith("{") || !trimmed.endsWith("}")) {
365
- continue;
366
- }
367
- try {
368
- const parsed = JSON.parse(trimmed);
369
- if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
370
- docs.push(parsed);
371
- }
372
- }
373
- catch {
374
- // Keep raw tails for non-JSON diagnostics.
375
- }
376
- }
377
- return docs;
378
- }
379
- function summarizeRun(command, exitCode, timedOut, stdoutJson, stderrJson) {
380
- if (timedOut) {
381
- return `RP2350 Monitor command ${command} timed out.`;
382
- }
383
- const response = stdoutJson.find((item) => item.type === "resp" && item.cmd === command);
384
- if (response?.ok === true || exitCode === 0) {
385
- return `RP2350 Monitor command ${command} completed.`;
386
- }
387
- const error = stderrJson.find((item) => typeof item.msg === "string");
388
- return `RP2350 Monitor command ${command} failed with exit code ${exitCode ?? "unknown"}${error ? `: ${error.msg}` : ""}.`;
389
- }
390
- function secondsArg(timeoutMs) {
391
- return (Math.max(100, Math.trunc(timeoutMs)) / 1000).toFixed(3);
392
- }
393
- function pushOptionalNumber(args, name, value) {
394
- if (value !== undefined) {
395
- args.push(name, String(value));
396
- }
397
- }
398
- function stringField(value) {
399
- return typeof value === "string" ? value : "";
400
- }
401
- function safeId(input) {
402
- return input.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "unknown";
403
- }
404
- //# sourceMappingURL=rp2350-monitor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rp2350-monitor.js","sourceRoot":"","sources":["../../src/adapters/rp2350-monitor.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { ErrorEnvelope, SerialPortInfo } from "@embed-labs/protocol";
2
- export declare function listSerialPorts(warnings?: ErrorEnvelope[]): Promise<SerialPortInfo[]>;
3
- export declare function captureSerial(path: string, baudRate?: number, durationSeconds?: number): Promise<unknown>;
@@ -1,133 +0,0 @@
1
- import { spawn } from "node:child_process";
2
- import { readdir, stat } from "node:fs/promises";
3
- import { join } from "node:path";
4
- import { runCommand, stripControl, tailLines } from "../process.js";
5
- export async function listSerialPorts(warnings = []) {
6
- if (process.platform === "win32") {
7
- const result = await runCommand("powershell.exe", [
8
- "-NoProfile",
9
- "-Command",
10
- "Get-CimInstance Win32_SerialPort | Select-Object DeviceID,Name,PNPDeviceID | ConvertTo-Json -Compress"
11
- ], 5000);
12
- if (result.exit_code !== 0) {
13
- warnings.push({ code: "serial_scan_failed", message: result.stderr || "Windows serial scan failed" });
14
- return [];
15
- }
16
- try {
17
- const parsed = JSON.parse(result.stdout || "[]");
18
- const rows = Array.isArray(parsed) ? parsed : parsed ? [parsed] : [];
19
- return rows.map((row) => {
20
- const item = row;
21
- return {
22
- path: String(item.DeviceID ?? ""),
23
- display_name: String(item.Name ?? item.DeviceID ?? ""),
24
- serial_number: String(item.PNPDeviceID ?? ""),
25
- available: Boolean(item.DeviceID)
26
- };
27
- }).filter((item) => item.path);
28
- }
29
- catch {
30
- warnings.push({ code: "serial_scan_parse_failed", message: "Windows serial scan returned invalid JSON" });
31
- return [];
32
- }
33
- }
34
- const root = "/dev";
35
- let entries = [];
36
- try {
37
- entries = await readdir(root);
38
- }
39
- catch (error) {
40
- warnings.push({ code: "serial_scan_failed", message: String(error) });
41
- return [];
42
- }
43
- const patterns = process.platform === "darwin"
44
- ? [/^cu\./, /^tty\./]
45
- : [/^ttyUSB/, /^ttyACM/, /^ttyAMA/, /^ttyS/, /^serial/];
46
- return entries
47
- .filter((entry) => patterns.some((pattern) => pattern.test(entry)))
48
- .map((entry) => ({
49
- path: join(root, entry),
50
- display_name: entry,
51
- available: true
52
- }));
53
- }
54
- export async function captureSerial(path, baudRate = 115200, durationSeconds = 5) {
55
- if (process.platform === "win32") {
56
- return {
57
- ok: false,
58
- error: {
59
- code: "serial_capture_not_implemented",
60
- message: "Serial capture without an external serial library is not implemented on Windows yet.",
61
- remediation: "Use serial list for detection; install the future native bridge helper for Windows capture."
62
- }
63
- };
64
- }
65
- try {
66
- await stat(path);
67
- }
68
- catch {
69
- return {
70
- ok: false,
71
- error: {
72
- code: "serial_port_not_found",
73
- message: `Serial port ${path} does not exist.`,
74
- retryable: true
75
- }
76
- };
77
- }
78
- const sttyArgs = process.platform === "darwin"
79
- ? ["-f", path, String(baudRate), "raw", "-echo"]
80
- : ["-F", path, String(baudRate), "raw", "-echo"];
81
- const stty = await runCommand("stty", sttyArgs, 3000);
82
- if (stty.exit_code !== 0) {
83
- return {
84
- ok: false,
85
- error: {
86
- code: "serial_config_failed",
87
- message: stty.stderr || `Failed to configure ${path}.`,
88
- retryable: true
89
- }
90
- };
91
- }
92
- return new Promise((resolve) => {
93
- const child = spawn("cat", [path], { stdio: ["ignore", "pipe", "pipe"] });
94
- let stdout = "";
95
- let stderr = "";
96
- const timer = setTimeout(() => {
97
- child.kill("SIGTERM");
98
- setTimeout(() => child.kill("SIGKILL"), 1000).unref();
99
- }, Math.max(1, Math.min(durationSeconds, 60)) * 1000);
100
- child.stdout.on("data", (chunk) => {
101
- stdout += chunk.toString("utf8");
102
- });
103
- child.stderr.on("data", (chunk) => {
104
- stderr += chunk.toString("utf8");
105
- });
106
- child.on("error", (error) => {
107
- clearTimeout(timer);
108
- resolve({
109
- ok: false,
110
- error: {
111
- code: "serial_capture_failed",
112
- message: error.message,
113
- retryable: true
114
- }
115
- });
116
- });
117
- child.on("close", (code) => {
118
- clearTimeout(timer);
119
- const cleanOutput = stripControl(stdout);
120
- const cleanError = stripControl(stderr);
121
- resolve({
122
- ok: code === 0 || code === null,
123
- path,
124
- baud_rate: baudRate,
125
- duration_seconds: durationSeconds,
126
- stdout: cleanOutput,
127
- stderr: cleanError,
128
- output_tail: tailLines(`${cleanOutput}\n${cleanError}`)
129
- });
130
- });
131
- });
132
- }
133
- //# sourceMappingURL=serial.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serial.js","sourceRoot":"","sources":["../../src/adapters/serial.ts"],"names":[],"mappings":"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"}