@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.
- package/package.json +46 -0
- package/src/ast/index.ts +375 -0
- package/src/ast.ts +2 -0
- package/src/debug/advanced-features.ts +482 -0
- package/src/debug/bun-inspector.ts +424 -0
- package/src/debug/handoff-manager.ts +283 -0
- package/src/debug/index.ts +150 -0
- package/src/debug/runner.ts +365 -0
- package/src/debug/server.ts +565 -0
- package/src/debug/stack-merger.ts +267 -0
- package/src/debug/state.ts +581 -0
- package/src/debug/test/advanced-features.test.ts +300 -0
- package/src/debug/test/e2e.test.ts +218 -0
- package/src/debug/test/handoff-manager.test.ts +256 -0
- package/src/debug/test/runner.test.ts +256 -0
- package/src/debug/test/stack-merger.test.ts +163 -0
- package/src/debug/test/state.test.ts +400 -0
- package/src/debug/test/ts-debug-integration.test.ts +374 -0
- package/src/debug/test/ts-import-tracker.test.ts +125 -0
- package/src/debug/test/ts-source-map.test.ts +169 -0
- package/src/debug/ts-import-tracker.ts +151 -0
- package/src/debug/ts-source-map.ts +171 -0
- package/src/errors/index.ts +124 -0
- package/src/index.ts +358 -0
- package/src/lexer/index.ts +348 -0
- package/src/lexer.ts +2 -0
- package/src/parser/index.ts +792 -0
- package/src/parser/parse.ts +45 -0
- package/src/parser/test/async.test.ts +248 -0
- package/src/parser/test/destructuring.test.ts +167 -0
- package/src/parser/test/do-expression.test.ts +486 -0
- package/src/parser/test/errors/do-expression.test.ts +95 -0
- package/src/parser/test/errors/error-locations.test.ts +230 -0
- package/src/parser/test/errors/invalid-expressions.test.ts +144 -0
- package/src/parser/test/errors/missing-tokens.test.ts +126 -0
- package/src/parser/test/errors/model-declaration.test.ts +185 -0
- package/src/parser/test/errors/nested-blocks.test.ts +226 -0
- package/src/parser/test/errors/unclosed-delimiters.test.ts +122 -0
- package/src/parser/test/errors/unexpected-tokens.test.ts +120 -0
- package/src/parser/test/import-export.test.ts +143 -0
- package/src/parser/test/literals.test.ts +404 -0
- package/src/parser/test/model-declaration.test.ts +161 -0
- package/src/parser/test/nested-blocks.test.ts +402 -0
- package/src/parser/test/parser.test.ts +743 -0
- package/src/parser/test/private.test.ts +136 -0
- package/src/parser/test/template-literal.test.ts +127 -0
- package/src/parser/test/tool-declaration.test.ts +302 -0
- package/src/parser/test/ts-block.test.ts +252 -0
- package/src/parser/test/type-annotations.test.ts +254 -0
- package/src/parser/visitor/helpers.ts +330 -0
- package/src/parser/visitor.ts +794 -0
- package/src/parser.ts +2 -0
- package/src/runtime/ai/cache-chunking.test.ts +69 -0
- package/src/runtime/ai/cache-chunking.ts +73 -0
- package/src/runtime/ai/client.ts +109 -0
- package/src/runtime/ai/context.ts +168 -0
- package/src/runtime/ai/formatters.ts +316 -0
- package/src/runtime/ai/index.ts +38 -0
- package/src/runtime/ai/language-ref.ts +38 -0
- package/src/runtime/ai/providers/anthropic.ts +253 -0
- package/src/runtime/ai/providers/google.ts +201 -0
- package/src/runtime/ai/providers/openai.ts +156 -0
- package/src/runtime/ai/retry.ts +100 -0
- package/src/runtime/ai/return-tools.ts +301 -0
- package/src/runtime/ai/test/client.test.ts +83 -0
- package/src/runtime/ai/test/formatters.test.ts +485 -0
- package/src/runtime/ai/test/retry.test.ts +137 -0
- package/src/runtime/ai/test/return-tools.test.ts +450 -0
- package/src/runtime/ai/test/tool-loop.test.ts +319 -0
- package/src/runtime/ai/test/tool-schema.test.ts +241 -0
- package/src/runtime/ai/tool-loop.ts +203 -0
- package/src/runtime/ai/tool-schema.ts +151 -0
- package/src/runtime/ai/types.ts +113 -0
- package/src/runtime/ai-logger.ts +255 -0
- package/src/runtime/ai-provider.ts +347 -0
- package/src/runtime/async/dependencies.ts +276 -0
- package/src/runtime/async/executor.ts +293 -0
- package/src/runtime/async/index.ts +43 -0
- package/src/runtime/async/scheduling.ts +163 -0
- package/src/runtime/async/test/dependencies.test.ts +284 -0
- package/src/runtime/async/test/executor.test.ts +388 -0
- package/src/runtime/context.ts +357 -0
- package/src/runtime/exec/ai.ts +139 -0
- package/src/runtime/exec/expressions.ts +475 -0
- package/src/runtime/exec/frames.ts +26 -0
- package/src/runtime/exec/functions.ts +305 -0
- package/src/runtime/exec/interpolation.ts +312 -0
- package/src/runtime/exec/statements.ts +604 -0
- package/src/runtime/exec/tools.ts +129 -0
- package/src/runtime/exec/typescript.ts +215 -0
- package/src/runtime/exec/variables.ts +279 -0
- package/src/runtime/index.ts +975 -0
- package/src/runtime/modules.ts +452 -0
- package/src/runtime/serialize.ts +103 -0
- package/src/runtime/state.ts +489 -0
- package/src/runtime/stdlib/core.ts +45 -0
- package/src/runtime/stdlib/directory.test.ts +156 -0
- package/src/runtime/stdlib/edit.test.ts +154 -0
- package/src/runtime/stdlib/fastEdit.test.ts +201 -0
- package/src/runtime/stdlib/glob.test.ts +106 -0
- package/src/runtime/stdlib/grep.test.ts +144 -0
- package/src/runtime/stdlib/index.ts +16 -0
- package/src/runtime/stdlib/readFile.test.ts +123 -0
- package/src/runtime/stdlib/tools/index.ts +707 -0
- package/src/runtime/stdlib/writeFile.test.ts +157 -0
- package/src/runtime/step.ts +969 -0
- package/src/runtime/test/ai-context.test.ts +1086 -0
- package/src/runtime/test/ai-result-object.test.ts +419 -0
- package/src/runtime/test/ai-tool-flow.test.ts +859 -0
- package/src/runtime/test/async-execution-order.test.ts +618 -0
- package/src/runtime/test/async-execution.test.ts +344 -0
- package/src/runtime/test/async-nested.test.ts +660 -0
- package/src/runtime/test/async-parallel-timing.test.ts +546 -0
- package/src/runtime/test/basic1.test.ts +154 -0
- package/src/runtime/test/binary-operators.test.ts +431 -0
- package/src/runtime/test/break-statement.test.ts +257 -0
- package/src/runtime/test/context-modes.test.ts +650 -0
- package/src/runtime/test/context.test.ts +466 -0
- package/src/runtime/test/core-functions.test.ts +228 -0
- package/src/runtime/test/e2e.test.ts +88 -0
- package/src/runtime/test/error-locations/error-locations.test.ts +80 -0
- package/src/runtime/test/error-locations/main-error.vibe +4 -0
- package/src/runtime/test/error-locations/main-import-error.vibe +3 -0
- package/src/runtime/test/error-locations/utils/helper.vibe +5 -0
- package/src/runtime/test/for-in.test.ts +312 -0
- package/src/runtime/test/helpers.ts +69 -0
- package/src/runtime/test/imports.test.ts +334 -0
- package/src/runtime/test/json-expressions.test.ts +232 -0
- package/src/runtime/test/literals.test.ts +372 -0
- package/src/runtime/test/logical-indexing.test.ts +478 -0
- package/src/runtime/test/member-methods.test.ts +324 -0
- package/src/runtime/test/model-config.test.ts +338 -0
- package/src/runtime/test/null-handling.test.ts +342 -0
- package/src/runtime/test/private-visibility.test.ts +332 -0
- package/src/runtime/test/runtime-state.test.ts +514 -0
- package/src/runtime/test/scoping.test.ts +370 -0
- package/src/runtime/test/string-interpolation.test.ts +354 -0
- package/src/runtime/test/template-literal.test.ts +181 -0
- package/src/runtime/test/tool-execution.test.ts +467 -0
- package/src/runtime/test/tool-schema-generation.test.ts +477 -0
- package/src/runtime/test/tostring.test.ts +210 -0
- package/src/runtime/test/ts-block.test.ts +594 -0
- package/src/runtime/test/ts-error-location.test.ts +231 -0
- package/src/runtime/test/types.test.ts +732 -0
- package/src/runtime/test/verbose-logger.test.ts +710 -0
- package/src/runtime/test/vibe-expression.test.ts +54 -0
- package/src/runtime/test/vibe-value-errors.test.ts +541 -0
- package/src/runtime/test/while.test.ts +232 -0
- package/src/runtime/tools/builtin.ts +30 -0
- package/src/runtime/tools/directory-tools.ts +70 -0
- package/src/runtime/tools/file-tools.ts +228 -0
- package/src/runtime/tools/index.ts +5 -0
- package/src/runtime/tools/registry.ts +48 -0
- package/src/runtime/tools/search-tools.ts +134 -0
- package/src/runtime/tools/security.ts +36 -0
- package/src/runtime/tools/system-tools.ts +312 -0
- package/src/runtime/tools/test/fixtures/base-types.ts +40 -0
- package/src/runtime/tools/test/fixtures/test-types.ts +132 -0
- package/src/runtime/tools/test/registry.test.ts +713 -0
- package/src/runtime/tools/test/security.test.ts +86 -0
- package/src/runtime/tools/test/system-tools.test.ts +679 -0
- package/src/runtime/tools/test/ts-schema.test.ts +357 -0
- package/src/runtime/tools/ts-schema.ts +341 -0
- package/src/runtime/tools/types.ts +89 -0
- package/src/runtime/tools/utility-tools.ts +198 -0
- package/src/runtime/ts-eval.ts +126 -0
- package/src/runtime/types.ts +797 -0
- package/src/runtime/validation.ts +160 -0
- package/src/runtime/verbose-logger.ts +459 -0
- package/src/runtime.ts +2 -0
- package/src/semantic/analyzer-context.ts +62 -0
- package/src/semantic/analyzer-validators.ts +575 -0
- package/src/semantic/analyzer-visitors.ts +534 -0
- package/src/semantic/analyzer.ts +83 -0
- package/src/semantic/index.ts +11 -0
- package/src/semantic/symbol-table.ts +58 -0
- package/src/semantic/test/async-validation.test.ts +301 -0
- package/src/semantic/test/compress-validation.test.ts +179 -0
- package/src/semantic/test/const-reassignment.test.ts +111 -0
- package/src/semantic/test/control-flow.test.ts +346 -0
- package/src/semantic/test/destructuring.test.ts +185 -0
- package/src/semantic/test/duplicate-declarations.test.ts +168 -0
- package/src/semantic/test/export-validation.test.ts +111 -0
- package/src/semantic/test/fixtures/math.ts +31 -0
- package/src/semantic/test/imports.test.ts +148 -0
- package/src/semantic/test/json-type.test.ts +68 -0
- package/src/semantic/test/literals.test.ts +127 -0
- package/src/semantic/test/model-validation.test.ts +179 -0
- package/src/semantic/test/prompt-validation.test.ts +343 -0
- package/src/semantic/test/scoping.test.ts +312 -0
- package/src/semantic/test/tool-validation.test.ts +306 -0
- package/src/semantic/test/ts-type-checking.test.ts +563 -0
- package/src/semantic/test/type-constraints.test.ts +111 -0
- package/src/semantic/test/type-inference.test.ts +87 -0
- package/src/semantic/test/type-validation.test.ts +552 -0
- package/src/semantic/test/undefined-variables.test.ts +163 -0
- package/src/semantic/ts-block-checker.ts +204 -0
- package/src/semantic/ts-signatures.ts +194 -0
- package/src/semantic/ts-types.ts +170 -0
- package/src/semantic/types.ts +58 -0
- package/tests/fixtures/conditional-logic.vibe +14 -0
- package/tests/fixtures/function-call.vibe +16 -0
- package/tests/fixtures/imports/cycle-detection/a.vibe +6 -0
- package/tests/fixtures/imports/cycle-detection/b.vibe +5 -0
- package/tests/fixtures/imports/cycle-detection/main.vibe +3 -0
- package/tests/fixtures/imports/module-isolation/main-b.vibe +8 -0
- package/tests/fixtures/imports/module-isolation/main.vibe +9 -0
- package/tests/fixtures/imports/module-isolation/moduleA.vibe +6 -0
- package/tests/fixtures/imports/module-isolation/moduleB.vibe +6 -0
- package/tests/fixtures/imports/nested-import/helper.vibe +6 -0
- package/tests/fixtures/imports/nested-import/main.vibe +3 -0
- package/tests/fixtures/imports/nested-import/utils.ts +3 -0
- package/tests/fixtures/imports/nested-isolation/file2.vibe +15 -0
- package/tests/fixtures/imports/nested-isolation/file3.vibe +10 -0
- package/tests/fixtures/imports/nested-isolation/main.vibe +21 -0
- package/tests/fixtures/imports/pure-cycle/a.vibe +5 -0
- package/tests/fixtures/imports/pure-cycle/b.vibe +5 -0
- package/tests/fixtures/imports/pure-cycle/main.vibe +3 -0
- package/tests/fixtures/imports/ts-boolean/checks.ts +14 -0
- package/tests/fixtures/imports/ts-boolean/main.vibe +10 -0
- package/tests/fixtures/imports/ts-boolean/type-mismatch.vibe +5 -0
- package/tests/fixtures/imports/ts-boolean/use-constant.vibe +18 -0
- package/tests/fixtures/imports/ts-error-handling/helpers.ts +42 -0
- package/tests/fixtures/imports/ts-error-handling/main.vibe +5 -0
- package/tests/fixtures/imports/ts-import/main.vibe +4 -0
- package/tests/fixtures/imports/ts-import/math.ts +9 -0
- package/tests/fixtures/imports/ts-variables/call-non-function.vibe +5 -0
- package/tests/fixtures/imports/ts-variables/data.ts +10 -0
- package/tests/fixtures/imports/ts-variables/import-json.vibe +5 -0
- package/tests/fixtures/imports/ts-variables/import-type-mismatch.vibe +5 -0
- package/tests/fixtures/imports/ts-variables/import-variable.vibe +5 -0
- package/tests/fixtures/imports/vibe-import/greet.vibe +5 -0
- package/tests/fixtures/imports/vibe-import/main.vibe +3 -0
- package/tests/fixtures/multiple-ai-calls.vibe +10 -0
- package/tests/fixtures/simple-greeting.vibe +6 -0
- package/tests/fixtures/template-literals.vibe +11 -0
- package/tests/integration/basic-ai/basic-ai.integration.test.ts +166 -0
- package/tests/integration/basic-ai/basic-ai.vibe +12 -0
- package/tests/integration/bug-fix/bug-fix.integration.test.ts +201 -0
- package/tests/integration/bug-fix/buggy-code.ts +22 -0
- package/tests/integration/bug-fix/fix-bug.vibe +21 -0
- package/tests/integration/compress/compress.integration.test.ts +206 -0
- package/tests/integration/destructuring/destructuring.integration.test.ts +92 -0
- package/tests/integration/hello-world-translator/hello-world-translator.integration.test.ts +61 -0
- package/tests/integration/line-annotator/context-modes.integration.test.ts +261 -0
- package/tests/integration/line-annotator/line-annotator.integration.test.ts +148 -0
- package/tests/integration/multi-feature/cumulative-sum.integration.test.ts +75 -0
- package/tests/integration/multi-feature/number-analyzer.integration.test.ts +191 -0
- package/tests/integration/multi-feature/number-analyzer.vibe +59 -0
- 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
|
+
}
|