@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,150 @@
1
+ /**
2
+ * Debug Module - Exports for Vibe debugger
3
+ */
4
+
5
+ // State management
6
+ export {
7
+ type VibeDebugState,
8
+ type VariableReference,
9
+ createDebugState,
10
+ setBreakpoints,
11
+ clearBreakpoints,
12
+ shouldPauseAtLocation,
13
+ pauseExecution,
14
+ resumeExecution,
15
+ setStepMode,
16
+ getCurrentLocation,
17
+ getStackTrace,
18
+ getScopes,
19
+ getVariables,
20
+ getToolCalls,
21
+ getContextEntries,
22
+ } from './state';
23
+
24
+ // Debug runner
25
+ export {
26
+ type DebugStepResult,
27
+ initDebugSession,
28
+ debugStep,
29
+ debugContinue,
30
+ debugStepIn,
31
+ debugStepOver,
32
+ debugStepOut,
33
+ handleDebugAICall,
34
+ handleDebugTSCall,
35
+ runWithDebug,
36
+ createOutputEvent,
37
+ } from './runner';
38
+
39
+ // TS block source mapping
40
+ export {
41
+ type TsBlockMapping,
42
+ registerTsBlock,
43
+ getTsBlockMapping,
44
+ findMappingByScriptId,
45
+ setScriptId,
46
+ mapTsLocationToVibe,
47
+ mapVibeLocationToTs,
48
+ isLocationInTsBlock,
49
+ getMappingsForFile,
50
+ clearTsBlockMappings,
51
+ getAllMappings,
52
+ } from './ts-source-map';
53
+
54
+ // Bun inspector client
55
+ export {
56
+ BunInspectorClient,
57
+ getBunInspector,
58
+ closeBunInspector,
59
+ } from './bun-inspector';
60
+
61
+ // Stack frame merger
62
+ export {
63
+ type MergedStackFrame,
64
+ type FrameOrigin,
65
+ type DebugMode,
66
+ type DebugExecutionContext,
67
+ createDebugExecutionContext,
68
+ enterTsBlock,
69
+ enterTsImport,
70
+ exitTsMode,
71
+ incrementTsCallDepth,
72
+ decrementTsCallDepth,
73
+ mergeStackFrames,
74
+ getUnifiedStackTrace,
75
+ shouldHandoffToTs,
76
+ shouldReturnToVibe,
77
+ getFrameIdForOrigin,
78
+ } from './stack-merger';
79
+
80
+ // TS import tracker
81
+ export {
82
+ type TsImportInfo,
83
+ registerTsImport,
84
+ getTsImportInfo,
85
+ isTsImportCall,
86
+ setTsImportEntryLine,
87
+ registerTempBreakpoint,
88
+ popTempBreakpoint,
89
+ clearTempBreakpoints,
90
+ getAllTsImports,
91
+ getTsImportsForFile,
92
+ clearTsImports,
93
+ buildTsEntryPointId,
94
+ parseTsEntryPointId,
95
+ } from './ts-import-tracker';
96
+
97
+ // Handoff manager
98
+ export {
99
+ type HandoffState,
100
+ createHandoffState,
101
+ shouldInitiateHandoff,
102
+ initiateHandoff,
103
+ completeHandoff,
104
+ shouldReturnControl,
105
+ returnToVibe,
106
+ handleTsStepIn,
107
+ handleTsStepOut,
108
+ getCurrentMode,
109
+ isInTsMode,
110
+ getSavedVibeState,
111
+ setupTsImportBreakpoint,
112
+ cleanupTempBreakpoint,
113
+ cleanupAllTempBreakpoints,
114
+ } from './handoff-manager';
115
+
116
+ // Advanced debug features
117
+ export {
118
+ type AdvancedBreakpoint,
119
+ type WatchExpression,
120
+ type ExceptionBreakpointConfig,
121
+ type AdvancedDebugState,
122
+ createAdvancedDebugState,
123
+ setAdvancedBreakpoint,
124
+ removeAdvancedBreakpoint,
125
+ getAdvancedBreakpoint,
126
+ evaluateCondition,
127
+ checkHitCondition,
128
+ shouldBreakpointTrigger,
129
+ interpolateLogMessage,
130
+ addWatchExpression,
131
+ removeWatchExpression,
132
+ evaluateWatchExpressions,
133
+ setExceptionBreakpoints,
134
+ shouldBreakOnException,
135
+ flushLogOutput,
136
+ } from './advanced-features';
137
+
138
+ // Re-export debug-core types for convenience
139
+ export type {
140
+ Breakpoint,
141
+ SourceLocation,
142
+ StackFrame,
143
+ Variable,
144
+ Scope,
145
+ ContextEntry,
146
+ ToolCallRecord,
147
+ StopReason,
148
+ StepMode,
149
+ DebugState,
150
+ } from '@vibe-lang/debug-core';
@@ -0,0 +1,365 @@
1
+ /**
2
+ * Debug Runner - Functional debug execution
3
+ * Pure functions for running Vibe programs with debug support
4
+ */
5
+
6
+ import type { RuntimeState } from '../runtime/types';
7
+ import type { StoppedEvent, OutputEvent, TerminatedEvent, RuntimeEvent } from '@vibe-lang/debug-core';
8
+ import { step, runUntilPause } from '../runtime/step';
9
+ import {
10
+ resumeWithAIResponse,
11
+ resumeWithTsResult,
12
+ resumeWithImportedTsResult,
13
+ resumeWithToolResult,
14
+ resumeWithCompressResult,
15
+ resumeWithAsyncResults,
16
+ } from '../runtime/state';
17
+ import { awaitOperations } from '../runtime/async';
18
+ import { evalTsBlock } from '../runtime/ts-eval';
19
+ import { getImportedTsFunction, loadImports } from '../runtime/modules';
20
+ import type { AIProvider, AIExecutionResult } from '../runtime';
21
+ import {
22
+ type VibeDebugState,
23
+ createDebugState,
24
+ getCurrentLocation,
25
+ shouldPauseAtLocation,
26
+ pauseExecution,
27
+ resumeExecution,
28
+ setStepMode,
29
+ } from './state';
30
+
31
+ // Debug execution result
32
+ export interface DebugStepResult {
33
+ runtimeState: RuntimeState;
34
+ debugState: VibeDebugState;
35
+ event?: RuntimeEvent;
36
+ }
37
+
38
+ /**
39
+ * Initialize debug session
40
+ */
41
+ export function initDebugSession(options?: {
42
+ stopOnEntry?: boolean;
43
+ }): VibeDebugState {
44
+ return createDebugState(options);
45
+ }
46
+
47
+ /**
48
+ * Step one instruction with debug support
49
+ * Returns new states and any debug event to emit
50
+ */
51
+ export function debugStep(
52
+ runtimeState: RuntimeState,
53
+ debugState: VibeDebugState
54
+ ): DebugStepResult {
55
+ // If already completed or errored, return as-is
56
+ if (runtimeState.status === 'completed' || runtimeState.status === 'error') {
57
+ return {
58
+ runtimeState,
59
+ debugState,
60
+ event: createTerminatedEvent(),
61
+ };
62
+ }
63
+
64
+ // If waiting for async operation, can't step
65
+ if (
66
+ runtimeState.status === 'awaiting_ai' ||
67
+ runtimeState.status === 'awaiting_ts' ||
68
+ runtimeState.status === 'awaiting_user' ||
69
+ runtimeState.status === 'awaiting_tool' ||
70
+ runtimeState.status === 'awaiting_compress' ||
71
+ runtimeState.status === 'awaiting_async'
72
+ ) {
73
+ return { runtimeState, debugState };
74
+ }
75
+
76
+ // Execute one step
77
+ const newRuntimeState = step(runtimeState);
78
+
79
+ // Get current location after step
80
+ const location = getCurrentLocation(newRuntimeState);
81
+
82
+ // Check if we should pause
83
+ if (location) {
84
+ const { shouldPause, reason } = shouldPauseAtLocation(debugState, newRuntimeState, location);
85
+ if (shouldPause && reason) {
86
+ const newDebugState = pauseExecution(debugState, location, reason);
87
+ return {
88
+ runtimeState: newRuntimeState,
89
+ debugState: newDebugState,
90
+ event: createStoppedEvent(reason, location),
91
+ };
92
+ }
93
+ }
94
+
95
+ return {
96
+ runtimeState: newRuntimeState,
97
+ debugState,
98
+ };
99
+ }
100
+
101
+ /**
102
+ * Continue execution until breakpoint, pause, or completion
103
+ */
104
+ export function debugContinue(
105
+ runtimeState: RuntimeState,
106
+ debugState: VibeDebugState
107
+ ): DebugStepResult {
108
+ let state = runtimeState;
109
+ let dState = resumeExecution(debugState);
110
+
111
+ while (
112
+ state.status === 'running' ||
113
+ state.status === 'paused'
114
+ ) {
115
+ const result = debugStep(state, dState);
116
+ state = result.runtimeState;
117
+ dState = result.debugState;
118
+
119
+ // If we got an event (stopped, terminated), return it
120
+ if (result.event) {
121
+ return result;
122
+ }
123
+
124
+ // If waiting for async, break out
125
+ if (
126
+ state.status === 'awaiting_ai' ||
127
+ state.status === 'awaiting_ts' ||
128
+ state.status === 'awaiting_user' ||
129
+ state.status === 'awaiting_tool' ||
130
+ state.status === 'awaiting_compress' ||
131
+ state.status === 'awaiting_async'
132
+ ) {
133
+ break;
134
+ }
135
+ }
136
+
137
+ // Check for completion
138
+ if (state.status === 'completed') {
139
+ return {
140
+ runtimeState: state,
141
+ debugState: dState,
142
+ event: createTerminatedEvent(),
143
+ };
144
+ }
145
+
146
+ return { runtimeState: state, debugState: dState };
147
+ }
148
+
149
+ /**
150
+ * Step into (step one statement, entering function calls)
151
+ */
152
+ export function debugStepIn(
153
+ runtimeState: RuntimeState,
154
+ debugState: VibeDebugState
155
+ ): DebugStepResult {
156
+ const newDebugState = setStepMode(debugState, 'into');
157
+ return debugStep(runtimeState, newDebugState);
158
+ }
159
+
160
+ /**
161
+ * Step over (step one statement, skipping over function calls)
162
+ */
163
+ export function debugStepOver(
164
+ runtimeState: RuntimeState,
165
+ debugState: VibeDebugState
166
+ ): DebugStepResult {
167
+ const newDebugState = setStepMode(debugState, 'over');
168
+ // For now, step over is same as step in
169
+ // TODO: Track call depth to skip over function bodies
170
+ return debugStep(runtimeState, newDebugState);
171
+ }
172
+
173
+ /**
174
+ * Step out (run until current function returns)
175
+ */
176
+ export function debugStepOut(
177
+ runtimeState: RuntimeState,
178
+ debugState: VibeDebugState
179
+ ): DebugStepResult {
180
+ const newDebugState = setStepMode(debugState, 'out');
181
+ // TODO: Track call depth to run until return
182
+ return debugContinue(runtimeState, newDebugState);
183
+ }
184
+
185
+ /**
186
+ * Handle async AI call during debug
187
+ */
188
+ export async function handleDebugAICall(
189
+ runtimeState: RuntimeState,
190
+ debugState: VibeDebugState,
191
+ aiProvider: AIProvider
192
+ ): Promise<DebugStepResult> {
193
+ if (runtimeState.status !== 'awaiting_ai' || !runtimeState.pendingAI) {
194
+ return { runtimeState, debugState };
195
+ }
196
+
197
+ // Execute AI call
198
+ const result: AIExecutionResult = await aiProvider.execute(runtimeState.pendingAI.prompt);
199
+
200
+ // Resume with response
201
+ const newRuntimeState = resumeWithAIResponse(runtimeState, result.value);
202
+
203
+ return { runtimeState: newRuntimeState, debugState };
204
+ }
205
+
206
+ /**
207
+ * Handle async TypeScript evaluation during debug
208
+ */
209
+ export async function handleDebugTSCall(
210
+ runtimeState: RuntimeState,
211
+ debugState: VibeDebugState
212
+ ): Promise<DebugStepResult> {
213
+ if (runtimeState.status !== 'awaiting_ts') {
214
+ return { runtimeState, debugState };
215
+ }
216
+
217
+ let newRuntimeState = runtimeState;
218
+
219
+ if (runtimeState.pendingTS) {
220
+ // Handle inline ts block
221
+ const { params, body, paramValues, location } = runtimeState.pendingTS;
222
+ const result = await evalTsBlock(params, body, paramValues, location);
223
+ newRuntimeState = resumeWithTsResult(runtimeState, result);
224
+ } else if (runtimeState.pendingImportedTsCall) {
225
+ // Handle imported TS function
226
+ const { funcName, args } = runtimeState.pendingImportedTsCall;
227
+ const fn = getImportedTsFunction(runtimeState, funcName);
228
+ if (fn) {
229
+ const result = await fn(...args);
230
+ newRuntimeState = resumeWithImportedTsResult(runtimeState, result);
231
+ }
232
+ }
233
+
234
+ return { runtimeState: newRuntimeState, debugState };
235
+ }
236
+
237
+ /**
238
+ * Handle async await during debug
239
+ */
240
+ export async function handleDebugAsyncAwait(
241
+ runtimeState: RuntimeState,
242
+ debugState: VibeDebugState
243
+ ): Promise<DebugStepResult> {
244
+ if (runtimeState.status !== 'awaiting_async' || runtimeState.awaitingAsyncIds.length === 0) {
245
+ return { runtimeState, debugState };
246
+ }
247
+
248
+ // Await the pending operations
249
+ const results = await awaitOperations(
250
+ runtimeState.awaitingAsyncIds,
251
+ runtimeState.asyncOperations
252
+ );
253
+
254
+ // Resume with results
255
+ const newRuntimeState = resumeWithAsyncResults(runtimeState, results);
256
+
257
+ return { runtimeState: newRuntimeState, debugState };
258
+ }
259
+
260
+ /**
261
+ * Run program with debug support until stopped or completed
262
+ * This is the main debug loop
263
+ */
264
+ export async function runWithDebug(
265
+ runtimeState: RuntimeState,
266
+ debugState: VibeDebugState,
267
+ aiProvider: AIProvider,
268
+ onEvent: (event: RuntimeEvent) => void
269
+ ): Promise<{ runtimeState: RuntimeState; debugState: VibeDebugState }> {
270
+ let state = runtimeState;
271
+ let dState = debugState;
272
+
273
+ // If stop on entry, emit stopped event
274
+ if (dState.paused && dState.stopReason === 'entry') {
275
+ const location = getCurrentLocation(state);
276
+ if (location) {
277
+ onEvent(createStoppedEvent('entry', location));
278
+ }
279
+ return { runtimeState: state, debugState: dState };
280
+ }
281
+
282
+ while (state.status !== 'completed' && state.status !== 'error') {
283
+ // Handle async operations
284
+ if (state.status === 'awaiting_ai') {
285
+ const result = await handleDebugAICall(state, dState, aiProvider);
286
+ state = result.runtimeState;
287
+ dState = result.debugState;
288
+ continue;
289
+ }
290
+
291
+ if (state.status === 'awaiting_ts') {
292
+ const result = await handleDebugTSCall(state, dState);
293
+ state = result.runtimeState;
294
+ dState = result.debugState;
295
+ continue;
296
+ }
297
+
298
+ if (state.status === 'awaiting_async') {
299
+ const result = await handleDebugAsyncAwait(state, dState);
300
+ state = result.runtimeState;
301
+ dState = result.debugState;
302
+ continue;
303
+ }
304
+
305
+ // Step execution
306
+ const result = debugContinue(state, dState);
307
+ state = result.runtimeState;
308
+ dState = result.debugState;
309
+
310
+ // Emit events
311
+ if (result.event) {
312
+ onEvent(result.event);
313
+
314
+ // If stopped, pause the loop
315
+ if (result.event.type === 'event' && result.event.event === 'stopped') {
316
+ return { runtimeState: state, debugState: dState };
317
+ }
318
+
319
+ // If terminated, exit
320
+ if (result.event.type === 'event' && result.event.event === 'terminated') {
321
+ return { runtimeState: state, debugState: dState };
322
+ }
323
+ }
324
+ }
325
+
326
+ // Emit terminated event
327
+ onEvent(createTerminatedEvent());
328
+ return { runtimeState: state, debugState: dState };
329
+ }
330
+
331
+ // Event creators
332
+
333
+ function createStoppedEvent(reason: string, location: { file: string; line: number; column: number }): StoppedEvent {
334
+ return {
335
+ type: 'event',
336
+ event: 'stopped',
337
+ body: {
338
+ reason: reason as any,
339
+ location,
340
+ threadId: 1,
341
+ allThreadsStopped: true,
342
+ },
343
+ };
344
+ }
345
+
346
+ function createTerminatedEvent(): TerminatedEvent {
347
+ return {
348
+ type: 'event',
349
+ event: 'terminated',
350
+ };
351
+ }
352
+
353
+ export function createOutputEvent(
354
+ output: string,
355
+ category: 'stdout' | 'stderr' | 'console' = 'stdout'
356
+ ): OutputEvent {
357
+ return {
358
+ type: 'event',
359
+ event: 'output',
360
+ body: {
361
+ category,
362
+ output,
363
+ },
364
+ };
365
+ }