@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,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
+ }