@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
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
|
+
}
|
package/src/ast/index.ts
ADDED
|
@@ -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