@higher.archi/boe 1.0.12 → 1.0.15

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 (37) hide show
  1. package/dist/abtesting/hash.d.ts +6 -0
  2. package/dist/abtesting/hash.d.ts.map +1 -0
  3. package/dist/abtesting/hash.js +16 -0
  4. package/dist/abtesting/hash.js.map +1 -0
  5. package/dist/abtesting/index.d.ts +4 -0
  6. package/dist/abtesting/index.d.ts.map +1 -0
  7. package/dist/abtesting/index.js +10 -0
  8. package/dist/abtesting/index.js.map +1 -0
  9. package/dist/abtesting/resolver.d.ts +28 -0
  10. package/dist/abtesting/resolver.d.ts.map +1 -0
  11. package/dist/abtesting/resolver.js +76 -0
  12. package/dist/abtesting/resolver.js.map +1 -0
  13. package/dist/abtesting/types.d.ts +57 -0
  14. package/dist/abtesting/types.d.ts.map +1 -0
  15. package/dist/abtesting/types.js +10 -0
  16. package/dist/abtesting/types.js.map +1 -0
  17. package/dist/engines/expert/index.d.ts +1 -1
  18. package/dist/engines/expert/index.d.ts.map +1 -1
  19. package/dist/engines/expert/index.js.map +1 -1
  20. package/dist/engines/expert/strategy.d.ts.map +1 -1
  21. package/dist/engines/expert/strategy.js +24 -0
  22. package/dist/engines/expert/strategy.js.map +1 -1
  23. package/dist/engines/expert/types.d.ts +67 -0
  24. package/dist/engines/expert/types.d.ts.map +1 -1
  25. package/dist/index.d.ts +2 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +4 -0
  28. package/dist/index.js.map +1 -1
  29. package/package.json +1 -1
  30. package/src/abtesting/hash.ts +12 -0
  31. package/src/abtesting/index.ts +8 -0
  32. package/src/abtesting/resolver.ts +86 -0
  33. package/src/abtesting/types.ts +66 -0
  34. package/src/engines/expert/index.ts +3 -1
  35. package/src/engines/expert/strategy.ts +28 -1
  36. package/src/engines/expert/types.ts +73 -0
  37. package/src/index.ts +8 -0
@@ -0,0 +1,6 @@
1
+ /**
2
+ * FNV-1a 32-bit hash. Pure JS, zero dependencies, browser-safe.
3
+ * Returns a float in [0.0, 1.0) for deterministic bucket resolution.
4
+ */
5
+ export declare function fnv1a(input: string): number;
6
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/abtesting/hash.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO3C"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fnv1a = fnv1a;
4
+ /**
5
+ * FNV-1a 32-bit hash. Pure JS, zero dependencies, browser-safe.
6
+ * Returns a float in [0.0, 1.0) for deterministic bucket resolution.
7
+ */
8
+ function fnv1a(input) {
9
+ let hash = 0x811c9dc5; // FNV offset basis
10
+ for (let i = 0; i < input.length; i++) {
11
+ hash ^= input.charCodeAt(i);
12
+ hash = Math.imul(hash, 0x01000193); // FNV prime
13
+ }
14
+ return (hash >>> 0) / 0x100000000;
15
+ }
16
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/abtesting/hash.ts"],"names":[],"mappings":";;AAIA,sBAOC;AAXD;;;GAGG;AACH,SAAgB,KAAK,CAAC,KAAa;IACjC,IAAI,IAAI,GAAG,UAAU,CAAC,CAAC,mBAAmB;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY;IAClD,CAAC;IACD,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,WAAW,CAAC;AACpC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type { ABVariant, ABTestConfig, ResolvedVariant } from './types';
2
+ export { resolveVariant } from './resolver';
3
+ export { fnv1a } from './hash';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/abtesting/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGxE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fnv1a = exports.resolveVariant = void 0;
4
+ // Core resolver
5
+ var resolver_1 = require("./resolver");
6
+ Object.defineProperty(exports, "resolveVariant", { enumerable: true, get: function () { return resolver_1.resolveVariant; } });
7
+ // Hash (exported for advanced use / testing)
8
+ var hash_1 = require("./hash");
9
+ Object.defineProperty(exports, "fnv1a", { enumerable: true, get: function () { return hash_1.fnv1a; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/abtesting/index.ts"],"names":[],"mappings":";;;AAGA,gBAAgB;AAChB,uCAA4C;AAAnC,0GAAA,cAAc,OAAA;AAEvB,6CAA6C;AAC7C,+BAA+B;AAAtB,6FAAA,KAAK,OAAA"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * A/B Test Variant Resolver
3
+ *
4
+ * Deterministic: the same entityId + testId always resolves to the same variant.
5
+ * Engine-agnostic: works with any compiled ruleset type.
6
+ */
7
+ import type { ABTestConfig, ResolvedVariant } from './types';
8
+ /**
9
+ * Resolves an entity to a variant. Deterministic: same entityId + testId
10
+ * always returns the same variant.
11
+ *
12
+ * The hash key includes testId so the same entity can be independently
13
+ * bucketed across concurrent tests.
14
+ *
15
+ * @typeParam T - The compiled ruleset type
16
+ * @param config - The A/B test configuration with variants and weights
17
+ * @param entityId - The entity identifier to bucket (user ID, account ID, etc.)
18
+ * @returns The resolved variant with its compiled ruleset
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const { variantId, ruleset } = resolveVariant(test, applicationId);
23
+ * const engine = new ScoringEngine(ruleset);
24
+ * const result = engine.execute(facts);
25
+ * ```
26
+ */
27
+ export declare function resolveVariant<T>(config: ABTestConfig<T>, entityId: string): ResolvedVariant<T>;
28
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/abtesting/resolver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA4B7D;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EACvB,QAAQ,EAAE,MAAM,GACf,eAAe,CAAC,CAAC,CAAC,CA4BpB"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ /**
3
+ * A/B Test Variant Resolver
4
+ *
5
+ * Deterministic: the same entityId + testId always resolves to the same variant.
6
+ * Engine-agnostic: works with any compiled ruleset type.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.resolveVariant = resolveVariant;
10
+ const hash_1 = require("./hash");
11
+ /**
12
+ * Validates that an ABTestConfig is well-formed.
13
+ * @throws if variants are empty, weights don't sum to ~1.0, or IDs are duplicated
14
+ */
15
+ function validateConfig(config) {
16
+ if (!config.variants.length) {
17
+ throw new Error(`ABTest "${config.testId}": must have at least one variant`);
18
+ }
19
+ const total = config.variants.reduce((sum, v) => sum + v.weight, 0);
20
+ if (Math.abs(total - 1.0) > 0.001) {
21
+ throw new Error(`ABTest "${config.testId}": variant weights must sum to 1.0 (got ${total})`);
22
+ }
23
+ const ids = new Set();
24
+ for (const v of config.variants) {
25
+ if (ids.has(v.id)) {
26
+ throw new Error(`ABTest "${config.testId}": duplicate variant id "${v.id}"`);
27
+ }
28
+ ids.add(v.id);
29
+ }
30
+ }
31
+ /**
32
+ * Resolves an entity to a variant. Deterministic: same entityId + testId
33
+ * always returns the same variant.
34
+ *
35
+ * The hash key includes testId so the same entity can be independently
36
+ * bucketed across concurrent tests.
37
+ *
38
+ * @typeParam T - The compiled ruleset type
39
+ * @param config - The A/B test configuration with variants and weights
40
+ * @param entityId - The entity identifier to bucket (user ID, account ID, etc.)
41
+ * @returns The resolved variant with its compiled ruleset
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * const { variantId, ruleset } = resolveVariant(test, applicationId);
46
+ * const engine = new ScoringEngine(ruleset);
47
+ * const result = engine.execute(facts);
48
+ * ```
49
+ */
50
+ function resolveVariant(config, entityId) {
51
+ validateConfig(config);
52
+ const hashValue = (0, hash_1.fnv1a)(`${config.testId}:${entityId}`);
53
+ let cumulative = 0;
54
+ for (const variant of config.variants) {
55
+ cumulative += variant.weight;
56
+ if (hashValue < cumulative) {
57
+ return {
58
+ variantId: variant.id,
59
+ ruleset: variant.ruleset,
60
+ entityId,
61
+ testId: config.testId,
62
+ hashValue,
63
+ };
64
+ }
65
+ }
66
+ // Fallback to last variant (floating-point edge case)
67
+ const last = config.variants[config.variants.length - 1];
68
+ return {
69
+ variantId: last.id,
70
+ ruleset: last.ruleset,
71
+ entityId,
72
+ testId: config.testId,
73
+ hashValue,
74
+ };
75
+ }
76
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/abtesting/resolver.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAiDH,wCA+BC;AA7ED,iCAA+B;AAE/B;;;GAGG;AACH,SAAS,cAAc,CAAI,MAAuB;IAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,MAAM,mCAAmC,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACpE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,WAAW,MAAM,CAAC,MAAM,2CAA2C,KAAK,GAAG,CAC5E,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,MAAM,4BAA4B,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/E,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,cAAc,CAC5B,MAAuB,EACvB,QAAgB;IAEhB,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,MAAM,SAAS,GAAG,IAAA,YAAK,EAAC,GAAG,MAAM,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;IAExD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;YAC3B,OAAO;gBACL,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ;gBACR,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,SAAS;aACV,CAAC;QACJ,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzD,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,EAAE;QAClB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ;QACR,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS;KACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * A/B Testing Types
3
+ *
4
+ * Deterministic variant resolution for ruleset A/B testing.
5
+ * Works with any BOE engine type — the generic parameter T
6
+ * carries the compiled ruleset type through resolution.
7
+ */
8
+ /**
9
+ * A single variant in an A/B test configuration.
10
+ * @typeParam T - The compiled ruleset type (e.g., CompiledScoringRuleSet)
11
+ */
12
+ export type ABVariant<T> = {
13
+ /** Unique identifier for this variant (e.g., "control", "challenger-v2") */
14
+ id: string;
15
+ /** Traffic weight as a decimal (0.0 to 1.0). All weights in a test must sum to 1.0. */
16
+ weight: number;
17
+ /** The compiled ruleset to use for entities bucketed into this variant */
18
+ ruleset: T;
19
+ };
20
+ /**
21
+ * Configuration for an A/B test over compiled rulesets.
22
+ * @typeParam T - The compiled ruleset type
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const test: ABTestConfig<CompiledScoringRuleSet> = {
27
+ * testId: 'scoring-v2-rollout',
28
+ * variants: [
29
+ * { id: 'control', weight: 0.8, ruleset: controlRuleset },
30
+ * { id: 'challenger', weight: 0.2, ruleset: challengerRuleset },
31
+ * ],
32
+ * };
33
+ * ```
34
+ */
35
+ export type ABTestConfig<T> = {
36
+ /** Unique test identifier. Used as part of the hash key for isolation between concurrent tests. */
37
+ testId: string;
38
+ /** Ordered list of variants. Weights must sum to 1.0. */
39
+ variants: ABVariant<T>[];
40
+ };
41
+ /**
42
+ * Result of resolving an entity to a variant.
43
+ * @typeParam T - The compiled ruleset type
44
+ */
45
+ export type ResolvedVariant<T> = {
46
+ /** The variant ID the entity was bucketed into */
47
+ variantId: string;
48
+ /** The compiled ruleset for this variant */
49
+ ruleset: T;
50
+ /** The entity ID that was resolved */
51
+ entityId: string;
52
+ /** The test ID this resolution belongs to */
53
+ testId: string;
54
+ /** The raw hash value in [0, 1) — useful for debugging distribution */
55
+ hashValue: number;
56
+ };
57
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/abtesting/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACzB,4EAA4E;IAC5E,EAAE,EAAE,MAAM,CAAC;IAEX,uFAAuF;IACvF,MAAM,EAAE,MAAM,CAAC;IAEf,0EAA0E;IAC1E,OAAO,EAAE,CAAC,CAAC;CACZ,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAC5B,mGAAmG;IACnG,MAAM,EAAE,MAAM,CAAC;IAEf,yDAAyD;IACzD,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;CAC1B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC/B,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAElB,4CAA4C;IAC5C,OAAO,EAAE,CAAC,CAAC;IAEX,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IAEjB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IAEf,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /**
3
+ * A/B Testing Types
4
+ *
5
+ * Deterministic variant resolution for ruleset A/B testing.
6
+ * Works with any BOE engine type — the generic parameter T
7
+ * carries the compiled ruleset type through resolution.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/abtesting/types.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG"}
@@ -28,7 +28,7 @@
28
28
  * console.log(result.explanation); // Human-readable reasoning
29
29
  * ```
30
30
  */
31
- export { SemanticConfidence, SEMANTIC_CONFIDENCES, Confidence, ExplainBlock, ExpertRule, ExpertConfig, FactDefinitions, ExpertRuleSet, CompiledTemplate, CompiledTemplateRef, CompiledExplainBlock, CompiledExpertRule, CompiledExpertRuleSet, InferenceStep, ExpertOptions, ExpertResult, ExpertQueryResult } from './types';
31
+ export { SemanticConfidence, SEMANTIC_CONFIDENCES, Confidence, ExplainBlock, ExpertRule, ExpertConfig, FactDefinitions, ExpertRuleSet, CompiledTemplate, CompiledTemplateRef, CompiledExplainBlock, CompiledExpertRule, CompiledExpertRuleSet, InferenceStep, ExpertOptions, ExpertResult, ExpertQueryResult, FactIndex, ResultIndex } from './types';
32
32
  export { compileExpertRuleSet } from './compiler';
33
33
  export { ExpertEngine } from './engine';
34
34
  export { ExpertStrategy, expertStrategy } from './strategy';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engines/expert/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,EAEL,kBAAkB,EAClB,oBAAoB,EACpB,UAAU,EAGV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EAGb,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EAGrB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5D,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACd,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engines/expert/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,EAEL,kBAAkB,EAClB,oBAAoB,EACpB,UAAU,EAGV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EAGb,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EAGrB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,WAAW,EACZ,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5D,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACd,MAAM,aAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engines/expert/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;;;AAEH,QAAQ;AACR,iCAyBiB;AAtBf,6GAAA,oBAAoB,OAAA;AAwBtB,WAAW;AACX,uCAAkD;AAAzC,gHAAA,oBAAoB,OAAA;AAE7B,SAAS;AACT,mCAAwC;AAA/B,sGAAA,YAAY,OAAA;AAErB,oCAAoC;AACpC,uCAA4D;AAAnD,0GAAA,cAAc,OAAA;AAAE,0GAAA,cAAc,OAAA;AAEvC,2CAA2C;AAC3C,iDAQyB;AAPvB,gHAAA,eAAe,OAAA;AACf,iHAAA,gBAAgB,OAAA;AAChB,4GAAA,WAAW,OAAA;AACX,4GAAA,WAAW,OAAA;AACX,mHAAA,kBAAkB,OAAA;AAClB,yHAAA,wBAAwB,OAAA;AAI1B,sBAAsB;AACtB,yCAIqB;AAHnB,iHAAA,oBAAoB,OAAA;AACpB,yGAAA,YAAY,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engines/expert/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;;;AAEH,QAAQ;AACR,iCA2BiB;AAxBf,6GAAA,oBAAoB,OAAA;AA0BtB,WAAW;AACX,uCAAkD;AAAzC,gHAAA,oBAAoB,OAAA;AAE7B,SAAS;AACT,mCAAwC;AAA/B,sGAAA,YAAY,OAAA;AAErB,oCAAoC;AACpC,uCAA4D;AAAnD,0GAAA,cAAc,OAAA;AAAE,0GAAA,cAAc,OAAA;AAEvC,2CAA2C;AAC3C,iDAQyB;AAPvB,gHAAA,eAAe,OAAA;AACf,iHAAA,gBAAgB,OAAA;AAChB,4GAAA,WAAW,OAAA;AACX,4GAAA,WAAW,OAAA;AACX,mHAAA,kBAAkB,OAAA;AAClB,yHAAA,wBAAwB,OAAA;AAI1B,sBAAsB;AACtB,yCAIqB;AAHnB,iHAAA,oBAAoB,OAAA;AACpB,yGAAA,YAAY,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../../../src/engines/expert/strategy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EACL,qBAAqB,EAErB,aAAa,EACb,YAAY,EAGb,MAAM,SAAS,CAAC;AAqGjB,qBAAa,cAAc;IACzB,GAAG,CACD,OAAO,EAAE,qBAAqB,EAC9B,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE,aAAkB,GAC1B,YAAY;CA+KhB;AA4GD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
1
+ {"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../../../src/engines/expert/strategy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EACL,qBAAqB,EAErB,aAAa,EACb,YAAY,EAKb,MAAM,SAAS,CAAC;AAqGjB,qBAAa,cAAc;IACzB,GAAG,CACD,OAAO,EAAE,qBAAqB,EAC9B,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE,aAAkB,GAC1B,YAAY;CAwMhB;AA4GD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
@@ -78,6 +78,8 @@ class ExpertStrategy {
78
78
  const derivedFacts = {};
79
79
  const factConfidence = {};
80
80
  const inferenceChain = [];
81
+ const indexByFact = {};
82
+ const indexByRule = {};
81
83
  let rulesFired = 0;
82
84
  let rulesEvaluated = 0;
83
85
  // Track which rules have fired to prevent re-firing
@@ -137,6 +139,17 @@ class ExpertStrategy {
137
139
  // Build inference step (use snapshot for derived facts)
138
140
  const step = buildInferenceStep(rule, bindings, derivedFactsSnapshot ?? derivedFacts, augmentedBindings, true, asserted);
139
141
  inferenceChain.push(step);
142
+ // Build index entries for fired rule
143
+ indexByRule[rule.id] = step;
144
+ for (const [factName, value] of Object.entries(asserted)) {
145
+ indexByFact[factName] = {
146
+ fact: factName,
147
+ value,
148
+ concludedBy: step,
149
+ confidence: rule.confidence,
150
+ isGoal: config.goals.includes(factName)
151
+ };
152
+ }
140
153
  // Callbacks
141
154
  onFire?.(rule.id, asserted, bindings);
142
155
  onEvaluate?.(rule.id, true);
@@ -184,15 +197,26 @@ class ExpertStrategy {
184
197
  status: factName in derivedFacts ? 'concluded' : 'not-concluded'
185
198
  };
186
199
  };
200
+ // Build goals convenience record from indexed facts
201
+ const goals = {};
202
+ for (const [factName, entry] of Object.entries(indexByFact)) {
203
+ if (entry.isGoal)
204
+ goals[factName] = entry;
205
+ }
206
+ const index = { byFact: indexByFact, byRule: indexByRule, goals };
187
207
  const result = {
188
208
  conclusions: { ...derivedFacts },
189
209
  inferenceChain,
210
+ index,
190
211
  explanation,
191
212
  rulesFired,
192
213
  rulesEvaluated,
193
214
  executionTimeMs: Math.round((performance.now() - startTime) * 100) / 100,
194
215
  timestamp: new Date().toISOString(),
195
216
  query,
217
+ getRule: (ruleId) => index.byRule[ruleId],
218
+ getFact: (factName) => index.byFact[factName],
219
+ getGoals: () => Object.values(index.goals),
196
220
  toString: () => (0, formatter_1.formatResult)(result, config.goals)
197
221
  };
198
222
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"strategy.js","sourceRoot":"","sources":["../../../src/engines/expert/strategy.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,qCAMoB;AAYpB,mDAGyB;AAEzB,2CAA2C;AAc3C,2CAA2C;AAC3C,uBAAuB;AACvB,2CAA2C;AAE3C;;;;GAIG;AACH,SAAS,wBAAwB,CAC/B,QAAwB,EACxB,YAA0B;IAE1B,MAAM,SAAS,GAAmB,EAAE,GAAG,QAAQ,EAAE,CAAC;IAElD,oCAAoC;IACpC,gEAAgE;IAChE,2DAA2D;IAC3D,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,IAAI,CAAC,GAAG;gBAChB,EAAE,EAAE,aAAa,IAAI,EAAE;gBACvB,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,KAAK;aACJ,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,2CAA2C;AAC3C,wBAAwB;AACxB,2CAA2C;AAE3C;;GAEG;AACH,SAAS,yBAAyB,CAChC,QAAwB,EACxB,YAA0B,EAC1B,WAAqC;IAErC,4CAA4C;IAC5C,MAAM,YAAY,GAA4C,EAAE,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAA+B,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,WAAW;KACvB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAC/B,SAA0C,EAC1C,iBAAiC;IAEjC,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAA,qBAAc,EAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2CAA2C;AAC3C,0BAA0B;AAC1B,2CAA2C;AAE3C,MAAa,cAAc;IACzB,GAAG,CACD,OAA8B,EAC9B,EAAkB,EAClB,UAAyB,EAAE;QAE3B,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAE9B,MAAM,EACJ,MAAM,EACN,UAAU,EACV,cAAc,GAAG,KAAK,EACtB,OAAO,GAAG,IAAI,EACd,cAAc,GAAG,IAAI,EACtB,GAAG,OAAO,CAAC;QAEZ,QAAQ;QACR,MAAM,YAAY,GAAiB,EAAE,CAAC;QACtC,MAAM,cAAc,GAAmB,EAAE,CAAC;QAC1C,MAAM,cAAc,GAAoB,EAAE,CAAC;QAC3C,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,oDAAoD;QACpD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAErC,0DAA0D;QAC1D,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,OAAO,OAAO,IAAI,cAAc,GAAG,cAAc,EAAE,CAAC;YAClD,OAAO,GAAG,KAAK,CAAC;YAEhB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACjC,2BAA2B;gBAC3B,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC5B,SAAS;gBACX,CAAC;gBAED,cAAc,EAAE,CAAC;gBAEjB,yBAAyB;gBACzB,IAAI,cAAc,IAAI,cAAc,EAAE,CAAC;oBACrC,MAAM;gBACR,CAAC;gBAED,+FAA+F;gBAC/F,MAAM,WAAW,GAAG,IAAA,sBAAe,EAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAE9C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;oBACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC;oBAElC,8CAA8C;oBAC9C,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;oBAE3E,2DAA2D;oBAC3D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;wBACd,MAAM,UAAU,GAAG,IAAA,wBAAiB,EAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;wBAEnE,IAAI,CAAC,UAAU,EAAE,CAAC;4BAChB,+CAA+C;4BAC/C,IAAI,cAAc,EAAE,CAAC;gCACnB,MAAM,IAAI,GAAG,kBAAkB,CAC7B,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,SAAS,CACV,CAAC;gCACF,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BAC5B,CAAC;4BAED,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;4BAC7B,SAAS;wBACX,CAAC;oBACH,CAAC;oBAED,cAAc;oBACd,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACxB,OAAO,GAAG,IAAI,CAAC;oBACf,UAAU,EAAE,CAAC;oBAEb,4DAA4D;oBAC5D,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;oBAEzE,sBAAsB;oBACtB,MAAM,QAAQ,GAA4B,EAAE,CAAC;oBAC7C,KAAK,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;wBACnE,MAAM,KAAK,GAAG,IAAA,qBAAc,EAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;wBAC9D,QAAQ,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;wBAC3B,YAAY,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;wBAE/B,mBAAmB;wBACnB,cAAc,CAAC,QAAQ,CAAC,GAAG;4BACzB,KAAK;4BACL,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,WAAW,EAAE,IAAI,CAAC,EAAE;yBACrB,CAAC;oBACJ,CAAC;oBAED,wDAAwD;oBACxD,MAAM,IAAI,GAAG,kBAAkB,CAC7B,IAAI,EACJ,QAAQ,EACR,oBAAoB,IAAI,YAAY,EACpC,iBAAiB,EACjB,IAAI,EACJ,QAAQ,CACT,CAAC;oBACF,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAE1B,YAAY;oBACZ,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACtC,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;oBAE5B,mCAAmC;oBACnC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC5B,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC;wBACrE,IAAI,WAAW,EAAE,CAAC;4BAChB,OAAO,GAAG,KAAK,CAAC,CAAC,kBAAkB;4BACnC,MAAM;wBACR,CAAC;oBACH,CAAC;oBAED,yCAAyC;oBACzC,MAAM;gBACR,CAAC;gBAED,oCAAoC;gBACpC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC;oBACrE,IAAI,WAAW,EAAE,CAAC;wBAChB,OAAO,GAAG,KAAK,CAAC;wBAChB,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,MAAM,WAAW,GAAG,OAAO;YACzB,CAAC,CAAC,uBAAuB,CAAC,cAAc,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC;YACrE,CAAC,CAAC,EAAE,CAAC;QAEP,uBAAuB;QACvB,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAqB,EAAE;YACpD,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO;oBACL,MAAM,EAAE,IAAI;oBACZ,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,MAAM,EAAE,WAAW;oBACnB,WAAW,EAAE,IAAI,CAAC,WAAW;iBAC9B,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,SAAS;gBAChB,UAAU,EAAE,CAAC;gBACb,MAAM,EAAE,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe;aACjE,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,MAAM,GAAiB;YAC3B,WAAW,EAAE,EAAE,GAAG,YAAY,EAAE;YAChC,cAAc;YACd,WAAW;YACX,UAAU;YACV,cAAc;YACd,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YACxE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK;YACL,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,wBAAY,EAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;SACnD,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AApLD,wCAoLC;AAED,2CAA2C;AAC3C,mBAAmB;AACnB,2CAA2C;AAE3C;;GAEG;AACH,SAAS,kBAAkB,CACzB,IAAwB,EACxB,QAAwB,EACxB,YAA0B,EAC1B,iBAAiC,EACjC,KAAc,EACd,QAA6C;IAE7C,oDAAoD;IACpD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,2EAA2E;IAC3E,IAAI,gBAAqD,CAAC;IAC1D,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,gBAAgB,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;IACzC,CAAC;IAED,6BAA6B;IAC7B,MAAM,WAAW,GAAG,wBAAwB,CAC1C,IAAI,CAAC,OAAO,CAAC,SAAS,EACtB,iBAAiB,CAClB,CAAC;IAEF,8BAA8B;IAC9B,MAAM,aAAa,GAAG,yBAAyB,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IAErF,uCAAuC;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IACnE,MAAM,WAAW,GAAG,QAAQ;QAC1B,CAAC,CAAC,IAAA,2BAAW,EAAC,QAAQ,EAAE,aAAa,CAAC;QACtC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;IAE1C,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,KAAK;QACL,SAAS;QACT,gBAAgB;QAChB,QAAQ;QACR,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QAC/C,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAC9B,KAAsB,EACtB,WAAyB,EACzB,KAAe;IAEf,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,oBAAoB;IACpB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAE9C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,sBAAsB,UAAU,CAAC,MAAM,WAAW,CAAC,CAAC;IACzG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,uBAAuB;IACvB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACpC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;gBAC5D,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC;QAE1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,MAAM,qBAAqB,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,wBAAwB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,4BAA4B;AACf,QAAA,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"strategy.js","sourceRoot":"","sources":["../../../src/engines/expert/strategy.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,qCAMoB;AAcpB,mDAGyB;AAEzB,2CAA2C;AAc3C,2CAA2C;AAC3C,uBAAuB;AACvB,2CAA2C;AAE3C;;;;GAIG;AACH,SAAS,wBAAwB,CAC/B,QAAwB,EACxB,YAA0B;IAE1B,MAAM,SAAS,GAAmB,EAAE,GAAG,QAAQ,EAAE,CAAC;IAElD,oCAAoC;IACpC,gEAAgE;IAChE,2DAA2D;IAC3D,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,IAAI,CAAC,GAAG;gBAChB,EAAE,EAAE,aAAa,IAAI,EAAE;gBACvB,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,KAAK;aACJ,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,2CAA2C;AAC3C,wBAAwB;AACxB,2CAA2C;AAE3C;;GAEG;AACH,SAAS,yBAAyB,CAChC,QAAwB,EACxB,YAA0B,EAC1B,WAAqC;IAErC,4CAA4C;IAC5C,MAAM,YAAY,GAA4C,EAAE,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAA+B,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,WAAW;KACvB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAC/B,SAA0C,EAC1C,iBAAiC;IAEjC,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAA,qBAAc,EAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2CAA2C;AAC3C,0BAA0B;AAC1B,2CAA2C;AAE3C,MAAa,cAAc;IACzB,GAAG,CACD,OAA8B,EAC9B,EAAkB,EAClB,UAAyB,EAAE;QAE3B,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAE9B,MAAM,EACJ,MAAM,EACN,UAAU,EACV,cAAc,GAAG,KAAK,EACtB,OAAO,GAAG,IAAI,EACd,cAAc,GAAG,IAAI,EACtB,GAAG,OAAO,CAAC;QAEZ,QAAQ;QACR,MAAM,YAAY,GAAiB,EAAE,CAAC;QACtC,MAAM,cAAc,GAAmB,EAAE,CAAC;QAC1C,MAAM,cAAc,GAAoB,EAAE,CAAC;QAC3C,MAAM,WAAW,GAA8B,EAAE,CAAC;QAClD,MAAM,WAAW,GAAkC,EAAE,CAAC;QACtD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,oDAAoD;QACpD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAErC,0DAA0D;QAC1D,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,OAAO,OAAO,IAAI,cAAc,GAAG,cAAc,EAAE,CAAC;YAClD,OAAO,GAAG,KAAK,CAAC;YAEhB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACjC,2BAA2B;gBAC3B,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC5B,SAAS;gBACX,CAAC;gBAED,cAAc,EAAE,CAAC;gBAEjB,yBAAyB;gBACzB,IAAI,cAAc,IAAI,cAAc,EAAE,CAAC;oBACrC,MAAM;gBACR,CAAC;gBAED,+FAA+F;gBAC/F,MAAM,WAAW,GAAG,IAAA,sBAAe,EAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAE9C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;oBACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC;oBAElC,8CAA8C;oBAC9C,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;oBAE3E,2DAA2D;oBAC3D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;wBACd,MAAM,UAAU,GAAG,IAAA,wBAAiB,EAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;wBAEnE,IAAI,CAAC,UAAU,EAAE,CAAC;4BAChB,+CAA+C;4BAC/C,IAAI,cAAc,EAAE,CAAC;gCACnB,MAAM,IAAI,GAAG,kBAAkB,CAC7B,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,SAAS,CACV,CAAC;gCACF,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BAC5B,CAAC;4BAED,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;4BAC7B,SAAS;wBACX,CAAC;oBACH,CAAC;oBAED,cAAc;oBACd,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACxB,OAAO,GAAG,IAAI,CAAC;oBACf,UAAU,EAAE,CAAC;oBAEb,4DAA4D;oBAC5D,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;oBAEzE,sBAAsB;oBACtB,MAAM,QAAQ,GAA4B,EAAE,CAAC;oBAC7C,KAAK,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;wBACnE,MAAM,KAAK,GAAG,IAAA,qBAAc,EAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;wBAC9D,QAAQ,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;wBAC3B,YAAY,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;wBAE/B,mBAAmB;wBACnB,cAAc,CAAC,QAAQ,CAAC,GAAG;4BACzB,KAAK;4BACL,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,WAAW,EAAE,IAAI,CAAC,EAAE;yBACrB,CAAC;oBACJ,CAAC;oBAED,wDAAwD;oBACxD,MAAM,IAAI,GAAG,kBAAkB,CAC7B,IAAI,EACJ,QAAQ,EACR,oBAAoB,IAAI,YAAY,EACpC,iBAAiB,EACjB,IAAI,EACJ,QAAQ,CACT,CAAC;oBACF,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAE1B,qCAAqC;oBACrC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;oBAC5B,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACzD,WAAW,CAAC,QAAQ,CAAC,GAAG;4BACtB,IAAI,EAAE,QAAQ;4BACd,KAAK;4BACL,WAAW,EAAE,IAAI;4BACjB,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;yBACxC,CAAC;oBACJ,CAAC;oBAED,YAAY;oBACZ,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACtC,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;oBAE5B,mCAAmC;oBACnC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC5B,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC;wBACrE,IAAI,WAAW,EAAE,CAAC;4BAChB,OAAO,GAAG,KAAK,CAAC,CAAC,kBAAkB;4BACnC,MAAM;wBACR,CAAC;oBACH,CAAC;oBAED,yCAAyC;oBACzC,MAAM;gBACR,CAAC;gBAED,oCAAoC;gBACpC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC;oBACrE,IAAI,WAAW,EAAE,CAAC;wBAChB,OAAO,GAAG,KAAK,CAAC;wBAChB,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,MAAM,WAAW,GAAG,OAAO;YACzB,CAAC,CAAC,uBAAuB,CAAC,cAAc,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC;YACrE,CAAC,CAAC,EAAE,CAAC;QAEP,uBAAuB;QACvB,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAqB,EAAE;YACpD,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO;oBACL,MAAM,EAAE,IAAI;oBACZ,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,MAAM,EAAE,WAAW;oBACnB,WAAW,EAAE,IAAI,CAAC,WAAW;iBAC9B,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,SAAS;gBAChB,UAAU,EAAE,CAAC;gBACb,MAAM,EAAE,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe;aACjE,CAAC;QACJ,CAAC,CAAC;QAEF,oDAAoD;QACpD,MAAM,KAAK,GAA8B,EAAE,CAAC;QAC5C,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5D,IAAI,KAAK,CAAC,MAAM;gBAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QAC5C,CAAC;QACD,MAAM,KAAK,GAAgB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QAE/E,MAAM,MAAM,GAAiB;YAC3B,WAAW,EAAE,EAAE,GAAG,YAAY,EAAE;YAChC,cAAc;YACd,KAAK;YACL,WAAW;YACX,UAAU;YACV,cAAc;YACd,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YACxE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK;YACL,OAAO,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YACjD,OAAO,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;YACrD,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YAC1C,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,wBAAY,EAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;SACnD,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA7MD,wCA6MC;AAED,2CAA2C;AAC3C,mBAAmB;AACnB,2CAA2C;AAE3C;;GAEG;AACH,SAAS,kBAAkB,CACzB,IAAwB,EACxB,QAAwB,EACxB,YAA0B,EAC1B,iBAAiC,EACjC,KAAc,EACd,QAA6C;IAE7C,oDAAoD;IACpD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,2EAA2E;IAC3E,IAAI,gBAAqD,CAAC;IAC1D,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,gBAAgB,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;IACzC,CAAC;IAED,6BAA6B;IAC7B,MAAM,WAAW,GAAG,wBAAwB,CAC1C,IAAI,CAAC,OAAO,CAAC,SAAS,EACtB,iBAAiB,CAClB,CAAC;IAEF,8BAA8B;IAC9B,MAAM,aAAa,GAAG,yBAAyB,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IAErF,uCAAuC;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IACnE,MAAM,WAAW,GAAG,QAAQ;QAC1B,CAAC,CAAC,IAAA,2BAAW,EAAC,QAAQ,EAAE,aAAa,CAAC;QACtC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;IAE1C,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,KAAK;QACL,SAAS;QACT,gBAAgB;QAChB,QAAQ;QACR,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QAC/C,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAC9B,KAAsB,EACtB,WAAyB,EACzB,KAAe;IAEf,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,oBAAoB;IACpB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAE9C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,sBAAsB,UAAU,CAAC,MAAM,WAAW,CAAC,CAAC;IACzG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,uBAAuB;IACvB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACpC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;gBAC5D,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC;QAE1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,MAAM,qBAAqB,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,wBAAwB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,4BAA4B;AACf,QAAA,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC"}
@@ -285,6 +285,24 @@ export type ExpertResult = {
285
285
  * Step-by-step reasoning trace.
286
286
  */
287
287
  inferenceChain: InferenceStep[];
288
+ /**
289
+ * Structured index for O(1) lookups by fact name, rule ID, or goal.
290
+ * Eliminates the need to search `inferenceChain` by rule ID string matching.
291
+ *
292
+ * @example
293
+ * ```typescript
294
+ * // Direct rule lookup
295
+ * const step = result.index.byRule['credit-tier-rule'];
296
+ *
297
+ * // Fact lookup with value, confidence, and concludedBy
298
+ * const fact = result.index.byFact['creditTier'];
299
+ * console.log(fact.value, fact.confidence, fact.concludedBy.ruleId);
300
+ *
301
+ * // Goal-only subset
302
+ * const goals = result.index.goals;
303
+ * ```
304
+ */
305
+ index: ResultIndex;
288
306
  /**
289
307
  * Human-readable explanation summary.
290
308
  */
@@ -312,6 +330,28 @@ export type ExpertResult = {
312
330
  * @returns Query result with value, confidence, and status
313
331
  */
314
332
  query: (factName: string) => ExpertQueryResult;
333
+ /**
334
+ * Get the inference step for a fired rule by ID.
335
+ * Returns undefined if the rule didn't fire or doesn't exist.
336
+ *
337
+ * @param ruleId - The rule ID to look up
338
+ * @returns The inference step, or undefined
339
+ */
340
+ getRule: (ruleId: string) => InferenceStep | undefined;
341
+ /**
342
+ * Get the index entry for an asserted fact by name.
343
+ * Returns undefined if the fact was not concluded.
344
+ *
345
+ * @param factName - The fact name to look up
346
+ * @returns The fact index entry, or undefined
347
+ */
348
+ getFact: (factName: string) => FactIndex | undefined;
349
+ /**
350
+ * Get all concluded goal facts.
351
+ *
352
+ * @returns Array of FactIndex entries for concluded goals
353
+ */
354
+ getGoals: () => FactIndex[];
315
355
  /**
316
356
  * Format the result as a human-readable string.
317
357
  * Includes the inference chain, conclusions, and statistics.
@@ -343,4 +383,31 @@ export type ExpertQueryResult = {
343
383
  /** Rule that concluded this fact (if any) */
344
384
  concludedBy?: string;
345
385
  };
386
+ /**
387
+ * Index entry for a single asserted fact.
388
+ */
389
+ export type FactIndex = {
390
+ /** The fact name */
391
+ fact: string;
392
+ /** The asserted value */
393
+ value: unknown;
394
+ /** The inference step that concluded this fact */
395
+ concludedBy: InferenceStep;
396
+ /** Confidence of the assertion */
397
+ confidence: number;
398
+ /** Whether this fact is a goal */
399
+ isGoal: boolean;
400
+ };
401
+ /**
402
+ * Structured index for O(1) lookups into expert system results.
403
+ * Built inline during rule evaluation — no extra iteration pass.
404
+ */
405
+ export type ResultIndex = {
406
+ /** O(1) lookup by asserted fact name */
407
+ byFact: Record<string, FactIndex>;
408
+ /** O(1) lookup by rule ID (fired rules only) */
409
+ byRule: Record<string, InferenceStep>;
410
+ /** Convenience: only goal facts from byFact */
411
+ goals: Record<string, FactIndex>;
412
+ };
346
413
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/engines/expert/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,SAAS,EACT,OAAO,EACP,iBAAiB,EACjB,eAAe,EACf,cAAc,EACf,MAAM,YAAY,CAAC;AAMpB;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAC1B,SAAS,GACT,WAAW,GACX,MAAM,GACN,QAAQ,GACR,UAAU,GACV,UAAU,GACV,UAAU,GACV,KAAK,CAAC;AAEV;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CASnE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,kBAAkB,CAAC;AAMrD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEpC;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG;IAClC;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,IAAI,EAAE;QACJ;;;;;;;;;WASG;QACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEhC;;;;;;;;;;;;;;WAcG;QACH,UAAU,EAAE,UAAU,CAAC;KACxB,CAAC;IAEF;;;OAGG;IACH,OAAO,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG;IACxC,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB;;OAEG;IACH,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB,CAAC;AAMF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yCAAyC;IACzC,IAAI,EAAE,mBAAmB,EAAE,CAAC;CAC7B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,oEAAoE;IACpE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,+DAA+D;IAC/D,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5C,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,oBAAoB,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,GAAG;IACxD,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;CAChC,CAAC;AAMF;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IAEf,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IAEpB,6BAA6B;IAC7B,KAAK,EAAE,OAAO,CAAC;IAEf,uDAAuD;IACvD,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE3C,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAE9F;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAEtD;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAErC;;OAEG;IACH,cAAc,EAAE,aAAa,EAAE,CAAC;IAEhC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;;;OAKG;IACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,iBAAiB,CAAC;IAE/C;;;;;;;;;;;;;OAaG;IACH,QAAQ,EAAE,MAAM,MAAM,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,qCAAqC;IACrC,MAAM,EAAE,OAAO,CAAC;IAEhB,sCAAsC;IACtC,KAAK,EAAE,OAAO,CAAC;IAEf,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IAEnB,kCAAkC;IAClC,MAAM,EAAE,WAAW,GAAG,eAAe,GAAG,SAAS,CAAC;IAElD,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/engines/expert/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,SAAS,EACT,OAAO,EACP,iBAAiB,EACjB,eAAe,EACf,cAAc,EACf,MAAM,YAAY,CAAC;AAMpB;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAC1B,SAAS,GACT,WAAW,GACX,MAAM,GACN,QAAQ,GACR,UAAU,GACV,UAAU,GACV,UAAU,GACV,KAAK,CAAC;AAEV;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CASnE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,kBAAkB,CAAC;AAMrD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEpC;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG;IAClC;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,IAAI,EAAE;QACJ;;;;;;;;;WASG;QACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEhC;;;;;;;;;;;;;;WAcG;QACH,UAAU,EAAE,UAAU,CAAC;KACxB,CAAC;IAEF;;;OAGG;IACH,OAAO,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG;IACxC,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB;;OAEG;IACH,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB,CAAC;AAMF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yCAAyC;IACzC,IAAI,EAAE,mBAAmB,EAAE,CAAC;CAC7B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,oEAAoE;IACpE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,+DAA+D;IAC/D,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5C,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,oBAAoB,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,GAAG;IACxD,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;CAChC,CAAC;AAMF;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IAEf,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IAEpB,6BAA6B;IAC7B,KAAK,EAAE,OAAO,CAAC;IAEf,uDAAuD;IACvD,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE3C,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAE9F;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAEtD;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAErC;;OAEG;IACH,cAAc,EAAE,aAAa,EAAE,CAAC;IAEhC;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,EAAE,WAAW,CAAC;IAEnB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;;;OAKG;IACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,iBAAiB,CAAC;IAE/C;;;;;;OAMG;IACH,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,CAAC;IAEvD;;;;;;OAMG;IACH,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;IAErD;;;;OAIG;IACH,QAAQ,EAAE,MAAM,SAAS,EAAE,CAAC;IAE5B;;;;;;;;;;;;;OAaG;IACH,QAAQ,EAAE,MAAM,MAAM,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,qCAAqC;IACrC,MAAM,EAAE,OAAO,CAAC;IAEhB,sCAAsC;IACtC,KAAK,EAAE,OAAO,CAAC;IAEf,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IAEnB,kCAAkC;IAClC,MAAM,EAAE,WAAW,GAAG,eAAe,GAAG,SAAS,CAAC;IAElD,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,kDAAkD;IAClD,WAAW,EAAE,aAAa,CAAC;IAC3B,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAClC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -49,7 +49,7 @@ export type { UtilityCriterion, UtilityRule, UtilityRuleSet, UtilityConfig, Comp
49
49
  export { DefeasibleEngine, compileDefeasibleRuleSet } from './engines/defeasible';
50
50
  export type { DefeasibleRule, DefeasibleRuleSet, DefeasibleConfig, CompiledDefeasibleRuleSet, DefeasibleOptions, DefeasibleResult } from './engines/defeasible';
51
51
  export { ExpertEngine, ExpertStrategy, compileExpertRuleSet, expertStrategy, compileTemplate, interpolate, hasInterpolation, buildAvailableRefs } from './engines/expert';
52
- export type { ExpertRule, ExpertRuleSet, ExpertConfig, ExplainBlock, CompiledExpertRuleSet, CompiledExpertRule, CompiledExplainBlock, CompiledTemplate, ExpertOptions, ExpertResult, ExpertQueryResult, InferenceStep, InterpolationContext } from './engines/expert';
52
+ export type { ExpertRule, ExpertRuleSet, ExpertConfig, ExplainBlock, CompiledExpertRuleSet, CompiledExpertRule, CompiledExplainBlock, CompiledTemplate, ExpertOptions, ExpertResult, ExpertQueryResult, InferenceStep, FactIndex, ResultIndex, InterpolationContext } from './engines/expert';
53
53
  export { PricingStrategy, compilePricingRuleSet, compilePricingRule, pricingStrategy, pricingEngine, calculateFlat, calculateGraduated, calculateVolume, formatCurrency, formatNumber, formatPercent, round, calculateDiscount, applyMinMax, CURRENCIES, getCurrencyInfo } from './engines/pricing';
54
54
  export type { CurrencyCode, CurrencyInfo, PricingRule, PricingRuleSet, PricingConfig, PricingComponent, PricingMode, PricingInput, PricingPackage, FlatPricing, GraduatedTier, GraduatedPricing, VolumeBracket, VolumePricing, Meter, MultiMeterPricing, FormulaPricing, Adjustment, DiscountAdjustment, MinimumAdjustment, MaximumAdjustment, Metric, ScenarioDefinition, ScenarioDefinitions, AttributeSchema, ProductType, ResolvedPricingConfig, CompiledPricingRuleSet, CompiledPricingRule, CompiledPricingComponent, CompiledPricingMode, CompiledAdjustment, CompiledMetric, PricingOptions, PricingResult, ScenarioComparisonResult, ScenarioResult, ComponentResult, AdjustmentResult, TierBreakdown, MeterResult, PricingSummary, CalculatorContext, TierCalculationResult } from './engines/pricing';
55
55
  export { soundex, nysiis, caverphone2, cosineSimilarity } from './functions';
@@ -58,4 +58,5 @@ export type { ErrorContext } from './core/errors';
58
58
  export { calculateDecayMultiplier, resolveDecayTimestamp } from './core/evaluation/decay';
59
59
  export type { DecayCurve, DecayTimeUnit, DecayConfig, DecayInfo } from './core/evaluation/decay';
60
60
  export * from './qfacts';
61
+ export * from './abtesting';
61
62
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -183,4 +183,8 @@ Object.defineProperty(exports, "resolveDecayTimestamp", { enumerable: true, get:
183
183
  // QFacts - Probabilistic Fact Hydration
184
184
  // ========================================
185
185
  __exportStar(require("./qfacts"), exports);
186
+ // ========================================
187
+ // A/B Testing - Deterministic Variant Resolution
188
+ // ========================================
189
+ __exportStar(require("./abtesting"), exports);
186
190
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@higher.archi/boe",
3
- "version": "1.0.12",
3
+ "version": "1.0.15",
4
4
  "description": "A multi-strategy rule engine supporting forward chaining, backward chaining, scoring, sequential, fuzzy logic, and Bayesian inference",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -0,0 +1,12 @@
1
+ /**
2
+ * FNV-1a 32-bit hash. Pure JS, zero dependencies, browser-safe.
3
+ * Returns a float in [0.0, 1.0) for deterministic bucket resolution.
4
+ */
5
+ export function fnv1a(input: string): number {
6
+ let hash = 0x811c9dc5; // FNV offset basis
7
+ for (let i = 0; i < input.length; i++) {
8
+ hash ^= input.charCodeAt(i);
9
+ hash = Math.imul(hash, 0x01000193); // FNV prime
10
+ }
11
+ return (hash >>> 0) / 0x100000000;
12
+ }
@@ -0,0 +1,8 @@
1
+ // Types
2
+ export type { ABVariant, ABTestConfig, ResolvedVariant } from './types';
3
+
4
+ // Core resolver
5
+ export { resolveVariant } from './resolver';
6
+
7
+ // Hash (exported for advanced use / testing)
8
+ export { fnv1a } from './hash';
@@ -0,0 +1,86 @@
1
+ /**
2
+ * A/B Test Variant Resolver
3
+ *
4
+ * Deterministic: the same entityId + testId always resolves to the same variant.
5
+ * Engine-agnostic: works with any compiled ruleset type.
6
+ */
7
+
8
+ import type { ABTestConfig, ResolvedVariant } from './types';
9
+ import { fnv1a } from './hash';
10
+
11
+ /**
12
+ * Validates that an ABTestConfig is well-formed.
13
+ * @throws if variants are empty, weights don't sum to ~1.0, or IDs are duplicated
14
+ */
15
+ function validateConfig<T>(config: ABTestConfig<T>): void {
16
+ if (!config.variants.length) {
17
+ throw new Error(`ABTest "${config.testId}": must have at least one variant`);
18
+ }
19
+
20
+ const total = config.variants.reduce((sum, v) => sum + v.weight, 0);
21
+ if (Math.abs(total - 1.0) > 0.001) {
22
+ throw new Error(
23
+ `ABTest "${config.testId}": variant weights must sum to 1.0 (got ${total})`
24
+ );
25
+ }
26
+
27
+ const ids = new Set<string>();
28
+ for (const v of config.variants) {
29
+ if (ids.has(v.id)) {
30
+ throw new Error(`ABTest "${config.testId}": duplicate variant id "${v.id}"`);
31
+ }
32
+ ids.add(v.id);
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Resolves an entity to a variant. Deterministic: same entityId + testId
38
+ * always returns the same variant.
39
+ *
40
+ * The hash key includes testId so the same entity can be independently
41
+ * bucketed across concurrent tests.
42
+ *
43
+ * @typeParam T - The compiled ruleset type
44
+ * @param config - The A/B test configuration with variants and weights
45
+ * @param entityId - The entity identifier to bucket (user ID, account ID, etc.)
46
+ * @returns The resolved variant with its compiled ruleset
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const { variantId, ruleset } = resolveVariant(test, applicationId);
51
+ * const engine = new ScoringEngine(ruleset);
52
+ * const result = engine.execute(facts);
53
+ * ```
54
+ */
55
+ export function resolveVariant<T>(
56
+ config: ABTestConfig<T>,
57
+ entityId: string
58
+ ): ResolvedVariant<T> {
59
+ validateConfig(config);
60
+
61
+ const hashValue = fnv1a(`${config.testId}:${entityId}`);
62
+
63
+ let cumulative = 0;
64
+ for (const variant of config.variants) {
65
+ cumulative += variant.weight;
66
+ if (hashValue < cumulative) {
67
+ return {
68
+ variantId: variant.id,
69
+ ruleset: variant.ruleset,
70
+ entityId,
71
+ testId: config.testId,
72
+ hashValue,
73
+ };
74
+ }
75
+ }
76
+
77
+ // Fallback to last variant (floating-point edge case)
78
+ const last = config.variants[config.variants.length - 1];
79
+ return {
80
+ variantId: last.id,
81
+ ruleset: last.ruleset,
82
+ entityId,
83
+ testId: config.testId,
84
+ hashValue,
85
+ };
86
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * A/B Testing Types
3
+ *
4
+ * Deterministic variant resolution for ruleset A/B testing.
5
+ * Works with any BOE engine type — the generic parameter T
6
+ * carries the compiled ruleset type through resolution.
7
+ */
8
+
9
+ /**
10
+ * A single variant in an A/B test configuration.
11
+ * @typeParam T - The compiled ruleset type (e.g., CompiledScoringRuleSet)
12
+ */
13
+ export type ABVariant<T> = {
14
+ /** Unique identifier for this variant (e.g., "control", "challenger-v2") */
15
+ id: string;
16
+
17
+ /** Traffic weight as a decimal (0.0 to 1.0). All weights in a test must sum to 1.0. */
18
+ weight: number;
19
+
20
+ /** The compiled ruleset to use for entities bucketed into this variant */
21
+ ruleset: T;
22
+ };
23
+
24
+ /**
25
+ * Configuration for an A/B test over compiled rulesets.
26
+ * @typeParam T - The compiled ruleset type
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const test: ABTestConfig<CompiledScoringRuleSet> = {
31
+ * testId: 'scoring-v2-rollout',
32
+ * variants: [
33
+ * { id: 'control', weight: 0.8, ruleset: controlRuleset },
34
+ * { id: 'challenger', weight: 0.2, ruleset: challengerRuleset },
35
+ * ],
36
+ * };
37
+ * ```
38
+ */
39
+ export type ABTestConfig<T> = {
40
+ /** Unique test identifier. Used as part of the hash key for isolation between concurrent tests. */
41
+ testId: string;
42
+
43
+ /** Ordered list of variants. Weights must sum to 1.0. */
44
+ variants: ABVariant<T>[];
45
+ };
46
+
47
+ /**
48
+ * Result of resolving an entity to a variant.
49
+ * @typeParam T - The compiled ruleset type
50
+ */
51
+ export type ResolvedVariant<T> = {
52
+ /** The variant ID the entity was bucketed into */
53
+ variantId: string;
54
+
55
+ /** The compiled ruleset for this variant */
56
+ ruleset: T;
57
+
58
+ /** The entity ID that was resolved */
59
+ entityId: string;
60
+
61
+ /** The test ID this resolution belongs to */
62
+ testId: string;
63
+
64
+ /** The raw hash value in [0, 1) — useful for debugging distribution */
65
+ hashValue: number;
66
+ };
@@ -54,7 +54,9 @@ export {
54
54
  InferenceStep,
55
55
  ExpertOptions,
56
56
  ExpertResult,
57
- ExpertQueryResult
57
+ ExpertQueryResult,
58
+ FactIndex,
59
+ ResultIndex
58
60
  } from './types';
59
61
 
60
62
  // Compiler
@@ -20,7 +20,9 @@ import {
20
20
  ExpertOptions,
21
21
  ExpertResult,
22
22
  ExpertQueryResult,
23
- InferenceStep
23
+ InferenceStep,
24
+ FactIndex,
25
+ ResultIndex
24
26
  } from './types';
25
27
 
26
28
  import {
@@ -143,6 +145,8 @@ export class ExpertStrategy {
143
145
  const derivedFacts: DerivedFacts = {};
144
146
  const factConfidence: FactConfidence = {};
145
147
  const inferenceChain: InferenceStep[] = [];
148
+ const indexByFact: Record<string, FactIndex> = {};
149
+ const indexByRule: Record<string, InferenceStep> = {};
146
150
  let rulesFired = 0;
147
151
  let rulesEvaluated = 0;
148
152
 
@@ -234,6 +238,18 @@ export class ExpertStrategy {
234
238
  );
235
239
  inferenceChain.push(step);
236
240
 
241
+ // Build index entries for fired rule
242
+ indexByRule[rule.id] = step;
243
+ for (const [factName, value] of Object.entries(asserted)) {
244
+ indexByFact[factName] = {
245
+ fact: factName,
246
+ value,
247
+ concludedBy: step,
248
+ confidence: rule.confidence,
249
+ isGoal: config.goals.includes(factName)
250
+ };
251
+ }
252
+
237
253
  // Callbacks
238
254
  onFire?.(rule.id, asserted, bindings);
239
255
  onEvaluate?.(rule.id, true);
@@ -288,15 +304,26 @@ export class ExpertStrategy {
288
304
  };
289
305
  };
290
306
 
307
+ // Build goals convenience record from indexed facts
308
+ const goals: Record<string, FactIndex> = {};
309
+ for (const [factName, entry] of Object.entries(indexByFact)) {
310
+ if (entry.isGoal) goals[factName] = entry;
311
+ }
312
+ const index: ResultIndex = { byFact: indexByFact, byRule: indexByRule, goals };
313
+
291
314
  const result: ExpertResult = {
292
315
  conclusions: { ...derivedFacts },
293
316
  inferenceChain,
317
+ index,
294
318
  explanation,
295
319
  rulesFired,
296
320
  rulesEvaluated,
297
321
  executionTimeMs: Math.round((performance.now() - startTime) * 100) / 100,
298
322
  timestamp: new Date().toISOString(),
299
323
  query,
324
+ getRule: (ruleId: string) => index.byRule[ruleId],
325
+ getFact: (factName: string) => index.byFact[factName],
326
+ getGoals: () => Object.values(index.goals),
300
327
  toString: () => formatResult(result, config.goals)
301
328
  };
302
329
 
@@ -371,6 +371,25 @@ export type ExpertResult = {
371
371
  */
372
372
  inferenceChain: InferenceStep[];
373
373
 
374
+ /**
375
+ * Structured index for O(1) lookups by fact name, rule ID, or goal.
376
+ * Eliminates the need to search `inferenceChain` by rule ID string matching.
377
+ *
378
+ * @example
379
+ * ```typescript
380
+ * // Direct rule lookup
381
+ * const step = result.index.byRule['credit-tier-rule'];
382
+ *
383
+ * // Fact lookup with value, confidence, and concludedBy
384
+ * const fact = result.index.byFact['creditTier'];
385
+ * console.log(fact.value, fact.confidence, fact.concludedBy.ruleId);
386
+ *
387
+ * // Goal-only subset
388
+ * const goals = result.index.goals;
389
+ * ```
390
+ */
391
+ index: ResultIndex;
392
+
374
393
  /**
375
394
  * Human-readable explanation summary.
376
395
  */
@@ -404,6 +423,31 @@ export type ExpertResult = {
404
423
  */
405
424
  query: (factName: string) => ExpertQueryResult;
406
425
 
426
+ /**
427
+ * Get the inference step for a fired rule by ID.
428
+ * Returns undefined if the rule didn't fire or doesn't exist.
429
+ *
430
+ * @param ruleId - The rule ID to look up
431
+ * @returns The inference step, or undefined
432
+ */
433
+ getRule: (ruleId: string) => InferenceStep | undefined;
434
+
435
+ /**
436
+ * Get the index entry for an asserted fact by name.
437
+ * Returns undefined if the fact was not concluded.
438
+ *
439
+ * @param factName - The fact name to look up
440
+ * @returns The fact index entry, or undefined
441
+ */
442
+ getFact: (factName: string) => FactIndex | undefined;
443
+
444
+ /**
445
+ * Get all concluded goal facts.
446
+ *
447
+ * @returns Array of FactIndex entries for concluded goals
448
+ */
449
+ getGoals: () => FactIndex[];
450
+
407
451
  /**
408
452
  * Format the result as a human-readable string.
409
453
  * Includes the inference chain, conclusions, and statistics.
@@ -440,3 +484,32 @@ export type ExpertQueryResult = {
440
484
  /** Rule that concluded this fact (if any) */
441
485
  concludedBy?: string;
442
486
  };
487
+
488
+ /**
489
+ * Index entry for a single asserted fact.
490
+ */
491
+ export type FactIndex = {
492
+ /** The fact name */
493
+ fact: string;
494
+ /** The asserted value */
495
+ value: unknown;
496
+ /** The inference step that concluded this fact */
497
+ concludedBy: InferenceStep;
498
+ /** Confidence of the assertion */
499
+ confidence: number;
500
+ /** Whether this fact is a goal */
501
+ isGoal: boolean;
502
+ };
503
+
504
+ /**
505
+ * Structured index for O(1) lookups into expert system results.
506
+ * Built inline during rule evaluation — no extra iteration pass.
507
+ */
508
+ export type ResultIndex = {
509
+ /** O(1) lookup by asserted fact name */
510
+ byFact: Record<string, FactIndex>;
511
+ /** O(1) lookup by rule ID (fired rules only) */
512
+ byRule: Record<string, InferenceStep>;
513
+ /** Convenience: only goal facts from byFact */
514
+ goals: Record<string, FactIndex>;
515
+ };
package/src/index.ts CHANGED
@@ -299,6 +299,8 @@ export type {
299
299
  ExpertResult,
300
300
  ExpertQueryResult,
301
301
  InferenceStep,
302
+ FactIndex,
303
+ ResultIndex,
302
304
  InterpolationContext
303
305
  } from './engines/expert';
304
306
 
@@ -404,3 +406,9 @@ export type {
404
406
  // ========================================
405
407
 
406
408
  export * from './qfacts';
409
+
410
+ // ========================================
411
+ // A/B Testing - Deterministic Variant Resolution
412
+ // ========================================
413
+
414
+ export * from './abtesting';