behavior-contracts 0.1.2 → 0.2.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.
Files changed (73) 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 +201 -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/canonical.d.ts +1 -1
  15. package/dist/canonical.d.ts.map +1 -1
  16. package/dist/canonical.js +13 -1
  17. package/dist/canonical.js.map +1 -1
  18. package/dist/codec.d.ts.map +1 -1
  19. package/dist/codec.js +7 -1
  20. package/dist/codec.js.map +1 -1
  21. package/dist/expr-eval.d.ts +9 -1
  22. package/dist/expr-eval.d.ts.map +1 -1
  23. package/dist/expr-eval.js +21 -3
  24. package/dist/expr-eval.js.map +1 -1
  25. package/dist/generator/core.d.ts +89 -0
  26. package/dist/generator/core.d.ts.map +1 -0
  27. package/dist/generator/core.js +124 -0
  28. package/dist/generator/core.js.map +1 -0
  29. package/dist/generator/emit-go.d.ts +19 -0
  30. package/dist/generator/emit-go.d.ts.map +1 -0
  31. package/dist/generator/emit-go.js +79 -0
  32. package/dist/generator/emit-go.js.map +1 -0
  33. package/dist/generator/emit-php.d.ts +20 -0
  34. package/dist/generator/emit-php.d.ts.map +1 -0
  35. package/dist/generator/emit-php.js +76 -0
  36. package/dist/generator/emit-php.js.map +1 -0
  37. package/dist/generator/emit-python.d.ts +10 -0
  38. package/dist/generator/emit-python.d.ts.map +1 -0
  39. package/dist/generator/emit-python.js +75 -0
  40. package/dist/generator/emit-python.js.map +1 -0
  41. package/dist/generator/emit-rust.d.ts +25 -0
  42. package/dist/generator/emit-rust.d.ts.map +1 -0
  43. package/dist/generator/emit-rust.js +125 -0
  44. package/dist/generator/emit-rust.js.map +1 -0
  45. package/dist/generator/emit-typescript.d.ts +11 -0
  46. package/dist/generator/emit-typescript.d.ts.map +1 -0
  47. package/dist/generator/emit-typescript.js +68 -0
  48. package/dist/generator/emit-typescript.js.map +1 -0
  49. package/dist/generator/fingerprint.d.ts +14 -0
  50. package/dist/generator/fingerprint.d.ts.map +1 -0
  51. package/dist/generator/fingerprint.js +74 -0
  52. package/dist/generator/fingerprint.js.map +1 -0
  53. package/dist/generator/index.d.ts +9 -0
  54. package/dist/generator/index.d.ts.map +1 -0
  55. package/dist/generator/index.js +25 -0
  56. package/dist/generator/index.js.map +1 -0
  57. package/dist/generator/literal.d.ts +8 -0
  58. package/dist/generator/literal.d.ts.map +1 -0
  59. package/dist/generator/literal.js +191 -0
  60. package/dist/generator/literal.js.map +1 -0
  61. package/dist/guard.d.ts +18 -0
  62. package/dist/guard.d.ts.map +1 -1
  63. package/dist/guard.js +130 -0
  64. package/dist/guard.js.map +1 -1
  65. package/dist/index.d.ts +17 -6
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +18 -5
  68. package/dist/index.js.map +1 -1
  69. package/dist/plan.d.ts +36 -0
  70. package/dist/plan.d.ts.map +1 -1
  71. package/dist/plan.js +152 -14
  72. package/dist/plan.js.map +1 -1
  73. package/package.json +6 -3
@@ -0,0 +1,574 @@
1
+ import { cmpCodePoints, FORBIDDEN_OBJECT_KEY } from "./expr-eval.js";
2
+ import { SPEC_VERSIONS } from "./index.js";
3
+ import { assertPortableComponentGraph } from "./guard.js";
4
+ export class BuilderFailure extends Error {
5
+ code;
6
+ constructor(code, message) {
7
+ super(message);
8
+ this.code = code;
9
+ this.name = "BuilderFailure";
10
+ }
11
+ }
12
+ function bfail(code, message) {
13
+ throw new BuilderFailure(code, message);
14
+ }
15
+ /** `portableToIR: false` のエントリは可搬 IR に載せられない(両経路共通の先頭検査)。 */
16
+ export function checkPortableEntry(name, entry, fail) {
17
+ if (entry.portableToIR === false)
18
+ fail("NOT_PORTABLE_COMPONENT", `component '${name}' is declared portableToIR: false and cannot be referenced from portable IR`);
19
+ }
20
+ /**
21
+ * port 名の catalog 照合(両経路共通):
22
+ * - 未宣言 port はエントリが `additionalPorts: true` を宣言しない限り fail-closed で拒否
23
+ * (動的 port 群 — `item.<field>` 等 — を持つ write 系エントリだけが opt-in する)。
24
+ * - required 宣言 port の欠落は additionalPorts に関わらず拒否。
25
+ */
26
+ export function checkPortNames(name, entry, portNames, fail) {
27
+ const schema = entry.inputPorts ?? {};
28
+ if (entry.additionalPorts !== true) {
29
+ for (const k of portNames)
30
+ if (!Object.hasOwn(schema, k))
31
+ fail("UNKNOWN_PORT", `component '${name}': unknown port '${k}' (catalog schema is the contract; declare it or opt in with additionalPorts: true)`);
32
+ }
33
+ for (const [k, s] of Object.entries(schema))
34
+ if (s.required === true && !portNames.includes(k))
35
+ fail("MISSING_PORT", `component '${name}': required port '${k}' is missing`);
36
+ }
37
+ /** 宣言 port の型名 → 静的に検査できるスカラ種(それ以外の型名は検査対象外)。 */
38
+ const SCALAR_TYPE_KINDS = {
39
+ string: "string",
40
+ number: "number",
41
+ int: "number",
42
+ float: "number",
43
+ boolean: "boolean",
44
+ bool: "boolean",
45
+ };
46
+ /** lower 済み port 値が静的スカラリテラルならその種を返す(式は null = 検査不能)。 */
47
+ function literalKind(v) {
48
+ if (typeof v === "string")
49
+ return "string";
50
+ if (typeof v === "number")
51
+ return "number";
52
+ if (typeof v === "boolean")
53
+ return "boolean";
54
+ if (v !== null && typeof v === "object" && !Array.isArray(v)) {
55
+ const keys = Object.keys(v);
56
+ if (keys.length === 1 && (keys[0] === "int" || keys[0] === "float"))
57
+ return "number";
58
+ }
59
+ return null;
60
+ }
61
+ /**
62
+ * 宣言 port のスカラリテラル型検査(両経路共通・additionalPorts に関わらず適用):
63
+ * 宣言型がスカラ(string/number/boolean 系)で、配線値が**静的スカラリテラル**のとき
64
+ * のみ照合する(`{ref}` / `{concat}` 等の式は実行時型のため検査対象外)。
65
+ */
66
+ export function checkDeclaredPortTypes(name, entry, ports, fail) {
67
+ for (const [k, s] of Object.entries(entry.inputPorts ?? {})) {
68
+ if (!Object.hasOwn(ports, k))
69
+ continue;
70
+ const want = SCALAR_TYPE_KINDS[s.type];
71
+ if (want === undefined)
72
+ continue;
73
+ const got = literalKind(ports[k]);
74
+ if (got !== null && got !== want)
75
+ fail("PORT_TYPE_MISMATCH", `component '${name}': port '${k}' is declared '${s.type}' but is wired a ${got} literal (declared ports are type-checked)`);
76
+ }
77
+ }
78
+ // ── 依存収集(recorder 経路と共有)────────────────────────────────────────────────
79
+ /**
80
+ * IR ノードを走査し、`ids` に含まれる id を root に持つ ref/refOpt の root を出現順に集める
81
+ * (recorder の Wire 選択・両経路の plan 導出が使う共通プリミティブ)。
82
+ */
83
+ export function collectNodeIdRefs(node, ids, out = []) {
84
+ if (Array.isArray(node)) {
85
+ for (const e of node)
86
+ collectNodeIdRefs(e, ids, out);
87
+ return out;
88
+ }
89
+ if (node && typeof node === "object") {
90
+ const keys = Object.keys(node);
91
+ if (keys.length === 1 && (keys[0] === "ref" || keys[0] === "refOpt")) {
92
+ const path = node[keys[0]];
93
+ if (Array.isArray(path) && typeof path[0] === "string" && ids.has(path[0]) && !out.includes(path[0]))
94
+ out.push(path[0]);
95
+ return out;
96
+ }
97
+ for (const k of keys)
98
+ collectNodeIdRefs(node[k], ids, out);
99
+ }
100
+ return out;
101
+ }
102
+ /** body ノードの依存 id 集合(ports/over/when/cond 式の ref root + parent。`ids` 内のみ)。 */
103
+ function bodyNodeDeps(n, ids) {
104
+ const deps = [];
105
+ if ("map" in n) {
106
+ collectNodeIdRefs(n.map.over, ids, deps);
107
+ collectNodeIdRefs(n.map.ports, ids, deps);
108
+ if (n.map.when !== undefined)
109
+ collectNodeIdRefs(n.map.when, ids, deps);
110
+ if (n.map.parent !== undefined && ids.has(n.map.parent) && !deps.includes(n.map.parent))
111
+ deps.push(n.map.parent);
112
+ }
113
+ else if ("cond" in n) {
114
+ collectNodeIdRefs(n.cond.if, ids, deps);
115
+ collectNodeIdRefs(n.cond.then, ids, deps);
116
+ collectNodeIdRefs(n.cond.else, ids, deps);
117
+ if (n.cond.parent !== undefined && ids.has(n.cond.parent) && !deps.includes(n.cond.parent))
118
+ deps.push(n.cond.parent);
119
+ }
120
+ else {
121
+ collectNodeIdRefs(n.ports, ids, deps);
122
+ if (n.parent !== undefined && ids.has(n.parent) && !deps.includes(n.parent))
123
+ deps.push(n.parent);
124
+ }
125
+ return deps;
126
+ }
127
+ // ── plan 導出(依存 → stage groups。recorder 経路と共有)──────────────────────────
128
+ export const DEFAULT_PLAN_CONCURRENCY = 16;
129
+ /**
130
+ * 依存グラフから Execution Plan(`{groups, concurrency}`, execution-plan.md)を導出する。
131
+ * stage = 依存深さ(Kahn levels)。record 順が topological な recorder 経路では現行実装と
132
+ * 同一の結果になり、順序が任意のデータ登録経路では worklist で収束させ、循環は
133
+ * `DEPENDENCY_CYCLE` で fail-closed に拒否する。
134
+ */
135
+ function derivePlanFromDeps(nodes, depsByIndex, concurrency) {
136
+ if (nodes.length === 0)
137
+ return undefined;
138
+ const level = new Map();
139
+ let pending = nodes.length;
140
+ while (pending > 0) {
141
+ let progress = false;
142
+ nodes.forEach((n, i) => {
143
+ if (level.has(n.id))
144
+ return;
145
+ let l = 0;
146
+ for (const d of depsByIndex[i]) {
147
+ const dl = d === n.id ? undefined : level.get(d);
148
+ if (dl === undefined) {
149
+ l = -1;
150
+ break;
151
+ }
152
+ l = Math.max(l, dl + 1);
153
+ }
154
+ if (l < 0)
155
+ return;
156
+ level.set(n.id, l);
157
+ pending--;
158
+ progress = true;
159
+ });
160
+ if (!progress) {
161
+ const stuck = nodes.filter((n) => !level.has(n.id)).map((n) => `'${n.id}'`);
162
+ bfail("DEPENDENCY_CYCLE", `component body has a dependency cycle among nodes [${stuck.join(", ")}]`);
163
+ }
164
+ }
165
+ const groups = [];
166
+ nodes.forEach((n, i) => {
167
+ const l = level.get(n.id);
168
+ (groups[l] ??= []).push(i);
169
+ });
170
+ return { groups, concurrency };
171
+ }
172
+ // ── 決定的正規化(キーソート再構築)────────────────────────────────────────────────
173
+ /**
174
+ * 全 object のキーを code-point 順(canonical-serialization.md と同じ `cmpCodePoints`)に
175
+ * ソートして再構築する(配列順序・値は保持。入力は変異しない)。これにより
176
+ * **構造的に同じ入力データ → byte 同一の出力**(`JSON.stringify` 安定)が成立する。
177
+ */
178
+ function canonicalizeDeep(v) {
179
+ if (Array.isArray(v))
180
+ return v.map(canonicalizeDeep);
181
+ if (v !== null && typeof v === "object") {
182
+ const src = v;
183
+ const out = {};
184
+ for (const k of Object.keys(src).sort(cmpCodePoints))
185
+ out[k] = canonicalizeDeep(src[k]);
186
+ return out;
187
+ }
188
+ return v;
189
+ }
190
+ // ── 内部: 構造検証ヘルパ ───────────────────────────────────────────────────────────
191
+ const DEFINITION_KEYS = /* @__PURE__ */ new Set(["name", "inputPorts", "body", "output", "plan"]);
192
+ const REF_NODE_KEYS = /* @__PURE__ */ new Set(["id", "component", "ports", "parent", "bindField", "relationKind", "policy"]);
193
+ const MAP_NODE_KEYS = /* @__PURE__ */ new Set(["id", "map"]);
194
+ const MAP_KEYS = /* @__PURE__ */ new Set(["over", "as", "component", "ports", "when", "into", "batched", "parent", "relationKind", "policy"]);
195
+ const COND_NODE_KEYS = /* @__PURE__ */ new Set(["id", "cond"]);
196
+ const COND_KEYS = /* @__PURE__ */ new Set(["if", "then", "else", "parent"]);
197
+ const SCHEMA_KEYS = /* @__PURE__ */ new Set(["type", "required"]);
198
+ const PLAN_KEYS = /* @__PURE__ */ new Set(["groups", "concurrency"]);
199
+ const RELATION_KINDS = /* @__PURE__ */ new Set(["single", "connection"]);
200
+ const POLICY_KINDS = /* @__PURE__ */ new Set(["fail", "retry", "continue"]);
201
+ function isPlainObject(v) {
202
+ return v !== null && typeof v === "object" && !Array.isArray(v);
203
+ }
204
+ function checkAllowedKeys(rec, allowed, code, at) {
205
+ for (const k of Object.keys(rec))
206
+ if (!allowed.has(k))
207
+ bfail(code, `${at}: unknown key '${k}' (fail-closed)`);
208
+ }
209
+ /** runBehavior の scope / 結果 object のキーになる名前は "__proto__" を禁止(fail-closed)。 */
210
+ function checkScopeKeyName(name, what, at) {
211
+ if (typeof name !== "string" || name === "")
212
+ bfail("INVALID_NODE", `${at}: ${what} must be a non-empty string`);
213
+ if (name === FORBIDDEN_OBJECT_KEY)
214
+ bfail("INVALID_NODE", `${at}: ${what} "${FORBIDDEN_OBJECT_KEY}" is forbidden (fail-closed)`);
215
+ return name;
216
+ }
217
+ /** parent / relationKind / policy の共通検証(値は正規化ノードへ写す)。 */
218
+ function checkNodeWire(rec, ids, at) {
219
+ const out = {};
220
+ if (rec.parent !== undefined) {
221
+ if (typeof rec.parent !== "string")
222
+ bfail("INVALID_NODE", `${at}: 'parent' must be a node id string`);
223
+ if (!ids.has(rec.parent))
224
+ bfail("UNKNOWN_PARENT", `${at}: parent '${rec.parent}' is not a body node id`);
225
+ out.parent = rec.parent;
226
+ }
227
+ if (rec.relationKind !== undefined) {
228
+ if (typeof rec.relationKind !== "string" || !RELATION_KINDS.has(rec.relationKind))
229
+ bfail("INVALID_NODE", `${at}: 'relationKind' must be "single" or "connection"`);
230
+ out.relationKind = rec.relationKind;
231
+ }
232
+ if (rec.policy !== undefined) {
233
+ if (typeof rec.policy !== "string" || !POLICY_KINDS.has(rec.policy))
234
+ bfail("INVALID_NODE", `${at}: 'policy' must be "fail", "retry" or "continue"`);
235
+ out.policy = rec.policy;
236
+ }
237
+ return out;
238
+ }
239
+ function checkPortsShape(ports, at) {
240
+ if (!isPlainObject(ports))
241
+ bfail("INVALID_NODE", `${at}: 'ports' must be a plain object`);
242
+ for (const k of Object.keys(ports))
243
+ if (k === FORBIDDEN_OBJECT_KEY)
244
+ bfail("INVALID_NODE", `${at}: port name "${FORBIDDEN_OBJECT_KEY}" is forbidden (fail-closed)`);
245
+ return ports;
246
+ }
247
+ /** 1 body ノードを構造検証し、既知キーだけの正規化コピーを返す(undefined 値の optional は落とす)。 */
248
+ function normalizeNode(raw, ids, at) {
249
+ const rec = raw; // pass 1 で plain object / id は検証済み
250
+ const id = rec.id;
251
+ if (rec.map !== undefined) {
252
+ checkAllowedKeys(rec, MAP_NODE_KEYS, "INVALID_NODE", at);
253
+ if (!isPlainObject(rec.map))
254
+ bfail("INVALID_NODE", `${at}: 'map' must be a plain object`);
255
+ const m = rec.map;
256
+ checkAllowedKeys(m, MAP_KEYS, "INVALID_NODE", `${at}.map`);
257
+ if (m.over === undefined)
258
+ bfail("INVALID_NODE", `${at}.map: 'over' is required`);
259
+ const as = checkScopeKeyName(m.as, "'as'", `${at}.map`);
260
+ if (!as.startsWith("$") || as.length < 2)
261
+ bfail("INVALID_NODE", `${at}.map: 'as' must be a "$"-prefixed element binding (e.g. "$el"), got '${as}'`);
262
+ if (ids.has(as))
263
+ bfail("INVALID_NODE", `${at}.map: 'as' binding '${as}' collides with a body node id`);
264
+ if (typeof m.component !== "string" || m.component === "")
265
+ bfail("INVALID_NODE", `${at}.map: 'component' must be a non-empty catalog name string`);
266
+ const ports = checkPortsShape(m.ports, `${at}.map`);
267
+ const node = { id, map: { over: m.over, as, component: m.component, ports } };
268
+ if (m.when !== undefined)
269
+ node.map.when = m.when;
270
+ if (m.into !== undefined)
271
+ node.map.into = checkScopeKeyName(m.into, "'into'", `${at}.map`);
272
+ if (m.batched !== undefined) {
273
+ if (typeof m.batched !== "boolean")
274
+ bfail("INVALID_NODE", `${at}.map: 'batched' must be a boolean`);
275
+ node.map.batched = m.batched;
276
+ }
277
+ const wire = checkNodeWire(m, ids, `${at}.map`);
278
+ if (wire.parent !== undefined)
279
+ node.map.parent = wire.parent;
280
+ if (wire.relationKind !== undefined)
281
+ node.map.relationKind = wire.relationKind;
282
+ if (wire.policy !== undefined)
283
+ node.map.policy = wire.policy;
284
+ return node;
285
+ }
286
+ if (rec.cond !== undefined) {
287
+ checkAllowedKeys(rec, COND_NODE_KEYS, "INVALID_NODE", at);
288
+ if (!isPlainObject(rec.cond))
289
+ bfail("INVALID_NODE", `${at}: 'cond' must be a plain object`);
290
+ const c = rec.cond;
291
+ checkAllowedKeys(c, COND_KEYS, "INVALID_NODE", `${at}.cond`);
292
+ if (c.if === undefined)
293
+ bfail("INVALID_NODE", `${at}.cond: 'if' is required`);
294
+ if (c.then === undefined)
295
+ bfail("INVALID_NODE", `${at}.cond: 'then' is required (use null for an empty branch)`);
296
+ if (c.else === undefined)
297
+ bfail("INVALID_NODE", `${at}.cond: 'else' is required (use null for an empty branch)`);
298
+ const node = { id, cond: { if: c.if, then: c.then, else: c.else } };
299
+ // relationKind / policy は COND_KEYS に無い(cond ノードには適用されない — 上の
300
+ // checkAllowedKeys が拒否済み)。ここで検証するのは parent のみ。
301
+ const wire = checkNodeWire(c, ids, `${at}.cond`);
302
+ if (wire.parent !== undefined)
303
+ node.cond.parent = wire.parent;
304
+ return node;
305
+ }
306
+ if (rec.component !== undefined) {
307
+ checkAllowedKeys(rec, REF_NODE_KEYS, "INVALID_NODE", at);
308
+ if (typeof rec.component !== "string" || rec.component === "")
309
+ bfail("INVALID_NODE", `${at}: 'component' must be a non-empty catalog name string`);
310
+ const ports = checkPortsShape(rec.ports, at);
311
+ const node = { id, component: rec.component, ports };
312
+ const wire = checkNodeWire(rec, ids, at);
313
+ if (wire.parent !== undefined)
314
+ node.parent = wire.parent;
315
+ if (rec.bindField !== undefined) {
316
+ if (typeof rec.bindField !== "string" || rec.bindField === "")
317
+ bfail("INVALID_NODE", `${at}: 'bindField' must be a non-empty string`);
318
+ node.bindField = rec.bindField;
319
+ }
320
+ if (wire.relationKind !== undefined)
321
+ node.relationKind = wire.relationKind;
322
+ if (wire.policy !== undefined)
323
+ node.policy = wire.policy;
324
+ return node;
325
+ }
326
+ bfail("INVALID_NODE", `${at}: body node must be componentRef ('component'), 'map' or 'cond'`);
327
+ }
328
+ /**
329
+ * Expression IR を走査し、`ref`/`refOpt` の root が「body ノード id / 宣言 input port /
330
+ * `binding`(その map 自身の `as`)」のいずれかであることを検証する(fail-closed
331
+ * `UNKNOWN_REF`)。node id root は依存として収集する(plan 導出・供給 plan 検証に使う)。
332
+ */
333
+ function walkRefs(node, binding, ctx, at) {
334
+ if (node === null || typeof node !== "object")
335
+ return;
336
+ if (Array.isArray(node)) {
337
+ node.forEach((e, i) => walkRefs(e, binding, ctx, `${at}[${i}]`));
338
+ return;
339
+ }
340
+ const rec = node;
341
+ const keys = Object.keys(rec);
342
+ if (keys.length === 1) {
343
+ const op = keys[0];
344
+ const arg = rec[op];
345
+ if (op === "ref" || op === "refOpt") {
346
+ if (!Array.isArray(arg) || arg.length === 0 || arg.some((s) => typeof s !== "string"))
347
+ bfail("UNKNOWN_REF", `${at}: '${op}' path must be a non-empty array of strings`);
348
+ const root = arg[0];
349
+ if (ctx.ids.has(root)) {
350
+ ctx.addDep(root);
351
+ return;
352
+ }
353
+ if (ctx.inputs.has(root) || (binding !== null && root === binding))
354
+ return;
355
+ bfail("UNKNOWN_REF", `${at}: reference root '${root}' is not a body node id, a declared input port${binding !== null ? `, or the map binding '${binding}'` : ""} (fail-closed)`);
356
+ }
357
+ if (op === "obj") {
358
+ // obj の arg キーは operator ではなく data — 値だけを式として再帰(guard と同じ規約)。
359
+ if (isPlainObject(arg))
360
+ for (const [k, v] of Object.entries(arg))
361
+ walkRefs(v, binding, ctx, `${at}.obj.${k}`);
362
+ return; // 不正な obj arg は guard が拒否する
363
+ }
364
+ if (op === "int" || op === "float")
365
+ return; // リテラルラッパ
366
+ walkRefs(arg, binding, ctx, `${at}.${op}`);
367
+ return;
368
+ }
369
+ for (const [k, v] of Object.entries(rec))
370
+ walkRefs(v, binding, ctx, `${at}.${k}`);
371
+ }
372
+ /** 1 body ノードの全式位置を検証し、依存 id(ref root + parent)を返す。 */
373
+ function nodeRefsAndDeps(n, ids, inputs, at) {
374
+ const deps = [];
375
+ const ctx = {
376
+ ids,
377
+ inputs,
378
+ addDep: (d) => {
379
+ if (!deps.includes(d))
380
+ deps.push(d);
381
+ },
382
+ };
383
+ if ("map" in n) {
384
+ walkRefs(n.map.over, null, ctx, `${at}.map.over`); // over は束縛の外で評価される
385
+ walkRefs(n.map.ports, n.map.as, ctx, `${at}.map.ports`);
386
+ if (n.map.when !== undefined)
387
+ walkRefs(n.map.when, n.map.as, ctx, `${at}.map.when`);
388
+ if (n.map.parent !== undefined && !deps.includes(n.map.parent))
389
+ deps.push(n.map.parent);
390
+ }
391
+ else if ("cond" in n) {
392
+ walkRefs(n.cond.if, null, ctx, `${at}.cond.if`);
393
+ walkRefs(n.cond.then, null, ctx, `${at}.cond.then`);
394
+ walkRefs(n.cond.else, null, ctx, `${at}.cond.else`);
395
+ if (n.cond.parent !== undefined && !deps.includes(n.cond.parent))
396
+ deps.push(n.cond.parent);
397
+ }
398
+ else {
399
+ walkRefs(n.ports, null, ctx, `${at}.ports`);
400
+ if (n.parent !== undefined && !deps.includes(n.parent))
401
+ deps.push(n.parent);
402
+ }
403
+ return deps;
404
+ }
405
+ // ── 内部: 供給 plan の検証 ───────────────────────────────────────────────────────────
406
+ function validateSuppliedPlan(raw, body, depsByIndex) {
407
+ if (!isPlainObject(raw))
408
+ bfail("INVALID_PLAN", "'plan' must be an object, null (no plan) or omitted (derived)");
409
+ checkAllowedKeys(raw, PLAN_KEYS, "INVALID_PLAN", "plan");
410
+ const { groups, concurrency } = raw;
411
+ if (typeof concurrency !== "number" || !Number.isSafeInteger(concurrency) || concurrency < 1)
412
+ bfail("INVALID_PLAN", "plan.concurrency must be a positive integer");
413
+ if (!Array.isArray(groups))
414
+ bfail("INVALID_PLAN", "plan.groups must be an array of stages");
415
+ const n = body.length;
416
+ const stageOf = new Array(n);
417
+ const seen = new Set();
418
+ groups.forEach((stage, s) => {
419
+ if (!Array.isArray(stage))
420
+ bfail("INVALID_PLAN", `plan.groups[${s}] must be an array of body indexes`);
421
+ for (const i of stage) {
422
+ if (typeof i !== "number" || !Number.isSafeInteger(i) || i < 0 || i >= n)
423
+ bfail("INVALID_PLAN", `plan.groups[${s}]: index ${String(i)} out of range [0,${n})`);
424
+ if (seen.has(i))
425
+ bfail("INVALID_PLAN", `plan: body index ${i} appears in more than one stage`);
426
+ seen.add(i);
427
+ stageOf[i] = s;
428
+ }
429
+ });
430
+ if (seen.size !== n)
431
+ bfail("INVALID_PLAN", `plan does not cover all ${n} body nodes (covered ${seen.size})`);
432
+ const idToIndex = new Map(body.map((node, i) => [node.id, i]));
433
+ body.forEach((node, i) => {
434
+ for (const d of depsByIndex[i]) {
435
+ const di = idToIndex.get(d);
436
+ if (stageOf[di] >= stageOf[i])
437
+ bfail("INVALID_PLAN", `plan: node '${node.id}' (stage ${stageOf[i]}) depends on '${d}' (stage ${stageOf[di]}) — dependencies must be staged earlier`);
438
+ }
439
+ });
440
+ return { groups: groups.map((stage) => [...stage]), concurrency };
441
+ }
442
+ // ── core(recorder 経路と共有される単一実装 — B-3)────────────────────────────────────
443
+ /**
444
+ * buildComponentCore — 検証・plan 導出・正規化・Guard の単一実装。
445
+ * `buildComponentDefinition`(データ登録 IF、catalog 必須)と `compileBehaviors`
446
+ * (recorder 経路 — catalog port 照合は record 時に共有関数で済ませているため
447
+ * `catalog` なし)の両方がこの core を通る。
448
+ */
449
+ export function buildComponentCore(data, opts) {
450
+ if (!isPlainObject(data))
451
+ bfail("INVALID_DEFINITION", "component definition must be a plain object");
452
+ const rec = data;
453
+ checkAllowedKeys(rec, DEFINITION_KEYS, "INVALID_DEFINITION", "definition");
454
+ if (typeof rec.name !== "string" || rec.name === "")
455
+ bfail("INVALID_DEFINITION", "component 'name' must be a non-empty string");
456
+ const name = rec.name;
457
+ if (rec.output === undefined)
458
+ bfail("INVALID_DEFINITION", `component '${name}': 'output' is required (use null for no output)`);
459
+ // inputPorts(省略時 {}。PortSchema を既知キーだけで正規化コピー)。
460
+ const inputPorts = {};
461
+ if (rec.inputPorts !== undefined) {
462
+ if (!isPlainObject(rec.inputPorts))
463
+ bfail("INVALID_DEFINITION", `component '${name}': 'inputPorts' must be an object`);
464
+ for (const [k, s] of Object.entries(rec.inputPorts)) {
465
+ if (k === FORBIDDEN_OBJECT_KEY)
466
+ bfail("INVALID_DEFINITION", `component '${name}': input port name "${FORBIDDEN_OBJECT_KEY}" is forbidden (fail-closed)`);
467
+ if (!isPlainObject(s))
468
+ bfail("INVALID_DEFINITION", `component '${name}': inputPorts['${k}'] must be an object`);
469
+ checkAllowedKeys(s, SCHEMA_KEYS, "INVALID_DEFINITION", `component '${name}': inputPorts['${k}']`);
470
+ if (typeof s.type !== "string")
471
+ bfail("INVALID_DEFINITION", `component '${name}': inputPorts['${k}'].type must be a string`);
472
+ if (s.required !== undefined && typeof s.required !== "boolean")
473
+ bfail("INVALID_DEFINITION", `component '${name}': inputPorts['${k}'].required must be a boolean`);
474
+ inputPorts[k] = s.required !== undefined ? { type: s.type, required: s.required } : { type: s.type };
475
+ }
476
+ }
477
+ // body — pass 1: id の一意性と scope 衝突(runBehavior の flat scope は input と node 結果を
478
+ // 同居させるため、id と input port 名の衝突は黙った shadowing になる — fail-closed で拒否)。
479
+ if (!Array.isArray(rec.body))
480
+ bfail("INVALID_DEFINITION", `component '${name}': 'body' must be an array`);
481
+ const ids = new Set();
482
+ rec.body.forEach((raw, i) => {
483
+ if (!isPlainObject(raw))
484
+ bfail("INVALID_NODE", `body[${i}]: node must be a plain object`);
485
+ const id = checkScopeKeyName(raw.id, "node 'id'", `body[${i}]`);
486
+ if (ids.has(id))
487
+ bfail("DUPLICATE_NODE_ID", `body[${i}]: duplicate node id '${id}'`);
488
+ if (Object.hasOwn(inputPorts, id))
489
+ bfail("INVALID_NODE", `body[${i}]: node id '${id}' collides with an input port name (the runBehavior scope would be ambiguous)`);
490
+ ids.add(id);
491
+ });
492
+ // body — pass 2: ノード構造の正規化コピー。
493
+ const body = rec.body.map((raw, i) => normalizeNode(raw, ids, `body[${i}]`));
494
+ // catalog 照合(データ登録経路。recorder 経路は record 時に同じ共有関数で照合済み)。
495
+ if (opts.catalog !== undefined) {
496
+ const catalog = opts.catalog;
497
+ body.forEach((n, i) => {
498
+ const cname = "map" in n ? n.map.component : "cond" in n ? null : n.component;
499
+ if (cname === null)
500
+ return;
501
+ const ports = "map" in n ? n.map.ports : n.ports;
502
+ if (!Object.hasOwn(catalog, cname))
503
+ bfail("UNKNOWN_COMPONENT", `body[${i}]: component '${cname}' is not in the catalog (fail-closed)`);
504
+ const entry = catalog[cname];
505
+ checkPortableEntry(cname, entry, bfail);
506
+ checkPortNames(cname, entry, Object.keys(ports), bfail);
507
+ checkDeclaredPortTypes(cname, entry, ports, bfail);
508
+ });
509
+ }
510
+ // 参照 root の実在検証 + 依存収集(ports/over/when/cond/output の全式位置)。
511
+ const inputs = new Set(Object.keys(inputPorts));
512
+ const depsByIndex = body.map((n, i) => nodeRefsAndDeps(n, ids, inputs, `body[${i}]`));
513
+ walkRefs(rec.output, null, { ids, inputs, addDep: () => { } }, "output");
514
+ // plan: 供給値を検証 / 省略時は依存から導出 / null は plan なし。
515
+ let plan;
516
+ if (rec.plan === null)
517
+ plan = undefined;
518
+ else if (rec.plan === undefined)
519
+ plan = derivePlanFromDeps(body, depsByIndex, opts.concurrency);
520
+ else
521
+ plan = validateSuppliedPlan(rec.plan, body, depsByIndex);
522
+ // 決定的正規化(全 object キーを code-point 順に再構築)→ Guard 自己検査。
523
+ const assembled = { name, inputPorts, body, output: rec.output };
524
+ if (plan !== undefined)
525
+ assembled.plan = plan;
526
+ const component = canonicalizeDeep(assembled);
527
+ assertPortableComponentGraph({ irVersion: 1, exprVersion: SPEC_VERSIONS.expression, components: [component] });
528
+ return component;
529
+ }
530
+ // ── データ登録 IF(B-1)──────────────────────────────────────────────────────────────
531
+ /**
532
+ * buildComponentDefinition — 事前合成されたグラフ**データ**を受け取り、検証済み・正準化
533
+ * 済みの `Component`(`components[]` エントリ)を返す(bc#26 のデータ登録 IF)。
534
+ *
535
+ * evaluation-mode recorder(`compileBehaviors`)とは独立: source scan は適用されず、
536
+ * 抽出ロジック(model → グラフ導出)は consumer 側に残る。検証・正規化の規則は
537
+ * モジュール docstring(B-2)を参照。
538
+ *
539
+ * ```ts
540
+ * const component = buildComponentDefinition(
541
+ * {
542
+ * name: "ArticleWithTagsRead__get",
543
+ * inputPorts: { articleId: { type: "string", required: true } },
544
+ * body: [
545
+ * { id: "root", component: "GetItem",
546
+ * ports: { table: "T", PK: { concat: ["ARTICLE#", { ref: ["articleId"] }] }, SK: "META" } },
547
+ * { id: "tags.items",
548
+ * map: { over: { ref: ["root", "tagRefs"] }, as: "$tagId", component: "BatchGetItem",
549
+ * ports: { table: "T", PK: { concat: ["TAG#", { ref: ["$tagId", "tagId"] }] } },
550
+ * parent: "root", relationKind: "connection", batched: true } },
551
+ * ],
552
+ * output: { obj: { root: { ref: ["root"] }, tags: { ref: ["tags.items"] } } },
553
+ * plan: { groups: [[0], [1]], concurrency: 16 },
554
+ * },
555
+ * { catalog },
556
+ * );
557
+ * // 実行: runBehavior({ irVersion: 1, exprVersion: SPEC_VERSIONS.expression,
558
+ * // components: [component] }, handlers, input)
559
+ * ```
560
+ *
561
+ * @throws {BuilderFailure} 検証違反(コードは {@link BuilderFailureCode})。
562
+ * @throws {PortabilityError} Guard 自己検査(`assertPortableComponentGraph`)の違反。
563
+ */
564
+ export function buildComponentDefinition(data, options) {
565
+ if (!isPlainObject(options) || !isPlainObject(options.catalog))
566
+ bfail("INVALID_DEFINITION", "buildComponentDefinition requires options.catalog (fail-closed: component references cannot be validated without a catalog)");
567
+ if (options.concurrency !== undefined && (!Number.isSafeInteger(options.concurrency) || options.concurrency < 1))
568
+ bfail("INVALID_DEFINITION", "options.concurrency must be a positive integer");
569
+ return buildComponentCore(data, {
570
+ catalog: options.catalog,
571
+ concurrency: options.concurrency ?? DEFAULT_PLAN_CONCURRENCY,
572
+ });
573
+ }
574
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@
16
16
  * canonical-serialization.md §4.1 の CPython format_float_short('r') を移植する。
17
17
  */
18
18
  import type { Value } from "./expr-eval.js";
19
- export type CanonicalFailureCode = "NAN_OR_INF" | "INVALID_VALUE";
19
+ export type CanonicalFailureCode = "NAN_OR_INF" | "INVALID_VALUE" | "FORBIDDEN_KEY";
20
20
  export declare class CanonicalFailure extends Error {
21
21
  code: CanonicalFailureCode;
22
22
  constructor(code: CanonicalFailureCode, message: string);
@@ -1 +1 @@
1
- {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAI5C,MAAM,MAAM,oBAAoB,GAC5B,YAAY,GACZ,eAAe,CAAC;AAEpB,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,IAAI,EAAE,oBAAoB,CAAC;gBACf,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM;CAKxD;AAOD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAmB7C;AA+ED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAO/C;AAGD,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAQ9C"}
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAI5C,MAAM,MAAM,oBAAoB,GAC5B,YAAY,GACZ,eAAe,GACf,eAAe,CAAC;AAEpB,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,IAAI,EAAE,oBAAoB,CAAC;gBACf,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM;CAKxD;AAOD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAmB7C;AA+ED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAQ/C;AAGD,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAS9C"}