import type { Component, ComponentGraphIR } from "../behavior.js"; /** * IoModel — the codegen I/O-model declaration (bc#97). A codegen INPUT (emitter option / CLI flag), * NEVER in the IR. The SSoT propagation pass `async-plan.ts` consumes it to derive per-node/per-runner * async-ness. * - `"sync"` (default / unset): every terminal handler is sync (neutral floor; pre-#97 byte-identical). * - `"async"`: every terminal handler is async (the increment-1 uniform model). * - `{ asyncComponents }`: PER-TERMINAL-HANDLER granularity — a node is an async terminal iff its * catalog `component` name is listed. The general form; the uniform cases are its all/none degenerates. * (Defined HERE — not in async-plan.ts — so core.ts carries no import cycle: core is imported first by * every emitter; async-plan.ts imports this type back from core.) */ export type IoModel = "sync" | "async" | { readonly asyncComponents: readonly string[]; }; /** * LeafTransportOptions (native codegen) — the op-agnostic leaf TRANSPORT the covered runner calls DIRECTLY * at each covered node's execution point. bc no longer generates a per-node handler trait (the spurious * indirection whose method count grew with the number of authored behaviors); it resolves each covered * leaf (= catalog component) to ONE transport symbol and calls it with the node's port fields spread. The * consumer supplies these symbols (litedbmodel = a single `execute_sql`; graphddb = `get_item` / `query` / * `batch_get_item`), so consumer transport code is a fixed set of ops, not one method per behavior node. * - `symbols` — leaf(=catalog component) name → runtime transport symbol name. A leaf absent from the * table resolves to the in-package DEFAULT convention (rust `leaf_`, go * `Leaf_`). * - `import` — the module specifier the transport symbols live in (added to the covered module's import * block + used to bring the distinct resolved symbols into scope). Omit → in-package / crate-scope * resolution (the covered module emits no `use`/import and the symbols resolve where the module is used). * Other emitters (ts / py / php) ignore it. */ export interface LeafTransportOptions { /** leaf(=catalog component)名 → 直呼びする runtime transport シンボル名の表。 */ symbols: Record; /** transport シンボルの import 元モジュール指定子(未指定=in-package/crate-scope 既定名を使う)。 */ import?: string; } export type GeneratorFailureCode = "INPUT_NOT_PORTABLE_IR" | "UNSUPPORTED_IR_VERSION" | "UNSUPPORTED_EXPR_VERSION" | "EMPTY_IR" | "DUPLICATE_COMPONENT" | "UNKNOWN_LANGUAGE" | "OUTPUT_TYPE_INCONSISTENT" | "NOMINAL_NAME_COLLISION" | "DECLARED_PORT_ORDER_MISMATCH" | "UNSUPPORTED_NODE_STRAIGHTLINE"; export declare class GeneratorFailure extends Error { code: GeneratorFailureCode; constructor(code: GeneratorFailureCode, message: string); } export declare function gfail(code: GeneratorFailureCode, message: string): never; /** 生成時に emitter へ渡される言語中立コンテキスト(検証済み)。 */ export interface EmitContext { /** 検証済み可搬 IR(構造は入力のまま — キー順保存)。 */ ir: ComponentGraphIR; /** source IR の fingerprint(`"fnv1a64:<16hex>"`)。 */ fingerprint: string; /** 生成時 SPEC_VERSIONS のうち実行経路が依存する版(焼き込み対象)。 */ specVersions: { behavior: number; expression: number; plan: number; }; /** IR 内の component 名(宣言順)。 */ componentNames: string[]; /** runtime-core を import するモジュール指定子(emitter の既定を上書き可)。 */ runtimeImport: string; /** #192: 生成エントリの名前空間(宣言クラス名。未指定なら emitter 既定)。 */ namespace?: string; /** * codegen I/O モデル(bc#97): async/await を持つ言語(native=rust; 将来の native python)で、consumer の * terminal handler が async I/O を行う場合の宣言。emitter は per-terminal-node で `async fn` + `.await` * を出力する(await placement は SSoT 伝播 pass `async-plan.ts` が導出)。async/sync は language-runtime * concern であり IR には入らない — これは codegen INPUT(emitter option / CLI flag)。 * - `'sync'`(省略時 default): 全 terminal sync(neutral floor、runtime 不要、pre-#97 と byte-identical)。 * - `'async'`: 全 terminal async(増分1 の uniform モデル。per-node 一般化の全 async な退化形)。 * - `{ asyncComponents }`: **per-terminal-handler granularity** — catalog `component` 名が集合に入る * terminal のみ async。未列挙は sync。1 runner 内で sync+async 混在可(bottom-up 伝播で runner は * iff async terminal を含む時 async)。 * go は await 概念が無く annotation を無視(no-op)。python は native codegen surface が無く対象外。 */ ioModel: IoModel; /** * go-typed-native: BC が生成する共有ワイヤ型パッケージ(Task A cross-package)の import 指定子。設定時は * BC 所有の `WireValue`/`WireRow`/`WireList` をその共有パッケージへ出し、covered/transport 双方がそれを * import して参照する(別パッケージの transport が cycle 無しで返せる)。未指定なら in-package(covered * モジュールが型を定義し無修飾で参照)。他言語 emitter(ts/py/php/rust)は無視。 */ sharedTypesImport?: string; /** * native codegen の op-agnostic leaf transport シンボル表({@link LeafTransportOptions})。covered runner * が各 covered node の実行点で直呼びする。未指定なら in-package 既定名(rust `leaf_` / go * `Leaf_`)。native emitter(rust/go)のみ消費、他(ts/py/php)は無視。 */ leafTransport?: LeafTransportOptions; /** * component 名 → **authored な引数順**の input port 名列(#192 規則 1)。宣言由来メタ * (provenance.ts `DeclarationMeta`)から `generateModule` が写す codegen INPUT で、可搬 IR には * 載らない(引数順だけが違う 2 つの綴りは同じ意味グラフ = 同じ IR / 同じ fingerprint でなければ * ならない)。1:1 の位置引数エントリを出す emitter は {@link entryPortOrder} 経由でこれを読む。 * 宣言を持たない入力(`--in` / 生 IR ベクタ)では未指定 = IR のキー順にフォールバックする。 */ declaredEntryPortOrder?: Readonly>; } /** 宣言由来の引数順表({@link EmitContext.declaredEntryPortOrder})。宣言を持たない入力では `undefined`。 */ export type DeclaredEntryPortOrder = EmitContext["declaredEntryPortOrder"]; /** * entryPortOrder — 生成エントリの**位置引数の順**を決める唯一の規則(#192 規則 1)。宣言された引数順が * あればそれ、無ければ IR の `inputPorts` キー順(canonical = code-point 順)。1:1 エントリを出す全 * emitter(go / rust / python / php とその test-glue デコーダ)が**この 1 関数**を読む — 順序規則を * 言語ごとに書き写さない。 * * 宣言の port 集合と IR の port 集合が食い違ったら**黙って落とさず fail-closed**(宣言と生成物が * 食い違ったまま通るのが、このゲートが塞いでいる欠陥そのもの)。 */ export declare function entryPortOrder(comp: Component, declared: DeclaredEntryPortOrder): string[]; /** * emitter ターゲット分類(consumer-interface.md §0/§1・#128/A6)。BC の実行モデルは根本 2 つ: * - `"ir-exec"` — IR 実行モデル。生成物に**可搬 IR を埋め込み**、ロード時 `loadCompiledIR` で adopt * して BC runtime(`runBehavior`)へ渡し**動的実行**する(literal = ts/python/php のみ)。 * - `"codegen"` — IR を build で**終端**し、IR も dict dispatch も持たない **IR-free** コードを生成、 * leaf を静的シンボルで直呼びする(typed ts + native go/rust)。**typed ts はここ**(#128/A6 で * ir-exec 側から codegen 側へ再分類 — 実装は 0.5.0 以降 straight-line codegen で IR 非在)。 * **`runtime-free`(bc-runtime import ゼロ)は別の性質**で native go/rust だけが満たす。ts の * codegen ターゲットは意味論を runtime から import する(consumer-interface.md §0 の用語定義)。 * conformance の grep-0(生成物 IR/dict 不在)+ 実行等価(生成 ≡ interpreter)は codegen ターゲットに課す。 */ export type EmitterClassification = "ir-exec" | "codegen"; /** 言語 emitter プラグイン。DSL 非依存の EmitContext からモジュール全文を emit する。 */ export interface EmitterPlugin { /** 言語識別子(`generateModule` の `language`)。 */ language: string; /** * ターゲット分類(consumer-interface.md §0/§1・#128/A6)。`"ir-exec"`(IR を埋め込み動的実行 — * literal)か `"codegen"`(IR を build で終端し **IR-free** コード生成 — typed ts / native go/rust)。 */ classification: EmitterClassification; /** 生成ファイルの拡張子(`.ts` / `.py` …)。 */ fileExtension: string; /** runtime-core の既定 import 指定子(`"behavior-contracts"` / `"behavior_contracts"`)。 */ defaultRuntimeImport: string; /** * 推奨ファイル名の上書き(省略時は `behaviors.generated` + fileExtension)。 * Rust のように `.` 区切りがモジュール名として使えない言語が指定する。 */ filenameHint?: string; /** モジュール全文を emit(決定的であること)。 */ emit(ctx: EmitContext): string; } /** * registerEmitter — 言語 emitter を登録する(consumer / 後続 SP の言語追加 seam)。 * 同名言語の再登録は上書き(テスト・差し替え用)。 */ export declare function registerEmitter(plugin: EmitterPlugin): void; /** 登録済み言語の一覧(宣言順不定 — 表示用途はソートして使う)。 */ export declare function registeredLanguages(): string[]; export interface GenerateOptions { /** 生成先言語(登録済み emitter の識別子。SP1: "typescript" | "python")。 */ language: string; /** * runtime-core を import するモジュール指定子。省略時は emitter の既定 * (npm/PyPI パッケージ名)。テスト・vendored 配置ではソースへの相対パス等を渡す。 * 生成コードの決定性は指定子込み(同一 IR + 同一オプション → byte-identical)。 */ runtimeImport?: string; /** * codegen I/O モデル(bc#97)を **明示指定**する(省略時の解決は下記)。`'async'`(uniform)または * `{ asyncComponents }`(per-terminal-handler granularity)を渡すと async/await 対応 native 言語 * (rust-typed-native)が per-node で `async fn` + `.await` を出力する。go は await 概念が無いため * 無視(no-op)。python は native codegen surface が無く対象外。詳細は {@link IoModel} と * `async-plan.ts` の SSoT 伝播 pass を参照。 * * **省略時(#210・consumer の通常経路)**: `@leaf` 宣言(`static async` / `Promise` 戻り型)から * compile seam が導いた宣言メタ({@link declaredIoModel})を使い、宣言が無ければ `'sync'`。 * consumer が async 性を書く場所は**ソースの宣言だけ**であり、この option は宣言を持たない生 IR * (`--in` / テストベクタ)に I/O モデルを与えるための内部入力である。 */ ioModel?: IoModel; /** * go-typed-native: BC が生成する共有ワイヤ型パッケージ(Task A cross-package)の import 指定子。設定時は * BC 所有の `WireValue`/`WireRow`/`WireList` を共有パッケージへ出し covered/transport 双方が参照する。 * 未指定なら in-package。他言語 emitter は無視(no-op)。 */ sharedTypesImport?: string; /** * native codegen の op-agnostic leaf transport シンボル表({@link LeafTransportOptions})。未指定なら * in-package 既定名(rust `leaf_` / go `Leaf_`)。native emitter(rust/go)のみ消費。 */ leafTransport?: LeafTransportOptions; /** * #192: 生成エントリの **名前空間 = 宣言クラス**(authoring のクラス名)。物理配置を指定する唯一の場所。 * go = `package `(lower-case 化)/ python = `class `(+ @staticmethod)/ php = * `final class `。rust の mod は出力ファイル配置(bc generate 側の関心事・proposal §5.5)。 * 未指定なら emitter 既定(go `behaviors` 等)。`@behavior` に名前空間引数は付けない — クラス名が宣言する。 */ namespace?: string; } /** * codegen INPUT の閉集合(値の runtime-enumerable SoT)。**IR から導けない**=どこかの入口が供給 * しなければ意味を持たない値だけを列挙する(`GenerateOptions` の全フィールドと、{@link EmitContext} * のうち IR 由来でないフィールド)。下の型レベル等式が interface との一致を強制するので、**codegen * INPUT を足せばここに 1 語増え、入口の対応表(cli-from-ts.test.ts の `[completeness]`)が RED になる** * — 「emitter は読むのに誰も供給できない」(#210 の `ioModel` / #212 の `namespace`)を機械的に * 不可能にするための SoT。CLI が唯一の入口である以上、供給手段の無い option は機能ではない。 */ export declare const GENERATE_OPTION_KEYS: readonly ["language", "runtimeImport", "ioModel", "sharedTypesImport", "leafTransport", "namespace"]; /** {@link EmitContext} のうち IR から導出されるフィールド(入口を持たないのが正しい派生値)。 */ export declare const EMIT_CONTEXT_DERIVED_KEYS: readonly ["ir", "fingerprint", "specVersions", "componentNames"]; /** {@link EmitContext} のうち **供給された値**(= codegen INPUT)のフィールド。 */ export declare const EMIT_CONTEXT_INPUT_KEYS: readonly ["runtimeImport", "namespace", "ioModel", "sharedTypesImport", "leafTransport", "declaredEntryPortOrder"]; export interface GeneratedModule { /** 生成言語。 */ language: string; /** モジュール全文(実行可能なソースコード)。 */ code: string; /** source IR の fingerprint(生成コードにも定数として焼き込み済み)。 */ fingerprint: string; /** 焼き込んだ spec versions。 */ specVersions: { behavior: number; expression: number; plan: number; }; /** bind で公開される component 名(IR 宣言順)。 */ componentNames: string[]; /** 推奨ファイル名(`behaviors.generated` + 言語拡張子)。 */ filenameHint: string; } /** * generateModule — 可搬 component-graph IR から言語ネイティブの実行モジュールを生成する。 * * 生成物の形(全言語共通の契約): * - IR がネイティブリテラル定数として埋め込まれる(実行時 JSON パースなし)。 * - `EXPECTED_SPEC_VERSIONS` / `IR_FINGERPRINT` 定数 + ロード時 fail-closed 検査。 * - `bind(handlers)`(TS はさらに `bindAsync`): handler 注入を受けて * `{component名: (input) => runBehavior(IR, handlers, input, name)}` を返す薄い束ね。 * **handler は常に境界注入**であり、生成対象にならない(C4)。 * * @throws {GeneratorFailure} 入力が可搬 IR でない / 版超過 / 未知言語(fail-closed)。 * @throws {PortabilityError} IR が Portability Guard に違反するとき。 */ export declare function generateModule(ir: unknown, options: GenerateOptions): GeneratedModule; //# sourceMappingURL=core.d.ts.map