crosspad-mcp-server 5.0.1 → 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/README.md +31 -18
- package/dist/config.d.ts +2 -2
- package/dist/config.js +17 -13
- package/dist/config.js.map +1 -1
- package/dist/index.js +139 -31
- package/dist/index.js.map +1 -1
- package/dist/tools/app-manager.d.ts +43 -9
- package/dist/tools/app-manager.js +195 -117
- package/dist/tools/app-manager.js.map +1 -1
- package/dist/tools/architecture.js +0 -2
- package/dist/tools/architecture.js.map +1 -1
- package/dist/tools/build.d.ts +4 -0
- package/dist/tools/build.js +4 -2
- package/dist/tools/build.js.map +1 -1
- package/dist/tools/idf-build.d.ts +13 -0
- package/dist/tools/idf-build.js +8 -4
- package/dist/tools/idf-build.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 +16 -1
- package/dist/tools/symbols.js +118 -50
- package/dist/tools/symbols.js.map +1 -1
- package/dist/tools/test.d.ts +7 -0
- package/dist/tools/test.js +4 -2
- package/dist/tools/test.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 +6 -3
package/dist/tools/symbols.js
CHANGED
|
@@ -5,7 +5,8 @@ import { runCommand } from "../utils/exec.js";
|
|
|
5
5
|
* Build a regex pattern that matches definition lines containing the query.
|
|
6
6
|
* Each kind has a specific pattern that only matches declarations/definitions.
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
/** @internal exported for testing */
|
|
9
|
+
export function buildPattern(query, kind) {
|
|
9
10
|
const q = query; // Already escaped by caller
|
|
10
11
|
const patterns = [];
|
|
11
12
|
if (kind === "class" || kind === "all") {
|
|
@@ -33,7 +34,7 @@ function buildPattern(query, kind) {
|
|
|
33
34
|
* Search for symbol definitions (classes, functions, macros, enums) across CrossPad repos.
|
|
34
35
|
* Only matches definition lines, not usages.
|
|
35
36
|
*/
|
|
36
|
-
export function crosspadSearchSymbols(query, kind = "all", repos = ["all"], maxResults = 50) {
|
|
37
|
+
export function crosspadSearchSymbols(query, kind = "all", repos = ["all"], maxResults = 50, contextLines = 0) {
|
|
37
38
|
const results = [];
|
|
38
39
|
const allRepos = getRepos();
|
|
39
40
|
const targetRepos = repos.includes("all")
|
|
@@ -43,56 +44,119 @@ export function crosspadSearchSymbols(query, kind = "all", repos = ["all"], maxR
|
|
|
43
44
|
if (!pattern) {
|
|
44
45
|
return { query, kind_filter: kind, results: [], total_matches: 0, truncated: false };
|
|
45
46
|
}
|
|
47
|
+
const clampedContext = Math.min(Math.max(contextLines, 0), 10);
|
|
48
|
+
const useContext = clampedContext > 0;
|
|
46
49
|
for (const [repoName, repoPath] of targetRepos) {
|
|
47
50
|
if (!fs.existsSync(repoPath))
|
|
48
51
|
continue;
|
|
49
|
-
const
|
|
52
|
+
const contextFlag = useContext ? `-C ${clampedContext}` : "";
|
|
53
|
+
const grepCmd = `git grep --recurse-submodules -n ${contextFlag} -E "${escapeForShell(pattern)}" -- "*.hpp" "*.h" "*.cpp" "*.c"`;
|
|
50
54
|
const result = runCommand(grepCmd, repoPath, 30_000);
|
|
51
55
|
if (!result.success && result.stdout.length === 0)
|
|
52
56
|
continue;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
|
|
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
|
-
|
|
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
|
+
}
|
|
96
160
|
}
|
|
97
161
|
if (results.length >= maxResults)
|
|
98
162
|
break;
|
|
@@ -105,14 +169,17 @@ export function crosspadSearchSymbols(query, kind = "all", repos = ["all"], maxR
|
|
|
105
169
|
truncated: results.length >= maxResults,
|
|
106
170
|
};
|
|
107
171
|
}
|
|
108
|
-
|
|
172
|
+
/** @internal exported for testing */
|
|
173
|
+
export function escapeForShell(s) {
|
|
109
174
|
// Only escape shell metacharacters, NOT backslashes (needed for regex \s \w etc.)
|
|
110
175
|
return s.replace(/["`$]/g, "\\$&");
|
|
111
176
|
}
|
|
112
|
-
|
|
177
|
+
/** @internal exported for testing */
|
|
178
|
+
export function escapeForRegex(s) {
|
|
113
179
|
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
114
180
|
}
|
|
115
|
-
|
|
181
|
+
/** @internal exported for testing */
|
|
182
|
+
export function classifyDefinition(line) {
|
|
116
183
|
if (/^\s*#define\s+/.test(line))
|
|
117
184
|
return "macro";
|
|
118
185
|
if (/^\s*enum\s+/.test(line))
|
|
@@ -128,7 +195,8 @@ function classifyDefinition(line) {
|
|
|
128
195
|
}
|
|
129
196
|
return null;
|
|
130
197
|
}
|
|
131
|
-
|
|
198
|
+
/** @internal exported for testing */
|
|
199
|
+
export function extractSymbolName(line, kind) {
|
|
132
200
|
switch (kind) {
|
|
133
201
|
case "class": {
|
|
134
202
|
const m = line.match(/(?:class|struct)\s+(\w+)/);
|
|
@@ -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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"}
|
package/dist/tools/test.d.ts
CHANGED
|
@@ -22,3 +22,10 @@ export declare function crosspadTestScaffold(): {
|
|
|
22
22
|
files: Record<string, string>;
|
|
23
23
|
cmake_patch: string;
|
|
24
24
|
};
|
|
25
|
+
/** @internal exported for testing */
|
|
26
|
+
export declare function parseCatch2Output(output: string): {
|
|
27
|
+
passed: number;
|
|
28
|
+
failed: number;
|
|
29
|
+
};
|
|
30
|
+
/** @internal exported for testing */
|
|
31
|
+
export declare function parseErrors(output: string): string[];
|
package/dist/tools/test.js
CHANGED
|
@@ -201,7 +201,8 @@ endif()
|
|
|
201
201
|
`;
|
|
202
202
|
return { files, cmake_patch: cmakePatch };
|
|
203
203
|
}
|
|
204
|
-
|
|
204
|
+
/** @internal exported for testing */
|
|
205
|
+
export function parseCatch2Output(output) {
|
|
205
206
|
// Catch2 compact reporter: "Passed X test(s)" / "Failed X test(s)"
|
|
206
207
|
const passedMatch = output.match(/(\d+)\s+assertion[s]?\s+.*passed/i) ||
|
|
207
208
|
output.match(/All tests passed\s*\((\d+)/i);
|
|
@@ -212,7 +213,8 @@ function parseCatch2Output(output) {
|
|
|
212
213
|
failed: failedMatch ? parseInt(failedMatch[1], 10) : 0,
|
|
213
214
|
};
|
|
214
215
|
}
|
|
215
|
-
|
|
216
|
+
/** @internal exported for testing */
|
|
217
|
+
export function parseErrors(output) {
|
|
216
218
|
const errors = [];
|
|
217
219
|
for (const line of output.split("\n")) {
|
|
218
220
|
if (/\berror\b/i.test(line) && !line.includes("error(s)")) {
|
package/dist/tools/test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/tools/test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/tools/test.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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"}
|