@vibe-lang/runtime 0.2.5

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 (250) hide show
  1. package/package.json +46 -0
  2. package/src/ast/index.ts +375 -0
  3. package/src/ast.ts +2 -0
  4. package/src/debug/advanced-features.ts +482 -0
  5. package/src/debug/bun-inspector.ts +424 -0
  6. package/src/debug/handoff-manager.ts +283 -0
  7. package/src/debug/index.ts +150 -0
  8. package/src/debug/runner.ts +365 -0
  9. package/src/debug/server.ts +565 -0
  10. package/src/debug/stack-merger.ts +267 -0
  11. package/src/debug/state.ts +581 -0
  12. package/src/debug/test/advanced-features.test.ts +300 -0
  13. package/src/debug/test/e2e.test.ts +218 -0
  14. package/src/debug/test/handoff-manager.test.ts +256 -0
  15. package/src/debug/test/runner.test.ts +256 -0
  16. package/src/debug/test/stack-merger.test.ts +163 -0
  17. package/src/debug/test/state.test.ts +400 -0
  18. package/src/debug/test/ts-debug-integration.test.ts +374 -0
  19. package/src/debug/test/ts-import-tracker.test.ts +125 -0
  20. package/src/debug/test/ts-source-map.test.ts +169 -0
  21. package/src/debug/ts-import-tracker.ts +151 -0
  22. package/src/debug/ts-source-map.ts +171 -0
  23. package/src/errors/index.ts +124 -0
  24. package/src/index.ts +358 -0
  25. package/src/lexer/index.ts +348 -0
  26. package/src/lexer.ts +2 -0
  27. package/src/parser/index.ts +792 -0
  28. package/src/parser/parse.ts +45 -0
  29. package/src/parser/test/async.test.ts +248 -0
  30. package/src/parser/test/destructuring.test.ts +167 -0
  31. package/src/parser/test/do-expression.test.ts +486 -0
  32. package/src/parser/test/errors/do-expression.test.ts +95 -0
  33. package/src/parser/test/errors/error-locations.test.ts +230 -0
  34. package/src/parser/test/errors/invalid-expressions.test.ts +144 -0
  35. package/src/parser/test/errors/missing-tokens.test.ts +126 -0
  36. package/src/parser/test/errors/model-declaration.test.ts +185 -0
  37. package/src/parser/test/errors/nested-blocks.test.ts +226 -0
  38. package/src/parser/test/errors/unclosed-delimiters.test.ts +122 -0
  39. package/src/parser/test/errors/unexpected-tokens.test.ts +120 -0
  40. package/src/parser/test/import-export.test.ts +143 -0
  41. package/src/parser/test/literals.test.ts +404 -0
  42. package/src/parser/test/model-declaration.test.ts +161 -0
  43. package/src/parser/test/nested-blocks.test.ts +402 -0
  44. package/src/parser/test/parser.test.ts +743 -0
  45. package/src/parser/test/private.test.ts +136 -0
  46. package/src/parser/test/template-literal.test.ts +127 -0
  47. package/src/parser/test/tool-declaration.test.ts +302 -0
  48. package/src/parser/test/ts-block.test.ts +252 -0
  49. package/src/parser/test/type-annotations.test.ts +254 -0
  50. package/src/parser/visitor/helpers.ts +330 -0
  51. package/src/parser/visitor.ts +794 -0
  52. package/src/parser.ts +2 -0
  53. package/src/runtime/ai/cache-chunking.test.ts +69 -0
  54. package/src/runtime/ai/cache-chunking.ts +73 -0
  55. package/src/runtime/ai/client.ts +109 -0
  56. package/src/runtime/ai/context.ts +168 -0
  57. package/src/runtime/ai/formatters.ts +316 -0
  58. package/src/runtime/ai/index.ts +38 -0
  59. package/src/runtime/ai/language-ref.ts +38 -0
  60. package/src/runtime/ai/providers/anthropic.ts +253 -0
  61. package/src/runtime/ai/providers/google.ts +201 -0
  62. package/src/runtime/ai/providers/openai.ts +156 -0
  63. package/src/runtime/ai/retry.ts +100 -0
  64. package/src/runtime/ai/return-tools.ts +301 -0
  65. package/src/runtime/ai/test/client.test.ts +83 -0
  66. package/src/runtime/ai/test/formatters.test.ts +485 -0
  67. package/src/runtime/ai/test/retry.test.ts +137 -0
  68. package/src/runtime/ai/test/return-tools.test.ts +450 -0
  69. package/src/runtime/ai/test/tool-loop.test.ts +319 -0
  70. package/src/runtime/ai/test/tool-schema.test.ts +241 -0
  71. package/src/runtime/ai/tool-loop.ts +203 -0
  72. package/src/runtime/ai/tool-schema.ts +151 -0
  73. package/src/runtime/ai/types.ts +113 -0
  74. package/src/runtime/ai-logger.ts +255 -0
  75. package/src/runtime/ai-provider.ts +347 -0
  76. package/src/runtime/async/dependencies.ts +276 -0
  77. package/src/runtime/async/executor.ts +293 -0
  78. package/src/runtime/async/index.ts +43 -0
  79. package/src/runtime/async/scheduling.ts +163 -0
  80. package/src/runtime/async/test/dependencies.test.ts +284 -0
  81. package/src/runtime/async/test/executor.test.ts +388 -0
  82. package/src/runtime/context.ts +357 -0
  83. package/src/runtime/exec/ai.ts +139 -0
  84. package/src/runtime/exec/expressions.ts +475 -0
  85. package/src/runtime/exec/frames.ts +26 -0
  86. package/src/runtime/exec/functions.ts +305 -0
  87. package/src/runtime/exec/interpolation.ts +312 -0
  88. package/src/runtime/exec/statements.ts +604 -0
  89. package/src/runtime/exec/tools.ts +129 -0
  90. package/src/runtime/exec/typescript.ts +215 -0
  91. package/src/runtime/exec/variables.ts +279 -0
  92. package/src/runtime/index.ts +975 -0
  93. package/src/runtime/modules.ts +452 -0
  94. package/src/runtime/serialize.ts +103 -0
  95. package/src/runtime/state.ts +489 -0
  96. package/src/runtime/stdlib/core.ts +45 -0
  97. package/src/runtime/stdlib/directory.test.ts +156 -0
  98. package/src/runtime/stdlib/edit.test.ts +154 -0
  99. package/src/runtime/stdlib/fastEdit.test.ts +201 -0
  100. package/src/runtime/stdlib/glob.test.ts +106 -0
  101. package/src/runtime/stdlib/grep.test.ts +144 -0
  102. package/src/runtime/stdlib/index.ts +16 -0
  103. package/src/runtime/stdlib/readFile.test.ts +123 -0
  104. package/src/runtime/stdlib/tools/index.ts +707 -0
  105. package/src/runtime/stdlib/writeFile.test.ts +157 -0
  106. package/src/runtime/step.ts +969 -0
  107. package/src/runtime/test/ai-context.test.ts +1086 -0
  108. package/src/runtime/test/ai-result-object.test.ts +419 -0
  109. package/src/runtime/test/ai-tool-flow.test.ts +859 -0
  110. package/src/runtime/test/async-execution-order.test.ts +618 -0
  111. package/src/runtime/test/async-execution.test.ts +344 -0
  112. package/src/runtime/test/async-nested.test.ts +660 -0
  113. package/src/runtime/test/async-parallel-timing.test.ts +546 -0
  114. package/src/runtime/test/basic1.test.ts +154 -0
  115. package/src/runtime/test/binary-operators.test.ts +431 -0
  116. package/src/runtime/test/break-statement.test.ts +257 -0
  117. package/src/runtime/test/context-modes.test.ts +650 -0
  118. package/src/runtime/test/context.test.ts +466 -0
  119. package/src/runtime/test/core-functions.test.ts +228 -0
  120. package/src/runtime/test/e2e.test.ts +88 -0
  121. package/src/runtime/test/error-locations/error-locations.test.ts +80 -0
  122. package/src/runtime/test/error-locations/main-error.vibe +4 -0
  123. package/src/runtime/test/error-locations/main-import-error.vibe +3 -0
  124. package/src/runtime/test/error-locations/utils/helper.vibe +5 -0
  125. package/src/runtime/test/for-in.test.ts +312 -0
  126. package/src/runtime/test/helpers.ts +69 -0
  127. package/src/runtime/test/imports.test.ts +334 -0
  128. package/src/runtime/test/json-expressions.test.ts +232 -0
  129. package/src/runtime/test/literals.test.ts +372 -0
  130. package/src/runtime/test/logical-indexing.test.ts +478 -0
  131. package/src/runtime/test/member-methods.test.ts +324 -0
  132. package/src/runtime/test/model-config.test.ts +338 -0
  133. package/src/runtime/test/null-handling.test.ts +342 -0
  134. package/src/runtime/test/private-visibility.test.ts +332 -0
  135. package/src/runtime/test/runtime-state.test.ts +514 -0
  136. package/src/runtime/test/scoping.test.ts +370 -0
  137. package/src/runtime/test/string-interpolation.test.ts +354 -0
  138. package/src/runtime/test/template-literal.test.ts +181 -0
  139. package/src/runtime/test/tool-execution.test.ts +467 -0
  140. package/src/runtime/test/tool-schema-generation.test.ts +477 -0
  141. package/src/runtime/test/tostring.test.ts +210 -0
  142. package/src/runtime/test/ts-block.test.ts +594 -0
  143. package/src/runtime/test/ts-error-location.test.ts +231 -0
  144. package/src/runtime/test/types.test.ts +732 -0
  145. package/src/runtime/test/verbose-logger.test.ts +710 -0
  146. package/src/runtime/test/vibe-expression.test.ts +54 -0
  147. package/src/runtime/test/vibe-value-errors.test.ts +541 -0
  148. package/src/runtime/test/while.test.ts +232 -0
  149. package/src/runtime/tools/builtin.ts +30 -0
  150. package/src/runtime/tools/directory-tools.ts +70 -0
  151. package/src/runtime/tools/file-tools.ts +228 -0
  152. package/src/runtime/tools/index.ts +5 -0
  153. package/src/runtime/tools/registry.ts +48 -0
  154. package/src/runtime/tools/search-tools.ts +134 -0
  155. package/src/runtime/tools/security.ts +36 -0
  156. package/src/runtime/tools/system-tools.ts +312 -0
  157. package/src/runtime/tools/test/fixtures/base-types.ts +40 -0
  158. package/src/runtime/tools/test/fixtures/test-types.ts +132 -0
  159. package/src/runtime/tools/test/registry.test.ts +713 -0
  160. package/src/runtime/tools/test/security.test.ts +86 -0
  161. package/src/runtime/tools/test/system-tools.test.ts +679 -0
  162. package/src/runtime/tools/test/ts-schema.test.ts +357 -0
  163. package/src/runtime/tools/ts-schema.ts +341 -0
  164. package/src/runtime/tools/types.ts +89 -0
  165. package/src/runtime/tools/utility-tools.ts +198 -0
  166. package/src/runtime/ts-eval.ts +126 -0
  167. package/src/runtime/types.ts +797 -0
  168. package/src/runtime/validation.ts +160 -0
  169. package/src/runtime/verbose-logger.ts +459 -0
  170. package/src/runtime.ts +2 -0
  171. package/src/semantic/analyzer-context.ts +62 -0
  172. package/src/semantic/analyzer-validators.ts +575 -0
  173. package/src/semantic/analyzer-visitors.ts +534 -0
  174. package/src/semantic/analyzer.ts +83 -0
  175. package/src/semantic/index.ts +11 -0
  176. package/src/semantic/symbol-table.ts +58 -0
  177. package/src/semantic/test/async-validation.test.ts +301 -0
  178. package/src/semantic/test/compress-validation.test.ts +179 -0
  179. package/src/semantic/test/const-reassignment.test.ts +111 -0
  180. package/src/semantic/test/control-flow.test.ts +346 -0
  181. package/src/semantic/test/destructuring.test.ts +185 -0
  182. package/src/semantic/test/duplicate-declarations.test.ts +168 -0
  183. package/src/semantic/test/export-validation.test.ts +111 -0
  184. package/src/semantic/test/fixtures/math.ts +31 -0
  185. package/src/semantic/test/imports.test.ts +148 -0
  186. package/src/semantic/test/json-type.test.ts +68 -0
  187. package/src/semantic/test/literals.test.ts +127 -0
  188. package/src/semantic/test/model-validation.test.ts +179 -0
  189. package/src/semantic/test/prompt-validation.test.ts +343 -0
  190. package/src/semantic/test/scoping.test.ts +312 -0
  191. package/src/semantic/test/tool-validation.test.ts +306 -0
  192. package/src/semantic/test/ts-type-checking.test.ts +563 -0
  193. package/src/semantic/test/type-constraints.test.ts +111 -0
  194. package/src/semantic/test/type-inference.test.ts +87 -0
  195. package/src/semantic/test/type-validation.test.ts +552 -0
  196. package/src/semantic/test/undefined-variables.test.ts +163 -0
  197. package/src/semantic/ts-block-checker.ts +204 -0
  198. package/src/semantic/ts-signatures.ts +194 -0
  199. package/src/semantic/ts-types.ts +170 -0
  200. package/src/semantic/types.ts +58 -0
  201. package/tests/fixtures/conditional-logic.vibe +14 -0
  202. package/tests/fixtures/function-call.vibe +16 -0
  203. package/tests/fixtures/imports/cycle-detection/a.vibe +6 -0
  204. package/tests/fixtures/imports/cycle-detection/b.vibe +5 -0
  205. package/tests/fixtures/imports/cycle-detection/main.vibe +3 -0
  206. package/tests/fixtures/imports/module-isolation/main-b.vibe +8 -0
  207. package/tests/fixtures/imports/module-isolation/main.vibe +9 -0
  208. package/tests/fixtures/imports/module-isolation/moduleA.vibe +6 -0
  209. package/tests/fixtures/imports/module-isolation/moduleB.vibe +6 -0
  210. package/tests/fixtures/imports/nested-import/helper.vibe +6 -0
  211. package/tests/fixtures/imports/nested-import/main.vibe +3 -0
  212. package/tests/fixtures/imports/nested-import/utils.ts +3 -0
  213. package/tests/fixtures/imports/nested-isolation/file2.vibe +15 -0
  214. package/tests/fixtures/imports/nested-isolation/file3.vibe +10 -0
  215. package/tests/fixtures/imports/nested-isolation/main.vibe +21 -0
  216. package/tests/fixtures/imports/pure-cycle/a.vibe +5 -0
  217. package/tests/fixtures/imports/pure-cycle/b.vibe +5 -0
  218. package/tests/fixtures/imports/pure-cycle/main.vibe +3 -0
  219. package/tests/fixtures/imports/ts-boolean/checks.ts +14 -0
  220. package/tests/fixtures/imports/ts-boolean/main.vibe +10 -0
  221. package/tests/fixtures/imports/ts-boolean/type-mismatch.vibe +5 -0
  222. package/tests/fixtures/imports/ts-boolean/use-constant.vibe +18 -0
  223. package/tests/fixtures/imports/ts-error-handling/helpers.ts +42 -0
  224. package/tests/fixtures/imports/ts-error-handling/main.vibe +5 -0
  225. package/tests/fixtures/imports/ts-import/main.vibe +4 -0
  226. package/tests/fixtures/imports/ts-import/math.ts +9 -0
  227. package/tests/fixtures/imports/ts-variables/call-non-function.vibe +5 -0
  228. package/tests/fixtures/imports/ts-variables/data.ts +10 -0
  229. package/tests/fixtures/imports/ts-variables/import-json.vibe +5 -0
  230. package/tests/fixtures/imports/ts-variables/import-type-mismatch.vibe +5 -0
  231. package/tests/fixtures/imports/ts-variables/import-variable.vibe +5 -0
  232. package/tests/fixtures/imports/vibe-import/greet.vibe +5 -0
  233. package/tests/fixtures/imports/vibe-import/main.vibe +3 -0
  234. package/tests/fixtures/multiple-ai-calls.vibe +10 -0
  235. package/tests/fixtures/simple-greeting.vibe +6 -0
  236. package/tests/fixtures/template-literals.vibe +11 -0
  237. package/tests/integration/basic-ai/basic-ai.integration.test.ts +166 -0
  238. package/tests/integration/basic-ai/basic-ai.vibe +12 -0
  239. package/tests/integration/bug-fix/bug-fix.integration.test.ts +201 -0
  240. package/tests/integration/bug-fix/buggy-code.ts +22 -0
  241. package/tests/integration/bug-fix/fix-bug.vibe +21 -0
  242. package/tests/integration/compress/compress.integration.test.ts +206 -0
  243. package/tests/integration/destructuring/destructuring.integration.test.ts +92 -0
  244. package/tests/integration/hello-world-translator/hello-world-translator.integration.test.ts +61 -0
  245. package/tests/integration/line-annotator/context-modes.integration.test.ts +261 -0
  246. package/tests/integration/line-annotator/line-annotator.integration.test.ts +148 -0
  247. package/tests/integration/multi-feature/cumulative-sum.integration.test.ts +75 -0
  248. package/tests/integration/multi-feature/number-analyzer.integration.test.ts +191 -0
  249. package/tests/integration/multi-feature/number-analyzer.vibe +59 -0
  250. package/tests/integration/tool-calls/tool-calls.integration.test.ts +93 -0
@@ -0,0 +1,565 @@
1
+ /**
2
+ * Debug Server - WebSocket server for debug adapter communication
3
+ * Functional approach - manages state and handles protocol messages
4
+ */
5
+
6
+ import type {
7
+ AdapterToRuntimeMessage,
8
+ RuntimeToAdapterMessage,
9
+ RuntimeEvent,
10
+ RuntimeResponse,
11
+ } from '@vibe-lang/debug-core';
12
+
13
+ import type { RuntimeState } from '../runtime/types';
14
+ import type { AIProvider } from '../runtime';
15
+ import {
16
+ type VibeDebugState,
17
+ createDebugState,
18
+ setBreakpoints,
19
+ getStackTrace,
20
+ getScopes,
21
+ getVariables,
22
+ getToolCalls,
23
+ getContextEntries,
24
+ resumeExecution,
25
+ setStepMode,
26
+ } from './state';
27
+ import {
28
+ debugContinue,
29
+ debugStepIn,
30
+ debugStepOver,
31
+ debugStepOut,
32
+ runWithDebug,
33
+ } from './runner';
34
+
35
+ // Server state (module-level for simplicity)
36
+ let server: ReturnType<typeof Bun.serve> | null = null;
37
+ let activeConnection: { send: (data: string) => void } | null = null;
38
+ let messageSeq = 1;
39
+
40
+ // Runtime state managed by the server
41
+ let runtimeState: RuntimeState | null = null;
42
+ let debugState: VibeDebugState | null = null;
43
+ let aiProvider: AIProvider | null = null;
44
+
45
+ // Callbacks for async operations
46
+ let onInitialized: (() => void) | null = null;
47
+
48
+ /**
49
+ * Start debug server and wait for connection
50
+ */
51
+ export async function startDebugServer(
52
+ port: number,
53
+ initialRuntimeState: RuntimeState,
54
+ initialDebugState: VibeDebugState,
55
+ provider: AIProvider
56
+ ): Promise<void> {
57
+ runtimeState = initialRuntimeState;
58
+ debugState = initialDebugState;
59
+ aiProvider = provider;
60
+
61
+ return new Promise((resolve, reject) => {
62
+ try {
63
+ server = Bun.serve({
64
+ port,
65
+ fetch(req, server) {
66
+ const success = server.upgrade(req);
67
+ if (!success) {
68
+ return new Response('WebSocket upgrade failed', { status: 400 });
69
+ }
70
+ return undefined;
71
+ },
72
+ websocket: {
73
+ open(ws) {
74
+ console.error(`[Debug] Adapter connected on port ${port}`);
75
+ activeConnection = ws;
76
+ resolve();
77
+ },
78
+ message(ws, message) {
79
+ const text = typeof message === 'string' ? message : message.toString();
80
+ handleMessage(text);
81
+ },
82
+ close(ws) {
83
+ console.error('[Debug] Adapter disconnected');
84
+ activeConnection = null;
85
+ },
86
+ error(ws, error) {
87
+ console.error('[Debug] WebSocket error:', error);
88
+ },
89
+ },
90
+ });
91
+
92
+ console.error(`[Debug] Listening on ws://127.0.0.1:${port}`);
93
+ } catch (err) {
94
+ reject(err);
95
+ }
96
+ });
97
+ }
98
+
99
+ /**
100
+ * Stop the debug server
101
+ */
102
+ export function stopDebugServer(): void {
103
+ if (server) {
104
+ server.stop();
105
+ server = null;
106
+ }
107
+ activeConnection = null;
108
+ runtimeState = null;
109
+ debugState = null;
110
+ aiProvider = null;
111
+ }
112
+
113
+ /**
114
+ * Send event to debug adapter
115
+ */
116
+ export function sendEvent(event: RuntimeEvent): void {
117
+ if (activeConnection) {
118
+ activeConnection.send(JSON.stringify(event));
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Handle incoming message from debug adapter
124
+ */
125
+ async function handleMessage(text: string): Promise<void> {
126
+ try {
127
+ const message = JSON.parse(text) as AdapterToRuntimeMessage;
128
+
129
+ switch (message.type) {
130
+ case 'initialize':
131
+ handleInitialize(message.seq);
132
+ break;
133
+
134
+ case 'setBreakpoints':
135
+ handleSetBreakpoints(message.seq, message.file, message.lines, message.conditions);
136
+ break;
137
+
138
+ case 'continue':
139
+ await handleContinue(message.seq);
140
+ break;
141
+
142
+ case 'pause':
143
+ handlePause(message.seq);
144
+ break;
145
+
146
+ case 'stepIn':
147
+ await handleStepIn(message.seq);
148
+ break;
149
+
150
+ case 'stepOver':
151
+ await handleStepOver(message.seq);
152
+ break;
153
+
154
+ case 'stepOut':
155
+ await handleStepOut(message.seq);
156
+ break;
157
+
158
+ case 'getStackTrace':
159
+ handleGetStackTrace(message.seq);
160
+ break;
161
+
162
+ case 'getScopes':
163
+ handleGetScopes(message.seq, message.frameId);
164
+ break;
165
+
166
+ case 'getVariables':
167
+ handleGetVariables(message.seq, message.variablesReference);
168
+ break;
169
+
170
+ case 'getToolCalls':
171
+ handleGetToolCalls(message.seq, message.variablesReference);
172
+ break;
173
+
174
+ case 'getContext':
175
+ handleGetContext(message.seq, message.contextType);
176
+ break;
177
+
178
+ case 'evaluate':
179
+ handleEvaluate(message.seq, message.expression, message.frameId);
180
+ break;
181
+
182
+ case 'disconnect':
183
+ handleDisconnect(message.seq);
184
+ break;
185
+
186
+ default:
187
+ console.error('[Debug] Unknown message type:', (message as any).type);
188
+ }
189
+ } catch (err) {
190
+ console.error('[Debug] Failed to handle message:', err);
191
+ }
192
+ }
193
+
194
+ function sendResponse(response: RuntimeResponse): void {
195
+ if (activeConnection) {
196
+ activeConnection.send(JSON.stringify(response));
197
+ }
198
+ }
199
+
200
+ // Message handlers
201
+
202
+ function handleInitialize(seq: number): void {
203
+ sendResponse({
204
+ type: 'response',
205
+ seq: messageSeq++,
206
+ requestSeq: seq,
207
+ success: true,
208
+ command: 'initialize',
209
+ body: {
210
+ supportsConditionalBreakpoints: true,
211
+ supportsEvaluateForHovers: false,
212
+ supportsStepBack: false,
213
+ supportsSetVariable: false,
214
+ supportsRestartRequest: false,
215
+ },
216
+ });
217
+
218
+ if (onInitialized) {
219
+ onInitialized();
220
+ onInitialized = null;
221
+ }
222
+ }
223
+
224
+ function handleSetBreakpoints(
225
+ seq: number,
226
+ file: string,
227
+ lines: number[],
228
+ conditions?: (string | undefined)[]
229
+ ): void {
230
+ if (!debugState) {
231
+ sendResponse({
232
+ type: 'response',
233
+ seq: messageSeq++,
234
+ requestSeq: seq,
235
+ success: false,
236
+ message: 'Debug session not initialized',
237
+ command: 'setBreakpoints',
238
+ body: { breakpoints: [] },
239
+ });
240
+ return;
241
+ }
242
+
243
+ const result = setBreakpoints(debugState, file, lines, conditions);
244
+ debugState = result.debugState;
245
+
246
+ sendResponse({
247
+ type: 'response',
248
+ seq: messageSeq++,
249
+ requestSeq: seq,
250
+ success: true,
251
+ command: 'setBreakpoints',
252
+ body: { breakpoints: result.breakpoints },
253
+ });
254
+ }
255
+
256
+ async function handleContinue(seq: number): Promise<void> {
257
+ if (!runtimeState || !debugState || !aiProvider) {
258
+ sendResponse({
259
+ type: 'response',
260
+ seq: messageSeq++,
261
+ requestSeq: seq,
262
+ success: false,
263
+ message: 'Debug session not initialized',
264
+ command: 'continue',
265
+ });
266
+ return;
267
+ }
268
+
269
+ sendResponse({
270
+ type: 'response',
271
+ seq: messageSeq++,
272
+ requestSeq: seq,
273
+ success: true,
274
+ command: 'continue',
275
+ });
276
+
277
+ // Run until next breakpoint or completion
278
+ const result = await runWithDebug(
279
+ runtimeState,
280
+ resumeExecution(debugState),
281
+ aiProvider,
282
+ sendEvent
283
+ );
284
+
285
+ runtimeState = result.runtimeState;
286
+ debugState = result.debugState;
287
+ }
288
+
289
+ function handlePause(seq: number): void {
290
+ if (!debugState) {
291
+ sendResponse({
292
+ type: 'response',
293
+ seq: messageSeq++,
294
+ requestSeq: seq,
295
+ success: false,
296
+ message: 'Debug session not initialized',
297
+ command: 'pause',
298
+ });
299
+ return;
300
+ }
301
+
302
+ // Set step mode to trigger pause on next instruction
303
+ debugState = setStepMode(debugState, 'into');
304
+
305
+ sendResponse({
306
+ type: 'response',
307
+ seq: messageSeq++,
308
+ requestSeq: seq,
309
+ success: true,
310
+ command: 'pause',
311
+ });
312
+ }
313
+
314
+ async function handleStepIn(seq: number): Promise<void> {
315
+ if (!runtimeState || !debugState || !aiProvider) {
316
+ sendResponse({
317
+ type: 'response',
318
+ seq: messageSeq++,
319
+ requestSeq: seq,
320
+ success: false,
321
+ message: 'Debug session not initialized',
322
+ command: 'stepIn',
323
+ });
324
+ return;
325
+ }
326
+
327
+ sendResponse({
328
+ type: 'response',
329
+ seq: messageSeq++,
330
+ requestSeq: seq,
331
+ success: true,
332
+ command: 'stepIn',
333
+ });
334
+
335
+ const result = await runWithDebug(
336
+ runtimeState,
337
+ setStepMode(debugState, 'into'),
338
+ aiProvider,
339
+ sendEvent
340
+ );
341
+
342
+ runtimeState = result.runtimeState;
343
+ debugState = result.debugState;
344
+ }
345
+
346
+ async function handleStepOver(seq: number): Promise<void> {
347
+ if (!runtimeState || !debugState || !aiProvider) {
348
+ sendResponse({
349
+ type: 'response',
350
+ seq: messageSeq++,
351
+ requestSeq: seq,
352
+ success: false,
353
+ message: 'Debug session not initialized',
354
+ command: 'stepOver',
355
+ });
356
+ return;
357
+ }
358
+
359
+ sendResponse({
360
+ type: 'response',
361
+ seq: messageSeq++,
362
+ requestSeq: seq,
363
+ success: true,
364
+ command: 'stepOver',
365
+ });
366
+
367
+ const result = await runWithDebug(
368
+ runtimeState,
369
+ setStepMode(debugState, 'over'),
370
+ aiProvider,
371
+ sendEvent
372
+ );
373
+
374
+ runtimeState = result.runtimeState;
375
+ debugState = result.debugState;
376
+ }
377
+
378
+ async function handleStepOut(seq: number): Promise<void> {
379
+ if (!runtimeState || !debugState || !aiProvider) {
380
+ sendResponse({
381
+ type: 'response',
382
+ seq: messageSeq++,
383
+ requestSeq: seq,
384
+ success: false,
385
+ message: 'Debug session not initialized',
386
+ command: 'stepOut',
387
+ });
388
+ return;
389
+ }
390
+
391
+ sendResponse({
392
+ type: 'response',
393
+ seq: messageSeq++,
394
+ requestSeq: seq,
395
+ success: true,
396
+ command: 'stepOut',
397
+ });
398
+
399
+ const result = await runWithDebug(
400
+ runtimeState,
401
+ setStepMode(debugState, 'out'),
402
+ aiProvider,
403
+ sendEvent
404
+ );
405
+
406
+ runtimeState = result.runtimeState;
407
+ debugState = result.debugState;
408
+ }
409
+
410
+ function handleGetStackTrace(seq: number): void {
411
+ if (!runtimeState) {
412
+ sendResponse({
413
+ type: 'response',
414
+ seq: messageSeq++,
415
+ requestSeq: seq,
416
+ success: false,
417
+ message: 'Debug session not initialized',
418
+ command: 'getStackTrace',
419
+ body: { stackFrames: [], totalFrames: 0 },
420
+ });
421
+ return;
422
+ }
423
+
424
+ const { stackFrames, totalFrames } = getStackTrace(runtimeState);
425
+
426
+ sendResponse({
427
+ type: 'response',
428
+ seq: messageSeq++,
429
+ requestSeq: seq,
430
+ success: true,
431
+ command: 'getStackTrace',
432
+ body: { stackFrames, totalFrames },
433
+ });
434
+ }
435
+
436
+ function handleGetScopes(seq: number, frameId: number): void {
437
+ if (!runtimeState || !debugState) {
438
+ sendResponse({
439
+ type: 'response',
440
+ seq: messageSeq++,
441
+ requestSeq: seq,
442
+ success: false,
443
+ message: 'Debug session not initialized',
444
+ command: 'getScopes',
445
+ body: { scopes: [] },
446
+ });
447
+ return;
448
+ }
449
+
450
+ const result = getScopes(debugState, runtimeState, frameId);
451
+ debugState = result.debugState;
452
+
453
+ sendResponse({
454
+ type: 'response',
455
+ seq: messageSeq++,
456
+ requestSeq: seq,
457
+ success: true,
458
+ command: 'getScopes',
459
+ body: { scopes: result.scopes },
460
+ });
461
+ }
462
+
463
+ function handleGetVariables(seq: number, variablesReference: number): void {
464
+ if (!runtimeState || !debugState) {
465
+ sendResponse({
466
+ type: 'response',
467
+ seq: messageSeq++,
468
+ requestSeq: seq,
469
+ success: false,
470
+ message: 'Debug session not initialized',
471
+ command: 'getVariables',
472
+ body: { variables: [] },
473
+ });
474
+ return;
475
+ }
476
+
477
+ const result = getVariables(debugState, runtimeState, variablesReference);
478
+ debugState = result.debugState;
479
+
480
+ sendResponse({
481
+ type: 'response',
482
+ seq: messageSeq++,
483
+ requestSeq: seq,
484
+ success: true,
485
+ command: 'getVariables',
486
+ body: { variables: result.variables },
487
+ });
488
+ }
489
+
490
+ function handleGetToolCalls(seq: number, variablesReference: number): void {
491
+ if (!debugState) {
492
+ sendResponse({
493
+ type: 'response',
494
+ seq: messageSeq++,
495
+ requestSeq: seq,
496
+ success: false,
497
+ message: 'Debug session not initialized',
498
+ command: 'getToolCalls',
499
+ body: { toolCalls: [] },
500
+ });
501
+ return;
502
+ }
503
+
504
+ const toolCalls = getToolCalls(debugState, variablesReference);
505
+
506
+ sendResponse({
507
+ type: 'response',
508
+ seq: messageSeq++,
509
+ requestSeq: seq,
510
+ success: true,
511
+ command: 'getToolCalls',
512
+ body: { toolCalls },
513
+ });
514
+ }
515
+
516
+ function handleGetContext(seq: number, contextType: 'default' | 'local'): void {
517
+ if (!runtimeState) {
518
+ sendResponse({
519
+ type: 'response',
520
+ seq: messageSeq++,
521
+ requestSeq: seq,
522
+ success: false,
523
+ message: 'Debug session not initialized',
524
+ command: 'getContext',
525
+ body: { entries: [] },
526
+ });
527
+ return;
528
+ }
529
+
530
+ const entries = getContextEntries(runtimeState, contextType);
531
+
532
+ sendResponse({
533
+ type: 'response',
534
+ seq: messageSeq++,
535
+ requestSeq: seq,
536
+ success: true,
537
+ command: 'getContext',
538
+ body: { entries },
539
+ });
540
+ }
541
+
542
+ function handleEvaluate(seq: number, expression: string, frameId: number): void {
543
+ // TODO: Implement expression evaluation
544
+ sendResponse({
545
+ type: 'response',
546
+ seq: messageSeq++,
547
+ requestSeq: seq,
548
+ success: false,
549
+ message: 'Expression evaluation not yet implemented',
550
+ command: 'evaluate',
551
+ body: { result: '', type: '', variablesReference: 0 },
552
+ });
553
+ }
554
+
555
+ function handleDisconnect(seq: number): void {
556
+ sendResponse({
557
+ type: 'response',
558
+ seq: messageSeq++,
559
+ requestSeq: seq,
560
+ success: true,
561
+ command: 'disconnect',
562
+ });
563
+
564
+ stopDebugServer();
565
+ }