crosspad-mcp-server 9.1.1 → 9.2.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/dist/config.d.ts +7 -0
  2. package/dist/config.js +15 -0
  3. package/dist/config.js.map +1 -1
  4. package/dist/index.js +125 -25
  5. package/dist/index.js.map +1 -1
  6. package/dist/tools/stm-build.d.ts +23 -0
  7. package/dist/tools/stm-build.js +78 -0
  8. package/dist/tools/stm-build.js.map +1 -0
  9. package/dist/tools/stm-flash.d.ts +36 -0
  10. package/dist/tools/stm-flash.js +112 -0
  11. package/dist/tools/stm-flash.js.map +1 -0
  12. package/dist/tools/trace-session.d.ts +12 -0
  13. package/dist/tools/trace-session.js +69 -0
  14. package/dist/tools/trace-session.js.map +1 -1
  15. package/dist/tools/trace-webui.d.ts +14 -7
  16. package/dist/tools/trace-webui.js +77 -33
  17. package/dist/tools/trace-webui.js.map +1 -1
  18. package/dist/tools/trace-write.d.ts +9 -0
  19. package/dist/tools/trace-write.js +32 -0
  20. package/dist/tools/trace-write.js.map +1 -0
  21. package/dist/utils/userConfig.d.ts +9 -0
  22. package/dist/utils/userConfig.js.map +1 -1
  23. package/package.json +2 -1
  24. package/skills/swd-tracer/SKILL.md +48 -0
  25. package/tracer/PROTOCOL.md +69 -0
  26. package/tracer/swd_tracer.py +449 -12
  27. package/tracer/ui/config.js +40 -0
  28. package/tracer/ui/connection.js +170 -0
  29. package/tracer/ui/index.html +50 -798
  30. package/tracer/ui/main.js +30 -0
  31. package/tracer/ui/plot.js +337 -0
  32. package/tracer/ui/signals.js +39 -0
  33. package/tracer/ui/state.js +57 -0
  34. package/tracer/ui/stats.js +52 -0
  35. package/tracer/ui/style.css +97 -0
  36. package/tracer/ui/symbols.js +80 -0
  37. package/tracer/ui/toolbar.js +95 -0
  38. package/tracer/ui/util.js +62 -0
  39. package/tracer/ui/watchlist.js +179 -0
  40. package/vscode-extension/README.md +32 -0
  41. package/vscode-extension/extension.js +56 -0
  42. package/vscode-extension/package.json +14 -0
@@ -0,0 +1,23 @@
1
+ /**
2
+ * STM32 firmware build (CrossPad r20 single-board target).
3
+ *
4
+ * Drives the CMake + Ninja + arm-none-eabi toolchain via CMakePresets.json:
5
+ * configure → `cmake --preset <Debug|Release>` (binaryDir = build/<preset>)
6
+ * build → `cmake --build build/<preset>`
7
+ *
8
+ * The arm-none-eabi-gcc toolchain is wired through the preset's `toolchainFile`
9
+ * (cmake/gcc-arm-none-eabi.cmake), so no special environment is needed here —
10
+ * unlike PC (MSVC) or IDF (export.sh). GCC diagnostics are the standard
11
+ * `file:line:col: error:` form, so parseErrors/countWarnings from the PC build
12
+ * apply unchanged.
13
+ */
14
+ import { StmPreset } from "../config.js";
15
+ import { OnLine } from "../utils/exec.js";
16
+ import { BuildResult } from "./build.js";
17
+ /**
18
+ * Map the unified build_type axis onto the two STM presets. The repo only
19
+ * defines Debug and Release presets; RelWithDebInfo collapses to Release.
20
+ * @internal exported for testing
21
+ */
22
+ export declare function stmPresetFor(buildType: string): StmPreset;
23
+ export declare function crosspadStmBuild(mode: "incremental" | "clean" | "reconfigure", onLine?: OnLine, buildType?: string, signal?: AbortSignal): Promise<BuildResult>;
@@ -0,0 +1,78 @@
1
+ /**
2
+ * STM32 firmware build (CrossPad r20 single-board target).
3
+ *
4
+ * Drives the CMake + Ninja + arm-none-eabi toolchain via CMakePresets.json:
5
+ * configure → `cmake --preset <Debug|Release>` (binaryDir = build/<preset>)
6
+ * build → `cmake --build build/<preset>`
7
+ *
8
+ * The arm-none-eabi-gcc toolchain is wired through the preset's `toolchainFile`
9
+ * (cmake/gcc-arm-none-eabi.cmake), so no special environment is needed here —
10
+ * unlike PC (MSVC) or IDF (export.sh). GCC diagnostics are the standard
11
+ * `file:line:col: error:` form, so parseErrors/countWarnings from the PC build
12
+ * apply unchanged.
13
+ */
14
+ import fs from "fs";
15
+ import path from "path";
16
+ import { CROSSPAD_STM_ROOT, stmBuildDir, stmArtifact } from "../config.js";
17
+ import { runArgvStream } from "../utils/exec.js";
18
+ import { parseErrors, countWarnings } from "./build.js";
19
+ /**
20
+ * Map the unified build_type axis onto the two STM presets. The repo only
21
+ * defines Debug and Release presets; RelWithDebInfo collapses to Release.
22
+ * @internal exported for testing
23
+ */
24
+ export function stmPresetFor(buildType) {
25
+ return buildType === "Release" || buildType === "RelWithDebInfo" ? "Release" : "Debug";
26
+ }
27
+ export async function crosspadStmBuild(mode, onLine, buildType = "Debug", signal) {
28
+ const startTime = Date.now();
29
+ const preset = stmPresetFor(buildType);
30
+ const buildDir = stmBuildDir(preset);
31
+ const elf = stmArtifact(preset, "elf");
32
+ const emit = onLine ?? (() => { });
33
+ if (!fs.existsSync(CROSSPAD_STM_ROOT)) {
34
+ return {
35
+ success: false,
36
+ duration_seconds: 0,
37
+ errors: [`STM32 repo not found at ${CROSSPAD_STM_ROOT}`],
38
+ warnings_count: 0,
39
+ output_path: elf,
40
+ };
41
+ }
42
+ // Clean: wipe the preset's build dir so the next configure is from scratch.
43
+ if (mode === "clean" && fs.existsSync(buildDir)) {
44
+ emit("stdout", `[stm-build] Cleaning ${buildDir}...`);
45
+ fs.rmSync(buildDir, { recursive: true, force: true });
46
+ }
47
+ // Configure when explicitly asked, or implicitly when the cache is absent
48
+ // (first build, or just-cleaned) — incremental should still bootstrap.
49
+ const cacheExists = fs.existsSync(path.join(buildDir, "CMakeCache.txt"));
50
+ const needConfigure = mode === "clean" || mode === "reconfigure" || !cacheExists;
51
+ if (needConfigure) {
52
+ emit("stdout", `[stm-build] Configuring preset ${preset}...`);
53
+ const cfg = await runArgvStream("cmake", ["--preset", preset], CROSSPAD_STM_ROOT, emit, 600_000, signal);
54
+ if (!cfg.success) {
55
+ const combined = cfg.stdout + "\n" + cfg.stderr;
56
+ return {
57
+ success: false,
58
+ duration_seconds: (Date.now() - startTime) / 1000,
59
+ errors: parseErrors(combined),
60
+ warnings_count: countWarnings(combined),
61
+ output_path: elf,
62
+ };
63
+ }
64
+ }
65
+ emit("stdout", `[stm-build] Building ${preset}...`);
66
+ const build = await runArgvStream("cmake", ["--build", buildDir], CROSSPAD_STM_ROOT, emit, 600_000, signal);
67
+ const combined = build.stdout + "\n" + build.stderr;
68
+ const result = {
69
+ success: build.success,
70
+ duration_seconds: (Date.now() - startTime) / 1000,
71
+ errors: parseErrors(combined),
72
+ warnings_count: countWarnings(combined),
73
+ output_path: elf,
74
+ };
75
+ emit("stdout", `[stm-build] Build ${result.success ? "succeeded" : "FAILED"} in ${result.duration_seconds.toFixed(1)}s`);
76
+ return result;
77
+ }
78
+ //# sourceMappingURL=stm-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stm-build.js","sourceRoot":"","sources":["../../src/tools/stm-build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * STM32 firmware flash via STM32_Programmer_CLI (ST's CubeProgrammer CLI).
3
+ *
4
+ * Two methods, mirroring the invocations documented in the firmware repo's
5
+ * CLAUDE.md:
6
+ * - swd → ST-Link over SWD: -c port=SWD freq=4000 -w <bin> 0x08000000 -rst --start 0x08000000
7
+ * - dfu → USB DFU bootloader: -c port=USB1 -w <bin> 0x08000000 -s 0x08000000
8
+ * (board must be in ST system bootloader — hold pad 1 at boot, or
9
+ * trigger boot_request_dfu).
10
+ *
11
+ * The flasher binary is resolved from user config → $STM32_PROG → PATH; if none
12
+ * resolves we fail early with actionable guidance rather than spawning garbage.
13
+ */
14
+ import { OnLine } from "../utils/exec.js";
15
+ export interface StmFlashResult {
16
+ success: boolean;
17
+ method: "swd" | "dfu";
18
+ programmer: string;
19
+ firmware_path: string;
20
+ duration_seconds: number;
21
+ output_tail: string[];
22
+ error?: string;
23
+ }
24
+ /**
25
+ * Resolve the STM32_Programmer_CLI binary. Order: user config →
26
+ * $STM32_PROG env → PATH lookup. Returns null when nothing usable is found.
27
+ * @internal exported for testing
28
+ */
29
+ export declare function resolveProgrammer(): string | null;
30
+ /**
31
+ * Build the STM32_Programmer_CLI argv for a flash method. No shell — bin path
32
+ * may be user-supplied, so it never touches a command line.
33
+ * @internal exported for testing
34
+ */
35
+ export declare function stmFlashArgv(method: "swd" | "dfu", bin: string): string[];
36
+ export declare function crosspadStmFlash(method: "swd" | "dfu", buildType: string | undefined, firmwarePath: string | undefined, onLine?: OnLine, signal?: AbortSignal): Promise<StmFlashResult>;
@@ -0,0 +1,112 @@
1
+ /**
2
+ * STM32 firmware flash via STM32_Programmer_CLI (ST's CubeProgrammer CLI).
3
+ *
4
+ * Two methods, mirroring the invocations documented in the firmware repo's
5
+ * CLAUDE.md:
6
+ * - swd → ST-Link over SWD: -c port=SWD freq=4000 -w <bin> 0x08000000 -rst --start 0x08000000
7
+ * - dfu → USB DFU bootloader: -c port=USB1 -w <bin> 0x08000000 -s 0x08000000
8
+ * (board must be in ST system bootloader — hold pad 1 at boot, or
9
+ * trigger boot_request_dfu).
10
+ *
11
+ * The flasher binary is resolved from user config → $STM32_PROG → PATH; if none
12
+ * resolves we fail early with actionable guidance rather than spawning garbage.
13
+ */
14
+ import fs from "fs";
15
+ import { spawnSync } from "child_process";
16
+ import { CROSSPAD_STM_ROOT, stmArtifact, STM_FLASH_ADDR, IS_WINDOWS } from "../config.js";
17
+ import { runArgvStream } from "../utils/exec.js";
18
+ import { loadUserConfig } from "../utils/userConfig.js";
19
+ /**
20
+ * Resolve the STM32_Programmer_CLI binary. Order: user config →
21
+ * $STM32_PROG env → PATH lookup. Returns null when nothing usable is found.
22
+ * @internal exported for testing
23
+ */
24
+ export function resolveProgrammer() {
25
+ const cfg = loadUserConfig();
26
+ if (cfg.stm_programmer_cli && fs.existsSync(cfg.stm_programmer_cli)) {
27
+ return cfg.stm_programmer_cli;
28
+ }
29
+ const fromEnv = process.env.STM32_PROG;
30
+ if (fromEnv && fs.existsSync(fromEnv))
31
+ return fromEnv;
32
+ const finder = IS_WINDOWS ? "where" : "which";
33
+ try {
34
+ const r = spawnSync(finder, ["STM32_Programmer_CLI"], { encoding: "utf-8", timeout: 5000 });
35
+ if (r.status === 0) {
36
+ const first = (r.stdout || "").split("\n").map((s) => s.trim()).find(Boolean);
37
+ if (first)
38
+ return first;
39
+ }
40
+ }
41
+ catch {
42
+ // which/where absent — fall through to null.
43
+ }
44
+ return null;
45
+ }
46
+ /**
47
+ * Build the STM32_Programmer_CLI argv for a flash method. No shell — bin path
48
+ * may be user-supplied, so it never touches a command line.
49
+ * @internal exported for testing
50
+ */
51
+ export function stmFlashArgv(method, bin) {
52
+ if (method === "swd") {
53
+ return ["-c", "port=SWD", "freq=4000", "-w", bin, STM_FLASH_ADDR, "-rst", "--start", STM_FLASH_ADDR];
54
+ }
55
+ return ["-c", "port=USB1", "-w", bin, STM_FLASH_ADDR, "-s", STM_FLASH_ADDR];
56
+ }
57
+ function presetFor(buildType) {
58
+ return buildType === "Release" || buildType === "RelWithDebInfo" ? "Release" : "Debug";
59
+ }
60
+ export async function crosspadStmFlash(method, buildType = "Debug", firmwarePath, onLine, signal) {
61
+ const startTime = Date.now();
62
+ const emit = onLine ?? (() => { });
63
+ const bin = firmwarePath ?? stmArtifact(presetFor(buildType), "bin");
64
+ const fail = (error) => ({
65
+ success: false, method, programmer: "", firmware_path: bin,
66
+ duration_seconds: (Date.now() - startTime) / 1000, output_tail: [], error,
67
+ });
68
+ if (!fs.existsSync(CROSSPAD_STM_ROOT)) {
69
+ return fail(`STM32 repo not found at ${CROSSPAD_STM_ROOT}`);
70
+ }
71
+ const programmer = resolveProgrammer();
72
+ if (!programmer) {
73
+ return fail("STM32_Programmer_CLI not found. Set it via crosspad_trace action=config_set " +
74
+ "key=stm_programmer_cli value=<path>, the STM32_PROG env var, or put it on PATH.");
75
+ }
76
+ if (!fs.existsSync(bin)) {
77
+ return fail(`Firmware not found at ${bin}. Run crosspad_build platform=stm first.`);
78
+ }
79
+ const argv = stmFlashArgv(method, bin);
80
+ emit("stdout", `[stm-flash] Flashing via ${method.toUpperCase()} with ${programmer}...`);
81
+ emit("stdout", `[stm-flash] Firmware: ${bin}`);
82
+ const result = await runArgvStream(programmer, argv, CROSSPAD_STM_ROOT, emit, 180_000, signal);
83
+ const combined = result.stdout + "\n" + result.stderr;
84
+ const tail = combined.split("\n").filter((l) => l.trim()).slice(-20);
85
+ const duration = (Date.now() - startTime) / 1000;
86
+ emit("stdout", `[stm-flash] Flash ${result.success ? "completed" : "FAILED"} in ${duration.toFixed(1)}s`);
87
+ return {
88
+ success: result.success,
89
+ method,
90
+ programmer,
91
+ firmware_path: bin,
92
+ duration_seconds: duration,
93
+ output_tail: tail,
94
+ error: result.success ? undefined : extractFlashError(combined),
95
+ };
96
+ }
97
+ /** Pull the most relevant error line out of STM32_Programmer_CLI output. */
98
+ function extractFlashError(output) {
99
+ for (const line of output.split("\n").reverse()) {
100
+ const trimmed = line.trim();
101
+ if (!trimmed)
102
+ continue;
103
+ // CubeProgrammer prefixes failures with "Error:" and connection issues
104
+ // with "No STM32 target found" / "Error: No debug probe detected".
105
+ if (/^Error\b/i.test(trimmed) || /error:/i.test(trimmed) ||
106
+ /no (stm32 target|debug probe|device)/i.test(trimmed) || /failed/i.test(trimmed)) {
107
+ return trimmed;
108
+ }
109
+ }
110
+ return "Flash failed. Check output for details.";
111
+ }
112
+ //# sourceMappingURL=stm-flash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stm-flash.js","sourceRoot":"","sources":["../../src/tools/stm-flash.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { TraceBuffer } from "./trace-buffer.js";
2
+ export declare function parseOneShot(out: string, type: string): any;
2
3
  export interface SignalSpec {
3
4
  name: string;
4
5
  address: number;
@@ -116,3 +117,14 @@ export declare class TraceSession {
116
117
  }
117
118
  export declare function getActiveSession(): TraceSession | null;
118
119
  export declare function setActiveSession(s: TraceSession | null): void;
120
+ export declare function traceWrite(writes: string[]): Promise<{
121
+ ok: boolean;
122
+ results?: any[];
123
+ error?: string;
124
+ }>;
125
+ export declare function traceCall(func: string, args: number[], confirm: boolean, retType: string, timeout: number): Promise<{
126
+ ok: boolean;
127
+ r0?: number;
128
+ decoded?: any;
129
+ error?: string;
130
+ }>;
@@ -5,6 +5,31 @@ import { TraceBuffer } from "./trace-buffer.js";
5
5
  import { daemonPath, resolvedPython, resolvedElf } from "./trace-symbols.js";
6
6
  import { resolveConfigValue } from "../utils/userConfig.js";
7
7
  import { TRACE_DIR_DEFAULT } from "../config.js";
8
+ import { runArgvStream } from "../utils/exec.js";
9
+ import { buildWriteArgv, buildCallArgv, writeStdinCmd, callStdinCmd, parseResultFrame, } from "./trace-write.js";
10
+ // ── §write/call cmd-id correlation ────────────────────────────────────────────
11
+ const pendingCmds = new Map();
12
+ let cmdIdSeq = 1;
13
+ function nextCmdId() { return cmdIdSeq++; }
14
+ function sendAndAwait(stdin, line, id, timeoutMs) {
15
+ return new Promise((resolve) => {
16
+ const timer = setTimeout(() => { pendingCmds.delete(id); resolve(null); }, timeoutMs);
17
+ pendingCmds.set(id, (frame) => { clearTimeout(timer); resolve(frame); });
18
+ stdin.write(line + "\n");
19
+ });
20
+ }
21
+ export function parseOneShot(out, type) {
22
+ const lines = out.split("\n").map((l) => l.trim()).filter(Boolean);
23
+ for (let i = lines.length - 1; i >= 0; i--) {
24
+ if (lines[i].startsWith("{") && lines[i].includes(`"${type}"`)) {
25
+ try {
26
+ return JSON.parse(lines[i]);
27
+ }
28
+ catch { /* keep scanning */ }
29
+ }
30
+ }
31
+ return { ok: false, error: out.split("\n").filter(Boolean).slice(-3).join(" | ") || "no output" };
32
+ }
8
33
  /** Pure: parse one NDJSON line from the daemon into a Frame, or null. */
9
34
  export function parseFrame(line) {
10
35
  const s = line.trim();
@@ -170,6 +195,17 @@ export class TraceSession {
170
195
  const parts = this.stdoutBuf.split("\n");
171
196
  this.stdoutBuf = parts.pop() ?? "";
172
197
  for (const line of parts) {
198
+ // §write/call id correlation: check pending cmds on every NDJSON line.
199
+ if (pendingCmds.size > 0) {
200
+ for (const [id, resolve] of pendingCmds) {
201
+ const m = parseResultFrame(line, id);
202
+ if (m.match) {
203
+ pendingCmds.delete(id);
204
+ resolve(m.frame);
205
+ break;
206
+ }
207
+ }
208
+ }
173
209
  const f = parseFrame(line);
174
210
  if (!f)
175
211
  continue;
@@ -343,4 +379,37 @@ export class TraceSession {
343
379
  let active = null;
344
380
  export function getActiveSession() { return active; }
345
381
  export function setActiveSession(s) { active = s; }
382
+ // ── §write/call public API ────────────────────────────────────────────────────
383
+ export async function traceWrite(writes) {
384
+ const session = active;
385
+ const stdin = session?.isRunning() ? session.proc?.stdin : undefined;
386
+ if (stdin) {
387
+ const id = nextCmdId();
388
+ const frame = await sendAndAwait(stdin, writeStdinCmd(id, writes), id, 8000);
389
+ if (!frame)
390
+ return { ok: false, error: "write timed out (no result frame)" };
391
+ return { ok: frame.ok, results: frame.results };
392
+ }
393
+ // one-shot fallback
394
+ let out = "";
395
+ await runArgvStream(resolvedPython(), [daemonPath(), ...buildWriteArgv(resolvedElf(), writes)], process.cwd(), (s, l) => { if (s === "stdout")
396
+ out += l + "\n"; }, 30_000);
397
+ return parseOneShot(out, "write_result");
398
+ }
399
+ export async function traceCall(func, args, confirm, retType, timeout) {
400
+ const session = active;
401
+ const stdin = session?.isRunning() ? session.proc?.stdin : undefined;
402
+ if (stdin) {
403
+ const id = nextCmdId();
404
+ const frame = await sendAndAwait(stdin, callStdinCmd(id, func, args, confirm, retType, timeout), id, Math.max(8000, timeout * 1000 + 4000));
405
+ if (!frame)
406
+ return { ok: false, error: "call timed out (no result frame)" };
407
+ return frame;
408
+ }
409
+ // one-shot fallback
410
+ let out = "";
411
+ await runArgvStream(resolvedPython(), [daemonPath(), ...buildCallArgv(resolvedElf(), func, args, confirm, retType, timeout)], process.cwd(), (s, l) => { if (s === "stdout")
412
+ out += l + "\n"; }, Math.round(timeout * 1000) + 30_000);
413
+ return parseOneShot(out, "call_result");
414
+ }
346
415
  //# sourceMappingURL=trace-session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"trace-session.js","sourceRoot":"","sources":["../../src/tools/trace-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace-session.js","sourceRoot":"","sources":["../../src/tools/trace-session.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,24 @@
1
1
  import type { TraceSession } from "./trace-session.js";
2
2
  export declare function buildUiUrl(port: number): string;
3
+ /** Resolve a request route to a static UI asset path, GUARDED against path
4
+ * traversal: the resolved path must stay inside the ui directory. Returns null
5
+ * for "/" (handled separately as index.html) and for anything escaping the dir.
6
+ * Pure (no fs access) so it can be unit-tested. */
7
+ export declare function resolveStaticAsset(route: string): {
8
+ filePath: string;
9
+ contentType: string;
10
+ } | null;
3
11
  /** Allow a WS upgrade only from a loopback Origin, or when no Origin is sent
4
12
  * (native/non-browser clients). Defends against cross-site WebSocket hijacking. */
5
13
  export declare function originIsLoopback(info: {
6
14
  origin?: string;
7
15
  }): boolean;
8
- /** §12.4 best-effort browser opener. Spawns the platform opener detached so the
9
- * MCP server never owns the browser process, swallows every failure (a missing
10
- * opener / headless box must never throw), and SKIPS when:
11
- * - CROSSPAD_TRACE_NO_BROWSER is set (explicit opt-out), or
12
- * - on linux when neither DISPLAY nor WAYLAND_DISPLAY is set (headless no GUI
13
- * to pop, so xdg-open would just error).
14
- * Returns true if an opener was actually spawned, false if skipped. */
16
+ /** §12.4 best-effort open of the dashboard in the SYSTEM browser the fallback
17
+ * used by the `start` watchdog (§12.6) when nobody opened the in-editor link.
18
+ * Routing/mode (vscode-link vs immediate vs none) is decided by the caller in
19
+ * index.ts; this just does the actual system-browser open. SKIPS (returns
20
+ * false) when CROSSPAD_TRACE_NO_BROWSER is set, or on linux with no
21
+ * DISPLAY/WAYLAND_DISPLAY (headless). Never throws. */
15
22
  export declare function openInBrowser(url: string): boolean;
16
23
  /**
17
24
  * §12.1 Persistent dashboard singleton. ONE http+ws server that OUTLIVES trace
@@ -5,49 +5,22 @@ import { spawn } from "child_process";
5
5
  import { fileURLToPath } from "url";
6
6
  import { WebSocketServer } from "ws";
7
7
  import { listSymbols, resolvedElf } from "./trace-symbols.js";
8
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
- function uiHtmlPath() { return path.resolve(__dirname, "..", "..", "tracer", "ui", "index.html"); }
10
- export function buildUiUrl(port) { return `http://localhost:${port}/`; }
11
- /** Allow a WS upgrade only from a loopback Origin, or when no Origin is sent
12
- * (native/non-browser clients). Defends against cross-site WebSocket hijacking. */
13
- export function originIsLoopback(info) {
14
- if (!info.origin)
15
- return true;
16
- try {
17
- const h = new URL(info.origin).hostname;
18
- return h === "localhost" || h === "127.0.0.1" || h === "::1";
19
- }
20
- catch {
21
- return false;
22
- }
23
- }
24
- /** §12.4 best-effort browser opener. Spawns the platform opener detached so the
25
- * MCP server never owns the browser process, swallows every failure (a missing
26
- * opener / headless box must never throw), and SKIPS when:
27
- * - CROSSPAD_TRACE_NO_BROWSER is set (explicit opt-out), or
28
- * - on linux when neither DISPLAY nor WAYLAND_DISPLAY is set (headless — no GUI
29
- * to pop, so xdg-open would just error).
30
- * Returns true if an opener was actually spawned, false if skipped. */
31
- export function openInBrowser(url) {
32
- if (process.env.CROSSPAD_TRACE_NO_BROWSER)
33
- return false;
8
+ /** Spawn the OS system-browser opener for an http url. Detached + never throws. */
9
+ function spawnOpener(target) {
34
10
  const platform = process.platform;
35
- if (platform === "linux" && !process.env.DISPLAY && !process.env.WAYLAND_DISPLAY)
36
- return false;
37
11
  try {
38
- let cmd;
39
- let args;
12
+ let cmd, args;
40
13
  if (platform === "darwin") {
41
14
  cmd = "open";
42
- args = [url];
15
+ args = [target];
43
16
  }
44
17
  else if (platform === "win32") {
45
18
  cmd = "cmd";
46
- args = ["/c", "start", "", url];
19
+ args = ["/c", "start", "", target];
47
20
  }
48
21
  else {
49
22
  cmd = "xdg-open";
50
- args = [url];
23
+ args = [target];
51
24
  }
52
25
  const child = spawn(cmd, args, { detached: true, stdio: "ignore" });
53
26
  child.on("error", () => { });
@@ -58,6 +31,65 @@ export function openInBrowser(url) {
58
31
  return false;
59
32
  }
60
33
  }
34
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
35
+ function uiDir() { return path.resolve(__dirname, "..", "..", "tracer", "ui"); }
36
+ function uiHtmlPath() { return path.resolve(uiDir(), "index.html"); }
37
+ export function buildUiUrl(port) { return `http://localhost:${port}/`; }
38
+ /** Content types for the static UI assets the dashboard serves (the ESM modules
39
+ * + stylesheet split out of index.html). */
40
+ const CONTENT_TYPES = {
41
+ ".html": "text/html",
42
+ ".js": "text/javascript",
43
+ ".mjs": "text/javascript",
44
+ ".css": "text/css",
45
+ ".json": "application/json",
46
+ ".map": "application/json",
47
+ ".svg": "image/svg+xml",
48
+ ".ico": "image/x-icon",
49
+ };
50
+ /** Resolve a request route to a static UI asset path, GUARDED against path
51
+ * traversal: the resolved path must stay inside the ui directory. Returns null
52
+ * for "/" (handled separately as index.html) and for anything escaping the dir.
53
+ * Pure (no fs access) so it can be unit-tested. */
54
+ export function resolveStaticAsset(route) {
55
+ if (route === "/" || route === "")
56
+ return null;
57
+ const rel = route.replace(/^\/+/, "");
58
+ if (!rel)
59
+ return null;
60
+ const dir = uiDir();
61
+ const full = path.resolve(dir, rel);
62
+ if (full !== dir && !full.startsWith(dir + path.sep))
63
+ return null; // traversal guard
64
+ const ext = path.extname(full).toLowerCase();
65
+ return { filePath: full, contentType: CONTENT_TYPES[ext] ?? "application/octet-stream" };
66
+ }
67
+ /** Allow a WS upgrade only from a loopback Origin, or when no Origin is sent
68
+ * (native/non-browser clients). Defends against cross-site WebSocket hijacking. */
69
+ export function originIsLoopback(info) {
70
+ if (!info.origin)
71
+ return true;
72
+ try {
73
+ const h = new URL(info.origin).hostname;
74
+ return h === "localhost" || h === "127.0.0.1" || h === "::1";
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ }
80
+ /** §12.4 best-effort open of the dashboard in the SYSTEM browser — the fallback
81
+ * used by the `start` watchdog (§12.6) when nobody opened the in-editor link.
82
+ * Routing/mode (vscode-link vs immediate vs none) is decided by the caller in
83
+ * index.ts; this just does the actual system-browser open. SKIPS (returns
84
+ * false) when CROSSPAD_TRACE_NO_BROWSER is set, or on linux with no
85
+ * DISPLAY/WAYLAND_DISPLAY (headless). Never throws. */
86
+ export function openInBrowser(url) {
87
+ if (process.env.CROSSPAD_TRACE_NO_BROWSER)
88
+ return false;
89
+ if (process.platform === "linux" && !process.env.DISPLAY && !process.env.WAYLAND_DISPLAY)
90
+ return false;
91
+ return spawnOpener(url);
92
+ }
61
93
  /**
62
94
  * §12.1 Persistent dashboard singleton. ONE http+ws server that OUTLIVES trace
63
95
  * sessions for the MCP server's whole lifetime. `currentSession` is mutable:
@@ -101,6 +133,18 @@ export class Dashboard {
101
133
  this.serveSymbols(url, res);
102
134
  return;
103
135
  }
136
+ // Static UI assets (style.css, ESM modules). Traversal-guarded resolve.
137
+ const asset = resolveStaticAsset(route);
138
+ if (asset) {
139
+ try {
140
+ if (fs.statSync(asset.filePath).isFile()) {
141
+ res.writeHead(200, { "Content-Type": asset.contentType });
142
+ res.end(fs.readFileSync(asset.filePath));
143
+ return;
144
+ }
145
+ }
146
+ catch { /* missing/not a file → fall through to 404 */ }
147
+ }
104
148
  res.writeHead(404);
105
149
  res.end();
106
150
  });