behavior-contracts 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +58 -0
- package/dist/canonical.d.ts +46 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +182 -0
- package/dist/canonical.js.map +1 -0
- package/dist/codec.d.ts +24 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +65 -0
- package/dist/codec.js.map +1 -0
- package/dist/envelope.d.ts +34 -0
- package/dist/envelope.d.ts.map +1 -0
- package/dist/envelope.js +61 -0
- package/dist/envelope.js.map +1 -0
- package/dist/expr-eval.d.ts +28 -0
- package/dist/expr-eval.d.ts.map +1 -0
- package/dist/expr-eval.js +334 -0
- package/dist/expr-eval.js.map +1 -0
- package/dist/guard.d.ts +27 -0
- package/dist/guard.d.ts.map +1 -0
- package/dist/guard.js +43 -0
- package/dist/guard.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/plan.d.ts +82 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +127 -0
- package/dist/plan.js.map +1 -0
- package/dist/template.d.ts +35 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +66 -0
- package/dist/template.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* expr-eval.ts — expression-ir.md の参照評価器(規範実装)。
|
|
3
|
+
*
|
|
4
|
+
* 値モデル(../expression-ir.md §5):
|
|
5
|
+
* int = bigint(i64 checked) / float = number(IEEE754, NaN/Inf は Failure)
|
|
6
|
+
* / string / bool / null / arr / obj
|
|
7
|
+
*
|
|
8
|
+
* 規範ポイント(§6/§8 の罠に対応):
|
|
9
|
+
* - int 演算は checked i64(オーバーフロー = Failure)。TS では BigInt で実装
|
|
10
|
+
* - 評価結果が NaN / ±Infinity になった時点で Failure
|
|
11
|
+
* - mod は truncated division(符号は被除数。Python の % と異なる)
|
|
12
|
+
* - 文字列比較は code point 順(TS ネイティブ `<` の UTF-16 順ではない)
|
|
13
|
+
* - and / or / coalesce / cond は短絡評価(短絡側の Failure は発生しない)
|
|
14
|
+
* - 未知オペレータは fail-closed
|
|
15
|
+
*/
|
|
16
|
+
export class ExprFailure extends Error {
|
|
17
|
+
code;
|
|
18
|
+
constructor(code, message) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.code = code;
|
|
21
|
+
this.name = "ExprFailure";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function fail(code, message) {
|
|
25
|
+
throw new ExprFailure(code, message);
|
|
26
|
+
}
|
|
27
|
+
// ── i64 / f64 規範 ──────────────────────────────────────────────────────────
|
|
28
|
+
const I64_MIN = -(2n ** 63n);
|
|
29
|
+
const I64_MAX = 2n ** 63n - 1n;
|
|
30
|
+
const WIDEN_EXACT = 2n ** 53n; // div widening の正確域(±2^53 は double で正確)
|
|
31
|
+
function checkI64(v) {
|
|
32
|
+
if (v < I64_MIN || v > I64_MAX)
|
|
33
|
+
fail("INT_OVERFLOW", `i64 overflow: ${v}`);
|
|
34
|
+
return v;
|
|
35
|
+
}
|
|
36
|
+
function checkFinite(v) {
|
|
37
|
+
if (!Number.isFinite(v))
|
|
38
|
+
fail("NAN_OR_INF", `non-finite float: ${v}`);
|
|
39
|
+
return v;
|
|
40
|
+
}
|
|
41
|
+
function widenToFloat(v) {
|
|
42
|
+
if (typeof v === "number")
|
|
43
|
+
return v;
|
|
44
|
+
if (typeof v === "bigint") {
|
|
45
|
+
if (v > WIDEN_EXACT || v < -WIDEN_EXACT)
|
|
46
|
+
fail("PRECISION_LOSS", `int ${v} exceeds exact float range (±2^53)`);
|
|
47
|
+
return Number(v);
|
|
48
|
+
}
|
|
49
|
+
fail("TYPE_MISMATCH", `numeric operand expected, got ${typeName(v)}`);
|
|
50
|
+
}
|
|
51
|
+
// ── 文字列比較(code point 順 = UTF-8 バイト順。UTF-16 順ではない)────────────
|
|
52
|
+
export function cmpCodePoints(a, b) {
|
|
53
|
+
const ia = a[Symbol.iterator]();
|
|
54
|
+
const ib = b[Symbol.iterator]();
|
|
55
|
+
for (;;) {
|
|
56
|
+
const ra = ia.next();
|
|
57
|
+
const rb = ib.next();
|
|
58
|
+
if (ra.done && rb.done)
|
|
59
|
+
return 0;
|
|
60
|
+
if (ra.done)
|
|
61
|
+
return -1;
|
|
62
|
+
if (rb.done)
|
|
63
|
+
return 1;
|
|
64
|
+
const ca = ra.value.codePointAt(0);
|
|
65
|
+
const cb = rb.value.codePointAt(0);
|
|
66
|
+
if (ca !== cb)
|
|
67
|
+
return ca < cb ? -1 : 1;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// ── 型ユーティリティ ─────────────────────────────────────────────────────────
|
|
71
|
+
function typeName(v) {
|
|
72
|
+
if (v === null)
|
|
73
|
+
return "null";
|
|
74
|
+
if (typeof v === "bigint")
|
|
75
|
+
return "int";
|
|
76
|
+
if (typeof v === "number")
|
|
77
|
+
return "float";
|
|
78
|
+
if (Array.isArray(v))
|
|
79
|
+
return "arr";
|
|
80
|
+
return typeof v; // string / boolean / object
|
|
81
|
+
}
|
|
82
|
+
function requireBool(v, ctx) {
|
|
83
|
+
if (typeof v !== "boolean")
|
|
84
|
+
fail("TYPE_MISMATCH", `${ctx}: bool expected, got ${typeName(v)}(truthiness は存在しない)`);
|
|
85
|
+
return v;
|
|
86
|
+
}
|
|
87
|
+
function isPlainObject(v) {
|
|
88
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
89
|
+
}
|
|
90
|
+
// ── 評価器本体 ───────────────────────────────────────────────────────────────
|
|
91
|
+
export function evaluate(node, scope = {}) {
|
|
92
|
+
// リテラル
|
|
93
|
+
if (node === null)
|
|
94
|
+
return null;
|
|
95
|
+
if (typeof node === "boolean" || typeof node === "string")
|
|
96
|
+
return node;
|
|
97
|
+
if (typeof node === "number") {
|
|
98
|
+
// 分類規則(§2.3): 整数値 → int(安全整数域内に限る)、小数部あり → float
|
|
99
|
+
if (Number.isInteger(node)) {
|
|
100
|
+
if (!Number.isSafeInteger(node))
|
|
101
|
+
fail("INVALID_LITERAL", `integral number literal ${node} exceeds safe range; use {int:"..."}`);
|
|
102
|
+
return BigInt(node);
|
|
103
|
+
}
|
|
104
|
+
return checkFinite(node);
|
|
105
|
+
}
|
|
106
|
+
if (Array.isArray(node))
|
|
107
|
+
fail("INVALID_NODE", "bare array is not an expression (use {arr:[...]})");
|
|
108
|
+
if (!isPlainObject(node))
|
|
109
|
+
fail("INVALID_NODE", `invalid node: ${String(node)}`);
|
|
110
|
+
// オペレータノード = 単一キー
|
|
111
|
+
const keys = Object.keys(node);
|
|
112
|
+
if (keys.length !== 1)
|
|
113
|
+
fail("INVALID_NODE", `operator node must have exactly one key, got [${keys.join(", ")}]`);
|
|
114
|
+
const op = keys[0];
|
|
115
|
+
const arg = node[op];
|
|
116
|
+
switch (op) {
|
|
117
|
+
// ── リテラルラッパ ──
|
|
118
|
+
case "int": {
|
|
119
|
+
if (typeof arg !== "string")
|
|
120
|
+
fail("INVALID_NODE", "{int: ...} expects a string");
|
|
121
|
+
let v;
|
|
122
|
+
try {
|
|
123
|
+
v = BigInt(arg);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
fail("INVALID_LITERAL", `invalid int literal: ${arg}`);
|
|
127
|
+
}
|
|
128
|
+
return checkI64(v);
|
|
129
|
+
}
|
|
130
|
+
case "float": {
|
|
131
|
+
if (typeof arg !== "number")
|
|
132
|
+
fail("INVALID_NODE", "{float: ...} expects a number");
|
|
133
|
+
return checkFinite(arg);
|
|
134
|
+
}
|
|
135
|
+
// ── 参照 ──
|
|
136
|
+
case "ref":
|
|
137
|
+
case "refOpt": {
|
|
138
|
+
const path = argArray(op, arg);
|
|
139
|
+
if (path.length === 0 || !path.every((p) => typeof p === "string"))
|
|
140
|
+
fail("INVALID_NODE", `${op} expects a non-empty string path`);
|
|
141
|
+
const [head, ...rest] = path;
|
|
142
|
+
if (!Object.prototype.hasOwnProperty.call(scope, head))
|
|
143
|
+
fail("UNKNOWN_BINDING", `unknown binding: ${head}`);
|
|
144
|
+
let cur = scope[head];
|
|
145
|
+
for (const seg of rest) {
|
|
146
|
+
if (cur === null) {
|
|
147
|
+
if (op === "refOpt")
|
|
148
|
+
return null; // ?. の null 伝播
|
|
149
|
+
fail("NULL_REF", `null intermediate at .${seg}(?. を使う)`);
|
|
150
|
+
}
|
|
151
|
+
if (!isPlainObject(cur))
|
|
152
|
+
fail("TYPE_MISMATCH", `cannot access .${seg} on ${typeName(cur)}`);
|
|
153
|
+
if (!Object.prototype.hasOwnProperty.call(cur, seg))
|
|
154
|
+
fail("MISSING_PROP", `missing property .${seg}`);
|
|
155
|
+
cur = cur[seg];
|
|
156
|
+
}
|
|
157
|
+
return cur;
|
|
158
|
+
}
|
|
159
|
+
// ── 構築 ──
|
|
160
|
+
case "obj": {
|
|
161
|
+
if (!isPlainObject(arg))
|
|
162
|
+
fail("INVALID_NODE", "{obj: ...} expects an object");
|
|
163
|
+
const out = {};
|
|
164
|
+
for (const [k, v] of Object.entries(arg))
|
|
165
|
+
out[k] = evaluate(v, scope);
|
|
166
|
+
return out;
|
|
167
|
+
}
|
|
168
|
+
case "arr":
|
|
169
|
+
return argArray(op, arg).map((e) => evaluate(e, scope));
|
|
170
|
+
// ── 数値(モノモーフィック・checked)──
|
|
171
|
+
case "add":
|
|
172
|
+
case "sub":
|
|
173
|
+
case "mul": {
|
|
174
|
+
const [a, b] = evalBinary(op, arg, scope);
|
|
175
|
+
if (typeof a === "bigint" && typeof b === "bigint") {
|
|
176
|
+
const r = op === "add" ? a + b : op === "sub" ? a - b : a * b;
|
|
177
|
+
return checkI64(r);
|
|
178
|
+
}
|
|
179
|
+
if (typeof a === "number" && typeof b === "number") {
|
|
180
|
+
const r = op === "add" ? a + b : op === "sub" ? a - b : a * b;
|
|
181
|
+
return checkFinite(r);
|
|
182
|
+
}
|
|
183
|
+
fail("TYPE_MISMATCH", `${op}: int×int か float×float(got ${typeName(a)}×${typeName(b)}。混在は明示変換が必要)`);
|
|
184
|
+
}
|
|
185
|
+
case "neg": {
|
|
186
|
+
const a = evaluate(argUnary(op, arg), scope);
|
|
187
|
+
if (typeof a === "bigint")
|
|
188
|
+
return checkI64(-a);
|
|
189
|
+
if (typeof a === "number")
|
|
190
|
+
return checkFinite(-a);
|
|
191
|
+
fail("TYPE_MISMATCH", `neg: numeric expected, got ${typeName(a)}`);
|
|
192
|
+
}
|
|
193
|
+
case "div": {
|
|
194
|
+
// 常に float 除算(TS 意味論)。int は正確に widening、0 除算は NaN/Inf 規則で Failure
|
|
195
|
+
const [a, b] = evalBinary(op, arg, scope);
|
|
196
|
+
return checkFinite(widenToFloat(a) / widenToFloat(b));
|
|
197
|
+
}
|
|
198
|
+
case "mod": {
|
|
199
|
+
// truncated division の剰余。符号は被除数(TS/Rust/Go/PHP と一致。Python は要注意)
|
|
200
|
+
const [a, b] = evalBinary(op, arg, scope);
|
|
201
|
+
if (typeof a === "bigint" && typeof b === "bigint") {
|
|
202
|
+
if (b === 0n)
|
|
203
|
+
fail("MOD_ZERO", "int mod by zero");
|
|
204
|
+
return checkI64(a % b); // JS bigint % は truncated
|
|
205
|
+
}
|
|
206
|
+
if (typeof a === "number" && typeof b === "number")
|
|
207
|
+
return checkFinite(a % b);
|
|
208
|
+
fail("TYPE_MISMATCH", `mod: int×int か float×float(got ${typeName(a)}×${typeName(b)})`);
|
|
209
|
+
}
|
|
210
|
+
// ── 文字列 ──
|
|
211
|
+
case "concat": {
|
|
212
|
+
const parts = argArray(op, arg).map((e) => evaluate(e, scope));
|
|
213
|
+
for (const p of parts)
|
|
214
|
+
if (typeof p !== "string")
|
|
215
|
+
fail("TYPE_MISMATCH", `concat: string のみ(got ${typeName(p)}。数値の暗黙 toString は存在しない)`);
|
|
216
|
+
return parts.join("");
|
|
217
|
+
}
|
|
218
|
+
// ── 比較 ──
|
|
219
|
+
case "eq":
|
|
220
|
+
case "ne": {
|
|
221
|
+
const [a, b] = evalBinary(op, arg, scope);
|
|
222
|
+
const equal = valueEquals(a, b);
|
|
223
|
+
return op === "eq" ? equal : !equal;
|
|
224
|
+
}
|
|
225
|
+
case "lt":
|
|
226
|
+
case "le":
|
|
227
|
+
case "gt":
|
|
228
|
+
case "ge": {
|
|
229
|
+
const [a, b] = evalBinary(op, arg, scope);
|
|
230
|
+
let c;
|
|
231
|
+
if (typeof a === "bigint" && typeof b === "bigint")
|
|
232
|
+
c = a < b ? -1 : a > b ? 1 : 0;
|
|
233
|
+
else if (typeof a === "number" && typeof b === "number")
|
|
234
|
+
c = a < b ? -1 : a > b ? 1 : 0;
|
|
235
|
+
else if (typeof a === "string" && typeof b === "string")
|
|
236
|
+
c = cmpCodePoints(a, b);
|
|
237
|
+
else
|
|
238
|
+
fail("TYPE_MISMATCH", `${op}: 同一型の int/float/string のみ(got ${typeName(a)}×${typeName(b)})`);
|
|
239
|
+
switch (op) {
|
|
240
|
+
case "lt": return c < 0;
|
|
241
|
+
case "le": return c <= 0;
|
|
242
|
+
case "gt": return c > 0;
|
|
243
|
+
case "ge": return c >= 0;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// ── bool / null(短絡評価)──
|
|
247
|
+
case "and":
|
|
248
|
+
case "or": {
|
|
249
|
+
const [ea, eb] = rawBinary(op, arg);
|
|
250
|
+
const a = requireBool(evaluate(ea, scope), op);
|
|
251
|
+
if (op === "and" && !a)
|
|
252
|
+
return false; // 短絡: 右辺は評価されない
|
|
253
|
+
if (op === "or" && a)
|
|
254
|
+
return true;
|
|
255
|
+
return requireBool(evaluate(eb, scope), op);
|
|
256
|
+
}
|
|
257
|
+
case "not":
|
|
258
|
+
return !requireBool(evaluate(argUnary(op, arg), scope), "not");
|
|
259
|
+
case "coalesce": {
|
|
260
|
+
const [ea, eb] = rawBinary(op, arg);
|
|
261
|
+
const a = evaluate(ea, scope);
|
|
262
|
+
return a === null ? evaluate(eb, scope) : a; // 右辺は遅延評価
|
|
263
|
+
}
|
|
264
|
+
case "cond": {
|
|
265
|
+
if (!Array.isArray(arg) || arg.length !== 3)
|
|
266
|
+
fail("INVALID_NODE", "cond expects [c, t, e]");
|
|
267
|
+
const c = requireBool(evaluate(arg[0], scope), "cond");
|
|
268
|
+
return evaluate(c ? arg[1] : arg[2], scope); // 採用側のみ評価
|
|
269
|
+
}
|
|
270
|
+
// ── その他 ──
|
|
271
|
+
case "len": {
|
|
272
|
+
const a = evaluate(argUnary(op, arg), scope);
|
|
273
|
+
if (!Array.isArray(a))
|
|
274
|
+
fail("TYPE_MISMATCH", `len: 配列のみ(string length は v1 に存在しない。got ${typeName(a)})`);
|
|
275
|
+
return BigInt(a.length);
|
|
276
|
+
}
|
|
277
|
+
default:
|
|
278
|
+
fail("UNKNOWN_OP", `unknown operator: ${op}(fail-closed)`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// ── 引数ヘルパ ───────────────────────────────────────────────────────────────
|
|
282
|
+
function argArray(op, arg) {
|
|
283
|
+
if (!Array.isArray(arg))
|
|
284
|
+
fail("INVALID_NODE", `${op} expects an args array`);
|
|
285
|
+
return arg;
|
|
286
|
+
}
|
|
287
|
+
function argUnary(op, arg) {
|
|
288
|
+
const a = argArray(op, arg);
|
|
289
|
+
if (a.length !== 1)
|
|
290
|
+
fail("INVALID_NODE", `${op} expects 1 arg`);
|
|
291
|
+
return a[0];
|
|
292
|
+
}
|
|
293
|
+
function rawBinary(op, arg) {
|
|
294
|
+
const a = argArray(op, arg);
|
|
295
|
+
if (a.length !== 2)
|
|
296
|
+
fail("INVALID_NODE", `${op} expects 2 args`);
|
|
297
|
+
return [a[0], a[1]];
|
|
298
|
+
}
|
|
299
|
+
function evalBinary(op, arg, scope) {
|
|
300
|
+
const [ea, eb] = rawBinary(op, arg);
|
|
301
|
+
return [evaluate(ea, scope), evaluate(eb, scope)]; // 左から右
|
|
302
|
+
}
|
|
303
|
+
// ── 等価(eq/ne 用。null 判定を許可、それ以外は同一スカラ型のみ)────────────────
|
|
304
|
+
function valueEquals(a, b) {
|
|
305
|
+
if (a === null || b === null)
|
|
306
|
+
return a === null && b === null;
|
|
307
|
+
const ta = typeName(a);
|
|
308
|
+
const tb = typeName(b);
|
|
309
|
+
if (ta !== tb)
|
|
310
|
+
fail("TYPE_MISMATCH", `eq/ne: 同一型のみ(got ${ta}×${tb})`);
|
|
311
|
+
if (ta === "arr" || ta === "object")
|
|
312
|
+
fail("TYPE_MISMATCH", "eq/ne: obj/arr の等価は v1 で未定義");
|
|
313
|
+
return a === b;
|
|
314
|
+
}
|
|
315
|
+
// ── canonical JSON 用の値エンコード(golden ベクタの言語間共有用)────────────────
|
|
316
|
+
// int → 安全整数域内は JSON number / 超えたら {int:"..."}
|
|
317
|
+
// float → 小数部を持てば JSON number / 整数値は {float: n}
|
|
318
|
+
export function encodeValue(v) {
|
|
319
|
+
if (v === null || typeof v === "boolean" || typeof v === "string")
|
|
320
|
+
return v;
|
|
321
|
+
if (typeof v === "bigint")
|
|
322
|
+
return v >= BigInt(Number.MIN_SAFE_INTEGER) && v <= BigInt(Number.MAX_SAFE_INTEGER)
|
|
323
|
+
? Number(v)
|
|
324
|
+
: { int: v.toString() };
|
|
325
|
+
if (typeof v === "number")
|
|
326
|
+
return Number.isInteger(v) ? { float: v } : v;
|
|
327
|
+
if (Array.isArray(v))
|
|
328
|
+
return v.map(encodeValue);
|
|
329
|
+
return Object.fromEntries(
|
|
330
|
+
// キーソートは code-point 順が規範(canonical-serialization.md §2/§6)。JS 既定の
|
|
331
|
+
// .sort()(UTF-16 code unit 順)は astral-plane キーで食い違うため cmpCodePoints を使う。
|
|
332
|
+
Object.keys(v).sort(cmpCodePoints).map((k) => [k, encodeValue(v[k])]));
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=expr-eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expr-eval.js","sourceRoot":"","sources":["../src/expr-eval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA4BH,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,IAAI,CAAc;IAClB,YAAY,IAAiB,EAAE,OAAe;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,SAAS,IAAI,CAAC,IAAiB,EAAE,OAAe;IAC9C,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,6EAA6E;AAC7E,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;AAC7B,MAAM,OAAO,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,CAAC;AAC/B,MAAM,WAAW,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,wCAAwC;AAEvE,SAAS,QAAQ,CAAC,CAAS;IACzB,IAAI,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,OAAO;QAAE,IAAI,CAAC,cAAc,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,IAAI,CAAC,YAAY,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAC;IACtE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,YAAY,CAAC,CAAQ;IAC5B,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,WAAW,IAAI,CAAC,GAAG,CAAC,WAAW;YACrC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,oCAAoC,CAAC,CAAC;QACvE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,eAAe,EAAE,iCAAiC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAAC,CAAS,EAAE,CAAS;IAChD,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IAChC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IAChC,SAAS,CAAC;QACR,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QACrB,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC;QACjC,IAAI,EAAE,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC;QACtB,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;QACpC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;QACpC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,SAAS,QAAQ,CAAC,CAAQ;IACxB,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,OAAO,CAAC,CAAC,CAAC,4BAA4B;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,CAAQ,EAAE,GAAW;IACxC,IAAI,OAAO,CAAC,KAAK,SAAS;QACxB,IAAI,CAAC,eAAe,EAAE,GAAG,GAAG,wBAAwB,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;IACxF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,aAAa,CAAC,CAAU;IAC/B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,QAAQ,CAAC,IAAa,EAAE,QAAe,EAAE;IACvD,OAAO;IACP,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,OAAO,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvE,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,iDAAiD;QACjD,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;gBAC7B,IAAI,CAAC,iBAAiB,EAAE,2BAA2B,IAAI,sCAAsC,CAAC,CAAC;YACjG,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,cAAc,EAAE,mDAAmD,CAAC,CAAC;IACnG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,cAAc,EAAE,iBAAiB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhF,kBAAkB;IAClB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QACnB,IAAI,CAAC,cAAc,EAAE,iDAAiD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5F,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,MAAM,GAAG,GAAI,IAAgC,CAAC,EAAE,CAAC,CAAC;IAElD,QAAQ,EAAE,EAAE,CAAC;QACX,gBAAgB;QAChB,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,IAAI,CAAC,cAAc,EAAE,6BAA6B,CAAC,CAAC;YACjF,IAAI,CAAS,CAAC;YACd,IAAI,CAAC;gBACH,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,iBAAiB,EAAE,wBAAwB,GAAG,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,IAAI,CAAC,cAAc,EAAE,+BAA+B,CAAC,CAAC;YACnF,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAED,WAAW;QACX,KAAK,KAAK,CAAC;QACX,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;gBAChE,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,kCAAkC,CAAC,CAAC;YAChE,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAgB,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;gBACpD,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAC;YACtD,IAAI,GAAG,GAAU,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;oBACjB,IAAI,EAAE,KAAK,QAAQ;wBAAE,OAAO,IAAI,CAAC,CAAC,eAAe;oBACjD,IAAI,CAAC,UAAU,EAAE,yBAAyB,GAAG,UAAU,CAAC,CAAC;gBAC3D,CAAC;gBACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;oBACrB,IAAI,CAAC,eAAe,EAAE,kBAAkB,GAAG,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACrE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;oBACjD,IAAI,CAAC,cAAc,EAAE,qBAAqB,GAAG,EAAE,CAAC,CAAC;gBACnD,GAAG,GAAI,GAA6B,CAAC,GAAG,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QAED,WAAW;QACX,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;gBAAE,IAAI,CAAC,cAAc,EAAE,8BAA8B,CAAC,CAAC;YAC9E,MAAM,GAAG,GAA0B,EAAE,CAAC;YACtC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACtE,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAE1D,4BAA4B;QAC5B,KAAK,KAAK,CAAC;QACX,KAAK,KAAK,CAAC;QACX,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnD,MAAM,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC9D,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnD,MAAM,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC9D,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,+BAA+B,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QACtG,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YAC7C,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC,eAAe,EAAE,8BAA8B,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,kEAAkE;YAClE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1C,OAAO,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,gEAAgE;YAChE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnD,IAAI,CAAC,KAAK,EAAE;oBAAE,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;gBAClD,OAAO,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,0BAA0B;YACpD,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9E,IAAI,CAAC,eAAe,EAAE,kCAAkC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzF,CAAC;QAED,YAAY;QACZ,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/D,KAAK,MAAM,CAAC,IAAI,KAAK;gBACnB,IAAI,OAAO,CAAC,KAAK,QAAQ;oBACvB,IAAI,CAAC,eAAe,EAAE,yBAAyB,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;YACzF,OAAQ,KAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,WAAW;QACX,KAAK,IAAI,CAAC;QACV,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACtC,CAAC;QACD,KAAK,IAAI,CAAC;QACV,KAAK,IAAI,CAAC;QACV,KAAK,IAAI,CAAC;QACV,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAa,CAAC;YAClB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC9E,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBACnF,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;gBAC5E,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,kCAAkC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACjG,QAAQ,EAAE,EAAE,CAAC;gBACX,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACxB,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACzB,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACxB,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,KAAK,KAAK,CAAC;QACX,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACpC,MAAM,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/C,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC,CAAC,gBAAgB;YACtD,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClC,OAAO,WAAW,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK,KAAK;YACR,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QACjE,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACpC,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC9B,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU;QACzD,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,IAAI,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;YAC5F,MAAM,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;YACvD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU;QACzD,CAAC;QAED,YAAY;QACZ,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBACnB,IAAI,CAAC,eAAe,EAAE,2CAA2C,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACnF,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAED;YACE,IAAI,CAAC,YAAY,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,SAAS,QAAQ,CAAC,EAAU,EAAE,GAAY;IACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,wBAAwB,CAAC,CAAC;IAC7E,OAAO,GAAG,CAAC;AACb,CAAC;AACD,SAAS,QAAQ,CAAC,EAAU,EAAE,GAAY;IACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAChE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AACd,CAAC;AACD,SAAS,SAAS,CAAC,EAAU,EAAE,GAAY;IACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC;IACjE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC;AACD,SAAS,UAAU,CAAC,EAAU,EAAE,GAAY,EAAE,KAAY;IACxD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO;AAC5D,CAAC;AAED,0DAA0D;AAC1D,SAAS,WAAW,CAAC,CAAQ,EAAE,CAAQ;IACrC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;IAC9D,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,KAAK,EAAE;QAAE,IAAI,CAAC,eAAe,EAAE,oBAAoB,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACtE,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,QAAQ;QACjC,IAAI,CAAC,eAAe,EAAE,6BAA6B,CAAC,CAAC;IACvD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,gEAAgE;AAChE,+CAA+C;AAC/C,gDAAgD;AAChD,MAAM,UAAU,WAAW,CAAC,CAAQ;IAClC,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IAC5E,IAAI,OAAO,CAAC,KAAK,QAAQ;QACvB,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;YACjF,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACX,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,WAAW;IACvB,kEAAkE;IAClE,yEAAyE;IACzE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,CAAE,CAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACjG,CAAC;AACJ,CAAC"}
|
package/dist/guard.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* guard.ts — Portability Guard(`assertPortable`)。
|
|
3
|
+
*
|
|
4
|
+
* DSL 非依存の IR 可搬性不変条件: 「可搬 IR には関数 / Date / Promise 等の
|
|
5
|
+
* non-serializable 値が混入してはならない」。graphddb の `assertJsonSerializable` を
|
|
6
|
+
* 一般化したもの(core.ts の元実装)。全 DSL・全 consumer が共有する薄い共通プリミティブで、
|
|
7
|
+
* runtime-boundary.md の COMMON 判断基準(DynamoDB 概念ゼロ・純粋な構造検査)に合致する。
|
|
8
|
+
*
|
|
9
|
+
* boundary との関係:
|
|
10
|
+
* - **含める**: `assertPortable` は「IR に載せてよい値か」の DSL 非依存な構造判定。
|
|
11
|
+
* - **含めない**: `makeContractService` / `buildIR`(Metadata → IR)は graphddb 固有の
|
|
12
|
+
* Metadata/OperationDef 形状に依存する consumer レベル API のため examples に残す。
|
|
13
|
+
*/
|
|
14
|
+
export declare class PortabilityError extends Error {
|
|
15
|
+
path: string;
|
|
16
|
+
constructor(path: string, message: string);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* assertPortable — value が可搬(JSON-serializable)であることを再帰的に検査する。
|
|
20
|
+
* 関数 / Date / Promise を検出したら {@link PortabilityError} を投げる。
|
|
21
|
+
*
|
|
22
|
+
* @param value 検査対象(IR ノード等)。
|
|
23
|
+
* @param path エラー位置(既定 `"$"`)。
|
|
24
|
+
* @throws {PortabilityError} non-portable な値を検出したとき。
|
|
25
|
+
*/
|
|
26
|
+
export declare function assertPortable(value: unknown, path?: string): void;
|
|
27
|
+
//# sourceMappingURL=guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,IAAI,EAAE,MAAM,CAAC;gBACD,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,SAAM,GAAG,IAAI,CAa/D"}
|
package/dist/guard.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* guard.ts — Portability Guard(`assertPortable`)。
|
|
3
|
+
*
|
|
4
|
+
* DSL 非依存の IR 可搬性不変条件: 「可搬 IR には関数 / Date / Promise 等の
|
|
5
|
+
* non-serializable 値が混入してはならない」。graphddb の `assertJsonSerializable` を
|
|
6
|
+
* 一般化したもの(core.ts の元実装)。全 DSL・全 consumer が共有する薄い共通プリミティブで、
|
|
7
|
+
* runtime-boundary.md の COMMON 判断基準(DynamoDB 概念ゼロ・純粋な構造検査)に合致する。
|
|
8
|
+
*
|
|
9
|
+
* boundary との関係:
|
|
10
|
+
* - **含める**: `assertPortable` は「IR に載せてよい値か」の DSL 非依存な構造判定。
|
|
11
|
+
* - **含めない**: `makeContractService` / `buildIR`(Metadata → IR)は graphddb 固有の
|
|
12
|
+
* Metadata/OperationDef 形状に依存する consumer レベル API のため examples に残す。
|
|
13
|
+
*/
|
|
14
|
+
export class PortabilityError extends Error {
|
|
15
|
+
path;
|
|
16
|
+
constructor(path, message) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.path = path;
|
|
19
|
+
this.name = "PortabilityError";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* assertPortable — value が可搬(JSON-serializable)であることを再帰的に検査する。
|
|
24
|
+
* 関数 / Date / Promise を検出したら {@link PortabilityError} を投げる。
|
|
25
|
+
*
|
|
26
|
+
* @param value 検査対象(IR ノード等)。
|
|
27
|
+
* @param path エラー位置(既定 `"$"`)。
|
|
28
|
+
* @throws {PortabilityError} non-portable な値を検出したとき。
|
|
29
|
+
*/
|
|
30
|
+
export function assertPortable(value, path = "$") {
|
|
31
|
+
if (typeof value === "function")
|
|
32
|
+
throw new PortabilityError(path, `Portability Guard: functions cannot be placed in IR (at ${path})`);
|
|
33
|
+
if (value instanceof Date || value instanceof Promise)
|
|
34
|
+
throw new PortabilityError(path, `Portability Guard: ${value.constructor.name} cannot be placed in IR (at ${path})`);
|
|
35
|
+
if (Array.isArray(value)) {
|
|
36
|
+
value.forEach((v, i) => assertPortable(v, `${path}[${i}]`));
|
|
37
|
+
}
|
|
38
|
+
else if (value && typeof value === "object") {
|
|
39
|
+
for (const [k, v] of Object.entries(value))
|
|
40
|
+
assertPortable(v, `${path}.${k}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,IAAI,CAAS;IACb,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,IAAI,GAAG,GAAG;IACvD,IAAI,OAAO,KAAK,KAAK,UAAU;QAC7B,MAAM,IAAI,gBAAgB,CAAC,IAAI,EAAE,2DAA2D,IAAI,GAAG,CAAC,CAAC;IACvG,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY,OAAO;QACnD,MAAM,IAAI,gBAAgB,CACxB,IAAI,EACJ,sBAAsB,KAAK,CAAC,WAAW,CAAC,IAAI,+BAA+B,IAAI,GAAG,CACnF,CAAC;IACJ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,CAAC;SAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,cAAc,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* behavior-contracts — 多言語 IR-Runtime 共通層(TS 実装)。
|
|
3
|
+
*
|
|
4
|
+
* runtime-boundary.md で COMMON と判定された「薄い核」プリミティブのみを公開する。
|
|
5
|
+
* DynamoDB / graphddb 固有の概念(backend 実行・key resolution・retry Tuning・hydrate・
|
|
6
|
+
* bundle 形式)は一切含まない(それらは consumer に残る)。この package が該当ロジックの
|
|
7
|
+
* **単一の真実源(single source of truth)**であり、examples/ はここから import する。
|
|
8
|
+
*
|
|
9
|
+
* 公開 COMMON プリミティブ(runtime-boundary.md §2.1):
|
|
10
|
+
* - validateEnvelope — spec-version fail-closed 検査
|
|
11
|
+
* - evaluateExpression — expression-ir.md の規範評価
|
|
12
|
+
* - renderTemplate — `{param}` 束縛描画(strict)
|
|
13
|
+
* - runPlan — 実行計画の骨格実行(stage / Skip 伝播 / Policy Kind)
|
|
14
|
+
* - canonicalValue / canonicalJson / pyFloatRepr — 決定的正準直列化
|
|
15
|
+
* - assertPortable — Portability Guard(IR 可搬性不変条件)
|
|
16
|
+
* - decodeValue / deepEquals — conformance runner adapter 共通部
|
|
17
|
+
*
|
|
18
|
+
* 除外の判断(runtime-boundary.md 準拠):
|
|
19
|
+
* - Contract Service(makeContractService)/ buildIR は graphddb の Metadata 形状に依存する
|
|
20
|
+
* consumer レベル API のため **含めない**(examples/src/core.ts に残置)。
|
|
21
|
+
*/
|
|
22
|
+
export declare const SPEC_VERSIONS: {
|
|
23
|
+
readonly expression: 1;
|
|
24
|
+
readonly template: 1;
|
|
25
|
+
readonly plan: 1;
|
|
26
|
+
readonly canonical: 1;
|
|
27
|
+
};
|
|
28
|
+
/** validateEnvelope に渡す graphddb 形式の既定 supported 版(`"<major>.<minor>"`)。 */
|
|
29
|
+
export declare const ENVELOPE_SPEC_VERSION: "1.1";
|
|
30
|
+
export type { Value, Scope } from "./expr-eval.js";
|
|
31
|
+
export { evaluate as evaluateExpression, encodeValue, cmpCodePoints, ExprFailure } from "./expr-eval.js";
|
|
32
|
+
export type { FailureCode as ExprFailureCode } from "./expr-eval.js";
|
|
33
|
+
export { renderTemplate, resolvePartial, TemplateFailure } from "./template.js";
|
|
34
|
+
export type { TemplateFailureCode } from "./template.js";
|
|
35
|
+
export { runPlan, finalTree, PlanFailure } from "./plan.js";
|
|
36
|
+
export type { ExecutionPlanSpec, OpSpec, Exec, ExecOutcome, RunResult, PolicyKind, RelationKind, PlanFailureCode, } from "./plan.js";
|
|
37
|
+
export { canonicalValue, canonicalJson, pyFloatRepr, CanonicalFailure } from "./canonical.js";
|
|
38
|
+
export type { CanonicalFailureCode } from "./canonical.js";
|
|
39
|
+
export { validateEnvelope, EnvelopeFailure } from "./envelope.js";
|
|
40
|
+
export type { EnvelopeFailureCode } from "./envelope.js";
|
|
41
|
+
export { assertPortable, PortabilityError } from "./guard.js";
|
|
42
|
+
export { decodeValue, deepEquals } from "./codec.js";
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAEX,4EAA4E;AAC5E,eAAO,MAAM,qBAAqB,EAAG,KAAc,CAAC;AAGpD,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACzG,YAAY,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGrE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChF,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGzD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC5D,YAAY,EACV,iBAAiB,EACjB,MAAM,EACN,IAAI,EACJ,WAAW,EACX,SAAS,EACT,UAAU,EACV,YAAY,EACZ,eAAe,GAChB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAG3D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAClE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* behavior-contracts — 多言語 IR-Runtime 共通層(TS 実装)。
|
|
3
|
+
*
|
|
4
|
+
* runtime-boundary.md で COMMON と判定された「薄い核」プリミティブのみを公開する。
|
|
5
|
+
* DynamoDB / graphddb 固有の概念(backend 実行・key resolution・retry Tuning・hydrate・
|
|
6
|
+
* bundle 形式)は一切含まない(それらは consumer に残る)。この package が該当ロジックの
|
|
7
|
+
* **単一の真実源(single source of truth)**であり、examples/ はここから import する。
|
|
8
|
+
*
|
|
9
|
+
* 公開 COMMON プリミティブ(runtime-boundary.md §2.1):
|
|
10
|
+
* - validateEnvelope — spec-version fail-closed 検査
|
|
11
|
+
* - evaluateExpression — expression-ir.md の規範評価
|
|
12
|
+
* - renderTemplate — `{param}` 束縛描画(strict)
|
|
13
|
+
* - runPlan — 実行計画の骨格実行(stage / Skip 伝播 / Policy Kind)
|
|
14
|
+
* - canonicalValue / canonicalJson / pyFloatRepr — 決定的正準直列化
|
|
15
|
+
* - assertPortable — Portability Guard(IR 可搬性不変条件)
|
|
16
|
+
* - decodeValue / deepEquals — conformance runner adapter 共通部
|
|
17
|
+
*
|
|
18
|
+
* 除外の判断(runtime-boundary.md 準拠):
|
|
19
|
+
* - Contract Service(makeContractService)/ buildIR は graphddb の Metadata 形状に依存する
|
|
20
|
+
* consumer レベル API のため **含めない**(examples/src/core.ts に残置)。
|
|
21
|
+
*/
|
|
22
|
+
// ── 対応する仕様バージョン(IR/vector の spec version。ライブラリ semver とは別管理)──
|
|
23
|
+
// runtime-plan.md §3: 各ライブラリは対応 spec version を宣言し、範囲外は fail-closed。
|
|
24
|
+
export const SPEC_VERSIONS = {
|
|
25
|
+
expression: 1,
|
|
26
|
+
template: 1,
|
|
27
|
+
plan: 1,
|
|
28
|
+
canonical: 1,
|
|
29
|
+
};
|
|
30
|
+
/** validateEnvelope に渡す graphddb 形式の既定 supported 版(`"<major>.<minor>"`)。 */
|
|
31
|
+
export const ENVELOPE_SPEC_VERSION = "1.1";
|
|
32
|
+
// ── expression(evaluateExpression) ──────────────────────────────────────────
|
|
33
|
+
export { evaluate as evaluateExpression, encodeValue, cmpCodePoints, ExprFailure } from "./expr-eval.js";
|
|
34
|
+
// ── template(renderTemplate) ────────────────────────────────────────────────
|
|
35
|
+
export { renderTemplate, resolvePartial, TemplateFailure } from "./template.js";
|
|
36
|
+
// ── plan(runPlan) ───────────────────────────────────────────────────────────
|
|
37
|
+
export { runPlan, finalTree, PlanFailure } from "./plan.js";
|
|
38
|
+
// ── canonical(canonicalValue / canonicalJson / pyFloatRepr) ─────────────────
|
|
39
|
+
export { canonicalValue, canonicalJson, pyFloatRepr, CanonicalFailure } from "./canonical.js";
|
|
40
|
+
// ── envelope(validateEnvelope) ──────────────────────────────────────────────
|
|
41
|
+
export { validateEnvelope, EnvelopeFailure } from "./envelope.js";
|
|
42
|
+
// ── guard(Portability Guard) ────────────────────────────────────────────────
|
|
43
|
+
export { assertPortable, PortabilityError } from "./guard.js";
|
|
44
|
+
// ── conformance runner adapter 共通部 ─────────────────────────────────────────
|
|
45
|
+
export { decodeValue, deepEquals } from "./codec.js";
|
|
46
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,gEAAgE;AAChE,oEAAoE;AACpE,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,UAAU,EAAE,CAAC;IACb,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,CAAC;CACJ,CAAC;AAEX,4EAA4E;AAC5E,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAc,CAAC;AAKpD,+EAA+E;AAC/E,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGzG,+EAA+E;AAC/E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhF,+EAA+E;AAC/E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAY5D,+EAA+E;AAC/E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAG9F,+EAA+E;AAC/E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGlE,+EAA+E;AAC/E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9D,8EAA8E;AAC9E,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/plan.d.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* plan.ts — execution-plan.md の参照実装(doc-grade, COMMON)。
|
|
3
|
+
*
|
|
4
|
+
* runPlan(plan, ops, exec): stage groups を逐次実行し、各 stage 内を bounded 並行で回し、
|
|
5
|
+
* 未生成 Port の Skip 伝播と Error Policy Kind(fail/retry/continue)を解釈して
|
|
6
|
+
* 決定的な result tree(Φ 合流)を返す。**ノード実行は consumer コールバック `exec` に委譲**。
|
|
7
|
+
*
|
|
8
|
+
* 実装状況ラベル(execution-plan.md §2/§3 冒頭):
|
|
9
|
+
* - null-binding skip: graphddb 実装済み(データ駆動)。
|
|
10
|
+
* - continue policy 起因の skip / op-level retry Kind: 規範(additive/aspirational)。
|
|
11
|
+
* このキットは**規範(spec)挙動**を検証する(graphddb ミラーではない、runtime-boundary の指示)。
|
|
12
|
+
*
|
|
13
|
+
* 決定性の要(execution-plan.md §4):
|
|
14
|
+
* - mapWithConcurrency は入力順を保存(output[i] = worker(items[i]))。完了順非依存。
|
|
15
|
+
* - stage 間は逐次(後 stage が前 stage の result を読む)。
|
|
16
|
+
* - 各 worker は result tree の disjoint スロット(自ノードの port)に書く → Φ 合流は決定的。
|
|
17
|
+
*/
|
|
18
|
+
import type { Value } from "./expr-eval.js";
|
|
19
|
+
export interface ExecutionPlanSpec {
|
|
20
|
+
groups: number[][];
|
|
21
|
+
concurrency: number;
|
|
22
|
+
}
|
|
23
|
+
export type PolicyKind = "fail" | "retry" | "continue";
|
|
24
|
+
export type RelationKind = "single" | "connection";
|
|
25
|
+
export interface OpSpec {
|
|
26
|
+
/** 表示・デバッグ用 */
|
|
27
|
+
id: string;
|
|
28
|
+
/** この op が依存する親 op の index({result.*} 供給元)。root は null。 */
|
|
29
|
+
parent: number | null;
|
|
30
|
+
/** 親 result のどのフィールドを束縛キーに読むか(null/欠落なら null-binding skip)。 */
|
|
31
|
+
bindField?: string;
|
|
32
|
+
/** この op の未生成表現の種別(single=null / connection=空 connection)。 */
|
|
33
|
+
relationKind?: RelationKind;
|
|
34
|
+
/** Error Policy Kind(既定 fail)。 */
|
|
35
|
+
policy?: PolicyKind;
|
|
36
|
+
}
|
|
37
|
+
/** consumer が供給するノード実行結果(mock)。 */
|
|
38
|
+
export type ExecOutcome = {
|
|
39
|
+
ok: Value;
|
|
40
|
+
} | {
|
|
41
|
+
error: string;
|
|
42
|
+
};
|
|
43
|
+
/** exec(op, boundValue) — boundValue は親 result[bindField](root は null)。 */
|
|
44
|
+
export type Exec = (op: OpSpec, boundValue: Value | undefined) => ExecOutcome;
|
|
45
|
+
type OpState = {
|
|
46
|
+
status: "ok";
|
|
47
|
+
value: Value;
|
|
48
|
+
} | {
|
|
49
|
+
status: "skipped";
|
|
50
|
+
} | {
|
|
51
|
+
status: "failed";
|
|
52
|
+
error: string;
|
|
53
|
+
};
|
|
54
|
+
export type PlanFailureCode = "OP_FAILED" | "UNKNOWN_POLICY" | "INVALID_PLAN";
|
|
55
|
+
export declare class PlanFailure extends Error {
|
|
56
|
+
code: PlanFailureCode;
|
|
57
|
+
constructor(code: PlanFailureCode, message: string);
|
|
58
|
+
}
|
|
59
|
+
export interface RunResult {
|
|
60
|
+
/** 各 op の最終状態(Φ 合流結果。index 順)。 */
|
|
61
|
+
states: OpState[];
|
|
62
|
+
/** 実際に exec が呼ばれた op id 列(呼び出し順ではなく index 昇順で正規化)。 */
|
|
63
|
+
executed: string[];
|
|
64
|
+
/** skip された op id(index 昇順)。 */
|
|
65
|
+
skipped: string[];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* runPlan — execution-plan.md の骨格。
|
|
69
|
+
*
|
|
70
|
+
* @param plan groups/concurrency。null なら 1 op = 1 stage の逐次 fallback(§4)。
|
|
71
|
+
* @param ops operation 定義(index 順。ops[0] は root)。
|
|
72
|
+
* @param exec ノード実行 mock(consumer 委譲)。
|
|
73
|
+
*/
|
|
74
|
+
export declare function runPlan(plan: ExecutionPlanSpec | null, ops: OpSpec[], exec: Exec): RunResult;
|
|
75
|
+
/**
|
|
76
|
+
* finalTree — states を index→port の result tree(Φ 合流の観測形)へ整形する。
|
|
77
|
+
* ok → 値 / skipped → 未生成表現(single=null / connection=空 connection)。
|
|
78
|
+
* conformance vector はこの tree を期待値と byte 比較する(canonicalJson 経由)。
|
|
79
|
+
*/
|
|
80
|
+
export declare function finalTree(states: OpState[], ops: OpSpec[]): Record<string, Value>;
|
|
81
|
+
export {};
|
|
82
|
+
//# sourceMappingURL=plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAG5C,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;AACvD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,YAAY,CAAC;AAEnD,MAAM,WAAW,MAAM;IACrB,eAAe;IACf,EAAE,EAAE,MAAM,CAAC;IACX,2DAA2D;IAC3D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,kCAAkC;IAClC,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,mCAAmC;AACnC,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,GACb;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtB,2EAA2E;AAC3E,MAAM,MAAM,IAAI,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,GAAG,SAAS,KAAK,WAAW,CAAC;AAG9E,KAAK,OAAO,GACR;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAC9B;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,gBAAgB,GAChB,cAAc,CAAC;AAEnB,qBAAa,WAAY,SAAQ,KAAK;IACpC,IAAI,EAAE,eAAe,CAAC;gBACV,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM;CAKnD;AAMD,MAAM,WAAW,SAAS;IACxB,kCAAkC;IAClC,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,sDAAsD;IACtD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gCAAgC;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAOD;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,SAAS,CA6B5F;AA0ED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAQjF"}
|