@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,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stack Frame Merger
|
|
3
|
+
* Combines Vibe runtime stack frames with TS/Bun inspector stack frames
|
|
4
|
+
* to present a unified debugging view
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { StackFrame, SourceLocation } from '@vibe-lang/debug-core';
|
|
8
|
+
import type { RuntimeState } from '../runtime/types';
|
|
9
|
+
import { getStackTrace } from './state';
|
|
10
|
+
|
|
11
|
+
// Stack frame origin
|
|
12
|
+
export type FrameOrigin = 'vibe' | 'typescript' | 'hybrid';
|
|
13
|
+
|
|
14
|
+
// Extended stack frame with origin info
|
|
15
|
+
export interface MergedStackFrame extends StackFrame {
|
|
16
|
+
origin: FrameOrigin;
|
|
17
|
+
// For TS frames, the original CDP call frame ID
|
|
18
|
+
cdpCallFrameId?: string;
|
|
19
|
+
// For TS block frames, the mapping ID
|
|
20
|
+
tsBlockMappingId?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Current debug mode
|
|
24
|
+
export type DebugMode = 'vibe' | 'typescript';
|
|
25
|
+
|
|
26
|
+
// Debug execution context tracking
|
|
27
|
+
export interface DebugExecutionContext {
|
|
28
|
+
// Current mode - are we in Vibe code or TS code?
|
|
29
|
+
mode: DebugMode;
|
|
30
|
+
// If in TS mode, depth into TS calls (for step out)
|
|
31
|
+
tsCallDepth: number;
|
|
32
|
+
// The Vibe call stack depth when we entered TS
|
|
33
|
+
vibeCallDepthOnTsEntry: number;
|
|
34
|
+
// TS block mapping ID if we're in a ts block
|
|
35
|
+
currentTsBlockId: string | null;
|
|
36
|
+
// Imported TS function if we stepped into one
|
|
37
|
+
currentTsImport: string | null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Create initial debug execution context
|
|
42
|
+
*/
|
|
43
|
+
export function createDebugExecutionContext(): DebugExecutionContext {
|
|
44
|
+
return {
|
|
45
|
+
mode: 'vibe',
|
|
46
|
+
tsCallDepth: 0,
|
|
47
|
+
vibeCallDepthOnTsEntry: 0,
|
|
48
|
+
currentTsBlockId: null,
|
|
49
|
+
currentTsImport: null,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Enter TS block mode
|
|
55
|
+
*/
|
|
56
|
+
export function enterTsBlock(
|
|
57
|
+
context: DebugExecutionContext,
|
|
58
|
+
tsBlockId: string,
|
|
59
|
+
vibeCallDepth: number
|
|
60
|
+
): DebugExecutionContext {
|
|
61
|
+
return {
|
|
62
|
+
...context,
|
|
63
|
+
mode: 'typescript',
|
|
64
|
+
tsCallDepth: 1,
|
|
65
|
+
vibeCallDepthOnTsEntry: vibeCallDepth,
|
|
66
|
+
currentTsBlockId: tsBlockId,
|
|
67
|
+
currentTsImport: null,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Enter imported TS function mode
|
|
73
|
+
*/
|
|
74
|
+
export function enterTsImport(
|
|
75
|
+
context: DebugExecutionContext,
|
|
76
|
+
tsImportName: string,
|
|
77
|
+
vibeCallDepth: number
|
|
78
|
+
): DebugExecutionContext {
|
|
79
|
+
return {
|
|
80
|
+
...context,
|
|
81
|
+
mode: 'typescript',
|
|
82
|
+
tsCallDepth: 1,
|
|
83
|
+
vibeCallDepthOnTsEntry: vibeCallDepth,
|
|
84
|
+
currentTsBlockId: null,
|
|
85
|
+
currentTsImport: tsImportName,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Return to Vibe mode
|
|
91
|
+
*/
|
|
92
|
+
export function exitTsMode(context: DebugExecutionContext): DebugExecutionContext {
|
|
93
|
+
return {
|
|
94
|
+
...context,
|
|
95
|
+
mode: 'vibe',
|
|
96
|
+
tsCallDepth: 0,
|
|
97
|
+
vibeCallDepthOnTsEntry: 0,
|
|
98
|
+
currentTsBlockId: null,
|
|
99
|
+
currentTsImport: null,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Increment TS call depth (when stepping into TS functions)
|
|
105
|
+
*/
|
|
106
|
+
export function incrementTsCallDepth(context: DebugExecutionContext): DebugExecutionContext {
|
|
107
|
+
return {
|
|
108
|
+
...context,
|
|
109
|
+
tsCallDepth: context.tsCallDepth + 1,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Decrement TS call depth (when stepping out of TS functions)
|
|
115
|
+
*/
|
|
116
|
+
export function decrementTsCallDepth(context: DebugExecutionContext): DebugExecutionContext {
|
|
117
|
+
const newDepth = context.tsCallDepth - 1;
|
|
118
|
+
if (newDepth <= 0) {
|
|
119
|
+
// Returning to Vibe
|
|
120
|
+
return exitTsMode(context);
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
...context,
|
|
124
|
+
tsCallDepth: newDepth,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Merge Vibe and TS stack frames
|
|
130
|
+
*
|
|
131
|
+
* When in TS mode, the stack looks like:
|
|
132
|
+
* - TS frames from Bun inspector (top of stack)
|
|
133
|
+
* - Vibe frames from runtime (below)
|
|
134
|
+
*
|
|
135
|
+
* We merge them into a single unified stack.
|
|
136
|
+
*/
|
|
137
|
+
export function mergeStackFrames(
|
|
138
|
+
vibeFrames: StackFrame[],
|
|
139
|
+
tsFrames: StackFrame[],
|
|
140
|
+
context: DebugExecutionContext
|
|
141
|
+
): MergedStackFrame[] {
|
|
142
|
+
const merged: MergedStackFrame[] = [];
|
|
143
|
+
|
|
144
|
+
if (context.mode === 'vibe') {
|
|
145
|
+
// In pure Vibe mode, just return Vibe frames
|
|
146
|
+
for (const frame of vibeFrames) {
|
|
147
|
+
merged.push({
|
|
148
|
+
...frame,
|
|
149
|
+
origin: 'vibe',
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
} else {
|
|
153
|
+
// In TS mode, merge frames
|
|
154
|
+
// TS frames go on top (most recent)
|
|
155
|
+
for (const frame of tsFrames) {
|
|
156
|
+
merged.push({
|
|
157
|
+
...frame,
|
|
158
|
+
origin: 'typescript',
|
|
159
|
+
tsBlockMappingId: context.currentTsBlockId ?? undefined,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Then Vibe frames (skip frames above where we entered TS)
|
|
164
|
+
// The Vibe frames below the entry point are still valid
|
|
165
|
+
const vibeFramesToShow = vibeFrames.slice(0, vibeFrames.length - context.vibeCallDepthOnTsEntry + 1);
|
|
166
|
+
for (const frame of vibeFramesToShow) {
|
|
167
|
+
merged.push({
|
|
168
|
+
...frame,
|
|
169
|
+
origin: 'vibe',
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Reassign IDs sequentially
|
|
175
|
+
merged.forEach((frame, index) => {
|
|
176
|
+
frame.id = index;
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
return merged;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Get unified stack trace from both Vibe runtime and TS inspector
|
|
184
|
+
*/
|
|
185
|
+
export function getUnifiedStackTrace(
|
|
186
|
+
runtimeState: RuntimeState,
|
|
187
|
+
tsFrames: StackFrame[] | null,
|
|
188
|
+
context: DebugExecutionContext
|
|
189
|
+
): { stackFrames: MergedStackFrame[]; totalFrames: number } {
|
|
190
|
+
const { stackFrames: vibeFrames } = getStackTrace(runtimeState);
|
|
191
|
+
|
|
192
|
+
const merged = mergeStackFrames(
|
|
193
|
+
vibeFrames,
|
|
194
|
+
tsFrames ?? [],
|
|
195
|
+
context
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
return {
|
|
199
|
+
stackFrames: merged,
|
|
200
|
+
totalFrames: merged.length,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Determine if we should hand off to TS debugger
|
|
206
|
+
* Called when stepping into code
|
|
207
|
+
*/
|
|
208
|
+
export function shouldHandoffToTs(
|
|
209
|
+
runtimeState: RuntimeState,
|
|
210
|
+
currentLocation: SourceLocation
|
|
211
|
+
): { shouldHandoff: boolean; reason: 'ts_block' | 'ts_import' | null; target?: string } {
|
|
212
|
+
// Check if the current instruction is about to execute a TS block
|
|
213
|
+
const instruction = runtimeState.instructionStack[0];
|
|
214
|
+
if (!instruction) {
|
|
215
|
+
return { shouldHandoff: false, reason: null };
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Check for ts block execution
|
|
219
|
+
if (instruction.type === 'awaiting_ts' && runtimeState.pendingTS) {
|
|
220
|
+
return {
|
|
221
|
+
shouldHandoff: true,
|
|
222
|
+
reason: 'ts_block',
|
|
223
|
+
target: `ts_block_at_${currentLocation.line}`,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Check for imported TS function call
|
|
228
|
+
if (instruction.type === 'awaiting_ts' && runtimeState.pendingImportedTsCall) {
|
|
229
|
+
return {
|
|
230
|
+
shouldHandoff: true,
|
|
231
|
+
reason: 'ts_import',
|
|
232
|
+
target: runtimeState.pendingImportedTsCall.funcName,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return { shouldHandoff: false, reason: null };
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Determine if we should return control to Vibe debugger
|
|
241
|
+
* Called when TS execution completes
|
|
242
|
+
*/
|
|
243
|
+
export function shouldReturnToVibe(
|
|
244
|
+
context: DebugExecutionContext,
|
|
245
|
+
tsCallDepth: number
|
|
246
|
+
): boolean {
|
|
247
|
+
// If we're at or below the entry depth, return to Vibe
|
|
248
|
+
return context.mode === 'typescript' && tsCallDepth <= 0;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Get the appropriate frame ID for variable requests
|
|
253
|
+
* Maps unified frame IDs back to origin-specific IDs
|
|
254
|
+
*/
|
|
255
|
+
export function getFrameIdForOrigin(
|
|
256
|
+
mergedFrames: MergedStackFrame[],
|
|
257
|
+
unifiedFrameId: number
|
|
258
|
+
): { origin: FrameOrigin; frameId: number; cdpCallFrameId?: string } | null {
|
|
259
|
+
const frame = mergedFrames[unifiedFrameId];
|
|
260
|
+
if (!frame) return null;
|
|
261
|
+
|
|
262
|
+
return {
|
|
263
|
+
origin: frame.origin,
|
|
264
|
+
frameId: frame.id,
|
|
265
|
+
cdpCallFrameId: frame.cdpCallFrameId,
|
|
266
|
+
};
|
|
267
|
+
}
|