@llm4ts/core 2.13.1 → 2.15.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.
@@ -0,0 +1,48 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Result from "effect/Result";
3
+ import * as Schema from "effect/Schema";
4
+ /**
5
+ * Facts on a blackboard (ADR 0020). A key names a fact and carries its
6
+ * schema; the board holds facts in their encoded JSON form, so it persists
7
+ * as-is and a read decodes through the key's schema instead of asserting a
8
+ * type. A key is written once per run: an equal rewrite is a no-op, a
9
+ * different one is a `DuplicateFact`.
10
+ */
11
+ export interface Fact {
12
+ readonly key: string;
13
+ /** The value in the key's encoded form; a value typed `A` cannot fail to encode. */
14
+ readonly encoded: Effect.Effect<Schema.Json>;
15
+ }
16
+ export interface FactKey<A> {
17
+ readonly name: string;
18
+ of(value: A): Fact;
19
+ /** Decode a stored value; the board only holds what a key encoded, so a failure is a defect. */
20
+ readonly read: (encoded: unknown) => Effect.Effect<A>;
21
+ }
22
+ export declare const makeKey: <A, I>(name: string, schema: Schema.Codec<A, I>) => FactKey<A>;
23
+ declare const MissingFact_base: Schema.Class<MissingFact, Schema.TaggedStruct<"MissingFact", {
24
+ readonly key: Schema.String;
25
+ }>, import("effect/Cause").YieldableError>;
26
+ export declare class MissingFact extends MissingFact_base {
27
+ get message(): string;
28
+ }
29
+ declare const DuplicateFact_base: Schema.Class<DuplicateFact, Schema.TaggedStruct<"DuplicateFact", {
30
+ readonly key: Schema.String;
31
+ }>, import("effect/Cause").YieldableError>;
32
+ export declare class DuplicateFact extends DuplicateFact_base {
33
+ get message(): string;
34
+ }
35
+ declare const Board_base: Schema.Class<Board, Schema.Struct<{
36
+ readonly facts: Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>;
37
+ }>, {}>;
38
+ export declare class Board extends Board_base {
39
+ static readonly empty: Board;
40
+ has(name: string): boolean;
41
+ get<A>(key: FactKey<A>): Effect.Effect<A, MissingFact>;
42
+ }
43
+ /** Structural JSON equality: arrays ordered, object keys not. */
44
+ export declare const sameJson: (a: Schema.Json, b: Schema.Json) => boolean;
45
+ /** The board after a write: unchanged for an equal rewrite, extended for a new key. */
46
+ export declare const writeOnce: (facts: ReadonlyMap<string, Schema.Json>, key: string, value: Schema.Json) => Result.Result<ReadonlyMap<string, Schema.Json>, DuplicateFact>;
47
+ export {};
48
+ //# sourceMappingURL=Fact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Fact.d.ts","sourceRoot":"","sources":["../../src/blackboard/Fact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;GAMG;AAEH,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,oFAAoF;IACpF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;CAC7C;AAED,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IAClB,gGAAgG;IAChG,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;CACtD;AAED,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,CAAC,EAAE,MAAM,MAAM,EAAE,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAYjF,CAAA;;;;AAED,qBAAa,WAAY,SAAQ,gBAE/B;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED,qBAAa,aAAc,SAAQ,kBAEjC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED,qBAAa,KAAM,SAAQ,UAEzB;IACA,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAA4B;IAExD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC;CAKvD;AAKD,iEAAiE;AACjE,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,KAAG,OAczD,CAAA;AAED,uFAAuF;AACvF,eAAO,MAAM,SAAS,GACpB,OAAO,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EACvC,KAAK,MAAM,EACX,OAAO,MAAM,CAAC,IAAI,KACjB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,aAAa,CAO/D,CAAA"}
@@ -0,0 +1,69 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Result from "effect/Result";
3
+ import * as Schema from "effect/Schema";
4
+ export const makeKey = (name, schema) => {
5
+ const encode = Schema.encodeEffect(schema);
6
+ const decode = Schema.decodeUnknownEffect(schema);
7
+ const json = Schema.decodeUnknownEffect(Schema.Json);
8
+ return {
9
+ name,
10
+ of: (value) => ({
11
+ key: name,
12
+ encoded: encode(value).pipe(Effect.flatMap(json), Effect.orDie)
13
+ }),
14
+ read: (encoded) => decode(encoded).pipe(Effect.orDie)
15
+ };
16
+ };
17
+ export class MissingFact extends Schema.TaggedError()("MissingFact", {
18
+ key: Schema.String
19
+ }) {
20
+ get message() {
21
+ return `fact "${this.key}" is not on the board`;
22
+ }
23
+ }
24
+ export class DuplicateFact extends Schema.TaggedError()("DuplicateFact", {
25
+ key: Schema.String
26
+ }) {
27
+ get message() {
28
+ return `fact "${this.key}" was posted twice with different values`;
29
+ }
30
+ }
31
+ export class Board extends Schema.Class("Board")({
32
+ facts: Schema.Record(Schema.String, Schema.Json)
33
+ }) {
34
+ static empty = Board.make({ facts: {} });
35
+ has(name) {
36
+ return Object.hasOwn(this.facts, name);
37
+ }
38
+ get(key) {
39
+ return this.has(key.name)
40
+ ? key.read(this.facts[key.name])
41
+ : Effect.fail(MissingFact.make({ key: key.name }));
42
+ }
43
+ }
44
+ const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
45
+ /** Structural JSON equality: arrays ordered, object keys not. */
46
+ export const sameJson = (a, b) => {
47
+ if (a === b)
48
+ return true;
49
+ if (Array.isArray(a) && Array.isArray(b)) {
50
+ return a.length === b.length && a.every((item, index) => sameJson(item, b[index] ?? null));
51
+ }
52
+ if (isObject(a) && isObject(b)) {
53
+ const keysA = Object.keys(a);
54
+ const keysB = Object.keys(b);
55
+ return (keysA.length === keysB.length &&
56
+ keysA.every((key) => Object.hasOwn(b, key) && sameJson(a[key] ?? null, b[key] ?? null)));
57
+ }
58
+ return false;
59
+ };
60
+ /** The board after a write: unchanged for an equal rewrite, extended for a new key. */
61
+ export const writeOnce = (facts, key, value) => {
62
+ if (!facts.has(key)) {
63
+ return Result.succeed(new Map(facts).set(key, value));
64
+ }
65
+ return sameJson(facts.get(key) ?? null, value)
66
+ ? Result.succeed(facts)
67
+ : Result.fail(DuplicateFact.make({ key }));
68
+ };
69
+ //# sourceMappingURL=Fact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Fact.js","sourceRoot":"","sources":["../../src/blackboard/Fact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Option from "effect/Option";
3
+ import type * as Schema from "effect/Schema";
4
+ import { Judgment, type JudgmentBackendError, type JudgmentInput } from "../judgment/Judgment.ts";
5
+ import type { JudgmentResult } from "../judgment/Schemas.ts";
6
+ import type { Fact, FactKey } from "./Fact.ts";
7
+ /**
8
+ * Rules of a blackboard (ADR 0020). A condition names the keys it reads
9
+ * (what validation and pruning reason on) and evaluates to the typed value
10
+ * a consequence receives; a rule pairs a condition with a consequence that
11
+ * posts facts. Facts are write-once, so a rule fires at most once per run.
12
+ */
13
+ /** A snapshot of the board: encoded facts by key. */
14
+ export type Facts = ReadonlyMap<string, Schema.Json>;
15
+ export interface Condition<A> {
16
+ readonly keys: ReadonlyArray<string>;
17
+ /** None while a key is missing or a `when` predicate rejects the value. */
18
+ readonly evaluate: (facts: Facts) => Effect.Effect<Option.Option<A>>;
19
+ }
20
+ export declare const on: <A>(key: FactKey<A>) => Condition<A>;
21
+ /**
22
+ * Satisfied once every key is present; the value is the tuple of decoded
23
+ * values, in order. Typed by overload up to eight keys: one implementation
24
+ * over a loose tuple, so no assertion is needed to give each call its shape.
25
+ */
26
+ export declare function all<A>(k1: FactKey<A>): Condition<readonly [A]>;
27
+ export declare function all<A, B>(k1: FactKey<A>, k2: FactKey<B>): Condition<readonly [A, B]>;
28
+ export declare function all<A, B, C>(k1: FactKey<A>, k2: FactKey<B>, k3: FactKey<C>): Condition<readonly [A, B, C]>;
29
+ export declare function all<A, B, C, D>(k1: FactKey<A>, k2: FactKey<B>, k3: FactKey<C>, k4: FactKey<D>): Condition<readonly [A, B, C, D]>;
30
+ export declare function all<A, B, C, D, E>(k1: FactKey<A>, k2: FactKey<B>, k3: FactKey<C>, k4: FactKey<D>, k5: FactKey<E>): Condition<readonly [A, B, C, D, E]>;
31
+ export declare function all<A, B, C, D, E, F>(k1: FactKey<A>, k2: FactKey<B>, k3: FactKey<C>, k4: FactKey<D>, k5: FactKey<E>, k6: FactKey<F>): Condition<readonly [A, B, C, D, E, F]>;
32
+ export declare function all<A, B, C, D, E, F, G>(k1: FactKey<A>, k2: FactKey<B>, k3: FactKey<C>, k4: FactKey<D>, k5: FactKey<E>, k6: FactKey<F>, k7: FactKey<G>): Condition<readonly [A, B, C, D, E, F, G]>;
33
+ export declare function all<A, B, C, D, E, F, G, H>(k1: FactKey<A>, k2: FactKey<B>, k3: FactKey<C>, k4: FactKey<D>, k5: FactKey<E>, k6: FactKey<F>, k7: FactKey<G>, k8: FactKey<H>): Condition<readonly [A, B, C, D, E, F, G, H]>;
34
+ export declare const when: <A>(condition: Condition<A>, predicate: (value: A) => boolean) => Condition<A>;
35
+ export interface JudgmentNote {
36
+ readonly backend: string;
37
+ readonly identity: string;
38
+ }
39
+ export interface Posted {
40
+ readonly facts: ReadonlyArray<Fact>;
41
+ /** Set by `judge`: which backend and checkpoint answered, for the trace. */
42
+ readonly judgment?: JudgmentNote;
43
+ }
44
+ export type RuleKind = "derive" | "judge" | "rule";
45
+ export interface Rule<E = never, R = never> {
46
+ readonly name: string;
47
+ readonly kind: RuleKind;
48
+ readonly reads: ReadonlyArray<string>;
49
+ /** The keys this rule may post; posting another is an `UndeclaredFact`. */
50
+ readonly produces: ReadonlyArray<string>;
51
+ /** Posted instead when the consequence fails. */
52
+ readonly defaults: ReadonlyArray<Fact>;
53
+ /** Some(firing) when the condition is satisfied against the snapshot. */
54
+ readonly prepare: (facts: Facts) => Effect.Effect<Option.Option<Effect.Effect<Posted, E, R>>>;
55
+ }
56
+ export interface RuleOptions<A, E, R> {
57
+ readonly name: string;
58
+ readonly condition: Condition<A>;
59
+ readonly produces: ReadonlyArray<FactKey<unknown>>;
60
+ readonly consequence: (value: A) => Effect.Effect<ReadonlyArray<Fact>, E, R>;
61
+ readonly defaults?: ReadonlyArray<Fact>;
62
+ readonly kind?: RuleKind;
63
+ }
64
+ export declare const rule: <A, E, R>(options: RuleOptions<A, E, R>) => Rule<E, R>;
65
+ /** The general constructor other constructors build on: the firing may annotate the trace. */
66
+ export declare const makeRule: <A, E, R>(options: Omit<RuleOptions<A, E, R>, "consequence">, fire: (value: A) => Effect.Effect<Posted, E, R>) => Rule<E, R>;
67
+ export interface DeriveOptions<A> {
68
+ readonly name: string;
69
+ readonly condition: Condition<A>;
70
+ readonly produces: ReadonlyArray<FactKey<unknown>>;
71
+ readonly derive: (value: A) => ReadonlyArray<Fact>;
72
+ }
73
+ /** A pure, deterministic rule. */
74
+ export declare const derive: <A>(options: DeriveOptions<A>) => Rule;
75
+ export interface JudgeOptions<A> {
76
+ readonly name: string;
77
+ readonly condition: Condition<A>;
78
+ readonly produces: ReadonlyArray<FactKey<unknown>>;
79
+ /** The State and Questions for this firing; `state` is data, never instructions. */
80
+ readonly ask: (value: A) => JudgmentInput;
81
+ /**
82
+ * Facts from the typed result. Post the `Answer` itself (probability,
83
+ * support, origin), not a boolean read off it: deciding is another rule's
84
+ * job. Unanswered questions arrive in `result.failures`.
85
+ */
86
+ readonly post: (result: JudgmentResult, value: A) => ReadonlyArray<Fact>;
87
+ /** Posted when the backend itself is unreachable or rejects the request. */
88
+ readonly defaults?: ReadonlyArray<Fact>;
89
+ }
90
+ /** A rule that asks the Judgment service; its firing notes the backend and checkpoint for the trace. */
91
+ export declare const judge: <A>(options: JudgeOptions<A>) => Rule<JudgmentBackendError, Judgment>;
92
+ //# sourceMappingURL=Rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rule.d.ts","sourceRoot":"","sources":["../../src/blackboard/Rule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Option from "effect/Option";
3
+ import { Judgment } from "../judgment/Judgment.js";
4
+ export const on = (key) => ({
5
+ keys: [key.name],
6
+ evaluate: (facts) => facts.has(key.name)
7
+ ? Effect.map(key.read(facts.get(key.name)), Option.some)
8
+ : Effect.succeed(Option.none())
9
+ });
10
+ export function all(...keys) {
11
+ return {
12
+ keys: keys.map((key) => key.name),
13
+ evaluate: (facts) => keys.every((key) => facts.has(key.name))
14
+ ? Effect.map(Effect.forEach(keys, (key) => key.read(facts.get(key.name))), (values) => Option.some(values))
15
+ : Effect.succeed(Option.none())
16
+ };
17
+ }
18
+ export const when = (condition, predicate) => ({
19
+ keys: condition.keys,
20
+ evaluate: (facts) => Effect.map(condition.evaluate(facts), (value) => Option.isSome(value) && predicate(value.value) ? value : Option.none())
21
+ });
22
+ export const rule = (options) => makeRule(options, (value) => Effect.map(options.consequence(value), (facts) => ({ facts })));
23
+ /** The general constructor other constructors build on: the firing may annotate the trace. */
24
+ export const makeRule = (options, fire) => ({
25
+ name: options.name,
26
+ kind: options.kind ?? "rule",
27
+ reads: options.condition.keys,
28
+ produces: options.produces.map((key) => key.name),
29
+ defaults: options.defaults ?? [],
30
+ prepare: (facts) => Effect.map(options.condition.evaluate(facts), (value) => Option.isSome(value) ? Option.some(fire(value.value)) : Option.none())
31
+ });
32
+ /** A pure, deterministic rule. */
33
+ export const derive = (options) => makeRule({ ...options, kind: "derive" }, (value) => Effect.succeed({ facts: options.derive(value) }));
34
+ /** A rule that asks the Judgment service; its firing notes the backend and checkpoint for the trace. */
35
+ export const judge = (options) => makeRule({ ...options, kind: "judge" }, (value) => Effect.gen(function* () {
36
+ const judgment = yield* Judgment;
37
+ const result = yield* judgment.judge(options.ask(value));
38
+ return {
39
+ facts: options.post(result, value),
40
+ judgment: { backend: judgment.backend, identity: judgment.identity }
41
+ };
42
+ }));
43
+ //# sourceMappingURL=Rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rule.js","sourceRoot":"","sources":["../../src/blackboard/Rule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schema from "effect/Schema";
3
+ import type { FactKey } from "./Fact.ts";
4
+ import type { Rule } from "./Rule.ts";
5
+ /**
6
+ * A ruleset (ADR 0020) is validated when it is built, not when it runs:
7
+ * every read is imported or produced, every export is produced, one
8
+ * producer per key, no constant or self-matching rule. Rules that cannot
9
+ * reach an export are pruned with a warning, so a company's ruleset never
10
+ * pays for a judgment nothing depends on. A valid ruleset is a value that
11
+ * runs many times.
12
+ */
13
+ export declare const Problem: Schema.Union<readonly [Schema.Struct<{
14
+ readonly kind: Schema.Literal<"UnproducedMatch">;
15
+ readonly rule: Schema.String;
16
+ readonly key: Schema.String;
17
+ }>, Schema.Struct<{
18
+ readonly kind: Schema.Literal<"UnproducedExport">;
19
+ readonly key: Schema.String;
20
+ }>, Schema.Struct<{
21
+ readonly kind: Schema.Literal<"ManyProducers">;
22
+ readonly key: Schema.String;
23
+ readonly rules: Schema.$Array<Schema.String>;
24
+ }>, Schema.Struct<{
25
+ readonly kind: Schema.Literal<"EmptyCondition">;
26
+ readonly rule: Schema.String;
27
+ }>, Schema.Struct<{
28
+ readonly kind: Schema.Literal<"SelfMatch">;
29
+ readonly rule: Schema.String;
30
+ readonly key: Schema.String;
31
+ }>, Schema.Struct<{
32
+ readonly kind: Schema.Literal<"DuplicateRuleName">;
33
+ readonly rule: Schema.String;
34
+ }>, Schema.Struct<{
35
+ readonly kind: Schema.Literal<"UnusedImport">;
36
+ readonly key: Schema.String;
37
+ }>, Schema.Struct<{
38
+ readonly kind: Schema.Literal<"Unreachable">;
39
+ readonly rule: Schema.String;
40
+ }>]>;
41
+ export type Problem = typeof Problem.Type;
42
+ export declare const isWarning: (problem: Problem) => boolean;
43
+ export declare const renderProblem: (problem: Problem) => string;
44
+ declare const RulesetInvalid_base: Schema.Class<RulesetInvalid, Schema.TaggedStruct<"RulesetInvalid", {
45
+ readonly name: Schema.String;
46
+ readonly problems: Schema.$Array<Schema.Union<readonly [Schema.Struct<{
47
+ readonly kind: Schema.Literal<"UnproducedMatch">;
48
+ readonly rule: Schema.String;
49
+ readonly key: Schema.String;
50
+ }>, Schema.Struct<{
51
+ readonly kind: Schema.Literal<"UnproducedExport">;
52
+ readonly key: Schema.String;
53
+ }>, Schema.Struct<{
54
+ readonly kind: Schema.Literal<"ManyProducers">;
55
+ readonly key: Schema.String;
56
+ readonly rules: Schema.$Array<Schema.String>;
57
+ }>, Schema.Struct<{
58
+ readonly kind: Schema.Literal<"EmptyCondition">;
59
+ readonly rule: Schema.String;
60
+ }>, Schema.Struct<{
61
+ readonly kind: Schema.Literal<"SelfMatch">;
62
+ readonly rule: Schema.String;
63
+ readonly key: Schema.String;
64
+ }>, Schema.Struct<{
65
+ readonly kind: Schema.Literal<"DuplicateRuleName">;
66
+ readonly rule: Schema.String;
67
+ }>, Schema.Struct<{
68
+ readonly kind: Schema.Literal<"UnusedImport">;
69
+ readonly key: Schema.String;
70
+ }>, Schema.Struct<{
71
+ readonly kind: Schema.Literal<"Unreachable">;
72
+ readonly rule: Schema.String;
73
+ }>]>>;
74
+ }>, import("effect/Cause").YieldableError>;
75
+ export declare class RulesetInvalid extends RulesetInvalid_base {
76
+ get message(): string;
77
+ }
78
+ export interface RulesetOptions<Rs extends ReadonlyArray<Rule<unknown, unknown>>> {
79
+ readonly name: string;
80
+ readonly imports: ReadonlyArray<FactKey<unknown>>;
81
+ readonly exports: ReadonlyArray<FactKey<unknown>>;
82
+ readonly rules: Rs;
83
+ }
84
+ /** The union of the rules' error types, so a `judge` and a custom-error `rule` mix freely. */
85
+ export type ErrorOf<Rs extends ReadonlyArray<Rule<unknown, unknown>>> = Rs[number] extends Rule<infer E, unknown> ? E : never;
86
+ /** The union of the services the rules need. */
87
+ export type RequirementsOf<Rs extends ReadonlyArray<Rule<unknown, unknown>>> = Rs[number] extends Rule<unknown, infer R> ? R : never;
88
+ export interface Ruleset<E = never, R = never> {
89
+ readonly name: string;
90
+ readonly imports: ReadonlyArray<string>;
91
+ readonly exports: ReadonlyArray<string>;
92
+ /** The rules that can reach an export, in the order given. */
93
+ readonly rules: ReadonlyArray<Rule<E, R>>;
94
+ readonly warnings: ReadonlyArray<Problem>;
95
+ /** One line per rule: `name: reads -> produces`. */
96
+ describe(): string;
97
+ /** A Mermaid `flowchart LR` of keys and rules. */
98
+ mermaid(): string;
99
+ }
100
+ /**
101
+ * Typed by overload: the ruleset's error and service types are the unions
102
+ * over its rules, so a `judge` and a custom-error `rule` mix in one array.
103
+ * The implementation only needs names, so it works over loose rules.
104
+ */
105
+ export declare function makeRuleset<const Rs extends ReadonlyArray<Rule<unknown, unknown>>>(options: RulesetOptions<Rs>): Effect.Effect<Ruleset<ErrorOf<Rs>, RequirementsOf<Rs>>, RulesetInvalid>;
106
+ export {};
107
+ //# sourceMappingURL=Ruleset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Ruleset.d.ts","sourceRoot":"","sources":["../../src/blackboard/Ruleset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC;;;;;;;GAOG;AAEH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiBlB,CAAA;AACF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,SAAS,GAAI,SAAS,OAAO,KAAG,OAAyC,CAAA;AAEtF,eAAO,MAAM,aAAa,GAAI,SAAS,OAAO,KAAG,MAmBhD,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAED,qBAAa,cAAe,SAAQ,mBAGlC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;AAED,MAAM,WAAW,cAAc,CAAC,EAAE,SAAS,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IACjD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IACjD,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAA;CACnB;AAED,8FAA8F;AAC9F,MAAM,MAAM,OAAO,CAAC,EAAE,SAAS,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAClE,EAAE,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAEvD,gDAAgD;AAChD,MAAM,MAAM,cAAc,CAAC,EAAE,SAAS,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IACzE,EAAE,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAEvD,MAAM,WAAW,OAAO,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACvC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACzC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IACzC,oDAAoD;IACpD,QAAQ,IAAI,MAAM,CAAA;IAClB,kDAAkD;IAClD,OAAO,IAAI,MAAM,CAAA;CAClB;AAqDD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,SAAS,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAChF,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC,GAC1B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA"}
@@ -0,0 +1,167 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schema from "effect/Schema";
3
+ /**
4
+ * A ruleset (ADR 0020) is validated when it is built, not when it runs:
5
+ * every read is imported or produced, every export is produced, one
6
+ * producer per key, no constant or self-matching rule. Rules that cannot
7
+ * reach an export are pruned with a warning, so a company's ruleset never
8
+ * pays for a judgment nothing depends on. A valid ruleset is a value that
9
+ * runs many times.
10
+ */
11
+ export const Problem = Schema.Union([
12
+ Schema.Struct({
13
+ kind: Schema.Literal("UnproducedMatch"),
14
+ rule: Schema.String,
15
+ key: Schema.String
16
+ }),
17
+ Schema.Struct({ kind: Schema.Literal("UnproducedExport"), key: Schema.String }),
18
+ Schema.Struct({
19
+ kind: Schema.Literal("ManyProducers"),
20
+ key: Schema.String,
21
+ rules: Schema.Array(Schema.String)
22
+ }),
23
+ Schema.Struct({ kind: Schema.Literal("EmptyCondition"), rule: Schema.String }),
24
+ Schema.Struct({ kind: Schema.Literal("SelfMatch"), rule: Schema.String, key: Schema.String }),
25
+ Schema.Struct({ kind: Schema.Literal("DuplicateRuleName"), rule: Schema.String }),
26
+ Schema.Struct({ kind: Schema.Literal("UnusedImport"), key: Schema.String }),
27
+ Schema.Struct({ kind: Schema.Literal("Unreachable"), rule: Schema.String })
28
+ ]);
29
+ const warningKinds = new Set(["UnusedImport", "Unreachable"]);
30
+ export const isWarning = (problem) => warningKinds.has(problem.kind);
31
+ export const renderProblem = (problem) => {
32
+ switch (problem.kind) {
33
+ case "UnproducedMatch":
34
+ return `rule ${problem.rule} reads "${problem.key}", which nothing imports or produces`;
35
+ case "UnproducedExport":
36
+ return `export "${problem.key}" is produced by no rule`;
37
+ case "ManyProducers":
38
+ return `"${problem.key}" has several producers: ${problem.rules.join(", ")}`;
39
+ case "EmptyCondition":
40
+ return `rule ${problem.rule} reads nothing`;
41
+ case "SelfMatch":
42
+ return `rule ${problem.rule} reads "${problem.key}", which it produces`;
43
+ case "DuplicateRuleName":
44
+ return `two rules are named ${problem.rule}`;
45
+ case "UnusedImport":
46
+ return `import "${problem.key}" is read by no rule`;
47
+ case "Unreachable":
48
+ return `rule ${problem.rule} reaches no export and is not run`;
49
+ }
50
+ };
51
+ export class RulesetInvalid extends Schema.TaggedError()("RulesetInvalid", {
52
+ name: Schema.String,
53
+ problems: Schema.Array(Problem)
54
+ }) {
55
+ get message() {
56
+ return `ruleset "${this.name}" is invalid: ${this.problems.map(renderProblem).join("; ")}`;
57
+ }
58
+ }
59
+ const producersByKey = (imports, rules) => {
60
+ const producers = new Map();
61
+ for (const key of imports)
62
+ producers.set(key, ["(import)"]);
63
+ for (const rule of rules) {
64
+ for (const key of rule.produces) {
65
+ producers.set(key, [...(producers.get(key) ?? []), rule.name]);
66
+ }
67
+ }
68
+ return producers;
69
+ };
70
+ /** Rules whose products can reach an export, following reads backwards from the exports. */
71
+ const reachable = (exports, rules) => {
72
+ const needed = new Set(exports);
73
+ const kept = new Set();
74
+ let grew = true;
75
+ while (grew) {
76
+ grew = false;
77
+ for (const rule of rules) {
78
+ if (kept.has(rule.name) || !rule.produces.some((key) => needed.has(key)))
79
+ continue;
80
+ kept.add(rule.name);
81
+ for (const key of rule.reads)
82
+ needed.add(key);
83
+ grew = true;
84
+ }
85
+ }
86
+ return kept;
87
+ };
88
+ const escapeLabel = (label) => label.replaceAll('"', "'");
89
+ const renderMermaid = (name, rules) => {
90
+ const keys = [...new Set(rules.flatMap((rule) => [...rule.reads, ...rule.produces]))];
91
+ const keyId = new Map(keys.map((key, index) => [key, `k${index}`]));
92
+ const ruleId = new Map(rules.map((rule, index) => [rule.name, `r${index}`]));
93
+ const nodes = [
94
+ ...keys.map((key) => ` ${keyId.get(key)}(["${escapeLabel(key)}"])`),
95
+ ...rules.map((rule) => ` ${ruleId.get(rule.name)}["${escapeLabel(rule.name)}"]`)
96
+ ];
97
+ const edges = rules.flatMap((rule) => [
98
+ ...rule.reads.map((key) => ` ${keyId.get(key)} --> ${ruleId.get(rule.name)}`),
99
+ ...rule.produces.map((key) => ` ${ruleId.get(rule.name)} --> ${keyId.get(key)}`)
100
+ ]);
101
+ return ["flowchart LR", ` %% ${escapeLabel(name)}`, ...nodes, ...edges].join("\n");
102
+ };
103
+ export function makeRuleset(options) {
104
+ const given = options.rules;
105
+ const imports = options.imports.map((key) => key.name);
106
+ const exports = options.exports.map((key) => key.name);
107
+ const problems = [];
108
+ const seen = new Set();
109
+ for (const rule of given) {
110
+ if (seen.has(rule.name))
111
+ problems.push({ kind: "DuplicateRuleName", rule: rule.name });
112
+ seen.add(rule.name);
113
+ if (rule.reads.length === 0)
114
+ problems.push({ kind: "EmptyCondition", rule: rule.name });
115
+ for (const key of rule.reads) {
116
+ if (rule.produces.includes(key))
117
+ problems.push({ kind: "SelfMatch", rule: rule.name, key });
118
+ }
119
+ }
120
+ const producers = producersByKey(imports, given);
121
+ for (const [key, names] of producers) {
122
+ if (names.length > 1)
123
+ problems.push({ kind: "ManyProducers", key, rules: names });
124
+ }
125
+ for (const rule of given) {
126
+ for (const key of rule.reads) {
127
+ if (!producers.has(key))
128
+ problems.push({ kind: "UnproducedMatch", rule: rule.name, key });
129
+ }
130
+ }
131
+ for (const key of exports) {
132
+ if (!producers.has(key))
133
+ problems.push({ kind: "UnproducedExport", key });
134
+ }
135
+ if (problems.length > 0) {
136
+ return Effect.fail(RulesetInvalid.make({ name: options.name, problems }));
137
+ }
138
+ const warnings = [];
139
+ const kept = reachable(exports, given);
140
+ for (const rule of given) {
141
+ if (!kept.has(rule.name))
142
+ warnings.push({ kind: "Unreachable", rule: rule.name });
143
+ }
144
+ const rules = given.filter((rule) => kept.has(rule.name));
145
+ // An import only pruned rules read is unused too: nothing that runs needs it.
146
+ const read = new Set(rules.flatMap((rule) => rule.reads));
147
+ for (const key of imports) {
148
+ if (!read.has(key))
149
+ warnings.push({ kind: "UnusedImport", key });
150
+ }
151
+ return Effect.succeed({
152
+ name: options.name,
153
+ imports,
154
+ exports,
155
+ rules,
156
+ warnings,
157
+ describe: () => [
158
+ `ruleset ${options.name}`,
159
+ `imports: ${imports.join(", ")}`,
160
+ `exports: ${exports.join(", ")}`,
161
+ ...rules.map((rule) => `${rule.name}: ${rule.reads.join(", ")} -> ${rule.produces.join(", ")}`),
162
+ ...warnings.map((warning) => `warning: ${renderProblem(warning)}`)
163
+ ].join("\n"),
164
+ mermaid: () => renderMermaid(options.name, rules)
165
+ });
166
+ }
167
+ //# sourceMappingURL=Ruleset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Ruleset.js","sourceRoot":"","sources":["../../src/blackboard/Ruleset.ts"],"names":[],"mappings":"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"}