crosspad-mcp-server 5.1.0 → 6.0.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.
- package/dist/index.js +118 -22
- package/dist/index.js.map +1 -1
- package/dist/tools/app-manager.js +44 -1
- package/dist/tools/app-manager.js.map +1 -1
- package/dist/tools/idf-flash.d.ts +20 -0
- package/dist/tools/idf-flash.js +184 -0
- package/dist/tools/idf-flash.js.map +1 -0
- package/dist/tools/idf-monitor.d.ts +29 -0
- package/dist/tools/idf-monitor.js +168 -0
- package/dist/tools/idf-monitor.js.map +1 -0
- package/dist/tools/midi.d.ts +27 -0
- package/dist/tools/midi.js +112 -0
- package/dist/tools/midi.js.map +1 -0
- package/dist/tools/repo-actions.d.ts +46 -0
- package/dist/tools/repo-actions.js +273 -0
- package/dist/tools/repo-actions.js.map +1 -0
- package/dist/tools/symbols.d.ts +2 -1
- package/dist/tools/symbols.js +108 -45
- package/dist/tools/symbols.js.map +1 -1
- package/dist/utils/device.d.ts +38 -0
- package/dist/utils/device.js +287 -0
- package/dist/utils/device.js.map +1 -0
- package/dist/utils/remote-client.d.ts +1 -0
- package/dist/utils/remote-client.js +24 -1
- package/dist/utils/remote-client.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-actions.js","sourceRoot":"","sources":["../../src/tools/repo-actions.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/symbols.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export interface SymbolResult {
|
|
|
4
4
|
file: string;
|
|
5
5
|
line: number;
|
|
6
6
|
context: string;
|
|
7
|
+
surrounding?: string[];
|
|
7
8
|
repo: string;
|
|
8
9
|
}
|
|
9
10
|
export interface SymbolSearchResult {
|
|
@@ -23,7 +24,7 @@ export declare function buildPattern(query: string, kind: string): string;
|
|
|
23
24
|
* Search for symbol definitions (classes, functions, macros, enums) across CrossPad repos.
|
|
24
25
|
* Only matches definition lines, not usages.
|
|
25
26
|
*/
|
|
26
|
-
export declare function crosspadSearchSymbols(query: string, kind?: string, repos?: string[], maxResults?: number): SymbolSearchResult;
|
|
27
|
+
export declare function crosspadSearchSymbols(query: string, kind?: string, repos?: string[], maxResults?: number, contextLines?: number): SymbolSearchResult;
|
|
27
28
|
/** @internal exported for testing */
|
|
28
29
|
export declare function escapeForShell(s: string): string;
|
|
29
30
|
/** @internal exported for testing */
|
package/dist/tools/symbols.js
CHANGED
|
@@ -34,7 +34,7 @@ export function buildPattern(query, kind) {
|
|
|
34
34
|
* Search for symbol definitions (classes, functions, macros, enums) across CrossPad repos.
|
|
35
35
|
* Only matches definition lines, not usages.
|
|
36
36
|
*/
|
|
37
|
-
export function crosspadSearchSymbols(query, kind = "all", repos = ["all"], maxResults = 50) {
|
|
37
|
+
export function crosspadSearchSymbols(query, kind = "all", repos = ["all"], maxResults = 50, contextLines = 0) {
|
|
38
38
|
const results = [];
|
|
39
39
|
const allRepos = getRepos();
|
|
40
40
|
const targetRepos = repos.includes("all")
|
|
@@ -44,56 +44,119 @@ export function crosspadSearchSymbols(query, kind = "all", repos = ["all"], maxR
|
|
|
44
44
|
if (!pattern) {
|
|
45
45
|
return { query, kind_filter: kind, results: [], total_matches: 0, truncated: false };
|
|
46
46
|
}
|
|
47
|
+
const clampedContext = Math.min(Math.max(contextLines, 0), 10);
|
|
48
|
+
const useContext = clampedContext > 0;
|
|
47
49
|
for (const [repoName, repoPath] of targetRepos) {
|
|
48
50
|
if (!fs.existsSync(repoPath))
|
|
49
51
|
continue;
|
|
50
|
-
const
|
|
52
|
+
const contextFlag = useContext ? `-C ${clampedContext}` : "";
|
|
53
|
+
const grepCmd = `git grep --recurse-submodules -n ${contextFlag} -E "${escapeForShell(pattern)}" -- "*.hpp" "*.h" "*.cpp" "*.c"`;
|
|
51
54
|
const result = runCommand(grepCmd, repoPath, 30_000);
|
|
52
55
|
if (!result.success && result.stdout.length === 0)
|
|
53
56
|
continue;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
57
|
+
if (useContext) {
|
|
58
|
+
// Context mode: output has `--` separators between groups
|
|
59
|
+
const blocks = result.stdout.split(/^--$/m);
|
|
60
|
+
for (const block of blocks) {
|
|
61
|
+
const blockLines = block.split("\n").filter((l) => l.trim());
|
|
62
|
+
if (blockLines.length === 0)
|
|
63
|
+
continue;
|
|
64
|
+
// Find the matching line (has line number, not `-` context separator)
|
|
65
|
+
let matchFile = "";
|
|
66
|
+
let matchLine = 0;
|
|
67
|
+
let matchContent = "";
|
|
68
|
+
const surrounding = [];
|
|
69
|
+
for (const bline of blockLines) {
|
|
70
|
+
// Match line format: file:123:content (colon separator for match)
|
|
71
|
+
const matchResult = bline.match(/^([^:]+):(\d+):(.*)$/);
|
|
72
|
+
// Context line format: file-123-content (dash separator)
|
|
73
|
+
const contextResult = bline.match(/^([^-]+)-(\d+)-(.*)$/);
|
|
74
|
+
if (matchResult && !matchFile) {
|
|
75
|
+
matchFile = matchResult[1];
|
|
76
|
+
matchLine = parseInt(matchResult[2], 10);
|
|
77
|
+
matchContent = matchResult[3].trim();
|
|
78
|
+
}
|
|
79
|
+
if (matchResult || contextResult) {
|
|
80
|
+
const content = matchResult ? matchResult[3] : contextResult[3];
|
|
81
|
+
surrounding.push(content);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (!matchFile || !matchContent)
|
|
85
|
+
continue;
|
|
86
|
+
// Apply same filters as non-context mode
|
|
87
|
+
if (/^\s*(class|struct)\s+\w+\s*;/.test(matchContent))
|
|
88
|
+
continue;
|
|
89
|
+
if (/^\s*#include/.test(matchContent))
|
|
90
|
+
continue;
|
|
91
|
+
if (/^\s*(\/\/|\/\*|\*)/.test(matchContent))
|
|
92
|
+
continue;
|
|
93
|
+
const detectedKind = classifyDefinition(matchContent);
|
|
94
|
+
if (!detectedKind)
|
|
95
|
+
continue;
|
|
96
|
+
if (kind !== "all" && detectedKind !== kind)
|
|
97
|
+
continue;
|
|
98
|
+
const symbolName = extractSymbolName(matchContent, detectedKind);
|
|
99
|
+
if (!symbolName)
|
|
100
|
+
continue;
|
|
101
|
+
if (!symbolName.toLowerCase().includes(query.toLowerCase()))
|
|
102
|
+
continue;
|
|
103
|
+
const key = `${symbolName}:${matchFile}`;
|
|
104
|
+
if (results.some((r) => `${r.symbol}:${r.file.split("/").pop()}` === key))
|
|
105
|
+
continue;
|
|
106
|
+
results.push({
|
|
107
|
+
symbol: symbolName,
|
|
108
|
+
kind: detectedKind,
|
|
109
|
+
file: `${repoPath}/${matchFile}`.replace(/\\/g, "/"),
|
|
110
|
+
line: matchLine,
|
|
111
|
+
context: matchContent.slice(0, 150),
|
|
112
|
+
surrounding,
|
|
113
|
+
repo: repoName,
|
|
114
|
+
});
|
|
115
|
+
if (results.length >= maxResults)
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
// Standard mode (no context)
|
|
121
|
+
for (const line of result.stdout.split("\n")) {
|
|
122
|
+
if (!line.trim())
|
|
123
|
+
continue;
|
|
124
|
+
const match = line.match(/^([^:]+):(\d+):(.*)$/);
|
|
125
|
+
if (!match)
|
|
126
|
+
continue;
|
|
127
|
+
const [, file, lineStr, content] = match;
|
|
128
|
+
const lineNum = parseInt(lineStr, 10);
|
|
129
|
+
const trimmedContent = content.trim();
|
|
130
|
+
if (/^\s*(class|struct)\s+\w+\s*;/.test(trimmedContent))
|
|
131
|
+
continue;
|
|
132
|
+
if (/^\s*#include/.test(trimmedContent))
|
|
133
|
+
continue;
|
|
134
|
+
if (/^\s*(\/\/|\/\*|\*)/.test(trimmedContent))
|
|
135
|
+
continue;
|
|
136
|
+
const detectedKind = classifyDefinition(trimmedContent);
|
|
137
|
+
if (!detectedKind)
|
|
138
|
+
continue;
|
|
139
|
+
if (kind !== "all" && detectedKind !== kind)
|
|
140
|
+
continue;
|
|
141
|
+
const symbolName = extractSymbolName(trimmedContent, detectedKind);
|
|
142
|
+
if (!symbolName)
|
|
143
|
+
continue;
|
|
144
|
+
if (!symbolName.toLowerCase().includes(query.toLowerCase()))
|
|
145
|
+
continue;
|
|
146
|
+
const key = `${symbolName}:${file}`;
|
|
147
|
+
if (results.some((r) => `${r.symbol}:${r.file.split("/").pop()}` === key))
|
|
148
|
+
continue;
|
|
149
|
+
results.push({
|
|
150
|
+
symbol: symbolName,
|
|
151
|
+
kind: detectedKind,
|
|
152
|
+
file: `${repoPath}/${file}`.replace(/\\/g, "/"),
|
|
153
|
+
line: lineNum,
|
|
154
|
+
context: trimmedContent.slice(0, 150),
|
|
155
|
+
repo: repoName,
|
|
156
|
+
});
|
|
157
|
+
if (results.length >= maxResults)
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
97
160
|
}
|
|
98
161
|
if (results.length >= maxResults)
|
|
99
162
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbols.js","sourceRoot":"","sources":["../../src/tools/symbols.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"symbols.js","sourceRoot":"","sources":["../../src/tools/symbols.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-platform USB device discovery for CrossPad.
|
|
3
|
+
*
|
|
4
|
+
* Primary method: Python/pyserial (required for IDF builds anyway).
|
|
5
|
+
* Fallback: platform-specific commands (Linux sysfs, macOS system_profiler, Windows PowerShell).
|
|
6
|
+
*
|
|
7
|
+
* Supports multiple simultaneous CrossPad devices — each identified by port path.
|
|
8
|
+
*/
|
|
9
|
+
export interface CrosspadDevice {
|
|
10
|
+
port: string;
|
|
11
|
+
vid: number;
|
|
12
|
+
pid: number;
|
|
13
|
+
serial_number: string | null;
|
|
14
|
+
description: string;
|
|
15
|
+
manufacturer: string | null;
|
|
16
|
+
is_crosspad: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface DeviceListResult {
|
|
19
|
+
success: boolean;
|
|
20
|
+
devices: CrosspadDevice[];
|
|
21
|
+
all_ports: CrosspadDevice[];
|
|
22
|
+
error?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* List all connected USB serial devices. Returns CrossPad devices separately.
|
|
26
|
+
* Tries Python/pyserial first, falls back to platform-specific methods.
|
|
27
|
+
*/
|
|
28
|
+
export declare function listDevices(): DeviceListResult;
|
|
29
|
+
/**
|
|
30
|
+
* Find a CrossPad device, optionally by port.
|
|
31
|
+
* If port is specified, validates it's a CrossPad device.
|
|
32
|
+
* If not specified, auto-detects (fails if 0 or >1 found).
|
|
33
|
+
*/
|
|
34
|
+
export declare function findCrosspadPort(port?: string): {
|
|
35
|
+
port: string;
|
|
36
|
+
device?: CrosspadDevice;
|
|
37
|
+
error?: string;
|
|
38
|
+
};
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-platform USB device discovery for CrossPad.
|
|
3
|
+
*
|
|
4
|
+
* Primary method: Python/pyserial (required for IDF builds anyway).
|
|
5
|
+
* Fallback: platform-specific commands (Linux sysfs, macOS system_profiler, Windows PowerShell).
|
|
6
|
+
*
|
|
7
|
+
* Supports multiple simultaneous CrossPad devices — each identified by port path.
|
|
8
|
+
*/
|
|
9
|
+
import { execSync } from "child_process";
|
|
10
|
+
import fs from "fs";
|
|
11
|
+
import path from "path";
|
|
12
|
+
import { IS_WINDOWS, IS_MAC } from "../config.js";
|
|
13
|
+
// CrossPad USB identifiers
|
|
14
|
+
const ESPRESSIF_VID = 0x303a;
|
|
15
|
+
const CROSSPAD_PID = 0x3456;
|
|
16
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
17
|
+
// PRIMARY: Python/pyserial enumeration (cross-platform)
|
|
18
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
19
|
+
function listPortsViaPython() {
|
|
20
|
+
const script = [
|
|
21
|
+
"import json, serial.tools.list_ports",
|
|
22
|
+
"ports = [{"
|
|
23
|
+
+ '"port": p.device, "vid": p.vid, "pid": p.pid, '
|
|
24
|
+
+ '"serial": p.serial_number, "desc": p.description, '
|
|
25
|
+
+ '"mfr": p.manufacturer'
|
|
26
|
+
+ "} for p in serial.tools.list_ports.comports() if p.vid]",
|
|
27
|
+
"print(json.dumps(ports))",
|
|
28
|
+
].join("; ");
|
|
29
|
+
try {
|
|
30
|
+
const output = execSync(`python3 -c "${script}"`, {
|
|
31
|
+
encoding: "utf-8",
|
|
32
|
+
timeout: 10_000,
|
|
33
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
34
|
+
});
|
|
35
|
+
const raw = JSON.parse(output.trim());
|
|
36
|
+
return raw.map((r) => ({
|
|
37
|
+
port: r.port,
|
|
38
|
+
vid: r.vid ?? 0,
|
|
39
|
+
pid: r.pid ?? 0,
|
|
40
|
+
serial_number: r.serial,
|
|
41
|
+
description: r.desc,
|
|
42
|
+
manufacturer: r.mfr,
|
|
43
|
+
is_crosspad: r.vid === ESPRESSIF_VID && r.pid === CROSSPAD_PID,
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
51
|
+
// FALLBACK: Platform-specific enumeration
|
|
52
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
53
|
+
function listPortsLinuxSysfs() {
|
|
54
|
+
const devices = [];
|
|
55
|
+
const ttyBase = "/sys/class/tty";
|
|
56
|
+
let entries;
|
|
57
|
+
try {
|
|
58
|
+
entries = fs.readdirSync(ttyBase);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
for (const name of entries) {
|
|
64
|
+
if (!name.startsWith("ttyACM") && !name.startsWith("ttyUSB"))
|
|
65
|
+
continue;
|
|
66
|
+
const deviceLink = path.join(ttyBase, name, "device");
|
|
67
|
+
if (!fs.existsSync(deviceLink))
|
|
68
|
+
continue;
|
|
69
|
+
// Walk up to find USB device attributes
|
|
70
|
+
const usbDevicePath = findUsbParent(deviceLink);
|
|
71
|
+
if (!usbDevicePath)
|
|
72
|
+
continue;
|
|
73
|
+
const vid = readHexFile(path.join(usbDevicePath, "idVendor"));
|
|
74
|
+
const pid = readHexFile(path.join(usbDevicePath, "idProduct"));
|
|
75
|
+
if (vid === null || pid === null)
|
|
76
|
+
continue;
|
|
77
|
+
const serial = readTextFile(path.join(usbDevicePath, "serial"));
|
|
78
|
+
const manufacturer = readTextFile(path.join(usbDevicePath, "manufacturer"));
|
|
79
|
+
const product = readTextFile(path.join(usbDevicePath, "product"));
|
|
80
|
+
devices.push({
|
|
81
|
+
port: `/dev/${name}`,
|
|
82
|
+
vid,
|
|
83
|
+
pid,
|
|
84
|
+
serial_number: serial,
|
|
85
|
+
description: product ?? name,
|
|
86
|
+
manufacturer,
|
|
87
|
+
is_crosspad: vid === ESPRESSIF_VID && pid === CROSSPAD_PID,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return devices;
|
|
91
|
+
}
|
|
92
|
+
function findUsbParent(devicePath) {
|
|
93
|
+
let current;
|
|
94
|
+
try {
|
|
95
|
+
current = fs.realpathSync(devicePath);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
// Walk up looking for idVendor file (USB device level)
|
|
101
|
+
for (let i = 0; i < 6; i++) {
|
|
102
|
+
if (fs.existsSync(path.join(current, "idVendor"))) {
|
|
103
|
+
return current;
|
|
104
|
+
}
|
|
105
|
+
current = path.dirname(current);
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
function readHexFile(filePath) {
|
|
110
|
+
try {
|
|
111
|
+
return parseInt(fs.readFileSync(filePath, "utf-8").trim(), 16);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function readTextFile(filePath) {
|
|
118
|
+
try {
|
|
119
|
+
return fs.readFileSync(filePath, "utf-8").trim() || null;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function listPortsMacOS() {
|
|
126
|
+
// Use system_profiler for USB device info
|
|
127
|
+
try {
|
|
128
|
+
const output = execSync("system_profiler SPUSBDataType -json", {
|
|
129
|
+
encoding: "utf-8",
|
|
130
|
+
timeout: 10_000,
|
|
131
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
132
|
+
});
|
|
133
|
+
const data = JSON.parse(output);
|
|
134
|
+
const devices = [];
|
|
135
|
+
collectMacDevices(data.SPUSBDataType ?? [], devices);
|
|
136
|
+
return devices;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function collectMacDevices(items, out) {
|
|
143
|
+
for (const item of items) {
|
|
144
|
+
if (item.vendor_id) {
|
|
145
|
+
const vid = parseMacId(item.vendor_id);
|
|
146
|
+
const pid = parseMacId(item.product_id);
|
|
147
|
+
if (vid !== null && pid !== null) {
|
|
148
|
+
// macOS serial ports follow /dev/cu.usbmodem* pattern
|
|
149
|
+
const serial = item.serial_num ?? null;
|
|
150
|
+
// Try to find matching /dev/cu.* port
|
|
151
|
+
const port = findMacPort(serial, item._name);
|
|
152
|
+
if (port) {
|
|
153
|
+
out.push({
|
|
154
|
+
port,
|
|
155
|
+
vid,
|
|
156
|
+
pid,
|
|
157
|
+
serial_number: serial,
|
|
158
|
+
description: item._name ?? "USB Device",
|
|
159
|
+
manufacturer: item.manufacturer ?? null,
|
|
160
|
+
is_crosspad: vid === ESPRESSIF_VID && pid === CROSSPAD_PID,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Recurse into hubs
|
|
166
|
+
if (item._items) {
|
|
167
|
+
collectMacDevices(item._items, out);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function parseMacId(val) {
|
|
172
|
+
if (!val)
|
|
173
|
+
return null;
|
|
174
|
+
// Format: "0x303a" or "0x303a (Espressif Systems)"
|
|
175
|
+
const match = val.match(/0x([0-9a-f]+)/i);
|
|
176
|
+
return match ? parseInt(match[1], 16) : null;
|
|
177
|
+
}
|
|
178
|
+
function findMacPort(serial, name) {
|
|
179
|
+
try {
|
|
180
|
+
const ports = fs.readdirSync("/dev").filter((f) => f.startsWith("cu.usbmodem") || f.startsWith("cu.usbserial"));
|
|
181
|
+
if (ports.length === 0)
|
|
182
|
+
return null;
|
|
183
|
+
// If serial number is part of the port name, use that
|
|
184
|
+
if (serial) {
|
|
185
|
+
const match = ports.find((p) => p.includes(serial));
|
|
186
|
+
if (match)
|
|
187
|
+
return `/dev/${match}`;
|
|
188
|
+
}
|
|
189
|
+
// Return first matching port (best effort)
|
|
190
|
+
return `/dev/${ports[0]}`;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function listPortsWindows() {
|
|
197
|
+
try {
|
|
198
|
+
const cmd = `powershell -NoProfile -Command "Get-CimInstance Win32_PnPEntity | Where-Object { $_.PNPDeviceID -like '*VID_*PID_*' -and $_.Name -like '*(COM*)*' } | Select-Object Name,PNPDeviceID | ConvertTo-Json -Compress"`;
|
|
199
|
+
const output = execSync(cmd, {
|
|
200
|
+
encoding: "utf-8",
|
|
201
|
+
timeout: 15_000,
|
|
202
|
+
shell: "cmd.exe",
|
|
203
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
204
|
+
});
|
|
205
|
+
const trimmed = output.trim();
|
|
206
|
+
if (!trimmed)
|
|
207
|
+
return [];
|
|
208
|
+
const raw = JSON.parse(trimmed);
|
|
209
|
+
const items = Array.isArray(raw) ? raw : [raw];
|
|
210
|
+
return items.map((item) => {
|
|
211
|
+
const vidMatch = item.PNPDeviceID.match(/VID_([0-9A-F]+)/i);
|
|
212
|
+
const pidMatch = item.PNPDeviceID.match(/PID_([0-9A-F]+)/i);
|
|
213
|
+
const comMatch = item.Name.match(/\((COM\d+)\)/);
|
|
214
|
+
const vid = vidMatch ? parseInt(vidMatch[1], 16) : 0;
|
|
215
|
+
const pid = pidMatch ? parseInt(pidMatch[1], 16) : 0;
|
|
216
|
+
const port = comMatch ? comMatch[1] : "COM?";
|
|
217
|
+
return {
|
|
218
|
+
port,
|
|
219
|
+
vid,
|
|
220
|
+
pid,
|
|
221
|
+
serial_number: null,
|
|
222
|
+
description: item.Name,
|
|
223
|
+
manufacturer: null,
|
|
224
|
+
is_crosspad: vid === ESPRESSIF_VID && pid === CROSSPAD_PID,
|
|
225
|
+
};
|
|
226
|
+
}).filter((d) => d.vid > 0);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return [];
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
233
|
+
// PUBLIC API
|
|
234
|
+
// ═══════════════════════════════════════════════════════════════════════
|
|
235
|
+
/**
|
|
236
|
+
* List all connected USB serial devices. Returns CrossPad devices separately.
|
|
237
|
+
* Tries Python/pyserial first, falls back to platform-specific methods.
|
|
238
|
+
*/
|
|
239
|
+
export function listDevices() {
|
|
240
|
+
// Try pyserial first (most reliable cross-platform)
|
|
241
|
+
let allPorts = listPortsViaPython();
|
|
242
|
+
// Fallback to platform-specific
|
|
243
|
+
if (allPorts === null) {
|
|
244
|
+
if (IS_WINDOWS) {
|
|
245
|
+
allPorts = listPortsWindows();
|
|
246
|
+
}
|
|
247
|
+
else if (IS_MAC) {
|
|
248
|
+
allPorts = listPortsMacOS();
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
allPorts = listPortsLinuxSysfs();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const crosspadDevices = allPorts.filter((d) => d.is_crosspad);
|
|
255
|
+
return {
|
|
256
|
+
success: true,
|
|
257
|
+
devices: crosspadDevices,
|
|
258
|
+
all_ports: allPorts,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Find a CrossPad device, optionally by port.
|
|
263
|
+
* If port is specified, validates it's a CrossPad device.
|
|
264
|
+
* If not specified, auto-detects (fails if 0 or >1 found).
|
|
265
|
+
*/
|
|
266
|
+
export function findCrosspadPort(port) {
|
|
267
|
+
if (port) {
|
|
268
|
+
return { port };
|
|
269
|
+
}
|
|
270
|
+
const result = listDevices();
|
|
271
|
+
const devices = result.devices;
|
|
272
|
+
if (devices.length === 0) {
|
|
273
|
+
return {
|
|
274
|
+
port: "",
|
|
275
|
+
error: "No CrossPad device found. Connect a device or specify port manually.",
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
if (devices.length > 1) {
|
|
279
|
+
const portList = devices.map((d) => ` ${d.port} (${d.description})`).join("\n");
|
|
280
|
+
return {
|
|
281
|
+
port: "",
|
|
282
|
+
error: `Multiple CrossPad devices found. Specify port:\n${portList}`,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
return { port: devices[0].port, device: devices[0] };
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=device.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/utils/device.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ export interface RemoteResponse {
|
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
10
|
* Send a JSON command to the running simulator and return the response.
|
|
11
|
+
* Retries up to MAX_RETRIES times on timeout errors (simulator may be loading).
|
|
11
12
|
* Opens a fresh TCP connection per call (simple, stateless).
|
|
12
13
|
*/
|
|
13
14
|
export declare function sendRemoteCommand(command: Record<string, unknown>): Promise<RemoteResponse>;
|
|
@@ -7,11 +7,34 @@ const REMOTE_PORT = 19840;
|
|
|
7
7
|
const REMOTE_HOST = "127.0.0.1";
|
|
8
8
|
const CONNECT_TIMEOUT = 3000;
|
|
9
9
|
const RESPONSE_TIMEOUT = 15000;
|
|
10
|
+
const MAX_RETRIES = 3;
|
|
11
|
+
const RETRY_DELAY_MS = 500;
|
|
12
|
+
function delay(ms) {
|
|
13
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
14
|
+
}
|
|
10
15
|
/**
|
|
11
16
|
* Send a JSON command to the running simulator and return the response.
|
|
17
|
+
* Retries up to MAX_RETRIES times on timeout errors (simulator may be loading).
|
|
12
18
|
* Opens a fresh TCP connection per call (simple, stateless).
|
|
13
19
|
*/
|
|
14
|
-
export function sendRemoteCommand(command) {
|
|
20
|
+
export async function sendRemoteCommand(command) {
|
|
21
|
+
let lastError;
|
|
22
|
+
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
23
|
+
try {
|
|
24
|
+
return await sendRemoteCommandOnce(command);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
lastError = err;
|
|
28
|
+
// Only retry on timeout, not on connection refused (simulator not running)
|
|
29
|
+
if (err.message?.includes("Connection refused"))
|
|
30
|
+
throw err;
|
|
31
|
+
if (attempt < MAX_RETRIES)
|
|
32
|
+
await delay(RETRY_DELAY_MS * attempt);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
throw lastError;
|
|
36
|
+
}
|
|
37
|
+
function sendRemoteCommandOnce(command) {
|
|
15
38
|
return new Promise((resolve, reject) => {
|
|
16
39
|
const socket = new Socket();
|
|
17
40
|
let buffer = "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-client.js","sourceRoot":"","sources":["../../src/utils/remote-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAE7B,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,WAAW,GAAG,WAAW,CAAC;AAChC,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAO/B
|
|
1
|
+
{"version":3,"file":"remote-client.js","sourceRoot":"","sources":["../../src/utils/remote-client.ts"],"names":[],"mappings":"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"}
|