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.
Files changed (42) hide show
  1. package/README.md +31 -18
  2. package/dist/config.d.ts +2 -2
  3. package/dist/config.js +17 -13
  4. package/dist/config.js.map +1 -1
  5. package/dist/index.js +139 -31
  6. package/dist/index.js.map +1 -1
  7. package/dist/tools/app-manager.d.ts +43 -9
  8. package/dist/tools/app-manager.js +195 -117
  9. package/dist/tools/app-manager.js.map +1 -1
  10. package/dist/tools/architecture.js +0 -2
  11. package/dist/tools/architecture.js.map +1 -1
  12. package/dist/tools/build.d.ts +4 -0
  13. package/dist/tools/build.js +4 -2
  14. package/dist/tools/build.js.map +1 -1
  15. package/dist/tools/idf-build.d.ts +13 -0
  16. package/dist/tools/idf-build.js +8 -4
  17. package/dist/tools/idf-build.js.map +1 -1
  18. package/dist/tools/idf-flash.d.ts +20 -0
  19. package/dist/tools/idf-flash.js +184 -0
  20. package/dist/tools/idf-flash.js.map +1 -0
  21. package/dist/tools/idf-monitor.d.ts +29 -0
  22. package/dist/tools/idf-monitor.js +168 -0
  23. package/dist/tools/idf-monitor.js.map +1 -0
  24. package/dist/tools/midi.d.ts +27 -0
  25. package/dist/tools/midi.js +112 -0
  26. package/dist/tools/midi.js.map +1 -0
  27. package/dist/tools/repo-actions.d.ts +46 -0
  28. package/dist/tools/repo-actions.js +273 -0
  29. package/dist/tools/repo-actions.js.map +1 -0
  30. package/dist/tools/symbols.d.ts +16 -1
  31. package/dist/tools/symbols.js +118 -50
  32. package/dist/tools/symbols.js.map +1 -1
  33. package/dist/tools/test.d.ts +7 -0
  34. package/dist/tools/test.js +4 -2
  35. package/dist/tools/test.js.map +1 -1
  36. package/dist/utils/device.d.ts +38 -0
  37. package/dist/utils/device.js +287 -0
  38. package/dist/utils/device.js.map +1 -0
  39. package/dist/utils/remote-client.d.ts +1 -0
  40. package/dist/utils/remote-client.js +24 -1
  41. package/dist/utils/remote-client.js.map +1 -1
  42. package/package.json +6 -3
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/tools/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/tools/build.ts"],"names":[],"mappings":"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"}
@@ -7,4 +7,17 @@ export interface IdfBuildResult {
7
7
  tail: string[];
8
8
  auto_reconfigured?: boolean;
9
9
  }
10
+ /**
11
+ * Detect app directories that have REGISTER_APP in their sources but are NOT
12
+ * listed in the auto-generated app_registry_init.cpp. This means CMake hasn't
13
+ * seen them yet (file(GLOB) only runs at configure time).
14
+ */
15
+ /** @internal exported for testing */
16
+ export declare function detectUnregisteredApps(): string[];
17
+ /** @internal exported for testing */
18
+ export declare function parseErrors(output: string): string[];
19
+ /** @internal exported for testing */
20
+ export declare function parseWarnings(output: string): string[];
21
+ /** @internal exported for testing */
22
+ export declare function getTail(output: string, n: number): string[];
10
23
  export declare function crosspadIdfBuild(mode: "build" | "fullclean" | "clean", onLine?: OnLine): Promise<IdfBuildResult>;
@@ -7,7 +7,8 @@ import { runIdf, runIdfStream } from "../utils/exec.js";
7
7
  * listed in the auto-generated app_registry_init.cpp. This means CMake hasn't
8
8
  * seen them yet (file(GLOB) only runs at configure time).
9
9
  */
10
- function detectUnregisteredApps() {
10
+ /** @internal exported for testing */
11
+ export function detectUnregisteredApps() {
11
12
  const appsDir = path.join(CROSSPAD_IDF_ROOT, "main", "app");
12
13
  const registryFile = path.join(appsDir, "app_registry_init.cpp");
13
14
  if (!fs.existsSync(registryFile))
@@ -57,7 +58,8 @@ function detectUnregisteredApps() {
57
58
  }
58
59
  return unregistered;
59
60
  }
60
- function parseErrors(output) {
61
+ /** @internal exported for testing */
62
+ export function parseErrors(output) {
61
63
  const errors = [];
62
64
  for (const line of output.split("\n")) {
63
65
  const trimmed = line.trim();
@@ -78,7 +80,8 @@ function parseErrors(output) {
78
80
  }
79
81
  return errors.slice(0, 30);
80
82
  }
81
- function parseWarnings(output) {
83
+ /** @internal exported for testing */
84
+ export function parseWarnings(output) {
82
85
  const warnings = [];
83
86
  for (const line of output.split("\n")) {
84
87
  const trimmed = line.trim();
@@ -90,7 +93,8 @@ function parseWarnings(output) {
90
93
  }
91
94
  return warnings.slice(0, 20);
92
95
  }
93
- function getTail(output, n) {
96
+ /** @internal exported for testing */
97
+ export function getTail(output, n) {
94
98
  return output.split("\n").filter(l => l.trim()).slice(-n);
95
99
  }
96
100
  async function runIdfCmd(cmd, onLine, timeoutMs) {
@@ -1 +1 @@
1
- {"version":3,"file":"idf-build.js","sourceRoot":"","sources":["../../src/tools/idf-build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"idf-build.js","sourceRoot":"","sources":["../../src/tools/idf-build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * ESP-IDF flash operations: UART flash and OTA-over-CDC.
3
+ *
4
+ * Multi-device aware: when multiple CrossPads are connected,
5
+ * the user must specify a port. Auto-detects when only one is present.
6
+ *
7
+ * - idf_flash: runs `idf.py -p <PORT> flash` (full UART flash, requires bootloader mode)
8
+ * - idf_ota: runs `python tools/ota_flash.py` (OTA over CDC, no bootloader needed)
9
+ */
10
+ import { OnLine } from "../utils/exec.js";
11
+ export interface FlashResult {
12
+ success: boolean;
13
+ method: "uart" | "ota";
14
+ port: string;
15
+ duration_seconds: number;
16
+ output_tail: string[];
17
+ error?: string;
18
+ }
19
+ export declare function crosspadIdfFlash(port: string | undefined, onLine?: OnLine): Promise<FlashResult>;
20
+ export declare function crosspadIdfOta(port: string | undefined, firmwarePath: string | undefined, onLine?: OnLine): Promise<FlashResult>;
@@ -0,0 +1,184 @@
1
+ /**
2
+ * ESP-IDF flash operations: UART flash and OTA-over-CDC.
3
+ *
4
+ * Multi-device aware: when multiple CrossPads are connected,
5
+ * the user must specify a port. Auto-detects when only one is present.
6
+ *
7
+ * - idf_flash: runs `idf.py -p <PORT> flash` (full UART flash, requires bootloader mode)
8
+ * - idf_ota: runs `python tools/ota_flash.py` (OTA over CDC, no bootloader needed)
9
+ */
10
+ import fs from "fs";
11
+ import path from "path";
12
+ import { CROSSPAD_IDF_ROOT } from "../config.js";
13
+ import { runIdfStream } from "../utils/exec.js";
14
+ import { findCrosspadPort } from "../utils/device.js";
15
+ // ═══════════════════════════════════════════════════════════════════════
16
+ // UART FLASH — idf.py -p PORT flash
17
+ // ═══════════════════════════════════════════════════════════════════════
18
+ export async function crosspadIdfFlash(port, onLine) {
19
+ const startTime = Date.now();
20
+ // Validate IDF project
21
+ if (!fs.existsSync(CROSSPAD_IDF_ROOT)) {
22
+ return {
23
+ success: false,
24
+ method: "uart",
25
+ port: "",
26
+ duration_seconds: 0,
27
+ output_tail: [],
28
+ error: `IDF project not found at ${CROSSPAD_IDF_ROOT}`,
29
+ };
30
+ }
31
+ // Check firmware exists (build first if not)
32
+ const buildDir = path.join(CROSSPAD_IDF_ROOT, "build");
33
+ if (!fs.existsSync(buildDir)) {
34
+ return {
35
+ success: false,
36
+ method: "uart",
37
+ port: "",
38
+ duration_seconds: 0,
39
+ output_tail: [],
40
+ error: "No build directory found. Run crosspad_build action=idf first.",
41
+ };
42
+ }
43
+ // Resolve port
44
+ const resolved = findCrosspadPort(port);
45
+ if (resolved.error) {
46
+ return {
47
+ success: false,
48
+ method: "uart",
49
+ port: "",
50
+ duration_seconds: 0,
51
+ output_tail: [],
52
+ error: resolved.error,
53
+ };
54
+ }
55
+ const targetPort = resolved.port;
56
+ onLine?.("stdout", `[idf-flash] Flashing via UART to ${targetPort}...`);
57
+ const cmd = `idf.py -p ${targetPort} flash`;
58
+ const result = await runIdfStream(cmd, CROSSPAD_IDF_ROOT, onLine ?? (() => { }), 300_000);
59
+ const combined = result.stdout + "\n" + result.stderr;
60
+ const tail = combined
61
+ .split("\n")
62
+ .filter((l) => l.trim())
63
+ .slice(-20);
64
+ const duration = (Date.now() - startTime) / 1000;
65
+ onLine?.("stdout", `[idf-flash] Flash ${result.success ? "completed" : "FAILED"} in ${duration.toFixed(1)}s`);
66
+ return {
67
+ success: result.success,
68
+ method: "uart",
69
+ port: targetPort,
70
+ duration_seconds: duration,
71
+ output_tail: tail,
72
+ error: result.success ? undefined : extractFlashError(combined),
73
+ };
74
+ }
75
+ // ═══════════════════════════════════════════════════════════════════════
76
+ // OTA FLASH — python tools/ota_flash.py
77
+ // ═══════════════════════════════════════════════════════════════════════
78
+ export async function crosspadIdfOta(port, firmwarePath, onLine) {
79
+ const startTime = Date.now();
80
+ // Validate IDF project
81
+ if (!fs.existsSync(CROSSPAD_IDF_ROOT)) {
82
+ return {
83
+ success: false,
84
+ method: "ota",
85
+ port: "",
86
+ duration_seconds: 0,
87
+ output_tail: [],
88
+ error: `IDF project not found at ${CROSSPAD_IDF_ROOT}`,
89
+ };
90
+ }
91
+ // Check OTA script exists
92
+ const otaScript = path.join(CROSSPAD_IDF_ROOT, "tools", "ota_flash.py");
93
+ if (!fs.existsSync(otaScript)) {
94
+ return {
95
+ success: false,
96
+ method: "ota",
97
+ port: "",
98
+ duration_seconds: 0,
99
+ output_tail: [],
100
+ error: `OTA script not found at ${otaScript}`,
101
+ };
102
+ }
103
+ // Resolve firmware path
104
+ const fwPath = firmwarePath ?? path.join(CROSSPAD_IDF_ROOT, "build", "CrossPad.bin");
105
+ if (!fs.existsSync(fwPath)) {
106
+ return {
107
+ success: false,
108
+ method: "ota",
109
+ port: "",
110
+ duration_seconds: 0,
111
+ output_tail: [],
112
+ error: `Firmware not found at ${fwPath}. Run crosspad_build action=idf first.`,
113
+ };
114
+ }
115
+ // Build command — ota_flash.py handles auto-detection itself,
116
+ // but we add --port if specified for multi-device scenarios.
117
+ // Uses IDF environment so the IDF Python venv (with pyserial) is on PATH.
118
+ const portArg = port ? `--port ${port}` : "";
119
+ const cmd = `python3 "${otaScript}" "${fwPath}" ${portArg}`.trim();
120
+ const resolvedPort = port ?? "(auto-detect)";
121
+ onLine?.("stdout", `[idf-ota] OTA flash to ${resolvedPort}...`);
122
+ onLine?.("stdout", `[idf-ota] Firmware: ${fwPath} (${formatFileSize(fwPath)})`);
123
+ const result = await runIdfStream(cmd, CROSSPAD_IDF_ROOT, onLine ?? (() => { }), 120_000);
124
+ const combined = result.stdout + "\n" + result.stderr;
125
+ const tail = combined
126
+ .split("\n")
127
+ .filter((l) => l.trim())
128
+ .slice(-20);
129
+ // Try to extract actual port from output
130
+ const detectedPort = extractDetectedPort(combined) ?? resolvedPort;
131
+ const duration = (Date.now() - startTime) / 1000;
132
+ onLine?.("stdout", `[idf-ota] OTA ${result.success ? "completed" : "FAILED"} in ${duration.toFixed(1)}s`);
133
+ return {
134
+ success: result.success,
135
+ method: "ota",
136
+ port: detectedPort,
137
+ duration_seconds: duration,
138
+ output_tail: tail,
139
+ error: result.success ? undefined : extractFlashError(combined),
140
+ };
141
+ }
142
+ // ═══════════════════════════════════════════════════════════════════════
143
+ // HELPERS
144
+ // ═══════════════════════════════════════════════════════════════════════
145
+ function extractFlashError(output) {
146
+ // Look for common flash errors
147
+ for (const line of output.split("\n").reverse()) {
148
+ const trimmed = line.trim();
149
+ if (/error:/i.test(trimmed) || /failed/i.test(trimmed) || /not found/i.test(trimmed)) {
150
+ return trimmed;
151
+ }
152
+ if (trimmed.startsWith("OTA_ERROR")) {
153
+ return trimmed;
154
+ }
155
+ }
156
+ return "Flash failed. Check output for details.";
157
+ }
158
+ function extractDetectedPort(output) {
159
+ // ota_flash.py outputs: "Auto-detected CrossPad on /dev/ttyACM0"
160
+ const match = output.match(/Auto-detected CrossPad on (\S+)/);
161
+ if (match)
162
+ return match[1];
163
+ // Also: "CrossPad CDC available on /dev/ttyACM0"
164
+ const match2 = output.match(/CDC available on (\S+)/);
165
+ if (match2)
166
+ return match2[1];
167
+ // idf.py flash outputs: "Serial port /dev/ttyACM0"
168
+ const match3 = output.match(/Serial port (\S+)/);
169
+ return match3 ? match3[1] : null;
170
+ }
171
+ function formatFileSize(filePath) {
172
+ try {
173
+ const size = fs.statSync(filePath).size;
174
+ if (size < 1024)
175
+ return `${size} B`;
176
+ if (size < 1024 * 1024)
177
+ return `${(size / 1024).toFixed(1)} KB`;
178
+ return `${(size / 1024 / 1024).toFixed(2)} MB`;
179
+ }
180
+ catch {
181
+ return "? bytes";
182
+ }
183
+ }
184
+ //# sourceMappingURL=idf-flash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idf-flash.js","sourceRoot":"","sources":["../../src/tools/idf-flash.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,YAAY,EAAU,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAWtD,0EAA0E;AAC1E,oCAAoC;AACpC,0EAA0E;AAE1E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAwB,EACxB,MAAe;IAEf,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,uBAAuB;IACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE;YACR,gBAAgB,EAAE,CAAC;YACnB,WAAW,EAAE,EAAE;YACf,KAAK,EAAE,4BAA4B,iBAAiB,EAAE;SACvD,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE;YACR,gBAAgB,EAAE,CAAC;YACnB,WAAW,EAAE,EAAE;YACf,KAAK,EAAE,gEAAgE;SACxE,CAAC;IACJ,CAAC;IAED,eAAe;IACf,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE;YACR,gBAAgB,EAAE,CAAC;YACnB,WAAW,EAAE,EAAE;YACf,KAAK,EAAE,QAAQ,CAAC,KAAK;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC;IACjC,MAAM,EAAE,CAAC,QAAQ,EAAE,oCAAoC,UAAU,KAAK,CAAC,CAAC;IAExE,MAAM,GAAG,GAAG,aAAa,UAAU,QAAQ,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAEzF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;IACtD,MAAM,IAAI,GAAG,QAAQ;SAClB,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAEd,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;IAEjD,MAAM,EAAE,CAAC,QAAQ,EAAE,qBAAqB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAE9G,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,UAAU;QAChB,gBAAgB,EAAE,QAAQ;QAC1B,WAAW,EAAE,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,wCAAwC;AACxC,0EAA0E;AAE1E,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAwB,EACxB,YAAgC,EAChC,MAAe;IAEf,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,uBAAuB;IACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,EAAE;YACR,gBAAgB,EAAE,CAAC;YACnB,WAAW,EAAE,EAAE;YACf,KAAK,EAAE,4BAA4B,iBAAiB,EAAE;SACvD,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACxE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,EAAE;YACR,gBAAgB,EAAE,CAAC;YACnB,WAAW,EAAE,EAAE;YACf,KAAK,EAAE,2BAA2B,SAAS,EAAE;SAC9C,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,MAAM,MAAM,GAAG,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACrF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,EAAE;YACR,gBAAgB,EAAE,CAAC;YACnB,WAAW,EAAE,EAAE;YACf,KAAK,EAAE,yBAAyB,MAAM,wCAAwC;SAC/E,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,6DAA6D;IAC7D,0EAA0E;IAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,YAAY,SAAS,MAAM,MAAM,KAAK,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC;IAEnE,MAAM,YAAY,GAAG,IAAI,IAAI,eAAe,CAAC;IAC7C,MAAM,EAAE,CAAC,QAAQ,EAAE,0BAA0B,YAAY,KAAK,CAAC,CAAC;IAChE,MAAM,EAAE,CAAC,QAAQ,EAAE,uBAAuB,MAAM,KAAK,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEhF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAEzF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;IACtD,MAAM,IAAI,GAAG,QAAQ;SAClB,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAEd,yCAAyC;IACzC,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC;IAEnE,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;IAEjD,MAAM,EAAE,CAAC,QAAQ,EAAE,iBAAiB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAE1G,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,YAAY;QAClB,gBAAgB,EAAE,QAAQ;QAC1B,WAAW,EAAE,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,UAAU;AACV,0EAA0E;AAE1E,SAAS,iBAAiB,CAAC,MAAc;IACvC,+BAA+B;IAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACrF,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,yCAAyC,CAAC;AACnD,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc;IACzC,iEAAiE;IACjE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC9D,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,iDAAiD;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACtD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAE7B,mDAAmD;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;QACxC,IAAI,IAAI,GAAG,IAAI;YAAE,OAAO,GAAG,IAAI,IAAI,CAAC;QACpC,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI;YAAE,OAAO,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QAChE,OAAO,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Serial log capture from a connected CrossPad device.
3
+ *
4
+ * Uses Python/pyserial for direct serial reading — no TTY required.
5
+ * This avoids idf.py monitor's TTY dependency while still using
6
+ * the IDF Python venv (which has pyserial installed).
7
+ *
8
+ * Multi-device aware: requires port when multiple devices connected.
9
+ */
10
+ import { OnLine } from "../utils/exec.js";
11
+ export interface MonitorResult {
12
+ success: boolean;
13
+ port: string;
14
+ duration_seconds: number;
15
+ lines: string[];
16
+ line_count: number;
17
+ truncated: boolean;
18
+ error?: string;
19
+ }
20
+ /**
21
+ * Capture serial logs from a connected CrossPad device.
22
+ *
23
+ * @param port - Serial port (auto-detect if undefined)
24
+ * @param timeoutSeconds - How long to capture (default 10)
25
+ * @param maxLines - Maximum lines to return (default 500)
26
+ * @param filter - Optional string filter — only return lines containing this
27
+ * @param onLine - Streaming callback for real-time output
28
+ */
29
+ export declare function crosspadIdfMonitor(port: string | undefined, timeoutSeconds: number | undefined, maxLines: number | undefined, filter: string | undefined, onLine?: OnLine): Promise<MonitorResult>;
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Serial log capture from a connected CrossPad device.
3
+ *
4
+ * Uses Python/pyserial for direct serial reading — no TTY required.
5
+ * This avoids idf.py monitor's TTY dependency while still using
6
+ * the IDF Python venv (which has pyserial installed).
7
+ *
8
+ * Multi-device aware: requires port when multiple devices connected.
9
+ */
10
+ import { IS_WINDOWS } from "../config.js";
11
+ import { getIdfEnv } from "../utils/exec.js";
12
+ import { findCrosspadPort } from "../utils/device.js";
13
+ import { spawn } from "child_process";
14
+ /**
15
+ * Build a Python script that reads from serial port for a given duration.
16
+ * Uses pyserial (available in IDF venv). No TTY dependency.
17
+ */
18
+ function buildSerialReaderScript(port, timeoutSeconds) {
19
+ // Escape for embedding in shell command
20
+ const escapedPort = port.replace(/'/g, "\\'");
21
+ return [
22
+ "import serial, sys, time",
23
+ `ser = serial.Serial('${escapedPort}', 115200, timeout=1)`,
24
+ `end = time.time() + ${timeoutSeconds}`,
25
+ "try:",
26
+ " while time.time() < end:",
27
+ " line = ser.readline()",
28
+ " if line:",
29
+ " text = line.decode('utf-8', errors='replace').rstrip()",
30
+ " if text:",
31
+ " print(text, flush=True)",
32
+ "except KeyboardInterrupt:",
33
+ " pass",
34
+ "finally:",
35
+ " ser.close()",
36
+ ].join("\n");
37
+ }
38
+ /**
39
+ * Capture serial logs from a connected CrossPad device.
40
+ *
41
+ * @param port - Serial port (auto-detect if undefined)
42
+ * @param timeoutSeconds - How long to capture (default 10)
43
+ * @param maxLines - Maximum lines to return (default 500)
44
+ * @param filter - Optional string filter — only return lines containing this
45
+ * @param onLine - Streaming callback for real-time output
46
+ */
47
+ export async function crosspadIdfMonitor(port, timeoutSeconds = 10, maxLines = 500, filter, onLine) {
48
+ const startTime = Date.now();
49
+ // Resolve port
50
+ const resolved = findCrosspadPort(port);
51
+ if (resolved.error) {
52
+ return {
53
+ success: false,
54
+ port: "",
55
+ duration_seconds: 0,
56
+ lines: [],
57
+ line_count: 0,
58
+ truncated: false,
59
+ error: resolved.error,
60
+ };
61
+ }
62
+ const targetPort = resolved.port;
63
+ onLine?.("stdout", `[idf-monitor] Capturing from ${targetPort} for ${timeoutSeconds}s...`);
64
+ // Get IDF environment (for Python with pyserial)
65
+ let env;
66
+ try {
67
+ env = getIdfEnv();
68
+ }
69
+ catch (err) {
70
+ return {
71
+ success: false,
72
+ port: targetPort,
73
+ duration_seconds: 0,
74
+ lines: [],
75
+ line_count: 0,
76
+ truncated: false,
77
+ error: `Failed to initialize IDF environment: ${err.message}`,
78
+ };
79
+ }
80
+ const script = buildSerialReaderScript(targetPort, timeoutSeconds);
81
+ const shell = IS_WINDOWS ? "cmd.exe" : "/bin/bash";
82
+ return new Promise((resolve) => {
83
+ const lines = [];
84
+ let totalLines = 0;
85
+ let truncated = false;
86
+ let stdoutBuf = "";
87
+ // Run Python script with IDF env (has pyserial on PATH)
88
+ const child = spawn("python3", ["-c", script], {
89
+ env,
90
+ shell: false,
91
+ stdio: ["pipe", "pipe", "pipe"],
92
+ windowsHide: true,
93
+ });
94
+ // Safety kill: slightly after the Python timeout
95
+ const timer = setTimeout(() => {
96
+ onLine?.("stdout", `[idf-monitor] Timeout reached (${timeoutSeconds}s), stopping...`);
97
+ child.kill("SIGTERM");
98
+ setTimeout(() => {
99
+ if (!child.killed)
100
+ child.kill("SIGKILL");
101
+ }, 2000);
102
+ }, (timeoutSeconds + 3) * 1000);
103
+ function processLine(line) {
104
+ // Strip ANSI escape codes
105
+ const clean = line.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, "").replace(/\r/g, "");
106
+ if (!clean.trim())
107
+ return;
108
+ totalLines++;
109
+ // Apply filter if specified
110
+ if (filter && !clean.toLowerCase().includes(filter.toLowerCase())) {
111
+ return;
112
+ }
113
+ if (lines.length < maxLines) {
114
+ lines.push(clean);
115
+ onLine?.("stdout", clean);
116
+ }
117
+ else {
118
+ truncated = true;
119
+ }
120
+ }
121
+ child.stdout?.on("data", (chunk) => {
122
+ stdoutBuf += chunk.toString();
123
+ const parts = stdoutBuf.split("\n");
124
+ for (let i = 0; i < parts.length - 1; i++) {
125
+ processLine(parts[i]);
126
+ }
127
+ stdoutBuf = parts[parts.length - 1];
128
+ });
129
+ child.stderr?.on("data", (chunk) => {
130
+ const text = chunk.toString();
131
+ for (const sline of text.split("\n")) {
132
+ if (sline.trim()) {
133
+ onLine?.("stderr", sline.replace(/\r/g, ""));
134
+ }
135
+ }
136
+ });
137
+ child.on("close", (code) => {
138
+ clearTimeout(timer);
139
+ if (stdoutBuf.trim()) {
140
+ processLine(stdoutBuf);
141
+ }
142
+ const duration = (Date.now() - startTime) / 1000;
143
+ onLine?.("stdout", `[idf-monitor] Captured ${lines.length} lines in ${duration.toFixed(1)}s`);
144
+ resolve({
145
+ success: code === 0 || lines.length > 0,
146
+ port: targetPort,
147
+ duration_seconds: duration,
148
+ lines,
149
+ line_count: totalLines,
150
+ truncated,
151
+ });
152
+ });
153
+ child.on("error", (err) => {
154
+ clearTimeout(timer);
155
+ const duration = (Date.now() - startTime) / 1000;
156
+ resolve({
157
+ success: false,
158
+ port: targetPort,
159
+ duration_seconds: duration,
160
+ lines,
161
+ line_count: totalLines,
162
+ truncated,
163
+ error: err.message,
164
+ });
165
+ });
166
+ });
167
+ }
168
+ //# sourceMappingURL=idf-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idf-monitor.js","sourceRoot":"","sources":["../../src/tools/idf-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Send MIDI events to the CrossPad simulator via TCP remote control.
3
+ *
4
+ * Supports: note_on, note_off, cc (control change), program_change.
5
+ * Uses the same remote control protocol as other sim commands.
6
+ */
7
+ export type MidiEventType = "note_on" | "note_off" | "cc" | "program_change";
8
+ export interface MidiSendParams {
9
+ type: MidiEventType;
10
+ channel: number;
11
+ note?: number;
12
+ velocity?: number;
13
+ cc_num?: number;
14
+ value?: number;
15
+ program?: number;
16
+ }
17
+ export interface MidiSendResult {
18
+ success: boolean;
19
+ type: MidiEventType;
20
+ channel: number;
21
+ details: Record<string, number>;
22
+ error?: string;
23
+ }
24
+ /**
25
+ * Send a MIDI event to the running simulator.
26
+ */
27
+ export declare function crosspadMidiSend(params: MidiSendParams): Promise<MidiSendResult>;