@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,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TS Import Tracker
|
|
3
|
+
* Tracks imported TypeScript functions for debugging
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { SourceLocation } from '../errors';
|
|
7
|
+
|
|
8
|
+
// Imported TS function info
|
|
9
|
+
export interface TsImportInfo {
|
|
10
|
+
// The name used in Vibe code
|
|
11
|
+
vibeName: string;
|
|
12
|
+
// The .ts file path
|
|
13
|
+
tsFile: string;
|
|
14
|
+
// The original function name in the TS file
|
|
15
|
+
tsFunctionName: string;
|
|
16
|
+
// The .vibe file that imported it
|
|
17
|
+
importedBy: string;
|
|
18
|
+
// Line in .vibe file where import statement is
|
|
19
|
+
importLine: number;
|
|
20
|
+
// Whether we've resolved the entry point line in the TS file
|
|
21
|
+
entryLine?: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Registry of imported TS functions
|
|
25
|
+
const tsImports = new Map<string, TsImportInfo>();
|
|
26
|
+
|
|
27
|
+
// Temporary breakpoints set for stepping into TS
|
|
28
|
+
const tempBreakpoints = new Map<string, string>(); // tsFile:line -> breakpointId
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Register an imported TS function
|
|
32
|
+
*/
|
|
33
|
+
export function registerTsImport(
|
|
34
|
+
vibeName: string,
|
|
35
|
+
tsFile: string,
|
|
36
|
+
tsFunctionName: string,
|
|
37
|
+
importedBy: string,
|
|
38
|
+
importLine: number
|
|
39
|
+
): void {
|
|
40
|
+
const key = `${importedBy}:${vibeName}`;
|
|
41
|
+
tsImports.set(key, {
|
|
42
|
+
vibeName,
|
|
43
|
+
tsFile,
|
|
44
|
+
tsFunctionName,
|
|
45
|
+
importedBy,
|
|
46
|
+
importLine,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Get info about an imported TS function
|
|
52
|
+
*/
|
|
53
|
+
export function getTsImportInfo(vibeFile: string, functionName: string): TsImportInfo | undefined {
|
|
54
|
+
const key = `${vibeFile}:${functionName}`;
|
|
55
|
+
return tsImports.get(key);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Check if a function call targets an imported TS function
|
|
60
|
+
*/
|
|
61
|
+
export function isTsImportCall(vibeFile: string, functionName: string): boolean {
|
|
62
|
+
const key = `${vibeFile}:${functionName}`;
|
|
63
|
+
return tsImports.has(key);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Set the entry line for a TS function (once resolved by Bun inspector)
|
|
68
|
+
*/
|
|
69
|
+
export function setTsImportEntryLine(
|
|
70
|
+
vibeFile: string,
|
|
71
|
+
functionName: string,
|
|
72
|
+
entryLine: number
|
|
73
|
+
): void {
|
|
74
|
+
const key = `${vibeFile}:${functionName}`;
|
|
75
|
+
const info = tsImports.get(key);
|
|
76
|
+
if (info) {
|
|
77
|
+
info.entryLine = entryLine;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Register a temporary breakpoint for stepping into TS
|
|
83
|
+
*/
|
|
84
|
+
export function registerTempBreakpoint(
|
|
85
|
+
tsFile: string,
|
|
86
|
+
line: number,
|
|
87
|
+
breakpointId: string
|
|
88
|
+
): void {
|
|
89
|
+
const key = `${tsFile}:${line}`;
|
|
90
|
+
tempBreakpoints.set(key, breakpointId);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Get and remove a temporary breakpoint
|
|
95
|
+
*/
|
|
96
|
+
export function popTempBreakpoint(tsFile: string, line: number): string | undefined {
|
|
97
|
+
const key = `${tsFile}:${line}`;
|
|
98
|
+
const id = tempBreakpoints.get(key);
|
|
99
|
+
if (id) {
|
|
100
|
+
tempBreakpoints.delete(key);
|
|
101
|
+
}
|
|
102
|
+
return id;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Clear all temporary breakpoints
|
|
107
|
+
*/
|
|
108
|
+
export function clearTempBreakpoints(): Map<string, string> {
|
|
109
|
+
const all = new Map(tempBreakpoints);
|
|
110
|
+
tempBreakpoints.clear();
|
|
111
|
+
return all;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Get all registered TS imports
|
|
116
|
+
*/
|
|
117
|
+
export function getAllTsImports(): TsImportInfo[] {
|
|
118
|
+
return Array.from(tsImports.values());
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Get TS imports for a specific Vibe file
|
|
123
|
+
*/
|
|
124
|
+
export function getTsImportsForFile(vibeFile: string): TsImportInfo[] {
|
|
125
|
+
return Array.from(tsImports.values()).filter(info => info.importedBy === vibeFile);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Clear all TS import registrations (for testing)
|
|
130
|
+
*/
|
|
131
|
+
export function clearTsImports(): void {
|
|
132
|
+
tsImports.clear();
|
|
133
|
+
tempBreakpoints.clear();
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Build a unique identifier for a TS function entry point
|
|
138
|
+
* Used to match breakpoint hits
|
|
139
|
+
*/
|
|
140
|
+
export function buildTsEntryPointId(tsFile: string, functionName: string): string {
|
|
141
|
+
return `ts:${tsFile}:${functionName}`;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Parse a TS entry point ID
|
|
146
|
+
*/
|
|
147
|
+
export function parseTsEntryPointId(id: string): { tsFile: string; functionName: string } | null {
|
|
148
|
+
const match = id.match(/^ts:(.+):([^:]+)$/);
|
|
149
|
+
if (!match) return null;
|
|
150
|
+
return { tsFile: match[1], functionName: match[2] };
|
|
151
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TS Block Source Mapping
|
|
3
|
+
* Maps TypeScript block code to locations within .vibe files
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { SourceLocation } from '../errors';
|
|
7
|
+
|
|
8
|
+
// Mapping from generated TS code to original .vibe location
|
|
9
|
+
export interface TsBlockMapping {
|
|
10
|
+
// The .vibe file containing the ts block
|
|
11
|
+
vibeFile: string;
|
|
12
|
+
// Line in .vibe file where ts block starts
|
|
13
|
+
vibeStartLine: number;
|
|
14
|
+
// Column in .vibe file where ts block starts
|
|
15
|
+
vibeStartColumn: number;
|
|
16
|
+
// The ts block body (for matching)
|
|
17
|
+
tsBody: string;
|
|
18
|
+
// Parameters passed to the ts block
|
|
19
|
+
params: string[];
|
|
20
|
+
// Generated script ID (assigned by Bun inspector)
|
|
21
|
+
scriptId?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Registry of all TS block mappings
|
|
25
|
+
const tsBlockMappings = new Map<string, TsBlockMapping>();
|
|
26
|
+
|
|
27
|
+
// Counter for generating unique IDs
|
|
28
|
+
let mappingIdCounter = 0;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Register a TS block for debugging
|
|
32
|
+
* Returns a unique ID for this TS block
|
|
33
|
+
*/
|
|
34
|
+
export function registerTsBlock(
|
|
35
|
+
vibeFile: string,
|
|
36
|
+
vibeLocation: SourceLocation,
|
|
37
|
+
tsBody: string,
|
|
38
|
+
params: string[]
|
|
39
|
+
): string {
|
|
40
|
+
const id = `ts_block_${++mappingIdCounter}`;
|
|
41
|
+
|
|
42
|
+
tsBlockMappings.set(id, {
|
|
43
|
+
vibeFile,
|
|
44
|
+
vibeStartLine: vibeLocation.line,
|
|
45
|
+
vibeStartColumn: vibeLocation.column,
|
|
46
|
+
tsBody,
|
|
47
|
+
params,
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
return id;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Get mapping for a TS block by ID
|
|
55
|
+
*/
|
|
56
|
+
export function getTsBlockMapping(id: string): TsBlockMapping | undefined {
|
|
57
|
+
return tsBlockMappings.get(id);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Find TS block mapping by script ID (assigned by Bun inspector)
|
|
62
|
+
*/
|
|
63
|
+
export function findMappingByScriptId(scriptId: string): TsBlockMapping | undefined {
|
|
64
|
+
for (const mapping of tsBlockMappings.values()) {
|
|
65
|
+
if (mapping.scriptId === scriptId) {
|
|
66
|
+
return mapping;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Associate a script ID with a TS block mapping
|
|
74
|
+
*/
|
|
75
|
+
export function setScriptId(mappingId: string, scriptId: string): void {
|
|
76
|
+
const mapping = tsBlockMappings.get(mappingId);
|
|
77
|
+
if (mapping) {
|
|
78
|
+
mapping.scriptId = scriptId;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Convert a location within generated TS code to the original .vibe location
|
|
84
|
+
*/
|
|
85
|
+
export function mapTsLocationToVibe(
|
|
86
|
+
mapping: TsBlockMapping,
|
|
87
|
+
tsLine: number,
|
|
88
|
+
tsColumn: number
|
|
89
|
+
): SourceLocation {
|
|
90
|
+
// The first line of the TS block body corresponds to vibeStartLine
|
|
91
|
+
// We add the line offset (tsLine - 1 since TS lines are 0-based in inspector)
|
|
92
|
+
// Note: We subtract 1 for the 'use strict' line we prepend
|
|
93
|
+
const lineOffset = Math.max(0, tsLine - 1);
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
file: mapping.vibeFile,
|
|
97
|
+
line: mapping.vibeStartLine + lineOffset,
|
|
98
|
+
column: lineOffset === 0 ? mapping.vibeStartColumn + tsColumn : tsColumn,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Convert a .vibe location to a location within a TS block
|
|
104
|
+
*/
|
|
105
|
+
export function mapVibeLocationToTs(
|
|
106
|
+
mapping: TsBlockMapping,
|
|
107
|
+
vibeLine: number,
|
|
108
|
+
vibeColumn: number
|
|
109
|
+
): { line: number; column: number } | null {
|
|
110
|
+
// Check if this location is within the TS block
|
|
111
|
+
const tsBlockLines = mapping.tsBody.split('\n').length;
|
|
112
|
+
const lineOffset = vibeLine - mapping.vibeStartLine;
|
|
113
|
+
|
|
114
|
+
if (lineOffset < 0 || lineOffset >= tsBlockLines) {
|
|
115
|
+
return null; // Location is outside this TS block
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Add 1 for the 'use strict' line we prepend
|
|
119
|
+
return {
|
|
120
|
+
line: lineOffset + 1,
|
|
121
|
+
column: lineOffset === 0 ? Math.max(0, vibeColumn - mapping.vibeStartColumn) : vibeColumn,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Check if a .vibe location is within a TS block
|
|
127
|
+
*/
|
|
128
|
+
export function isLocationInTsBlock(
|
|
129
|
+
vibeFile: string,
|
|
130
|
+
vibeLine: number
|
|
131
|
+
): TsBlockMapping | null {
|
|
132
|
+
for (const mapping of tsBlockMappings.values()) {
|
|
133
|
+
if (mapping.vibeFile !== vibeFile) continue;
|
|
134
|
+
|
|
135
|
+
const tsBlockLines = mapping.tsBody.split('\n').length;
|
|
136
|
+
const endLine = mapping.vibeStartLine + tsBlockLines - 1;
|
|
137
|
+
|
|
138
|
+
if (vibeLine >= mapping.vibeStartLine && vibeLine <= endLine) {
|
|
139
|
+
return mapping;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Get all TS block mappings for a file
|
|
147
|
+
*/
|
|
148
|
+
export function getMappingsForFile(vibeFile: string): TsBlockMapping[] {
|
|
149
|
+
const mappings: TsBlockMapping[] = [];
|
|
150
|
+
for (const mapping of tsBlockMappings.values()) {
|
|
151
|
+
if (mapping.vibeFile === vibeFile) {
|
|
152
|
+
mappings.push(mapping);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return mappings;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Clear all mappings (useful for testing)
|
|
160
|
+
*/
|
|
161
|
+
export function clearTsBlockMappings(): void {
|
|
162
|
+
tsBlockMappings.clear();
|
|
163
|
+
mappingIdCounter = 0;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Get all registered mappings (for debugging)
|
|
168
|
+
*/
|
|
169
|
+
export function getAllMappings(): Map<string, TsBlockMapping> {
|
|
170
|
+
return new Map(tsBlockMappings);
|
|
171
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// Source location for error reporting
|
|
2
|
+
export interface SourceLocation {
|
|
3
|
+
line: number;
|
|
4
|
+
column: number;
|
|
5
|
+
file?: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface SourceSpan {
|
|
9
|
+
start: SourceLocation;
|
|
10
|
+
end: SourceLocation;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Base error class for all Vibe errors
|
|
14
|
+
export class VibeError extends Error {
|
|
15
|
+
constructor(
|
|
16
|
+
message: string,
|
|
17
|
+
public location?: SourceLocation,
|
|
18
|
+
public source?: string
|
|
19
|
+
) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.name = 'VibeError';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
format(): string {
|
|
25
|
+
if (!this.location) {
|
|
26
|
+
return this.message;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const loc = `[${this.location.file ?? 'vibe'}:${this.location.line}:${this.location.column}]`;
|
|
30
|
+
let result = `${loc} ${this.message}`;
|
|
31
|
+
|
|
32
|
+
// Add source context if available
|
|
33
|
+
if (this.source) {
|
|
34
|
+
const lines = this.source.split('\n');
|
|
35
|
+
const line = lines[this.location.line - 1];
|
|
36
|
+
if (line) {
|
|
37
|
+
result += `\n\n ${this.location.line} | ${line}`;
|
|
38
|
+
result += `\n ${' '.repeat(String(this.location.line).length)} | ${' '.repeat(this.location.column - 1)}^`;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Lexer errors
|
|
47
|
+
export class LexerError extends VibeError {
|
|
48
|
+
constructor(message: string, location?: SourceLocation, source?: string) {
|
|
49
|
+
super(message, location, source);
|
|
50
|
+
this.name = 'LexerError';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Parser errors
|
|
55
|
+
export class ParserError extends VibeError {
|
|
56
|
+
constructor(
|
|
57
|
+
message: string,
|
|
58
|
+
public tokenValue?: string,
|
|
59
|
+
location?: SourceLocation,
|
|
60
|
+
source?: string
|
|
61
|
+
) {
|
|
62
|
+
super(message, location, source);
|
|
63
|
+
this.name = 'ParserError';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Runtime errors
|
|
68
|
+
export class RuntimeError extends VibeError {
|
|
69
|
+
constructor(
|
|
70
|
+
message: string,
|
|
71
|
+
location?: SourceLocation,
|
|
72
|
+
source?: string,
|
|
73
|
+
public context?: Record<string, unknown>
|
|
74
|
+
) {
|
|
75
|
+
super(message, location, source);
|
|
76
|
+
this.name = 'RuntimeError';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Type errors
|
|
81
|
+
export class TypeError extends VibeError {
|
|
82
|
+
constructor(
|
|
83
|
+
message: string,
|
|
84
|
+
public expected?: string,
|
|
85
|
+
public received?: string,
|
|
86
|
+
location?: SourceLocation,
|
|
87
|
+
source?: string
|
|
88
|
+
) {
|
|
89
|
+
super(message, location, source);
|
|
90
|
+
this.name = 'TypeError';
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Reference errors (undefined variables)
|
|
95
|
+
export class ReferenceError extends VibeError {
|
|
96
|
+
constructor(
|
|
97
|
+
public variableName: string,
|
|
98
|
+
location?: SourceLocation,
|
|
99
|
+
source?: string
|
|
100
|
+
) {
|
|
101
|
+
super(`Undefined variable '${variableName}'`, location, source);
|
|
102
|
+
this.name = 'ReferenceError';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Assignment errors (const reassignment)
|
|
107
|
+
export class AssignmentError extends VibeError {
|
|
108
|
+
constructor(
|
|
109
|
+
public variableName: string,
|
|
110
|
+
location?: SourceLocation,
|
|
111
|
+
source?: string
|
|
112
|
+
) {
|
|
113
|
+
super(`Cannot reassign constant '${variableName}'`, location, source);
|
|
114
|
+
this.name = 'AssignmentError';
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Semantic errors (type checking, scope validation)
|
|
119
|
+
export class SemanticError extends VibeError {
|
|
120
|
+
constructor(message: string, location?: SourceLocation, source?: string) {
|
|
121
|
+
super(message, location, source);
|
|
122
|
+
this.name = 'SemanticError';
|
|
123
|
+
}
|
|
124
|
+
}
|