@kvell007/embed-labs-local-bridge 0.1.0-alpha.10 → 0.1.0-alpha.11

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.
@@ -0,0 +1,121 @@
1
+ import type { DeviceSummary, ErrorEnvelope, SerialPortInfo } from "@embed-labs/protocol";
2
+ export declare const RP2350_MONITOR_READ_ONLY_COMMANDS: Set<string>;
3
+ export declare const RP2350_MONITOR_CONTROL_COMMANDS: Set<string>;
4
+ export declare const RP2350_MONITOR_ALLOWED_COMMANDS: Set<string>;
5
+ export interface Rp2350MonitorBaseRequest {
6
+ transport?: "auto" | "serial" | "tcp";
7
+ serial_path?: string;
8
+ host?: string;
9
+ port?: number;
10
+ baud?: number;
11
+ timeout_ms?: number;
12
+ monitor_root?: string;
13
+ }
14
+ export interface Rp2350MonitorStatusRequest extends Rp2350MonitorBaseRequest {
15
+ include_caps?: boolean;
16
+ }
17
+ export interface Rp2350MonitorCommandRequest extends Rp2350MonitorBaseRequest {
18
+ command: string;
19
+ args?: string[];
20
+ }
21
+ export interface Rp2350MonitorLogicCaptureRequest extends Rp2350MonitorBaseRequest {
22
+ pin_base: number;
23
+ pin_count: number;
24
+ sample_rate?: number;
25
+ samples?: number;
26
+ output_path?: string;
27
+ pull?: "none" | "up" | "down";
28
+ release?: boolean;
29
+ wait_timeout_ms?: number;
30
+ read_timeout_ms?: number;
31
+ pre_samples?: number;
32
+ post_samples?: number;
33
+ search_samples?: number;
34
+ burst_count?: number;
35
+ trigger_pin?: number;
36
+ trigger_mode?: "level" | "rising" | "falling" | "pattern";
37
+ trigger_level?: boolean;
38
+ trigger_mask?: number;
39
+ trigger_value?: number;
40
+ channel_names?: Record<string, string>;
41
+ pin_pulls?: Record<string, "none" | "up" | "down">;
42
+ }
43
+ export interface Rp2350MonitorLogicDecodeRequest {
44
+ input_path: string;
45
+ decoder?: "summary" | "bursts" | "edges" | "uart" | "spi" | "i2c";
46
+ output_path?: string;
47
+ capture_id?: number;
48
+ start_sample?: number;
49
+ end_sample?: number;
50
+ pins?: number[];
51
+ rx_pin?: number;
52
+ baud?: number;
53
+ data_bits?: number;
54
+ parity?: "none" | "even" | "odd";
55
+ stop_bits?: number;
56
+ invert?: boolean;
57
+ sck_pin?: number;
58
+ mosi_pin?: number;
59
+ miso_pin?: number;
60
+ cs_pin?: number;
61
+ mode?: 0 | 1 | 2 | 3;
62
+ cs_active_high?: boolean;
63
+ word_bits?: number;
64
+ bit_order?: "msb" | "lsb";
65
+ sda_pin?: number;
66
+ scl_pin?: number;
67
+ monitor_root?: string;
68
+ }
69
+ interface ResolvedTransport {
70
+ transport: "serial" | "tcp";
71
+ serial_path?: string;
72
+ host?: string;
73
+ port?: number;
74
+ baud?: number;
75
+ discovery?: Record<string, unknown>;
76
+ }
77
+ interface RpmonRunResult {
78
+ ok: boolean;
79
+ exit_code: number | null;
80
+ timed_out: boolean;
81
+ command: string[];
82
+ stdout_json: Record<string, unknown>[];
83
+ stderr_json: Record<string, unknown>[];
84
+ stdout_tail: string[];
85
+ stderr_tail: string[];
86
+ transport?: ResolvedTransport;
87
+ output_path?: string;
88
+ summary_for_user: string;
89
+ }
90
+ export declare function rp2350MonitorCommandNeedsApproval(command: string): boolean;
91
+ export declare function discoverRp2350Monitors(serialPorts?: SerialPortInfo[]): Promise<{
92
+ devices: DeviceSummary[];
93
+ warnings: ErrorEnvelope[];
94
+ }>;
95
+ export declare function getRp2350MonitorStatus(request: Rp2350MonitorStatusRequest): Promise<{
96
+ ok: boolean;
97
+ transport: ResolvedTransport;
98
+ commands: RpmonRunResult[];
99
+ summary_for_user: string;
100
+ observed_at: string;
101
+ }>;
102
+ export declare function runRp2350MonitorCommand(request: Rp2350MonitorCommandRequest): Promise<RpmonRunResult | {
103
+ ok: boolean;
104
+ error_code: string;
105
+ message: string;
106
+ }>;
107
+ export declare function captureRp2350MonitorLogic(request: Rp2350MonitorLogicCaptureRequest): Promise<{
108
+ output_path: string;
109
+ summary_for_user: string;
110
+ ok: boolean;
111
+ exit_code: number | null;
112
+ timed_out: boolean;
113
+ command: string[];
114
+ stdout_json: Record<string, unknown>[];
115
+ stderr_json: Record<string, unknown>[];
116
+ stdout_tail: string[];
117
+ stderr_tail: string[];
118
+ transport?: ResolvedTransport;
119
+ }>;
120
+ export declare function decodeRp2350MonitorLogic(request: Rp2350MonitorLogicDecodeRequest): Promise<RpmonRunResult>;
121
+ export {};
@@ -0,0 +1,404 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rp2350-monitor.js","sourceRoot":"","sources":["../../src/adapters/rp2350-monitor.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { BoardDeployRequest, BoardDeployResult, DeviceProbeRequest, DeviceProbeResult, DeviceScanResult, ErrorEnvelope } from "@embed-labs/protocol";
2
2
  export { buildFlashPlan, executeRp2350Uf2Flash } from "./adapters/flash.js";
3
3
  export { scanDebugTools } from "./adapters/debug.js";
4
+ export { captureRp2350MonitorLogic, decodeRp2350MonitorLogic, getRp2350MonitorStatus, rp2350MonitorCommandNeedsApproval, runRp2350MonitorCommand } from "./adapters/rp2350-monitor.js";
4
5
  export { captureSerial, listSerialPorts } from "./adapters/serial.js";
5
6
  export { runBoundedSsh } from "./adapters/network.js";
6
7
  export { scanUsbDevices } from "./adapters/usb.js";
package/dist/hardware.js CHANGED
@@ -3,12 +3,14 @@ import { access, stat } from "node:fs/promises";
3
3
  import { basename } from "node:path";
4
4
  import { deployTaishanPiArtifact } from "./adapters/deploy.js";
5
5
  import { probeTcp, probeTcpWithEvidence } from "./adapters/network.js";
6
+ import { discoverRp2350Monitors } from "./adapters/rp2350-monitor.js";
6
7
  import { listSerialPorts } from "./adapters/serial.js";
7
8
  import { findUf2Volumes } from "./adapters/uf2.js";
8
9
  import { isRockchipUsb, scanUsbDevices } from "./adapters/usb.js";
9
10
  import { runCommand } from "./process.js";
10
11
  export { buildFlashPlan, executeRp2350Uf2Flash } from "./adapters/flash.js";
11
12
  export { scanDebugTools } from "./adapters/debug.js";
13
+ export { captureRp2350MonitorLogic, decodeRp2350MonitorLogic, getRp2350MonitorStatus, rp2350MonitorCommandNeedsApproval, runRp2350MonitorCommand } from "./adapters/rp2350-monitor.js";
12
14
  export { captureSerial, listSerialPorts } from "./adapters/serial.js";
13
15
  export { runBoundedSsh } from "./adapters/network.js";
14
16
  export { scanUsbDevices } from "./adapters/usb.js";
@@ -27,6 +29,9 @@ export async function scanHardware() {
27
29
  const usb = await scanUsbDevices(warnings);
28
30
  const serial = await listSerialPorts(warnings);
29
31
  const devices = [];
32
+ const rp2350Monitor = await discoverRp2350Monitors(serial);
33
+ devices.push(...rp2350Monitor.devices);
34
+ warnings.push(...rp2350Monitor.warnings);
30
35
  for (const volumePath of await findUf2Volumes()) {
31
36
  devices.push({
32
37
  device_id: `rp2350-uf2-${safeId(basename(volumePath))}`,