/** * builder.ts — component-graph の検証・正規化・plan 導出の **内部 core**。 * * ## SCP-only 化(0.8.0・#127/A5)— データ登録 IF は撤去済み * * かつて存在した公開「データ登録」IF(`buildComponentDefinition` / `ComponentDefinitionData` / * `BuildComponentDefinitionOptions` / `BuilderFailure`)は **0.8.0 で完全撤去**した * (scp-only-authoring-contract.md §SA6・§7 step 3)。生 IR を手組みして登録する経路(route B)は * フラットな意味グラフを壊す矛盾の根源であり、IR の唯一の正規生産者を compile seam * (`compileBehaviors`)に一本化するための撤去である(§1.2)。**internal 猶予も残さない**(§SA6)。 * * このモジュールが今も所有するのは、その **検証・正規化・plan 導出の共有 core**({@link buildComponentCore} * と周辺ヘルパ)だけで、これは **`compileBehaviors`(authoring.ts)が lowering の末尾で委譲する * internal な実装**である。**公開されるのは何も無い**(builder のシンボルは index.ts から export しない)。 * * ## core が担う検証・正規化(`buildComponentCore` — recorder 経路が委譲) * * 1. **構造検証**: ノード種・許可キー集合(未知キーは fail-closed)・id 一意性・ * id と input port 名の衝突禁止(runBehavior の flat scope が曖昧になる)・parent 実在・ * 依存の非循環・**参照 root の実在**(`{ref:[root,…]}` の root は body ノード id / * 宣言 input port / その map 自身の `as` 束縛のみ — fail-closed `UNKNOWN_REF`)。 * 2. **catalog 照合**は core の担当ではない(record 時に共有関数 {@link checkPortableEntry} / * {@link checkPortNames} が行う。当モジュールはその定義を保持するだけで、core からは呼ばない)。 * port の**型**契約は catalog リテラル照合ではなく型ゲート(`portSchemas` 対 配線値型)が持つ。 * 3. **plan**: 省略時は依存から導出(Kahn levels)。指定時は被覆(各 index がちょうど 1 stage)と * 依存順序(dep の stage < node の stage)を検証。 * 4. **決定的正規化**: 全 object キーを code-point 順にソートして再構築(配列順序は保持)。 * **構造的に同じ入力データ(キー挿入順が違っても)→ byte 同一の出力**(consumer の * golden 規律を壊さない)。入力データは変異しない。 * 5. `assertPortableComponentGraph` を内部適用(fail-closed の自己検査、P0-2 Guard)。 * * ## recorder 経路との単一実装 * * `compileBehaviors` は lowering の末尾(Component 組み立て・plan 導出・正規化・Guard)を * {@link buildComponentCore} に委譲し、catalog port 名照合は record 時に * {@link checkPortableEntry} / {@link checkPortNames} を共有する。これらの内部関数の検証・正規化は `compileBehaviors` 経由で網羅的に行使される。 */ import type { BodyNode, CatalogEntry, Component, PortSchema } from "./behavior.js"; import type { ExecutionPlanSpec } from "./plan.js"; /** 共有 port 照合が投げる失敗コード(AuthoringFailureCode / BuilderFailureCode の共通部分)。 */ export type PortCheckFailCode = "NOT_PORTABLE_COMPONENT" | "UNKNOWN_PORT" | "MISSING_PORT"; export type PortCheckFail = (code: PortCheckFailCode, message: string) => never; /** `portableToIR: false` のエントリは可搬 IR に載せられない(両経路共通の先頭検査)。 */ export declare function checkPortableEntry(name: string, entry: CatalogEntry, fail: PortCheckFail): void; /** * port 名の catalog 照合(両経路共通): * - 未宣言 port は fail-closed で拒否(catalog の Port schema が契約。任意名の動的属性は 1 本の * map 型ポートで表す)。 * - required 宣言 port の欠落は拒否。 */ export declare function checkPortNames(name: string, entry: CatalogEntry, portNames: readonly string[], fail: PortCheckFail): void; /** * IR ノードを走査し、`ids` に含まれる id を root に持つ ref/refOpt の root を出現順に集める * (recorder の Wire 選択・両経路の plan 導出が使う共通プリミティブ)。 */ export declare function collectNodeIdRefs(node: unknown, ids: ReadonlySet, out?: string[]): string[]; export declare const DEFAULT_PLAN_CONCURRENCY = 16; /** * {@link buildComponentCore} が受け取る事前合成グラフデータの形(internal)。フィールドは * canonical `Component`(behavior.ts / scp-ir-architecture.md §5)と同形で、`plan` だけ 3 値: * - 省略(undefined) → 依存から導出(Kahn levels・`concurrency` オプション)。 * - `null` → plan なし(runBehavior の逐次 fallback。graphddb transaction 形)。 * - `ExecutionPlanSpec` → 供給値を検証して使う(graphddb query 形)。 * * かつては公開データ登録 IF(`buildComponentDefinition`)の引数型 `ComponentDefinitionData` だったが、 * その IF もろとも 0.8.0 で撤去した(§SA6)。`compileBehaviors` が core に渡す internal な形として残す。 */ interface ComponentDefinitionData { name: string; /** 省略時は `{}`(Input Port なし)。 */ inputPorts?: Record; body: readonly BodyNode[]; /** Φ 合流の Expression IR(必須。出力なしは `null` を明示する)。 */ output: unknown; plan?: ExecutionPlanSpec | null; } /** * buildComponentCore — 検証・plan 導出・正規化・Guard の単一実装(internal)。 * `compileBehaviors` が lowering の末尾でこの core を通る(唯一の呼び出し口)。catalog の port **名** * 照合は record 時に共有関数({@link checkPortableEntry} / {@link checkPortNames})で済ませてあり、 * port の**型**照合は型ゲートが `portSchemas` に対して行うので、core は catalog を受け取らない。 */ export declare function buildComponentCore(data: ComponentDefinitionData, opts: { concurrency: number; }): Component; export {}; //# sourceMappingURL=builder.d.ts.map