agent-debugger 0.1.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 (64) hide show
  1. package/README.md +131 -0
  2. package/bin/agent-debugger +2 -0
  3. package/dist/src/adapters/base.d.ts +45 -0
  4. package/dist/src/adapters/base.d.ts.map +1 -0
  5. package/dist/src/adapters/base.js +3 -0
  6. package/dist/src/adapters/base.js.map +1 -0
  7. package/dist/src/adapters/go.d.ts +27 -0
  8. package/dist/src/adapters/go.d.ts.map +1 -0
  9. package/dist/src/adapters/go.js +144 -0
  10. package/dist/src/adapters/go.js.map +1 -0
  11. package/dist/src/adapters/node.d.ts +27 -0
  12. package/dist/src/adapters/node.d.ts.map +1 -0
  13. package/dist/src/adapters/node.js +197 -0
  14. package/dist/src/adapters/node.js.map +1 -0
  15. package/dist/src/adapters/python.d.ts +27 -0
  16. package/dist/src/adapters/python.d.ts.map +1 -0
  17. package/dist/src/adapters/python.js +152 -0
  18. package/dist/src/adapters/python.js.map +1 -0
  19. package/dist/src/adapters/registry.d.ts +10 -0
  20. package/dist/src/adapters/registry.d.ts.map +1 -0
  21. package/dist/src/adapters/registry.js +45 -0
  22. package/dist/src/adapters/registry.js.map +1 -0
  23. package/dist/src/adapters/rust.d.ts +27 -0
  24. package/dist/src/adapters/rust.d.ts.map +1 -0
  25. package/dist/src/adapters/rust.js +149 -0
  26. package/dist/src/adapters/rust.js.map +1 -0
  27. package/dist/src/cli.d.ts +4 -0
  28. package/dist/src/cli.d.ts.map +1 -0
  29. package/dist/src/cli.js +326 -0
  30. package/dist/src/cli.js.map +1 -0
  31. package/dist/src/daemon.d.ts +3 -0
  32. package/dist/src/daemon.d.ts.map +1 -0
  33. package/dist/src/daemon.js +136 -0
  34. package/dist/src/daemon.js.map +1 -0
  35. package/dist/src/dap-client.d.ts +35 -0
  36. package/dist/src/dap-client.d.ts.map +1 -0
  37. package/dist/src/dap-client.js +256 -0
  38. package/dist/src/dap-client.js.map +1 -0
  39. package/dist/src/dap-types.d.ts +52 -0
  40. package/dist/src/dap-types.d.ts.map +1 -0
  41. package/dist/src/dap-types.js +3 -0
  42. package/dist/src/dap-types.js.map +1 -0
  43. package/dist/src/protocol.d.ts +253 -0
  44. package/dist/src/protocol.d.ts.map +1 -0
  45. package/dist/src/protocol.js +50 -0
  46. package/dist/src/protocol.js.map +1 -0
  47. package/dist/src/session.d.ts +30 -0
  48. package/dist/src/session.d.ts.map +1 -0
  49. package/dist/src/session.js +407 -0
  50. package/dist/src/session.js.map +1 -0
  51. package/dist/src/util/paths.d.ts +5 -0
  52. package/dist/src/util/paths.d.ts.map +1 -0
  53. package/dist/src/util/paths.js +7 -0
  54. package/dist/src/util/paths.js.map +1 -0
  55. package/dist/src/util/ports.d.ts +3 -0
  56. package/dist/src/util/ports.d.ts.map +1 -0
  57. package/dist/src/util/ports.js +19 -0
  58. package/dist/src/util/ports.js.map +1 -0
  59. package/dist/test/protocol.test.d.ts +2 -0
  60. package/dist/test/protocol.test.d.ts.map +1 -0
  61. package/dist/test/protocol.test.js +25 -0
  62. package/dist/test/protocol.test.js.map +1 -0
  63. package/package.json +55 -0
  64. package/skills/agent-debugger/SKILL.md +225 -0
@@ -0,0 +1,152 @@
1
+ /** Python debug adapter — debugpy. */
2
+ import { spawn as cpSpawn } from "node:child_process";
3
+ import { getFreePort } from "../util/ports.js";
4
+ export class PythonAdapter {
5
+ name = "python";
6
+ async checkInstalled(runtimePath) {
7
+ const python = runtimePath || "python3";
8
+ try {
9
+ await execCheck(python, ["-m", "debugpy", "--version"]);
10
+ return null;
11
+ }
12
+ catch {
13
+ return `debugpy not found. Run: ${python} -m pip install debugpy`;
14
+ }
15
+ }
16
+ async spawn(opts) {
17
+ const python = opts.runtimePath || "python3";
18
+ const port = await getFreePort();
19
+ const proc = cpSpawn(python, ["-Xfrozen_modules=off", "-m", "debugpy.adapter", "--host", "127.0.0.1", "--port", String(port)], { stdio: ["pipe", "pipe", "pipe"] });
20
+ return { process: proc, port };
21
+ }
22
+ initializeArgs() {
23
+ return {
24
+ clientID: "agent-debugger",
25
+ clientName: "agent-debugger",
26
+ adapterID: "debugpy",
27
+ pathFormat: "path",
28
+ linesStartAt1: true,
29
+ columnsStartAt1: true,
30
+ supportsVariableType: true,
31
+ supportsRunInTerminalRequest: false,
32
+ };
33
+ }
34
+ launchArgs(opts) {
35
+ const args = {
36
+ type: "debugpy",
37
+ request: "launch",
38
+ program: opts.program,
39
+ console: "internalConsole",
40
+ stopOnEntry: opts.stopOnEntry ?? false,
41
+ justMyCode: true,
42
+ };
43
+ if (opts.runtimePath) {
44
+ args.python = [opts.runtimePath, "-Xfrozen_modules=off"];
45
+ }
46
+ if (opts.args?.length) {
47
+ args.args = opts.args;
48
+ }
49
+ if (opts.cwd) {
50
+ args.cwd = opts.cwd;
51
+ }
52
+ return args;
53
+ }
54
+ /**
55
+ * debugpy-specific init flow:
56
+ * 1. initialize
57
+ * 2. launch (async — response deferred until configurationDone)
58
+ * 3. wait for initialized event
59
+ * 4. setBreakpoints
60
+ * 5. setExceptionBreakpoints
61
+ * 6. configurationDone
62
+ * 7. wait for deferred launch response
63
+ * 8. wait for stopped event
64
+ */
65
+ async initFlow(client, opts) {
66
+ // 1. Initialize
67
+ const initResp = await client.request("initialize", this.initializeArgs());
68
+ if (!initResp.success) {
69
+ return { error: `Initialize failed: ${initResp.message || "unknown"}` };
70
+ }
71
+ // 2. Launch (async — debugpy defers response until configurationDone)
72
+ const launchSeq = client.requestAsync("launch", this.launchArgs(opts));
73
+ // 3. Wait for initialized event
74
+ const initialized = await client.waitForEvent("initialized", 10000);
75
+ if (!initialized) {
76
+ return { error: "Timeout waiting for initialized event" };
77
+ }
78
+ // 4. Set breakpoints
79
+ const bpResults = [];
80
+ if (opts.breakpoints?.length) {
81
+ for (const bp of opts.breakpoints) {
82
+ const bpArgs = {
83
+ source: { path: bp.file },
84
+ breakpoints: bp.lines.map((line, i) => {
85
+ const entry = { line };
86
+ if (bp.conditions?.[i])
87
+ entry.condition = bp.conditions[i];
88
+ return entry;
89
+ }),
90
+ };
91
+ const resp = await client.request("setBreakpoints", bpArgs);
92
+ if (resp.success && resp.body) {
93
+ const bps = resp.body.breakpoints;
94
+ if (bps) {
95
+ for (const b of bps) {
96
+ bpResults.push({
97
+ file: bp.file,
98
+ line: b.line ?? 0,
99
+ verified: b.verified ?? false,
100
+ });
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ // 5. Exception breakpoints (empty = no exception breaking)
107
+ await client.request("setExceptionBreakpoints", { filters: [] });
108
+ // 6. configurationDone
109
+ await client.request("configurationDone");
110
+ // 7. Wait for the deferred launch response
111
+ const launchResp = await client.waitForResponse(launchSeq, 15000);
112
+ if (!launchResp.success) {
113
+ return { error: `Launch failed: ${launchResp.message || "unknown"}` };
114
+ }
115
+ // 8. Wait for stopped event (breakpoint hit or entry)
116
+ const stopped = await client.waitForEvent("stopped", 15000);
117
+ if (stopped) {
118
+ const body = (stopped.body || {});
119
+ return {
120
+ status: "paused",
121
+ reason: body.reason || "unknown",
122
+ breakpoints: bpResults,
123
+ };
124
+ }
125
+ // Program may have finished without hitting breakpoint
126
+ const terminated = client.drainEvents("terminated");
127
+ if (terminated.length) {
128
+ return { status: "terminated", message: "Program finished without hitting breakpoint" };
129
+ }
130
+ return { status: "running", breakpoints: bpResults };
131
+ }
132
+ isInternalFrame(frame) {
133
+ const path = frame.source?.path || "";
134
+ return path.includes("debugpy") || path.includes("pydevd") || path.includes("<frozen");
135
+ }
136
+ isInternalVariable(v) {
137
+ return v.name.startsWith("__") || v.name === "special variables" || v.name === "function variables";
138
+ }
139
+ }
140
+ function execCheck(cmd, args) {
141
+ return new Promise((resolve, reject) => {
142
+ const proc = cpSpawn(cmd, args, { stdio: "pipe" });
143
+ proc.on("close", (code) => {
144
+ if (code === 0)
145
+ resolve();
146
+ else
147
+ reject(new Error(`${cmd} exited with code ${code}`));
148
+ });
149
+ proc.on("error", reject);
150
+ });
151
+ }
152
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/adapters/python.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** Language detection + adapter lookup. */
2
+ import type { AdapterConfig } from "./base.js";
3
+ /** Detect language from file extension. */
4
+ export declare function detectLanguage(filePath: string): string | null;
5
+ /** Get an adapter by language name. */
6
+ export declare function getAdapter(language: string): AdapterConfig | null;
7
+ /** Detect language from file and return adapter. */
8
+ export declare function getAdapterForFile(filePath: string): AdapterConfig | null;
9
+ export { type AdapterConfig } from "./base.js";
10
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/registry.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAG3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AA4B/C,2CAA2C;AAC3C,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG9D;AAED,uCAAuC;AACvC,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAGjE;AAED,oDAAoD;AACpD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAIxE;AAED,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,45 @@
1
+ /** Language detection + adapter lookup. */
2
+ import { extname } from "node:path";
3
+ import { PythonAdapter } from "./python.js";
4
+ import { NodeAdapter } from "./node.js";
5
+ import { GoAdapter } from "./go.js";
6
+ import { RustAdapter } from "./rust.js";
7
+ const EXTENSION_MAP = {
8
+ ".py": "python",
9
+ ".js": "node",
10
+ ".mjs": "node",
11
+ ".cjs": "node",
12
+ ".ts": "node",
13
+ ".mts": "node",
14
+ ".tsx": "node",
15
+ ".go": "go",
16
+ ".rs": "rust",
17
+ ".c": "rust",
18
+ ".cpp": "rust",
19
+ ".cc": "rust",
20
+ };
21
+ const adapters = {
22
+ python: () => new PythonAdapter(),
23
+ node: () => new NodeAdapter(),
24
+ go: () => new GoAdapter(),
25
+ rust: () => new RustAdapter(),
26
+ };
27
+ /** Detect language from file extension. */
28
+ export function detectLanguage(filePath) {
29
+ const ext = extname(filePath).toLowerCase();
30
+ return EXTENSION_MAP[ext] ?? null;
31
+ }
32
+ /** Get an adapter by language name. */
33
+ export function getAdapter(language) {
34
+ const factory = adapters[language];
35
+ return factory ? factory() : null;
36
+ }
37
+ /** Detect language from file and return adapter. */
38
+ export function getAdapterForFile(filePath) {
39
+ const lang = detectLanguage(filePath);
40
+ if (!lang)
41
+ return null;
42
+ return getAdapter(lang);
43
+ }
44
+ export {} from "./base.js";
45
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/adapters/registry.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAE3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,aAAa,GAA2B;IAC5C,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,MAAM;CACd,CAAC;AAEF,MAAM,QAAQ,GAAwC;IACpD,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IACjC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;IAC7B,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,SAAS,EAAE;IACzB,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;CAC9B,CAAC;AAEF,2CAA2C;AAC3C,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AACpC,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpC,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,OAAO,EAAsB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,27 @@
1
+ /** Rust/C++ debug adapter — CodeLLDB. */
2
+ import type { DAPClient } from "../dap-client.js";
3
+ import type { StackFrame, Variable } from "../dap-types.js";
4
+ import type { CommandResult } from "../protocol.js";
5
+ import type { AdapterConfig, SpawnResult, LaunchOpts, InitFlowOpts } from "./base.js";
6
+ export declare class RustAdapter implements AdapterConfig {
7
+ name: string;
8
+ checkInstalled(): Promise<string | null>;
9
+ spawn(opts: LaunchOpts): Promise<SpawnResult>;
10
+ initializeArgs(): Record<string, unknown>;
11
+ launchArgs(opts: LaunchOpts): Record<string, unknown>;
12
+ /**
13
+ * CodeLLDB DAP init flow (aligned with Python/debugpy pattern):
14
+ * 1. initialize
15
+ * 2. launch (async — response may be deferred)
16
+ * 3. wait for initialized event
17
+ * 4. setBreakpoints
18
+ * 5. setExceptionBreakpoints
19
+ * 6. configurationDone
20
+ * 7. wait for deferred launch response
21
+ * 8. wait for stopped event
22
+ */
23
+ initFlow(client: DAPClient, opts: InitFlowOpts): Promise<CommandResult>;
24
+ isInternalFrame(frame: StackFrame): boolean;
25
+ isInternalVariable(v: Variable): boolean;
26
+ }
27
+ //# sourceMappingURL=rust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust.d.ts","sourceRoot":"","sources":["../../../src/adapters/rust.ts"],"names":[],"mappings":"AAAA,yCAAyC;AAGzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGtF,qBAAa,WAAY,YAAW,aAAa;IAC/C,IAAI,SAAU;IAER,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAaxC,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAgBnD,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYzC,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAWrD;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IA4E7E,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO;IAK3C,kBAAkB,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO;CAGzC"}
@@ -0,0 +1,149 @@
1
+ /** Rust/C++ debug adapter — CodeLLDB. */
2
+ import { spawn as cpSpawn } from "node:child_process";
3
+ import { getFreePort } from "../util/ports.js";
4
+ export class RustAdapter {
5
+ name = "rust";
6
+ async checkInstalled() {
7
+ const codelldbPath = process.env.CODELLDB_PATH;
8
+ if (!codelldbPath) {
9
+ return "CodeLLDB not found. Set CODELLDB_PATH environment variable.";
10
+ }
11
+ try {
12
+ await execCheck(codelldbPath, ["--version"]);
13
+ return null;
14
+ }
15
+ catch {
16
+ return `CodeLLDB not found at ${codelldbPath}`;
17
+ }
18
+ }
19
+ async spawn(opts) {
20
+ const codelldbPath = process.env.CODELLDB_PATH;
21
+ if (!codelldbPath)
22
+ throw new Error("CODELLDB_PATH not set");
23
+ const port = await getFreePort();
24
+ const proc = cpSpawn(codelldbPath, ["--port", String(port)], {
25
+ stdio: ["pipe", "pipe", "pipe"],
26
+ cwd: opts.cwd,
27
+ });
28
+ return { process: proc, port };
29
+ }
30
+ initializeArgs() {
31
+ return {
32
+ clientID: "agent-debugger",
33
+ clientName: "agent-debugger",
34
+ adapterID: "codelldb",
35
+ pathFormat: "path",
36
+ linesStartAt1: true,
37
+ columnsStartAt1: true,
38
+ supportsVariableType: true,
39
+ };
40
+ }
41
+ launchArgs(opts) {
42
+ return {
43
+ type: "lldb",
44
+ request: "launch",
45
+ program: opts.program,
46
+ stopOnEntry: opts.stopOnEntry ?? false,
47
+ args: opts.args || [],
48
+ cwd: opts.cwd,
49
+ };
50
+ }
51
+ /**
52
+ * CodeLLDB DAP init flow (aligned with Python/debugpy pattern):
53
+ * 1. initialize
54
+ * 2. launch (async — response may be deferred)
55
+ * 3. wait for initialized event
56
+ * 4. setBreakpoints
57
+ * 5. setExceptionBreakpoints
58
+ * 6. configurationDone
59
+ * 7. wait for deferred launch response
60
+ * 8. wait for stopped event
61
+ */
62
+ async initFlow(client, opts) {
63
+ // 1. Initialize
64
+ const initResp = await client.request("initialize", this.initializeArgs());
65
+ if (!initResp.success) {
66
+ return { error: `Initialize failed: ${initResp.message || "unknown"}` };
67
+ }
68
+ // 2. Launch (async — CodeLLDB may defer response until configurationDone)
69
+ const launchSeq = client.requestAsync("launch", this.launchArgs(opts));
70
+ // 3. Wait for initialized event
71
+ const initialized = await client.waitForEvent("initialized", 10000);
72
+ if (!initialized) {
73
+ return { error: "Timeout waiting for initialized event" };
74
+ }
75
+ // 4. Set breakpoints
76
+ const bpResults = [];
77
+ if (opts.breakpoints?.length) {
78
+ for (const bp of opts.breakpoints) {
79
+ const bpArgs = {
80
+ source: { path: bp.file },
81
+ breakpoints: bp.lines.map((line, i) => {
82
+ const entry = { line };
83
+ if (bp.conditions?.[i])
84
+ entry.condition = bp.conditions[i];
85
+ return entry;
86
+ }),
87
+ };
88
+ const resp = await client.request("setBreakpoints", bpArgs);
89
+ if (resp.success && resp.body) {
90
+ const bps = resp.body.breakpoints;
91
+ if (bps) {
92
+ for (const b of bps) {
93
+ bpResults.push({
94
+ file: bp.file,
95
+ line: b.line ?? 0,
96
+ verified: b.verified ?? false,
97
+ });
98
+ }
99
+ }
100
+ }
101
+ }
102
+ }
103
+ // 5. Exception breakpoints (empty = no exception breaking, required by spec)
104
+ await client.request("setExceptionBreakpoints", { filters: [] });
105
+ // 6. configurationDone
106
+ await client.request("configurationDone");
107
+ // 7. Wait for the deferred launch response
108
+ const launchResp = await client.waitForResponse(launchSeq, 15000);
109
+ if (!launchResp.success) {
110
+ return { error: `Launch failed: ${launchResp.message || "unknown"}` };
111
+ }
112
+ // 8. Wait for stopped event (breakpoint hit or entry)
113
+ const stopped = await client.waitForEvent("stopped", 15000);
114
+ if (stopped) {
115
+ const body = (stopped.body || {});
116
+ return {
117
+ status: "paused",
118
+ reason: body.reason || "unknown",
119
+ breakpoints: bpResults,
120
+ };
121
+ }
122
+ // Program may have finished without hitting breakpoint
123
+ const terminated = client.drainEvents("terminated");
124
+ if (terminated.length) {
125
+ return { status: "terminated", message: "Program finished without hitting breakpoint" };
126
+ }
127
+ return { status: "running", breakpoints: bpResults };
128
+ }
129
+ isInternalFrame(frame) {
130
+ const name = frame.name || "";
131
+ return name.startsWith("std::") || name.startsWith("core::") || name.includes("__rust_");
132
+ }
133
+ isInternalVariable(v) {
134
+ return v.name.startsWith("__");
135
+ }
136
+ }
137
+ function execCheck(cmd, args) {
138
+ return new Promise((resolve, reject) => {
139
+ const proc = cpSpawn(cmd, args, { stdio: "pipe" });
140
+ proc.on("close", (code) => {
141
+ if (code === 0)
142
+ resolve();
143
+ else
144
+ reject(new Error(`${cmd} exited with code ${code}`));
145
+ });
146
+ proc.on("error", reject);
147
+ });
148
+ }
149
+ //# sourceMappingURL=rust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust.js","sourceRoot":"","sources":["../../../src/adapters/rust.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ /** CLI entry point — thin stateless client that talks to the daemon. */
3
+ export {};
4
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA,wEAAwE"}