@aigne/ash 0.0.1 → 0.0.2-beta.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/dist/ast.d.cts +9 -1
- package/dist/ast.d.cts.map +1 -1
- package/dist/ast.d.mts +9 -1
- package/dist/ast.d.mts.map +1 -1
- package/dist/compiler.cjs +6 -0
- package/dist/compiler.d.cts.map +1 -1
- package/dist/compiler.d.mts.map +1 -1
- package/dist/compiler.mjs +6 -0
- package/dist/compiler.mjs.map +1 -1
- package/dist/parser.cjs +28 -0
- package/dist/parser.d.cts.map +1 -1
- package/dist/parser.d.mts.map +1 -1
- package/dist/parser.mjs +28 -0
- package/dist/parser.mjs.map +1 -1
- package/dist/type-checker.cjs +6 -0
- package/dist/type-checker.d.cts.map +1 -1
- package/dist/type-checker.d.mts.map +1 -1
- package/dist/type-checker.mjs +6 -0
- package/dist/type-checker.mjs.map +1 -1
- package/package.json +5 -1
- package/DESIGN.md +0 -41
- package/src/ai-dev-loop/ash-run-result.test.ts +0 -113
- package/src/ai-dev-loop/ash-run-result.ts +0 -46
- package/src/ai-dev-loop/ash-typed-error.test.ts +0 -136
- package/src/ai-dev-loop/ash-typed-error.ts +0 -50
- package/src/ai-dev-loop/ash-validate.test.ts +0 -54
- package/src/ai-dev-loop/ash-validate.ts +0 -34
- package/src/ai-dev-loop/dev-loop.test.ts +0 -364
- package/src/ai-dev-loop/dev-loop.ts +0 -156
- package/src/ai-dev-loop/dry-run.test.ts +0 -107
- package/src/ai-dev-loop/e2e-multi-fix.test.ts +0 -473
- package/src/ai-dev-loop/e2e.test.ts +0 -324
- package/src/ai-dev-loop/index.ts +0 -15
- package/src/ai-dev-loop/invariants.test.ts +0 -253
- package/src/ai-dev-loop/live-mode.test.ts +0 -63
- package/src/ai-dev-loop/live-mode.ts +0 -33
- package/src/ai-dev-loop/meta-tools.test.ts +0 -120
- package/src/ai-dev-loop/meta-tools.ts +0 -142
- package/src/ai-dev-loop/structured-runner.test.ts +0 -159
- package/src/ai-dev-loop/structured-runner.ts +0 -209
- package/src/ai-dev-loop/system-prompt.test.ts +0 -102
- package/src/ai-dev-loop/system-prompt.ts +0 -81
- package/src/ast.ts +0 -186
- package/src/compiler.test.ts +0 -2933
- package/src/compiler.ts +0 -1103
- package/src/e2e.test.ts +0 -552
- package/src/index.ts +0 -16
- package/src/lexer.test.ts +0 -538
- package/src/lexer.ts +0 -222
- package/src/parser.test.ts +0 -1024
- package/src/parser.ts +0 -835
- package/src/reference.test.ts +0 -166
- package/src/reference.ts +0 -125
- package/src/template.test.ts +0 -210
- package/src/template.ts +0 -139
- package/src/type-checker.test.ts +0 -1494
- package/src/type-checker.ts +0 -785
- package/tsconfig.json +0 -9
- package/tsdown.config.ts +0 -12
package/dist/ast.d.cts
CHANGED
|
@@ -39,7 +39,15 @@ interface VarRefExpression {
|
|
|
39
39
|
kind: "var_ref";
|
|
40
40
|
name: string;
|
|
41
41
|
}
|
|
42
|
-
|
|
42
|
+
interface ArrayLiteralExpression {
|
|
43
|
+
kind: "array_literal";
|
|
44
|
+
elements: Expression[];
|
|
45
|
+
}
|
|
46
|
+
interface ObjectLiteralExpression {
|
|
47
|
+
kind: "object_literal";
|
|
48
|
+
properties: Record<string, Expression>;
|
|
49
|
+
}
|
|
50
|
+
type Expression = BinaryExpression | FieldAccessExpression | LiteralExpression | VarRefExpression | ArrayLiteralExpression | ObjectLiteralExpression;
|
|
43
51
|
interface MapExpression {
|
|
44
52
|
kind: "map";
|
|
45
53
|
field: string;
|
package/dist/ast.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.d.cts","names":[],"sources":["../src/ast.ts"],"mappings":";UAAiB,UAAA;EACf,IAAA;EACA,IAAA;EACA,IAAA;EACA,MAAA;AAAA;AAAA,UAGe,cAAA;EACf,KAAA;EACA,EAAA;EACA,KAAA;AAAA;AAAA,UAGe,cAAA;EACf,IAAA;EACA,IAAA;EACA,KAAA,GAAQ,cAAA;AAAA;AAAA,UAGO,WAAA;EACf,IAAA;EACA,IAAA;EACA,EAAA;EACA,KAAA;AAAA;AAAA,UAKe,gBAAA;EACf,IAAA;EACA,EAAA;EACA,IAAA,EAAM,UAAA;EACN,KAAA,EAAO,UAAA;AAAA;AAAA,UAGQ,qBAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,iBAAA;EACf,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,gBAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"ast.d.cts","names":[],"sources":["../src/ast.ts"],"mappings":";UAAiB,UAAA;EACf,IAAA;EACA,IAAA;EACA,IAAA;EACA,MAAA;AAAA;AAAA,UAGe,cAAA;EACf,KAAA;EACA,EAAA;EACA,KAAA;AAAA;AAAA,UAGe,cAAA;EACf,IAAA;EACA,IAAA;EACA,KAAA,GAAQ,cAAA;AAAA;AAAA,UAGO,WAAA;EACf,IAAA;EACA,IAAA;EACA,EAAA;EACA,KAAA;AAAA;AAAA,UAKe,gBAAA;EACf,IAAA;EACA,EAAA;EACA,IAAA,EAAM,UAAA;EACN,KAAA,EAAO,UAAA;AAAA;AAAA,UAGQ,qBAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,iBAAA;EACf,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,gBAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,sBAAA;EACf,IAAA;EACA,QAAA,EAAU,UAAA;AAAA;AAAA,UAGK,uBAAA;EACf,IAAA;EACA,UAAA,EAAY,MAAA,SAAe,UAAA;AAAA;AAAA,KAGjB,UAAA,GACR,gBAAA,GACA,qBAAA,GACA,iBAAA,GACA,gBAAA,GACA,sBAAA,GACA,uBAAA;AAAA,UAEa,aAAA;EACf,IAAA;EACA,KAAA;EACA,QAAA,GAAW,MAAA;EACX,UAAA,GAAa,UAAA;EACb,YAAA,GAAe,MAAA,SAAe,UAAA;AAAA;AAAA,UAGf,cAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,iBAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,aAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,gBAAA;EACf,IAAA;EACA,QAAA,EAAU,aAAA;AAAA;AAAA,UAGK,gBAAA;EACf,IAAA;EACA,OAAA;EACA,UAAA,GAAa,UAAA;AAAA;AAAA,UAGE,eAAA;EACf,IAAA;EACA,MAAA;AAAA;AAAA,UAGe,eAAA;EACf,IAAA;AAAA;AAAA,UAGe,iBAAA;EACf,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,gBAAA;EACf,IAAA;EACA,IAAA;EACA,QAAA;EACA,MAAA,GAAS,MAAA;AAAA;AAAA,UAGM,WAAA;EACf,KAAA;EACA,SAAA;AAAA;AAAA,UAGe,eAAA;EACf,IAAA;EACA,KAAA;EACA,QAAA,EAAU,WAAA;EACV,QAAA;AAAA;AAAA,UAGe,gBAAA;EACf,IAAA;EACA,IAAA;EACA,OAAA;AAAA;AAAA,KAGU,aAAA,GACR,cAAA,GACA,WAAA,GACA,aAAA,GACA,cAAA,GACA,iBAAA,GACA,aAAA,GACA,gBAAA,GACA,gBAAA,GACA,eAAA,GACA,eAAA,GACA,iBAAA,GACA,gBAAA,GACA,eAAA,GACA,gBAAA;AAAA,UAEa,YAAA;EACf,IAAA;EACA,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,WAAA;EACf,IAAA;EACA,UAAA;AAAA;AAAA,KAGU,kBAAA,GAAqB,YAAA,GAAe,WAAA;AAAA,UAE/B,cAAA;EACf,IAAA;EACA,IAAA;EACA,WAAA,EAAa,UAAA;EACb,QAAA,EAAU,aAAA;EACV,OAAA,GAAU,kBAAA;AAAA;AAAA,UAGK,YAAA;EACf,IAAA;EACA,IAAA;EACA,KAAA;EACA,QAAA,GAAW,aAAA;AAAA;AAAA,UAGI,gBAAA;EACf,IAAA;EACA,IAAA;EACA,YAAA;AAAA;AAAA,KAGU,iBAAA,GAAoB,cAAA,GAAiB,gBAAA,GAAmB,YAAA,GAAe,gBAAA;AAAA,UAElE,OAAA;EACf,UAAA,EAAY,iBAAA;EAvGmB;EAyG/B,IAAA,EAAM,cAAA;AAAA"}
|
package/dist/ast.d.mts
CHANGED
|
@@ -39,7 +39,15 @@ interface VarRefExpression {
|
|
|
39
39
|
kind: "var_ref";
|
|
40
40
|
name: string;
|
|
41
41
|
}
|
|
42
|
-
|
|
42
|
+
interface ArrayLiteralExpression {
|
|
43
|
+
kind: "array_literal";
|
|
44
|
+
elements: Expression[];
|
|
45
|
+
}
|
|
46
|
+
interface ObjectLiteralExpression {
|
|
47
|
+
kind: "object_literal";
|
|
48
|
+
properties: Record<string, Expression>;
|
|
49
|
+
}
|
|
50
|
+
type Expression = BinaryExpression | FieldAccessExpression | LiteralExpression | VarRefExpression | ArrayLiteralExpression | ObjectLiteralExpression;
|
|
43
51
|
interface MapExpression {
|
|
44
52
|
kind: "map";
|
|
45
53
|
field: string;
|
package/dist/ast.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.d.mts","names":[],"sources":["../src/ast.ts"],"mappings":";UAAiB,UAAA;EACf,IAAA;EACA,IAAA;EACA,IAAA;EACA,MAAA;AAAA;AAAA,UAGe,cAAA;EACf,KAAA;EACA,EAAA;EACA,KAAA;AAAA;AAAA,UAGe,cAAA;EACf,IAAA;EACA,IAAA;EACA,KAAA,GAAQ,cAAA;AAAA;AAAA,UAGO,WAAA;EACf,IAAA;EACA,IAAA;EACA,EAAA;EACA,KAAA;AAAA;AAAA,UAKe,gBAAA;EACf,IAAA;EACA,EAAA;EACA,IAAA,EAAM,UAAA;EACN,KAAA,EAAO,UAAA;AAAA;AAAA,UAGQ,qBAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,iBAAA;EACf,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,gBAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"ast.d.mts","names":[],"sources":["../src/ast.ts"],"mappings":";UAAiB,UAAA;EACf,IAAA;EACA,IAAA;EACA,IAAA;EACA,MAAA;AAAA;AAAA,UAGe,cAAA;EACf,KAAA;EACA,EAAA;EACA,KAAA;AAAA;AAAA,UAGe,cAAA;EACf,IAAA;EACA,IAAA;EACA,KAAA,GAAQ,cAAA;AAAA;AAAA,UAGO,WAAA;EACf,IAAA;EACA,IAAA;EACA,EAAA;EACA,KAAA;AAAA;AAAA,UAKe,gBAAA;EACf,IAAA;EACA,EAAA;EACA,IAAA,EAAM,UAAA;EACN,KAAA,EAAO,UAAA;AAAA;AAAA,UAGQ,qBAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,iBAAA;EACf,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,gBAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,sBAAA;EACf,IAAA;EACA,QAAA,EAAU,UAAA;AAAA;AAAA,UAGK,uBAAA;EACf,IAAA;EACA,UAAA,EAAY,MAAA,SAAe,UAAA;AAAA;AAAA,KAGjB,UAAA,GACR,gBAAA,GACA,qBAAA,GACA,iBAAA,GACA,gBAAA,GACA,sBAAA,GACA,uBAAA;AAAA,UAEa,aAAA;EACf,IAAA;EACA,KAAA;EACA,QAAA,GAAW,MAAA;EACX,UAAA,GAAa,UAAA;EACb,YAAA,GAAe,MAAA,SAAe,UAAA;AAAA;AAAA,UAGf,cAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,iBAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,aAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,gBAAA;EACf,IAAA;EACA,QAAA,EAAU,aAAA;AAAA;AAAA,UAGK,gBAAA;EACf,IAAA;EACA,OAAA;EACA,UAAA,GAAa,UAAA;AAAA;AAAA,UAGE,eAAA;EACf,IAAA;EACA,MAAA;AAAA;AAAA,UAGe,eAAA;EACf,IAAA;AAAA;AAAA,UAGe,iBAAA;EACf,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,gBAAA;EACf,IAAA;EACA,IAAA;EACA,QAAA;EACA,MAAA,GAAS,MAAA;AAAA;AAAA,UAGM,WAAA;EACf,KAAA;EACA,SAAA;AAAA;AAAA,UAGe,eAAA;EACf,IAAA;EACA,KAAA;EACA,QAAA,EAAU,WAAA;EACV,QAAA;AAAA;AAAA,UAGe,gBAAA;EACf,IAAA;EACA,IAAA;EACA,OAAA;AAAA;AAAA,KAGU,aAAA,GACR,cAAA,GACA,WAAA,GACA,aAAA,GACA,cAAA,GACA,iBAAA,GACA,aAAA,GACA,gBAAA,GACA,gBAAA,GACA,eAAA,GACA,eAAA,GACA,iBAAA,GACA,gBAAA,GACA,eAAA,GACA,gBAAA;AAAA,UAEa,YAAA;EACf,IAAA;EACA,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,WAAA;EACf,IAAA;EACA,UAAA;AAAA;AAAA,KAGU,kBAAA,GAAqB,YAAA,GAAe,WAAA;AAAA,UAE/B,cAAA;EACf,IAAA;EACA,IAAA;EACA,WAAA,EAAa,UAAA;EACb,QAAA,EAAU,aAAA;EACV,OAAA,GAAU,kBAAA;AAAA;AAAA,UAGK,YAAA;EACf,IAAA;EACA,IAAA;EACA,KAAA;EACA,QAAA,GAAW,aAAA;AAAA;AAAA,UAGI,gBAAA;EACf,IAAA;EACA,IAAA;EACA,YAAA;AAAA;AAAA,KAGU,iBAAA,GAAoB,cAAA,GAAiB,gBAAA,GAAmB,YAAA,GAAe,gBAAA;AAAA,UAElE,OAAA;EACf,UAAA,EAAY,iBAAA;EAvGmB;EAyG/B,IAAA,EAAM,cAAA;AAAA"}
|
package/dist/compiler.cjs
CHANGED
|
@@ -779,6 +779,12 @@ var AshCompiler = class {
|
|
|
779
779
|
default: throw new Error(`Unknown operator: ${expr.op}`);
|
|
780
780
|
}
|
|
781
781
|
}
|
|
782
|
+
case "array_literal": return expr.elements.map((el) => this.evaluateExpression(el, item, variables));
|
|
783
|
+
case "object_literal": {
|
|
784
|
+
const obj = {};
|
|
785
|
+
for (const [key, valExpr] of Object.entries(expr.properties)) obj[key] = this.evaluateExpression(valExpr, item, variables);
|
|
786
|
+
return obj;
|
|
787
|
+
}
|
|
782
788
|
default: throw new Error(`Unknown expression kind: ${expr.kind}`);
|
|
783
789
|
}
|
|
784
790
|
}
|
package/dist/compiler.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.d.cts","names":[],"sources":["../src/compiler.ts"],"mappings":";;;;UAOiB,aAAA;EACf,OAAA,GAAU,eAAA;EACV,WAAA,EAAa,aAAA;EACb,UAAA;AAAA;AAAA,iBAuBc,aAAA,CAAc,MAAA,WAAiB,aAAA;AAAA,UAgQ9B,WAAA;EACf,IAAA;EACA,OAAA;EACA,OAAA,GAAU,UAAA;AAAA;AAAA,UAGK,aAAA;EACf,MAAA,CAAO,KAAA,EAAO,WAAA;AAAA;AAAA,UAGC,UAAA;EACf,KAAA,EAAO,cAAA;EACP,IAAA,EAAM,GAAA;EACN,MAAA,EAAQ,SAAA;EACR,MAAA,GAAS,aAAA;AAAA;AAAA,UAGM,cAAA;EACf,IAAA,CAAK,IAAA,UAAc,KAAA,GAAQ,cAAA,eAA6B,OAAA;EACxD,KAAA,CAAM,IAAA,UAAc,IAAA;EACpB,OAAA,CAAQ,KAAA,UAAe,IAAA;EACvB,IAAA,EAAM,IAAA,UAAc,KAAA,aAAkB,MAAA,GAAS,MAAA,oBAA0B,OAAA;EACzE,KAAA,EAAO,MAAA,oBAA0B,OAAA;AAAA;AAAA,UAGlB,UAAA;EACf,SAAA;EACA,MAAA;EACA,OAAA;EACA,SAAA;EACA,OAAA;EACA,UAAA;AAAA;AAAA,UAGe,SAAA;EACf,GAAA,CAAI,KAAA,UAAe,MAAA,UAAgB,MAAA;EACnC,IAAA,EAAM,KAAA,uCAA4C,OAAA,UAAiB,OAAA,GAAU,UAAA;AAAA;AAAA,UAG9D,SAAA;EACf,MAAA;EACA,WAAA;EACA,MAAA;AAAA;AAAA,UAGe,YAAA;EACf,IAAA;EACA,KAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,UAGe,SAAA,SAAkB,SAAA;EACjC,OAAA;EACA,eAAA;EACA,MAAA,EAAQ,YAAA;AAAA;AAAA,UAGO,aAAA;EACf,IAAA,EAAM,SAAA;EACN,eAAA;AAAA;AAAA,UAGe,WAAA;EACf,IAAA;EACA,IAAA;EACA,OAAA,GAAU,kBAAA;EACV,OAAA,CAAQ,GAAA,EAAK,UAAA,EAAY,aAAA,eAA4B,OAAA,CAAQ,SAAA;AAAA;AAAA,UAG9C,cAAA;EACf,IAAA;EACA,OAAA;EACA,OAAA,CAAQ,GAAA,EAAK,UAAA,GAAa,OAAA;AAAA;AAAA,KAGhB,YAAA,GAAe,WAAA,GAAc,cAAA;AAAA,UAExB,eAAA;EACf,IAAA,EAAM,WAAA;EACN,KAAA,EAAO,YAAA;EACP,MAAA,EAAQ,GAAA,SAAY,WAAA;EACpB,MAAA,EAAQ,GAAA;EACR,YAAA,GAAe,GAAA;AAAA;AAAA,cAqCJ,WAAA;EAAA,QACH,eAAA;EAAA,QACA,kBAAA;EAAA,QACA,OAAA;EAER,OAAA,CAAQ,GAAA,EAAK,OAAA,GAAU,eAAA;EAAA,QAmDf,gBAAA;EAAA,QAOA,qBAAA;EAAA,QAWA,UAAA;EAAA,QA+MM,YAAA;EAAA,QA2SN,gBAAA;EAAA,QAWA,gBAAA;EAAA,QAYA,aAAA;EAAA,QAwBA,YAAA;EAAA,QAWA,kBAAA;EAAA,
|
|
1
|
+
{"version":3,"file":"compiler.d.cts","names":[],"sources":["../src/compiler.ts"],"mappings":";;;;UAOiB,aAAA;EACf,OAAA,GAAU,eAAA;EACV,WAAA,EAAa,aAAA;EACb,UAAA;AAAA;AAAA,iBAuBc,aAAA,CAAc,MAAA,WAAiB,aAAA;AAAA,UAgQ9B,WAAA;EACf,IAAA;EACA,OAAA;EACA,OAAA,GAAU,UAAA;AAAA;AAAA,UAGK,aAAA;EACf,MAAA,CAAO,KAAA,EAAO,WAAA;AAAA;AAAA,UAGC,UAAA;EACf,KAAA,EAAO,cAAA;EACP,IAAA,EAAM,GAAA;EACN,MAAA,EAAQ,SAAA;EACR,MAAA,GAAS,aAAA;AAAA;AAAA,UAGM,cAAA;EACf,IAAA,CAAK,IAAA,UAAc,KAAA,GAAQ,cAAA,eAA6B,OAAA;EACxD,KAAA,CAAM,IAAA,UAAc,IAAA;EACpB,OAAA,CAAQ,KAAA,UAAe,IAAA;EACvB,IAAA,EAAM,IAAA,UAAc,KAAA,aAAkB,MAAA,GAAS,MAAA,oBAA0B,OAAA;EACzE,KAAA,EAAO,MAAA,oBAA0B,OAAA;AAAA;AAAA,UAGlB,UAAA;EACf,SAAA;EACA,MAAA;EACA,OAAA;EACA,SAAA;EACA,OAAA;EACA,UAAA;AAAA;AAAA,UAGe,SAAA;EACf,GAAA,CAAI,KAAA,UAAe,MAAA,UAAgB,MAAA;EACnC,IAAA,EAAM,KAAA,uCAA4C,OAAA,UAAiB,OAAA,GAAU,UAAA;AAAA;AAAA,UAG9D,SAAA;EACf,MAAA;EACA,WAAA;EACA,MAAA;AAAA;AAAA,UAGe,YAAA;EACf,IAAA;EACA,KAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,UAGe,SAAA,SAAkB,SAAA;EACjC,OAAA;EACA,eAAA;EACA,MAAA,EAAQ,YAAA;AAAA;AAAA,UAGO,aAAA;EACf,IAAA,EAAM,SAAA;EACN,eAAA;AAAA;AAAA,UAGe,WAAA;EACf,IAAA;EACA,IAAA;EACA,OAAA,GAAU,kBAAA;EACV,OAAA,CAAQ,GAAA,EAAK,UAAA,EAAY,aAAA,eAA4B,OAAA,CAAQ,SAAA;AAAA;AAAA,UAG9C,cAAA;EACf,IAAA;EACA,OAAA;EACA,OAAA,CAAQ,GAAA,EAAK,UAAA,GAAa,OAAA;AAAA;AAAA,KAGhB,YAAA,GAAe,WAAA,GAAc,cAAA;AAAA,UAExB,eAAA;EACf,IAAA,EAAM,WAAA;EACN,KAAA,EAAO,YAAA;EACP,MAAA,EAAQ,GAAA,SAAY,WAAA;EACpB,MAAA,EAAQ,GAAA;EACR,YAAA,GAAe,GAAA;AAAA;AAAA,cAqCJ,WAAA;EAAA,QACH,eAAA;EAAA,QACA,kBAAA;EAAA,QACA,OAAA;EAER,OAAA,CAAQ,GAAA,EAAK,OAAA,GAAU,eAAA;EAAA,QAmDf,gBAAA;EAAA,QAOA,qBAAA;EAAA,QAWA,UAAA;EAAA,QA+MM,YAAA;EAAA,QA2SN,gBAAA;EAAA,QAWA,gBAAA;EAAA,QAYA,aAAA;EAAA,QAwBA,YAAA;EAAA,QAWA,kBAAA;EAAA,QA+CM,aAAA;AAAA"}
|
package/dist/compiler.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.d.mts","names":[],"sources":["../src/compiler.ts"],"mappings":";;;;UAOiB,aAAA;EACf,OAAA,GAAU,eAAA;EACV,WAAA,EAAa,aAAA;EACb,UAAA;AAAA;AAAA,iBAuBc,aAAA,CAAc,MAAA,WAAiB,aAAA;AAAA,UAgQ9B,WAAA;EACf,IAAA;EACA,OAAA;EACA,OAAA,GAAU,UAAA;AAAA;AAAA,UAGK,aAAA;EACf,MAAA,CAAO,KAAA,EAAO,WAAA;AAAA;AAAA,UAGC,UAAA;EACf,KAAA,EAAO,cAAA;EACP,IAAA,EAAM,GAAA;EACN,MAAA,EAAQ,SAAA;EACR,MAAA,GAAS,aAAA;AAAA;AAAA,UAGM,cAAA;EACf,IAAA,CAAK,IAAA,UAAc,KAAA,GAAQ,cAAA,eAA6B,OAAA;EACxD,KAAA,CAAM,IAAA,UAAc,IAAA;EACpB,OAAA,CAAQ,KAAA,UAAe,IAAA;EACvB,IAAA,EAAM,IAAA,UAAc,KAAA,aAAkB,MAAA,GAAS,MAAA,oBAA0B,OAAA;EACzE,KAAA,EAAO,MAAA,oBAA0B,OAAA;AAAA;AAAA,UAGlB,UAAA;EACf,SAAA;EACA,MAAA;EACA,OAAA;EACA,SAAA;EACA,OAAA;EACA,UAAA;AAAA;AAAA,UAGe,SAAA;EACf,GAAA,CAAI,KAAA,UAAe,MAAA,UAAgB,MAAA;EACnC,IAAA,EAAM,KAAA,uCAA4C,OAAA,UAAiB,OAAA,GAAU,UAAA;AAAA;AAAA,UAG9D,SAAA;EACf,MAAA;EACA,WAAA;EACA,MAAA;AAAA;AAAA,UAGe,YAAA;EACf,IAAA;EACA,KAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,UAGe,SAAA,SAAkB,SAAA;EACjC,OAAA;EACA,eAAA;EACA,MAAA,EAAQ,YAAA;AAAA;AAAA,UAGO,aAAA;EACf,IAAA,EAAM,SAAA;EACN,eAAA;AAAA;AAAA,UAGe,WAAA;EACf,IAAA;EACA,IAAA;EACA,OAAA,GAAU,kBAAA;EACV,OAAA,CAAQ,GAAA,EAAK,UAAA,EAAY,aAAA,eAA4B,OAAA,CAAQ,SAAA;AAAA;AAAA,UAG9C,cAAA;EACf,IAAA;EACA,OAAA;EACA,OAAA,CAAQ,GAAA,EAAK,UAAA,GAAa,OAAA;AAAA;AAAA,KAGhB,YAAA,GAAe,WAAA,GAAc,cAAA;AAAA,UAExB,eAAA;EACf,IAAA,EAAM,WAAA;EACN,KAAA,EAAO,YAAA;EACP,MAAA,EAAQ,GAAA,SAAY,WAAA;EACpB,MAAA,EAAQ,GAAA;EACR,YAAA,GAAe,GAAA;AAAA;AAAA,cAqCJ,WAAA;EAAA,QACH,eAAA;EAAA,QACA,kBAAA;EAAA,QACA,OAAA;EAER,OAAA,CAAQ,GAAA,EAAK,OAAA,GAAU,eAAA;EAAA,QAmDf,gBAAA;EAAA,QAOA,qBAAA;EAAA,QAWA,UAAA;EAAA,QA+MM,YAAA;EAAA,QA2SN,gBAAA;EAAA,QAWA,gBAAA;EAAA,QAYA,aAAA;EAAA,QAwBA,YAAA;EAAA,QAWA,kBAAA;EAAA,
|
|
1
|
+
{"version":3,"file":"compiler.d.mts","names":[],"sources":["../src/compiler.ts"],"mappings":";;;;UAOiB,aAAA;EACf,OAAA,GAAU,eAAA;EACV,WAAA,EAAa,aAAA;EACb,UAAA;AAAA;AAAA,iBAuBc,aAAA,CAAc,MAAA,WAAiB,aAAA;AAAA,UAgQ9B,WAAA;EACf,IAAA;EACA,OAAA;EACA,OAAA,GAAU,UAAA;AAAA;AAAA,UAGK,aAAA;EACf,MAAA,CAAO,KAAA,EAAO,WAAA;AAAA;AAAA,UAGC,UAAA;EACf,KAAA,EAAO,cAAA;EACP,IAAA,EAAM,GAAA;EACN,MAAA,EAAQ,SAAA;EACR,MAAA,GAAS,aAAA;AAAA;AAAA,UAGM,cAAA;EACf,IAAA,CAAK,IAAA,UAAc,KAAA,GAAQ,cAAA,eAA6B,OAAA;EACxD,KAAA,CAAM,IAAA,UAAc,IAAA;EACpB,OAAA,CAAQ,KAAA,UAAe,IAAA;EACvB,IAAA,EAAM,IAAA,UAAc,KAAA,aAAkB,MAAA,GAAS,MAAA,oBAA0B,OAAA;EACzE,KAAA,EAAO,MAAA,oBAA0B,OAAA;AAAA;AAAA,UAGlB,UAAA;EACf,SAAA;EACA,MAAA;EACA,OAAA;EACA,SAAA;EACA,OAAA;EACA,UAAA;AAAA;AAAA,UAGe,SAAA;EACf,GAAA,CAAI,KAAA,UAAe,MAAA,UAAgB,MAAA;EACnC,IAAA,EAAM,KAAA,uCAA4C,OAAA,UAAiB,OAAA,GAAU,UAAA;AAAA;AAAA,UAG9D,SAAA;EACf,MAAA;EACA,WAAA;EACA,MAAA;AAAA;AAAA,UAGe,YAAA;EACf,IAAA;EACA,KAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,UAGe,SAAA,SAAkB,SAAA;EACjC,OAAA;EACA,eAAA;EACA,MAAA,EAAQ,YAAA;AAAA;AAAA,UAGO,aAAA;EACf,IAAA,EAAM,SAAA;EACN,eAAA;AAAA;AAAA,UAGe,WAAA;EACf,IAAA;EACA,IAAA;EACA,OAAA,GAAU,kBAAA;EACV,OAAA,CAAQ,GAAA,EAAK,UAAA,EAAY,aAAA,eAA4B,OAAA,CAAQ,SAAA;AAAA;AAAA,UAG9C,cAAA;EACf,IAAA;EACA,OAAA;EACA,OAAA,CAAQ,GAAA,EAAK,UAAA,GAAa,OAAA;AAAA;AAAA,KAGhB,YAAA,GAAe,WAAA,GAAc,cAAA;AAAA,UAExB,eAAA;EACf,IAAA,EAAM,WAAA;EACN,KAAA,EAAO,YAAA;EACP,MAAA,EAAQ,GAAA,SAAY,WAAA;EACpB,MAAA,EAAQ,GAAA;EACR,YAAA,GAAe,GAAA;AAAA;AAAA,cAqCJ,WAAA;EAAA,QACH,eAAA;EAAA,QACA,kBAAA;EAAA,QACA,OAAA;EAER,OAAA,CAAQ,GAAA,EAAK,OAAA,GAAU,eAAA;EAAA,QAmDf,gBAAA;EAAA,QAOA,qBAAA;EAAA,QAWA,UAAA;EAAA,QA+MM,YAAA;EAAA,QA2SN,gBAAA;EAAA,QAWA,gBAAA;EAAA,QAYA,aAAA;EAAA,QAwBA,YAAA;EAAA,QAWA,kBAAA;EAAA,QA+CM,aAAA;AAAA"}
|
package/dist/compiler.mjs
CHANGED
|
@@ -779,6 +779,12 @@ var AshCompiler = class {
|
|
|
779
779
|
default: throw new Error(`Unknown operator: ${expr.op}`);
|
|
780
780
|
}
|
|
781
781
|
}
|
|
782
|
+
case "array_literal": return expr.elements.map((el) => this.evaluateExpression(el, item, variables));
|
|
783
|
+
case "object_literal": {
|
|
784
|
+
const obj = {};
|
|
785
|
+
for (const [key, valExpr] of Object.entries(expr.properties)) obj[key] = this.evaluateExpression(valExpr, item, variables);
|
|
786
|
+
return obj;
|
|
787
|
+
}
|
|
782
788
|
default: throw new Error(`Unknown expression kind: ${expr.kind}`);
|
|
783
789
|
}
|
|
784
790
|
}
|
package/dist/compiler.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.mjs","names":["durationMs","capPath","result"],"sources":["../src/compiler.ts"],"sourcesContent":["import type { Program, JobDeclaration, PipelineStage, WhereClause, FanoutExpression, OutputExpression, TopLevelStatement, QueryCondition, LetStatement, GroupByExpression, ActionExpression, Expression, MapExpression, RouteExpression, LookupExpression, ParamDeclaration, TriggerDeclaration } from \"./ast.js\";\nimport { AshLexer } from \"./lexer.js\";\nimport { AshParser } from \"./parser.js\";\nimport { checkPipelineTypes, checkProhibitedPatterns, checkAnnotations, checkJobCaps, typeErrorsToDiagnostics, compileErrorsToDiagnostics, annotationErrorsToDiagnostics, parseSyntaxError, parseCaps, hasCapFor } from \"./type-checker.js\";\nimport type { AshDiagnostic, CapEntry } from \"./type-checker.js\";\nimport { resolveActionParams, resolveTemplatePath } from \"./template.js\";\n\nexport interface CompileResult {\n program?: CompiledProgram;\n diagnostics: AshDiagnostic[];\n sourceHash?: string;\n}\n\nfunction fnv1aHash(str: string): string {\n let hash = 2166136261;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, 16777619) >>> 0;\n }\n return hash.toString(16).padStart(8, \"0\");\n}\n\nfunction collectActions(stages: PipelineStage[]): ActionExpression[] {\n const actions: ActionExpression[] = [];\n for (const stage of stages) {\n if (stage.kind === \"action\") actions.push(stage);\n else if (stage.kind === \"fanout\") {\n for (const branch of stage.branches) actions.push(...collectActions(branch));\n }\n }\n return actions;\n}\n\nexport function compileSource(source: string): CompileResult {\n const diagnostics: AshDiagnostic[] = [];\n const sourceHash = fnv1aHash(source);\n const lexer = new AshLexer();\n const parser = new AshParser();\n const compiler = new AshCompiler();\n\n // Lex\n let tokens;\n try {\n tokens = lexer.tokenize(source);\n } catch (e: any) {\n return { sourceHash, diagnostics: [parseSyntaxError(e.message ?? String(e))] };\n }\n\n // Parse\n let ast;\n try {\n ast = parser.parse(tokens);\n } catch (e: any) {\n return { sourceHash, diagnostics: [parseSyntaxError(e.message ?? String(e))] };\n }\n\n // Type check\n const prohibErrors = checkProhibitedPatterns(ast);\n diagnostics.push(...compileErrorsToDiagnostics(prohibErrors));\n\n for (const job of ast.jobs) {\n const typeErrors = checkPipelineTypes(job.pipeline);\n diagnostics.push(...typeErrorsToDiagnostics(typeErrors));\n\n const annErrors = checkAnnotations(job);\n diagnostics.push(...annotationErrorsToDiagnostics(annErrors));\n\n // @caps: static path security check\n diagnostics.push(...checkJobCaps(job));\n\n // @readonly check: pipeline must not contain save, publish, or tee\n const isReadonly = job.annotations.some(a => a.name === \"readonly\");\n if (isReadonly) {\n for (const stage of job.pipeline) {\n if (stage.kind === \"save\" || stage.kind === \"publish\" || stage.kind === \"tee\" || stage.kind === \"action\") {\n diagnostics.push({\n code: \"ASH_READONLY_VIOLATION\",\n message: `@readonly job '${job.name}' contains '${stage.kind}' which writes data`,\n });\n }\n }\n // Check route targets: @readonly must propagate to route-target jobs\n for (const stage of job.pipeline) {\n if (stage.kind === \"route\") {\n const targetNames = [...stage.branches.map(b => b.targetJob), ...(stage.fallback ? [stage.fallback] : [])];\n for (const targetName of targetNames) {\n const targetJob = ast.jobs.find(j => j.name === targetName);\n if (!targetJob) continue;\n for (const tStage of targetJob.pipeline) {\n if (tStage.kind === \"save\" || tStage.kind === \"publish\" || tStage.kind === \"tee\" || tStage.kind === \"action\") {\n diagnostics.push({\n code: \"ASH_READONLY_VIOLATION\",\n message: `@readonly job '${job.name}' routes to '${targetName}' which contains '${tStage.kind}' (write operation)`,\n });\n break; // one error per target is enough\n }\n }\n }\n }\n }\n }\n }\n\n // Let pipeline restrictions: writes in let bindings are never legitimate\n const WRITE_STAGES = new Set([\"save\", \"publish\", \"tee\", \"action\"]);\n const letStatements = ast.statements.filter((s): s is LetStatement => s.kind === \"let\" && !!s.pipeline);\n for (const letStmt of letStatements) {\n if (letStmt.pipeline) {\n for (const stage of letStmt.pipeline) {\n if (WRITE_STAGES.has(stage.kind)) {\n diagnostics.push({\n code: \"ASH_LET_WRITE\",\n message: `let '${letStmt.name}' pipeline contains '${stage.kind}' — write operations in let bindings are not permitted`,\n });\n }\n }\n }\n }\n\n // Let pipeline pre-approval bypass: let pipelines with find/action execute before @approval checks\n const hasApproval = ast.jobs.some(j => j.annotations.some(a => a.name === \"approval\"));\n if (hasApproval && letStatements.length > 0) {\n const sideEffectLets = letStatements.filter(s =>\n s.pipeline?.some(stage => stage.kind === \"find\" || stage.kind === \"action\"),\n );\n if (sideEffectLets.length > 0) {\n diagnostics.push({\n code: \"ASH_LET_PRE_APPROVAL\",\n severity: \"warning\",\n message: `let bindings (${sideEffectLets.map(s => s.name).join(\", \")}) execute before @approval checks — side effects in let pipelines bypass approval`,\n });\n }\n }\n\n // Param write-gate: $param in where clause before write operation = logic bomb risk\n const paramNames = new Set(ast.statements.filter((s): s is ParamDeclaration => s.kind === \"param\").map(s => s.name));\n if (paramNames.size > 0) {\n for (const job of ast.jobs) {\n const hasWrite = job.pipeline.some(s => WRITE_STAGES.has(s.kind));\n if (!hasWrite) continue;\n for (const stage of job.pipeline) {\n if (stage.kind === \"where\" && typeof stage.right === \"string\" && stage.right.startsWith(\"$\")) {\n const varName = stage.right.slice(1);\n if (paramNames.has(varName)) {\n diagnostics.push({\n code: \"ASH_PARAM_WRITE_GATE\",\n severity: \"warning\",\n message: `Job '${job.name}': param '$${varName}' gates write operations — callers can override param to change behavior`,\n });\n break; // one warning per job\n }\n }\n }\n }\n }\n\n // Mixed annotation deception check: @readonly jobs alongside unrestricted write jobs\n const readonlyJobs = ast.jobs.filter(j => j.annotations.some(a => a.name === \"readonly\"));\n if (readonlyJobs.length > 0 && readonlyJobs.length < ast.jobs.length) {\n const nonReadonly = ast.jobs.filter(j => !j.annotations.some(a => a.name === \"readonly\"));\n const writingJobs = nonReadonly.filter(j =>\n j.pipeline.some(s => s.kind === \"save\" || s.kind === \"publish\" || s.kind === \"tee\" || s.kind === \"action\"),\n );\n if (writingJobs.length > 0) {\n diagnostics.push({\n code: \"ASH_MIXED_SECURITY\",\n severity: \"warning\",\n message: `Program has mixed security posture: ${readonlyJobs.length} @readonly job(s) alongside ${writingJobs.length} unrestricted writing job(s) (${writingJobs.map(j => j.name).join(\", \")}) — this can mask malicious intent`,\n });\n }\n }\n\n // Action hardening: uncapped, amplification (caps+budget gated), cross-provider (caps+budget gated)\n for (const job of ast.jobs) {\n const actions = collectActions(job.pipeline);\n if (actions.length === 0) continue;\n\n const hasCaps = job.annotations.some(a => a.name === \"caps\");\n const hasBudget = job.annotations.some(a => a.name === \"budget\");\n\n // No @caps + action → error (actions require explicit capability declaration)\n if (!hasCaps) {\n diagnostics.push({\n code: \"ASH_UNCAPPED_ACTION\",\n message: `Job '${job.name}' contains action stages but has no @caps — actions require explicit capability declaration`,\n });\n }\n\n // Multiple actions → caps+budget gated\n if (actions.length > 1) {\n if (hasCaps && hasBudget) {\n diagnostics.push({\n code: \"ASH_ACTION_AMPLIFICATION\",\n severity: \"warning\",\n message: `Job '${job.name}' contains ${actions.length} action stages — budget-gated multi-action execution permitted`,\n });\n } else {\n diagnostics.push({\n code: \"ASH_ACTION_AMPLIFICATION\",\n message: `Job '${job.name}' contains ${actions.length} action stages — multi-action jobs require @caps and @budget to prevent amplification attacks`,\n });\n }\n }\n\n // Actions targeting multiple providers → caps+budget gated\n const providers = new Set(actions.filter(a => !a.relative).map(a => a.path.split(\"/\")[1]).filter(Boolean));\n if (providers.size > 1) {\n if (hasCaps && hasBudget) {\n diagnostics.push({\n code: \"ASH_CROSS_PROVIDER_ACTION\",\n severity: \"warning\",\n message: `Job '${job.name}' has actions targeting ${providers.size} providers (${[...providers].join(\", \")}) — budget-gated cross-provider execution permitted`,\n });\n } else {\n diagnostics.push({\n code: \"ASH_CROSS_PROVIDER_ACTION\",\n message: `Job '${job.name}' has actions targeting ${providers.size} providers (${[...providers].join(\", \")}) — cross-provider actions require @caps and @budget`,\n });\n }\n }\n\n // Relative action checks\n const relativeActions = actions.filter(a => a.relative);\n if (relativeActions.length > 0) {\n // Relative action without upstream find → error\n const hasFindUpstream = job.pipeline.some((s, idx) =>\n s.kind === \"find\" && job.pipeline.findIndex(p => p === relativeActions[0]) > idx\n );\n if (!hasFindUpstream) {\n diagnostics.push({\n code: \"ASH_RELATIVE_ACTION_NO_FIND\",\n message: `Job '${job.name}': relative action '${relativeActions[0].path}' has no upstream 'find' — relative actions require a find stage to provide records with paths`,\n });\n }\n\n // Relative action = inherent amplification (1 stage, N execs)\n if (hasCaps && hasBudget) {\n diagnostics.push({\n code: \"ASH_ACTION_AMPLIFICATION\",\n severity: \"warning\",\n message: `Job '${job.name}': relative action '${relativeActions[0].path}' executes per-record — budget-gated amplification permitted`,\n });\n } else if (!hasCaps || !hasBudget) {\n diagnostics.push({\n code: \"ASH_ACTION_AMPLIFICATION\",\n message: `Job '${job.name}': relative action '${relativeActions[0].path}' executes per-record — requires @caps and @budget to prevent amplification`,\n });\n }\n }\n }\n\n // Write operation hardening: publish and tee require @caps\n for (const job of ast.jobs) {\n const hasCaps = job.annotations.some(a => a.name === \"caps\");\n const hasFind = job.pipeline.some(s => s.kind === \"find\" || s.kind === \"lookup\");\n const writeStages = job.pipeline.filter(s => s.kind === \"publish\" || s.kind === \"tee\");\n\n if (writeStages.length > 0 && hasFind && !hasCaps) {\n for (const ws of writeStages) {\n diagnostics.push({\n code: \"ASH_UNCAPPED_WRITE\",\n message: `Job '${job.name}': '${ws.kind}' combined with data reads requires @caps — write operations on external data must declare capabilities`,\n });\n }\n }\n }\n\n // Budget ceiling: reject unreasonably high budget values\n const BUDGET_CEILINGS: Record<string, number> = { actions: 100, writes: 100, records: 10000 };\n for (const job of ast.jobs) {\n const budgetAnn = job.annotations.find(a => a.name === \"budget\");\n if (!budgetAnn) continue;\n for (let i = 0; i < budgetAnn.args.length; i += 2) {\n const dim = budgetAnn.args[i];\n const val = Number(budgetAnn.args[i + 1]);\n if (dim in BUDGET_CEILINGS && val > BUDGET_CEILINGS[dim]) {\n diagnostics.push({\n code: \"ASH_BUDGET_EXCESSIVE\",\n message: `Job '${job.name}': @budget(${dim} ${val}) exceeds ceiling of ${BUDGET_CEILINGS[dim]} — reduce budget or justify with explicit approval`,\n });\n }\n }\n }\n\n // Compile\n const program = compiler.compile(ast);\n return { program, diagnostics, sourceHash };\n}\n\nexport interface OutputEvent {\n kind: \"text\";\n content: string;\n context?: LogContext;\n}\n\nexport interface OutputHandler {\n output(event: OutputEvent): void;\n}\n\nexport interface JobContext {\n world: WorldInterface;\n caps: Set<string>;\n logger: JobLogger;\n output?: OutputHandler;\n}\n\nexport interface WorldInterface {\n read(path: string, query?: QueryCondition): unknown[] | Promise<unknown[]>;\n write(path: string, data: unknown[]): void;\n publish(topic: string, data: unknown[]): void;\n exec?(path: string, input: unknown[], params?: Record<string, unknown>): Promise<unknown[]>;\n input?(prompt: string): string | Promise<string>;\n}\n\nexport interface LogContext {\n programId?: string;\n procId?: string;\n agentId?: string;\n sessionId?: string;\n jobName?: string;\n stageIndex?: number;\n}\n\nexport interface JobLogger {\n log(stage: string, action: string, detail?: unknown): void;\n emit?(level: \"debug\" | \"info\" | \"warn\" | \"error\", message: string, context?: LogContext): void;\n}\n\nexport interface JobResult {\n status: \"ok\" | \"error\" | \"partial\";\n recordCount: number;\n errors: string[];\n}\n\nexport interface StageMetrics {\n name: string;\n index: number;\n inputCount: number;\n outputCount: number;\n durationMs: number;\n error?: string;\n}\n\nexport interface JobReport extends JobResult {\n jobName: string;\n totalDurationMs: number;\n stages: StageMetrics[];\n}\n\nexport interface ProgramReport {\n jobs: JobReport[];\n totalDurationMs: number;\n}\n\nexport interface CompiledJob {\n kind: \"job\";\n name: string;\n trigger?: TriggerDeclaration;\n execute(ctx: JobContext, initialStream?: unknown[]): Promise<JobResult>;\n}\n\nexport interface CompiledOutput {\n kind: \"output\";\n message: string;\n execute(ctx: JobContext): Promise<void>;\n}\n\nexport type CompiledUnit = CompiledJob | CompiledOutput;\n\nexport interface CompiledProgram {\n jobs: CompiledJob[];\n units: CompiledUnit[];\n jobMap: Map<string, CompiledJob>;\n params: Map<string, string | number>; // param defaults (can be overridden before execution)\n routeTargets?: Set<string>; // jobs that are ONLY route targets (should not auto-execute as top-level)\n}\n\nfunction safeOutput(ctx: JobContext, content: string, logContext?: LogContext): void {\n if (ctx.output) {\n try {\n ctx.output.output({ kind: \"text\", content, context: logContext });\n } catch {\n // Output fault must not crash pipeline\n }\n }\n safeEmit(ctx.logger, \"info\", content, logContext);\n}\n\nfunction safeEmit(logger: JobLogger, level: \"debug\" | \"info\" | \"warn\" | \"error\", message: string, context?: LogContext): void {\n if (logger.emit) {\n try {\n logger.emit(level, message, context);\n } catch {\n // Log fault must not crash pipeline (INVARIANT: emit failure is silent)\n }\n }\n}\n\n/**\n * Strict equality with boolean coercion only.\n * No string fallback (prevents type confusion like 0 == \"0\").\n * Boolean coercion: true/\"true\" and false/\"false\" are equal.\n */\nfunction strictEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n // Boolean coercion: \"true\" matches true, \"false\" matches false\n if (typeof a === \"boolean\" && typeof b === \"string\") return a === (b === \"true\");\n if (typeof b === \"boolean\" && typeof a === \"string\") return b === (a === \"true\");\n return false;\n}\n\nexport class AshCompiler {\n private _currentJobName?: string;\n private _currentStageIndex?: number;\n private _jobMap = new Map<string, CompiledJob>();\n\n compile(ast: Program): CompiledProgram {\n // Collect param defaults\n const params = new Map<string, string | number>();\n for (const stmt of ast.statements) {\n if (stmt.kind === \"param\") {\n params.set(stmt.name, stmt.defaultValue);\n }\n }\n\n // Collect static let bindings (params first, then lets override)\n const variables = new Map<string, string | number>(params);\n const runtimeLets: LetStatement[] = [];\n for (const stmt of ast.statements) {\n if (stmt.kind === \"let\") {\n if (stmt.pipeline) {\n runtimeLets.push(stmt);\n } else {\n variables.set(stmt.name, stmt.value);\n }\n }\n }\n\n const units: CompiledUnit[] = ast.statements\n .filter((s): s is Exclude<TopLevelStatement, LetStatement | ParamDeclaration> => s.kind !== \"let\" && s.kind !== \"param\")\n .map((stmt) => this.compileStatement(stmt, variables, runtimeLets));\n const jobs = units.filter((u): u is CompiledJob => u.kind === \"job\");\n const jobMap = new Map<string, CompiledJob>();\n for (const job of jobs) jobMap.set(job.name, job);\n this._jobMap = jobMap;\n\n // Identify route-target-only jobs: jobs referenced by route stages but with no trigger\n const routeTargetNames = new Set<string>();\n const triggeredJobs = new Set<string>();\n for (const job of ast.jobs) {\n if (job.trigger) triggeredJobs.add(job.name);\n for (const stage of job.pipeline) {\n if (stage.kind === \"route\") {\n for (const branch of stage.branches) {\n routeTargetNames.add(branch.targetJob);\n }\n if (stage.fallback) routeTargetNames.add(stage.fallback);\n }\n }\n }\n // Exclude triggered jobs — they have independent execution reasons\n for (const name of triggeredJobs) routeTargetNames.delete(name);\n const routeTargets = routeTargetNames.size > 0 ? routeTargetNames : undefined;\n\n return { jobs, units, jobMap, params, routeTargets };\n }\n\n private compileStatement(stmt: Exclude<TopLevelStatement, LetStatement | ParamDeclaration>, variables: Map<string, string | number>, runtimeLets: LetStatement[] = []): CompiledUnit {\n if (stmt.kind === \"output\") {\n return this.compileTopLevelOutput(stmt);\n }\n return this.compileJob(stmt, variables, runtimeLets);\n }\n\n private compileTopLevelOutput(output: OutputExpression): CompiledOutput {\n return {\n kind: \"output\",\n message: output.message,\n execute: async (ctx: JobContext): Promise<void> => {\n ctx.logger.log(\"output\", \"output\", { message: output.message });\n safeOutput(ctx, output.message);\n },\n };\n }\n\n private compileJob(job: JobDeclaration, variables: Map<string, string | number> = new Map(), runtimeLets: LetStatement[] = []): CompiledJob {\n const stages = job.pipeline;\n const annotations = job.annotations;\n\n // Extract annotation configs\n const retryAnn = annotations.find(a => a.name === \"retry\");\n const timeoutAnn = annotations.find(a => a.name === \"timeout\");\n const onErrorAnn = annotations.find(a => a.name === \"on_error\");\n const budgetAnn = annotations.find(a => a.name === \"budget\");\n const retryCount = retryAnn ? (retryAnn.args.length > 0 ? Number(retryAnn.args[0]) : 3) : 0;\n const timeoutMs = timeoutAnn ? (timeoutAnn.args.length > 0 ? Number(timeoutAnn.args[0]) : 0) : 0;\n const onErrorStrategy = onErrorAnn?.args[0] as \"skip\" | \"save\" | \"fail\" | undefined;\n const onErrorPath = onErrorStrategy === \"save\" ? onErrorAnn?.args[1] : undefined;\n\n // Parse budget limits\n const budgetLimits: Record<string, number> = {};\n if (budgetAnn) {\n for (let i = 0; i < budgetAnn.args.length; i += 2) {\n budgetLimits[budgetAnn.args[i]] = Number(budgetAnn.args[i + 1]);\n }\n }\n\n // Parse @caps for runtime enforcement (script-declared caps are authoritative)\n const capsAnns = annotations.filter(a => a.name === \"caps\");\n const scriptCaps: CapEntry[] = [];\n for (const ann of capsAnns) {\n if (ann.args.length > 0 && ann.args.length % 2 === 0) {\n scriptCaps.push(...parseCaps(ann));\n }\n }\n\n const self = this;\n\n const runOnce = async (ctx: JobContext, initialStream?: unknown[]): Promise<JobReport> => {\n const errors: string[] = [];\n const jobInitialStream = initialStream ?? [];\n let stream: unknown[] = [...jobInitialStream];\n const stageMetrics: StageMetrics[] = [];\n const jobStart = performance.now();\n const budgetUsed = { actions: 0, writes: 0, records: 0, tokens: 0, cost: 0 };\n const checkBudget = (dim: string, increment: number) => {\n if (!(dim in budgetLimits)) return;\n (budgetUsed as any)[dim] += increment;\n if ((budgetUsed as any)[dim] > budgetLimits[dim]) {\n throw new Error(`budget exceeded: ${dim} used ${(budgetUsed as any)[dim]}, limit ${budgetLimits[dim]}`);\n }\n };\n\n // Runtime caps enforcement: if script declares @caps, enforce them with glob matching.\n // Script-declared caps are the ceiling — ctx.caps (caller-provided) cannot widen them.\n const checkCap = (op: CapEntry[\"op\"], path: string): void => {\n if (scriptCaps.length > 0 && !hasCapFor(scriptCaps, op, path)) {\n throw new Error(`Permission denied: @caps does not allow ${op} '${path}'`);\n }\n };\n\n // Resolve runtime lets\n const runtimeVars = new Map(variables);\n for (const rtLet of runtimeLets) {\n if (rtLet.pipeline) {\n try {\n let rtStream: unknown[] = [];\n for (const stage of rtLet.pipeline) {\n rtStream = await self.executeStage(stage, rtStream, ctx, errors, runtimeVars);\n }\n // Bind the result: if single object with a numeric/string value, extract it\n if (rtStream.length === 1 && typeof rtStream[0] === \"object\" && rtStream[0] !== null) {\n const obj = rtStream[0] as Record<string, unknown>;\n const keys = Object.keys(obj);\n if (keys.length === 1) {\n const val = obj[keys[0]];\n if (typeof val === \"number\" || typeof val === \"string\") {\n runtimeVars.set(rtLet.name, val);\n continue;\n }\n }\n }\n // Fallback: use length or first value\n if (rtStream.length === 1) {\n const v = rtStream[0];\n if (typeof v === \"number\" || typeof v === \"string\") {\n runtimeVars.set(rtLet.name, v);\n } else {\n runtimeVars.set(rtLet.name, rtStream.length);\n }\n } else {\n runtimeVars.set(rtLet.name, rtStream.length);\n }\n } catch (e: any) {\n errors.push(`Runtime let '${rtLet.name}' failed: ${e.message ?? String(e)}`);\n return { status: \"error\", recordCount: 0, errors, jobName: job.name, totalDurationMs: performance.now() - jobStart, stages: stageMetrics };\n }\n }\n }\n\n for (let i = 0; i < stages.length; i++) {\n const stage = stages[i];\n const inputCount = stream.length;\n const stageStart = performance.now();\n self._currentJobName = job.name;\n self._currentStageIndex = i;\n try {\n // Skip absolute actions on empty downstream stream (not first stage).\n // \"action as source\" (i === 0) still executes — it generates data from nothing.\n // Relative actions already skip naturally (for-of loop over empty stream).\n if (stage.kind === \"action\" && !stage.relative && i > 0 && stream.length === 0) {\n const durationMs = performance.now() - stageStart;\n ctx.logger.log(stage.kind, \"skip\", { reason: \"empty-stream\" });\n safeEmit(ctx.logger, \"debug\", `${stage.kind} skip (empty stream)`, { jobName: job.name, stageIndex: i });\n stageMetrics.push({ name: stage.kind, index: i, inputCount, outputCount: 0, durationMs });\n continue;\n }\n ctx.logger.log(stage.kind, \"enter\", { recordCount: stream.length });\n safeEmit(ctx.logger, \"debug\", `${stage.kind} enter`, { jobName: job.name, stageIndex: i });\n stream = await self.executeStage(stage, stream, ctx, errors, runtimeVars, checkBudget, checkCap, jobInitialStream);\n // Budget checks after stage execution\n // Relative actions are checked per-record inside executeStage; only check absolute actions here\n // Absolute actions with inline params also check per-record inside executeStage\n const hasInlineParams = stage.kind === \"action\" && !stage.relative &&\n stage.params && Object.keys(stage.params).length > 0;\n if (stage.kind === \"action\" && !stage.relative && !hasInlineParams) checkBudget(\"actions\", 1);\n if (stage.kind === \"save\" || stage.kind === \"publish\" || stage.kind === \"tee\") checkBudget(\"writes\", 1);\n checkBudget(\"records\", stream.length);\n const durationMs = performance.now() - stageStart;\n ctx.logger.log(stage.kind, \"exit\", { recordCount: stream.length });\n safeEmit(ctx.logger, \"debug\", `${stage.kind} exit`, { jobName: job.name, stageIndex: i });\n stageMetrics.push({ name: stage.kind, index: i, inputCount, outputCount: stream.length, durationMs });\n } catch (e: any) {\n const durationMs = performance.now() - stageStart;\n const errMsg = e.message ?? String(e);\n errors.push(errMsg);\n\n if (onErrorStrategy === \"skip\") {\n // Skip: log error, continue with remaining stream\n stageMetrics.push({ name: stage.kind, index: i, inputCount, outputCount: stream.length, durationMs, error: errMsg });\n continue;\n } else if (onErrorStrategy === \"save\" && onErrorPath) {\n // Save: write failed items to error path\n try {\n ctx.world.write(onErrorPath, stream.map(item => ({ _error: errMsg, _item: item })));\n } catch {\n errors.push(`Failed to write errors to ${onErrorPath}`);\n }\n stageMetrics.push({ name: stage.kind, index: i, inputCount, outputCount: stream.length, durationMs, error: errMsg });\n continue;\n }\n\n // Default (fail): terminate\n stageMetrics.push({ name: stage.kind, index: i, inputCount, outputCount: stream.length, durationMs, error: errMsg });\n return { status: \"error\", recordCount: stream.length, errors, jobName: job.name, totalDurationMs: performance.now() - jobStart, stages: stageMetrics };\n }\n }\n\n return {\n status: errors.length > 0 ? \"partial\" : \"ok\",\n recordCount: stream.length,\n errors,\n jobName: job.name,\n totalDurationMs: performance.now() - jobStart,\n stages: stageMetrics,\n };\n };\n\n const runWithTimeout = async (ctx: JobContext, initialStream?: unknown[]): Promise<JobResult> => {\n if (timeoutMs <= 0) return runOnce(ctx, initialStream);\n return Promise.race([\n runOnce(ctx, initialStream),\n new Promise<JobResult>((_, reject) =>\n setTimeout(() => reject(new Error(`Timeout: job exceeded ${timeoutMs}ms`)), timeoutMs)\n ),\n ]);\n };\n\n return {\n kind: \"job\",\n name: job.name,\n trigger: job.trigger,\n execute: async (ctx: JobContext, initialStream?: unknown[]): Promise<JobResult> => {\n if (retryCount <= 0 && !retryAnn) {\n // No retry annotation at all\n return runWithTimeout(ctx, initialStream);\n }\n\n const maxAttempts = retryCount > 0 ? retryCount : 1;\n const allErrors: string[] = [];\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const result = await runWithTimeout(ctx, initialStream);\n if (result.status !== \"error\") return result;\n allErrors.push(...result.errors);\n // If last attempt, return error\n if (attempt === maxAttempts - 1) return { status: \"error\", recordCount: result.recordCount, errors: allErrors };\n // Backoff (in tests we don't actually wait)\n } catch (e: any) {\n allErrors.push(e.message ?? String(e));\n if (attempt === maxAttempts - 1) {\n return { status: \"error\", recordCount: 0, errors: allErrors };\n }\n }\n }\n\n return { status: \"error\", recordCount: 0, errors: allErrors };\n },\n };\n }\n\n private async executeStage(stage: PipelineStage, stream: unknown[], ctx: JobContext, errors: string[], variables: Map<string, string | number> = new Map(), budgetCheck?: (dim: string, increment: number) => void, capCheck?: (op: CapEntry[\"op\"], path: string) => void, initialStream?: unknown[]): Promise<unknown[]> {\n switch (stage.kind) {\n case \"find\": {\n // Resolve template path from stream context (e.g. find /msgs/${data.messageId})\n let findPath = stage.path;\n if (findPath.includes(\"${\") && stream.length > 0) {\n const rec = (typeof stream[0] === \"object\" && stream[0] !== null ? stream[0] : {}) as Record<string, unknown>;\n findPath = resolveTemplatePath(findPath, rec);\n }\n\n // Runtime @caps enforcement (script-declared caps)\n if (capCheck) capCheck(\"read\", findPath);\n const capPath = findPath.split(\"/\").slice(0, 3).join(\"/\");\n if (ctx.caps.size > 0 && !ctx.caps.has(capPath) && !ctx.caps.has(\"*\")) {\n throw new Error(`Permission denied: cannot read '${findPath}'`);\n }\n try {\n const query = stage.query ? this.resolveQueryVars(stage.query, variables) : undefined;\n let result = await ctx.world.read(findPath, query);\n // Fallback: if world.read ignores query, apply in-memory filter\n if (query && result.length > 0) {\n result = result.filter((item) => {\n try {\n return this.evaluateWhere(\n { kind: \"where\", left: query!.field, op: query!.op, right: query!.value },\n item,\n );\n } catch {\n return false;\n }\n });\n }\n return result;\n } catch {\n return []; // non-existent path → empty stream\n }\n }\n\n case \"where\": {\n // Resolve $variable references in where clause\n const resolvedStage = this.resolveWhereVars(stage, variables);\n return stream.filter((item) => {\n try {\n return this.evaluateWhere(resolvedStage, item);\n } catch {\n return false; // missing field → skip\n }\n });\n }\n\n case \"map\": {\n // System fields that map cannot overwrite (identity fields from AFS nodes)\n const IMMUTABLE_FIELDS = [\"path\", \"kind\"];\n\n const preserveSystemFields = (original: unknown, mapped: Record<string, unknown>): Record<string, unknown> => {\n if (typeof original === \"object\" && original !== null) {\n for (const field of IMMUTABLE_FIELDS) {\n if (field in (original as Record<string, unknown>)) {\n mapped[field] = (original as Record<string, unknown>)[field];\n }\n }\n }\n return mapped;\n };\n\n if (stage.exprMappings) {\n return stream.map((item) => {\n const result: Record<string, unknown> = {};\n for (const [key, expr] of Object.entries(stage.exprMappings!)) {\n result[key] = this.evaluateExpression(expr, item, variables);\n }\n return preserveSystemFields(item, result);\n });\n }\n if (stage.expression) {\n return stream.map((item) => this.evaluateExpression(stage.expression!, item, variables));\n }\n if (stage.mappings) {\n return stream.map((item) => {\n const result: Record<string, unknown> = {};\n for (const [key, field] of Object.entries(stage.mappings!)) {\n result[key] = this.resolveField(item, field);\n }\n return preserveSystemFields(item, result);\n });\n }\n return stream.map((item) => this.resolveField(item, stage.field));\n }\n\n case \"save\": {\n // Runtime @caps enforcement (script-declared caps)\n if (capCheck) capCheck(\"write\", stage.path);\n const capPath = stage.path.split(\"/\").slice(0, 3).join(\"/\");\n if (ctx.caps.size > 0 && !ctx.caps.has(capPath) && !ctx.caps.has(\"*\")) {\n errors.push(`Permission denied: cannot write '${stage.path}'`);\n return stream;\n }\n ctx.world.write(stage.path, stream);\n return [];\n }\n\n case \"publish\": {\n // Runtime @caps enforcement (script-declared caps)\n if (capCheck) capCheck(\"write\", stage.path);\n const capPath = stage.path.split(\"/\").slice(0, 3).join(\"/\");\n if (ctx.caps.size > 0 && !ctx.caps.has(capPath) && !ctx.caps.has(\"*\")) {\n errors.push(`Permission denied: cannot publish '${stage.path}'`);\n return stream;\n }\n ctx.world.publish(stage.path, stream);\n return [];\n }\n\n case \"tee\": {\n // Runtime @caps enforcement (script-declared caps)\n if (capCheck) capCheck(\"write\", stage.path);\n try {\n ctx.world.write(stage.path, [...stream]);\n } catch (e: any) {\n errors.push(`tee side-write failed: ${e.message}`);\n // Main pipeline continues\n }\n return stream;\n }\n\n case \"fanout\": {\n return await this.executeFanout(stage, stream, ctx, errors, variables, budgetCheck, capCheck, initialStream);\n }\n\n case \"output\": {\n if (stage.expression) {\n // Expression mode: evaluate per stream item, emit each result as text\n for (const item of stream) {\n const val = this.evaluateExpression(stage.expression, item, variables);\n const text = val == null ? \"\" : String(val);\n ctx.logger.log(\"output\", \"output\", { message: text, streamSize: stream.length });\n safeOutput(ctx, text, { jobName: this._currentJobName, stageIndex: this._currentStageIndex });\n }\n } else {\n ctx.logger.log(\"output\", \"output\", { message: stage.message, streamSize: stream.length });\n safeOutput(ctx, stage.message, { jobName: this._currentJobName, stageIndex: this._currentStageIndex });\n }\n return stream; // pass-through\n }\n\n case \"input\": {\n ctx.logger.log(\"input\", \"prompt\", { prompt: stage.prompt });\n const response = ctx.world.input\n ? await ctx.world.input(stage.prompt)\n : \"\";\n return [{ prompt: stage.prompt, response }];\n }\n\n case \"count\": {\n return [{ count: stream.length }];\n }\n\n case \"group-by\": {\n const groups = new Map<unknown, unknown[]>();\n for (const item of stream) {\n const key = this.resolveField(item, stage.field);\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(item);\n }\n return Array.from(groups.entries()).map(([key, items]) => ({ key, items }));\n }\n\n case \"route\": {\n // Dispatch items to target jobs based on field value\n const buckets = new Map<string, unknown[]>();\n for (const item of stream) {\n const val = String(this.resolveField(item, stage.field) ?? \"\");\n const branch = stage.branches.find(b => b.value === val);\n const targetJob = branch ? branch.targetJob : stage.fallback;\n if (targetJob) {\n if (!buckets.has(targetJob)) buckets.set(targetJob, []);\n buckets.get(targetJob)!.push(item);\n }\n // If no match and no fallback, item is dropped (silently)\n }\n // Execute each target job with its bucket as initial stream\n for (const [jobName, items] of buckets) {\n const compiled = this._jobMap.get(jobName);\n if (!compiled) {\n errors.push(`Route target job '${jobName}' not found`);\n continue;\n }\n await compiled.execute(ctx, items);\n }\n return []; // route is terminal\n }\n\n case \"lookup\": {\n // Left join: read lookup source, build index by joinKey, merge into stream items\n const lookupData = await ctx.world.read(stage.path);\n const index = new Map<string, unknown>();\n for (const item of lookupData) {\n const key = String(this.resolveField(item, stage.joinKey) ?? \"\");\n if (!index.has(key)) index.set(key, item);\n }\n return stream.map((item) => {\n const key = String(this.resolveField(item, stage.joinKey) ?? \"\");\n const match = index.get(key);\n if (match && typeof match === \"object\" && match !== null && typeof item === \"object\" && item !== null) {\n return { ...match, ...item }; // item fields take precedence\n }\n return item; // LEFT JOIN: unmatched items preserved\n });\n }\n\n case \"action\": {\n if (!ctx.world.exec) {\n throw new Error(`WorldInterface.exec not available — cannot execute action '${stage.path}'`);\n }\n\n const hasParams = stage.params && Object.keys(stage.params).length > 0;\n const hasTemplatePath = stage.path.includes(\"${\");\n\n if (stage.relative) {\n // Per-record relative action: resolve path from each record\n const results: unknown[] = [];\n for (const record of stream) {\n // Pre-check budget before each execution\n if (budgetCheck) budgetCheck(\"actions\", 1);\n if (typeof record !== \"object\" || record === null || !(\"path\" in record)) {\n throw new Error(`Relative action '${stage.path}' requires records with a 'path' field`);\n }\n const recordPath = String((record as Record<string, unknown>).path);\n const fullPath = recordPath + \"/.actions/\" + stage.path;\n // Runtime caps enforcement: verify resolved path against @caps (glob-aware)\n if (capCheck) capCheck(\"exec\", fullPath);\n const capPath = fullPath.split(\"/\").slice(0, 3).join(\"/\");\n if (ctx.caps.size > 0 && !ctx.caps.has(capPath) && !ctx.caps.has(\"*\")) {\n throw new Error(`Permission denied: cannot exec '${fullPath}'`);\n }\n const rec = record as Record<string, unknown>;\n // New merge model: if inline params exist, resolve templates and pass ONLY params (no stream merge)\n const resolvedParams = hasParams ? resolveActionParams(stage.params as Record<string, unknown>, rec) : undefined;\n const input = hasParams ? [] : [record];\n const result = await ctx.world.exec(fullPath, input, resolvedParams);\n if (result != null) {\n if (Array.isArray(result)) results.push(...result);\n else results.push(result);\n }\n }\n return results;\n }\n\n // Absolute action — with inline params or template path: per-record execution\n if (hasParams || hasTemplatePath) {\n const results: unknown[] = [];\n const records = stream.length > 0 ? stream : [{}];\n // Path templates resolve from initial stream (trigger event / job context)\n // Params templates resolve from current stream record\n const initialRec = (initialStream && initialStream.length > 0\n && typeof initialStream[0] === \"object\" && initialStream[0] !== null)\n ? initialStream[0] as Record<string, unknown>\n : undefined;\n for (const record of records) {\n if (budgetCheck) budgetCheck(\"actions\", 1);\n const rec = (typeof record === \"object\" && record !== null ? record : {}) as Record<string, unknown>;\n // Path: prefer initial stream record (event context), fall back to current stream record\n const pathRec = initialRec ?? rec;\n const resolvedPath = hasTemplatePath ? resolveTemplatePath(stage.path, pathRec) : stage.path;\n // Caps check on resolved path\n if (capCheck) capCheck(\"exec\", resolvedPath);\n const capPath = resolvedPath.split(\"/\").slice(0, 3).join(\"/\");\n if (ctx.caps.size > 0 && !ctx.caps.has(capPath) && !ctx.caps.has(\"*\")) {\n throw new Error(`Permission denied: cannot exec '${resolvedPath}'`);\n }\n const resolvedParams = hasParams ? resolveActionParams(stage.params as Record<string, unknown>, rec) : undefined;\n const input = hasParams ? [] : [record];\n const result = await ctx.world.exec(resolvedPath, input, resolvedParams);\n if (result != null) {\n if (Array.isArray(result)) results.push(...result);\n else results.push(result);\n }\n }\n return results;\n }\n\n // No params, no template path — passthrough (backward compatible)\n // Runtime @caps enforcement (script-declared caps)\n if (capCheck) capCheck(\"exec\", stage.path);\n const capPath = stage.path.split(\"/\").slice(0, 3).join(\"/\");\n if (ctx.caps.size > 0 && !ctx.caps.has(capPath) && !ctx.caps.has(\"*\")) {\n throw new Error(`Permission denied: cannot exec '${stage.path}'`);\n }\n const result = await ctx.world.exec(stage.path, stream, undefined);\n if (result == null) return [];\n if (!Array.isArray(result)) return [result];\n return result;\n }\n\n default:\n throw new Error(`Unknown stage kind: ${(stage as any).kind}`);\n }\n }\n\n private resolveQueryVars(query: QueryCondition, variables: Map<string, string | number>): QueryCondition {\n if (typeof query.value === \"string\" && /^\\$[a-zA-Z_]\\w*$/.test(query.value)) {\n const varName = query.value.slice(1);\n if (!variables.has(varName)) {\n throw new Error(`Undefined variable: $${varName}`);\n }\n return { ...query, value: variables.get(varName)! };\n }\n return query;\n }\n\n private resolveWhereVars(clause: WhereClause, variables: Map<string, string | number>): WhereClause {\n // Only resolve $varName pattern ($ followed by identifier chars only)\n if (typeof clause.right === \"string\" && /^\\$[a-zA-Z_]\\w*$/.test(clause.right)) {\n const varName = clause.right.slice(1);\n if (!variables.has(varName)) {\n throw new Error(`Undefined variable: $${varName}`);\n }\n return { ...clause, right: variables.get(varName)! };\n }\n return clause;\n }\n\n private evaluateWhere(clause: WhereClause, item: unknown): boolean {\n const left = this.resolveField(item, clause.left);\n const right = clause.right;\n\n switch (clause.op) {\n case \"==\": return strictEqual(left, right);\n case \"!=\": return !strictEqual(left, right);\n case \">\":\n case \"<\":\n case \">=\":\n case \"<=\": {\n const l = Number(left);\n const r = Number(right);\n // NaN or Infinity in comparisons → reject (safety: non-finite values should not pass guards)\n if (!Number.isFinite(l) || !Number.isFinite(r)) return false;\n if (clause.op === \">\") return l > r;\n if (clause.op === \"<\") return l < r;\n if (clause.op === \">=\") return l >= r;\n return l <= r;\n }\n default: return false;\n }\n }\n\n private resolveField(item: unknown, field: string): unknown {\n const parts = field.split(\".\");\n let current: any = item;\n for (const part of parts) {\n if (current == null) return undefined;\n if (typeof current !== \"object\" || !Object.hasOwn(current, part)) return undefined;\n current = current[part];\n }\n return current;\n }\n\n private evaluateExpression(expr: Expression, item: unknown, variables: Map<string, string | number>): unknown {\n switch (expr.kind) {\n case \"literal\":\n return expr.value;\n case \"field_access\":\n return this.resolveField(item, expr.path);\n case \"var_ref\": {\n if (!variables.has(expr.name)) {\n throw new Error(`Undefined variable: $${expr.name}`);\n }\n return variables.get(expr.name)!;\n }\n case \"binary\": {\n const left = this.evaluateExpression(expr.left, item, variables);\n const right = this.evaluateExpression(expr.right, item, variables);\n switch (expr.op) {\n case \"+\":\n // String concat if either side is string\n if (typeof left === \"string\" || typeof right === \"string\") {\n return String(left ?? \"\") + String(right ?? \"\");\n }\n return Number(left) + Number(right);\n case \"-\":\n return Number(left) - Number(right);\n case \"*\":\n return Number(left) * Number(right);\n case \"/\":\n return Number(left) / Number(right);\n default:\n throw new Error(`Unknown operator: ${(expr as any).op}`);\n }\n }\n default:\n throw new Error(`Unknown expression kind: ${(expr as any).kind}`);\n }\n }\n\n private async executeFanout(stage: FanoutExpression, stream: unknown[], ctx: JobContext, errors: string[], variables: Map<string, string | number> = new Map(), budgetCheck?: (dim: string, increment: number) => void, capCheck?: (op: CapEntry[\"op\"], path: string) => void, initialStream?: unknown[]): Promise<unknown[]> {\n const results: unknown[][] = [];\n for (const branch of stage.branches) {\n let branchStream = [...stream];\n try {\n for (const branchStage of branch) {\n branchStream = await this.executeStage(branchStage, branchStream, ctx, errors, variables, budgetCheck, capCheck, initialStream);\n }\n results.push(branchStream);\n } catch (e: any) {\n errors.push(`fanout branch failed: ${e.message}`);\n }\n }\n // Return merged results from all successful branches\n return results.flat();\n }\n}\n"],"mappings":";;;;;;AAaA,SAAS,UAAU,KAAqB;CACtC,IAAI,OAAO;AACX,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAQ,IAAI,WAAW,EAAE;AACzB,SAAO,KAAK,KAAK,MAAM,SAAS,KAAK;;AAEvC,QAAO,KAAK,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI;;AAG3C,SAAS,eAAe,QAA6C;CACnE,MAAM,UAA8B,EAAE;AACtC,MAAK,MAAM,SAAS,OAClB,KAAI,MAAM,SAAS,SAAU,SAAQ,KAAK,MAAM;UACvC,MAAM,SAAS,SACtB,MAAK,MAAM,UAAU,MAAM,SAAU,SAAQ,KAAK,GAAG,eAAe,OAAO,CAAC;AAGhF,QAAO;;AAGT,SAAgB,cAAc,QAA+B;CAC3D,MAAM,cAA+B,EAAE;CACvC,MAAM,aAAa,UAAU,OAAO;CACpC,MAAM,QAAQ,IAAI,UAAU;CAC5B,MAAM,SAAS,IAAI,WAAW;CAC9B,MAAM,WAAW,IAAI,aAAa;CAGlC,IAAI;AACJ,KAAI;AACF,WAAS,MAAM,SAAS,OAAO;UACxB,GAAQ;AACf,SAAO;GAAE;GAAY,aAAa,CAAC,iBAAiB,EAAE,WAAW,OAAO,EAAE,CAAC,CAAC;GAAE;;CAIhF,IAAI;AACJ,KAAI;AACF,QAAM,OAAO,MAAM,OAAO;UACnB,GAAQ;AACf,SAAO;GAAE;GAAY,aAAa,CAAC,iBAAiB,EAAE,WAAW,OAAO,EAAE,CAAC,CAAC;GAAE;;CAIhF,MAAM,eAAe,wBAAwB,IAAI;AACjD,aAAY,KAAK,GAAG,2BAA2B,aAAa,CAAC;AAE7D,MAAK,MAAM,OAAO,IAAI,MAAM;EAC1B,MAAM,aAAa,mBAAmB,IAAI,SAAS;AACnD,cAAY,KAAK,GAAG,wBAAwB,WAAW,CAAC;EAExD,MAAM,YAAY,iBAAiB,IAAI;AACvC,cAAY,KAAK,GAAG,8BAA8B,UAAU,CAAC;AAG7D,cAAY,KAAK,GAAG,aAAa,IAAI,CAAC;AAItC,MADmB,IAAI,YAAY,MAAK,MAAK,EAAE,SAAS,WAAW,EACnD;AACd,QAAK,MAAM,SAAS,IAAI,SACtB,KAAI,MAAM,SAAS,UAAU,MAAM,SAAS,aAAa,MAAM,SAAS,SAAS,MAAM,SAAS,SAC9F,aAAY,KAAK;IACf,MAAM;IACN,SAAS,kBAAkB,IAAI,KAAK,cAAc,MAAM,KAAK;IAC9D,CAAC;AAIN,QAAK,MAAM,SAAS,IAAI,SACtB,KAAI,MAAM,SAAS,SAAS;IAC1B,MAAM,cAAc,CAAC,GAAG,MAAM,SAAS,KAAI,MAAK,EAAE,UAAU,EAAE,GAAI,MAAM,WAAW,CAAC,MAAM,SAAS,GAAG,EAAE,CAAE;AAC1G,SAAK,MAAM,cAAc,aAAa;KACpC,MAAM,YAAY,IAAI,KAAK,MAAK,MAAK,EAAE,SAAS,WAAW;AAC3D,SAAI,CAAC,UAAW;AAChB,UAAK,MAAM,UAAU,UAAU,SAC7B,KAAI,OAAO,SAAS,UAAU,OAAO,SAAS,aAAa,OAAO,SAAS,SAAS,OAAO,SAAS,UAAU;AAC5G,kBAAY,KAAK;OACf,MAAM;OACN,SAAS,kBAAkB,IAAI,KAAK,eAAe,WAAW,oBAAoB,OAAO,KAAK;OAC/F,CAAC;AACF;;;;;;CAUd,MAAM,eAAe,IAAI,IAAI;EAAC;EAAQ;EAAW;EAAO;EAAS,CAAC;CAClE,MAAM,gBAAgB,IAAI,WAAW,QAAQ,MAAyB,EAAE,SAAS,SAAS,CAAC,CAAC,EAAE,SAAS;AACvG,MAAK,MAAM,WAAW,cACpB,KAAI,QAAQ,UACV;OAAK,MAAM,SAAS,QAAQ,SAC1B,KAAI,aAAa,IAAI,MAAM,KAAK,CAC9B,aAAY,KAAK;GACf,MAAM;GACN,SAAS,QAAQ,QAAQ,KAAK,uBAAuB,MAAM,KAAK;GACjE,CAAC;;AAQV,KADoB,IAAI,KAAK,MAAK,MAAK,EAAE,YAAY,MAAK,MAAK,EAAE,SAAS,WAAW,CAAC,IACnE,cAAc,SAAS,GAAG;EAC3C,MAAM,iBAAiB,cAAc,QAAO,MAC1C,EAAE,UAAU,MAAK,UAAS,MAAM,SAAS,UAAU,MAAM,SAAS,SAAS,CAC5E;AACD,MAAI,eAAe,SAAS,EAC1B,aAAY,KAAK;GACf,MAAM;GACN,UAAU;GACV,SAAS,iBAAiB,eAAe,KAAI,MAAK,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC;GACtE,CAAC;;CAKN,MAAM,aAAa,IAAI,IAAI,IAAI,WAAW,QAAQ,MAA6B,EAAE,SAAS,QAAQ,CAAC,KAAI,MAAK,EAAE,KAAK,CAAC;AACpH,KAAI,WAAW,OAAO,EACpB,MAAK,MAAM,OAAO,IAAI,MAAM;AAE1B,MAAI,CADa,IAAI,SAAS,MAAK,MAAK,aAAa,IAAI,EAAE,KAAK,CAAC,CAClD;AACf,OAAK,MAAM,SAAS,IAAI,SACtB,KAAI,MAAM,SAAS,WAAW,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,WAAW,IAAI,EAAE;GAC5F,MAAM,UAAU,MAAM,MAAM,MAAM,EAAE;AACpC,OAAI,WAAW,IAAI,QAAQ,EAAE;AAC3B,gBAAY,KAAK;KACf,MAAM;KACN,UAAU;KACV,SAAS,QAAQ,IAAI,KAAK,aAAa,QAAQ;KAChD,CAAC;AACF;;;;CAQV,MAAM,eAAe,IAAI,KAAK,QAAO,MAAK,EAAE,YAAY,MAAK,MAAK,EAAE,SAAS,WAAW,CAAC;AACzF,KAAI,aAAa,SAAS,KAAK,aAAa,SAAS,IAAI,KAAK,QAAQ;EAEpE,MAAM,cADc,IAAI,KAAK,QAAO,MAAK,CAAC,EAAE,YAAY,MAAK,MAAK,EAAE,SAAS,WAAW,CAAC,CACzD,QAAO,MACrC,EAAE,SAAS,MAAK,MAAK,EAAE,SAAS,UAAU,EAAE,SAAS,aAAa,EAAE,SAAS,SAAS,EAAE,SAAS,SAAS,CAC3G;AACD,MAAI,YAAY,SAAS,EACvB,aAAY,KAAK;GACf,MAAM;GACN,UAAU;GACV,SAAS,uCAAuC,aAAa,OAAO,8BAA8B,YAAY,OAAO,gCAAgC,YAAY,KAAI,MAAK,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC;GAC9L,CAAC;;AAKN,MAAK,MAAM,OAAO,IAAI,MAAM;EAC1B,MAAM,UAAU,eAAe,IAAI,SAAS;AAC5C,MAAI,QAAQ,WAAW,EAAG;EAE1B,MAAM,UAAU,IAAI,YAAY,MAAK,MAAK,EAAE,SAAS,OAAO;EAC5D,MAAM,YAAY,IAAI,YAAY,MAAK,MAAK,EAAE,SAAS,SAAS;AAGhE,MAAI,CAAC,QACH,aAAY,KAAK;GACf,MAAM;GACN,SAAS,QAAQ,IAAI,KAAK;GAC3B,CAAC;AAIJ,MAAI,QAAQ,SAAS,EACnB,KAAI,WAAW,UACb,aAAY,KAAK;GACf,MAAM;GACN,UAAU;GACV,SAAS,QAAQ,IAAI,KAAK,aAAa,QAAQ,OAAO;GACvD,CAAC;MAEF,aAAY,KAAK;GACf,MAAM;GACN,SAAS,QAAQ,IAAI,KAAK,aAAa,QAAQ,OAAO;GACvD,CAAC;EAKN,MAAM,YAAY,IAAI,IAAI,QAAQ,QAAO,MAAK,CAAC,EAAE,SAAS,CAAC,KAAI,MAAK,EAAE,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,QAAQ,CAAC;AAC1G,MAAI,UAAU,OAAO,EACnB,KAAI,WAAW,UACb,aAAY,KAAK;GACf,MAAM;GACN,UAAU;GACV,SAAS,QAAQ,IAAI,KAAK,0BAA0B,UAAU,KAAK,cAAc,CAAC,GAAG,UAAU,CAAC,KAAK,KAAK,CAAC;GAC5G,CAAC;MAEF,aAAY,KAAK;GACf,MAAM;GACN,SAAS,QAAQ,IAAI,KAAK,0BAA0B,UAAU,KAAK,cAAc,CAAC,GAAG,UAAU,CAAC,KAAK,KAAK,CAAC;GAC5G,CAAC;EAKN,MAAM,kBAAkB,QAAQ,QAAO,MAAK,EAAE,SAAS;AACvD,MAAI,gBAAgB,SAAS,GAAG;AAK9B,OAAI,CAHoB,IAAI,SAAS,MAAM,GAAG,QAC5C,EAAE,SAAS,UAAU,IAAI,SAAS,WAAU,MAAK,MAAM,gBAAgB,GAAG,GAAG,IAC9E,CAEC,aAAY,KAAK;IACf,MAAM;IACN,SAAS,QAAQ,IAAI,KAAK,sBAAsB,gBAAgB,GAAG,KAAK;IACzE,CAAC;AAIJ,OAAI,WAAW,UACb,aAAY,KAAK;IACf,MAAM;IACN,UAAU;IACV,SAAS,QAAQ,IAAI,KAAK,sBAAsB,gBAAgB,GAAG,KAAK;IACzE,CAAC;YACO,CAAC,WAAW,CAAC,UACtB,aAAY,KAAK;IACf,MAAM;IACN,SAAS,QAAQ,IAAI,KAAK,sBAAsB,gBAAgB,GAAG,KAAK;IACzE,CAAC;;;AAMR,MAAK,MAAM,OAAO,IAAI,MAAM;EAC1B,MAAM,UAAU,IAAI,YAAY,MAAK,MAAK,EAAE,SAAS,OAAO;EAC5D,MAAM,UAAU,IAAI,SAAS,MAAK,MAAK,EAAE,SAAS,UAAU,EAAE,SAAS,SAAS;EAChF,MAAM,cAAc,IAAI,SAAS,QAAO,MAAK,EAAE,SAAS,aAAa,EAAE,SAAS,MAAM;AAEtF,MAAI,YAAY,SAAS,KAAK,WAAW,CAAC,QACxC,MAAK,MAAM,MAAM,YACf,aAAY,KAAK;GACf,MAAM;GACN,SAAS,QAAQ,IAAI,KAAK,MAAM,GAAG,KAAK;GACzC,CAAC;;CAMR,MAAM,kBAA0C;EAAE,SAAS;EAAK,QAAQ;EAAK,SAAS;EAAO;AAC7F,MAAK,MAAM,OAAO,IAAI,MAAM;EAC1B,MAAM,YAAY,IAAI,YAAY,MAAK,MAAK,EAAE,SAAS,SAAS;AAChE,MAAI,CAAC,UAAW;AAChB,OAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAAK,QAAQ,KAAK,GAAG;GACjD,MAAM,MAAM,UAAU,KAAK;GAC3B,MAAM,MAAM,OAAO,UAAU,KAAK,IAAI,GAAG;AACzC,OAAI,OAAO,mBAAmB,MAAM,gBAAgB,KAClD,aAAY,KAAK;IACf,MAAM;IACN,SAAS,QAAQ,IAAI,KAAK,aAAa,IAAI,GAAG,IAAI,uBAAuB,gBAAgB,KAAK;IAC/F,CAAC;;;AAOR,QAAO;EAAE,SADO,SAAS,QAAQ,IAAI;EACnB;EAAa;EAAY;;AA2F7C,SAAS,WAAW,KAAiB,SAAiB,YAA+B;AACnF,KAAI,IAAI,OACN,KAAI;AACF,MAAI,OAAO,OAAO;GAAE,MAAM;GAAQ;GAAS,SAAS;GAAY,CAAC;SAC3D;AAIV,UAAS,IAAI,QAAQ,QAAQ,SAAS,WAAW;;AAGnD,SAAS,SAAS,QAAmB,OAA4C,SAAiB,SAA4B;AAC5H,KAAI,OAAO,KACT,KAAI;AACF,SAAO,KAAK,OAAO,SAAS,QAAQ;SAC9B;;;;;;;AAWZ,SAAS,YAAY,GAAY,GAAqB;AACpD,KAAI,MAAM,EAAG,QAAO;AAEpB,KAAI,OAAO,MAAM,aAAa,OAAO,MAAM,SAAU,QAAO,OAAO,MAAM;AACzE,KAAI,OAAO,MAAM,aAAa,OAAO,MAAM,SAAU,QAAO,OAAO,MAAM;AACzE,QAAO;;AAGT,IAAa,cAAb,MAAyB;CACvB,AAAQ;CACR,AAAQ;CACR,AAAQ,0BAAU,IAAI,KAA0B;CAEhD,QAAQ,KAA+B;EAErC,MAAM,yBAAS,IAAI,KAA8B;AACjD,OAAK,MAAM,QAAQ,IAAI,WACrB,KAAI,KAAK,SAAS,QAChB,QAAO,IAAI,KAAK,MAAM,KAAK,aAAa;EAK5C,MAAM,YAAY,IAAI,IAA6B,OAAO;EAC1D,MAAM,cAA8B,EAAE;AACtC,OAAK,MAAM,QAAQ,IAAI,WACrB,KAAI,KAAK,SAAS,MAChB,KAAI,KAAK,SACP,aAAY,KAAK,KAAK;MAEtB,WAAU,IAAI,KAAK,MAAM,KAAK,MAAM;EAK1C,MAAM,QAAwB,IAAI,WAC/B,QAAQ,MAAwE,EAAE,SAAS,SAAS,EAAE,SAAS,QAAQ,CACvH,KAAK,SAAS,KAAK,iBAAiB,MAAM,WAAW,YAAY,CAAC;EACrE,MAAM,OAAO,MAAM,QAAQ,MAAwB,EAAE,SAAS,MAAM;EACpE,MAAM,yBAAS,IAAI,KAA0B;AAC7C,OAAK,MAAM,OAAO,KAAM,QAAO,IAAI,IAAI,MAAM,IAAI;AACjD,OAAK,UAAU;EAGf,MAAM,mCAAmB,IAAI,KAAa;EAC1C,MAAM,gCAAgB,IAAI,KAAa;AACvC,OAAK,MAAM,OAAO,IAAI,MAAM;AAC1B,OAAI,IAAI,QAAS,eAAc,IAAI,IAAI,KAAK;AAC5C,QAAK,MAAM,SAAS,IAAI,SACtB,KAAI,MAAM,SAAS,SAAS;AAC1B,SAAK,MAAM,UAAU,MAAM,SACzB,kBAAiB,IAAI,OAAO,UAAU;AAExC,QAAI,MAAM,SAAU,kBAAiB,IAAI,MAAM,SAAS;;;AAK9D,OAAK,MAAM,QAAQ,cAAe,kBAAiB,OAAO,KAAK;AAG/D,SAAO;GAAE;GAAM;GAAO;GAAQ;GAAQ,cAFjB,iBAAiB,OAAO,IAAI,mBAAmB;GAEhB;;CAGtD,AAAQ,iBAAiB,MAAmE,WAAyC,cAA8B,EAAE,EAAgB;AACnL,MAAI,KAAK,SAAS,SAChB,QAAO,KAAK,sBAAsB,KAAK;AAEzC,SAAO,KAAK,WAAW,MAAM,WAAW,YAAY;;CAGtD,AAAQ,sBAAsB,QAA0C;AACtE,SAAO;GACL,MAAM;GACN,SAAS,OAAO;GAChB,SAAS,OAAO,QAAmC;AACjD,QAAI,OAAO,IAAI,UAAU,UAAU,EAAE,SAAS,OAAO,SAAS,CAAC;AAC/D,eAAW,KAAK,OAAO,QAAQ;;GAElC;;CAGH,AAAQ,WAAW,KAAqB,4BAA0C,IAAI,KAAK,EAAE,cAA8B,EAAE,EAAe;EAC1I,MAAM,SAAS,IAAI;EACnB,MAAM,cAAc,IAAI;EAGxB,MAAM,WAAW,YAAY,MAAK,MAAK,EAAE,SAAS,QAAQ;EAC1D,MAAM,aAAa,YAAY,MAAK,MAAK,EAAE,SAAS,UAAU;EAC9D,MAAM,aAAa,YAAY,MAAK,MAAK,EAAE,SAAS,WAAW;EAC/D,MAAM,YAAY,YAAY,MAAK,MAAK,EAAE,SAAS,SAAS;EAC5D,MAAM,aAAa,WAAY,SAAS,KAAK,SAAS,IAAI,OAAO,SAAS,KAAK,GAAG,GAAG,IAAK;EAC1F,MAAM,YAAY,aAAc,WAAW,KAAK,SAAS,IAAI,OAAO,WAAW,KAAK,GAAG,GAAG,IAAK;EAC/F,MAAM,kBAAkB,YAAY,KAAK;EACzC,MAAM,cAAc,oBAAoB,SAAS,YAAY,KAAK,KAAK;EAGvE,MAAM,eAAuC,EAAE;AAC/C,MAAI,UACF,MAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAAK,QAAQ,KAAK,EAC9C,cAAa,UAAU,KAAK,MAAM,OAAO,UAAU,KAAK,IAAI,GAAG;EAKnE,MAAM,WAAW,YAAY,QAAO,MAAK,EAAE,SAAS,OAAO;EAC3D,MAAM,aAAyB,EAAE;AACjC,OAAK,MAAM,OAAO,SAChB,KAAI,IAAI,KAAK,SAAS,KAAK,IAAI,KAAK,SAAS,MAAM,EACjD,YAAW,KAAK,GAAG,UAAU,IAAI,CAAC;EAItC,MAAM,OAAO;EAEb,MAAM,UAAU,OAAO,KAAiB,kBAAkD;GACxF,MAAM,SAAmB,EAAE;GAC3B,MAAM,mBAAmB,iBAAiB,EAAE;GAC5C,IAAI,SAAoB,CAAC,GAAG,iBAAiB;GAC7C,MAAM,eAA+B,EAAE;GACvC,MAAM,WAAW,YAAY,KAAK;GAClC,MAAM,aAAa;IAAE,SAAS;IAAG,QAAQ;IAAG,SAAS;IAAG,QAAQ;IAAG,MAAM;IAAG;GAC5E,MAAM,eAAe,KAAa,cAAsB;AACtD,QAAI,EAAE,OAAO,cAAe;AAC5B,IAAC,WAAmB,QAAQ;AAC5B,QAAK,WAAmB,OAAO,aAAa,KAC1C,OAAM,IAAI,MAAM,oBAAoB,IAAI,QAAS,WAAmB,KAAK,UAAU,aAAa,OAAO;;GAM3G,MAAM,YAAY,IAAoB,SAAuB;AAC3D,QAAI,WAAW,SAAS,KAAK,CAAC,UAAU,YAAY,IAAI,KAAK,CAC3D,OAAM,IAAI,MAAM,2CAA2C,GAAG,IAAI,KAAK,GAAG;;GAK9E,MAAM,cAAc,IAAI,IAAI,UAAU;AACtC,QAAK,MAAM,SAAS,YAClB,KAAI,MAAM,SACR,KAAI;IACF,IAAI,WAAsB,EAAE;AAC5B,SAAK,MAAM,SAAS,MAAM,SACxB,YAAW,MAAM,KAAK,aAAa,OAAO,UAAU,KAAK,QAAQ,YAAY;AAG/E,QAAI,SAAS,WAAW,KAAK,OAAO,SAAS,OAAO,YAAY,SAAS,OAAO,MAAM;KACpF,MAAM,MAAM,SAAS;KACrB,MAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,SAAI,KAAK,WAAW,GAAG;MACrB,MAAM,MAAM,IAAI,KAAK;AACrB,UAAI,OAAO,QAAQ,YAAY,OAAO,QAAQ,UAAU;AACtD,mBAAY,IAAI,MAAM,MAAM,IAAI;AAChC;;;;AAKN,QAAI,SAAS,WAAW,GAAG;KACzB,MAAM,IAAI,SAAS;AACnB,SAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SACxC,aAAY,IAAI,MAAM,MAAM,EAAE;SAE9B,aAAY,IAAI,MAAM,MAAM,SAAS,OAAO;UAG9C,aAAY,IAAI,MAAM,MAAM,SAAS,OAAO;YAEvC,GAAQ;AACf,WAAO,KAAK,gBAAgB,MAAM,KAAK,YAAY,EAAE,WAAW,OAAO,EAAE,GAAG;AAC5E,WAAO;KAAE,QAAQ;KAAS,aAAa;KAAG;KAAQ,SAAS,IAAI;KAAM,iBAAiB,YAAY,KAAK,GAAG;KAAU,QAAQ;KAAc;;AAKhJ,QAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;IACtC,MAAM,QAAQ,OAAO;IACrB,MAAM,aAAa,OAAO;IAC1B,MAAM,aAAa,YAAY,KAAK;AACpC,SAAK,kBAAkB,IAAI;AAC3B,SAAK,qBAAqB;AAC1B,QAAI;AAIF,SAAI,MAAM,SAAS,YAAY,CAAC,MAAM,YAAY,IAAI,KAAK,OAAO,WAAW,GAAG;MAC9E,MAAMA,eAAa,YAAY,KAAK,GAAG;AACvC,UAAI,OAAO,IAAI,MAAM,MAAM,QAAQ,EAAE,QAAQ,gBAAgB,CAAC;AAC9D,eAAS,IAAI,QAAQ,SAAS,GAAG,MAAM,KAAK,uBAAuB;OAAE,SAAS,IAAI;OAAM,YAAY;OAAG,CAAC;AACxG,mBAAa,KAAK;OAAE,MAAM,MAAM;OAAM,OAAO;OAAG;OAAY,aAAa;OAAG;OAAY,CAAC;AACzF;;AAEF,SAAI,OAAO,IAAI,MAAM,MAAM,SAAS,EAAE,aAAa,OAAO,QAAQ,CAAC;AACnE,cAAS,IAAI,QAAQ,SAAS,GAAG,MAAM,KAAK,SAAS;MAAE,SAAS,IAAI;MAAM,YAAY;MAAG,CAAC;AAC1F,cAAS,MAAM,KAAK,aAAa,OAAO,QAAQ,KAAK,QAAQ,aAAa,aAAa,UAAU,iBAAiB;KAIlH,MAAM,kBAAkB,MAAM,SAAS,YAAY,CAAC,MAAM,YACxD,MAAM,UAAU,OAAO,KAAK,MAAM,OAAO,CAAC,SAAS;AACrD,SAAI,MAAM,SAAS,YAAY,CAAC,MAAM,YAAY,CAAC,gBAAiB,aAAY,WAAW,EAAE;AAC7F,SAAI,MAAM,SAAS,UAAU,MAAM,SAAS,aAAa,MAAM,SAAS,MAAO,aAAY,UAAU,EAAE;AACvG,iBAAY,WAAW,OAAO,OAAO;KACrC,MAAM,aAAa,YAAY,KAAK,GAAG;AACvC,SAAI,OAAO,IAAI,MAAM,MAAM,QAAQ,EAAE,aAAa,OAAO,QAAQ,CAAC;AAClE,cAAS,IAAI,QAAQ,SAAS,GAAG,MAAM,KAAK,QAAQ;MAAE,SAAS,IAAI;MAAM,YAAY;MAAG,CAAC;AACzF,kBAAa,KAAK;MAAE,MAAM,MAAM;MAAM,OAAO;MAAG;MAAY,aAAa,OAAO;MAAQ;MAAY,CAAC;aAC9F,GAAQ;KACf,MAAM,aAAa,YAAY,KAAK,GAAG;KACvC,MAAM,SAAS,EAAE,WAAW,OAAO,EAAE;AACrC,YAAO,KAAK,OAAO;AAEnB,SAAI,oBAAoB,QAAQ;AAE9B,mBAAa,KAAK;OAAE,MAAM,MAAM;OAAM,OAAO;OAAG;OAAY,aAAa,OAAO;OAAQ;OAAY,OAAO;OAAQ,CAAC;AACpH;gBACS,oBAAoB,UAAU,aAAa;AAEpD,UAAI;AACF,WAAI,MAAM,MAAM,aAAa,OAAO,KAAI,UAAS;QAAE,QAAQ;QAAQ,OAAO;QAAM,EAAE,CAAC;cAC7E;AACN,cAAO,KAAK,6BAA6B,cAAc;;AAEzD,mBAAa,KAAK;OAAE,MAAM,MAAM;OAAM,OAAO;OAAG;OAAY,aAAa,OAAO;OAAQ;OAAY,OAAO;OAAQ,CAAC;AACpH;;AAIF,kBAAa,KAAK;MAAE,MAAM,MAAM;MAAM,OAAO;MAAG;MAAY,aAAa,OAAO;MAAQ;MAAY,OAAO;MAAQ,CAAC;AACpH,YAAO;MAAE,QAAQ;MAAS,aAAa,OAAO;MAAQ;MAAQ,SAAS,IAAI;MAAM,iBAAiB,YAAY,KAAK,GAAG;MAAU,QAAQ;MAAc;;;AAI1J,UAAO;IACL,QAAQ,OAAO,SAAS,IAAI,YAAY;IACxC,aAAa,OAAO;IACpB;IACA,SAAS,IAAI;IACb,iBAAiB,YAAY,KAAK,GAAG;IACrC,QAAQ;IACT;;EAGH,MAAM,iBAAiB,OAAO,KAAiB,kBAAkD;AAC/F,OAAI,aAAa,EAAG,QAAO,QAAQ,KAAK,cAAc;AACtD,UAAO,QAAQ,KAAK,CAClB,QAAQ,KAAK,cAAc,EAC3B,IAAI,SAAoB,GAAG,WACzB,iBAAiB,uBAAO,IAAI,MAAM,yBAAyB,UAAU,IAAI,CAAC,EAAE,UAAU,CACvF,CACF,CAAC;;AAGJ,SAAO;GACL,MAAM;GACN,MAAM,IAAI;GACV,SAAS,IAAI;GACb,SAAS,OAAO,KAAiB,kBAAkD;AACjF,QAAI,cAAc,KAAK,CAAC,SAEtB,QAAO,eAAe,KAAK,cAAc;IAG3C,MAAM,cAAc,aAAa,IAAI,aAAa;IAClD,MAAM,YAAsB,EAAE;AAE9B,SAAK,IAAI,UAAU,GAAG,UAAU,aAAa,UAC3C,KAAI;KACF,MAAM,SAAS,MAAM,eAAe,KAAK,cAAc;AACvD,SAAI,OAAO,WAAW,QAAS,QAAO;AACtC,eAAU,KAAK,GAAG,OAAO,OAAO;AAEhC,SAAI,YAAY,cAAc,EAAG,QAAO;MAAE,QAAQ;MAAS,aAAa,OAAO;MAAa,QAAQ;MAAW;aAExG,GAAQ;AACf,eAAU,KAAK,EAAE,WAAW,OAAO,EAAE,CAAC;AACtC,SAAI,YAAY,cAAc,EAC5B,QAAO;MAAE,QAAQ;MAAS,aAAa;MAAG,QAAQ;MAAW;;AAKnE,WAAO;KAAE,QAAQ;KAAS,aAAa;KAAG,QAAQ;KAAW;;GAEhE;;CAGH,MAAc,aAAa,OAAsB,QAAmB,KAAiB,QAAkB,4BAA0C,IAAI,KAAK,EAAE,aAAwD,UAAuD,eAA+C;AACxT,UAAQ,MAAM,MAAd;GACE,KAAK,QAAQ;IAEX,IAAI,WAAW,MAAM;AACrB,QAAI,SAAS,SAAS,KAAK,IAAI,OAAO,SAAS,GAAG;KAChD,MAAM,MAAO,OAAO,OAAO,OAAO,YAAY,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE;AACjF,gBAAW,oBAAoB,UAAU,IAAI;;AAI/C,QAAI,SAAU,UAAS,QAAQ,SAAS;IACxC,MAAM,UAAU,SAAS,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;AACzD,QAAI,IAAI,KAAK,OAAO,KAAK,CAAC,IAAI,KAAK,IAAI,QAAQ,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CACnE,OAAM,IAAI,MAAM,mCAAmC,SAAS,GAAG;AAEjE,QAAI;KACF,MAAM,QAAQ,MAAM,QAAQ,KAAK,iBAAiB,MAAM,OAAO,UAAU,GAAG;KAC5E,IAAI,SAAS,MAAM,IAAI,MAAM,KAAK,UAAU,MAAM;AAElD,SAAI,SAAS,OAAO,SAAS,EAC3B,UAAS,OAAO,QAAQ,SAAS;AAC/B,UAAI;AACF,cAAO,KAAK,cACV;QAAE,MAAM;QAAS,MAAM,MAAO;QAAO,IAAI,MAAO;QAAI,OAAO,MAAO;QAAO,EACzE,KACD;cACK;AACN,cAAO;;OAET;AAEJ,YAAO;YACD;AACN,YAAO,EAAE;;;GAIb,KAAK,SAAS;IAEZ,MAAM,gBAAgB,KAAK,iBAAiB,OAAO,UAAU;AAC7D,WAAO,OAAO,QAAQ,SAAS;AAC7B,SAAI;AACF,aAAO,KAAK,cAAc,eAAe,KAAK;aACxC;AACN,aAAO;;MAET;;GAGJ,KAAK,OAAO;IAEV,MAAM,mBAAmB,CAAC,QAAQ,OAAO;IAEzC,MAAM,wBAAwB,UAAmB,WAA6D;AAC5G,SAAI,OAAO,aAAa,YAAY,aAAa,MAC/C;WAAK,MAAM,SAAS,iBAClB,KAAI,SAAU,SACZ,QAAO,SAAU,SAAqC;;AAI5D,YAAO;;AAGT,QAAI,MAAM,aACR,QAAO,OAAO,KAAK,SAAS;KAC1B,MAAM,SAAkC,EAAE;AAC1C,UAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,MAAM,aAAc,CAC3D,QAAO,OAAO,KAAK,mBAAmB,MAAM,MAAM,UAAU;AAE9D,YAAO,qBAAqB,MAAM,OAAO;MACzC;AAEJ,QAAI,MAAM,WACR,QAAO,OAAO,KAAK,SAAS,KAAK,mBAAmB,MAAM,YAAa,MAAM,UAAU,CAAC;AAE1F,QAAI,MAAM,SACR,QAAO,OAAO,KAAK,SAAS;KAC1B,MAAM,SAAkC,EAAE;AAC1C,UAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,SAAU,CACxD,QAAO,OAAO,KAAK,aAAa,MAAM,MAAM;AAE9C,YAAO,qBAAqB,MAAM,OAAO;MACzC;AAEJ,WAAO,OAAO,KAAK,SAAS,KAAK,aAAa,MAAM,MAAM,MAAM,CAAC;;GAGnE,KAAK,QAAQ;AAEX,QAAI,SAAU,UAAS,SAAS,MAAM,KAAK;IAC3C,MAAM,UAAU,MAAM,KAAK,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;AAC3D,QAAI,IAAI,KAAK,OAAO,KAAK,CAAC,IAAI,KAAK,IAAI,QAAQ,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,EAAE;AACrE,YAAO,KAAK,oCAAoC,MAAM,KAAK,GAAG;AAC9D,YAAO;;AAET,QAAI,MAAM,MAAM,MAAM,MAAM,OAAO;AACnC,WAAO,EAAE;;GAGX,KAAK,WAAW;AAEd,QAAI,SAAU,UAAS,SAAS,MAAM,KAAK;IAC3C,MAAM,UAAU,MAAM,KAAK,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;AAC3D,QAAI,IAAI,KAAK,OAAO,KAAK,CAAC,IAAI,KAAK,IAAI,QAAQ,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,EAAE;AACrE,YAAO,KAAK,sCAAsC,MAAM,KAAK,GAAG;AAChE,YAAO;;AAET,QAAI,MAAM,QAAQ,MAAM,MAAM,OAAO;AACrC,WAAO,EAAE;;GAGX,KAAK;AAEH,QAAI,SAAU,UAAS,SAAS,MAAM,KAAK;AAC3C,QAAI;AACF,SAAI,MAAM,MAAM,MAAM,MAAM,CAAC,GAAG,OAAO,CAAC;aACjC,GAAQ;AACf,YAAO,KAAK,0BAA0B,EAAE,UAAU;;AAGpD,WAAO;GAGT,KAAK,SACH,QAAO,MAAM,KAAK,cAAc,OAAO,QAAQ,KAAK,QAAQ,WAAW,aAAa,UAAU,cAAc;GAG9G,KAAK;AACH,QAAI,MAAM,WAER,MAAK,MAAM,QAAQ,QAAQ;KACzB,MAAM,MAAM,KAAK,mBAAmB,MAAM,YAAY,MAAM,UAAU;KACtE,MAAM,OAAO,OAAO,OAAO,KAAK,OAAO,IAAI;AAC3C,SAAI,OAAO,IAAI,UAAU,UAAU;MAAE,SAAS;MAAM,YAAY,OAAO;MAAQ,CAAC;AAChF,gBAAW,KAAK,MAAM;MAAE,SAAS,KAAK;MAAiB,YAAY,KAAK;MAAoB,CAAC;;SAE1F;AACL,SAAI,OAAO,IAAI,UAAU,UAAU;MAAE,SAAS,MAAM;MAAS,YAAY,OAAO;MAAQ,CAAC;AACzF,gBAAW,KAAK,MAAM,SAAS;MAAE,SAAS,KAAK;MAAiB,YAAY,KAAK;MAAoB,CAAC;;AAExG,WAAO;GAGT,KAAK,SAAS;AACZ,QAAI,OAAO,IAAI,SAAS,UAAU,EAAE,QAAQ,MAAM,QAAQ,CAAC;IAC3D,MAAM,WAAW,IAAI,MAAM,QACvB,MAAM,IAAI,MAAM,MAAM,MAAM,OAAO,GACnC;AACJ,WAAO,CAAC;KAAE,QAAQ,MAAM;KAAQ;KAAU,CAAC;;GAG7C,KAAK,QACH,QAAO,CAAC,EAAE,OAAO,OAAO,QAAQ,CAAC;GAGnC,KAAK,YAAY;IACf,MAAM,yBAAS,IAAI,KAAyB;AAC5C,SAAK,MAAM,QAAQ,QAAQ;KACzB,MAAM,MAAM,KAAK,aAAa,MAAM,MAAM,MAAM;AAChD,SAAI,CAAC,OAAO,IAAI,IAAI,CAAE,QAAO,IAAI,KAAK,EAAE,CAAC;AACzC,YAAO,IAAI,IAAI,CAAE,KAAK,KAAK;;AAE7B,WAAO,MAAM,KAAK,OAAO,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,YAAY;KAAE;KAAK;KAAO,EAAE;;GAG7E,KAAK,SAAS;IAEZ,MAAM,0BAAU,IAAI,KAAwB;AAC5C,SAAK,MAAM,QAAQ,QAAQ;KACzB,MAAM,MAAM,OAAO,KAAK,aAAa,MAAM,MAAM,MAAM,IAAI,GAAG;KAC9D,MAAM,SAAS,MAAM,SAAS,MAAK,MAAK,EAAE,UAAU,IAAI;KACxD,MAAM,YAAY,SAAS,OAAO,YAAY,MAAM;AACpD,SAAI,WAAW;AACb,UAAI,CAAC,QAAQ,IAAI,UAAU,CAAE,SAAQ,IAAI,WAAW,EAAE,CAAC;AACvD,cAAQ,IAAI,UAAU,CAAE,KAAK,KAAK;;;AAKtC,SAAK,MAAM,CAAC,SAAS,UAAU,SAAS;KACtC,MAAM,WAAW,KAAK,QAAQ,IAAI,QAAQ;AAC1C,SAAI,CAAC,UAAU;AACb,aAAO,KAAK,qBAAqB,QAAQ,aAAa;AACtD;;AAEF,WAAM,SAAS,QAAQ,KAAK,MAAM;;AAEpC,WAAO,EAAE;;GAGX,KAAK,UAAU;IAEb,MAAM,aAAa,MAAM,IAAI,MAAM,KAAK,MAAM,KAAK;IACnD,MAAM,wBAAQ,IAAI,KAAsB;AACxC,SAAK,MAAM,QAAQ,YAAY;KAC7B,MAAM,MAAM,OAAO,KAAK,aAAa,MAAM,MAAM,QAAQ,IAAI,GAAG;AAChE,SAAI,CAAC,MAAM,IAAI,IAAI,CAAE,OAAM,IAAI,KAAK,KAAK;;AAE3C,WAAO,OAAO,KAAK,SAAS;KAC1B,MAAM,MAAM,OAAO,KAAK,aAAa,MAAM,MAAM,QAAQ,IAAI,GAAG;KAChE,MAAM,QAAQ,MAAM,IAAI,IAAI;AAC5B,SAAI,SAAS,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAO,SAAS,YAAY,SAAS,KAC/F,QAAO;MAAE,GAAG;MAAO,GAAG;MAAM;AAE9B,YAAO;MACP;;GAGJ,KAAK,UAAU;AACb,QAAI,CAAC,IAAI,MAAM,KACb,OAAM,IAAI,MAAM,8DAA8D,MAAM,KAAK,GAAG;IAG9F,MAAM,YAAY,MAAM,UAAU,OAAO,KAAK,MAAM,OAAO,CAAC,SAAS;IACrE,MAAM,kBAAkB,MAAM,KAAK,SAAS,KAAK;AAEjD,QAAI,MAAM,UAAU;KAElB,MAAM,UAAqB,EAAE;AAC7B,UAAK,MAAM,UAAU,QAAQ;AAE3B,UAAI,YAAa,aAAY,WAAW,EAAE;AAC1C,UAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,EAAE,UAAU,QAC/D,OAAM,IAAI,MAAM,oBAAoB,MAAM,KAAK,wCAAwC;MAGzF,MAAM,WADa,OAAQ,OAAmC,KAAK,GACrC,eAAe,MAAM;AAEnD,UAAI,SAAU,UAAS,QAAQ,SAAS;MACxC,MAAMC,YAAU,SAAS,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;AACzD,UAAI,IAAI,KAAK,OAAO,KAAK,CAAC,IAAI,KAAK,IAAIA,UAAQ,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CACnE,OAAM,IAAI,MAAM,mCAAmC,SAAS,GAAG;MAEjE,MAAM,MAAM;MAEZ,MAAM,iBAAiB,YAAY,oBAAoB,MAAM,QAAmC,IAAI,GAAG;MACvG,MAAM,QAAQ,YAAY,EAAE,GAAG,CAAC,OAAO;MACvC,MAAMC,WAAS,MAAM,IAAI,MAAM,KAAK,UAAU,OAAO,eAAe;AACpE,UAAIA,YAAU,KACZ,KAAI,MAAM,QAAQA,SAAO,CAAE,SAAQ,KAAK,GAAGA,SAAO;UAC7C,SAAQ,KAAKA,SAAO;;AAG7B,YAAO;;AAIT,QAAI,aAAa,iBAAiB;KAChC,MAAM,UAAqB,EAAE;KAC7B,MAAM,UAAU,OAAO,SAAS,IAAI,SAAS,CAAC,EAAE,CAAC;KAGjD,MAAM,aAAc,iBAAiB,cAAc,SAAS,KACvD,OAAO,cAAc,OAAO,YAAY,cAAc,OAAO,OAC9D,cAAc,KACd;AACJ,UAAK,MAAM,UAAU,SAAS;AAC5B,UAAI,YAAa,aAAY,WAAW,EAAE;MAC1C,MAAM,MAAO,OAAO,WAAW,YAAY,WAAW,OAAO,SAAS,EAAE;MAExE,MAAM,UAAU,cAAc;MAC9B,MAAM,eAAe,kBAAkB,oBAAoB,MAAM,MAAM,QAAQ,GAAG,MAAM;AAExF,UAAI,SAAU,UAAS,QAAQ,aAAa;MAC5C,MAAMD,YAAU,aAAa,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;AAC7D,UAAI,IAAI,KAAK,OAAO,KAAK,CAAC,IAAI,KAAK,IAAIA,UAAQ,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CACnE,OAAM,IAAI,MAAM,mCAAmC,aAAa,GAAG;MAErE,MAAM,iBAAiB,YAAY,oBAAoB,MAAM,QAAmC,IAAI,GAAG;MACvG,MAAM,QAAQ,YAAY,EAAE,GAAG,CAAC,OAAO;MACvC,MAAMC,WAAS,MAAM,IAAI,MAAM,KAAK,cAAc,OAAO,eAAe;AACxE,UAAIA,YAAU,KACZ,KAAI,MAAM,QAAQA,SAAO,CAAE,SAAQ,KAAK,GAAGA,SAAO;UAC7C,SAAQ,KAAKA,SAAO;;AAG7B,YAAO;;AAKT,QAAI,SAAU,UAAS,QAAQ,MAAM,KAAK;IAC1C,MAAM,UAAU,MAAM,KAAK,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;AAC3D,QAAI,IAAI,KAAK,OAAO,KAAK,CAAC,IAAI,KAAK,IAAI,QAAQ,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CACnE,OAAM,IAAI,MAAM,mCAAmC,MAAM,KAAK,GAAG;IAEnE,MAAM,SAAS,MAAM,IAAI,MAAM,KAAK,MAAM,MAAM,QAAQ,OAAU;AAClE,QAAI,UAAU,KAAM,QAAO,EAAE;AAC7B,QAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO,CAAC,OAAO;AAC3C,WAAO;;GAGT,QACE,OAAM,IAAI,MAAM,uBAAwB,MAAc,OAAO;;;CAInE,AAAQ,iBAAiB,OAAuB,WAAyD;AACvG,MAAI,OAAO,MAAM,UAAU,YAAY,mBAAmB,KAAK,MAAM,MAAM,EAAE;GAC3E,MAAM,UAAU,MAAM,MAAM,MAAM,EAAE;AACpC,OAAI,CAAC,UAAU,IAAI,QAAQ,CACzB,OAAM,IAAI,MAAM,wBAAwB,UAAU;AAEpD,UAAO;IAAE,GAAG;IAAO,OAAO,UAAU,IAAI,QAAQ;IAAG;;AAErD,SAAO;;CAGT,AAAQ,iBAAiB,QAAqB,WAAsD;AAElG,MAAI,OAAO,OAAO,UAAU,YAAY,mBAAmB,KAAK,OAAO,MAAM,EAAE;GAC7E,MAAM,UAAU,OAAO,MAAM,MAAM,EAAE;AACrC,OAAI,CAAC,UAAU,IAAI,QAAQ,CACzB,OAAM,IAAI,MAAM,wBAAwB,UAAU;AAEpD,UAAO;IAAE,GAAG;IAAQ,OAAO,UAAU,IAAI,QAAQ;IAAG;;AAEtD,SAAO;;CAGT,AAAQ,cAAc,QAAqB,MAAwB;EACjE,MAAM,OAAO,KAAK,aAAa,MAAM,OAAO,KAAK;EACjD,MAAM,QAAQ,OAAO;AAErB,UAAQ,OAAO,IAAf;GACE,KAAK,KAAM,QAAO,YAAY,MAAM,MAAM;GAC1C,KAAK,KAAM,QAAO,CAAC,YAAY,MAAM,MAAM;GAC3C,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,MAAM;IACT,MAAM,IAAI,OAAO,KAAK;IACtB,MAAM,IAAI,OAAO,MAAM;AAEvB,QAAI,CAAC,OAAO,SAAS,EAAE,IAAI,CAAC,OAAO,SAAS,EAAE,CAAE,QAAO;AACvD,QAAI,OAAO,OAAO,IAAK,QAAO,IAAI;AAClC,QAAI,OAAO,OAAO,IAAK,QAAO,IAAI;AAClC,QAAI,OAAO,OAAO,KAAM,QAAO,KAAK;AACpC,WAAO,KAAK;;GAEd,QAAS,QAAO;;;CAIpB,AAAQ,aAAa,MAAe,OAAwB;EAC1D,MAAM,QAAQ,MAAM,MAAM,IAAI;EAC9B,IAAI,UAAe;AACnB,OAAK,MAAM,QAAQ,OAAO;AACxB,OAAI,WAAW,KAAM,QAAO;AAC5B,OAAI,OAAO,YAAY,YAAY,CAAC,OAAO,OAAO,SAAS,KAAK,CAAE,QAAO;AACzE,aAAU,QAAQ;;AAEpB,SAAO;;CAGT,AAAQ,mBAAmB,MAAkB,MAAe,WAAkD;AAC5G,UAAQ,KAAK,MAAb;GACE,KAAK,UACH,QAAO,KAAK;GACd,KAAK,eACH,QAAO,KAAK,aAAa,MAAM,KAAK,KAAK;GAC3C,KAAK;AACH,QAAI,CAAC,UAAU,IAAI,KAAK,KAAK,CAC3B,OAAM,IAAI,MAAM,wBAAwB,KAAK,OAAO;AAEtD,WAAO,UAAU,IAAI,KAAK,KAAK;GAEjC,KAAK,UAAU;IACb,MAAM,OAAO,KAAK,mBAAmB,KAAK,MAAM,MAAM,UAAU;IAChE,MAAM,QAAQ,KAAK,mBAAmB,KAAK,OAAO,MAAM,UAAU;AAClE,YAAQ,KAAK,IAAb;KACE,KAAK;AAEH,UAAI,OAAO,SAAS,YAAY,OAAO,UAAU,SAC/C,QAAO,OAAO,QAAQ,GAAG,GAAG,OAAO,SAAS,GAAG;AAEjD,aAAO,OAAO,KAAK,GAAG,OAAO,MAAM;KACrC,KAAK,IACH,QAAO,OAAO,KAAK,GAAG,OAAO,MAAM;KACrC,KAAK,IACH,QAAO,OAAO,KAAK,GAAG,OAAO,MAAM;KACrC,KAAK,IACH,QAAO,OAAO,KAAK,GAAG,OAAO,MAAM;KACrC,QACE,OAAM,IAAI,MAAM,qBAAsB,KAAa,KAAK;;;GAG9D,QACE,OAAM,IAAI,MAAM,4BAA6B,KAAa,OAAO;;;CAIvE,MAAc,cAAc,OAAyB,QAAmB,KAAiB,QAAkB,4BAA0C,IAAI,KAAK,EAAE,aAAwD,UAAuD,eAA+C;EAC5T,MAAM,UAAuB,EAAE;AAC/B,OAAK,MAAM,UAAU,MAAM,UAAU;GACnC,IAAI,eAAe,CAAC,GAAG,OAAO;AAC9B,OAAI;AACF,SAAK,MAAM,eAAe,OACxB,gBAAe,MAAM,KAAK,aAAa,aAAa,cAAc,KAAK,QAAQ,WAAW,aAAa,UAAU,cAAc;AAEjI,YAAQ,KAAK,aAAa;YACnB,GAAQ;AACf,WAAO,KAAK,yBAAyB,EAAE,UAAU;;;AAIrD,SAAO,QAAQ,MAAM"}
|
|
1
|
+
{"version":3,"file":"compiler.mjs","names":["durationMs","capPath","result"],"sources":["../src/compiler.ts"],"sourcesContent":["import type { Program, JobDeclaration, PipelineStage, WhereClause, FanoutExpression, OutputExpression, TopLevelStatement, QueryCondition, LetStatement, GroupByExpression, ActionExpression, Expression, MapExpression, RouteExpression, LookupExpression, ParamDeclaration, TriggerDeclaration } from \"./ast.js\";\nimport { AshLexer } from \"./lexer.js\";\nimport { AshParser } from \"./parser.js\";\nimport { checkPipelineTypes, checkProhibitedPatterns, checkAnnotations, checkJobCaps, typeErrorsToDiagnostics, compileErrorsToDiagnostics, annotationErrorsToDiagnostics, parseSyntaxError, parseCaps, hasCapFor } from \"./type-checker.js\";\nimport type { AshDiagnostic, CapEntry } from \"./type-checker.js\";\nimport { resolveActionParams, resolveTemplatePath } from \"./template.js\";\n\nexport interface CompileResult {\n program?: CompiledProgram;\n diagnostics: AshDiagnostic[];\n sourceHash?: string;\n}\n\nfunction fnv1aHash(str: string): string {\n let hash = 2166136261;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, 16777619) >>> 0;\n }\n return hash.toString(16).padStart(8, \"0\");\n}\n\nfunction collectActions(stages: PipelineStage[]): ActionExpression[] {\n const actions: ActionExpression[] = [];\n for (const stage of stages) {\n if (stage.kind === \"action\") actions.push(stage);\n else if (stage.kind === \"fanout\") {\n for (const branch of stage.branches) actions.push(...collectActions(branch));\n }\n }\n return actions;\n}\n\nexport function compileSource(source: string): CompileResult {\n const diagnostics: AshDiagnostic[] = [];\n const sourceHash = fnv1aHash(source);\n const lexer = new AshLexer();\n const parser = new AshParser();\n const compiler = new AshCompiler();\n\n // Lex\n let tokens;\n try {\n tokens = lexer.tokenize(source);\n } catch (e: any) {\n return { sourceHash, diagnostics: [parseSyntaxError(e.message ?? String(e))] };\n }\n\n // Parse\n let ast;\n try {\n ast = parser.parse(tokens);\n } catch (e: any) {\n return { sourceHash, diagnostics: [parseSyntaxError(e.message ?? String(e))] };\n }\n\n // Type check\n const prohibErrors = checkProhibitedPatterns(ast);\n diagnostics.push(...compileErrorsToDiagnostics(prohibErrors));\n\n for (const job of ast.jobs) {\n const typeErrors = checkPipelineTypes(job.pipeline);\n diagnostics.push(...typeErrorsToDiagnostics(typeErrors));\n\n const annErrors = checkAnnotations(job);\n diagnostics.push(...annotationErrorsToDiagnostics(annErrors));\n\n // @caps: static path security check\n diagnostics.push(...checkJobCaps(job));\n\n // @readonly check: pipeline must not contain save, publish, or tee\n const isReadonly = job.annotations.some(a => a.name === \"readonly\");\n if (isReadonly) {\n for (const stage of job.pipeline) {\n if (stage.kind === \"save\" || stage.kind === \"publish\" || stage.kind === \"tee\" || stage.kind === \"action\") {\n diagnostics.push({\n code: \"ASH_READONLY_VIOLATION\",\n message: `@readonly job '${job.name}' contains '${stage.kind}' which writes data`,\n });\n }\n }\n // Check route targets: @readonly must propagate to route-target jobs\n for (const stage of job.pipeline) {\n if (stage.kind === \"route\") {\n const targetNames = [...stage.branches.map(b => b.targetJob), ...(stage.fallback ? [stage.fallback] : [])];\n for (const targetName of targetNames) {\n const targetJob = ast.jobs.find(j => j.name === targetName);\n if (!targetJob) continue;\n for (const tStage of targetJob.pipeline) {\n if (tStage.kind === \"save\" || tStage.kind === \"publish\" || tStage.kind === \"tee\" || tStage.kind === \"action\") {\n diagnostics.push({\n code: \"ASH_READONLY_VIOLATION\",\n message: `@readonly job '${job.name}' routes to '${targetName}' which contains '${tStage.kind}' (write operation)`,\n });\n break; // one error per target is enough\n }\n }\n }\n }\n }\n }\n }\n\n // Let pipeline restrictions: writes in let bindings are never legitimate\n const WRITE_STAGES = new Set([\"save\", \"publish\", \"tee\", \"action\"]);\n const letStatements = ast.statements.filter((s): s is LetStatement => s.kind === \"let\" && !!s.pipeline);\n for (const letStmt of letStatements) {\n if (letStmt.pipeline) {\n for (const stage of letStmt.pipeline) {\n if (WRITE_STAGES.has(stage.kind)) {\n diagnostics.push({\n code: \"ASH_LET_WRITE\",\n message: `let '${letStmt.name}' pipeline contains '${stage.kind}' — write operations in let bindings are not permitted`,\n });\n }\n }\n }\n }\n\n // Let pipeline pre-approval bypass: let pipelines with find/action execute before @approval checks\n const hasApproval = ast.jobs.some(j => j.annotations.some(a => a.name === \"approval\"));\n if (hasApproval && letStatements.length > 0) {\n const sideEffectLets = letStatements.filter(s =>\n s.pipeline?.some(stage => stage.kind === \"find\" || stage.kind === \"action\"),\n );\n if (sideEffectLets.length > 0) {\n diagnostics.push({\n code: \"ASH_LET_PRE_APPROVAL\",\n severity: \"warning\",\n message: `let bindings (${sideEffectLets.map(s => s.name).join(\", \")}) execute before @approval checks — side effects in let pipelines bypass approval`,\n });\n }\n }\n\n // Param write-gate: $param in where clause before write operation = logic bomb risk\n const paramNames = new Set(ast.statements.filter((s): s is ParamDeclaration => s.kind === \"param\").map(s => s.name));\n if (paramNames.size > 0) {\n for (const job of ast.jobs) {\n const hasWrite = job.pipeline.some(s => WRITE_STAGES.has(s.kind));\n if (!hasWrite) continue;\n for (const stage of job.pipeline) {\n if (stage.kind === \"where\" && typeof stage.right === \"string\" && stage.right.startsWith(\"$\")) {\n const varName = stage.right.slice(1);\n if (paramNames.has(varName)) {\n diagnostics.push({\n code: \"ASH_PARAM_WRITE_GATE\",\n severity: \"warning\",\n message: `Job '${job.name}': param '$${varName}' gates write operations — callers can override param to change behavior`,\n });\n break; // one warning per job\n }\n }\n }\n }\n }\n\n // Mixed annotation deception check: @readonly jobs alongside unrestricted write jobs\n const readonlyJobs = ast.jobs.filter(j => j.annotations.some(a => a.name === \"readonly\"));\n if (readonlyJobs.length > 0 && readonlyJobs.length < ast.jobs.length) {\n const nonReadonly = ast.jobs.filter(j => !j.annotations.some(a => a.name === \"readonly\"));\n const writingJobs = nonReadonly.filter(j =>\n j.pipeline.some(s => s.kind === \"save\" || s.kind === \"publish\" || s.kind === \"tee\" || s.kind === \"action\"),\n );\n if (writingJobs.length > 0) {\n diagnostics.push({\n code: \"ASH_MIXED_SECURITY\",\n severity: \"warning\",\n message: `Program has mixed security posture: ${readonlyJobs.length} @readonly job(s) alongside ${writingJobs.length} unrestricted writing job(s) (${writingJobs.map(j => j.name).join(\", \")}) — this can mask malicious intent`,\n });\n }\n }\n\n // Action hardening: uncapped, amplification (caps+budget gated), cross-provider (caps+budget gated)\n for (const job of ast.jobs) {\n const actions = collectActions(job.pipeline);\n if (actions.length === 0) continue;\n\n const hasCaps = job.annotations.some(a => a.name === \"caps\");\n const hasBudget = job.annotations.some(a => a.name === \"budget\");\n\n // No @caps + action → error (actions require explicit capability declaration)\n if (!hasCaps) {\n diagnostics.push({\n code: \"ASH_UNCAPPED_ACTION\",\n message: `Job '${job.name}' contains action stages but has no @caps — actions require explicit capability declaration`,\n });\n }\n\n // Multiple actions → caps+budget gated\n if (actions.length > 1) {\n if (hasCaps && hasBudget) {\n diagnostics.push({\n code: \"ASH_ACTION_AMPLIFICATION\",\n severity: \"warning\",\n message: `Job '${job.name}' contains ${actions.length} action stages — budget-gated multi-action execution permitted`,\n });\n } else {\n diagnostics.push({\n code: \"ASH_ACTION_AMPLIFICATION\",\n message: `Job '${job.name}' contains ${actions.length} action stages — multi-action jobs require @caps and @budget to prevent amplification attacks`,\n });\n }\n }\n\n // Actions targeting multiple providers → caps+budget gated\n const providers = new Set(actions.filter(a => !a.relative).map(a => a.path.split(\"/\")[1]).filter(Boolean));\n if (providers.size > 1) {\n if (hasCaps && hasBudget) {\n diagnostics.push({\n code: \"ASH_CROSS_PROVIDER_ACTION\",\n severity: \"warning\",\n message: `Job '${job.name}' has actions targeting ${providers.size} providers (${[...providers].join(\", \")}) — budget-gated cross-provider execution permitted`,\n });\n } else {\n diagnostics.push({\n code: \"ASH_CROSS_PROVIDER_ACTION\",\n message: `Job '${job.name}' has actions targeting ${providers.size} providers (${[...providers].join(\", \")}) — cross-provider actions require @caps and @budget`,\n });\n }\n }\n\n // Relative action checks\n const relativeActions = actions.filter(a => a.relative);\n if (relativeActions.length > 0) {\n // Relative action without upstream find → error\n const hasFindUpstream = job.pipeline.some((s, idx) =>\n s.kind === \"find\" && job.pipeline.findIndex(p => p === relativeActions[0]) > idx\n );\n if (!hasFindUpstream) {\n diagnostics.push({\n code: \"ASH_RELATIVE_ACTION_NO_FIND\",\n message: `Job '${job.name}': relative action '${relativeActions[0].path}' has no upstream 'find' — relative actions require a find stage to provide records with paths`,\n });\n }\n\n // Relative action = inherent amplification (1 stage, N execs)\n if (hasCaps && hasBudget) {\n diagnostics.push({\n code: \"ASH_ACTION_AMPLIFICATION\",\n severity: \"warning\",\n message: `Job '${job.name}': relative action '${relativeActions[0].path}' executes per-record — budget-gated amplification permitted`,\n });\n } else if (!hasCaps || !hasBudget) {\n diagnostics.push({\n code: \"ASH_ACTION_AMPLIFICATION\",\n message: `Job '${job.name}': relative action '${relativeActions[0].path}' executes per-record — requires @caps and @budget to prevent amplification`,\n });\n }\n }\n }\n\n // Write operation hardening: publish and tee require @caps\n for (const job of ast.jobs) {\n const hasCaps = job.annotations.some(a => a.name === \"caps\");\n const hasFind = job.pipeline.some(s => s.kind === \"find\" || s.kind === \"lookup\");\n const writeStages = job.pipeline.filter(s => s.kind === \"publish\" || s.kind === \"tee\");\n\n if (writeStages.length > 0 && hasFind && !hasCaps) {\n for (const ws of writeStages) {\n diagnostics.push({\n code: \"ASH_UNCAPPED_WRITE\",\n message: `Job '${job.name}': '${ws.kind}' combined with data reads requires @caps — write operations on external data must declare capabilities`,\n });\n }\n }\n }\n\n // Budget ceiling: reject unreasonably high budget values\n const BUDGET_CEILINGS: Record<string, number> = { actions: 100, writes: 100, records: 10000 };\n for (const job of ast.jobs) {\n const budgetAnn = job.annotations.find(a => a.name === \"budget\");\n if (!budgetAnn) continue;\n for (let i = 0; i < budgetAnn.args.length; i += 2) {\n const dim = budgetAnn.args[i];\n const val = Number(budgetAnn.args[i + 1]);\n if (dim in BUDGET_CEILINGS && val > BUDGET_CEILINGS[dim]) {\n diagnostics.push({\n code: \"ASH_BUDGET_EXCESSIVE\",\n message: `Job '${job.name}': @budget(${dim} ${val}) exceeds ceiling of ${BUDGET_CEILINGS[dim]} — reduce budget or justify with explicit approval`,\n });\n }\n }\n }\n\n // Compile\n const program = compiler.compile(ast);\n return { program, diagnostics, sourceHash };\n}\n\nexport interface OutputEvent {\n kind: \"text\";\n content: string;\n context?: LogContext;\n}\n\nexport interface OutputHandler {\n output(event: OutputEvent): void;\n}\n\nexport interface JobContext {\n world: WorldInterface;\n caps: Set<string>;\n logger: JobLogger;\n output?: OutputHandler;\n}\n\nexport interface WorldInterface {\n read(path: string, query?: QueryCondition): unknown[] | Promise<unknown[]>;\n write(path: string, data: unknown[]): void;\n publish(topic: string, data: unknown[]): void;\n exec?(path: string, input: unknown[], params?: Record<string, unknown>): Promise<unknown[]>;\n input?(prompt: string): string | Promise<string>;\n}\n\nexport interface LogContext {\n programId?: string;\n procId?: string;\n agentId?: string;\n sessionId?: string;\n jobName?: string;\n stageIndex?: number;\n}\n\nexport interface JobLogger {\n log(stage: string, action: string, detail?: unknown): void;\n emit?(level: \"debug\" | \"info\" | \"warn\" | \"error\", message: string, context?: LogContext): void;\n}\n\nexport interface JobResult {\n status: \"ok\" | \"error\" | \"partial\";\n recordCount: number;\n errors: string[];\n}\n\nexport interface StageMetrics {\n name: string;\n index: number;\n inputCount: number;\n outputCount: number;\n durationMs: number;\n error?: string;\n}\n\nexport interface JobReport extends JobResult {\n jobName: string;\n totalDurationMs: number;\n stages: StageMetrics[];\n}\n\nexport interface ProgramReport {\n jobs: JobReport[];\n totalDurationMs: number;\n}\n\nexport interface CompiledJob {\n kind: \"job\";\n name: string;\n trigger?: TriggerDeclaration;\n execute(ctx: JobContext, initialStream?: unknown[]): Promise<JobResult>;\n}\n\nexport interface CompiledOutput {\n kind: \"output\";\n message: string;\n execute(ctx: JobContext): Promise<void>;\n}\n\nexport type CompiledUnit = CompiledJob | CompiledOutput;\n\nexport interface CompiledProgram {\n jobs: CompiledJob[];\n units: CompiledUnit[];\n jobMap: Map<string, CompiledJob>;\n params: Map<string, string | number>; // param defaults (can be overridden before execution)\n routeTargets?: Set<string>; // jobs that are ONLY route targets (should not auto-execute as top-level)\n}\n\nfunction safeOutput(ctx: JobContext, content: string, logContext?: LogContext): void {\n if (ctx.output) {\n try {\n ctx.output.output({ kind: \"text\", content, context: logContext });\n } catch {\n // Output fault must not crash pipeline\n }\n }\n safeEmit(ctx.logger, \"info\", content, logContext);\n}\n\nfunction safeEmit(logger: JobLogger, level: \"debug\" | \"info\" | \"warn\" | \"error\", message: string, context?: LogContext): void {\n if (logger.emit) {\n try {\n logger.emit(level, message, context);\n } catch {\n // Log fault must not crash pipeline (INVARIANT: emit failure is silent)\n }\n }\n}\n\n/**\n * Strict equality with boolean coercion only.\n * No string fallback (prevents type confusion like 0 == \"0\").\n * Boolean coercion: true/\"true\" and false/\"false\" are equal.\n */\nfunction strictEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n // Boolean coercion: \"true\" matches true, \"false\" matches false\n if (typeof a === \"boolean\" && typeof b === \"string\") return a === (b === \"true\");\n if (typeof b === \"boolean\" && typeof a === \"string\") return b === (a === \"true\");\n return false;\n}\n\nexport class AshCompiler {\n private _currentJobName?: string;\n private _currentStageIndex?: number;\n private _jobMap = new Map<string, CompiledJob>();\n\n compile(ast: Program): CompiledProgram {\n // Collect param defaults\n const params = new Map<string, string | number>();\n for (const stmt of ast.statements) {\n if (stmt.kind === \"param\") {\n params.set(stmt.name, stmt.defaultValue);\n }\n }\n\n // Collect static let bindings (params first, then lets override)\n const variables = new Map<string, string | number>(params);\n const runtimeLets: LetStatement[] = [];\n for (const stmt of ast.statements) {\n if (stmt.kind === \"let\") {\n if (stmt.pipeline) {\n runtimeLets.push(stmt);\n } else {\n variables.set(stmt.name, stmt.value);\n }\n }\n }\n\n const units: CompiledUnit[] = ast.statements\n .filter((s): s is Exclude<TopLevelStatement, LetStatement | ParamDeclaration> => s.kind !== \"let\" && s.kind !== \"param\")\n .map((stmt) => this.compileStatement(stmt, variables, runtimeLets));\n const jobs = units.filter((u): u is CompiledJob => u.kind === \"job\");\n const jobMap = new Map<string, CompiledJob>();\n for (const job of jobs) jobMap.set(job.name, job);\n this._jobMap = jobMap;\n\n // Identify route-target-only jobs: jobs referenced by route stages but with no trigger\n const routeTargetNames = new Set<string>();\n const triggeredJobs = new Set<string>();\n for (const job of ast.jobs) {\n if (job.trigger) triggeredJobs.add(job.name);\n for (const stage of job.pipeline) {\n if (stage.kind === \"route\") {\n for (const branch of stage.branches) {\n routeTargetNames.add(branch.targetJob);\n }\n if (stage.fallback) routeTargetNames.add(stage.fallback);\n }\n }\n }\n // Exclude triggered jobs — they have independent execution reasons\n for (const name of triggeredJobs) routeTargetNames.delete(name);\n const routeTargets = routeTargetNames.size > 0 ? routeTargetNames : undefined;\n\n return { jobs, units, jobMap, params, routeTargets };\n }\n\n private compileStatement(stmt: Exclude<TopLevelStatement, LetStatement | ParamDeclaration>, variables: Map<string, string | number>, runtimeLets: LetStatement[] = []): CompiledUnit {\n if (stmt.kind === \"output\") {\n return this.compileTopLevelOutput(stmt);\n }\n return this.compileJob(stmt, variables, runtimeLets);\n }\n\n private compileTopLevelOutput(output: OutputExpression): CompiledOutput {\n return {\n kind: \"output\",\n message: output.message,\n execute: async (ctx: JobContext): Promise<void> => {\n ctx.logger.log(\"output\", \"output\", { message: output.message });\n safeOutput(ctx, output.message);\n },\n };\n }\n\n private compileJob(job: JobDeclaration, variables: Map<string, string | number> = new Map(), runtimeLets: LetStatement[] = []): CompiledJob {\n const stages = job.pipeline;\n const annotations = job.annotations;\n\n // Extract annotation configs\n const retryAnn = annotations.find(a => a.name === \"retry\");\n const timeoutAnn = annotations.find(a => a.name === \"timeout\");\n const onErrorAnn = annotations.find(a => a.name === \"on_error\");\n const budgetAnn = annotations.find(a => a.name === \"budget\");\n const retryCount = retryAnn ? (retryAnn.args.length > 0 ? Number(retryAnn.args[0]) : 3) : 0;\n const timeoutMs = timeoutAnn ? (timeoutAnn.args.length > 0 ? Number(timeoutAnn.args[0]) : 0) : 0;\n const onErrorStrategy = onErrorAnn?.args[0] as \"skip\" | \"save\" | \"fail\" | undefined;\n const onErrorPath = onErrorStrategy === \"save\" ? onErrorAnn?.args[1] : undefined;\n\n // Parse budget limits\n const budgetLimits: Record<string, number> = {};\n if (budgetAnn) {\n for (let i = 0; i < budgetAnn.args.length; i += 2) {\n budgetLimits[budgetAnn.args[i]] = Number(budgetAnn.args[i + 1]);\n }\n }\n\n // Parse @caps for runtime enforcement (script-declared caps are authoritative)\n const capsAnns = annotations.filter(a => a.name === \"caps\");\n const scriptCaps: CapEntry[] = [];\n for (const ann of capsAnns) {\n if (ann.args.length > 0 && ann.args.length % 2 === 0) {\n scriptCaps.push(...parseCaps(ann));\n }\n }\n\n const self = this;\n\n const runOnce = async (ctx: JobContext, initialStream?: unknown[]): Promise<JobReport> => {\n const errors: string[] = [];\n const jobInitialStream = initialStream ?? [];\n let stream: unknown[] = [...jobInitialStream];\n const stageMetrics: StageMetrics[] = [];\n const jobStart = performance.now();\n const budgetUsed = { actions: 0, writes: 0, records: 0, tokens: 0, cost: 0 };\n const checkBudget = (dim: string, increment: number) => {\n if (!(dim in budgetLimits)) return;\n (budgetUsed as any)[dim] += increment;\n if ((budgetUsed as any)[dim] > budgetLimits[dim]) {\n throw new Error(`budget exceeded: ${dim} used ${(budgetUsed as any)[dim]}, limit ${budgetLimits[dim]}`);\n }\n };\n\n // Runtime caps enforcement: if script declares @caps, enforce them with glob matching.\n // Script-declared caps are the ceiling — ctx.caps (caller-provided) cannot widen them.\n const checkCap = (op: CapEntry[\"op\"], path: string): void => {\n if (scriptCaps.length > 0 && !hasCapFor(scriptCaps, op, path)) {\n throw new Error(`Permission denied: @caps does not allow ${op} '${path}'`);\n }\n };\n\n // Resolve runtime lets\n const runtimeVars = new Map(variables);\n for (const rtLet of runtimeLets) {\n if (rtLet.pipeline) {\n try {\n let rtStream: unknown[] = [];\n for (const stage of rtLet.pipeline) {\n rtStream = await self.executeStage(stage, rtStream, ctx, errors, runtimeVars);\n }\n // Bind the result: if single object with a numeric/string value, extract it\n if (rtStream.length === 1 && typeof rtStream[0] === \"object\" && rtStream[0] !== null) {\n const obj = rtStream[0] as Record<string, unknown>;\n const keys = Object.keys(obj);\n if (keys.length === 1) {\n const val = obj[keys[0]];\n if (typeof val === \"number\" || typeof val === \"string\") {\n runtimeVars.set(rtLet.name, val);\n continue;\n }\n }\n }\n // Fallback: use length or first value\n if (rtStream.length === 1) {\n const v = rtStream[0];\n if (typeof v === \"number\" || typeof v === \"string\") {\n runtimeVars.set(rtLet.name, v);\n } else {\n runtimeVars.set(rtLet.name, rtStream.length);\n }\n } else {\n runtimeVars.set(rtLet.name, rtStream.length);\n }\n } catch (e: any) {\n errors.push(`Runtime let '${rtLet.name}' failed: ${e.message ?? String(e)}`);\n return { status: \"error\", recordCount: 0, errors, jobName: job.name, totalDurationMs: performance.now() - jobStart, stages: stageMetrics };\n }\n }\n }\n\n for (let i = 0; i < stages.length; i++) {\n const stage = stages[i];\n const inputCount = stream.length;\n const stageStart = performance.now();\n self._currentJobName = job.name;\n self._currentStageIndex = i;\n try {\n // Skip absolute actions on empty downstream stream (not first stage).\n // \"action as source\" (i === 0) still executes — it generates data from nothing.\n // Relative actions already skip naturally (for-of loop over empty stream).\n if (stage.kind === \"action\" && !stage.relative && i > 0 && stream.length === 0) {\n const durationMs = performance.now() - stageStart;\n ctx.logger.log(stage.kind, \"skip\", { reason: \"empty-stream\" });\n safeEmit(ctx.logger, \"debug\", `${stage.kind} skip (empty stream)`, { jobName: job.name, stageIndex: i });\n stageMetrics.push({ name: stage.kind, index: i, inputCount, outputCount: 0, durationMs });\n continue;\n }\n ctx.logger.log(stage.kind, \"enter\", { recordCount: stream.length });\n safeEmit(ctx.logger, \"debug\", `${stage.kind} enter`, { jobName: job.name, stageIndex: i });\n stream = await self.executeStage(stage, stream, ctx, errors, runtimeVars, checkBudget, checkCap, jobInitialStream);\n // Budget checks after stage execution\n // Relative actions are checked per-record inside executeStage; only check absolute actions here\n // Absolute actions with inline params also check per-record inside executeStage\n const hasInlineParams = stage.kind === \"action\" && !stage.relative &&\n stage.params && Object.keys(stage.params).length > 0;\n if (stage.kind === \"action\" && !stage.relative && !hasInlineParams) checkBudget(\"actions\", 1);\n if (stage.kind === \"save\" || stage.kind === \"publish\" || stage.kind === \"tee\") checkBudget(\"writes\", 1);\n checkBudget(\"records\", stream.length);\n const durationMs = performance.now() - stageStart;\n ctx.logger.log(stage.kind, \"exit\", { recordCount: stream.length });\n safeEmit(ctx.logger, \"debug\", `${stage.kind} exit`, { jobName: job.name, stageIndex: i });\n stageMetrics.push({ name: stage.kind, index: i, inputCount, outputCount: stream.length, durationMs });\n } catch (e: any) {\n const durationMs = performance.now() - stageStart;\n const errMsg = e.message ?? String(e);\n errors.push(errMsg);\n\n if (onErrorStrategy === \"skip\") {\n // Skip: log error, continue with remaining stream\n stageMetrics.push({ name: stage.kind, index: i, inputCount, outputCount: stream.length, durationMs, error: errMsg });\n continue;\n } else if (onErrorStrategy === \"save\" && onErrorPath) {\n // Save: write failed items to error path\n try {\n ctx.world.write(onErrorPath, stream.map(item => ({ _error: errMsg, _item: item })));\n } catch {\n errors.push(`Failed to write errors to ${onErrorPath}`);\n }\n stageMetrics.push({ name: stage.kind, index: i, inputCount, outputCount: stream.length, durationMs, error: errMsg });\n continue;\n }\n\n // Default (fail): terminate\n stageMetrics.push({ name: stage.kind, index: i, inputCount, outputCount: stream.length, durationMs, error: errMsg });\n return { status: \"error\", recordCount: stream.length, errors, jobName: job.name, totalDurationMs: performance.now() - jobStart, stages: stageMetrics };\n }\n }\n\n return {\n status: errors.length > 0 ? \"partial\" : \"ok\",\n recordCount: stream.length,\n errors,\n jobName: job.name,\n totalDurationMs: performance.now() - jobStart,\n stages: stageMetrics,\n };\n };\n\n const runWithTimeout = async (ctx: JobContext, initialStream?: unknown[]): Promise<JobResult> => {\n if (timeoutMs <= 0) return runOnce(ctx, initialStream);\n return Promise.race([\n runOnce(ctx, initialStream),\n new Promise<JobResult>((_, reject) =>\n setTimeout(() => reject(new Error(`Timeout: job exceeded ${timeoutMs}ms`)), timeoutMs)\n ),\n ]);\n };\n\n return {\n kind: \"job\",\n name: job.name,\n trigger: job.trigger,\n execute: async (ctx: JobContext, initialStream?: unknown[]): Promise<JobResult> => {\n if (retryCount <= 0 && !retryAnn) {\n // No retry annotation at all\n return runWithTimeout(ctx, initialStream);\n }\n\n const maxAttempts = retryCount > 0 ? retryCount : 1;\n const allErrors: string[] = [];\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const result = await runWithTimeout(ctx, initialStream);\n if (result.status !== \"error\") return result;\n allErrors.push(...result.errors);\n // If last attempt, return error\n if (attempt === maxAttempts - 1) return { status: \"error\", recordCount: result.recordCount, errors: allErrors };\n // Backoff (in tests we don't actually wait)\n } catch (e: any) {\n allErrors.push(e.message ?? String(e));\n if (attempt === maxAttempts - 1) {\n return { status: \"error\", recordCount: 0, errors: allErrors };\n }\n }\n }\n\n return { status: \"error\", recordCount: 0, errors: allErrors };\n },\n };\n }\n\n private async executeStage(stage: PipelineStage, stream: unknown[], ctx: JobContext, errors: string[], variables: Map<string, string | number> = new Map(), budgetCheck?: (dim: string, increment: number) => void, capCheck?: (op: CapEntry[\"op\"], path: string) => void, initialStream?: unknown[]): Promise<unknown[]> {\n switch (stage.kind) {\n case \"find\": {\n // Resolve template path from stream context (e.g. find /msgs/${data.messageId})\n let findPath = stage.path;\n if (findPath.includes(\"${\") && stream.length > 0) {\n const rec = (typeof stream[0] === \"object\" && stream[0] !== null ? stream[0] : {}) as Record<string, unknown>;\n findPath = resolveTemplatePath(findPath, rec);\n }\n\n // Runtime @caps enforcement (script-declared caps)\n if (capCheck) capCheck(\"read\", findPath);\n const capPath = findPath.split(\"/\").slice(0, 3).join(\"/\");\n if (ctx.caps.size > 0 && !ctx.caps.has(capPath) && !ctx.caps.has(\"*\")) {\n throw new Error(`Permission denied: cannot read '${findPath}'`);\n }\n try {\n const query = stage.query ? this.resolveQueryVars(stage.query, variables) : undefined;\n let result = await ctx.world.read(findPath, query);\n // Fallback: if world.read ignores query, apply in-memory filter\n if (query && result.length > 0) {\n result = result.filter((item) => {\n try {\n return this.evaluateWhere(\n { kind: \"where\", left: query!.field, op: query!.op, right: query!.value },\n item,\n );\n } catch {\n return false;\n }\n });\n }\n return result;\n } catch {\n return []; // non-existent path → empty stream\n }\n }\n\n case \"where\": {\n // Resolve $variable references in where clause\n const resolvedStage = this.resolveWhereVars(stage, variables);\n return stream.filter((item) => {\n try {\n return this.evaluateWhere(resolvedStage, item);\n } catch {\n return false; // missing field → skip\n }\n });\n }\n\n case \"map\": {\n // System fields that map cannot overwrite (identity fields from AFS nodes)\n const IMMUTABLE_FIELDS = [\"path\", \"kind\"];\n\n const preserveSystemFields = (original: unknown, mapped: Record<string, unknown>): Record<string, unknown> => {\n if (typeof original === \"object\" && original !== null) {\n for (const field of IMMUTABLE_FIELDS) {\n if (field in (original as Record<string, unknown>)) {\n mapped[field] = (original as Record<string, unknown>)[field];\n }\n }\n }\n return mapped;\n };\n\n if (stage.exprMappings) {\n return stream.map((item) => {\n const result: Record<string, unknown> = {};\n for (const [key, expr] of Object.entries(stage.exprMappings!)) {\n result[key] = this.evaluateExpression(expr, item, variables);\n }\n return preserveSystemFields(item, result);\n });\n }\n if (stage.expression) {\n return stream.map((item) => this.evaluateExpression(stage.expression!, item, variables));\n }\n if (stage.mappings) {\n return stream.map((item) => {\n const result: Record<string, unknown> = {};\n for (const [key, field] of Object.entries(stage.mappings!)) {\n result[key] = this.resolveField(item, field);\n }\n return preserveSystemFields(item, result);\n });\n }\n return stream.map((item) => this.resolveField(item, stage.field));\n }\n\n case \"save\": {\n // Runtime @caps enforcement (script-declared caps)\n if (capCheck) capCheck(\"write\", stage.path);\n const capPath = stage.path.split(\"/\").slice(0, 3).join(\"/\");\n if (ctx.caps.size > 0 && !ctx.caps.has(capPath) && !ctx.caps.has(\"*\")) {\n errors.push(`Permission denied: cannot write '${stage.path}'`);\n return stream;\n }\n ctx.world.write(stage.path, stream);\n return [];\n }\n\n case \"publish\": {\n // Runtime @caps enforcement (script-declared caps)\n if (capCheck) capCheck(\"write\", stage.path);\n const capPath = stage.path.split(\"/\").slice(0, 3).join(\"/\");\n if (ctx.caps.size > 0 && !ctx.caps.has(capPath) && !ctx.caps.has(\"*\")) {\n errors.push(`Permission denied: cannot publish '${stage.path}'`);\n return stream;\n }\n ctx.world.publish(stage.path, stream);\n return [];\n }\n\n case \"tee\": {\n // Runtime @caps enforcement (script-declared caps)\n if (capCheck) capCheck(\"write\", stage.path);\n try {\n ctx.world.write(stage.path, [...stream]);\n } catch (e: any) {\n errors.push(`tee side-write failed: ${e.message}`);\n // Main pipeline continues\n }\n return stream;\n }\n\n case \"fanout\": {\n return await this.executeFanout(stage, stream, ctx, errors, variables, budgetCheck, capCheck, initialStream);\n }\n\n case \"output\": {\n if (stage.expression) {\n // Expression mode: evaluate per stream item, emit each result as text\n for (const item of stream) {\n const val = this.evaluateExpression(stage.expression, item, variables);\n const text = val == null ? \"\" : String(val);\n ctx.logger.log(\"output\", \"output\", { message: text, streamSize: stream.length });\n safeOutput(ctx, text, { jobName: this._currentJobName, stageIndex: this._currentStageIndex });\n }\n } else {\n ctx.logger.log(\"output\", \"output\", { message: stage.message, streamSize: stream.length });\n safeOutput(ctx, stage.message, { jobName: this._currentJobName, stageIndex: this._currentStageIndex });\n }\n return stream; // pass-through\n }\n\n case \"input\": {\n ctx.logger.log(\"input\", \"prompt\", { prompt: stage.prompt });\n const response = ctx.world.input\n ? await ctx.world.input(stage.prompt)\n : \"\";\n return [{ prompt: stage.prompt, response }];\n }\n\n case \"count\": {\n return [{ count: stream.length }];\n }\n\n case \"group-by\": {\n const groups = new Map<unknown, unknown[]>();\n for (const item of stream) {\n const key = this.resolveField(item, stage.field);\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(item);\n }\n return Array.from(groups.entries()).map(([key, items]) => ({ key, items }));\n }\n\n case \"route\": {\n // Dispatch items to target jobs based on field value\n const buckets = new Map<string, unknown[]>();\n for (const item of stream) {\n const val = String(this.resolveField(item, stage.field) ?? \"\");\n const branch = stage.branches.find(b => b.value === val);\n const targetJob = branch ? branch.targetJob : stage.fallback;\n if (targetJob) {\n if (!buckets.has(targetJob)) buckets.set(targetJob, []);\n buckets.get(targetJob)!.push(item);\n }\n // If no match and no fallback, item is dropped (silently)\n }\n // Execute each target job with its bucket as initial stream\n for (const [jobName, items] of buckets) {\n const compiled = this._jobMap.get(jobName);\n if (!compiled) {\n errors.push(`Route target job '${jobName}' not found`);\n continue;\n }\n await compiled.execute(ctx, items);\n }\n return []; // route is terminal\n }\n\n case \"lookup\": {\n // Left join: read lookup source, build index by joinKey, merge into stream items\n const lookupData = await ctx.world.read(stage.path);\n const index = new Map<string, unknown>();\n for (const item of lookupData) {\n const key = String(this.resolveField(item, stage.joinKey) ?? \"\");\n if (!index.has(key)) index.set(key, item);\n }\n return stream.map((item) => {\n const key = String(this.resolveField(item, stage.joinKey) ?? \"\");\n const match = index.get(key);\n if (match && typeof match === \"object\" && match !== null && typeof item === \"object\" && item !== null) {\n return { ...match, ...item }; // item fields take precedence\n }\n return item; // LEFT JOIN: unmatched items preserved\n });\n }\n\n case \"action\": {\n if (!ctx.world.exec) {\n throw new Error(`WorldInterface.exec not available — cannot execute action '${stage.path}'`);\n }\n\n const hasParams = stage.params && Object.keys(stage.params).length > 0;\n const hasTemplatePath = stage.path.includes(\"${\");\n\n if (stage.relative) {\n // Per-record relative action: resolve path from each record\n const results: unknown[] = [];\n for (const record of stream) {\n // Pre-check budget before each execution\n if (budgetCheck) budgetCheck(\"actions\", 1);\n if (typeof record !== \"object\" || record === null || !(\"path\" in record)) {\n throw new Error(`Relative action '${stage.path}' requires records with a 'path' field`);\n }\n const recordPath = String((record as Record<string, unknown>).path);\n const fullPath = recordPath + \"/.actions/\" + stage.path;\n // Runtime caps enforcement: verify resolved path against @caps (glob-aware)\n if (capCheck) capCheck(\"exec\", fullPath);\n const capPath = fullPath.split(\"/\").slice(0, 3).join(\"/\");\n if (ctx.caps.size > 0 && !ctx.caps.has(capPath) && !ctx.caps.has(\"*\")) {\n throw new Error(`Permission denied: cannot exec '${fullPath}'`);\n }\n const rec = record as Record<string, unknown>;\n // New merge model: if inline params exist, resolve templates and pass ONLY params (no stream merge)\n const resolvedParams = hasParams ? resolveActionParams(stage.params as Record<string, unknown>, rec) : undefined;\n const input = hasParams ? [] : [record];\n const result = await ctx.world.exec(fullPath, input, resolvedParams);\n if (result != null) {\n if (Array.isArray(result)) results.push(...result);\n else results.push(result);\n }\n }\n return results;\n }\n\n // Absolute action — with inline params or template path: per-record execution\n if (hasParams || hasTemplatePath) {\n const results: unknown[] = [];\n const records = stream.length > 0 ? stream : [{}];\n // Path templates resolve from initial stream (trigger event / job context)\n // Params templates resolve from current stream record\n const initialRec = (initialStream && initialStream.length > 0\n && typeof initialStream[0] === \"object\" && initialStream[0] !== null)\n ? initialStream[0] as Record<string, unknown>\n : undefined;\n for (const record of records) {\n if (budgetCheck) budgetCheck(\"actions\", 1);\n const rec = (typeof record === \"object\" && record !== null ? record : {}) as Record<string, unknown>;\n // Path: prefer initial stream record (event context), fall back to current stream record\n const pathRec = initialRec ?? rec;\n const resolvedPath = hasTemplatePath ? resolveTemplatePath(stage.path, pathRec) : stage.path;\n // Caps check on resolved path\n if (capCheck) capCheck(\"exec\", resolvedPath);\n const capPath = resolvedPath.split(\"/\").slice(0, 3).join(\"/\");\n if (ctx.caps.size > 0 && !ctx.caps.has(capPath) && !ctx.caps.has(\"*\")) {\n throw new Error(`Permission denied: cannot exec '${resolvedPath}'`);\n }\n const resolvedParams = hasParams ? resolveActionParams(stage.params as Record<string, unknown>, rec) : undefined;\n const input = hasParams ? [] : [record];\n const result = await ctx.world.exec(resolvedPath, input, resolvedParams);\n if (result != null) {\n if (Array.isArray(result)) results.push(...result);\n else results.push(result);\n }\n }\n return results;\n }\n\n // No params, no template path — passthrough (backward compatible)\n // Runtime @caps enforcement (script-declared caps)\n if (capCheck) capCheck(\"exec\", stage.path);\n const capPath = stage.path.split(\"/\").slice(0, 3).join(\"/\");\n if (ctx.caps.size > 0 && !ctx.caps.has(capPath) && !ctx.caps.has(\"*\")) {\n throw new Error(`Permission denied: cannot exec '${stage.path}'`);\n }\n const result = await ctx.world.exec(stage.path, stream, undefined);\n if (result == null) return [];\n if (!Array.isArray(result)) return [result];\n return result;\n }\n\n default:\n throw new Error(`Unknown stage kind: ${(stage as any).kind}`);\n }\n }\n\n private resolveQueryVars(query: QueryCondition, variables: Map<string, string | number>): QueryCondition {\n if (typeof query.value === \"string\" && /^\\$[a-zA-Z_]\\w*$/.test(query.value)) {\n const varName = query.value.slice(1);\n if (!variables.has(varName)) {\n throw new Error(`Undefined variable: $${varName}`);\n }\n return { ...query, value: variables.get(varName)! };\n }\n return query;\n }\n\n private resolveWhereVars(clause: WhereClause, variables: Map<string, string | number>): WhereClause {\n // Only resolve $varName pattern ($ followed by identifier chars only)\n if (typeof clause.right === \"string\" && /^\\$[a-zA-Z_]\\w*$/.test(clause.right)) {\n const varName = clause.right.slice(1);\n if (!variables.has(varName)) {\n throw new Error(`Undefined variable: $${varName}`);\n }\n return { ...clause, right: variables.get(varName)! };\n }\n return clause;\n }\n\n private evaluateWhere(clause: WhereClause, item: unknown): boolean {\n const left = this.resolveField(item, clause.left);\n const right = clause.right;\n\n switch (clause.op) {\n case \"==\": return strictEqual(left, right);\n case \"!=\": return !strictEqual(left, right);\n case \">\":\n case \"<\":\n case \">=\":\n case \"<=\": {\n const l = Number(left);\n const r = Number(right);\n // NaN or Infinity in comparisons → reject (safety: non-finite values should not pass guards)\n if (!Number.isFinite(l) || !Number.isFinite(r)) return false;\n if (clause.op === \">\") return l > r;\n if (clause.op === \"<\") return l < r;\n if (clause.op === \">=\") return l >= r;\n return l <= r;\n }\n default: return false;\n }\n }\n\n private resolveField(item: unknown, field: string): unknown {\n const parts = field.split(\".\");\n let current: any = item;\n for (const part of parts) {\n if (current == null) return undefined;\n if (typeof current !== \"object\" || !Object.hasOwn(current, part)) return undefined;\n current = current[part];\n }\n return current;\n }\n\n private evaluateExpression(expr: Expression, item: unknown, variables: Map<string, string | number>): unknown {\n switch (expr.kind) {\n case \"literal\":\n return expr.value;\n case \"field_access\":\n return this.resolveField(item, expr.path);\n case \"var_ref\": {\n if (!variables.has(expr.name)) {\n throw new Error(`Undefined variable: $${expr.name}`);\n }\n return variables.get(expr.name)!;\n }\n case \"binary\": {\n const left = this.evaluateExpression(expr.left, item, variables);\n const right = this.evaluateExpression(expr.right, item, variables);\n switch (expr.op) {\n case \"+\":\n // String concat if either side is string\n if (typeof left === \"string\" || typeof right === \"string\") {\n return String(left ?? \"\") + String(right ?? \"\");\n }\n return Number(left) + Number(right);\n case \"-\":\n return Number(left) - Number(right);\n case \"*\":\n return Number(left) * Number(right);\n case \"/\":\n return Number(left) / Number(right);\n default:\n throw new Error(`Unknown operator: ${(expr as any).op}`);\n }\n }\n case \"array_literal\": {\n return expr.elements.map((el) => this.evaluateExpression(el, item, variables));\n }\n case \"object_literal\": {\n const obj: Record<string, unknown> = {};\n for (const [key, valExpr] of Object.entries(expr.properties)) {\n obj[key] = this.evaluateExpression(valExpr, item, variables);\n }\n return obj;\n }\n default:\n throw new Error(`Unknown expression kind: ${(expr as any).kind}`);\n }\n }\n\n private async executeFanout(stage: FanoutExpression, stream: unknown[], ctx: JobContext, errors: string[], variables: Map<string, string | number> = new Map(), budgetCheck?: (dim: string, increment: number) => void, capCheck?: (op: CapEntry[\"op\"], path: string) => void, initialStream?: unknown[]): Promise<unknown[]> {\n const results: unknown[][] = [];\n for (const branch of stage.branches) {\n let branchStream = [...stream];\n try {\n for (const branchStage of branch) {\n branchStream = await this.executeStage(branchStage, branchStream, ctx, errors, variables, budgetCheck, capCheck, initialStream);\n }\n results.push(branchStream);\n } catch (e: any) {\n errors.push(`fanout branch failed: ${e.message}`);\n }\n }\n // Return merged results from all successful branches\n return results.flat();\n }\n}\n"],"mappings":"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"}
|
package/dist/parser.cjs
CHANGED
|
@@ -510,6 +510,34 @@ var AshParser = class AshParser {
|
|
|
510
510
|
value: parseFloat(t.value)
|
|
511
511
|
};
|
|
512
512
|
}
|
|
513
|
+
if (t.type === "LBRACKET") {
|
|
514
|
+
this.advance();
|
|
515
|
+
const elements = [];
|
|
516
|
+
while (!this.isAtEnd() && this.peek().type !== "RBRACKET") {
|
|
517
|
+
elements.push(this.parseExpression());
|
|
518
|
+
if (!this.isAtEnd() && this.peek().type === "COMMA") this.advance();
|
|
519
|
+
}
|
|
520
|
+
this.expect("RBRACKET", "Expected ']' after array literal");
|
|
521
|
+
return {
|
|
522
|
+
kind: "array_literal",
|
|
523
|
+
elements
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
if (t.type === "LBRACE") {
|
|
527
|
+
this.advance();
|
|
528
|
+
const properties = {};
|
|
529
|
+
while (!this.isAtEnd() && this.peek().type !== "RBRACE") {
|
|
530
|
+
const keyToken = this.expect("IDENTIFIER", "Expected property name in object literal");
|
|
531
|
+
this.expect("COLON", "Expected ':' after property name");
|
|
532
|
+
properties[keyToken.value] = this.parseExpression();
|
|
533
|
+
if (!this.isAtEnd() && this.peek().type === "COMMA") this.advance();
|
|
534
|
+
}
|
|
535
|
+
this.expect("RBRACE", "Expected '}' after object literal");
|
|
536
|
+
return {
|
|
537
|
+
kind: "object_literal",
|
|
538
|
+
properties
|
|
539
|
+
};
|
|
540
|
+
}
|
|
513
541
|
if (t.type === "IDENTIFIER") {
|
|
514
542
|
let field = this.advance().value;
|
|
515
543
|
while (!this.isAtEnd() && this.peek().type === "DOT") {
|
package/dist/parser.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.cts","names":[],"sources":["../src/parser.ts"],"mappings":";;;;cAca,SAAA;EAAA,QACH,MAAA;EAAA,QACA,GAAA;EAAA,QAEA,QAAA;EAAA,QACA,UAAA;EAAA,wBACgB,iBAAA;EAExB,KAAA,CAAM,MAAA,EAAQ,KAAA,KAAU,OAAA;EAAA,QA+ChB,UAAA;EAAA,wBAqCgB,iBAAA;EAAA,QAEhB,QAAA;EAAA,QAuCA,gBAAA;EAAA,QAkBA,gBAAA;EAAA,QA+BA,QAAA;EAAA,QAuEA,aAAA;EAAA,QA2BA,UAAA;EAAA,QAqFA,UAAA;EAAA,QAuCA,gBAAA;EAAA,QAWA,YAAA;EAAA,QAuFA,eAAA;EAAA,QAUA,SAAA;EAAA,QAUA,WAAA;EAAA,
|
|
1
|
+
{"version":3,"file":"parser.d.cts","names":[],"sources":["../src/parser.ts"],"mappings":";;;;cAca,SAAA;EAAA,QACH,MAAA;EAAA,QACA,GAAA;EAAA,QAEA,QAAA;EAAA,QACA,UAAA;EAAA,wBACgB,iBAAA;EAExB,KAAA,CAAM,MAAA,EAAQ,KAAA,KAAU,OAAA;EAAA,QA+ChB,UAAA;EAAA,wBAqCgB,iBAAA;EAAA,QAEhB,QAAA;EAAA,QAuCA,gBAAA;EAAA,QAkBA,gBAAA;EAAA,QA+BA,QAAA;EAAA,QAuEA,aAAA;EAAA,QA2BA,UAAA;EAAA,QAqFA,UAAA;EAAA,QAuCA,gBAAA;EAAA,QAWA,YAAA;EAAA,QAuFA,eAAA;EAAA,QAUA,SAAA;EAAA,QAUA,WAAA;EAAA,QA6EA,WAAA;EAAA,QA+DA,UAAA;EAAA,QAmDA,WAAA;EAAA,QAeA,WAAA;EAzTA;EAAA,QAsVA,cAAA;EAAA,QAmEA,IAAA;EAAA,QAIA,OAAA;EAAA,QAIA,MAAA;EAAA,QASA,OAAA;EAAA,QAIA,YAAA;AAAA"}
|
package/dist/parser.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.mts","names":[],"sources":["../src/parser.ts"],"mappings":";;;;cAca,SAAA;EAAA,QACH,MAAA;EAAA,QACA,GAAA;EAAA,QAEA,QAAA;EAAA,QACA,UAAA;EAAA,wBACgB,iBAAA;EAExB,KAAA,CAAM,MAAA,EAAQ,KAAA,KAAU,OAAA;EAAA,QA+ChB,UAAA;EAAA,wBAqCgB,iBAAA;EAAA,QAEhB,QAAA;EAAA,QAuCA,gBAAA;EAAA,QAkBA,gBAAA;EAAA,QA+BA,QAAA;EAAA,QAuEA,aAAA;EAAA,QA2BA,UAAA;EAAA,QAqFA,UAAA;EAAA,QAuCA,gBAAA;EAAA,QAWA,YAAA;EAAA,QAuFA,eAAA;EAAA,QAUA,SAAA;EAAA,QAUA,WAAA;EAAA,
|
|
1
|
+
{"version":3,"file":"parser.d.mts","names":[],"sources":["../src/parser.ts"],"mappings":";;;;cAca,SAAA;EAAA,QACH,MAAA;EAAA,QACA,GAAA;EAAA,QAEA,QAAA;EAAA,QACA,UAAA;EAAA,wBACgB,iBAAA;EAExB,KAAA,CAAM,MAAA,EAAQ,KAAA,KAAU,OAAA;EAAA,QA+ChB,UAAA;EAAA,wBAqCgB,iBAAA;EAAA,QAEhB,QAAA;EAAA,QAuCA,gBAAA;EAAA,QAkBA,gBAAA;EAAA,QA+BA,QAAA;EAAA,QAuEA,aAAA;EAAA,QA2BA,UAAA;EAAA,QAqFA,UAAA;EAAA,QAuCA,gBAAA;EAAA,QAWA,YAAA;EAAA,QAuFA,eAAA;EAAA,QAUA,SAAA;EAAA,QAUA,WAAA;EAAA,QA6EA,WAAA;EAAA,QA+DA,UAAA;EAAA,QAmDA,WAAA;EAAA,QAeA,WAAA;EAzTA;EAAA,QAsVA,cAAA;EAAA,QAmEA,IAAA;EAAA,QAIA,OAAA;EAAA,QAIA,MAAA;EAAA,QASA,OAAA;EAAA,QAIA,YAAA;AAAA"}
|
package/dist/parser.mjs
CHANGED
|
@@ -509,6 +509,34 @@ var AshParser = class AshParser {
|
|
|
509
509
|
value: parseFloat(t.value)
|
|
510
510
|
};
|
|
511
511
|
}
|
|
512
|
+
if (t.type === "LBRACKET") {
|
|
513
|
+
this.advance();
|
|
514
|
+
const elements = [];
|
|
515
|
+
while (!this.isAtEnd() && this.peek().type !== "RBRACKET") {
|
|
516
|
+
elements.push(this.parseExpression());
|
|
517
|
+
if (!this.isAtEnd() && this.peek().type === "COMMA") this.advance();
|
|
518
|
+
}
|
|
519
|
+
this.expect("RBRACKET", "Expected ']' after array literal");
|
|
520
|
+
return {
|
|
521
|
+
kind: "array_literal",
|
|
522
|
+
elements
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
if (t.type === "LBRACE") {
|
|
526
|
+
this.advance();
|
|
527
|
+
const properties = {};
|
|
528
|
+
while (!this.isAtEnd() && this.peek().type !== "RBRACE") {
|
|
529
|
+
const keyToken = this.expect("IDENTIFIER", "Expected property name in object literal");
|
|
530
|
+
this.expect("COLON", "Expected ':' after property name");
|
|
531
|
+
properties[keyToken.value] = this.parseExpression();
|
|
532
|
+
if (!this.isAtEnd() && this.peek().type === "COMMA") this.advance();
|
|
533
|
+
}
|
|
534
|
+
this.expect("RBRACE", "Expected '}' after object literal");
|
|
535
|
+
return {
|
|
536
|
+
kind: "object_literal",
|
|
537
|
+
properties
|
|
538
|
+
};
|
|
539
|
+
}
|
|
512
540
|
if (t.type === "IDENTIFIER") {
|
|
513
541
|
let field = this.advance().value;
|
|
514
542
|
while (!this.isAtEnd() && this.peek().type === "DOT") {
|