@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
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@vibe-lang/runtime",
3
+ "version": "0.2.5",
4
+ "description": "Vibe language runtime and CLI",
5
+ "main": "src/index.ts",
6
+ "type": "module",
7
+ "exports": {
8
+ ".": "./src/index.ts",
9
+ "./ast": "./src/ast.ts",
10
+ "./parser": "./src/parser.ts",
11
+ "./parser/parse": "./src/parser/parse.ts",
12
+ "./semantic": "./src/semantic/index.ts",
13
+ "./errors": "./src/errors/index.ts",
14
+ "./runtime": "./src/runtime.ts"
15
+ },
16
+ "bin": {
17
+ "vibe": "src/index.ts"
18
+ },
19
+ "scripts": {
20
+ "start": "bun run src/index.ts",
21
+ "dev": "bun --watch src/index.ts",
22
+ "test": "bun test src/",
23
+ "test:watch": "bun test --watch src/",
24
+ "test:integration": "bun test tests/integration/ --timeout 120000",
25
+ "test:all": "bun test src/ tests/integration/ --timeout 120000"
26
+ },
27
+ "keywords": [
28
+ "ai",
29
+ "agent",
30
+ "orchestration",
31
+ "dsl",
32
+ "language"
33
+ ],
34
+ "license": "ISC",
35
+ "dependencies": {
36
+ "@anthropic-ai/sdk": "^0.71.2",
37
+ "@google/genai": "^1.34.0",
38
+ "@vibe-lang/debug-core": "workspace:*",
39
+ "chevrotain": "^11.0.3",
40
+ "openai": "^6.15.0",
41
+ "typescript": "^5.9.3"
42
+ },
43
+ "devDependencies": {
44
+ "@types/bun": "latest"
45
+ }
46
+ }
@@ -0,0 +1,375 @@
1
+ import type { SourceLocation } from '../errors';
2
+
3
+ // ============================================================================
4
+ // Base types
5
+ // ============================================================================
6
+
7
+ interface BaseNode {
8
+ location: SourceLocation;
9
+ }
10
+
11
+ // ============================================================================
12
+ // AI Provider Types
13
+ // ============================================================================
14
+
15
+ /** Supported AI provider types - strictly typed */
16
+ export type AIProviderType = 'anthropic' | 'openai' | 'google';
17
+
18
+ // ============================================================================
19
+ // Vibe Type Annotations
20
+ // ============================================================================
21
+
22
+ /** Non-nullable type annotations - when type is always required */
23
+ export type VibeTypeRequired = 'text' | 'json' | 'boolean' | 'number' | 'prompt' | 'model' | 'text[]' | 'json[]' | 'boolean[]' | 'number[]' | 'prompt[]';
24
+
25
+ /** Valid type annotations in Vibe - nullable when type is optional/inferred */
26
+ export type VibeType = VibeTypeRequired | null;
27
+
28
+ // ============================================================================
29
+ // Context Modes
30
+ // ============================================================================
31
+
32
+ /** Compress argument - either a string literal or identifier reference */
33
+ export type CompressArg =
34
+ | { kind: 'literal'; value: string }
35
+ | { kind: 'identifier'; name: string };
36
+
37
+ /** Context mode for loops - controls what happens to context on loop exit */
38
+ export type ContextMode =
39
+ | 'verbose' // Keep full history
40
+ | 'forget' // Discard all context from block
41
+ | { compress: { arg1: CompressArg | null; arg2: CompressArg | null } }; // AI summarizes
42
+
43
+ // ============================================================================
44
+ // Program
45
+ // ============================================================================
46
+
47
+ export interface Program extends BaseNode {
48
+ type: 'Program';
49
+ body: Statement[];
50
+ }
51
+
52
+ // ============================================================================
53
+ // Statements
54
+ // ============================================================================
55
+
56
+ export type Statement =
57
+ | ImportDeclaration
58
+ | ExportDeclaration
59
+ | LetDeclaration
60
+ | ConstDeclaration
61
+ | DestructuringDeclaration
62
+ | ModelDeclaration
63
+ | FunctionDeclaration
64
+ | ToolDeclaration
65
+ | ReturnStatement
66
+ | BreakStatement
67
+ | IfStatement
68
+ | ForInStatement
69
+ | WhileStatement
70
+ | BlockStatement
71
+ | ExpressionStatement
72
+ | AsyncStatement;
73
+
74
+ export interface ImportSpecifier {
75
+ imported: string; // Name in the source module
76
+ local: string; // Name in this module (usually same as imported)
77
+ }
78
+
79
+ export interface ImportDeclaration extends BaseNode {
80
+ type: 'ImportDeclaration';
81
+ specifiers: ImportSpecifier[];
82
+ source: string; // "./utils.ts" or "./utils.vibe"
83
+ sourceType: 'ts' | 'vibe'; // Determined by file extension
84
+ }
85
+
86
+ export interface ExportDeclaration extends BaseNode {
87
+ type: 'ExportDeclaration';
88
+ declaration: FunctionDeclaration | LetDeclaration | ConstDeclaration | ModelDeclaration;
89
+ }
90
+
91
+ export interface LetDeclaration extends BaseNode {
92
+ type: 'LetDeclaration';
93
+ name: string;
94
+ typeAnnotation: VibeType;
95
+ initializer: Expression | null;
96
+ isPrivate?: boolean; // If true, variable is hidden from AI context
97
+ isAsync?: boolean; // If true, execute asynchronously in parallel
98
+ }
99
+
100
+ export interface ConstDeclaration extends BaseNode {
101
+ type: 'ConstDeclaration';
102
+ name: string;
103
+ typeAnnotation: VibeType;
104
+ initializer: Expression;
105
+ isPrivate?: boolean; // If true, variable is hidden from AI context
106
+ isAsync?: boolean; // If true, execute asynchronously in parallel
107
+ }
108
+
109
+ /** A single field in a destructuring pattern: name: type */
110
+ export interface DestructuringField {
111
+ name: string;
112
+ type: VibeTypeRequired;
113
+ isPrivate?: boolean; // If true, field is hidden from AI context
114
+ }
115
+
116
+ /** Destructuring declaration: const {a: text, b: number} = expr */
117
+ export interface DestructuringDeclaration extends BaseNode {
118
+ type: 'DestructuringDeclaration';
119
+ fields: DestructuringField[];
120
+ initializer: Expression;
121
+ isConst: boolean; // true for const, false for let
122
+ isAsync?: boolean; // If true, execute asynchronously in parallel
123
+ }
124
+
125
+ export interface ModelDeclaration extends BaseNode {
126
+ type: 'ModelDeclaration';
127
+ name: string;
128
+ config: ModelConfig;
129
+ }
130
+
131
+ export interface ModelConfig extends BaseNode {
132
+ type: 'ModelConfig';
133
+ modelName: Expression | null;
134
+ apiKey: Expression | null;
135
+ url: Expression | null;
136
+ provider: Expression | null; // AIProviderType - validated in semantic analyzer
137
+ maxRetriesOnError: Expression | null; // Non-negative integer
138
+ thinkingLevel: Expression | null; // "none" | "low" | "medium" | "high" | "max"
139
+ tools: Expression | null; // Array of VibeToolValue objects
140
+ providedFields: string[]; // For semantic validation
141
+ }
142
+
143
+ export interface FunctionParameter {
144
+ name: string;
145
+ typeAnnotation: VibeTypeRequired;
146
+ }
147
+
148
+ export interface FunctionDeclaration extends BaseNode {
149
+ type: 'FunctionDeclaration';
150
+ name: string;
151
+ params: FunctionParameter[];
152
+ returnType: VibeType;
153
+ body: BlockStatement;
154
+ // Note: Functions always "forget" context on exit (like traditional callstack)
155
+ }
156
+
157
+ // Tool parameter with optional description for AI schema
158
+ export interface ToolParameter {
159
+ name: string;
160
+ typeAnnotation: string; // Vibe type or imported TS type name
161
+ description?: string; // From @param decorator, for AI schema
162
+ }
163
+
164
+ // Tool declaration - function-like but with AI-callable schema
165
+ export interface ToolDeclaration extends BaseNode {
166
+ type: 'ToolDeclaration';
167
+ name: string;
168
+ params: ToolParameter[];
169
+ returnType: VibeType;
170
+ description?: string; // From @description decorator, for AI schema
171
+ paramDecorators?: string[]; // Names from @param decorators (for validation)
172
+ body: BlockStatement;
173
+ }
174
+
175
+ export interface ReturnStatement extends BaseNode {
176
+ type: 'ReturnStatement';
177
+ value: Expression | null;
178
+ }
179
+
180
+ export interface BreakStatement extends BaseNode {
181
+ type: 'BreakStatement';
182
+ }
183
+
184
+ export interface IfStatement extends BaseNode {
185
+ type: 'IfStatement';
186
+ condition: Expression;
187
+ consequent: BlockStatement;
188
+ alternate: BlockStatement | IfStatement | null;
189
+ }
190
+
191
+ export interface ForInStatement extends BaseNode {
192
+ type: 'ForInStatement';
193
+ variable: string; // Loop variable name
194
+ iterable: Expression; // Array, number (range), or [start, end]
195
+ body: BlockStatement;
196
+ contextMode?: ContextMode; // What happens to context on loop exit
197
+ }
198
+
199
+ export interface WhileStatement extends BaseNode {
200
+ type: 'WhileStatement';
201
+ condition: Expression;
202
+ body: BlockStatement;
203
+ contextMode?: ContextMode; // What happens to context on loop exit
204
+ }
205
+
206
+ export interface BlockStatement extends BaseNode {
207
+ type: 'BlockStatement';
208
+ body: Statement[];
209
+ }
210
+
211
+ export interface ExpressionStatement extends BaseNode {
212
+ type: 'ExpressionStatement';
213
+ expression: Expression;
214
+ }
215
+
216
+ /** Standalone async statement (fire-and-forget): async do/vibe/ts/function() */
217
+ export interface AsyncStatement extends BaseNode {
218
+ type: 'AsyncStatement';
219
+ expression: VibeExpression | TsBlock | CallExpression;
220
+ }
221
+
222
+ // ============================================================================
223
+ // Expressions
224
+ // ============================================================================
225
+
226
+ export type Expression =
227
+ | Identifier
228
+ | StringLiteral
229
+ | TemplateLiteral
230
+ | BooleanLiteral
231
+ | NullLiteral
232
+ | NumberLiteral
233
+ | ObjectLiteral
234
+ | ArrayLiteral
235
+ | RangeExpression
236
+ | BinaryExpression
237
+ | UnaryExpression
238
+ | IndexExpression
239
+ | SliceExpression
240
+ | MemberExpression
241
+ | AssignmentExpression
242
+ | CallExpression
243
+ | VibeExpression
244
+ | TsBlock;
245
+
246
+ export interface Identifier extends BaseNode {
247
+ type: 'Identifier';
248
+ name: string;
249
+ }
250
+
251
+ export interface StringLiteral extends BaseNode {
252
+ type: 'StringLiteral';
253
+ value: string;
254
+ }
255
+
256
+ export interface TemplateLiteral extends BaseNode {
257
+ type: 'TemplateLiteral';
258
+ value: string;
259
+ }
260
+
261
+ export interface BooleanLiteral extends BaseNode {
262
+ type: 'BooleanLiteral';
263
+ value: boolean;
264
+ }
265
+
266
+ export interface NullLiteral extends BaseNode {
267
+ type: 'NullLiteral';
268
+ }
269
+
270
+ export interface NumberLiteral extends BaseNode {
271
+ type: 'NumberLiteral';
272
+ value: number;
273
+ }
274
+
275
+ export interface ObjectLiteral extends BaseNode {
276
+ type: 'ObjectLiteral';
277
+ properties: ObjectProperty[];
278
+ }
279
+
280
+ export interface ObjectProperty extends BaseNode {
281
+ type: 'ObjectProperty';
282
+ key: string;
283
+ value: Expression;
284
+ }
285
+
286
+ export interface ArrayLiteral extends BaseNode {
287
+ type: 'ArrayLiteral';
288
+ elements: Expression[];
289
+ }
290
+
291
+ export interface RangeExpression extends BaseNode {
292
+ type: 'RangeExpression';
293
+ start: Expression;
294
+ end: Expression;
295
+ }
296
+
297
+ export type BinaryOperator =
298
+ | '+' | '-' | '*' | '/' | '%' // Arithmetic
299
+ | '==' | '!=' | '<' | '>' | '<=' | '>=' // Comparison
300
+ | 'and' | 'or'; // Logical
301
+
302
+ export interface BinaryExpression extends BaseNode {
303
+ type: 'BinaryExpression';
304
+ operator: BinaryOperator;
305
+ left: Expression;
306
+ right: Expression;
307
+ }
308
+
309
+ export type UnaryOperator = 'not' | '-';
310
+
311
+ export interface UnaryExpression extends BaseNode {
312
+ type: 'UnaryExpression';
313
+ operator: UnaryOperator;
314
+ operand: Expression;
315
+ }
316
+
317
+ export interface IndexExpression extends BaseNode {
318
+ type: 'IndexExpression';
319
+ object: Expression;
320
+ index: Expression;
321
+ }
322
+
323
+ export interface SliceExpression extends BaseNode {
324
+ type: 'SliceExpression';
325
+ object: Expression;
326
+ start: Expression | null; // null for arr[,5]
327
+ end: Expression | null; // null for arr[3,]
328
+ }
329
+
330
+ export interface MemberExpression extends BaseNode {
331
+ type: 'MemberExpression';
332
+ object: Expression;
333
+ property: string; // method/property name
334
+ }
335
+
336
+ export interface AssignmentExpression extends BaseNode {
337
+ type: 'AssignmentExpression';
338
+ target: Identifier;
339
+ value: Expression;
340
+ }
341
+
342
+ export interface CallExpression extends BaseNode {
343
+ type: 'CallExpression';
344
+ callee: Expression;
345
+ arguments: Expression[];
346
+ }
347
+
348
+ export interface ContextSpecifier extends BaseNode {
349
+ type: 'ContextSpecifier';
350
+ kind: 'default' | 'local' | 'variable';
351
+ variable?: string;
352
+ }
353
+
354
+ /** AI operation type - controls tool calling behavior */
355
+ export type AIOperationType = 'do' | 'vibe';
356
+
357
+ export interface VibeExpression extends BaseNode {
358
+ type: 'VibeExpression';
359
+ operationType: AIOperationType; // 'do' = single call, 'vibe' = tool loop
360
+ prompt: Expression;
361
+ model: Expression | null; // null = use lastUsedModel
362
+ context: ContextSpecifier | null; // null = use 'default' context
363
+ }
364
+
365
+ export interface TsBlock extends BaseNode {
366
+ type: 'TsBlock';
367
+ params: string[]; // Parameter names passed from Vibe scope
368
+ body: string; // Raw TypeScript code inside braces
369
+ }
370
+
371
+ // ============================================================================
372
+ // Node type (union of all nodes)
373
+ // ============================================================================
374
+
375
+ export type Node = Program | Statement | Expression;
package/src/ast.ts ADDED
@@ -0,0 +1,2 @@
1
+ // Re-export from new location for backwards compatibility
2
+ export * from './ast/index';