@aid-framework/ir 0.0.0 → 0.1.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +199 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/build.d.ts +74 -0
  5. package/dist/build.d.ts.map +1 -0
  6. package/dist/build.js +1079 -0
  7. package/dist/build.js.map +1 -0
  8. package/dist/capabilities.d.ts +65 -0
  9. package/dist/capabilities.d.ts.map +1 -0
  10. package/dist/capabilities.js +176 -0
  11. package/dist/capabilities.js.map +1 -0
  12. package/dist/catalog/index.d.ts +36 -0
  13. package/dist/catalog/index.d.ts.map +1 -0
  14. package/dist/catalog/index.js +43 -0
  15. package/dist/catalog/index.js.map +1 -0
  16. package/dist/catalog/models.json +52 -0
  17. package/dist/diagnostics.d.ts +90 -0
  18. package/dist/diagnostics.d.ts.map +1 -0
  19. package/dist/diagnostics.js +103 -0
  20. package/dist/diagnostics.js.map +1 -0
  21. package/dist/gates/agents.d.ts +34 -0
  22. package/dist/gates/agents.d.ts.map +1 -0
  23. package/dist/gates/agents.js +233 -0
  24. package/dist/gates/agents.js.map +1 -0
  25. package/dist/gates/capability.d.ts +15 -0
  26. package/dist/gates/capability.d.ts.map +1 -0
  27. package/dist/gates/capability.js +81 -0
  28. package/dist/gates/capability.js.map +1 -0
  29. package/dist/gates/contract.d.ts +35 -0
  30. package/dist/gates/contract.d.ts.map +1 -0
  31. package/dist/gates/contract.js +19 -0
  32. package/dist/gates/contract.js.map +1 -0
  33. package/dist/gates/cost.d.ts +40 -0
  34. package/dist/gates/cost.d.ts.map +1 -0
  35. package/dist/gates/cost.js +167 -0
  36. package/dist/gates/cost.js.map +1 -0
  37. package/dist/gates/deploy.d.ts +23 -0
  38. package/dist/gates/deploy.d.ts.map +1 -0
  39. package/dist/gates/deploy.js +44 -0
  40. package/dist/gates/deploy.js.map +1 -0
  41. package/dist/gates/eval-coverage.d.ts +11 -0
  42. package/dist/gates/eval-coverage.d.ts.map +1 -0
  43. package/dist/gates/eval-coverage.js +50 -0
  44. package/dist/gates/eval-coverage.js.map +1 -0
  45. package/dist/gates/guardrails.d.ts +24 -0
  46. package/dist/gates/guardrails.d.ts.map +1 -0
  47. package/dist/gates/guardrails.js +112 -0
  48. package/dist/gates/guardrails.js.map +1 -0
  49. package/dist/gates/hitl.d.ts +17 -0
  50. package/dist/gates/hitl.d.ts.map +1 -0
  51. package/dist/gates/hitl.js +40 -0
  52. package/dist/gates/hitl.js.map +1 -0
  53. package/dist/gates/index.d.ts +66 -0
  54. package/dist/gates/index.d.ts.map +1 -0
  55. package/dist/gates/index.js +77 -0
  56. package/dist/gates/index.js.map +1 -0
  57. package/dist/gates/memory.d.ts +13 -0
  58. package/dist/gates/memory.d.ts.map +1 -0
  59. package/dist/gates/memory.js +67 -0
  60. package/dist/gates/memory.js.map +1 -0
  61. package/dist/gates/normalize.d.ts +26 -0
  62. package/dist/gates/normalize.d.ts.map +1 -0
  63. package/dist/gates/normalize.js +228 -0
  64. package/dist/gates/normalize.js.map +1 -0
  65. package/dist/gates/orchestration.d.ts +17 -0
  66. package/dist/gates/orchestration.d.ts.map +1 -0
  67. package/dist/gates/orchestration.js +46 -0
  68. package/dist/gates/orchestration.js.map +1 -0
  69. package/dist/gates/referential.d.ts +12 -0
  70. package/dist/gates/referential.d.ts.map +1 -0
  71. package/dist/gates/referential.js +554 -0
  72. package/dist/gates/referential.js.map +1 -0
  73. package/dist/gates/security.d.ts +22 -0
  74. package/dist/gates/security.d.ts.map +1 -0
  75. package/dist/gates/security.js +225 -0
  76. package/dist/gates/security.js.map +1 -0
  77. package/dist/index.d.ts +27 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +19 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/policy/ast.d.ts +61 -0
  82. package/dist/policy/ast.d.ts.map +1 -0
  83. package/dist/policy/ast.js +48 -0
  84. package/dist/policy/ast.js.map +1 -0
  85. package/dist/policy/index.d.ts +7 -0
  86. package/dist/policy/index.d.ts.map +1 -0
  87. package/dist/policy/index.js +4 -0
  88. package/dist/policy/index.js.map +1 -0
  89. package/dist/policy/lexer.d.ts +27 -0
  90. package/dist/policy/lexer.d.ts.map +1 -0
  91. package/dist/policy/lexer.js +147 -0
  92. package/dist/policy/lexer.js.map +1 -0
  93. package/dist/policy/parser.d.ts +15 -0
  94. package/dist/policy/parser.d.ts.map +1 -0
  95. package/dist/policy/parser.js +202 -0
  96. package/dist/policy/parser.js.map +1 -0
  97. package/dist/predicate/ast.d.ts +125 -0
  98. package/dist/predicate/ast.d.ts.map +1 -0
  99. package/dist/predicate/ast.js +111 -0
  100. package/dist/predicate/ast.js.map +1 -0
  101. package/dist/predicate/index.d.ts +7 -0
  102. package/dist/predicate/index.d.ts.map +1 -0
  103. package/dist/predicate/index.js +4 -0
  104. package/dist/predicate/index.js.map +1 -0
  105. package/dist/predicate/lexer.d.ts +30 -0
  106. package/dist/predicate/lexer.d.ts.map +1 -0
  107. package/dist/predicate/lexer.js +176 -0
  108. package/dist/predicate/lexer.js.map +1 -0
  109. package/dist/predicate/parser.d.ts +16 -0
  110. package/dist/predicate/parser.d.ts.map +1 -0
  111. package/dist/predicate/parser.js +317 -0
  112. package/dist/predicate/parser.js.map +1 -0
  113. package/dist/schema/ir.schema.json +1144 -0
  114. package/dist/serialize.d.ts +15 -0
  115. package/dist/serialize.d.ts.map +1 -0
  116. package/dist/serialize.js +53 -0
  117. package/dist/serialize.js.map +1 -0
  118. package/dist/shapes.d.ts +671 -0
  119. package/dist/shapes.d.ts.map +1 -0
  120. package/dist/shapes.js +159 -0
  121. package/dist/shapes.js.map +1 -0
  122. package/package.json +44 -14
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.js","sourceRoot":"","sources":["../../src/policy/lexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * PolicyExpr recursive-descent parser. Total: it returns either an AST or
3
+ * diagnostics, and never lets an exception escape. An unparseable policy is a
4
+ * validation error and never treated as `true` — a policy the runtime cannot
5
+ * evaluate must fail closed.
6
+ */
7
+ import { type IrDiagnostic } from '../diagnostics.js';
8
+ import { type PolicyNode } from './ast.js';
9
+ import { type PolicyContext } from './lexer.js';
10
+ export interface PolicyParseResult {
11
+ ast?: PolicyNode;
12
+ diagnostics: IrDiagnostic[];
13
+ }
14
+ export declare function parsePolicyExpr(source: string, context?: PolicyContext): PolicyParseResult;
15
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/policy/parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAuB,KAAK,YAAY,EAAyB,MAAM,mBAAmB,CAAC;AAClG,OAAO,EAOL,KAAK,UAAU,EAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,KAAK,aAAa,EAKnB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,YAAY,EAAE,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,iBAAiB,CAqD9F"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * PolicyExpr recursive-descent parser. Total: it returns either an AST or
3
+ * diagnostics, and never lets an exception escape. An unparseable policy is a
4
+ * validation error and never treated as `true` — a policy the runtime cannot
5
+ * evaluate must fail closed.
6
+ */
7
+ import { IR_DIAGNOSTIC_CODES, irError, withPosition } from '../diagnostics.js';
8
+ import { COMPARISON_OPERATORS, isPolicyBuiltin, POLICY_BUILTIN_ARITY, } from './ast.js';
9
+ import { policyDiagnostic, tokenize, tokenText, } from './lexer.js';
10
+ export function parsePolicyExpr(source, context = {}) {
11
+ const diagnostics = [];
12
+ if (source.trim() === '') {
13
+ diagnostics.push(policyDiagnostic(source, context, 0, IR_DIAGNOSTIC_CODES.policyEmpty, 'empty policy expression', 'a policy must evaluate to true or false; there is no implicit "allow"'));
14
+ return { diagnostics };
15
+ }
16
+ const lexed = tokenize(source, context);
17
+ diagnostics.push(...lexed.diagnostics);
18
+ try {
19
+ const parser = new Parser(source, context, lexed.tokens, diagnostics);
20
+ const ast = parser.parseExpression();
21
+ if (ast !== undefined && !parser.atEnd()) {
22
+ const token = parser.peek();
23
+ diagnostics.push(policyDiagnostic(source, context, token.start, IR_DIAGNOSTIC_CODES.policyTrailingToken, `unexpected trailing ${tokenText(token)} after a complete expression`, 'a policy is a single expression; combine conditions with and/or'));
24
+ }
25
+ if (diagnostics.some((entry) => entry.severity === 'error'))
26
+ return { diagnostics };
27
+ return ast === undefined ? { diagnostics } : { ast, diagnostics };
28
+ }
29
+ catch (error) {
30
+ diagnostics.push(withPosition(irError({
31
+ code: IR_DIAGNOSTIC_CODES.policySyntax,
32
+ message: `policy expression could not be parsed: ${error instanceof Error ? error.message : String(error)}`,
33
+ path: context.path,
34
+ }), { file: context.file }));
35
+ return { diagnostics };
36
+ }
37
+ }
38
+ class Parser {
39
+ source;
40
+ context;
41
+ tokens;
42
+ diagnostics;
43
+ index = 0;
44
+ constructor(source, context, tokens, diagnostics) {
45
+ this.source = source;
46
+ this.context = context;
47
+ this.tokens = tokens;
48
+ this.diagnostics = diagnostics;
49
+ }
50
+ atEnd() {
51
+ return this.peek().type === 'eof';
52
+ }
53
+ peek(offset = 0) {
54
+ const token = this.tokens[Math.min(this.index + offset, this.tokens.length - 1)];
55
+ return token;
56
+ }
57
+ parseExpression() {
58
+ return this.parseOr();
59
+ }
60
+ parseOr() {
61
+ let left = this.parseAnd();
62
+ while (this.isOperator('or')) {
63
+ this.index += 1;
64
+ const right = this.parseAnd();
65
+ if (left === undefined || right === undefined)
66
+ return left ?? right;
67
+ left = { kind: 'or', left, right };
68
+ }
69
+ return left;
70
+ }
71
+ parseAnd() {
72
+ let left = this.parseComparison();
73
+ while (this.isOperator('and')) {
74
+ this.index += 1;
75
+ const right = this.parseComparison();
76
+ if (left === undefined || right === undefined)
77
+ return left ?? right;
78
+ left = { kind: 'and', left, right };
79
+ }
80
+ return left;
81
+ }
82
+ parseComparison() {
83
+ const left = this.parseUnary();
84
+ const token = this.peek();
85
+ const op = token.type === 'operator' ? toComparisonOperator(String(token.value)) : undefined;
86
+ if (op === undefined)
87
+ return left;
88
+ this.index += 1;
89
+ const right = this.parseUnary();
90
+ if (left === undefined || right === undefined)
91
+ return left ?? right;
92
+ return { kind: 'comparison', op, left, right };
93
+ }
94
+ parseUnary() {
95
+ if (this.isOperator('not')) {
96
+ this.index += 1;
97
+ const operand = this.parseUnary();
98
+ return operand === undefined ? undefined : { kind: 'not', operand };
99
+ }
100
+ return this.parsePrimary();
101
+ }
102
+ parsePrimary() {
103
+ const token = this.peek();
104
+ if (token.type === 'boolean') {
105
+ this.index += 1;
106
+ return { kind: 'boolean', value: Boolean(token.value) };
107
+ }
108
+ if (token.type === 'number') {
109
+ this.index += 1;
110
+ return { kind: 'number', value: Number(token.value) };
111
+ }
112
+ if (token.type === 'string') {
113
+ this.index += 1;
114
+ return { kind: 'string', value: String(token.value) };
115
+ }
116
+ if (token.type === 'lparen') {
117
+ this.index += 1;
118
+ const inner = this.parseExpression();
119
+ if (this.peek().type !== 'rparen') {
120
+ this.report(this.peek().start, IR_DIAGNOSTIC_CODES.policyUnclosedParen, 'unclosed parenthesis in policy expression', 'add the matching ")"');
121
+ return inner;
122
+ }
123
+ this.index += 1;
124
+ return inner;
125
+ }
126
+ if (token.type === 'identifier') {
127
+ return this.parseCallOrIdentifier();
128
+ }
129
+ this.report(token.start, IR_DIAGNOSTIC_CODES.policyExpected, token.type === 'eof'
130
+ ? 'unexpected end of policy expression'
131
+ : `unexpected ${tokenText(token)} in policy expression`, 'expected a builtin call such as isAuthenticated(), true/false, or a parenthesized expression');
132
+ return undefined;
133
+ }
134
+ parseCallOrIdentifier() {
135
+ const token = this.peek();
136
+ const name = String(token.value);
137
+ this.index += 1;
138
+ if (this.peek().type !== 'lparen') {
139
+ this.report(token.start, IR_DIAGNOSTIC_CODES.policyUnknownIdentifier, `unknown identifier "${name}"`, 'bare identifiers are not values; call one of the builtins hasRole, hasScope, isAuthenticated');
140
+ return undefined;
141
+ }
142
+ if (!isPolicyBuiltin(name)) {
143
+ this.report(token.start, IR_DIAGNOSTIC_CODES.policyUnknownBuiltin, `unknown builtin "${name}"`, 'a policy naming a builtin the runtime cannot evaluate is rejected rather than treated as true');
144
+ this.skipCallArguments();
145
+ return undefined;
146
+ }
147
+ this.index += 1;
148
+ const args = [];
149
+ if (this.peek().type !== 'rparen') {
150
+ for (;;) {
151
+ const argument = this.parsePrimary();
152
+ if (argument === undefined)
153
+ break;
154
+ args.push(argument);
155
+ if (this.peek().type !== 'comma')
156
+ break;
157
+ this.index += 1;
158
+ }
159
+ }
160
+ if (this.peek().type !== 'rparen') {
161
+ this.report(this.peek().start, IR_DIAGNOSTIC_CODES.policyUnclosedParen, `unclosed argument list for ${name}(...)`, 'add the matching ")"');
162
+ return undefined;
163
+ }
164
+ this.index += 1;
165
+ const arity = POLICY_BUILTIN_ARITY[name];
166
+ if (args.length !== arity) {
167
+ this.report(token.start, IR_DIAGNOSTIC_CODES.policyArity, `${name}() takes ${arity} argument${arity === 1 ? '' : 's'}, received ${args.length}`);
168
+ return undefined;
169
+ }
170
+ if (arity === 1 && args[0]?.kind !== 'string') {
171
+ this.report(token.start, IR_DIAGNOSTIC_CODES.policyArgumentType, `${name}() expects a string literal argument`);
172
+ return undefined;
173
+ }
174
+ const call = { kind: 'call', name: name, args };
175
+ return call;
176
+ }
177
+ /** Consumes a rejected call's arguments so one bad builtin yields one error. */
178
+ skipCallArguments() {
179
+ let depth = 1;
180
+ while (!this.atEnd() && depth > 0) {
181
+ const token = this.peek();
182
+ if (token.type === 'lparen')
183
+ depth += 1;
184
+ if (token.type === 'rparen')
185
+ depth -= 1;
186
+ this.index += 1;
187
+ }
188
+ }
189
+ isOperator(value) {
190
+ const token = this.peek();
191
+ return token.type === 'operator' && token.value === value;
192
+ }
193
+ report(offset, code, message, hint) {
194
+ this.diagnostics.push(policyDiagnostic(this.source, this.context, offset, code, message, hint));
195
+ }
196
+ }
197
+ function toComparisonOperator(value) {
198
+ return COMPARISON_OPERATORS.includes(value)
199
+ ? value
200
+ : undefined;
201
+ }
202
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/policy/parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAqB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAClG,OAAO,EACL,oBAAoB,EAEpB,eAAe,EACf,oBAAoB,GAIrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAGL,gBAAgB,EAChB,QAAQ,EACR,SAAS,GACV,MAAM,YAAY,CAAC;AAOpB,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,OAAO,GAAkB,EAAE;IACzE,MAAM,WAAW,GAAmB,EAAE,CAAC;IAEvC,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACzB,WAAW,CAAC,IAAI,CACd,gBAAgB,CACd,MAAM,EACN,OAAO,EACP,CAAC,EACD,mBAAmB,CAAC,WAAW,EAC/B,yBAAyB,EACzB,uEAAuE,CACxE,CACF,CAAC;QACF,OAAO,EAAE,WAAW,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QACrC,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5B,WAAW,CAAC,IAAI,CACd,gBAAgB,CACd,MAAM,EACN,OAAO,EACP,KAAK,CAAC,KAAK,EACX,mBAAmB,CAAC,mBAAmB,EACvC,uBAAuB,SAAS,CAAC,KAAK,CAAC,8BAA8B,EACrE,iEAAiE,CAClE,CACF,CAAC;QACJ,CAAC;QACD,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC;YAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QACpF,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,IAAI,CACd,YAAY,CACV,OAAO,CAAC;YACN,IAAI,EAAE,mBAAmB,CAAC,YAAY;YACtC,OAAO,EAAE,0CACP,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE;YACF,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,EACF,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CACvB,CACF,CAAC;QACF,OAAO,EAAE,WAAW,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,MAAM;IAIS,MAAM;IACN,OAAO;IACP,MAAM;IACN,WAAW;IANtB,KAAK,GAAG,CAAC,CAAC;IAElB,YACmB,MAAc,EACd,OAAsB,EACtB,MAAqB,EACrB,WAA2B;sBAH3B,MAAM;uBACN,OAAO;sBACP,MAAM;2BACN,WAAW;IAC3B,CAAC;IAEJ,KAAK;QACH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,MAAM,GAAG,CAAC;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACjF,OAAO,KAAoB,CAAC;IAC9B,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,IAAI,IAAI,KAAK,CAAC;YACpE,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,QAAQ;QACd,IAAI,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACrC,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,IAAI,IAAI,KAAK,CAAC;YACpE,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,eAAe;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7F,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAClC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,IAAI,KAAK,CAAC;QACpE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACjD,CAAC;IAEO,UAAU;QAChB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAChB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACtE,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAEO,YAAY;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE1B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAChB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAChB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAChB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,MAAM,CACT,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EACjB,mBAAmB,CAAC,mBAAmB,EACvC,2CAA2C,EAC3C,sBAAsB,CACvB,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,MAAM,CACT,KAAK,CAAC,KAAK,EACX,mBAAmB,CAAC,cAAc,EAClC,KAAK,CAAC,IAAI,KAAK,KAAK;YAClB,CAAC,CAAC,qCAAqC;YACvC,CAAC,CAAC,cAAc,SAAS,CAAC,KAAK,CAAC,uBAAuB,EACzD,8FAA8F,CAC/F,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,qBAAqB;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAEhB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CACT,KAAK,CAAC,KAAK,EACX,mBAAmB,CAAC,uBAAuB,EAC3C,uBAAuB,IAAI,GAAG,EAC9B,8FAA8F,CAC/F,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CACT,KAAK,CAAC,KAAK,EACX,mBAAmB,CAAC,oBAAoB,EACxC,oBAAoB,IAAI,GAAG,EAC3B,+FAA+F,CAChG,CAAC;YACF,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAChB,MAAM,IAAI,GAAiB,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,SAAS,CAAC;gBACR,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;gBACrC,IAAI,QAAQ,KAAK,SAAS;oBAAE,MAAM;gBAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACpB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO;oBAAE,MAAM;gBACxC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CACT,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EACjB,mBAAmB,CAAC,mBAAmB,EACvC,8BAA8B,IAAI,OAAO,EACzC,sBAAsB,CACvB,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAEhB,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CACT,KAAK,CAAC,KAAK,EACX,mBAAmB,CAAC,WAAW,EAC/B,GAAG,IAAI,YAAY,KAAK,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,cAAc,IAAI,CAAC,MAAM,EAAE,CACtF,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,CACT,KAAK,CAAC,KAAK,EACX,mBAAmB,CAAC,kBAAkB,EACtC,GAAG,IAAI,sCAAsC,CAC9C,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAqB,EAAE,IAAI,EAAE,CAAC;QAC7E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gFAAgF;IACxE,iBAAiB;QACvB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,KAAK,IAAI,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,KAAK,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,KAAa;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC;IAC5D,CAAC;IAEO,MAAM,CACZ,MAAc,EACd,IAAoE,EACpE,OAAe,EACf,IAAa;QAEb,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAClG,CAAC;CACF;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,OAAQ,oBAA0C,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChE,CAAC,CAAE,KAA4B;QAC/B,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * PredicateExpr AST. The eval-time counterpart to `PolicyExpr`: a closed grammar for
3
+ * an `assert` metric's condition, evaluated against one `(case, prediction)` pair.
4
+ *
5
+ * It is deliberately *not* `PolicyExpr`. A policy answers "who is asking?" from a
6
+ * `Principal`; a predicate answers "is this output acceptable?" from a dataset case
7
+ * and a prediction. They share no operand, so reusing the policy grammar would mean
8
+ * leaving three builtins the evaluator could never bind and adding a path production
9
+ * it has no context for -- a grammar that documents two contexts at once.
10
+ *
11
+ * expression := or
12
+ * or := and ('or' and)*
13
+ * and := not ('and' not)*
14
+ * not := 'not' not | comparison
15
+ * comparison := primary (('==' | '!=' | '<' | '<=' | '>' | '>=') primary)?
16
+ * primary := 'true' | 'false' | string | number | path | call | '(' expression ')'
17
+ * path := 'prediction' | 'case' '.' 'id' | 'case' '.' 'metadata' '.' NAME
18
+ * call := builtin '(' primary (',' primary)* ')'
19
+ *
20
+ * Precedence, tightest first: comparison, `not`, `and`, `or`. `not` is looser than
21
+ * a comparison so that `not prediction == "a"` negates the comparison; tighter and
22
+ * it would negate a string and reach the evaluator as a well-typed-looking tree.
23
+ *
24
+ * The AST is plain JSON so it can be embedded in the IR and interpreted by any
25
+ * target without a second parser.
26
+ */
27
+ /**
28
+ * The three things an expression may read.
29
+ *
30
+ * Nothing else: there is no step counter, no loop variable, and no ambient config,
31
+ * because an eval case is the whole of the context at the point a metric scores.
32
+ * Every one of these is statically a string, which is what makes an unbound
33
+ * `case.metadata.<name>` the only dynamic lookup in the language.
34
+ */
35
+ export declare const PREDICATE_PATHS: readonly ['prediction', 'case.id', 'case.metadata'];
36
+ export type PredicatePathRoot = (typeof PREDICATE_PATHS)[number];
37
+ /** Closed builtin set. No regex, no model call, no I/O: every call is total. */
38
+ export declare const PREDICATE_BUILTINS: readonly ['contains', 'startswith', 'endswith', 'length'];
39
+ export type PredicateBuiltin = (typeof PREDICATE_BUILTINS)[number];
40
+ /** Arity of each builtin; the parser rejects any other argument count. */
41
+ export declare const PREDICATE_BUILTIN_ARITY: Record<PredicateBuiltin, number>;
42
+ export declare const PREDICATE_OPERATORS: readonly ['==', '!=', '<=', '>=', '<', '>'];
43
+ export type PredicateOperator = (typeof PREDICATE_OPERATORS)[number];
44
+ /**
45
+ * Operators that order rather than test equality.
46
+ *
47
+ * Numeric-only on purpose. Python compares `str` by code point and JavaScript by
48
+ * UTF-16 code unit, so `<` on strings is the one place a shared grammar would give
49
+ * the two runtimes different answers; refusing it keeps them identical instead of
50
+ * documenting the divergence and hoping nobody hits it.
51
+ */
52
+ export declare const ORDERING_OPERATORS: readonly ['<=', '>=', '<', '>'];
53
+ export type OrderingOperator = (typeof ORDERING_OPERATORS)[number];
54
+ export interface PredicatePrediction {
55
+ kind: 'path';
56
+ path: 'prediction';
57
+ }
58
+ export interface PredicateCaseId {
59
+ kind: 'path';
60
+ path: 'case.id';
61
+ }
62
+ export interface PredicateMetadata {
63
+ kind: 'path';
64
+ path: 'case.metadata';
65
+ name: string;
66
+ }
67
+ export type PredicatePath = PredicateMetadata | PredicateCaseId | PredicatePrediction;
68
+ /** A builtin call. Arguments are nodes; only the builtins above are accepted. */
69
+ export interface PredicateCall {
70
+ kind: 'call';
71
+ name: PredicateBuiltin;
72
+ args: PredicateNode[];
73
+ }
74
+ export interface PredicateComparison {
75
+ kind: 'comparison';
76
+ op: PredicateOperator;
77
+ left: PredicateNode;
78
+ right: PredicateNode;
79
+ }
80
+ export interface PredicateLogical {
81
+ kind: 'and' | 'or';
82
+ left: PredicateNode;
83
+ right: PredicateNode;
84
+ }
85
+ export interface PredicateNot {
86
+ kind: 'not';
87
+ operand: PredicateNode;
88
+ }
89
+ /**
90
+ * A source that could not be parsed.
91
+ *
92
+ * Carried as a node rather than as `undefined` so a parse failure can never be
93
+ * mistaken for "no condition": the caller holds a node either way, and the
94
+ * accompanying diagnostic is what stops the build.
95
+ */
96
+ export interface PredicateInvalid {
97
+ kind: 'invalid';
98
+ reason: string;
99
+ }
100
+ export type PredicateNode = PredicateCall | PredicateComparison | PredicateInvalid | PredicateLogical | PredicateNot | PredicatePath | {
101
+ kind: 'string';
102
+ value: string;
103
+ } | {
104
+ kind: 'number';
105
+ value: number;
106
+ } | {
107
+ kind: 'boolean';
108
+ value: boolean;
109
+ };
110
+ /** A parsed predicate expression; always a node, never the source string. */
111
+ export type PredicateExpr = PredicateNode;
112
+ export declare function isPredicateBuiltin(name: string): name is PredicateBuiltin;
113
+ export declare function isOrderingOperator(op: PredicateOperator): op is OrderingOperator;
114
+ /**
115
+ * Whether a node is boolean by construction.
116
+ *
117
+ * Checked at build time so a whole expression that evaluates to a string or a
118
+ * number is refused with a parse error instead of surfacing as "not a pass" at
119
+ * eval time. `length(prediction)` is the reachable case: a metric whose score
120
+ * hinges on it is a mistake, not a false assertion.
121
+ */
122
+ export declare function predicateIsBoolean(node: PredicateNode): boolean;
123
+ /** Renders an AST back to a normalized source form, for diagnostic messages. */
124
+ export declare function formatPredicateExpr(node: PredicateNode): string;
125
+ //# sourceMappingURL=ast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/predicate/ast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * PredicateExpr AST. The eval-time counterpart to `PolicyExpr`: a closed grammar for
3
+ * an `assert` metric's condition, evaluated against one `(case, prediction)` pair.
4
+ *
5
+ * It is deliberately *not* `PolicyExpr`. A policy answers "who is asking?" from a
6
+ * `Principal`; a predicate answers "is this output acceptable?" from a dataset case
7
+ * and a prediction. They share no operand, so reusing the policy grammar would mean
8
+ * leaving three builtins the evaluator could never bind and adding a path production
9
+ * it has no context for -- a grammar that documents two contexts at once.
10
+ *
11
+ * expression := or
12
+ * or := and ('or' and)*
13
+ * and := not ('and' not)*
14
+ * not := 'not' not | comparison
15
+ * comparison := primary (('==' | '!=' | '<' | '<=' | '>' | '>=') primary)?
16
+ * primary := 'true' | 'false' | string | number | path | call | '(' expression ')'
17
+ * path := 'prediction' | 'case' '.' 'id' | 'case' '.' 'metadata' '.' NAME
18
+ * call := builtin '(' primary (',' primary)* ')'
19
+ *
20
+ * Precedence, tightest first: comparison, `not`, `and`, `or`. `not` is looser than
21
+ * a comparison so that `not prediction == "a"` negates the comparison; tighter and
22
+ * it would negate a string and reach the evaluator as a well-typed-looking tree.
23
+ *
24
+ * The AST is plain JSON so it can be embedded in the IR and interpreted by any
25
+ * target without a second parser.
26
+ */
27
+ /**
28
+ * The three things an expression may read.
29
+ *
30
+ * Nothing else: there is no step counter, no loop variable, and no ambient config,
31
+ * because an eval case is the whole of the context at the point a metric scores.
32
+ * Every one of these is statically a string, which is what makes an unbound
33
+ * `case.metadata.<name>` the only dynamic lookup in the language.
34
+ */
35
+ export const PREDICATE_PATHS = ['prediction', 'case.id', 'case.metadata'];
36
+ /** Closed builtin set. No regex, no model call, no I/O: every call is total. */
37
+ export const PREDICATE_BUILTINS = ['contains', 'startswith', 'endswith', 'length'];
38
+ /** Arity of each builtin; the parser rejects any other argument count. */
39
+ export const PREDICATE_BUILTIN_ARITY = {
40
+ contains: 2,
41
+ startswith: 2,
42
+ endswith: 2,
43
+ length: 1,
44
+ };
45
+ export const PREDICATE_OPERATORS = ['==', '!=', '<=', '>=', '<', '>'];
46
+ /**
47
+ * Operators that order rather than test equality.
48
+ *
49
+ * Numeric-only on purpose. Python compares `str` by code point and JavaScript by
50
+ * UTF-16 code unit, so `<` on strings is the one place a shared grammar would give
51
+ * the two runtimes different answers; refusing it keeps them identical instead of
52
+ * documenting the divergence and hoping nobody hits it.
53
+ */
54
+ export const ORDERING_OPERATORS = ['<=', '>=', '<', '>'];
55
+ export function isPredicateBuiltin(name) {
56
+ return PREDICATE_BUILTINS.includes(name);
57
+ }
58
+ export function isOrderingOperator(op) {
59
+ return ORDERING_OPERATORS.includes(op);
60
+ }
61
+ /**
62
+ * Whether a node is boolean by construction.
63
+ *
64
+ * Checked at build time so a whole expression that evaluates to a string or a
65
+ * number is refused with a parse error instead of surfacing as "not a pass" at
66
+ * eval time. `length(prediction)` is the reachable case: a metric whose score
67
+ * hinges on it is a mistake, not a false assertion.
68
+ */
69
+ export function predicateIsBoolean(node) {
70
+ switch (node.kind) {
71
+ case 'and':
72
+ case 'comparison':
73
+ case 'not':
74
+ case 'or':
75
+ return true;
76
+ case 'boolean':
77
+ return true;
78
+ case 'call':
79
+ return node.name !== 'length';
80
+ case 'invalid':
81
+ case 'number':
82
+ case 'path':
83
+ case 'string':
84
+ return false;
85
+ }
86
+ }
87
+ /** Renders an AST back to a normalized source form, for diagnostic messages. */
88
+ export function formatPredicateExpr(node) {
89
+ switch (node.kind) {
90
+ case 'string':
91
+ return JSON.stringify(node.value);
92
+ case 'number':
93
+ return String(node.value);
94
+ case 'boolean':
95
+ return node.value ? 'true' : 'false';
96
+ case 'invalid':
97
+ return `<invalid: ${node.reason}>`;
98
+ case 'path':
99
+ return node.path === 'case.metadata' ? `case.metadata.${node.name}` : node.path;
100
+ case 'call':
101
+ return `${node.name}(${node.args.map(formatPredicateExpr).join(', ')})`;
102
+ case 'comparison':
103
+ return `${formatPredicateExpr(node.left)} ${node.op} ${formatPredicateExpr(node.right)}`;
104
+ case 'and':
105
+ case 'or':
106
+ return `(${formatPredicateExpr(node.left)} ${node.kind} ${formatPredicateExpr(node.right)})`;
107
+ case 'not':
108
+ return `not ${formatPredicateExpr(node.operand)}`;
109
+ }
110
+ }
111
+ //# sourceMappingURL=ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/predicate/ast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type { OrderingOperator, PredicateBuiltin, PredicateCall, PredicateCaseId, PredicateComparison, PredicateExpr, PredicateInvalid, PredicateLogical, PredicateMetadata, PredicateNode, PredicateNot, PredicateOperator, PredicatePath, PredicatePathRoot, PredicatePrediction, } from './ast.js';
2
+ export { formatPredicateExpr, isOrderingOperator, isPredicateBuiltin, ORDERING_OPERATORS, PREDICATE_BUILTIN_ARITY, PREDICATE_BUILTINS, PREDICATE_OPERATORS, PREDICATE_PATHS, predicateIsBoolean, } from './ast.js';
3
+ export type { PredicateContext, PredicateLexResult, PredicateToken, PredicateTokenType, } from './lexer.js';
4
+ export { tokenizePredicate, tokenText } from './lexer.js';
5
+ export type { PredicateParseResult } from './parser.js';
6
+ export { parsePredicateExpr } from './parser.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/predicate/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC1D,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { formatPredicateExpr, isOrderingOperator, isPredicateBuiltin, ORDERING_OPERATORS, PREDICATE_BUILTIN_ARITY, PREDICATE_BUILTINS, PREDICATE_OPERATORS, PREDICATE_PATHS, predicateIsBoolean, } from './ast.js';
2
+ export { tokenizePredicate, tokenText } from './lexer.js';
3
+ export { parsePredicateExpr } from './parser.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/predicate/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAOlB,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * PredicateExpr lexer. Tracks byte offsets so every diagnostic points at the
3
+ * offending span. Never throws: malformed input yields tokens plus diagnostics.
4
+ *
5
+ * The only difference from the policy lexer is `.`, which is what makes
6
+ * `case.metadata.<name>` one path rather than three identifiers.
7
+ */
8
+ import type { DiagnosticPath } from '@aid-framework/spec';
9
+ import { IR_DIAGNOSTIC_CODES, type IrDiagnostic } from '../diagnostics.js';
10
+ export type PredicateTokenType = 'boolean' | 'number' | 'string' | 'identifier' | 'operator' | 'lparen' | 'rparen' | 'comma' | 'dot' | 'eof';
11
+ export interface PredicateToken {
12
+ type: PredicateTokenType;
13
+ /** Decoded value for literals and identifiers; the raw text for operators. */
14
+ value: string | number | boolean;
15
+ start: number;
16
+ end: number;
17
+ }
18
+ export interface PredicateContext {
19
+ path?: DiagnosticPath;
20
+ file?: string;
21
+ }
22
+ export interface PredicateLexResult {
23
+ tokens: PredicateToken[];
24
+ diagnostics: IrDiagnostic[];
25
+ }
26
+ export declare function predicateDiagnostic(source: string, context: PredicateContext, offset: number, code: (typeof IR_DIAGNOSTIC_CODES)[keyof typeof IR_DIAGNOSTIC_CODES], message: string, hint?: string): IrDiagnostic;
27
+ export declare function tokenizePredicate(source: string, context?: PredicateContext): PredicateLexResult;
28
+ /** The token's text as written, for messages. */
29
+ export declare function tokenText(token: PredicateToken): string;
30
+ //# sourceMappingURL=lexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../../src/predicate/lexer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EACL,mBAAmB,EACnB,KAAK,YAAY,EAIlB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,kBAAkB,GAC1B,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,KAAK,GACL,KAAK,CAAC;AAEV,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,WAAW,EAAE,YAAY,EAAE,CAAC;CAC7B;AAID,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,EACpE,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,GACZ,YAAY,CAOd;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,gBAAqB,GAC7B,kBAAkB,CA4FpB;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAIvD"}