behavior-contracts 0.1.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.
package/dist/plan.js ADDED
@@ -0,0 +1,127 @@
1
+ export class PlanFailure extends Error {
2
+ code;
3
+ constructor(code, message) {
4
+ super(message);
5
+ this.code = code;
6
+ this.name = "PlanFailure";
7
+ }
8
+ }
9
+ function fail(code, message) {
10
+ throw new PlanFailure(code, message);
11
+ }
12
+ /** 単一値 relation の未生成 = null / connection の未生成 = {items:[],cursor:null}(§2 末尾)。 */
13
+ function unproducedValue(kind) {
14
+ return kind === "connection" ? { items: [], cursor: null } : null;
15
+ }
16
+ /**
17
+ * runPlan — execution-plan.md の骨格。
18
+ *
19
+ * @param plan groups/concurrency。null なら 1 op = 1 stage の逐次 fallback(§4)。
20
+ * @param ops operation 定義(index 順。ops[0] は root)。
21
+ * @param exec ノード実行 mock(consumer 委譲)。
22
+ */
23
+ export function runPlan(plan, ops, exec) {
24
+ const states = new Array(ops.length);
25
+ const executedIdx = [];
26
+ const skippedIdx = [];
27
+ // plan 不在 → 1 op = 1 stage の逐次 fallback(§4 / §6 罠)。
28
+ const stages = plan
29
+ ? plan.groups
30
+ : ops.map((_, i) => [i]);
31
+ const concurrency = plan ? plan.concurrency : 1;
32
+ validateCoverage(stages, ops.length);
33
+ // 逐次 stage × stage 内 bounded 並行(結果は完了順非依存なので直列に評価してよい)。
34
+ for (const stage of stages) {
35
+ // mapWithConcurrency は入力順保存・結果不変(§4)。参照実装は決定性のため
36
+ // index 昇順で評価する(concurrency 値は結果に影響しない — §3「concurrency は結果不変」)。
37
+ const ordered = [...stage].sort((a, b) => a - b);
38
+ void concurrency; // plan 構造の一部だが結果を変えない(determinism 保証)
39
+ for (const i of ordered) {
40
+ states[i] = runOp(i, ops[i], states, exec, executedIdx, skippedIdx);
41
+ }
42
+ }
43
+ return {
44
+ states,
45
+ executed: executedIdx.sort((a, b) => a - b).map((i) => ops[i].id),
46
+ skipped: skippedIdx.sort((a, b) => a - b).map((i) => ops[i].id),
47
+ };
48
+ }
49
+ function runOp(i, op, states, exec, executedIdx, skippedIdx) {
50
+ const policy = op.policy ?? "fail";
51
+ if (policy !== "fail" && policy !== "retry" && policy !== "continue")
52
+ fail("UNKNOWN_POLICY", `unknown policy kind: ${policy}`); // fail-closed
53
+ // ── §2 Skip 伝播: 依存する入力 Port が Success でなければ Skip(下流へ連鎖)──
54
+ let boundValue = undefined;
55
+ if (op.parent !== null) {
56
+ const parent = states[op.parent];
57
+ // 規則 2: 親が Skip/Failed(未生成)なら子は Skip。
58
+ if (!parent || parent.status !== "ok") {
59
+ skippedIdx.push(i);
60
+ return { status: "skipped" };
61
+ }
62
+ // null-binding skip(実装済み・データ駆動): 親 result[bindField] が null/欠落なら Skip。
63
+ if (op.bindField !== undefined) {
64
+ const pv = parent.value;
65
+ const bound = pv !== null && typeof pv === "object" && !Array.isArray(pv)
66
+ ? pv[op.bindField]
67
+ : undefined;
68
+ if (bound === undefined || bound === null) {
69
+ skippedIdx.push(i);
70
+ return { status: "skipped" };
71
+ }
72
+ boundValue = bound;
73
+ }
74
+ }
75
+ // ── ノード実行(consumer 委譲)──
76
+ const outcome = exec(op, boundValue);
77
+ executedIdx.push(i);
78
+ if ("ok" in outcome)
79
+ return { status: "ok", value: outcome.ok };
80
+ // ── §3 失敗の Policy Kind 解釈(各 case は fail が never を投げるか return する)──
81
+ if (policy === "fail") {
82
+ // op Failure をそのまま処理 Failure として伝播(§3 表: fail)。
83
+ fail("OP_FAILED", `operation '${op.id}' failed under 'fail' policy: ${outcome.error}`);
84
+ }
85
+ if (policy === "retry") {
86
+ // op-level retry Kind: Tuning は Runtime 所有・Conformance 非参加(§3.2)。retry は成功結果を
87
+ // 変えない(最終的に同じ結果へ収束)ため、持続失敗は fail と同じ最終伝播へ収束させる。
88
+ fail("OP_FAILED", `operation '${op.id}' failed under 'retry' policy (exhausted): ${outcome.error}`);
89
+ }
90
+ // policy === "continue": 失敗 op は Port 未生成 → §2 の Skip 伝播(下流を Skip)。
91
+ // この op 自体は未生成表現を result tree に置き、status=skipped(下流依存判定で未生成扱い)。
92
+ skippedIdx.push(i);
93
+ executedIdx.pop(); // 実行はしたが Port を生成しなかった → 未生成として扱う(executed から除外)
94
+ return { status: "skipped" };
95
+ }
96
+ /** 各 index がちょうど 1 stage に属し、全 op が被覆されることを検査(§1)。 */
97
+ function validateCoverage(stages, n) {
98
+ const seen = new Set();
99
+ for (const stage of stages) {
100
+ for (const i of stage) {
101
+ if (i < 0 || i >= n)
102
+ fail("INVALID_PLAN", `stage index ${i} out of range [0,${n})`);
103
+ if (seen.has(i))
104
+ fail("INVALID_PLAN", `operation ${i} appears in more than one stage`);
105
+ seen.add(i);
106
+ }
107
+ }
108
+ if (seen.size !== n)
109
+ fail("INVALID_PLAN", `plan does not cover all ${n} operations (covered ${seen.size})`);
110
+ }
111
+ /**
112
+ * finalTree — states を index→port の result tree(Φ 合流の観測形)へ整形する。
113
+ * ok → 値 / skipped → 未生成表現(single=null / connection=空 connection)。
114
+ * conformance vector はこの tree を期待値と byte 比較する(canonicalJson 経由)。
115
+ */
116
+ export function finalTree(states, ops) {
117
+ const tree = {};
118
+ states.forEach((s, i) => {
119
+ if (s.status === "ok")
120
+ tree[ops[i].id] = s.value;
121
+ else if (s.status === "skipped")
122
+ tree[ops[i].id] = unproducedValue(ops[i].relationKind);
123
+ // failed は runPlan が投げているのでここに到達しない。
124
+ });
125
+ return tree;
126
+ }
127
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AA4DA,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,IAAI,CAAkB;IACtB,YAAY,IAAqB,EAAE,OAAe;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,SAAS,IAAI,CAAC,IAAqB,EAAE,OAAe;IAClD,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAWD,kFAAkF;AAClF,SAAS,eAAe,CAAC,IAA8B;IACrD,OAAO,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,IAA8B,EAAE,GAAa,EAAE,IAAU;IAC/E,MAAM,MAAM,GAAc,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,oDAAoD;IACpD,MAAM,MAAM,GAAe,IAAI;QAC7B,CAAC,CAAC,IAAI,CAAC,MAAM;QACb,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhD,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAErC,wDAAwD;IACxD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,iDAAiD;QACjD,iEAAiE;QACjE,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,KAAK,WAAW,CAAC,CAAC,sCAAsC;QACxD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CACZ,CAAS,EACT,EAAU,EACV,MAAiB,EACjB,IAAU,EACV,WAAqB,EACrB,UAAoB;IAEpB,MAAM,MAAM,GAAe,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC;IAC/C,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,UAAU;QAClE,IAAI,CAAC,gBAAgB,EAAE,wBAAwB,MAAM,EAAE,CAAC,CAAC,CAAC,cAAc;IAE1E,2DAA2D;IAC3D,IAAI,UAAU,GAAsB,SAAS,CAAC;IAC9C,IAAI,EAAE,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QACjC,sCAAsC;QACtC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC/B,CAAC;QACD,uEAAuE;QACvE,IAAI,EAAE,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;YACxB,MAAM,KAAK,GACT,EAAE,KAAK,IAAI,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzD,CAAC,CAAE,EAA4B,CAAC,EAAE,CAAC,SAAS,CAAC;gBAC7C,CAAC,CAAC,SAAS,CAAC;YAChB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1C,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YAC/B,CAAC;YACD,UAAU,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACrC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpB,IAAI,IAAI,IAAI,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;IAEhE,oEAAoE;IACpE,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,gDAAgD;QAChD,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC,EAAE,iCAAiC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,8EAA8E;QAC9E,gDAAgD;QAChD,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC,EAAE,8CAA8C,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACtG,CAAC;IACD,oEAAoE;IACpE,gEAAgE;IAChE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,iDAAiD;IACpE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC;AAED,sDAAsD;AACtD,SAAS,gBAAgB,CAAC,MAAkB,EAAE,CAAS;IACrD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACpF,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,iCAAiC,CAAC,CAAC;YACvF,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,IAAI,CAAC,cAAc,EAAE,2BAA2B,CAAC,wBAAwB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;AAC9G,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,MAAiB,EAAE,GAAa;IACxD,MAAM,IAAI,GAA0B,EAAE,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;aAC5C,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QACxF,qCAAqC;IACvC,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * template.ts — template-rendering.md の参照実装(doc-grade, COMMON)。
3
+ *
4
+ * renderTemplate(template, params): `{param}` プレースホルダを束縛値で置換し文字列を返す。
5
+ * 対象は **`{param}`(ドットなし name)のみ**。`{result.*}` / `{item.*}` は別層(runPlan /
6
+ * Map 展開)が解決するため、core の renderTemplate は**それらを含む template を範囲外 Failure** とする
7
+ * (template-rendering.md §3.1-4 / runtime-boundary.md §4.1)。
8
+ *
9
+ * 規範ポイント(template-rendering.md §2/§3/§5):
10
+ * - プレースホルダ = /\{([^{}]+)\}/(空 name 不可・ブレース内不可)。エスケープ非対応。
11
+ * - 単一パス・左から右・重ならない置換。置換結果中の {...} は再処理しない。
12
+ * - strict missing-key: 未束縛 param は Failure(空文字化しない)。
13
+ * - null param は Failure(present = key in params && value !== null)。
14
+ * - stringify は Python str(value) を規範: bool → True/False, float → pyFloatRepr。
15
+ */
16
+ import type { Value } from "./expr-eval.js";
17
+ export type TemplateFailureCode = "UNBOUND_PARAM" | "RESULT_SCOPE_IN_CORE" | "INVALID_STRINGIFY";
18
+ export declare class TemplateFailure extends Error {
19
+ code: TemplateFailureCode;
20
+ constructor(code: TemplateFailureCode, message: string);
21
+ }
22
+ /**
23
+ * renderTemplate — `{param}` 描画(strict)。
24
+ *
25
+ * @param template `{name}` を 0 個以上含む文字列。
26
+ * @param params name → 値の束縛。
27
+ */
28
+ export declare function renderTemplate(template: string, params: Record<string, Value>): string;
29
+ /**
30
+ * resolvePartial — explain/dry-run 用(template-rendering.md §3.3)。
31
+ * `{param}` を置換し、`{result.*}` はそのまま残し、未束縛 param もエラーにせず残す。
32
+ * strict 版とは別 API(conformance は strict 版が主対象だが、partial の分離も規範)。
33
+ */
34
+ export declare function resolvePartial(template: string, params: Record<string, Value>): string;
35
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAG5C,MAAM,MAAM,mBAAmB,GAC3B,eAAe,GACf,sBAAsB,GACtB,mBAAmB,CAAC;AAExB,qBAAa,eAAgB,SAAQ,KAAK;IACxC,IAAI,EAAE,mBAAmB,CAAC;gBACd,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM;CAKvD;AASD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,CAgBtF;AAgBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,CAMtF"}
@@ -0,0 +1,66 @@
1
+ import { pyFloatRepr } from "./canonical.js";
2
+ export class TemplateFailure extends Error {
3
+ code;
4
+ constructor(code, message) {
5
+ super(message);
6
+ this.code = code;
7
+ this.name = "TemplateFailure";
8
+ }
9
+ }
10
+ function fail(code, message) {
11
+ throw new TemplateFailure(code, message);
12
+ }
13
+ // template-rendering.md §2: 正規 `\{([^{}]+)\}`。name は 1 文字以上・ブレース非包含。
14
+ const PLACEHOLDER = /\{([^{}]+)\}/g;
15
+ /**
16
+ * renderTemplate — `{param}` 描画(strict)。
17
+ *
18
+ * @param template `{name}` を 0 個以上含む文字列。
19
+ * @param params name → 値の束縛。
20
+ */
21
+ export function renderTemplate(template, params) {
22
+ // 単一パス・左から右。re.sub 相当(重ならない・再帰置換なし)。
23
+ return template.replace(PLACEHOLDER, (_match, name) => {
24
+ // §3/§4: result.*/item.* は core の解決対象外。誤って param として解決してはならない。
25
+ if (name.startsWith("result.") || name.startsWith("item.")) {
26
+ fail("RESULT_SCOPE_IN_CORE", `template references '{${name}}' which is resolved by a different layer (runPlan/Map), not core renderTemplate`);
27
+ }
28
+ // strict missing-key + null → Failure(present = key in params && value !== null)。
29
+ if (!Object.prototype.hasOwnProperty.call(params, name) || params[name] === null) {
30
+ fail("UNBOUND_PARAM", `template '${template}' references unbound parameter '${name}'`);
31
+ }
32
+ return stringify(params[name]);
33
+ });
34
+ }
35
+ /**
36
+ * stringify — param 値を文字列化。cross-language parity SSoT = Python str(value)。
37
+ * template-rendering.md §3.2:
38
+ * string → そのまま / bool → True/False(Python 表記)/ int → 10 進 / float → pyFloatRepr。
39
+ * null は §3.1 で Failure 済みのため到達しない。arr/obj は key template には不正。
40
+ */
41
+ function stringify(v) {
42
+ if (typeof v === "string")
43
+ return v;
44
+ if (typeof v === "boolean")
45
+ return v ? "True" : "False"; // 罠: JSON の true/false ではない
46
+ if (typeof v === "bigint")
47
+ return v.toString();
48
+ if (typeof v === "number")
49
+ return pyFloatRepr(v); // 罠: ryu/native 素通しではなく CPython repr
50
+ fail("INVALID_STRINGIFY", `cannot stringify ${v === null ? "null" : Array.isArray(v) ? "arr" : "obj"} into a template`);
51
+ }
52
+ /**
53
+ * resolvePartial — explain/dry-run 用(template-rendering.md §3.3)。
54
+ * `{param}` を置換し、`{result.*}` はそのまま残し、未束縛 param もエラーにせず残す。
55
+ * strict 版とは別 API(conformance は strict 版が主対象だが、partial の分離も規範)。
56
+ */
57
+ export function resolvePartial(template, params) {
58
+ return template.replace(PLACEHOLDER, (match, name) => {
59
+ if (name.startsWith("result.") || name.startsWith("item."))
60
+ return match; // 別層に残す
61
+ if (!Object.prototype.hasOwnProperty.call(params, name) || params[name] === null)
62
+ return match;
63
+ return stringify(params[name]);
64
+ });
65
+ }
66
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAO7C,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,IAAI,CAAsB;IAC1B,YAAY,IAAyB,EAAE,OAAe;QACpD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,SAAS,IAAI,CAAC,IAAyB,EAAE,OAAe;IACtD,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,qEAAqE;AACrE,MAAM,WAAW,GAAG,eAAe,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,MAA6B;IAC5E,qCAAqC;IACrC,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,IAAY,EAAE,EAAE;QAC5D,+DAA+D;QAC/D,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3D,IAAI,CACF,sBAAsB,EACtB,yBAAyB,IAAI,kFAAkF,CAChH,CAAC;QACJ,CAAC;QACD,kFAAkF;QAClF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACjF,IAAI,CAAC,eAAe,EAAE,aAAa,QAAQ,mCAAmC,IAAI,GAAG,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,CAAQ;IACzB,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,4BAA4B;IACrF,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/C,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,qCAAqC;IACvF,IAAI,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC;AAC1H,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,MAA6B;IAC5E,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC3D,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,QAAQ;QAClF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAC/F,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "behavior-contracts",
3
+ "version": "0.1.0",
4
+ "description": "Language-agnostic runtime core for behavior contracts (dsl-contracts): validateEnvelope / evaluateExpression / renderTemplate / runPlan / canonical serialization. Single source of truth for the shared DSL runtime primitives.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "README.md",
11
+ "LICENSE"
12
+ ],
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ }
18
+ },
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json && node scripts/fix-dts-extensions.mjs",
21
+ "clean": "rm -rf dist",
22
+ "test": "node --disable-warning=ExperimentalWarning --test \"test/*.test.ts\"",
23
+ "conformance": "node --disable-warning=ExperimentalWarning --test \"test/conformance.test.ts\"",
24
+ "typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json"
25
+ },
26
+ "specVersions": {
27
+ "expression": 1,
28
+ "template": 1,
29
+ "plan": 1,
30
+ "canonical": 1,
31
+ "envelope": "1.1"
32
+ },
33
+ "keywords": [
34
+ "dsl-contracts",
35
+ "behavior-contracts",
36
+ "runtime",
37
+ "ir",
38
+ "expression",
39
+ "canonical",
40
+ "conformance"
41
+ ],
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "git+https://github.com/foo-ogawa/dsl-contracts.git",
45
+ "directory": "ts"
46
+ },
47
+ "homepage": "https://github.com/foo-ogawa/dsl-contracts/tree/main/ts#readme",
48
+ "bugs": {
49
+ "url": "https://github.com/foo-ogawa/dsl-contracts/issues"
50
+ },
51
+ "devDependencies": {
52
+ "typescript": "^6.0.0"
53
+ },
54
+ "engines": {
55
+ "node": ">=22"
56
+ },
57
+ "license": "MIT",
58
+ "publishConfig": {
59
+ "access": "public"
60
+ },
61
+ "sideEffects": false
62
+ }