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,373 @@
1
+ /**
2
+ * behavior.ts — component-graph IR schema + `runBehavior` unified execution IF (COMMON).
3
+ *
4
+ * scp-ir-architecture.md §5–§7 の規範実装。P0-1/P0-2/P0-3 の behavior-contracts 側。
5
+ *
6
+ * 「振る舞い=Behavior をコンポーネントとして契約化し、Port と Wire で合成する」SCP の
7
+ * 可搬 IR は **component-graph**(`components[]{ name, inputPorts, body[], output, plan }`)で
8
+ * 表現される。`body` ノード種は:
9
+ * - `componentRef` — catalog 名(文字列参照のみ)+ port 式(Expression IR)
10
+ * - `map` — 配列 Port 反復(`over`/`as`/component/ports、v2: `when`/`into`/`batched`)
11
+ * - `cond` — Conditional(`if`/`then`/`else`、純 Expression。handler を呼ばない)
12
+ *
13
+ * 実行機構(§7.2)は既存 COMMON をそのまま使う:
14
+ * - SCP汎用層(合成・plan)= runPlan(stage 実行・Skip 伝播・Policy Kind)+ evaluateExpression。
15
+ * - 専用コンポーネント実行 = runPlan の `exec` seam を、catalog名 → handlers[name] で解決して呼ぶ
16
+ * (汎用層=COMMON、専用コンポーネント=CONSUMER, runtime-boundary.md の分類に一致)。
17
+ *
18
+ * handler は境界注入(`IR + {effects,config,hooks}` 不変則, concept.md §4.4)。IR には catalog
19
+ * 参照名+Port配線だけが載り、実装(副作用・SDK)は載らない(C4)。
20
+ */
21
+ import { evaluate as evaluateExpression } from "./expr-eval.js";
22
+ import { runPlan, runPlanAsync, } from "./plan.js";
23
+ export class BehaviorFailure extends Error {
24
+ code;
25
+ constructor(code, message) {
26
+ super(message);
27
+ this.code = code;
28
+ this.name = "BehaviorFailure";
29
+ }
30
+ }
31
+ function bfail(code, message) {
32
+ throw new BehaviorFailure(code, message);
33
+ }
34
+ // ── ノード種判定 ─────────────────────────────────────────────────────────────────
35
+ function nodeKind(n) {
36
+ if ("map" in n)
37
+ return "map";
38
+ if ("cond" in n)
39
+ return "cond";
40
+ if ("component" in n)
41
+ return "componentRef";
42
+ bfail("UNKNOWN_NODE_KIND", `body node '${n.id ?? "?"}' is not componentRef/map/cond`);
43
+ }
44
+ /** body ノードの依存親 id(Wire)を取り出す(root は undefined)。 */
45
+ function nodeParent(n) {
46
+ if ("map" in n)
47
+ return n.map.parent;
48
+ if ("cond" in n)
49
+ return n.cond.parent;
50
+ return n.parent;
51
+ }
52
+ /** componentRef の bindField(null-binding skip のキー)。map/cond は持たない。 */
53
+ function nodeBindField(n) {
54
+ if ("map" in n || "cond" in n)
55
+ return undefined;
56
+ return n.bindField;
57
+ }
58
+ function nodePolicy(n) {
59
+ if ("map" in n)
60
+ return n.map.policy;
61
+ if ("cond" in n)
62
+ return undefined;
63
+ return n.policy;
64
+ }
65
+ function nodeRelationKind(n) {
66
+ if ("map" in n)
67
+ return n.map.relationKind;
68
+ if ("cond" in n)
69
+ return undefined;
70
+ return n.relationKind;
71
+ }
72
+ /**
73
+ * ports オブジェクトの各値を Expression IR として評価する(key はソートせず宣言順のまま)。
74
+ * FORBIDDEN_KEY 等の失敗は evaluateExpression が投げる(fail-closed)。
75
+ */
76
+ function evalPorts(ports, scope) {
77
+ const out = {};
78
+ for (const k of Object.keys(ports))
79
+ out[k] = evaluateExpression(ports[k], scope);
80
+ return out;
81
+ }
82
+ /** entry 解決(runBehavior / runBehaviorAsync 共有)。 */
83
+ function resolveEntry(ir, entry) {
84
+ const comp = entry
85
+ ? ir.components.find((c) => c.name === entry)
86
+ : ir.components[0];
87
+ if (!comp)
88
+ bfail("UNKNOWN_ENTRY", `component '${entry ?? "<first>"}' not found in IR`);
89
+ return comp;
90
+ }
91
+ /** body ノード → OpSpec(runPlan の staging に載せる)。parent は id → index に解決。 */
92
+ function buildOps(body, idToIndex) {
93
+ return body.map((n) => {
94
+ const pid = nodeParent(n);
95
+ const parent = pid !== undefined ? idToIndex.get(pid) ?? null : null;
96
+ const spec = { id: n.id, parent };
97
+ const bf = nodeBindField(n);
98
+ if (bf !== undefined)
99
+ spec.bindField = bf;
100
+ const rk = nodeRelationKind(n);
101
+ if (rk !== undefined)
102
+ spec.relationKind = rk;
103
+ const pol = nodePolicy(n);
104
+ if (pol !== undefined)
105
+ spec.policy = pol;
106
+ return spec;
107
+ });
108
+ }
109
+ /** map.batched の整列契約検査(violation は MAP_BATCH_RESULT_MISMATCH で fail-closed)。 */
110
+ function checkBatchAligned(opId, r, want) {
111
+ if (!Array.isArray(r) || r.length !== want)
112
+ bfail("MAP_BATCH_RESULT_MISMATCH", `map '${opId}': batched handler must return a list aligned to items (want ${want}, got ${Array.isArray(r) ? r.length : typeof r})`);
113
+ return r;
114
+ }
115
+ /**
116
+ * map.into(v2): over と同じ長さ・順序の augment 済みリストを組む(親 results は不変)。
117
+ * guard 通過要素は shallow copy + `into` キー、skip 要素は無変更で pass through。
118
+ */
119
+ function applyInto(opId, into, over, keptIdx, collected) {
120
+ const augmented = [];
121
+ let k = 0;
122
+ for (let i = 0; i < over.length; i++) {
123
+ const el = over[i];
124
+ if (k < keptIdx.length && keptIdx[k] === i) {
125
+ if (el === null || typeof el !== "object" || Array.isArray(el))
126
+ bfail("MAP_INTO_ELEMENT_NOT_OBJECT", `map '${opId}': 'into' requires object elements (element ${i} is not an object)`);
127
+ augmented.push({ ...el, [into]: collected[k] });
128
+ k++;
129
+ }
130
+ else {
131
+ augmented.push(el);
132
+ }
133
+ }
134
+ return augmented;
135
+ }
136
+ /** Skip されたノードの未生成表現を results に書き戻す(output の ref が読めるように)。 */
137
+ function writeUnproduced(states, ops, body, results) {
138
+ states.forEach((s, i) => {
139
+ if (s.status === "skipped") {
140
+ results[ops[i].id] =
141
+ nodeRelationKind(body[i]) === "connection" ? { items: [], cursor: null } : null;
142
+ }
143
+ });
144
+ }
145
+ /**
146
+ * runBehavior — component-graph IR の統合実行 IF(§7)。
147
+ *
148
+ * @param ir component-graph 可搬 IR。
149
+ * @param handlers 専用コンポーネント handler registry(catalog名 → 実装。境界注入)。
150
+ * @param input エントリ component の inputPorts 束縛(param 値)。
151
+ * @param entry 実行する component 名(省略時は先頭 component)。
152
+ * @returns `output` を評価した最終 Value(Φ 合流)。
153
+ *
154
+ * 責務(P0-3): ①plan の stage 実行(runPlan)、②各 componentRef の port 式を
155
+ * evaluateExpression で評価、③catalog名→handlers[name] を解決し exec 委譲、④map/cond/Skip 伝播。
156
+ *
157
+ * 同期 handler seam のため stage 内は逐次実行(execution-plan.md §4.1 の conforming
158
+ * fallback)。stage 内 bounded 並列が必要な consumer は {@link runBehaviorAsync} を使う
159
+ * (観測結果は本関数と byte 一致 — 本関数が規範実装)。
160
+ */
161
+ export function runBehavior(ir, handlers, input = {}, entry) {
162
+ const comp = resolveEntry(ir, entry);
163
+ const body = comp.body;
164
+ const idToIndex = new Map();
165
+ body.forEach((n, i) => idToIndex.set(n.id, i));
166
+ const ops = buildOps(body, idToIndex);
167
+ // 各 op 実行時に参照するスコープ: input params + それまでに ok になった node 結果(id → Value)。
168
+ const results = {};
169
+ const baseScope = () => ({ ...input, ...results });
170
+ const exec = (op) => {
171
+ const idx = idToIndex.get(op.id);
172
+ const node = body[idx];
173
+ const kind = nodeKind(node);
174
+ if (kind === "cond") {
175
+ // Conditional は純 Expression。cond 演算子([if,then,else])へ lower して評価。
176
+ const c = node.cond;
177
+ const value = evaluateExpression({ cond: [c.if, c.then, c.else] }, baseScope());
178
+ return { ok: value };
179
+ }
180
+ if (kind === "map") {
181
+ const m = node.map;
182
+ const over = evaluateExpression(m.over, baseScope());
183
+ if (!Array.isArray(over))
184
+ bfail("MAP_OVER_NOT_ARRAY", `map '${op.id}': 'over' did not evaluate to an array`);
185
+ const handler = handlers[m.component];
186
+ if (!handler)
187
+ bfail("UNKNOWN_COMPONENT", `component '${m.component}' has no handler (fail-closed)`);
188
+ const ctx = { nodeId: op.id, component: m.component };
189
+ // per-element guard(v2): `{cond:[when,true,false]}` へ lower(strict-bool、fail-closed)。
190
+ const keep = (el, scope) => m.when === undefined ||
191
+ evaluateExpression({ cond: [m.when, true, false] }, scope) === true;
192
+ const keptIdx = []; // over 内で guard を通過した要素 index(into の整列用)
193
+ let collected;
194
+ if (m.batched === true) {
195
+ // batched(v2): guard 通過全要素の ports を先に評価し、handler を 1 回だけ呼ぶ。
196
+ const items = [];
197
+ over.forEach((el, i) => {
198
+ const scope = { ...baseScope(), [m.as]: el };
199
+ if (!keep(el, scope))
200
+ return;
201
+ items.push(evalPorts(m.ports, scope));
202
+ keptIdx.push(i);
203
+ });
204
+ if (items.length === 0) {
205
+ collected = []; // guard 全落ち: handler は呼ばれない(空バッチを発行しない)
206
+ }
207
+ else {
208
+ const outcome = handler({ items }, ctx);
209
+ if ("error" in outcome)
210
+ return outcome; // policy Kind は runPlan が解釈
211
+ collected = checkBatchAligned(op.id, outcome.ok, items.length);
212
+ }
213
+ }
214
+ else {
215
+ collected = [];
216
+ for (let i = 0; i < over.length; i++) {
217
+ const el = over[i];
218
+ const scope = { ...baseScope(), [m.as]: el };
219
+ if (!keep(el, scope))
220
+ continue;
221
+ const ports = evalPorts(m.ports, scope);
222
+ const outcome = handler(ports, { ...ctx, bound: el });
223
+ if ("error" in outcome)
224
+ return outcome; // policy Kind は runPlan が解釈
225
+ collected.push(outcome.ok);
226
+ keptIdx.push(i);
227
+ }
228
+ }
229
+ if (m.into === undefined)
230
+ return { ok: collected };
231
+ return { ok: applyInto(op.id, m.into, over, keptIdx, collected) };
232
+ }
233
+ // componentRef
234
+ const cr = node;
235
+ const handler = handlers[cr.component];
236
+ if (!handler)
237
+ bfail("UNKNOWN_COMPONENT", `component '${cr.component}' has no handler (fail-closed)`);
238
+ const ports = evalPorts(cr.ports, baseScope());
239
+ return handler(ports, { nodeId: op.id, component: cr.component });
240
+ };
241
+ // runPlan は stage 実行・Skip 伝播・Policy Kind を担う。exec 内で results を蓄積する必要が
242
+ // あるため、成功結果を runPlan の外側(results)へも写す薄いラッパで包む。
243
+ const wrappedExec = (op, bound) => {
244
+ const outcome = exec(op, bound);
245
+ if ("ok" in outcome)
246
+ results[op.id] = outcome.ok;
247
+ return outcome;
248
+ };
249
+ const plan = comp.plan ?? null;
250
+ const run = runPlan(plan, ops, wrappedExec);
251
+ // Skip されたノードは未生成表現を results に載せる(output の ref が読めるように)。
252
+ writeUnproduced(run.states, ops, body, results);
253
+ // output(Φ 合流)を Expression IR として評価。
254
+ return evaluateExpression(comp.output, baseScope());
255
+ }
256
+ /**
257
+ * runBehaviorAsync — runBehavior の非同期版(bc#23)。handler が Promise を返せる。
258
+ *
259
+ * plan の stage 実行を {@link runPlanAsync} に委譲することで、同一 stage 内の兄弟ノードを
260
+ * `plan.concurrency` を上限とした bounded 並列で実行する(旧 graphddb の sibling relation
261
+ * query thread-overlap の回復)。map ノード**内部**の要素反復は宣言どおり逐次
262
+ * (stage 間/stage 内の並列単位は body ノード — §7)。
263
+ *
264
+ * 観測等価: 結果・Skip/Policy 伝播・Failure(code/message)は {@link runBehavior} と
265
+ * 完全一致(runBehavior が規範実装。等価性は conformance vectors の両経路 PASS で担保)。
266
+ * 相違は投機的 dispatch のみ(runPlanAsync の決定的 commit プロトコル参照)。
267
+ *
268
+ * 並行呼び出し契約: `concurrency > 1` の plan を持つ component では、同一 stage 内の
269
+ * 兄弟ノードの handler が並行に呼ばれ得る。並行呼び出しを許容しない consumer は
270
+ * `concurrency: 1` の plan を出荷する(concurrency は plan 構造の一部 — execution-plan.md §3)。
271
+ */
272
+ export async function runBehaviorAsync(ir, handlers, input = {}, entry) {
273
+ const comp = resolveEntry(ir, entry);
274
+ const body = comp.body;
275
+ const idToIndex = new Map();
276
+ body.forEach((n, i) => idToIndex.set(n.id, i));
277
+ const ops = buildOps(body, idToIndex);
278
+ // 各 op 実行時に参照するスコープ: input params + それまでに ok になった node 結果(id → Value)。
279
+ // 並列 stage の兄弟同士は互いの結果を参照しない(§1: stage 内は相互独立)ので、
280
+ // dispatch 時点のスナップショットは前 stage までの確定結果と一致する。
281
+ const results = {};
282
+ const baseScope = () => ({ ...input, ...results });
283
+ // 以降の各分岐は runBehavior(規範実装)の同期 exec と**鏡映**であること。
284
+ // 相違は handler 呼び出しの await のみ(等価性は plan-async.test.ts が全 behavior
285
+ // vectors の両経路比較で強制する)。
286
+ const exec = async (op) => {
287
+ const idx = idToIndex.get(op.id);
288
+ const node = body[idx];
289
+ const kind = nodeKind(node);
290
+ if (kind === "cond") {
291
+ // Conditional は純 Expression。cond 演算子([if,then,else])へ lower して評価。
292
+ const c = node.cond;
293
+ const value = evaluateExpression({ cond: [c.if, c.then, c.else] }, baseScope());
294
+ return { ok: value };
295
+ }
296
+ if (kind === "map") {
297
+ const m = node.map;
298
+ const over = evaluateExpression(m.over, baseScope());
299
+ if (!Array.isArray(over))
300
+ bfail("MAP_OVER_NOT_ARRAY", `map '${op.id}': 'over' did not evaluate to an array`);
301
+ const handler = handlers[m.component];
302
+ if (!handler)
303
+ bfail("UNKNOWN_COMPONENT", `component '${m.component}' has no handler (fail-closed)`);
304
+ const ctx = { nodeId: op.id, component: m.component };
305
+ // per-element guard(v2): `{cond:[when,true,false]}` へ lower(strict-bool、fail-closed)。
306
+ const keep = (el, scope) => m.when === undefined ||
307
+ evaluateExpression({ cond: [m.when, true, false] }, scope) === true;
308
+ const keptIdx = []; // over 内で guard を通過した要素 index(into の整列用)
309
+ let collected;
310
+ if (m.batched === true) {
311
+ // batched(v2): guard 通過全要素の ports を先に評価し、handler を 1 回だけ呼ぶ。
312
+ const items = [];
313
+ over.forEach((el, i) => {
314
+ const scope = { ...baseScope(), [m.as]: el };
315
+ if (!keep(el, scope))
316
+ return;
317
+ items.push(evalPorts(m.ports, scope));
318
+ keptIdx.push(i);
319
+ });
320
+ if (items.length === 0) {
321
+ collected = []; // guard 全落ち: handler は呼ばれない(空バッチを発行しない)
322
+ }
323
+ else {
324
+ const outcome = await handler({ items }, ctx);
325
+ if ("error" in outcome)
326
+ return outcome; // policy Kind は runPlanAsync が解釈
327
+ collected = checkBatchAligned(op.id, outcome.ok, items.length);
328
+ }
329
+ }
330
+ else {
331
+ collected = [];
332
+ for (let i = 0; i < over.length; i++) {
333
+ const el = over[i];
334
+ const scope = { ...baseScope(), [m.as]: el };
335
+ if (!keep(el, scope))
336
+ continue;
337
+ const ports = evalPorts(m.ports, scope);
338
+ const outcome = await handler(ports, { ...ctx, bound: el });
339
+ if ("error" in outcome)
340
+ return outcome; // policy Kind は runPlanAsync が解釈
341
+ collected.push(outcome.ok);
342
+ keptIdx.push(i);
343
+ }
344
+ }
345
+ if (m.into === undefined)
346
+ return { ok: collected };
347
+ return { ok: applyInto(op.id, m.into, over, keptIdx, collected) };
348
+ }
349
+ // componentRef
350
+ const cr = node;
351
+ const handler = handlers[cr.component];
352
+ if (!handler)
353
+ bfail("UNKNOWN_COMPONENT", `component '${cr.component}' has no handler (fail-closed)`);
354
+ const ports = evalPorts(cr.ports, baseScope());
355
+ return handler(ports, { nodeId: op.id, component: cr.component });
356
+ };
357
+ // 成功結果を results へ写す薄いラッパ(runBehavior と同形)。並列 stage では兄弟の
358
+ // 書き込みが宣言順と異なる wall-clock 順で起き得るが、書き込み先は disjoint スロット
359
+ // (自ノード id)であり、兄弟は互いのスロットを読まない(§1)ため結果は決定的。
360
+ const wrappedExec = async (op, bound) => {
361
+ const outcome = await exec(op, bound);
362
+ if ("ok" in outcome)
363
+ results[op.id] = outcome.ok;
364
+ return outcome;
365
+ };
366
+ const plan = comp.plan ?? null;
367
+ const run = await runPlanAsync(plan, ops, wrappedExec);
368
+ // Skip されたノードは未生成表現を results に載せる(output の ref が読めるように)。
369
+ writeUnproduced(run.states, ops, body, results);
370
+ // output(Φ 合流)を Expression IR として評価。
371
+ return evaluateExpression(comp.output, baseScope());
372
+ }
373
+ //# sourceMappingURL=behavior.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavior.js","sourceRoot":"","sources":["../src/behavior.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * builder.ts — programmatic component-definition builder(合成グラフの「データ登録」IF,
3
+ * bc#26)+ recorder 経路(`compileBehaviors`)と共有する検証・正規化 core。
4
+ *
5
+ * ## 責務分離(オーナー決定 — bc#26 / graphddb#297 SP5)
6
+ *
7
+ * model 由来 lowering(@model メタデータ → relation DAG 展開)は bc#24 の evaluation-mode
8
+ * recorder に乗らないことが実証された(node-id が意味論を持つ load-bearing 構造 /
9
+ * relationKind・bindField 非 emit / 動的 port 群が fail-closed schema と衝突 / compile
10
+ * エントリが class-source-scan gate)。そこで:
11
+ *
12
+ * - **抽出ロジック(model → 合成グラフの導出)は consumer(graphddb / litedbmodel / …)が
13
+ * 保持**する。builder は closure を受け取らない(source scan も recorder も非適用)。
14
+ * - **IR の形・検証・正規化の所有権は bc(C1)**: consumer は事前合成されたグラフを
15
+ * **データとして登録**し({@link buildComponentDefinition})、検証済み・正準化済みの
16
+ * `Component`(`components[]` エントリ)を受け取る。
17
+ *
18
+ * ## 受け入れるデータ(B-1)
19
+ *
20
+ * - 呼び出し側指定の **node id**(任意文字列 — consumer が意味論を持たせてよい。例:
21
+ * graphddb の resultPath 由来 `"root"` / `"groups.items.group.permissions.items"`)。
22
+ * - body ノード種 `componentRef`(`parent` / `bindField` / `relationKind` / `policy` 込み)/
23
+ * `map`(v2 語彙 `when` / `into` / `batched` 込み)/ `cond`。
24
+ * - **動的 port 群**(`item.<field>` / `key.<attr>` / `changes.<field>` /
25
+ * `condition.equals.<field>` 等の flatten キー): catalog エントリの
26
+ * {@link CatalogEntry.additionalPorts} `: true`(opt-in)で受容する。既定は fail-closed
27
+ * (未宣言 port は `UNKNOWN_PORT`)。**宣言済み port は additionalPorts に関わらず検査**
28
+ * される(required / スカラリテラル型)。
29
+ * - `inputPorts` / `output` / `plan`(省略時は依存から導出。`plan: null` は「plan なし」=
30
+ * runBehavior の逐次 fallback — graphddb transaction 形)。
31
+ *
32
+ * ## 検証・正規化(B-2)
33
+ *
34
+ * 1. **構造検証**: ノード種・許可キー集合(未知キーは fail-closed)・id 一意性・
35
+ * id と input port 名の衝突禁止(runBehavior の flat scope が曖昧になる)・parent 実在・
36
+ * 依存の非循環・**参照 root の実在**(`{ref:[root,…]}` の root は body ノード id /
37
+ * 宣言 input port / その map 自身の `as` 束縛のみ — fail-closed `UNKNOWN_REF`)。
38
+ * 2. **catalog 照合**: エントリ実在・`portableToIR`・未宣言 port(additionalPorts
39
+ * ポリシー)・required port・宣言 port のスカラリテラル型検査。
40
+ * 3. **plan**: 省略時は依存から導出(recorder 経路と同一の Kahn levels)。指定時は
41
+ * 被覆(各 index がちょうど 1 stage)と依存順序(dep の stage < node の stage)を検証。
42
+ * 4. **決定的正規化**: 全 object キーを code-point 順にソートして再構築(配列順序は保持)。
43
+ * **構造的に同じ入力データ(キー挿入順が違っても)→ byte 同一の出力**(consumer の
44
+ * golden 規律を壊さない)。入力データは変異しない。
45
+ * 5. `assertPortableComponentGraph` を内部適用(fail-closed の自己検査、P0-2 Guard)。
46
+ *
47
+ * ## recorder 経路との単一実装(B-3)
48
+ *
49
+ * `compileBehaviors` は lowering の末尾(Component 組み立て・plan 導出・正規化・Guard)を
50
+ * {@link buildComponentCore} に委譲し、catalog port 照合は record 時に
51
+ * {@link checkPortableEntry} / {@link checkPortNames} / {@link checkDeclaredPortTypes} を
52
+ * 共有する。2 経路(recorder / データ登録)は同じ検証・正規化を通る。
53
+ */
54
+ import type { BodyNode, Catalog, CatalogEntry, Component, PortSchema } from "./behavior.js";
55
+ import type { ExecutionPlanSpec } from "./plan.js";
56
+ export type BuilderFailureCode = "INVALID_DEFINITION" | "INVALID_NODE" | "DUPLICATE_NODE_ID" | "UNKNOWN_PARENT" | "DEPENDENCY_CYCLE" | "UNKNOWN_COMPONENT" | "NOT_PORTABLE_COMPONENT" | "UNKNOWN_PORT" | "MISSING_PORT" | "PORT_TYPE_MISMATCH" | "UNKNOWN_REF" | "INVALID_PLAN";
57
+ export declare class BuilderFailure extends Error {
58
+ code: BuilderFailureCode;
59
+ constructor(code: BuilderFailureCode, message: string);
60
+ }
61
+ /** 共有 port 照合が投げる失敗コード(AuthoringFailureCode / BuilderFailureCode の共通部分)。 */
62
+ export type PortCheckFailCode = "NOT_PORTABLE_COMPONENT" | "UNKNOWN_PORT" | "MISSING_PORT" | "PORT_TYPE_MISMATCH";
63
+ export type PortCheckFail = (code: PortCheckFailCode, message: string) => never;
64
+ /** `portableToIR: false` のエントリは可搬 IR に載せられない(両経路共通の先頭検査)。 */
65
+ export declare function checkPortableEntry(name: string, entry: CatalogEntry, fail: PortCheckFail): void;
66
+ /**
67
+ * port 名の catalog 照合(両経路共通):
68
+ * - 未宣言 port はエントリが `additionalPorts: true` を宣言しない限り fail-closed で拒否
69
+ * (動的 port 群 — `item.<field>` 等 — を持つ write 系エントリだけが opt-in する)。
70
+ * - required 宣言 port の欠落は additionalPorts に関わらず拒否。
71
+ */
72
+ export declare function checkPortNames(name: string, entry: CatalogEntry, portNames: readonly string[], fail: PortCheckFail): void;
73
+ /**
74
+ * 宣言 port のスカラリテラル型検査(両経路共通・additionalPorts に関わらず適用):
75
+ * 宣言型がスカラ(string/number/boolean 系)で、配線値が**静的スカラリテラル**のとき
76
+ * のみ照合する(`{ref}` / `{concat}` 等の式は実行時型のため検査対象外)。
77
+ */
78
+ export declare function checkDeclaredPortTypes(name: string, entry: CatalogEntry, ports: Record<string, unknown>, fail: PortCheckFail): void;
79
+ /**
80
+ * IR ノードを走査し、`ids` に含まれる id を root に持つ ref/refOpt の root を出現順に集める
81
+ * (recorder の Wire 選択・両経路の plan 導出が使う共通プリミティブ)。
82
+ */
83
+ export declare function collectNodeIdRefs(node: unknown, ids: ReadonlySet<string>, out?: string[]): string[];
84
+ export declare const DEFAULT_PLAN_CONCURRENCY = 16;
85
+ /**
86
+ * buildComponentDefinition が受け取る事前合成グラフデータ。フィールドは canonical
87
+ * `Component`(behavior.ts / scp-ir-architecture.md §5)と同形で、`plan` だけ 3 値:
88
+ * - 省略(undefined) → 依存から導出(Kahn levels・`concurrency` オプション)。
89
+ * - `null` → plan なし(runBehavior の逐次 fallback。graphddb transaction 形)。
90
+ * - `ExecutionPlanSpec` → 供給値を検証して使う(graphddb query 形)。
91
+ */
92
+ export interface ComponentDefinitionData {
93
+ name: string;
94
+ /** 省略時は `{}`(Input Port なし)。 */
95
+ inputPorts?: Record<string, PortSchema>;
96
+ body: readonly BodyNode[];
97
+ /** Φ 合流の Expression IR(必須。出力なしは `null` を明示する)。 */
98
+ output: unknown;
99
+ plan?: ExecutionPlanSpec | null;
100
+ }
101
+ export interface BuildComponentDefinitionOptions {
102
+ /**
103
+ * 照合する catalog(必須 — fail-closed: catalog なしに component 参照は検証できない)。
104
+ * 動的 port 群を受けるエントリは `additionalPorts: true` を宣言する。
105
+ */
106
+ catalog: Catalog;
107
+ /** plan 導出時の concurrency(既定 16)。供給 plan には影響しない。 */
108
+ concurrency?: number;
109
+ }
110
+ /**
111
+ * buildComponentCore — 検証・plan 導出・正規化・Guard の単一実装。
112
+ * `buildComponentDefinition`(データ登録 IF、catalog 必須)と `compileBehaviors`
113
+ * (recorder 経路 — catalog port 照合は record 時に共有関数で済ませているため
114
+ * `catalog` なし)の両方がこの core を通る。
115
+ */
116
+ export declare function buildComponentCore(data: ComponentDefinitionData, opts: {
117
+ catalog?: Catalog;
118
+ concurrency: number;
119
+ }): Component;
120
+ /**
121
+ * buildComponentDefinition — 事前合成されたグラフ**データ**を受け取り、検証済み・正準化
122
+ * 済みの `Component`(`components[]` エントリ)を返す(bc#26 のデータ登録 IF)。
123
+ *
124
+ * evaluation-mode recorder(`compileBehaviors`)とは独立: source scan は適用されず、
125
+ * 抽出ロジック(model → グラフ導出)は consumer 側に残る。検証・正規化の規則は
126
+ * モジュール docstring(B-2)を参照。
127
+ *
128
+ * ```ts
129
+ * const component = buildComponentDefinition(
130
+ * {
131
+ * name: "ArticleWithTagsRead__get",
132
+ * inputPorts: { articleId: { type: "string", required: true } },
133
+ * body: [
134
+ * { id: "root", component: "GetItem",
135
+ * ports: { table: "T", PK: { concat: ["ARTICLE#", { ref: ["articleId"] }] }, SK: "META" } },
136
+ * { id: "tags.items",
137
+ * map: { over: { ref: ["root", "tagRefs"] }, as: "$tagId", component: "BatchGetItem",
138
+ * ports: { table: "T", PK: { concat: ["TAG#", { ref: ["$tagId", "tagId"] }] } },
139
+ * parent: "root", relationKind: "connection", batched: true } },
140
+ * ],
141
+ * output: { obj: { root: { ref: ["root"] }, tags: { ref: ["tags.items"] } } },
142
+ * plan: { groups: [[0], [1]], concurrency: 16 },
143
+ * },
144
+ * { catalog },
145
+ * );
146
+ * // 実行: runBehavior({ irVersion: 1, exprVersion: SPEC_VERSIONS.expression,
147
+ * // components: [component] }, handlers, input)
148
+ * ```
149
+ *
150
+ * @throws {BuilderFailure} 検証違反(コードは {@link BuilderFailureCode})。
151
+ * @throws {PortabilityError} Guard 自己検査(`assertPortableComponentGraph`)の違反。
152
+ */
153
+ export declare function buildComponentDefinition(data: ComponentDefinitionData, options: BuildComponentDefinitionOptions): Component;
154
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,OAAO,KAAK,EACV,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,SAAS,EAIT,UAAU,EACX,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAMnD,MAAM,MAAM,kBAAkB,GAC1B,oBAAoB,GACpB,cAAc,GACd,mBAAmB,GACnB,gBAAgB,GAChB,kBAAkB,GAClB,mBAAmB,GACnB,wBAAwB,GACxB,cAAc,GACd,cAAc,GACd,oBAAoB,GACpB,aAAa,GACb,cAAc,CAAC;AAEnB,qBAAa,cAAe,SAAQ,KAAK;IACvC,IAAI,EAAE,kBAAkB,CAAC;gBACb,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM;CAKtD;AAOD,4EAA4E;AAC5E,MAAM,MAAM,iBAAiB,GACzB,wBAAwB,GACxB,cAAc,GACd,cAAc,GACd,oBAAoB,CAAC;AAEzB,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,KAAK,KAAK,CAAC;AAEhF,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAM/F;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,IAAI,EAAE,aAAa,GAClB,IAAI,CAaN;AAwBD;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,IAAI,EAAE,aAAa,GAClB,IAAI,CAYN;AAGD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAgBvG;AAuBD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAiE3C;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC1B,kDAAkD;IAClD,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,+BAA+B;IAC9C;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAuPD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,uBAAuB,EAC7B,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC/C,SAAS,CA2EX;AAGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,uBAAuB,EAC7B,OAAO,EAAE,+BAA+B,GACvC,SAAS,CASX"}