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,30 @@
1
+ /** Debug session state machine + command handlers. */
2
+ import type { Command, CommandResult } from "./protocol.js";
3
+ export type SessionState = "idle" | "starting" | "running" | "paused" | "terminated";
4
+ export declare class Session {
5
+ state: SessionState;
6
+ private client;
7
+ private adapter;
8
+ private adapterProcess;
9
+ private threadId;
10
+ private frameId;
11
+ private scriptPath;
12
+ handleCommand(cmd: Command): Promise<CommandResult>;
13
+ private startSession;
14
+ private parseBreakpoints;
15
+ private updateFrame;
16
+ private currentLocation;
17
+ private getVariables;
18
+ private getStack;
19
+ private evalExpression;
20
+ private step;
21
+ private continueExecution;
22
+ private waitForStop;
23
+ private setBreakpoint;
24
+ private getSourceAsync;
25
+ private getStatus;
26
+ getStatusAsync(): Promise<CommandResult>;
27
+ close(): Promise<CommandResult>;
28
+ private cleanup;
29
+ }
30
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAQtD,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAA8B,MAAM,eAAe,CAAC;AAExF,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;AAErF,qBAAa,OAAO;IAClB,KAAK,EAAE,YAAY,CAAU;IAC7B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,UAAU,CAAuB;IAEnC,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;YAyB3C,YAAY;IAoF1B,OAAO,CAAC,gBAAgB;YA2BV,WAAW;YAeX,eAAe;YA2Bf,YAAY;YAkCZ,QAAQ;YAkCR,cAAc;YAgBd,IAAI;YAUJ,iBAAiB;YASjB,WAAW;YAkCX,aAAa;YAoBb,cAAc;IAsC5B,OAAO,CAAC,SAAS;IAOX,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC;IAQxC,KAAK,IAAI,OAAO,CAAC,aAAa,CAAC;YASvB,OAAO;CA8BtB"}
@@ -0,0 +1,407 @@
1
+ /** Debug session state machine + command handlers. */
2
+ import { readFileSync } from "node:fs";
3
+ import { resolve as pathResolve, dirname } from "node:path";
4
+ import { DAPClient } from "./dap-client.js";
5
+ import { getAdapterForFile, getAdapter } from "./adapters/registry.js";
6
+ export class Session {
7
+ state = "idle";
8
+ client = null;
9
+ adapter = null;
10
+ adapterProcess = null;
11
+ threadId = null;
12
+ frameId = null;
13
+ scriptPath = null;
14
+ async handleCommand(cmd) {
15
+ switch (cmd.action) {
16
+ case "start":
17
+ return this.startSession(cmd);
18
+ case "vars":
19
+ return this.getVariables();
20
+ case "stack":
21
+ return this.getStack();
22
+ case "eval":
23
+ return this.evalExpression(cmd.expression);
24
+ case "step":
25
+ return this.step(cmd.kind || "over");
26
+ case "continue":
27
+ return this.continueExecution();
28
+ case "break":
29
+ return this.setBreakpoint(cmd.file, cmd.line, cmd.condition);
30
+ case "source":
31
+ return this.getSourceAsync(cmd.file, cmd.line);
32
+ case "status":
33
+ return this.getStatus();
34
+ case "close":
35
+ return this.close();
36
+ }
37
+ }
38
+ async startSession(cmd) {
39
+ if (this.state !== "idle") {
40
+ return { error: "Session already active. Run 'agent-debugger close' first." };
41
+ }
42
+ const script = pathResolve(cmd.script);
43
+ this.scriptPath = script;
44
+ this.state = "starting";
45
+ // Detect language and get adapter
46
+ const language = cmd.language;
47
+ if (language) {
48
+ this.adapter = getAdapter(language);
49
+ }
50
+ else {
51
+ this.adapter = getAdapterForFile(script);
52
+ }
53
+ if (!this.adapter) {
54
+ this.state = "idle";
55
+ return { error: `Unsupported file type: ${script}. Supported: .py, .js, .ts, .go, .rs, .c, .cpp` };
56
+ }
57
+ // Check adapter is installed
58
+ const installErr = await this.adapter.checkInstalled(cmd.runtime);
59
+ if (installErr) {
60
+ this.state = "idle";
61
+ return { error: installErr };
62
+ }
63
+ // Spawn debug adapter
64
+ try {
65
+ const spawnResult = await this.adapter.spawn({
66
+ program: script,
67
+ args: cmd.args,
68
+ cwd: cmd.cwd || dirname(script),
69
+ stopOnEntry: cmd.stop_on_entry,
70
+ runtimePath: cmd.runtime,
71
+ });
72
+ this.adapterProcess = spawnResult.process;
73
+ // Connect DAP client
74
+ this.client = new DAPClient();
75
+ await this.client.connect("127.0.0.1", spawnResult.port);
76
+ }
77
+ catch (err) {
78
+ this.state = "idle";
79
+ return { error: `Failed to start debug adapter: ${err.message}` };
80
+ }
81
+ // Parse breakpoints
82
+ const breakpoints = this.parseBreakpoints(cmd.breakpoints || []);
83
+ // Run adapter-specific init flow
84
+ const result = await this.adapter.initFlow(this.client, {
85
+ program: script,
86
+ args: cmd.args,
87
+ cwd: cmd.cwd || dirname(script),
88
+ stopOnEntry: cmd.stop_on_entry,
89
+ runtimePath: cmd.runtime,
90
+ breakpoints,
91
+ });
92
+ if (result.error) {
93
+ this.state = "idle";
94
+ await this.cleanup();
95
+ return result;
96
+ }
97
+ if (result.status === "paused") {
98
+ this.state = "paused";
99
+ const body = (this.client.drainEvents("stopped")[0]?.body || {});
100
+ this.threadId = body.threadId ?? 1;
101
+ // threadId may already be set from the initFlow stopped event processing
102
+ // Try to get it from the adapter's result or fallback
103
+ if (!this.threadId)
104
+ this.threadId = 1;
105
+ await this.updateFrame();
106
+ result.location = await this.currentLocation();
107
+ }
108
+ else if (result.status === "terminated") {
109
+ this.state = "terminated";
110
+ }
111
+ else {
112
+ this.state = "running";
113
+ }
114
+ return result;
115
+ }
116
+ parseBreakpoints(raw) {
117
+ const byFile = new Map();
118
+ for (const bp of raw) {
119
+ const parts = bp.split(":");
120
+ if (parts.length < 2)
121
+ continue;
122
+ const file = pathResolve(parts[0]);
123
+ const line = parseInt(parts[1], 10);
124
+ if (isNaN(line))
125
+ continue;
126
+ const condition = parts.length > 2 ? parts.slice(2).join(":") : null;
127
+ let entry = byFile.get(file);
128
+ if (!entry) {
129
+ entry = { lines: [], conditions: [] };
130
+ byFile.set(file, entry);
131
+ }
132
+ entry.lines.push(line);
133
+ entry.conditions.push(condition);
134
+ }
135
+ return Array.from(byFile.entries()).map(([file, data]) => ({
136
+ file,
137
+ lines: data.lines,
138
+ conditions: data.conditions,
139
+ }));
140
+ }
141
+ async updateFrame() {
142
+ if (!this.client || this.threadId === null)
143
+ return;
144
+ const resp = await this.client.request("stackTrace", {
145
+ threadId: this.threadId,
146
+ startFrame: 0,
147
+ levels: 20,
148
+ });
149
+ if (resp.success && resp.body) {
150
+ const frames = resp.body.stackFrames;
151
+ if (frames?.length) {
152
+ this.frameId = frames[0].id;
153
+ }
154
+ }
155
+ }
156
+ async currentLocation() {
157
+ if (!this.client || this.threadId === null)
158
+ return null;
159
+ const resp = await this.client.request("stackTrace", {
160
+ threadId: this.threadId,
161
+ startFrame: 0,
162
+ levels: 20,
163
+ });
164
+ if (resp.success && resp.body) {
165
+ const frames = resp.body.stackFrames;
166
+ if (frames?.length) {
167
+ const f = frames[0];
168
+ return {
169
+ file: f.source?.path || "?",
170
+ line: f.line,
171
+ function: f.name,
172
+ };
173
+ }
174
+ }
175
+ return null;
176
+ }
177
+ async getVariables() {
178
+ if (this.state !== "paused")
179
+ return { error: "Program is not paused" };
180
+ if (!this.client)
181
+ return { error: "No active session" };
182
+ await this.updateFrame();
183
+ if (this.frameId === null)
184
+ return { error: "No frame available" };
185
+ const resp = await this.client.request("scopes", { frameId: this.frameId });
186
+ if (!resp.success)
187
+ return { error: "Failed to get scopes" };
188
+ const scopes = resp.body.scopes || [];
189
+ const result = [];
190
+ for (const scope of scopes) {
191
+ if (scope.name !== "Locals" && scope.name !== "Local")
192
+ continue;
193
+ const varResp = await this.client.request("variables", {
194
+ variablesReference: scope.variablesReference,
195
+ count: 100,
196
+ });
197
+ if (varResp.success && varResp.body) {
198
+ const vars = varResp.body.variables || [];
199
+ for (const v of vars) {
200
+ if (this.adapter?.isInternalVariable(v))
201
+ continue;
202
+ result.push({ name: v.name, value: v.value, type: v.type || "" });
203
+ }
204
+ }
205
+ }
206
+ const location = await this.currentLocation();
207
+ return { variables: result, count: result.length, location };
208
+ }
209
+ async getStack() {
210
+ if (this.state !== "paused")
211
+ return { error: "Program is not paused" };
212
+ if (!this.client || this.threadId === null)
213
+ return { error: "No active session" };
214
+ const resp = await this.client.request("stackTrace", {
215
+ threadId: this.threadId,
216
+ startFrame: 0,
217
+ levels: 50,
218
+ });
219
+ if (!resp.success)
220
+ return { error: "Failed to get stack trace" };
221
+ const rawFrames = resp.body.stackFrames || [];
222
+ const frames = [];
223
+ for (const f of rawFrames) {
224
+ if (this.adapter?.isInternalFrame(f))
225
+ continue;
226
+ frames.push({
227
+ function: f.name,
228
+ file: f.source?.path || "",
229
+ line: f.line,
230
+ });
231
+ }
232
+ return { frames, count: frames.length };
233
+ }
234
+ async evalExpression(expression) {
235
+ if (this.state !== "paused")
236
+ return { error: "Program is not paused" };
237
+ if (!this.client)
238
+ return { error: "No active session" };
239
+ if (!expression)
240
+ return { error: "No expression provided" };
241
+ const args = { expression, context: "repl" };
242
+ if (this.frameId !== null)
243
+ args.frameId = this.frameId;
244
+ const resp = await this.client.request("evaluate", args);
245
+ if (resp.success && resp.body) {
246
+ const body = resp.body;
247
+ return { result: body.result, type: body.type || "" };
248
+ }
249
+ return { error: resp.message || "Evaluation failed" };
250
+ }
251
+ async step(kind) {
252
+ if (this.state !== "paused")
253
+ return { error: "Program is not paused" };
254
+ if (!this.client || this.threadId === null)
255
+ return { error: "No active session" };
256
+ const command = kind === "into" ? "stepIn" : kind === "out" ? "stepOut" : "next";
257
+ await this.client.request(command, { threadId: this.threadId });
258
+ this.state = "running";
259
+ return this.waitForStop();
260
+ }
261
+ async continueExecution() {
262
+ if (this.state !== "paused")
263
+ return { error: "Program is not paused" };
264
+ if (!this.client || this.threadId === null)
265
+ return { error: "No active session" };
266
+ await this.client.request("continue", { threadId: this.threadId });
267
+ this.state = "running";
268
+ return this.waitForStop();
269
+ }
270
+ async waitForStop() {
271
+ if (!this.client)
272
+ return { error: "No active session" };
273
+ // Poll for stopped/terminated events
274
+ while (true) {
275
+ const stopped = await this.client.waitForEvent("stopped", 1000);
276
+ if (stopped) {
277
+ this.state = "paused";
278
+ const body = (stopped.body || {});
279
+ this.threadId = body.threadId ?? this.threadId;
280
+ await this.updateFrame();
281
+ return {
282
+ status: "paused",
283
+ reason: body.reason || "unknown",
284
+ location: await this.currentLocation(),
285
+ };
286
+ }
287
+ const terminated = this.client.drainEvents("terminated");
288
+ const exited = this.client.drainEvents("exited");
289
+ if (terminated.length || exited.length) {
290
+ this.state = "terminated";
291
+ let exitCode = null;
292
+ if (exited.length) {
293
+ exitCode = exited[0].body?.exitCode ?? null;
294
+ }
295
+ return { status: "terminated", exitCode };
296
+ }
297
+ // Drain output events silently
298
+ this.client.drainEvents("output");
299
+ }
300
+ }
301
+ async setBreakpoint(filePath, line, condition) {
302
+ if (!this.client)
303
+ return { error: "No active session" };
304
+ const absPath = pathResolve(filePath);
305
+ const bpArgs = {
306
+ source: { path: absPath },
307
+ breakpoints: [condition ? { line, condition } : { line }],
308
+ };
309
+ const resp = await this.client.request("setBreakpoints", bpArgs);
310
+ if (resp.success && resp.body) {
311
+ const bps = resp.body.breakpoints;
312
+ if (bps?.length) {
313
+ const bp = bps[0];
314
+ return { file: absPath, line: bp.line ?? line, verified: bp.verified ?? false };
315
+ }
316
+ }
317
+ return { error: "Failed to set breakpoint" };
318
+ }
319
+ async getSourceAsync(filePath, line) {
320
+ let resolvedFile = filePath;
321
+ let resolvedLine = line;
322
+ if (!resolvedFile && this.state === "paused") {
323
+ const loc = await this.currentLocation();
324
+ if (loc) {
325
+ resolvedFile = loc.file;
326
+ resolvedLine = resolvedLine ?? loc.line;
327
+ }
328
+ }
329
+ if (!resolvedFile) {
330
+ return { error: "No file specified and not paused at a known location" };
331
+ }
332
+ resolvedFile = pathResolve(resolvedFile);
333
+ let lines;
334
+ try {
335
+ lines = readFileSync(resolvedFile, "utf-8").split("\n");
336
+ }
337
+ catch {
338
+ return { error: `File not found: ${resolvedFile}` };
339
+ }
340
+ const center = (resolvedLine || 1) - 1;
341
+ const start = Math.max(0, center - 5);
342
+ const end = Math.min(lines.length, center + 6);
343
+ const sourceLines = [];
344
+ for (let i = start; i < end; i++) {
345
+ const marker = i === center ? "\u2192" : " ";
346
+ const lineNum = String(i + 1).padStart(4);
347
+ sourceLines.push(`${marker} ${lineNum} \u2502 ${lines[i]}`);
348
+ }
349
+ return { file: resolvedFile, line: resolvedLine, source: sourceLines.join("\n") };
350
+ }
351
+ getStatus() {
352
+ return {
353
+ state: this.state,
354
+ location: null, // Will be populated by async caller if needed
355
+ };
356
+ }
357
+ async getStatusAsync() {
358
+ const result = { state: this.state };
359
+ if (this.state === "paused") {
360
+ result.location = await this.currentLocation();
361
+ }
362
+ return result;
363
+ }
364
+ async close() {
365
+ await this.cleanup();
366
+ this.state = "idle";
367
+ this.threadId = null;
368
+ this.frameId = null;
369
+ this.scriptPath = null;
370
+ return { status: "closed" };
371
+ }
372
+ async cleanup() {
373
+ if (this.client) {
374
+ try {
375
+ await this.client.close();
376
+ }
377
+ catch {
378
+ // Best effort
379
+ }
380
+ this.client = null;
381
+ }
382
+ if (this.adapterProcess) {
383
+ try {
384
+ this.adapterProcess.kill("SIGTERM");
385
+ // Give it a moment to exit gracefully
386
+ await new Promise((resolve) => {
387
+ const timer = setTimeout(() => {
388
+ try {
389
+ this.adapterProcess?.kill("SIGKILL");
390
+ }
391
+ catch { /* ignore */ }
392
+ resolve();
393
+ }, 3000);
394
+ this.adapterProcess.once("exit", () => {
395
+ clearTimeout(timer);
396
+ resolve();
397
+ });
398
+ });
399
+ }
400
+ catch {
401
+ // Best effort
402
+ }
403
+ this.adapterProcess = null;
404
+ }
405
+ }
406
+ }
407
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKvE,MAAM,OAAO,OAAO;IAClB,KAAK,GAAiB,MAAM,CAAC;IACrB,MAAM,GAAqB,IAAI,CAAC;IAChC,OAAO,GAAyB,IAAI,CAAC;IACrC,cAAc,GAAwB,IAAI,CAAC;IAC3C,QAAQ,GAAkB,IAAI,CAAC;IAC/B,OAAO,GAAkB,IAAI,CAAC;IAC9B,UAAU,GAAkB,IAAI,CAAC;IAEzC,KAAK,CAAC,aAAa,CAAC,GAAY;QAC9B,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAChC,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7B,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC7C,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;YACvC,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAClC,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/D,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACjD,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,GAA0C;QACnE,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC1B,OAAO,EAAE,KAAK,EAAE,2DAA2D,EAAE,CAAC;QAChF,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QAExB,kCAAkC;QAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC9B,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YACpB,OAAO,EAAE,KAAK,EAAE,0BAA0B,MAAM,gDAAgD,EAAE,CAAC;QACrG,CAAC;QAED,6BAA6B;QAC7B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClE,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YACpB,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAC/B,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC3C,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;gBAC/B,WAAW,EAAE,GAAG,CAAC,aAAa;gBAC9B,WAAW,EAAE,GAAG,CAAC,OAAO;aACzB,CAAC,CAAC;YACH,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC;YAE1C,qBAAqB;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YACpB,OAAO,EAAE,KAAK,EAAE,kCAAmC,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/E,CAAC;QAED,oBAAoB;QACpB,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAEjE,iCAAiC;QACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE;YACtD,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;YAC/B,WAAW,EAAE,GAAG,CAAC,aAAa;YAC9B,WAAW,EAAE,GAAG,CAAC,OAAO;YACxB,WAAW;SACZ,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YACpB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACtB,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAA0B,CAAC;YAC1F,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;YACnC,yEAAyE;YACzE,sDAAsD;YACtD,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YACtC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QACjD,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACzB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,gBAAgB,CAAC,GAAa;QACpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiE,CAAC;QAExF,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAErE,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;gBACtC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1B,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACzD,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO;QACnD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;YACnD,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,CAAC;YACb,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAI,IAAI,CAAC,IAAgD,CAAC,WAAW,CAAC;YAClF,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;gBACnB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACxD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;YACnD,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,CAAC;YACb,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAI,IAAI,CAAC,IAMnB,CAAC,WAAW,CAAC;YACf,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;gBACnB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;gBACrB,OAAO;oBACL,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,GAAG;oBAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,QAAQ,EAAE,CAAC,CAAC,IAAI;iBACjB,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;QAExD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;QAElE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;QAE5D,MAAM,MAAM,GAAI,IAAI,CAAC,IAAyE,CAAC,MAAM,IAAI,EAAE,CAAC;QAC5G,MAAM,MAAM,GAAmB,EAAE,CAAC;QAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBAAE,SAAS;YAChE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE;gBACrD,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,KAAK,EAAE,GAAG;aACX,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAI,OAAO,CAAC,IAEpB,CAAC,SAAS,IAAI,EAAE,CAAC;gBACnB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;oBACrB,IAAI,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAQ,CAAC;wBAAE,SAAS;oBACzD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC/D,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;QAElF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;YACnD,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,CAAC;YACb,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;QAEjE,MAAM,SAAS,GAAI,IAAI,CAAC,IAQtB,CAAC,WAAW,IAAI,EAAE,CAAC;QAErB,MAAM,MAAM,GAAmB,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAQ,CAAC;gBAAE,SAAS;YACtD,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,CAAC,CAAC,IAAI;gBAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE;gBAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC1C,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,UAAkB;QAC7C,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;QACxD,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;QAE5D,MAAM,IAAI,GAA4B,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACtE,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAEvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAyC,CAAC;YAC5D,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACxD,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,IAAI,mBAAmB,EAAE,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,IAAY;QAC7B,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;QAElF,MAAM,OAAO,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QACjF,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;QAElF,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;QAExD,qCAAqC;QACrC,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAChE,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;gBACtB,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAA2C,CAAC;gBAC5E,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;gBAC/C,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;gBACzB,OAAO;oBACL,MAAM,EAAE,QAAQ;oBAChB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;oBAChC,QAAQ,EAAE,MAAM,IAAI,CAAC,eAAe,EAAE;iBACvC,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,UAAU,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBACvC,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;gBAC1B,IAAI,QAAQ,GAAkB,IAAI,CAAC;gBACnC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClB,QAAQ,GAAI,MAAM,CAAC,CAAC,CAAE,CAAC,IAA8B,EAAE,QAAQ,IAAI,IAAI,CAAC;gBAC1E,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;YAC5C,CAAC;YAED,+BAA+B;YAC/B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,QAAgB,EAAE,IAAY,EAAE,SAAkB;QAC5E,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;QAExD,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,MAAM,GAA4B;YACtC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;YACzB,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;SAC1D,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAI,IAAI,CAAC,IAAuE,CAAC,WAAW,CAAC;YACtG,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC;gBAChB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;gBACnB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC;YAClF,CAAC;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;IAC/C,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,QAAiB,EAAE,IAAa;QAC3D,IAAI,YAAY,GAAG,QAAQ,CAAC;QAC5B,IAAI,YAAY,GAAG,IAAI,CAAC;QAExB,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YACzC,IAAI,GAAG,EAAE,CAAC;gBACR,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC;gBACxB,YAAY,GAAG,YAAY,IAAI,GAAG,CAAC,IAAI,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,EAAE,KAAK,EAAE,sDAAsD,EAAE,CAAC;QAC3E,CAAC;QAED,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;QAEzC,IAAI,KAAe,CAAC;QACpB,IAAI,CAAC;YACH,KAAK,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,mBAAmB,YAAY,EAAE,EAAE,CAAC;QACtD,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;YAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1C,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,OAAO,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACpF,CAAC;IAEO,SAAS;QACf,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,EAAE,8CAA8C;SAC/D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,MAAM,GAAkB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACpC,sCAAsC;gBACtC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBAClC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;wBAC5B,IAAI,CAAC;4BAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;wBAAC,CAAC;wBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;wBACpE,OAAO,EAAE,CAAC;oBACZ,CAAC,EAAE,IAAI,CAAC,CAAC;oBACT,IAAI,CAAC,cAAe,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;wBACrC,YAAY,CAAC,KAAK,CAAC,CAAC;wBACpB,OAAO,EAAE,CAAC;oBACZ,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;YACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ declare const SESSION_DIR: string;
2
+ declare const SOCKET_PATH: string;
3
+ declare const PID_FILE: string;
4
+ export { SESSION_DIR, SOCKET_PATH, PID_FILE };
5
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/util/paths.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,WAAW,QAAqC,CAAC;AACvD,QAAA,MAAM,WAAW,QAAmC,CAAC;AACrD,QAAA,MAAM,QAAQ,QAAkC,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { join } from "node:path";
2
+ import { homedir } from "node:os";
3
+ const SESSION_DIR = join(homedir(), ".agent-debugger");
4
+ const SOCKET_PATH = join(SESSION_DIR, "daemon.sock");
5
+ const PID_FILE = join(SESSION_DIR, "daemon.pid");
6
+ export { SESSION_DIR, SOCKET_PATH, PID_FILE };
7
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/util/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;AACvD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Find a free TCP port on localhost. */
2
+ export declare function getFreePort(): Promise<number>;
3
+ //# sourceMappingURL=ports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../src/util/ports.ts"],"names":[],"mappings":"AAEA,yCAAyC;AACzC,wBAAgB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAc7C"}
@@ -0,0 +1,19 @@
1
+ import { createServer } from "node:net";
2
+ /** Find a free TCP port on localhost. */
3
+ export function getFreePort() {
4
+ return new Promise((resolve, reject) => {
5
+ const srv = createServer();
6
+ srv.listen(0, "127.0.0.1", () => {
7
+ const addr = srv.address();
8
+ if (addr && typeof addr === "object") {
9
+ const port = addr.port;
10
+ srv.close(() => resolve(port));
11
+ }
12
+ else {
13
+ srv.close(() => reject(new Error("Failed to get port")));
14
+ }
15
+ });
16
+ srv.on("error", reject);
17
+ });
18
+ }
19
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/util/ports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,yCAAyC;AACzC,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAC3B,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACvB,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=protocol.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.test.d.ts","sourceRoot":"","sources":["../../test/protocol.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { Command } from "../src/protocol.js";
4
+ import { Session } from "../src/session.js";
5
+ test("Command.parse accepts a valid start command", () => {
6
+ const cmd = Command.parse({ action: "start", script: "app.py" });
7
+ assert.equal(cmd.action, "start");
8
+ assert.equal(cmd.script, "app.py");
9
+ });
10
+ test("Command.parse accepts a valid eval command", () => {
11
+ const cmd = Command.parse({ action: "eval", expression: "x + 1" });
12
+ assert.equal(cmd.action, "eval");
13
+ assert.equal(cmd.expression, "x + 1");
14
+ });
15
+ test("Command.parse rejects an unknown action", () => {
16
+ assert.throws(() => Command.parse({ action: "unknown" }));
17
+ });
18
+ test("Command.parse rejects start without script", () => {
19
+ assert.throws(() => Command.parse({ action: "start" }));
20
+ });
21
+ test("Session starts in idle state", () => {
22
+ const session = new Session();
23
+ assert.equal(session.state, "idle");
24
+ });
25
+ //# sourceMappingURL=protocol.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../../test/protocol.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACvD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;IACtD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IACnE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACnD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;IACtD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "agent-debugger",
3
+ "version": "0.1.0",
4
+ "description": "CLI debugger for AI agents — debug any language via DAP",
5
+ "keywords": [
6
+ "debugger",
7
+ "debug",
8
+ "dap",
9
+ "cli",
10
+ "ai-agent",
11
+ "breakpoint",
12
+ "python",
13
+ "javascript",
14
+ "typescript",
15
+ "go",
16
+ "rust"
17
+ ],
18
+ "type": "module",
19
+ "bin": {
20
+ "agent-debugger": "./bin/agent-debugger"
21
+ },
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/src/session.d.ts",
25
+ "import": "./dist/src/session.js"
26
+ }
27
+ },
28
+ "files": [
29
+ "bin/",
30
+ "dist/",
31
+ "skills/"
32
+ ],
33
+ "sideEffects": false,
34
+ "scripts": {
35
+ "build": "tsc && chmod +x bin/agent-debugger",
36
+ "dev": "tsc --watch",
37
+ "test": "node --test dist/test/*.test.js",
38
+ "prepublishOnly": "npm run build"
39
+ },
40
+ "dependencies": {
41
+ "zod": "^3.24.2"
42
+ },
43
+ "devDependencies": {
44
+ "@types/node": "^20.14.10",
45
+ "typescript": "^5.8.2"
46
+ },
47
+ "engines": {
48
+ "node": ">=18.0.0"
49
+ },
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "https://github.com/JoaquinCampo/agent-debugger"
53
+ },
54
+ "license": "MIT"
55
+ }