flow-lang 0.1.0
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/LICENSE +21 -0
- package/README.md +256 -0
- package/dist/analyzer/index.d.ts +3 -0
- package/dist/analyzer/index.d.ts.map +1 -0
- package/dist/analyzer/index.js +268 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +241 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/errors/index.d.ts +40 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +110 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/lexer/index.d.ts +7 -0
- package/dist/lexer/index.d.ts.map +1 -0
- package/dist/lexer/index.js +443 -0
- package/dist/lexer/index.js.map +1 -0
- package/dist/parser/index.d.ts +11 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +942 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/runtime/index.d.ts +92 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +972 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/types/index.d.ts +269 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +29 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +59 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Abraham Oluwa
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# Flow
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
# Order Processing Workflow
|
|
5
|
+
# This is real, runnable Flow code.
|
|
6
|
+
|
|
7
|
+
config:
|
|
8
|
+
name: "Order Processing"
|
|
9
|
+
version: 1
|
|
10
|
+
timeout: 5 minutes
|
|
11
|
+
|
|
12
|
+
services:
|
|
13
|
+
Inventory is an API at "https://inventory.example.com/api"
|
|
14
|
+
Stripe is a plugin "stripe-payments"
|
|
15
|
+
Notifier is an AI using "openai/gpt-4o"
|
|
16
|
+
|
|
17
|
+
workflow:
|
|
18
|
+
trigger: when a new order is placed
|
|
19
|
+
|
|
20
|
+
set order-id to order.id
|
|
21
|
+
set items to order.items
|
|
22
|
+
log "Processing order {order-id}"
|
|
23
|
+
|
|
24
|
+
step CheckInventory:
|
|
25
|
+
for each item in items:
|
|
26
|
+
check stock using Inventory with product item
|
|
27
|
+
|
|
28
|
+
step CalculateTotal:
|
|
29
|
+
set subtotal to order.subtotal
|
|
30
|
+
set tax to subtotal times 0.08
|
|
31
|
+
set total to subtotal plus tax
|
|
32
|
+
|
|
33
|
+
step ChargePayment:
|
|
34
|
+
charge payment using Stripe with amount total and currency "usd"
|
|
35
|
+
on failure:
|
|
36
|
+
retry 3 times waiting 5 seconds
|
|
37
|
+
if still failing:
|
|
38
|
+
reject with "We could not process your payment. Please try again."
|
|
39
|
+
|
|
40
|
+
step SendConfirmation:
|
|
41
|
+
ask Notifier to write a friendly order confirmation
|
|
42
|
+
save the result as confirmation
|
|
43
|
+
log confirmation
|
|
44
|
+
|
|
45
|
+
complete with status "processed" and order-id order-id and total total
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Flow is a programming language for people who aren't programmers.** It lets operations teams, business analysts, and product managers write automated workflows in structured English — no semicolons, no brackets, no classes. If you can write a process document, you can write a Flow program.
|
|
49
|
+
|
|
50
|
+
## Installation
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npm install -g flow-lang
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Requires Node.js 18 or later.
|
|
57
|
+
|
|
58
|
+
## Quick Start
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Check a file for errors
|
|
62
|
+
flow check my-workflow.flow
|
|
63
|
+
|
|
64
|
+
# Run with mock services (no real API calls)
|
|
65
|
+
flow test my-workflow.flow
|
|
66
|
+
|
|
67
|
+
# Run for real
|
|
68
|
+
flow run my-workflow.flow --input '{"order": {"id": "123", "items": ["A", "B"], "subtotal": 100}}'
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## CLI Commands
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
flow check <file> # Parse and validate (no execution)
|
|
75
|
+
flow run <file> # Execute a .flow file
|
|
76
|
+
flow run <file> --input '<json>' # Pass trigger data as JSON
|
|
77
|
+
flow run <file> --verbose # Show detailed execution log
|
|
78
|
+
flow run <file> --mock # Use mock services instead of real APIs
|
|
79
|
+
flow run <file> --strict-env # Error on missing environment variables
|
|
80
|
+
flow test <file> # Dry-run with mock services
|
|
81
|
+
flow test <file> --verbose # Mock dry-run with execution log
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Language Overview
|
|
85
|
+
|
|
86
|
+
Flow has exactly **7 constructs** and **5 data types**. That's the whole language.
|
|
87
|
+
|
|
88
|
+
### Service Calls
|
|
89
|
+
|
|
90
|
+
Call real REST APIs, AI models, webhooks, or plugins:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
verify email using EmailVerifier with address email
|
|
94
|
+
get user using GitHub at "/users/octocat"
|
|
95
|
+
charge payment using Stripe with amount total and currency "usd"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Conditions
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
if requested-amount is above 50000:
|
|
102
|
+
set risk-adjustment to 1.5
|
|
103
|
+
otherwise if requested-amount is above 20000:
|
|
104
|
+
set risk-adjustment to 0.75
|
|
105
|
+
otherwise:
|
|
106
|
+
set risk-adjustment to 0
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### AI Requests
|
|
110
|
+
|
|
111
|
+
Ask an AI model to do something, and save the response:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
ask RiskAnalyst to assess the risk level of this loan application
|
|
115
|
+
save the result as risk-assessment
|
|
116
|
+
save the confidence as risk-confidence
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Works with OpenAI and Anthropic models out of the box.
|
|
120
|
+
|
|
121
|
+
### Variables
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
set name to "Alice"
|
|
125
|
+
set total to subtotal plus tax
|
|
126
|
+
set monthly-payment to amount times rate divided by 1200
|
|
127
|
+
set monthly-payment to monthly-payment rounded to 2
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Loops
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
for each item in order.items:
|
|
134
|
+
check stock using Inventory with product item
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Named Steps
|
|
138
|
+
|
|
139
|
+
Organize your workflow into labeled sections:
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
step VerifyIdentity:
|
|
143
|
+
verify identity using IdentityService with applicant applicant-id
|
|
144
|
+
log "Identity verified"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Output
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
complete with status "approved" and rate final-rate
|
|
151
|
+
reject with "We could not verify your identity at this time."
|
|
152
|
+
log "Processing order {order-id}"
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Comparisons and Math
|
|
156
|
+
|
|
157
|
+
Flow uses English words instead of symbols:
|
|
158
|
+
|
|
159
|
+
| Instead of | Flow uses |
|
|
160
|
+
|---|---|
|
|
161
|
+
| `==` | `is` |
|
|
162
|
+
| `!=` | `is not` |
|
|
163
|
+
| `>` | `is above` |
|
|
164
|
+
| `<` | `is below` |
|
|
165
|
+
| `>=` | `is at least` |
|
|
166
|
+
| `<=` | `is at most` |
|
|
167
|
+
| `+` | `plus` |
|
|
168
|
+
| `-` | `minus` |
|
|
169
|
+
| `*` | `times` |
|
|
170
|
+
| `/` | `divided by` |
|
|
171
|
+
|
|
172
|
+
### Data Types
|
|
173
|
+
|
|
174
|
+
| Type | Example |
|
|
175
|
+
|---|---|
|
|
176
|
+
| Text | `"hello"`, `"Order {id} confirmed"` |
|
|
177
|
+
| Number | `42`, `3.14`, `0.08` |
|
|
178
|
+
| Boolean | `true`, `false` |
|
|
179
|
+
| List | `order.items` |
|
|
180
|
+
| Record | `order` (accessed via dot notation: `order.id`) |
|
|
181
|
+
|
|
182
|
+
There are no nulls. If a value doesn't exist, it's `empty` — and you can check for it with `is empty` or `is not empty`.
|
|
183
|
+
|
|
184
|
+
## Services
|
|
185
|
+
|
|
186
|
+
Flow connects to real external services:
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
services:
|
|
190
|
+
# REST APIs — verb inference maps English to HTTP methods
|
|
191
|
+
GitHub is an API at "https://api.github.com"
|
|
192
|
+
|
|
193
|
+
# AI agents — OpenAI and Anthropic supported
|
|
194
|
+
Analyst is an AI using "openai/gpt-4o"
|
|
195
|
+
Claude is an AI using "anthropic/claude-sonnet-4-20250514"
|
|
196
|
+
|
|
197
|
+
# Webhooks — always POST
|
|
198
|
+
SlackNotifier is a webhook at "https://hooks.slack.com/..."
|
|
199
|
+
|
|
200
|
+
# Plugins — stub connector for future plugin system
|
|
201
|
+
Stripe is a plugin "stripe-payments"
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### API Keys
|
|
205
|
+
|
|
206
|
+
Create a `.env` file in your project root:
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
OPENAI_API_KEY=sk-...
|
|
210
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Flow loads `.env` automatically via dotenv. Access any environment variable with `env.VARIABLE_NAME`.
|
|
214
|
+
|
|
215
|
+
## Error Messages
|
|
216
|
+
|
|
217
|
+
Flow doesn't show stack traces. Every error is written in plain English with the exact line, what went wrong, and how to fix it:
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
Error in loan-application.flow, line 12:
|
|
221
|
+
|
|
222
|
+
verify the email using EmailChecker
|
|
223
|
+
|
|
224
|
+
I don't know what "EmailChecker" is. You haven't declared it
|
|
225
|
+
in your services block.
|
|
226
|
+
|
|
227
|
+
Did you mean "EmailVerifier"?
|
|
228
|
+
|
|
229
|
+
Hint: Every service must be declared at the top of your file:
|
|
230
|
+
services:
|
|
231
|
+
EmailChecker is an API at "https://..."
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Examples
|
|
235
|
+
|
|
236
|
+
The `examples/` directory has complete workflows:
|
|
237
|
+
|
|
238
|
+
- **email-verification.flow** — Validates a submitted email address
|
|
239
|
+
- **order-processing.flow** — Inventory check, payment, and confirmation
|
|
240
|
+
- **loan-application.flow** — Full pipeline: identity, credit, AI risk assessment, fraud screening, and approval
|
|
241
|
+
|
|
242
|
+
## Contributing
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
git clone https://github.com/AbrahamOluwa/flow-lang.git
|
|
246
|
+
cd flow-lang
|
|
247
|
+
npm install
|
|
248
|
+
npm run build
|
|
249
|
+
npm run test
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
The test suite uses [Vitest](https://vitest.dev/) with 389 tests across all pipeline stages.
|
|
253
|
+
|
|
254
|
+
## License
|
|
255
|
+
|
|
256
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,OAAO,EAAE,SAAS,EAOrB,MAAM,mBAAmB,CAAC;AAO3B,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,GAAG,SAAS,EAAE,CAyUnG"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { createError, findClosestMatch } from "../errors/index.js";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Analyzer
|
|
4
|
+
// ============================================================
|
|
5
|
+
export function analyze(program, source, fileName = "<input>") {
|
|
6
|
+
const errors = [];
|
|
7
|
+
// Collect declared service names
|
|
8
|
+
const declaredServices = new Set();
|
|
9
|
+
if (program.services) {
|
|
10
|
+
for (const decl of program.services.declarations) {
|
|
11
|
+
declaredServices.add(decl.name);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const serviceNames = [...declaredServices];
|
|
15
|
+
// Collect declared config keys
|
|
16
|
+
const declaredConfigKeys = new Set();
|
|
17
|
+
// Track step names for duplicate detection
|
|
18
|
+
const declaredSteps = new Set();
|
|
19
|
+
// Known config keys
|
|
20
|
+
const knownConfigKeys = new Set(["name", "version", "timeout", "description"]);
|
|
21
|
+
function createScope(parent) {
|
|
22
|
+
return { variables: new Set(), parent };
|
|
23
|
+
}
|
|
24
|
+
function defineVar(scope, name) {
|
|
25
|
+
scope.variables.add(name);
|
|
26
|
+
}
|
|
27
|
+
function isVarDefined(scope, name) {
|
|
28
|
+
let current = scope;
|
|
29
|
+
while (current) {
|
|
30
|
+
if (current.variables.has(name))
|
|
31
|
+
return true;
|
|
32
|
+
current = current.parent;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
function allDefinedVars(scope) {
|
|
37
|
+
const vars = [];
|
|
38
|
+
let current = scope;
|
|
39
|
+
while (current) {
|
|
40
|
+
for (const v of current.variables) {
|
|
41
|
+
vars.push(v);
|
|
42
|
+
}
|
|
43
|
+
current = current.parent;
|
|
44
|
+
}
|
|
45
|
+
return vars;
|
|
46
|
+
}
|
|
47
|
+
// --------------------------------------------------------
|
|
48
|
+
// Error helpers
|
|
49
|
+
// --------------------------------------------------------
|
|
50
|
+
function addError(loc, message, suggestion, hint) {
|
|
51
|
+
errors.push(createError(fileName, loc.line, loc.column, message, source, { suggestion, hint }));
|
|
52
|
+
}
|
|
53
|
+
function addWarning(loc, message, suggestion, hint) {
|
|
54
|
+
errors.push(createError(fileName, loc.line, loc.column, message, source, { suggestion, hint, severity: "warning" }));
|
|
55
|
+
}
|
|
56
|
+
// --------------------------------------------------------
|
|
57
|
+
// Config validation
|
|
58
|
+
// --------------------------------------------------------
|
|
59
|
+
function analyzeConfig() {
|
|
60
|
+
if (!program.config)
|
|
61
|
+
return;
|
|
62
|
+
for (const entry of program.config.entries) {
|
|
63
|
+
// Duplicate config keys
|
|
64
|
+
if (declaredConfigKeys.has(entry.key)) {
|
|
65
|
+
addError(entry.loc, `Duplicate config key "${entry.key}". Each config key can only appear once.`);
|
|
66
|
+
}
|
|
67
|
+
declaredConfigKeys.add(entry.key);
|
|
68
|
+
// Unknown config keys
|
|
69
|
+
if (!knownConfigKeys.has(entry.key)) {
|
|
70
|
+
addWarning(entry.loc, `Unknown config key "${entry.key}".`, undefined, `Known config keys are: ${[...knownConfigKeys].join(", ")}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// --------------------------------------------------------
|
|
75
|
+
// Services validation
|
|
76
|
+
// --------------------------------------------------------
|
|
77
|
+
function analyzeServices() {
|
|
78
|
+
if (!program.services)
|
|
79
|
+
return;
|
|
80
|
+
const seen = new Set();
|
|
81
|
+
for (const decl of program.services.declarations) {
|
|
82
|
+
if (seen.has(decl.name)) {
|
|
83
|
+
addError(decl.loc, `Duplicate service name "${decl.name}". Each service must have a unique name.`);
|
|
84
|
+
}
|
|
85
|
+
seen.add(decl.name);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// --------------------------------------------------------
|
|
89
|
+
// Check service references
|
|
90
|
+
// --------------------------------------------------------
|
|
91
|
+
function checkServiceRef(name, loc) {
|
|
92
|
+
if (name === "")
|
|
93
|
+
return; // skip empty (parse error artifact)
|
|
94
|
+
if (declaredServices.has(name))
|
|
95
|
+
return;
|
|
96
|
+
const suggestion = findClosestMatch(name, serviceNames);
|
|
97
|
+
addError(loc, `I don't know what "${name}" is. You haven't declared it in your services block.`, suggestion ? `Did you mean "${suggestion}"?` : undefined, `Every service must be declared at the top of your file:\n services:\n ${name} is an API at "https://..."`);
|
|
98
|
+
}
|
|
99
|
+
// --------------------------------------------------------
|
|
100
|
+
// Check variable references in expressions
|
|
101
|
+
// --------------------------------------------------------
|
|
102
|
+
function checkExpression(expr, scope) {
|
|
103
|
+
switch (expr.kind) {
|
|
104
|
+
case "Identifier":
|
|
105
|
+
if (!isVarDefined(scope, expr.name)) {
|
|
106
|
+
const suggestion = findClosestMatch(expr.name, allDefinedVars(scope));
|
|
107
|
+
addError(expr.loc, `I don't recognize the variable "${expr.name}". It hasn't been set yet.`, suggestion ? `Did you mean "${suggestion}"?` : undefined, 'Variables must be created with "set" before they can be used:\n set ' + expr.name + ' to ...');
|
|
108
|
+
}
|
|
109
|
+
break;
|
|
110
|
+
case "DotAccess":
|
|
111
|
+
checkDotAccessRoot(expr, scope);
|
|
112
|
+
break;
|
|
113
|
+
case "InterpolatedString":
|
|
114
|
+
for (const part of expr.parts) {
|
|
115
|
+
if (part.kind === "expression") {
|
|
116
|
+
checkExpression(part.value, scope);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
break;
|
|
120
|
+
case "MathExpression":
|
|
121
|
+
checkExpression(expr.left, scope);
|
|
122
|
+
checkExpression(expr.right, scope);
|
|
123
|
+
break;
|
|
124
|
+
case "ComparisonExpression":
|
|
125
|
+
checkExpression(expr.left, scope);
|
|
126
|
+
if (expr.right)
|
|
127
|
+
checkExpression(expr.right, scope);
|
|
128
|
+
break;
|
|
129
|
+
case "LogicalExpression":
|
|
130
|
+
checkExpression(expr.left, scope);
|
|
131
|
+
if (expr.right)
|
|
132
|
+
checkExpression(expr.right, scope);
|
|
133
|
+
break;
|
|
134
|
+
case "StringLiteral":
|
|
135
|
+
case "NumberLiteral":
|
|
136
|
+
case "BooleanLiteral":
|
|
137
|
+
// No variables to check
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Dot-access roots (e.g., `signup` in `signup.email`) are treated as
|
|
143
|
+
* potentially implicit external data (trigger payload, service response).
|
|
144
|
+
* We don't flag them as undefined — only standalone Identifier expressions
|
|
145
|
+
* are checked strictly.
|
|
146
|
+
*/
|
|
147
|
+
function checkDotAccessRoot(_expr, _scope) {
|
|
148
|
+
// Intentionally lenient: dot-access roots may be implicit trigger/service data.
|
|
149
|
+
}
|
|
150
|
+
// --------------------------------------------------------
|
|
151
|
+
// Statement analysis
|
|
152
|
+
// --------------------------------------------------------
|
|
153
|
+
function analyzeStatements(stmts, scope) {
|
|
154
|
+
for (const stmt of stmts) {
|
|
155
|
+
analyzeStatement(stmt, scope);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function analyzeStatement(stmt, scope) {
|
|
159
|
+
switch (stmt.kind) {
|
|
160
|
+
case "SetStatement":
|
|
161
|
+
analyzeSetStatement(stmt, scope);
|
|
162
|
+
break;
|
|
163
|
+
case "IfStatement":
|
|
164
|
+
analyzeIfStatement(stmt, scope);
|
|
165
|
+
break;
|
|
166
|
+
case "ForEachStatement":
|
|
167
|
+
analyzeForEachStatement(stmt, scope);
|
|
168
|
+
break;
|
|
169
|
+
case "ServiceCall":
|
|
170
|
+
analyzeServiceCall(stmt, scope);
|
|
171
|
+
break;
|
|
172
|
+
case "AskStatement":
|
|
173
|
+
analyzeAskStatement(stmt, scope);
|
|
174
|
+
break;
|
|
175
|
+
case "LogStatement":
|
|
176
|
+
checkExpression(stmt.expression, scope);
|
|
177
|
+
break;
|
|
178
|
+
case "CompleteStatement":
|
|
179
|
+
analyzeCompleteStatement(stmt, scope);
|
|
180
|
+
break;
|
|
181
|
+
case "RejectStatement":
|
|
182
|
+
checkExpression(stmt.message, scope);
|
|
183
|
+
break;
|
|
184
|
+
case "StepBlock":
|
|
185
|
+
analyzeStepBlock(stmt, scope);
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function analyzeSetStatement(stmt, scope) {
|
|
190
|
+
// Check the value expression first (before the variable is defined)
|
|
191
|
+
checkExpression(stmt.value, scope);
|
|
192
|
+
// Then define the variable
|
|
193
|
+
defineVar(scope, stmt.variable);
|
|
194
|
+
}
|
|
195
|
+
function analyzeIfStatement(stmt, scope) {
|
|
196
|
+
checkExpression(stmt.condition, scope);
|
|
197
|
+
analyzeStatements(stmt.body, scope);
|
|
198
|
+
for (const oi of stmt.otherwiseIfs) {
|
|
199
|
+
checkExpression(oi.condition, scope);
|
|
200
|
+
analyzeStatements(oi.body, scope);
|
|
201
|
+
}
|
|
202
|
+
if (stmt.otherwise) {
|
|
203
|
+
analyzeStatements(stmt.otherwise, scope);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function analyzeForEachStatement(stmt, scope) {
|
|
207
|
+
checkExpression(stmt.collection, scope);
|
|
208
|
+
// Loop variable is scoped to the loop body
|
|
209
|
+
const loopScope = createScope(scope);
|
|
210
|
+
defineVar(loopScope, stmt.itemName);
|
|
211
|
+
analyzeStatements(stmt.body, loopScope);
|
|
212
|
+
}
|
|
213
|
+
function analyzeServiceCall(stmt, scope) {
|
|
214
|
+
if (stmt.service) {
|
|
215
|
+
checkServiceRef(stmt.service, stmt.loc);
|
|
216
|
+
}
|
|
217
|
+
for (const param of stmt.parameters) {
|
|
218
|
+
checkExpression(param.value, scope);
|
|
219
|
+
}
|
|
220
|
+
if (stmt.errorHandler) {
|
|
221
|
+
analyzeErrorHandler(stmt.errorHandler, scope);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
function analyzeAskStatement(stmt, scope) {
|
|
225
|
+
checkServiceRef(stmt.agent, stmt.loc);
|
|
226
|
+
// save the result as / save the confidence as define variables
|
|
227
|
+
if (stmt.resultVar) {
|
|
228
|
+
defineVar(scope, stmt.resultVar);
|
|
229
|
+
}
|
|
230
|
+
if (stmt.confidenceVar) {
|
|
231
|
+
defineVar(scope, stmt.confidenceVar);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function analyzeCompleteStatement(stmt, scope) {
|
|
235
|
+
for (const param of stmt.outputs) {
|
|
236
|
+
checkExpression(param.value, scope);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function analyzeStepBlock(stmt, scope) {
|
|
240
|
+
if (declaredSteps.has(stmt.name)) {
|
|
241
|
+
addError(stmt.loc, `Duplicate step name "${stmt.name}". Each step must have a unique name.`, "Rename one of the steps to something different.");
|
|
242
|
+
}
|
|
243
|
+
declaredSteps.add(stmt.name);
|
|
244
|
+
// Steps do NOT create a new scope — they are organizational only
|
|
245
|
+
analyzeStatements(stmt.body, scope);
|
|
246
|
+
}
|
|
247
|
+
function analyzeErrorHandler(handler, scope) {
|
|
248
|
+
if (handler.fallback) {
|
|
249
|
+
analyzeStatements(handler.fallback, scope);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// --------------------------------------------------------
|
|
253
|
+
// Main analysis
|
|
254
|
+
// --------------------------------------------------------
|
|
255
|
+
analyzeConfig();
|
|
256
|
+
analyzeServices();
|
|
257
|
+
if (program.workflow) {
|
|
258
|
+
const globalScope = createScope(null);
|
|
259
|
+
// Trigger data is implicitly available (users access it via dot notation)
|
|
260
|
+
// We don't know the exact shape, so we treat any root-level identifier
|
|
261
|
+
// referenced via dot access as potentially valid trigger data.
|
|
262
|
+
// But we do need to make "env" available.
|
|
263
|
+
defineVar(globalScope, "env");
|
|
264
|
+
analyzeStatements(program.workflow.body, globalScope);
|
|
265
|
+
}
|
|
266
|
+
return errors;
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|