@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,170 @@
1
+ /**
2
+ * TypeScript Type Mapping Utilities
3
+ *
4
+ * Shared utilities for converting between Vibe types and TypeScript types.
5
+ * Used by both the ts-block-checker and semantic analyzer.
6
+ */
7
+
8
+ /**
9
+ * Map Vibe type to TypeScript type string.
10
+ */
11
+ export function vibeTypeToTs(vibeType: string | null): string {
12
+ if (!vibeType) return 'any';
13
+
14
+ // Handle array types first
15
+ if (vibeType.endsWith('[]')) {
16
+ const base = vibeType.slice(0, -2);
17
+ return vibeTypeToTs(base) + '[]';
18
+ }
19
+
20
+ const map: Record<string, string> = {
21
+ 'text': 'string',
22
+ 'prompt': 'string',
23
+ 'number': 'number',
24
+ 'boolean': 'boolean',
25
+ 'json': 'Record<string, unknown>',
26
+ 'null': 'null | undefined',
27
+ };
28
+
29
+ return map[vibeType] ?? 'any';
30
+ }
31
+
32
+ /**
33
+ * Map TypeScript type string back to Vibe type.
34
+ */
35
+ export function tsTypeToVibe(tsType: string): string | null {
36
+ // Handle array types
37
+ if (tsType.endsWith('[]')) {
38
+ const base = tsType.slice(0, -2);
39
+ const vibeBase = tsTypeToVibe(base);
40
+ return vibeBase ? `${vibeBase}[]` : null;
41
+ }
42
+
43
+ // Handle Array<T> syntax
44
+ if (tsType.startsWith('Array<') && tsType.endsWith('>')) {
45
+ const base = tsType.slice(6, -1);
46
+ const vibeBase = tsTypeToVibe(base);
47
+ return vibeBase ? `${vibeBase}[]` : null;
48
+ }
49
+
50
+ // Direct mappings
51
+ const map: Record<string, string> = {
52
+ 'string': 'text',
53
+ 'number': 'number',
54
+ 'boolean': 'boolean',
55
+ 'void': 'null',
56
+ 'undefined': 'null',
57
+ 'null': 'null',
58
+ 'any': 'json',
59
+ 'unknown': 'json',
60
+ 'object': 'json',
61
+ };
62
+
63
+ if (map[tsType]) {
64
+ return map[tsType];
65
+ }
66
+
67
+ // Handle Record types and other object-like types as json
68
+ if (tsType.startsWith('Record<') || tsType.startsWith('{')) {
69
+ return 'json';
70
+ }
71
+
72
+ // Handle union types - try to find a common type
73
+ if (tsType.includes(' | ')) {
74
+ const types = tsType.split(' | ').map(t => t.trim());
75
+ // Filter out null/undefined
76
+ const nonNullTypes = types.filter(t => t !== 'null' && t !== 'undefined');
77
+ if (nonNullTypes.length === 1) {
78
+ return tsTypeToVibe(nonNullTypes[0]);
79
+ }
80
+ // Mixed types become json
81
+ return 'json';
82
+ }
83
+
84
+ // Unknown types become json (safest)
85
+ return 'json';
86
+ }
87
+
88
+ /**
89
+ * Check if a Vibe type is compatible with a TypeScript type.
90
+ */
91
+ export function isVibeTypeCompatibleWithTs(vibeType: string, tsType: string): boolean {
92
+ // Map Vibe types to their TS equivalents
93
+ const vibeToTs: Record<string, string> = {
94
+ 'text': 'string',
95
+ 'prompt': 'string',
96
+ 'number': 'number',
97
+ 'boolean': 'boolean',
98
+ 'null': 'null',
99
+ };
100
+
101
+ // Handle array types
102
+ if (vibeType.endsWith('[]')) {
103
+ const vibeBase = vibeType.slice(0, -2);
104
+ // TS array types can be T[] or Array<T>
105
+ if (tsType.endsWith('[]')) {
106
+ const tsBase = tsType.slice(0, -2);
107
+ return isVibeTypeCompatibleWithTs(vibeBase, tsBase);
108
+ }
109
+ if (tsType.startsWith('Array<') && tsType.endsWith('>')) {
110
+ const tsBase = tsType.slice(6, -1);
111
+ return isVibeTypeCompatibleWithTs(vibeBase, tsBase);
112
+ }
113
+ // Check against any[]
114
+ if (tsType === 'any[]' || tsType === 'Array<any>') return true;
115
+ return false;
116
+ }
117
+
118
+ // json is compatible with object-like types
119
+ if (vibeType === 'json') {
120
+ return isTsTypeObjectLike(tsType);
121
+ }
122
+
123
+ // Get the mapped TS type for the Vibe type
124
+ const mappedTsType = vibeToTs[vibeType];
125
+ if (!mappedTsType) {
126
+ // Unknown Vibe type - skip checking
127
+ return true;
128
+ }
129
+
130
+ // Direct match
131
+ if (mappedTsType === tsType) return true;
132
+
133
+ // 'any' accepts everything
134
+ if (tsType === 'any') return true;
135
+
136
+ // 'unknown' accepts everything at assignment
137
+ if (tsType === 'unknown') return true;
138
+
139
+ // Handle union types (e.g., "string | null")
140
+ if (tsType.includes(' | ')) {
141
+ const unionTypes = tsType.split(' | ').map(t => t.trim());
142
+ return unionTypes.some(ut => isVibeTypeCompatibleWithTs(vibeType, ut));
143
+ }
144
+
145
+ return false;
146
+ }
147
+
148
+ /**
149
+ * Check if a TypeScript type is object-like (accepts json).
150
+ */
151
+ export function isTsTypeObjectLike(tsType: string): boolean {
152
+ // Direct object-like types
153
+ if (tsType === 'object') return true;
154
+ if (tsType === 'any') return true;
155
+ if (tsType === 'unknown') return true;
156
+
157
+ // Record types
158
+ if (tsType.startsWith('Record<')) return true;
159
+
160
+ // Index signature types like { [key: string]: any }
161
+ if (tsType.startsWith('{') && tsType.includes('[')) return true;
162
+
163
+ // Generic object types (interfaces, type aliases)
164
+ // If it starts with uppercase and isn't a known primitive, assume it's object-like
165
+ if (/^[A-Z]/.test(tsType) && !['String', 'Number', 'Boolean'].includes(tsType)) {
166
+ return true;
167
+ }
168
+
169
+ return false;
170
+ }
@@ -0,0 +1,58 @@
1
+ // Type validation and compatibility utilities
2
+
3
+ /**
4
+ * Valid base types in the Vibe language.
5
+ */
6
+ export const VALID_BASE_TYPES = ['text', 'json', 'prompt', 'boolean', 'number', 'model'] as const;
7
+
8
+ /**
9
+ * Get the base type from a type annotation (strips array brackets).
10
+ * e.g., "text[][]" -> "text", "number" -> "number"
11
+ */
12
+ export function getBaseType(type: string): string {
13
+ return type.replace(/\[\]/g, '');
14
+ }
15
+
16
+ /**
17
+ * Check if a type annotation string is a valid Vibe type.
18
+ */
19
+ export function isValidType(type: string): boolean {
20
+ const baseType = getBaseType(type);
21
+ return VALID_BASE_TYPES.includes(baseType as typeof VALID_BASE_TYPES[number]);
22
+ }
23
+
24
+ /**
25
+ * Check if sourceType can be assigned to targetType.
26
+ */
27
+ export function typesCompatible(sourceType: string, targetType: string): boolean {
28
+ // Exact match
29
+ if (sourceType === targetType) return true;
30
+
31
+ // null is compatible with most types, but NOT boolean (booleans must be true or false)
32
+ if (sourceType === 'null' && targetType !== 'boolean') return true;
33
+
34
+ // text and prompt are compatible
35
+ if ((sourceType === 'text' || sourceType === 'prompt') &&
36
+ (targetType === 'text' || targetType === 'prompt')) {
37
+ return true;
38
+ }
39
+
40
+ // json accepts text (will be parsed at runtime)
41
+ if (targetType === 'json' && sourceType === 'text') {
42
+ return true;
43
+ }
44
+
45
+ return false;
46
+ }
47
+
48
+ /**
49
+ * Validate that a string is valid JSON.
50
+ */
51
+ export function isValidJson(value: string): boolean {
52
+ try {
53
+ JSON.parse(value);
54
+ return true;
55
+ } catch {
56
+ return false;
57
+ }
58
+ }
@@ -0,0 +1,14 @@
1
+ // Program with conditional logic
2
+
3
+ model m = { name: "gpt-4", apiKey: "test", url: "http://test" }
4
+ let isPremium: boolean = true
5
+ let response = ""
6
+
7
+ if isPremium {
8
+ let greeting = vibe "Generate a premium greeting" m default
9
+ response = greeting
10
+ } else {
11
+ response = "Standard greeting"
12
+ }
13
+
14
+ response
@@ -0,0 +1,16 @@
1
+ // Program with functions and AI calls
2
+
3
+ model m = { name: "gpt-4", apiKey: "test", url: "http://test" }
4
+
5
+ function generateStory(topic: text) {
6
+ let aiPrompt = "Write a short story about {topic}"
7
+ return vibe aiPrompt m default
8
+ }
9
+
10
+ function summarize(content: text) {
11
+ return vibe "Summarize this: {content}" m default
12
+ }
13
+
14
+ let story = generateStory("a brave knight")
15
+ let summary = summarize(story)
16
+ summary
@@ -0,0 +1,6 @@
1
+ import { funcB } from "./b.vibe"
2
+
3
+ export function funcA(x: text): text {
4
+ let y = funcB(x)
5
+ return y
6
+ }
@@ -0,0 +1,5 @@
1
+ import { funcA } from "./a.vibe"
2
+
3
+ export function funcB(x: text): text {
4
+ return x
5
+ }
@@ -0,0 +1,3 @@
1
+ import { funcA } from "./a.vibe"
2
+
3
+ let result = funcA("test")
@@ -0,0 +1,8 @@
1
+ // main-b.vibe - tests moduleB's isolation
2
+
3
+ const x = "MAIN"
4
+
5
+ import { getX } from "./moduleB.vibe"
6
+
7
+ // getX() should return "B" (from moduleB), not "MAIN"
8
+ let result = getX()
@@ -0,0 +1,9 @@
1
+ // main.vibe - tests that imported function sees its own module's global
2
+ // NOT the caller's global
3
+
4
+ const x = "MAIN"
5
+
6
+ import { getX } from "./moduleA.vibe"
7
+
8
+ // getX() should return "A" (from moduleA), not "MAIN"
9
+ let result = getX()
@@ -0,0 +1,6 @@
1
+ // moduleA.vibe - has its own global x = "A"
2
+ const x = "A"
3
+
4
+ export function getX() {
5
+ return x
6
+ }
@@ -0,0 +1,6 @@
1
+ // moduleB.vibe - has its own global x = "B"
2
+ const x = "B"
3
+
4
+ export function getX() {
5
+ return x
6
+ }
@@ -0,0 +1,6 @@
1
+ import { formatName } from "./utils.ts"
2
+
3
+ export function formatGreeting(firstName: text, lastName: text): text {
4
+ let fullName = formatName(firstName, lastName)
5
+ return fullName
6
+ }
@@ -0,0 +1,3 @@
1
+ import { formatGreeting } from "./helper.vibe"
2
+
3
+ let greeting = formatGreeting("John", "Doe")
@@ -0,0 +1,3 @@
1
+ export function formatName(firstName: string, lastName: string): string {
2
+ return `${firstName} ${lastName}`;
3
+ }
@@ -0,0 +1,15 @@
1
+ // file2.vibe - imports from file3
2
+ import { getC } from "./file3.vibe"
3
+
4
+ const x = "B"
5
+
6
+ export function getB() {
7
+ return x
8
+ }
9
+
10
+ // This function calls into file3 - should still see file3's x
11
+ export function getBAndC() {
12
+ let b = x
13
+ let c = getC()
14
+ return b + c
15
+ }
@@ -0,0 +1,10 @@
1
+ // file3.vibe - base module
2
+ const x = "C"
3
+
4
+ export function getC() {
5
+ return x
6
+ }
7
+
8
+ export function getCTwice() {
9
+ return x + x
10
+ }
@@ -0,0 +1,21 @@
1
+ // main.vibe - imports from file2 and file3
2
+ // Tests nested import scope isolation
3
+
4
+ import { getB, getBAndC } from "./file2.vibe"
5
+ import { getC, getCTwice } from "./file3.vibe"
6
+
7
+ const x = "A"
8
+
9
+ // Each function should see its own module's x:
10
+ // - getB() should return "B" (from file2)
11
+ // - getC() should return "C" (from file3)
12
+ // - getCTwice() should return "CC" (from file3)
13
+ // - getBAndC() should return "BC" (B from file2, C via file3's getC)
14
+
15
+ let resultB = getB()
16
+ let resultC = getC()
17
+ let resultCC = getCTwice()
18
+ let resultBC = getBAndC()
19
+
20
+ // Final result combines all to verify isolation
21
+ let result = resultB + resultC + resultCC + resultBC
@@ -0,0 +1,5 @@
1
+ import { funcB } from "./b.vibe"
2
+
3
+ export function funcA(x: text): text {
4
+ return x
5
+ }
@@ -0,0 +1,5 @@
1
+ import { funcA } from "./a.vibe"
2
+
3
+ export function funcB(x: text): text {
4
+ return x
5
+ }
@@ -0,0 +1,3 @@
1
+ import { funcB } from "./b.vibe"
2
+
3
+ let result = funcB("test")
@@ -0,0 +1,14 @@
1
+ export function alwaysTrue(): boolean {
2
+ return true;
3
+ }
4
+
5
+ export function alwaysFalse(): boolean {
6
+ return false;
7
+ }
8
+
9
+ export function isNotEmpty(str: string): boolean {
10
+ return str.length > 0;
11
+ }
12
+
13
+ export const FEATURE_ENABLED = true;
14
+ export const DEBUG_MODE = false;
@@ -0,0 +1,10 @@
1
+ import { FEATURE_ENABLED } from "./checks.ts"
2
+
3
+ // Use imported TS boolean constant in if condition
4
+ let enabled: boolean = FEATURE_ENABLED
5
+ let result = "disabled"
6
+ if enabled {
7
+ result = "enabled"
8
+ }
9
+
10
+ result
@@ -0,0 +1,5 @@
1
+ import { add } from "../ts-import/math.ts"
2
+
3
+ // This should fail - add returns number, not boolean
4
+ let result: boolean = add(1, 2)
5
+ result
@@ -0,0 +1,18 @@
1
+ import { alwaysTrue, isNotEmpty } from "./checks.ts"
2
+
3
+ // Test TS function returning boolean (no args)
4
+ let check1: boolean = alwaysTrue()
5
+ let result1 = "failed"
6
+ if check1 {
7
+ result1 = "passed"
8
+ }
9
+
10
+ // Test TS function returning boolean (string arg)
11
+ let testStr = "hello"
12
+ let check2: boolean = isNotEmpty(testStr)
13
+ let result2 = "empty"
14
+ if check2 {
15
+ result2 = "not empty"
16
+ }
17
+
18
+ result2
@@ -0,0 +1,42 @@
1
+ // TypeScript helpers that throw errors for testing error handling
2
+
3
+ /**
4
+ * A function that always throws an error.
5
+ * Used to test that stack traces include the correct file and line.
6
+ */
7
+ export function alwaysThrows(): never {
8
+ throw new Error('This function always throws');
9
+ }
10
+
11
+ /**
12
+ * A function that throws when given invalid input.
13
+ */
14
+ export function validatePositive(n: number): number {
15
+ if (n < 0) {
16
+ throw new RangeError(`Expected positive number, got ${n}`);
17
+ }
18
+ return n;
19
+ }
20
+
21
+ /**
22
+ * A function that accesses a property on null (TypeError).
23
+ */
24
+ export function accessNullProperty(): string {
25
+ const obj: { name: string } | null = null;
26
+ return obj!.name; // This will throw TypeError
27
+ }
28
+
29
+ /**
30
+ * A nested function call that throws - to test stack trace depth.
31
+ */
32
+ export function outerFunction(): void {
33
+ innerFunction();
34
+ }
35
+
36
+ function innerFunction(): void {
37
+ deepFunction();
38
+ }
39
+
40
+ function deepFunction(): never {
41
+ throw new Error('Error from deep in the call stack');
42
+ }
@@ -0,0 +1,5 @@
1
+ // Test error handling from imported TS functions
2
+ import { alwaysThrows, validatePositive, accessNullProperty, outerFunction } from "./helpers.ts"
3
+
4
+ // This will throw an error
5
+ let result = alwaysThrows()
@@ -0,0 +1,4 @@
1
+ import { add, multiply } from "./math.ts"
2
+
3
+ let sum = add("5", "3")
4
+ let product = multiply("4", "7")
@@ -0,0 +1,9 @@
1
+ export function add(a: number, b: number): number {
2
+ return a + b;
3
+ }
4
+
5
+ export function multiply(a: number, b: number): number {
6
+ return a * b;
7
+ }
8
+
9
+ export const PI = 3.14159;
@@ -0,0 +1,5 @@
1
+ // Import a TS variable (not a function)
2
+ import { MESSAGE } from "./data.ts"
3
+
4
+ // Try to call it as a function - should fail
5
+ let result = MESSAGE("arg")
@@ -0,0 +1,10 @@
1
+ // Test various TS exports - functions and non-functions
2
+
3
+ export const PI = 3.14159;
4
+ export const CONFIG = { name: "test", version: "1.0" };
5
+ export const ITEMS = ["a", "b", "c"];
6
+ export const MESSAGE = "Hello from TypeScript";
7
+
8
+ export function greet(name: string): string {
9
+ return `Hello, ${name}!`;
10
+ }
@@ -0,0 +1,5 @@
1
+ // Import a TS object variable
2
+ import { CONFIG } from "./data.ts"
3
+
4
+ // Assign to a json-typed variable - should work
5
+ let config: json = CONFIG
@@ -0,0 +1,5 @@
1
+ // Import a TS object variable but try to assign to text type
2
+ import { CONFIG } from "./data.ts"
3
+
4
+ // This should fail - CONFIG is an object, not a string
5
+ let config: text = CONFIG
@@ -0,0 +1,5 @@
1
+ // Import a TS variable (not a function)
2
+ import { MESSAGE } from "./data.ts"
3
+
4
+ // Assign to a text-typed variable - should work
5
+ let greeting: text = MESSAGE
@@ -0,0 +1,5 @@
1
+ model gpt = { name: "gpt-4" }
2
+
3
+ export function greet(name: text): text {
4
+ return vibe "Say hello to {name}" gpt default
5
+ }
@@ -0,0 +1,3 @@
1
+ import { greet } from "./greet.vibe"
2
+
3
+ let greeting = greet("Alice")
@@ -0,0 +1,10 @@
1
+ // Program with multiple sequential AI calls
2
+
3
+ model m = { name: "gpt-4", apiKey: "test", url: "http://test" }
4
+ const topic = "machine learning"
5
+
6
+ let overview = vibe "Give a one-sentence overview of {topic}" m default
7
+ let details = vibe "Expand on this: {overview}" m default
8
+ let summary = vibe "Summarize in 5 words: {details}" m default
9
+
10
+ summary
@@ -0,0 +1,6 @@
1
+ // Simple greeting program with AI call
2
+
3
+ model m = { name: "gpt-4", apiKey: "test", url: "http://test" }
4
+ let name = "Alice"
5
+ let greeting = vibe "Generate a friendly greeting for {name}" m default
6
+ greeting
@@ -0,0 +1,11 @@
1
+ // Program with template literals and string interpolation
2
+
3
+ model m = { name: "gpt-4", apiKey: "test", url: "http://test" }
4
+ const firstName = "John"
5
+ const lastName = "Doe"
6
+
7
+ // Template literals now use {var} syntax (unified with regular strings)
8
+ let fullName = `{firstName} {lastName}`
9
+ let message = vibe "Generate a welcome message for {fullName}" m default
10
+
11
+ message