behavior-contracts 0.1.3 → 0.2.1

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 (106) hide show
  1. package/README.md +8 -2
  2. package/dist/authoring.d.ts +202 -0
  3. package/dist/authoring.d.ts.map +1 -0
  4. package/dist/authoring.js +787 -0
  5. package/dist/authoring.js.map +1 -0
  6. package/dist/behavior.d.ts +248 -0
  7. package/dist/behavior.d.ts.map +1 -0
  8. package/dist/behavior.js +373 -0
  9. package/dist/behavior.js.map +1 -0
  10. package/dist/builder.d.ts +154 -0
  11. package/dist/builder.d.ts.map +1 -0
  12. package/dist/builder.js +574 -0
  13. package/dist/builder.js.map +1 -0
  14. package/dist/generator/core.d.ts +89 -0
  15. package/dist/generator/core.d.ts.map +1 -0
  16. package/dist/generator/core.js +124 -0
  17. package/dist/generator/core.js.map +1 -0
  18. package/dist/generator/emit-go.d.ts +19 -0
  19. package/dist/generator/emit-go.d.ts.map +1 -0
  20. package/dist/generator/emit-go.js +79 -0
  21. package/dist/generator/emit-go.js.map +1 -0
  22. package/dist/generator/emit-php.d.ts +20 -0
  23. package/dist/generator/emit-php.d.ts.map +1 -0
  24. package/dist/generator/emit-php.js +76 -0
  25. package/dist/generator/emit-php.js.map +1 -0
  26. package/dist/generator/emit-python.d.ts +10 -0
  27. package/dist/generator/emit-python.d.ts.map +1 -0
  28. package/dist/generator/emit-python.js +75 -0
  29. package/dist/generator/emit-python.js.map +1 -0
  30. package/dist/generator/emit-rust.d.ts +25 -0
  31. package/dist/generator/emit-rust.d.ts.map +1 -0
  32. package/dist/generator/emit-rust.js +125 -0
  33. package/dist/generator/emit-rust.js.map +1 -0
  34. package/dist/generator/emit-straightline-go.d.ts +77 -0
  35. package/dist/generator/emit-straightline-go.d.ts.map +1 -0
  36. package/dist/generator/emit-straightline-go.js +592 -0
  37. package/dist/generator/emit-straightline-go.js.map +1 -0
  38. package/dist/generator/emit-straightline-php.d.ts +46 -0
  39. package/dist/generator/emit-straightline-php.d.ts.map +1 -0
  40. package/dist/generator/emit-straightline-php.js +501 -0
  41. package/dist/generator/emit-straightline-php.js.map +1 -0
  42. package/dist/generator/emit-straightline-python.d.ts +36 -0
  43. package/dist/generator/emit-straightline-python.d.ts.map +1 -0
  44. package/dist/generator/emit-straightline-python.js +441 -0
  45. package/dist/generator/emit-straightline-python.js.map +1 -0
  46. package/dist/generator/emit-straightline-rust.d.ts +78 -0
  47. package/dist/generator/emit-straightline-rust.d.ts.map +1 -0
  48. package/dist/generator/emit-straightline-rust.js +615 -0
  49. package/dist/generator/emit-straightline-rust.js.map +1 -0
  50. package/dist/generator/emit-straightline-typed-go.d.ts +39 -0
  51. package/dist/generator/emit-straightline-typed-go.d.ts.map +1 -0
  52. package/dist/generator/emit-straightline-typed-go.js +828 -0
  53. package/dist/generator/emit-straightline-typed-go.js.map +1 -0
  54. package/dist/generator/emit-straightline-typed-rust.d.ts +48 -0
  55. package/dist/generator/emit-straightline-typed-rust.d.ts.map +1 -0
  56. package/dist/generator/emit-straightline-typed-rust.js +823 -0
  57. package/dist/generator/emit-straightline-typed-rust.js.map +1 -0
  58. package/dist/generator/emit-straightline-typed-typescript.d.ts +49 -0
  59. package/dist/generator/emit-straightline-typed-typescript.d.ts.map +1 -0
  60. package/dist/generator/emit-straightline-typed-typescript.js +314 -0
  61. package/dist/generator/emit-straightline-typed-typescript.js.map +1 -0
  62. package/dist/generator/emit-straightline-typescript.d.ts +36 -0
  63. package/dist/generator/emit-straightline-typescript.d.ts.map +1 -0
  64. package/dist/generator/emit-straightline-typescript.js +397 -0
  65. package/dist/generator/emit-straightline-typescript.js.map +1 -0
  66. package/dist/generator/emit-typescript.d.ts +11 -0
  67. package/dist/generator/emit-typescript.d.ts.map +1 -0
  68. package/dist/generator/emit-typescript.js +68 -0
  69. package/dist/generator/emit-typescript.js.map +1 -0
  70. package/dist/generator/fingerprint.d.ts +14 -0
  71. package/dist/generator/fingerprint.d.ts.map +1 -0
  72. package/dist/generator/fingerprint.js +74 -0
  73. package/dist/generator/fingerprint.js.map +1 -0
  74. package/dist/generator/index.d.ts +22 -0
  75. package/dist/generator/index.d.ts.map +1 -0
  76. package/dist/generator/index.js +64 -0
  77. package/dist/generator/index.js.map +1 -0
  78. package/dist/generator/literal.d.ts +15 -0
  79. package/dist/generator/literal.d.ts.map +1 -0
  80. package/dist/generator/literal.js +232 -0
  81. package/dist/generator/literal.js.map +1 -0
  82. package/dist/generator/straightline.d.ts +147 -0
  83. package/dist/generator/straightline.d.ts.map +1 -0
  84. package/dist/generator/straightline.js +122 -0
  85. package/dist/generator/straightline.js.map +1 -0
  86. package/dist/generator/typed.d.ts +156 -0
  87. package/dist/generator/typed.d.ts.map +1 -0
  88. package/dist/generator/typed.js +108 -0
  89. package/dist/generator/typed.js.map +1 -0
  90. package/dist/guard.d.ts +36 -0
  91. package/dist/guard.d.ts.map +1 -1
  92. package/dist/guard.js +186 -0
  93. package/dist/guard.js.map +1 -1
  94. package/dist/index.d.ts +17 -3
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +23 -2
  97. package/dist/index.js.map +1 -1
  98. package/dist/plan.d.ts +36 -0
  99. package/dist/plan.d.ts.map +1 -1
  100. package/dist/plan.js +152 -14
  101. package/dist/plan.js.map +1 -1
  102. package/dist/primitives.d.ts +112 -0
  103. package/dist/primitives.d.ts.map +1 -0
  104. package/dist/primitives.js +206 -0
  105. package/dist/primitives.js.map +1 -0
  106. package/package.json +4 -1
@@ -0,0 +1,397 @@
1
+ import { emitDocLiteral, emitDocLiteralCompact } from "./literal.js";
2
+ import { emitStraightlineModule, } from "./straightline.js";
3
+ /** primitive namespace alias(生成コード内)。 */
4
+ const CGP = "cgp";
5
+ /**
6
+ * scope 式(生成コード内)。scope は「input + それまでの ok 結果」の**その時点のスナップ**で
7
+ * あり、runBehavior の `baseScope()` と同じく exec ごとに新規に組む。primitive へは
8
+ * `scope()`(関数呼び)を渡す(呼び時点の results を読む — 決定的)。
9
+ */
10
+ const SCOPE = "scope()";
11
+ /**
12
+ * map 本体(over/guard/ports)の要素 scope 式(生成コード内)。runBehavior の map と同じく
13
+ * `{ ...baseScope(), [as]: el }` のスナップを per-element で組む。生成コードはこの名前
14
+ * (`mscope()`)で要素 scope を読む関数を map arm 内にローカル定義する。
15
+ */
16
+ const MAP_SCOPE = "mscope()";
17
+ /** IR リテラルを TS 式として emit(primitive 被演算子用の単一行リテラル)。 */
18
+ function lit(node) {
19
+ return emitDocLiteralCompact(node, "ts");
20
+ }
21
+ /** args 配列を要素ごとに IR リテラルへ落として `, ` 連結。 */
22
+ function argList(arg) {
23
+ return arg.map((a) => lit(a)).join(", ");
24
+ }
25
+ // A0 codegenPrimitives の引数形に合わせた op → 呼び式の綴じ方。
26
+ // 命名は docs/codegen-primitives.md §4.1(TS 列)に一致。
27
+ const OP_EMITTERS = {
28
+ // 参照(path 配列 + scope)
29
+ ref: (arg, s) => `${CGP}.ref(${lit(arg)}, ${s})`,
30
+ refOpt: (arg, s) => `${CGP}.refOpt(${lit(arg)}, ${s})`,
31
+ // リテラルラッパ(int は文字列, float は number)
32
+ int: (arg, s) => `${CGP}.intLit(${lit(arg)}, ${s})`,
33
+ float: (arg, s) => `${CGP}.floatLit(${lit(arg)}, ${s})`,
34
+ // 構築(fields/elements は未評価 IR)
35
+ obj: (arg, s) => `${CGP}.obj(${lit(arg)}, ${s})`,
36
+ arr: (arg, s) => `${CGP}.arr(${lit(arg)}, ${s})`,
37
+ // 数値(二項は [a,b]・単項は [a])
38
+ add: (arg, s) => `${CGP}.add(${argList(arg)}, ${s})`,
39
+ sub: (arg, s) => `${CGP}.sub(${argList(arg)}, ${s})`,
40
+ mul: (arg, s) => `${CGP}.mul(${argList(arg)}, ${s})`,
41
+ neg: (arg, s) => `${CGP}.neg(${argList(arg)}, ${s})`,
42
+ div: (arg, s) => `${CGP}.div(${argList(arg)}, ${s})`,
43
+ mod: (arg, s) => `${CGP}.mod(${argList(arg)}, ${s})`,
44
+ // 文字列連結(n-ary。parts は未評価 IR 配列)
45
+ concat: (arg, s) => `${CGP}.concat(${lit(arg)}, ${s})`,
46
+ // 比較(二項)
47
+ eq: (arg, s) => `${CGP}.eq(${argList(arg)}, ${s})`,
48
+ ne: (arg, s) => `${CGP}.ne(${argList(arg)}, ${s})`,
49
+ lt: (arg, s) => `${CGP}.lt(${argList(arg)}, ${s})`,
50
+ le: (arg, s) => `${CGP}.le(${argList(arg)}, ${s})`,
51
+ gt: (arg, s) => `${CGP}.gt(${argList(arg)}, ${s})`,
52
+ ge: (arg, s) => `${CGP}.ge(${argList(arg)}, ${s})`,
53
+ // bool/null(短絡: 被演算子は未評価 IR で渡す — primitive 内 evaluate が短絡)
54
+ and: (arg, s) => `${CGP}.and(${argList(arg)}, ${s})`,
55
+ or: (arg, s) => `${CGP}.or(${argList(arg)}, ${s})`,
56
+ not: (arg, s) => `${CGP}.not(${argList(arg)}, ${s})`,
57
+ coalesce: (arg, s) => `${CGP}.coalesce(${argList(arg)}, ${s})`,
58
+ cond: (arg, s) => `${CGP}.cond(${argList(arg)}, ${s})`,
59
+ len: (arg, s) => `${CGP}.len(${argList(arg)}, ${s})`,
60
+ };
61
+ /**
62
+ * emitExpr — Expression IR ノードを TS の primitive 呼び式に落とす。
63
+ * - 単一キーの演算子ノード → 対応 primitive(被演算子は IR リテラル=A0 の Expr 契約)。
64
+ * - スカラ/ null / bool のむき出しリテラル(例 cond の then=true, ref path 内 string)や
65
+ * 未知の形は `evalExpr`(同一 SSoT)へ落とす。これで型判定を生成コードに残さない。
66
+ * Portability Guard を通過済み(生成時検査)なので未知 operator はここに来ない。
67
+ */
68
+ function emitExpr(node, scopeVar) {
69
+ if (node !== null && typeof node === "object" && !Array.isArray(node)) {
70
+ const keys = Object.keys(node);
71
+ if (keys.length === 1) {
72
+ const op = keys[0];
73
+ const em = OP_EMITTERS[op];
74
+ if (em)
75
+ return em(node[op], scopeVar);
76
+ }
77
+ }
78
+ // スカラリテラル(string/number/bool/null)や obj 以外 — evaluate SSoT に委譲(同一意味論)。
79
+ return `${CGP}.evalExpr(${lit(node)}, ${scopeVar})`;
80
+ }
81
+ // ── per-node exec 分岐 / component 関数 / module の綴じ方 ──────────────────────
82
+ /** ops リテラル(runPlan に渡す OpSpec[] の TS リテラル)を綴じる。 */
83
+ function emitOpsLiteral(plan) {
84
+ const rows = plan.opsLiteral.map((o) => {
85
+ const parts = [`id: ${JSON.stringify(o.id)}`, `parent: ${o.parent === null ? "null" : String(o.parent)}`];
86
+ if (o.bindField !== undefined)
87
+ parts.push(`bindField: ${JSON.stringify(o.bindField)}`);
88
+ if (o.relationKind !== undefined)
89
+ parts.push(`relationKind: ${JSON.stringify(o.relationKind)}`);
90
+ if (o.policy !== undefined)
91
+ parts.push(`policy: ${JSON.stringify(o.policy)}`);
92
+ return ` { ${parts.join(", ")} },`;
93
+ });
94
+ return `[\n${rows.join("\n")}\n ]`;
95
+ }
96
+ /** map arm の per-element ports リテラル(要素 scope `mscope()` で評価)。 */
97
+ function emitMapPorts(op) {
98
+ if (op.ports.length === 0)
99
+ return "const ports: Record<string, Value> = {};";
100
+ return `const ports: Record<string, Value> = {\n${op.ports
101
+ .map((p) => ` ${JSON.stringify(p.name)}: ${p.expr},`)
102
+ .join("\n")}\n };`;
103
+ }
104
+ /**
105
+ * emitMapArm — map ノードの直線展開(要素反復・guard skip・per-element/batched handler・into
106
+ * zip-attach)。runBehavior の map 分岐(behavior.ts §map)を生成コードに直線展開する。op-log
107
+ * 等価のため、handler は runBehavior と同じ ctx(非 batched は `{nodeId,component,bound}`、batched は
108
+ * `{nodeId,component}`)・同じ ports 形で呼ぶ。guard は cond primitive(strict-bool SSoT)。into は
109
+ * A0 `hydrateInto` primitive(zip-attach SSoT)。要素反復は宣言どおり逐次(並列単位は body ノード)。
110
+ */
111
+ function emitMapArm(op, aw) {
112
+ const comp = JSON.stringify(op.component);
113
+ const nodeId = JSON.stringify(op.id);
114
+ const asKey = JSON.stringify(op.as);
115
+ const guardCheck = op.guard === undefined ? "" : `\n if (${op.guard} !== true) continue;`;
116
+ const intoTail = op.into === undefined
117
+ ? " return { ok: collected };"
118
+ : ` // map.into zip-attach (behavior.ts applyInto): over と同じ長さ・順序で guard 通過要素へ
119
+ // ${JSON.stringify(op.into)} を書き戻す(skip 要素は無変更で pass-through、親不変=shallow copy)。
120
+ // Failure code は runBehavior と一致(非 object 要素は MAP_INTO_ELEMENT_NOT_OBJECT)。
121
+ {
122
+ const augmented: Value[] = [];
123
+ let mk = 0;
124
+ for (let mj = 0; mj < (over as Value[]).length; mj++) {
125
+ const oel = (over as Value[])[mj];
126
+ if (mk < keptIdx.length && keptIdx[mk] === mj) {
127
+ if (oel === null || typeof oel !== "object" || Array.isArray(oel))
128
+ throw new BehaviorFailure("MAP_INTO_ELEMENT_NOT_OBJECT", \`map '${op.id}': 'into' requires object elements (element \${mj} is not an object)\`);
129
+ augmented.push({ ...(oel as Record<string, Value>), [${JSON.stringify(op.into)}]: collected[mk] });
130
+ mk++;
131
+ } else {
132
+ augmented.push(oel);
133
+ }
134
+ }
135
+ return { ok: augmented };
136
+ }`;
137
+ const body = op.batched
138
+ ? ` const items: Value[] = [];
139
+ for (let mi = 0; mi < (over as Value[]).length; mi++) {
140
+ const el = (over as Value[])[mi];
141
+ const mscope = (): Scope => ({ ...scope(), [${asKey}]: el });
142
+ void mscope;${guardCheck}
143
+ ${emitMapPorts(op)}
144
+ items.push(ports);
145
+ keptIdx.push(mi);
146
+ }
147
+ let collected: Value[];
148
+ if (items.length === 0) {
149
+ collected = [];
150
+ } else {
151
+ const h = handlers[${comp}];
152
+ if (!h) throw new BehaviorFailure("UNKNOWN_COMPONENT", \`component '${op.component}' has no handler (fail-closed)\`);
153
+ const outcome = ${aw}h({ items }, { nodeId: ${nodeId}, component: ${comp} });
154
+ if ("error" in outcome) return outcome;
155
+ if (!Array.isArray(outcome.ok) || outcome.ok.length !== items.length)
156
+ throw new BehaviorFailure("MAP_BATCH_RESULT_MISMATCH", \`map '${op.id}': batched handler must return a list aligned to items (want \${items.length}, got \${Array.isArray(outcome.ok) ? outcome.ok.length : typeof outcome.ok})\`);
157
+ collected = outcome.ok as Value[];
158
+ }
159
+ ${intoTail}`
160
+ : ` const collected: Value[] = [];
161
+ const h = handlers[${comp}];
162
+ if (!h) throw new BehaviorFailure("UNKNOWN_COMPONENT", \`component '${op.component}' has no handler (fail-closed)\`);
163
+ for (let mi = 0; mi < (over as Value[]).length; mi++) {
164
+ const el = (over as Value[])[mi];
165
+ const mscope = (): Scope => ({ ...scope(), [${asKey}]: el });
166
+ void mscope;${guardCheck}
167
+ ${emitMapPorts(op)}
168
+ const outcome = ${aw}h(ports, { nodeId: ${nodeId}, component: ${comp}, bound: el });
169
+ if ("error" in outcome) return outcome;
170
+ collected.push(outcome.ok);
171
+ keptIdx.push(mi);
172
+ }
173
+ ${intoTail}`;
174
+ return ` if (i === ${op.index}) {
175
+ const over = ${op.over};
176
+ if (!Array.isArray(over)) throw new BehaviorFailure("MAP_OVER_NOT_ARRAY", \`map '${op.id}': 'over' did not evaluate to an array\`);
177
+ const keptIdx: number[] = [];
178
+ ${body}
179
+ }`;
180
+ }
181
+ /**
182
+ * 1ノードの exec 分岐本体(index で分岐 — nodeKind ディスパッチではない)。`aw` は handler 呼びの
183
+ * await キーワード(同期経路は ""、非同期経路 bindAsync は "await ")。cond は handler を呼ばない
184
+ * ので aw は無関係。
185
+ */
186
+ function emitExecArm(op, aw) {
187
+ if (op.kind === "cond") {
188
+ // cond は純 Expression。scope を渡して1式評価(handler は呼ばない)。
189
+ return ` if (i === ${op.index}) return { ok: ${op.expr} };`;
190
+ }
191
+ if (op.kind === "map")
192
+ return emitMapArm(op, aw);
193
+ // componentRef: 各 port を名前付き primitive 呼びで評価 → handler 注入呼び。
194
+ const portLines = op.ports.length === 0
195
+ ? " const ports: Record<string, Value> = {};"
196
+ : ` const ports: Record<string, Value> = {\n${op.ports
197
+ .map((p) => ` ${JSON.stringify(p.name)}: ${p.expr},`)
198
+ .join("\n")}\n };`;
199
+ return ` if (i === ${op.index}) {
200
+ ${portLines}
201
+ const h = handlers[${JSON.stringify(op.component)}];
202
+ if (!h) throw new BehaviorFailure("UNKNOWN_COMPONENT", \`component '${op.component}' has no handler (fail-closed)\`);
203
+ return ${aw}h(ports, { nodeId: ${JSON.stringify(op.id)}, component: ${JSON.stringify(op.component)} });
204
+ }`;
205
+ }
206
+ /**
207
+ * emitComponentFn — 1 component の直線関数を綴じる。runBehavior の実行フロー(results 蓄積 +
208
+ * baseScope + runPlan + writeUnproduced + output 評価)を **生成コードに直線展開**する
209
+ * (汎用 exec/nodeKind/evalPorts は無い。各 exec 分岐は index で確定・ハードコード)。
210
+ */
211
+ function emitComponentFn(plan) {
212
+ const syncArms = plan.ops.map((o) => emitExecArm(o, "")).join("\n");
213
+ const asyncArms = plan.ops.map((o) => emitExecArm(o, "await ")).join("\n");
214
+ const planLiteral = plan.component.plan
215
+ ? emitDocLiteral(plan.component.plan, "ts", 1)
216
+ : "null";
217
+ const output = emitExpr(plan.component.output, SCOPE);
218
+ const relationKinds = plan.opsLiteral.map((o) => (o.relationKind === "connection" ? "connection" : "single"));
219
+ const relDecl = `const relationKinds: (RelationKind | undefined)[] = ${JSON.stringify(relationKinds)};`;
220
+ const sync = `function run_${sanitize(plan.name)}(handlers: Handlers, input: Scope): Value {
221
+ const ops: OpSpec[] = ${emitOpsLiteral(plan)};
222
+ const results: Record<string, Value> = {};
223
+ const scope = (): Scope => ({ ...input, ...results });
224
+ ${relDecl}
225
+ const exec: Exec = (op) => {
226
+ const i = ops.findIndex((o) => o.id === op.id);
227
+ ${syncArms}
228
+ throw new BehaviorFailure("UNKNOWN_NODE_KIND", \`op '\${op.id}' has no generated exec arm (fail-closed)\`);
229
+ };
230
+ const wrappedExec: Exec = (op, bound) => {
231
+ const outcome = exec(op, bound);
232
+ if ("ok" in outcome) results[op.id] = outcome.ok;
233
+ return outcome;
234
+ };
235
+ const run = runPlan(${planLiteral}, ops, wrappedExec);
236
+ run.states.forEach((st, i) => {
237
+ if (st.status === "skipped") results[ops[i].id] = unproducedValue(relationKinds[i]);
238
+ });
239
+ return ${output};
240
+ }`;
241
+ // async 版: plan の stage 内独立 op を plan.concurrency で bounded 並列に dispatch する
242
+ // (runPlanAsync = A0 の bounded 並行 plan primitive を per-node thunk で直呼び)。並行を
243
+ // 潰さず runBehaviorAsync と同一の並列挙動(同一 emitted-op 多重集合 / 同一結果)を持つ。
244
+ // 逐次化(concurrency=1 へ改変)すると in-flight 並列が消え pin が壊れる(AC#2/#3 非空虚)。
245
+ const asyncFn = `async function run_${sanitize(plan.name)}_async(handlers: AsyncHandlers, input: Scope): Promise<Value> {
246
+ const ops: OpSpec[] = ${emitOpsLiteral(plan)};
247
+ const results: Record<string, Value> = {};
248
+ const scope = (): Scope => ({ ...input, ...results });
249
+ ${relDecl}
250
+ const exec: AsyncExec = async (op) => {
251
+ const i = ops.findIndex((o) => o.id === op.id);
252
+ ${asyncArms}
253
+ throw new BehaviorFailure("UNKNOWN_NODE_KIND", \`op '\${op.id}' has no generated exec arm (fail-closed)\`);
254
+ };
255
+ const wrappedExec: AsyncExec = async (op, bound) => {
256
+ const outcome = await exec(op, bound);
257
+ if ("ok" in outcome) results[op.id] = outcome.ok;
258
+ return outcome;
259
+ };
260
+ const run = await runPlanAsync(${planLiteral}, ops, wrappedExec);
261
+ run.states.forEach((st, i) => {
262
+ if (st.status === "skipped") results[ops[i].id] = unproducedValue(relationKinds[i]);
263
+ });
264
+ return ${output};
265
+ }`;
266
+ return `${sync}\n\n${asyncFn}`;
267
+ }
268
+ /** component 名を関数名に使える形へ(決定的・衝突は index で回避しない: 名前は一意 — DUPLICATE_COMPONENT で保証)。 */
269
+ function sanitize(name) {
270
+ return name.replace(/[^A-Za-z0-9_$]/g, "_");
271
+ }
272
+ function emitComponent(plan, _ctx) {
273
+ return emitComponentFn(plan);
274
+ }
275
+ function emitModule(plans, ctx) {
276
+ const { fingerprint, specVersions, componentNames, runtimeImport } = ctx;
277
+ const spec = runtimeImport;
278
+ const names = componentNames.map((n) => JSON.stringify(n)).join(", ");
279
+ const irLiteral = emitDocLiteral(ctx.ir, "ts");
280
+ const fns = plans.map((p) => emitComponent(p, ctx)).join("\n\n");
281
+ const dispatchArms = plans
282
+ .map((p) => ` if (name === ${JSON.stringify(p.name)}) return run_${sanitize(p.name)}(handlers, { ...input });`)
283
+ .join("\n");
284
+ const dispatchAsyncArms = plans
285
+ .map((p) => ` if (name === ${JSON.stringify(p.name)}) return run_${sanitize(p.name)}_async(handlers, { ...input });`)
286
+ .join("\n");
287
+ return `// GENERATED by behavior-contracts common generator (bc#37/#42, straight-line) — DO NOT EDIT.
288
+ // Input: portable component-graph IR only (scp-ir-architecture.md §5/§7.4).
289
+ // This is the STRAIGHT-LINE codegen endpoint (typed-codegen.md §4.1): each component is
290
+ // emitted as a native function that drives the plan via the runPlan primitive and evaluates
291
+ // every port + output through the A0 expression-operator primitives (#36) + injected handlers.
292
+ // It does NOT go through runBehavior's tree-walk (no nodeKind dispatch / no evalPorts loop /
293
+ // no generic exec). Scope: componentRef + cond + map (over/when/into/batched — bc#42 A3), with
294
+ // simple Expression ports. bind() drives runPlan (same-value sequential fallback per plan.ts);
295
+ // bindAsync() drives the runPlanAsync bounded-parallel primitive with per-node thunks so the
296
+ // generated code preserves plan.concurrency (same parallel behavior as runBehaviorAsync — bc#42
297
+ // AC#2). Handlers are ALWAYS injected at the boundary; they are never generated.
298
+ // irFingerprint: ${fingerprint}
299
+ import { SPEC_VERSIONS, fingerprintComponentGraph, BehaviorFailure, codegenPrimitives as ${CGP}, runPlan, runPlanAsync, unproducedValue } from ${JSON.stringify(spec)};
300
+ import type { AsyncExec, AsyncHandlers, ComponentGraphIR, Exec, Handlers, OpSpec, RelationKind, Scope, Value } from ${JSON.stringify(spec)};
301
+
302
+ /** Spec versions baked at generation time (fail-closed constant comparison at load). */
303
+ export const EXPECTED_SPEC_VERSIONS = { behavior: ${specVersions.behavior}, expression: ${specVersions.expression}, plan: ${specVersions.plan} } as const;
304
+
305
+ /** FNV-1a 64 fingerprint of the source portable IR (canonicalJson discipline, #208). */
306
+ export const IR_FINGERPRINT = ${JSON.stringify(fingerprint)};
307
+
308
+ /** Component names exposed by bind(), in IR declaration order. */
309
+ export const COMPONENT_NAMES: readonly string[] = [${names}];
310
+
311
+ /** The portable component-graph IR, embedded for the load-time fingerprint self-check only. */
312
+ export const IR: ComponentGraphIR = ${irLiteral};
313
+
314
+ // ── load-time fail-closed checks (#208 prepared-artifact discipline, checked ONCE) ─────
315
+ for (const [k, want] of Object.entries(EXPECTED_SPEC_VERSIONS)) {
316
+ const got = (SPEC_VERSIONS as Record<string, number>)[k];
317
+ if (got !== want)
318
+ throw new Error(
319
+ \`behavior-contracts generated module: spec-version skew for '\${k}' (generated=\${want}, runtime=\${got}) — regenerate against this runtime (fail-closed)\`,
320
+ );
321
+ }
322
+ if (fingerprintComponentGraph(IR) !== IR_FINGERPRINT)
323
+ throw new Error(
324
+ \`behavior-contracts generated module: IR fingerprint mismatch (baked=\${IR_FINGERPRINT}, embedded literal=\${fingerprintComponentGraph(IR)}) — the generated code was modified or corrupted (fail-closed)\`,
325
+ );
326
+
327
+ // ── straight-line component functions (no runBehavior tree-walk) ───────────────────
328
+ ${fns}
329
+
330
+ /**
331
+ * bind — inject handlers (boundary injection; catalog name → implementation) and get one
332
+ * callable per component. Each callable runs the straight-line function for that component
333
+ * (plan via runPlan primitive + per-node primitive port eval + injected handler) — NOT
334
+ * the runBehavior tree-walk. Observationally equivalent to the runBehavior path:
335
+ * same values, same emitted op sequence, same Failure code/message.
336
+ */
337
+ export function bind(handlers: Handlers): Record<string, (input?: Scope) => Value> {
338
+ const bound: Record<string, (input?: Scope) => Value> = {};
339
+ for (const name of COMPONENT_NAMES) bound[name] = (input: Scope = {}) => dispatch(name, handlers, input);
340
+ return bound;
341
+ }
342
+
343
+ function dispatch(name: string, handlers: Handlers, input: Scope): Value {
344
+ ${dispatchArms}
345
+ throw new BehaviorFailure("UNKNOWN_ENTRY", \`component '\${name}' not found in this module (fail-closed)\`);
346
+ }
347
+
348
+ /**
349
+ * bindAsync — as bind, but each callable drives the plan via the runPlanAsync bounded-parallel
350
+ * primitive with per-node thunks. Same-stage independent ops are dispatched up to
351
+ * plan.concurrency in flight (async handlers awaited), preserving the exact parallel behavior of
352
+ * the async ir path (same emitted-op multiset + same result). Map bodies iterate elements in
353
+ * declaration order (the parallel unit is the body node, per §7). Observationally equivalent to
354
+ * the async ir path.
355
+ */
356
+ export function bindAsync(handlers: AsyncHandlers): Record<string, (input?: Scope) => Promise<Value>> {
357
+ const bound: Record<string, (input?: Scope) => Promise<Value>> = {};
358
+ for (const name of COMPONENT_NAMES) bound[name] = (input: Scope = {}) => dispatchAsync(name, handlers, input);
359
+ return bound;
360
+ }
361
+
362
+ function dispatchAsync(name: string, handlers: AsyncHandlers, input: Scope): Promise<Value> {
363
+ ${dispatchAsyncArms}
364
+ throw new BehaviorFailure("UNKNOWN_ENTRY", \`component '\${name}' not found in this module (fail-closed)\`);
365
+ }
366
+ `;
367
+ }
368
+ const dialect = {
369
+ emitExpr,
370
+ mapScopeVar: MAP_SCOPE,
371
+ emitComponent,
372
+ emitModule,
373
+ };
374
+ /**
375
+ * 公開再エクスポート(bc#46 B2 typed emitter が同じ TS dialect / scope 名を流用するため)。
376
+ * typed 経路は runtime 本体をこの straight-line dialect で綴じ、byte 同一の runtime を保つ。
377
+ */
378
+ export const straightlineTsDialect = dialect;
379
+ /** 生成コード内の scope 式(`scope()`)。typed emitter が同名で port/output を評価する。 */
380
+ export const TS_SCOPE = SCOPE;
381
+ /** 生成コード内の map 要素 scope 式(`mscope()`)。 */
382
+ export const TS_MAP_SCOPE = MAP_SCOPE;
383
+ function emit(ctx) {
384
+ return emitStraightlineModule(ctx, dialect, SCOPE);
385
+ }
386
+ /**
387
+ * typescriptStraightlineEmitter — 言語識別子 `"typescript-straightline"` の emitter plugin。
388
+ * 既存の `typescript`(リテラル焼き込み・endpoint 3-literal)と併存する additive な第2モード。
389
+ */
390
+ export const typescriptStraightlineEmitter = {
391
+ language: "typescript-straightline",
392
+ fileExtension: ".ts",
393
+ defaultRuntimeImport: "behavior-contracts",
394
+ filenameHint: "behaviors.straightline.generated.ts",
395
+ emit,
396
+ };
397
+ //# sourceMappingURL=emit-straightline-typescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-straightline-typescript.js","sourceRoot":"","sources":["../../src/generator/emit-straightline-typescript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * emit-typescript.ts — TS emitter(共通 Generator, bc#13 SP1)。
3
+ *
4
+ * 生成物: 可搬 IR を **型付き const リテラル**(`ComponentGraphIR`)として埋め込み、
5
+ * runtime-core の `runBehavior` / `runBehaviorAsync` に handler 注入で渡す薄い accessor
6
+ * (`bind` / `bindAsync`)を公開する TS モジュール。実行ロジックは一切生成しない。
7
+ * 型付けにより runtime API / IR / generator のドリフトはコンパイルエラーになる(目的2)。
8
+ */
9
+ import type { EmitterPlugin } from "./core.js";
10
+ export declare const typescriptEmitter: EmitterPlugin;
11
+ //# sourceMappingURL=emit-typescript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-typescript.d.ts","sourceRoot":"","sources":["../../src/generator/emit-typescript.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,WAAW,CAAC;AAgE5D,eAAO,MAAM,iBAAiB,EAAE,aAK/B,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { emitDocLiteral } from "./literal.js";
2
+ function emit(ctx) {
3
+ const { fingerprint, specVersions, componentNames, runtimeImport } = ctx;
4
+ const spec = runtimeImport;
5
+ const names = componentNames.map((n) => JSON.stringify(n)).join(", ");
6
+ const irLiteral = emitDocLiteral(ctx.ir, "ts");
7
+ return `// GENERATED by behavior-contracts common generator (bc#13) — DO NOT EDIT.
8
+ // Input: portable component-graph IR only (scp-ir-architecture.md §5/§7.4).
9
+ // This module is the codegen endpoint (§7.3 endpoint 3): the IR is embedded as a
10
+ // typed native literal and handed to the EXISTING runtime core (runBehavior) —
11
+ // no execution logic is generated. Handlers are ALWAYS injected at the boundary
12
+ // (IR + {effects,config,hooks} — concept.md §4.4); they are never generated.
13
+ // irFingerprint: ${fingerprint}
14
+ import { SPEC_VERSIONS, fingerprintComponentGraph, runBehavior, runBehaviorAsync } from ${JSON.stringify(spec)};
15
+ import type { AsyncHandlers, ComponentGraphIR, Handlers, Scope, Value } from ${JSON.stringify(spec)};
16
+
17
+ /** Spec versions baked at generation time (fail-closed constant comparison at load). */
18
+ export const EXPECTED_SPEC_VERSIONS = { behavior: ${specVersions.behavior}, expression: ${specVersions.expression}, plan: ${specVersions.plan} } as const;
19
+
20
+ /** FNV-1a 64 fingerprint of the source portable IR (canonicalJson discipline, #208). */
21
+ export const IR_FINGERPRINT = ${JSON.stringify(fingerprint)};
22
+
23
+ /** Component names exposed by bind()/bindAsync(), in IR declaration order. */
24
+ export const COMPONENT_NAMES: readonly string[] = [${names}];
25
+
26
+ /** The portable component-graph IR, embedded as a typed native literal (no JSON parse at runtime). */
27
+ export const IR: ComponentGraphIR = ${irLiteral};
28
+
29
+ // ── load-time fail-closed checks (#208 prepared-artifact discipline) ─────────
30
+ for (const [k, want] of Object.entries(EXPECTED_SPEC_VERSIONS)) {
31
+ const got = (SPEC_VERSIONS as Record<string, number>)[k];
32
+ if (got !== want)
33
+ throw new Error(
34
+ \`behavior-contracts generated module: spec-version skew for '\${k}' (generated=\${want}, runtime=\${got}) — regenerate against this runtime (fail-closed)\`,
35
+ );
36
+ }
37
+ if (fingerprintComponentGraph(IR) !== IR_FINGERPRINT)
38
+ throw new Error(
39
+ \`behavior-contracts generated module: IR fingerprint mismatch (baked=\${IR_FINGERPRINT}, embedded literal=\${fingerprintComponentGraph(IR)}) — the generated code was modified or corrupted (fail-closed)\`,
40
+ );
41
+
42
+ /**
43
+ * bind — inject handlers (boundary injection; catalog name → implementation) and
44
+ * get one callable per component. Each call delegates to the runtime core's
45
+ * runBehavior over the embedded IR (dynamic-path equivalent — §7.3).
46
+ */
47
+ export function bind(handlers: Handlers): Record<string, (input?: Scope) => Value> {
48
+ const bound: Record<string, (input?: Scope) => Value> = {};
49
+ for (const name of COMPONENT_NAMES) bound[name] = (input: Scope = {}) => runBehavior(IR, handlers, input, name);
50
+ return bound;
51
+ }
52
+
53
+ /** bindAsync — as bind, over runBehaviorAsync (bounded stage parallelism per plan.concurrency). */
54
+ export function bindAsync(handlers: AsyncHandlers): Record<string, (input?: Scope) => Promise<Value>> {
55
+ const bound: Record<string, (input?: Scope) => Promise<Value>> = {};
56
+ for (const name of COMPONENT_NAMES)
57
+ bound[name] = (input: Scope = {}) => runBehaviorAsync(IR, handlers, input, name);
58
+ return bound;
59
+ }
60
+ `;
61
+ }
62
+ export const typescriptEmitter = {
63
+ language: "typescript",
64
+ fileExtension: ".ts",
65
+ defaultRuntimeImport: "behavior-contracts",
66
+ emit,
67
+ };
68
+ //# sourceMappingURL=emit-typescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-typescript.js","sourceRoot":"","sources":["../../src/generator/emit-typescript.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,SAAS,IAAI,CAAC,GAAgB;IAC5B,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC;IACzE,MAAM,IAAI,GAAG,aAAa,CAAC;IAC3B,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/C,OAAO;;;;;;oBAMW,WAAW;0FAC2D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;+EAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;;oDAG/C,YAAY,CAAC,QAAQ,iBAAiB,YAAY,CAAC,UAAU,WAAW,YAAY,CAAC,IAAI;;;gCAG7G,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;;;qDAGN,KAAK;;;sCAGpB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiC9C,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAkB;IAC9C,QAAQ,EAAE,YAAY;IACtB,aAAa,EAAE,KAAK;IACpB,oBAAoB,EAAE,oBAAoB;IAC1C,IAAI;CACL,CAAC"}
@@ -0,0 +1,14 @@
1
+ /** fingerprint 入力の不変条件違反(fail-closed)。 */
2
+ export declare class FingerprintFailure extends Error {
3
+ code: "UNSAFE_NUMBER" | "INVALID_VALUE";
4
+ constructor(code: "UNSAFE_NUMBER" | "INVALID_VALUE", message: string);
5
+ }
6
+ /**
7
+ * fingerprintComponentGraph — 可搬 IR ドキュメントの決定的 fingerprint。
8
+ *
9
+ * `"fnv1a64:<16hex>"` を返す。同一構造の IR(キー順・整数/整数値float の表記差を除く)は
10
+ * 言語(TS/Python)を跨いで同一の fingerprint になる。生成モジュールのロード時
11
+ * 自己検査・consumer 側の「live IR ↔ 生成コード」照合(#208 の prepared-loader と同型)に使う。
12
+ */
13
+ export declare function fingerprintComponentGraph(doc: unknown): string;
14
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/generator/fingerprint.ts"],"names":[],"mappings":"AAuBA,0CAA0C;AAC1C,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,IAAI,EAAE,eAAe,GAAG,eAAe,CAAC;gBAC5B,IAAI,EAAE,eAAe,GAAG,eAAe,EAAE,OAAO,EAAE,MAAM;CAKrE;AA8DD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAG9D"}
@@ -0,0 +1,74 @@
1
+ import { canonicalJson } from "../canonical.js";
2
+ /** fingerprint 入力の不変条件違反(fail-closed)。 */
3
+ export class FingerprintFailure extends Error {
4
+ code;
5
+ constructor(code, message) {
6
+ super(message);
7
+ this.code = code;
8
+ this.name = "FingerprintFailure";
9
+ }
10
+ }
11
+ /**
12
+ * JSON ドキュメント → Value ドメイン(整数値 number は int=bigint へ正準化)。
13
+ * canonicalJson の値モデル(bigint=int / number=float)に合わせる。
14
+ */
15
+ function toValueDomain(doc, path) {
16
+ if (doc === null || typeof doc === "boolean" || typeof doc === "string")
17
+ return doc;
18
+ if (typeof doc === "number") {
19
+ if (Number.isInteger(doc) && !Object.is(doc, -0)) {
20
+ if (Math.abs(doc) >= 2 ** 53)
21
+ throw new FingerprintFailure("UNSAFE_NUMBER", `integral number ${doc} at ${path} exceeds float64-exact range; portable IR must use {int:"..."} (fail-closed)`);
22
+ return BigInt(doc);
23
+ }
24
+ return doc; // 非整数 / -0.0 は float(canonicalJson が pyFloatRepr で直列化)
25
+ }
26
+ if (Array.isArray(doc))
27
+ return doc.map((v, i) => toValueDomain(v, `${path}[${i}]`));
28
+ if (typeof doc === "object") {
29
+ const out = {};
30
+ for (const [k, v] of Object.entries(doc))
31
+ out[k] = toValueDomain(v, `${path}.${k}`);
32
+ return out;
33
+ }
34
+ throw new FingerprintFailure("INVALID_VALUE", `value of type ${typeof doc} at ${path} cannot appear in a portable IR document (fail-closed)`);
35
+ }
36
+ /** UTF-8 エンコード(依存ゼロ・決定的。lib 制約により TextEncoder を使わない)。 */
37
+ function utf8Bytes(s) {
38
+ const out = [];
39
+ for (const ch of s) {
40
+ const cp = ch.codePointAt(0);
41
+ if (cp <= 0x7f)
42
+ out.push(cp);
43
+ else if (cp <= 0x7ff)
44
+ out.push(0xc0 | (cp >> 6), 0x80 | (cp & 0x3f));
45
+ else if (cp <= 0xffff)
46
+ out.push(0xe0 | (cp >> 12), 0x80 | ((cp >> 6) & 0x3f), 0x80 | (cp & 0x3f));
47
+ else
48
+ out.push(0xf0 | (cp >> 18), 0x80 | ((cp >> 12) & 0x3f), 0x80 | ((cp >> 6) & 0x3f), 0x80 | (cp & 0x3f));
49
+ }
50
+ return out;
51
+ }
52
+ /** FNV-1a 64(offset 0xcbf29ce484222325, prime 0x100000001b3)→ 16桁小文字 hex。 */
53
+ function fnv1a64(bytes) {
54
+ let h = 0xcbf29ce484222325n;
55
+ const prime = 0x100000001b3n;
56
+ const mask = 0xffffffffffffffffn;
57
+ for (const b of bytes) {
58
+ h ^= BigInt(b);
59
+ h = (h * prime) & mask;
60
+ }
61
+ return h.toString(16).padStart(16, "0");
62
+ }
63
+ /**
64
+ * fingerprintComponentGraph — 可搬 IR ドキュメントの決定的 fingerprint。
65
+ *
66
+ * `"fnv1a64:<16hex>"` を返す。同一構造の IR(キー順・整数/整数値float の表記差を除く)は
67
+ * 言語(TS/Python)を跨いで同一の fingerprint になる。生成モジュールのロード時
68
+ * 自己検査・consumer 側の「live IR ↔ 生成コード」照合(#208 の prepared-loader と同型)に使う。
69
+ */
70
+ export function fingerprintComponentGraph(doc) {
71
+ const s = canonicalJson(toValueDomain(doc, "$"));
72
+ return "fnv1a64:" + fnv1a64(utf8Bytes(s));
73
+ }
74
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/generator/fingerprint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export { generateModule, registerEmitter, registeredLanguages, GeneratorFailure, } from "./core.js";
2
+ export type { GenerateOptions, GeneratedModule, EmitContext, EmitterPlugin, GeneratorFailureCode, } from "./core.js";
3
+ export { fingerprintComponentGraph, FingerprintFailure } from "./fingerprint.js";
4
+ export { typescriptEmitter } from "./emit-typescript.js";
5
+ export { pythonEmitter } from "./emit-python.js";
6
+ export { goEmitter } from "./emit-go.js";
7
+ export { rustEmitter } from "./emit-rust.js";
8
+ export { phpEmitter } from "./emit-php.js";
9
+ export { typescriptStraightlineEmitter } from "./emit-straightline-typescript.js";
10
+ export { rustStraightlineEmitter } from "./emit-straightline-rust.js";
11
+ export { phpStraightlineEmitter } from "./emit-straightline-php.js";
12
+ export { goStraightlineEmitter } from "./emit-straightline-go.js";
13
+ export { pythonStraightlineEmitter } from "./emit-straightline-python.js";
14
+ export { typescriptTypedEmitter, tsTypedMaterializer } from "./emit-straightline-typed-typescript.js";
15
+ export { goTypedEmitter, goTypedMaterializer } from "./emit-straightline-typed-go.js";
16
+ export { rustTypedEmitter, rustTypedMaterializer } from "./emit-straightline-typed-rust.js";
17
+ export { rustStraightlineInternals } from "./emit-straightline-rust.js";
18
+ export { assertStraightlineSupported, isStraightlineNode, buildComponentPlan, emitStraightlineModule, } from "./straightline.js";
19
+ export type { StraightlineDialect, StraightlineOp, ComponentPlan, OpLiteral, } from "./straightline.js";
20
+ export { buildTypePlan, deriveTypeRef, findDecl } from "./typed.js";
21
+ export type { TypePlan, TypeRef, TypeDecl, TypedMaterializer } from "./typed.js";
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AA+CA,OAAO,EACL,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,eAAe,EACf,eAAe,EACf,WAAW,EACX,aAAa,EACb,oBAAoB,GACrB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AACtG,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC5F,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,SAAS,GACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}