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,156 @@
1
+ /**
2
+ * typed.ts — typed-emit の language-neutral フレームワーク(bc#46 / Layer B2)。
3
+ *
4
+ * typed-codegen.md §4.2/§4.3 の骨組み。可搬型記法(`PortableType`, B0/bc#44)を「各言語の型宣言/
5
+ * 型注釈へ落とせる language-neutral な型プラン」へ導出する枠と、直線 emit({@link StraightlineDialect})を
6
+ * typed に拡張する seam({@link TypedStraightlineDialect})を提供する。TS 具体化は
7
+ * `emit-straightline-typed-typescript.ts`(言語識別子 `typescript-typed`)。go/rust(#47/#48)が
8
+ * 同じ seam に乗る。
9
+ *
10
+ * 設計の核(§4.2「全ワイヤ型は SCP 構造の決定関数」):
11
+ * - 型はワイヤの導出プロパティ。consumer(graphddb, B1/#45)が lowering 時に各ノードへ確定型を
12
+ * `outType`/`outputType` として注記する。generator はレジストリを持たず、注記された型記法だけを
13
+ * 読む(DSL 非依存)。
14
+ * - **language-neutral 部(ここ)**: 型記法 → 「型プラン」(named struct/interface の集合 + 各注記点の
15
+ * 型参照)の導出。obj は決定的な名前を振って dedup(同形 obj は同一宣言を共有)。arr/opt/scalar は
16
+ * inline 参照。名前生成・走査順・dedup は言語非依存で一度だけ実装する(go/rust/ts 共通)。
17
+ * - **per-language 部(dialect seam)**: 型プランの各ノードを「その言語の型構文(TS interface /
18
+ * Go struct / Rust struct)」へ綴じる + typed materialization(scope/output を typed 値で組む・
19
+ * `ref` を typed field access で行う)を emit する。
20
+ *
21
+ * TS における位置づけ(oracle): TS は型消去のため **runtime 脱box は無い**(生成コードの runtime 挙動は
22
+ * straight-line と同一)。typed 経路は「`outType` から型付き interface/型注釈を emit → `tsc` clean +
23
+ * emit された型が `outType` と構造一致(構造 pin)」を権威づける検証用 oracle であり、raw→typed の
24
+ * 実 perf 脱box は go/rust(#47/#48 の materialization)+ graphddb #60(marshaller 実測)の責務。
25
+ */
26
+ import type { ComponentGraphIR, PortableType } from "../behavior.js";
27
+ /**
28
+ * TypeRef — 注記点(node.outType / component.outputType)の型を language-neutral に表す。
29
+ * - scalar: 5 種のスカラ型(そのまま各言語のスカラ型へ落ちる)。
30
+ * - opt: nullable(`T | null` / `Option<T>` / …)。
31
+ * - arr: 同種配列(要素型)。
32
+ * - named: obj を named struct/interface として宣言し、その名前を参照する(Go/Rust は無名ネスト
33
+ * struct を跨げないので named 化が必須。TS も可読性・dedup のため named interface を使う)。
34
+ */
35
+ export type TypeRef = {
36
+ kind: "scalar";
37
+ scalar: "string" | "int" | "float" | "bool" | "null";
38
+ } | {
39
+ kind: "opt";
40
+ inner: TypeRef;
41
+ } | {
42
+ kind: "arr";
43
+ elem: TypeRef;
44
+ } | {
45
+ kind: "named";
46
+ name: string;
47
+ };
48
+ /** named struct/interface 宣言(obj 型 1 つ)。fields はキー順保存(型記法の宣言順)。 */
49
+ export interface TypeDecl {
50
+ name: string;
51
+ fields: {
52
+ name: string;
53
+ type: TypeRef;
54
+ }[];
55
+ }
56
+ /**
57
+ * TypePlan — IR 全体から導出した型プラン。
58
+ * - decls: named 宣言(obj 型)を **決定的順序**(初出順)で並べたもの。同形 obj は 1 宣言に dedup。
59
+ * - node/output の各注記点の型参照は {@link deriveTypeRef} が都度返す(プラン共有の decls を参照)。
60
+ */
61
+ export interface TypePlan {
62
+ decls: TypeDecl[];
63
+ }
64
+ /**
65
+ * buildTypePlan — IR 全体を走査し、全注記点(body ノード `outType` / component `outputType`)の obj 型を
66
+ * named 宣言に dedup 収集した {@link TypePlan} を返す。注記が 1 つも無ければ decls は空(typed 化する
67
+ * ものが無い=呼び側は untyped straight-line にフォールバックする)。language-neutral・決定的。
68
+ */
69
+ export declare function buildTypePlan(ir: ComponentGraphIR): TypePlan;
70
+ /**
71
+ * deriveTypeRef — 単一の注記点の型記法を(buildTypePlan と同じ dedup 規律で)TypeRef へ落とす。
72
+ * ただし named 宣言の同定はプランの走査で既に確定しているため、ここでは同じ structuralKey で
73
+ * プラン内 decl を引く(プランに無い obj 型は渡されない前提 — buildTypePlan が全注記点を網羅する)。
74
+ */
75
+ export declare function deriveTypeRef(t: PortableType, plan: TypePlan): TypeRef;
76
+ /**
77
+ * TypedMaterializer — per-language の typed 具体化 seam。language-neutral な {@link TypePlan} と
78
+ * 各注記点の {@link TypeRef} を受け取り、その言語の「型宣言(interface/struct)」と typed
79
+ * materialization(scope/output を typed 値で組む・`ref` を typed field access で行う)を綴じる。
80
+ *
81
+ * ── decls 部(B2-ts / bc#46 で確立・型テキスト描画)──────────────────────────────
82
+ * `emitTypeDecls` / `renderTypeRef` は型記法 → その言語の型宣言テキスト(TS interface / Go struct /
83
+ * Rust struct)を綴じる。TS(`emit-straightline-typed-typescript.ts`)はこれと型消去 oracle だけで
84
+ * 完結する(runtime 脱box が無いため)。
85
+ *
86
+ * ── runtime-materialization 部(B2-go / bc#47 で co-design・**最初のコンパイル言語で拡張**)─────
87
+ * TS は型消去のため runtime typed materialization を持たない → decls 部だけでは **コンパイル言語の
88
+ * 実 de-box(raw Value → 具体 struct)を綴じられない**。そこで **最初のコンパイル言語(go)で seam を
89
+ * 拡張**し、以下の hook を足す(rust #48 が同じ形で乗る)。すべて **language-neutral な入力**
90
+ * ({@link TypePlan} / {@link TypeRef} / node id / field path / 生の raw 式テキスト)を受け、per-language が
91
+ * その言語の materialization 構文へ綴じる(型プラン導出=共有、materialization=per-lang)。
92
+ *
93
+ * - {@link emitMarshallers}: 型プランの各 named 宣言に対し「raw(動的 Value)→ その struct」の
94
+ * **monomorphized marshaller**(§4.4)を emit する。struct field を 1 つずつ typed に読み出して
95
+ * 具体 struct を組む(generic な Value 走査を exec 経路から除去する de-box の実体)。
96
+ * - {@link materializeExpr}: 「raw な Value 式(handler 結果 / scope 読み)」を、注記型 {@link TypeRef}
97
+ * の **具体 typed 値**(struct / scalar / slice)へ変換する式を emit する(marshaller 呼び / 直キャスト)。
98
+ * - {@link typedFieldAccess}: 既に typed な base 式(materialize 済みローカル)への **静的 field access**
99
+ * (struct field 直参照 — map lookup でない)を emit する。ネスト field path を辿る。
100
+ * - {@link serializeTyped}: 具体 typed 値を **canonical 直列化のための動的 Value へ戻す**式を emit する
101
+ * (観測等価 pin のため。exec は typed のまま進み、境界でだけ Value に戻して golden と突き合わせる)。
102
+ *
103
+ * decls-only の materializer(TS)は runtime hook 群を実装しなくてよい(optional)。コンパイル言語
104
+ * (go/rust)は実装する。呼び側(各 emitter)が hook の有無で typed exec を出すか oracle に留めるかを決める。
105
+ *
106
+ * ── struct-native exec の規律(bc#47 監査 rework・rust #48 も従う)──────────────────
107
+ * これらの hook を使う typed exec は **struct 空間で実行する**こと(LAYERED な Value-then-struct は不可):
108
+ * - handler 結果は **その場で**(境界で)`materializeExpr`/marshaller により outType の具体 struct へ
109
+ * de-box し、**typed scope(struct)** に格納する。動的 Value の node-result scope を組んではならない。
110
+ * - downstream の `ref`/field access は `typedFieldAccess`(struct field 直参照)で typed scope を読む。
111
+ * - component output は typed 値(struct/slice)として組み、`serializeTyped` で **最終 return 境界のみ**
112
+ * Value へ戻す(動的 Value output tree を組んではならない)。
113
+ * - plan 駆動・handler dispatch・operator 意味論(overflow/短絡)は既存 SSoT(runPlan/handler/A0 primitive)
114
+ * を再利用する(二重実装しない)。struct 空間へ移すのは **結果 materialization(handler 結果・scope・
115
+ * output)だけ**。localized な operand の Value 化(operator 被演算子など)は許容。
116
+ */
117
+ export interface TypedMaterializer {
118
+ /**
119
+ * 型プランの named 宣言群(obj 型)を、その言語の型宣言テキストへ綴じる(decls 順=決定的)。
120
+ * decls が空なら空文字(typed 化するものが無い)。
121
+ */
122
+ emitTypeDecls(plan: TypePlan): string;
123
+ /**
124
+ * 単一 TypeRef を、その言語の型注釈式(TS の型注釈・Go の型名・Rust の型名)へ綴じる。
125
+ */
126
+ renderTypeRef(ref: TypeRef): string;
127
+ /**
128
+ * emitMarshallers — 型プランの各 named 宣言に対する raw→typed marshaller 群を emit する(§4.4)。
129
+ * decls 順=決定的。decls が空 or 未実装なら空文字。marshaller は「動的 Value を受け、宣言の各
130
+ * field を typed に読み出して具体 struct を返す」monomorphized 関数(generic Value 走査を exec から除去)。
131
+ */
132
+ emitMarshallers?(plan: TypePlan): string;
133
+ /**
134
+ * materializeExpr — raw な Value 式(`rawExpr`)を、注記型 `ref` の具体 typed 値へ変換する式を返す。
135
+ * obj → marshaller 呼び、scalar → 型付きキャスト、arr → 要素 materialize、opt → null 分岐。
136
+ * これが exec 経路で「Value を struct に de-box する」実体(呼び側はこの式を typed ローカルへ束ねる)。
137
+ */
138
+ materializeExpr?(rawExpr: string, ref: TypeRef, plan: TypePlan): string;
139
+ /**
140
+ * typedFieldAccess — 既に typed な base 式(`baseExpr`、型 `baseRef`)に対し、field path(`fields`)を
141
+ * **静的 struct field access** で辿る式と、辿り着いた型 {@link TypeRef} を返す。map lookup でなく
142
+ * struct field 直参照であること(=de-box されている)が per-lang 実装の責務。
143
+ */
144
+ typedFieldAccess?(baseExpr: string, baseRef: TypeRef, fields: string[], plan: TypePlan): {
145
+ expr: string;
146
+ ref: TypeRef;
147
+ };
148
+ /**
149
+ * serializeTyped — 具体 typed 値式(`typedExpr`、型 `ref`)を、canonical 直列化のための動的 Value へ
150
+ * 戻す式を返す(観測等価 pin 用。exec は typed のまま進み、境界でだけ Value 化して golden と突き合わせる)。
151
+ */
152
+ serializeTyped?(typedExpr: string, ref: TypeRef, plan: TypePlan): string;
153
+ }
154
+ /** 型プランから named 宣言を名前で引く(per-language materializer の共有ヘルパ)。 */
155
+ export declare function findDecl(plan: TypePlan, name: string): TypeDecl | undefined;
156
+ //# sourceMappingURL=typed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed.d.ts","sourceRoot":"","sources":["../../src/generator/typed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAa,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAIhF;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpC,mEAAmE;AACnE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;CAC3C;AAED;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAiDD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,gBAAgB,GAAG,QAAQ,CAU5D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAUtE;AAmBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACtC;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC;IAGpC;;;;OAIG;IACH,eAAe,CAAC,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzC;;;;OAIG;IACH,eAAe,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxE;;;;OAIG;IACH,gBAAgB,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;IACxH;;;OAGG;IACH,cAAc,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC1E;AAED,+DAA+D;AAC/D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE3E"}
@@ -0,0 +1,108 @@
1
+ /** obj 型の構造キー(dedup 用・決定的)。field 名(宣言順)+各 field 型の構造キーを連結する。 */
2
+ function structuralKey(t) {
3
+ if (typeof t === "string")
4
+ return t;
5
+ if ("opt" in t)
6
+ return `opt(${structuralKey(t.opt)})`;
7
+ if ("arr" in t)
8
+ return `arr(${structuralKey(t.arr)})`;
9
+ // obj: field 名は宣言順保存(key 順は型記法の意味の一部ではないが、決定性のため入力順で連結)。
10
+ const parts = Object.entries(t.obj).map(([k, v]) => `${k}:${structuralKey(v)}`);
11
+ return `obj{${parts.join(",")}}`;
12
+ }
13
+ /** 決定的 struct 名を組む(`T` + 連番)。同形は同名(dedup)。衝突しない一意名を返す。 */
14
+ function makeName(index) {
15
+ return `T${index}`;
16
+ }
17
+ /**
18
+ * TypePlanBuilder — IR を 1 度走査して named obj 宣言を dedup 収集する。language-neutral。
19
+ * 走査順(=decls の順)は「IR 宣言順(components → body → outType、component.outputType)」で
20
+ * 各注記点を深さ優先に辿った初出順。同一 IR → 同一プラン(決定的)。
21
+ */
22
+ class TypePlanBuilder {
23
+ byKey = new Map();
24
+ order = [];
25
+ /** PortableType を TypeRef へ落とす。obj は named 宣言を(初出なら)登録して named 参照を返す。 */
26
+ ref(t) {
27
+ if (typeof t === "string")
28
+ return { kind: "scalar", scalar: t };
29
+ if ("opt" in t)
30
+ return { kind: "opt", inner: this.ref(t.opt) };
31
+ if ("arr" in t)
32
+ return { kind: "arr", elem: this.ref(t.arr) };
33
+ // obj: dedup key で既登録を探す。無ければ新規宣言(fields を先に解決=ネストの初出順を保つ)。
34
+ const key = structuralKey(t);
35
+ const existing = this.byKey.get(key);
36
+ if (existing)
37
+ return { kind: "named", name: existing.name };
38
+ // 先に名前を確保して自己/相互参照でも安定させる(型記法は非再帰だが決定性のため確保順を固定)。
39
+ const name = makeName(this.order.length);
40
+ const decl = { name, fields: [] };
41
+ this.byKey.set(key, decl);
42
+ this.order.push(decl);
43
+ decl.fields = Object.entries(t.obj).map(([k, v]) => ({ name: k, type: this.ref(v) }));
44
+ return { kind: "named", name };
45
+ }
46
+ plan() {
47
+ return { decls: this.order };
48
+ }
49
+ }
50
+ /**
51
+ * buildTypePlan — IR 全体を走査し、全注記点(body ノード `outType` / component `outputType`)の obj 型を
52
+ * named 宣言に dedup 収集した {@link TypePlan} を返す。注記が 1 つも無ければ decls は空(typed 化する
53
+ * ものが無い=呼び側は untyped straight-line にフォールバックする)。language-neutral・決定的。
54
+ */
55
+ export function buildTypePlan(ir) {
56
+ const b = new TypePlanBuilder();
57
+ for (const comp of ir.components) {
58
+ for (const n of comp.body) {
59
+ const ot = n.outType;
60
+ if (ot !== undefined)
61
+ b.ref(ot);
62
+ }
63
+ if (comp.outputType !== undefined)
64
+ b.ref(comp.outputType);
65
+ }
66
+ return b.plan();
67
+ }
68
+ /**
69
+ * deriveTypeRef — 単一の注記点の型記法を(buildTypePlan と同じ dedup 規律で)TypeRef へ落とす。
70
+ * ただし named 宣言の同定はプランの走査で既に確定しているため、ここでは同じ structuralKey で
71
+ * プラン内 decl を引く(プランに無い obj 型は渡されない前提 — buildTypePlan が全注記点を網羅する)。
72
+ */
73
+ export function deriveTypeRef(t, plan) {
74
+ if (typeof t === "string")
75
+ return { kind: "scalar", scalar: t };
76
+ if ("opt" in t)
77
+ return { kind: "opt", inner: deriveTypeRef(t.opt, plan) };
78
+ if ("arr" in t)
79
+ return { kind: "arr", elem: deriveTypeRef(t.arr, plan) };
80
+ const key = structuralKey(t);
81
+ const decl = plan.decls.find((d) => structuralKey(objTypeOf(d, plan)) === key);
82
+ if (!decl)
83
+ // buildTypePlan が全注記点を網羅するので通常到達しない(fail-closed で silent 誤生成を防ぐ)。
84
+ throw new Error(`typed emit: obj type not found in the type plan (structuralKey=${key}) — buildTypePlan must cover every annotation point`);
85
+ return { kind: "named", name: decl.name };
86
+ }
87
+ /** TypeDecl を元の obj PortableType へ復元する(structuralKey 照合用・内部)。 */
88
+ function objTypeOf(d, plan) {
89
+ const obj = {};
90
+ for (const f of d.fields)
91
+ obj[f.name] = typeRefToPortable(f.type, plan);
92
+ return { obj };
93
+ }
94
+ function typeRefToPortable(r, plan) {
95
+ if (r.kind === "scalar")
96
+ return r.scalar;
97
+ if (r.kind === "opt")
98
+ return { opt: typeRefToPortable(r.inner, plan) };
99
+ if (r.kind === "arr")
100
+ return { arr: typeRefToPortable(r.elem, plan) };
101
+ const decl = plan.decls.find((d) => d.name === r.name);
102
+ return objTypeOf(decl, plan);
103
+ }
104
+ /** 型プランから named 宣言を名前で引く(per-language materializer の共有ヘルパ)。 */
105
+ export function findDecl(plan, name) {
106
+ return plan.decls.find((d) => d.name === name);
107
+ }
108
+ //# sourceMappingURL=typed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed.js","sourceRoot":"","sources":["../../src/generator/typed.ts"],"names":[],"mappings":"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"}
package/dist/guard.d.ts CHANGED
@@ -24,4 +24,40 @@ export declare class PortabilityError extends Error {
24
24
  * @throws {PortabilityError} non-portable な値を検出したとき。
25
25
  */
26
26
  export declare function assertPortable(value: unknown, path?: string): void;
27
+ /**
28
+ * 可搬 IR で許可される Expression IR オペレータの閉集合(expression-ir.md §3)。
29
+ * `assertPortableComponentGraph` はこの集合外の単一キーオブジェクトノードを未知 operator
30
+ * として fail-closed で拒否する(component-graph の port 式・output・map.over/cond に適用)。
31
+ */
32
+ export declare const PORTABLE_EXPR_OPERATORS: ReadonlySet<string>;
33
+ /**
34
+ * 可搬型記法(Portable Type Notation, B0 / bc#44)のスカラ閉集合
35
+ * (scp-ir-architecture.md §5.2)。複合型は `{opt|arr|obj: …}` の単一キー object のみ。
36
+ * `assertPortableTypeNotation` はこの閉集合外の型ノード(未知スカラ・未知複合キー・
37
+ * 0/複数キー object・obj field の `__proto__`)を fail-closed で拒否する(`"any"` エスケープ無し)。
38
+ */
39
+ export declare const PORTABLE_SCALAR_TYPES: ReadonlySet<string>;
40
+ /**
41
+ * assertPortableTypeNotation — 可搬型記法(§5.2)を Expression IR と同じ強度で検証する。
42
+ * 型注記フィールド(body ノード `outType` / Component `outputType` / catalog `elemType`)に
43
+ * 使う。閉集合:
44
+ * - スカラ: 5 種の文字列リテラル(PORTABLE_SCALAR_TYPES)のみ。
45
+ * - `{opt: T}` / `{arr: T}`: 単一キー object・値は型 T(再帰)。
46
+ * - `{obj: {field: T, …}}`: 単一キー object・値は field→型の object(`__proto__` キー禁止)。
47
+ *
48
+ * @throws {PortabilityError} 閉集合外の型記法を検出したとき(fail-closed)。
49
+ */
50
+ export declare function assertPortableTypeNotation(node: unknown, path: string): void;
51
+ /**
52
+ * assertPortableComponentGraph — component-graph IR(scp-ir-architecture.md §5)の
53
+ * 可搬性 Guard(P0-2)。generic な {@link assertPortable}(関数/Date/Promise 残存禁止)に加え、
54
+ * SCP 汎用層に固有の不変条件を fail-closed で強制する:
55
+ * 1. `component` フィールド(componentRef / map)は **文字列参照のみ**(catalog 名)。
56
+ * 2. port 式・output・map.over・cond に現れる Expression IR ノードは **既知 operator の閉集合のみ**
57
+ * (PORTABLE_EXPR_OPERATORS 外の単一キーオブジェクトは未知 operator として拒否)。
58
+ * 3. 関数残存禁止(generic guard を全域に適用)。
59
+ *
60
+ * @throws {PortabilityError} 非可搬な構造を検出したとき。
61
+ */
62
+ export declare function assertPortableComponentGraph(ir: unknown, path?: string): void;
27
63
  //# sourceMappingURL=guard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,IAAI,EAAE,MAAM,CAAC;gBACD,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,SAAM,GAAG,IAAI,CAa/D"}
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,IAAI,EAAE,MAAM,CAAC;gBACD,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,SAAM,GAAG,IAAI,CAa/D;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,CAKtD,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAEpD,CAAC;AAEH;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CA+C5E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,SAAM,GAAG,IAAI,CAQ1E"}
package/dist/guard.js CHANGED
@@ -11,6 +11,7 @@
11
11
  * - **含めない**: `makeContractService` / `buildIR`(Metadata → IR)は graphddb 固有の
12
12
  * Metadata/OperationDef 形状に依存する consumer レベル API のため examples に残す。
13
13
  */
14
+ import { FORBIDDEN_OBJECT_KEY } from "./expr-eval.js";
14
15
  export class PortabilityError extends Error {
15
16
  path;
16
17
  constructor(path, message) {
@@ -40,4 +41,189 @@ export function assertPortable(value, path = "$") {
40
41
  assertPortable(v, `${path}.${k}`);
41
42
  }
42
43
  }
44
+ /**
45
+ * 可搬 IR で許可される Expression IR オペレータの閉集合(expression-ir.md §3)。
46
+ * `assertPortableComponentGraph` はこの集合外の単一キーオブジェクトノードを未知 operator
47
+ * として fail-closed で拒否する(component-graph の port 式・output・map.over/cond に適用)。
48
+ */
49
+ export const PORTABLE_EXPR_OPERATORS = /* @__PURE__ */ new Set([
50
+ "int", "float", "ref", "refOpt", "obj", "arr",
51
+ "add", "sub", "mul", "neg", "div", "mod",
52
+ "concat", "eq", "ne", "lt", "le", "gt", "ge",
53
+ "and", "or", "not", "coalesce", "cond", "len",
54
+ ]);
55
+ /**
56
+ * 可搬型記法(Portable Type Notation, B0 / bc#44)のスカラ閉集合
57
+ * (scp-ir-architecture.md §5.2)。複合型は `{opt|arr|obj: …}` の単一キー object のみ。
58
+ * `assertPortableTypeNotation` はこの閉集合外の型ノード(未知スカラ・未知複合キー・
59
+ * 0/複数キー object・obj field の `__proto__`)を fail-closed で拒否する(`"any"` エスケープ無し)。
60
+ */
61
+ export const PORTABLE_SCALAR_TYPES = /* @__PURE__ */ new Set([
62
+ "string", "int", "float", "bool", "null",
63
+ ]);
64
+ /**
65
+ * assertPortableTypeNotation — 可搬型記法(§5.2)を Expression IR と同じ強度で検証する。
66
+ * 型注記フィールド(body ノード `outType` / Component `outputType` / catalog `elemType`)に
67
+ * 使う。閉集合:
68
+ * - スカラ: 5 種の文字列リテラル(PORTABLE_SCALAR_TYPES)のみ。
69
+ * - `{opt: T}` / `{arr: T}`: 単一キー object・値は型 T(再帰)。
70
+ * - `{obj: {field: T, …}}`: 単一キー object・値は field→型の object(`__proto__` キー禁止)。
71
+ *
72
+ * @throws {PortabilityError} 閉集合外の型記法を検出したとき(fail-closed)。
73
+ */
74
+ export function assertPortableTypeNotation(node, path) {
75
+ if (typeof node === "string") {
76
+ if (!PORTABLE_SCALAR_TYPES.has(node))
77
+ throw new PortabilityError(path, `Portability Guard: unknown scalar type '${node}' — portable type notation allows only ${[...PORTABLE_SCALAR_TYPES].join("/")} (fail-closed) at ${path}`);
78
+ return;
79
+ }
80
+ if (node === null || typeof node !== "object" || Array.isArray(node))
81
+ throw new PortabilityError(path, `Portability Guard: type notation must be a scalar-type string or a single-key {opt|arr|obj} object (fail-closed) at ${path}`);
82
+ const keys = Object.keys(node);
83
+ if (keys.length !== 1)
84
+ throw new PortabilityError(path, `Portability Guard: compound type must be a single-key object (opt|arr|obj), got ${keys.length} keys (fail-closed) at ${path}`);
85
+ const kind = keys[0];
86
+ const arg = node[kind];
87
+ if (kind === "opt" || kind === "arr") {
88
+ assertPortableTypeNotation(arg, `${path}.${kind}`);
89
+ return;
90
+ }
91
+ if (kind === "obj") {
92
+ if (!arg || typeof arg !== "object" || Array.isArray(arg))
93
+ throw new PortabilityError(`${path}.obj`, `Portability Guard: {obj: ...} type expects a field→type object (fail-closed) at ${path}.obj`);
94
+ for (const [k, v] of Object.entries(arg)) {
95
+ // prototype pollution 規律(expression-ir.md §2.3/§8)を型記法の obj field キーにも踏襲。
96
+ if (k === FORBIDDEN_OBJECT_KEY)
97
+ throw new PortabilityError(`${path}.obj`, `Portability Guard: object type key "${FORBIDDEN_OBJECT_KEY}" is forbidden (fail-closed) at ${path}.obj`);
98
+ assertPortableTypeNotation(v, `${path}.obj.${k}`);
99
+ }
100
+ return;
101
+ }
102
+ throw new PortabilityError(path, `Portability Guard: unknown compound type kind '${kind}' — portable type notation allows only opt/arr/obj (fail-closed) at ${path}`);
103
+ }
104
+ /**
105
+ * assertPortableComponentGraph — component-graph IR(scp-ir-architecture.md §5)の
106
+ * 可搬性 Guard(P0-2)。generic な {@link assertPortable}(関数/Date/Promise 残存禁止)に加え、
107
+ * SCP 汎用層に固有の不変条件を fail-closed で強制する:
108
+ * 1. `component` フィールド(componentRef / map)は **文字列参照のみ**(catalog 名)。
109
+ * 2. port 式・output・map.over・cond に現れる Expression IR ノードは **既知 operator の閉集合のみ**
110
+ * (PORTABLE_EXPR_OPERATORS 外の単一キーオブジェクトは未知 operator として拒否)。
111
+ * 3. 関数残存禁止(generic guard を全域に適用)。
112
+ *
113
+ * @throws {PortabilityError} 非可搬な構造を検出したとき。
114
+ */
115
+ export function assertPortableComponentGraph(ir, path = "$") {
116
+ assertPortable(ir, path); // 関数/Date/Promise 残存を全域で禁止(1・3)。
117
+ if (!ir || typeof ir !== "object")
118
+ throw new PortabilityError(path, `Portability Guard: IR root must be an object (at ${path})`);
119
+ const root = ir;
120
+ if (!Array.isArray(root.components))
121
+ throw new PortabilityError(`${path}.components`, `Portability Guard: IR.components must be an array`);
122
+ root.components.forEach((c, ci) => assertPortableComponent(c, `${path}.components[${ci}]`));
123
+ }
124
+ function assertPortableComponent(c, path) {
125
+ if (!c || typeof c !== "object")
126
+ throw new PortabilityError(path, `Portability Guard: component must be an object (at ${path})`);
127
+ const comp = c;
128
+ if (typeof comp.name !== "string")
129
+ throw new PortabilityError(`${path}.name`, `Portability Guard: component.name must be a string`);
130
+ if (!Array.isArray(comp.body))
131
+ throw new PortabilityError(`${path}.body`, `Portability Guard: component.body must be an array`);
132
+ comp.body.forEach((n, ni) => assertPortableBodyNode(n, `${path}.body[${ni}]`));
133
+ assertPortableExpr(comp.output, `${path}.output`);
134
+ // 可搬型記法(B0 / bc#44・§5.2): additive・省略可。存在時のみ閉集合を fail-closed 検証。
135
+ if (comp.outputType !== undefined)
136
+ assertPortableTypeNotation(comp.outputType, `${path}.outputType`);
137
+ }
138
+ function assertPortableBodyNode(n, path) {
139
+ if (!n || typeof n !== "object")
140
+ throw new PortabilityError(path, `Portability Guard: body node must be an object (at ${path})`);
141
+ const node = n;
142
+ if ("map" in node) {
143
+ const m = node.map;
144
+ requireStringComponent(m.component, `${path}.map.component`);
145
+ assertPortableExpr(m.over, `${path}.map.over`);
146
+ assertPortablePorts(m.ports, `${path}.map.ports`);
147
+ // v2 語彙: when は Expression IR(未知 operator を fail-closed)、into は string、batched は bool。
148
+ if (m.when !== undefined)
149
+ assertPortableExpr(m.when, `${path}.map.when`);
150
+ if (m.into !== undefined && typeof m.into !== "string")
151
+ throw new PortabilityError(`${path}.map.into`, `Portability Guard: 'into' must be a string key (at ${path}.map.into)`);
152
+ if (m.batched !== undefined && typeof m.batched !== "boolean")
153
+ throw new PortabilityError(`${path}.map.batched`, `Portability Guard: 'batched' must be a boolean (at ${path}.map.batched)`);
154
+ }
155
+ else if ("cond" in node) {
156
+ const co = node.cond;
157
+ assertPortableExpr(co.if, `${path}.cond.if`);
158
+ assertPortableExpr(co.then, `${path}.cond.then`);
159
+ assertPortableExpr(co.else, `${path}.cond.else`);
160
+ }
161
+ else if ("component" in node) {
162
+ requireStringComponent(node.component, `${path}.component`);
163
+ assertPortablePorts(node.ports, `${path}.ports`);
164
+ }
165
+ else {
166
+ throw new PortabilityError(path, `Portability Guard: unknown body node kind (not componentRef/map/cond) at ${path}`);
167
+ }
168
+ // 可搬型記法(B0 / bc#44・§5.2): node の `outType` は additive・省略可。全ノード種で
169
+ // 共通に、存在時のみ閉集合を fail-closed 検証する(emitter 消費は B2)。
170
+ if (node.outType !== undefined)
171
+ assertPortableTypeNotation(node.outType, `${path}.outType`);
172
+ }
173
+ function requireStringComponent(v, path) {
174
+ if (typeof v !== "string")
175
+ throw new PortabilityError(path, `Portability Guard: 'component' must be a string catalog reference, not ${typeof v} (at ${path})`);
176
+ }
177
+ function assertPortablePorts(ports, path) {
178
+ if (!ports || typeof ports !== "object" || Array.isArray(ports))
179
+ throw new PortabilityError(path, `Portability Guard: ports must be an object (at ${path})`);
180
+ for (const [k, v] of Object.entries(ports))
181
+ assertPortableExpr(v, `${path}.${k}`);
182
+ }
183
+ /**
184
+ * Expression IR ノードを再帰的に検査し、未知 operator(PORTABLE_EXPR_OPERATORS 外の
185
+ * 単一キーオブジェクト)を fail-closed で拒否する。リテラル(null/bool/string/number)と
186
+ * 配列(arr のラップ内など)は許可し、子を再帰。
187
+ */
188
+ function assertPortableExpr(node, path) {
189
+ if (node === null || typeof node === "boolean" || typeof node === "string" || typeof node === "number")
190
+ return;
191
+ if (typeof node === "function")
192
+ throw new PortabilityError(path, `Portability Guard: functions cannot be placed in IR (at ${path})`);
193
+ if (Array.isArray(node)) {
194
+ node.forEach((e, i) => assertPortableExpr(e, `${path}[${i}]`));
195
+ return;
196
+ }
197
+ if (typeof node !== "object")
198
+ throw new PortabilityError(path, `Portability Guard: invalid expression node at ${path}`);
199
+ const keys = Object.keys(node);
200
+ if (keys.length === 1) {
201
+ const op = keys[0];
202
+ if (!PORTABLE_EXPR_OPERATORS.has(op))
203
+ throw new PortabilityError(path, `Portability Guard: unknown operator '${op}' (fail-closed) at ${path}`);
204
+ // obj は「任意の data key → 子式」の構築ノード(expression-ir.md §3)。arg の key は
205
+ // operator ではなく data であり、値だけを式として再帰する(単一 data key の obj が
206
+ // 未知 operator と誤判定されないように — evaluate() の意味論と一致させる)。
207
+ if (op === "obj") {
208
+ const arg = node[op];
209
+ if (!arg || typeof arg !== "object" || Array.isArray(arg))
210
+ throw new PortabilityError(`${path}.obj`, `Portability Guard: {obj: ...} expects an object (at ${path}.obj)`);
211
+ for (const [k, v] of Object.entries(arg)) {
212
+ // 静的 fail-closed(defense-in-depth): own key "__proto__" は evaluator が実行時に
213
+ // FORBIDDEN_KEY で拒否する(expression-ir.md §2.3/§8 — 言語間発散 / prototype
214
+ // pollution 対策)。guard でも静的に拒否する(JSON.parse 由来の IR では own key)。
215
+ if (k === FORBIDDEN_OBJECT_KEY)
216
+ throw new PortabilityError(`${path}.obj`, `Portability Guard: object key "${FORBIDDEN_OBJECT_KEY}" is forbidden (fail-closed) at ${path}.obj`);
217
+ assertPortableExpr(v, `${path}.obj.${k}`);
218
+ }
219
+ return;
220
+ }
221
+ // それ以外は arg(配列 or 式)を再帰。
222
+ assertPortableExpr(node[op], `${path}.${op}`);
223
+ return;
224
+ }
225
+ // 多キーオブジェクト(式木では通常出現しない)は各値を再帰検査(関数残存等の検出)。
226
+ for (const [k, v] of Object.entries(node))
227
+ assertPortableExpr(v, `${path}.${k}`);
228
+ }
43
229
  //# sourceMappingURL=guard.js.map
package/dist/guard.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,IAAI,CAAS;IACb,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc,EAAE,IAAI,GAAG,GAAG;IACvD,IAAI,OAAO,KAAK,KAAK,UAAU;QAC7B,MAAM,IAAI,gBAAgB,CAAC,IAAI,EAAE,2DAA2D,IAAI,GAAG,CAAC,CAAC;IACvG,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY,OAAO;QACnD,MAAM,IAAI,gBAAgB,CACxB,IAAI,EACJ,sBAAsB,KAAK,CAAC,WAAW,CAAC,IAAI,+BAA+B,IAAI,GAAG,CACnF,CAAC;IACJ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,CAAC;SAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,cAAc,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -24,6 +24,9 @@ export declare const SPEC_VERSIONS: {
24
24
  readonly template: 1;
25
25
  readonly plan: 1;
26
26
  readonly canonical: 2;
27
+ readonly behavior: 2;
28
+ readonly guard: 1;
29
+ readonly c2: 1;
27
30
  };
28
31
  /** validateEnvelope に渡す graphddb 形式の既定 supported 版(`"<major>.<minor>"`)。 */
29
32
  export declare const ENVELOPE_SPEC_VERSION: "1.1";
@@ -32,12 +35,23 @@ export { evaluate as evaluateExpression, encodeValue, cmpCodePoints, ExprFailure
32
35
  export type { FailureCode as ExprFailureCode } from "./expr-eval.js";
33
36
  export { renderTemplate, resolvePartial, TemplateFailure } from "./template.js";
34
37
  export type { TemplateFailureCode } from "./template.js";
35
- export { runPlan, finalTree, PlanFailure } from "./plan.js";
36
- export type { ExecutionPlanSpec, OpSpec, Exec, ExecOutcome, RunResult, PolicyKind, RelationKind, PlanFailureCode, } from "./plan.js";
38
+ export { runPlan, runPlanAsync, finalTree, PlanFailure } from "./plan.js";
39
+ export type { ExecutionPlanSpec, OpSpec, Exec, AsyncExec, ExecOutcome, RunResult, PolicyKind, RelationKind, PlanFailureCode, } from "./plan.js";
37
40
  export { canonicalValue, canonicalJson, pyFloatRepr, CanonicalFailure } from "./canonical.js";
38
41
  export type { CanonicalFailureCode } from "./canonical.js";
39
42
  export { validateEnvelope, EnvelopeFailure } from "./envelope.js";
40
43
  export type { EnvelopeFailureCode } from "./envelope.js";
41
- export { assertPortable, PortabilityError } from "./guard.js";
44
+ export { assertPortable, assertPortableComponentGraph, assertPortableTypeNotation, PORTABLE_EXPR_OPERATORS, PORTABLE_SCALAR_TYPES, PortabilityError, } from "./guard.js";
45
+ export { runBehavior, runBehaviorAsync, BehaviorFailure } from "./behavior.js";
46
+ export type { ComponentGraphIR, Component, BodyNode, ComponentRefNode, MapNode, CondNode, PortSchema, PortableType, PortableScalarType, CatalogEntry, CatalogOutput, Catalog, Handler, HandlerCtx, Handlers, AsyncHandler, AsyncHandlers, BehaviorFailureCode, } from "./behavior.js";
47
+ export { buildComponentDefinition, BuilderFailure } from "./builder.js";
48
+ export type { ComponentDefinitionData, BuildComponentDefinitionOptions, BuilderFailureCode, } from "./builder.js";
49
+ export { SemanticBehavior, behavior, compileBehaviors, catalogComponents, when, concat, add, sub, mul, div, mod, neg, eq, ne, lt, le, gt, ge, and, or, not, coalesce, len, opt, referencedComponents, classifyBehaviorEffect, AuthoringFailure, } from "./authoring.js";
50
+ export type { In, Recorded, BehaviorClass, CompileBehaviorsOptions, BehaviorEffect, AuthoringFailureCode, } from "./authoring.js";
42
51
  export { decodeValue, deepEquals } from "./codec.js";
52
+ export * as codegenPrimitives from "./primitives.js";
53
+ export { mapWithConcurrency, unproducedValue, skipSingle, skipConnection, hydrateInto, evalExpr, } from "./primitives.js";
54
+ export type { Expr } from "./primitives.js";
55
+ export { generateModule, registerEmitter, registeredLanguages, GeneratorFailure, fingerprintComponentGraph, FingerprintFailure, typescriptEmitter, pythonEmitter, typescriptStraightlineEmitter, rustStraightlineEmitter, phpStraightlineEmitter, pythonStraightlineEmitter, typescriptTypedEmitter, tsTypedMaterializer, assertStraightlineSupported, isStraightlineNode, buildTypePlan, deriveTypeRef, } from "./generator/index.js";
56
+ export type { GenerateOptions, GeneratedModule, EmitContext, EmitterPlugin, GeneratorFailureCode, StraightlineDialect, StraightlineOp, ComponentPlan, OpLiteral, TypePlan, TypeRef, TypeDecl, TypedMaterializer, } from "./generator/index.js";
43
57
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAEX,4EAA4E;AAC5E,eAAO,MAAM,qBAAqB,EAAG,KAAc,CAAC;AAGpD,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC/H,YAAY,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGrE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChF,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGzD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC5D,YAAY,EACV,iBAAiB,EACjB,MAAM,EACN,IAAI,EACJ,WAAW,EACX,SAAS,EACT,UAAU,EACV,YAAY,EACZ,eAAe,GAChB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAG3D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAClE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}